bunqueue 2.8.53 → 2.8.56

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 (747) hide show
  1. package/dist/application/background/dlq.d.ts +2 -0
  2. package/dist/application/background/dlq.js +26 -0
  3. package/dist/application/background/lifecycle.d.ts +4 -0
  4. package/dist/application/background/lifecycle.js +90 -0
  5. package/dist/application/background/recovery/active.d.ts +4 -0
  6. package/dist/application/background/recovery/active.js +69 -0
  7. package/dist/application/background/recovery/index.d.ts +2 -0
  8. package/dist/application/background/recovery/index.js +22 -0
  9. package/dist/application/background/recovery/pending.d.ts +3 -0
  10. package/dist/application/background/recovery/pending.js +69 -0
  11. package/dist/application/background/recovery/restore.d.ts +5 -0
  12. package/dist/application/background/recovery/restore.js +58 -0
  13. package/dist/application/background/recovery/shared.d.ts +6 -0
  14. package/dist/application/background/recovery/shared.js +15 -0
  15. package/dist/application/background/timeouts.d.ts +25 -0
  16. package/dist/application/background/timeouts.js +191 -0
  17. package/dist/application/backgroundTasks.d.ts +7 -31
  18. package/dist/application/backgroundTasks.js +6 -438
  19. package/dist/application/cleanupTasks.js +2 -1
  20. package/dist/application/clientTracking.js +3 -1
  21. package/dist/application/contextFactory.d.ts +13 -90
  22. package/dist/application/contextFactory.js +9 -0
  23. package/dist/application/dependencyResultTracker.d.ts +1 -0
  24. package/dist/application/dependencyResultTracker.js +3 -0
  25. package/dist/application/dlqManager.d.ts +9 -9
  26. package/dist/application/dlqManager.js +49 -167
  27. package/dist/application/dlqRetry.d.ts +12 -0
  28. package/dist/application/dlqRetry.js +97 -0
  29. package/dist/application/lockManager.js +24 -4
  30. package/dist/application/lockOperations.js +16 -3
  31. package/dist/application/operations/ack/batch.d.ts +8 -0
  32. package/dist/application/operations/ack/batch.js +64 -0
  33. package/dist/application/operations/ack/completion.d.ts +3 -0
  34. package/dist/application/operations/ack/completion.js +74 -0
  35. package/dist/application/operations/ack/failure.d.ts +3 -0
  36. package/dist/application/operations/ack/failure.js +160 -0
  37. package/dist/application/operations/ack.d.ts +5 -79
  38. package/dist/application/operations/ack.js +4 -319
  39. package/dist/application/operations/ackHelpers.d.ts +3 -52
  40. package/dist/application/operations/ackHelpers.js +11 -4
  41. package/dist/application/operations/customId.d.ts +18 -5
  42. package/dist/application/operations/customId.js +36 -25
  43. package/dist/application/operations/flowValidation.js +9 -4
  44. package/dist/application/operations/jobManagement.js +50 -11
  45. package/dist/application/operations/jobMoveOperations.js +3 -3
  46. package/dist/application/operations/jobStateTransitions.d.ts +1 -1
  47. package/dist/application/operations/jobStateTransitions.js +16 -2
  48. package/dist/application/operations/parentLink.d.ts +36 -0
  49. package/dist/application/operations/parentLink.js +153 -0
  50. package/dist/application/operations/parentLinkInput.d.ts +8 -0
  51. package/dist/application/operations/parentLinkInput.js +23 -0
  52. package/dist/application/operations/push.d.ts +5 -44
  53. package/dist/application/operations/push.js +62 -152
  54. package/dist/application/operations/pushAdmission.d.ts +32 -0
  55. package/dist/application/operations/pushAdmission.js +38 -0
  56. package/dist/application/operations/pushBatch.d.ts +4 -0
  57. package/dist/application/operations/pushBatch.js +136 -0
  58. package/dist/application/operations/pushContext.d.ts +39 -0
  59. package/dist/application/operations/pushContext.js +1 -0
  60. package/dist/application/operations/pushDeduplication.d.ts +42 -0
  61. package/dist/application/operations/pushDeduplication.js +131 -0
  62. package/dist/application/operations/pushInsert.d.ts +13 -1
  63. package/dist/application/operations/pushInsert.js +33 -17
  64. package/dist/application/operations/pushLocks.js +13 -9
  65. package/dist/application/operations/query/collect.d.ts +12 -0
  66. package/dist/application/operations/query/collect.js +118 -0
  67. package/dist/application/operations/query/jobLookup.d.ts +9 -0
  68. package/dist/application/operations/query/jobLookup.js +110 -0
  69. package/dist/application/operations/query/pagination.d.ts +8 -0
  70. package/dist/application/operations/query/pagination.js +90 -0
  71. package/dist/application/operations/query/state.d.ts +4 -0
  72. package/dist/application/operations/query/state.js +63 -0
  73. package/dist/application/operations/queryOperations.d.ts +5 -50
  74. package/dist/application/operations/queryOperations.js +4 -474
  75. package/dist/application/queue-manager/ack.d.ts +23 -0
  76. package/dist/application/queue-manager/ack.js +242 -0
  77. package/dist/application/queue-manager/configuration.d.ts +27 -0
  78. package/dist/application/queue-manager/configuration.js +84 -0
  79. package/dist/application/queue-manager/context.d.ts +5 -0
  80. package/dist/application/queue-manager/context.js +61 -0
  81. package/dist/application/queue-manager/control.d.ts +17 -0
  82. package/dist/application/queue-manager/control.js +133 -0
  83. package/dist/application/queue-manager/delivery.d.ts +32 -0
  84. package/dist/application/queue-manager/delivery.js +143 -0
  85. package/dist/application/queue-manager/dependencies.d.ts +8 -0
  86. package/dist/application/queue-manager/dependencies.js +127 -0
  87. package/dist/application/queue-manager/dependency-runtime.d.ts +8 -0
  88. package/dist/application/queue-manager/dependency-runtime.js +40 -0
  89. package/dist/application/queue-manager/flow-failures.d.ts +18 -0
  90. package/dist/application/queue-manager/flow-failures.js +107 -0
  91. package/dist/application/queue-manager/flow-options.d.ts +8 -0
  92. package/dist/application/queue-manager/flow-options.js +129 -0
  93. package/dist/application/queue-manager/job-management.d.ts +17 -0
  94. package/dist/application/queue-manager/job-management.js +100 -0
  95. package/dist/application/queue-manager/lifecycle.d.ts +4 -0
  96. package/dist/application/queue-manager/lifecycle.js +41 -0
  97. package/dist/application/queue-manager/limits.d.ts +41 -0
  98. package/dist/application/queue-manager/limits.js +108 -0
  99. package/dist/application/queue-manager/locks.d.ts +21 -0
  100. package/dist/application/queue-manager/locks.js +59 -0
  101. package/dist/application/queue-manager/observability.d.ts +16 -0
  102. package/dist/application/queue-manager/observability.js +44 -0
  103. package/dist/application/queue-manager/queries.d.ts +17 -0
  104. package/dist/application/queue-manager/queries.js +118 -0
  105. package/dist/application/queue-manager/repeat.d.ts +4 -0
  106. package/dist/application/queue-manager/repeat.js +26 -0
  107. package/dist/application/queue-manager/services.d.ts +19 -0
  108. package/dist/application/queue-manager/services.js +80 -0
  109. package/dist/application/queue-manager/state.d.ts +92 -0
  110. package/dist/application/queue-manager/state.js +144 -0
  111. package/dist/application/queue-manager/stats.d.ts +28 -0
  112. package/dist/application/queue-manager/stats.js +52 -0
  113. package/dist/application/queueManager.d.ts +4 -380
  114. package/dist/application/queueManager.js +3 -1880
  115. package/dist/application/queueTelemetryJournal.d.ts +20 -0
  116. package/dist/application/queueTelemetryJournal.js +133 -0
  117. package/dist/application/repeatJobs.d.ts +7 -0
  118. package/dist/application/repeatJobs.js +132 -0
  119. package/dist/application/stallDetection.js +9 -4
  120. package/dist/application/types/ack.d.ts +132 -0
  121. package/dist/application/types/ack.js +1 -0
  122. package/dist/application/types/background.d.ts +18 -0
  123. package/dist/application/types/background.js +1 -0
  124. package/dist/application/types/config.d.ts +37 -0
  125. package/dist/application/types/config.js +15 -0
  126. package/dist/application/types/contextFactory.d.ts +83 -0
  127. package/dist/application/types/contextFactory.js +1 -0
  128. package/dist/application/types/contexts.d.ts +110 -0
  129. package/dist/application/types/contexts.js +1 -0
  130. package/dist/application/types/index.d.ts +7 -0
  131. package/dist/application/types/index.js +1 -0
  132. package/dist/application/types/query.d.ts +23 -0
  133. package/dist/application/types/query.js +1 -0
  134. package/dist/application/types/queueManager.d.ts +94 -0
  135. package/dist/application/types/queueManager.js +1 -0
  136. package/dist/cli/commandRouter.d.ts +1 -1
  137. package/dist/cli/commands/core.js +1 -0
  138. package/dist/cli/output/collections.d.ts +8 -0
  139. package/dist/cli/output/collections.js +131 -0
  140. package/dist/cli/output/jobs.d.ts +2 -0
  141. package/dist/cli/output/jobs.js +61 -0
  142. package/dist/cli/output/style.d.ts +14 -0
  143. package/dist/cli/output/style.js +28 -0
  144. package/dist/cli/output/success.d.ts +1 -0
  145. package/dist/cli/output/success.js +108 -0
  146. package/dist/cli/output.d.ts +1 -6
  147. package/dist/cli/output.js +7 -395
  148. package/dist/client/bunqueue/dlqRateLimit.d.ts +8 -0
  149. package/dist/client/bunqueue/dlqRateLimit.js +24 -0
  150. package/dist/client/bunqueue/runtime.d.ts +35 -0
  151. package/dist/client/bunqueue/runtime.js +138 -0
  152. package/dist/client/bunqueue.d.ts +19 -34
  153. package/dist/client/bunqueue.js +45 -166
  154. package/dist/client/dlqConversion.d.ts +5 -0
  155. package/dist/client/dlqConversion.js +28 -0
  156. package/dist/client/events.d.ts +7 -56
  157. package/dist/client/events.js +38 -15
  158. package/dist/client/flow.d.ts +6 -12
  159. package/dist/client/flow.js +16 -34
  160. package/dist/client/flowJobDependencies.js +3 -1
  161. package/dist/client/flowJobFactory.d.ts +9 -1
  162. package/dist/client/flowJobFactory.js +25 -9
  163. package/dist/client/flowJobMoveMethods.d.ts +5 -5
  164. package/dist/client/flowJobMoveMethods.js +37 -17
  165. package/dist/client/flowLegacyPlan.js +22 -8
  166. package/dist/client/flowOptions.d.ts +1 -1
  167. package/dist/client/flowOptions.js +2 -1
  168. package/dist/client/flowPlan.js +2 -3
  169. package/dist/client/flowPush.d.ts +1 -0
  170. package/dist/client/flowPush.js +5 -1
  171. package/dist/client/flowReader.js +5 -5
  172. package/dist/client/flowResults.d.ts +11 -0
  173. package/dist/client/flowResults.js +42 -0
  174. package/dist/client/index.d.ts +3 -1
  175. package/dist/client/jobConversion.d.ts +3 -7
  176. package/dist/client/jobConversion.js +36 -33
  177. package/dist/client/jobConversionHelpers.d.ts +19 -3
  178. package/dist/client/jobConversionHelpers.js +20 -16
  179. package/dist/client/jobConversionTypes.d.ts +8 -0
  180. package/dist/client/jobDeduplication.d.ts +6 -0
  181. package/dist/client/jobDeduplication.js +14 -0
  182. package/dist/client/jobHelpers.d.ts +7 -2
  183. package/dist/client/jobHelpers.js +16 -8
  184. package/dist/client/queue/bullmqCompat.d.ts +18 -8
  185. package/dist/client/queue/bullmqCompat.js +39 -71
  186. package/dist/client/queue/deduplication.d.ts +2 -0
  187. package/dist/client/queue/deduplication.js +20 -11
  188. package/dist/client/queue/dlq.d.ts +11 -6
  189. package/dist/client/queue/dlq.js +57 -16
  190. package/dist/client/queue/dlqJobMethods.d.ts +9 -0
  191. package/dist/client/queue/dlqJobMethods.js +177 -0
  192. package/dist/client/queue/dlqOps.d.ts +2 -1
  193. package/dist/client/queue/dlqOps.js +4 -10
  194. package/dist/client/queue/dlqStats.d.ts +3 -0
  195. package/dist/client/queue/dlqStats.js +21 -0
  196. package/dist/client/queue/job-proxy/dependencies.d.ts +9 -0
  197. package/dist/client/queue/job-proxy/dependencies.js +67 -0
  198. package/dist/client/queue/job-proxy/reflection.d.ts +2 -0
  199. package/dist/client/queue/job-proxy/reflection.js +18 -0
  200. package/dist/client/queue/job-proxy/simple.d.ts +3 -0
  201. package/dist/client/queue/job-proxy/simple.js +316 -0
  202. package/dist/client/queue/job-proxy/tcp.d.ts +4 -0
  203. package/dist/client/queue/job-proxy/tcp.js +191 -0
  204. package/dist/client/queue/jobMetadata.d.ts +10 -0
  205. package/dist/client/queue/jobMetadata.js +24 -0
  206. package/dist/client/queue/jobMove.d.ts +4 -4
  207. package/dist/client/queue/jobMove.js +87 -24
  208. package/dist/client/queue/jobProxy.d.ts +4 -50
  209. package/dist/client/queue/jobProxy.js +3 -511
  210. package/dist/client/queue/operations/add/bulk.d.ts +7 -0
  211. package/dist/client/queue/operations/add/bulk.js +129 -0
  212. package/dist/client/queue/operations/add/payload.d.ts +24 -0
  213. package/dist/client/queue/operations/add/payload.js +85 -0
  214. package/dist/client/queue/operations/add/single.d.ts +3 -0
  215. package/dist/client/queue/operations/add/single.js +107 -0
  216. package/dist/client/queue/operations/add.d.ts +2 -47
  217. package/dist/client/queue/operations/add.js +2 -347
  218. package/dist/client/queue/operations/index.d.ts +1 -0
  219. package/dist/client/queue/operations/index.js +1 -0
  220. package/dist/client/queue/operations/management.d.ts +0 -4
  221. package/dist/client/queue/operations/management.js +35 -6
  222. package/dist/client/queue/operations/query.d.ts +1 -20
  223. package/dist/client/queue/operations/query.js +38 -116
  224. package/dist/client/queue/operations/queryStates.d.ts +13 -0
  225. package/dist/client/queue/operations/queryStates.js +32 -0
  226. package/dist/client/queue/operations/queryTcpPages.d.ts +14 -0
  227. package/dist/client/queue/operations/queryTcpPages.js +40 -0
  228. package/dist/client/queue/queue.d.ts +6 -189
  229. package/dist/client/queue/queue.js +6 -547
  230. package/dist/client/queue/rateLimit.d.ts +4 -4
  231. package/dist/client/queue/rateLimit.js +17 -8
  232. package/dist/client/queue/runtime/compatibility.d.ts +13 -0
  233. package/dist/client/queue/runtime/compatibility.js +38 -0
  234. package/dist/client/queue/runtime/configuration.d.ts +42 -0
  235. package/dist/client/queue/runtime/configuration.js +109 -0
  236. package/dist/client/queue/runtime/connection.d.ts +6 -0
  237. package/dist/client/queue/runtime/connection.js +16 -0
  238. package/dist/client/queue/runtime/control.d.ts +41 -0
  239. package/dist/client/queue/runtime/control.js +87 -0
  240. package/dist/client/queue/runtime/queries.d.ts +48 -0
  241. package/dist/client/queue/runtime/queries.js +95 -0
  242. package/dist/client/queue/runtime/scheduling.d.ts +33 -0
  243. package/dist/client/queue/runtime/scheduling.js +56 -0
  244. package/dist/client/queue/runtime/state.d.ts +96 -0
  245. package/dist/client/queue/runtime/state.js +149 -0
  246. package/dist/client/queue/scheduler.d.ts +2 -5
  247. package/dist/client/queue/scheduler.js +25 -23
  248. package/dist/client/queue/schedulerPagination.d.ts +7 -0
  249. package/dist/client/queue/schedulerPagination.js +10 -0
  250. package/dist/client/queue/types/add.d.ts +40 -0
  251. package/dist/client/queue/types/add.js +1 -0
  252. package/dist/client/queue/types/contexts.d.ts +33 -0
  253. package/dist/client/queue/types/contexts.js +5 -0
  254. package/dist/client/queue/types/index.d.ts +3 -0
  255. package/dist/client/queue/types/index.js +1 -0
  256. package/dist/client/queue/types/job.d.ts +50 -0
  257. package/dist/client/queue/types/job.js +1 -0
  258. package/dist/client/queue/types/runtime.d.ts +35 -0
  259. package/dist/client/queue/types/runtime.js +1 -0
  260. package/dist/client/queue/workers.d.ts +16 -8
  261. package/dist/client/queue/workers.js +42 -16
  262. package/dist/client/queue-events/tcpSubscription.d.ts +23 -0
  263. package/dist/client/queue-events/tcpSubscription.js +99 -0
  264. package/dist/client/queueGroup.d.ts +11 -0
  265. package/dist/client/queueGroup.js +28 -1
  266. package/dist/client/sandboxed/queueOps.d.ts +2 -2
  267. package/dist/client/sandboxed/queueOps.js +32 -5
  268. package/dist/client/sandboxed/runtime/dispatch.d.ts +13 -0
  269. package/dist/client/sandboxed/runtime/dispatch.js +186 -0
  270. package/dist/client/sandboxed/runtime/lifecycle.d.ts +20 -0
  271. package/dist/client/sandboxed/runtime/lifecycle.js +95 -0
  272. package/dist/client/sandboxed/runtime/log.d.ts +1 -0
  273. package/dist/client/sandboxed/runtime/log.js +15 -0
  274. package/dist/client/sandboxed/runtime/pool.d.ts +11 -0
  275. package/dist/client/sandboxed/runtime/pool.js +121 -0
  276. package/dist/client/sandboxed/runtime/recovery.d.ts +11 -0
  277. package/dist/client/sandboxed/runtime/recovery.js +122 -0
  278. package/dist/client/sandboxed/runtime/state.d.ts +39 -0
  279. package/dist/client/sandboxed/runtime/state.js +59 -0
  280. package/dist/client/sandboxed/types/index.d.ts +2 -0
  281. package/dist/client/sandboxed/types/index.js +1 -0
  282. package/dist/client/sandboxed/types/options.d.ts +27 -0
  283. package/dist/client/sandboxed/types/options.js +1 -0
  284. package/dist/client/sandboxed/types/process.d.ts +30 -0
  285. package/dist/client/sandboxed/types/process.js +1 -0
  286. package/dist/client/sandboxed/worker.d.ts +3 -85
  287. package/dist/client/sandboxed/worker.js +3 -557
  288. package/dist/client/sandboxed/wrapper.js +1 -0
  289. package/dist/client/tcp/client.d.ts +5 -112
  290. package/dist/client/tcp/client.js +5 -481
  291. package/dist/client/tcp/commandQueue.d.ts +23 -0
  292. package/dist/client/tcp/commandQueue.js +89 -0
  293. package/dist/client/tcp/connection.d.ts +4 -85
  294. package/dist/client/tcp/connection.js +3 -315
  295. package/dist/client/tcp/errors.d.ts +6 -0
  296. package/dist/client/tcp/errors.js +18 -0
  297. package/dist/client/tcp/runtime/commands.d.ts +9 -0
  298. package/dist/client/tcp/runtime/commands.js +124 -0
  299. package/dist/client/tcp/runtime/connectivity.d.ts +13 -0
  300. package/dist/client/tcp/runtime/connectivity.js +77 -0
  301. package/dist/client/tcp/runtime/health.d.ts +14 -0
  302. package/dist/client/tcp/runtime/health.js +127 -0
  303. package/dist/client/tcp/runtime/lifecycle.d.ts +8 -0
  304. package/dist/client/tcp/runtime/lifecycle.js +32 -0
  305. package/dist/client/tcp/runtime/state.d.ts +50 -0
  306. package/dist/client/tcp/runtime/state.js +45 -0
  307. package/dist/client/tcp/transport.d.ts +18 -0
  308. package/dist/client/tcp/transport.js +158 -0
  309. package/dist/client/tcp/types/command.d.ts +9 -0
  310. package/dist/client/tcp/types/command.js +1 -0
  311. package/dist/client/tcp/types/connection.d.ts +31 -0
  312. package/dist/client/tcp/types/connection.js +17 -0
  313. package/dist/client/tcp/types/index.d.ts +5 -0
  314. package/dist/client/tcp/types/index.js +1 -0
  315. package/dist/client/tcp/types/socket.d.ts +8 -0
  316. package/dist/client/tcp/types/socket.js +1 -0
  317. package/dist/client/tcp/types/tls.d.ts +4 -0
  318. package/dist/client/tcp/types/tls.js +1 -0
  319. package/dist/client/tcp/types.d.ts +2 -106
  320. package/dist/client/tcp/types.js +2 -22
  321. package/dist/client/types/connection.d.ts +29 -0
  322. package/dist/client/types/connection.js +1 -0
  323. package/dist/client/types/dlq.d.ts +45 -0
  324. package/dist/client/types/dlq.js +1 -0
  325. package/dist/client/types/events.d.ts +54 -0
  326. package/dist/client/types/events.js +1 -0
  327. package/dist/client/types/flow.d.ts +10 -0
  328. package/dist/client/types/flow.js +1 -0
  329. package/dist/client/types/index.d.ts +10 -0
  330. package/dist/client/types/index.js +1 -0
  331. package/dist/client/types/job.d.ts +127 -0
  332. package/dist/client/types/job.js +1 -0
  333. package/dist/client/types/metrics.d.ts +1 -0
  334. package/dist/client/types/metrics.js +1 -0
  335. package/dist/client/types/options.d.ts +62 -0
  336. package/dist/client/types/options.js +1 -0
  337. package/dist/client/types/worker.d.ts +38 -0
  338. package/dist/client/types/worker.js +1 -0
  339. package/dist/client/types.d.ts +2 -583
  340. package/dist/client/types.js +2 -6
  341. package/dist/client/worker/ackBatcher.d.ts +1 -1
  342. package/dist/client/worker/ackBatcher.js +17 -5
  343. package/dist/client/worker/ackOutcome.d.ts +8 -0
  344. package/dist/client/worker/ackOutcome.js +58 -0
  345. package/dist/client/worker/constants.d.ts +7 -0
  346. package/dist/client/worker/constants.js +7 -0
  347. package/dist/client/worker/groupConcurrency.js +3 -0
  348. package/dist/client/worker/handlers/completion.d.ts +28 -0
  349. package/dist/client/worker/handlers/completion.js +68 -0
  350. package/dist/client/worker/handlers/dependencies.d.ts +11 -0
  351. package/dist/client/worker/handlers/dependencies.js +107 -0
  352. package/dist/client/worker/handlers/mutations.d.ts +23 -0
  353. package/dist/client/worker/handlers/mutations.js +211 -0
  354. package/dist/client/worker/handlers/queries.d.ts +15 -0
  355. package/dist/client/worker/handlers/queries.js +100 -0
  356. package/dist/client/worker/index.d.ts +2 -2
  357. package/dist/client/worker/index.js +1 -1
  358. package/dist/client/worker/jobParser.js +4 -2
  359. package/dist/client/worker/processor.d.ts +2 -15
  360. package/dist/client/worker/processor.js +68 -125
  361. package/dist/client/worker/processorHandlers.d.ts +4 -65
  362. package/dist/client/worker/processorHandlers.js +4 -400
  363. package/dist/client/worker/processorOutcome.d.ts +14 -0
  364. package/dist/client/worker/processorOutcome.js +125 -0
  365. package/dist/client/worker/runtime/buffer.d.ts +8 -0
  366. package/dist/client/worker/runtime/buffer.js +50 -0
  367. package/dist/client/worker/runtime/control.d.ts +26 -0
  368. package/dist/client/worker/runtime/control.js +175 -0
  369. package/dist/client/worker/runtime/execution.d.ts +11 -0
  370. package/dist/client/worker/runtime/execution.js +123 -0
  371. package/dist/client/worker/runtime/lifecycle.d.ts +7 -0
  372. package/dist/client/worker/runtime/lifecycle.js +114 -0
  373. package/dist/client/worker/runtime/manual.d.ts +10 -0
  374. package/dist/client/worker/runtime/manual.js +137 -0
  375. package/dist/client/worker/runtime/options.d.ts +5 -0
  376. package/dist/client/worker/runtime/options.js +39 -0
  377. package/dist/client/worker/runtime/polling.d.ts +12 -0
  378. package/dist/client/worker/runtime/polling.js +123 -0
  379. package/dist/client/worker/runtime/state.d.ts +110 -0
  380. package/dist/client/worker/runtime/state.js +156 -0
  381. package/dist/client/worker/types/index.d.ts +5 -0
  382. package/dist/client/worker/types/index.js +1 -0
  383. package/dist/client/worker/types/manual.d.ts +7 -0
  384. package/dist/client/worker/types/manual.js +1 -0
  385. package/dist/client/worker/types/options.d.ts +24 -0
  386. package/dist/client/worker/types/options.js +1 -0
  387. package/dist/client/worker/types/outcome.d.ts +23 -0
  388. package/dist/client/worker/types/outcome.js +1 -0
  389. package/dist/client/worker/types/processor.d.ts +22 -0
  390. package/dist/client/worker/types/processor.js +1 -0
  391. package/dist/client/worker/types/transport.d.ts +11 -0
  392. package/dist/client/worker/types/transport.js +1 -0
  393. package/dist/client/worker/worker.d.ts +3 -160
  394. package/dist/client/worker/worker.js +3 -904
  395. package/dist/client/worker/workerRateLimiter.d.ts +5 -1
  396. package/dist/client/worker/workerRateLimiter.js +40 -20
  397. package/dist/client/worker.d.ts +1 -0
  398. package/dist/client/workflow/compensationChild.d.ts +2 -1
  399. package/dist/client/workflow/compensationChild.js +1 -1
  400. package/dist/client/workflow/compensationClaim.d.ts +11 -0
  401. package/dist/client/workflow/compensationClaim.js +30 -0
  402. package/dist/client/workflow/compensator.d.ts +7 -2
  403. package/dist/client/workflow/compensator.js +5 -11
  404. package/dist/client/workflow/recovery.js +25 -2
  405. package/dist/client/workflow/rollbackControl.js +1 -1
  406. package/dist/domain/job/constants.d.ts +12 -0
  407. package/dist/domain/job/constants.js +12 -0
  408. package/dist/domain/job/create.d.ts +2 -0
  409. package/dist/domain/job/create.js +103 -0
  410. package/dist/domain/job/ids.d.ts +5 -0
  411. package/dist/domain/job/ids.js +12 -0
  412. package/dist/domain/job/locks.d.ts +4 -0
  413. package/dist/domain/job/locks.js +23 -0
  414. package/dist/domain/job/payload.d.ts +18 -0
  415. package/dist/domain/job/payload.js +43 -0
  416. package/dist/domain/job/state.d.ts +8 -0
  417. package/dist/domain/job/state.js +51 -0
  418. package/dist/domain/job/terminal.d.ts +3 -0
  419. package/dist/domain/job/terminal.js +9 -0
  420. package/dist/domain/queue/dlqShard.d.ts +2 -0
  421. package/dist/domain/queue/dlqShard.js +34 -9
  422. package/dist/domain/queue/limiterManager.d.ts +11 -0
  423. package/dist/domain/queue/limiterManager.js +28 -0
  424. package/dist/domain/queue/priorityQueue.js +3 -39
  425. package/dist/domain/queue/priorityQueueOrder.d.ts +3 -0
  426. package/dist/domain/queue/priorityQueueOrder.js +21 -0
  427. package/dist/domain/queue/shard/dependencies.d.ts +11 -0
  428. package/dist/domain/queue/shard/dependencies.js +22 -0
  429. package/dist/domain/queue/shard/dlq.d.ts +25 -0
  430. package/dist/domain/queue/shard/dlq.js +71 -0
  431. package/dist/domain/queue/shard/keys.d.ts +18 -0
  432. package/dist/domain/queue/shard/keys.js +45 -0
  433. package/dist/domain/queue/shard/lifecycle.d.ts +10 -0
  434. package/dist/domain/queue/shard/lifecycle.js +43 -0
  435. package/dist/domain/queue/shard/limits.d.ts +24 -0
  436. package/dist/domain/queue/shard/limits.js +57 -0
  437. package/dist/domain/queue/shard/metrics.d.ts +32 -0
  438. package/dist/domain/queue/shard/metrics.js +72 -0
  439. package/dist/domain/queue/shard/state.d.ts +34 -0
  440. package/dist/domain/queue/shard/state.js +80 -0
  441. package/dist/domain/queue/shard.d.ts +5 -137
  442. package/dist/domain/queue/shard.js +4 -390
  443. package/dist/domain/queue/uniqueKeyManager.d.ts +3 -1
  444. package/dist/domain/queue/uniqueKeyManager.js +9 -1
  445. package/dist/domain/response/builders.d.ts +15 -0
  446. package/dist/domain/response/builders.js +39 -0
  447. package/dist/domain/types/command.d.ts +2 -522
  448. package/dist/domain/types/command.js +2 -5
  449. package/dist/domain/types/commands/base.d.ts +5 -0
  450. package/dist/domain/types/commands/base.js +1 -0
  451. package/dist/domain/types/commands/core.d.ts +106 -0
  452. package/dist/domain/types/commands/core.js +1 -0
  453. package/dist/domain/types/commands/cron.d.ts +36 -0
  454. package/dist/domain/types/commands/cron.js +1 -0
  455. package/dist/domain/types/commands/dashboard.d.ts +13 -0
  456. package/dist/domain/types/commands/dashboard.js +1 -0
  457. package/dist/domain/types/commands/dlq.d.ts +39 -0
  458. package/dist/domain/types/commands/dlq.js +1 -0
  459. package/dist/domain/types/commands/extended.d.ts +63 -0
  460. package/dist/domain/types/commands/extended.js +1 -0
  461. package/dist/domain/types/commands/index.d.ts +12 -0
  462. package/dist/domain/types/commands/index.js +12 -0
  463. package/dist/domain/types/commands/limits.d.ts +54 -0
  464. package/dist/domain/types/commands/limits.js +1 -0
  465. package/dist/domain/types/commands/management.d.ts +73 -0
  466. package/dist/domain/types/commands/management.js +1 -0
  467. package/dist/domain/types/commands/monitoring.d.ts +49 -0
  468. package/dist/domain/types/commands/monitoring.js +1 -0
  469. package/dist/domain/types/commands/protocol.d.ts +20 -0
  470. package/dist/domain/types/commands/protocol.js +1 -0
  471. package/dist/domain/types/commands/query.d.ts +46 -0
  472. package/dist/domain/types/commands/query.js +1 -0
  473. package/dist/domain/types/commands/union.d.ts +13 -0
  474. package/dist/domain/types/commands/union.js +1 -0
  475. package/dist/domain/types/commands/workers.d.ts +39 -0
  476. package/dist/domain/types/commands/workers.js +1 -0
  477. package/dist/domain/types/cron.d.ts +4 -2
  478. package/dist/domain/types/cron.js +3 -0
  479. package/dist/domain/types/dlq.d.ts +17 -0
  480. package/dist/domain/types/dlq.js +70 -14
  481. package/dist/domain/types/index.d.ts +2 -0
  482. package/dist/domain/types/index.js +1 -0
  483. package/dist/domain/types/job.d.ts +8 -269
  484. package/dist/domain/types/job.js +8 -234
  485. package/dist/domain/types/jobs/model.d.ts +152 -0
  486. package/dist/domain/types/jobs/model.js +1 -0
  487. package/dist/domain/types/metrics.d.ts +16 -0
  488. package/dist/domain/types/metrics.js +1 -0
  489. package/dist/domain/types/priorityQueue.d.ts +12 -0
  490. package/dist/domain/types/priorityQueue.js +1 -0
  491. package/dist/domain/types/protocol.d.ts +5 -0
  492. package/dist/domain/types/protocol.js +4 -0
  493. package/dist/domain/types/queue.d.ts +7 -0
  494. package/dist/domain/types/queue.js +13 -0
  495. package/dist/domain/types/response.d.ts +3 -192
  496. package/dist/domain/types/response.js +3 -101
  497. package/dist/domain/types/responses/model.d.ts +152 -0
  498. package/dist/domain/types/responses/model.js +1 -0
  499. package/dist/domain/types/shard.d.ts +4 -0
  500. package/dist/domain/types/shard.js +1 -0
  501. package/dist/infrastructure/cloud/cloudAgent.js +6 -0
  502. package/dist/infrastructure/cloud/commandHandler.d.ts +2 -41
  503. package/dist/infrastructure/cloud/commandHandler.js +1 -1
  504. package/dist/infrastructure/cloud/commands/integrations.d.ts +2 -0
  505. package/dist/infrastructure/cloud/commands/integrations.js +31 -0
  506. package/dist/infrastructure/cloud/commands/jobMapper.d.ts +56 -0
  507. package/dist/infrastructure/cloud/commands/jobMapper.js +72 -0
  508. package/dist/infrastructure/cloud/commands/jobs.d.ts +2 -0
  509. package/dist/infrastructure/cloud/commands/jobs.js +111 -0
  510. package/dist/infrastructure/cloud/commands/queues.d.ts +2 -0
  511. package/dist/infrastructure/cloud/commands/queues.js +126 -0
  512. package/dist/infrastructure/cloud/commands.d.ts +3 -10
  513. package/dist/infrastructure/cloud/commands.js +7 -344
  514. package/dist/infrastructure/cloud/snapshot/analytics.d.ts +16 -0
  515. package/dist/infrastructure/cloud/snapshot/analytics.js +132 -0
  516. package/dist/infrastructure/cloud/snapshot/collector.d.ts +24 -0
  517. package/dist/infrastructure/cloud/snapshot/collector.js +105 -0
  518. package/dist/infrastructure/cloud/snapshot/config.d.ts +5 -0
  519. package/dist/infrastructure/cloud/snapshot/config.js +86 -0
  520. package/dist/infrastructure/cloud/snapshot/jobs.d.ts +5 -0
  521. package/dist/infrastructure/cloud/snapshot/jobs.js +148 -0
  522. package/dist/infrastructure/cloud/snapshot/stalls.d.ts +3 -0
  523. package/dist/infrastructure/cloud/snapshot/stalls.js +34 -0
  524. package/dist/infrastructure/cloud/snapshotCollector.d.ts +2 -53
  525. package/dist/infrastructure/cloud/snapshotCollector.js +5 -107
  526. package/dist/infrastructure/cloud/snapshotHelpers.d.ts +5 -45
  527. package/dist/infrastructure/cloud/snapshotHelpers.js +4 -426
  528. package/dist/infrastructure/cloud/types/collector.d.ts +54 -0
  529. package/dist/infrastructure/cloud/types/collector.js +1 -0
  530. package/dist/infrastructure/cloud/types/command.d.ts +44 -0
  531. package/dist/infrastructure/cloud/types/command.js +1 -0
  532. package/dist/infrastructure/cloud/types/config.d.ts +18 -0
  533. package/dist/infrastructure/cloud/types/config.js +1 -0
  534. package/dist/infrastructure/cloud/types/event.d.ts +14 -0
  535. package/dist/infrastructure/cloud/types/event.js +1 -0
  536. package/dist/infrastructure/cloud/types/redact.d.ts +4 -0
  537. package/dist/infrastructure/cloud/types/redact.js +1 -0
  538. package/dist/infrastructure/cloud/types/snapshot.d.ts +52 -0
  539. package/dist/infrastructure/cloud/types/snapshot.js +1 -0
  540. package/dist/infrastructure/cloud/types/snapshotCore.d.ts +125 -0
  541. package/dist/infrastructure/cloud/types/snapshotCore.js +1 -0
  542. package/dist/infrastructure/cloud/types/snapshotJobs.d.ts +124 -0
  543. package/dist/infrastructure/cloud/types/snapshotJobs.js +1 -0
  544. package/dist/infrastructure/cloud/types/snapshotTelemetry.d.ts +100 -0
  545. package/dist/infrastructure/cloud/types/snapshotTelemetry.js +1 -0
  546. package/dist/infrastructure/cloud/types.d.ts +3 -445
  547. package/dist/infrastructure/cloud/types.js +0 -4
  548. package/dist/infrastructure/persistence/batchInsert.d.ts +13 -0
  549. package/dist/infrastructure/persistence/batchInsert.js +96 -0
  550. package/dist/infrastructure/persistence/jobOptionsBlob.d.ts +18 -0
  551. package/dist/infrastructure/persistence/jobOptionsBlob.js +56 -0
  552. package/dist/infrastructure/persistence/legacyNameMigration.d.ts +5 -0
  553. package/dist/infrastructure/persistence/legacyNameMigration.js +42 -0
  554. package/dist/infrastructure/persistence/migrations.d.ts +3 -0
  555. package/dist/infrastructure/persistence/migrations.js +120 -0
  556. package/dist/infrastructure/persistence/schema.d.ts +3 -5
  557. package/dist/infrastructure/persistence/schema.js +40 -136
  558. package/dist/infrastructure/persistence/sqlite/admission.d.ts +9 -0
  559. package/dist/infrastructure/persistence/sqlite/admission.js +34 -0
  560. package/dist/infrastructure/persistence/sqlite/control.d.ts +32 -0
  561. package/dist/infrastructure/persistence/sqlite/control.js +90 -0
  562. package/dist/infrastructure/persistence/sqlite/flows.d.ts +26 -0
  563. package/dist/infrastructure/persistence/sqlite/flows.js +167 -0
  564. package/dist/infrastructure/persistence/sqlite/jobs.d.ts +23 -0
  565. package/dist/infrastructure/persistence/sqlite/jobs.js +166 -0
  566. package/dist/infrastructure/persistence/sqlite/lifecycle.d.ts +6 -0
  567. package/dist/infrastructure/persistence/sqlite/lifecycle.js +30 -0
  568. package/dist/infrastructure/persistence/sqlite/mutations.d.ts +20 -0
  569. package/dist/infrastructure/persistence/sqlite/mutations.js +149 -0
  570. package/dist/infrastructure/persistence/sqlite/queries.d.ts +23 -0
  571. package/dist/infrastructure/persistence/sqlite/queries.js +89 -0
  572. package/dist/infrastructure/persistence/sqlite/records.d.ts +24 -0
  573. package/dist/infrastructure/persistence/sqlite/records.js +115 -0
  574. package/dist/infrastructure/persistence/sqlite/state.d.ts +36 -0
  575. package/dist/infrastructure/persistence/sqlite/state.js +207 -0
  576. package/dist/infrastructure/persistence/sqlite/telemetry.d.ts +16 -0
  577. package/dist/infrastructure/persistence/sqlite/telemetry.js +126 -0
  578. package/dist/infrastructure/persistence/sqlite.d.ts +5 -276
  579. package/dist/infrastructure/persistence/sqlite.js +3 -997
  580. package/dist/infrastructure/persistence/sqliteBatch.d.ts +4 -121
  581. package/dist/infrastructure/persistence/sqliteBatch.js +3 -422
  582. package/dist/infrastructure/persistence/sqliteSerializer.d.ts +6 -1
  583. package/dist/infrastructure/persistence/sqliteSerializer.js +33 -11
  584. package/dist/infrastructure/persistence/statements.d.ts +5 -1
  585. package/dist/infrastructure/persistence/statements.js +14 -9
  586. package/dist/infrastructure/persistence/types/admission.d.ts +8 -0
  587. package/dist/infrastructure/persistence/types/admission.js +1 -0
  588. package/dist/infrastructure/persistence/types/batch.d.ts +12 -0
  589. package/dist/infrastructure/persistence/types/batch.js +1 -0
  590. package/dist/infrastructure/persistence/types/sqlite.d.ts +17 -0
  591. package/dist/infrastructure/persistence/types/sqlite.js +1 -0
  592. package/dist/infrastructure/persistence/writeBuffer.d.ts +38 -0
  593. package/dist/infrastructure/persistence/writeBuffer.js +221 -0
  594. package/dist/infrastructure/scheduler/cron/execution.d.ts +12 -0
  595. package/dist/infrastructure/scheduler/cron/execution.js +150 -0
  596. package/dist/infrastructure/scheduler/cron/runtime.d.ts +31 -0
  597. package/dist/infrastructure/scheduler/cron/runtime.js +143 -0
  598. package/dist/infrastructure/scheduler/cronScheduler.d.ts +4 -117
  599. package/dist/infrastructure/scheduler/cronScheduler.js +3 -436
  600. package/dist/infrastructure/scheduler/types/cronScheduler.d.ts +16 -0
  601. package/dist/infrastructure/scheduler/types/cronScheduler.js +1 -0
  602. package/dist/infrastructure/server/bootstrap.js +3 -0
  603. package/dist/infrastructure/server/handler-routes/control.d.ts +8 -0
  604. package/dist/infrastructure/server/handler-routes/control.js +82 -0
  605. package/dist/infrastructure/server/handler-routes/jobs.d.ts +6 -0
  606. package/dist/infrastructure/server/handler-routes/jobs.js +110 -0
  607. package/dist/infrastructure/server/handler-routes/monitoring.d.ts +5 -0
  608. package/dist/infrastructure/server/handler-routes/monitoring.js +65 -0
  609. package/dist/infrastructure/server/handlerRoutes.d.ts +3 -26
  610. package/dist/infrastructure/server/handlerRoutes.js +3 -257
  611. package/dist/infrastructure/server/handlers/advanced/configNumbers.d.ts +2 -0
  612. package/dist/infrastructure/server/handlers/advanced/configNumbers.js +26 -0
  613. package/dist/infrastructure/server/handlers/advanced/dependencies.d.ts +15 -0
  614. package/dist/infrastructure/server/handlers/advanced/dependencies.js +38 -0
  615. package/dist/infrastructure/server/handlers/advanced/jobs.d.ts +33 -0
  616. package/dist/infrastructure/server/handlers/advanced/jobs.js +136 -0
  617. package/dist/infrastructure/server/handlers/advanced/queue.d.ts +42 -0
  618. package/dist/infrastructure/server/handlers/advanced/queue.js +111 -0
  619. package/dist/infrastructure/server/handlers/advanced.d.ts +3 -121
  620. package/dist/infrastructure/server/handlers/advanced.js +3 -336
  621. package/dist/infrastructure/server/handlers/core.d.ts +1 -4
  622. package/dist/infrastructure/server/handlers/core.js +37 -20
  623. package/dist/infrastructure/server/handlers/cron.js +9 -1
  624. package/dist/infrastructure/server/handlers/dlq.d.ts +3 -0
  625. package/dist/infrastructure/server/handlers/dlq.js +18 -4
  626. package/dist/infrastructure/server/handlers/flow.js +6 -1
  627. package/dist/infrastructure/server/handlers/introspection.d.ts +19 -0
  628. package/dist/infrastructure/server/handlers/introspection.js +21 -0
  629. package/dist/infrastructure/server/handlers/management.d.ts +8 -0
  630. package/dist/infrastructure/server/handlers/management.js +30 -0
  631. package/dist/infrastructure/server/handlers/monitoring/health.d.ts +13 -0
  632. package/dist/infrastructure/server/handlers/monitoring/health.js +61 -0
  633. package/dist/infrastructure/server/handlers/monitoring/operations.d.ts +8 -0
  634. package/dist/infrastructure/server/handlers/monitoring/operations.js +28 -0
  635. package/dist/infrastructure/server/handlers/monitoring/webhooks.d.ts +7 -0
  636. package/dist/infrastructure/server/handlers/monitoring/webhooks.js +56 -0
  637. package/dist/infrastructure/server/handlers/monitoring/workers.d.ts +6 -0
  638. package/dist/infrastructure/server/handlers/monitoring/workers.js +57 -0
  639. package/dist/infrastructure/server/handlers/monitoring.d.ts +4 -30
  640. package/dist/infrastructure/server/handlers/monitoring.js +4 -222
  641. package/dist/infrastructure/server/handlers/pushBatchValidation.d.ts +1 -1
  642. package/dist/infrastructure/server/handlers/pushBatchValidation.js +7 -0
  643. package/dist/infrastructure/server/handlers/query.js +13 -4
  644. package/dist/infrastructure/server/http-routes/jobAdvanced.d.ts +2 -0
  645. package/dist/infrastructure/server/http-routes/jobAdvanced.js +106 -0
  646. package/dist/infrastructure/server/http-routes/jobManagement.d.ts +2 -0
  647. package/dist/infrastructure/server/http-routes/jobManagement.js +74 -0
  648. package/dist/infrastructure/server/http-routes/queueJobs.d.ts +2 -0
  649. package/dist/infrastructure/server/http-routes/queueJobs.js +108 -0
  650. package/dist/infrastructure/server/httpRouteJobs.d.ts +1 -8
  651. package/dist/infrastructure/server/httpRouteJobs.js +33 -222
  652. package/dist/infrastructure/server/httpRouteQueues.d.ts +1 -6
  653. package/dist/infrastructure/server/httpRouteQueues.js +51 -217
  654. package/dist/infrastructure/server/httpRouteResources.js +1 -0
  655. package/dist/infrastructure/server/protocol/commands.d.ts +8 -0
  656. package/dist/infrastructure/server/protocol/commands.js +31 -0
  657. package/dist/infrastructure/server/protocol/frameParser.d.ts +16 -0
  658. package/dist/infrastructure/server/protocol/frameParser.js +65 -0
  659. package/dist/infrastructure/server/protocol/lineBuffer.d.ts +6 -0
  660. package/dist/infrastructure/server/protocol/lineBuffer.js +21 -0
  661. package/dist/infrastructure/server/protocol/validation.d.ts +9 -0
  662. package/dist/infrastructure/server/protocol/validation.js +75 -0
  663. package/dist/infrastructure/server/protocol.d.ts +5 -77
  664. package/dist/infrastructure/server/protocol.js +4 -265
  665. package/dist/infrastructure/server/rateLimiter.js +1 -0
  666. package/dist/infrastructure/server/socketWriteQueue.d.ts +1 -1
  667. package/dist/infrastructure/server/socketWriteQueue.js +8 -5
  668. package/dist/infrastructure/server/sse/constants.d.ts +5 -0
  669. package/dist/infrastructure/server/sse/constants.js +5 -0
  670. package/dist/infrastructure/server/sse/eventBuffer.d.ts +3 -0
  671. package/dist/infrastructure/server/sse/eventBuffer.js +21 -0
  672. package/dist/infrastructure/server/sseHandler.d.ts +2 -6
  673. package/dist/infrastructure/server/sseHandler.js +20 -96
  674. package/dist/infrastructure/server/tcp/clientRelease.d.ts +2 -0
  675. package/dist/infrastructure/server/tcp/clientRelease.js +18 -0
  676. package/dist/infrastructure/server/tcp/connections.d.ts +24 -0
  677. package/dist/infrastructure/server/tcp/connections.js +162 -0
  678. package/dist/infrastructure/server/tcp/constants.d.ts +3 -0
  679. package/dist/infrastructure/server/tcp/constants.js +3 -0
  680. package/dist/infrastructure/server/tcp/eventSubscriptions.d.ts +10 -0
  681. package/dist/infrastructure/server/tcp/eventSubscriptions.js +17 -0
  682. package/dist/infrastructure/server/tcp/responses.d.ts +3 -0
  683. package/dist/infrastructure/server/tcp/responses.js +8 -0
  684. package/dist/infrastructure/server/tcp.d.ts +10 -68
  685. package/dist/infrastructure/server/tcp.js +47 -256
  686. package/dist/infrastructure/server/types/protocol.d.ts +4 -0
  687. package/dist/infrastructure/server/types/protocol.js +1 -0
  688. package/dist/infrastructure/server/types/sse.d.ts +11 -0
  689. package/dist/infrastructure/server/types/sse.js +1 -0
  690. package/dist/infrastructure/server/types/tcpServer.d.ts +25 -0
  691. package/dist/infrastructure/server/types/tcpServer.js +1 -0
  692. package/dist/infrastructure/server/types/ws.d.ts +6 -0
  693. package/dist/infrastructure/server/types/ws.js +1 -0
  694. package/dist/infrastructure/server/ws/constants.d.ts +6 -0
  695. package/dist/infrastructure/server/ws/constants.js +130 -0
  696. package/dist/infrastructure/server/ws/snapshots.d.ts +4 -0
  697. package/dist/infrastructure/server/ws/snapshots.js +52 -0
  698. package/dist/infrastructure/server/ws/subscriptions.d.ts +10 -0
  699. package/dist/infrastructure/server/ws/subscriptions.js +39 -0
  700. package/dist/infrastructure/server/wsHandler.d.ts +2 -10
  701. package/dist/infrastructure/server/wsHandler.js +12 -237
  702. package/dist/mcp/adapter.d.ts +5 -403
  703. package/dist/mcp/adapter.js +6 -778
  704. package/dist/mcp/backend/embedded/base.d.ts +7 -0
  705. package/dist/mcp/backend/embedded/base.js +15 -0
  706. package/dist/mcp/backend/embedded/index.d.ts +14 -0
  707. package/dist/mcp/backend/embedded/index.js +22 -0
  708. package/dist/mcp/backend/embedded/jobs.d.ts +44 -0
  709. package/dist/mcp/backend/embedded/jobs.js +98 -0
  710. package/dist/mcp/backend/embedded/queues.d.ts +27 -0
  711. package/dist/mcp/backend/embedded/queues.js +84 -0
  712. package/dist/mcp/backend/embedded/services.d.ts +29 -0
  713. package/dist/mcp/backend/embedded/services.js +107 -0
  714. package/dist/mcp/backend/serializers.d.ts +7 -0
  715. package/dist/mcp/backend/serializers.js +32 -0
  716. package/dist/mcp/backend/tcp/base.d.ts +19 -0
  717. package/dist/mcp/backend/tcp/base.js +54 -0
  718. package/dist/mcp/backend/tcp/index.d.ts +14 -0
  719. package/dist/mcp/backend/tcp/index.js +20 -0
  720. package/dist/mcp/backend/tcp/jobs.d.ts +44 -0
  721. package/dist/mcp/backend/tcp/jobs.js +122 -0
  722. package/dist/mcp/backend/tcp/queues.d.ts +27 -0
  723. package/dist/mcp/backend/tcp/queues.js +89 -0
  724. package/dist/mcp/backend/tcp/services.d.ts +30 -0
  725. package/dist/mcp/backend/tcp/services.js +161 -0
  726. package/dist/mcp/types/adapter.d.ts +176 -0
  727. package/dist/mcp/types/adapter.js +1 -0
  728. package/dist/shared/asyncLock.d.ts +13 -0
  729. package/dist/shared/asyncLock.js +65 -0
  730. package/dist/shared/lock.d.ts +10 -72
  731. package/dist/shared/lock.js +7 -231
  732. package/dist/shared/lockError.d.ts +3 -0
  733. package/dist/shared/lockError.js +6 -0
  734. package/dist/shared/lockTimeout.d.ts +2 -0
  735. package/dist/shared/lockTimeout.js +2 -0
  736. package/dist/shared/rwLock.d.ts +22 -0
  737. package/dist/shared/rwLock.js +124 -0
  738. package/dist/shared/serialization.js +1 -0
  739. package/dist/shared/skipList.d.ts +0 -5
  740. package/dist/shared/skipList.js +10 -57
  741. package/dist/shared/skipListNodes.d.ts +6 -0
  742. package/dist/shared/skipListNodes.js +43 -0
  743. package/dist/shared/types/lock.d.ts +7 -0
  744. package/dist/shared/types/lock.js +1 -0
  745. package/dist/shared/types/skipList.d.ts +4 -0
  746. package/dist/shared/types/skipList.js +1 -0
  747. package/package.json +2 -1
