























@@ -12,6 +12,10 @@ type SlackSocketModeConfig = Pick<
1212>;
1313type SlackSdkLogger = NonNullable<SlackSocketModeReceiverOptions["logger"]>;
1414type SlackSdkLogLevel = ReturnType<SlackSdkLogger["getLevel"]>;
15+type SlackSocketModeLogger = SlackSdkLogger & {
16+getLastMessage: () => string | undefined;
17+};
18+type SlackSocketDisconnect = Awaited<ReturnType<typeof waitForSlackSocketDisconnect>>;
15191620const OPENCLAW_SLACK_CLIENT_PING_TIMEOUT_MS = 15_000;
1721const SLACK_SOCKET_PONG_TIMEOUT_WARNING_PREFIX = "A pong wasn't received from the server";
@@ -148,29 +152,48 @@ function isSlackSocketSelfInflictedLoggerWarning(args: readonly unknown[]) {
148152return typeof args[0] === "string" && SLACK_SOCKET_LOG_LEVEL_IGNORED_WARNING_RE.test(args[0]);
149153}
150154155+function formatSlackSdkLogArgs(args: readonly unknown[]) {
156+return args
157+.map((arg) => formatUnknownError(arg, ""))
158+.filter(Boolean)
159+.join(" ");
160+}
161+151162export function createSlackSocketModeLogger(
152163sink: Pick<typeof console, "debug" | "info" | "warn" | "error"> = console,
153-): SlackSdkLogger {
164+): SlackSocketModeLogger {
154165let level = "info" as SlackSdkLogLevel;
155166let name = "socket-mode";
156167const prefix = () => `socket-mode:${name}`;
168+let lastMessage: string | undefined;
169+const remember = (args: readonly unknown[]) => {
170+const message = formatSlackSdkLogArgs([prefix(), ...args]);
171+if (message) {
172+lastMessage = message;
173+}
174+};
157175return {
158176debug: () => {},
159177info: () => {},
160178warn: (...args: unknown[]) => {
161179if (isSlackSocketPongTimeoutWarning(args) || isSlackSocketSelfInflictedLoggerWarning(args)) {
162180return;
163181}
182+remember(args);
164183sink.warn(prefix(), ...args);
165184},
166-error: (...args: unknown[]) => sink.error(prefix(), ...args),
185+error: (...args: unknown[]) => {
186+remember(args);
187+sink.error(prefix(), ...args);
188+},
167189setLevel: (nextLevel) => {
168190level = nextLevel;
169191},
170192getLevel: () => level,
171193setName: (nextName) => {
172194name = nextName;
173195},
196+getLastMessage: () => lastMessage,
174197};
175198}
176199@@ -217,12 +240,13 @@ export function createSlackBoltApp(params: {
217240clientOptions: Record<string, unknown>;
218241socketMode?: SlackSocketModeConfig;
219242}) {
243+const socketModeLogger = createSlackSocketModeLogger();
220244const socketModeReceiverOptions: SlackSocketModeReceiverOptions = {
221245appToken: params.appToken ?? "",
222246autoReconnectEnabled: false,
223247clientPingTimeout:
224248params.socketMode?.clientPingTimeout ?? OPENCLAW_SLACK_CLIENT_PING_TIMEOUT_MS,
225-logger: createSlackSocketModeLogger(),
249+logger: socketModeLogger,
226250installerOptions: {
227251clientOptions: params.clientOptions,
228252},
@@ -257,15 +281,21 @@ export function createSlackBoltApp(params: {
257281}
258282await args.next();
259283});
260-return { app, receiver };
284+return { app, receiver, socketModeLogger };
261285}
262286263287export function createSlackSocketDisconnectWaiter(app: unknown, abortSignal?: AbortSignal) {
264288const waiterAbortController = new AbortController();
265289const relayAbort = () => waiterAbortController.abort();
290+let latest: SlackSocketDisconnect | undefined;
266291abortSignal?.addEventListener("abort", relayAbort, { once: true });
292+const promise = waitForSlackSocketDisconnect(app, waiterAbortController.signal).then((value) => {
293+latest = value;
294+return value;
295+});
267296return {
268-promise: waitForSlackSocketDisconnect(app, waiterAbortController.signal),
297+ promise,
298+getLatest: () => latest,
269299cancel: () => {
270300waiterAbortController.abort();
271301abortSignal?.removeEventListener("abort", relayAbort);
@@ -293,7 +323,16 @@ export async function startSlackSocketAndWaitForDisconnect(params: {
293323disconnectWaiter.complete();
294324return disconnect;
295325} catch (err) {
326+await Promise.resolve();
327+const disconnect = disconnectWaiter.getLatest();
296328disconnectWaiter.cancel();
329+if ((err === undefined || err === null || err === "") && disconnect?.error !== undefined) {
330+throw disconnect.error;
331+}
332+if (err === undefined || err === null || err === "") {
333+const suffix = disconnect ? ` after ${disconnect.event}` : "";
334+throw new Error(`Slack Socket Mode start failed${suffix} without error detail`);
335+}
297336throw err;
298337}
299338}
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。