wraps connections in a domain
This commit is contained in:
parent
ef2ef80164
commit
85217346c0
|
@ -1,23 +1,34 @@
|
|||
const socks = require('socksv5');
|
||||
const SOCKS5Server = socks.Server;
|
||||
const domain = require('domain');
|
||||
|
||||
class SOCKSServer extends SOCKS5Server{
|
||||
constructor(tor_pool, logger) {
|
||||
super((info, accept, deny) => {
|
||||
let handleConnection = (info, accept, deny) => {
|
||||
let d = domain.create();
|
||||
|
||||
let inbound_socket = accept(true);
|
||||
d.add(inbound_socket);
|
||||
var outbound_socket;
|
||||
let buffer = [];
|
||||
|
||||
let socks_port = (tor_pool.next().socks_port);
|
||||
logger && logger.info(`[socks]: ${info.srcAddr}:${info.srcPort} → 127.0.0.1:${socks_port} → ${info.dstAddr}:${info.dstPort}`)
|
||||
|
||||
let onClose = () => {
|
||||
let onClose = (error) => {
|
||||
inbound_socket && inbound_socket.end();
|
||||
outbound_socket && outbound_socket.end();
|
||||
|
||||
inbound_socket = outbound_socket = buffer = void(0);
|
||||
|
||||
if (error)
|
||||
this.logger.error(`[socks]: an error occured: ${error.message}`)
|
||||
|
||||
d.exit();
|
||||
};
|
||||
|
||||
d.on('error', onClose);
|
||||
|
||||
let onInboundData = (data) => buffer.push(data)
|
||||
|
||||
if (!inbound_socket) return;
|
||||
|
@ -26,33 +37,38 @@ class SOCKSServer extends SOCKS5Server{
|
|||
inbound_socket.on('data', onInboundData);
|
||||
inbound_socket.on('error', onClose);
|
||||
|
||||
socks.connect({
|
||||
host: info.dstAddr,
|
||||
port: info.dstPort,
|
||||
proxyHost: '127.0.0.1',
|
||||
proxyPort: socks_port,
|
||||
localDNS: false,
|
||||
auths: [ socks.auth.None() ]
|
||||
}, ($outbound_socket) => {
|
||||
outbound_socket = $outbound_socket;
|
||||
outbound_socket && outbound_socket.on('close', onClose);
|
||||
d.run(() => {
|
||||
socks.connect({
|
||||
host: info.dstAddr,
|
||||
port: info.dstPort,
|
||||
proxyHost: '127.0.0.1',
|
||||
proxyPort: socks_port,
|
||||
localDNS: false,
|
||||
auths: [ socks.auth.None() ]
|
||||
}, ($outbound_socket) => {
|
||||
outbound_socket = $outbound_socket;
|
||||
d.add(outbound_socket);
|
||||
outbound_socket && outbound_socket.on('close', onClose);
|
||||
|
||||
inbound_socket && inbound_socket.removeListener('data', onInboundData);
|
||||
inbound_socket && inbound_socket.on('data', (data) => {
|
||||
outbound_socket && outbound_socket.write(data);
|
||||
});
|
||||
inbound_socket && inbound_socket.removeListener('data', onInboundData);
|
||||
inbound_socket && inbound_socket.on('data', (data) => {
|
||||
outbound_socket && outbound_socket.write(data);
|
||||
});
|
||||
|
||||
outbound_socket && outbound_socket.on('data', (data) => {
|
||||
inbound_socket && inbound_socket.write(data);
|
||||
});
|
||||
outbound_socket && outbound_socket.on('data', (data) => {
|
||||
inbound_socket && inbound_socket.write(data);
|
||||
});
|
||||
|
||||
outbound_socket && outbound_socket.on('error', onClose);
|
||||
outbound_socket && outbound_socket.on('error', onClose);
|
||||
|
||||
while (buffer && buffer.length && outbound_socket) {
|
||||
outbound_socket.write(buffer.shift());
|
||||
}
|
||||
})
|
||||
});
|
||||
while (buffer && buffer.length && outbound_socket) {
|
||||
outbound_socket.write(buffer.shift());
|
||||
}
|
||||
})
|
||||
});
|
||||
};
|
||||
|
||||
super(handleConnection);
|
||||
|
||||
this.logger = logger;
|
||||
|
||||
|
|
Loading…
Reference in a new issue