@push.rocks/taskbuffer 3.1.10 → 3.4.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.
Files changed (66) hide show
  1. package/LICENSE +1 -1
  2. package/dist_ts/00_commitinfo_data.js +2 -2
  3. package/dist_ts/index.d.ts +4 -1
  4. package/dist_ts/index.js +3 -1
  5. package/dist_ts/taskbuffer.classes.task.d.ts +43 -9
  6. package/dist_ts/taskbuffer.classes.task.js +105 -1
  7. package/dist_ts/taskbuffer.classes.taskmanager.d.ts +23 -6
  8. package/dist_ts/taskbuffer.classes.taskmanager.js +98 -1
  9. package/dist_ts/taskbuffer.classes.taskstep.d.ts +27 -0
  10. package/dist_ts/taskbuffer.classes.taskstep.js +37 -0
  11. package/dist_ts/taskbuffer.interfaces.d.ts +36 -0
  12. package/dist_ts/taskbuffer.interfaces.js +2 -0
  13. package/dist_ts_web/00_commitinfo_data.d.ts +8 -0
  14. package/dist_ts_web/00_commitinfo_data.js +9 -0
  15. package/dist_ts_web/ts/index.d.ts +13 -0
  16. package/dist_ts_web/ts/index.js +12 -0
  17. package/dist_ts_web/ts/taskbuffer.classes.bufferrunner.d.ts +8 -0
  18. package/dist_ts_web/ts/taskbuffer.classes.bufferrunner.js +28 -0
  19. package/dist_ts_web/ts/taskbuffer.classes.cyclecounter.d.ts +13 -0
  20. package/dist_ts_web/ts/taskbuffer.classes.cyclecounter.js +31 -0
  21. package/dist_ts_web/ts/taskbuffer.classes.distributedcoordinator.d.ts +27 -0
  22. package/dist_ts_web/ts/taskbuffer.classes.distributedcoordinator.js +5 -0
  23. package/dist_ts_web/ts/taskbuffer.classes.task.d.ts +86 -0
  24. package/dist_ts_web/ts/taskbuffer.classes.task.js +257 -0
  25. package/dist_ts_web/ts/taskbuffer.classes.taskchain.d.ts +14 -0
  26. package/dist_ts_web/ts/taskbuffer.classes.taskchain.js +51 -0
  27. package/dist_ts_web/ts/taskbuffer.classes.taskdebounced.d.ts +10 -0
  28. package/dist_ts_web/ts/taskbuffer.classes.taskdebounced.js +20 -0
  29. package/dist_ts_web/ts/taskbuffer.classes.taskmanager.d.ts +49 -0
  30. package/dist_ts_web/ts/taskbuffer.classes.taskmanager.js +208 -0
  31. package/dist_ts_web/ts/taskbuffer.classes.taskonce.d.ts +11 -0
  32. package/dist_ts_web/ts/taskbuffer.classes.taskonce.js +20 -0
  33. package/dist_ts_web/ts/taskbuffer.classes.taskparallel.d.ts +7 -0
  34. package/dist_ts_web/ts/taskbuffer.classes.taskparallel.js +23 -0
  35. package/dist_ts_web/ts/taskbuffer.classes.taskrunner.d.ts +30 -0
  36. package/dist_ts_web/ts/taskbuffer.classes.taskrunner.js +54 -0
  37. package/dist_ts_web/ts/taskbuffer.classes.taskstep.d.ts +27 -0
  38. package/dist_ts_web/ts/taskbuffer.classes.taskstep.js +37 -0
  39. package/dist_ts_web/ts/taskbuffer.interfaces.d.ts +36 -0
  40. package/dist_ts_web/ts/taskbuffer.interfaces.js +2 -0
  41. package/dist_ts_web/ts/taskbuffer.logging.d.ts +2 -0
  42. package/dist_ts_web/ts/taskbuffer.logging.js +3 -0
  43. package/dist_ts_web/ts/taskbuffer.plugins.d.ts +8 -0
  44. package/dist_ts_web/ts/taskbuffer.plugins.js +9 -0
  45. package/dist_ts_web/ts_web/00_commitinfo_data.d.ts +8 -0
  46. package/dist_ts_web/ts_web/00_commitinfo_data.js +9 -0
  47. package/dist_ts_web/ts_web/demorunner.d.ts +1 -0
  48. package/dist_ts_web/ts_web/demorunner.js +33 -0
  49. package/dist_ts_web/ts_web/elements/taskbuffer-dashboard.demo.d.ts +2 -0
  50. package/dist_ts_web/ts_web/elements/taskbuffer-dashboard.demo.js +285 -0
  51. package/dist_ts_web/ts_web/index.d.ts +2 -0
  52. package/dist_ts_web/ts_web/index.js +3 -0
  53. package/dist_ts_web/ts_web/taskbuffer-dashboard.d.ts +24 -0
  54. package/dist_ts_web/ts_web/taskbuffer-dashboard.js +557 -0
  55. package/package.json +6 -5
  56. package/readme.md +421 -643
  57. package/ts/00_commitinfo_data.ts +1 -1
  58. package/ts/index.ts +9 -1
  59. package/ts/taskbuffer.classes.task.ts +145 -18
  60. package/ts/taskbuffer.classes.taskmanager.ts +129 -9
  61. package/ts/taskbuffer.classes.taskstep.ts +57 -0
  62. package/ts/taskbuffer.interfaces.ts +39 -0
  63. package/ts_web/00_commitinfo_data.ts +8 -0
  64. package/ts_web/elements/taskbuffer-dashboard.demo.ts +311 -0
  65. package/ts_web/index.ts +12 -0
  66. package/ts_web/taskbuffer-dashboard.ts +541 -0
