@push.rocks/taskbuffer 3.2.0 → 3.5.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 (49) hide show
  1. package/LICENSE +1 -1
  2. package/dist_ts/00_commitinfo_data.js +1 -1
  3. package/dist_ts_web/ts/index.d.ts +13 -0
  4. package/dist_ts_web/ts/index.js +12 -0
  5. package/dist_ts_web/ts/taskbuffer.classes.bufferrunner.d.ts +8 -0
  6. package/dist_ts_web/ts/taskbuffer.classes.bufferrunner.js +28 -0
  7. package/dist_ts_web/ts/taskbuffer.classes.cyclecounter.d.ts +13 -0
  8. package/dist_ts_web/ts/taskbuffer.classes.cyclecounter.js +31 -0
  9. package/dist_ts_web/ts/taskbuffer.classes.distributedcoordinator.d.ts +27 -0
  10. package/dist_ts_web/ts/taskbuffer.classes.distributedcoordinator.js +5 -0
  11. package/dist_ts_web/ts/taskbuffer.classes.task.d.ts +86 -0
  12. package/dist_ts_web/ts/taskbuffer.classes.task.js +257 -0
  13. package/dist_ts_web/ts/taskbuffer.classes.taskchain.d.ts +14 -0
  14. package/dist_ts_web/ts/taskbuffer.classes.taskchain.js +51 -0
  15. package/dist_ts_web/ts/taskbuffer.classes.taskdebounced.d.ts +10 -0
  16. package/dist_ts_web/ts/taskbuffer.classes.taskdebounced.js +20 -0
  17. package/dist_ts_web/ts/taskbuffer.classes.taskmanager.d.ts +49 -0
  18. package/dist_ts_web/ts/taskbuffer.classes.taskmanager.js +208 -0
  19. package/dist_ts_web/ts/taskbuffer.classes.taskonce.d.ts +11 -0
  20. package/dist_ts_web/ts/taskbuffer.classes.taskonce.js +20 -0
  21. package/dist_ts_web/ts/taskbuffer.classes.taskparallel.d.ts +7 -0
  22. package/dist_ts_web/ts/taskbuffer.classes.taskparallel.js +23 -0
  23. package/dist_ts_web/ts/taskbuffer.classes.taskrunner.d.ts +30 -0
  24. package/dist_ts_web/ts/taskbuffer.classes.taskrunner.js +54 -0
  25. package/dist_ts_web/ts/taskbuffer.classes.taskstep.d.ts +27 -0
  26. package/dist_ts_web/ts/taskbuffer.classes.taskstep.js +37 -0
  27. package/dist_ts_web/ts/taskbuffer.interfaces.d.ts +36 -0
  28. package/dist_ts_web/ts/taskbuffer.interfaces.js +2 -0
  29. package/dist_ts_web/ts/taskbuffer.logging.d.ts +2 -0
  30. package/dist_ts_web/ts/taskbuffer.logging.js +3 -0
  31. package/dist_ts_web/ts/taskbuffer.plugins.d.ts +8 -0
  32. package/dist_ts_web/ts/taskbuffer.plugins.js +9 -0
  33. package/dist_ts_web/ts_web/00_commitinfo_data.d.ts +8 -0
  34. package/dist_ts_web/ts_web/00_commitinfo_data.js +9 -0
  35. package/dist_ts_web/ts_web/demorunner.d.ts +1 -0
  36. package/dist_ts_web/ts_web/demorunner.js +33 -0
  37. package/dist_ts_web/ts_web/elements/taskbuffer-dashboard.demo.d.ts +2 -0
  38. package/dist_ts_web/ts_web/elements/taskbuffer-dashboard.demo.js +285 -0
  39. package/dist_ts_web/ts_web/index.d.ts +2 -0
  40. package/dist_ts_web/ts_web/index.js +3 -0
  41. package/dist_ts_web/ts_web/taskbuffer-dashboard.d.ts +24 -0
  42. package/dist_ts_web/ts_web/taskbuffer-dashboard.js +549 -0
  43. package/package.json +13 -12
  44. package/readme.md +429 -930
  45. package/ts/00_commitinfo_data.ts +1 -1
  46. package/ts_web/00_commitinfo_data.ts +1 -1
  47. package/ts_web/elements/taskbuffer-dashboard.demo.ts +311 -0
  48. package/ts_web/index.ts +12 -0
  49. package/ts_web/taskbuffer-dashboard.ts +541 -0
