/** * Bounded in-memory ring buffer for Jetstream cursor replay. */ import type { JetstreamMessage } from "~/lib/jetstream-envelope"; export class JetstreamRingBuffer { private frames: JetstreamMessage[] = []; constructor(private readonly maxSize: number) {} append(frame: JetstreamMessage): void { this.frames.push(frame); if (this.frames.length > this.maxSize) { this.frames.shift(); } } /** Frames with time_us strictly greater than cursor, in insertion order. */ replayAfter(cursor: number | null): JetstreamMessage[] { if (cursor == null) return []; return this.frames.filter((frame) => frame.time_us > cursor); } size(): number { return this.frames.length; } }