UNPKG

craftping

Version:

A universal ping/query library for Minecraft servers.

61 lines (55 loc) 1.69 kB
import fs from "node:fs"; import {expect} from "@jest/globals"; import dgram from "node:dgram"; /** * @param {string} test * @param {typeof Packet} type * @return {Promise<Buffer>} */ export async function read(test, type) { let url = new URL(`data/${test}/${type.name}.bin`, import.meta.url); return await fs.promises.readFile(url); } /** * @template T * @param {string} test * @param {typeof T} type * @return {Promise<T>} */ export async function testPacketReadWrite(test, type) { let buffer = await read(test, type); let packet = new type().read(buffer); expect(packet.write().equals(buffer)).toBe(true); return packet; } /** * * @param {function(packet: Packet, rinfo: RemoteInfo)} onMessage * @param {(typeof Packet)[]} acceptPacketTypes * @return {Promise<import("node:dgram").Socket>} */ export async function getTestUdpSocket(onMessage, acceptPacketTypes) { let socket = dgram.createSocket('udp4'); socket.unref(); await new Promise((resolve, reject) => { socket.on('error', err => { socket.close(); reject(err); }); socket.on('message', (msg, rinfo) => { let packet = null; for (const type of acceptPacketTypes) { try { packet = new type().read(msg); break; } catch (e) { } } if (packet !== null){ onMessage(packet, rinfo); } }); socket.bind(0, "127.0.0.1", () => resolve()); }); return socket; }