From 37594a5bec8574e1c4b5d5dcb2d45b055ee3c58c Mon Sep 17 00:00:00 2001 From: Rory& Date: Fri, 17 Oct 2025 11:58:53 +0200 Subject: ZSTD on gateway --- src/gateway/util/Send.ts | 28 ++++++++++++++++------------ src/gateway/util/WebSocket.ts | 7 ++++++- 2 files changed, 22 insertions(+), 13 deletions(-) (limited to 'src/gateway/util') diff --git a/src/gateway/util/Send.ts b/src/gateway/util/Send.ts index 9b1eef6a..cee3aa8c 100644 --- a/src/gateway/util/Send.ts +++ b/src/gateway/util/Send.ts @@ -43,22 +43,20 @@ const recurseJsonReplace = (json: any) => { return json; }; -export function Send(socket: WebSocket, data: Payload) { +export async function Send(socket: WebSocket, data: Payload) { if (process.env.WS_VERBOSE) console.log(`[Websocket] Outgoing message: ${JSON.stringify(data)}`); if (process.env.WS_DUMP) { const id = socket.session_id || "unknown"; - (async () => { - await fs.mkdir(path.join("dump", id), { - recursive: true, - }); - await fs.writeFile( - path.join("dump", id, `${Date.now()}.out.json`), - JSON.stringify(data, null, 2), - ); - })(); + await fs.mkdir(path.join("dump", id), { + recursive: true, + }); + await fs.writeFile( + path.join("dump", id, `${Date.now()}.out.json`), + JSON.stringify(data, null, 2), + ); } let buffer: Buffer | string; @@ -71,9 +69,15 @@ export function Send(socket: WebSocket, data: Payload) { else if (socket.encoding === "json") buffer = JSON.stringify(data, JSONReplacer); else return; + // TODO: compression - if (socket.deflate) { - buffer = socket.deflate.process(buffer) as Buffer; + if (socket.compress === "zlib-stream") { + buffer = socket.deflate!.process(buffer) as Buffer; + } else if (socket.compress === "zstd-stream") { + if (typeof(buffer) === "string") + buffer = Buffer.from(buffer as string); + + buffer = await socket.zstdEncoder!.encode(buffer as Buffer) as Buffer; } return new Promise((res, rej) => { diff --git a/src/gateway/util/WebSocket.ts b/src/gateway/util/WebSocket.ts index 2f8fa7cf..09bae2d0 100644 --- a/src/gateway/util/WebSocket.ts +++ b/src/gateway/util/WebSocket.ts @@ -20,19 +20,24 @@ import { Intents, ListenEventOpts, Permissions } from "@spacebar/util"; import WS from "ws"; import { Deflate, Inflate } from "fast-zlib"; import { Capabilities } from "./Capabilities"; +import { ZstdCompress } from "zlib"; +import { ZstdDecompress } from "node:zlib"; +import { Decoder, Encoder } from "@toondepauw/node-zstd"; export interface WebSocket extends WS { version: number; user_id: string; session_id: string; encoding: "etf" | "json"; - compress?: "zlib-stream"; + compress?: "zlib-stream" | "zstd-stream"; ipAddress?: string; userAgent?: string; // for cdn request signing shard_count?: bigint; shard_id?: bigint; deflate?: Deflate; inflate?: Inflate; + zstdEncoder?: Encoder; + zstdDecoder?: Decoder; heartbeatTimeout: NodeJS.Timeout; readyTimeout: NodeJS.Timeout; intents: Intents; -- cgit 1.5.1