@zintrust/workers 0.1.27

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 (178) hide show
  1. package/README.md +861 -0
  2. package/dist/AnomalyDetection.d.ts +102 -0
  3. package/dist/AnomalyDetection.js +321 -0
  4. package/dist/AutoScaler.d.ts +127 -0
  5. package/dist/AutoScaler.js +425 -0
  6. package/dist/BroadcastWorker.d.ts +21 -0
  7. package/dist/BroadcastWorker.js +24 -0
  8. package/dist/CanaryController.d.ts +103 -0
  9. package/dist/CanaryController.js +380 -0
  10. package/dist/ChaosEngineering.d.ts +79 -0
  11. package/dist/ChaosEngineering.js +216 -0
  12. package/dist/CircuitBreaker.d.ts +106 -0
  13. package/dist/CircuitBreaker.js +374 -0
  14. package/dist/ClusterLock.d.ts +90 -0
  15. package/dist/ClusterLock.js +385 -0
  16. package/dist/ComplianceManager.d.ts +177 -0
  17. package/dist/ComplianceManager.js +556 -0
  18. package/dist/DatacenterOrchestrator.d.ts +133 -0
  19. package/dist/DatacenterOrchestrator.js +404 -0
  20. package/dist/DeadLetterQueue.d.ts +122 -0
  21. package/dist/DeadLetterQueue.js +539 -0
  22. package/dist/HealthMonitor.d.ts +42 -0
  23. package/dist/HealthMonitor.js +301 -0
  24. package/dist/MultiQueueWorker.d.ts +89 -0
  25. package/dist/MultiQueueWorker.js +277 -0
  26. package/dist/NotificationWorker.d.ts +21 -0
  27. package/dist/NotificationWorker.js +23 -0
  28. package/dist/Observability.d.ts +153 -0
  29. package/dist/Observability.js +530 -0
  30. package/dist/PluginManager.d.ts +123 -0
  31. package/dist/PluginManager.js +392 -0
  32. package/dist/PriorityQueue.d.ts +117 -0
  33. package/dist/PriorityQueue.js +244 -0
  34. package/dist/ResourceMonitor.d.ts +164 -0
  35. package/dist/ResourceMonitor.js +605 -0
  36. package/dist/SLAMonitor.d.ts +110 -0
  37. package/dist/SLAMonitor.js +274 -0
  38. package/dist/WorkerFactory.d.ts +193 -0
  39. package/dist/WorkerFactory.js +1507 -0
  40. package/dist/WorkerInit.d.ts +85 -0
  41. package/dist/WorkerInit.js +223 -0
  42. package/dist/WorkerMetrics.d.ts +114 -0
  43. package/dist/WorkerMetrics.js +509 -0
  44. package/dist/WorkerRegistry.d.ts +145 -0
  45. package/dist/WorkerRegistry.js +319 -0
  46. package/dist/WorkerShutdown.d.ts +61 -0
  47. package/dist/WorkerShutdown.js +159 -0
  48. package/dist/WorkerVersioning.d.ts +107 -0
  49. package/dist/WorkerVersioning.js +300 -0
  50. package/dist/build-manifest.json +462 -0
  51. package/dist/config/workerConfig.d.ts +3 -0
  52. package/dist/config/workerConfig.js +19 -0
  53. package/dist/createQueueWorker.d.ts +23 -0
  54. package/dist/createQueueWorker.js +113 -0
  55. package/dist/dashboard/index.d.ts +1 -0
  56. package/dist/dashboard/index.js +1 -0
  57. package/dist/dashboard/types.d.ts +117 -0
  58. package/dist/dashboard/types.js +1 -0
  59. package/dist/dashboard/workers-api.d.ts +4 -0
  60. package/dist/dashboard/workers-api.js +638 -0
  61. package/dist/dashboard/workers-dashboard-ui.d.ts +3 -0
  62. package/dist/dashboard/workers-dashboard-ui.js +1026 -0
  63. package/dist/dashboard/workers-dashboard.d.ts +4 -0
  64. package/dist/dashboard/workers-dashboard.js +904 -0
  65. package/dist/helper/index.d.ts +5 -0
  66. package/dist/helper/index.js +10 -0
  67. package/dist/http/WorkerApiController.d.ts +38 -0
  68. package/dist/http/WorkerApiController.js +312 -0
  69. package/dist/http/WorkerController.d.ts +374 -0
  70. package/dist/http/WorkerController.js +1351 -0
  71. package/dist/http/middleware/CustomValidation.d.ts +92 -0
  72. package/dist/http/middleware/CustomValidation.js +270 -0
  73. package/dist/http/middleware/DatacenterValidator.d.ts +3 -0
  74. package/dist/http/middleware/DatacenterValidator.js +94 -0
  75. package/dist/http/middleware/EditWorkerValidation.d.ts +7 -0
  76. package/dist/http/middleware/EditWorkerValidation.js +55 -0
  77. package/dist/http/middleware/FeaturesValidator.d.ts +3 -0
  78. package/dist/http/middleware/FeaturesValidator.js +60 -0
  79. package/dist/http/middleware/InfrastructureValidator.d.ts +31 -0
  80. package/dist/http/middleware/InfrastructureValidator.js +226 -0
  81. package/dist/http/middleware/OptionsValidator.d.ts +3 -0
  82. package/dist/http/middleware/OptionsValidator.js +112 -0
  83. package/dist/http/middleware/PayloadSanitizer.d.ts +7 -0
  84. package/dist/http/middleware/PayloadSanitizer.js +42 -0
  85. package/dist/http/middleware/ProcessorPathSanitizer.d.ts +3 -0
  86. package/dist/http/middleware/ProcessorPathSanitizer.js +74 -0
  87. package/dist/http/middleware/QueueNameSanitizer.d.ts +3 -0
  88. package/dist/http/middleware/QueueNameSanitizer.js +45 -0
  89. package/dist/http/middleware/ValidateDriver.d.ts +7 -0
  90. package/dist/http/middleware/ValidateDriver.js +20 -0
  91. package/dist/http/middleware/VersionSanitizer.d.ts +3 -0
  92. package/dist/http/middleware/VersionSanitizer.js +25 -0
  93. package/dist/http/middleware/WorkerNameSanitizer.d.ts +3 -0
  94. package/dist/http/middleware/WorkerNameSanitizer.js +46 -0
  95. package/dist/http/middleware/WorkerValidationChain.d.ts +27 -0
  96. package/dist/http/middleware/WorkerValidationChain.js +185 -0
  97. package/dist/index.d.ts +46 -0
  98. package/dist/index.js +48 -0
  99. package/dist/routes/workers.d.ts +12 -0
  100. package/dist/routes/workers.js +81 -0
  101. package/dist/storage/WorkerStore.d.ts +45 -0
  102. package/dist/storage/WorkerStore.js +195 -0
  103. package/dist/type.d.ts +76 -0
  104. package/dist/type.js +1 -0
  105. package/dist/ui/router/ui.d.ts +3 -0
  106. package/dist/ui/router/ui.js +83 -0
  107. package/dist/ui/types/worker-ui.d.ts +229 -0
  108. package/dist/ui/types/worker-ui.js +5 -0
  109. package/package.json +53 -0
  110. package/src/AnomalyDetection.ts +434 -0
  111. package/src/AutoScaler.ts +654 -0
  112. package/src/BroadcastWorker.ts +34 -0
  113. package/src/CanaryController.ts +531 -0
  114. package/src/ChaosEngineering.ts +301 -0
  115. package/src/CircuitBreaker.ts +495 -0
  116. package/src/ClusterLock.ts +499 -0
  117. package/src/ComplianceManager.ts +815 -0
  118. package/src/DatacenterOrchestrator.ts +561 -0
  119. package/src/DeadLetterQueue.ts +733 -0
  120. package/src/HealthMonitor.ts +390 -0
  121. package/src/MultiQueueWorker.ts +431 -0
  122. package/src/NotificationWorker.ts +33 -0
  123. package/src/Observability.ts +696 -0
  124. package/src/PluginManager.ts +551 -0
  125. package/src/PriorityQueue.ts +351 -0
  126. package/src/ResourceMonitor.ts +769 -0
  127. package/src/SLAMonitor.ts +408 -0
  128. package/src/WorkerFactory.ts +2108 -0
  129. package/src/WorkerInit.ts +313 -0
  130. package/src/WorkerMetrics.ts +709 -0
  131. package/src/WorkerRegistry.ts +443 -0
  132. package/src/WorkerShutdown.ts +210 -0
  133. package/src/WorkerVersioning.ts +422 -0
  134. package/src/config/workerConfig.ts +25 -0
  135. package/src/createQueueWorker.ts +174 -0
  136. package/src/dashboard/index.ts +6 -0
  137. package/src/dashboard/types.ts +141 -0
  138. package/src/dashboard/workers-api.ts +785 -0
  139. package/src/dashboard/zintrust.svg +30 -0
  140. package/src/helper/index.ts +11 -0
  141. package/src/http/WorkerApiController.ts +369 -0
  142. package/src/http/WorkerController.ts +1512 -0
  143. package/src/http/middleware/CustomValidation.ts +360 -0
  144. package/src/http/middleware/DatacenterValidator.ts +124 -0
  145. package/src/http/middleware/EditWorkerValidation.ts +74 -0
  146. package/src/http/middleware/FeaturesValidator.ts +82 -0
  147. package/src/http/middleware/InfrastructureValidator.ts +295 -0
  148. package/src/http/middleware/OptionsValidator.ts +144 -0
  149. package/src/http/middleware/PayloadSanitizer.ts +52 -0
  150. package/src/http/middleware/ProcessorPathSanitizer.ts +86 -0
  151. package/src/http/middleware/QueueNameSanitizer.ts +55 -0
  152. package/src/http/middleware/ValidateDriver.ts +29 -0
  153. package/src/http/middleware/VersionSanitizer.ts +30 -0
  154. package/src/http/middleware/WorkerNameSanitizer.ts +56 -0
  155. package/src/http/middleware/WorkerValidationChain.ts +230 -0
  156. package/src/index.ts +98 -0
  157. package/src/routes/workers.ts +154 -0
  158. package/src/storage/WorkerStore.ts +240 -0
  159. package/src/type.ts +89 -0
  160. package/src/types/queue-monitor.d.ts +38 -0
  161. package/src/types/queue-redis.d.ts +38 -0
  162. package/src/ui/README.md +13 -0
  163. package/src/ui/components/JsonEditor.js +670 -0
  164. package/src/ui/components/JsonViewer.js +387 -0
  165. package/src/ui/components/WorkerCard.js +178 -0
  166. package/src/ui/components/WorkerExpandPanel.js +257 -0
  167. package/src/ui/components/fetcher.js +42 -0
  168. package/src/ui/components/sla-scorecard.js +32 -0
  169. package/src/ui/components/styles.css +30 -0
  170. package/src/ui/components/table-expander.js +34 -0
  171. package/src/ui/integration/worker-ui-integration.js +565 -0
  172. package/src/ui/router/ui.ts +99 -0
  173. package/src/ui/services/workerApi.js +240 -0
  174. package/src/ui/types/worker-ui.ts +283 -0
  175. package/src/ui/utils/jsonValidator.js +444 -0
  176. package/src/ui/workers/index.html +202 -0
  177. package/src/ui/workers/main.js +1781 -0
  178. package/src/ui/workers/styles.css +1350 -0
