pixelflut-udp/server.js

62 lines
1.8 KiB
JavaScript
Raw Normal View History

2021-11-17 19:26:59 +00:00
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()