fix(09): WR-02 make initOutboxTrigger idempotent and retain the unsubscribe handle via stopOutboxTrigger

This commit is contained in:
Lucas Berger
2026-06-12 20:51:32 -04:00
parent d3163f2281
commit e1ffddf8dc
+19 -1
View File
@@ -850,9 +850,27 @@ export async function runOutboxDrain(): Promise<void> {
* T-09-02: initOutboxTrigger is called only under isMainModule() in index.ts;
* tests import runOutboxDrain/scheduleOutboxDrain directly and never register
* a listener — no open-handle leak preventing process exit.
*
* WR-02: idempotent. The unsubscribe handle is retained so a duplicate call is a
* no-op (never double-registers the 'drain' listener) and stopOutboxTrigger() can
* remove it for a clean teardown (tests, graceful shutdown).
*/
let unsubscribeDrain: (() => void) | null = null;
export function initOutboxTrigger(): void {
onOutboxDrain(() => scheduleOutboxDrain());
if (unsubscribeDrain) return; // idempotent — never double-register
unsubscribeDrain = onOutboxDrain(() => scheduleOutboxDrain());
}
/**
* Remove the 'drain' listener registered by initOutboxTrigger() and reset the
* idempotency guard so a later initOutboxTrigger() can re-register cleanly.
* Used by the test suite's afterAll teardown (WR-03) and available for graceful
* shutdown.
*/
export function stopOutboxTrigger(): void {
unsubscribeDrain?.();
unsubscribeDrain = null;
}
/**