@@ -0,0 +1,351 @@
1
+ /**
2
+ * Priority Queue Manager
3
+ * BullMQ priority levels with datacenter affinity
4
+ * Sealed namespace for immutability
5
+ */
6
+
7
+ import { ErrorFactory, Logger, type RedisConfig } from '@zintrust/core';
8
+ import { BullMQRedisQueue } from '@zintrust/queue-redis';
9
+ import type { Queue } from 'bullmq';
10
+
11
+ export type PriorityLevel = 'critical' | 'high' | 'normal' | 'low';
12
+
13
+ export type JobPriority = {
14
+ level: PriorityLevel;
15
+ value: number;
16
+ };
17
+
18
+ export type DatacenterAffinity = {
19
+ preferred: string[];
20
+ fallback: string[];
21
+ };
22
+
23
+ export type PriorityJobOptions = {
24
+ priority: PriorityLevel;
25
+ datacenter?: DatacenterAffinity;
26
+ delay?: number;
27
+ attempts?: number;
28
+ backoff?: {
29
+ type: 'exponential' | 'fixed';
30
+ delay: number;
31
+ };
32
+ removeOnComplete?: boolean | number;
33
+ removeOnFail?: boolean | number;
34
+ };
35
+
36
+ export type QueueInfo = {
37
+ name: string;
38
+ isPaused: boolean;
39
+ jobCounts: {
40
+ active: number;
41
+ waiting: number;
42
+ completed: number;
43
+ failed: number;
44
+ delayed: number;
45
+ paused: number;
46
+ };
47
+ };
48
+
49
+ // Priority mappings
50
+ const PRIORITY_VALUES: Record<PriorityLevel, number> = {
51
+ critical: 10,
52
+ high: 5,
53
+ normal: 1,
54
+ low: 0,
55
+ };
56
+
57
+ /**
58
+ * Helper: Get or create queue via shared driver
59
+ */
60
+ const getQueue = (queueName: string): Queue => {
61
+ return BullMQRedisQueue.getQueue(queueName) as Queue;
62
+ };
63
+
64
+ /**
65
+ * Helper: Build job options with priority
66
+ */
67
+ const buildJobOptions = (options: PriorityJobOptions): Record<string, unknown> => {
68
+ const jobOptions: Record<string, unknown> = {
69
+ priority: PRIORITY_VALUES[options.priority],
70
+ };
71
+
72
+ if (options.delay !== undefined) {
73
+ jobOptions['delay'] = options.delay;
74
+ }
75
+
76
+ if (options.attempts !== undefined) {
77
+ jobOptions['attempts'] = options.attempts;
78
+ }
79
+
80
+ if (options.backoff) {
81
+ jobOptions['backoff'] = options.backoff;
82
+ }
83
+
84
+ if (options.removeOnComplete !== undefined) {
85
+ jobOptions['removeOnComplete'] = options.removeOnComplete;
86
+ }
87
+
88
+ if (options.removeOnFail !== undefined) {
89
+ jobOptions['removeOnFail'] = options.removeOnFail;
90
+ }
91
+
92
+ // Store datacenter affinity in job data (workers can read this)
93
+ if (options.datacenter) {
94
+ jobOptions['datacenter'] = options.datacenter;
95
+ }
96
+
97
+ return jobOptions;
98
+ };
99
+
100
+ /**
101
+ * Helper: Match datacenter affinity
102
+ */
103
+ const matchesDatacenterAffinity = (
104
+ jobDatacenter: DatacenterAffinity | undefined,
105
+ workerRegion: string
106
+ ): boolean => {
107
+ if (!jobDatacenter) {
108
+ return true; // No affinity, can be processed anywhere
109
+ }
110
+
111
+ // Check preferred datacenters first
112
+ if (jobDatacenter.preferred.includes(workerRegion)) {
113
+ return true;
114
+ }
115
+
116
+ // Check fallback datacenters
117
+ if (jobDatacenter.fallback.includes(workerRegion)) {
118
+ return true;
119
+ }
120
+
121
+ return false;
122
+ };
123
+
124
+ /**
125
+ * Priority Queue Manager - Sealed namespace
126
+ */
127
+ export const PriorityQueue = Object.freeze({
128
+ /**
129
+ * Initialize with Redis configuration
130
+ */
131
+ initialize(_config: RedisConfig): void {
132
+ Logger.debug('PriorityQueue.initialize() called - auto-initialized via BullMQRedisQueue');
133
+ },
134
+
135
+ /**
136
+ * Add a job to the queue with priority
137
+ */
138
+ async addJob<T = unknown>(
139
+ queueName: string,
140
+ jobName: string,
141
+ data: T,
142
+ options: PriorityJobOptions
143
+ ): Promise<string> {
144
+ const queue = getQueue(queueName);
145
+ const jobOptions = buildJobOptions(options);
146
+
147
+ try {
148
+ const job = await queue.add(jobName, data, jobOptions);
149
+
150
+ Logger.debug(`Added job "${jobName}" to queue "${queueName}"`, {
151
+ jobId: job.id,
152
+ priority: options.priority,
153
+ datacenter: options.datacenter,
154
+ });
155
+
156
+ if (job.id === undefined) {
157
+ throw ErrorFactory.createWorkerError(
158
+ `Failed to add job "${jobName}" to queue "${queueName}": missing job id`
159
+ );
160
+ }
161
+
162
+ return job.id;
163
+ } catch (error) {
164
+ Logger.error(`Failed to add job "${jobName}" to queue "${queueName}"`, error);
165
+ throw error;
166
+ }
167
+ },
168
+
169
+ /**
170
+ * Add multiple jobs in bulk
171
+ */
172
+ async addBulk<T = unknown>(
173
+ queueName: string,
174
+ jobs: Array<{
175
+ name: string;
176
+ data: T;
177
+ options: PriorityJobOptions;
178
+ }>
179
+ ): Promise<string[]> {
180
+ const queue = getQueue(queueName);
181
+
182
+ try {
183
+ const bulkJobs = jobs.map((job) => ({
184
+ name: job.name,
185
+ data: job.data,
186
+ opts: buildJobOptions(job.options),
187
+ }));
188
+
189
+ const addedJobs = await queue.addBulk(bulkJobs);
190
+
191
+ Logger.info(`Added ${addedJobs.length} jobs to queue "${queueName}"`);
192
+
193
+ return addedJobs.map((job) => {
194
+ if (job.id === undefined) {
195
+ throw ErrorFactory.createWorkerError(
196
+ `Failed to add job to queue "${queueName}": missing job id`
197
+ );
198
+ }
199
+ return job.id;
200
+ });
201
+ } catch (error) {
202
+ Logger.error(`Failed to add bulk jobs to queue "${queueName}"`, error);
203
+ throw error;
204
+ }
205
+ },
206
+
207
+ /**
208
+ * Get job by ID
209
+ */
210
+ async getJob(queueName: string, jobId: string) {
211
+ const queue = getQueue(queueName);
212
+ return queue.getJob(jobId);
213
+ },
214
+
215
+ /**
216
+ * Remove a job
217
+ */
218
+ async removeJob(queueName: string, jobId: string): Promise<void> {
219
+ const queue = getQueue(queueName);
220
+ const job = await queue.getJob(jobId);
221
+
222
+ if (job) {
223
+ await job.remove();
224
+ Logger.debug(`Removed job ${jobId} from queue "${queueName}"`);
225
+ }
226
+ },
227
+
228
+ /**
229
+ * Pause a queue
230
+ */
231
+ async pause(queueName: string): Promise<void> {
232
+ const queue = getQueue(queueName);
233
+ await queue.pause();
234
+ Logger.info(`Paused queue "${queueName}"`);
235
+ },
236
+
237
+ /**
238
+ * Resume a queue
239
+ */
240
+ async resume(queueName: string): Promise<void> {
241
+ const queue = getQueue(queueName);
242
+ await queue.resume();
243
+ Logger.info(`Resumed queue "${queueName}"`);
244
+ },
245
+
246
+ /**
247
+ * Get queue information
248
+ */
249
+ async getQueueInfo(queueName: string): Promise<QueueInfo> {
250
+ const queue = getQueue(queueName);
251
+ const isPaused = await queue.isPaused();
252
+ const jobCounts = await queue.getJobCounts();
253
+
254
+ return {
255
+ name: queueName,
256
+ isPaused,
257
+ jobCounts: {
258
+ active: jobCounts['active'] || 0,
259
+ waiting: jobCounts['waiting'] || 0,
260
+ completed: jobCounts['completed'] || 0,
261
+ failed: jobCounts['failed'] || 0,
262
+ delayed: jobCounts['delayed'] || 0,
263
+ paused: jobCounts['paused'] || 0,
264
+ },
265
+ };
266
+ },
267
+
268
+ /**
269
+ * Get all queue names
270
+ */
271
+ getQueueNames(): string[] {
272
+ return BullMQRedisQueue.getQueueNames();
273
+ },
274
+
275
+ /**
276
+ * Drain queue (remove all jobs)
277
+ */
278
+ async drain(queueName: string, delayed = false): Promise<void> {
279
+ const queue = getQueue(queueName);
280
+ await queue.drain(delayed);
281
+ Logger.info(`Drained queue "${queueName}"`, { delayed });
282
+ },
283
+
284
+ /**
285
+ * Clean old jobs from queue
286
+ */
287
+ async clean(
288
+ queueName: string,
289
+ grace: number,
290
+ limit: number,
291
+ type: 'completed' | 'failed' | 'delayed' | 'wait' | 'active' | 'paused' = 'completed'
292
+ ): Promise<string[]> {
293
+ const queue = getQueue(queueName);
294
+ const jobs = await queue.clean(grace, limit, type);
295
+
296
+ Logger.info(`Cleaned ${jobs.length} ${type} jobs from queue "${queueName}"`);
297
+
298
+ return jobs;
299
+ },
300
+
301
+ /**
302
+ * Obliterate queue (remove all data including queue itself)
303
+ */
304
+ async obliterate(queueName: string, force = false): Promise<void> {
305
+ const queue = getQueue(queueName);
306
+ await queue.obliterate({ force });
307
+ await BullMQRedisQueue.closeQueue(queueName);
308
+
309
+ Logger.warn(`Obliterated queue "${queueName}"`);
310
+ },
311
+
312
+ /**
313
+ * Get priority value for level
314
+ */
315
+ getPriorityValue(level: PriorityLevel): number {
316
+ return PRIORITY_VALUES[level];
317
+ },
318
+
319
+ /**
320
+ * Check if job matches datacenter affinity
321
+ */
322
+ matchesDatacenter(jobDatacenter: DatacenterAffinity | undefined, workerRegion: string): boolean {
323
+ return matchesDatacenterAffinity(jobDatacenter, workerRegion);
324
+ },
325
+
326
+ /**
327
+ * Get queue instance (internal use)
328
+ */
329
+ getQueueInstance(queueName: string): Queue {
330
+ return getQueue(queueName);
331
+ },
332
+
333
+ /**
334
+ * Close a queue
335
+ */
336
+ async closeQueue(queueName: string): Promise<void> {
337
+ await BullMQRedisQueue.closeQueue(queueName);
338
+ Logger.info(`Closed queue "${queueName}"`);
339
+ },
340
+
341
+ /**
342
+ * Shutdown and close all queues
343
+ */
344
+ async shutdown(): Promise<void> {
345
+ Logger.info('PriorityQueue shutting down via BullMQRedisQueue...');
346
+ await BullMQRedisQueue.shutdown();
347
+ Logger.info('PriorityQueue shutdown complete');
348
+ },
349
+ });
350
+
351
+ // Graceful shutdown handled by WorkerShutdown