test loopback listener
This commit is contained in:
		
							parent
							
								
									0a3b457583
								
							
						
					
					
						commit
						6ecb868ae1
					
				
							
								
								
									
										33
									
								
								index.js
									
									
									
									
									
								
							
							
						
						
									
										33
									
								
								index.js
									
									
									
									
									
								
							@ -1,34 +1,3 @@
 | 
			
		||||
'use strict';
 | 
			
		||||
 | 
			
		||||
var PromiseA = require('bluebird');
 | 
			
		||||
 | 
			
		||||
module.exports.create = function (args) {
 | 
			
		||||
  var promises = [];
 | 
			
		||||
 | 
			
		||||
  if (args.debug) {
 | 
			
		||||
    console.log('[HP] create holepuncher');
 | 
			
		||||
    console.log(args);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // TODO determine if we have a AAAA local ip or not
 | 
			
		||||
  // TODO get A and AAAA records
 | 
			
		||||
  if (-1 !== args.protocols.indexOf('none')) {
 | 
			
		||||
    promises.push(PromiseA.any(args.ipifyUrls.map(function (ipifyUrl) {
 | 
			
		||||
      var getIp = require('./lib/external-ip');
 | 
			
		||||
 | 
			
		||||
      return getIp({ hostname: ipifyUrl, debug: args.debug });
 | 
			
		||||
    })).then(function (ips) {
 | 
			
		||||
      return ips.map(function (ip) {
 | 
			
		||||
        // TODO attempt loopback
 | 
			
		||||
        return ip;
 | 
			
		||||
      });
 | 
			
		||||
    }));
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return PromiseA.all(promises).then(function (results) {
 | 
			
		||||
    if (args.debug) {
 | 
			
		||||
      console.log('[HP] all done');
 | 
			
		||||
      console.log(results);
 | 
			
		||||
    }
 | 
			
		||||
  });
 | 
			
		||||
};
 | 
			
		||||
module.exports = require('./lib/index.js');
 | 
			
		||||
 | 
			
		||||
@ -2,41 +2,8 @@
 | 
			
		||||
 | 
			
		||||
var PromiseA = require('bluebird');
 | 
			
		||||
//var dns = PromiseA.promisifyAll(require('dns'));
 | 
			
		||||
var https = PromiseA.promisifyAll(require('https'));
 | 
			
		||||
var os = require('os');
 | 
			
		||||
 | 
			
		||||
function requestAsync(opts) {
 | 
			
		||||
  return new PromiseA(function (resolve, reject) {
 | 
			
		||||
    var req = https.request(opts, function (res) {
 | 
			
		||||
      var data = '';
 | 
			
		||||
 | 
			
		||||
      res.on('error', function (err) {
 | 
			
		||||
        if (opts.debug) {
 | 
			
		||||
          console.error('[Error] HP: bad request:');
 | 
			
		||||
          console.error(err);
 | 
			
		||||
        }
 | 
			
		||||
        reject(err);
 | 
			
		||||
      });
 | 
			
		||||
      res.on('data', function (chunk) {
 | 
			
		||||
        if (opts.debug > 2) {
 | 
			
		||||
          console.log('HP: request chunk:');
 | 
			
		||||
          console.log(chunk);
 | 
			
		||||
        }
 | 
			
		||||
        data += chunk.toString('utf8');
 | 
			
		||||
      });
 | 
			
		||||
      res.on('end', function () {
 | 
			
		||||
        if (opts.debug > 2) {
 | 
			
		||||
          console.log('HP: request complete:');
 | 
			
		||||
          console.log(data);
 | 
			
		||||
        }
 | 
			
		||||
        resolve(data);
 | 
			
		||||
      });
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    req.on('error', reject);
 | 
			
		||||
    req.end();
 | 
			
		||||
  });
 | 
			
		||||
}
 | 
			
		||||
var requestAsync = require('./request');
 | 
			
		||||
 | 
			
		||||
module.exports = function (opts) {
 | 
			
		||||
  var promises = [];
 | 
			
		||||
@ -126,6 +93,7 @@ module.exports = function (opts) {
 | 
			
		||||
      return {
 | 
			
		||||
        family: iface.family
 | 
			
		||||
      , address: addr
 | 
			
		||||
      , localAddress: iface.address
 | 
			
		||||
      };
 | 
			
		||||
    }));
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										53
									
								
								lib/index.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								lib/index.js
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,53 @@
 | 
			
		||||
'use strict';
 | 
			
		||||
 | 
			
		||||
var PromiseA = require('bluebird');
 | 
			
		||||
var loopback = require('./loopback-listener');
 | 
			
		||||
 | 
			
		||||
module.exports.create = function (args) {
 | 
			
		||||
  if (args.debug) {
 | 
			
		||||
    console.log('[HP] create holepuncher');
 | 
			
		||||
    console.log(args);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  var servers = loopback.create(args);
 | 
			
		||||
  var promises = [];
 | 
			
		||||
 | 
			
		||||
  if (args.debug) {
 | 
			
		||||
    console.log('[HP] create servers');
 | 
			
		||||
    console.log(servers);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (-1 !== args.protocols.indexOf('none')) {
 | 
			
		||||
    promises.push(PromiseA.any(args.ipifyUrls.map(function (ipifyUrl) {
 | 
			
		||||
      var getIp = require('./external-ip');
 | 
			
		||||
 | 
			
		||||
      return getIp({ hostname: ipifyUrl, debug: args.debug });
 | 
			
		||||
    })).then(function (ips) {
 | 
			
		||||
      // TODO how (if at all) should ip.address === ip.localAddress be treated differently?
 | 
			
		||||
      // TODO check local firewall?
 | 
			
		||||
      // TODO would it ever make sense for a public ip to respond to upnp?
 | 
			
		||||
      var requestAsync = require('./request');
 | 
			
		||||
 | 
			
		||||
      return PromiseA.all(ips.map(function (ip) {
 | 
			
		||||
        return requestAsync({
 | 
			
		||||
          secure: false
 | 
			
		||||
        , hostname: ip.address
 | 
			
		||||
        , path: '/api/com.daplie.loopback'
 | 
			
		||||
        , servername: 'daplie.invalid'
 | 
			
		||||
        , localAddress: ip.localAddress
 | 
			
		||||
        , port: 65080
 | 
			
		||||
        , headers: {
 | 
			
		||||
            Host: 'daplie.invalid'
 | 
			
		||||
          }
 | 
			
		||||
        });
 | 
			
		||||
      }));
 | 
			
		||||
    }));
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return PromiseA.all(promises).then(function (results) {
 | 
			
		||||
    if (args.debug) {
 | 
			
		||||
      console.log('[HP] all done');
 | 
			
		||||
      console.log(results);
 | 
			
		||||
    }
 | 
			
		||||
  });
 | 
			
		||||
};
 | 
			
		||||
@ -19,14 +19,14 @@ module.exports.create = function (opts) {
 | 
			
		||||
  (opts.plainPorts||[]).forEach(function (plainPort) {
 | 
			
		||||
    var plainServer = http.createServer();
 | 
			
		||||
    plainServer.__plainPort = plainPort;
 | 
			
		||||
    http.on('request', app);
 | 
			
		||||
    plainServer.on('request', app);
 | 
			
		||||
    results.plainServers.push(plainServer);
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  (opts.tlsPorts||[]).forEach(function (tlsPort) {
 | 
			
		||||
    var tlsServer = https.createServer(httpsOptions);
 | 
			
		||||
    tlsServer.__tlsPort = tlsPort;
 | 
			
		||||
    http.on('request', app);
 | 
			
		||||
    tlsServer.on('request', app);
 | 
			
		||||
    results.tlsServers.push(tlsServer);
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										42
									
								
								lib/request.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								lib/request.js
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,42 @@
 | 
			
		||||
'use strict';
 | 
			
		||||
 | 
			
		||||
var PromiseA = require('bluebird');
 | 
			
		||||
var https = PromiseA.promisifyAll(require('https'));
 | 
			
		||||
var http = PromiseA.promisifyAll(require('http'));
 | 
			
		||||
 | 
			
		||||
function requestAsync(opts) {
 | 
			
		||||
  return new PromiseA(function (resolve, reject) {
 | 
			
		||||
    var httpr = (false === opts.secure) ? http : https;
 | 
			
		||||
 | 
			
		||||
    var req = httpr.request(opts, function (res) {
 | 
			
		||||
      var data = '';
 | 
			
		||||
 | 
			
		||||
      res.on('error', function (err) {
 | 
			
		||||
        if (opts.debug) {
 | 
			
		||||
          console.error('[Error] HP: bad request:');
 | 
			
		||||
          console.error(err);
 | 
			
		||||
        }
 | 
			
		||||
        reject(err);
 | 
			
		||||
      });
 | 
			
		||||
      res.on('data', function (chunk) {
 | 
			
		||||
        if (opts.debug > 2) {
 | 
			
		||||
          console.log('HP: request chunk:');
 | 
			
		||||
          console.log(chunk);
 | 
			
		||||
        }
 | 
			
		||||
        data += chunk.toString('utf8');
 | 
			
		||||
      });
 | 
			
		||||
      res.on('end', function () {
 | 
			
		||||
        if (opts.debug > 2) {
 | 
			
		||||
          console.log('HP: request complete:');
 | 
			
		||||
          console.log(data);
 | 
			
		||||
        }
 | 
			
		||||
        resolve(data);
 | 
			
		||||
      });
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    req.on('error', reject);
 | 
			
		||||
    req.end();
 | 
			
		||||
  });
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
module.exports = requestAsync;
 | 
			
		||||
@ -9,7 +9,13 @@
 | 
			
		||||
  "directories": {
 | 
			
		||||
    "example": "examples"
 | 
			
		||||
  },
 | 
			
		||||
  "dependencies": {},
 | 
			
		||||
  "dependencies": {
 | 
			
		||||
    "bluebird": "^3.1.1",
 | 
			
		||||
    "express": "^4.13.3",
 | 
			
		||||
    "localhost.daplie.com-certificates": "^1.1.2",
 | 
			
		||||
    "request": "^2.67.0",
 | 
			
		||||
    "scmp": "^1.0.0"
 | 
			
		||||
  },
 | 
			
		||||
  "devDependencies": {},
 | 
			
		||||
  "scripts": {
 | 
			
		||||
    "test": "echo \"Error: no test specified\" && exit 1"
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user