Phase 9: Faster Write-Back (CAL-15) — event-driven outbox drain #14

Merged
luckberg merged 26 commits from gsd/phase-09-faster-write-back into main 2026-06-12 21:19:17 -04:00
Showing only changes of commit e1ffddf8dc - Show all commits
+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;
}
/**