diff --git a/packages/experimental/client-ui-forge/src/states.ts b/packages/experimental/client-ui-forge/src/states.ts index 50ed2f61f6..f752229896 100644 --- a/packages/experimental/client-ui-forge/src/states.ts +++ b/packages/experimental/client-ui-forge/src/states.ts @@ -108,7 +108,6 @@ class Reader { constructor(readonly allowed: (id: SessionId) => boolean, private readonly signal: AbortSignal) { signal.addEventListener('abort', this.abort, { once: true }) - if (signal.aborted) this.end() } push(state: ForgeChangeRequestListState): void { @@ -207,7 +206,6 @@ class Run { } private bind(id: SessionId, urls: readonly string[]): void { - if (this.stopped) return const next = new Set(urls) const previous = this.urlsOf.get(id) ?? new Set() this.urlsOf.set(id, next) diff --git a/packages/experimental/client-ui-forge/tests/states.host.spec.ts b/packages/experimental/client-ui-forge/tests/states.host.spec.ts index fa563e7833..18866bd805 100644 --- a/packages/experimental/client-ui-forge/tests/states.host.spec.ts +++ b/packages/experimental/client-ui-forge/tests/states.host.spec.ts @@ -350,4 +350,21 @@ describe('ChangeRequestStates', () => { expect(await reader(f.hub).next()).toEqual({ type: 'baseline', states: [] }) }) + + it('keeps other readers live when a reader aborts between frames', async () => { + const f = fixture([{ id: S1, urls: [url(7)] }]) + const aborter = new AbortController() + const first = f.hub.stream(() => true, aborter.signal)[Symbol.asyncIterator]() + const second = reader(f.hub) + await first.next() + await second.next() + aborter.abort() + f.poll(7) + expect((await first.next()).done).toBe(true) + expect(await second.next()).toEqual({ type: 'changed', states: [state(7)] }) + expect([...f.watchers.keys()]).toEqual([7]) + await second.close() + expect([...f.watchers.keys()]).toEqual([]) + }) + })