| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283 | #!/usr/bin/env nodevar 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();
 |