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
JavaScript
;
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;