From eee98516dd09516f1c1cf891526339420807d50c Mon Sep 17 00:00:00 2001 From: Madeline <46743919+MaddyUnderStars@users.noreply.github.com> Date: Tue, 21 Feb 2023 11:56:56 +1100 Subject: Fix gateway encoding Date objects as {} when using erlpack. Fixes NaN/NaN/NaN timestamps in desktop client --- src/gateway/util/Send.ts | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) (limited to 'src/gateway') diff --git a/src/gateway/util/Send.ts b/src/gateway/util/Send.ts index 38e5ab4a..e39554a4 100644 --- a/src/gateway/util/Send.ts +++ b/src/gateway/util/Send.ts @@ -20,7 +20,7 @@ import { Payload, WebSocket } from "@fosscord/gateway"; import fs from "fs/promises"; import path from "path"; -import type { ErlpackType } from "@fosscord/util"; +import { ErlpackType, JSONReplacer } from "@fosscord/util"; let erlpack: ErlpackType | null = null; try { erlpack = require("erlpack") as ErlpackType; @@ -28,6 +28,21 @@ try { // empty } +// don't care +// eslint-disable-next-line @typescript-eslint/no-explicit-any +const recurseJsonReplace = (json: any) => { + for (const key in json) { + // eslint-disable-next-line no-prototype-builtins + if (!json.hasOwnProperty(key)) continue; + + json[key] = JSONReplacer.call(json, key, json[key]); + + if (typeof json[key] == "object" && json[key] !== null) + json[key] = recurseJsonReplace(json[key]); + } + return json; +}; + export function Send(socket: WebSocket, data: Payload) { if (process.env.WS_VERBOSE) console.log(`[Websocket] Outgoing message: ${JSON.stringify(data)}`); @@ -47,9 +62,14 @@ export function Send(socket: WebSocket, data: Payload) { } let buffer: Buffer | string; - if (socket.encoding === "etf" && erlpack) buffer = erlpack.pack(data); + if (socket.encoding === "etf" && erlpack) { + // Erlpack doesn't like Date objects, encodes them as {} + data = recurseJsonReplace(data); + buffer = erlpack.pack(data); + } // TODO: encode circular object - else if (socket.encoding === "json") buffer = JSON.stringify(data); + else if (socket.encoding === "json") + buffer = JSON.stringify(data, JSONReplacer); else return; // TODO: compression if (socket.deflate) { -- cgit 1.4.1