You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
70 lines
1.7 KiB
70 lines
1.7 KiB
var ThrottleGroup = require("stream-throttle").ThrottleGroup; |
|
|
|
module.exports = throttle; |
|
|
|
/** |
|
* |
|
*/ |
|
function throttle (opts, listenHost) { |
|
|
|
var options = { |
|
local_host: listenHost, |
|
remote_host: listenHost, |
|
upstream: 10*1024, |
|
downstream: opts.speed.speed * 1024, |
|
keepalive: false |
|
}; |
|
|
|
var serverOpts = { |
|
allowHalfOpen: true, |
|
rejectUnauthorized: false |
|
}; |
|
|
|
var module = "net"; |
|
var method = "createConnection"; |
|
|
|
if (opts.key) { |
|
module = "tls"; |
|
method = "connect"; |
|
serverOpts.key = opts.key; |
|
serverOpts.cert = opts.cert; |
|
} |
|
|
|
return require(module).createServer(serverOpts, function (local) { |
|
|
|
var remote = require(module)[method]({ |
|
host: opts.target.hostname, |
|
port: opts.target.port, |
|
allowHalfOpen: true, |
|
rejectUnauthorized: false |
|
}); |
|
|
|
var upThrottle = new ThrottleGroup({ rate: options.upstream }); |
|
var downThrottle = new ThrottleGroup({ rate: options.downstream }); |
|
|
|
var localThrottle = upThrottle.throttle(); |
|
var remoteThrottle = downThrottle.throttle(); |
|
|
|
setTimeout(function () { |
|
local |
|
.pipe(localThrottle) |
|
.pipe(remote); |
|
}, opts.speed.latency); |
|
|
|
setTimeout(function () { |
|
remote |
|
.pipe(remoteThrottle) |
|
.pipe(local); |
|
}, opts.speed.latency); |
|
|
|
local.on("error", function() { |
|
remote.destroy(); |
|
local.destroy(); |
|
}); |
|
|
|
remote.on("error", function() { |
|
local.destroy(); |
|
remote.destroy(); |
|
}); |
|
}); |
|
}
|
|
|