@push.rocks/taskbuffer 3.0.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/dist_bundle/bundle.js +18376 -0
- package/dist_bundle/bundle.js.map +7 -0
- package/dist_ts/00_commitinfo_data.d.ts +8 -0
- package/dist_ts/00_commitinfo_data.js +9 -0
- package/dist_ts/index.d.ts +10 -0
- package/dist_ts/index.js +10 -0
- package/dist_ts/taskbuffer.classes.bufferrunner.d.ts +8 -0
- package/dist_ts/taskbuffer.classes.bufferrunner.js +35 -0
- package/dist_ts/taskbuffer.classes.cyclecounter.d.ts +13 -0
- package/dist_ts/taskbuffer.classes.cyclecounter.js +31 -0
- package/dist_ts/taskbuffer.classes.distributedcoordinator.d.ts +29 -0
- package/dist_ts/taskbuffer.classes.distributedcoordinator.js +5 -0
- package/dist_ts/taskbuffer.classes.task.d.ts +84 -0
- package/dist_ts/taskbuffer.classes.task.js +159 -0
- package/dist_ts/taskbuffer.classes.taskchain.d.ts +14 -0
- package/dist_ts/taskbuffer.classes.taskchain.js +51 -0
- package/dist_ts/taskbuffer.classes.taskdebounced.d.ts +10 -0
- package/dist_ts/taskbuffer.classes.taskdebounced.js +20 -0
- package/dist_ts/taskbuffer.classes.taskmanager.d.ts +68 -0
- package/dist_ts/taskbuffer.classes.taskmanager.js +129 -0
- package/dist_ts/taskbuffer.classes.taskonce.d.ts +11 -0
- package/dist_ts/taskbuffer.classes.taskonce.js +20 -0
- package/dist_ts/taskbuffer.classes.taskparallel.d.ts +7 -0
- package/dist_ts/taskbuffer.classes.taskparallel.js +23 -0
- package/dist_ts/taskbuffer.classes.taskrunner.d.ts +30 -0
- package/dist_ts/taskbuffer.classes.taskrunner.js +54 -0
- package/dist_ts/taskbuffer.logging.d.ts +2 -0
- package/dist_ts/taskbuffer.logging.js +3 -0
- package/dist_ts/taskbuffer.plugins.d.ts +8 -0
- package/dist_ts/taskbuffer.plugins.js +9 -0
- package/npmextra.json +18 -0
- package/package.json +62 -0
- package/readme.md +63 -0
- package/ts/00_commitinfo_data.ts +8 -0
- package/ts/index.ts +12 -0
- package/ts/taskbuffer.classes.bufferrunner.ts +39 -0
- package/ts/taskbuffer.classes.cyclecounter.ts +36 -0
- package/ts/taskbuffer.classes.distributedcoordinator.ts +34 -0
- package/ts/taskbuffer.classes.task.ts +236 -0
- package/ts/taskbuffer.classes.taskchain.ts +58 -0
- package/ts/taskbuffer.classes.taskdebounced.ts +27 -0
- package/ts/taskbuffer.classes.taskmanager.ts +155 -0
- package/ts/taskbuffer.classes.taskonce.ts +21 -0
- package/ts/taskbuffer.classes.taskparallel.ts +24 -0
- package/ts/taskbuffer.classes.taskrunner.ts +63 -0
- package/ts/taskbuffer.logging.ts +3 -0
- package/ts/taskbuffer.plugins.ts +9 -0
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import * as plugins from './taskbuffer.plugins.js';
|
|
2
|
+
import './taskbuffer.classes.task.js';
|
|
3
|
+
import './taskbuffer.classes.distributedcoordinator.js';
|
|
4
|
+
export class TaskManager {
|
|
5
|
+
constructor(optionosArg = {}) {
|
|
6
|
+
this.randomId = plugins.isounique.uni();
|
|
7
|
+
this.taskMap = new plugins.lik.ObjectMap();
|
|
8
|
+
this.cronJobManager = new plugins.smarttime.CronManager();
|
|
9
|
+
this.options = {
|
|
10
|
+
distributedCoordinator: null
|
|
11
|
+
};
|
|
12
|
+
this.options = Object.assign(this.options, optionosArg);
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* checks if a task is already present
|
|
16
|
+
* @param taskNameArg
|
|
17
|
+
*/
|
|
18
|
+
getTaskByName(taskNameArg) {
|
|
19
|
+
return this.taskMap.findSync((itemArg) => {
|
|
20
|
+
return itemArg.name === taskNameArg;
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* adds a Task to the TaskManager
|
|
25
|
+
* @param taskArg
|
|
26
|
+
*/
|
|
27
|
+
addTask(taskArg) {
|
|
28
|
+
if (!taskArg.name) {
|
|
29
|
+
throw new Error('taskArg needs a name to be added to taskManager');
|
|
30
|
+
}
|
|
31
|
+
this.taskMap.add(taskArg);
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* adds and schedules a task at once
|
|
35
|
+
* @param taskArg
|
|
36
|
+
* @param cronStringArg
|
|
37
|
+
*/
|
|
38
|
+
addAndScheduleTask(taskArg, cronStringArg) {
|
|
39
|
+
this.addTask(taskArg);
|
|
40
|
+
this.scheduleTaskByName(taskArg.name, cronStringArg);
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* triggers a task in the TaskManagerByName
|
|
44
|
+
* @param taskNameArg
|
|
45
|
+
*/
|
|
46
|
+
triggerTaskByName(taskNameArg) {
|
|
47
|
+
const taskToTrigger = this.getTaskByName(taskNameArg);
|
|
48
|
+
if (!taskToTrigger) {
|
|
49
|
+
throw new Error(`There is no task with the name of ${taskNameArg}`);
|
|
50
|
+
}
|
|
51
|
+
return taskToTrigger.trigger();
|
|
52
|
+
}
|
|
53
|
+
async triggerTask(task) {
|
|
54
|
+
return task.trigger();
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* schedules the task by name
|
|
58
|
+
* @param taskNameArg
|
|
59
|
+
*/
|
|
60
|
+
scheduleTaskByName(taskNameArg, cronStringArg) {
|
|
61
|
+
const taskToSchedule = this.getTaskByName(taskNameArg);
|
|
62
|
+
const cronJob = this.cronJobManager.addCronjob(cronStringArg, async (triggerTimeArg) => {
|
|
63
|
+
console.log(`taskbuffer schedule triggered task >>${taskToSchedule.name}<<`);
|
|
64
|
+
console.log(`task >>${taskToSchedule.name}<< is ${taskToSchedule.buffered
|
|
65
|
+
? `buffered with max ${taskToSchedule.bufferMax} buffered calls`
|
|
66
|
+
: `unbuffered`}`);
|
|
67
|
+
if (this.options.distributedCoordinator) {
|
|
68
|
+
console.log(`Found a distrubuted coordinator, performing distributed consultation.`);
|
|
69
|
+
const announcementResult = await this.options.distributedCoordinator.fireDistributedTaskRequest({
|
|
70
|
+
submitterRandomId: this.randomId,
|
|
71
|
+
status: 'requesting',
|
|
72
|
+
taskExecutionParallel: 1,
|
|
73
|
+
taskExecutionTime: triggerTimeArg,
|
|
74
|
+
taskExecutionTimeout: taskToSchedule.timeout,
|
|
75
|
+
taskName: taskToSchedule.name,
|
|
76
|
+
taskVersion: taskToSchedule.version,
|
|
77
|
+
});
|
|
78
|
+
if (!announcementResult.shouldTrigger) {
|
|
79
|
+
console.log('distributed coordinator result: NOT EXECUTING');
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
console.log('distributed coordinator result: CHOSEN AND EXECUTING');
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
await taskToSchedule.trigger();
|
|
87
|
+
});
|
|
88
|
+
taskToSchedule.cronJob = cronJob;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* deschedules a task by name
|
|
92
|
+
* @param taskNameArg
|
|
93
|
+
*/
|
|
94
|
+
descheduleTaskByName(taskNameArg) {
|
|
95
|
+
const taskToDeSchedule = this.getTaskByName(taskNameArg);
|
|
96
|
+
if (taskToDeSchedule.cronJob) {
|
|
97
|
+
this.cronJobManager.removeCronjob(taskToDeSchedule.cronJob);
|
|
98
|
+
taskToDeSchedule.cronJob = null;
|
|
99
|
+
}
|
|
100
|
+
if (this.cronJobManager.cronjobs.isEmpty) {
|
|
101
|
+
this.cronJobManager.stop();
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* deschedules a task
|
|
106
|
+
* @param task
|
|
107
|
+
*/
|
|
108
|
+
async descheduleTask(task) {
|
|
109
|
+
await this.descheduleTaskByName(task.name);
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* returns all schedules of a specific task
|
|
113
|
+
* @param taskNameArg
|
|
114
|
+
*/
|
|
115
|
+
getSchedulesForTaskName(taskNameArg) { }
|
|
116
|
+
/**
|
|
117
|
+
* starts the taskmanager
|
|
118
|
+
*/
|
|
119
|
+
start() {
|
|
120
|
+
this.cronJobManager.start();
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* stops the taskmanager
|
|
124
|
+
*/
|
|
125
|
+
stop() {
|
|
126
|
+
this.cronJobManager.stop();
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFza2J1ZmZlci5jbGFzc2VzLnRhc2ttYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvdGFza2J1ZmZlci5jbGFzc2VzLnRhc2ttYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0seUJBQXlCLENBQUM7QUFDbkQsT0FBcUIsOEJBQThCLENBQUM7QUFDcEQsT0FBK0MsZ0RBQWdELENBQUM7QUFZaEcsTUFBTSxPQUFPLFdBQVc7SUFTdEIsWUFBWSxjQUE4QyxFQUFFO1FBUnJELGFBQVEsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ25DLFlBQU8sR0FBRyxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFRLENBQUM7UUFDM0MsbUJBQWMsR0FBRyxJQUFJLE9BQU8sQ0FBQyxTQUFTLENBQUMsV0FBVyxFQUFFLENBQUM7UUFFdEQsWUFBTyxHQUFtQztZQUMvQyxzQkFBc0IsRUFBRSxJQUFJO1NBQzdCLENBQUM7UUFHQSxJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxXQUFXLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksYUFBYSxDQUFDLFdBQW1CO1FBQ3RDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUN2QyxPQUFPLE9BQU8sQ0FBQyxJQUFJLEtBQUssV0FBVyxDQUFDO1FBQ3RDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUNJLE9BQU8sQ0FBQyxPQUFhO1FBQzFCLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFO1lBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMsaURBQWlELENBQUMsQ0FBQztTQUNwRTtRQUNELElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFD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
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Task, ITaskFunction } from './taskbuffer.classes.task.js';
|
|
2
|
+
/**
|
|
3
|
+
* TaskOnce is run exactly once, no matter how often it is triggered
|
|
4
|
+
*/
|
|
5
|
+
export declare class TaskOnce extends Task {
|
|
6
|
+
hasTriggered: boolean;
|
|
7
|
+
constructor(optionsArg: {
|
|
8
|
+
name?: string;
|
|
9
|
+
taskFunction: ITaskFunction;
|
|
10
|
+
});
|
|
11
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import './taskbuffer.plugins.js';
|
|
2
|
+
import { Task } from './taskbuffer.classes.task.js';
|
|
3
|
+
/**
|
|
4
|
+
* TaskOnce is run exactly once, no matter how often it is triggered
|
|
5
|
+
*/
|
|
6
|
+
export class TaskOnce extends Task {
|
|
7
|
+
constructor(optionsArg) {
|
|
8
|
+
super({
|
|
9
|
+
name: optionsArg.name,
|
|
10
|
+
taskFunction: async () => {
|
|
11
|
+
if (!this.hasTriggered) {
|
|
12
|
+
this.hasTriggered = true;
|
|
13
|
+
await optionsArg.taskFunction();
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
});
|
|
17
|
+
this.hasTriggered = false;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFza2J1ZmZlci5jbGFzc2VzLnRhc2tvbmNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvdGFza2J1ZmZlci5jbGFzc2VzLnRhc2tvbmNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQXlCLHlCQUF5QixDQUFDO0FBRW5ELE9BQU8sRUFBRSxJQUFJLEVBQWlCLE1BQU0sOEJBQThCLENBQUM7QUFFbkU7O0dBRUc7QUFDSCxNQUFNLE9BQU8sUUFBUyxTQUFRLElBQUk7SUFFaEMsWUFBWSxVQUEwRDtRQUNwRSxLQUFLLENBQUM7WUFDSixJQUFJLEVBQUUsVUFBVSxDQUFDLElBQUk7WUFDckIsWUFBWSxFQUFFLEtBQUssSUFBSSxFQUFFO2dCQUN2QixJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRTtvQkFDdEIsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7b0JBQ3pCLE1BQU0sVUFBVSxDQUFDLFlBQVksRUFBRSxDQUFDO2lCQUNqQztZQUNILENBQUM7U0FDRixDQUFDLENBQUM7UUFWTCxpQkFBWSxHQUFZLEtBQUssQ0FBQztJQVc5QixDQUFDO0NBQ0YifQ==
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import * as plugins from './taskbuffer.plugins.js';
|
|
2
|
+
import { Task } from './taskbuffer.classes.task.js';
|
|
3
|
+
export class Taskparallel extends Task {
|
|
4
|
+
constructor(optionsArg) {
|
|
5
|
+
const options = {
|
|
6
|
+
...optionsArg,
|
|
7
|
+
...{
|
|
8
|
+
taskFunction: () => {
|
|
9
|
+
const done = plugins.smartpromise.defer();
|
|
10
|
+
const promiseArray = []; // stores promises of all tasks, since they run in parallel
|
|
11
|
+
this.taskArray.forEach(function (taskArg) {
|
|
12
|
+
promiseArray.push(taskArg.trigger());
|
|
13
|
+
});
|
|
14
|
+
Promise.all(promiseArray).then(done.resolve);
|
|
15
|
+
return done.promise;
|
|
16
|
+
},
|
|
17
|
+
},
|
|
18
|
+
};
|
|
19
|
+
super(options);
|
|
20
|
+
this.taskArray = optionsArg.taskArray;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFza2J1ZmZlci5jbGFzc2VzLnRhc2twYXJhbGxlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3Rhc2tidWZmZXIuY2xhc3Nlcy50YXNrcGFyYWxsZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSx5QkFBeUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFFcEQsTUFBTSxPQUFPLFlBQWEsU0FBUSxJQUFJO0lBRXBDLFlBQVksVUFBaUM7UUFDM0MsTUFBTSxPQUFPLEdBQUc7WUFDZCxHQUFHLFVBQVU7WUFDYixHQUFHO2dCQUNELFlBQVksRUFBRSxHQUFHLEVBQUU7b0JBQ2pCLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLENBQUM7b0JBQzFDLE1BQU0sWUFBWSxHQUFtQixFQUFFLENBQUMsQ0FBQywyREFBMkQ7b0JBQ3BHLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFVBQVUsT0FBTzt3QkFDdEMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztvQkFDdkMsQ0FBQyxDQUFDLENBQUM7b0JBQ0gsT0FBTyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO29CQUM3QyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7Z0JBQ3RCLENBQUM7YUFDRjtTQUNGLENBQUM7UUFDRixLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDZixJQUFJLENBQUMsU0FBUyxHQUFHLFVBQVUsQ0FBQyxTQUFTLENBQUM7SUFDeEMsQ0FBQztDQUNGIn0=
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import * as plugins from './taskbuffer.plugins.js';
|
|
2
|
+
import { Task } from './taskbuffer.classes.task.js';
|
|
3
|
+
export declare class TaskRunner {
|
|
4
|
+
maxParrallelJobs: number;
|
|
5
|
+
status: 'stopped' | 'running';
|
|
6
|
+
runningTasks: plugins.lik.ObjectMap<Task>;
|
|
7
|
+
qeuedTasks: Task[];
|
|
8
|
+
constructor();
|
|
9
|
+
/**
|
|
10
|
+
* adds a task to the qeue
|
|
11
|
+
*/
|
|
12
|
+
addTask(taskArg: Task): void;
|
|
13
|
+
/**
|
|
14
|
+
* set amount of parallel tasks
|
|
15
|
+
* be careful, you might loose dependability of tasks
|
|
16
|
+
*/
|
|
17
|
+
setMaxParallelJobs(maxParrallelJobsArg: number): void;
|
|
18
|
+
/**
|
|
19
|
+
* starts the task queue
|
|
20
|
+
*/
|
|
21
|
+
start(): Promise<void>;
|
|
22
|
+
/**
|
|
23
|
+
* checks wether execution is on point
|
|
24
|
+
*/
|
|
25
|
+
checkExecution(): Promise<void>;
|
|
26
|
+
/**
|
|
27
|
+
* stops the task queue
|
|
28
|
+
*/
|
|
29
|
+
stop(): Promise<void>;
|
|
30
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import * as plugins from './taskbuffer.plugins.js';
|
|
2
|
+
import './taskbuffer.classes.task.js';
|
|
3
|
+
export class TaskRunner {
|
|
4
|
+
constructor() {
|
|
5
|
+
this.maxParrallelJobs = 1;
|
|
6
|
+
this.status = 'stopped';
|
|
7
|
+
this.runningTasks = new plugins.lik.ObjectMap();
|
|
8
|
+
this.qeuedTasks = [];
|
|
9
|
+
this.runningTasks.eventSubject.subscribe(async (eventArg) => {
|
|
10
|
+
this.checkExecution();
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* adds a task to the qeue
|
|
15
|
+
*/
|
|
16
|
+
addTask(taskArg) {
|
|
17
|
+
this.qeuedTasks.push(taskArg);
|
|
18
|
+
this.checkExecution();
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* set amount of parallel tasks
|
|
22
|
+
* be careful, you might loose dependability of tasks
|
|
23
|
+
*/
|
|
24
|
+
setMaxParallelJobs(maxParrallelJobsArg) {
|
|
25
|
+
this.maxParrallelJobs = maxParrallelJobsArg;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* starts the task queue
|
|
29
|
+
*/
|
|
30
|
+
async start() {
|
|
31
|
+
this.status = 'running';
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* checks wether execution is on point
|
|
35
|
+
*/
|
|
36
|
+
async checkExecution() {
|
|
37
|
+
if (this.runningTasks.getArray().length < this.maxParrallelJobs &&
|
|
38
|
+
this.status === 'running' &&
|
|
39
|
+
this.qeuedTasks.length > 0) {
|
|
40
|
+
const nextJob = this.qeuedTasks.shift();
|
|
41
|
+
this.runningTasks.add(nextJob);
|
|
42
|
+
await nextJob.trigger();
|
|
43
|
+
this.runningTasks.remove(nextJob);
|
|
44
|
+
this.checkExecution();
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* stops the task queue
|
|
49
|
+
*/
|
|
50
|
+
async stop() {
|
|
51
|
+
this.status = 'stopped';
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFza2J1ZmZlci5jbGFzc2VzLnRhc2tydW5uZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy90YXNrYnVmZmVyLmNsYXNzZXMudGFza3J1bm5lci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLHlCQUF5QixDQUFDO0FBRW5ELE9BQXFCLDhCQUE4QixDQUFDO0FBRXBELE1BQU0sT0FBTyxVQUFVO0lBTXJCO1FBTE8scUJBQWdCLEdBQVcsQ0FBQyxDQUFDO1FBQzdCLFdBQU0sR0FBMEIsU0FBUyxDQUFDO1FBQzFDLGlCQUFZLEdBQWdDLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQVEsQ0FBQztRQUM5RSxlQUFVLEdBQVcsRUFBRSxDQUFDO1FBRzdCLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLEVBQUU7WUFDMUQsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3hCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0ksT0FBTyxDQUFDLE9BQWE7UUFDMUIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDOUIsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQ3hCLENBQUM7SUFFRDs7O09BR0c7SUFDSSxrQkFBa0IsQ0FBQyxtQkFBMkI7UUFDbkQsSUFBSSxDQUFDLGdCQUFnQixHQUFHLG1CQUFtQixDQUFDO0lBQzlDLENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxLQUFLO1FBQ2hCLElBQUksQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDO0lBQzFCLENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxjQUFjO1FBQ3pCLElBQ0UsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLGdCQUFnQjtZQUMzRCxJQUFJLENBQUMsTUFBTSxLQUFLLFNBQVM7WUFDekIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUMxQjtZQUNBLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDeEMsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDL0IsTUFBTSxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDbEMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1NBQ3ZCO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0ksS0FBSyxDQUFDLElBQUk7UUFDZixJQUFJLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQztJQUMxQixDQUFDO0NBQ0YifQ==
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import * as plugins from './taskbuffer.plugins.js';
|
|
2
|
+
export const logger = new plugins.smartlog.ConsoleLog();
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFza2J1ZmZlci5sb2dnaW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvdGFza2J1ZmZlci5sb2dnaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0seUJBQXlCLENBQUM7QUFFbkQsTUFBTSxDQUFDLE1BQU0sTUFBTSxHQUFHLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsQ0FBQyJ9
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import * as isounique from '@pushrocks/isounique';
|
|
2
|
+
import * as lik from '@pushrocks/lik';
|
|
3
|
+
import * as smartlog from '@pushrocks/smartlog';
|
|
4
|
+
import * as smartpromise from '@pushrocks/smartpromise';
|
|
5
|
+
import * as smartdelay from '@pushrocks/smartdelay';
|
|
6
|
+
import * as smartrx from '@pushrocks/smartrx';
|
|
7
|
+
import * as smarttime from '@pushrocks/smarttime';
|
|
8
|
+
export { isounique, lik, smartlog, smartpromise, smartdelay, smartrx, smarttime };
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import * as isounique from '@pushrocks/isounique';
|
|
2
|
+
import * as lik from '@pushrocks/lik';
|
|
3
|
+
import * as smartlog from '@pushrocks/smartlog';
|
|
4
|
+
import * as smartpromise from '@pushrocks/smartpromise';
|
|
5
|
+
import * as smartdelay from '@pushrocks/smartdelay';
|
|
6
|
+
import * as smartrx from '@pushrocks/smartrx';
|
|
7
|
+
import * as smarttime from '@pushrocks/smarttime';
|
|
8
|
+
export { isounique, lik, smartlog, smartpromise, smartdelay, smartrx, smarttime };
|
|
9
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFza2J1ZmZlci5wbHVnaW5zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvdGFza2J1ZmZlci5wbHVnaW5zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxTQUFTLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxLQUFLLEdBQUcsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0QyxPQUFPLEtBQUssUUFBUSxNQUFNLHFCQUFxQixDQUFDO0FBQ2hELE9BQU8sS0FBSyxZQUFZLE1BQU0seUJBQXlCLENBQUM7QUFDeEQsT0FBTyxLQUFLLFVBQVUsTUFBTSx1QkFBdUIsQ0FBQztBQUNwRCxPQUFPLEtBQUssT0FBTyxNQUFNLG9CQUFvQixDQUFDO0FBQzlDLE9BQU8sS0FBSyxTQUFTLE1BQU0sc0JBQXNCLENBQUM7QUFFbEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxDQUFDIn0=
|
package/npmextra.json
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"npmci": {
|
|
3
|
+
"npmGlobalTools": [],
|
|
4
|
+
"npmAccessLevel": "public",
|
|
5
|
+
"npmRegistryUrl": "registry.npmjs.org"
|
|
6
|
+
},
|
|
7
|
+
"gitzone": {
|
|
8
|
+
"projectType": "npm",
|
|
9
|
+
"module": {
|
|
10
|
+
"githost": "gitlab.com",
|
|
11
|
+
"gitscope": "pushrocks",
|
|
12
|
+
"gitrepo": "taskbuffer",
|
|
13
|
+
"shortDescription": "flexible task management. TypeScript ready!",
|
|
14
|
+
"npmPackagename": "@pushrocks/taskbuffer",
|
|
15
|
+
"license": "MIT"
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@push.rocks/taskbuffer",
|
|
3
|
+
"version": "3.0.10",
|
|
4
|
+
"private": false,
|
|
5
|
+
"description": "flexible task management. TypeScript ready!",
|
|
6
|
+
"main": "dist_ts/index.js",
|
|
7
|
+
"typings": "dist_ts/index.d.ts",
|
|
8
|
+
"type": "module",
|
|
9
|
+
"scripts": {
|
|
10
|
+
"test": "(tstest test/ --web)",
|
|
11
|
+
"build": "(tsbuild --web && tsbundle npm)"
|
|
12
|
+
},
|
|
13
|
+
"repository": {
|
|
14
|
+
"type": "git",
|
|
15
|
+
"url": "git+https://gitlab.com/pushrocks/taskbuffer.git"
|
|
16
|
+
},
|
|
17
|
+
"keywords": [
|
|
18
|
+
"gulp",
|
|
19
|
+
"task",
|
|
20
|
+
"buffer",
|
|
21
|
+
"TypeScript",
|
|
22
|
+
"push.rocks"
|
|
23
|
+
],
|
|
24
|
+
"author": "Lossless GmbH",
|
|
25
|
+
"license": "MIT",
|
|
26
|
+
"bugs": {
|
|
27
|
+
"url": "https://gitlab.com/pushrocks/taskbuffer/issues"
|
|
28
|
+
},
|
|
29
|
+
"homepage": "https://gitlab.com/pushrocks/taskbuffer#readme",
|
|
30
|
+
"dependencies": {
|
|
31
|
+
"@pushrocks/isounique": "^1.0.5",
|
|
32
|
+
"@pushrocks/lik": "^6.0.0",
|
|
33
|
+
"@pushrocks/smartdelay": "^2.0.13",
|
|
34
|
+
"@pushrocks/smartlog": "^3.0.1",
|
|
35
|
+
"@pushrocks/smartpromise": "^3.1.7",
|
|
36
|
+
"@pushrocks/smartrx": "^3.0.0",
|
|
37
|
+
"@pushrocks/smarttime": "^4.0.1"
|
|
38
|
+
},
|
|
39
|
+
"devDependencies": {
|
|
40
|
+
"@gitzone/tsbuild": "^2.1.63",
|
|
41
|
+
"@gitzone/tsbundle": "^2.0.6",
|
|
42
|
+
"@gitzone/tsrun": "^1.2.39",
|
|
43
|
+
"@gitzone/tstest": "^1.0.72",
|
|
44
|
+
"@pushrocks/tapbundle": "^5.0.4",
|
|
45
|
+
"@types/node": "^18.11.18"
|
|
46
|
+
},
|
|
47
|
+
"files": [
|
|
48
|
+
"ts/**/*",
|
|
49
|
+
"ts_web/**/*",
|
|
50
|
+
"dist/**/*",
|
|
51
|
+
"dist_*/**/*",
|
|
52
|
+
"dist_ts/**/*",
|
|
53
|
+
"dist_ts_web/**/*",
|
|
54
|
+
"assets/**/*",
|
|
55
|
+
"cli.js",
|
|
56
|
+
"npmextra.json",
|
|
57
|
+
"readme.md"
|
|
58
|
+
],
|
|
59
|
+
"browserslist": [
|
|
60
|
+
"last 1 chrome versions"
|
|
61
|
+
]
|
|
62
|
+
}
|
package/readme.md
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
# @pushrocks/taskbuffer
|
|
2
|
+
flexible task management. TypeScript ready!
|
|
3
|
+
|
|
4
|
+
## Availabililty and Links
|
|
5
|
+
* [npmjs.org (npm package)](https://www.npmjs.com/package/@pushrocks/taskbuffer)
|
|
6
|
+
* [gitlab.com (source)](https://gitlab.com/pushrocks/taskbuffer)
|
|
7
|
+
* [github.com (source mirror)](https://github.com/pushrocks/taskbuffer)
|
|
8
|
+
* [docs (typedoc)](https://pushrocks.gitlab.io/taskbuffer/)
|
|
9
|
+
|
|
10
|
+
## Status for master
|
|
11
|
+
|
|
12
|
+
Status Category | Status Badge
|
|
13
|
+
-- | --
|
|
14
|
+
GitLab Pipelines | [](https://lossless.cloud)
|
|
15
|
+
GitLab Pipline Test Coverage | [](https://lossless.cloud)
|
|
16
|
+
npm | [](https://lossless.cloud)
|
|
17
|
+
Snyk | [](https://lossless.cloud)
|
|
18
|
+
TypeScript Support | [](https://lossless.cloud)
|
|
19
|
+
node Support | [](https://nodejs.org/dist/latest-v10.x/docs/api/)
|
|
20
|
+
Code Style | [](https://lossless.cloud)
|
|
21
|
+
PackagePhobia (total standalone install weight) | [](https://lossless.cloud)
|
|
22
|
+
PackagePhobia (package size on registry) | [](https://lossless.cloud)
|
|
23
|
+
BundlePhobia (total size when bundled) | [](https://lossless.cloud)
|
|
24
|
+
Platform support | [](https://lossless.cloud) [](https://lossless.cloud)
|
|
25
|
+
|
|
26
|
+
## Usage
|
|
27
|
+
|
|
28
|
+
We highly recommend TypeScript as this module supports **TypeScript intellisense**.
|
|
29
|
+
|
|
30
|
+
```javascript
|
|
31
|
+
import * as taskbuffer from "taskbuffer";
|
|
32
|
+
|
|
33
|
+
myTask = new taskbuffer.Task({
|
|
34
|
+
preTask: someOtherTask // optional, don't worry loops are prevented
|
|
35
|
+
afterTask: someOtherTask // optional, don't worry loops are prevented
|
|
36
|
+
name:"myTask1",
|
|
37
|
+
buffered: true, // optional
|
|
38
|
+
bufferMax: 3, // optional, call qeues greater than this are truncated
|
|
39
|
+
execDelay: 1000, // optional, time in ms to wait before executing task call
|
|
40
|
+
taskFunction:() => {
|
|
41
|
+
// do some stuff and return promise
|
|
42
|
+
// pass on any data through promise resolution
|
|
43
|
+
// Use TypeScript for better understanding and code completion
|
|
44
|
+
}
|
|
45
|
+
})
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
For further information read the linked docs at the top of this README.
|
|
49
|
+
|
|
50
|
+
> MIT licensed | **©** [Lossless GmbH](https://lossless.gmbh)
|
|
51
|
+
|
|
52
|
+
[](https://push.rocks)
|
|
53
|
+
|
|
54
|
+
## Contribution
|
|
55
|
+
|
|
56
|
+
We are always happy for code contributions. If you are not the code contributing type that is ok. Still, maintaining Open Source repositories takes considerable time and thought. If you like the quality of what we do and our modules are useful to you we would appreciate a little monthly contribution: You can [contribute one time](https://lossless.link/contribute-onetime) or [contribute monthly](https://lossless.link/contribute). :)
|
|
57
|
+
|
|
58
|
+
For further information read the linked docs at the top of this readme.
|
|
59
|
+
|
|
60
|
+
> MIT licensed | **©** [Lossless GmbH](https://lossless.gmbh)
|
|
61
|
+
| By using this npm module you agree to our [privacy policy](https://lossless.gmbH/privacy)
|
|
62
|
+
|
|
63
|
+
[](https://maintainedby.lossless.com)
|
package/ts/index.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export { Task } from './taskbuffer.classes.task.js';
|
|
2
|
+
export type { ITaskFunction } from './taskbuffer.classes.task.js'
|
|
3
|
+
export { Taskchain } from './taskbuffer.classes.taskchain.js';
|
|
4
|
+
export { Taskparallel } from './taskbuffer.classes.taskparallel.js';
|
|
5
|
+
export { TaskManager } from './taskbuffer.classes.taskmanager.js';
|
|
6
|
+
export { TaskOnce } from './taskbuffer.classes.taskonce.js';
|
|
7
|
+
export { TaskRunner } from './taskbuffer.classes.taskrunner.js';
|
|
8
|
+
export { TaskDebounced } from './taskbuffer.classes.taskdebounced.js';
|
|
9
|
+
import * as distributedCoordination from './taskbuffer.classes.distributedcoordinator.js';
|
|
10
|
+
export {
|
|
11
|
+
distributedCoordination
|
|
12
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { Task } from './taskbuffer.classes.task.js';
|
|
2
|
+
|
|
3
|
+
export class BufferRunner {
|
|
4
|
+
public task: Task;
|
|
5
|
+
// initialze by default
|
|
6
|
+
public bufferCounter: number = 0;
|
|
7
|
+
constructor(taskArg: Task) {
|
|
8
|
+
this.task = taskArg;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
public trigger(x: any): Promise<any> {
|
|
12
|
+
if (!(this.bufferCounter >= this.task.bufferMax)) {
|
|
13
|
+
this.bufferCounter++;
|
|
14
|
+
}
|
|
15
|
+
const returnPromise: Promise<any> = this.task.cycleCounter.getPromiseForCycle(
|
|
16
|
+
this.bufferCounter + 1
|
|
17
|
+
);
|
|
18
|
+
if (!this.task.running) {
|
|
19
|
+
this._run(x);
|
|
20
|
+
}
|
|
21
|
+
return returnPromise;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
private _run(x: any) {
|
|
25
|
+
const recursiveBufferRunner = (x: any) => {
|
|
26
|
+
if (this.bufferCounter >= 0) {
|
|
27
|
+
this.task.running = true;
|
|
28
|
+
Task.runTask(this.task, { x: x }).then((x) => {
|
|
29
|
+
this.bufferCounter--; // this.bufferCounter drops below 0, the recursion stops.
|
|
30
|
+
this.task.cycleCounter.informOfCycle(x);
|
|
31
|
+
recursiveBufferRunner(x);
|
|
32
|
+
});
|
|
33
|
+
} else {
|
|
34
|
+
this.task.running = false;
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
recursiveBufferRunner(x);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import * as plugins from './taskbuffer.plugins.js';
|
|
2
|
+
import { Task } from './taskbuffer.classes.task.js';
|
|
3
|
+
|
|
4
|
+
export interface ICycleObject {
|
|
5
|
+
cycleCounter: number;
|
|
6
|
+
deferred: plugins.smartpromise.Deferred<any>;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export class CycleCounter {
|
|
10
|
+
public task: Task;
|
|
11
|
+
public cycleObjectArray: ICycleObject[] = [];
|
|
12
|
+
constructor(taskArg: Task) {
|
|
13
|
+
this.task = taskArg;
|
|
14
|
+
}
|
|
15
|
+
public getPromiseForCycle(cycleCountArg: number) {
|
|
16
|
+
const done = plugins.smartpromise.defer();
|
|
17
|
+
const cycleObject: ICycleObject = {
|
|
18
|
+
cycleCounter: cycleCountArg,
|
|
19
|
+
deferred: done,
|
|
20
|
+
};
|
|
21
|
+
this.cycleObjectArray.push(cycleObject);
|
|
22
|
+
return done.promise;
|
|
23
|
+
}
|
|
24
|
+
public informOfCycle(x: any) {
|
|
25
|
+
const newCycleObjectArray: ICycleObject[] = [];
|
|
26
|
+
this.cycleObjectArray.forEach((cycleObjectArg) => {
|
|
27
|
+
cycleObjectArg.cycleCounter--;
|
|
28
|
+
if (cycleObjectArg.cycleCounter <= 0) {
|
|
29
|
+
cycleObjectArg.deferred.resolve(x);
|
|
30
|
+
} else {
|
|
31
|
+
newCycleObjectArray.push(cycleObjectArg);
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
this.cycleObjectArray = newCycleObjectArray;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { Task } from './taskbuffer.classes.task.js';
|
|
2
|
+
import * as plugins from './taskbuffer.plugins.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* constains all data for the final coordinator to actually make an informed decision
|
|
6
|
+
*/
|
|
7
|
+
export interface IDistributedTaskRequest {
|
|
8
|
+
/**
|
|
9
|
+
* this needs to correlate to the consultationResult
|
|
10
|
+
*/
|
|
11
|
+
submitterRandomId: string;
|
|
12
|
+
taskName: string;
|
|
13
|
+
taskVersion: string;
|
|
14
|
+
taskExecutionTime: number;
|
|
15
|
+
taskExecutionTimeout: number;
|
|
16
|
+
taskExecutionParallel: number;
|
|
17
|
+
status: 'requesting' | 'gotRejected' | 'failed' | 'succeeded';
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export interface IDistributedTaskRequestResult {
|
|
21
|
+
/**
|
|
22
|
+
* this needs to correlate to the decisionInfoBasis
|
|
23
|
+
*/
|
|
24
|
+
submitterRandomId: string;
|
|
25
|
+
considered: boolean;
|
|
26
|
+
rank: string;
|
|
27
|
+
reason: string;
|
|
28
|
+
shouldTrigger: boolean;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export abstract class AbstractDistributedCoordinator {
|
|
32
|
+
public abstract fireDistributedTaskRequest(infoBasisArg: IDistributedTaskRequest): Promise<IDistributedTaskRequestResult>
|
|
33
|
+
public abstract updateDistributedTaskRequest(infoBasisArg: IDistributedTaskRequest): Promise<void>
|
|
34
|
+
}
|