XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

SpaceNinjaServer

A simple server for a small space ninja game

公开
关注 0 Fork 1 Star 0
UTF-8
import dgram from "node:dgram";
import { getNrsAddresses } from "../services/configService.ts";
import { crc32 } from "node:zlib";

const sendUdpMessage = (host: string, port: number, message: Buffer | string): Promise<void> => {
    return new Promise<void>((resolve, reject) => {
        const socket = dgram.createSocket("udp4");
        socket.send(message, port, host, err => {
            socket.close();
            if (err) {
                reject(err);
            } else {
                resolve();
            }
        });
    });
};

export const sendCustomMessageToNrs = async (message: string): Promise<void> => {
    const msgbuf = Buffer.from("\x00" + message, "utf8");
    const msg = addCompressionAndIntegrityToDatagram(msgbuf);
    for (const [nrsAddr, nrsPort] of getNrsAddresses()) {
        await sendUdpMessage(nrsAddr, nrsPort, msg);
    }
};

const SALT_BUF = Buffer.from("b471e49539930dc9b5a131e6247c7387A", "utf8");

const addCompressionAndIntegrityToDatagram = (msg: Buffer): Buffer => {
    const crc = crc32(SALT_BUF, crc32(msg));
    return Buffer.concat([Buffer.from([0x00, crc >> 24, crc >> 16, crc >> 8, crc]), msg]);
};

export const packHubDatagram = (msg: Buffer): Buffer => {
    const header = Buffer.alloc(6);
    header.writeUInt32LE(0x80000000, 0);
    header.writeUInt16LE(msg.length, 4);
    return addCompressionAndIntegrityToDatagram(Buffer.concat([header, msg]));
};