Skip to content

Instantly share code, notes, and snippets.

@KOBA789
Created September 25, 2012 08:01
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save KOBA789/3780542 to your computer and use it in GitHub Desktop.
Save KOBA789/3780542 to your computer and use it in GitHub Desktop.
baka-proxy
var net = require('net');
net.createServer(function (client) {
var remote = net.connect({
host: 'koba789.com',
port: 8281
});
remote.pipe(client);
var source = client,
dest = remote;
function ondata(chunk) {
if (dest.writable) {
for (var i = 0; i < chunk.length; ++ i) {
chunk[i] = ~chunk[i];
}
if (false === dest.write(chunk) && source.pause) {
source.pause();
}
}
}
source.on('data', ondata);
function ondrain() {
if (source.readable && source.resume) {
source.resume();
}
}
dest.on('drain', ondrain);
source.on('end', onend);
source.on('close', onclose);
var didOnEnd = false;
function onend() {
if (didOnEnd) return;
didOnEnd = true;
dest.end();
}
function onclose() {
if (didOnEnd) return;
didOnEnd = true;
dest.destroy();
}
function onerror(er) {
cleanup();
if (this.listeners('error').length === 0) {
throw er;
}
}
source.on('error', onerror);
dest.on('error', onerror);
function cleanup() {
source.removeListener('data', ondata);
dest.removeListener('drain', ondrain);
source.removeListener('end', onend);
source.removeListener('close', onclose);
source.removeListener('error', onerror);
dest.removeListener('error', onerror);
source.removeListener('end', cleanup);
source.removeListener('close', cleanup);
dest.removeListener('end', cleanup);
dest.removeListener('close', cleanup);
}
source.on('end', cleanup);
source.on('close', cleanup);
dest.on('end', cleanup);
dest.on('close', cleanup);
dest.emit('pipe', source);
}).listen(8281);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment