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;
|
* T-09-02: initOutboxTrigger is called only under isMainModule() in index.ts;
|
||||||
* tests import runOutboxDrain/scheduleOutboxDrain directly and never register
|
* tests import runOutboxDrain/scheduleOutboxDrain directly and never register
|
||||||
* a listener — no open-handle leak preventing process exit.
|
* 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 {
|
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