/** 追加式事件通道:全部事件保存在内存,支持多个消费者按 seq 回放 + 实时跟随 */ export class EventChannel { private readonly items: T[] = []; private waiters: Array<() => void> = []; private closed = false; push(item: T): void { if (this.closed) return; this.items.push(item); this.wake(); } close(): void { this.closed = true; this.wake(); } get size(): number { return this.items.length; } snapshot(): T[] { return [...this.items]; } async *iterate(fromIndex = 0): AsyncGenerator { let i = Math.max(0, fromIndex); while (true) { while (i < this.items.length) yield this.items[i++] as T; if (this.closed) return; await new Promise((resolve) => this.waiters.push(resolve)); } } private wake(): void { const waiters = this.waiters; this.waiters = []; for (const w of waiters) w(); } }