Skip to content

Commit

Permalink
Isolate tasks run from app context
Browse files Browse the repository at this point in the history
  • Loading branch information
Exelord committed Feb 2, 2023
1 parent 56b6804 commit 077860e
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 7 deletions.
14 changes: 8 additions & 6 deletions src/job.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { onCleanup } from "solid-js";
import { getOwner, onCleanup } from "solid-js";
import { createObject } from "solid-proxies";
import { Task } from "./task";
import { createTask, Task } from "./task";

export type TaskFunction<T, Args extends unknown[]> = (
signal: AbortSignal,
Expand Down Expand Up @@ -83,7 +83,7 @@ export class Job<T, Args extends unknown[]> {
}

perform(...args: Args): Task<T> {
const task = new Task((signal) => this.#taskFn(signal, ...args));
const task = createTask((signal) => this.#taskFn(signal, ...args));

this.#instrumentTask(task);
this.#reactiveState.performCount++;
Expand Down Expand Up @@ -149,9 +149,11 @@ export function createJob<T, Args extends unknown[]>(
): Job<T, Args> {
const job = new Job(taskFn, options);

onCleanup(() => {
job.abort();
});
if (getOwner()) {
onCleanup(() => {
job.abort();
});
}

return job;
}
3 changes: 2 additions & 1 deletion src/task.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { createObject } from "solid-proxies";
import { isolate } from "utils";
import { work } from "./work";

export enum TaskStatus {
Expand Down Expand Up @@ -197,5 +198,5 @@ export class Task<T> implements Promise<T> {
export function createTask<T>(
promiseFn: (signal: AbortSignal) => Promise<T>
): Task<T> {
return new Task(promiseFn);
return new Task((signal) => isolate(() => promiseFn(signal)));
}
25 changes: 25 additions & 0 deletions src/utils.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import { createRoot, runWithOwner } from "solid-js";

export function isolate<T>(fn: () => T): T {
let error;
let hasErrored = false;
const owner = null as any;

const result = runWithOwner(owner, () => {
return createRoot((dispose) => {
try {
return fn();
} catch (e) {
hasErrored = true;
error = e;
return;
} finally {
dispose();
}
});
})!;

if (hasErrored) throw error;

return result;
}

0 comments on commit 077860e

Please sign in to comment.