feat: add high-level capsule feature modules
This commit is contained in:
62
src/_shared/async-queue.ts
Normal file
62
src/_shared/async-queue.ts
Normal file
@ -0,0 +1,62 @@
|
||||
export class AsyncQueue<T> implements AsyncIterableIterator<T> {
|
||||
private readonly values: T[] = [];
|
||||
private readonly waiters: Array<{
|
||||
reject: (reason?: unknown) => void;
|
||||
resolve: (value: IteratorResult<T>) => void;
|
||||
}> = [];
|
||||
private closed = false;
|
||||
private error: unknown;
|
||||
|
||||
[Symbol.asyncIterator](): AsyncIterableIterator<T> {
|
||||
return this;
|
||||
}
|
||||
|
||||
next(): Promise<IteratorResult<T>> {
|
||||
if (this.values.length) {
|
||||
return Promise.resolve({ done: false, value: this.values.shift() as T });
|
||||
}
|
||||
if (this.error) return Promise.reject(this.error);
|
||||
if (this.closed) return Promise.resolve({ done: true, value: undefined });
|
||||
|
||||
return new Promise((resolve, reject) => {
|
||||
this.waiters.push({ reject, resolve });
|
||||
});
|
||||
}
|
||||
|
||||
return(): Promise<IteratorResult<T>> {
|
||||
this.end();
|
||||
return Promise.resolve({ done: true, value: undefined });
|
||||
}
|
||||
|
||||
throw(error?: unknown): Promise<IteratorResult<T>> {
|
||||
this.fail(error);
|
||||
return Promise.reject(error);
|
||||
}
|
||||
|
||||
push(value: T): void {
|
||||
if (this.closed) return;
|
||||
const waiter = this.waiters.shift();
|
||||
if (waiter) {
|
||||
waiter.resolve({ done: false, value });
|
||||
return;
|
||||
}
|
||||
this.values.push(value);
|
||||
}
|
||||
|
||||
end(): void {
|
||||
if (this.closed) return;
|
||||
this.closed = true;
|
||||
for (const waiter of this.waiters.splice(0)) {
|
||||
waiter.resolve({ done: true, value: undefined });
|
||||
}
|
||||
}
|
||||
|
||||
fail(error: unknown): void {
|
||||
if (this.closed) return;
|
||||
this.closed = true;
|
||||
this.error = error;
|
||||
for (const waiter of this.waiters.splice(0)) {
|
||||
waiter.reject(error);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user