import type { EventEmitter } from "node:events"; import { logVerbose } from "../globals.js"; import type { RuntimeEnv } from "../runtime.js"; type GatewayEmitter = Pick; 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); }; }