UNPKG

rvx

Version:

A signal based rendering library

62 lines 1.68 kB
import { Context } from "../core/context.js"; import { $ } from "../core/signals.js"; export class AsyncContext { #parent; #tasks = $(new Set()); #errorHandlers = new Set(); constructor(parent) { this.#parent = parent; } get pending() { return this.#tasks.value.size > 0; } track(task) { this.#parent?.track(task); this.#tasks.update(tasks => { tasks.add(task); }); task.then(() => { this.#tasks.update(tasks => { tasks.delete(task); }); }, error => { if (this.#errorHandlers.size > 0) { for (const errorHandler of this.#errorHandlers) { errorHandler.push(error); } } else { void Promise.reject(error); } this.#tasks.update(tasks => { tasks.delete(task); }); }); } async complete() { const errors = []; this.#errorHandlers.add(errors); while (this.#tasks.value.size > 0) { await Promise.allSettled(this.#tasks.value); } this.#errorHandlers.delete(errors); if (errors.length === 1) { throw errors[0]; } else if (errors.length > 1) { throw new AsyncError(errors); } } static fork() { return new AsyncContext(ASYNC.current); } } export class AsyncError extends Error { errors; constructor(errors) { super(); this.errors = errors; } } export const ASYNC = new Context(); //# sourceMappingURL=async-context.js.map