79 lines
2.0 KiB
JavaScript
79 lines
2.0 KiB
JavaScript
'use strict';
|
|
|
|
var PromiseA = global.Promise;
|
|
|
|
var net = require('net');
|
|
var tls = require('tls');
|
|
|
|
function listenForConns(emitter, opts) {
|
|
function pipeConn(c, out) {
|
|
var sclient = tls.connect({
|
|
servername: opts.remoteAddr, host: opts.remoteAddr, port: opts.remotePort
|
|
, rejectUnauthorized: opts.rejectUnauthorized
|
|
}, function () {
|
|
emitter.emit('connect', sclient);
|
|
c.pipe(sclient);
|
|
sclient.pipe(out || c);
|
|
});
|
|
sclient.on('error', function (err) {
|
|
emitter.emit('remote-error', err);
|
|
});
|
|
c.on('error', function (err) {
|
|
emitter.emit('local-error', err);
|
|
});
|
|
if (out) {
|
|
out.on('error', function (err) {
|
|
emitter.emit('local-error', err);
|
|
});
|
|
}
|
|
}
|
|
|
|
if ('-' === opts.localAddress || '|' === opts.localAddress) {
|
|
pipeConn(opts.stdin, opts.stdout);
|
|
return;
|
|
}
|
|
|
|
var server = net.createServer(pipeConn);
|
|
server.on('error', function (err) {
|
|
console.error('[error] ' + err.toString());
|
|
});
|
|
server.listen({
|
|
host: opts.localAddress
|
|
, port: opts.localPort
|
|
}, function () {
|
|
opts.localPort = this.address().port;
|
|
opts.server = this;
|
|
emitter.emit('listening', opts);
|
|
});
|
|
}
|
|
|
|
function testConn(opts) {
|
|
return new PromiseA(function (resolve, reject) {
|
|
// Test connection first
|
|
var tlsOpts = {
|
|
host: opts.remoteAddr, port: opts.remotePort
|
|
, rejectUnauthorized: opts.rejectUnauthorized
|
|
};
|
|
if (opts.servername) {
|
|
tlsOpts.servername = opts.servername;
|
|
} else if (/^[\w\.\-]+\.[a-z]{2,}$/i.test(opts.remoteAddr)) {
|
|
tlsOpts.servername = opts.remoteAddr.toLowerCase();
|
|
}
|
|
if (opts.alpn) {
|
|
tlsOpts.ALPNProtocols = [ 'http', 'h2' ];
|
|
}
|
|
var tlsSock = tls.connect(tlsOpts, function () {
|
|
tlsSock.end();
|
|
resolve();
|
|
});
|
|
tlsSock.on('error', function (err) {
|
|
reject(err);
|
|
});
|
|
});
|
|
}
|
|
|
|
// no public exports yet
|
|
// the API is for the commandline only
|
|
module.exports._test = testConn;
|
|
module.exports._listen = listenForConns;
|