rvx
Version:
A signal based rendering library
62 lines • 1.68 kB
JavaScript
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