From 1eb2d71854c8a44ee525fb4872aae6bf074c9efd Mon Sep 17 00:00:00 2001 From: Rory& Date: Wed, 29 Apr 2026 16:16:27 +0200 Subject: [PATCH] switch to harmony-erlpack --- package-lock.json | Bin 328299 -> 311326 bytes package.json | 2 +- src/gateway/events/Message.ts | 18 ++++++++++-------- src/gateway/util/Send.ts | 16 +++++++++------- 4 files changed, 20 insertions(+), 16 deletions(-) diff --git a/package-lock.json b/package-lock.json index 827b0feadc1f65069a089a2c88c741f89b4af524..ce23ed7b89006a5281b7a4211134e8ef7e63c8d5 100644 GIT binary patch delta 544 zcmaFeA~LT*ctb4w*CE5MqZ8W)6O&AVB4;8gOQ0DD5^U7!e^!J zrMDTAnWpzYWMrM*9>>Ht{g@e})bs~|EH>MZ-)G#aupOv)+0^Y#vzbH~fqE3DPq@y= zGClqulhXF5bC}jMZkJoc6wM8j5uRR<$*8>j##*Ll9K0y*ojlQ5e!9&qMk_@$kLc^_ zqlrv^D9)@G8e&|Wm{H^wk)P#in&%j9S*BfDrSFpMXcFRL<{9V~T;^ZuTwq`t<`$S~ znHJ@2Zk7~U6=GN%5m-`H>Eaua8&n!kZ|G!Jo}O#P zD7^i) zr~m)WXuLgYKlA3`?W;stIK;M#>#{r--JamWQYyc_C7q>7Vta5S%SONHw=T2rO-|h= oINg9B7$fd~S**6dzQ{6xb$i53mMqroZ4X%Xifo_xjpY(I0GI>K6951J delta 6564 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 diff --git a/package.json b/package.json index 63fdd9233..3206e54dd 100644 --- a/package.json +++ b/package.json @@ -98,6 +98,7 @@ "fido2-lib": "^3.5.9", "file-type": "^22.0.1", "form-data": "^4.0.5", + "harmony-erlpack": "^0.0.1", "i18next": "^26.0.6", "i18next-fs-backend": "^2.6.4", "i18next-http-middleware": "^3.9.3", @@ -131,7 +132,6 @@ }, "optionalDependencies": { "@sendgrid/mail": "^8.1.6", - "@yukikaze-bot/erlpack": "^1.0.1", "jimp": "^1.6.1", "mailgun.js": "^13.0.0", "node-mailjet": "^6.0.11", diff --git a/src/gateway/events/Message.ts b/src/gateway/events/Message.ts index 8bd1adda9..043b73768 100644 --- a/src/gateway/events/Message.ts +++ b/src/gateway/events/Message.ts @@ -17,7 +17,8 @@ */ import { CLOSECODES, Payload, WebSocket } from "@spacebar/gateway"; -import { ErlpackType } from "@spacebar/util"; +// import { ErlpackType } from "@spacebar/util"; +import * as erlpack from "harmony-erlpack"; import fs from "node:fs/promises"; import BigIntJson from "json-bigint"; import path from "node:path"; @@ -28,12 +29,12 @@ import { PayloadSchema } from "@spacebar/schemas"; const bigIntJson = BigIntJson({ storeAsString: true }); -let erlpack: ErlpackType | null = null; -try { - erlpack = require("@yukikaze-bot/erlpack") as ErlpackType; -} catch (e) { - console.log("Failed to import @yukikaze-bot/erlpack: ", e); -} +// let erlpack: ErlpackType | null = null; +// try { +// erlpack = require("@yukikaze-bot/erlpack") as ErlpackType; +// } catch (e) { +// console.log("Failed to import @yukikaze-bot/erlpack: ", e); +// } export async function Message(this: WebSocket, buffer: WS.Data) { // TODO: compression @@ -61,7 +62,8 @@ export async function Message(this: WebSocket, buffer: WS.Data) { data = bigIntJson.parse(buffer as string); } else if (this.encoding === "etf" && Buffer.isBuffer(buffer) && erlpack) { try { - data = erlpack.unpack(buffer); + // cast is ~safe: unpack returns the parsed data in the shape it was provided, @yukikaze-bot/erlpack got around this by returning `any` instead of an actual type union. + data = erlpack.unpack(buffer.buffer.slice(buffer.byteOffset, buffer.byteOffset + buffer.byteLength)) as unknown as Payload; } catch { console.error(`[Gateway/${this.user_id ?? this.ipAddress}] Failed to decode ETF payload`); return this.close(CLOSECODES.Decode_error); diff --git a/src/gateway/util/Send.ts b/src/gateway/util/Send.ts index 00fd4b454..6a9c639d7 100644 --- a/src/gateway/util/Send.ts +++ b/src/gateway/util/Send.ts @@ -21,12 +21,14 @@ import fs from "node:fs/promises"; import path from "node:path"; import { ErlpackType, JSONReplacer } from "@spacebar/util"; -let erlpack: ErlpackType | null = null; -try { - erlpack = require("@yukikaze-bot/erlpack") as ErlpackType; -} catch (e) { - console.log("Failed to import @yukikaze-bot/erlpack: ", e); -} +import * as erlpack from "harmony-erlpack"; + +// let erlpack: ErlpackType | null = null; +// try { +// erlpack = require("@yukikaze-bot/erlpack") as ErlpackType; +// } catch (e) { +// console.log("Failed to import @yukikaze-bot/erlpack: ", e); +// } // don't care // eslint-disable-next-line @typescript-eslint/no-explicit-any @@ -58,7 +60,7 @@ export async function Send(socket: WebSocket, data: Payload) { if (socket.encoding === "etf" && erlpack) { // Erlpack doesn't like Date objects, encodes them as {} data = recurseJsonReplace(data); - buffer = erlpack.pack(data); + buffer = Buffer.from(erlpack.pack(data)); } // TODO: encode circular object else if (socket.encoding === "json") buffer = JSON.stringify(data, JSONReplacer);