From 6ecb868ae1ce4064bfee80a10a4235bed41df001 Mon Sep 17 00:00:00 2001 From: AJ ONeal Date: Wed, 30 Dec 2015 03:36:14 +0000 Subject: [PATCH] test loopback listener --- index.js | 33 +------------------------ lib/external-ip.js | 36 ++------------------------- lib/index.js | 53 ++++++++++++++++++++++++++++++++++++++++ lib/loopback-listener.js | 4 +-- lib/request.js | 42 +++++++++++++++++++++++++++++++ package.json | 8 +++++- 6 files changed, 107 insertions(+), 69 deletions(-) create mode 100644 lib/index.js create mode 100644 lib/request.js diff --git a/index.js b/index.js index c5fc2c5..647221a 100644 --- a/index.js +++ b/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'); diff --git a/lib/external-ip.js b/lib/external-ip.js index a1346dd..b5b1004 100644 --- a/lib/external-ip.js +++ b/lib/external-ip.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 }; })); }); diff --git a/lib/index.js b/lib/index.js new file mode 100644 index 0000000..92296aa --- /dev/null +++ b/lib/index.js @@ -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); + } + }); +}; diff --git a/lib/loopback-listener.js b/lib/loopback-listener.js index 667459e..34d473a 100644 --- a/lib/loopback-listener.js +++ b/lib/loopback-listener.js @@ -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); }); diff --git a/lib/request.js b/lib/request.js new file mode 100644 index 0000000..f65dff3 --- /dev/null +++ b/lib/request.js @@ -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; diff --git a/package.json b/package.json index 4784f6c..c14f15b 100644 --- a/package.json +++ b/package.json @@ -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"