@zwave-js/waddle 1.2.0 → 1.2.2
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/LICENSE +1 -1
- package/README.md +9 -0
- package/build/cjs/Task.d.ts +5 -1
- package/build/cjs/Task.js +70 -54
- package/build/cjs/Task.js.map +2 -2
- package/build/cjs/index.d.ts +1 -1
- package/build/cjs/index.js.map +2 -2
- package/build/cjs/utils.d.ts +3 -1
- package/build/cjs/utils.js +2 -2
- package/build/cjs/utils.js.map +2 -2
- package/build/esm/Task.d.ts +5 -1
- package/build/esm/Task.d.ts.map +1 -1
- package/build/esm/Task.js +90 -65
- package/build/esm/Task.js.map +1 -1
- package/build/esm/index.d.ts +1 -1
- package/build/esm/index.d.ts.map +1 -1
- package/build/esm/index.js.map +1 -1
- package/build/esm/utils.d.ts +3 -1
- package/build/esm/utils.d.ts.map +1 -1
- package/build/esm/utils.js +2 -2
- package/build/esm/utils.js.map +1 -1
- package/package.json +8 -8
package/LICENSE
CHANGED
package/README.md
CHANGED
|
@@ -481,6 +481,15 @@ const scheduler = new TaskScheduler(() => new Error("We are all doomed!"));
|
|
|
481
481
|
```
|
|
482
482
|
|
|
483
483
|
## Changelog
|
|
484
|
+
### 1.2.2 (2026-07-02)
|
|
485
|
+
|
|
486
|
+
- Fixed a crash of the task scheduler that could occur when removing the currently executed task while it is performing an asynchronous operation
|
|
487
|
+
|
|
488
|
+
### 1.2.1 (2025-06-24)
|
|
489
|
+
|
|
490
|
+
- Fixed some type issues for composite task definitions
|
|
491
|
+
- The `waitFor` utility function is now compatible with TaskBuilder objects too
|
|
492
|
+
|
|
484
493
|
### 1.2.0 (2025-06-24)
|
|
485
494
|
|
|
486
495
|
- Add utility method `waitFor` for type-safe yielding of Promises
|
package/build/cjs/Task.d.ts
CHANGED
|
@@ -58,7 +58,7 @@ export interface TaskBuilder<TReturn, TaskTag extends {
|
|
|
58
58
|
*
|
|
59
59
|
* Yielded Promises should not spawn new tasks. If they do, the spawned tasks MUST have a higher priority than the parent task.
|
|
60
60
|
*/
|
|
61
|
-
task: () => AsyncGenerator<(() => Promise<
|
|
61
|
+
task: () => AsyncGenerator<(() => Promise<unknown> | TaskBuilder<unknown, TaskTag, unknown>) | (() => TaskBuilder<unknown, TaskTag, unknown>) | TaskBuilder<unknown, TaskTag, unknown> | undefined, TReturn, TInner>;
|
|
62
62
|
/** A cleanup function that gets called when the task is dropped */
|
|
63
63
|
cleanup?: () => Promise<void>;
|
|
64
64
|
}
|
|
@@ -108,6 +108,8 @@ export type TaskStepResult<T, TaskTag extends {
|
|
|
108
108
|
result: T;
|
|
109
109
|
} | {
|
|
110
110
|
newState: TaskState.Active;
|
|
111
|
+
} | {
|
|
112
|
+
newState: TaskState.None;
|
|
111
113
|
} | {
|
|
112
114
|
newState: TaskState.AwaitingPromise;
|
|
113
115
|
promise: Promise<unknown>;
|
|
@@ -136,6 +138,8 @@ export declare class TaskScheduler<TaskTag extends {
|
|
|
136
138
|
queueTask<T>(builder: TaskBuilder<T, TaskTag>): Promise<T>;
|
|
137
139
|
/** Removes/stops tasks matching the given predicate. Returns `true` when a task was removed, `false` otherwise. */
|
|
138
140
|
removeTasks(predicate: (task: Task<unknown, TaskTag>) => boolean, reason?: TError): Promise<boolean>;
|
|
141
|
+
/** Removes a single task from the queue, resets it and rejects its promise */
|
|
142
|
+
private dropTask;
|
|
139
143
|
findTask<T = unknown>(predicate: (task: Task<T, TaskTag>) => boolean): Promise<T> | undefined;
|
|
140
144
|
/** Creates a task that can be executed */
|
|
141
145
|
private createTask;
|
package/build/cjs/Task.js
CHANGED
|
@@ -117,51 +117,47 @@ class TaskScheduler {
|
|
|
117
117
|
/** Removes/stops tasks matching the given predicate. Returns `true` when a task was removed, `false` otherwise. */
|
|
118
118
|
async removeTasks(predicate, reason) {
|
|
119
119
|
const tasksToRemove = [];
|
|
120
|
-
let
|
|
120
|
+
let currentTaskToRemove;
|
|
121
121
|
for (const task of this._tasks) {
|
|
122
122
|
if (predicate(task)) {
|
|
123
123
|
if (task === this._currentTask) {
|
|
124
|
-
|
|
124
|
+
currentTaskToRemove = task;
|
|
125
125
|
} else {
|
|
126
126
|
tasksToRemove.push(task);
|
|
127
127
|
}
|
|
128
128
|
}
|
|
129
129
|
}
|
|
130
|
+
if (currentTaskToRemove) {
|
|
131
|
+
tasksToRemove.push(currentTaskToRemove);
|
|
132
|
+
}
|
|
130
133
|
reason ??= this.defaultErrorFactory();
|
|
131
134
|
for (const task of tasksToRemove) {
|
|
132
|
-
if (this.
|
|
133
|
-
|
|
134
|
-
}
|
|
135
|
-
this._tasks.remove(task);
|
|
136
|
-
if (task.state === TaskState.Active || task.state === TaskState.AwaitingPromise || task.state === TaskState.AwaitingTask) {
|
|
137
|
-
await task.reset().catch(import_utils.noop);
|
|
138
|
-
}
|
|
139
|
-
task.reject(reason);
|
|
140
|
-
if (task.parent) {
|
|
141
|
-
if (this.verbose) {
|
|
142
|
-
console.log(`Restoring parent task: ${getTaskName(task.parent)}`);
|
|
143
|
-
}
|
|
144
|
-
this._tasks.add(task.parent);
|
|
135
|
+
if (this._currentTask !== task && !this._tasks.contains(task)) {
|
|
136
|
+
continue;
|
|
145
137
|
}
|
|
138
|
+
await this.dropTask(task, reason);
|
|
146
139
|
}
|
|
147
|
-
if (
|
|
140
|
+
if (this._continueSignal)
|
|
141
|
+
this._continueSignal.resolve();
|
|
142
|
+
return tasksToRemove.length > 0;
|
|
143
|
+
}
|
|
144
|
+
/** Removes a single task from the queue, resets it and rejects its promise */
|
|
145
|
+
async dropTask(task, reason) {
|
|
146
|
+
if (this.verbose) {
|
|
147
|
+
console.log(`Removing task: ${getTaskName(task)}`);
|
|
148
|
+
}
|
|
149
|
+
this._tasks.remove(task);
|
|
150
|
+
if (this._currentTask === task) {
|
|
151
|
+
this._currentTask = void 0;
|
|
152
|
+
}
|
|
153
|
+
await task.reset().catch(import_utils.noop);
|
|
154
|
+
task.reject(reason);
|
|
155
|
+
if (task.parent) {
|
|
148
156
|
if (this.verbose) {
|
|
149
|
-
console.log(`
|
|
157
|
+
console.log(`Restoring parent task: ${getTaskName(task.parent)}`);
|
|
150
158
|
}
|
|
151
|
-
this._tasks.
|
|
152
|
-
await this._currentTask.reset().catch(import_utils.noop);
|
|
153
|
-
this._currentTask.reject(reason);
|
|
154
|
-
if (this._currentTask.parent) {
|
|
155
|
-
if (this.verbose) {
|
|
156
|
-
console.log(`Restoring parent task: ${getTaskName(this._currentTask.parent)}`);
|
|
157
|
-
}
|
|
158
|
-
this._tasks.add(this._currentTask.parent);
|
|
159
|
-
}
|
|
160
|
-
this._currentTask = void 0;
|
|
159
|
+
this._tasks.add(task.parent);
|
|
161
160
|
}
|
|
162
|
-
if (this._continueSignal)
|
|
163
|
-
this._continueSignal.resolve();
|
|
164
|
-
return tasksToRemove.length > 0 || removeCurrentTask;
|
|
165
161
|
}
|
|
166
162
|
findTask(predicate) {
|
|
167
163
|
return this._tasks.find((t) => predicate(t))?.promise;
|
|
@@ -197,7 +193,18 @@ class TaskScheduler {
|
|
|
197
193
|
}
|
|
198
194
|
generator ??= builder.task();
|
|
199
195
|
state = TaskState.Active;
|
|
200
|
-
const
|
|
196
|
+
const gen = generator;
|
|
197
|
+
let genResult;
|
|
198
|
+
try {
|
|
199
|
+
genResult = waitError ? await gen.throw(waitError) : await gen.next(prevResult);
|
|
200
|
+
} catch (e) {
|
|
201
|
+
if (generator !== gen)
|
|
202
|
+
return { newState: TaskState.None };
|
|
203
|
+
throw e;
|
|
204
|
+
}
|
|
205
|
+
if (generator !== gen)
|
|
206
|
+
return { newState: TaskState.None };
|
|
207
|
+
const { value, done } = genResult;
|
|
201
208
|
prevResult = void 0;
|
|
202
209
|
waitError = void 0;
|
|
203
210
|
if (done) {
|
|
@@ -256,6 +263,8 @@ class TaskScheduler {
|
|
|
256
263
|
state = TaskState.None;
|
|
257
264
|
waitForPromise = void 0;
|
|
258
265
|
generator = void 0;
|
|
266
|
+
prevResult = void 0;
|
|
267
|
+
waitError = void 0;
|
|
259
268
|
await builder.cleanup?.();
|
|
260
269
|
},
|
|
261
270
|
resolve(result) {
|
|
@@ -291,53 +300,60 @@ class TaskScheduler {
|
|
|
291
300
|
this._currentTask = firstTask;
|
|
292
301
|
} else if (this._currentTask !== firstTask && this._currentTask.interrupt !== TaskInterruptBehavior.Forbidden) {
|
|
293
302
|
if (this._currentTask.interrupt === TaskInterruptBehavior.Restart) {
|
|
294
|
-
|
|
303
|
+
const interrupted = this._currentTask;
|
|
304
|
+
await interrupted.reset();
|
|
305
|
+
if (this._currentTask !== interrupted || this._tasks.peekStart() !== firstTask) {
|
|
306
|
+
continue;
|
|
307
|
+
}
|
|
295
308
|
}
|
|
296
309
|
this._currentTask = firstTask;
|
|
297
310
|
}
|
|
311
|
+
const task = this._currentTask;
|
|
298
312
|
if (this.verbose) {
|
|
299
|
-
console.log(`Stepping through task: ${getTaskName(
|
|
313
|
+
console.log(`Stepping through task: ${getTaskName(task)}`);
|
|
300
314
|
}
|
|
301
|
-
const
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
}
|
|
309
|
-
this._tasks.add(this._currentTask.parent);
|
|
315
|
+
const finalizeCurrentTask = /* @__PURE__ */ __name(async () => {
|
|
316
|
+
this._tasks.remove(task);
|
|
317
|
+
this._currentTask = void 0;
|
|
318
|
+
await task.reset();
|
|
319
|
+
if (task.parent) {
|
|
320
|
+
if (this.verbose) {
|
|
321
|
+
console.log(`Restoring parent task: ${getTaskName(task.parent)}`);
|
|
310
322
|
}
|
|
311
|
-
this.
|
|
323
|
+
this._tasks.add(task.parent);
|
|
312
324
|
}
|
|
313
|
-
}, "
|
|
325
|
+
}, "finalizeCurrentTask");
|
|
314
326
|
waitFor = void 0;
|
|
315
327
|
let stepResult;
|
|
316
328
|
try {
|
|
317
|
-
stepResult = await
|
|
329
|
+
stepResult = await task.step();
|
|
318
330
|
} catch (e) {
|
|
331
|
+
if (this._currentTask !== task)
|
|
332
|
+
continue;
|
|
319
333
|
if (this.verbose) {
|
|
320
334
|
console.error(`- Task threw an error:`, e);
|
|
321
335
|
}
|
|
322
|
-
|
|
323
|
-
await
|
|
336
|
+
task.reject(e);
|
|
337
|
+
await finalizeCurrentTask();
|
|
324
338
|
continue;
|
|
325
339
|
}
|
|
340
|
+
if (this._currentTask !== task)
|
|
341
|
+
continue;
|
|
326
342
|
if (stepResult.newState === TaskState.Done) {
|
|
327
343
|
if (this.verbose) {
|
|
328
344
|
console.log(`- Task finished`);
|
|
329
345
|
}
|
|
330
|
-
|
|
331
|
-
await
|
|
346
|
+
task.resolve(stepResult.result);
|
|
347
|
+
await finalizeCurrentTask();
|
|
332
348
|
continue;
|
|
333
349
|
} else if (stepResult.newState === TaskState.AwaitingPromise) {
|
|
334
350
|
if (this.verbose) {
|
|
335
351
|
console.log(`- Task waiting`);
|
|
336
352
|
}
|
|
337
|
-
if (
|
|
338
|
-
this._tasks.remove(
|
|
339
|
-
this._tasks.add(
|
|
340
|
-
if (this._tasks.peekStart() !==
|
|
353
|
+
if (task.interrupt !== TaskInterruptBehavior.Forbidden) {
|
|
354
|
+
this._tasks.remove(task);
|
|
355
|
+
this._tasks.add(task);
|
|
356
|
+
if (this._tasks.peekStart() !== task) {
|
|
341
357
|
if (this.verbose) {
|
|
342
358
|
console.log(`-- Continuing with another task`);
|
|
343
359
|
}
|
|
@@ -350,7 +366,7 @@ class TaskScheduler {
|
|
|
350
366
|
console.log(`- Task spawned a sub-task`);
|
|
351
367
|
}
|
|
352
368
|
this._tasks.add(stepResult.task);
|
|
353
|
-
this._tasks.remove(
|
|
369
|
+
this._tasks.remove(task);
|
|
354
370
|
continue;
|
|
355
371
|
} else {
|
|
356
372
|
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/** 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> {\n\treadonly id: number;\n\treadonly timestamp: number;\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/** 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/** 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\t/** The current state of the task */\n\tget state(): TaskState;\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\ttask: () => AsyncGenerator<\n\t\t| (() => Promise<TInner> | TaskBuilder<TReturn, TaskTag, TInner>)\n\t\t| (() => TaskBuilder<TReturn, TaskTag, TInner>)\n\t\t| TaskBuilder<TReturn, TaskTag, TInner>\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\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, but in reverse order,\n\t\t// so that we handle the current task last.\n\t\tconst tasksToRemove: Task<unknown, TaskTag>[] = [];\n\t\tlet removeCurrentTask = false;\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\tremoveCurrentTask = true;\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\n\t\treason ??= this.defaultErrorFactory();\n\n\t\tfor (const task of tasksToRemove) {\n\t\t\tif (this.verbose) {\n\t\t\t\tconsole.log(`Removing task: ${getTaskName(task)}`);\n\t\t\t}\n\t\t\tthis._tasks.remove(task);\n\t\t\tif (\n\t\t\t\ttask.state === TaskState.Active ||\n\t\t\t\ttask.state === TaskState.AwaitingPromise ||\n\t\t\t\ttask.state === TaskState.AwaitingTask\n\t\t\t) {\n\t\t\t\t// The task is running, clean it up\n\t\t\t\tawait task.reset().catch(noop);\n\t\t\t}\n\t\t\ttask.reject(reason);\n\t\t\t// Re-add the parent task to the list if there is one\n\t\t\tif (task.parent) {\n\t\t\t\tif (this.verbose) {\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t`Restoring parent task: ${getTaskName(task.parent)}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tthis._tasks.add(task.parent);\n\t\t\t}\n\t\t}\n\n\t\tif (removeCurrentTask && this._currentTask) {\n\t\t\tif (this.verbose) {\n\t\t\t\tconsole.log(`Removing task: ${getTaskName(this._currentTask)}`);\n\t\t\t}\n\t\t\tthis._tasks.remove(this._currentTask);\n\t\t\tawait this._currentTask.reset().catch(noop);\n\t\t\tthis._currentTask.reject(reason);\n\t\t\t// Re-add the parent task to the list if there is one\n\t\t\tif (this._currentTask.parent) {\n\t\t\t\tif (this.verbose) {\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t`Restoring parent task: ${getTaskName(\n\t\t\t\t\t\t\tthis._currentTask.parent,\n\t\t\t\t\t\t)}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tthis._tasks.add(this._currentTask.parent);\n\t\t\t}\n\t\t\tthis._currentTask = undefined;\n\t\t}\n\n\t\tif (this._continueSignal) this._continueSignal.resolve();\n\n\t\treturn tasksToRemove.length > 0 || removeCurrentTask;\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\treturn {\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();\n\t\t\t\tstate = TaskState.Active;\n\n\t\t\t\tconst { value, done } = waitError\n\t\t\t\t\t? await generator.throw(waitError)\n\t\t\t\t\t: await generator.next(prevResult);\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\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}\n\n\tpublic start(): void {\n\t\tthis._stopSignal = createDeferredPromise();\n\t\tsetImmediate(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});\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\tawait this._currentTask.reset();\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\tif (this.verbose) {\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t`Stepping through task: ${getTaskName(\n\t\t\t\t\t\t\tthis._currentTask,\n\t\t\t\t\t\t)}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tconst cleanupCurrentTask = async () => {\n\t\t\t\t\tif (this._currentTask) {\n\t\t\t\t\t\tthis._tasks.remove(this._currentTask);\n\t\t\t\t\t\tawait this._currentTask.reset();\n\t\t\t\t\t\t// Re-add the parent task to the list if there is one\n\t\t\t\t\t\tif (this._currentTask.parent) {\n\t\t\t\t\t\t\tif (this.verbose) {\n\t\t\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\t\t`Restoring parent task: ${getTaskName(\n\t\t\t\t\t\t\t\t\t\tthis._currentTask.parent,\n\t\t\t\t\t\t\t\t\t)}`,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tthis._tasks.add(this._currentTask.parent);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis._currentTask = undefined;\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 this._currentTask.step();\n\t\t\t\t} catch (e) {\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\tthis._currentTask.reject(e as Error);\n\t\t\t\t\tawait cleanupCurrentTask();\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\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\tthis._currentTask.resolve(stepResult.result);\n\t\t\t\t\tawait cleanupCurrentTask();\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 (\n\t\t\t\t\t\tthis._currentTask.interrupt !==\n\t\t\t\t\t\tTaskInterruptBehavior.Forbidden\n\t\t\t\t\t) {\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(this._currentTask);\n\t\t\t\t\t\tthis._tasks.add(this._currentTask);\n\n\t\t\t\t\t\tif (this._tasks.peekStart() !== this._currentTask) {\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(this._currentTask);\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, 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;AAwCrD,SAAS,YAAY,MAAmB;AACvC,SAAO,GACN,KAAK,SAAS,KAAK,OAAO,KAAK,UAAU,KAAK,GAAG,MAAM,SACxD,QAAQ,KAAK,EAAE;AAChB;AAJS;AA+CT,SAAS,cAAiB,KAAQ;AACjC,SACC,OAAO,QAAQ,YACf,OAAO,IAAI,SAAS,cACpB,OAAO,IAAI,aAAa;AAE1B;AANS;AAgBT,IAAY;CAAZ,SAAYA,eAAY;AACvB,EAAAA,cAAAA,cAAA,SAAA,IAAA,CAAA,IAAA;AACA,EAAAA,cAAAA,cAAA,MAAA,IAAA,CAAA,IAAA;AACA,EAAAA,cAAAA,cAAA,QAAA,IAAA,CAAA,IAAA;AACA,EAAAA,cAAAA,cAAA,KAAA,IAAA,CAAA,IAAA;AACA,EAAAA,cAAAA,cAAA,OAAA,IAAA,CAAA,IAAA;AACA,EAAAA,cAAAA,cAAA,MAAA,IAAA,CAAA,IAAA;AACD,GAPY,iBAAA,eAAY,CAAA,EAAA;AASxB,IAAY;CAAZ,SAAYC,YAAS;AAEpB,EAAAA,WAAAA,WAAA,MAAA,IAAA,CAAA,IAAA;AAEA,EAAAA,WAAAA,WAAA,QAAA,IAAA,CAAA,IAAA;AAEA,EAAAA,WAAAA,WAAA,iBAAA,IAAA,CAAA,IAAA;AAEA,EAAAA,WAAAA,WAAA,cAAA,IAAA,CAAA,IAAA;AAEA,EAAAA,WAAAA,WAAA,MAAA,IAAA,CAAA,IAAA;AACD,GAXY,cAAA,YAAS,CAAA,EAAA;AAarB,IAAY;CAAZ,SAAYC,wBAAqB;AAEhC,EAAAA,uBAAAA,uBAAA,WAAA,IAAA,CAAA,IAAA;AAEA,EAAAA,uBAAAA,uBAAA,QAAA,IAAA,CAAA,IAAA;AAEA,EAAAA,uBAAAA,uBAAA,SAAA,IAAA,CAAA,IAAA;AACD,GAPY,0BAAA,wBAAqB,CAAA,EAAA;
|
|
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/** 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> {\n\treadonly id: number;\n\treadonly timestamp: number;\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/** 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/** 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\t/** The current state of the task */\n\tget state(): TaskState;\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\ttask: () => 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\treturn {\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();\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}\n\n\tpublic start(): void {\n\t\tthis._stopSignal = createDeferredPromise();\n\t\tsetImmediate(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});\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": "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",
|
|
6
6
|
"names": ["TaskPriority", "TaskState", "TaskInterruptBehavior"]
|
|
7
7
|
}
|
package/build/cjs/index.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
export { type Task, type TaskBuilder, TaskInterruptBehavior, TaskPriority, type TaskReturnType, TaskScheduler, TaskState, type TaskStepResult, type TaskConcurrencyGroup, } from "./Task.js";
|
|
2
|
-
export { waitFor } from "./utils.js";
|
|
2
|
+
export { waitFor, type WaitForReturnType } from "./utils.js";
|
|
3
3
|
//# sourceMappingURL=index.d.ts.map
|
package/build/cjs/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/index.ts"],
|
|
4
|
-
"sourcesContent": ["export {\n\ttype Task,\n\ttype TaskBuilder,\n\tTaskInterruptBehavior,\n\tTaskPriority,\n\ttype TaskReturnType,\n\tTaskScheduler,\n\tTaskState,\n\ttype TaskStepResult,\n\ttype TaskConcurrencyGroup,\n} from \"./Task.js\";\nexport { waitFor } from \"./utils.js\";\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;;;;;;;;;AAAA,kBAUO;AACP,
|
|
4
|
+
"sourcesContent": ["export {\n\ttype Task,\n\ttype TaskBuilder,\n\tTaskInterruptBehavior,\n\tTaskPriority,\n\ttype TaskReturnType,\n\tTaskScheduler,\n\tTaskState,\n\ttype TaskStepResult,\n\ttype TaskConcurrencyGroup,\n} from \"./Task.js\";\nexport { waitFor, type WaitForReturnType } from \"./utils.js\";\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;;;;;;;;;AAAA,kBAUO;AACP,mBAAgD;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/build/cjs/utils.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type TaskBuilder } from "./Task.js";
|
|
1
2
|
/** Returns a timestamp with nano-second precision */
|
|
2
3
|
export declare function highResTimestamp(): number;
|
|
3
4
|
/** Does nothing. Can be used for empty `.catch(...)` calls. */
|
|
@@ -5,5 +6,6 @@ export declare function noop(): void;
|
|
|
5
6
|
export type FnOrStatic<TArgs extends any[], TReturn> = ((...args: TArgs) => TReturn) | TReturn;
|
|
6
7
|
export type ReturnTypeOrStatic<T> = T extends (...args: any[]) => infer R ? R : T;
|
|
7
8
|
export declare function evalOrStatic<T>(fnOrConst: T, ...args: any[]): ReturnTypeOrStatic<T>;
|
|
8
|
-
export
|
|
9
|
+
export type WaitForReturnType<T> = T extends Promise<infer U> ? U : T extends TaskBuilder<infer U> ? U : never;
|
|
10
|
+
export declare function waitFor<T extends Promise<unknown> | TaskBuilder<unknown>>(thing: T): AsyncGenerator<() => T, WaitForReturnType<T>>;
|
|
9
11
|
//# sourceMappingURL=utils.d.ts.map
|
package/build/cjs/utils.js
CHANGED
|
@@ -43,8 +43,8 @@ function evalOrStatic(fnOrConst, ...args) {
|
|
|
43
43
|
return typeof fnOrConst === "function" ? fnOrConst(...args) : fnOrConst;
|
|
44
44
|
}
|
|
45
45
|
__name(evalOrStatic, "evalOrStatic");
|
|
46
|
-
async function* waitFor(
|
|
47
|
-
const result = yield () =>
|
|
46
|
+
async function* waitFor(thing) {
|
|
47
|
+
const result = yield () => thing;
|
|
48
48
|
return result;
|
|
49
49
|
}
|
|
50
50
|
__name(waitFor, "waitFor");
|
package/build/cjs/utils.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/utils.ts"],
|
|
4
|
-
"sourcesContent": ["/** Returns a timestamp with nano-second precision */\nexport function highResTimestamp(): number {\n\tif (typeof process !== \"undefined\") {\n\t\tconst [s, ns] = process.hrtime();\n\t\treturn s * 1e9 + ns;\n\t} else if (performance != undefined) {\n\t\treturn performance.now() * 1e6;\n\t} else {\n\t\tthrow new Error(\"No high-resolution timer available\");\n\t}\n}\n\n/** Does nothing. Can be used for empty `.catch(...)` calls. */\nexport function noop(): void {\n\t// intentionally empty\n}\n\nexport type FnOrStatic<TArgs extends any[], TReturn> =\n\t| ((...args: TArgs) => TReturn)\n\t| TReturn;\n\nexport type ReturnTypeOrStatic<T> = T extends (...args: any[]) => infer R\n\t? R\n\t: T;\n\nexport function evalOrStatic<T>(\n\tfnOrConst: T,\n\t...args: any[]\n): ReturnTypeOrStatic<T> {\n\t// @ts-expect-error https://github.com/microsoft/TypeScript/issues/61337\n\treturn typeof fnOrConst === \"function\" ? fnOrConst(...args) : fnOrConst;\n}\n\nexport async function* waitFor
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;
|
|
4
|
+
"sourcesContent": ["import { type TaskBuilder } from \"./Task.js\";\n\n/** Returns a timestamp with nano-second precision */\nexport function highResTimestamp(): number {\n\tif (typeof process !== \"undefined\") {\n\t\tconst [s, ns] = process.hrtime();\n\t\treturn s * 1e9 + ns;\n\t} else if (performance != undefined) {\n\t\treturn performance.now() * 1e6;\n\t} else {\n\t\tthrow new Error(\"No high-resolution timer available\");\n\t}\n}\n\n/** Does nothing. Can be used for empty `.catch(...)` calls. */\nexport function noop(): void {\n\t// intentionally empty\n}\n\nexport type FnOrStatic<TArgs extends any[], TReturn> =\n\t| ((...args: TArgs) => TReturn)\n\t| TReturn;\n\nexport type ReturnTypeOrStatic<T> = T extends (...args: any[]) => infer R\n\t? R\n\t: T;\n\nexport function evalOrStatic<T>(\n\tfnOrConst: T,\n\t...args: any[]\n): ReturnTypeOrStatic<T> {\n\t// @ts-expect-error https://github.com/microsoft/TypeScript/issues/61337\n\treturn typeof fnOrConst === \"function\" ? fnOrConst(...args) : fnOrConst;\n}\n\nexport type WaitForReturnType<T> =\n\tT extends Promise<infer U> ? U : T extends TaskBuilder<infer U> ? U : never;\n\nexport async function* waitFor<\n\tT extends Promise<unknown> | TaskBuilder<unknown>,\n>(thing: T): AsyncGenerator<() => T, WaitForReturnType<T>> {\n\tconst result = yield () => thing;\n\treturn result;\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;AAEA;;;;;;;;AACM,SAAU,mBAAgB;AAC/B,MAAI,OAAO,YAAY,aAAa;AACnC,UAAM,CAAC,GAAG,EAAE,IAAI,QAAQ,OAAM;AAC9B,WAAO,IAAI,MAAM;EAClB,WAAW,eAAe,QAAW;AACpC,WAAO,YAAY,IAAG,IAAK;EAC5B,OAAO;AACN,UAAM,IAAI,MAAM,oCAAoC;EACrD;AACD;AATgB;AAYV,SAAU,OAAI;AAEpB;AAFgB;AAYV,SAAU,aACf,cACG,MAAW;AAGd,SAAO,OAAO,cAAc,aAAa,UAAU,GAAG,IAAI,IAAI;AAC/D;AANgB;AAWhB,gBAAuB,QAErB,OAAQ;AACT,QAAM,SAAS,MAAM,MAAM;AAC3B,SAAO;AACR;AALuB;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/build/esm/Task.d.ts
CHANGED
|
@@ -58,7 +58,7 @@ export interface TaskBuilder<TReturn, TaskTag extends {
|
|
|
58
58
|
*
|
|
59
59
|
* Yielded Promises should not spawn new tasks. If they do, the spawned tasks MUST have a higher priority than the parent task.
|
|
60
60
|
*/
|
|
61
|
-
task: () => AsyncGenerator<(() => Promise<
|
|
61
|
+
task: () => AsyncGenerator<(() => Promise<unknown> | TaskBuilder<unknown, TaskTag, unknown>) | (() => TaskBuilder<unknown, TaskTag, unknown>) | TaskBuilder<unknown, TaskTag, unknown> | undefined, TReturn, TInner>;
|
|
62
62
|
/** A cleanup function that gets called when the task is dropped */
|
|
63
63
|
cleanup?: () => Promise<void>;
|
|
64
64
|
}
|
|
@@ -108,6 +108,8 @@ export type TaskStepResult<T, TaskTag extends {
|
|
|
108
108
|
result: T;
|
|
109
109
|
} | {
|
|
110
110
|
newState: TaskState.Active;
|
|
111
|
+
} | {
|
|
112
|
+
newState: TaskState.None;
|
|
111
113
|
} | {
|
|
112
114
|
newState: TaskState.AwaitingPromise;
|
|
113
115
|
promise: Promise<unknown>;
|
|
@@ -136,6 +138,8 @@ export declare class TaskScheduler<TaskTag extends {
|
|
|
136
138
|
queueTask<T>(builder: TaskBuilder<T, TaskTag>): Promise<T>;
|
|
137
139
|
/** Removes/stops tasks matching the given predicate. Returns `true` when a task was removed, `false` otherwise. */
|
|
138
140
|
removeTasks(predicate: (task: Task<unknown, TaskTag>) => boolean, reason?: TError): Promise<boolean>;
|
|
141
|
+
/** Removes a single task from the queue, resets it and rejects its promise */
|
|
142
|
+
private dropTask;
|
|
139
143
|
findTask<T = unknown>(predicate: (task: Task<T, TaskTag>) => boolean): Promise<T> | undefined;
|
|
140
144
|
/** Creates a task that can be executed */
|
|
141
145
|
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":"AASA,gEAAgE;AAChE,MAAM,WAAW,IAAI,CACpB,OAAO,EACP,OAAO,SAAS;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,EAC/C,MAAM,SAAS,KAAK,GAAG,KAAK;IAE5B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAEhD,oDAAoD;IACpD,QAAQ,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IAEjD,kCAAkC;IAClC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,kDAAkD;IAClD,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC;IACvB,0BAA0B;IAC1B,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;IAChC,iDAAiD;IACjD,QAAQ,CAAC,KAAK,CAAC,EAAE,oBAAoB,CAAC;IACtC,kDAAkD;IAClD,QAAQ,CAAC,SAAS,EAAE,qBAAqB,CAAC;IAC1C,4FAA4F;IAC5F,IAAI,IAAI,OAAO,CAAC,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;IAClD,iGAAiG;IACjG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,uDAAuD;IACvD,OAAO,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAAC;IAC/B,sDAAsD;IACtD,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,oCAAoC;IACpC,IAAI,KAAK,IAAI,SAAS,CAAC;IAEvB,QAAQ,CAAC,SAAS,EAAE,UAAU,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,SAAS,CAAC;IACzE,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;CACnC;AAQD,4DAA4D;AAC5D,MAAM,WAAW,WAAW,CAC3B,OAAO,EACP,OAAO,SAAS;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,EAC/C,MAAM,GAAG,OAAO;IAEhB,kCAAkC;IAClC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,kDAAkD;IAClD,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,0BAA0B;IAC1B,QAAQ,EAAE,YAAY,CAAC;IACvB,kDAAkD;IAClD,SAAS,CAAC,EAAE,qBAAqB,CAAC;IAClC,iDAAiD;IACjD,KAAK,CAAC,EAAE,oBAAoB,CAAC;IAC7B;;;;;;;;;OASG;IACH,IAAI,EAAE,MAAM,cAAc,CACvB,CAAC,MAAM,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"Task.d.ts","sourceRoot":"","sources":["../../src/Task.ts"],"names":[],"mappings":"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"}
|
package/build/esm/Task.js
CHANGED
|
@@ -115,60 +115,54 @@ export class TaskScheduler {
|
|
|
115
115
|
}
|
|
116
116
|
/** Removes/stops tasks matching the given predicate. Returns `true` when a task was removed, `false` otherwise. */
|
|
117
117
|
async removeTasks(predicate, reason) {
|
|
118
|
-
// Collect tasks that should be removed,
|
|
119
|
-
// so that we handle the current task last.
|
|
118
|
+
// Collect tasks that should be removed, so that we handle the current task last
|
|
120
119
|
const tasksToRemove = [];
|
|
121
|
-
let
|
|
120
|
+
let currentTaskToRemove;
|
|
122
121
|
for (const task of this._tasks) {
|
|
123
122
|
if (predicate(task)) {
|
|
124
123
|
if (task === this._currentTask) {
|
|
125
|
-
|
|
124
|
+
currentTaskToRemove = task;
|
|
126
125
|
}
|
|
127
126
|
else {
|
|
128
127
|
tasksToRemove.push(task);
|
|
129
128
|
}
|
|
130
129
|
}
|
|
131
130
|
}
|
|
131
|
+
if (currentTaskToRemove) {
|
|
132
|
+
tasksToRemove.push(currentTaskToRemove);
|
|
133
|
+
}
|
|
132
134
|
reason ??= this.defaultErrorFactory();
|
|
133
135
|
for (const task of tasksToRemove) {
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
this._tasks.remove(task);
|
|
138
|
-
if (task.state === TaskState.Active ||
|
|
139
|
-
task.state === TaskState.AwaitingPromise ||
|
|
140
|
-
task.state === TaskState.AwaitingTask) {
|
|
141
|
-
// The task is running, clean it up
|
|
142
|
-
await task.reset().catch(noop);
|
|
143
|
-
}
|
|
144
|
-
task.reject(reason);
|
|
145
|
-
// Re-add the parent task to the list if there is one
|
|
146
|
-
if (task.parent) {
|
|
147
|
-
if (this.verbose) {
|
|
148
|
-
console.log(`Restoring parent task: ${getTaskName(task.parent)}`);
|
|
149
|
-
}
|
|
150
|
-
this._tasks.add(task.parent);
|
|
136
|
+
// Skip tasks the run loop finalized during a previous iteration's await
|
|
137
|
+
if (this._currentTask !== task && !this._tasks.contains(task)) {
|
|
138
|
+
continue;
|
|
151
139
|
}
|
|
140
|
+
await this.dropTask(task, reason);
|
|
141
|
+
}
|
|
142
|
+
if (this._continueSignal)
|
|
143
|
+
this._continueSignal.resolve();
|
|
144
|
+
return tasksToRemove.length > 0;
|
|
145
|
+
}
|
|
146
|
+
/** Removes a single task from the queue, resets it and rejects its promise */
|
|
147
|
+
async dropTask(task, reason) {
|
|
148
|
+
if (this.verbose) {
|
|
149
|
+
console.log(`Removing task: ${getTaskName(task)}`);
|
|
150
|
+
}
|
|
151
|
+
this._tasks.remove(task);
|
|
152
|
+
// Claim the task before awaiting anything, so the run loop drops the
|
|
153
|
+
// result of an in-flight step instead of finalizing the task a second time
|
|
154
|
+
if (this._currentTask === task) {
|
|
155
|
+
this._currentTask = undefined;
|
|
152
156
|
}
|
|
153
|
-
|
|
157
|
+
await task.reset().catch(noop);
|
|
158
|
+
task.reject(reason);
|
|
159
|
+
// Re-add the parent task to the list if there is one
|
|
160
|
+
if (task.parent) {
|
|
154
161
|
if (this.verbose) {
|
|
155
|
-
console.log(`
|
|
156
|
-
}
|
|
157
|
-
this._tasks.remove(this._currentTask);
|
|
158
|
-
await this._currentTask.reset().catch(noop);
|
|
159
|
-
this._currentTask.reject(reason);
|
|
160
|
-
// Re-add the parent task to the list if there is one
|
|
161
|
-
if (this._currentTask.parent) {
|
|
162
|
-
if (this.verbose) {
|
|
163
|
-
console.log(`Restoring parent task: ${getTaskName(this._currentTask.parent)}`);
|
|
164
|
-
}
|
|
165
|
-
this._tasks.add(this._currentTask.parent);
|
|
162
|
+
console.log(`Restoring parent task: ${getTaskName(task.parent)}`);
|
|
166
163
|
}
|
|
167
|
-
this.
|
|
164
|
+
this._tasks.add(task.parent);
|
|
168
165
|
}
|
|
169
|
-
if (this._continueSignal)
|
|
170
|
-
this._continueSignal.resolve();
|
|
171
|
-
return tasksToRemove.length > 0 || removeCurrentTask;
|
|
172
166
|
}
|
|
173
167
|
findTask(predicate) {
|
|
174
168
|
return this._tasks.find((t) => predicate(t))?.promise;
|
|
@@ -206,9 +200,25 @@ export class TaskScheduler {
|
|
|
206
200
|
}
|
|
207
201
|
generator ??= builder.task();
|
|
208
202
|
state = TaskState.Active;
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
203
|
+
// Capture the generator so a concurrent reset() can be detected after the await
|
|
204
|
+
const gen = generator;
|
|
205
|
+
let genResult;
|
|
206
|
+
try {
|
|
207
|
+
genResult = waitError
|
|
208
|
+
? await gen.throw(waitError)
|
|
209
|
+
: await gen.next(prevResult);
|
|
210
|
+
}
|
|
211
|
+
catch (e) {
|
|
212
|
+
// Drop errors from a step whose task was reset in the meantime
|
|
213
|
+
if (generator !== gen)
|
|
214
|
+
return { newState: TaskState.None };
|
|
215
|
+
throw e;
|
|
216
|
+
}
|
|
217
|
+
// Drop the step result if the task was reset while the generator was running,
|
|
218
|
+
// so the task state is not corrupted after the reset
|
|
219
|
+
if (generator !== gen)
|
|
220
|
+
return { newState: TaskState.None };
|
|
221
|
+
const { value, done } = genResult;
|
|
212
222
|
prevResult = undefined;
|
|
213
223
|
waitError = undefined;
|
|
214
224
|
if (done) {
|
|
@@ -278,6 +288,8 @@ export class TaskScheduler {
|
|
|
278
288
|
state = TaskState.None;
|
|
279
289
|
waitForPromise = undefined;
|
|
280
290
|
generator = undefined;
|
|
291
|
+
prevResult = undefined;
|
|
292
|
+
waitError = undefined;
|
|
281
293
|
await builder.cleanup?.();
|
|
282
294
|
},
|
|
283
295
|
resolve(result) {
|
|
@@ -321,51 +333,64 @@ export class TaskScheduler {
|
|
|
321
333
|
if (this._currentTask.interrupt ===
|
|
322
334
|
TaskInterruptBehavior.Restart) {
|
|
323
335
|
// The current task needs to be restarted after being interrupted, so reset it
|
|
324
|
-
|
|
336
|
+
const interrupted = this._currentTask;
|
|
337
|
+
await interrupted.reset();
|
|
338
|
+
// Re-evaluate the queue if it changed during the reset
|
|
339
|
+
if (this._currentTask !== interrupted ||
|
|
340
|
+
this._tasks.peekStart() !== firstTask) {
|
|
341
|
+
continue;
|
|
342
|
+
}
|
|
325
343
|
}
|
|
326
344
|
// switch to the new task
|
|
327
345
|
this._currentTask = firstTask;
|
|
328
346
|
}
|
|
347
|
+
// Capture the current task, so concurrent removals can be detected after each await
|
|
348
|
+
const task = this._currentTask;
|
|
329
349
|
if (this.verbose) {
|
|
330
|
-
console.log(`Stepping through task: ${getTaskName(
|
|
350
|
+
console.log(`Stepping through task: ${getTaskName(task)}`);
|
|
331
351
|
}
|
|
332
|
-
const
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
}
|
|
341
|
-
this._tasks.add(this._currentTask.parent);
|
|
352
|
+
const finalizeCurrentTask = async () => {
|
|
353
|
+
this._tasks.remove(task);
|
|
354
|
+
// Claim the task before awaiting, so a concurrent removeTasks() skips it
|
|
355
|
+
this._currentTask = undefined;
|
|
356
|
+
await task.reset();
|
|
357
|
+
// Re-add the parent task to the list if there is one
|
|
358
|
+
if (task.parent) {
|
|
359
|
+
if (this.verbose) {
|
|
360
|
+
console.log(`Restoring parent task: ${getTaskName(task.parent)}`);
|
|
342
361
|
}
|
|
343
|
-
this.
|
|
362
|
+
this._tasks.add(task.parent);
|
|
344
363
|
}
|
|
345
364
|
};
|
|
346
365
|
// Execute the current task one step further
|
|
347
366
|
waitFor = undefined;
|
|
348
367
|
let stepResult;
|
|
349
368
|
try {
|
|
350
|
-
stepResult = await
|
|
369
|
+
stepResult = await task.step();
|
|
351
370
|
}
|
|
352
371
|
catch (e) {
|
|
372
|
+
// Drop the error if the task was removed during the step. It was already rejected.
|
|
373
|
+
if (this._currentTask !== task)
|
|
374
|
+
continue;
|
|
353
375
|
if (this.verbose) {
|
|
354
376
|
console.error(`- Task threw an error:`, e);
|
|
355
377
|
}
|
|
356
378
|
// The task threw an error, expose the result and clean up.
|
|
357
|
-
|
|
358
|
-
await
|
|
379
|
+
task.reject(e);
|
|
380
|
+
await finalizeCurrentTask();
|
|
359
381
|
// Then continue with the next iteration
|
|
360
382
|
continue;
|
|
361
383
|
}
|
|
384
|
+
// Drop the step result if the task was removed during the step. It was already rejected.
|
|
385
|
+
if (this._currentTask !== task)
|
|
386
|
+
continue;
|
|
362
387
|
if (stepResult.newState === TaskState.Done) {
|
|
363
388
|
if (this.verbose) {
|
|
364
389
|
console.log(`- Task finished`);
|
|
365
390
|
}
|
|
366
391
|
// The task is done, clean up
|
|
367
|
-
|
|
368
|
-
await
|
|
392
|
+
task.resolve(stepResult.result);
|
|
393
|
+
await finalizeCurrentTask();
|
|
369
394
|
// Then continue with the next iteration
|
|
370
395
|
continue;
|
|
371
396
|
}
|
|
@@ -375,12 +400,11 @@ export class TaskScheduler {
|
|
|
375
400
|
console.log(`- Task waiting`);
|
|
376
401
|
}
|
|
377
402
|
// If the task may be interrupted, check if there are other same-priority tasks that should be executed instead
|
|
378
|
-
if (
|
|
379
|
-
TaskInterruptBehavior.Forbidden) {
|
|
403
|
+
if (task.interrupt !== TaskInterruptBehavior.Forbidden) {
|
|
380
404
|
// Re-queue the task, so the queue gets reordered
|
|
381
|
-
this._tasks.remove(
|
|
382
|
-
this._tasks.add(
|
|
383
|
-
if (this._tasks.peekStart() !==
|
|
405
|
+
this._tasks.remove(task);
|
|
406
|
+
this._tasks.add(task);
|
|
407
|
+
if (this._tasks.peekStart() !== task) {
|
|
384
408
|
if (this.verbose) {
|
|
385
409
|
console.log(`-- Continuing with another task`);
|
|
386
410
|
}
|
|
@@ -397,12 +421,13 @@ export class TaskScheduler {
|
|
|
397
421
|
console.log(`- Task spawned a sub-task`);
|
|
398
422
|
}
|
|
399
423
|
this._tasks.add(stepResult.task);
|
|
400
|
-
this._tasks.remove(
|
|
424
|
+
this._tasks.remove(task);
|
|
401
425
|
// Continue with the next iteration
|
|
402
426
|
continue;
|
|
403
427
|
}
|
|
404
428
|
else {
|
|
405
|
-
// The current task is not done,
|
|
429
|
+
// The current task is not done, or the step result is stale after a removal.
|
|
430
|
+
// Continue with the next iteration.
|
|
406
431
|
continue;
|
|
407
432
|
}
|
|
408
433
|
}
|
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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"}
|
package/build/esm/index.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
export { type Task, type TaskBuilder, TaskInterruptBehavior, TaskPriority, type TaskReturnType, TaskScheduler, TaskState, type TaskStepResult, type TaskConcurrencyGroup, } from "./Task.js";
|
|
2
|
-
export { waitFor } from "./utils.js";
|
|
2
|
+
export { waitFor, type WaitForReturnType } from "./utils.js";
|
|
3
3
|
//# sourceMappingURL=index.d.ts.map
|
package/build/esm/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,KAAK,IAAI,EACT,KAAK,WAAW,EAChB,qBAAqB,EACrB,YAAY,EACZ,KAAK,cAAc,EACnB,aAAa,EACb,SAAS,EACT,KAAK,cAAc,EACnB,KAAK,oBAAoB,GACzB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,KAAK,IAAI,EACT,KAAK,WAAW,EAChB,qBAAqB,EACrB,YAAY,EACZ,KAAK,cAAc,EACnB,aAAa,EACb,SAAS,EACT,KAAK,cAAc,EACnB,KAAK,oBAAoB,GACzB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,YAAY,CAAC"}
|
package/build/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAGN,qBAAqB,EACrB,YAAY,EAEZ,aAAa,EACb,SAAS,GAGT,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAGN,qBAAqB,EACrB,YAAY,EAEZ,aAAa,EACb,SAAS,GAGT,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,OAAO,EAA0B,MAAM,YAAY,CAAC"}
|
package/build/esm/utils.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type TaskBuilder } from "./Task.js";
|
|
1
2
|
/** Returns a timestamp with nano-second precision */
|
|
2
3
|
export declare function highResTimestamp(): number;
|
|
3
4
|
/** Does nothing. Can be used for empty `.catch(...)` calls. */
|
|
@@ -5,5 +6,6 @@ export declare function noop(): void;
|
|
|
5
6
|
export type FnOrStatic<TArgs extends any[], TReturn> = ((...args: TArgs) => TReturn) | TReturn;
|
|
6
7
|
export type ReturnTypeOrStatic<T> = T extends (...args: any[]) => infer R ? R : T;
|
|
7
8
|
export declare function evalOrStatic<T>(fnOrConst: T, ...args: any[]): ReturnTypeOrStatic<T>;
|
|
8
|
-
export
|
|
9
|
+
export type WaitForReturnType<T> = T extends Promise<infer U> ? U : T extends TaskBuilder<infer U> ? U : never;
|
|
10
|
+
export declare function waitFor<T extends Promise<unknown> | TaskBuilder<unknown>>(thing: T): AsyncGenerator<() => T, WaitForReturnType<T>>;
|
|
9
11
|
//# sourceMappingURL=utils.d.ts.map
|
package/build/esm/utils.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAAA,qDAAqD;AACrD,wBAAgB,gBAAgB,IAAI,MAAM,CASzC;AAED,+DAA+D;AAC/D,wBAAgB,IAAI,IAAI,IAAI,CAE3B;AAED,MAAM,MAAM,UAAU,CAAC,KAAK,SAAS,GAAG,EAAE,EAAE,OAAO,IAChD,CAAC,CAAC,GAAG,IAAI,EAAE,KAAK,KAAK,OAAO,CAAC,GAC7B,OAAO,CAAC;AAEX,MAAM,MAAM,kBAAkB,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,MAAM,CAAC,GACtE,CAAC,GACD,CAAC,CAAC;AAEL,wBAAgB,YAAY,CAAC,CAAC,EAC7B,SAAS,EAAE,CAAC,EACZ,GAAG,IAAI,EAAE,GAAG,EAAE,GACZ,kBAAkB,CAAC,CAAC,CAAC,CAGvB;AAED,
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;AAE7C,qDAAqD;AACrD,wBAAgB,gBAAgB,IAAI,MAAM,CASzC;AAED,+DAA+D;AAC/D,wBAAgB,IAAI,IAAI,IAAI,CAE3B;AAED,MAAM,MAAM,UAAU,CAAC,KAAK,SAAS,GAAG,EAAE,EAAE,OAAO,IAChD,CAAC,CAAC,GAAG,IAAI,EAAE,KAAK,KAAK,OAAO,CAAC,GAC7B,OAAO,CAAC;AAEX,MAAM,MAAM,kBAAkB,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,MAAM,CAAC,GACtE,CAAC,GACD,CAAC,CAAC;AAEL,wBAAgB,YAAY,CAAC,CAAC,EAC7B,SAAS,EAAE,CAAC,EACZ,GAAG,IAAI,EAAE,GAAG,EAAE,GACZ,kBAAkB,CAAC,CAAC,CAAC,CAGvB;AAED,MAAM,MAAM,iBAAiB,CAAC,CAAC,IAC9B,CAAC,SAAS,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,WAAW,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;AAE7E,wBAAuB,OAAO,CAC7B,CAAC,SAAS,OAAO,CAAC,OAAO,CAAC,GAAG,WAAW,CAAC,OAAO,CAAC,EAChD,KAAK,EAAE,CAAC,GAAG,cAAc,CAAC,MAAM,CAAC,EAAE,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAGzD"}
|
package/build/esm/utils.js
CHANGED
|
@@ -19,8 +19,8 @@ export function evalOrStatic(fnOrConst, ...args) {
|
|
|
19
19
|
// @ts-expect-error https://github.com/microsoft/TypeScript/issues/61337
|
|
20
20
|
return typeof fnOrConst === "function" ? fnOrConst(...args) : fnOrConst;
|
|
21
21
|
}
|
|
22
|
-
export async function* waitFor(
|
|
23
|
-
const result = yield () =>
|
|
22
|
+
export async function* waitFor(thing) {
|
|
23
|
+
const result = yield () => thing;
|
|
24
24
|
return result;
|
|
25
25
|
}
|
|
26
26
|
//# sourceMappingURL=utils.js.map
|
package/build/esm/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAEA,qDAAqD;AACrD,MAAM,UAAU,gBAAgB;IAC/B,IAAI,OAAO,OAAO,KAAK,WAAW,EAAE,CAAC;QACpC,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;QACjC,OAAO,CAAC,GAAG,GAAG,GAAG,EAAE,CAAC;IACrB,CAAC;SAAM,IAAI,WAAW,IAAI,SAAS,EAAE,CAAC;QACrC,OAAO,WAAW,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC;IAChC,CAAC;SAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;IACvD,CAAC;AACF,CAAC;AAED,+DAA+D;AAC/D,MAAM,UAAU,IAAI;IACnB,sBAAsB;AACvB,CAAC;AAUD,MAAM,UAAU,YAAY,CAC3B,SAAY,EACZ,GAAG,IAAW;IAEd,wEAAwE;IACxE,OAAO,OAAO,SAAS,KAAK,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACzE,CAAC;AAKD,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,OAAO,CAE5B,KAAQ;IACT,MAAM,MAAM,GAAG,MAAM,GAAG,EAAE,CAAC,KAAK,CAAC;IACjC,OAAO,MAAM,CAAC;AACf,CAAC"}
|
package/package.json
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"access": "public"
|
|
5
5
|
},
|
|
6
6
|
"description": "A cooperative task scheduler based on generator functions",
|
|
7
|
-
"version": "1.2.
|
|
7
|
+
"version": "1.2.2",
|
|
8
8
|
"license": "MIT",
|
|
9
9
|
"type": "module",
|
|
10
10
|
"module": "build/index.js",
|
|
@@ -25,17 +25,17 @@
|
|
|
25
25
|
"release": "release-script"
|
|
26
26
|
},
|
|
27
27
|
"devDependencies": {
|
|
28
|
-
"@alcalzone/esm2cjs": "^1.4.
|
|
29
|
-
"@alcalzone/release-script": "^
|
|
30
|
-
"@alcalzone/release-script-plugin-license": "^
|
|
31
|
-
"@tsconfig/node20": "^20.1.
|
|
32
|
-
"@types/node": "^20.
|
|
28
|
+
"@alcalzone/esm2cjs": "^1.4.2",
|
|
29
|
+
"@alcalzone/release-script": "^5.2.1",
|
|
30
|
+
"@alcalzone/release-script-plugin-license": "^5.2.0",
|
|
31
|
+
"@tsconfig/node20": "^20.1.9",
|
|
32
|
+
"@types/node": "^20.19.43",
|
|
33
33
|
"prettier": "^3.5.3",
|
|
34
34
|
"typescript": "^5.8.3",
|
|
35
|
-
"vitest": "^
|
|
35
|
+
"vitest": "^4.1.9"
|
|
36
36
|
},
|
|
37
37
|
"dependencies": {
|
|
38
38
|
"alcalzone-shared": "^5.0.0"
|
|
39
39
|
},
|
|
40
|
-
"packageManager": "yarn@4.
|
|
40
|
+
"packageManager": "yarn@4.10.3"
|
|
41
41
|
}
|