π― Use case
This file lives under βutils/β, which covers cross-cutting helpers (shell, tempfiles, settings, messages, process input, β¦). On the API surface it exposes Stream β mainly types, interfaces, or factory objects.
Generated from folder role, exports, dependency roots, and inline comments β not hand-reviewed for every path.
π§ Inline summary
export class Stream<T> implements AsyncIterator<T> { private readonly queue: T[] = [] private readResolve?: (value: IteratorResult<T>) => void private readReject?: (error: unknown) => void private isDone: boolean = false
π€ Exports (heuristic)
Stream
π₯οΈ Source preview
export class Stream<T> implements AsyncIterator<T> {
private readonly queue: T[] = []
private readResolve?: (value: IteratorResult<T>) => void
private readReject?: (error: unknown) => void
private isDone: boolean = false
private hasError: unknown | undefined
private started = false
constructor(private readonly returned?: () => void) {}
[Symbol.asyncIterator](): AsyncIterableIterator<T> {
if (this.started) {
throw new Error('Stream can only be iterated once')
}
this.started = true
return this
}
next(): Promise<IteratorResult<T, unknown>> {
if (this.queue.length > 0) {
return Promise.resolve({
done: false,
value: this.queue.shift()!,
})
}
if (this.isDone) {
return Promise.resolve({ done: true, value: undefined })
}
if (this.hasError) {
return Promise.reject(this.hasError)
}
return new Promise<IteratorResult<T>>((resolve, reject) => {
this.readResolve = resolve
this.readReject = reject
})
}
enqueue(value: T): void {
if (this.readResolve) {
const resolve = this.readResolve
this.readResolve = undefined
this.readReject = undefined
resolve({ done: false, value })
} else {
this.queue.push(value)
}
}
done() {
this.isDone = true
if (this.readResolve) {
const resolve = this.readResolve
this.readResolve = undefined
this.readReject = undefined
resolve({ done: true, value: undefined })
}
}
error(error: unknown) {
this.hasError = error
if (this.readReject) {
const reject = this.readReject
this.readResolve = undefined
this.readReject = undefined
reject(error)
}
}
return(): Promise<IteratorResult<T, unknown>> {
this.isDone = true
if (this.returned) {
this.returned()
}
return Promise.resolve({ done: true, value: undefined })
}
}