import type { EffectClaim } from "./model"; export interface EffectRepository { claim(): Promise; complete(claim: EffectClaim): Promise; fail(claim: EffectClaim, error: unknown): Promise; } /** At-least-once delivery: handlers must tolerate replay after an expired claim. */ export async function dispatchEffects( repo: EffectRepository, deliver: (claim: EffectClaim) => Promise, ) { for (let i = 0; i < 20; i++) { const claim = await repo.claim(); if (!claim) return; try { await deliver(claim); } catch (error) { await repo.fail(claim, error); continue; } await repo.complete(claim); } }