Spaces:
Running
Running
| import type { EventEmitter } from "node:events"; | |
| import type { RuntimeEnv } from "../runtime.js"; | |
| import { logVerbose } from "../globals.js"; | |
| type GatewayEmitter = Pick<EventEmitter, "on" | "removeListener">; | |
| const INFO_DEBUG_MARKERS = [ | |
| "WebSocket connection closed", | |
| "Reconnecting with backoff", | |
| "Attempting resume with backoff", | |
| ]; | |
| const shouldPromoteGatewayDebug = (message: string) => | |
| INFO_DEBUG_MARKERS.some((marker) => message.includes(marker)); | |
| const formatGatewayMetrics = (metrics: unknown) => { | |
| if (metrics === null || metrics === undefined) { | |
| return String(metrics); | |
| } | |
| if (typeof metrics === "string") { | |
| return metrics; | |
| } | |
| if (typeof metrics === "number" || typeof metrics === "boolean" || typeof metrics === "bigint") { | |
| return String(metrics); | |
| } | |
| try { | |
| return JSON.stringify(metrics); | |
| } catch { | |
| return "[unserializable metrics]"; | |
| } | |
| }; | |
| export function attachDiscordGatewayLogging(params: { | |
| emitter?: GatewayEmitter; | |
| runtime: RuntimeEnv; | |
| }) { | |
| const { emitter, runtime } = params; | |
| if (!emitter) { | |
| return () => {}; | |
| } | |
| const onGatewayDebug = (msg: unknown) => { | |
| const message = String(msg); | |
| logVerbose(`discord gateway: ${message}`); | |
| if (shouldPromoteGatewayDebug(message)) { | |
| runtime.log?.(`discord gateway: ${message}`); | |
| } | |
| }; | |
| const onGatewayWarning = (warning: unknown) => { | |
| logVerbose(`discord gateway warning: ${String(warning)}`); | |
| }; | |
| const onGatewayMetrics = (metrics: unknown) => { | |
| logVerbose(`discord gateway metrics: ${formatGatewayMetrics(metrics)}`); | |
| }; | |
| emitter.on("debug", onGatewayDebug); | |
| emitter.on("warning", onGatewayWarning); | |
| emitter.on("metrics", onGatewayMetrics); | |
| return () => { | |
| emitter.removeListener("debug", onGatewayDebug); | |
| emitter.removeListener("warning", onGatewayWarning); | |
| emitter.removeListener("metrics", onGatewayMetrics); | |
| }; | |
| } | |