Skip to content

Commit f66638d

Browse files
committed
Remove duplicate AsyncQueue from fsm runtime, use queue.ts
1 parent 32b38d9 commit f66638d

File tree

1 file changed

+1
-80
lines changed

1 file changed

+1
-80
lines changed

packages/fsm/src/runtime.ts

Lines changed: 1 addition & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -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

9112
type InternalEventEnvelope<E> = {
9213
event: E

0 commit comments

Comments
 (0)