@zwave-js/waddle 1.0.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -211,7 +211,39 @@ async function* fetchResourcesTask() {
211
211
  }
212
212
  ```
213
213
 
214
- When using TypeScript, you may need to assert the return type due to limits in type inference in generator functions:
214
+ When using TypeScript, you will likely hit limits in type inference in generator functions:
215
+
216
+ ```ts
217
+ async function* fetchResourcesTask() {
218
+ // async function doLongRunningWork1(): Promise<string> { ... }
219
+ const result1 = yield () => doLongRunningWork1(); // unknown ⚠️
220
+ // async function doLongRunningWork2(): Promise<number> { ... }
221
+ const result2 = yield () => doLongRunningWork2(); // unknown ⚠️
222
+ // async function doLongRunningWork3(): Promise<boolean> { ... }
223
+ const result3 = yield () => doLongRunningWork3(); // unknown ⚠️
224
+
225
+ // ...
226
+ }
227
+ ```
228
+
229
+ To help mitigate this, we recommend using the `waitFor` utility function together with `yield*` instead. Note that this expects a Promise, not a function!
230
+
231
+ ```ts
232
+ import { waitFor } from "@zwave-js/waddle";
233
+
234
+ async function* fetchResourcesTask() {
235
+ // async function doLongRunningWork1(): Promise<string> { ... }
236
+ const result1 = yield* waitFor(doLongRunningWork1()); // string ✅
237
+ // async function doLongRunningWork2(): Promise<number> { ... }
238
+ const result2 = yield* waitFor(doLongRunningWork2()); // number ✅
239
+ // async function doLongRunningWork3(): Promise<boolean> { ... }
240
+ const result3 = yield* waitFor(doLongRunningWork3()); // boolean ✅
241
+
242
+ // ...
243
+ }
244
+ ```
245
+
246
+ Alternatively, you can assert the return type manually, but this is not type-safe:
215
247
 
216
248
  ```ts
