@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 CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2025 AlCalzone
3
+ Copyright (c) 2025-2026 AlCalzone
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
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
@@ -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<TInner> | TaskBuilder<TReturn, TaskTag, TInner>) | (() => TaskBuilder<TReturn, TaskTag, TInner>) | TaskBuilder<TReturn, TaskTag, TInner> | undefined, TReturn, TInner>;
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 removeCurrentTask = false;
120
+ let currentTaskToRemove;
121
121
  for (const task of this._tasks) {
122
122
  if (predicate(task)) {
123
123
  if (task === this._currentTask) {
124
- removeCurrentTask = true;
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.verbose) {
133
- console.log(`Removing task: ${getTaskName(task)}`);
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 (removeCurrentTask && this._currentTask) {
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(`Removing task: ${getTaskName(this._currentTask)}`);
157
+ console.log(`Restoring parent task: ${getTaskName(task.parent)}`);
150
158
  }
151
- this._tasks.remove(this._currentTask);
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 { value, done } = waitError ? await generator.throw(waitError) : await generator.next(prevResult);
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
- await this._currentTask.reset();
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(this._currentTask)}`);
313
+ console.log(`Stepping through task: ${getTaskName(task)}`);
300
314
  }
301
- const cleanupCurrentTask = /* @__PURE__ */ __name(async () => {
302
- if (this._currentTask) {
303
- this._tasks.remove(this._currentTask);
304
- await this._currentTask.reset();
305
- if (this._currentTask.parent) {
306
- if (this.verbose) {
307
- console.log(`Restoring parent task: ${getTaskName(this._currentTask.parent)}`);
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._currentTask = void 0;
323
+ this._tasks.add(task.parent);
312
324
  }
313
- }, "cleanupCurrentTask");
325
+ }, "finalizeCurrentTask");
314
326
  waitFor = void 0;
315
327
  let stepResult;
316
328
  try {
317
- stepResult = await this._currentTask.step();
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
- this._currentTask.reject(e);
323
- await cleanupCurrentTask();
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
- this._currentTask.resolve(stepResult.result);
331
- await cleanupCurrentTask();
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 (this._currentTask.interrupt !== TaskInterruptBehavior.Forbidden) {
338
- this._tasks.remove(this._currentTask);
339
- this._tasks.add(this._currentTask);
340
- if (this._tasks.peekStart() !== this._currentTask) {
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(this._currentTask);
369
+ this._tasks.remove(task);
354
370
  continue;
355
371
  } else {
356
372
  continue;
@@ -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": "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",
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
  }
@@ -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
@@ -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,mBAAwB;",
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
  }
@@ -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 declare function waitFor<T>(promise: Promise<T>): AsyncGenerator<() => Promise<T>, T>;
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
@@ -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(promise) {
47
- const result = yield () => promise;
46
+ async function* waitFor(thing) {
47
+ const result = yield () => thing;
48
48
  return result;
49
49
  }
50
50
  __name(waitFor, "waitFor");
@@ -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<T>(\n\tpromise: Promise<T>,\n): AsyncGenerator<() => Promise<T>, T> {\n\tconst result = yield () => promise;\n\treturn result;\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;AAAA;;;;;;;;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;AAQhB,gBAAuB,QACtB,SAAmB;AAEnB,QAAM,SAAS,MAAM,MAAM;AAC3B,SAAO;AACR;AALuB;",
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
  }
@@ -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<TInner> | TaskBuilder<TReturn, TaskTag, TInner>) | (() => TaskBuilder<TReturn, TaskTag, TInner>) | TaskBuilder<TReturn, TaskTag, TInner> | undefined, TReturn, TInner>;
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;
@@ -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
@@ -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, but in reverse order,
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 removeCurrentTask = false;
120
+ let currentTaskToRemove;
122
121
  for (const task of this._tasks) {
123
122
  if (predicate(task)) {
124
123
  if (task === this._currentTask) {
125
- removeCurrentTask = true;
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
- if (this.verbose) {
135
- console.log(`Removing task: ${getTaskName(task)}`);
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
- if (removeCurrentTask && this._currentTask) {
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(`Removing task: ${getTaskName(this._currentTask)}`);
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._currentTask = undefined;
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
- const { value, done } = waitError
210
- ? await generator.throw(waitError)
211
- : await generator.next(prevResult);
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
- await this._currentTask.reset();
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(this._currentTask)}`);
350
+ console.log(`Stepping through task: ${getTaskName(task)}`);
331
351
  }
332
- const cleanupCurrentTask = async () => {
333
- if (this._currentTask) {
334
- this._tasks.remove(this._currentTask);
335
- await this._currentTask.reset();
336
- // Re-add the parent task to the list if there is one
337
- if (this._currentTask.parent) {
338
- if (this.verbose) {
339
- console.log(`Restoring parent task: ${getTaskName(this._currentTask.parent)}`);
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._currentTask = undefined;
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 this._currentTask.step();
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
- this._currentTask.reject(e);
358
- await cleanupCurrentTask();
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
- this._currentTask.resolve(stepResult.result);
368
- await cleanupCurrentTask();
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 (this._currentTask.interrupt !==
379
- TaskInterruptBehavior.Forbidden) {
403
+ if (task.interrupt !== TaskInterruptBehavior.Forbidden) {
380
404
  // Re-queue the task, so the queue gets reordered
381
- this._tasks.remove(this._currentTask);
382
- this._tasks.add(this._currentTask);
383
- if (this._tasks.peekStart() !== this._currentTask) {
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(this._currentTask);
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, continue with the next iteration
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
  }
@@ -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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"}
@@ -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
@@ -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"}
@@ -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,EAAE,MAAM,YAAY,CAAC"}
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"}
@@ -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 declare function waitFor<T>(promise: Promise<T>): AsyncGenerator<() => Promise<T>, T>;
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
@@ -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,wBAAuB,OAAO,CAAC,CAAC,EAC/B,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,GACjB,cAAc,CAAC,MAAM,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAGrC"}
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"}
@@ -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(promise) {
23
- const result = yield () => promise;
22
+ export async function* waitFor(thing) {
23
+ const result = yield () => thing;
24
24
  return result;
25
25
  }
26
26
  //# sourceMappingURL=utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAAA,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;AAED,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,OAAO,CAC7B,OAAmB;IAEnB,MAAM,MAAM,GAAG,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC;IACnC,OAAO,MAAM,CAAC;AACf,CAAC"}
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.0",
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.1",
29
- "@alcalzone/release-script": "^3.8.0",
30
- "@alcalzone/release-script-plugin-license": "^3.7.0",
31
- "@tsconfig/node20": "^20.1.5",
32
- "@types/node": "^20.17.47",
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": "^3.1.3"
35
+ "vitest": "^4.1.9"
36
36
  },
37
37
  "dependencies": {
38
38
  "alcalzone-shared": "^5.0.0"
39
39
  },
40
- "packageManager": "yarn@4.6.0"
40
+ "packageManager": "yarn@4.10.3"
41
41
  }