@push.rocks/taskbuffer 4.1.0 → 4.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/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts_web/00_commitinfo_data.js +2 -2
- package/dist_ts_web/{ts_web/elements → elements}/taskbuffer-dashboard.demo.js +1 -1
- package/dist_ts_web/{ts_web/index.d.ts → index.d.ts} +1 -1
- package/dist_ts_web/{ts_web/taskbuffer-dashboard.d.ts → taskbuffer-dashboard.d.ts} +6 -6
- package/dist_ts_web/{ts_web/taskbuffer-dashboard.js → taskbuffer-dashboard.js} +23 -16
- package/package.json +8 -8
- package/readme.hints.md +28 -1
- package/readme.md +538 -408
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts_web/00_commitinfo_data.ts +1 -1
- package/ts_web/taskbuffer-dashboard.ts +5 -5
- package/dist_ts_web/ts/index.d.ts +0 -13
- package/dist_ts_web/ts/index.js +0 -12
- package/dist_ts_web/ts/taskbuffer.classes.bufferrunner.d.ts +0 -8
- package/dist_ts_web/ts/taskbuffer.classes.bufferrunner.js +0 -41
- package/dist_ts_web/ts/taskbuffer.classes.cyclecounter.d.ts +0 -14
- package/dist_ts_web/ts/taskbuffer.classes.cyclecounter.js +0 -44
- package/dist_ts_web/ts/taskbuffer.classes.distributedcoordinator.d.ts +0 -27
- package/dist_ts_web/ts/taskbuffer.classes.distributedcoordinator.js +0 -5
- package/dist_ts_web/ts/taskbuffer.classes.task.d.ts +0 -99
- package/dist_ts_web/ts/taskbuffer.classes.task.js +0 -338
- package/dist_ts_web/ts/taskbuffer.classes.taskchain.d.ts +0 -14
- package/dist_ts_web/ts/taskbuffer.classes.taskchain.js +0 -60
- package/dist_ts_web/ts/taskbuffer.classes.taskdebounced.d.ts +0 -10
- package/dist_ts_web/ts/taskbuffer.classes.taskdebounced.js +0 -31
- package/dist_ts_web/ts/taskbuffer.classes.taskmanager.d.ts +0 -54
- package/dist_ts_web/ts/taskbuffer.classes.taskmanager.js +0 -238
- package/dist_ts_web/ts/taskbuffer.classes.taskonce.d.ts +0 -11
- package/dist_ts_web/ts/taskbuffer.classes.taskonce.js +0 -20
- package/dist_ts_web/ts/taskbuffer.classes.taskparallel.d.ts +0 -7
- package/dist_ts_web/ts/taskbuffer.classes.taskparallel.js +0 -25
- package/dist_ts_web/ts/taskbuffer.classes.taskrunner.d.ts +0 -30
- package/dist_ts_web/ts/taskbuffer.classes.taskrunner.js +0 -60
- package/dist_ts_web/ts/taskbuffer.classes.taskstep.d.ts +0 -27
- package/dist_ts_web/ts/taskbuffer.classes.taskstep.js +0 -37
- package/dist_ts_web/ts/taskbuffer.interfaces.d.ts +0 -47
- package/dist_ts_web/ts/taskbuffer.interfaces.js +0 -2
- package/dist_ts_web/ts/taskbuffer.logging.d.ts +0 -2
- package/dist_ts_web/ts/taskbuffer.logging.js +0 -3
- package/dist_ts_web/ts/taskbuffer.plugins.d.ts +0 -8
- package/dist_ts_web/ts/taskbuffer.plugins.js +0 -9
- package/dist_ts_web/ts_web/00_commitinfo_data.d.ts +0 -8
- package/dist_ts_web/ts_web/00_commitinfo_data.js +0 -9
- package/dist_ts_web/ts_web/demorunner.d.ts +0 -1
- package/dist_ts_web/ts_web/demorunner.js +0 -33
- /package/dist_ts_web/{ts_web/elements → elements}/taskbuffer-dashboard.demo.d.ts +0 -0
- /package/dist_ts_web/{ts_web/index.js → index.js} +0 -0
- /package/{LICENSE → license.md} +0 -0
|
@@ -1,338 +0,0 @@
|
|
|
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 and error state at the beginning of task execution
|
|
60
|
-
taskToRun.resetSteps();
|
|
61
|
-
taskToRun.lastError = undefined;
|
|
62
|
-
taskToRun.emitEvent('started');
|
|
63
|
-
done.promise
|
|
64
|
-
.then(async () => {
|
|
65
|
-
taskToRun.running = false;
|
|
66
|
-
// Complete all steps when task finishes
|
|
67
|
-
taskToRun.completeAllSteps();
|
|
68
|
-
taskToRun.emitEvent(taskToRun.lastError ? 'failed' : 'completed');
|
|
69
|
-
// When the task has finished running, resolve the finished promise
|
|
70
|
-
taskToRun.resolveFinished();
|
|
71
|
-
// Create a new finished promise for the next run
|
|
72
|
-
taskToRun.finished = new Promise((resolve) => {
|
|
73
|
-
taskToRun.resolveFinished = resolve;
|
|
74
|
-
});
|
|
75
|
-
})
|
|
76
|
-
.catch((err) => {
|
|
77
|
-
taskToRun.running = false;
|
|
78
|
-
taskToRun.emitEvent('failed', { error: err instanceof Error ? err.message : String(err) });
|
|
79
|
-
// Resolve finished so blocking dependants don't hang
|
|
80
|
-
taskToRun.resolveFinished();
|
|
81
|
-
// Create a new finished promise for the next run
|
|
82
|
-
taskToRun.finished = new Promise((resolve) => {
|
|
83
|
-
taskToRun.resolveFinished = resolve;
|
|
84
|
-
});
|
|
85
|
-
});
|
|
86
|
-
const options = {
|
|
87
|
-
...{ x: undefined, touchedTasksArray: [] },
|
|
88
|
-
...optionsArg,
|
|
89
|
-
};
|
|
90
|
-
const x = options.x;
|
|
91
|
-
const touchedTasksArray = options.touchedTasksArray;
|
|
92
|
-
touchedTasksArray.push(taskToRun);
|
|
93
|
-
const localDeferred = plugins.smartpromise.defer();
|
|
94
|
-
localDeferred.promise
|
|
95
|
-
.then(() => {
|
|
96
|
-
if (taskToRun.preTask &&
|
|
97
|
-
!Task.isTaskTouched(taskToRun.preTask, touchedTasksArray)) {
|
|
98
|
-
return Task.runTask(taskToRun.preTask, { x, touchedTasksArray });
|
|
99
|
-
}
|
|
100
|
-
else {
|
|
101
|
-
const done2 = plugins.smartpromise.defer();
|
|
102
|
-
done2.resolve(x);
|
|
103
|
-
return done2.promise;
|
|
104
|
-
}
|
|
105
|
-
})
|
|
106
|
-
.then(async (x) => {
|
|
107
|
-
try {
|
|
108
|
-
return await taskToRun.taskFunction(x, taskToRun.setupValue);
|
|
109
|
-
}
|
|
110
|
-
catch (e) {
|
|
111
|
-
taskToRun.lastError = e instanceof Error ? e : new Error(String(e));
|
|
112
|
-
taskToRun.errorCount++;
|
|
113
|
-
logger.log('error', `Task "${taskToRun.name || 'unnamed'}" failed: ${taskToRun.lastError.message}`);
|
|
114
|
-
if (taskToRun.catchErrors) {
|
|
115
|
-
return undefined;
|
|
116
|
-
}
|
|
117
|
-
throw e;
|
|
118
|
-
}
|
|
119
|
-
})
|
|
120
|
-
.then((x) => {
|
|
121
|
-
if (taskToRun.afterTask &&
|
|
122
|
-
!Task.isTaskTouched(taskToRun.afterTask, touchedTasksArray)) {
|
|
123
|
-
return Task.runTask(taskToRun.afterTask, {
|
|
124
|
-
x: x,
|
|
125
|
-
touchedTasksArray: touchedTasksArray,
|
|
126
|
-
});
|
|
127
|
-
}
|
|
128
|
-
else {
|
|
129
|
-
const done2 = plugins.smartpromise.defer();
|
|
130
|
-
done2.resolve(x);
|
|
131
|
-
return done2.promise;
|
|
132
|
-
}
|
|
133
|
-
})
|
|
134
|
-
.then((x) => {
|
|
135
|
-
done.resolve(x);
|
|
136
|
-
})
|
|
137
|
-
.catch((err) => {
|
|
138
|
-
done.reject(err);
|
|
139
|
-
});
|
|
140
|
-
localDeferred.resolve();
|
|
141
|
-
try {
|
|
142
|
-
return await done.promise;
|
|
143
|
-
}
|
|
144
|
-
catch (err) {
|
|
145
|
-
if (taskToRun.catchErrors) {
|
|
146
|
-
return undefined;
|
|
147
|
-
}
|
|
148
|
-
throw err;
|
|
149
|
-
}
|
|
150
|
-
}; }
|
|
151
|
-
get idle() {
|
|
152
|
-
return !this.running;
|
|
153
|
-
}
|
|
154
|
-
clearError() {
|
|
155
|
-
this.lastError = undefined;
|
|
156
|
-
}
|
|
157
|
-
setLabel(key, value) {
|
|
158
|
-
this.labels[key] = value;
|
|
159
|
-
}
|
|
160
|
-
getLabel(key) {
|
|
161
|
-
return this.labels[key];
|
|
162
|
-
}
|
|
163
|
-
removeLabel(key) {
|
|
164
|
-
if (key in this.labels) {
|
|
165
|
-
delete this.labels[key];
|
|
166
|
-
return true;
|
|
167
|
-
}
|
|
168
|
-
return false;
|
|
169
|
-
}
|
|
170
|
-
hasLabel(key, value) {
|
|
171
|
-
if (value !== undefined) {
|
|
172
|
-
return this.labels[key] === value;
|
|
173
|
-
}
|
|
174
|
-
return key in this.labels;
|
|
175
|
-
}
|
|
176
|
-
emitEvent(type, extra) {
|
|
177
|
-
this.eventSubject.next({
|
|
178
|
-
type,
|
|
179
|
-
task: this.getMetadata(),
|
|
180
|
-
timestamp: Date.now(),
|
|
181
|
-
...extra,
|
|
182
|
-
});
|
|
183
|
-
}
|
|
184
|
-
constructor(optionsArg) {
|
|
185
|
-
// Add a list to store the blocking tasks
|
|
186
|
-
this.blockingTasks = [];
|
|
187
|
-
this.running = false;
|
|
188
|
-
this.bufferRunner = new BufferRunner(this);
|
|
189
|
-
this.cycleCounter = new CycleCounter(this);
|
|
190
|
-
this.runCount = 0;
|
|
191
|
-
// Error handling
|
|
192
|
-
this.catchErrors = false;
|
|
193
|
-
this.errorCount = 0;
|
|
194
|
-
this.labels = {};
|
|
195
|
-
this.eventSubject = new plugins.smartrx.rxjs.Subject();
|
|
196
|
-
// Step tracking properties
|
|
197
|
-
this.steps = new Map();
|
|
198
|
-
this.stepProgress = new Map();
|
|
199
|
-
this.taskFunction = optionsArg.taskFunction;
|
|
200
|
-
this.preTask = optionsArg.preTask;
|
|
201
|
-
this.afterTask = optionsArg.afterTask;
|
|
202
|
-
this.buffered = optionsArg.buffered;
|
|
203
|
-
this.bufferMax = optionsArg.bufferMax;
|
|
204
|
-
this.execDelay = optionsArg.execDelay;
|
|
205
|
-
this.name = optionsArg.name;
|
|
206
|
-
this.taskSetup = optionsArg.taskSetup;
|
|
207
|
-
this.catchErrors = optionsArg.catchErrors ?? false;
|
|
208
|
-
this.labels = optionsArg.labels ? { ...optionsArg.labels } : {};
|
|
209
|
-
// Initialize steps if provided
|
|
210
|
-
if (optionsArg.steps) {
|
|
211
|
-
this.providedSteps = optionsArg.steps;
|
|
212
|
-
for (const stepConfig of optionsArg.steps) {
|
|
213
|
-
const step = new TaskStep({
|
|
214
|
-
name: stepConfig.name,
|
|
215
|
-
description: stepConfig.description,
|
|
216
|
-
percentage: stepConfig.percentage,
|
|
217
|
-
});
|
|
218
|
-
this.steps.set(stepConfig.name, step);
|
|
219
|
-
}
|
|
220
|
-
}
|
|
221
|
-
// Create the finished promise
|
|
222
|
-
this.finished = new Promise((resolve) => {
|
|
223
|
-
this.resolveFinished = resolve;
|
|
224
|
-
});
|
|
225
|
-
}
|
|
226
|
-
trigger(x) {
|
|
227
|
-
if (this.buffered) {
|
|
228
|
-
return this.triggerBuffered(x);
|
|
229
|
-
}
|
|
230
|
-
else {
|
|
231
|
-
return this.triggerUnBuffered(x);
|
|
232
|
-
}
|
|
233
|
-
}
|
|
234
|
-
triggerUnBuffered(x) {
|
|
235
|
-
return Task.runTask(this, { x: x });
|
|
236
|
-
}
|
|
237
|
-
triggerBuffered(x) {
|
|
238
|
-
return this.bufferRunner.trigger(x);
|
|
239
|
-
}
|
|
240
|
-
// Step notification method with typed step names
|
|
241
|
-
notifyStep(stepName) {
|
|
242
|
-
// Complete previous step if exists
|
|
243
|
-
if (this.currentStepName) {
|
|
244
|
-
const prevStep = this.steps.get(this.currentStepName);
|
|
245
|
-
if (prevStep && prevStep.status === 'active') {
|
|
246
|
-
prevStep.complete();
|
|
247
|
-
this.stepProgress.set(this.currentStepName, prevStep.percentage);
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
// Start new step
|
|
251
|
-
const step = this.steps.get(stepName);
|
|
252
|
-
if (step) {
|
|
253
|
-
step.start();
|
|
254
|
-
this.currentStepName = stepName;
|
|
255
|
-
this.emitEvent('step', { stepName: stepName });
|
|
256
|
-
if (this.name) {
|
|
257
|
-
logger.log('info', `Task ${this.name}: Starting step "${stepName}" - ${step.description}`);
|
|
258
|
-
}
|
|
259
|
-
}
|
|
260
|
-
}
|
|
261
|
-
// Get current progress based on completed steps
|
|
262
|
-
getProgress() {
|
|
263
|
-
let totalProgress = 0;
|
|
264
|
-
for (const [stepName, percentage] of this.stepProgress) {
|
|
265
|
-
totalProgress += percentage;
|
|
266
|
-
}
|
|
267
|
-
// Add partial progress of current step if exists
|
|
268
|
-
if (this.currentStepName) {
|
|
269
|
-
const currentStep = this.steps.get(this.currentStepName);
|
|
270
|
-
if (currentStep && currentStep.status === 'active') {
|
|
271
|
-
// Could add partial progress calculation here if needed
|
|
272
|
-
// For now, we'll consider active steps as 50% complete
|
|
273
|
-
totalProgress += currentStep.percentage * 0.5;
|
|
274
|
-
}
|
|
275
|
-
}
|
|
276
|
-
return Math.min(100, Math.round(totalProgress));
|
|
277
|
-
}
|
|
278
|
-
// Get all steps metadata
|
|
279
|
-
getStepsMetadata() {
|
|
280
|
-
return Array.from(this.steps.values()).map(step => step.toJSON());
|
|
281
|
-
}
|
|
282
|
-
// Get task metadata
|
|
283
|
-
getMetadata() {
|
|
284
|
-
let status;
|
|
285
|
-
if (this.running) {
|
|
286
|
-
status = 'running';
|
|
287
|
-
}
|
|
288
|
-
else if (this.lastError) {
|
|
289
|
-
status = 'failed';
|
|
290
|
-
}
|
|
291
|
-
else if (this.runCount > 0) {
|
|
292
|
-
status = 'completed';
|
|
293
|
-
}
|
|
294
|
-
else {
|
|
295
|
-
status = 'idle';
|
|
296
|
-
}
|
|
297
|
-
return {
|
|
298
|
-
name: this.name || 'unnamed',
|
|
299
|
-
version: this.version,
|
|
300
|
-
status,
|
|
301
|
-
steps: this.getStepsMetadata(),
|
|
302
|
-
currentStep: this.currentStepName,
|
|
303
|
-
currentProgress: this.getProgress(),
|
|
304
|
-
runCount: this.runCount,
|
|
305
|
-
buffered: this.buffered,
|
|
306
|
-
bufferMax: this.bufferMax,
|
|
307
|
-
timeout: this.timeout,
|
|
308
|
-
cronSchedule: this.cronJob?.cronExpression,
|
|
309
|
-
lastError: this.lastError?.message,
|
|
310
|
-
errorCount: this.errorCount,
|
|
311
|
-
labels: { ...this.labels },
|
|
312
|
-
};
|
|
313
|
-
}
|
|
314
|
-
// Reset all steps to pending state
|
|
315
|
-
resetSteps() {
|
|
316
|
-
this.steps.forEach(step => step.reset());
|
|
317
|
-
this.stepProgress.clear();
|
|
318
|
-
this.currentStepName = undefined;
|
|
319
|
-
}
|
|
320
|
-
// Complete all remaining steps (useful for cleanup)
|
|
321
|
-
completeAllSteps() {
|
|
322
|
-
if (this.currentStepName) {
|
|
323
|
-
const currentStep = this.steps.get(this.currentStepName);
|
|
324
|
-
if (currentStep && currentStep.status === 'active') {
|
|
325
|
-
currentStep.complete();
|
|
326
|
-
this.stepProgress.set(this.currentStepName, currentStep.percentage);
|
|
327
|
-
}
|
|
328
|
-
}
|
|
329
|
-
// Mark any pending steps as completed (in case of early task completion)
|
|
330
|
-
this.steps.forEach((step, name) => {
|
|
331
|
-
if (step.status === 'pending') {
|
|
332
|
-
// Don't add their percentage to progress since they weren't actually executed
|
|
333
|
-
step.status = 'completed';
|
|
334
|
-
}
|
|
335
|
-
});
|
|
336
|
-
}
|
|
337
|
-
}
|
|
338
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFza2J1ZmZlci5jbGFzc2VzLnRhc2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy90YXNrYnVmZmVyLmNsYXNzZXMudGFzay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLHlCQUF5QixDQUFDO0FBQ25ELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUNwRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDcEUsT0FBTyxFQUFFLFFBQVEsRUFBa0IsTUFBTSxrQ0FBa0MsQ0FBQztBQUc1RSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFlakQsTUFBTSxPQUFPLElBQUk7SUFDUixNQUFNLENBQUMsV0FBVyxDQUN2QixpQkFBNEQ7UUFFNUQsUUFBUSxJQUFJLEVBQUUsQ0FBQztZQUNiLEtBQUssQ0FBQyxpQkFBaUI7Z0JBQ3JCLE9BQU8sSUFBSSxDQUFDO1lBQ2QsS0FBSyxpQkFBaUIsWUFBWSxJQUFJO2dCQUNwQyxPQUFPLGlCQUFvQyxDQUFDO1lBQzlDLEtBQUssT0FBTyxpQkFBaUIsS0FBSyxVQUFVO2dCQUMxQyxNQUFNLFlBQVksR0FBRyxpQkFBNEMsQ0FBQztnQkFDbEUsT0FBTyxZQUFZLEVBQWdDLENBQUM7WUFDdEQ7Z0JBQ0UsT0FBTyxJQUFJLENBQUM7UUFDaEIsQ0FBQztJQUNILENBQUM7YUFFYSxzQkFBaUIsR0FBa0IsVUFBVSxDQUFDO1FBQzFELE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDMUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2YsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3RCLENBQUMsQUFKOEIsQ0FJN0I7YUFFWSxXQUFNLEdBQUcsQ0FBQyxPQUFrQixFQUFXLEVBQUU7UUFDckQsSUFBSSxPQUFPLFlBQVksSUFBSSxJQUFJ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
|
|
@@ -1,14 +0,0 @@
|
|
|
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): boolean;
|
|
13
|
-
shiftTask(): Task | undefined;
|
|
14
|
-
}
|
|
@@ -1,60 +0,0 @@
|
|
|
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
|
-
logger.log('info', `${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
|
-
}).catch((err) => {
|
|
27
|
-
const chainError = new Error(`Taskchain "${this.name}": task "${this.taskArray[taskCounter].name || 'unnamed'}" (index ${taskCounter}) failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
28
|
-
chainError.cause = err;
|
|
29
|
-
done.reject(chainError);
|
|
30
|
-
});
|
|
31
|
-
}
|
|
32
|
-
else {
|
|
33
|
-
logger.log('info', `Taskchain "${this.name}" completed successfully`);
|
|
34
|
-
done.resolve(x);
|
|
35
|
-
}
|
|
36
|
-
};
|
|
37
|
-
iterateTasks(x);
|
|
38
|
-
return done.promise;
|
|
39
|
-
},
|
|
40
|
-
},
|
|
41
|
-
};
|
|
42
|
-
super(options);
|
|
43
|
-
this.taskArray = optionsArg.taskArray;
|
|
44
|
-
}
|
|
45
|
-
addTask(taskArg) {
|
|
46
|
-
this.taskArray.push(taskArg);
|
|
47
|
-
}
|
|
48
|
-
removeTask(taskArg) {
|
|
49
|
-
const index = this.taskArray.indexOf(taskArg);
|
|
50
|
-
if (index === -1) {
|
|
51
|
-
return false;
|
|
52
|
-
}
|
|
53
|
-
this.taskArray.splice(index, 1);
|
|
54
|
-
return true;
|
|
55
|
-
}
|
|
56
|
-
shiftTask() {
|
|
57
|
-
return this.taskArray.shift();
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFza2J1ZmZlci5jbGFzc2VzLnRhc2tjaGFpbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL3Rhc2tidWZmZXIuY2xhc3Nlcy50YXNrY2hhaW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEseUJBQXlCO0FBQ3pCLG1CQUFtQjtBQUVuQixPQUFPLEtBQUssT0FBTyxNQUFNLHlCQUF5QixDQUFDO0FBQ25ELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFakQsTUFBTSxPQUFPLFNBQVUsU0FBUSxJQUFJO0lBRWpDLFlBQVksVUFNWDtRQUNDLE1BQU0sT0FBTyxHQUFHO1lBQ2QsR0FBRztnQkFDRCxJQUFJLEVBQUUsbUJBQW1CO2dCQUN6QixHQUFHLEVBQUUsS0FBSzthQUNYO1lBQ0QsR0FBRyxVQUFVO1lBQ2IsR0FBRztnQkFDRCxZQUFZLEVBQUUsQ0FBQyxDQUFNLEVBQUUsRUFBRTtvQkFDdkIsc0VBQXNFO29CQUN0RSxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsdUNBQXVDO29CQUNsRixJQUFJLFdBQVcsR0FBRyxDQUFDLENBQUMsQ0FBQyxpREFBaUQ7b0JBQ3RFLE1BQU0sWUFBWSxHQUFHLENBQUMsQ0FBTSxFQUFFLEVBQUU7d0JBQzlCLElBQUksT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxLQUFLLFdBQVcsRUFBRSxDQUFDOzRCQUN2RCxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLGtCQUFrQixJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7NEJBQ3JGLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO2dDQUNoRCxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO2dDQUNyRCxXQUFXLEVBQUUsQ0FBQztnQ0FDZCxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7NEJBQ2xCLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO2dDQUNmLE1BQU0sVUFBVSxHQUFHLElBQUksS0FBSyxDQUMxQixjQUFjLElBQUksQ0FBQyxJQUFJLFlBQVksSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLElBQUksU0FBUyxZQUFZLFdBQVcsYUFBYSxHQUFHLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FDdkssQ0FBQztnQ0FDRCxVQUFrQixDQUFDLEtBQUssR0FBRyxHQUFHLENBQUM7Z0NBQ2hDLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7NEJBQzFCLENBQUMsQ0FBQyxDQUFDO3dCQUNMLENBQUM7NkJBQU0sQ0FBQzs0QkFDTixNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxjQUFjLElBQUksQ0FBQyxJQUFJLDBCQUEwQixDQUFDLENBQUM7NEJBQ3RFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7d0JBQ2xCLENBQUM7b0JBQ0gsQ0FBQyxDQUFDO29CQUNGLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDaEIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO2dCQUN0QixDQUFDO2FBQ0Y7U0FDRixDQUFDO1FBQ0YsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2YsSUFBSSxDQUFDLFNBQVMsR0FBRyxVQUFVLENBQUMsU0FBUyxDQUFDO0lBQ3hDLENBQUM7SUFDRCxPQUFPLENBQUMsT0FBYTtRQUNuQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBQ0QsVUFBVSxDQUFDLE9BQWE7UUFDdEIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDOUMsSUFBSSxLQUFLLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNqQixPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFDRCxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDaEMsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBQ0QsU0FBUztRQUNQLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUNoQyxDQUFDO0NBQ0YifQ==
|
|
@@ -1,10 +0,0 @@
|
|
|
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
|
-
}
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
import * as plugins from './taskbuffer.plugins.js';
|
|
2
|
-
import { Task } from './taskbuffer.classes.task.js';
|
|
3
|
-
import { logger } from './taskbuffer.logging.js';
|
|
4
|
-
export class TaskDebounced extends Task {
|
|
5
|
-
constructor(optionsArg) {
|
|
6
|
-
super({
|
|
7
|
-
name: optionsArg.name,
|
|
8
|
-
taskFunction: async (x) => {
|
|
9
|
-
this._observableIntake.push(x);
|
|
10
|
-
},
|
|
11
|
-
});
|
|
12
|
-
this._observableIntake = new plugins.smartrx.ObservableIntake();
|
|
13
|
-
this.taskFunction = optionsArg.taskFunction;
|
|
14
|
-
this._observableIntake.observable
|
|
15
|
-
.pipe(plugins.smartrx.rxjs.ops.debounceTime(optionsArg.debounceTimeInMillis))
|
|
16
|
-
.subscribe({
|
|
17
|
-
next: async (x) => {
|
|
18
|
-
try {
|
|
19
|
-
await this.taskFunction(x);
|
|
20
|
-
}
|
|
21
|
-
catch (err) {
|
|
22
|
-
logger.log('error', `TaskDebounced "${this.name || 'unnamed'}" failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
23
|
-
}
|
|
24
|
-
},
|
|
25
|
-
error: (err) => {
|
|
26
|
-
logger.log('error', `TaskDebounced "${this.name || 'unnamed'}" observable error: ${err instanceof Error ? err.message : String(err)}`);
|
|
27
|
-
},
|
|
28
|
-
});
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFza2J1ZmZlci5jbGFzc2VzLnRhc2tkZWJvdW5jZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy90YXNrYnVmZmVyLmNsYXNzZXMudGFza2RlYm91bmNlZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLHlCQUF5QixDQUFDO0FBRW5ELE9BQU8sRUFBRSxJQUFJLEVBQXNCLE1BQU0sOEJBQThCLENBQUM7QUFDeEUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRWpELE1BQU0sT0FBTyxhQUEyQixTQUFRLElBQUk7SUFJbEQsWUFBWSxVQUlYO1FBQ0MsS0FBSyxDQUFDO1lBQ0osSUFBSSxFQUFFLFVBQVUsQ0FBQyxJQUFJO1lBQ3JCLFlBQVksRUFBRSxLQUFLLEVBQUUsQ0FBSSxFQUFFLEVBQUU7Z0JBQzNCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDakMsQ0FBQztTQUNGLENBQUMsQ0FBQztRQVpHLHNCQUFpQixHQUFHLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBSyxDQUFDO1FBYXBFLElBQUksQ0FBQyxZQUFZLEdBQUcsVUFBVSxDQUFDLFlBQVksQ0FBQztRQUM1QyxJQUFJLENBQUMsaUJBQWlCLENBQUMsVUFBVTthQUM5QixJQUFJLENBQ0gsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQUMsQ0FDdkU7YUFDQSxTQUFTLENBQUM7WUFDVCxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUNoQixJQUFJLENBQUM7b0JBQ0gsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUM3QixDQUFDO2dCQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7b0JBQ2IsTUFBTSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsa0JBQWtCLElBQUksQ0FBQyxJQUFJLElBQUksU0FBUyxhQUFhLEdBQUcsWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQy9ILENBQUM7WUFDSCxDQUFDO1lBQ0QsS0FBSyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUU7Z0JBQ2IsTUFBTSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsa0JBQWtCLElBQUksQ0FBQyxJQUFJLElBQUksU0FBUyx1QkFBdUIsR0FBRyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN6SSxDQUFDO1NBQ0YsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztDQUNGIn0=
|
|
@@ -1,54 +0,0 @@
|
|
|
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, ITaskEvent } 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
|
-
readonly taskSubject: plugins.smartrx.rxjs.Subject<ITaskEvent>;
|
|
17
|
-
private taskSubscriptions;
|
|
18
|
-
private cronJobManager;
|
|
19
|
-
options: ITaskManagerConstructorOptions;
|
|
20
|
-
constructor(options?: ITaskManagerConstructorOptions);
|
|
21
|
-
getTaskByName(taskName: string): Task<any, any>;
|
|
22
|
-
addTask(task: Task<any, any>): void;
|
|
23
|
-
removeTask(task: Task<any, any>): void;
|
|
24
|
-
addAndScheduleTask(task: Task<any, any>, cronString: string): void;
|
|
25
|
-
triggerTaskByName(taskName: string): Promise<any>;
|
|
26
|
-
triggerTask(task: Task<any, any>): Promise<any>;
|
|
27
|
-
scheduleTaskByName(taskName: string, cronString: string): void;
|
|
28
|
-
private handleTaskScheduling;
|
|
29
|
-
private logTaskState;
|
|
30
|
-
private performDistributedConsultation;
|
|
31
|
-
descheduleTaskByName(taskName: string): void;
|
|
32
|
-
descheduleTask(task: Task<any, any>): Promise<void>;
|
|
33
|
-
getScheduleForTaskName(taskName: string): string | null;
|
|
34
|
-
start(): Promise<void>;
|
|
35
|
-
stop(): Promise<void>;
|
|
36
|
-
getTaskMetadata(taskName: string): ITaskMetadata | null;
|
|
37
|
-
getAllTasksMetadata(): ITaskMetadata[];
|
|
38
|
-
getScheduledTasks(): IScheduledTaskInfo[];
|
|
39
|
-
getNextScheduledRuns(limit?: number): Array<{
|
|
40
|
-
taskName: string;
|
|
41
|
-
nextRun: Date;
|
|
42
|
-
schedule: string;
|
|
43
|
-
}>;
|
|
44
|
-
getTasksByLabel(key: string, value: string): Task<any, any>[];
|
|
45
|
-
getTasksMetadataByLabel(key: string, value: string): ITaskMetadata[];
|
|
46
|
-
addExecuteRemoveTask<T, TSteps extends ReadonlyArray<{
|
|
47
|
-
name: string;
|
|
48
|
-
description: string;
|
|
49
|
-
percentage: number;
|
|
50
|
-
}>>(task: Task<T, TSteps>, options?: {
|
|
51
|
-
schedule?: string;
|
|
52
|
-
trackProgress?: boolean;
|
|
53
|
-
}): Promise<ITaskExecutionReport>;
|
|
54
|
-
}
|