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.
84 lines
2.2 KiB
84 lines
2.2 KiB
2 years ago
|
#!/usr/bin/env node
|
||
|
|
||
|
var net = require('net');
|
||
|
var opts = require('commander');
|
||
|
var Throttle = require('../src/throttle.js').Throttle;
|
||
|
|
||
|
function parseAddr(addr) {
|
||
|
var result = /^(([^:]*):)?(\d+)$/.exec(addr);
|
||
|
if (!result)
|
||
|
return null;
|
||
|
return {
|
||
|
host: result[2],
|
||
|
port: result[3]
|
||
|
};
|
||
|
}
|
||
|
|
||
|
function parseInteger(s) {
|
||
|
if (!/^\d+$/.test(s))
|
||
|
return undefined;
|
||
|
return parseInt(s, 10);
|
||
|
}
|
||
|
|
||
|
function runProxy(localAddr, remoteAddr, downRate, upRate) {
|
||
|
var server = net.createServer(function(local) {
|
||
|
|
||
|
var remote = net.createConnection(remoteAddr);
|
||
|
|
||
|
var localThrottle = new Throttle({rate: upRate});
|
||
|
var remoteThrottle = new Throttle({rate: downRate});
|
||
|
|
||
|
local.pipe(localThrottle).pipe(remote);
|
||
|
local.on('error', function() {
|
||
|
remote.destroy();
|
||
|
local.destroy();
|
||
|
});
|
||
|
|
||
|
remote.pipe(remoteThrottle).pipe(local);
|
||
|
remote.on('error', function() {
|
||
|
local.destroy();
|
||
|
remote.destroy();
|
||
|
});
|
||
|
});
|
||
|
|
||
|
server.listen(localAddr.port, localAddr.host);
|
||
|
}
|
||
|
|
||
|
function main() {
|
||
|
var localAddr, remoteAddr, downRate, upRate;
|
||
|
|
||
|
opts
|
||
|
.option('-l, --localaddr <addr>', 'local address, default 0.0.0.0:8080')
|
||
|
.option('-r, --remoteaddr <addr>', 'remote address, default localhost:80')
|
||
|
.option('-d, --downstream <bps>', 'downstream bandwidth', parseInteger)
|
||
|
.option('-u, --upstream <bps>', 'upstream bandwidth, default equal to downstream', parseInteger)
|
||
|
.parse(process.argv);
|
||
|
|
||
|
if (opts.localaddr !== undefined) {
|
||
|
localAddr = parseAddr(opts.localaddr);
|
||
|
if (!localAddr)
|
||
|
opts.help();
|
||
|
} else
|
||
|
localAddr = {host: undefined, port: 8080};
|
||
|
|
||
|
if (opts.remoteaddr !== undefined) {
|
||
|
remoteAddr = parseAddr(opts.remoteaddr);
|
||
|
if (!remoteAddr)
|
||
|
opts.help();
|
||
|
} else
|
||
|
remoteAddr = {host: undefined, port: 80};
|
||
|
|
||
|
if (opts.downstream === undefined)
|
||
|
opts.help();
|
||
|
downRate = opts.downstream;
|
||
|
|
||
|
if (opts.upstream !== undefined)
|
||
|
upRate = opts.upstream;
|
||
|
else
|
||
|
upRate = downRate;
|
||
|
|
||
|
runProxy(localAddr, remoteAddr, downRate, upRate);
|
||
|
}
|
||
|
|
||
|
main();
|