@zwave-js/waddle 1.3.0 → 1.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +10 -0
- package/build/cjs/Task.d.ts +22 -3
- package/build/cjs/Task.js +99 -36
- package/build/cjs/Task.js.map +2 -2
- package/build/esm/Task.d.ts +22 -3
- package/build/esm/Task.d.ts.map +1 -1
- package/build/esm/Task.js +110 -40
- package/build/esm/Task.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -125,6 +125,8 @@ const task = scheduler.findTask((task) => task.tag?.id === "rebuild-routes");
|
|
|
125
125
|
// ^ Either a Promise or undefined, depending on whether the task exists or not
|
|
126
126
|
```
|
|
127
127
|
|
|
128
|
+
This also finds parent tasks that are waiting for a subtask.
|
|
129
|
+
|
|
128
130
|
The task function receives its own task as the `thisTask` argument. The task can use it to identify itself when removing tasks (see below):
|
|
129
131
|
|
|
130
132
|
```js
|
|
@@ -441,6 +443,8 @@ const parentTask = scheduler.queueTask({
|
|
|
441
443
|
|
|
442
444
|
To cancel one or more tasks, simply call the `scheduler.removeTasks` method. This method takes a predicate function that will be called for each active and queued task. If the predicate returns `true`, the task will be removed from the scheduler. This can be used to cancel tasks that are no longer needed.
|
|
443
445
|
|
|
446
|
+
The predicate is also called for parent tasks that are waiting for a subtask. Canceling such a parent also cancels the subtasks it is waiting for. Canceling only a subtask rejects the promise the parent is waiting for, so the parent can handle the error and continue.
|
|
447
|
+
|
|
444
448
|
Note that running tasks will not be canceled immediately. Instead they will run until the next `yield` point first.
|
|
445
449
|
|
|
446
450
|
```js
|
|
@@ -494,6 +498,12 @@ const scheduler = new TaskScheduler(() => new Error("We are all doomed!"));
|
|
|
494
498
|
```
|
|
495
499
|
|
|
496
500
|
## Changelog
|
|
501
|
+
### 1.3.1 (2026-10-06)
|
|
502
|
+
|
|
503
|
+
- Fixed: `removeTasks` and `findTasks` now also consider parent tasks that are waiting for a subtask
|
|
504
|
+
- Fixed: Tasks with the `Restart` interrupt behavior were restarted every time they yielded a subtask, so they never finished
|
|
505
|
+
- Fixed: A task that was restarted while waiting for a yielded promise could receive that promise's result or error after it was restarted
|
|
506
|
+
|
|
497
507
|
### 1.3.0 (2026-09-29)
|
|
498
508
|
|
|
499
509
|
- The task function now receives a handle to its own task as the first argument. It can be used to identify the task in `removeTasks` predicates.
|
package/build/cjs/Task.d.ts
CHANGED
|
@@ -148,10 +148,29 @@ export declare class TaskScheduler<TaskTag extends {
|
|
|
148
148
|
private _stopSignal;
|
|
149
149
|
private _stopPromise;
|
|
150
150
|
queueTask<T>(builder: TaskBuilder<T, TaskTag>): Promise<T>;
|
|
151
|
-
/**
|
|
151
|
+
/**
|
|
152
|
+
* Removes/stops tasks matching the given predicate. Returns `true` when a task was removed, `false` otherwise.
|
|
153
|
+
*
|
|
154
|
+
* The predicate also sees parent tasks that are waiting for a subtask.
|
|
155
|
+
* Removing such a parent also removes the subtasks it is waiting for.
|
|
156
|
+
*/
|
|
152
157
|
removeTasks(predicate: (task: Task<unknown, TaskTag>) => boolean, reason?: TError): Promise<boolean>;
|
|
153
|
-
/**
|
|
154
|
-
private
|
|
158
|
+
/** Returns the queued or current task that is `task` itself or one of its subtasks, if any */
|
|
159
|
+
private findLeafTask;
|
|
160
|
+
/**
|
|
161
|
+
* Removes `leaf` from the queue, then resets and rejects it and each of its parents up to and including `outermost`.
|
|
162
|
+
* The parent of `outermost` is put back into the queue first.
|
|
163
|
+
*/
|
|
164
|
+
private dropTasks;
|
|
165
|
+
/**
|
|
166
|
+
* Puts a parent back into the queue when its subtask is finished or removed.
|
|
167
|
+
* Call this before cleaning up the subtask, so the parent can be found during the cleanup.
|
|
168
|
+
*/
|
|
169
|
+
private restoreParentTask;
|
|
170
|
+
/**
|
|
171
|
+
* Returns the promise of the first task matching the given predicate, if any.
|
|
172
|
+
* The predicate also sees parent tasks that are waiting for a subtask.
|
|
173
|
+
*/
|
|
155
174
|
findTask<T = unknown>(predicate: (task: Task<T, TaskTag>) => boolean): Promise<T> | undefined;
|
|
156
175
|
/** Creates a task that can be executed */
|
|
157
176
|
private createTask;
|
package/build/cjs/Task.js
CHANGED
|
@@ -33,6 +33,12 @@ function getTaskName(task) {
|
|
|
33
33
|
return `${task.name ?? (task.tag && JSON.stringify(task.tag)) ?? "unnamed"} (ID ${task.id})`;
|
|
34
34
|
}
|
|
35
35
|
__name(getTaskName, "getTaskName");
|
|
36
|
+
function* selfAndParents(task) {
|
|
37
|
+
for (let t = task; t; t = t.parent) {
|
|
38
|
+
yield t;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
__name(selfAndParents, "selfAndParents");
|
|
36
42
|
function isTaskBuilder(obj) {
|
|
37
43
|
return typeof obj === "object" && typeof obj.task === "function" && typeof obj.priority === "number";
|
|
38
44
|
}
|
|
@@ -114,53 +120,98 @@ class TaskScheduler {
|
|
|
114
120
|
this._continueSignal.resolve();
|
|
115
121
|
return task.promise;
|
|
116
122
|
}
|
|
117
|
-
/**
|
|
123
|
+
/**
|
|
124
|
+
* Removes/stops tasks matching the given predicate. Returns `true` when a task was removed, `false` otherwise.
|
|
125
|
+
*
|
|
126
|
+
* The predicate also sees parent tasks that are waiting for a subtask.
|
|
127
|
+
* Removing such a parent also removes the subtasks it is waiting for.
|
|
128
|
+
*/
|
|
118
129
|
async removeTasks(predicate, reason) {
|
|
119
|
-
const tasksToRemove =
|
|
120
|
-
|
|
121
|
-
for (const
|
|
122
|
-
|
|
123
|
-
if (task
|
|
124
|
-
|
|
130
|
+
const tasksToRemove = /* @__PURE__ */ new Set();
|
|
131
|
+
const currentTasksToRemove = [];
|
|
132
|
+
for (const queued of this._tasks) {
|
|
133
|
+
for (const task of selfAndParents(queued)) {
|
|
134
|
+
if (!predicate(task))
|
|
135
|
+
continue;
|
|
136
|
+
if (queued === this._currentTask) {
|
|
137
|
+
currentTasksToRemove.push(task);
|
|
125
138
|
} else {
|
|
126
|
-
tasksToRemove.
|
|
139
|
+
tasksToRemove.add(task);
|
|
127
140
|
}
|
|
128
141
|
}
|
|
129
142
|
}
|
|
130
|
-
|
|
131
|
-
tasksToRemove.
|
|
143
|
+
for (const task of currentTasksToRemove) {
|
|
144
|
+
tasksToRemove.add(task);
|
|
132
145
|
}
|
|
133
146
|
reason ??= this.defaultErrorFactory();
|
|
134
147
|
for (const task of tasksToRemove) {
|
|
135
|
-
|
|
148
|
+
const leaf = this.findLeafTask(task);
|
|
149
|
+
if (!leaf)
|
|
136
150
|
continue;
|
|
151
|
+
let outermost = task;
|
|
152
|
+
for (let t = task.parent; t; t = t.parent) {
|
|
153
|
+
if (tasksToRemove.has(t))
|
|
154
|
+
outermost = t;
|
|
137
155
|
}
|
|
138
|
-
await this.
|
|
156
|
+
await this.dropTasks(leaf, outermost, reason);
|
|
139
157
|
}
|
|
140
158
|
if (this._continueSignal)
|
|
141
159
|
this._continueSignal.resolve();
|
|
142
|
-
return tasksToRemove.
|
|
160
|
+
return tasksToRemove.size > 0;
|
|
143
161
|
}
|
|
144
|
-
/**
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
162
|
+
/** Returns the queued or current task that is `task` itself or one of its subtasks, if any */
|
|
163
|
+
findLeafTask(task) {
|
|
164
|
+
const leaves = this._currentTask ? [this._currentTask, ...this._tasks] : this._tasks;
|
|
165
|
+
for (const leaf of leaves) {
|
|
166
|
+
for (const t of selfAndParents(leaf)) {
|
|
167
|
+
if (t === task)
|
|
168
|
+
return leaf;
|
|
169
|
+
}
|
|
148
170
|
}
|
|
149
|
-
|
|
150
|
-
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Removes `leaf` from the queue, then resets and rejects it and each of its parents up to and including `outermost`.
|
|
174
|
+
* The parent of `outermost` is put back into the queue first.
|
|
175
|
+
*/
|
|
176
|
+
async dropTasks(leaf, outermost, reason) {
|
|
177
|
+
this._tasks.remove(leaf);
|
|
178
|
+
if (this._currentTask === leaf) {
|
|
151
179
|
this._currentTask = void 0;
|
|
152
180
|
}
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
181
|
+
if (outermost.parent)
|
|
182
|
+
this.restoreParentTask(outermost.parent);
|
|
183
|
+
for (let task = leaf; ; task = task.parent) {
|
|
156
184
|
if (this.verbose) {
|
|
157
|
-
console.log(`
|
|
185
|
+
console.log(`Removing task: ${getTaskName(task)}`);
|
|
158
186
|
}
|
|
159
|
-
|
|
187
|
+
await task.reset().catch(import_utils.noop);
|
|
188
|
+
task.reject(reason);
|
|
189
|
+
if (task === outermost)
|
|
190
|
+
break;
|
|
160
191
|
}
|
|
161
192
|
}
|
|
193
|
+
/**
|
|
194
|
+
* Puts a parent back into the queue when its subtask is finished or removed.
|
|
195
|
+
* Call this before cleaning up the subtask, so the parent can be found during the cleanup.
|
|
196
|
+
*/
|
|
197
|
+
restoreParentTask(parent) {
|
|
198
|
+
if (this.verbose) {
|
|
199
|
+
console.log(`Restoring parent task: ${getTaskName(parent)}`);
|
|
200
|
+
}
|
|
201
|
+
this._tasks.add(parent);
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Returns the promise of the first task matching the given predicate, if any.
|
|
205
|
+
* The predicate also sees parent tasks that are waiting for a subtask.
|
|
206
|
+
*/
|
|
162
207
|
findTask(predicate) {
|
|
163
|
-
|
|
208
|
+
for (const queued of this._tasks) {
|
|
209
|
+
for (const task of selfAndParents(queued)) {
|
|
210
|
+
if (predicate(task)) {
|
|
211
|
+
return task.promise;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}
|
|
164
215
|
}
|
|
165
216
|
/** Creates a task that can be executed */
|
|
166
217
|
createTask(builder, parent) {
|
|
@@ -189,6 +240,12 @@ class TaskScheduler {
|
|
|
189
240
|
promise: waitForPromise
|
|
190
241
|
};
|
|
191
242
|
} else if (state === TaskState.AwaitingTask) {
|
|
243
|
+
if (waitForPromise) {
|
|
244
|
+
return {
|
|
245
|
+
newState: TaskState.AwaitingPromise,
|
|
246
|
+
promise: waitForPromise
|
|
247
|
+
};
|
|
248
|
+
}
|
|
192
249
|
throw new Error("Cannot step through a task that is waiting for another task");
|
|
193
250
|
}
|
|
194
251
|
generator ??= builder.task(task);
|
|
@@ -218,10 +275,14 @@ class TaskScheduler {
|
|
|
218
275
|
if (waitFor instanceof Promise) {
|
|
219
276
|
state = TaskState.AwaitingPromise;
|
|
220
277
|
waitForPromise = waitFor.then((result) => {
|
|
221
|
-
|
|
278
|
+
if (generator === gen)
|
|
279
|
+
prevResult = result;
|
|
222
280
|
}).catch((e) => {
|
|
223
|
-
|
|
281
|
+
if (generator === gen)
|
|
282
|
+
waitError = e;
|
|
224
283
|
}).finally(() => {
|
|
284
|
+
if (generator !== gen)
|
|
285
|
+
return;
|
|
225
286
|
waitForPromise = void 0;
|
|
226
287
|
if (state === TaskState.AwaitingPromise) {
|
|
227
288
|
state = TaskState.Active;
|
|
@@ -237,11 +298,16 @@ class TaskScheduler {
|
|
|
237
298
|
}
|
|
238
299
|
state = TaskState.AwaitingTask;
|
|
239
300
|
const subTask = self.createTask(waitFor, this);
|
|
240
|
-
subTask.promise.then((result) => {
|
|
241
|
-
|
|
301
|
+
waitForPromise = subTask.promise.then((result) => {
|
|
302
|
+
if (generator === gen)
|
|
303
|
+
prevResult = result;
|
|
242
304
|
}).catch((e) => {
|
|
243
|
-
|
|
305
|
+
if (generator === gen)
|
|
306
|
+
waitError = e;
|
|
244
307
|
}).finally(() => {
|
|
308
|
+
if (generator !== gen)
|
|
309
|
+
return;
|
|
310
|
+
waitForPromise = void 0;
|
|
245
311
|
if (state === TaskState.AwaitingTask) {
|
|
246
312
|
state = TaskState.Active;
|
|
247
313
|
}
|
|
@@ -316,13 +382,9 @@ class TaskScheduler {
|
|
|
316
382
|
const finalizeCurrentTask = /* @__PURE__ */ __name(async () => {
|
|
317
383
|
this._tasks.remove(task);
|
|
318
384
|
this._currentTask = void 0;
|
|
385
|
+
if (task.parent)
|
|
386
|
+
this.restoreParentTask(task.parent);
|
|
319
387
|
await task.reset();
|
|
320
|
-
if (task.parent) {
|
|
321
|
-
if (this.verbose) {
|
|
322
|
-
console.log(`Restoring parent task: ${getTaskName(task.parent)}`);
|
|
323
|
-
}
|
|
324
|
-
this._tasks.add(task.parent);
|
|
325
|
-
}
|
|
326
388
|
}, "finalizeCurrentTask");
|
|
327
389
|
waitFor = void 0;
|
|
328
390
|
let stepResult;
|
|
@@ -368,6 +430,7 @@ class TaskScheduler {
|
|
|
368
430
|
}
|
|
369
431
|
this._tasks.add(stepResult.task);
|
|
370
432
|
this._tasks.remove(task);
|
|
433
|
+
this._currentTask = void 0;
|
|
371
434
|
continue;
|
|
372
435
|
} else {
|
|
373
436
|
continue;
|
package/build/cjs/Task.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/Task.ts"],
|
|
4
|
-
"sourcesContent": ["import type { CompareResult } from \"alcalzone-shared/comparable\";\nimport {\n\ttype DeferredPromise,\n\tcreateDeferredPromise,\n} from \"alcalzone-shared/deferred-promise\";\nimport { SortedList } from \"alcalzone-shared/sorted-list\";\nimport { createWrappingCounter } from \"./wrappingCounter.js\";\nimport { evalOrStatic, highResTimestamp, noop } from \"./utils.js\";\n\n/** The read-only view of a task that gets passed to its own task function */\nexport interface TaskHandle<TaskTag extends { id: string } = { id: string }> {\n\treadonly id: number;\n\treadonly timestamp: number;\n\n\t/** The parent task spawning this subtask, if any */\n\treadonly parent?: TaskHandle<TaskTag>;\n\n\t/** A name to identify the task */\n\treadonly name?: string;\n\t/** A tag to identify the task programmatically */\n\treadonly tag?: TaskTag;\n\t/** The task's priority */\n\treadonly priority: TaskPriority;\n\t/** The concurrency group this task belongs to */\n\treadonly group?: TaskConcurrencyGroup;\n\t/** How the task should behave when interrupted */\n\treadonly interrupt: TaskInterruptBehavior;\n\t/** The current state of the task */\n\tget state(): TaskState;\n}\n\n/** A high-level task that can be started and stepped through */\nexport interface Task<\n\tTReturn,\n\tTaskTag extends { id: string } = { id: string },\n\tTError extends Error = Error,\n> extends TaskHandle<TaskTag> {\n\treadonly builder: TaskBuilder<TReturn, TaskTag>;\n\n\t/** The parent task spawning this subtask, if any */\n\treadonly parent?: Task<unknown, TaskTag, TError>;\n\n\t/** Starts the task it if hasn't been started yet, and executes the next step of the task */\n\tstep(): Promise<TaskStepResult<TReturn, TaskTag>>;\n\t/** Stops the task without further executing it, cleans up, and prepares it for starting again */\n\treset(): Promise<void>;\n\t/** Resolves the task's promise to notify the caller */\n\tresolve(result: TReturn): void;\n\t/** Rejects the task's promise to notify the caller */\n\treject(error: TError): void;\n\n\treadonly generator: ReturnType<TaskBuilder<TReturn>[\"task\"]> | undefined;\n\treadonly promise: Promise<TReturn>;\n}\n\nfunction getTaskName(task: Task<unknown>): string {\n\treturn `${\n\t\ttask.name ?? (task.tag && JSON.stringify(task.tag)) ?? \"unnamed\"\n\t} (ID ${task.id})`;\n}\n\n/** Defines the necessary information for creating a task */\nexport interface TaskBuilder<\n\tTReturn,\n\tTaskTag extends { id: string } = { id: string },\n\tTInner = unknown,\n> {\n\t/** A name to identify the task */\n\tname?: string;\n\t/** A tag to identify the task programmatically */\n\ttag?: TaskTag;\n\t/** The task's priority */\n\tpriority: TaskPriority;\n\t/** How the task should behave when interrupted */\n\tinterrupt?: TaskInterruptBehavior;\n\t/** The concurrency group this task belongs to */\n\tgroup?: TaskConcurrencyGroup;\n\t/**\n\t * The task's main generator function. This is called repeatedly until it's done.\n\t * The function must yield at points where it may be interrupted.\n\t *\n\t * At those points, the task can also wait for something to happen:\n\t * - Either a Promise, in which case it must yield a function that returns that Promise\n\t * - Or another task, in which case it must yield a TaskBuilder object or a function that returns one\n\t *\n\t * Yielded Promises should not spawn new tasks. If they do, the spawned tasks MUST have a higher priority than the parent task.\n\t *\n\t * @param thisTask The task that runs this function. It is the same object the scheduler passes to `removeTasks` predicates,\n\t * so it can be compared by identity. It stays the same when the task gets restarted.\n\t */\n\ttask: (\n\t\tthisTask: TaskHandle,\n\t) => AsyncGenerator<\n\t\t| (() => Promise<unknown> | TaskBuilder<unknown, TaskTag, unknown>)\n\t\t| (() => TaskBuilder<unknown, TaskTag, unknown>)\n\t\t| TaskBuilder<unknown, TaskTag, unknown>\n\t\t| undefined,\n\t\tTReturn,\n\t\tTInner\n\t>;\n\t/** A cleanup function that gets called when the task is dropped */\n\tcleanup?: () => Promise<void>;\n}\n\nexport type TaskReturnType<T extends TaskBuilder<unknown>> =\n\tT extends TaskBuilder<infer R> ? R : never;\n\nfunction isTaskBuilder<T>(obj: any): obj is TaskBuilder<T> {\n\treturn (\n\t\ttypeof obj === \"object\" &&\n\t\ttypeof obj.task === \"function\" &&\n\t\ttypeof obj.priority === \"number\"\n\t);\n}\n\n/**\n * The priority of a task.\n *\n * Higher priority tasks are executed first and interrupt lower priority tasks.\n * The recommended priority for application-initiated communication is `Normal`.\n * `Low` and `Lower` are recommended for internal long-running tasks that should not interfere with user-initiated tasks.\n * `Idle` is recommended for tasks that should only run when no other tasks are pending.\n */\nexport enum TaskPriority {\n\tHighest,\n\tHigh = 1,\n\tNormal = 2,\n\tLow = 3,\n\tLower = 4,\n\tIdle = 5,\n}\n\nexport enum TaskState {\n\t/** The task has not been created yet */\n\tNone,\n\t/** The task is being executed */\n\tActive,\n\t/** The task is waiting for a Promise to resolve */\n\tAwaitingPromise,\n\t/** The task is waiting for another task to finish */\n\tAwaitingTask,\n\t/** The task is finished */\n\tDone,\n}\n\nexport enum TaskInterruptBehavior {\n\t/** The task may not be interrupted */\n\tForbidden,\n\t/** The task will be resumed after being interrupted (default) */\n\tResume,\n\t/** The task needs to be restarted after being interrupted */\n\tRestart,\n}\n\nexport type TaskStepResult<\n\tT,\n\tTaskTag extends { id: string } = { id: string },\n> =\n\t| {\n\t\t\tnewState: TaskState.Done;\n\t\t\tresult: T;\n\t }\n\t| {\n\t\t\tnewState: TaskState.Active;\n\t }\n\t| {\n\t\t\t// The task was reset while the step was in flight. The result is stale and must be dropped.\n\t\t\tnewState: TaskState.None;\n\t }\n\t| {\n\t\t\tnewState: TaskState.AwaitingPromise;\n\t\t\tpromise: Promise<unknown>;\n\t }\n\t| {\n\t\t\tnewState: TaskState.AwaitingTask;\n\t\t\ttask: Task<unknown, TaskTag>;\n\t };\n\n/** Identifies a concurrency group. Tasks within the same group cannot run concurrently. */\nexport interface TaskConcurrencyGroup {\n\tid: string;\n}\n\nfunction compareTasks<T1, T2>(a: Task<T1>, b: Task<T2>): CompareResult {\n\t// In the same concurrency group, only one task may be active at a time.\n\tconst aConcurrencyGroup = a.group?.id;\n\tconst bConcurrencyGroup = b.group?.id;\n\tif (\n\t\taConcurrencyGroup &&\n\t\tbConcurrencyGroup &&\n\t\taConcurrencyGroup === bConcurrencyGroup\n\t) {\n\t\tconst aActiveOrWaiting =\n\t\t\ta.state === TaskState.Active ||\n\t\t\ta.state === TaskState.AwaitingPromise ||\n\t\t\ta.state === TaskState.AwaitingTask;\n\t\tconst bActiveOrWaiting =\n\t\t\tb.state === TaskState.Active ||\n\t\t\tb.state === TaskState.AwaitingPromise ||\n\t\t\tb.state === TaskState.AwaitingTask;\n\n\t\tif (aActiveOrWaiting && !bActiveOrWaiting) return 1; // A is already active\n\t\tif (!aActiveOrWaiting && bActiveOrWaiting) return -1; // B is already active\n\n\t\t// None of the tasks is active, fall back to default sorting\n\t}\n\n\t// Sort by priority for tasks not in the same concurrency group\n\tif (a.priority < b.priority) return 1;\n\tif (a.priority > b.priority) return -1;\n\n\t// Deprioritize waiting tasks\n\tconst aWaiting =\n\t\ta.state === TaskState.AwaitingPromise ||\n\t\ta.state === TaskState.AwaitingTask;\n\tconst bWaiting =\n\t\tb.state === TaskState.AwaitingPromise ||\n\t\tb.state === TaskState.AwaitingTask;\n\tif (!aWaiting && bWaiting) return 1;\n\tif (aWaiting && !bWaiting) return -1;\n\n\t// Sort equal priority by timestamp. Newer tasks go to the end of the list\n\tif (a.timestamp < b.timestamp) return 1;\n\tif (a.timestamp > b.timestamp) return -1;\n\n\t// If all else fails, sort by ID\n\treturn Math.sign(b.id - a.id) as CompareResult;\n}\n\nexport class TaskScheduler<\n\tTaskTag extends { id: string } = { id: string },\n\tTError extends Error = Error,\n> {\n\tpublic constructor(\n\t\tprivate defaultErrorFactory: () => TError = () =>\n\t\t\tnew Error(\"Task was removed\") as any,\n\t\tprivate verbose: boolean = false,\n\t) {}\n\n\tprivate _tasks = new SortedList<Task<unknown, TaskTag>>(\n\t\tundefined,\n\t\tcompareTasks,\n\t);\n\tprivate _currentTask: Task<unknown, TaskTag> | undefined;\n\n\tprivate _idGenerator = createWrappingCounter(0xff_ff_ff);\n\tprivate _continueSignal: DeferredPromise<void> | undefined;\n\tprivate _stopSignal: DeferredPromise<void> | undefined;\n\tprivate _stopPromise: DeferredPromise<void> | undefined;\n\n\tpublic queueTask<T>(builder: TaskBuilder<T, TaskTag>): Promise<T> {\n\t\tconst task = this.createTask(builder);\n\t\tthis._tasks.add(task);\n\t\tif (this.verbose) {\n\t\t\tconsole.log(`Task queued: ${getTaskName(task)}`);\n\t\t}\n\n\t\tif (this._continueSignal) this._continueSignal.resolve();\n\t\treturn task.promise;\n\t}\n\n\t/** Removes/stops tasks matching the given predicate. Returns `true` when a task was removed, `false` otherwise. */\n\tpublic async removeTasks(\n\t\tpredicate: (task: Task<unknown, TaskTag>) => boolean,\n\t\treason?: TError,\n\t): Promise<boolean> {\n\t\t// Collect tasks that should be removed, so that we handle the current task last\n\t\tconst tasksToRemove: Task<unknown, TaskTag>[] = [];\n\t\tlet currentTaskToRemove: Task<unknown, TaskTag> | undefined;\n\t\tfor (const task of this._tasks) {\n\t\t\tif (predicate(task)) {\n\t\t\t\tif (task === this._currentTask) {\n\t\t\t\t\tcurrentTaskToRemove = task;\n\t\t\t\t} else {\n\t\t\t\t\ttasksToRemove.push(task);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (currentTaskToRemove) {\n\t\t\ttasksToRemove.push(currentTaskToRemove);\n\t\t}\n\n\t\treason ??= this.defaultErrorFactory();\n\n\t\tfor (const task of tasksToRemove) {\n\t\t\t// Skip tasks the run loop finalized during a previous iteration's await\n\t\t\tif (this._currentTask !== task && !this._tasks.contains(task)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tawait this.dropTask(task, reason);\n\t\t}\n\n\t\tif (this._continueSignal) this._continueSignal.resolve();\n\n\t\treturn tasksToRemove.length > 0;\n\t}\n\n\t/** Removes a single task from the queue, resets it and rejects its promise */\n\tprivate async dropTask(\n\t\ttask: Task<unknown, TaskTag>,\n\t\treason: TError,\n\t): Promise<void> {\n\t\tif (this.verbose) {\n\t\t\tconsole.log(`Removing task: ${getTaskName(task)}`);\n\t\t}\n\t\tthis._tasks.remove(task);\n\t\t// Claim the task before awaiting anything, so the run loop drops the\n\t\t// result of an in-flight step instead of finalizing the task a second time\n\t\tif (this._currentTask === task) {\n\t\t\tthis._currentTask = undefined;\n\t\t}\n\t\tawait task.reset().catch(noop);\n\t\ttask.reject(reason);\n\t\t// Re-add the parent task to the list if there is one\n\t\tif (task.parent) {\n\t\t\tif (this.verbose) {\n\t\t\t\tconsole.log(\n\t\t\t\t\t`Restoring parent task: ${getTaskName(task.parent)}`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tthis._tasks.add(task.parent);\n\t\t}\n\t}\n\n\tpublic findTask<T = unknown>(\n\t\tpredicate: (task: Task<T, TaskTag>) => boolean,\n\t): Promise<T> | undefined {\n\t\treturn this._tasks.find((t: any) => predicate(t))?.promise as\n\t\t\t| Promise<T>\n\t\t\t| undefined;\n\t}\n\n\t/** Creates a task that can be executed */\n\tprivate createTask<T>(\n\t\tbuilder: TaskBuilder<T, TaskTag>,\n\t\tparent?: Task<unknown, TaskTag>,\n\t): Task<T, TaskTag, TError> {\n\t\tlet state = TaskState.None;\n\t\tlet generator: ReturnType<TaskBuilder<T, TaskTag>[\"task\"]> | undefined;\n\t\tlet waitForPromise: Promise<unknown> | undefined;\n\t\tconst promise = createDeferredPromise<T>();\n\n\t\tlet prevResult: unknown;\n\t\tlet waitError: unknown;\n\n\t\tconst self = this;\n\n\t\tconst task: Task<T, TaskTag, TError> = {\n\t\t\tid: this._idGenerator(),\n\t\t\ttimestamp: highResTimestamp(),\n\t\t\tbuilder,\n\t\t\tparent,\n\t\t\tname: builder.name,\n\t\t\ttag: builder.tag,\n\t\t\tpriority: builder.priority,\n\t\t\tgroup: builder.group,\n\t\t\tinterrupt: builder.interrupt ?? TaskInterruptBehavior.Resume,\n\t\t\tpromise,\n\t\t\tasync step() {\n\t\t\t\t// Do not proceed while still waiting for a Promise to resolve\n\t\t\t\tif (state === TaskState.AwaitingPromise && waitForPromise) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tnewState: state,\n\t\t\t\t\t\tpromise: waitForPromise,\n\t\t\t\t\t};\n\t\t\t\t} else if (state === TaskState.AwaitingTask) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\"Cannot step through a task that is waiting for another task\",\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tgenerator ??= builder.task(task);\n\t\t\t\tstate = TaskState.Active;\n\n\t\t\t\t// Capture the generator so a concurrent reset() can be detected after the await\n\t\t\t\tconst gen = generator;\n\t\t\t\tlet genResult: Awaited<ReturnType<typeof gen.next>>;\n\t\t\t\ttry {\n\t\t\t\t\tgenResult = waitError\n\t\t\t\t\t\t? await gen.throw(waitError)\n\t\t\t\t\t\t: await gen.next(prevResult);\n\t\t\t\t} catch (e) {\n\t\t\t\t\t// Drop errors from a step whose task was reset in the meantime\n\t\t\t\t\tif (generator !== gen) return { newState: TaskState.None };\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\t\t\t\t// Drop the step result if the task was reset while the generator was running,\n\t\t\t\t// so the task state is not corrupted after the reset\n\t\t\t\tif (generator !== gen) return { newState: TaskState.None };\n\n\t\t\t\tconst { value, done } = genResult;\n\t\t\t\tprevResult = undefined;\n\t\t\t\twaitError = undefined;\n\t\t\t\tif (done) {\n\t\t\t\t\tstate = TaskState.Done;\n\t\t\t\t\treturn {\n\t\t\t\t\t\tnewState: state,\n\t\t\t\t\t\tresult: value,\n\t\t\t\t\t};\n\t\t\t\t} else if (value != undefined) {\n\t\t\t\t\tconst waitFor = evalOrStatic(value);\n\t\t\t\t\tif (waitFor instanceof Promise) {\n\t\t\t\t\t\tstate = TaskState.AwaitingPromise;\n\t\t\t\t\t\twaitForPromise = waitFor\n\t\t\t\t\t\t\t.then((result) => {\n\t\t\t\t\t\t\t\tprevResult = result;\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t.catch((e) => {\n\t\t\t\t\t\t\t\twaitError = e;\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t.finally(() => {\n\t\t\t\t\t\t\t\twaitForPromise = undefined;\n\t\t\t\t\t\t\t\tif (state === TaskState.AwaitingPromise) {\n\t\t\t\t\t\t\t\t\tstate = TaskState.Active;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tnewState: state,\n\t\t\t\t\t\t\tpromise: waitForPromise,\n\t\t\t\t\t\t};\n\t\t\t\t\t} else if (isTaskBuilder(waitFor)) {\n\t\t\t\t\t\tif (waitFor.priority > builder.priority) {\n\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t\"Tasks cannot yield to tasks with lower priority than their own\",\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Create a sub-task with a reference to this task\n\t\t\t\t\t\tstate = TaskState.AwaitingTask;\n\t\t\t\t\t\tconst subTask = self.createTask(waitFor, this);\n\n\t\t\t\t\t\tsubTask.promise\n\t\t\t\t\t\t\t.then((result) => {\n\t\t\t\t\t\t\t\tprevResult = result;\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t.catch((e) => {\n\t\t\t\t\t\t\t\twaitError = e;\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t.finally(() => {\n\t\t\t\t\t\t\t\tif (state === TaskState.AwaitingTask) {\n\t\t\t\t\t\t\t\t\tstate = TaskState.Active;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tnewState: state,\n\t\t\t\t\t\t\ttask: subTask,\n\t\t\t\t\t\t};\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthrow new Error(\"Invalid value yielded by task\");\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\treturn { newState: state };\n\t\t\t\t}\n\t\t\t},\n\t\t\tasync reset() {\n\t\t\t\tif (state === TaskState.None) return;\n\t\t\t\tstate = TaskState.None;\n\t\t\t\twaitForPromise = undefined;\n\t\t\t\tgenerator = undefined;\n\t\t\t\tprevResult = undefined;\n\t\t\t\twaitError = undefined;\n\n\t\t\t\tawait builder.cleanup?.();\n\t\t\t},\n\t\t\tresolve(result) {\n\t\t\t\tpromise.resolve(result);\n\t\t\t},\n\t\t\treject(error) {\n\t\t\t\tpromise.reject(error);\n\t\t\t},\n\t\t\tget state() {\n\t\t\t\treturn state;\n\t\t\t},\n\t\t\tget generator() {\n\t\t\t\treturn generator;\n\t\t\t},\n\t\t};\n\t\treturn task;\n\t}\n\n\tpublic start(): void {\n\t\tthis._stopSignal = createDeferredPromise();\n\t\t// A timer instead of setImmediate, which only exists on Node.js and its clones\n\t\tsetTimeout(async () => {\n\t\t\ttry {\n\t\t\t\tawait this.run();\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(\"Task runner crashed\", e);\n\t\t\t}\n\t\t}, 0);\n\t}\n\n\tprivate async run(): Promise<void> {\n\t\twhile (true) {\n\t\t\tlet waitFor: Promise<unknown> | undefined;\n\t\t\tif (this._tasks.length > 0) {\n\t\t\t\tconst firstTask = this._tasks.peekStart()!;\n\t\t\t\tif (!this._currentTask) {\n\t\t\t\t\t// We're not currently executing a task, start executing the first one\n\t\t\t\t\tthis._currentTask = firstTask;\n\t\t\t\t} else if (\n\t\t\t\t\tthis._currentTask !== firstTask &&\n\t\t\t\t\tthis._currentTask.interrupt !==\n\t\t\t\t\t\tTaskInterruptBehavior.Forbidden\n\t\t\t\t) {\n\t\t\t\t\t// We are executing an interruptible task, and a new task with a higher priority was added\n\t\t\t\t\tif (\n\t\t\t\t\t\tthis._currentTask.interrupt ===\n\t\t\t\t\t\tTaskInterruptBehavior.Restart\n\t\t\t\t\t) {\n\t\t\t\t\t\t// The current task needs to be restarted after being interrupted, so reset it\n\t\t\t\t\t\tconst interrupted = this._currentTask;\n\t\t\t\t\t\tawait interrupted.reset();\n\t\t\t\t\t\t// Re-evaluate the queue if it changed during the reset\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tthis._currentTask !== interrupted ||\n\t\t\t\t\t\t\tthis._tasks.peekStart() !== firstTask\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t// switch to the new task\n\t\t\t\t\tthis._currentTask = firstTask;\n\t\t\t\t}\n\n\t\t\t\t// Capture the current task, so concurrent removals can be detected after each await\n\t\t\t\tconst task = this._currentTask;\n\n\t\t\t\tif (this.verbose) {\n\t\t\t\t\tconsole.log(`Stepping through task: ${getTaskName(task)}`);\n\t\t\t\t}\n\n\t\t\t\tconst finalizeCurrentTask = async () => {\n\t\t\t\t\tthis._tasks.remove(task);\n\t\t\t\t\t// Claim the task before awaiting, so a concurrent removeTasks() skips it\n\t\t\t\t\tthis._currentTask = undefined;\n\t\t\t\t\tawait task.reset();\n\t\t\t\t\t// Re-add the parent task to the list if there is one\n\t\t\t\t\tif (task.parent) {\n\t\t\t\t\t\tif (this.verbose) {\n\t\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\t`Restoring parent task: ${getTaskName(\n\t\t\t\t\t\t\t\t\ttask.parent,\n\t\t\t\t\t\t\t\t)}`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis._tasks.add(task.parent);\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\t// Execute the current task one step further\n\t\t\t\twaitFor = undefined;\n\t\t\t\tlet stepResult: TaskStepResult<unknown, TaskTag>;\n\t\t\t\ttry {\n\t\t\t\t\tstepResult = await task.step();\n\t\t\t\t} catch (e) {\n\t\t\t\t\t// Drop the error if the task was removed during the step. It was already rejected.\n\t\t\t\t\tif (this._currentTask !== task) continue;\n\n\t\t\t\t\tif (this.verbose) {\n\t\t\t\t\t\tconsole.error(`- Task threw an error:`, e);\n\t\t\t\t\t}\n\t\t\t\t\t// The task threw an error, expose the result and clean up.\n\t\t\t\t\ttask.reject(e as Error);\n\t\t\t\t\tawait finalizeCurrentTask();\n\t\t\t\t\t// Then continue with the next iteration\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Drop the step result if the task was removed during the step. It was already rejected.\n\t\t\t\tif (this._currentTask !== task) continue;\n\n\t\t\t\tif (stepResult.newState === TaskState.Done) {\n\t\t\t\t\tif (this.verbose) {\n\t\t\t\t\t\tconsole.log(`- Task finished`);\n\t\t\t\t\t}\n\t\t\t\t\t// The task is done, clean up\n\t\t\t\t\ttask.resolve(stepResult.result);\n\t\t\t\t\tawait finalizeCurrentTask();\n\t\t\t\t\t// Then continue with the next iteration\n\t\t\t\t\tcontinue;\n\t\t\t\t} else if (stepResult.newState === TaskState.AwaitingPromise) {\n\t\t\t\t\t// The task is waiting for something\n\t\t\t\t\tif (this.verbose) {\n\t\t\t\t\t\tconsole.log(`- Task waiting`);\n\t\t\t\t\t}\n\n\t\t\t\t\t// If the task may be interrupted, check if there are other same-priority tasks that should be executed instead\n\t\t\t\t\tif (task.interrupt !== TaskInterruptBehavior.Forbidden) {\n\t\t\t\t\t\t// Re-queue the task, so the queue gets reordered\n\t\t\t\t\t\tthis._tasks.remove(task);\n\t\t\t\t\t\tthis._tasks.add(task);\n\n\t\t\t\t\t\tif (this._tasks.peekStart() !== task) {\n\t\t\t\t\t\t\tif (this.verbose) {\n\t\t\t\t\t\t\t\tconsole.log(`-- Continuing with another task`);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// The task is no longer the first in the queue. Switch to the other one\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Otherwise, we got nothing to do right now than to wait\n\t\t\t\t\twaitFor = stepResult.promise;\n\t\t\t\t} else if (stepResult.newState === TaskState.AwaitingTask) {\n\t\t\t\t\t// The task spawned a sub-task. Replace it with the sub-task and continue executing\n\t\t\t\t\tif (this.verbose) {\n\t\t\t\t\t\tconsole.log(`- Task spawned a sub-task`);\n\t\t\t\t\t}\n\t\t\t\t\tthis._tasks.add(stepResult.task);\n\t\t\t\t\tthis._tasks.remove(task);\n\t\t\t\t\t// Continue with the next iteration\n\t\t\t\t\tcontinue;\n\t\t\t\t} else {\n\t\t\t\t\t// The current task is not done, or the step result is stale after a removal.\n\t\t\t\t\t// Continue with the next iteration.\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Task queue empty. Wait for either a new task or the stop signal,\n\t\t\t// or the current task to finish waiting\n\t\t\tthis._continueSignal = createDeferredPromise();\n\t\t\tconst nextAction = await Promise.race(\n\t\t\t\t[\n\t\t\t\t\tthis._continueSignal.then(() => \"continue\" as const),\n\t\t\t\t\tthis._stopSignal!.then(() => \"stop\" as const),\n\t\t\t\t\twaitFor?.then(() => \"continue\" as const),\n\t\t\t\t].filter((p) => p !== undefined),\n\t\t\t);\n\t\t\tthis._continueSignal = undefined;\n\t\t\tif (nextAction === \"stop\") break;\n\t\t}\n\t\tthis._stopPromise!.resolve();\n\t}\n\n\tpublic async stop(): Promise<void> {\n\t\tif (!this._stopSignal) return;\n\t\t// Signal to the task runner that it should stop\n\t\tthis._stopPromise = createDeferredPromise();\n\t\tthis._stopSignal.resolve();\n\t\tawait this._stopPromise;\n\t}\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;AACA;;;;;;;;AAAA,8BAGO;AACP,yBAA2B;AAC3B,6BAAsC;AACtC,mBAAqD;AAgDrD,SAAS,YAAY,MAAmB;AACvC,SAAO,GACN,KAAK,SAAS,KAAK,OAAO,KAAK,UAAU,KAAK,GAAG,MAAM,SACxD,QAAQ,KAAK,EAAE;AAChB;AAJS;
|
|
4
|
+
"sourcesContent": ["import type { CompareResult } from \"alcalzone-shared/comparable\";\nimport {\n\ttype DeferredPromise,\n\tcreateDeferredPromise,\n} from \"alcalzone-shared/deferred-promise\";\nimport { SortedList } from \"alcalzone-shared/sorted-list\";\nimport { createWrappingCounter } from \"./wrappingCounter.js\";\nimport { evalOrStatic, highResTimestamp, noop } from \"./utils.js\";\n\n/** The read-only view of a task that gets passed to its own task function */\nexport interface TaskHandle<TaskTag extends { id: string } = { id: string }> {\n\treadonly id: number;\n\treadonly timestamp: number;\n\n\t/** The parent task spawning this subtask, if any */\n\treadonly parent?: TaskHandle<TaskTag>;\n\n\t/** A name to identify the task */\n\treadonly name?: string;\n\t/** A tag to identify the task programmatically */\n\treadonly tag?: TaskTag;\n\t/** The task's priority */\n\treadonly priority: TaskPriority;\n\t/** The concurrency group this task belongs to */\n\treadonly group?: TaskConcurrencyGroup;\n\t/** How the task should behave when interrupted */\n\treadonly interrupt: TaskInterruptBehavior;\n\t/** The current state of the task */\n\tget state(): TaskState;\n}\n\n/** A high-level task that can be started and stepped through */\nexport interface Task<\n\tTReturn,\n\tTaskTag extends { id: string } = { id: string },\n\tTError extends Error = Error,\n> extends TaskHandle<TaskTag> {\n\treadonly builder: TaskBuilder<TReturn, TaskTag>;\n\n\t/** The parent task spawning this subtask, if any */\n\treadonly parent?: Task<unknown, TaskTag, TError>;\n\n\t/** Starts the task it if hasn't been started yet, and executes the next step of the task */\n\tstep(): Promise<TaskStepResult<TReturn, TaskTag>>;\n\t/** Stops the task without further executing it, cleans up, and prepares it for starting again */\n\treset(): Promise<void>;\n\t/** Resolves the task's promise to notify the caller */\n\tresolve(result: TReturn): void;\n\t/** Rejects the task's promise to notify the caller */\n\treject(error: TError): void;\n\n\treadonly generator: ReturnType<TaskBuilder<TReturn>[\"task\"]> | undefined;\n\treadonly promise: Promise<TReturn>;\n}\n\nfunction getTaskName(task: Task<unknown>): string {\n\treturn `${\n\t\ttask.name ?? (task.tag && JSON.stringify(task.tag)) ?? \"unnamed\"\n\t} (ID ${task.id})`;\n}\n\n/** Defines the necessary information for creating a task */\nexport interface TaskBuilder<\n\tTReturn,\n\tTaskTag extends { id: string } = { id: string },\n\tTInner = unknown,\n> {\n\t/** A name to identify the task */\n\tname?: string;\n\t/** A tag to identify the task programmatically */\n\ttag?: TaskTag;\n\t/** The task's priority */\n\tpriority: TaskPriority;\n\t/** How the task should behave when interrupted */\n\tinterrupt?: TaskInterruptBehavior;\n\t/** The concurrency group this task belongs to */\n\tgroup?: TaskConcurrencyGroup;\n\t/**\n\t * The task's main generator function. This is called repeatedly until it's done.\n\t * The function must yield at points where it may be interrupted.\n\t *\n\t * At those points, the task can also wait for something to happen:\n\t * - Either a Promise, in which case it must yield a function that returns that Promise\n\t * - Or another task, in which case it must yield a TaskBuilder object or a function that returns one\n\t *\n\t * Yielded Promises should not spawn new tasks. If they do, the spawned tasks MUST have a higher priority than the parent task.\n\t *\n\t * @param thisTask The task that runs this function. It is the same object the scheduler passes to `removeTasks` predicates,\n\t * so it can be compared by identity. It stays the same when the task gets restarted.\n\t */\n\ttask: (\n\t\tthisTask: TaskHandle,\n\t) => AsyncGenerator<\n\t\t| (() => Promise<unknown> | TaskBuilder<unknown, TaskTag, unknown>)\n\t\t| (() => TaskBuilder<unknown, TaskTag, unknown>)\n\t\t| TaskBuilder<unknown, TaskTag, unknown>\n\t\t| undefined,\n\t\tTReturn,\n\t\tTInner\n\t>;\n\t/** A cleanup function that gets called when the task is dropped */\n\tcleanup?: () => Promise<void>;\n}\n\nexport type TaskReturnType<T extends TaskBuilder<unknown>> =\n\tT extends TaskBuilder<infer R> ? R : never;\n\n/** Yields the given task, then each task waiting for it, up to the outermost one */\nfunction* selfAndParents<TaskTag extends { id: string }>(\n\ttask: Task<unknown, TaskTag>,\n): Generator<Task<unknown, TaskTag>> {\n\tfor (let t: Task<unknown, TaskTag> | undefined = task; t; t = t.parent) {\n\t\tyield t;\n\t}\n}\n\nfunction isTaskBuilder<T>(obj: any): obj is TaskBuilder<T> {\n\treturn (\n\t\ttypeof obj === \"object\" &&\n\t\ttypeof obj.task === \"function\" &&\n\t\ttypeof obj.priority === \"number\"\n\t);\n}\n\n/**\n * The priority of a task.\n *\n * Higher priority tasks are executed first and interrupt lower priority tasks.\n * The recommended priority for application-initiated communication is `Normal`.\n * `Low` and `Lower` are recommended for internal long-running tasks that should not interfere with user-initiated tasks.\n * `Idle` is recommended for tasks that should only run when no other tasks are pending.\n */\nexport enum TaskPriority {\n\tHighest,\n\tHigh = 1,\n\tNormal = 2,\n\tLow = 3,\n\tLower = 4,\n\tIdle = 5,\n}\n\nexport enum TaskState {\n\t/** The task has not been created yet */\n\tNone,\n\t/** The task is being executed */\n\tActive,\n\t/** The task is waiting for a Promise to resolve */\n\tAwaitingPromise,\n\t/** The task is waiting for another task to finish */\n\tAwaitingTask,\n\t/** The task is finished */\n\tDone,\n}\n\nexport enum TaskInterruptBehavior {\n\t/** The task may not be interrupted */\n\tForbidden,\n\t/** The task will be resumed after being interrupted (default) */\n\tResume,\n\t/** The task needs to be restarted after being interrupted */\n\tRestart,\n}\n\nexport type TaskStepResult<\n\tT,\n\tTaskTag extends { id: string } = { id: string },\n> =\n\t| {\n\t\t\tnewState: TaskState.Done;\n\t\t\tresult: T;\n\t }\n\t| {\n\t\t\tnewState: TaskState.Active;\n\t }\n\t| {\n\t\t\t// The task was reset while the step was in flight. The result is stale and must be dropped.\n\t\t\tnewState: TaskState.None;\n\t }\n\t| {\n\t\t\tnewState: TaskState.AwaitingPromise;\n\t\t\tpromise: Promise<unknown>;\n\t }\n\t| {\n\t\t\tnewState: TaskState.AwaitingTask;\n\t\t\ttask: Task<unknown, TaskTag>;\n\t };\n\n/** Identifies a concurrency group. Tasks within the same group cannot run concurrently. */\nexport interface TaskConcurrencyGroup {\n\tid: string;\n}\n\nfunction compareTasks<T1, T2>(a: Task<T1>, b: Task<T2>): CompareResult {\n\t// In the same concurrency group, only one task may be active at a time.\n\tconst aConcurrencyGroup = a.group?.id;\n\tconst bConcurrencyGroup = b.group?.id;\n\tif (\n\t\taConcurrencyGroup &&\n\t\tbConcurrencyGroup &&\n\t\taConcurrencyGroup === bConcurrencyGroup\n\t) {\n\t\tconst aActiveOrWaiting =\n\t\t\ta.state === TaskState.Active ||\n\t\t\ta.state === TaskState.AwaitingPromise ||\n\t\t\ta.state === TaskState.AwaitingTask;\n\t\tconst bActiveOrWaiting =\n\t\t\tb.state === TaskState.Active ||\n\t\t\tb.state === TaskState.AwaitingPromise ||\n\t\t\tb.state === TaskState.AwaitingTask;\n\n\t\tif (aActiveOrWaiting && !bActiveOrWaiting) return 1; // A is already active\n\t\tif (!aActiveOrWaiting && bActiveOrWaiting) return -1; // B is already active\n\n\t\t// None of the tasks is active, fall back to default sorting\n\t}\n\n\t// Sort by priority for tasks not in the same concurrency group\n\tif (a.priority < b.priority) return 1;\n\tif (a.priority > b.priority) return -1;\n\n\t// Deprioritize waiting tasks\n\tconst aWaiting =\n\t\ta.state === TaskState.AwaitingPromise ||\n\t\ta.state === TaskState.AwaitingTask;\n\tconst bWaiting =\n\t\tb.state === TaskState.AwaitingPromise ||\n\t\tb.state === TaskState.AwaitingTask;\n\tif (!aWaiting && bWaiting) return 1;\n\tif (aWaiting && !bWaiting) return -1;\n\n\t// Sort equal priority by timestamp. Newer tasks go to the end of the list\n\tif (a.timestamp < b.timestamp) return 1;\n\tif (a.timestamp > b.timestamp) return -1;\n\n\t// If all else fails, sort by ID\n\treturn Math.sign(b.id - a.id) as CompareResult;\n}\n\nexport class TaskScheduler<\n\tTaskTag extends { id: string } = { id: string },\n\tTError extends Error = Error,\n> {\n\tpublic constructor(\n\t\tprivate defaultErrorFactory: () => TError = () =>\n\t\t\tnew Error(\"Task was removed\") as any,\n\t\tprivate verbose: boolean = false,\n\t) {}\n\n\tprivate _tasks = new SortedList<Task<unknown, TaskTag>>(\n\t\tundefined,\n\t\tcompareTasks,\n\t);\n\tprivate _currentTask: Task<unknown, TaskTag> | undefined;\n\n\tprivate _idGenerator = createWrappingCounter(0xff_ff_ff);\n\tprivate _continueSignal: DeferredPromise<void> | undefined;\n\tprivate _stopSignal: DeferredPromise<void> | undefined;\n\tprivate _stopPromise: DeferredPromise<void> | undefined;\n\n\tpublic queueTask<T>(builder: TaskBuilder<T, TaskTag>): Promise<T> {\n\t\tconst task = this.createTask(builder);\n\t\tthis._tasks.add(task);\n\t\tif (this.verbose) {\n\t\t\tconsole.log(`Task queued: ${getTaskName(task)}`);\n\t\t}\n\n\t\tif (this._continueSignal) this._continueSignal.resolve();\n\t\treturn task.promise;\n\t}\n\n\t/**\n\t * Removes/stops tasks matching the given predicate. Returns `true` when a task was removed, `false` otherwise.\n\t *\n\t * The predicate also sees parent tasks that are waiting for a subtask.\n\t * Removing such a parent also removes the subtasks it is waiting for.\n\t */\n\tpublic async removeTasks(\n\t\tpredicate: (task: Task<unknown, TaskTag>) => boolean,\n\t\treason?: TError,\n\t): Promise<boolean> {\n\t\t// Collect tasks that should be removed, so that we handle the current task last.\n\t\t// Each queued task is the end of a chain of parents waiting for it.\n\t\tconst tasksToRemove = new Set<Task<unknown, TaskTag>>();\n\t\tconst currentTasksToRemove: Task<unknown, TaskTag>[] = [];\n\t\tfor (const queued of this._tasks) {\n\t\t\tfor (const task of selfAndParents(queued)) {\n\t\t\t\tif (!predicate(task)) continue;\n\t\t\t\tif (queued === this._currentTask) {\n\t\t\t\t\tcurrentTasksToRemove.push(task);\n\t\t\t\t} else {\n\t\t\t\t\ttasksToRemove.add(task);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tfor (const task of currentTasksToRemove) {\n\t\t\ttasksToRemove.add(task);\n\t\t}\n\n\t\treason ??= this.defaultErrorFactory();\n\n\t\tfor (const task of tasksToRemove) {\n\t\t\t// Skip tasks the run loop finalized or that were dropped with an earlier chain\n\t\t\tconst leaf = this.findLeafTask(task);\n\t\t\tif (!leaf) continue;\n\n\t\t\t// Drop everything from the leaf up to the outermost matching parent\n\t\t\tlet outermost = task;\n\t\t\tfor (let t = task.parent; t; t = t.parent) {\n\t\t\t\tif (tasksToRemove.has(t)) outermost = t;\n\t\t\t}\n\t\t\tawait this.dropTasks(leaf, outermost, reason);\n\t\t}\n\n\t\tif (this._continueSignal) this._continueSignal.resolve();\n\n\t\treturn tasksToRemove.size > 0;\n\t}\n\n\t/** Returns the queued or current task that is `task` itself or one of its subtasks, if any */\n\tprivate findLeafTask(\n\t\ttask: Task<unknown, TaskTag>,\n\t): Task<unknown, TaskTag> | undefined {\n\t\tconst leaves = this._currentTask\n\t\t\t? [this._currentTask, ...this._tasks]\n\t\t\t: this._tasks;\n\t\tfor (const leaf of leaves) {\n\t\t\tfor (const t of selfAndParents(leaf)) {\n\t\t\t\tif (t === task) return leaf;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Removes `leaf` from the queue, then resets and rejects it and each of its parents up to and including `outermost`.\n\t * The parent of `outermost` is put back into the queue first.\n\t */\n\tprivate async dropTasks(\n\t\tleaf: Task<unknown, TaskTag>,\n\t\toutermost: Task<unknown, TaskTag>,\n\t\treason: TError,\n\t): Promise<void> {\n\t\tthis._tasks.remove(leaf);\n\t\t// Claim the task before awaiting anything, so the run loop drops the\n\t\t// result of an in-flight step instead of finalizing the task a second time\n\t\tif (this._currentTask === leaf) {\n\t\t\tthis._currentTask = undefined;\n\t\t}\n\t\tif (outermost.parent) this.restoreParentTask(outermost.parent);\n\t\tfor (let task = leaf; ; task = task.parent!) {\n\t\t\tif (this.verbose) {\n\t\t\t\tconsole.log(`Removing task: ${getTaskName(task)}`);\n\t\t\t}\n\t\t\tawait task.reset().catch(noop);\n\t\t\ttask.reject(reason);\n\t\t\tif (task === outermost) break;\n\t\t}\n\t}\n\n\t/**\n\t * Puts a parent back into the queue when its subtask is finished or removed.\n\t * Call this before cleaning up the subtask, so the parent can be found during the cleanup.\n\t */\n\tprivate restoreParentTask(parent: Task<unknown, TaskTag>): void {\n\t\tif (this.verbose) {\n\t\t\tconsole.log(`Restoring parent task: ${getTaskName(parent)}`);\n\t\t}\n\t\tthis._tasks.add(parent);\n\t}\n\n\t/**\n\t * Returns the promise of the first task matching the given predicate, if any.\n\t * The predicate also sees parent tasks that are waiting for a subtask.\n\t */\n\tpublic findTask<T = unknown>(\n\t\tpredicate: (task: Task<T, TaskTag>) => boolean,\n\t): Promise<T> | undefined {\n\t\tfor (const queued of this._tasks) {\n\t\t\tfor (const task of selfAndParents(queued)) {\n\t\t\t\tif (predicate(task as Task<T, TaskTag>)) {\n\t\t\t\t\treturn task.promise as Promise<T>;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/** Creates a task that can be executed */\n\tprivate createTask<T>(\n\t\tbuilder: TaskBuilder<T, TaskTag>,\n\t\tparent?: Task<unknown, TaskTag>,\n\t): Task<T, TaskTag, TError> {\n\t\tlet state = TaskState.None;\n\t\tlet generator: ReturnType<TaskBuilder<T, TaskTag>[\"task\"]> | undefined;\n\t\tlet waitForPromise: Promise<unknown> | undefined;\n\t\tconst promise = createDeferredPromise<T>();\n\n\t\tlet prevResult: unknown;\n\t\tlet waitError: unknown;\n\n\t\tconst self = this;\n\n\t\tconst task: Task<T, TaskTag, TError> = {\n\t\t\tid: this._idGenerator(),\n\t\t\ttimestamp: highResTimestamp(),\n\t\t\tbuilder,\n\t\t\tparent,\n\t\t\tname: builder.name,\n\t\t\ttag: builder.tag,\n\t\t\tpriority: builder.priority,\n\t\t\tgroup: builder.group,\n\t\t\tinterrupt: builder.interrupt ?? TaskInterruptBehavior.Resume,\n\t\t\tpromise,\n\t\t\tasync step() {\n\t\t\t\t// Do not proceed while still waiting for a Promise to resolve\n\t\t\t\tif (state === TaskState.AwaitingPromise && waitForPromise) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tnewState: state,\n\t\t\t\t\t\tpromise: waitForPromise,\n\t\t\t\t\t};\n\t\t\t\t} else if (state === TaskState.AwaitingTask) {\n\t\t\t\t\t// The scheduler puts a parent back into the queue before its subtask is cleaned up.\n\t\t\t\t\t// The parent must wait until it has received the subtask's result.\n\t\t\t\t\tif (waitForPromise) {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tnewState: TaskState.AwaitingPromise,\n\t\t\t\t\t\t\tpromise: waitForPromise,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\"Cannot step through a task that is waiting for another task\",\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tgenerator ??= builder.task(task);\n\t\t\t\tstate = TaskState.Active;\n\n\t\t\t\t// Capture the generator so a concurrent reset() can be detected after the await\n\t\t\t\tconst gen = generator;\n\t\t\t\tlet genResult: Awaited<ReturnType<typeof gen.next>>;\n\t\t\t\ttry {\n\t\t\t\t\tgenResult = waitError\n\t\t\t\t\t\t? await gen.throw(waitError)\n\t\t\t\t\t\t: await gen.next(prevResult);\n\t\t\t\t} catch (e) {\n\t\t\t\t\t// Drop errors from a step whose task was reset in the meantime\n\t\t\t\t\tif (generator !== gen) return { newState: TaskState.None };\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\t\t\t\t// Drop the step result if the task was reset while the generator was running,\n\t\t\t\t// so the task state is not corrupted after the reset\n\t\t\t\tif (generator !== gen) return { newState: TaskState.None };\n\n\t\t\t\tconst { value, done } = genResult;\n\t\t\t\tprevResult = undefined;\n\t\t\t\twaitError = undefined;\n\t\t\t\tif (done) {\n\t\t\t\t\tstate = TaskState.Done;\n\t\t\t\t\treturn {\n\t\t\t\t\t\tnewState: state,\n\t\t\t\t\t\tresult: value,\n\t\t\t\t\t};\n\t\t\t\t} else if (value != undefined) {\n\t\t\t\t\tconst waitFor = evalOrStatic(value);\n\t\t\t\t\tif (waitFor instanceof Promise) {\n\t\t\t\t\t\tstate = TaskState.AwaitingPromise;\n\t\t\t\t\t\t// Ignore the promise's result if this task was reset in the meantime\n\t\t\t\t\t\twaitForPromise = waitFor\n\t\t\t\t\t\t\t.then((result) => {\n\t\t\t\t\t\t\t\tif (generator === gen) prevResult = result;\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t.catch((e) => {\n\t\t\t\t\t\t\t\tif (generator === gen) waitError = e;\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t.finally(() => {\n\t\t\t\t\t\t\t\tif (generator !== gen) return;\n\t\t\t\t\t\t\t\twaitForPromise = undefined;\n\t\t\t\t\t\t\t\tif (state === TaskState.AwaitingPromise) {\n\t\t\t\t\t\t\t\t\tstate = TaskState.Active;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tnewState: state,\n\t\t\t\t\t\t\tpromise: waitForPromise,\n\t\t\t\t\t\t};\n\t\t\t\t\t} else if (isTaskBuilder(waitFor)) {\n\t\t\t\t\t\tif (waitFor.priority > builder.priority) {\n\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t\"Tasks cannot yield to tasks with lower priority than their own\",\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Create a sub-task with a reference to this task\n\t\t\t\t\t\tstate = TaskState.AwaitingTask;\n\t\t\t\t\t\tconst subTask = self.createTask(waitFor, this);\n\n\t\t\t\t\t\t// Ignore the subtask's result if this task was reset in the meantime\n\t\t\t\t\t\twaitForPromise = subTask.promise\n\t\t\t\t\t\t\t.then((result) => {\n\t\t\t\t\t\t\t\tif (generator === gen) prevResult = result;\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t.catch((e) => {\n\t\t\t\t\t\t\t\tif (generator === gen) waitError = e;\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t.finally(() => {\n\t\t\t\t\t\t\t\tif (generator !== gen) return;\n\t\t\t\t\t\t\t\twaitForPromise = undefined;\n\t\t\t\t\t\t\t\tif (state === TaskState.AwaitingTask) {\n\t\t\t\t\t\t\t\t\tstate = TaskState.Active;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tnewState: state,\n\t\t\t\t\t\t\ttask: subTask,\n\t\t\t\t\t\t};\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthrow new Error(\"Invalid value yielded by task\");\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\treturn { newState: state };\n\t\t\t\t}\n\t\t\t},\n\t\t\tasync reset() {\n\t\t\t\tif (state === TaskState.None) return;\n\t\t\t\tstate = TaskState.None;\n\t\t\t\twaitForPromise = undefined;\n\t\t\t\tgenerator = undefined;\n\t\t\t\tprevResult = undefined;\n\t\t\t\twaitError = undefined;\n\n\t\t\t\tawait builder.cleanup?.();\n\t\t\t},\n\t\t\tresolve(result) {\n\t\t\t\tpromise.resolve(result);\n\t\t\t},\n\t\t\treject(error) {\n\t\t\t\tpromise.reject(error);\n\t\t\t},\n\t\t\tget state() {\n\t\t\t\treturn state;\n\t\t\t},\n\t\t\tget generator() {\n\t\t\t\treturn generator;\n\t\t\t},\n\t\t};\n\t\treturn task;\n\t}\n\n\tpublic start(): void {\n\t\tthis._stopSignal = createDeferredPromise();\n\t\t// A timer instead of setImmediate, which only exists on Node.js and its clones\n\t\tsetTimeout(async () => {\n\t\t\ttry {\n\t\t\t\tawait this.run();\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(\"Task runner crashed\", e);\n\t\t\t}\n\t\t}, 0);\n\t}\n\n\tprivate async run(): Promise<void> {\n\t\twhile (true) {\n\t\t\tlet waitFor: Promise<unknown> | undefined;\n\t\t\tif (this._tasks.length > 0) {\n\t\t\t\tconst firstTask = this._tasks.peekStart()!;\n\t\t\t\tif (!this._currentTask) {\n\t\t\t\t\t// We're not currently executing a task, start executing the first one\n\t\t\t\t\tthis._currentTask = firstTask;\n\t\t\t\t} else if (\n\t\t\t\t\tthis._currentTask !== firstTask &&\n\t\t\t\t\tthis._currentTask.interrupt !==\n\t\t\t\t\t\tTaskInterruptBehavior.Forbidden\n\t\t\t\t) {\n\t\t\t\t\t// We are executing an interruptible task, and a new task with a higher priority was added\n\t\t\t\t\tif (\n\t\t\t\t\t\tthis._currentTask.interrupt ===\n\t\t\t\t\t\tTaskInterruptBehavior.Restart\n\t\t\t\t\t) {\n\t\t\t\t\t\t// The current task needs to be restarted after being interrupted, so reset it\n\t\t\t\t\t\tconst interrupted = this._currentTask;\n\t\t\t\t\t\tawait interrupted.reset();\n\t\t\t\t\t\t// Re-evaluate the queue if it changed during the reset\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tthis._currentTask !== interrupted ||\n\t\t\t\t\t\t\tthis._tasks.peekStart() !== firstTask\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t// switch to the new task\n\t\t\t\t\tthis._currentTask = firstTask;\n\t\t\t\t}\n\n\t\t\t\t// Capture the current task, so concurrent removals can be detected after each await\n\t\t\t\tconst task = this._currentTask;\n\n\t\t\t\tif (this.verbose) {\n\t\t\t\t\tconsole.log(`Stepping through task: ${getTaskName(task)}`);\n\t\t\t\t}\n\n\t\t\t\tconst finalizeCurrentTask = async () => {\n\t\t\t\t\tthis._tasks.remove(task);\n\t\t\t\t\t// Claim the task before awaiting, so a concurrent removeTasks() skips it\n\t\t\t\t\tthis._currentTask = undefined;\n\t\t\t\t\tif (task.parent) this.restoreParentTask(task.parent);\n\t\t\t\t\tawait task.reset();\n\t\t\t\t};\n\n\t\t\t\t// Execute the current task one step further\n\t\t\t\twaitFor = undefined;\n\t\t\t\tlet stepResult: TaskStepResult<unknown, TaskTag>;\n\t\t\t\ttry {\n\t\t\t\t\tstepResult = await task.step();\n\t\t\t\t} catch (e) {\n\t\t\t\t\t// Drop the error if the task was removed during the step. It was already rejected.\n\t\t\t\t\tif (this._currentTask !== task) continue;\n\n\t\t\t\t\tif (this.verbose) {\n\t\t\t\t\t\tconsole.error(`- Task threw an error:`, e);\n\t\t\t\t\t}\n\t\t\t\t\t// The task threw an error, expose the result and clean up.\n\t\t\t\t\ttask.reject(e as Error);\n\t\t\t\t\tawait finalizeCurrentTask();\n\t\t\t\t\t// Then continue with the next iteration\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Drop the step result if the task was removed during the step. It was already rejected.\n\t\t\t\tif (this._currentTask !== task) continue;\n\n\t\t\t\tif (stepResult.newState === TaskState.Done) {\n\t\t\t\t\tif (this.verbose) {\n\t\t\t\t\t\tconsole.log(`- Task finished`);\n\t\t\t\t\t}\n\t\t\t\t\t// The task is done, clean up\n\t\t\t\t\ttask.resolve(stepResult.result);\n\t\t\t\t\tawait finalizeCurrentTask();\n\t\t\t\t\t// Then continue with the next iteration\n\t\t\t\t\tcontinue;\n\t\t\t\t} else if (stepResult.newState === TaskState.AwaitingPromise) {\n\t\t\t\t\t// The task is waiting for something\n\t\t\t\t\tif (this.verbose) {\n\t\t\t\t\t\tconsole.log(`- Task waiting`);\n\t\t\t\t\t}\n\n\t\t\t\t\t// If the task may be interrupted, check if there are other same-priority tasks that should be executed instead\n\t\t\t\t\tif (task.interrupt !== TaskInterruptBehavior.Forbidden) {\n\t\t\t\t\t\t// Re-queue the task, so the queue gets reordered\n\t\t\t\t\t\tthis._tasks.remove(task);\n\t\t\t\t\t\tthis._tasks.add(task);\n\n\t\t\t\t\t\tif (this._tasks.peekStart() !== task) {\n\t\t\t\t\t\t\tif (this.verbose) {\n\t\t\t\t\t\t\t\tconsole.log(`-- Continuing with another task`);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// The task is no longer the first in the queue. Switch to the other one\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Otherwise, we got nothing to do right now than to wait\n\t\t\t\t\twaitFor = stepResult.promise;\n\t\t\t\t} else if (stepResult.newState === TaskState.AwaitingTask) {\n\t\t\t\t\t// The task spawned a sub-task. Replace it with the sub-task and continue executing\n\t\t\t\t\tif (this.verbose) {\n\t\t\t\t\t\tconsole.log(`- Task spawned a sub-task`);\n\t\t\t\t\t}\n\t\t\t\t\tthis._tasks.add(stepResult.task);\n\t\t\t\t\tthis._tasks.remove(task);\n\t\t\t\t\t// Switching to the subtask must not count as interrupting the parent\n\t\t\t\t\tthis._currentTask = undefined;\n\t\t\t\t\t// Continue with the next iteration\n\t\t\t\t\tcontinue;\n\t\t\t\t} else {\n\t\t\t\t\t// The current task is not done, or the step result is stale after a removal.\n\t\t\t\t\t// Continue with the next iteration.\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Task queue empty. Wait for either a new task or the stop signal,\n\t\t\t// or the current task to finish waiting\n\t\t\tthis._continueSignal = createDeferredPromise();\n\t\t\tconst nextAction = await Promise.race(\n\t\t\t\t[\n\t\t\t\t\tthis._continueSignal.then(() => \"continue\" as const),\n\t\t\t\t\tthis._stopSignal!.then(() => \"stop\" as const),\n\t\t\t\t\twaitFor?.then(() => \"continue\" as const),\n\t\t\t\t].filter((p) => p !== undefined),\n\t\t\t);\n\t\t\tthis._continueSignal = undefined;\n\t\t\tif (nextAction === \"stop\") break;\n\t\t}\n\t\tthis._stopPromise!.resolve();\n\t}\n\n\tpublic async stop(): Promise<void> {\n\t\tif (!this._stopSignal) return;\n\t\t// Signal to the task runner that it should stop\n\t\tthis._stopPromise = createDeferredPromise();\n\t\tthis._stopSignal.resolve();\n\t\tawait this._stopPromise;\n\t}\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["TaskPriority", "TaskState", "TaskInterruptBehavior"]
|
|
7
7
|
}
|
package/build/esm/Task.d.ts
CHANGED
|
@@ -148,10 +148,29 @@ export declare class TaskScheduler<TaskTag extends {
|
|
|
148
148
|
private _stopSignal;
|
|
149
149
|
private _stopPromise;
|
|
150
150
|
queueTask<T>(builder: TaskBuilder<T, TaskTag>): Promise<T>;
|
|
151
|
-
/**
|
|
151
|
+
/**
|
|
152
|
+
* Removes/stops tasks matching the given predicate. Returns `true` when a task was removed, `false` otherwise.
|
|
153
|
+
*
|
|
154
|
+
* The predicate also sees parent tasks that are waiting for a subtask.
|
|
155
|
+
* Removing such a parent also removes the subtasks it is waiting for.
|
|
156
|
+
*/
|
|
152
157
|
removeTasks(predicate: (task: Task<unknown, TaskTag>) => boolean, reason?: TError): Promise<boolean>;
|
|
153
|
-
/**
|
|
154
|
-
private
|
|
158
|
+
/** Returns the queued or current task that is `task` itself or one of its subtasks, if any */
|
|
159
|
+
private findLeafTask;
|
|
160
|
+
/**
|
|
161
|
+
* Removes `leaf` from the queue, then resets and rejects it and each of its parents up to and including `outermost`.
|
|
162
|
+
* The parent of `outermost` is put back into the queue first.
|
|
163
|
+
*/
|
|
164
|
+
private dropTasks;
|
|
165
|
+
/**
|
|
166
|
+
* Puts a parent back into the queue when its subtask is finished or removed.
|
|
167
|
+
* Call this before cleaning up the subtask, so the parent can be found during the cleanup.
|
|
168
|
+
*/
|
|
169
|
+
private restoreParentTask;
|
|
170
|
+
/**
|
|
171
|
+
* Returns the promise of the first task matching the given predicate, if any.
|
|
172
|
+
* The predicate also sees parent tasks that are waiting for a subtask.
|
|
173
|
+
*/
|
|
155
174
|
findTask<T = unknown>(predicate: (task: Task<T, TaskTag>) => boolean): Promise<T> | undefined;
|
|
156
175
|
/** Creates a task that can be executed */
|
|
157
176
|
private createTask;
|
package/build/esm/Task.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Task.d.ts","sourceRoot":"","sources":["../../src/Task.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"Task.d.ts","sourceRoot":"","sources":["../../src/Task.ts"],"names":[],"mappings":"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"}
|
package/build/esm/Task.js
CHANGED
|
@@ -5,6 +5,12 @@ import { evalOrStatic, highResTimestamp, noop } from "./utils.js";
|
|
|
5
5
|
function getTaskName(task) {
|
|
6
6
|
return `${task.name ?? (task.tag && JSON.stringify(task.tag)) ?? "unnamed"} (ID ${task.id})`;
|
|
7
7
|
}
|
|
8
|
+
/** Yields the given task, then each task waiting for it, up to the outermost one */
|
|
9
|
+
function* selfAndParents(task) {
|
|
10
|
+
for (let t = task; t; t = t.parent) {
|
|
11
|
+
yield t;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
8
14
|
function isTaskBuilder(obj) {
|
|
9
15
|
return (typeof obj === "object" &&
|
|
10
16
|
typeof obj.task === "function" &&
|
|
@@ -113,59 +119,107 @@ export class TaskScheduler {
|
|
|
113
119
|
this._continueSignal.resolve();
|
|
114
120
|
return task.promise;
|
|
115
121
|
}
|
|
116
|
-
/**
|
|
122
|
+
/**
|
|
123
|
+
* Removes/stops tasks matching the given predicate. Returns `true` when a task was removed, `false` otherwise.
|
|
124
|
+
*
|
|
125
|
+
* The predicate also sees parent tasks that are waiting for a subtask.
|
|
126
|
+
* Removing such a parent also removes the subtasks it is waiting for.
|
|
127
|
+
*/
|
|
117
128
|
async removeTasks(predicate, reason) {
|
|
118
|
-
// Collect tasks that should be removed, so that we handle the current task last
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
129
|
+
// Collect tasks that should be removed, so that we handle the current task last.
|
|
130
|
+
// Each queued task is the end of a chain of parents waiting for it.
|
|
131
|
+
const tasksToRemove = new Set();
|
|
132
|
+
const currentTasksToRemove = [];
|
|
133
|
+
for (const queued of this._tasks) {
|
|
134
|
+
for (const task of selfAndParents(queued)) {
|
|
135
|
+
if (!predicate(task))
|
|
136
|
+
continue;
|
|
137
|
+
if (queued === this._currentTask) {
|
|
138
|
+
currentTasksToRemove.push(task);
|
|
125
139
|
}
|
|
126
140
|
else {
|
|
127
|
-
tasksToRemove.
|
|
141
|
+
tasksToRemove.add(task);
|
|
128
142
|
}
|
|
129
143
|
}
|
|
130
144
|
}
|
|
131
|
-
|
|
132
|
-
tasksToRemove.
|
|
145
|
+
for (const task of currentTasksToRemove) {
|
|
146
|
+
tasksToRemove.add(task);
|
|
133
147
|
}
|
|
134
148
|
reason ??= this.defaultErrorFactory();
|
|
135
149
|
for (const task of tasksToRemove) {
|
|
136
|
-
// Skip tasks the run loop finalized
|
|
137
|
-
|
|
150
|
+
// Skip tasks the run loop finalized or that were dropped with an earlier chain
|
|
151
|
+
const leaf = this.findLeafTask(task);
|
|
152
|
+
if (!leaf)
|
|
138
153
|
continue;
|
|
154
|
+
// Drop everything from the leaf up to the outermost matching parent
|
|
155
|
+
let outermost = task;
|
|
156
|
+
for (let t = task.parent; t; t = t.parent) {
|
|
157
|
+
if (tasksToRemove.has(t))
|
|
158
|
+
outermost = t;
|
|
139
159
|
}
|
|
140
|
-
await this.
|
|
160
|
+
await this.dropTasks(leaf, outermost, reason);
|
|
141
161
|
}
|
|
142
162
|
if (this._continueSignal)
|
|
143
163
|
this._continueSignal.resolve();
|
|
144
|
-
return tasksToRemove.
|
|
164
|
+
return tasksToRemove.size > 0;
|
|
145
165
|
}
|
|
146
|
-
/**
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
166
|
+
/** Returns the queued or current task that is `task` itself or one of its subtasks, if any */
|
|
167
|
+
findLeafTask(task) {
|
|
168
|
+
const leaves = this._currentTask
|
|
169
|
+
? [this._currentTask, ...this._tasks]
|
|
170
|
+
: this._tasks;
|
|
171
|
+
for (const leaf of leaves) {
|
|
172
|
+
for (const t of selfAndParents(leaf)) {
|
|
173
|
+
if (t === task)
|
|
174
|
+
return leaf;
|
|
175
|
+
}
|
|
150
176
|
}
|
|
151
|
-
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Removes `leaf` from the queue, then resets and rejects it and each of its parents up to and including `outermost`.
|
|
180
|
+
* The parent of `outermost` is put back into the queue first.
|
|
181
|
+
*/
|
|
182
|
+
async dropTasks(leaf, outermost, reason) {
|
|
183
|
+
this._tasks.remove(leaf);
|
|
152
184
|
// Claim the task before awaiting anything, so the run loop drops the
|
|
153
185
|
// result of an in-flight step instead of finalizing the task a second time
|
|
154
|
-
if (this._currentTask ===
|
|
186
|
+
if (this._currentTask === leaf) {
|
|
155
187
|
this._currentTask = undefined;
|
|
156
188
|
}
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
if (task.parent) {
|
|
189
|
+
if (outermost.parent)
|
|
190
|
+
this.restoreParentTask(outermost.parent);
|
|
191
|
+
for (let task = leaf;; task = task.parent) {
|
|
161
192
|
if (this.verbose) {
|
|
162
|
-
console.log(`
|
|
193
|
+
console.log(`Removing task: ${getTaskName(task)}`);
|
|
163
194
|
}
|
|
164
|
-
|
|
195
|
+
await task.reset().catch(noop);
|
|
196
|
+
task.reject(reason);
|
|
197
|
+
if (task === outermost)
|
|
198
|
+
break;
|
|
165
199
|
}
|
|
166
200
|
}
|
|
201
|
+
/**
|
|
202
|
+
* Puts a parent back into the queue when its subtask is finished or removed.
|
|
203
|
+
* Call this before cleaning up the subtask, so the parent can be found during the cleanup.
|
|
204
|
+
*/
|
|
205
|
+
restoreParentTask(parent) {
|
|
206
|
+
if (this.verbose) {
|
|
207
|
+
console.log(`Restoring parent task: ${getTaskName(parent)}`);
|
|
208
|
+
}
|
|
209
|
+
this._tasks.add(parent);
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Returns the promise of the first task matching the given predicate, if any.
|
|
213
|
+
* The predicate also sees parent tasks that are waiting for a subtask.
|
|
214
|
+
*/
|
|
167
215
|
findTask(predicate) {
|
|
168
|
-
|
|
216
|
+
for (const queued of this._tasks) {
|
|
217
|
+
for (const task of selfAndParents(queued)) {
|
|
218
|
+
if (predicate(task)) {
|
|
219
|
+
return task.promise;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
}
|
|
169
223
|
}
|
|
170
224
|
/** Creates a task that can be executed */
|
|
171
225
|
createTask(builder, parent) {
|
|
@@ -196,6 +250,14 @@ export class TaskScheduler {
|
|
|
196
250
|
};
|
|
197
251
|
}
|
|
198
252
|
else if (state === TaskState.AwaitingTask) {
|
|
253
|
+
// The scheduler puts a parent back into the queue before its subtask is cleaned up.
|
|
254
|
+
// The parent must wait until it has received the subtask's result.
|
|
255
|
+
if (waitForPromise) {
|
|
256
|
+
return {
|
|
257
|
+
newState: TaskState.AwaitingPromise,
|
|
258
|
+
promise: waitForPromise,
|
|
259
|
+
};
|
|
260
|
+
}
|
|
199
261
|
throw new Error("Cannot step through a task that is waiting for another task");
|
|
200
262
|
}
|
|
201
263
|
generator ??= builder.task(task);
|
|
@@ -232,14 +294,19 @@ export class TaskScheduler {
|
|
|
232
294
|
const waitFor = evalOrStatic(value);
|
|
233
295
|
if (waitFor instanceof Promise) {
|
|
234
296
|
state = TaskState.AwaitingPromise;
|
|
297
|
+
// Ignore the promise's result if this task was reset in the meantime
|
|
235
298
|
waitForPromise = waitFor
|
|
236
299
|
.then((result) => {
|
|
237
|
-
|
|
300
|
+
if (generator === gen)
|
|
301
|
+
prevResult = result;
|
|
238
302
|
})
|
|
239
303
|
.catch((e) => {
|
|
240
|
-
|
|
304
|
+
if (generator === gen)
|
|
305
|
+
waitError = e;
|
|
241
306
|
})
|
|
242
307
|
.finally(() => {
|
|
308
|
+
if (generator !== gen)
|
|
309
|
+
return;
|
|
243
310
|
waitForPromise = undefined;
|
|
244
311
|
if (state === TaskState.AwaitingPromise) {
|
|
245
312
|
state = TaskState.Active;
|
|
@@ -257,14 +324,20 @@ export class TaskScheduler {
|
|
|
257
324
|
// Create a sub-task with a reference to this task
|
|
258
325
|
state = TaskState.AwaitingTask;
|
|
259
326
|
const subTask = self.createTask(waitFor, this);
|
|
260
|
-
|
|
327
|
+
// Ignore the subtask's result if this task was reset in the meantime
|
|
328
|
+
waitForPromise = subTask.promise
|
|
261
329
|
.then((result) => {
|
|
262
|
-
|
|
330
|
+
if (generator === gen)
|
|
331
|
+
prevResult = result;
|
|
263
332
|
})
|
|
264
333
|
.catch((e) => {
|
|
265
|
-
|
|
334
|
+
if (generator === gen)
|
|
335
|
+
waitError = e;
|
|
266
336
|
})
|
|
267
337
|
.finally(() => {
|
|
338
|
+
if (generator !== gen)
|
|
339
|
+
return;
|
|
340
|
+
waitForPromise = undefined;
|
|
268
341
|
if (state === TaskState.AwaitingTask) {
|
|
269
342
|
state = TaskState.Active;
|
|
270
343
|
}
|
|
@@ -355,14 +428,9 @@ export class TaskScheduler {
|
|
|
355
428
|
this._tasks.remove(task);
|
|
356
429
|
// Claim the task before awaiting, so a concurrent removeTasks() skips it
|
|
357
430
|
this._currentTask = undefined;
|
|
431
|
+
if (task.parent)
|
|
432
|
+
this.restoreParentTask(task.parent);
|
|
358
433
|
await task.reset();
|
|
359
|
-
// Re-add the parent task to the list if there is one
|
|
360
|
-
if (task.parent) {
|
|
361
|
-
if (this.verbose) {
|
|
362
|
-
console.log(`Restoring parent task: ${getTaskName(task.parent)}`);
|
|
363
|
-
}
|
|
364
|
-
this._tasks.add(task.parent);
|
|
365
|
-
}
|
|
366
434
|
};
|
|
367
435
|
// Execute the current task one step further
|
|
368
436
|
waitFor = undefined;
|
|
@@ -424,6 +492,8 @@ export class TaskScheduler {
|
|
|
424
492
|
}
|
|
425
493
|
this._tasks.add(stepResult.task);
|
|
426
494
|
this._tasks.remove(task);
|
|
495
|
+
// Switching to the subtask must not count as interrupting the parent
|
|
496
|
+
this._currentTask = undefined;
|
|
427
497
|
// Continue with the next iteration
|
|
428
498
|
continue;
|
|
429
499
|
}
|
package/build/esm/Task.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Task.js","sourceRoot":"","sources":["../../src/Task.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Task.js","sourceRoot":"","sources":["../../src/Task.ts"],"names":[],"mappings":"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"}
|