bunqueue 1.0.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 (215) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +640 -0
  3. package/dist/application/dlqManager.d.ts +19 -0
  4. package/dist/application/dlqManager.d.ts.map +1 -0
  5. package/dist/application/dlqManager.js +44 -0
  6. package/dist/application/dlqManager.js.map +1 -0
  7. package/dist/application/eventsManager.d.ts +28 -0
  8. package/dist/application/eventsManager.d.ts.map +1 -0
  9. package/dist/application/eventsManager.js +59 -0
  10. package/dist/application/eventsManager.js.map +1 -0
  11. package/dist/application/jobLogsManager.d.ts +20 -0
  12. package/dist/application/jobLogsManager.d.ts.map +1 -0
  13. package/dist/application/jobLogsManager.js +28 -0
  14. package/dist/application/jobLogsManager.js.map +1 -0
  15. package/dist/application/metricsExporter.d.ts +24 -0
  16. package/dist/application/metricsExporter.d.ts.map +1 -0
  17. package/dist/application/metricsExporter.js +80 -0
  18. package/dist/application/metricsExporter.js.map +1 -0
  19. package/dist/application/operations/ack.d.ts +48 -0
  20. package/dist/application/operations/ack.d.ts.map +1 -0
  21. package/dist/application/operations/ack.js +109 -0
  22. package/dist/application/operations/ack.js.map +1 -0
  23. package/dist/application/operations/index.d.ts +10 -0
  24. package/dist/application/operations/index.d.ts.map +1 -0
  25. package/dist/application/operations/index.js +10 -0
  26. package/dist/application/operations/index.js.map +1 -0
  27. package/dist/application/operations/jobManagement.d.ts +32 -0
  28. package/dist/application/operations/jobManagement.d.ts.map +1 -0
  29. package/dist/application/operations/jobManagement.js +122 -0
  30. package/dist/application/operations/jobManagement.js.map +1 -0
  31. package/dist/application/operations/pull.d.ts +36 -0
  32. package/dist/application/operations/pull.d.ts.map +1 -0
  33. package/dist/application/operations/pull.js +109 -0
  34. package/dist/application/operations/pull.js.map +1 -0
  35. package/dist/application/operations/push.d.ts +36 -0
  36. package/dist/application/operations/push.d.ts.map +1 -0
  37. package/dist/application/operations/push.js +94 -0
  38. package/dist/application/operations/push.js.map +1 -0
  39. package/dist/application/operations/queryOperations.d.ts +33 -0
  40. package/dist/application/operations/queryOperations.d.ts.map +1 -0
  41. package/dist/application/operations/queryOperations.js +57 -0
  42. package/dist/application/operations/queryOperations.js.map +1 -0
  43. package/dist/application/operations/queueControl.d.ts +32 -0
  44. package/dist/application/operations/queueControl.d.ts.map +1 -0
  45. package/dist/application/operations/queueControl.js +72 -0
  46. package/dist/application/operations/queueControl.js.map +1 -0
  47. package/dist/application/queueManager.d.ts +113 -0
  48. package/dist/application/queueManager.d.ts.map +1 -0
  49. package/dist/application/queueManager.js +406 -0
  50. package/dist/application/queueManager.js.map +1 -0
  51. package/dist/application/webhookManager.d.ts +35 -0
  52. package/dist/application/webhookManager.d.ts.map +1 -0
  53. package/dist/application/webhookManager.js +109 -0
  54. package/dist/application/webhookManager.js.map +1 -0
  55. package/dist/application/workerManager.d.ts +48 -0
  56. package/dist/application/workerManager.d.ts.map +1 -0
  57. package/dist/application/workerManager.js +121 -0
  58. package/dist/application/workerManager.js.map +1 -0
  59. package/dist/domain/queue/index.d.ts +6 -0
  60. package/dist/domain/queue/index.d.ts.map +1 -0
  61. package/dist/domain/queue/index.js +6 -0
  62. package/dist/domain/queue/index.js.map +1 -0
  63. package/dist/domain/queue/priorityQueue.d.ts +45 -0
  64. package/dist/domain/queue/priorityQueue.d.ts.map +1 -0
  65. package/dist/domain/queue/priorityQueue.js +203 -0
  66. package/dist/domain/queue/priorityQueue.js.map +1 -0
  67. package/dist/domain/queue/shard.d.ts +98 -0
  68. package/dist/domain/queue/shard.d.ts.map +1 -0
  69. package/dist/domain/queue/shard.js +245 -0
  70. package/dist/domain/queue/shard.js.map +1 -0
  71. package/dist/domain/types/command.d.ts +270 -0
  72. package/dist/domain/types/command.d.ts.map +1 -0
  73. package/dist/domain/types/command.js +6 -0
  74. package/dist/domain/types/command.js.map +1 -0
  75. package/dist/domain/types/cron.d.ts +32 -0
  76. package/dist/domain/types/cron.d.ts.map +1 -0
  77. package/dist/domain/types/cron.js +31 -0
  78. package/dist/domain/types/cron.js.map +1 -0
  79. package/dist/domain/types/index.d.ts +9 -0
  80. package/dist/domain/types/index.d.ts.map +1 -0
  81. package/dist/domain/types/index.js +9 -0
  82. package/dist/domain/types/index.js.map +1 -0
  83. package/dist/domain/types/job.d.ts +94 -0
  84. package/dist/domain/types/job.d.ts.map +1 -0
  85. package/dist/domain/types/job.js +81 -0
  86. package/dist/domain/types/job.js.map +1 -0
  87. package/dist/domain/types/queue.d.ts +86 -0
  88. package/dist/domain/types/queue.d.ts.map +1 -0
  89. package/dist/domain/types/queue.js +84 -0
  90. package/dist/domain/types/queue.js.map +1 -0
  91. package/dist/domain/types/response.d.ts +158 -0
  92. package/dist/domain/types/response.d.ts.map +1 -0
  93. package/dist/domain/types/response.js +86 -0
  94. package/dist/domain/types/response.js.map +1 -0
  95. package/dist/domain/types/webhook.d.ts +33 -0
  96. package/dist/domain/types/webhook.d.ts.map +1 -0
  97. package/dist/domain/types/webhook.js +20 -0
  98. package/dist/domain/types/webhook.js.map +1 -0
  99. package/dist/domain/types/worker.d.ts +27 -0
  100. package/dist/domain/types/worker.d.ts.map +1 -0
  101. package/dist/domain/types/worker.js +27 -0
  102. package/dist/domain/types/worker.js.map +1 -0
  103. package/dist/infrastructure/persistence/index.d.ts +6 -0
  104. package/dist/infrastructure/persistence/index.d.ts.map +1 -0
  105. package/dist/infrastructure/persistence/index.js +6 -0
  106. package/dist/infrastructure/persistence/index.js.map +1 -0
  107. package/dist/infrastructure/persistence/schema.d.ts +14 -0
  108. package/dist/infrastructure/persistence/schema.d.ts.map +1 -0
  109. package/dist/infrastructure/persistence/schema.js +123 -0
  110. package/dist/infrastructure/persistence/schema.js.map +1 -0
  111. package/dist/infrastructure/persistence/sqlite.d.ts +42 -0
  112. package/dist/infrastructure/persistence/sqlite.d.ts.map +1 -0
  113. package/dist/infrastructure/persistence/sqlite.js +164 -0
  114. package/dist/infrastructure/persistence/sqlite.js.map +1 -0
  115. package/dist/infrastructure/persistence/statements.d.ts +55 -0
  116. package/dist/infrastructure/persistence/statements.d.ts.map +1 -0
  117. package/dist/infrastructure/persistence/statements.js +42 -0
  118. package/dist/infrastructure/persistence/statements.js.map +1 -0
  119. package/dist/infrastructure/scheduler/cronParser.d.ts +44 -0
  120. package/dist/infrastructure/scheduler/cronParser.d.ts.map +1 -0
  121. package/dist/infrastructure/scheduler/cronParser.js +90 -0
  122. package/dist/infrastructure/scheduler/cronParser.js.map +1 -0
  123. package/dist/infrastructure/scheduler/cronScheduler.d.ts +68 -0
  124. package/dist/infrastructure/scheduler/cronScheduler.d.ts.map +1 -0
  125. package/dist/infrastructure/scheduler/cronScheduler.js +172 -0
  126. package/dist/infrastructure/scheduler/cronScheduler.js.map +1 -0
  127. package/dist/infrastructure/scheduler/index.d.ts +6 -0
  128. package/dist/infrastructure/scheduler/index.d.ts.map +1 -0
  129. package/dist/infrastructure/scheduler/index.js +6 -0
  130. package/dist/infrastructure/scheduler/index.js.map +1 -0
  131. package/dist/infrastructure/server/handler.d.ts +13 -0
  132. package/dist/infrastructure/server/handler.d.ts.map +1 -0
  133. package/dist/infrastructure/server/handler.js +167 -0
  134. package/dist/infrastructure/server/handler.js.map +1 -0
  135. package/dist/infrastructure/server/handlers/advanced.d.ts +68 -0
  136. package/dist/infrastructure/server/handlers/advanced.d.ts.map +1 -0
  137. package/dist/infrastructure/server/handlers/advanced.js +99 -0
  138. package/dist/infrastructure/server/handlers/advanced.js.map +1 -0
  139. package/dist/infrastructure/server/handlers/core.d.ts +36 -0
  140. package/dist/infrastructure/server/handlers/core.d.ts.map +1 -0
  141. package/dist/infrastructure/server/handlers/core.js +82 -0
  142. package/dist/infrastructure/server/handlers/core.js.map +1 -0
  143. package/dist/infrastructure/server/handlers/cron.d.ts +20 -0
  144. package/dist/infrastructure/server/handlers/cron.d.ts.map +1 -0
  145. package/dist/infrastructure/server/handlers/cron.js +56 -0
  146. package/dist/infrastructure/server/handlers/cron.js.map +1 -0
  147. package/dist/infrastructure/server/handlers/dlq.d.ts +20 -0
  148. package/dist/infrastructure/server/handlers/dlq.d.ts.map +1 -0
  149. package/dist/infrastructure/server/handlers/dlq.js +31 -0
  150. package/dist/infrastructure/server/handlers/dlq.js.map +1 -0
  151. package/dist/infrastructure/server/handlers/index.d.ts +7 -0
  152. package/dist/infrastructure/server/handlers/index.d.ts.map +1 -0
  153. package/dist/infrastructure/server/handlers/index.js +7 -0
  154. package/dist/infrastructure/server/handlers/index.js.map +1 -0
  155. package/dist/infrastructure/server/handlers/management.d.ts +36 -0
  156. package/dist/infrastructure/server/handlers/management.d.ts.map +1 -0
  157. package/dist/infrastructure/server/handlers/management.js +75 -0
  158. package/dist/infrastructure/server/handlers/management.js.map +1 -0
  159. package/dist/infrastructure/server/handlers/monitoring.d.ts +18 -0
  160. package/dist/infrastructure/server/handlers/monitoring.d.ts.map +1 -0
  161. package/dist/infrastructure/server/handlers/monitoring.js +102 -0
  162. package/dist/infrastructure/server/handlers/monitoring.js.map +1 -0
  163. package/dist/infrastructure/server/handlers/query.d.ts +32 -0
  164. package/dist/infrastructure/server/handlers/query.d.ts.map +1 -0
  165. package/dist/infrastructure/server/handlers/query.js +61 -0
  166. package/dist/infrastructure/server/handlers/query.js.map +1 -0
  167. package/dist/infrastructure/server/http.d.ts +43 -0
  168. package/dist/infrastructure/server/http.d.ts.map +1 -0
  169. package/dist/infrastructure/server/http.js +344 -0
  170. package/dist/infrastructure/server/http.js.map +1 -0
  171. package/dist/infrastructure/server/index.d.ts +8 -0
  172. package/dist/infrastructure/server/index.d.ts.map +1 -0
  173. package/dist/infrastructure/server/index.js +8 -0
  174. package/dist/infrastructure/server/index.js.map +1 -0
  175. package/dist/infrastructure/server/protocol.d.ts +44 -0
  176. package/dist/infrastructure/server/protocol.d.ts.map +1 -0
  177. package/dist/infrastructure/server/protocol.js +129 -0
  178. package/dist/infrastructure/server/protocol.js.map +1 -0
  179. package/dist/infrastructure/server/rateLimiter.d.ts +31 -0
  180. package/dist/infrastructure/server/rateLimiter.d.ts.map +1 -0
  181. package/dist/infrastructure/server/rateLimiter.js +79 -0
  182. package/dist/infrastructure/server/rateLimiter.js.map +1 -0
  183. package/dist/infrastructure/server/tcp.d.ts +36 -0
  184. package/dist/infrastructure/server/tcp.d.ts.map +1 -0
  185. package/dist/infrastructure/server/tcp.js +101 -0
  186. package/dist/infrastructure/server/tcp.js.map +1 -0
  187. package/dist/infrastructure/server/types.d.ts +11 -0
  188. package/dist/infrastructure/server/types.d.ts.map +1 -0
  189. package/dist/infrastructure/server/types.js +5 -0
  190. package/dist/infrastructure/server/types.js.map +1 -0
  191. package/dist/main.d.ts +6 -0
  192. package/dist/main.d.ts.map +1 -0
  193. package/dist/main.js +111 -0
  194. package/dist/main.js.map +1 -0
  195. package/dist/shared/hash.d.ts +30 -0
  196. package/dist/shared/hash.d.ts.map +1 -0
  197. package/dist/shared/hash.js +69 -0
  198. package/dist/shared/hash.js.map +1 -0
  199. package/dist/shared/index.d.ts +6 -0
  200. package/dist/shared/index.d.ts.map +1 -0
  201. package/dist/shared/index.js +6 -0
  202. package/dist/shared/index.js.map +1 -0
  203. package/dist/shared/lock.d.ts +70 -0
  204. package/dist/shared/lock.d.ts.map +1 -0
  205. package/dist/shared/lock.js +207 -0
  206. package/dist/shared/lock.js.map +1 -0
  207. package/dist/shared/logger.d.ts +38 -0
  208. package/dist/shared/logger.d.ts.map +1 -0
  209. package/dist/shared/logger.js +74 -0
  210. package/dist/shared/logger.js.map +1 -0
  211. package/dist/shared/serialization.d.ts +23 -0
  212. package/dist/shared/serialization.d.ts.map +1 -0
  213. package/dist/shared/serialization.js +63 -0
  214. package/dist/shared/serialization.js.map +1 -0
  215. package/package.json +82 -0
