Files
openclaw/src/discord/gateway-logging.ts
2026-02-18 01:34:35 +00:00

68 lines
1.9 KiB
TypeScript

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