/
larinv
/
claude-code
Обзор
Документация
Войти
/
larinv
/
claude-code
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
utils/stream.ts
76 строк
2 KB
kuberwastaken
new initial commit (history rewritten)
01 апр 2026, 14:57
01 апр 2026, 14:57
c1996f2
Код
Авторство
О чём код?
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 }) } }