feat: add high-level capsule feature modules

This commit is contained in:
Tasnim Kabir Sadik
2026-05-14 23:22:53 +06:00
parent 8fb9753fde
commit c6322d8601
12 changed files with 870 additions and 1 deletions

View 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);
}
}
}