@@ -3,6 +3,6 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@push.rocks/taskbuffer',
6
- version: '3.2.0',
6
+ version: '3.5.0',
7
7
  description: 'A flexible task management library supporting TypeScript, allowing for task buffering, scheduling, and execution with dependency management.'
8
8
  }
@@ -3,6 +3,6 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@push.rocks/taskbuffer',
6
- version: '3.2.0',
6
+ version: '3.5.0',
7
7
  description: 'A flexible task management library supporting TypeScript, allowing for task buffering, scheduling, and execution with dependency management.'
8
8
  }
@@ -0,0 +1,311 @@
1
+ import { html, css, cssManager } from '@design.estate/dees-element';
2
+ import { TaskManager, Task } from '../../ts/index.js';
3
+ import '../taskbuffer-dashboard.js';
4
+
5
+ export const demoFunc = () => html`
6
+ <style>
7
+ ${css`
8
+ .demoWrapper {
9
+ box-sizing: border-box;
10
+ position: relative;
11
+ width: 100%;
12
+ min-height: 100vh;
13
+ padding: 48px;
14
+ background: ${cssManager.bdTheme('#f8f9fa', '#0a0a0a')};
15
+ }
16
+
17
+ h1 {
18
+ font-size: 32px;
19
+ font-weight: 700;
20
+ color: ${cssManager.bdTheme('#09090b', '#fafafa')};
21
+ margin-bottom: 12px;
22
+ text-align: center;
23
+ }
24
+
25
+ p {
26
+ font-size: 16px;
27
+ color: ${cssManager.bdTheme('#71717a', '#a1a1aa')};
28
+ text-align: center;
29
+ margin-bottom: 48px;
30
+ }
31
+ `}
32
+ </style>
33
+
34
+ <div class="demoWrapper">
35
+ <h1>TaskBuffer Dashboard Demo</h1>
36
+ <p>Real-time visualization of task execution, progress tracking, and scheduling</p>
37
+
38
+ <dees-demowrapper
39
+ .title=${'Live Dashboard'}
40
+ .subtitle=${'Interactive task management dashboard with real-time updates'}
41
+ .runAfterRender=${async (element) => {
42
+ // Create TaskManager instance
43
+ const taskManager = new TaskManager();
44
+
45
+ // Get dashboard element
46
+ const dashboard = element.querySelector('taskbuffer-dashboard');
47
+ dashboard.taskManager = taskManager;
48
+ dashboard.refreshInterval = 500;
49
+
50
+ // Task counter for unique names
51
+ let taskCounter = 0;
52
+
53
+ // Helper to create random delay
54
+ const randomDelay = () => new Promise(resolve =>
55
+ setTimeout(resolve, Math.random() * 2000 + 500)
56
+ );
57
+
58
+ // Add initial demo tasks
59
+ const addDemoTasks = () => {
60
+ // Add simple task
61
+ const simpleTask = new Task({
62
+ name: `SimpleTask_${++taskCounter}`,
63
+ taskFunction: async () => {
64
+ console.log(`Executing SimpleTask_${taskCounter}`);
65
+ await randomDelay();
66
+ return `Result from SimpleTask_${taskCounter}`;
67
+ }
68
+ });
69
+ taskManager.addTask(simpleTask);
70
+
71
+ // Add task with steps
72
+ const steppedTask = new Task({
73
+ name: `SteppedTask_${++taskCounter}`,
74
+ steps: [
75
+ { name: 'init', description: 'Initializing', percentage: 20 },
76
+ { name: 'fetch', description: 'Fetching data', percentage: 30 },
77
+ { name: 'process', description: 'Processing', percentage: 35 },
78
+ { name: 'save', description: 'Saving results', percentage: 15 }
79
+ ],
80
+ taskFunction: async function() {
81
+ this.notifyStep('init');
82
+ await randomDelay();
83
+ this.notifyStep('fetch');
84
+ await randomDelay();
85
+ this.notifyStep('process');
86
+ await randomDelay();
87
+ this.notifyStep('save');
88
+ await randomDelay();
89
+ return `Completed SteppedTask_${taskCounter}`;
90
+ }
91
+ });
92
+ taskManager.addTask(steppedTask);
93
+
94
+ // Add buffered task
95
+ const bufferedTask = new Task({
96
+ name: `BufferedTask_${++taskCounter}`,
97
+ buffered: true,
98
+ bufferMax: 3,
99
+ steps: [
100
+ { name: 'buffer', description: 'Processing buffered item', percentage: 100 }
101
+ ],
102
+ taskFunction: async function(item) {
103
+ this.notifyStep('buffer');
104
+ console.log(`Processing buffered item: ${item}`);
105
+ await randomDelay();
106
+ return `Buffered task ${taskCounter} processed: ${item}`;
107
+ }
108
+ });
109
+ taskManager.addTask(bufferedTask);
110
+ };
111
+
112
+ // Add initial tasks
113
+ addDemoTasks();
114
+
115
+ // Automatically trigger some tasks
116
+ setTimeout(() => {
117
+ const tasks = taskManager.getAllTasksMetadata();
118
+ tasks.forEach(taskMeta => {
119
+ const task = taskManager.getTaskByName(taskMeta.name);
120
+ if (task && !taskMeta.name.includes('Scheduled')) {
121
+ if (taskMeta.buffered) {
122
+ // Trigger buffered task multiple times
123
+ for (let i = 0; i < 5; i++) {
124
+ task.trigger(`Data_${i}`);
125
+ }
126
+ } else {
127
+ task.trigger();
128
+ }
129
+ }
130
+ });
131
+ }, 2000);
132
+ }}
133
+ >
134
+ <taskbuffer-dashboard></taskbuffer-dashboard>
135
+ </dees-demowrapper>
136
+
137
+ <dees-demowrapper
138
+ .title=${'Scheduled Tasks'}
139
+ .subtitle=${'Tasks scheduled with cron expressions'}
140
+ .runAfterRender=${async (element) => {
141
+ // Create TaskManager instance
142
+ const taskManager = new TaskManager();
143
+
144
+ // Get dashboard element
145
+ const dashboard = element.querySelector('taskbuffer-dashboard');
146
+ dashboard.taskManager = taskManager;
147
+ dashboard.refreshInterval = 1000;
148
+
149
+ // Add scheduled tasks
150
+ const scheduledTask1 = new Task({
151
+ name: 'HourlyBackup',
152
+ steps: [
153
+ { name: 'prepare', description: 'Preparing backup', percentage: 30 },
154
+ { name: 'backup', description: 'Creating backup', percentage: 50 },
155
+ { name: 'verify', description: 'Verifying backup', percentage: 20 }
156
+ ],
157
+ taskFunction: async function() {
158
+ this.notifyStep('prepare');
159
+ await new Promise(resolve => setTimeout(resolve, 1000));
160
+ this.notifyStep('backup');
161
+ await new Promise(resolve => setTimeout(resolve, 2000));
162
+ this.notifyStep('verify');
163
+ await new Promise(resolve => setTimeout(resolve, 500));
164
+ return 'Backup completed';
165
+ }
166
+ });
167
+
168
+ const scheduledTask2 = new Task({
169
+ name: 'DailyReport',
170
+ steps: [
171
+ { name: 'collect', description: 'Collecting data', percentage: 40 },
172
+ { name: 'analyze', description: 'Analyzing data', percentage: 40 },
173
+ { name: 'send', description: 'Sending report', percentage: 20 }
174
+ ],
175
+ taskFunction: async function() {
176
+ this.notifyStep('collect');
177
+ await new Promise(resolve => setTimeout(resolve, 1500));
178
+ this.notifyStep('analyze');
179
+ await new Promise(resolve => setTimeout(resolve, 1500));
180
+ this.notifyStep('send');
181
+ await new Promise(resolve => setTimeout(resolve, 500));
182
+ return 'Report sent';
183
+ }
184
+ });
185
+
186
+ // Schedule tasks
187
+ taskManager.addAndScheduleTask(scheduledTask1, '0 * * * *'); // Every hour
188
+ taskManager.addAndScheduleTask(scheduledTask2, '0 0 * * *'); // Daily at midnight
189
+
190
+ // Also add them as regular tasks for demo
191
+ const demoTask = new Task({
192
+ name: 'DemoScheduledExecution',
193
+ steps: [
194
+ { name: 'execute', description: 'Simulating scheduled execution', percentage: 100 }
195
+ ],
196
+ taskFunction: async function() {
197
+ this.notifyStep('execute');
198
+ await new Promise(resolve => setTimeout(resolve, 1000));
199
+
200
+ // Trigger scheduled tasks for demo
201
+ scheduledTask1.trigger();
202
+ scheduledTask2.trigger();
203
+
204
+ return 'Triggered scheduled tasks for demo';
205
+ }
206
+ });
207
+ taskManager.addTask(demoTask);
208
+
209
+ // Trigger demo after 2 seconds
210
+ setTimeout(() => {
211
+ demoTask.trigger();
212
+ }, 2000);
213
+ }}
214
+ >
215
+ <taskbuffer-dashboard></taskbuffer-dashboard>
216
+ </dees-demowrapper>
217
+
218
+ <dees-demowrapper
219
+ .title=${'Task Execution Control'}
220
+ .subtitle=${'Interactive controls for task management'}
221
+ .runAfterRender=${async (element) => {
222
+ // Create TaskManager instance
223
+ const taskManager = new TaskManager();
224
+
225
+ // Get dashboard element
226
+ const dashboard = element.querySelector('taskbuffer-dashboard');
227
+ dashboard.taskManager = taskManager;
228
+ dashboard.refreshInterval = 300;
229
+
230
+ // Add control buttons
231
+ const controlsDiv = document.createElement('div');
232
+ controlsDiv.style.cssText = `
233
+ display: flex;
234
+ gap: 8px;
235
+ margin-bottom: 16px;
236
+ flex-wrap: wrap;
237
+ `;
238
+
239
+ const createButton = (text, onClick, style = '') => {
240
+ const button = document.createElement('button');
241
+ button.textContent = text;
242
+ button.style.cssText = `
243
+ padding: 8px 16px;
244
+ border: none;
245
+ border-radius: 6px;
246
+ cursor: pointer;
247
+ font-size: 14px;
248
+ transition: all 0.2s;
249
+ ${style}
250
+ `;
251
+ button.onclick = onClick;
252
+ return button;
253
+ };
254
+
255
+ let taskCounter = 0;
256
+
257
+ // Add task button
258
+ controlsDiv.appendChild(createButton('Add Task', () => {
259
+ const task = new Task({
260
+ name: `Task_${++taskCounter}`,
261
+ steps: [
262
+ { name: 'step1', description: 'Step 1', percentage: 33 },
263
+ { name: 'step2', description: 'Step 2', percentage: 33 },
264
+ { name: 'step3', description: 'Step 3', percentage: 34 }
265
+ ],
266
+ taskFunction: async function() {
267
+ for (const step of ['step1', 'step2', 'step3']) {
268
+ this.notifyStep(step);
269
+ await new Promise(resolve => setTimeout(resolve, 1000));
270
+ }
271
+ return `Task_${taskCounter} completed`;
272
+ }
273
+ });
274
+ taskManager.addTask(task);
275
+ }, 'background: #3b82f6; color: white;'));
276
+
277
+ // Trigger all button
278
+ controlsDiv.appendChild(createButton('Trigger All', () => {
279
+ const tasks = taskManager.getAllTasksMetadata();
280
+ tasks.forEach(taskMeta => {
281
+ const task = taskManager.getTaskByName(taskMeta.name);
282
+ if (task) {
283
+ task.trigger();
284
+ }
285
+ });
286
+ }, 'background: #22c55e; color: white;'));
287
+
288
+ // Clear all button
289
+ controlsDiv.appendChild(createButton('Clear All', () => {
290
+ const tasks = taskManager.getAllTasksMetadata();
291
+ tasks.forEach(taskMeta => {
292
+ const task = taskManager.getTaskByName(taskMeta.name);
293
+ if (task) {
294
+ taskManager.taskMap.remove(task);
295
+ taskManager.descheduleTaskByName(taskMeta.name);
296
+ }
297
+ });
298
+ }, 'background: #ef4444; color: white;'));
299
+
300
+ element.insertBefore(controlsDiv, dashboard);
301
+
302
+ // Add some initial tasks
303
+ for (let i = 0; i < 3; i++) {
304
+ controlsDiv.querySelector('button').click();
305
+ }
306
+ }}
307
+ >
308
+ <taskbuffer-dashboard></taskbuffer-dashboard>
309
+ </dees-demowrapper>
310
+ </div>
311
+ `;
@@ -0,0 +1,12 @@
1
+ // Export web components
2
+ export * from './taskbuffer-dashboard.js';
3
+
4
+ // Export types from main module for web usage
5
+ export type {
6
+ TaskManager,
7
+ Task,
8
+ ITaskMetadata,
9
+ ITaskExecutionReport,
10
+ IScheduledTaskInfo,
11
+ ITaskStep
12
+ } from '../ts/index.js';