let dgram = require("dgram") let net = require("net") let fs = require("fs") let monocypher = require("monocypher-wasm") let udp = dgram.createSocket({ type: "udp4" }) let udpSec = dgram.createSocket({ type: "udp4" }) let secret = fs.readFileSync("./secret.key") let sock function wipe(arr) { for (let i = 0; i < arr.length; i++) arr[i] = 0 } udp.on("message", (data, src) => { process(data) }) udpSec.on("message", (data, src) => { if (data.length < 56) return let shared = monocypher.crypto_key_exchange(secret, data.slice(0, 32)) if (!shared) return let decrypted = monocypher.crypto_unlock(shared, data.slice(32, 56), data.slice(56)) wipe(shared) if (!data) return process(Buffer.from(decrypted)) }) monocypher.ready.then(() => { udp.bind(1337) udpSec.bind(1338) console.log("public key is %s", Buffer.from(monocypher.crypto_x25519_public_key(secret)).toString("hex")) }) function process(data) { for (let i = 0; i < Math.floor(data.length / 6); i++) { let offset = i * 6 let sliced = data.slice(offset, offset + 6) let hex = sliced.slice(3, 6).toString("hex") let x = (sliced[0] << 4) | (sliced[1] >> 4) let y = ((sliced[1] & 0xf) << 8) | sliced[2] sock.write(`PX ${x} ${y} ${hex}\n`) } } function initSock() { let closed = false sock = net.createConnection({ host: "localhost", port: 1337 }) let interval = null sock.on("ready", () => { setInterval(() => sock.write("PX 0 0\n"), 3000) }) sock.on("close", () => { if (closed) return if (interval !== null) clearInterval(interval) closed = true initSock() }) sock.on("error", () => { if (closed) return if (interval !== null) clearInterval(interval) closed = true initSock() }) } initSock()