Arms the drain: listeners, tick, and a first pass.
🛑 The call itself IS the "storage initialised" trigger — one gesture, not two. The
lifecycle arms right after StorageContract._markReady(), so this first pass is by
construction later than the moment IndexedDB opened, and it is what empties a queue left
by a previous session without waiting for a network transition that may never come (the
device may well have been online the whole time).
Idempotent: a second call replaces the injected collaborators without stacking listeners.
Parameters
deps: DrainTriggerDeps = {}
Test seams and pollIntervalMs. Production passes nothing.
Arms the drain: listeners, tick, and a first pass.
🛑 The call itself IS the "storage initialised" trigger — one gesture, not two. The lifecycle arms right after
StorageContract._markReady(), so this first pass is by construction later than the moment IndexedDB opened, and it is what empties a queue left by a previous session without waiting for a network transition that may never come (the device may well have been online the whole time).Idempotent: a second call replaces the injected collaborators without stacking listeners.