@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.
Files changed (48) hide show
  1. package/LICENSE +21 -0
  2. package/dist_bundle/bundle.js +18376 -0
  3. package/dist_bundle/bundle.js.map +7 -0
  4. package/dist_ts/00_commitinfo_data.d.ts +8 -0
  5. package/dist_ts/00_commitinfo_data.js +9 -0
  6. package/dist_ts/index.d.ts +10 -0
  7. package/dist_ts/index.js +10 -0
  8. package/dist_ts/taskbuffer.classes.bufferrunner.d.ts +8 -0
  9. package/dist_ts/taskbuffer.classes.bufferrunner.js +35 -0
  10. package/dist_ts/taskbuffer.classes.cyclecounter.d.ts +13 -0
  11. package/dist_ts/taskbuffer.classes.cyclecounter.js +31 -0
  12. package/dist_ts/taskbuffer.classes.distributedcoordinator.d.ts +29 -0
  13. package/dist_ts/taskbuffer.classes.distributedcoordinator.js +5 -0
  14. package/dist_ts/taskbuffer.classes.task.d.ts +84 -0
  15. package/dist_ts/taskbuffer.classes.task.js +159 -0
  16. package/dist_ts/taskbuffer.classes.taskchain.d.ts +14 -0
  17. package/dist_ts/taskbuffer.classes.taskchain.js +51 -0
  18. package/dist_ts/taskbuffer.classes.taskdebounced.d.ts +10 -0
  19. package/dist_ts/taskbuffer.classes.taskdebounced.js +20 -0
  20. package/dist_ts/taskbuffer.classes.taskmanager.d.ts +68 -0
  21. package/dist_ts/taskbuffer.classes.taskmanager.js +129 -0
  22. package/dist_ts/taskbuffer.classes.taskonce.d.ts +11 -0
  23. package/dist_ts/taskbuffer.classes.taskonce.js +20 -0
  24. package/dist_ts/taskbuffer.classes.taskparallel.d.ts +7 -0
  25. package/dist_ts/taskbuffer.classes.taskparallel.js +23 -0
  26. package/dist_ts/taskbuffer.classes.taskrunner.d.ts +30 -0
  27. package/dist_ts/taskbuffer.classes.taskrunner.js +54 -0
  28. package/dist_ts/taskbuffer.logging.d.ts +2 -0
  29. package/dist_ts/taskbuffer.logging.js +3 -0
  30. package/dist_ts/taskbuffer.plugins.d.ts +8 -0
  31. package/dist_ts/taskbuffer.plugins.js +9 -0
  32. package/npmextra.json +18 -0
  33. package/package.json +62 -0
  34. package/readme.md +63 -0
  35. package/ts/00_commitinfo_data.ts +8 -0
  36. package/ts/index.ts +12 -0
  37. package/ts/taskbuffer.classes.bufferrunner.ts +39 -0
  38. package/ts/taskbuffer.classes.cyclecounter.ts +36 -0
  39. package/ts/taskbuffer.classes.distributedcoordinator.ts +34 -0
  40. package/ts/taskbuffer.classes.task.ts +236 -0
  41. package/ts/taskbuffer.classes.taskchain.ts +58 -0
  42. package/ts/taskbuffer.classes.taskdebounced.ts +27 -0
  43. package/ts/taskbuffer.classes.taskmanager.ts +155 -0
  44. package/ts/taskbuffer.classes.taskonce.ts +21 -0
  45. package/ts/taskbuffer.classes.taskparallel.ts +24 -0
  46. package/ts/taskbuffer.classes.taskrunner.ts +63 -0
  47. package/ts/taskbuffer.logging.ts +3 -0
  48. 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,7 @@
1
+ import { Task } from './taskbuffer.classes.task.js';
2
+ export declare class Taskparallel extends Task {
3
+ taskArray: Task[];
4
+ constructor(optionsArg: {
5
+ taskArray: Task[];
6
+ });
7
+ }
@@ -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,2 @@
1
+ import * as plugins from './taskbuffer.plugins.js';
2
+ export declare const logger: plugins.smartlog.ConsoleLog;
@@ -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 | [![pipeline status](https://gitlab.com/pushrocks/taskbuffer/badges/master/pipeline.svg)](https://lossless.cloud)
15
+ GitLab Pipline Test Coverage | [![coverage report](https://gitlab.com/pushrocks/taskbuffer/badges/master/coverage.svg)](https://lossless.cloud)
16
+ npm | [![npm downloads per month](https://badgen.net/npm/dy/@pushrocks/taskbuffer)](https://lossless.cloud)
17
+ Snyk | [![Known Vulnerabilities](https://badgen.net/snyk/pushrocks/taskbuffer)](https://lossless.cloud)
18
+ TypeScript Support | [![TypeScript](https://badgen.net/badge/TypeScript/>=%203.x/blue?icon=typescript)](https://lossless.cloud)
19
+ node Support | [![node](https://img.shields.io/badge/node->=%2010.x.x-blue.svg)](https://nodejs.org/dist/latest-v10.x/docs/api/)
20
+ Code Style | [![Code Style](https://badgen.net/badge/style/prettier/purple)](https://lossless.cloud)
21
+ PackagePhobia (total standalone install weight) | [![PackagePhobia](https://badgen.net/packagephobia/install/@pushrocks/taskbuffer)](https://lossless.cloud)
22
+ PackagePhobia (package size on registry) | [![PackagePhobia](https://badgen.net/packagephobia/publish/@pushrocks/taskbuffer)](https://lossless.cloud)
23
+ BundlePhobia (total size when bundled) | [![BundlePhobia](https://badgen.net/bundlephobia/minzip/@pushrocks/taskbuffer)](https://lossless.cloud)
24
+ Platform support | [![Supports Windows 10](https://badgen.net/badge/supports%20Windows%2010/yes/green?icon=windows)](https://lossless.cloud) [![Supports Mac OS X](https://badgen.net/badge/supports%20Mac%20OS%20X/yes/green?icon=apple)](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 | **&copy;** [Lossless GmbH](https://lossless.gmbh)
51
+
52
+ [![repo-footer](https://pushrocks.gitlab.io/assets/repo-footer.svg)](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 | **&copy;** [Lossless GmbH](https://lossless.gmbh)
61
+ | By using this npm module you agree to our [privacy policy](https://lossless.gmbH/privacy)
62
+
63
+ [![repo-footer](https://lossless.gitlab.io/publicrelations/repofooter.svg)](https://maintainedby.lossless.com)
@@ -0,0 +1,8 @@
1
+ /**
2
+ * autocreated commitinfo by @pushrocks/commitinfo
3
+ */
4
+ export const commitinfo = {
5
+ name: '@pushrocks/taskbuffer',
6
+ version: '3.0.10',
7
+ description: 'flexible task management. TypeScript ready!'
8
+ }
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
+ }