217
249
  async function* fetchResourcesTask() {
@@ -309,6 +341,36 @@ const task = scheduler.queueTask({
309
341
 
310
342
  This task will yield to the scheduler at each `yield` point in the `task1` and `task2` functions, just as if they were all in the same function.
311
343
 
344
+ #### Task Concurrency Groups
345
+
346
+ By default, tasks are interleaved with other tasks when they wait for a Promise or task to be fulfilled. In some situations it may be desirable for a task to finish before another related task is allowed to run. Concurrency groups can be used to achieve this. They take precedence over task priorities, so tasks in the same concurrency group will not be interleaved with each other, even if a pending task has a higher priority. High-priority tasks outside the concurrency group will still interrupt lower-priority tasks in the group.
347
+
348
+ To use concurrency groups, specify the `group` property in the task builder:
349
+
350
+ ```ts
351
+ const task1 = scheduler.queueTask({
352
+ priority: TaskPriority.Normal,
353
+ group: {
354
+ id: "my-concurrency-group",
355
+ },
356
+ task: async function* () {
357
+ // ...
358
+ },
359
+ });
360
+
361
+ const task2 = scheduler.queueTask({
362
+ priority: TaskPriority.Normal,
363
+ group: {
364
+ id: "my-concurrency-group",
365
+ },
366
+ task: async function* () {
367
+ // ...
368
+ },
369
+ });
370
+ ```
371
+
372
+ In this example, `task1` will finish before `task2` is allowed to run, even if `task1` needs to wait for something external.
373
+
312
374
  #### Error handling
313
375
 
314
376
  If a task throws an error, the scheduler will catch it and reject the `Promise` returned by `queueTask`. The error can be handled like any other Promise:
@@ -419,6 +481,13 @@ const scheduler = new TaskScheduler(() => new Error("We are all doomed!"));
419
481
  ```
420
482
 
421
483
  ## Changelog
484
+ ### 1.2.0 (2025-06-24)
485
+
486
+ - Add utility method `waitFor` for type-safe yielding of Promises
487
+
488
+ ### 1.1.0 (2025-06-24)
489
+
490
+ - Add support for task concurrency groups, preventing interleaving related tasks
422
491
 
423
492
  ### 1.0.0 (2025-05-16)
424
493
 
@@ -15,6 +15,8 @@ export interface Task<TReturn, TaskTag extends {
15
15
  readonly tag?: TaskTag;
16
16
  /** The task's priority */
17
17
  readonly priority: TaskPriority;
18
+ /** The concurrency group this task belongs to */
19
+ readonly group?: TaskConcurrencyGroup;
18
20
  /** How the task should behave when interrupted */
19
21
  readonly interrupt: TaskInterruptBehavior;
20
22
  /** Starts the task it if hasn't been started yet, and executes the next step of the task */
@@ -44,6 +46,8 @@ export interface TaskBuilder<TReturn, TaskTag extends {
44
46
  priority: TaskPriority;
45
47
  /** How the task should behave when interrupted */
46
48
  interrupt?: TaskInterruptBehavior;
49
+ /** The concurrency group this task belongs to */
50
+ group?: TaskConcurrencyGroup;
47
51
  /**
48
52
  * The task's main generator function. This is called repeatedly until it's done.
49
53
  * The function must yield at points where it may be interrupted.
@@ -111,6 +115,10 @@ export type TaskStepResult<T, TaskTag extends {
111
115
  newState: TaskState.AwaitingTask;
112
116
  task: Task<unknown, TaskTag>;
113
117
  };
118
+ /** Identifies a concurrency group. Tasks within the same group cannot run concurrently. */
119
+ export interface TaskConcurrencyGroup {
120
+ id: string;
121
+ }
114
122
  export declare class TaskScheduler<TaskTag extends {
115
123
  id: string;
116
124
  } = {
package/build/cjs/Task.js CHANGED
@@ -61,6 +61,16 @@ var TaskInterruptBehavior;
61
61
  TaskInterruptBehavior2[TaskInterruptBehavior2["Restart"] = 2] = "Restart";
62
62
  })(TaskInterruptBehavior || (TaskInterruptBehavior = {}));
63
63
  function compareTasks(a, b) {
64
+ const aConcurrencyGroup = a.group?.id;
65
+ const bConcurrencyGroup = b.group?.id;
66
+ if (aConcurrencyGroup && bConcurrencyGroup && aConcurrencyGroup === bConcurrencyGroup) {
67
+ const aActiveOrWaiting = a.state === TaskState.Active || a.state === TaskState.AwaitingPromise || a.state === TaskState.AwaitingTask;
68
+ const bActiveOrWaiting = b.state === TaskState.Active || b.state === TaskState.AwaitingPromise || b.state === TaskState.AwaitingTask;
69
+ if (aActiveOrWaiting && !bActiveOrWaiting)
70
+ return 1;
71
+ if (!aActiveOrWaiting && bActiveOrWaiting)
72
+ return -1;
73
+ }
64
74
  if (a.priority < b.priority)
65
75
  return 1;
66
76
  if (a.priority > b.priority)
@@ -173,6 +183,7 @@ class TaskScheduler {
173
183
  name: builder.name,
174
184
  tag: builder.tag,
175
185
  priority: builder.priority,
186
+ group: builder.group,
176
187
  interrupt: builder.interrupt ?? TaskInterruptBehavior.Resume,
177
188
  promise,
178
189
  async step() {
@@ -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/** 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/**\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\nfunction compareTasks<T1, T2>(a: Task<T1>, b: Task<T2>): CompareResult {\n\t// Sort by priority first. Higher priority goes to the end of the list\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\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<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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",
6
6
  "names": ["TaskPriority", "TaskState", "TaskInterruptBehavior"]
7
7
  }
@@ -1,2 +1,3 @@
1
- export { Task, TaskBuilder, TaskInterruptBehavior, TaskPriority, TaskReturnType, TaskScheduler, TaskState, TaskStepResult, } from "./Task.js";
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
3
  //# sourceMappingURL=index.d.ts.map
@@ -21,15 +21,18 @@ __export(index_exports, {
21
21
  TaskInterruptBehavior: () => import_Task.TaskInterruptBehavior,
22
22
  TaskPriority: () => import_Task.TaskPriority,
23
23
  TaskScheduler: () => import_Task.TaskScheduler,
24
- TaskState: () => import_Task.TaskState
24
+ TaskState: () => import_Task.TaskState,
25
+ waitFor: () => import_utils.waitFor
25
26
  });
26
27
  module.exports = __toCommonJS(index_exports);
27
28
  var import_Task = require("./Task.js");
29
+ var import_utils = require("./utils.js");
28
30
  // Annotate the CommonJS export names for ESM import in node:
29
31
  0 && (module.exports = {
30
32
  TaskInterruptBehavior,
31
33
  TaskPriority,
32
34
  TaskScheduler,
33
- TaskState
35
+ TaskState,
36
+ waitFor
34
37
  });
35
38
  //# sourceMappingURL=index.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/index.ts"],
4
- "sourcesContent": ["export {\n\tTask,\n\tTaskBuilder,\n\tTaskInterruptBehavior,\n\tTaskPriority,\n\tTaskReturnType,\n\tTaskScheduler,\n\tTaskState,\n\tTaskStepResult,\n} from \"./Task.js\";\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;AAAA;;;;;;;;AAAA,kBASO;",
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;",
6
6
  "names": []
7
7
  }
@@ -5,4 +5,5 @@ export declare function noop(): void;
5
5
  export type FnOrStatic<TArgs extends any[], TReturn> = ((...args: TArgs) => TReturn) | TReturn;
6
6
  export type ReturnTypeOrStatic<T> = T extends (...args: any[]) => infer R ? R : T;
7
7
  export declare function evalOrStatic<T>(fnOrConst: T, ...args: any[]): ReturnTypeOrStatic<T>;
8
+ export declare function waitFor<T>(promise: Promise<T>): AsyncGenerator<() => Promise<T>, T>;
8
9
  //# sourceMappingURL=utils.d.ts.map
@@ -21,7 +21,8 @@ var utils_exports = {};
21
21
  __export(utils_exports, {
22
22
  evalOrStatic: () => evalOrStatic,
23
23
  highResTimestamp: () => highResTimestamp,
24
- noop: () => noop
24
+ noop: () => noop,
25
+ waitFor: () => waitFor
25
26
  });
26
27
  module.exports = __toCommonJS(utils_exports);
27
28
  function highResTimestamp() {
@@ -42,10 +43,16 @@ function evalOrStatic(fnOrConst, ...args) {
42
43
  return typeof fnOrConst === "function" ? fnOrConst(...args) : fnOrConst;
43
44
  }
44
45
  __name(evalOrStatic, "evalOrStatic");
46
+ async function* waitFor(promise) {
47
+ const result = yield () => promise;
48
+ return result;
49
+ }
50
+ __name(waitFor, "waitFor");
45
51
  // Annotate the CommonJS export names for ESM import in node:
46
52
  0 && (module.exports = {
47
53
  evalOrStatic,
48
54
  highResTimestamp,
49
- noop
55
+ noop,
56
+ waitFor
50
57
  });
51
58
  //# sourceMappingURL=utils.js.map
@@ -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 ? 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"],
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;AAWV,SAAU,aACf,cACG,MAAW;AAGd,SAAO,OAAO,cAAc,aAAa,UAAU,GAAG,IAAI,IAAI;AAC/D;AANgB;",
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;",
6
6
  "names": []
7
7
  }
@@ -15,6 +15,8 @@ export interface Task<TReturn, TaskTag extends {
15
15
  readonly tag?: TaskTag;
16
16
  /** The task's priority */
17
17
  readonly priority: TaskPriority;
18
+ /** The concurrency group this task belongs to */
19
+ readonly group?: TaskConcurrencyGroup;
18
20
  /** How the task should behave when interrupted */
19
21
  readonly interrupt: TaskInterruptBehavior;
20
22
  /** Starts the task it if hasn't been started yet, and executes the next step of the task */
@@ -44,6 +46,8 @@ export interface TaskBuilder<TReturn, TaskTag extends {
44
46
  priority: TaskPriority;
45
47
  /** How the task should behave when interrupted */
46
48
  interrupt?: TaskInterruptBehavior;
49
+ /** The concurrency group this task belongs to */
50
+ group?: TaskConcurrencyGroup;
47
51
  /**
48
52
  * The task's main generator function. This is called repeatedly until it's done.
49
53
  * The function must yield at points where it may be interrupted.
@@ -111,6 +115,10 @@ export type TaskStepResult<T, TaskTag extends {
111
115
  newState: TaskState.AwaitingTask;
112
116
  task: Task<unknown, TaskTag>;
113
117
  };
118
+ /** Identifies a concurrency group. Tasks within the same group cannot run concurrently. */
119
+ export interface TaskConcurrencyGroup {
120
+ id: string;
121
+ }
114
122
  export declare class TaskScheduler<TaskTag extends {
115
123
  id: string;
116
124
  } = {
@@ -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
@@ -50,7 +50,25 @@ export var TaskInterruptBehavior;
50
50
  TaskInterruptBehavior[TaskInterruptBehavior["Restart"] = 2] = "Restart";
51
51
  })(TaskInterruptBehavior || (TaskInterruptBehavior = {}));
52
52
  function compareTasks(a, b) {
53
- // Sort by priority first. Higher priority goes to the end of the list
53
+ // In the same concurrency group, only one task may be active at a time.
54
+ const aConcurrencyGroup = a.group?.id;
55
+ const bConcurrencyGroup = b.group?.id;
56
+ if (aConcurrencyGroup &&
57
+ bConcurrencyGroup &&
58
+ aConcurrencyGroup === bConcurrencyGroup) {
59
+ const aActiveOrWaiting = a.state === TaskState.Active ||
60
+ a.state === TaskState.AwaitingPromise ||
61
+ a.state === TaskState.AwaitingTask;
62
+ const bActiveOrWaiting = b.state === TaskState.Active ||
63
+ b.state === TaskState.AwaitingPromise ||
64
+ b.state === TaskState.AwaitingTask;
65
+ if (aActiveOrWaiting && !bActiveOrWaiting)
66
+ return 1; // A is already active
67
+ if (!aActiveOrWaiting && bActiveOrWaiting)
68
+ return -1; // B is already active
69
+ // None of the tasks is active, fall back to default sorting
70
+ }
71
+ // Sort by priority for tasks not in the same concurrency group
54
72
  if (a.priority < b.priority)
55
73
  return 1;
56
74
  if (a.priority > b.priority)
@@ -172,6 +190,7 @@ export class TaskScheduler {
172
190
  name: builder.name,
173
191
  tag: builder.tag,
174
192
  priority: builder.priority,
193
+ group: builder.group,
175
194
  interrupt: builder.interrupt ?? TaskInterruptBehavior.Resume,
176
195
  promise,
177
196
  async step() {
@@ -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,2 +1,3 @@
1
- export { Task, TaskBuilder, TaskInterruptBehavior, TaskPriority, TaskReturnType, TaskScheduler, TaskState, TaskStepResult, } from "./Task.js";
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
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,IAAI,EACJ,WAAW,EACX,qBAAqB,EACrB,YAAY,EACZ,cAAc,EACd,aAAa,EACb,SAAS,EACT,cAAc,GACd,MAAM,WAAW,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,MAAM,YAAY,CAAC"}
@@ -1,2 +1,3 @@
1
1
  export { TaskInterruptBehavior, TaskPriority, TaskScheduler, TaskState, } from "./Task.js";
2
+ export { waitFor } from "./utils.js";
2
3
  //# sourceMappingURL=index.js.map
@@ -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,GAET,MAAM,WAAW,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,EAAE,MAAM,YAAY,CAAC"}
@@ -5,4 +5,5 @@ export declare function noop(): void;
5
5
  export type FnOrStatic<TArgs extends any[], TReturn> = ((...args: TArgs) => TReturn) | TReturn;
6
6
  export type ReturnTypeOrStatic<T> = T extends (...args: any[]) => infer R ? R : T;
7
7
  export declare function evalOrStatic<T>(fnOrConst: T, ...args: any[]): ReturnTypeOrStatic<T>;
8
+ export declare function waitFor<T>(promise: Promise<T>): AsyncGenerator<() => Promise<T>, T>;
8
9
  //# 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,GAAG,CAAC,GAC1E,CAAC,CAAC;AAEL,wBAAgB,YAAY,CAAC,CAAC,EAC7B,SAAS,EAAE,CAAC,EACZ,GAAG,IAAI,EAAE,GAAG,EAAE,GACZ,kBAAkB,CAAC,CAAC,CAAC,CAGvB"}
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"}
@@ -19,4 +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;
24
+ return result;
25
+ }
22
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;AASD,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"}
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"}
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.0.0",
7
+ "version": "1.2.0",
8
8
  "license": "MIT",
9
9
  "type": "module",
10
10
  "module": "build/index.js",