refactor: share backoff helpers
This commit is contained in:
@@ -1,4 +1,3 @@
|
||||
import { setTimeout as delay } from "node:timers/promises";
|
||||
import { chunkText, resolveTextChunkLimit } from "../auto-reply/chunk.js";
|
||||
import { formatAgentEnvelope } from "../auto-reply/envelope.js";
|
||||
import { dispatchReplyFromConfig } from "../auto-reply/reply/dispatch-from-config.js";
|
||||
@@ -16,9 +15,10 @@ import {
|
||||
import { resolveAgentRoute } from "../routing/resolve-route.js";
|
||||
import type { RuntimeEnv } from "../runtime.js";
|
||||
import { normalizeE164 } from "../utils.js";
|
||||
import { signalCheck, signalRpcRequest, streamSignalEvents } from "./client.js";
|
||||
import { signalCheck, signalRpcRequest } from "./client.js";
|
||||
import { spawnSignalDaemon } from "./daemon.js";
|
||||
import { sendMessageSignal } from "./send.js";
|
||||
import { runSignalSseLoop } from "./sse-reconnect.js";
|
||||
|
||||
type SignalEnvelope = {
|
||||
sourceNumber?: string | null;
|
||||
@@ -525,62 +525,17 @@ export async function monitorSignalProvider(
|
||||
if (!queuedFinal) return;
|
||||
};
|
||||
|
||||
// Reconnection loop for SSE stream
|
||||
const MAX_RETRY_DELAY = 10_000; // 10 seconds
|
||||
const INITIAL_RETRY_DELAY = 1_000; // 1 second
|
||||
const RETRY_JITTER = 0.2;
|
||||
let retryDelay = INITIAL_RETRY_DELAY;
|
||||
|
||||
while (!opts.abortSignal?.aborted) {
|
||||
try {
|
||||
await streamSignalEvents({
|
||||
baseUrl,
|
||||
account,
|
||||
abortSignal: opts.abortSignal,
|
||||
onEvent: (event) => {
|
||||
void handleEvent(event).catch((err) => {
|
||||
runtime.error?.(`event handler failed: ${String(err)}`);
|
||||
});
|
||||
},
|
||||
await runSignalSseLoop({
|
||||
baseUrl,
|
||||
account,
|
||||
abortSignal: opts.abortSignal,
|
||||
runtime,
|
||||
onEvent: (event) => {
|
||||
void handleEvent(event).catch((err) => {
|
||||
runtime.error?.(`event handler failed: ${String(err)}`);
|
||||
});
|
||||
if (opts.abortSignal?.aborted) return;
|
||||
runtime.log?.(
|
||||
`Signal SSE stream ended, reconnecting in ${retryDelay / 1000}s...`,
|
||||
);
|
||||
const jitteredDelay = Math.max(
|
||||
0,
|
||||
Math.round(
|
||||
retryDelay * (1 - RETRY_JITTER + Math.random() * 2 * RETRY_JITTER),
|
||||
),
|
||||
);
|
||||
try {
|
||||
await delay(jitteredDelay, undefined, { signal: opts.abortSignal });
|
||||
} catch (err) {
|
||||
if (opts.abortSignal?.aborted) return;
|
||||
throw err;
|
||||
}
|
||||
retryDelay = INITIAL_RETRY_DELAY;
|
||||
} catch (err) {
|
||||
if (opts.abortSignal?.aborted) return;
|
||||
runtime.error?.(`Signal SSE stream error: ${String(err)}`);
|
||||
runtime.log?.(
|
||||
`Signal SSE connection lost, reconnecting in ${retryDelay / 1000}s...`,
|
||||
);
|
||||
const jitteredDelay = Math.max(
|
||||
0,
|
||||
Math.round(
|
||||
retryDelay * (1 - RETRY_JITTER + Math.random() * 2 * RETRY_JITTER),
|
||||
),
|
||||
);
|
||||
try {
|
||||
await delay(jitteredDelay, undefined, { signal: opts.abortSignal });
|
||||
} catch (err) {
|
||||
if (opts.abortSignal?.aborted) return;
|
||||
throw err;
|
||||
}
|
||||
retryDelay = Math.min(retryDelay * 2, MAX_RETRY_DELAY);
|
||||
}
|
||||
}
|
||||
},
|
||||
});
|
||||
} catch (err) {
|
||||
if (opts.abortSignal?.aborted) return;
|
||||
throw err;
|
||||
|
||||
Reference in New Issue
Block a user