@@ -0,0 +1,12 @@
1
+ export { Task } from './taskbuffer.classes.task.js';
2
+ export { Taskchain } from './taskbuffer.classes.taskchain.js';
3
+ export { Taskparallel } from './taskbuffer.classes.taskparallel.js';
4
+ export { TaskManager } from './taskbuffer.classes.taskmanager.js';
5
+ export { TaskOnce } from './taskbuffer.classes.taskonce.js';
6
+ export { TaskRunner } from './taskbuffer.classes.taskrunner.js';
7
+ export { TaskDebounced } from './taskbuffer.classes.taskdebounced.js';
8
+ // Task step system
9
+ export { TaskStep } from './taskbuffer.classes.taskstep.js';
10
+ import * as distributedCoordination from './taskbuffer.classes.distributedcoordinator.js';
11
+ export { distributedCoordination };
12
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFFcEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQzlELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUNwRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDbEUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQzVELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNoRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFFdEUsbUJBQW1CO0FBQ25CLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQU01RCxPQUFPLEtBQUssdUJBQXVCLE1BQU0sZ0RBQWdELENBQUM7QUFDMUYsT0FBTyxFQUFFLHVCQUF1QixFQUFFLENBQUMifQ==
@@ -0,0 +1,8 @@
1
+ import { Task } from './taskbuffer.classes.task.js';
2
+ export declare class BufferRunner {
3
+ task: Task;
4
+ bufferCounter: number;
5
+ constructor(taskArg: Task<any>);
6
+ trigger(x: any): Promise<any>;
7
+ private _run;
8
+ }
@@ -0,0 +1,28 @@
1
+ import { Task } from './taskbuffer.classes.task.js';
2
+ export class BufferRunner {
3
+ constructor(taskArg) {
4
+ // initialize by default
5
+ this.bufferCounter = 0;
6
+ this.task = taskArg;
7
+ }
8
+ trigger(x) {
9
+ if (!(this.bufferCounter >= this.task.bufferMax)) {
10
+ this.bufferCounter++;
11
+ }
12
+ const returnPromise = this.task.cycleCounter.getPromiseForCycle(this.bufferCounter);
13
+ if (!this.task.running) {
14
+ this._run(x);
15
+ }
16
+ return returnPromise;
17
+ }
18
+ async _run(x) {
19
+ this.task.running = true;
20
+ while (this.bufferCounter > 0) {
21
+ const result = await Task.runTask(this.task, { x: x });
22
+ this.bufferCounter--;
23
+ this.task.cycleCounter.informOfCycle(result);
24
+ }
25
+ this.task.running = false;
26
+ }
27
+ }
28
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFza2J1ZmZlci5jbGFzc2VzLmJ1ZmZlcnJ1bm5lci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL3Rhc2tidWZmZXIuY2xhc3Nlcy5idWZmZXJydW5uZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBRXBELE1BQU0sT0FBTyxZQUFZO0lBS3ZCLFlBQVksT0FBa0I7UUFIOUIsd0JBQXdCO1FBQ2pCLGtCQUFhLEdBQVcsQ0FBQyxDQUFDO1FBRy9CLElBQUksQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDO0lBQ3RCLENBQUM7SUFFTSxPQUFPLENBQUMsQ0FBTTtRQUNuQixJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztZQUNqRCxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDdkIsQ0FBQztRQUNELE1BQU0sYUFBYSxHQUNqQixJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDaEUsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDdkIsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNmLENBQUM7UUFDRCxPQUFPLGFBQWEsQ0FBQztJQUN2QixDQUFDO0lBRU8sS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFNO1FBQ3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztRQUN6QixPQUFPLElBQUksQ0FBQyxhQUFhLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDOUIsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN2RCxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDckIsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQy9DLENBQUM7UUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7SUFDNUIsQ0FBQztDQUNGIn0=
@@ -0,0 +1,13 @@
1
+ import * as plugins from './taskbuffer.plugins.js';
2
+ import { Task } from './taskbuffer.classes.task.js';
3
+ export interface ICycleObject {
4
+ cycleCounter: number;
5
+ deferred: plugins.smartpromise.Deferred<any>;
6
+ }
7
+ export declare class CycleCounter {
8
+ task: Task;
9
+ cycleObjectArray: ICycleObject[];
10
+ constructor(taskArg: Task<any>);
11
+ getPromiseForCycle(cycleCountArg: number): Promise<unknown>;
12
+ informOfCycle(x: any): void;
13
+ }
@@ -0,0 +1,31 @@
1
+ import * as plugins from './taskbuffer.plugins.js';
2
+ import { Task } from './taskbuffer.classes.task.js';
3
+ export class CycleCounter {
4
+ constructor(taskArg) {
5
+ this.cycleObjectArray = [];
6
+ this.task = taskArg;
7
+ }
8
+ getPromiseForCycle(cycleCountArg) {
9
+ const done = plugins.smartpromise.defer();
10
+ const cycleObject = {
11
+ cycleCounter: cycleCountArg,
12
+ deferred: done,
13
+ };
14
+ this.cycleObjectArray.push(cycleObject);
15
+ return done.promise;
16
+ }
17
+ informOfCycle(x) {
18
+ const newCycleObjectArray = [];
19
+ this.cycleObjectArray.forEach((cycleObjectArg) => {
20
+ cycleObjectArg.cycleCounter--;
21
+ if (cycleObjectArg.cycleCounter <= 0) {
22
+ cycleObjectArg.deferred.resolve(x);
23
+ }
24
+ else {
25
+ newCycleObjectArray.push(cycleObjectArg);
26
+ }
27
+ });
28
+ this.cycleObjectArray = newCycleObjectArray;
29
+ }
30
+ }
31
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFza2J1ZmZlci5jbGFzc2VzLmN5Y2xlY291bnRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL3Rhc2tidWZmZXIuY2xhc3Nlcy5jeWNsZWNvdW50ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSx5QkFBeUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFPcEQsTUFBTSxPQUFPLFlBQVk7SUFHdkIsWUFBWSxPQUFrQjtRQUR2QixxQkFBZ0IsR0FBbUIsRUFBRSxDQUFDO1FBRTNDLElBQUksQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDO0lBQ3RCLENBQUM7SUFDTSxrQkFBa0IsQ0FBQyxhQUFxQjtRQUM3QyxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzFDLE1BQU0sV0FBVyxHQUFpQjtZQUNoQyxZQUFZLEVBQUUsYUFBYTtZQUMzQixRQUFRLEVBQUUsSUFBSTtTQUNmLENBQUM7UUFDRixJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3hDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN0QixDQUFDO0lBQ00sYUFBYSxDQUFDLENBQU07UUFDekIsTUFBTSxtQkFBbUIsR0FBbUIsRUFBRSxDQUFDO1FBQy9DLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxjQUFjLEVBQUUsRUFBRTtZQUMvQyxjQUFjLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDOUIsSUFBSSxjQUFjLENBQUMsWUFBWSxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUNyQyxjQUFjLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNyQyxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sbUJBQW1CLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQzNDLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxtQkFBbUIsQ0FBQztJQUM5QyxDQUFDO0NBQ0YifQ==
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Contains all data for the final coordinator to make an informed decision.
3
+ */
4
+ export interface IDistributedTaskRequest {
5
+ submitterId: string;
6
+ requestResponseId: string;
7
+ taskName: string;
8
+ taskVersion: string;
9
+ taskExecutionTime: number;
10
+ taskExecutionTimeout: number;
11
+ taskExecutionParallel: number;
12
+ status: 'requesting' | 'gotRejected' | 'failed' | 'succeeded';
13
+ }
14
+ export interface IDistributedTaskRequestResult {
15
+ submitterId: string;
16
+ requestResponseId: string;
17
+ considered: boolean;
18
+ rank: number;
19
+ reason: string;
20
+ shouldTrigger: boolean;
21
+ }
22
+ export declare abstract class AbstractDistributedCoordinator {
23
+ abstract fireDistributedTaskRequest(infoBasis: IDistributedTaskRequest): Promise<IDistributedTaskRequestResult>;
24
+ abstract updateDistributedTaskRequest(infoBasis: IDistributedTaskRequest): Promise<void>;
25
+ abstract start(): Promise<void>;
26
+ abstract stop(): Promise<void>;
27
+ }
@@ -0,0 +1,5 @@
1
+ import { Task } from './taskbuffer.classes.task.js';
2
+ import * as plugins from './taskbuffer.plugins.js';
3
+ export class AbstractDistributedCoordinator {
4
+ }
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFza2J1ZmZlci5jbGFzc2VzLmRpc3RyaWJ1dGVkY29vcmRpbmF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy90YXNrYnVmZmVyLmNsYXNzZXMuZGlzdHJpYnV0ZWRjb29yZGluYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDcEQsT0FBTyxLQUFLLE9BQU8sTUFBTSx5QkFBeUIsQ0FBQztBQXlCbkQsTUFBTSxPQUFnQiw4QkFBOEI7Q0FXbkQifQ==
@@ -0,0 +1,86 @@
1
+ import * as plugins from './taskbuffer.plugins.js';
2
+ import { BufferRunner } from './taskbuffer.classes.bufferrunner.js';
3
+ import { CycleCounter } from './taskbuffer.classes.cyclecounter.js';
4
+ import { type ITaskStep } from './taskbuffer.classes.taskstep.js';
5
+ import type { ITaskMetadata } from './taskbuffer.interfaces.js';
6
+ export interface ITaskFunction<T = undefined> {
7
+ (x?: any, setupValue?: T): PromiseLike<any>;
8
+ }
9
+ export interface ITaskSetupFunction<T = undefined> {
10
+ (): Promise<T>;
11
+ }
12
+ export type TPreOrAfterTaskFunction = () => Task<any>;
13
+ export type StepNames<T> = T extends ReadonlyArray<{
14
+ name: infer N;
15
+ }> ? N : never;
16
+ export declare class Task<T = undefined, TSteps extends ReadonlyArray<{
17
+ name: string;
18
+ description: string;
19
+ percentage: number;
20
+ }> = []> {
21
+ static extractTask<T = undefined, TSteps extends ReadonlyArray<{
22
+ name: string;
23
+ description: string;
24
+ percentage: number;
25
+ }> = []>(preOrAfterTaskArg: Task<T, TSteps> | TPreOrAfterTaskFunction): Task<T, TSteps>;
26
+ static emptyTaskFunction: ITaskFunction;
27
+ static isTask: (taskArg: Task<any>) => boolean;
28
+ static isTaskTouched<T = undefined, TSteps extends ReadonlyArray<{
29
+ name: string;
30
+ description: string;
31
+ percentage: number;
32
+ }> = []>(taskArg: Task<T, TSteps> | TPreOrAfterTaskFunction, touchedTasksArray: Task<T, TSteps>[]): boolean;
33
+ static runTask: <T_1, TSteps_1 extends ReadonlyArray<{
34
+ name: string;
35
+ description: string;
36
+ percentage: number;
37
+ }> = []>(taskArg: Task<T_1, TSteps_1> | TPreOrAfterTaskFunction, optionsArg: {
38
+ x?: any;
39
+ touchedTasksArray?: Task<T_1, TSteps_1>[];
40
+ }) => Promise<unknown>;
41
+ name: string;
42
+ version: string;
43
+ taskFunction: ITaskFunction<T>;
44
+ buffered: boolean;
45
+ cronJob: plugins.smarttime.CronJob;
46
+ bufferMax: number;
47
+ execDelay: number;
48
+ timeout: number;
49
+ preTask: Task<T, any> | TPreOrAfterTaskFunction;
50
+ afterTask: Task<T, any> | TPreOrAfterTaskFunction;
51
+ blockingTasks: Task[];
52
+ private finished;
53
+ private resolveFinished;
54
+ running: boolean;
55
+ bufferRunner: BufferRunner;
56
+ cycleCounter: CycleCounter;
57
+ lastRun?: Date;
58
+ runCount: number;
59
+ get idle(): boolean;
60
+ taskSetup: ITaskSetupFunction<T>;
61
+ setupValue: T;
62
+ private steps;
63
+ private stepProgress;
64
+ currentStepName?: string;
65
+ private providedSteps?;
66
+ constructor(optionsArg: {
67
+ taskFunction: ITaskFunction<T>;
68
+ preTask?: Task<T, any> | TPreOrAfterTaskFunction;
69
+ afterTask?: Task<T, any> | TPreOrAfterTaskFunction;
70
+ buffered?: boolean;
71
+ bufferMax?: number;
72
+ execDelay?: number;
73
+ name?: string;
74
+ taskSetup?: ITaskSetupFunction<T>;
75
+ steps?: TSteps;
76
+ });
77
+ trigger(x?: any): Promise<any>;
78
+ triggerUnBuffered(x?: any): Promise<any>;
79
+ triggerBuffered(x?: any): Promise<any>;
80
+ notifyStep(stepName: StepNames<TSteps>): void;
81
+ getProgress(): number;
82
+ getStepsMetadata(): ITaskStep[];
83
+ getMetadata(): ITaskMetadata;
84
+ resetSteps(): void;
85
+ private completeAllSteps;
86
+ }
@@ -0,0 +1,257 @@
1
+ import * as plugins from './taskbuffer.plugins.js';
2
+ import { BufferRunner } from './taskbuffer.classes.bufferrunner.js';
3
+ import { CycleCounter } from './taskbuffer.classes.cyclecounter.js';
4
+ import { TaskStep } from './taskbuffer.classes.taskstep.js';
5
+ import { logger } from './taskbuffer.logging.js';
6
+ export class Task {
7
+ static extractTask(preOrAfterTaskArg) {
8
+ switch (true) {
9
+ case !preOrAfterTaskArg:
10
+ return null;
11
+ case preOrAfterTaskArg instanceof Task:
12
+ return preOrAfterTaskArg;
13
+ case typeof preOrAfterTaskArg === 'function':
14
+ const taskFunction = preOrAfterTaskArg;
15
+ return taskFunction();
16
+ default:
17
+ return null;
18
+ }
19
+ }
20
+ static { this.emptyTaskFunction = function (x) {
21
+ const done = plugins.smartpromise.defer();
22
+ done.resolve();
23
+ return done.promise;
24
+ }; }
25
+ static { this.isTask = (taskArg) => {
26
+ if (taskArg instanceof Task && typeof taskArg.taskFunction === 'function') {
27
+ return true;
28
+ }
29
+ else {
30
+ return false;
31
+ }
32
+ }; }
33
+ static isTaskTouched(taskArg, touchedTasksArray) {
34
+ const taskToCheck = Task.extractTask(taskArg);
35
+ let result = false;
36
+ for (const keyArg in touchedTasksArray) {
37
+ if (taskToCheck === touchedTasksArray[keyArg]) {
38
+ result = true;
39
+ }
40
+ }
41
+ return result;
42
+ }
43
+ static { this.runTask = async (taskArg, optionsArg) => {
44
+ const taskToRun = Task.extractTask(taskArg);
45
+ const done = plugins.smartpromise.defer();
46
+ // Wait for all blocking tasks to finish
47
+ for (const task of taskToRun.blockingTasks) {
48
+ await task.finished;
49
+ }
50
+ if (!taskToRun.setupValue && taskToRun.taskSetup) {
51
+ taskToRun.setupValue = await taskToRun.taskSetup();
52
+ }
53
+ if (taskToRun.execDelay) {
54
+ await plugins.smartdelay.delayFor(taskToRun.execDelay);
55
+ }
56
+ taskToRun.running = true;
57
+ taskToRun.runCount++;
58
+ taskToRun.lastRun = new Date();
59
+ // Reset steps at the beginning of task execution
60
+ taskToRun.resetSteps();
61
+ done.promise.then(async () => {
62
+ taskToRun.running = false;
63
+ // Complete all steps when task finishes
64
+ taskToRun.completeAllSteps();
65
+ // When the task has finished running, resolve the finished promise
66
+ taskToRun.resolveFinished();
67
+ // Create a new finished promise for the next run
68
+ taskToRun.finished = new Promise((resolve) => {
69
+ taskToRun.resolveFinished = resolve;
70
+ });
71
+ });
72
+ const options = {
73
+ ...{ x: undefined, touchedTasksArray: [] },
74
+ ...optionsArg,
75
+ };
76
+ const x = options.x;
77
+ const touchedTasksArray = options.touchedTasksArray;
78
+ touchedTasksArray.push(taskToRun);
79
+ const localDeferred = plugins.smartpromise.defer();
80
+ localDeferred.promise
81
+ .then(() => {
82
+ if (taskToRun.preTask &&
83
+ !Task.isTaskTouched(taskToRun.preTask, touchedTasksArray)) {
84
+ return Task.runTask(taskToRun.preTask, { x, touchedTasksArray });
85
+ }
86
+ else {
87
+ const done2 = plugins.smartpromise.defer();
88
+ done2.resolve(x);
89
+ return done2.promise;
90
+ }
91
+ })
92
+ .then(async (x) => {
93
+ try {
94
+ return await taskToRun.taskFunction(x, taskToRun.setupValue);
95
+ }
96
+ catch (e) {
97
+ console.log(e);
98
+ }
99
+ })
100
+ .then((x) => {
101
+ if (taskToRun.afterTask &&
102
+ !Task.isTaskTouched(taskToRun.afterTask, touchedTasksArray)) {
103
+ return Task.runTask(taskToRun.afterTask, {
104
+ x: x,
105
+ touchedTasksArray: touchedTasksArray,
106
+ });
107
+ }
108
+ else {
109
+ const done2 = plugins.smartpromise.defer();
110
+ done2.resolve(x);
111
+ return done2.promise;
112
+ }
113
+ })
114
+ .then((x) => {
115
+ done.resolve(x);
116
+ })
117
+ .catch((err) => {
118
+ console.log(err);
119
+ });
120
+ localDeferred.resolve();
121
+ return await done.promise;
122
+ }; }
123
+ get idle() {
124
+ return !this.running;
125
+ }
126
+ constructor(optionsArg) {
127
+ // Add a list to store the blocking tasks
128
+ this.blockingTasks = [];
129
+ this.running = false;
130
+ this.bufferRunner = new BufferRunner(this);
131
+ this.cycleCounter = new CycleCounter(this);
132
+ this.runCount = 0;
133
+ // Step tracking properties
134
+ this.steps = new Map();
135
+ this.stepProgress = new Map();
136
+ this.taskFunction = optionsArg.taskFunction;
137
+ this.preTask = optionsArg.preTask;
138
+ this.afterTask = optionsArg.afterTask;
139
+ this.buffered = optionsArg.buffered;
140
+ this.bufferMax = optionsArg.bufferMax;
141
+ this.execDelay = optionsArg.execDelay;
142
+ this.name = optionsArg.name;
143
+ this.taskSetup = optionsArg.taskSetup;
144
+ // Initialize steps if provided
145
+ if (optionsArg.steps) {
146
+ this.providedSteps = optionsArg.steps;
147
+ for (const stepConfig of optionsArg.steps) {
148
+ const step = new TaskStep({
149
+ name: stepConfig.name,
150
+ description: stepConfig.description,
151
+ percentage: stepConfig.percentage,
152
+ });
153
+ this.steps.set(stepConfig.name, step);
154
+ }
155
+ }
156
+ // Create the finished promise
157
+ this.finished = new Promise((resolve) => {
158
+ this.resolveFinished = resolve;
159
+ });
160
+ }
161
+ trigger(x) {
162
+ if (this.buffered) {
163
+ return this.triggerBuffered(x);
164
+ }
165
+ else {
166
+ return this.triggerUnBuffered(x);
167
+ }
168
+ }
169
+ triggerUnBuffered(x) {
170
+ return Task.runTask(this, { x: x });
171
+ }
172
+ triggerBuffered(x) {
173
+ return this.bufferRunner.trigger(x);
174
+ }
175
+ // Step notification method with typed step names
176
+ notifyStep(stepName) {
177
+ // Complete previous step if exists
178
+ if (this.currentStepName) {
179
+ const prevStep = this.steps.get(this.currentStepName);
180
+ if (prevStep && prevStep.status === 'active') {
181
+ prevStep.complete();
182
+ this.stepProgress.set(this.currentStepName, prevStep.percentage);
183
+ }
184
+ }
185
+ // Start new step
186
+ const step = this.steps.get(stepName);
187
+ if (step) {
188
+ step.start();
189
+ this.currentStepName = stepName;
190
+ // Emit event for frontend updates (could be enhanced with event emitter)
191
+ if (this.name) {
192
+ logger.log('info', `Task ${this.name}: Starting step "${stepName}" - ${step.description}`);
193
+ }
194
+ }
195
+ }
196
+ // Get current progress based on completed steps
197
+ getProgress() {
198
+ let totalProgress = 0;
199
+ for (const [stepName, percentage] of this.stepProgress) {
200
+ totalProgress += percentage;
201
+ }
202
+ // Add partial progress of current step if exists
203
+ if (this.currentStepName) {
204
+ const currentStep = this.steps.get(this.currentStepName);
205
+ if (currentStep && currentStep.status === 'active') {
206
+ // Could add partial progress calculation here if needed
207
+ // For now, we'll consider active steps as 50% complete
208
+ totalProgress += currentStep.percentage * 0.5;
209
+ }
210
+ }
211
+ return Math.min(100, Math.round(totalProgress));
212
+ }
213
+ // Get all steps metadata
214
+ getStepsMetadata() {
215
+ return Array.from(this.steps.values()).map(step => step.toJSON());
216
+ }
217
+ // Get task metadata
218
+ getMetadata() {
219
+ return {
220
+ name: this.name || 'unnamed',
221
+ version: this.version,
222
+ status: this.running ? 'running' : 'idle',
223
+ steps: this.getStepsMetadata(),
224
+ currentStep: this.currentStepName,
225
+ currentProgress: this.getProgress(),
226
+ runCount: this.runCount,
227
+ buffered: this.buffered,
228
+ bufferMax: this.bufferMax,
229
+ timeout: this.timeout,
230
+ cronSchedule: this.cronJob?.cronExpression,
231
+ };
232
+ }
233
+ // Reset all steps to pending state
234
+ resetSteps() {
235
+ this.steps.forEach(step => step.reset());
236
+ this.stepProgress.clear();
237
+ this.currentStepName = undefined;
238
+ }
239
+ // Complete all remaining steps (useful for cleanup)
240
+ completeAllSteps() {
241
+ if (this.currentStepName) {
242
+ const currentStep = this.steps.get(this.currentStepName);
243
+ if (currentStep && currentStep.status === 'active') {
244
+ currentStep.complete();
245
+ this.stepProgress.set(this.currentStepName, currentStep.percentage);
246
+ }
247
+ }
248
+ // Mark any pending steps as completed (in case of early task completion)
249
+ this.steps.forEach((step, name) => {
250
+ if (step.status === 'pending') {
251
+ // Don't add their percentage to progress since they weren't actually executed
252
+ step.status = 'completed';
253
+ }
254
+ });
255
+ }
256
+ }
257
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFza2J1ZmZlci5jbGFzc2VzLnRhc2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy90YXNrYnVmZmVyLmNsYXNzZXMudGFzay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLHlCQUF5QixDQUFDO0FBQ25ELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUNwRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDcEUsT0FBTyxFQUFFLFFBQVEsRUFBa0IsTUFBTSxrQ0FBa0MsQ0FBQztBQUc1RSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFlakQsTUFBTSxPQUFPLElBQUk7SUFDUixNQUFNLENBQUMsV0FBVyxDQUN2QixpQkFBNEQ7UUFFNUQsUUFBUSxJQUFJLEVBQUUsQ0FBQztZQUNiLEtBQUssQ0FBQyxpQkFBaUI7Z0JBQ3JCLE9BQU8sSUFBSSxDQUFDO1lBQ2QsS0FBSyxpQkFBaUIsWUFBWSxJQUFJO2dCQUNwQyxPQUFPLGlCQUFvQyxDQUFDO1lBQzlDLEtBQUssT0FBTyxpQkFBaUIsS0FBSyxVQUFVO2dCQUMxQyxNQUFNLFlBQVksR0FBRyxpQkFBNEMsQ0FBQztnQkFDbEUsT0FBTyxZQUFZLEVBQWdDLENBQUM7WUFDdEQ7Z0JBQ0UsT0FBTyxJQUFJLENBQUM7UUFDaEIsQ0FBQztJQUNILENBQUM7YUFFYSxzQkFBaUIsR0FBa0IsVUFBVSxDQUFDO1FBQzFELE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDMUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2YsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3RCLENBQUMsQUFKOEIsQ0FJN0I7YUFFWSxXQUFNLEdBQUcsQ0FBQyxPQUFrQixFQUFXLEVBQUU7UUFDckQsSUFBSSxPQUFPLFlBQVksSUFBSSxJQUFJ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
@@ -0,0 +1,14 @@
1
+ import { Task } from './taskbuffer.classes.task.js';
2
+ export declare class Taskchain extends Task {
3
+ taskArray: Task[];
4
+ constructor(optionsArg: {
5
+ taskArray: Task[];
6
+ name?: string;
7
+ log?: boolean;
8
+ buffered?: boolean;
9
+ bufferMax?: number;
10
+ });
11
+ addTask(taskArg: Task): void;
12
+ removeTask(taskArg: Task): void;
13
+ shiftTask(): void;
14
+ }
@@ -0,0 +1,51 @@
1
+ // TaskChain chains tasks
2
+ // and extends Task
3
+ import * as plugins from './taskbuffer.plugins.js';
4
+ import { Task } from './taskbuffer.classes.task.js';
5
+ import { logger } from './taskbuffer.logging.js';
6
+ export class Taskchain extends Task {
7
+ constructor(optionsArg) {
8
+ const options = {
9
+ ...{
10
+ name: 'unnamed Taskchain',
11
+ log: false,
12
+ },
13
+ ...optionsArg,
14
+ ...{
15
+ taskFunction: (x) => {
16
+ // this is the function that gets executed when TaskChain is triggered
17
+ const done = plugins.smartpromise.defer(); // this is the starting Deferred object
18
+ let taskCounter = 0; // counter for iterating async over the taskArray
19
+ const iterateTasks = (x) => {
20
+ if (typeof this.taskArray[taskCounter] !== 'undefined') {
21
+ console.log(this.name + ' running: Task' + this.taskArray[taskCounter].name);
22
+ this.taskArray[taskCounter].trigger(x).then((x) => {
23
+ logger.log('info', this.taskArray[taskCounter].name);
24
+ taskCounter++;
25
+ iterateTasks(x);
26
+ });
27
+ }
28
+ else {
29
+ console.log('Taskchain "' + this.name + '" completed successfully');
30
+ done.resolve(x);
31
+ }
32
+ };
33
+ iterateTasks(x);
34
+ return done.promise;
35
+ },
36
+ },
37
+ };
38
+ super(options);
39
+ this.taskArray = optionsArg.taskArray;
40
+ }
41
+ addTask(taskArg) {
42
+ this.taskArray.push(taskArg);
43
+ }
44
+ removeTask(taskArg) {
45
+ // TODO:
46
+ }
47
+ shiftTask() {
48
+ // TODO:
49
+ }
50
+ }
51
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFza2J1ZmZlci5jbGFzc2VzLnRhc2tjaGFpbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL3Rhc2tidWZmZXIuY2xhc3Nlcy50YXNrY2hhaW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEseUJBQXlCO0FBQ3pCLG1CQUFtQjtBQUVuQixPQUFPLEtBQUssT0FBTyxNQUFNLHlCQUF5QixDQUFDO0FBQ25ELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFakQsTUFBTSxPQUFPLFNBQVUsU0FBUSxJQUFJO0lBRWpDLFlBQVksVUFNWDtRQUNDLE1BQU0sT0FBTyxHQUFHO1lBQ2QsR0FBRztnQkFDRCxJQUFJLEVBQUUsbUJBQW1CO2dCQUN6QixHQUFHLEVBQUUsS0FBSzthQUNYO1lBQ0QsR0FBRyxVQUFVO1lBQ2IsR0FBRztnQkFDRCxZQUFZLEVBQUUsQ0FBQyxDQUFNLEVBQUUsRUFBRTtvQkFDdkIsc0VBQXNFO29CQUN0RSxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsdUNBQXVDO29CQUNsRixJQUFJLFdBQVcsR0FBRyxDQUFDLENBQUMsQ0FBQyxpREFBaUQ7b0JBQ3RFLE1BQU0sWUFBWSxHQUFHLENBQUMsQ0FBTSxFQUFFLEVBQUU7d0JBQzlCLElBQUksT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxLQUFLLFdBQVcsRUFBRSxDQUFDOzRCQUN2RCxPQUFPLENBQUMsR0FBRyxDQUNULElBQUksQ0FBQyxJQUFJLEdBQUcsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLENBQ2hFLENBQUM7NEJBQ0YsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7Z0NBQ2hELE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7Z0NBQ3JELFdBQVcsRUFBRSxDQUFDO2dDQUNkLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQzs0QkFDbEIsQ0FBQyxDQUFDLENBQUM7d0JBQ0wsQ0FBQzs2QkFBTSxDQUFDOzRCQUNOLE9BQU8sQ0FBQyxHQUFHLENBQ1QsYUFBYSxHQUFHLElBQUksQ0FBQyxJQUFJLEdBQUcsMEJBQTBCLENBQ3ZELENBQUM7NEJBQ0YsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDbEIsQ0FBQztvQkFDSCxDQUFDLENBQUM7b0JBQ0YsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUNoQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7Z0JBQ3RCLENBQUM7YUFDRjtTQUNGLENBQUM7UUFDRixLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDZixJQUFJLENBQUMsU0FBUyxHQUFHLFVBQVUsQ0FBQyxTQUFTLENBQUM7SUFDeEMsQ0FBQztJQUNELE9BQU8sQ0FBQyxPQUFhO1FBQ25CLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFDRCxVQUFVLENBQUMsT0FBYTtRQUN0QixRQUFRO0lBQ1YsQ0FBQztJQUNELFNBQVM7UUFDUCxRQUFRO0lBQ1YsQ0FBQztDQUNGIn0=
@@ -0,0 +1,10 @@
1
+ import { Task, type ITaskFunction } from './taskbuffer.classes.task.js';
2
+ export declare class TaskDebounced<T = unknown> extends Task {
3
+ private _debouncedTaskFunction;
4
+ private _observableIntake;
5
+ constructor(optionsArg: {
6
+ name: string;
7
+ taskFunction: ITaskFunction;
8
+ debounceTimeInMillis: number;
9
+ });
10
+ }
@@ -0,0 +1,20 @@
1
+ import * as plugins from './taskbuffer.plugins.js';
2
+ import { Task } from './taskbuffer.classes.task.js';
3
+ export class TaskDebounced extends Task {
4
+ constructor(optionsArg) {
5
+ super({
6
+ name: optionsArg.name,
7
+ taskFunction: async (x) => {
8
+ this._observableIntake.push(x);
9
+ },
10
+ });
11
+ this._observableIntake = new plugins.smartrx.ObservableIntake();
12
+ this.taskFunction = optionsArg.taskFunction;
13
+ this._observableIntake.observable
14
+ .pipe(plugins.smartrx.rxjs.ops.debounceTime(optionsArg.debounceTimeInMillis))
15
+ .subscribe((x) => {
16
+ this.taskFunction(x);
17
+ });
18
+ }
19
+ }
20
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFza2J1ZmZlci5jbGFzc2VzLnRhc2tkZWJvdW5jZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy90YXNrYnVmZmVyLmNsYXNzZXMudGFza2RlYm91bmNlZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLHlCQUF5QixDQUFDO0FBRW5ELE9BQU8sRUFBRSxJQUFJLEVBQXNCLE1BQU0sOEJBQThCLENBQUM7QUFFeEUsTUFBTSxPQUFPLGFBQTJCLFNBQVEsSUFBSTtJQUlsRCxZQUFZLFVBSVg7UUFDQyxLQUFLLENBQUM7WUFDSixJQUFJLEVBQUUsVUFBVSxDQUFDLElBQUk7WUFDckIsWUFBWSxFQUFFLEtBQUssRUFBRSxDQUFJLEVBQUUsRUFBRTtnQkFDM0IsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNqQyxDQUFDO1NBQ0YsQ0FBQyxDQUFDO1FBWkcsc0JBQWlCLEdBQUcsSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLGdCQUFnQixFQUFLLENBQUM7UUFhcEUsSUFBSSxDQUFDLFlBQVksR0FBRyxVQUFVLENBQUMsWUFBWSxDQUFDO1FBQzVDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVO2FBQzlCLElBQUksQ0FDSCxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxDQUN2RTthQUNBLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO1lBQ2YsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN2QixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7Q0FDRiJ9
@@ -0,0 +1,49 @@
1
+ import * as plugins from './taskbuffer.plugins.js';
2
+ import { Task } from './taskbuffer.classes.task.js';
3
+ import { AbstractDistributedCoordinator } from './taskbuffer.classes.distributedcoordinator.js';
4
+ import type { ITaskMetadata, ITaskExecutionReport, IScheduledTaskInfo } from './taskbuffer.interfaces.js';
5
+ export interface ICronJob {
6
+ cronString: string;
7
+ taskName: string;
8
+ job: any;
9
+ }
10
+ export interface ITaskManagerConstructorOptions {
11
+ distributedCoordinator?: AbstractDistributedCoordinator;
12
+ }
13
+ export declare class TaskManager {
14
+ randomId: string;
15
+ taskMap: plugins.lik.ObjectMap<Task<any, any>>;
16
+ private cronJobManager;
17
+ options: ITaskManagerConstructorOptions;
18
+ constructor(options?: ITaskManagerConstructorOptions);
19
+ getTaskByName(taskName: string): Task<any, any>;
20
+ addTask(task: Task<any, any>): void;
21
+ addAndScheduleTask(task: Task<any, any>, cronString: string): void;
22
+ triggerTaskByName(taskName: string): Promise<any>;
23
+ triggerTask(task: Task<any, any>): Promise<any>;
24
+ scheduleTaskByName(taskName: string, cronString: string): void;
25
+ private handleTaskScheduling;
26
+ private logTaskState;
27
+ private performDistributedConsultation;
28
+ descheduleTaskByName(taskName: string): void;
29
+ descheduleTask(task: Task<any, any>): Promise<void>;
30
+ getScheduleForTaskName(taskName: string): string | null;
31
+ start(): Promise<void>;
32
+ stop(): Promise<void>;
33
+ getTaskMetadata(taskName: string): ITaskMetadata | null;
34
+ getAllTasksMetadata(): ITaskMetadata[];
35
+ getScheduledTasks(): IScheduledTaskInfo[];
36
+ getNextScheduledRuns(limit?: number): Array<{
37
+ taskName: string;
38
+ nextRun: Date;
39
+ schedule: string;
40
+ }>;
41
+ addExecuteRemoveTask<T, TSteps extends ReadonlyArray<{
42
+ name: string;
43
+ description: string;
44
+ percentage: number;
45
+ }>>(task: Task<T, TSteps>, options?: {
46
+ schedule?: string;
47
+ trackProgress?: boolean;
48
+ }): Promise<ITaskExecutionReport>;
49
+ }