Phase 9: Faster Write-Back (CAL-15) — event-driven outbox drain #14
@@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user