@@ -1,905 +1,4 @@
1
- /**
2
- * Worker
3
- * BullMQ-style worker for job processing
4
- */
5
- import { EventEmitter } from 'events';
6
- import { hostname } from 'os';
7
- import { getSharedManager } from '../manager';
8
- import { TcpConnectionPool } from '../tcpPool';
9
- import { jobId } from '../../domain/types/job';
10
- import { FORCE_EMBEDDED, WORKER_CONSTANTS } from './types';
11
- import { AckBatcher } from './ackBatcher';
12
- import { parseJobFromResponse } from './jobParser';
13
- import { processJob } from './processor';
14
- import { WorkerRateLimiter } from './workerRateLimiter';
15
- import { GroupConcurrencyLimiter } from './groupConcurrency';
16
- import { startHeartbeat, sendHeartbeat } from './workerHeartbeat';
17
- import { pullEmbedded, pullTcp } from './workerPull';
18
- import { resolveToken } from '../resolveToken';
19
- /** Resolve WorkerOptions into ExtendedWorkerOptions with defaults */
20
- function resolveWorkerOptions(opts, embedded) {
21
- return {
22
- concurrency: opts.concurrency ?? 1,
23
- autorun: opts.autorun ?? true,
24
- heartbeatInterval: opts.heartbeatInterval ?? 10000,
25
- batchSize: Math.min(opts.batchSize ?? 10, 1000),
26
- pollTimeout: Math.min(opts.pollTimeout ?? 0, WORKER_CONSTANTS.MAX_POLL_TIMEOUT),
27
- embedded,
28
- useLocks: opts.useLocks ?? true,
29
- skipLockRenewal: opts.skipLockRenewal ?? false,
30
- skipStalledCheck: opts.skipStalledCheck ?? false,
31
- drainDelay: opts.drainDelay ?? 50,
32
- lockDuration: opts.lockDuration ?? 30000,
33
- maxStalledCount: opts.maxStalledCount ?? 1,
34
- removeOnComplete: opts.removeOnComplete,
35
- removeOnFail: opts.removeOnFail,
36
- };
37
- }
38
- /** Create TCP connection pool from options */
39
- function createTcpPool(opts, concurrency) {
40
- const connOpts = opts.connection ?? {};
41
- const poolSize = connOpts.poolSize ?? Math.min(concurrency, 8);
42
- const token = resolveToken(connOpts.token);
43
- return new TcpConnectionPool({
44
- host: connOpts.host ?? 'localhost',
45
- port: connOpts.port ?? 6789,
46
- token,
47
- tls: connOpts.tls,
48
- poolSize,
49
- pingInterval: connOpts.pingInterval,
50
- commandTimeout: connOpts.commandTimeout,
51
- maxCommandTimeouts: connOpts.maxCommandTimeouts,
52
- pipelining: connOpts.pipelining,
53
- maxInFlight: connOpts.maxInFlight,
54
- });
55
- }
56
- /**
57
- * Worker class for processing jobs
58
- */
59
- export class Worker extends EventEmitter {
60
- name;
61
- /**
62
- * Server-side queue key. Equals `name` unless `prefixKey` is set, in which
63
- * case it is `prefixKey + name`. All broker pulls/registrations route
64
- * through this key so a Worker only sees jobs from its own namespace.
65
- */
66
- queueKey;
67
- opts;
68
- processor;
69
- embedded;
70
- tcp;
71
- tcpPool;
72
- ackBatcher;
73
- rateLimiter;
74
- groupLimiter;
75
- running = false;
76
- paused = false;
77
- _closing = false;
78
- // Set when a force close is requested — allows close(true) to pre-empt an
79
- // in-progress graceful close(false) by breaking out of its drain loop.
80
- _forceClose = false;
81
- _closingPromise = null;
82
- closed = false;
83
- activeJobs = 0;
84
- pollTimer = null;
85
- consecutiveErrors = 0;
86
- // Heartbeat tracking with lock tokens (BullMQ-style ownership)
87
- // Track ALL pulled jobs (both active and buffered) for heartbeat
88
- activeJobIds = new Set();
89
- pulledJobIds = new Set(); // All pulled jobs (for heartbeat)
90
- jobTokens = new Map(); // jobId -> lockToken
91
- cancelledJobs = new Set(); // Jobs marked for cancellation
92
- heartbeatTimer = null;
93
- // Worker registration tracking
94
- workerHeartbeatTimer = null;
95
- processedCount = 0;
96
- failedCount = 0;
97
- startedAt;
98
- registered = false;
99
- // Unique worker ID for lock ownership
100
- workerId;
101
- // Job buffer for batch pulls (with tokens)
102
- pendingJobs = [];
103
- pendingJobsHead = 0;
104
- processingScheduled = false; // Prevent multiple setImmediate calls
105
- // Slots reserved by in-flight doPullBatch() calls (Issue #98). Subtracted from
106
- // free slots so overlapping pulls see each other and do not over-lease.
107
- pendingPull = 0;
108
- // Drained event tracking
109
- lastDrainedEmit = 0;
110
- // Stalled event subscription (BullMQ v5 compatible)
111
- stalledUnsubscribe = null;
112
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
113
- on(event, listener) {
114
- return super.on(event, listener);
115
- }
116
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
117
- once(event, listener) {
118
- return super.once(event, listener);
119
- }
120
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
121
- off(event, listener) {
122
- return super.off(event, listener);
123
- }
124
- constructor(name, processor, opts = {}) {
125
- super();
126
- this.name = name;
127
- this.queueKey = (opts.prefixKey ?? '') + name;
128
- this.processor = processor;
129
- this.embedded = opts.embedded ?? FORCE_EMBEDDED;
130
- this.startedAt = Date.now();
131
- this.workerId = `worker-${this.queueKey}-${Date.now()}-${Math.random().toString(36).slice(2, 10)}`;
132
- this.opts = resolveWorkerOptions(opts, this.embedded);
133
- this.rateLimiter = new WorkerRateLimiter(opts.limiter?.groupKey ? null : (opts.limiter ?? null));
134
- this.groupLimiter = GroupConcurrencyLimiter.fromOptions(opts.limiter);
135
- this.ackBatcher = new AckBatcher({
136
- batchSize: opts.batchSize ?? 10,
137
- interval: WORKER_CONSTANTS.DEFAULT_ACK_INTERVAL,
138
- embedded: this.embedded,
139
- });
140
- if (this.embedded) {
141
- getSharedManager(opts.dataPath);
142
- this.tcp = null;
143
- this.tcpPool = null;
144
- }
145
- else {
146
- this.tcpPool = createTcpPool(opts, this.opts.concurrency);
147
- this.tcp = this.tcpPool;
148
- this.ackBatcher.setTcp(this.tcp);
149
- // The server drops worker registration when the registering connection
150
- // closes, and each pooled reconnect gets a fresh server clientId. Re-send
151
- // RegisterWorker on reconnect so the worker stays visible in
152
- // WorkerManager (ListWorkers / getForQueue / skipIfNoWorker) while it
153
- // keeps consuming jobs. Only acts once we were actually registered.
154
- this.tcpPool.onReconnect(() => {
155
- if (this.closed || this._closing || !this.registered)
156
- return;
157
- this.registered = false;
158
- this.registerWithServer();
159
- });
160
- }
161
- if (this.opts.autorun)
162
- this.run();
163
- }
164
- /** Start processing */
165
- run() {
166
- if (this.running || this.closed)
167
- return;
168
- this.running = true;
169
- this.paused = false;
170
- this._closing = false;
171
- this._forceClose = false;
172
- this._closingPromise = null;
173
- // Defer the 'ready' emit so listeners attached synchronously after
174
- // construction (e.g. `new Worker(...).on('ready', ...)`) still receive it.
175
- // run() is called from the constructor when autorun is true (the default),
176
- // at which point chained or post-construction listeners haven't been
177
- // registered yet. See issue #76.
178
- queueMicrotask(() => {
179
- if (!this.closed)
180
- this.emit('ready');
181
- });
182
- // Subscribe to stalled events in embedded mode (BullMQ v5)
183
- if (this.embedded && !this.stalledUnsubscribe && !this.opts.skipStalledCheck) {
184
- this.subscribeToStalledEvents();
185
- }
186
- // Register worker with server (TCP only)
187
- if (!this.embedded && this.tcp && !this.registered) {
188
- this.registerWithServer();
189
- }
190
- if (this.opts.heartbeatInterval > 0 && !this.opts.skipLockRenewal) {
191
- if (this.embedded) {
192
- this.heartbeatTimer = setInterval(() => {
193
- const manager = getSharedManager();
194
- for (const id of this.pulledJobIds) {
195
- manager.jobHeartbeat(jobId(id));
196
- }
197
- }, this.opts.heartbeatInterval);
198
- }
199
- else {
200
- const deps = this.getHeartbeatDeps();
201
- this.heartbeatTimer = startHeartbeat(deps, this.opts.heartbeatInterval);
202
- // Worker-level heartbeat (separate from job heartbeat)
203
- this.startWorkerHeartbeat();
204
- }
205
- }
206
- this.poll();
207
- }
208
- /** Subscribe to stalled events from QueueManager (BullMQ v5 compatible) */
209
- subscribeToStalledEvents() {
210
- if (!this.embedded)
211
- return;
212
- const manager = getSharedManager();
213
- this.stalledUnsubscribe = manager.subscribe((event) => {
214
- // Events carry the prefixed server-side queue key, so we must compare
215
- // against `queueKey` (not the logical `name`) to scope correctly.
216
- if (event.queue !== this.queueKey)
217
- return;
218
- if (event.eventType === "stalled" /* EventType.Stalled */) {
219
- this.emit('stalled', event.jobId, 'active');
220
- }
221
- });
222
- }
223
- /** Pause processing */
224
- pause() {
225
- if (!this.running)
226
- return;
227
- this.running = false;
228
- this.paused = true;
229
- if (this.pollTimer) {
230
- clearTimeout(this.pollTimer);
231
- this.pollTimer = null;
232
- }
233
- }
234
- /** Resume processing */
235
- resume() {
236
- if (this.closed)
237
- return;
238
- this.paused = false;
239
- this.run();
240
- }
241
- isRunning() {
242
- return this.running;
243
- }
244
- isPaused() {
245
- return this.paused && !this.closed;
246
- }
247
- isClosed() {
248
- return this.closed;
249
- }
250
- /** Get current concurrency */
251
- get concurrency() {
252
- return this.opts.concurrency;
253
- }
254
- /** Set concurrency at runtime (BullMQ v5 compatible) */
255
- set concurrency(val) {
256
- const clamped = Math.max(1, val);
257
- const prev = this.opts.concurrency;
258
- this.opts.concurrency = clamped;
259
- if (clamped > prev && this.running && !this._closing) {
260
- this.poll();
261
- }
262
- }
263
- /** Promise that resolves when close() finishes (BullMQ v5 compatible) */
264
- get closing() {
265
- return this._closingPromise;
266
- }
267
- async waitUntilReady() {
268
- if (this.embedded)
269
- return;
270
- if (this.tcpPool) {
271
- await this.tcpPool.send({ cmd: 'Ping' });
272
- }
273
- }
274
- cancelJob(jobId, reason) {
275
- if (this.activeJobIds.has(jobId)) {
276
- this.cancelledJobs.add(jobId);
277
- this.emit('cancelled', { jobId, reason: reason ?? 'Job cancelled by worker' });
278
- return true;
279
- }
280
- return false;
281
- }
282
- cancelAllJobs(reason) {
283
- for (const jobId of this.activeJobIds) {
284
- this.cancelledJobs.add(jobId);
285
- this.emit('cancelled', { jobId, reason: reason ?? 'All jobs cancelled' });
286
- }
287
- }
288
- isJobCancelled(jobId) {
289
- return this.cancelledJobs.has(jobId);
290
- }
291
- // ============ Rate Limiter (delegated) ============
292
- getRateLimiterInfo() {
293
- return this.rateLimiter.getRateLimiterInfo();
294
- }
295
- rateLimit(expireTimeMs) {
296
- this.rateLimiter.rateLimit(expireTimeMs);
297
- }
298
- isRateLimited() {
299
- return this.rateLimiter.isRateLimited();
300
- }
301
- // ============ BullMQ v5 Compatibility ============
302
- async startStalledCheckTimer() {
303
- // No-op for API compatibility - stall detection is automatic
304
- }
305
- async delay(milliseconds = 0, abortController) {
306
- if (milliseconds <= 0)
307
- return;
308
- return new Promise((resolve, reject) => {
309
- const timeout = setTimeout(resolve, milliseconds);
310
- if (abortController) {
311
- abortController.signal.addEventListener('abort', () => {
312
- clearTimeout(timeout);
313
- reject(new Error('Delay aborted'));
314
- });
315
- }
316
- });
317
- }
318
- // ============ Manual Job Control ============
319
- async getNextJob(token, _opts) {
320
- if (this.closed)
321
- return undefined;
322
- if (this.embedded) {
323
- const manager = getSharedManager();
324
- if (this.opts.useLocks) {
325
- // Forward the configured lock duration; without it pullWithLock falls
326
- // back to the server default and a custom `lockDuration` is silently
327
- // ignored on this manual-acquire path (same class as #111). The main
328
- // run-loop path (workerPull.ts) already forwards it.
329
- const { job, token: lockToken } = await manager.pullWithLock(this.queueKey, this.workerId, 0, this.opts.lockDuration);
330
- if (job && lockToken) {
331
- const jobIdStr = String(job.id);
332
- this.pulledJobIds.add(jobIdStr);
333
- this.jobTokens.set(jobIdStr, lockToken);
334
- }
335
- return job ?? undefined;
336
- }
337
- const job = await manager.pull(this.queueKey, 0);
338
- if (job) {
339
- this.pulledJobIds.add(String(job.id));
340
- }
341
- return job ?? undefined;
342
- }
343
- // TCP mode
344
- if (!this.tcp)
345
- return undefined;
346
- const cmd = {
347
- cmd: 'PULL',
348
- queue: this.queueKey,
349
- timeout: 0,
350
- };
351
- if (this.opts.useLocks) {
352
- cmd.owner = this.workerId;
353
- // Forward the configured lock TTL (mirrors workerPull.ts); otherwise the
354
- // server applies its 30s default and a custom lockDuration is dropped.
355
- if (this.opts.lockDuration !== undefined)
356
- cmd.lockTtl = this.opts.lockDuration;
357
- if (token)
358
- cmd.token = token;
359
- }
360
- const response = await this.tcp.send(cmd);
361
- if (!response.ok || !response.job)
362
- return undefined;
363
- const job = parseJobFromResponse(response.job, this.queueKey);
364
- const jobIdStr = String(job.id);
365
- this.pulledJobIds.add(jobIdStr);
366
- if (this.opts.useLocks && response.token) {
367
- this.jobTokens.set(jobIdStr, response.token);
368
- }
369
- return job;
370
- }
371
- async processJobManually(job, token, fetchNextCallback) {
372
- if (this.closed)
373
- return undefined;
374
- const jobIdStr = String(job.id);
375
- this.activeJobs++;
376
- this.activeJobIds.add(jobIdStr);
377
- this.pulledJobIds.add(jobIdStr);
378
- if (this.opts.useLocks && token) {
379
- this.jobTokens.set(jobIdStr, token);
380
- }
381
- try {
382
- await processJob(job, {
383
- name: this.queueKey,
384
- processor: this.processor,
385
- embedded: this.embedded,
386
- tcp: this.tcp,
387
- ackBatcher: this.ackBatcher,
388
- emitter: this,
389
- token: this.opts.useLocks ? token : undefined,
390
- });
391
- if (fetchNextCallback) {
392
- return await fetchNextCallback();
393
- }
394
- }
395
- finally {
396
- this.activeJobs--;
397
- this.activeJobIds.delete(jobIdStr);
398
- this.pulledJobIds.delete(jobIdStr);
399
- this.cancelledJobs.delete(jobIdStr);
400
- if (this.opts.useLocks) {
401
- this.jobTokens.delete(jobIdStr);
402
- }
403
- this.rateLimiter.recordJobForLimiter();
404
- }
405
- }
406
- async extendJobLocks(jobIds, tokens, duration) {
407
- if (this.closed || jobIds.length === 0)
408
- return 0;
409
- if (jobIds.length !== tokens.length) {
410
- throw new Error('jobIds and tokens arrays must have the same length');
411
- }
412
- if (this.embedded) {
413
- const manager = getSharedManager();
414
- let extended = 0;
415
- for (let i = 0; i < jobIds.length; i++) {
416
- const success = await manager.extendLock(jobIds[i], tokens[i], duration);
417
- if (success)
418
- extended++;
419
- }
420
- return extended;
421
- }
422
- if (!this.tcp)
423
- return 0;
424
- const response = await this.tcp.send({
425
- cmd: 'ExtendLocks',
426
- ids: jobIds,
427
- tokens,
428
- // Protocol expects a per-id `durations` array, and the handler returns
429
- // `count` (not `extended`). Sending `duration`/reading `extended` made
430
- // batch lock renewal silently keep the old TTL.
431
- durations: jobIds.map(() => duration),
432
- });
433
- const extended = response.count;
434
- return extended ?? 0;
435
- }
436
- // ============ Lifecycle ============
437
- async close(force = false) {
438
- if (this.closed)
439
- return;
440
- // A force close must be able to pre-empt an in-progress graceful close:
441
- // the graceful drain only waits on genuinely in-flight jobs, but a caller
442
- // asking to force-close wants to stop waiting now. Flip the force flag so
443
- // the running _doClose's drain loop exits, and return the same promise.
444
- if (this._closingPromise) {
445
- if (force)
446
- this._forceClose = true;
447
- return this._closingPromise;
448
- }
449
- this._forceClose = force;
450
- this._closingPromise = this._doClose(force);
451
- return this._closingPromise;
452
- }
453
- async _doClose(force) {
454
- this._closing = true;
455
- this.running = false;
456
- this.paused = false;
457
- if (this.pollTimer) {
458
- clearTimeout(this.pollTimer);
459
- this.pollTimer = null;
460
- }
461
- if (this.heartbeatTimer) {
462
- clearInterval(this.heartbeatTimer);
463
- this.heartbeatTimer = null;
464
- }
465
- if (this.workerHeartbeatTimer) {
466
- clearInterval(this.workerHeartbeatTimer);
467
- this.workerHeartbeatTimer = null;
468
- }
469
- // Release buffered pulled-but-unstarted jobs back to the queue. During
470
- // _closing every code path that would advance the buffer (poll/tryProcess/
471
- // the startJob().finally re-poll) early-returns, so a buffered job is never
472
- // started — yet it holds a server-side lock and sits in `active` state.
473
- // Without this, a graceful drain that waited on the buffer would hang
474
- // forever (e.g. group-limited jobs buffered behind a max:1 limiter). We
475
- // requeue them (Active -> Waiting) so they are re-pullable and not lost.
476
- await this.releaseBufferedJobs();
477
- if (!force) {
478
- // Wait only on genuinely in-flight jobs. The buffer was released above,
479
- // so it must NOT be part of the drain condition. A concurrent force
480
- // close (this._forceClose) breaks out immediately.
481
- while (this.activeJobs > 0 && !this._forceClose) {
482
- await Bun.sleep(50);
483
- }
484
- }
485
- await this.ackBatcher.flush();
486
- await this.ackBatcher.waitForInFlight();
487
- this.ackBatcher.stop();
488
- // Unregister from server before closing connection
489
- if (!this.embedded && this.tcp && this.registered) {
490
- try {
491
- await this.tcp.send({ cmd: 'UnregisterWorker', workerId: this.workerId });
492
- }
493
- catch {
494
- // Best-effort unregister — server will cleanup via stale timeout
495
- }
496
- this.registered = false;
497
- }
498
- await Bun.sleep(100);
499
- if (this.stalledUnsubscribe) {
500
- this.stalledUnsubscribe();
501
- this.stalledUnsubscribe = null;
502
- }
503
- this.activeJobIds.clear();
504
- this.pulledJobIds.clear();
505
- this.jobTokens.clear();
506
- this.cancelledJobs.clear();
507
- this.pendingJobs = [];
508
- this.pendingJobsHead = 0;
509
- if (this.groupLimiter)
510
- this.groupLimiter.clear();
511
- if (this.tcpPool)
512
- this.tcpPool.close();
513
- this.closed = true;
514
- this._closing = false;
515
- this.emit('closed');
516
- }
517
- /**
518
- * Release all buffered (pulled-but-unstarted) jobs back to the queue on close.
519
- * These jobs are `active` server-side holding a lock; moving them back to
520
- * `waiting` makes them re-pullable so nothing is lost, and removes them from
521
- * the close drain (which would otherwise hang on a buffer that can never be
522
- * advanced while `_closing` is set). Best-effort: a job that can't be
523
- * released (e.g. already completed/stall-retried) is simply dropped from the
524
- * local buffer — its server-side lock will expire and requeue it.
525
- */
526
- async releaseBufferedJobs() {
527
- const buffered = this.pendingJobs.slice(this.pendingJobsHead);
528
- this.pendingJobs = [];
529
- this.pendingJobsHead = 0;
530
- if (buffered.length === 0)
531
- return;
532
- for (const { job, token } of buffered) {
533
- const id = String(job.id);
534
- try {
535
- if (this.embedded) {
536
- const manager = getSharedManager();
537
- await manager.moveActiveToWait(jobId(id));
538
- // moveActiveToWait re-queues the job (active -> waiting); release the
539
- // lock token we still hold so it is fully owner-free and re-pullable.
540
- if (this.opts.useLocks)
541
- manager.releaseLock(jobId(id), token ?? undefined);
542
- }
543
- else if (this.tcp) {
544
- await this.tcp.send({ cmd: 'MoveToWait', id });
545
- }
546
- }
547
- catch {
548
- // Best-effort: lock expiration will requeue anything we couldn't release.
549
- }
550
- finally {
551
- this.pulledJobIds.delete(id);
552
- this.jobTokens.delete(id);
553
- }
554
- }
555
- }
556
- // ============ Processing Pipeline ============
557
- poll() {
558
- if (!this.running || this._closing)
559
- return;
560
- if (this.activeJobs >= this.opts.concurrency) {
561
- this.pollTimer = setTimeout(() => {
562
- this.poll();
563
- }, 10);
564
- return;
565
- }
566
- // Check rate limiter
567
- if (!this.rateLimiter.canProcessWithinLimit()) {
568
- const waitTime = this.rateLimiter.getTimeUntilNextSlot();
569
- this.pollTimer = setTimeout(() => {
570
- this.poll();
571
- }, Math.max(waitTime, 10));
572
- return;
573
- }
574
- void this.tryProcess();
575
- }
576
- async tryProcess() {
577
- if (!this.running || this._closing)
578
- return;
579
- try {
580
- let item = this.getNextEligibleJob();
581
- if (!item) {
582
- const items = await this.doPullBatch();
583
- // Re-check state after async operation (can be modified during await)
584
- // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
585
- if (!this.running || this._closing)
586
- return;
587
- if (items.length > 0) {
588
- this.registerPulledJobs(items);
589
- // Add all items to buffer, then find eligible one
590
- if (this.pendingJobsHead >= this.pendingJobs.length) {
591
- this.pendingJobs = items;
592
- this.pendingJobsHead = 0;
593
- }
594
- else {
595
- this.pendingJobs = this.pendingJobs.slice(this.pendingJobsHead).concat(items);
596
- this.pendingJobsHead = 0;
597
- }
598
- item = this.getNextEligibleJob();
599
- }
600
- }
601
- if (item) {
602
- // Issue #96: re-check the concurrency gate before starting. poll()
603
- // checked it, but `await doPullBatch()` above — or a setImmediate path
604
- // that bypasses poll() — may have filled the slots since. This check is
605
- // atomic with startJob()'s activeJobs++ (no await between here and the
606
- // increment), so it cannot overshoot. If full, requeue the job (we still
607
- // own it via pulledJobIds/jobTokens) and let a freed slot pick it up.
608
- if (this.activeJobs >= this.opts.concurrency) {
609
- this.requeueItem(item);
610
- this.pollTimer = setTimeout(() => {
611
- this.poll();
612
- }, 10);
613
- return;
614
- }
615
- this.consecutiveErrors = 0;
616
- this.startJob(item.job, item.token);
617
- }
618
- else {
619
- // Check if we have buffered jobs but all are group-limited
620
- const hasBuffered = this.pendingJobsHead < this.pendingJobs.length;
621
- if (hasBuffered && this.groupLimiter) {
622
- // Retry shortly - a running job may finish and free a group slot
623
- this.pollTimer = setTimeout(() => {
624
- this.poll();
625
- }, 10);
626
- return;
627
- }
628
- const now = Date.now();
629
- if (now - this.lastDrainedEmit > 1000) {
630
- this.lastDrainedEmit = now;
631
- this.emit('drained');
632
- }
633
- const waitTime = this.opts.pollTimeout > 0 ? 10 : this.opts.drainDelay;
634
- this.pollTimer = setTimeout(() => {
635
- this.poll();
636
- }, waitTime);
637
- }
638
- }
639
- catch (err) {
640
- // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
641
- if (!this.running)
642
- return;
643
- this.handlePullError(err);
644
- }
645
- }
646
- registerPulledJobs(items) {
647
- for (const pulledItem of items) {
648
- const jobIdStr = String(pulledItem.job.id);
649
- this.pulledJobIds.add(jobIdStr);
650
- if (this.opts.useLocks && pulledItem.token) {
651
- this.jobTokens.set(jobIdStr, pulledItem.token);
652
- }
653
- }
654
- // Renew the just-pulled locks immediately (fire-and-forget). With a pooled
655
- // client (poolSize > 1), the PULL and subsequent heartbeats travel on
656
- // different connections; the server only releases an in-flight job on
657
- // connection drop if its lock was never renewed (renewalCount === 0). The
658
- // periodic heartbeat timer does not fire until one interval later, leaving a
659
- // window where a dropped pulling-socket would re-dispatch a job the worker
660
- // is actively running. An immediate renew closes that window. Only needed
661
- // for multi-connection lock-based workers (poolSize 1 keeps pull+heartbeat
662
- // on the same socket, so there is nothing to protect against).
663
- if (this.opts.useLocks && items.length > 0 && this.tcpPool && this.tcpPool.getPoolSize() > 1) {
664
- void sendHeartbeat(this.getHeartbeatDeps());
665
- }
666
- }
667
- getBufferedJob() {
668
- if (this.pendingJobsHead >= this.pendingJobs.length)
669
- return null;
670
- const item = this.pendingJobs[this.pendingJobsHead++];
671
- if (this.pendingJobsHead > 500 && this.pendingJobsHead >= this.pendingJobs.length / 2) {
672
- this.pendingJobs = this.pendingJobs.slice(this.pendingJobsHead);
673
- this.pendingJobsHead = 0;
674
- }
675
- return item;
676
- }
677
- /** Put an item back at the front of the pending buffer (Issue #96). */
678
- requeueItem(item) {
679
- if (this.pendingJobsHead > 0) {
680
- this.pendingJobs[--this.pendingJobsHead] = item;
681
- }
682
- else {
683
- this.pendingJobs.unshift(item);
684
- }
685
- }
686
- /**
687
- * Get the next buffered job eligible for processing.
688
- * When group concurrency is enabled, skips jobs whose group is at capacity
689
- * and leaves them in the buffer for later processing.
690
- */
691
- getNextEligibleJob() {
692
- if (this.pendingJobsHead >= this.pendingJobs.length)
693
- return null;
694
- // No group limiter - just return the next buffered job
695
- if (!this.groupLimiter) {
696
- return this.getBufferedJob();
697
- }
698
- // Scan buffer for a job whose group has capacity
699
- const start = this.pendingJobsHead;
700
- const end = this.pendingJobs.length;
701
- for (let i = start; i < end; i++) {
702
- const item = this.pendingJobs[i];
703
- if (this.groupLimiter.canProcess(item.job)) {
704
- // Remove this item from the buffer by swapping with the head
705
- this.pendingJobs[i] = this.pendingJobs[this.pendingJobsHead];
706
- this.pendingJobsHead++;
707
- if (this.pendingJobsHead > 500 && this.pendingJobsHead >= this.pendingJobs.length / 2) {
708
- this.pendingJobs = this.pendingJobs.slice(this.pendingJobsHead);
709
- this.pendingJobsHead = 0;
710
- }
711
- return item;
712
- }
713
- }
714
- return null;
715
- }
716
- async doPullBatch() {
717
- // Issue #98: cap the LEASED count (running + buffered + in-flight pulls) at
718
- // `concurrency`, not just the running count. The old `concurrency - activeJobs`
719
- // was read once and the pull leases jobs on the broker across an await, so:
720
- // 1. several concurrent finally->poll->tryProcess runs each read the same
721
- // stale count and each pull a full batch, and
722
- // 2. a job just pulled by one run sits in `pendingJobs` (leased, counted by
723
- // the heartbeat) but not yet in `activeJobs`, so an overlapping pull does
724
- // not see it.
725
- // Both leak: with concurrency=3 the worker ends up holding 5-6 jobs leased.
726
- // `pulledJobIds.size` is the true leased count (active + buffered; a job is
727
- // removed only on completion), and `pendingPull` reserves slots for pulls
728
- // still in flight whose jobs are not yet registered.
729
- //
730
- // Exception — group pull-ahead: when a group limiter is set AND the buffer is
731
- // non-empty here (this branch is reached only after getNextEligibleJob() found
732
- // nothing runnable, so those buffered jobs are group-blocked), the worker must
733
- // pull ahead to discover jobs from other, runnable groups — otherwise it would
734
- // wedge on a buffer full of one blocked group. In that case the blocked
735
- // buffered jobs are not counted (only the running ones are). This preserves the
736
- // existing group behavior; the reported over-pull (no group limiter) always
737
- // uses the strict leased cap.
738
- const groupBlockedBuffer = this.groupLimiter !== null && this.pendingJobsHead < this.pendingJobs.length;
739
- const leased = groupBlockedBuffer ? this.activeJobs : this.pulledJobIds.size;
740
- const slots = this.opts.concurrency - leased - this.pendingPull;
741
- const batchSize = Math.min(this.opts.batchSize, slots, 1000);
742
- if (batchSize <= 0)
743
- return [];
744
- const config = this.getPullConfig();
745
- this.pendingPull += batchSize;
746
- try {
747
- return this.embedded
748
- ? await pullEmbedded(config, batchSize)
749
- : await pullTcp(config, this.tcp, batchSize, this._closing);
750
- }
751
- finally {
752
- // Release the reservation. The pulled jobs are now registered/buffered (or
753
- // the pull failed); either way the reservation has served its purpose for
754
- // the duration of the in-flight pull.
755
- this.pendingPull -= batchSize;
756
- }
757
- }
758
- startJob(job, token) {
759
- const jobIdStr = String(job.id);
760
- // Dedup: skip if this job is already being processed (Issue #33)
761
- // This happens when stall detection retries a job while the worker
762
- // is still processing it, and the worker's other concurrency slot
763
- // pulls the retried job from the queue.
764
- if (this.activeJobIds.has(jobIdStr)) {
765
- return;
766
- }
767
- this.activeJobs++;
768
- this.activeJobIds.add(jobIdStr);
769
- // Apply worker-level removeOnComplete/removeOnFail defaults to the job
770
- this.applyRemoveDefaults(job);
771
- // Track group concurrency
772
- if (this.groupLimiter) {
773
- this.groupLimiter.increment(job);
774
- }
775
- if (this.opts.useLocks && token && !this.jobTokens.has(jobIdStr)) {
776
- this.jobTokens.set(jobIdStr, token);
777
- }
778
- this.pulledJobIds.add(jobIdStr);
779
- const tokenForProcess = this.opts.useLocks ? token : undefined;
780
- void processJob(job, {
781
- name: this.queueKey,
782
- processor: this.processor,
783
- embedded: this.embedded,
784
- tcp: this.tcp,
785
- ackBatcher: this.ackBatcher,
786
- emitter: this,
787
- token: tokenForProcess,
788
- onOutcome: (ok) => {
789
- if (ok)
790
- this.processedCount++;
791
- else
792
- this.failedCount++;
793
- },
794
- }).finally(() => {
795
- this.activeJobs--;
796
- this.activeJobIds.delete(jobIdStr);
797
- this.pulledJobIds.delete(jobIdStr);
798
- this.cancelledJobs.delete(jobIdStr);
799
- if (this.opts.useLocks) {
800
- this.jobTokens.delete(jobIdStr);
801
- }
802
- // Release group concurrency slot
803
- if (this.groupLimiter) {
804
- this.groupLimiter.decrement(job);
805
- }
806
- this.rateLimiter.recordJobForLimiter();
807
- if (this.running && !this._closing)
808
- this.poll();
809
- });
810
- if (this.activeJobs < this.opts.concurrency && !this._closing && !this.processingScheduled) {
811
- this.processingScheduled = true;
812
- setImmediate(() => {
813
- this.processingScheduled = false;
814
- void this.tryProcess();
815
- });
816
- }
817
- }
818
- handlePullError(err) {
819
- this.consecutiveErrors++;
820
- const error = err instanceof Error ? err : new Error(String(err));
821
- this.emit('error', Object.assign(error, {
822
- queue: this.name,
823
- consecutiveErrors: this.consecutiveErrors,
824
- context: 'pull',
825
- }));
826
- const backoffMs = Math.min(WORKER_CONSTANTS.BASE_BACKOFF_MS * Math.pow(2, this.consecutiveErrors - 1), WORKER_CONSTANTS.MAX_BACKOFF_MS);
827
- this.pollTimer = setTimeout(() => {
828
- this.poll();
829
- }, backoffMs);
830
- }
831
- // ============ Private Helpers ============
832
- /** Register this worker with the server (TCP only, fire-and-forget) */
833
- registerWithServer() {
834
- if (!this.tcp || this.registered)
835
- return;
836
- void this.tcp
837
- .send({
838
- cmd: 'RegisterWorker',
839
- name: this.queueKey,
840
- queues: [this.queueKey],
841
- concurrency: this.opts.concurrency,
842
- workerId: this.workerId,
843
- hostname: hostname(),
844
- pid: process.pid,
845
- startedAt: this.startedAt,
846
- })
847
- .then(() => {
848
- this.registered = true;
849
- })
850
- .catch((err) => {
851
- const error = err instanceof Error ? err : new Error(String(err));
852
- this.emit('error', Object.assign(error, { context: 'worker-register' }));
853
- });
854
- }
855
- /** Start periodic worker-level heartbeat (separate from job heartbeat) */
856
- startWorkerHeartbeat() {
857
- if (this.workerHeartbeatTimer || !this.tcp)
858
- return;
859
- this.workerHeartbeatTimer = setInterval(() => {
860
- if (!this.tcp || !this.registered)
861
- return;
862
- void this.tcp
863
- .send({
864
- cmd: 'Heartbeat',
865
- id: this.workerId,
866
- activeJobs: this.activeJobs,
867
- processed: this.processedCount,
868
- failed: this.failedCount,
869
- })
870
- .catch((err) => {
871
- const error = err instanceof Error ? err : new Error(String(err));
872
- this.emit('error', Object.assign(error, { context: 'worker-heartbeat' }));
873
- });
874
- }, this.opts.heartbeatInterval);
875
- }
876
- getHeartbeatDeps() {
877
- return {
878
- pulledJobIds: this.pulledJobIds,
879
- jobTokens: this.jobTokens,
880
- tcp: this.tcp,
881
- useLocks: this.opts.useLocks,
882
- emitter: this,
883
- };
884
- }
885
- getPullConfig() {
886
- return {
887
- name: this.queueKey,
888
- workerId: this.workerId,
889
- useLocks: this.opts.useLocks,
890
- pollTimeout: this.opts.pollTimeout,
891
- lockDuration: this.opts.lockDuration,
892
- };
893
- }
894
- /** Apply worker-level removeOnComplete/removeOnFail defaults to a job */
895
- applyRemoveDefaults(job) {
896
- if (this.opts.removeOnComplete !== undefined && !job.removeOnComplete) {
897
- const val = this.opts.removeOnComplete;
898
- job.removeOnComplete = val === true;
899
- }
900
- if (this.opts.removeOnFail !== undefined && !job.removeOnFail) {
901
- const val = this.opts.removeOnFail;
902
- job.removeOnFail = val === true;
903
- }
904
- }
1
+ /** Public Worker façade. Runtime implementation lives in worker/runtime/. */
2
+ import { WorkerExecution } from './runtime/execution';
3
+ export class Worker extends WorkerExecution {
905
4
  }