holepunch.js/lib/index.js

54 lines
1.4 KiB
JavaScript

'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);
}
});
};