mirror of
https://github.com/openclaw/openclaw.git
synced 2026-05-07 04:00:43 +00:00
49 lines
1.6 KiB
TypeScript
49 lines
1.6 KiB
TypeScript
import { createHash } from "node:crypto";
|
|
import { type WebClientOptions, WebClient } from "@slack/web-api";
|
|
import { resolveSlackWebClientOptions, resolveSlackWriteClientOptions } from "./client-options.js";
|
|
|
|
const SLACK_WRITE_CLIENT_CACHE_MAX = 32;
|
|
const slackWriteClientCache = new Map<string, WebClient>();
|
|
|
|
export {
|
|
resolveSlackWebClientOptions,
|
|
resolveSlackWriteClientOptions,
|
|
SLACK_DEFAULT_RETRY_OPTIONS,
|
|
SLACK_WRITE_RETRY_OPTIONS,
|
|
} from "./client-options.js";
|
|
|
|
export function createSlackWebClient(token: string, options: WebClientOptions = {}) {
|
|
return new WebClient(token, resolveSlackWebClientOptions(options));
|
|
}
|
|
|
|
export function createSlackWriteClient(token: string, options: WebClientOptions = {}) {
|
|
return new WebClient(token, resolveSlackWriteClientOptions(options));
|
|
}
|
|
|
|
export function createSlackTokenCacheKey(token: string): string {
|
|
return `sha256:${createHash("sha256").update(token).digest("base64url")}`;
|
|
}
|
|
|
|
export function getSlackWriteClient(token: string): WebClient {
|
|
const tokenKey = createSlackTokenCacheKey(token);
|
|
const cached = slackWriteClientCache.get(tokenKey);
|
|
if (cached) {
|
|
slackWriteClientCache.delete(tokenKey);
|
|
slackWriteClientCache.set(tokenKey, cached);
|
|
return cached;
|
|
}
|
|
const client = createSlackWriteClient(token);
|
|
if (slackWriteClientCache.size >= SLACK_WRITE_CLIENT_CACHE_MAX) {
|
|
const oldestTokenKey = slackWriteClientCache.keys().next().value;
|
|
if (oldestTokenKey) {
|
|
slackWriteClientCache.delete(oldestTokenKey);
|
|
}
|
|
}
|
|
slackWriteClientCache.set(tokenKey, client);
|
|
return client;
|
|
}
|
|
|
|
export function clearSlackWriteClientCacheForTest(): void {
|
|
slackWriteClientCache.clear();
|
|
}
|