Move error classes from services/ and file-operations/ into a new errors/ directory (authentication-error, server-version-mismatch-error, sync-reset-error, file-not-found-error), plus add file-already-exists-error and http-client-error. Update consts.ts and utils/* (await-all, create-client-id, hash, rate-limit, find-matching-file). Replace data-structures (locks, min-covered, event-listeners, fix-sized-cache) and add debugging utilities (in-memory-file-system, log-to-console, slow-web-socket-factory). Removes utils/create-promise.ts.
25 lines
855 B
TypeScript
25 lines
855 B
TypeScript
type PromiseTuple<T extends readonly unknown[]> = readonly [
|
|
...{ [K in keyof T]: Promise<T[K]> }
|
|
];
|
|
|
|
type ResolvedTuple<T extends readonly unknown[]> = {
|
|
[K in keyof T]: T[K];
|
|
};
|
|
|
|
export const awaitAll = async <T extends readonly unknown[]>(
|
|
promises: PromiseTuple<T>
|
|
): Promise<ResolvedTuple<T>> => {
|
|
// eslint-disable-next-line no-restricted-properties, @typescript-eslint/await-thenable
|
|
const result = await Promise.allSettled(promises);
|
|
for (const res of result) {
|
|
if (res.status === "rejected") {
|
|
throw res.reason;
|
|
}
|
|
}
|
|
|
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion
|
|
return result.map(
|
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion
|
|
(res) => (res as PromiseFulfilledResult<unknown>).value
|
|
) as ResolvedTuple<T>;
|
|
};
|