Initial support for job queue

This commit is contained in:
Evan Hahn 2021-04-29 18:02:27 -05:00 committed by GitHub
parent 1238cca538
commit bbd7fd3854
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
22 changed files with 1708 additions and 28 deletions

42
ts/util/asyncIterables.ts Normal file
View 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;
}
}
}