UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

104 lines (103 loc) 5.08 kB
import { a as normalizeLowercaseStringOrEmpty } from "./string-coerce-mnp54Vah.js"; import { b as parseStrictPositiveInteger } from "./number-coercion-CJQ8TR--.js"; import "./number-runtime-DBLVDypr.js"; import "./string-coerce-runtime-CEGJWkQ_.js"; import { a as createFixedWindowRateLimiter, o as createWebhookAnomalyTracker, r as WEBHOOK_RATE_LIMIT_DEFAULTS, t as WEBHOOK_ANOMALY_COUNTER_DEFAULTS } from "./webhook-ingress-Dgd3Jtks.js"; import { n as probeFeishu } from "./probe-CiCSquE9.js"; //#region extensions/feishu/src/monitor.startup.ts const FEISHU_STARTUP_BOT_INFO_TIMEOUT_DEFAULT_MS = 3e4; const FEISHU_STARTUP_BOT_INFO_TIMEOUT_ENV = "OPENCLAW_FEISHU_STARTUP_PROBE_TIMEOUT_MS"; function resolveStartupProbeTimeoutMs(env = process.env) { const raw = env[FEISHU_STARTUP_BOT_INFO_TIMEOUT_ENV]; if (raw) { const parsed = parseStrictPositiveInteger(raw); if (parsed !== void 0) return parsed; console.warn(`[feishu] ${FEISHU_STARTUP_BOT_INFO_TIMEOUT_ENV}="${raw}" is invalid; using default ${FEISHU_STARTUP_BOT_INFO_TIMEOUT_DEFAULT_MS}ms`); } return FEISHU_STARTUP_BOT_INFO_TIMEOUT_DEFAULT_MS; } const FEISHU_STARTUP_BOT_INFO_TIMEOUT_MS = resolveStartupProbeTimeoutMs(); function isTimeoutErrorMessage(message) { const lower = normalizeLowercaseStringOrEmpty(message); return lower.includes("timeout") || lower.includes("timed out"); } function isAbortErrorMessage(message) { return normalizeLowercaseStringOrEmpty(message).includes("aborted"); } async function fetchBotIdentityForMonitor(account, options = {}) { if (options.abortSignal?.aborted) return {}; const timeoutMs = options.timeoutMs ?? FEISHU_STARTUP_BOT_INFO_TIMEOUT_MS; const result = await probeFeishu(account, { timeoutMs, abortSignal: options.abortSignal }); if (result.ok) return { botOpenId: result.botOpenId, botName: result.botName }; const probeError = result.error ?? void 0; if (options.abortSignal?.aborted || isAbortErrorMessage(probeError)) return {}; if (isTimeoutErrorMessage(probeError)) (options.runtime?.error ?? console.error)(`feishu[${account.accountId}]: bot info probe timed out after ${timeoutMs}ms; continuing startup`); return {}; } //#endregion //#region extensions/feishu/src/monitor.state.ts const wsClients = /* @__PURE__ */ new Map(); const httpServers = /* @__PURE__ */ new Map(); const botOpenIds = /* @__PURE__ */ new Map(); const botNames = /* @__PURE__ */ new Map(); const FEISHU_WEBHOOK_MAX_BODY_BYTES = 64 * 1024; const FEISHU_WEBHOOK_BODY_TIMEOUT_MS = 5e3; const FEISHU_WEBHOOK_RATE_LIMIT_FALLBACK_DEFAULTS = { windowMs: 6e4, maxRequests: 120, maxTrackedKeys: 4096 }; const FEISHU_WEBHOOK_ANOMALY_FALLBACK_DEFAULTS = { maxTrackedKeys: 4096, ttlMs: 360 * 6e4, logEvery: 25 }; function coercePositiveInt(value, fallback) { if (typeof value !== "number" || !Number.isFinite(value)) return fallback; const normalized = Math.floor(value); return normalized > 0 ? normalized : fallback; } function resolveFeishuWebhookRateLimitDefaultsForTest(defaults) { const resolved = defaults; return { windowMs: coercePositiveInt(resolved?.windowMs, FEISHU_WEBHOOK_RATE_LIMIT_FALLBACK_DEFAULTS.windowMs), maxRequests: coercePositiveInt(resolved?.maxRequests, FEISHU_WEBHOOK_RATE_LIMIT_FALLBACK_DEFAULTS.maxRequests), maxTrackedKeys: coercePositiveInt(resolved?.maxTrackedKeys, FEISHU_WEBHOOK_RATE_LIMIT_FALLBACK_DEFAULTS.maxTrackedKeys) }; } function resolveFeishuWebhookAnomalyDefaultsForTest(defaults) { const resolved = defaults; return { maxTrackedKeys: coercePositiveInt(resolved?.maxTrackedKeys, FEISHU_WEBHOOK_ANOMALY_FALLBACK_DEFAULTS.maxTrackedKeys), ttlMs: coercePositiveInt(resolved?.ttlMs, FEISHU_WEBHOOK_ANOMALY_FALLBACK_DEFAULTS.ttlMs), logEvery: coercePositiveInt(resolved?.logEvery, FEISHU_WEBHOOK_ANOMALY_FALLBACK_DEFAULTS.logEvery) }; } const feishuWebhookRateLimitDefaults = resolveFeishuWebhookRateLimitDefaultsForTest(WEBHOOK_RATE_LIMIT_DEFAULTS); const feishuWebhookAnomalyDefaults = resolveFeishuWebhookAnomalyDefaultsForTest(WEBHOOK_ANOMALY_COUNTER_DEFAULTS); const feishuWebhookRateLimiter = createFixedWindowRateLimiter({ windowMs: feishuWebhookRateLimitDefaults.windowMs, maxRequests: feishuWebhookRateLimitDefaults.maxRequests, maxTrackedKeys: feishuWebhookRateLimitDefaults.maxTrackedKeys }); const feishuWebhookAnomalyTracker = createWebhookAnomalyTracker({ maxTrackedKeys: feishuWebhookAnomalyDefaults.maxTrackedKeys, ttlMs: feishuWebhookAnomalyDefaults.ttlMs, logEvery: feishuWebhookAnomalyDefaults.logEvery }); function recordWebhookStatus(runtime, accountId, path, statusCode) { feishuWebhookAnomalyTracker.record({ key: `${accountId}:${path}:${statusCode}`, statusCode, log: runtime?.log ?? console.log, message: (count) => `feishu[${accountId}]: webhook anomaly path=${path} status=${statusCode} count=${count}` }); } //#endregion export { feishuWebhookRateLimiter as a, wsClients as c, botOpenIds as i, fetchBotIdentityForMonitor as l, FEISHU_WEBHOOK_MAX_BODY_BYTES as n, httpServers as o, botNames as r, recordWebhookStatus as s, FEISHU_WEBHOOK_BODY_TIMEOUT_MS as t };