import { formatErrorMessage } from "openclaw/plugin-sdk/error-runtime"; import { raceWithTimeoutAndAbort } from "./async.js"; import { createFeishuClient, type FeishuClientCredentials } from "./client.js"; import type { FeishuProbeResult } from "./types.js";
/** Cache probe results to reduce repeated health-check calls. *GatewayhealthcheckscallprobeFeishu()everyminute;withoutcachingthis *burns~43,200calls/month,easilyexceedingFeishu'sfree-tierquota. *Successfulbotinfoiseffectivelystatic,whilefailuresarecachedbriefly
* to avoid hammering the API during transient outages. */ const probeCache = new Map<string, { result: FeishuProbeResult; expiresAt: number }>(); const PROBE_SUCCESS_TTL_MS = 10 * 60 * 1000; // 10 minutes const PROBE_ERROR_TTL_MS = 60 * 1000; // 1 minute const MAX_PROBE_CACHE_SIZE = 64;
export const FEISHU_PROBE_REQUEST_TIMEOUT_MS = 10_000;
export type ProbeFeishuOptions = {
timeoutMs?: number;
abortSignal?: AbortSignal;
};
// Return cached result if still valid. // Use accountId when available; otherwise include appSecret prefix so two // accounts sharing the same appId (e.g. after secret rotation) don't // pollute each other's cache entry. const cacheKey = creds.accountId ?? `${creds.appId}:${creds.appSecret.slice(0, 8)}`; const cached = probeCache.get(cacheKey); if (cached && cached.expiresAt > Date.now()) { return cached.result;
}
try { const client = createFeishuClient(creds) as FeishuRequestClient; // Feishu-provided endpoint for OpenClaw, supported on both Feishu (CN) // and Lark (international). No OAuth scopes required. Validates // credentials and registers the app as an AI agent (智能体). const responseResult = await raceWithTimeoutAndAbort<FeishuPingResponse>(
client.request({
method: "POST",
url: "/open-apis/bot/v1/openclaw_bot/ping",
data: { needBotInfo: true },
timeout: timeoutMs,
}),
{
timeoutMs,
abortSignal: options.abortSignal,
},
);
if (responseResult.status === "aborted") { return {
ok: false,
appId: creds.appId,
error: "probe aborted",
};
} if (responseResult.status === "timeout") { return setCachedProbeResult(
cacheKey,
{
ok: false,
appId: creds.appId,
error: `probe timed out after ${timeoutMs}ms`,
},
PROBE_ERROR_TTL_MS,
);
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.