Initial support for job queue
This commit is contained in:
parent
1238cca538
commit
bbd7fd3854
22 changed files with 1708 additions and 28 deletions
42
ts/util/asyncIterables.ts
Normal file
42
ts/util/asyncIterables.ts
Normal file
|
@ -0,0 +1,42 @@
|
|||
// Copyright 2021 Signal Messenger, LLC
|
||||
// SPDX-License-Identifier: AGPL-3.0-only
|
||||
|
||||
/* eslint-disable max-classes-per-file */
|
||||
/* eslint-disable no-await-in-loop */
|
||||
/* eslint-disable no-restricted-syntax */
|
||||
|
||||
export type MaybeAsyncIterable<T> = Iterable<T> | AsyncIterable<T>;
|
||||
|
||||
export function concat<T>(
|
||||
iterables: Iterable<MaybeAsyncIterable<T>>
|
||||
): AsyncIterable<T> {
|
||||
return new ConcatAsyncIterable(iterables);
|
||||
}
|
||||
|
||||
class ConcatAsyncIterable<T> implements AsyncIterable<T> {
|
||||
constructor(private readonly iterables: Iterable<MaybeAsyncIterable<T>>) {}
|
||||
|
||||
async *[Symbol.asyncIterator](): AsyncIterator<T> {
|
||||
for (const iterable of this.iterables) {
|
||||
for await (const value of iterable) {
|
||||
yield value;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export function wrapPromise<T>(
|
||||
promise: Promise<MaybeAsyncIterable<T>>
|
||||
): AsyncIterable<T> {
|
||||
return new WrapPromiseAsyncIterable(promise);
|
||||
}
|
||||
|
||||
class WrapPromiseAsyncIterable<T> implements AsyncIterable<T> {
|
||||
constructor(private readonly promise: Promise<MaybeAsyncIterable<T>>) {}
|
||||
|
||||
async *[Symbol.asyncIterator](): AsyncIterator<T> {
|
||||
for await (const value of await this.promise) {
|
||||
yield value;
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue