summary refs log tree commit diff
path: root/src/gateway/util
diff options
context:
space:
mode:
authorRory& <root@rory.gay>2025-10-17 11:58:53 +0200
committerRory& <root@rory.gay>2025-10-17 11:58:53 +0200
commit37594a5bec8574e1c4b5d5dcb2d45b055ee3c58c (patch)
treee55d944bd6f7f43c3e02be64d5d472c1aecae7d9 /src/gateway/util
parentMarshall ajverrors (diff)
downloadserver-ts-37594a5bec8574e1c4b5d5dcb2d45b055ee3c58c.tar.xz
ZSTD on gateway
Diffstat (limited to 'src/gateway/util')
-rw-r--r--src/gateway/util/Send.ts28
-rw-r--r--src/gateway/util/WebSocket.ts7
2 files changed, 22 insertions, 13 deletions
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;