@@ -7,86 +7,7 @@ import type {
77 RuntimeOptions ,
88 TransitionRuntime ,
99} from './types.js'
10-
11- class QueueClosedError extends Error {
12- constructor ( message = 'Queue is closed' ) {
13- super ( message )
14- this . name = 'QueueClosedError'
15- }
16- }
17-
18- class AsyncQueue < T > implements AsyncIterable < T > {
19- #queue: T [ ] = [ ]
20- #waiters: Array < { resolve : ( value : IteratorResult < T > ) => void } > = [ ]
21- #closed = false
22-
23- push ( item : T ) : void {
24- if ( this . #closed) {
25- throw new QueueClosedError ( )
26- }
27-
28- let waiter = this . #waiters. shift ( )
29- if ( waiter ) {
30- waiter . resolve ( { value : item , done : false } )
31- return
32- }
33-
34- this . #queue. push ( item )
35- }
36-
37- close ( ) : void {
38- if ( this . #closed) {
39- return
40- }
41-
42- this . #closed = true
43-
44- // Signal waiting iterators that no more items will be pushed.
45- // Buffered items are not cleared — iterators drain them before exiting.
46- while ( this . #waiters. length > 0 ) {
47- let waiter = this . #waiters. shift ( )
48- if ( ! waiter ) {
49- continue
50- }
51- waiter . resolve ( { value : undefined as never , done : true } )
52- }
53- }
54-
55- get isClosed ( ) : boolean {
56- return this . #closed
57- }
58-
59- async * [ Symbol . asyncIterator ] ( ) : AsyncIterator < T > {
60- while ( true ) {
61- if ( this . #queue. length > 0 ) {
62- let value = this . #queue. shift ( ) as T
63- yield value
64- continue
65- }
66-
67- if ( this . #closed) {
68- return
69- }
70-
71- let waiter = new Promise < IteratorResult < T > > ( ( resolve ) => {
72- this . #waiters. push ( { resolve } )
73- } )
74-
75- // oxlint-disable-next-line no-await-in-loop
76- let result = await waiter
77- if ( result . done ) {
78- // Drain items buffered between the last yield and the close signal.
79- while ( this . #queue. length > 0 ) {
80- let value = this . #queue. shift ( ) as T
81- yield value
82- }
83- return
84- }
85-
86- yield result . value
87- }
88- }
89- }
10+ import { AsyncQueue } from './queue.js'
9011
9112type InternalEventEnvelope < E > = {
9213 event : E
0 commit comments