fix: Signal SSE monitor reconnects on connection drop
- Wrap streamSignalEvents in reconnection loop - Exponential backoff: 1s → 30s max - Log reconnection attempts - Respect abortSignal for clean shutdown Fixes #425
This commit is contained in:
parent
c21ba9e876
commit
80f31cd75e
@ -524,16 +524,34 @@ export async function monitorSignalProvider(
|
|||||||
if (!queuedFinal) return;
|
if (!queuedFinal) return;
|
||||||
};
|
};
|
||||||
|
|
||||||
await streamSignalEvents({
|
// Reconnection loop for SSE stream
|
||||||
baseUrl,
|
const MAX_RETRY_DELAY = 30_000; // 30 seconds
|
||||||
account,
|
const INITIAL_RETRY_DELAY = 1_000; // 1 second
|
||||||
abortSignal: opts.abortSignal,
|
let retryDelay = INITIAL_RETRY_DELAY;
|
||||||
onEvent: (event) => {
|
|
||||||
void handleEvent(event).catch((err) => {
|
while (!opts.abortSignal?.aborted) {
|
||||||
runtime.error?.(`event handler failed: ${String(err)}`);
|
try {
|
||||||
|
await streamSignalEvents({
|
||||||
|
baseUrl,
|
||||||
|
account,
|
||||||
|
abortSignal: opts.abortSignal,
|
||||||
|
onEvent: (event) => {
|
||||||
|
void handleEvent(event).catch((err) => {
|
||||||
|
runtime.error?.(`event handler failed: ${String(err)}`);
|
||||||
|
});
|
||||||
|
},
|
||||||
});
|
});
|
||||||
},
|
// If streamSignalEvents returns normally, break (shouldn't happen normally)
|
||||||
});
|
break;
|
||||||
|
} catch (err) {
|
||||||
|
if (opts.abortSignal?.aborted) return;
|
||||||
|
runtime.log?.(
|
||||||
|
`Signal SSE connection lost, reconnecting in ${retryDelay / 1000}s...`,
|
||||||
|
);
|
||||||
|
await new Promise((resolve) => setTimeout(resolve, retryDelay));
|
||||||
|
retryDelay = Math.min(retryDelay * 2, MAX_RETRY_DELAY);
|
||||||
|
}
|
||||||
|
}
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
if (opts.abortSignal?.aborted) return;
|
if (opts.abortSignal?.aborted) return;
|
||||||
throw err;
|
throw err;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user