自动同步: 2026-07-01 02:10
This commit is contained in:
Generated
Vendored
+163
@@ -0,0 +1,163 @@
|
||||
import { t as __exportAll } from "./rolldown-runtime-8H4AJuhK.js";
|
||||
import { createRequire } from "node:module";
|
||||
import { parseStrictPositiveInteger } from "openclaw/plugin-sdk/number-runtime";
|
||||
import * as Lark from "@larksuiteoapi/node-sdk";
|
||||
import { readPluginPackageVersion, resolveAmbientNodeProxyAgent } from "openclaw/plugin-sdk/extension-shared";
|
||||
//#region extensions/feishu/src/client-timeout.ts
|
||||
/** Default HTTP timeout for Feishu API requests (30 seconds). */
|
||||
const FEISHU_HTTP_TIMEOUT_MS = 3e4;
|
||||
const FEISHU_HTTP_TIMEOUT_MAX_MS = 3e5;
|
||||
const FEISHU_HTTP_TIMEOUT_ENV_VAR = "OPENCLAW_FEISHU_HTTP_TIMEOUT_MS";
|
||||
function resolveConfiguredHttpTimeoutMs(creds) {
|
||||
const clampTimeout = (value) => {
|
||||
return Math.min(Math.max(Math.floor(value), 1), FEISHU_HTTP_TIMEOUT_MAX_MS);
|
||||
};
|
||||
const fromDirectField = creds.httpTimeoutMs;
|
||||
if (typeof fromDirectField === "number" && Number.isFinite(fromDirectField) && fromDirectField > 0) return clampTimeout(fromDirectField);
|
||||
const envRaw = process.env[FEISHU_HTTP_TIMEOUT_ENV_VAR];
|
||||
if (envRaw) {
|
||||
const envValue = parseStrictPositiveInteger(envRaw);
|
||||
if (envValue !== void 0) return clampTimeout(envValue);
|
||||
}
|
||||
const timeout = creds.config?.httpTimeoutMs;
|
||||
if (typeof timeout !== "number" || !Number.isFinite(timeout) || timeout <= 0) return FEISHU_HTTP_TIMEOUT_MS;
|
||||
return clampTimeout(timeout);
|
||||
}
|
||||
//#endregion
|
||||
//#region extensions/feishu/src/client.ts
|
||||
var client_exports = /* @__PURE__ */ __exportAll({
|
||||
FEISHU_HTTP_TIMEOUT_ENV_VAR: () => FEISHU_HTTP_TIMEOUT_ENV_VAR,
|
||||
FEISHU_HTTP_TIMEOUT_MAX_MS: () => FEISHU_HTTP_TIMEOUT_MAX_MS,
|
||||
FEISHU_HTTP_TIMEOUT_MS: () => FEISHU_HTTP_TIMEOUT_MS,
|
||||
FEISHU_USER_AGENT: () => FEISHU_USER_AGENT,
|
||||
createEventDispatcher: () => createEventDispatcher,
|
||||
createFeishuClient: () => createFeishuClient,
|
||||
createFeishuWSClient: () => createFeishuWSClient,
|
||||
getFeishuUserAgent: () => getFeishuUserAgent,
|
||||
pluginVersion: () => pluginVersion
|
||||
});
|
||||
const pluginVersion = readPluginPackageVersion({ require: createRequire(import.meta.url) });
|
||||
const FEISHU_USER_AGENT = `openclaw-feishu-builtin/${pluginVersion}/${process.platform}`;
|
||||
const FEISHU_WS_CONFIG = {
|
||||
PingInterval: 30,
|
||||
PingTimeout: 3
|
||||
};
|
||||
/** User-Agent header value for all Feishu API requests. */
|
||||
function getFeishuUserAgent() {
|
||||
return FEISHU_USER_AGENT;
|
||||
}
|
||||
let feishuClientSdk = {
|
||||
AppType: Lark.AppType,
|
||||
Client: Lark.Client,
|
||||
defaultHttpInstance: Lark.defaultHttpInstance,
|
||||
Domain: Lark.Domain,
|
||||
EventDispatcher: Lark.EventDispatcher,
|
||||
LoggerLevel: Lark.LoggerLevel,
|
||||
WSClient: Lark.WSClient
|
||||
};
|
||||
function setRequestUserAgent(req) {
|
||||
const request = req;
|
||||
const headers = request.headers;
|
||||
if (!headers) {
|
||||
request.headers = { "User-Agent": getFeishuUserAgent() };
|
||||
return req;
|
||||
}
|
||||
const maybeAxiosHeaders = headers;
|
||||
if (typeof maybeAxiosHeaders.set === "function") {
|
||||
maybeAxiosHeaders.set("User-Agent", getFeishuUserAgent());
|
||||
return req;
|
||||
}
|
||||
headers["User-Agent"] = getFeishuUserAgent();
|
||||
return req;
|
||||
}
|
||||
Lark.defaultHttpInstance.interceptors?.request?.use(setRequestUserAgent);
|
||||
async function getWsProxyAgent() {
|
||||
return resolveAmbientNodeProxyAgent();
|
||||
}
|
||||
const clientCache = /* @__PURE__ */ new Map();
|
||||
function resolveDomain(domain) {
|
||||
if (domain === "lark") return feishuClientSdk.Domain.Lark;
|
||||
if (domain === "feishu" || !domain) return feishuClientSdk.Domain.Feishu;
|
||||
return domain.replace(/\/+$/, "");
|
||||
}
|
||||
/**
|
||||
* Create an HTTP instance that delegates to the Lark SDK's default instance
|
||||
* but injects a default request timeout and User-Agent header to prevent
|
||||
* indefinite hangs and set a standardized User-Agent per OAPI best practices.
|
||||
*/
|
||||
function createTimeoutHttpInstance(defaultTimeoutMs) {
|
||||
const base = feishuClientSdk.defaultHttpInstance;
|
||||
function injectTimeout(opts) {
|
||||
return {
|
||||
timeout: defaultTimeoutMs,
|
||||
...opts
|
||||
};
|
||||
}
|
||||
return {
|
||||
request: (opts) => base.request(injectTimeout(opts)),
|
||||
get: (url, opts) => base.get(url, injectTimeout(opts)),
|
||||
post: (url, data, opts) => base.post(url, data, injectTimeout(opts)),
|
||||
put: (url, data, opts) => base.put(url, data, injectTimeout(opts)),
|
||||
patch: (url, data, opts) => base.patch(url, data, injectTimeout(opts)),
|
||||
delete: (url, opts) => base.delete(url, injectTimeout(opts)),
|
||||
head: (url, opts) => base.head(url, injectTimeout(opts)),
|
||||
options: (url, opts) => base.options(url, injectTimeout(opts))
|
||||
};
|
||||
}
|
||||
/**
|
||||
* Create or get a cached Feishu client for an account.
|
||||
* Accepts any object with appId, appSecret, and optional domain/accountId.
|
||||
*/
|
||||
function createFeishuClient(creds) {
|
||||
const { accountId = "default", appId, appSecret, domain } = creds;
|
||||
const defaultHttpTimeoutMs = resolveConfiguredHttpTimeoutMs(creds);
|
||||
if (!appId || !appSecret) throw new Error(`Feishu credentials not configured for account "${accountId}"`);
|
||||
const cached = clientCache.get(accountId);
|
||||
if (cached && cached.config.appId === appId && cached.config.appSecret === appSecret && cached.config.domain === domain && cached.config.httpTimeoutMs === defaultHttpTimeoutMs) return cached.client;
|
||||
const client = new feishuClientSdk.Client({
|
||||
appId,
|
||||
appSecret,
|
||||
appType: feishuClientSdk.AppType.SelfBuild,
|
||||
domain: resolveDomain(domain),
|
||||
httpInstance: createTimeoutHttpInstance(defaultHttpTimeoutMs)
|
||||
});
|
||||
clientCache.set(accountId, {
|
||||
client,
|
||||
config: {
|
||||
appId,
|
||||
appSecret,
|
||||
domain,
|
||||
httpTimeoutMs: defaultHttpTimeoutMs
|
||||
}
|
||||
});
|
||||
return client;
|
||||
}
|
||||
/**
|
||||
* Create a Feishu WebSocket client for an account.
|
||||
* Note: WSClient is not cached since each call creates a new connection.
|
||||
*/
|
||||
async function createFeishuWSClient(account, callbacks = {}) {
|
||||
const { accountId, appId, appSecret, domain } = account;
|
||||
if (!appId || !appSecret) throw new Error(`Feishu credentials not configured for account "${accountId}"`);
|
||||
const agent = await getWsProxyAgent();
|
||||
return new feishuClientSdk.WSClient({
|
||||
appId,
|
||||
appSecret,
|
||||
domain: resolveDomain(domain),
|
||||
...callbacks,
|
||||
loggerLevel: feishuClientSdk.LoggerLevel.info,
|
||||
wsConfig: FEISHU_WS_CONFIG,
|
||||
...agent ? { agent } : {}
|
||||
});
|
||||
}
|
||||
/**
|
||||
* Create an event dispatcher for an account.
|
||||
*/
|
||||
function createEventDispatcher(account) {
|
||||
return new feishuClientSdk.EventDispatcher({
|
||||
encryptKey: account.encryptKey,
|
||||
verificationToken: account.verificationToken
|
||||
});
|
||||
}
|
||||
//#endregion
|
||||
export { getFeishuUserAgent as a, createFeishuWSClient as i, createEventDispatcher as n, createFeishuClient as r, client_exports as t };
|
||||
Reference in New Issue
Block a user