UNPKG

js2ray

Version:

The v2ray vmess protocol, based on nodejs javascript which you can use on hosts and servers

90 lines (72 loc) 2.52 kB
'use strict'; const net = require('net'); const dgram = require('dgram'); const utils = require('../core/utils'); function freedom(address, port, cmd, onconnect, onmessage, onclose) { if (cmd === 3) { log("connected udp bind", `${address}:${port}`); return utils.UDPBind(onconnect, onmessage, onclose); } if (cmd === 2) { log("connected udp", `${address}:${port}`); let socket = net.isIPv4(address) ? dgram.createSocket('udp4') : net.isIPv6(address) ? dgram.createSocket('udp6') : null; if (!socket) return onclose?.(); let timeout = setTimeout(close, 10000); function close() { if (!socket) return; socket.close(); socket = null; } const send = (buffer) => socket?.send(buffer, port, address); if (typeof onmessage === 'object') { onmessage.on('error', close); onmessage.on('close', close); onmessage.on('data', send); onmessage = onmessage.write.bind(onmessage); onclose = onmessage.destroy?.bind(onmessage); } socket.on('error', close); socket.on('message', onmessage); socket.on('close', () => { clearTimeout(timeout); onclose?.(); socket = null; }); socket.on('message', () => clearTimeout(timeout)); if (port > 0 && port < 65536) socket.bind(onconnect); else onclose?.(); return { close, message: send }; } if (cmd === 1) { log("connected tcp", `${address}:${port}`); let socket = new net.Socket(); function close() { if (!socket) return; socket.destroy(); socket = null; } if (typeof onmessage === 'object') { onmessage.pipe(socket); socket.pipe(onmessage); } else { socket.on('data', onmessage); socket.on('close', () => { onclose?.(); socket = null; }); } socket.on('error', close); socket.setTimeout(10000); if (port > 0 && port < 65536) socket.connect(port, address, onconnect) else onclose?.(); return { close, message: (buffer) => socket?.write(buffer) }; } } module.exports = freedom;