@@ -0,0 +1,109 @@
1
+ /**
2
+ * Webhook Manager
3
+ * Manages webhooks and sends HTTP callbacks
4
+ */
5
+ import { createWebhook, } from '../domain/types/webhook';
6
+ /** HMAC-SHA256 signature */
7
+ async function signPayload(payload, secret) {
8
+ const encoder = new TextEncoder();
9
+ const key = await crypto.subtle.importKey('raw', encoder.encode(secret), { name: 'HMAC', hash: 'SHA-256' }, false, ['sign']);
10
+ const signature = await crypto.subtle.sign('HMAC', key, encoder.encode(payload));
11
+ return Array.from(new Uint8Array(signature))
12
+ .map((b) => b.toString(16).padStart(2, '0'))
13
+ .join('');
14
+ }
15
+ /**
16
+ * Webhook Manager
17
+ */
18
+ export class WebhookManager {
19
+ webhooks = new Map();
20
+ maxRetries = 3;
21
+ retryDelay = 1000;
22
+ /** Add a webhook */
23
+ add(url, events, queue, secret) {
24
+ const webhook = createWebhook(url, events, queue, secret);
25
+ this.webhooks.set(webhook.id, webhook);
26
+ console.log(`[Webhook] Added webhook ${webhook.id} for ${events.join(', ')}`);
27
+ return webhook;
28
+ }
29
+ /** Remove a webhook */
30
+ remove(id) {
31
+ const removed = this.webhooks.delete(id);
32
+ if (removed) {
33
+ console.log(`[Webhook] Removed webhook ${id}`);
34
+ }
35
+ return removed;
36
+ }
37
+ /** Get webhook by ID */
38
+ get(id) {
39
+ return this.webhooks.get(id);
40
+ }
41
+ /** List all webhooks */
42
+ list() {
43
+ return Array.from(this.webhooks.values());
44
+ }
45
+ /** Trigger webhooks for an event */
46
+ async trigger(event, jobId, queue, extra) {
47
+ const payload = {
48
+ event,
49
+ timestamp: Date.now(),
50
+ jobId,
51
+ queue,
52
+ ...extra,
53
+ };
54
+ const matchingWebhooks = Array.from(this.webhooks.values()).filter((wh) => wh.enabled && wh.events.includes(event) && (wh.queue === null || wh.queue === queue));
55
+ // Fire and forget - don't block
56
+ for (const webhook of matchingWebhooks) {
57
+ this.sendWebhook(webhook, payload).catch((err) => {
58
+ console.error(`[Webhook] Failed to send to ${webhook.url}:`, err);
59
+ });
60
+ }
61
+ }
62
+ /** Send webhook with retries */
63
+ async sendWebhook(webhook, payload) {
64
+ const body = JSON.stringify(payload);
65
+ const headers = {
66
+ 'Content-Type': 'application/json',
67
+ 'X-Webhook-Event': payload.event,
68
+ 'X-Webhook-Timestamp': String(payload.timestamp),
69
+ };
70
+ // Add signature if secret is set
71
+ if (webhook.secret) {
72
+ headers['X-Webhook-Signature'] = await signPayload(body, webhook.secret);
73
+ }
74
+ let lastError = null;
75
+ for (let attempt = 0; attempt < this.maxRetries; attempt++) {
76
+ try {
77
+ const response = await fetch(webhook.url, {
78
+ method: 'POST',
79
+ headers,
80
+ body,
81
+ signal: AbortSignal.timeout(10000),
82
+ });
83
+ if (response.ok) {
84
+ webhook.lastTriggered = Date.now();
85
+ webhook.successCount++;
86
+ return;
87
+ }
88
+ lastError = new Error(`HTTP ${response.status}`);
89
+ }
90
+ catch (err) {
91
+ lastError = err instanceof Error ? err : new Error(String(err));
92
+ }
93
+ // Wait before retry
94
+ if (attempt < this.maxRetries - 1) {
95
+ await new Promise((r) => setTimeout(r, this.retryDelay * (attempt + 1)));
96
+ }
97
+ }
98
+ webhook.failureCount++;
99
+ throw lastError ?? new Error('Webhook delivery failed after max retries');
100
+ }
101
+ /** Get stats */
102
+ getStats() {
103
+ return {
104
+ total: this.webhooks.size,
105
+ enabled: Array.from(this.webhooks.values()).filter((w) => w.enabled).length,
106
+ };
107
+ }
108
+ }
109
+ //# sourceMappingURL=webhookManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhookManager.js","sourceRoot":"","sources":["../../src/application/webhookManager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAKL,aAAa,GACd,MAAM,yBAAyB,CAAC;AAEjC,4BAA4B;AAC5B,KAAK,UAAU,WAAW,CAAC,OAAe,EAAE,MAAc;IACxD,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;IAClC,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,SAAS,CACvC,KAAK,EACL,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EACtB,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,EACjC,KAAK,EACL,CAAC,MAAM,CAAC,CACT,CAAC;IACF,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;IACjF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,SAAS,CAAC,CAAC;SACzC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;SAC3C,IAAI,CAAC,EAAE,CAAC,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,OAAO,cAAc;IACjB,QAAQ,GAAG,IAAI,GAAG,EAAsB,CAAC;IACzC,UAAU,GAAG,CAAC,CAAC;IACf,UAAU,GAAG,IAAI,CAAC;IAE1B,oBAAoB;IACpB,GAAG,CAAC,GAAW,EAAE,MAAgB,EAAE,KAAc,EAAE,MAAe;QAChE,MAAM,OAAO,GAAG,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;QAC1D,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;QACvC,OAAO,CAAC,GAAG,CAAC,2BAA2B,OAAO,CAAC,EAAE,QAAQ,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC9E,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,uBAAuB;IACvB,MAAM,CAAC,EAAa;QAClB,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACzC,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,GAAG,CAAC,6BAA6B,EAAE,EAAE,CAAC,CAAC;QACjD,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,wBAAwB;IACxB,GAAG,CAAC,EAAa;QACf,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC/B,CAAC;IAED,wBAAwB;IACxB,IAAI;QACF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,oCAAoC;IACpC,KAAK,CAAC,OAAO,CACX,KAAmB,EACnB,KAAa,EACb,KAAa,EACb,KAA6D;QAE7D,MAAM,OAAO,GAAmB;YAC9B,KAAK;YACL,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,KAAK;YACL,KAAK;YACL,GAAG,KAAK;SACT,CAAC;QAEF,MAAM,gBAAgB,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAChE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,OAAO,IAAI,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,KAAK,IAAI,IAAI,EAAE,CAAC,KAAK,KAAK,KAAK,CAAC,CAC7F,CAAC;QAEF,gCAAgC;QAChC,KAAK,MAAM,OAAO,IAAI,gBAAgB,EAAE,CAAC;YACvC,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;gBACxD,OAAO,CAAC,KAAK,CAAC,+BAA+B,OAAO,CAAC,GAAG,GAAG,EAAE,GAAG,CAAC,CAAC;YACpE,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,gCAAgC;IACxB,KAAK,CAAC,WAAW,CAAC,OAAgB,EAAE,OAAuB;QACjE,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACrC,MAAM,OAAO,GAA2B;YACtC,cAAc,EAAE,kBAAkB;YAClC,iBAAiB,EAAE,OAAO,CAAC,KAAK;YAChC,qBAAqB,EAAE,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC;SACjD,CAAC;QAEF,iCAAiC;QACjC,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,OAAO,CAAC,qBAAqB,CAAC,GAAG,MAAM,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QAC3E,CAAC;QAED,IAAI,SAAS,GAAiB,IAAI,CAAC;QACnC,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE,EAAE,CAAC;YAC3D,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE;oBACxC,MAAM,EAAE,MAAM;oBACd,OAAO;oBACP,IAAI;oBACJ,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC;iBACnC,CAAC,CAAC;gBAEH,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;oBAChB,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;oBACnC,OAAO,CAAC,YAAY,EAAE,CAAC;oBACvB,OAAO;gBACT,CAAC;gBAED,SAAS,GAAG,IAAI,KAAK,CAAC,QAAQ,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;YACnD,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,SAAS,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAClE,CAAC;YAED,oBAAoB;YACpB,IAAI,OAAO,GAAG,IAAI,CAAC,UAAU,GAAG,CAAC,EAAE,CAAC;gBAClC,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,UAAU,GAAG,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3E,CAAC;QACH,CAAC;QAED,OAAO,CAAC,YAAY,EAAE,CAAC;QACvB,MAAM,SAAS,IAAI,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAC5E,CAAC;IAED,gBAAgB;IAChB,QAAQ;QACN,OAAO;YACL,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI;YACzB,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM;SAC5E,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Worker Manager
3
+ * Tracks connected workers and their status
4
+ */
5
+ import { type Worker, type WorkerId } from '../domain/types/worker';
6
+ /**
7
+ * Worker Manager
8
+ */
9
+ export declare class WorkerManager {
10
+ private workers;
11
+ private cleanupInterval;
12
+ constructor();
13
+ /** Register a new worker */
14
+ register(name: string, queues: string[]): Worker;
15
+ /** Unregister a worker */
16
+ unregister(id: WorkerId): boolean;
17
+ /** Get worker by ID */
18
+ get(id: WorkerId): Worker | undefined;
19
+ /** Update worker last seen time */
20
+ heartbeat(id: WorkerId): boolean;
21
+ /** Increment active jobs count */
22
+ incrementActive(id: WorkerId): void;
23
+ /** Decrement active jobs and increment processed */
24
+ jobCompleted(id: WorkerId): void;
25
+ /** Decrement active jobs and increment failed */
26
+ jobFailed(id: WorkerId): void;
27
+ /** List all workers */
28
+ list(): Worker[];
29
+ /** List active workers (seen recently) */
30
+ listActive(): Worker[];
31
+ /** Get workers for a specific queue */
32
+ getForQueue(queue: string): Worker[];
33
+ /** Start cleanup interval */
34
+ private startCleanup;
35
+ /** Remove stale workers */
36
+ private cleanupStale;
37
+ /** Stop cleanup */
38
+ stop(): void;
39
+ /** Get stats */
40
+ getStats(): {
41
+ total: number;
42
+ active: number;
43
+ totalProcessed: number;
44
+ totalFailed: number;
45
+ activeJobs: number;
46
+ };
47
+ }
48
+ //# sourceMappingURL=workerManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workerManager.d.ts","sourceRoot":"","sources":["../../src/application/workerManager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,KAAK,MAAM,EAAE,KAAK,QAAQ,EAAgB,MAAM,wBAAwB,CAAC;AAKlF;;GAEG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,OAAO,CAA+B;IAC9C,OAAO,CAAC,eAAe,CAA+C;;IAMtE,4BAA4B;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM;IAShD,0BAA0B;IAC1B,UAAU,CAAC,EAAE,EAAE,QAAQ,GAAG,OAAO;IAQjC,uBAAuB;IACvB,GAAG,CAAC,EAAE,EAAE,QAAQ,GAAG,MAAM,GAAG,SAAS;IAIrC,mCAAmC;IACnC,SAAS,CAAC,EAAE,EAAE,QAAQ,GAAG,OAAO;IAOhC,kCAAkC;IAClC,eAAe,CAAC,EAAE,EAAE,QAAQ,GAAG,IAAI;IAQnC,oDAAoD;IACpD,YAAY,CAAC,EAAE,EAAE,QAAQ,GAAG,IAAI;IAShC,iDAAiD;IACjD,SAAS,CAAC,EAAE,EAAE,QAAQ,GAAG,IAAI;IAS7B,uBAAuB;IACvB,IAAI,IAAI,MAAM,EAAE;IAIhB,0CAA0C;IAC1C,UAAU,IAAI,MAAM,EAAE;IAKtB,uCAAuC;IACvC,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;IAIpC,6BAA6B;IAC7B,OAAO,CAAC,YAAY;IAMpB,2BAA2B;IAC3B,OAAO,CAAC,YAAY;IAYpB,mBAAmB;IACnB,IAAI,IAAI,IAAI;IAOZ,gBAAgB;IAChB,QAAQ;;;;;;;CAaT"}
@@ -0,0 +1,121 @@
1
+ /**
2
+ * Worker Manager
3
+ * Tracks connected workers and their status
4
+ */
5
+ import { createWorker } from '../domain/types/worker';
6
+ /** Worker timeout - consider dead after this many ms without heartbeat */
7
+ const WORKER_TIMEOUT_MS = 30_000;
8
+ /**
9
+ * Worker Manager
10
+ */
11
+ export class WorkerManager {
12
+ workers = new Map();
13
+ cleanupInterval = null;
14
+ constructor() {
15
+ this.startCleanup();
16
+ }
17
+ /** Register a new worker */
18
+ register(name, queues) {
19
+ const worker = createWorker(name, queues);
20
+ this.workers.set(worker.id, worker);
21
+ console.log(`[Worker] Registered worker ${worker.id} (${name}) for queues: ${queues.join(', ')}`);
22
+ return worker;
23
+ }
24
+ /** Unregister a worker */
25
+ unregister(id) {
26
+ const removed = this.workers.delete(id);
27
+ if (removed) {
28
+ console.log(`[Worker] Unregistered worker ${id}`);
29
+ }
30
+ return removed;
31
+ }
32
+ /** Get worker by ID */
33
+ get(id) {
34
+ return this.workers.get(id);
35
+ }
36
+ /** Update worker last seen time */
37
+ heartbeat(id) {
38
+ const worker = this.workers.get(id);
39
+ if (!worker)
40
+ return false;
41
+ worker.lastSeen = Date.now();
42
+ return true;
43
+ }
44
+ /** Increment active jobs count */
45
+ incrementActive(id) {
46
+ const worker = this.workers.get(id);
47
+ if (worker) {
48
+ worker.activeJobs++;
49
+ worker.lastSeen = Date.now();
50
+ }
51
+ }
52
+ /** Decrement active jobs and increment processed */
53
+ jobCompleted(id) {
54
+ const worker = this.workers.get(id);
55
+ if (worker) {
56
+ worker.activeJobs = Math.max(0, worker.activeJobs - 1);
57
+ worker.processedJobs++;
58
+ worker.lastSeen = Date.now();
59
+ }
60
+ }
61
+ /** Decrement active jobs and increment failed */
62
+ jobFailed(id) {
63
+ const worker = this.workers.get(id);
64
+ if (worker) {
65
+ worker.activeJobs = Math.max(0, worker.activeJobs - 1);
66
+ worker.failedJobs++;
67
+ worker.lastSeen = Date.now();
68
+ }
69
+ }
70
+ /** List all workers */
71
+ list() {
72
+ return Array.from(this.workers.values());
73
+ }
74
+ /** List active workers (seen recently) */
75
+ listActive() {
76
+ const now = Date.now();
77
+ return Array.from(this.workers.values()).filter((w) => now - w.lastSeen < WORKER_TIMEOUT_MS);
78
+ }
79
+ /** Get workers for a specific queue */
80
+ getForQueue(queue) {
81
+ return Array.from(this.workers.values()).filter((w) => w.queues.includes(queue));
82
+ }
83
+ /** Start cleanup interval */
84
+ startCleanup() {
85
+ this.cleanupInterval = setInterval(() => {
86
+ this.cleanupStale();
87
+ }, 60_000);
88
+ }
89
+ /** Remove stale workers */
90
+ cleanupStale() {
91
+ const now = Date.now();
92
+ const staleTimeout = WORKER_TIMEOUT_MS * 3; // Give extra time before removal
93
+ for (const [id, worker] of this.workers) {
94
+ if (now - worker.lastSeen > staleTimeout) {
95
+ this.workers.delete(id);
96
+ console.log(`[Worker] Removed stale worker ${id} (${worker.name})`);
97
+ }
98
+ }
99
+ }
100
+ /** Stop cleanup */
101
+ stop() {
102
+ if (this.cleanupInterval) {
103
+ clearInterval(this.cleanupInterval);
104
+ this.cleanupInterval = null;
105
+ }
106
+ }
107
+ /** Get stats */
108
+ getStats() {
109
+ const workers = Array.from(this.workers.values());
110
+ const now = Date.now();
111
+ const active = workers.filter((w) => now - w.lastSeen < WORKER_TIMEOUT_MS);
112
+ return {
113
+ total: workers.length,
114
+ active: active.length,
115
+ totalProcessed: workers.reduce((sum, w) => sum + w.processedJobs, 0),
116
+ totalFailed: workers.reduce((sum, w) => sum + w.failedJobs, 0),
117
+ activeJobs: workers.reduce((sum, w) => sum + w.activeJobs, 0),
118
+ };
119
+ }
120
+ }
121
+ //# sourceMappingURL=workerManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workerManager.js","sourceRoot":"","sources":["../../src/application/workerManager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Queue domain barrel export
3
+ */
4
+ export * from './priorityQueue';
5
+ export * from './shard';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/domain/queue/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,iBAAiB,CAAC;AAChC,cAAc,SAAS,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Queue domain barrel export
3
+ */
4
+ export * from './priorityQueue';
5
+ export * from './shard';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/domain/queue/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,iBAAiB,CAAC;AAChC,cAAc,SAAS,CAAC"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Indexed Priority Queue
3
+ * Combines binary heap for O(log n) priority operations
4
+ * with Map for O(1) lookups by job ID
5
+ */
6
+ import type { Job, JobId } from '../types/job';
7
+ /**
8
+ * Indexed Priority Queue implementation
9
+ * O(log n) push, pop, update
10
+ * O(1) find, has
11
+ */
12
+ export declare class IndexedPriorityQueue {
13
+ private heap;
14
+ private index;
15
+ private generation;
16
+ /** Get current size */
17
+ get size(): number;
18
+ /** Check if empty */
19
+ get isEmpty(): boolean;
20
+ /** Push a job into the queue */
21
+ push(job: Job): void;
22
+ /** Pop the highest priority job */
23
+ pop(): Job | null;
24
+ /** Peek at the highest priority job without removing */
25
+ peek(): Job | null;
26
+ /** Find a job by ID - O(1) */
27
+ find(jobId: JobId): Job | null;
28
+ /** Check if job exists - O(1) */
29
+ has(jobId: JobId): boolean;
30
+ /** Remove a job by ID - O(1) for index, heap cleans lazily */
31
+ remove(jobId: JobId): Job | null;
32
+ /** Update job priority - O(log n) */
33
+ updatePriority(jobId: JobId, newPriority: number): boolean;
34
+ /** Update job runAt (for delay changes) - O(log n) */
35
+ updateRunAt(jobId: JobId, newRunAt: number): boolean;
36
+ /** Get all jobs (for iteration) */
37
+ values(): Job[];
38
+ /** Clear the queue */
39
+ clear(): void;
40
+ private removeTop;
41
+ private bubbleUp;
42
+ private bubbleDown;
43
+ private swap;
44
+ }
45
+ //# sourceMappingURL=priorityQueue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"priorityQueue.d.ts","sourceRoot":"","sources":["../../../src/domain/queue/priorityQueue.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AA+B/C;;;;GAIG;AACH,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,IAAI,CAAmB;IAC/B,OAAO,CAAC,KAAK,CAA2D;IACxE,OAAO,CAAC,UAAU,CAAM;IAExB,uBAAuB;IACvB,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,qBAAqB;IACrB,IAAI,OAAO,IAAI,OAAO,CAErB;IAED,gCAAgC;IAChC,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI;IAkBpB,mCAAmC;IACnC,GAAG,IAAI,GAAG,GAAG,IAAI;IAmBjB,wDAAwD;IACxD,IAAI,IAAI,GAAG,GAAG,IAAI;IAgBlB,8BAA8B;IAC9B,IAAI,CAAC,KAAK,EAAE,KAAK,GAAG,GAAG,GAAG,IAAI;IAI9B,iCAAiC;IACjC,GAAG,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO;IAI1B,8DAA8D;IAC9D,MAAM,CAAC,KAAK,EAAE,KAAK,GAAG,GAAG,GAAG,IAAI;IAShC,qCAAqC;IACrC,cAAc,CAAC,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO;IAyB1D,sDAAsD;IACtD,WAAW,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO;IAyBpD,mCAAmC;IACnC,MAAM,IAAI,GAAG,EAAE;IAIf,sBAAsB;IACtB,KAAK,IAAI,IAAI;IAQb,OAAO,CAAC,SAAS;IASjB,OAAO,CAAC,QAAQ;IAWhB,OAAO,CAAC,UAAU;IAoBlB,OAAO,CAAC,IAAI;CAKb"}
@@ -0,0 +1,203 @@
1
+ /**
2
+ * Indexed Priority Queue
3
+ * Combines binary heap for O(log n) priority operations
4
+ * with Map for O(1) lookups by job ID
5
+ */
6
+ /**
7
+ * Compare two heap entries
8
+ * Order: higher priority first, earlier runAt first, LIFO/FIFO by ID
9
+ */
10
+ function compareEntries(a, b) {
11
+ // Higher priority first
12
+ if (a.priority !== b.priority) {
13
+ return b.priority - a.priority;
14
+ }
15
+ // Earlier runAt first (for delayed jobs)
16
+ if (a.runAt !== b.runAt) {
17
+ return a.runAt - b.runAt;
18
+ }
19
+ // LIFO: higher ID first, FIFO: lower ID first
20
+ if (a.lifo) {
21
+ return Number(b.jobId - a.jobId);
22
+ }
23
+ return Number(a.jobId - b.jobId);
24
+ }
25
+ /**
26
+ * Indexed Priority Queue implementation
27
+ * O(log n) push, pop, update
28
+ * O(1) find, has
29
+ */
30
+ export class IndexedPriorityQueue {
31
+ heap = [];
32
+ index = new Map();
33
+ generation = 0n;
34
+ /** Get current size */
35
+ get size() {
36
+ return this.index.size;
37
+ }
38
+ /** Check if empty */
39
+ get isEmpty() {
40
+ return this.index.size === 0;
41
+ }
42
+ /** Push a job into the queue */
43
+ push(job) {
44
+ const gen = Number(this.generation++);
45
+ // Store in index
46
+ this.index.set(job.id, { job, generation: gen });
47
+ // Add to heap
48
+ const entry = {
49
+ jobId: job.id,
50
+ priority: job.priority,
51
+ runAt: job.runAt,
52
+ lifo: job.lifo,
53
+ generation: gen,
54
+ };
55
+ this.heap.push(entry);
56
+ this.bubbleUp(this.heap.length - 1);
57
+ }
58
+ /** Pop the highest priority job */
59
+ pop() {
60
+ while (this.heap.length > 0) {
61
+ const entry = this.heap[0];
62
+ const indexed = this.index.get(entry.jobId);
63
+ // Skip stale entries (generation mismatch = updated or removed)
64
+ if (indexed?.generation !== entry.generation) {
65
+ this.removeTop();
66
+ continue;
67
+ }
68
+ // Remove from both structures
69
+ this.removeTop();
70
+ this.index.delete(entry.jobId);
71
+ return indexed.job;
72
+ }
73
+ return null;
74
+ }
75
+ /** Peek at the highest priority job without removing */
76
+ peek() {
77
+ while (this.heap.length > 0) {
78
+ const entry = this.heap[0];
79
+ const indexed = this.index.get(entry.jobId);
80
+ // Skip stale entries
81
+ if (indexed?.generation !== entry.generation) {
82
+ this.removeTop();
83
+ continue;
84
+ }
85
+ return indexed.job;
86
+ }
87
+ return null;
88
+ }
89
+ /** Find a job by ID - O(1) */
90
+ find(jobId) {
91
+ return this.index.get(jobId)?.job ?? null;
92
+ }
93
+ /** Check if job exists - O(1) */
94
+ has(jobId) {
95
+ return this.index.has(jobId);
96
+ }
97
+ /** Remove a job by ID - O(1) for index, heap cleans lazily */
98
+ remove(jobId) {
99
+ const indexed = this.index.get(jobId);
100
+ if (!indexed)
101
+ return null;
102
+ this.index.delete(jobId);
103
+ // Heap entry becomes stale, will be skipped on pop
104
+ return indexed.job;
105
+ }
106
+ /** Update job priority - O(log n) */
107
+ updatePriority(jobId, newPriority) {
108
+ const indexed = this.index.get(jobId);
109
+ if (!indexed)
110
+ return false;
111
+ // Update job
112
+ const job = indexed.job;
113
+ job.priority = newPriority;
114
+ // Create new heap entry with new generation
115
+ const gen = Number(this.generation++);
116
+ indexed.generation = gen;
117
+ const entry = {
118
+ jobId: job.id,
119
+ priority: newPriority,
120
+ runAt: job.runAt,
121
+ lifo: job.lifo,
122
+ generation: gen,
123
+ };
124
+ this.heap.push(entry);
125
+ this.bubbleUp(this.heap.length - 1);
126
+ return true;
127
+ }
128
+ /** Update job runAt (for delay changes) - O(log n) */
129
+ updateRunAt(jobId, newRunAt) {
130
+ const indexed = this.index.get(jobId);
131
+ if (!indexed)
132
+ return false;
133
+ // Update job
134
+ const job = indexed.job;
135
+ job.runAt = newRunAt;
136
+ // Create new heap entry
137
+ const gen = Number(this.generation++);
138
+ indexed.generation = gen;
139
+ const entry = {
140
+ jobId: job.id,
141
+ priority: job.priority,
142
+ runAt: newRunAt,
143
+ lifo: job.lifo,
144
+ generation: gen,
145
+ };
146
+ this.heap.push(entry);
147
+ this.bubbleUp(this.heap.length - 1);
148
+ return true;
149
+ }
150
+ /** Get all jobs (for iteration) */
151
+ values() {
152
+ return Array.from(this.index.values()).map((v) => v.job);
153
+ }
154
+ /** Clear the queue */
155
+ clear() {
156
+ this.heap = [];
157
+ this.index.clear();
158
+ this.generation = 0n;
159
+ }
160
+ // ============ Heap Operations ============
161
+ removeTop() {
162
+ if (this.heap.length <= 1) {
163
+ this.heap.pop();
164
+ return;
165
+ }
166
+ this.heap[0] = this.heap.pop();
167
+ this.bubbleDown(0);
168
+ }
169
+ bubbleUp(idx) {
170
+ while (idx > 0) {
171
+ const parentIdx = Math.floor((idx - 1) / 2);
172
+ if (compareEntries(this.heap[idx], this.heap[parentIdx]) >= 0) {
173
+ break;
174
+ }
175
+ this.swap(idx, parentIdx);
176
+ idx = parentIdx;
177
+ }
178
+ }
179
+ bubbleDown(idx) {
180
+ const length = this.heap.length;
181
+ while (true) {
182
+ const leftIdx = 2 * idx + 1;
183
+ const rightIdx = 2 * idx + 2;
184
+ let smallest = idx;
185
+ if (leftIdx < length && compareEntries(this.heap[leftIdx], this.heap[smallest]) < 0) {
186
+ smallest = leftIdx;
187
+ }
188
+ if (rightIdx < length && compareEntries(this.heap[rightIdx], this.heap[smallest]) < 0) {
189
+ smallest = rightIdx;
190
+ }
191
+ if (smallest === idx)
192
+ break;
193
+ this.swap(idx, smallest);
194
+ idx = smallest;
195
+ }
196
+ }
197
+ swap(i, j) {
198
+ const temp = this.heap[i];
199
+ this.heap[i] = this.heap[j];
200
+ this.heap[j] = temp;
201
+ }
202
+ }
203
+ //# sourceMappingURL=priorityQueue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"priorityQueue.js","sourceRoot":"","sources":["../../../src/domain/queue/priorityQueue.ts"],"names":[],"mappings":"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"}