import type { MessageStreamEvent } from "#protocol/message.js"; /** Remembers which session-stream events have already been consumed. */ export type EventDeduper = { /** * Records `event` and returns true when it is new — false when its id was * already admitted, so the caller should drop it. */ admit(event: MessageStreamEvent): boolean; /** Number of ids currently remembered. */ readonly size: number; }; /** * Creates an {@link EventDeduper} keyed on the durable `meta.id`. * * Catches a reconnect that overlaps handled events, a rewind to an earlier * `startIndex`, and a saved log merged with the prefix a live stream replays. * A retried step is not a duplicate: it re-emits under new ids. * * The window is unbounded because a bounded one cannot survive a rewind past * its capacity — the oldest id is already evicted, so re-admitting it evicts * the next and the whole replay cascades back in. Callers here retain an * object per event anyway; one that retains nothing should bound its reads * with the `startIndex` cursor instead. */ export declare function createEventDeduper(): EventDeduper;