rename a few things
This commit is contained in:
parent
e1ee55da02
commit
9c57bac510
|
@ -1,21 +1,21 @@
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
var packer = require('tunnel-packer');
|
var Packer = require('proxy-packer');
|
||||||
var sni = require('sni');
|
var sni = require('sni');
|
||||||
|
|
||||||
function pipeWs(servername, service, conn, remote) {
|
function pipeWs(servername, service, conn, remote) {
|
||||||
console.log('[pipeWs] servername:', servername, 'service:', service);
|
console.log('[pipeWs] servername:', servername, 'service:', service);
|
||||||
|
|
||||||
var browserAddr = packer.socketToAddr(conn);
|
var browserAddr = Packer.socketToAddr(conn);
|
||||||
browserAddr.service = service;
|
browserAddr.service = service;
|
||||||
var cid = packer.addrToId(browserAddr);
|
var cid = Packer.addrToId(browserAddr);
|
||||||
conn.tunnelCid = cid;
|
conn.tunnelCid = cid;
|
||||||
console.log('[pipeWs] browser is', cid, 'home-cloud is', packer.socketToId(remote.upgradeReq.socket));
|
console.log('[pipeWs] browser is', cid, 'home-cloud is', Packer.socketToId(remote.upgradeReq.socket));
|
||||||
|
|
||||||
function sendWs(data, serviceOverride) {
|
function sendWs(data, serviceOverride) {
|
||||||
if (remote.ws && (!conn.tunnelClosing || serviceOverride)) {
|
if (remote.ws && (!conn.tunnelClosing || serviceOverride)) {
|
||||||
try {
|
try {
|
||||||
remote.ws.send(packer.pack(browserAddr, data, serviceOverride), { binary: true });
|
remote.ws.send(Packer.pack(browserAddr, data, serviceOverride), { binary: true });
|
||||||
// If we can't send data over the websocket as fast as this connection can send it to us
|
// If we can't send data over the websocket as fast as this connection can send it to us
|
||||||
// (or there are a lot of connections trying to send over the same websocket) then we
|
// (or there are a lot of connections trying to send over the same websocket) then we
|
||||||
// need to pause the connection for a little. We pause all connections if any are paused
|
// need to pause the connection for a little. We pause all connections if any are paused
|
||||||
|
|
|
@ -43,11 +43,11 @@
|
||||||
"greenlock": "^2.2.4",
|
"greenlock": "^2.2.4",
|
||||||
"js-yaml": "^3.11.0",
|
"js-yaml": "^3.11.0",
|
||||||
"jsonwebtoken": "^8.2.1",
|
"jsonwebtoken": "^8.2.1",
|
||||||
|
"proxy-packer": "^1.4.3",
|
||||||
"recase": "^1.0.4",
|
"recase": "^1.0.4",
|
||||||
"redirect-https": "^1.1.5",
|
"redirect-https": "^1.1.5",
|
||||||
"serve-static": "^1.13.2",
|
"serve-static": "^1.13.2",
|
||||||
"sni": "^1.0.0",
|
"sni": "^1.0.0",
|
||||||
"tunnel-packer": "^1.4.0",
|
|
||||||
"ws": "^5.1.1"
|
"ws": "^5.1.1"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
73
telebitd.js
73
telebitd.js
|
@ -3,7 +3,7 @@
|
||||||
var url = require('url');
|
var url = require('url');
|
||||||
var PromiseA = require('bluebird');
|
var PromiseA = require('bluebird');
|
||||||
var jwt = require('jsonwebtoken');
|
var jwt = require('jsonwebtoken');
|
||||||
var packer = require('tunnel-packer');
|
var Packer = require('proxy-packer');
|
||||||
|
|
||||||
function timeoutPromise(duration) {
|
function timeoutPromise(duration) {
|
||||||
return new PromiseA(function (resolve) {
|
return new PromiseA(function (resolve) {
|
||||||
|
@ -14,17 +14,17 @@ function timeoutPromise(duration) {
|
||||||
var Devices = require('./lib/device-tracker');
|
var Devices = require('./lib/device-tracker');
|
||||||
|
|
||||||
module.exports.store = { Devices: Devices };
|
module.exports.store = { Devices: Devices };
|
||||||
module.exports.create = function (copts) {
|
module.exports.create = function (state) {
|
||||||
copts.deviceLists = {};
|
state.deviceLists = {};
|
||||||
//var deviceLists = {};
|
//var deviceLists = {};
|
||||||
var activityTimeout = copts.activityTimeout || 2*60*1000;
|
var activityTimeout = state.activityTimeout || 2*60*1000;
|
||||||
var pongTimeout = copts.pongTimeout || 10*1000;
|
var pongTimeout = state.pongTimeout || 10*1000;
|
||||||
copts.Devices = Devices;
|
state.Devices = Devices;
|
||||||
var onTcpConnection = require('./lib/unwrap-tls').createTcpConnectionHandler(copts);
|
var onTcpConnection = require('./lib/unwrap-tls').createTcpConnectionHandler(state);
|
||||||
|
|
||||||
function onWsConnection(ws, upgradeReq) {
|
function onWsConnection(ws, upgradeReq) {
|
||||||
console.log(ws);
|
console.log(ws);
|
||||||
var socketId = packer.socketToId(upgradeReq.socket);
|
var socketId = Packer.socketToId(upgradeReq.socket);
|
||||||
var remotes = {};
|
var remotes = {};
|
||||||
|
|
||||||
function logName() {
|
function logName() {
|
||||||
|
@ -35,7 +35,7 @@ module.exports.create = function (copts) {
|
||||||
return result || socketId;
|
return result || socketId;
|
||||||
}
|
}
|
||||||
function sendTunnelMsg(addr, data, service) {
|
function sendTunnelMsg(addr, data, service) {
|
||||||
ws.send(packer.pack(addr, data, service), {binary: true});
|
ws.send(Packer.pack(addr, data, service), {binary: true});
|
||||||
}
|
}
|
||||||
|
|
||||||
function getBrowserConn(cid) {
|
function getBrowserConn(cid) {
|
||||||
|
@ -103,7 +103,7 @@ module.exports.create = function (copts) {
|
||||||
|
|
||||||
var token;
|
var token;
|
||||||
try {
|
try {
|
||||||
token = jwt.verify(jwtoken, copts.secret);
|
token = jwt.verify(jwtoken, state.secret);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
token = null;
|
token = null;
|
||||||
}
|
}
|
||||||
|
@ -154,7 +154,7 @@ module.exports.create = function (copts) {
|
||||||
|
|
||||||
token.domains.forEach(function (domainname) {
|
token.domains.forEach(function (domainname) {
|
||||||
console.log('domainname', domainname);
|
console.log('domainname', domainname);
|
||||||
Devices.add(copts.deviceLists, domainname, token);
|
Devices.add(state.deviceLists, domainname, token);
|
||||||
});
|
});
|
||||||
remotes[jwtoken] = token;
|
remotes[jwtoken] = token;
|
||||||
console.log("added token '" + token.deviceId + "' to websocket", socketId);
|
console.log("added token '" + token.deviceId + "' to websocket", socketId);
|
||||||
|
@ -170,7 +170,7 @@ module.exports.create = function (copts) {
|
||||||
// Prevent any more browser connections being sent to this remote, and any existing
|
// Prevent any more browser connections being sent to this remote, and any existing
|
||||||
// connections from trying to send more data across the connection.
|
// connections from trying to send more data across the connection.
|
||||||
remote.domains.forEach(function (domainname) {
|
remote.domains.forEach(function (domainname) {
|
||||||
Devices.remove(copts.deviceLists, domainname, remote);
|
Devices.remove(state.deviceLists, domainname, remote);
|
||||||
});
|
});
|
||||||
remote.ws = null;
|
remote.ws = null;
|
||||||
remote.upgradeReq = null;
|
remote.upgradeReq = null;
|
||||||
|
@ -220,13 +220,13 @@ module.exports.create = function (copts) {
|
||||||
};
|
};
|
||||||
|
|
||||||
var packerHandlers = {
|
var packerHandlers = {
|
||||||
oncontrol: function (opts) {
|
oncontrol: function (tun) {
|
||||||
var cmd, err;
|
var cmd, err;
|
||||||
try {
|
try {
|
||||||
cmd = JSON.parse(opts.data.toString());
|
cmd = JSON.parse(tun.data.toString());
|
||||||
} catch (err) {}
|
} catch (err) {}
|
||||||
if (!Array.isArray(cmd) || typeof cmd[0] !== 'number') {
|
if (!Array.isArray(cmd) || typeof cmd[0] !== 'number') {
|
||||||
var msg = 'received bad command "' + opts.data.toString() + '"';
|
var msg = 'received bad command "' + tun.data.toString() + '"';
|
||||||
console.warn(msg, 'from websocket', socketId);
|
console.warn(msg, 'from websocket', socketId);
|
||||||
sendTunnelMsg(null, [0, {message: msg, code: 'E_BAD_COMMAND'}], 'control');
|
sendTunnelMsg(null, [0, {message: msg, code: 'E_BAD_COMMAND'}], 'control');
|
||||||
return;
|
return;
|
||||||
|
@ -260,69 +260,70 @@ module.exports.create = function (copts) {
|
||||||
sendTunnelMsg(null, [-cmd[0], err], 'control');
|
sendTunnelMsg(null, [-cmd[0], err], 'control');
|
||||||
}
|
}
|
||||||
|
|
||||||
, onmessage: function (opts) {
|
, onmessage: function (tun) {
|
||||||
var cid = packer.addrToId(opts);
|
var cid = packer.addrToId(tun);
|
||||||
console.log("remote '" + logName() + "' has data for '" + cid + "'", opts.data.byteLength);
|
console.log("remote '" + logName() + "' has data for '" + cid + "'", tun.data.byteLength);
|
||||||
|
|
||||||
var browserConn = getBrowserConn(cid);
|
var browserConn = getBrowserConn(cid);
|
||||||
if (!browserConn) {
|
if (!browserConn) {
|
||||||
sendTunnelMsg(opts, {message: 'no matching connection', code: 'E_NO_CONN'}, 'error');
|
sendTunnelMsg(tun, {message: 'no matching connection', code: 'E_NO_CONN'}, 'error');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
browserConn.write(opts.data);
|
browserConn.write(tun.data);
|
||||||
// tunnelRead is how many bytes we've read from the tunnel, and written to the browser.
|
// tunnelRead is how many bytes we've read from the tunnel, and written to the browser.
|
||||||
browserConn.tunnelRead = (browserConn.tunnelRead || 0) + opts.data.byteLength;
|
browserConn.tunnelRead = (browserConn.tunnelRead || 0) + tun.data.byteLength;
|
||||||
// If we have more than 1MB buffered data we need to tell the other side to slow down.
|
// If we have more than 1MB buffered data we need to tell the other side to slow down.
|
||||||
// Once we've finished sending what we have we can tell the other side to keep going.
|
// Once we've finished sending what we have we can tell the other side to keep going.
|
||||||
// If we've already sent the 'pause' message though don't send it again, because we're
|
// If we've already sent the 'pause' message though don't send it again, because we're
|
||||||
// probably just dealing with data queued before our message got to them.
|
// probably just dealing with data queued before our message got to them.
|
||||||
if (!browserConn.remotePaused && browserConn.bufferSize > 1024*1024) {
|
if (!browserConn.remotePaused && browserConn.bufferSize > 1024*1024) {
|
||||||
sendTunnelMsg(opts, browserConn.tunnelRead, 'pause');
|
sendTunnelMsg(tun, browserConn.tunnelRead, 'pause');
|
||||||
browserConn.remotePaused = true;
|
browserConn.remotePaused = true;
|
||||||
|
|
||||||
browserConn.once('drain', function () {
|
browserConn.once('drain', function () {
|
||||||
sendTunnelMsg(opts, browserConn.tunnelRead, 'resume');
|
sendTunnelMsg(tun, browserConn.tunnelRead, 'resume');
|
||||||
browserConn.remotePaused = false;
|
browserConn.remotePaused = false;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
, onpause: function (opts) {
|
, onpause: function (tun) {
|
||||||
var cid = packer.addrToId(opts);
|
var cid = Packer.addrToId(tun);
|
||||||
console.log('[TunnelPause]', cid);
|
console.log('[TunnelPause]', cid);
|
||||||
var browserConn = getBrowserConn(cid);
|
var browserConn = getBrowserConn(cid);
|
||||||
if (browserConn) {
|
if (browserConn) {
|
||||||
browserConn.manualPause = true;
|
browserConn.manualPause = true;
|
||||||
browserConn.pause();
|
browserConn.pause();
|
||||||
} else {
|
} else {
|
||||||
sendTunnelMsg(opts, {message: 'no matching connection', code: 'E_NO_CONN'}, 'error');
|
sendTunnelMsg(tun, {message: 'no matching connection', code: 'E_NO_CONN'}, 'error');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
, onresume: function (opts) {
|
|
||||||
var cid = packer.addrToId(opts);
|
, onresume: function (tun) {
|
||||||
|
var cid = Packer.addrToId(tun);
|
||||||
console.log('[TunnelResume]', cid);
|
console.log('[TunnelResume]', cid);
|
||||||
var browserConn = getBrowserConn(cid);
|
var browserConn = getBrowserConn(cid);
|
||||||
if (browserConn) {
|
if (browserConn) {
|
||||||
browserConn.manualPause = false;
|
browserConn.manualPause = false;
|
||||||
browserConn.resume();
|
browserConn.resume();
|
||||||
} else {
|
} else {
|
||||||
sendTunnelMsg(opts, {message: 'no matching connection', code: 'E_NO_CONN'}, 'error');
|
sendTunnelMsg(tun, {message: 'no matching connection', code: 'E_NO_CONN'}, 'error');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
, onend: function (opts) {
|
, onend: function (tun) {
|
||||||
var cid = packer.addrToId(opts);
|
var cid = Packer.addrToId(tun);
|
||||||
console.log('[TunnelEnd]', cid);
|
console.log('[TunnelEnd]', cid);
|
||||||
closeBrowserConn(cid);
|
closeBrowserConn(cid);
|
||||||
}
|
}
|
||||||
, onerror: function (opts) {
|
, onerror: function (tun) {
|
||||||
var cid = packer.addrToId(opts);
|
var cid = Packer.addrToId(tun);
|
||||||
console.log('[TunnelError]', cid, opts.message);
|
console.log('[TunnelError]', cid, tun.message);
|
||||||
closeBrowserConn(cid);
|
closeBrowserConn(cid);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
var unpacker = packer.create(packerHandlers);
|
var unpacker = Packer.create(packerHandlers);
|
||||||
|
|
||||||
var lastActivity = Date.now();
|
var lastActivity = Date.now();
|
||||||
var timeoutId;
|
var timeoutId;
|
||||||
|
@ -390,6 +391,6 @@ module.exports.create = function (copts) {
|
||||||
return {
|
return {
|
||||||
tcp: onTcpConnection
|
tcp: onTcpConnection
|
||||||
, ws: onWsConnection
|
, ws: onWsConnection
|
||||||
, isClientDomain: Devices.exist.bind(null, copts.deviceLists)
|
, isClientDomain: Devices.exist.bind(null, state.deviceLists)
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue