bunqueue 2.8.59 → 2.9.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 (380) hide show
  1. package/README.md +109 -77
  2. package/dist/application/background/dlq.js +2 -0
  3. package/dist/application/contextFactory.js +5 -0
  4. package/dist/application/dlqManager.d.ts +11 -1
  5. package/dist/application/dlqManager.js +48 -10
  6. package/dist/application/dlqRetry.js +59 -38
  7. package/dist/application/eventsManager.d.ts +1 -1
  8. package/dist/application/eventsManager.js +30 -26
  9. package/dist/application/lockManager.js +1 -1
  10. package/dist/application/operations/jobManagement.d.ts +4 -0
  11. package/dist/application/operations/jobMoveOperations.js +9 -4
  12. package/dist/application/postgres-queue-manager/batchSnapshot.d.ts +16 -0
  13. package/dist/application/postgres-queue-manager/batchSnapshot.js +17 -0
  14. package/dist/application/postgres-queue-manager/cloud.d.ts +30 -0
  15. package/dist/application/postgres-queue-manager/cloud.js +55 -0
  16. package/dist/application/postgres-queue-manager/config.d.ts +5 -0
  17. package/dist/application/postgres-queue-manager/config.js +1 -0
  18. package/dist/application/postgres-queue-manager/control.d.ts +26 -0
  19. package/dist/application/postgres-queue-manager/control.js +186 -0
  20. package/dist/application/postgres-queue-manager/deferredWrites.d.ts +13 -0
  21. package/dist/application/postgres-queue-manager/deferredWrites.js +60 -0
  22. package/dist/application/postgres-queue-manager/delivery.d.ts +19 -0
  23. package/dist/application/postgres-queue-manager/delivery.js +80 -0
  24. package/dist/application/postgres-queue-manager/lease.d.ts +13 -0
  25. package/dist/application/postgres-queue-manager/lease.js +88 -0
  26. package/dist/application/postgres-queue-manager/lifetimeMetrics.d.ts +32 -0
  27. package/dist/application/postgres-queue-manager/lifetimeMetrics.js +53 -0
  28. package/dist/application/postgres-queue-manager/maintenance.d.ts +14 -0
  29. package/dist/application/postgres-queue-manager/maintenance.js +100 -0
  30. package/dist/application/postgres-queue-manager/operationGate.d.ts +26 -0
  31. package/dist/application/postgres-queue-manager/operationGate.js +96 -0
  32. package/dist/application/postgres-queue-manager/operations.d.ts +25 -0
  33. package/dist/application/postgres-queue-manager/operations.js +194 -0
  34. package/dist/application/postgres-queue-manager/projectionRefreshes.d.ts +43 -0
  35. package/dist/application/postgres-queue-manager/projectionRefreshes.js +170 -0
  36. package/dist/application/postgres-queue-manager/queries.d.ts +142 -0
  37. package/dist/application/postgres-queue-manager/queries.js +231 -0
  38. package/dist/application/postgres-queue-manager/relationships.d.ts +10 -0
  39. package/dist/application/postgres-queue-manager/relationships.js +45 -0
  40. package/dist/application/postgres-queue-manager/services.d.ts +31 -0
  41. package/dist/application/postgres-queue-manager/services.js +149 -0
  42. package/dist/application/postgres-queue-manager/snapshot.d.ts +51 -0
  43. package/dist/application/postgres-queue-manager/snapshot.js +236 -0
  44. package/dist/application/postgres-queue-manager/snapshotViews.d.ts +15 -0
  45. package/dist/application/postgres-queue-manager/snapshotViews.js +100 -0
  46. package/dist/application/postgres-queue-manager/startupEventBuffer.d.ts +12 -0
  47. package/dist/application/postgres-queue-manager/startupEventBuffer.js +36 -0
  48. package/dist/application/postgres-queue-manager/state.d.ts +47 -0
  49. package/dist/application/postgres-queue-manager/state.js +273 -0
  50. package/dist/application/postgres-queue-manager/terminalDelivery.d.ts +20 -0
  51. package/dist/application/postgres-queue-manager/terminalDelivery.js +100 -0
  52. package/dist/application/postgresQueueManager.d.ts +2 -0
  53. package/dist/application/postgresQueueManager.js +1 -0
  54. package/dist/application/queue-manager/ack.js +1 -1
  55. package/dist/application/queue-manager/delivery.js +1 -1
  56. package/dist/application/queue-manager/flow-failures.js +4 -0
  57. package/dist/application/queue-manager/limits.d.ts +2 -0
  58. package/dist/application/queue-manager/limits.js +4 -0
  59. package/dist/application/queue-manager/observability.js +15 -3
  60. package/dist/application/queue-manager/queries.d.ts +7 -0
  61. package/dist/application/queue-manager/queries.js +9 -0
  62. package/dist/application/queue-manager/services.d.ts +1 -1
  63. package/dist/application/queue-manager/services.js +4 -2
  64. package/dist/application/queue-manager/state.js +16 -1
  65. package/dist/application/statsManager.d.ts +1 -1
  66. package/dist/application/statsManager.js +1 -1
  67. package/dist/cli/commands/server.js +1 -1
  68. package/dist/client/events.js +2 -2
  69. package/dist/client/flow.js +0 -1
  70. package/dist/client/forwarder.d.ts +6 -4
  71. package/dist/client/forwarder.js +5 -3
  72. package/dist/client/queue/dlq.d.ts +2 -0
  73. package/dist/client/queue/dlq.js +14 -0
  74. package/dist/client/queue/dlqOps.d.ts +2 -0
  75. package/dist/client/queue/dlqOps.js +4 -0
  76. package/dist/client/queue/helpers.js +2 -0
  77. package/dist/client/queue/operations/add/single.js +1 -1
  78. package/dist/client/queue/runtime/configuration.d.ts +4 -0
  79. package/dist/client/queue/runtime/configuration.js +8 -0
  80. package/dist/client/sandboxed/runtime/state.js +2 -2
  81. package/dist/client/tcp/connection.d.ts +1 -1
  82. package/dist/client/tcp/connection.js +1 -1
  83. package/dist/client/tcp/runtime/state.js +2 -2
  84. package/dist/client/types/metrics.d.ts +1 -1
  85. package/dist/client/worker/runtime/control.js +0 -1
  86. package/dist/client/worker/runtime/execution.js +3 -8
  87. package/dist/client/worker/runtime/lifecycle.js +0 -1
  88. package/dist/client/worker/runtime/polling.d.ts +1 -0
  89. package/dist/client/worker/runtime/polling.js +9 -0
  90. package/dist/client/worker/runtime/state.js +3 -3
  91. package/dist/client/workflow/compensationChild.d.ts +2 -0
  92. package/dist/client/workflow/compensationChild.js +3 -1
  93. package/dist/client/workflow/compensationPass.d.ts +1 -0
  94. package/dist/client/workflow/compensationPass.js +18 -2
  95. package/dist/client/workflow/compensator.d.ts +2 -1
  96. package/dist/client/workflow/compensator.js +11 -3
  97. package/dist/client/workflow/engine.js +1 -1
  98. package/dist/client/workflow/executionFence.d.ts +15 -0
  99. package/dist/client/workflow/executionFence.js +29 -0
  100. package/dist/client/workflow/executor.d.ts +5 -11
  101. package/dist/client/workflow/executor.js +48 -47
  102. package/dist/client/workflow/executorLifecycle.d.ts +1 -0
  103. package/dist/client/workflow/executorLifecycle.js +41 -10
  104. package/dist/client/workflow/executorNodes.d.ts +1 -0
  105. package/dist/client/workflow/executorNodes.js +45 -16
  106. package/dist/client/workflow/executorQueue.d.ts +9 -0
  107. package/dist/client/workflow/executorQueue.js +15 -0
  108. package/dist/client/workflow/forEachRunner.d.ts +4 -0
  109. package/dist/client/workflow/forEachRunner.js +70 -0
  110. package/dist/client/workflow/loops.d.ts +4 -5
  111. package/dist/client/workflow/loops.js +27 -93
  112. package/dist/client/workflow/mapRunner.d.ts +1 -1
  113. package/dist/client/workflow/mapRunner.js +11 -2
  114. package/dist/client/workflow/recovery.d.ts +1 -0
  115. package/dist/client/workflow/recovery.js +24 -18
  116. package/dist/client/workflow/rollbackControl.d.ts +1 -0
  117. package/dist/client/workflow/rollbackControl.js +5 -2
  118. package/dist/client/workflow/runner.d.ts +3 -1
  119. package/dist/client/workflow/runner.js +26 -3
  120. package/dist/client/workflow/stepTypes.js +1 -1
  121. package/dist/client/workflow/subWorkflowRunner.d.ts +1 -0
  122. package/dist/client/workflow/subWorkflowRunner.js +7 -0
  123. package/dist/client/workflow/waitFor.d.ts +4 -0
  124. package/dist/client/workflow/waitFor.js +23 -11
  125. package/dist/client/workflow/workflowDecisions.d.ts +1 -1
  126. package/dist/client/workflow/workflowDecisions.js +3 -1
  127. package/dist/config/resolve.d.ts +14 -0
  128. package/dist/config/resolve.js +50 -5
  129. package/dist/config/types.d.ts +18 -0
  130. package/dist/domain/queue/dlqShard.d.ts +2 -0
  131. package/dist/domain/queue/dlqShard.js +16 -0
  132. package/dist/domain/queue/shard/dlq.d.ts +1 -0
  133. package/dist/domain/queue/shard/dlq.js +3 -0
  134. package/dist/domain/types/commands/dlq.d.ts +5 -0
  135. package/dist/domain/types/commands/union.d.ts +1 -1
  136. package/dist/domain/types/cron.d.ts +5 -0
  137. package/dist/domain/types/cron.js +14 -3
  138. package/dist/domain/types/dlq.d.ts +1 -1
  139. package/dist/domain/types/dlq.js +1 -2
  140. package/dist/domain/types/jobs/model.d.ts +1 -1
  141. package/dist/infrastructure/cloud/commandHandler.js +5 -3
  142. package/dist/infrastructure/cloud/commands/integrations.js +11 -11
  143. package/dist/infrastructure/cloud/commands/jobs.js +48 -40
  144. package/dist/infrastructure/cloud/commands/queues.js +61 -75
  145. package/dist/infrastructure/cloud/queueAdapter/local.d.ts +41 -0
  146. package/dist/infrastructure/cloud/queueAdapter/local.js +187 -0
  147. package/dist/infrastructure/cloud/queueAdapter/postgres.d.ts +42 -0
  148. package/dist/infrastructure/cloud/queueAdapter/postgres.js +188 -0
  149. package/dist/infrastructure/cloud/queueAdapter/registry.d.ts +4 -0
  150. package/dist/infrastructure/cloud/queueAdapter/registry.js +15 -0
  151. package/dist/infrastructure/cloud/queueAdapter/types.d.ts +87 -0
  152. package/dist/infrastructure/cloud/queueAdapter/types.js +1 -0
  153. package/dist/infrastructure/cloud/snapshot/analytics.d.ts +2 -0
  154. package/dist/infrastructure/cloud/snapshot/analytics.js +7 -0
  155. package/dist/infrastructure/cloud/snapshot/collector.d.ts +4 -0
  156. package/dist/infrastructure/cloud/snapshot/collector.js +39 -1
  157. package/dist/infrastructure/cloud/snapshot/config.d.ts +3 -0
  158. package/dist/infrastructure/cloud/snapshot/config.js +43 -0
  159. package/dist/infrastructure/cloud/snapshot/jobs.d.ts +3 -0
  160. package/dist/infrastructure/cloud/snapshot/jobs.js +32 -1
  161. package/dist/infrastructure/cloud/snapshotCollector.js +20 -35
  162. package/dist/infrastructure/cloud/snapshotHelpers.d.ts +3 -3
  163. package/dist/infrastructure/cloud/snapshotHelpers.js +3 -3
  164. package/dist/infrastructure/cloud/statsRefresh.js +2 -1
  165. package/dist/infrastructure/cloud/types/command.d.ts +2 -2
  166. package/dist/infrastructure/persistence/postgres/admission.d.ts +18 -0
  167. package/dist/infrastructure/persistence/postgres/admission.js +193 -0
  168. package/dist/infrastructure/persistence/postgres/admissionParent.d.ts +5 -0
  169. package/dist/infrastructure/persistence/postgres/admissionParent.js +35 -0
  170. package/dist/infrastructure/persistence/postgres/admissionResult.d.ts +9 -0
  171. package/dist/infrastructure/persistence/postgres/admissionResult.js +1 -0
  172. package/dist/infrastructure/persistence/postgres/admissionStore.d.ts +12 -0
  173. package/dist/infrastructure/persistence/postgres/admissionStore.js +101 -0
  174. package/dist/infrastructure/persistence/postgres/advisoryLocks.d.ts +2 -0
  175. package/dist/infrastructure/persistence/postgres/advisoryLocks.js +13 -0
  176. package/dist/infrastructure/persistence/postgres/batchAdmission.d.ts +11 -0
  177. package/dist/infrastructure/persistence/postgres/batchAdmission.js +110 -0
  178. package/dist/infrastructure/persistence/postgres/batchCompletion.d.ts +4 -0
  179. package/dist/infrastructure/persistence/postgres/batchCompletion.js +174 -0
  180. package/dist/infrastructure/persistence/postgres/batchEvents.d.ts +14 -0
  181. package/dist/infrastructure/persistence/postgres/batchEvents.js +72 -0
  182. package/dist/infrastructure/persistence/postgres/brokerSessions.d.ts +14 -0
  183. package/dist/infrastructure/persistence/postgres/brokerSessions.js +94 -0
  184. package/dist/infrastructure/persistence/postgres/claimBatch.d.ts +11 -0
  185. package/dist/infrastructure/persistence/postgres/claimBatch.js +56 -0
  186. package/dist/infrastructure/persistence/postgres/claimSelection.d.ts +4 -0
  187. package/dist/infrastructure/persistence/postgres/claimSelection.js +198 -0
  188. package/dist/infrastructure/persistence/postgres/claims.d.ts +3 -0
  189. package/dist/infrastructure/persistence/postgres/claims.js +137 -0
  190. package/dist/infrastructure/persistence/postgres/cloudReadModel.d.ts +26 -0
  191. package/dist/infrastructure/persistence/postgres/cloudReadModel.js +123 -0
  192. package/dist/infrastructure/persistence/postgres/codec.d.ts +30 -0
  193. package/dist/infrastructure/persistence/postgres/codec.js +82 -0
  194. package/dist/infrastructure/persistence/postgres/completionEvents.d.ts +11 -0
  195. package/dist/infrastructure/persistence/postgres/completionEvents.js +21 -0
  196. package/dist/infrastructure/persistence/postgres/completionLifecycle.d.ts +11 -0
  197. package/dist/infrastructure/persistence/postgres/completionLifecycle.js +145 -0
  198. package/dist/infrastructure/persistence/postgres/completionOutcome.d.ts +4 -0
  199. package/dist/infrastructure/persistence/postgres/completionOutcome.js +112 -0
  200. package/dist/infrastructure/persistence/postgres/completionQueries.d.ts +10 -0
  201. package/dist/infrastructure/persistence/postgres/completionQueries.js +87 -0
  202. package/dist/infrastructure/persistence/postgres/connection.d.ts +3 -0
  203. package/dist/infrastructure/persistence/postgres/connection.js +15 -0
  204. package/dist/infrastructure/persistence/postgres/context.d.ts +28 -0
  205. package/dist/infrastructure/persistence/postgres/context.js +74 -0
  206. package/dist/infrastructure/persistence/postgres/control.d.ts +23 -0
  207. package/dist/infrastructure/persistence/postgres/control.js +105 -0
  208. package/dist/infrastructure/persistence/postgres/crons.d.ts +18 -0
  209. package/dist/infrastructure/persistence/postgres/crons.js +205 -0
  210. package/dist/infrastructure/persistence/postgres/deduplication.d.ts +9 -0
  211. package/dist/infrastructure/persistence/postgres/deduplication.js +47 -0
  212. package/dist/infrastructure/persistence/postgres/dependencyDestruction.d.ts +14 -0
  213. package/dist/infrastructure/persistence/postgres/dependencyDestruction.js +74 -0
  214. package/dist/infrastructure/persistence/postgres/dependencyPromotion.d.ts +29 -0
  215. package/dist/infrastructure/persistence/postgres/dependencyPromotion.js +212 -0
  216. package/dist/infrastructure/persistence/postgres/destructiveMutations.d.ts +4 -0
  217. package/dist/infrastructure/persistence/postgres/destructiveMutations.js +111 -0
  218. package/dist/infrastructure/persistence/postgres/dlqLifecycle.d.ts +13 -0
  219. package/dist/infrastructure/persistence/postgres/dlqLifecycle.js +184 -0
  220. package/dist/infrastructure/persistence/postgres/dlqMaintenance.d.ts +6 -0
  221. package/dist/infrastructure/persistence/postgres/dlqMaintenance.js +36 -0
  222. package/dist/infrastructure/persistence/postgres/dlqRetryPlan.d.ts +21 -0
  223. package/dist/infrastructure/persistence/postgres/dlqRetryPlan.js +92 -0
  224. package/dist/infrastructure/persistence/postgres/eventCommitGc.d.ts +27 -0
  225. package/dist/infrastructure/persistence/postgres/eventCommitGc.js +62 -0
  226. package/dist/infrastructure/persistence/postgres/eventJournal.d.ts +18 -0
  227. package/dist/infrastructure/persistence/postgres/eventJournal.js +76 -0
  228. package/dist/infrastructure/persistence/postgres/eventJournalSchema.d.ts +5 -0
  229. package/dist/infrastructure/persistence/postgres/eventJournalSchema.js +253 -0
  230. package/dist/infrastructure/persistence/postgres/eventPruneWatermarks.d.ts +24 -0
  231. package/dist/infrastructure/persistence/postgres/eventPruneWatermarks.js +111 -0
  232. package/dist/infrastructure/persistence/postgres/eventRetention.d.ts +18 -0
  233. package/dist/infrastructure/persistence/postgres/eventRetention.js +76 -0
  234. package/dist/infrastructure/persistence/postgres/events.d.ts +45 -0
  235. package/dist/infrastructure/persistence/postgres/events.js +249 -0
  236. package/dist/infrastructure/persistence/postgres/expiry.d.ts +3 -0
  237. package/dist/infrastructure/persistence/postgres/expiry.js +74 -0
  238. package/dist/infrastructure/persistence/postgres/flowFailures.d.ts +17 -0
  239. package/dist/infrastructure/persistence/postgres/flowFailures.js +199 -0
  240. package/dist/infrastructure/persistence/postgres/jobData.d.ts +3 -0
  241. package/dist/infrastructure/persistence/postgres/jobData.js +32 -0
  242. package/dist/infrastructure/persistence/postgres/leaseRelease.d.ts +9 -0
  243. package/dist/infrastructure/persistence/postgres/leaseRelease.js +120 -0
  244. package/dist/infrastructure/persistence/postgres/leaseRenewal.d.ts +4 -0
  245. package/dist/infrastructure/persistence/postgres/leaseRenewal.js +35 -0
  246. package/dist/infrastructure/persistence/postgres/lifetimeMetrics.d.ts +15 -0
  247. package/dist/infrastructure/persistence/postgres/lifetimeMetrics.js +46 -0
  248. package/dist/infrastructure/persistence/postgres/lifetimeMetricsFinalizer.d.ts +4 -0
  249. package/dist/infrastructure/persistence/postgres/lifetimeMetricsFinalizer.js +13 -0
  250. package/dist/infrastructure/persistence/postgres/logs.d.ts +6 -0
  251. package/dist/infrastructure/persistence/postgres/logs.js +70 -0
  252. package/dist/infrastructure/persistence/postgres/maintenance.d.ts +6 -0
  253. package/dist/infrastructure/persistence/postgres/maintenance.js +138 -0
  254. package/dist/infrastructure/persistence/postgres/maintenanceFlights.d.ts +14 -0
  255. package/dist/infrastructure/persistence/postgres/maintenanceFlights.js +66 -0
  256. package/dist/infrastructure/persistence/postgres/metricWrites.d.ts +9 -0
  257. package/dist/infrastructure/persistence/postgres/metricWrites.js +94 -0
  258. package/dist/infrastructure/persistence/postgres/mutations.d.ts +9 -0
  259. package/dist/infrastructure/persistence/postgres/mutations.js +171 -0
  260. package/dist/infrastructure/persistence/postgres/outcomes.d.ts +4 -0
  261. package/dist/infrastructure/persistence/postgres/outcomes.js +194 -0
  262. package/dist/infrastructure/persistence/postgres/policies.d.ts +11 -0
  263. package/dist/infrastructure/persistence/postgres/policies.js +18 -0
  264. package/dist/infrastructure/persistence/postgres/postCommitMaintenance.d.ts +17 -0
  265. package/dist/infrastructure/persistence/postgres/postCommitMaintenance.js +117 -0
  266. package/dist/infrastructure/persistence/postgres/promotion.d.ts +3 -0
  267. package/dist/infrastructure/persistence/postgres/promotion.js +43 -0
  268. package/dist/infrastructure/persistence/postgres/queries.d.ts +22 -0
  269. package/dist/infrastructure/persistence/postgres/queries.js +152 -0
  270. package/dist/infrastructure/persistence/postgres/queueDestruction.d.ts +3 -0
  271. package/dist/infrastructure/persistence/postgres/queueDestruction.js +154 -0
  272. package/dist/infrastructure/persistence/postgres/queueLifecycle.d.ts +10 -0
  273. package/dist/infrastructure/persistence/postgres/queueLifecycle.js +60 -0
  274. package/dist/infrastructure/persistence/postgres/rateLimit.d.ts +6 -0
  275. package/dist/infrastructure/persistence/postgres/rateLimit.js +10 -0
  276. package/dist/infrastructure/persistence/postgres/readModels.d.ts +32 -0
  277. package/dist/infrastructure/persistence/postgres/readModels.js +72 -0
  278. package/dist/infrastructure/persistence/postgres/recovery.d.ts +3 -0
  279. package/dist/infrastructure/persistence/postgres/recovery.js +178 -0
  280. package/dist/infrastructure/persistence/postgres/relationships.d.ts +9 -0
  281. package/dist/infrastructure/persistence/postgres/relationships.js +201 -0
  282. package/dist/infrastructure/persistence/postgres/removeUnprocessedChildren.d.ts +4 -0
  283. package/dist/infrastructure/persistence/postgres/removeUnprocessedChildren.js +241 -0
  284. package/dist/infrastructure/persistence/postgres/repeatMutations.d.ts +5 -0
  285. package/dist/infrastructure/persistence/postgres/repeatMutations.js +37 -0
  286. package/dist/infrastructure/persistence/postgres/runtime.d.ts +46 -0
  287. package/dist/infrastructure/persistence/postgres/runtime.js +236 -0
  288. package/dist/infrastructure/persistence/postgres/runtimeConfig.d.ts +21 -0
  289. package/dist/infrastructure/persistence/postgres/runtimeConfig.js +39 -0
  290. package/dist/infrastructure/persistence/postgres/schema.d.ts +4 -0
  291. package/dist/infrastructure/persistence/postgres/schema.js +257 -0
  292. package/dist/infrastructure/persistence/postgres/schemaInitialization.d.ts +3 -0
  293. package/dist/infrastructure/persistence/postgres/schemaInitialization.js +221 -0
  294. package/dist/infrastructure/persistence/postgres/serialAdmission.d.ts +6 -0
  295. package/dist/infrastructure/persistence/postgres/serialAdmission.js +96 -0
  296. package/dist/infrastructure/persistence/postgres/snapshotBudget.d.ts +3 -0
  297. package/dist/infrastructure/persistence/postgres/snapshotBudget.js +83 -0
  298. package/dist/infrastructure/persistence/postgres/storageHealth.d.ts +10 -0
  299. package/dist/infrastructure/persistence/postgres/storageHealth.js +29 -0
  300. package/dist/infrastructure/persistence/postgres/store.d.ts +90 -0
  301. package/dist/infrastructure/persistence/postgres/store.js +136 -0
  302. package/dist/infrastructure/persistence/postgres/telemetry.d.ts +6 -0
  303. package/dist/infrastructure/persistence/postgres/telemetry.js +88 -0
  304. package/dist/infrastructure/persistence/postgres/terminal.d.ts +8 -0
  305. package/dist/infrastructure/persistence/postgres/terminal.js +137 -0
  306. package/dist/infrastructure/persistence/postgres/transactionRetry.d.ts +6 -0
  307. package/dist/infrastructure/persistence/postgres/transactionRetry.js +42 -0
  308. package/dist/infrastructure/persistence/postgres/types.d.ts +175 -0
  309. package/dist/infrastructure/persistence/postgres/types.js +1 -0
  310. package/dist/infrastructure/persistence/postgres/workers.d.ts +15 -0
  311. package/dist/infrastructure/persistence/postgres/workers.js +126 -0
  312. package/dist/infrastructure/persistence/postgres.d.ts +2 -0
  313. package/dist/infrastructure/persistence/postgres.js +1 -0
  314. package/dist/infrastructure/persistence/sqlite/jobs.js +2 -0
  315. package/dist/infrastructure/persistence/sqlite.d.ts +1 -1
  316. package/dist/infrastructure/scheduler/cron/persisted.d.ts +5 -0
  317. package/dist/infrastructure/scheduler/cron/persisted.js +27 -0
  318. package/dist/infrastructure/scheduler/cron/runtime.js +5 -10
  319. package/dist/infrastructure/scheduler/cron/validation.d.ts +3 -0
  320. package/dist/infrastructure/scheduler/cron/validation.js +11 -0
  321. package/dist/infrastructure/scheduler/cronParser.d.ts +1 -1
  322. package/dist/infrastructure/scheduler/cronParser.js +144 -11
  323. package/dist/infrastructure/server/bootstrap.d.ts +2 -3
  324. package/dist/infrastructure/server/bootstrap.js +33 -59
  325. package/dist/infrastructure/server/errors.d.ts +4 -0
  326. package/dist/infrastructure/server/errors.js +54 -0
  327. package/dist/infrastructure/server/handler-routes/control.d.ts +5 -5
  328. package/dist/infrastructure/server/handler-routes/control.js +3 -1
  329. package/dist/infrastructure/server/handler-routes/jobs.js +0 -3
  330. package/dist/infrastructure/server/handler-routes/monitoring.d.ts +2 -2
  331. package/dist/infrastructure/server/handler.js +9 -11
  332. package/dist/infrastructure/server/handlerRoutes.d.ts +2 -2
  333. package/dist/infrastructure/server/handlerRoutes.js +2 -2
  334. package/dist/infrastructure/server/handlers/advanced/dependencies.js +7 -6
  335. package/dist/infrastructure/server/handlers/advanced/jobs.js +19 -6
  336. package/dist/infrastructure/server/handlers/advanced/queue.d.ts +9 -9
  337. package/dist/infrastructure/server/handlers/advanced/queue.js +91 -27
  338. package/dist/infrastructure/server/handlers/core.js +32 -31
  339. package/dist/infrastructure/server/handlers/cron.d.ts +4 -4
  340. package/dist/infrastructure/server/handlers/cron.js +60 -59
  341. package/dist/infrastructure/server/handlers/dashboard.d.ts +1 -1
  342. package/dist/infrastructure/server/handlers/dashboard.js +21 -8
  343. package/dist/infrastructure/server/handlers/dlq.d.ts +6 -3
  344. package/dist/infrastructure/server/handlers/dlq.js +35 -9
  345. package/dist/infrastructure/server/handlers/flow.js +2 -1
  346. package/dist/infrastructure/server/handlers/management.d.ts +5 -5
  347. package/dist/infrastructure/server/handlers/management.js +36 -9
  348. package/dist/infrastructure/server/handlers/monitoring/health.d.ts +5 -5
  349. package/dist/infrastructure/server/handlers/monitoring/health.js +45 -16
  350. package/dist/infrastructure/server/handlers/monitoring/operations.d.ts +1 -1
  351. package/dist/infrastructure/server/handlers/monitoring/operations.js +8 -1
  352. package/dist/infrastructure/server/handlers/monitoring/workers.d.ts +3 -3
  353. package/dist/infrastructure/server/handlers/monitoring/workers.js +31 -7
  354. package/dist/infrastructure/server/handlers/pushBatchValidation.d.ts +3 -1
  355. package/dist/infrastructure/server/handlers/pushBatchValidation.js +52 -7
  356. package/dist/infrastructure/server/handlers/query.d.ts +1 -1
  357. package/dist/infrastructure/server/handlers/query.js +5 -4
  358. package/dist/infrastructure/server/http.js +2 -2
  359. package/dist/infrastructure/server/httpDashboardEndpoints.d.ts +1 -1
  360. package/dist/infrastructure/server/httpDashboardEndpoints.js +19 -6
  361. package/dist/infrastructure/server/httpEndpoints.js +20 -7
  362. package/dist/infrastructure/server/httpRouteQueues.js +11 -1
  363. package/dist/infrastructure/server/shutdownCoordinator.d.ts +24 -0
  364. package/dist/infrastructure/server/shutdownCoordinator.js +106 -0
  365. package/dist/infrastructure/server/sseHandler.js +8 -3
  366. package/dist/infrastructure/server/storageAdapter.d.ts +29 -0
  367. package/dist/infrastructure/server/storageAdapter.js +61 -0
  368. package/dist/infrastructure/server/storageManager.d.ts +12 -0
  369. package/dist/infrastructure/server/storageManager.js +102 -0
  370. package/dist/infrastructure/server/tcp.js +2 -3
  371. package/dist/infrastructure/server/ws/snapshots.d.ts +1 -1
  372. package/dist/infrastructure/server/ws/snapshots.js +19 -4
  373. package/dist/infrastructure/server/wsHandler.js +10 -5
  374. package/dist/main.js +1 -1
  375. package/dist/mcp/backend/embedded/services.js +2 -1
  376. package/dist/mcp/index.d.ts +2 -2
  377. package/dist/mcp/index.js +2 -2
  378. package/dist/shared/storageHealth.d.ts +9 -0
  379. package/dist/shared/storageHealth.js +12 -0
  380. package/package.json +85 -74
@@ -23,6 +23,7 @@ const TIMEOUT_ENQUEUE_RETRY_MS = 5_000;
23
23
  */
24
24
  export function scheduleTimeoutCheck(deps, execId, workflowName, nodeIdx, ms) {
25
25
  const arm = (requestedDelay) => {
26
+ deps.assertActive();
26
27
  const delay = Math.min(Math.max(requestedDelay, 0), MAX_TIMER_MS);
27
28
  // Replacing a live timer for the same execution — re-entering a waitFor node used
28
29
  // to leak the previous one, which then fired against a node the run had left.
@@ -30,6 +31,11 @@ export function scheduleTimeoutCheck(deps, execId, workflowName, nodeIdx, ms) {
30
31
  if (previous)
31
32
  clock().clearTimeout(previous);
32
33
  const timer = clock().setTimeout(() => {
34
+ if (!deps.isActive()) {
35
+ if (deps.timers.get(execId) === timer)
36
+ deps.timers.delete(execId);
37
+ return;
38
+ }
33
39
  const jobData = { executionId: execId, workflowName, nodeIndex: nodeIdx };
34
40
  const published = () => {
35
41
  // Keep the handle in the map while add() is pending. signal() and close() use
@@ -40,6 +46,10 @@ export function scheduleTimeoutCheck(deps, execId, workflowName, nodeIdx, ms) {
40
46
  const failed = () => {
41
47
  if (deps.timers.get(execId) !== timer)
42
48
  return;
49
+ if (!deps.isActive()) {
50
+ deps.timers.delete(execId);
51
+ return;
52
+ }
43
53
  arm(TIMEOUT_ENQUEUE_RETRY_MS);
44
54
  };
45
55
  try {
@@ -75,6 +85,7 @@ export function clearTimers(timers) {
75
85
  * short-circuits without treating the pause as an error.
76
86
  */
77
87
  export async function runWaitFor(deps, exec, node, idx, wf) {
88
+ deps.assertActive();
78
89
  if (hasSignal(exec.signals, node.event)) {
79
90
  await deps.advance(exec, idx + 1, wf);
80
91
  return;
@@ -92,11 +103,14 @@ export async function runWaitFor(deps, exec, node, idx, wf) {
92
103
  // (refund, release stock) work the approver just authorised.
93
104
  const fresh = deps.store.get(exec.id);
94
105
  if (fresh && hasSignal(fresh.signals, node.event)) {
106
+ deps.assertActive();
95
107
  exec.signals = fresh.signals;
96
108
  await deps.advance(exec, idx + 1, wf);
97
109
  return;
98
110
  }
111
+ deps.assertActive();
99
112
  deps.emitter?.emitSignal('signal:timeout', exec.id, exec.workflowName, node.event);
113
+ deps.assertActive();
100
114
  const timeoutReason = `Signal "${node.event}" timed out after ${node.timeout}ms`;
101
115
  exec.steps[waitKey] = {
102
116
  status: 'failed',
@@ -106,30 +120,26 @@ export async function runWaitFor(deps, exec, node, idx, wf) {
106
120
  };
107
121
  exec.state = 'failed';
108
122
  exec.failureReason = timeoutReason;
109
- // Unguarded on purpose, same reasoning as the failure write in `executor.ts`. Disk
110
- // still says `waiting`, which `listRecoverable()` covers, so `recoverWaiting`
111
- // recomputes the remaining time, re-enqueues, and the gate times out again rather
112
- // than leaving a run that looks settled and was never unwound.
113
- //
114
- // A throw here skips the compensate CALL below but not the compensation: it
115
- // propagates into `runNode`'s catch, which compensates anyway. That is the generic
116
- // path the `WaitForSignalError` sentinel below exists to avoid on the normal route,
117
- // so the outcome is a redundant route, not a missing rollback.
118
- deps.store.update(exec);
123
+ // Persist failure before starting rollback. The lifecycle guard leaves the
124
+ // durable row waiting if force-close won, so replacement recovery re-evaluates
125
+ // the same elapsed deadline without starting an old executor's compensation.
126
+ deps.updateFn(exec);
119
127
  // Compensate here, then signal completion via the WaitForSignalError sentinel
120
128
  // so processStep short-circuits (return null) instead of re-running
121
129
  // compensation through its generic catch path.
122
130
  await deps.compensate(exec, wf);
131
+ deps.assertActive();
123
132
  deps.emitter?.emitWorkflow('workflow:failed', exec.id, exec.workflowName, 'failed');
124
133
  throw new WaitForSignalError(node.event);
125
134
  }
126
- deps.store.update(exec);
135
+ deps.updateFn(exec);
127
136
  remaining = node.timeout - (clock().now() - waitingSince);
128
137
  }
129
138
  // Park transactionally. Between the in-memory check above and this point a signal
130
139
  // can land: it would be recorded with no parked run left to claim the resume,
131
140
  // hanging the execution forever. parkForSignal() re-reads the persisted signals
132
141
  // and only transitions 'running' -> 'waiting' when none has arrived.
142
+ deps.assertActive();
133
143
  const park = deps.store.parkForSignal(exec.id, node.event);
134
144
  if (park.signalPresent) {
135
145
  exec.signals = park.signals;
@@ -143,8 +153,10 @@ export async function runWaitFor(deps, exec, node, idx, wf) {
143
153
  }
144
154
  exec.state = 'waiting';
145
155
  if (node.timeout !== undefined) {
156
+ deps.assertActive();
146
157
  deps.scheduleTimeoutCheck(exec.id, exec.workflowName, idx, remaining);
147
158
  }
159
+ deps.assertActive();
148
160
  deps.emitter?.emitWorkflow('workflow:waiting', exec.id, exec.workflowName, 'waiting');
149
161
  throw new WaitForSignalError(node.event);
150
162
  }
@@ -4,7 +4,7 @@ import type { Execution } from './types';
4
4
  * Return an already persisted decision, or evaluate and persist it before the caller
5
5
  * performs any effects selected by that decision.
6
6
  */
7
- export declare function resolveDecision<T>(exec: Execution, key: string, evaluate: () => T | Promise<T>, updateFn: (exec: Execution) => void): Promise<T>;
7
+ export declare function resolveDecision<T>(exec: Execution, key: string, evaluate: () => T | Promise<T>, updateFn: (exec: Execution) => void, assertActive: () => void): Promise<T>;
8
8
  export declare function branchDecisionKey(nodeIndex: number): string;
9
9
  export declare function forEachItemsDecisionKey(stepName: string): string;
10
10
  export declare function loopDecisionKey(kind: 'doUntil' | 'doWhile', firstStepName: string, iteration: number): string;
@@ -4,11 +4,13 @@ const hasOwn = (value, key) => Object.hasOwn(value, key);
4
4
  * Return an already persisted decision, or evaluate and persist it before the caller
5
5
  * performs any effects selected by that decision.
6
6
  */
7
- export async function resolveDecision(exec, key, evaluate, updateFn) {
7
+ export async function resolveDecision(exec, key, evaluate, updateFn, assertActive) {
8
+ assertActive();
8
9
  const decisions = (exec.decisions ??= {});
9
10
  if (hasOwn(decisions, key))
10
11
  return decisions[key];
11
12
  const value = await evaluate();
13
+ assertActive();
12
14
  decisions[key] = value;
13
15
  updateFn(exec);
14
16
  return value;
@@ -16,6 +16,20 @@ export interface ResolvedConfig {
16
16
  tlsKeyFile: string | undefined;
17
17
  authTokens: string[];
18
18
  dataPath: string | undefined;
19
+ storageDriver: 'memory' | 'sqlite' | 'postgres';
20
+ postgresUrl: string | undefined;
21
+ postgresNamespace: string;
22
+ postgresBrokerId: string | undefined;
23
+ postgresPoolSize: number;
24
+ postgresLeaseDurationMs: number;
25
+ postgresPollIntervalMs: number;
26
+ postgresStatementTimeoutMs: number;
27
+ postgresLockTimeoutMs: number;
28
+ postgresIdleTransactionTimeoutMs: number;
29
+ postgresMaxConcurrentOperations: number;
30
+ postgresMaxQueuedOperations: number;
31
+ postgresMaxSnapshotJobs: number;
32
+ postgresMaxSnapshotPayloadBytes: number;
19
33
  corsOrigins: string[];
20
34
  requireAuthForMetrics: boolean;
21
35
  maxPrometheusQueues: number;
@@ -8,6 +8,19 @@ import { DEFAULTS as S3_DEFAULTS } from '../infrastructure/backup/s3BackupConfig
8
8
  /** Resolve server config: config file > env vars > defaults */
9
9
  export function resolveServerConfig(fileConfig) {
10
10
  const fc = fileConfig;
11
+ const dataPath = fc?.storage?.dataPath ??
12
+ Bun.env.BUNQUEUE_DATA_PATH ??
13
+ Bun.env.BQ_DATA_PATH ??
14
+ Bun.env.DATA_PATH ??
15
+ Bun.env.SQLITE_PATH;
16
+ const postgresUrl = fc?.storage?.url ?? Bun.env.BUNQUEUE_POSTGRES_URL;
17
+ const storageDriver = fc?.storage?.driver
18
+ ? resolveStorageDriver(fc.storage.driver, postgresUrl, dataPath)
19
+ : fc?.storage?.url
20
+ ? 'postgres'
21
+ : fc?.storage?.dataPath
22
+ ? 'sqlite'
23
+ : resolveStorageDriver(Bun.env.BUNQUEUE_STORAGE_DRIVER, postgresUrl, dataPath);
11
24
  return {
12
25
  tcpPort: fc?.server?.tcpPort ?? parseInt(Bun.env.TCP_PORT ?? '6789', 10),
13
26
  httpPort: fc?.server?.httpPort ?? parseInt(Bun.env.HTTP_PORT ?? '6790', 10),
@@ -17,11 +30,30 @@ export function resolveServerConfig(fileConfig) {
17
30
  tlsCertFile: fc?.server?.tlsCertFile ?? Bun.env.TLS_CERT_FILE,
18
31
  tlsKeyFile: fc?.server?.tlsKeyFile ?? Bun.env.TLS_KEY_FILE,
19
32
  authTokens: fc?.auth?.tokens ?? Bun.env.AUTH_TOKENS?.split(',').filter(Boolean) ?? [],
20
- dataPath: fc?.storage?.dataPath ??
21
- Bun.env.BUNQUEUE_DATA_PATH ??
22
- Bun.env.BQ_DATA_PATH ??
23
- Bun.env.DATA_PATH ??
24
- Bun.env.SQLITE_PATH,
33
+ dataPath,
34
+ storageDriver,
35
+ postgresUrl,
36
+ postgresNamespace: fc?.storage?.namespace ?? Bun.env.BUNQUEUE_POSTGRES_NAMESPACE ?? 'default',
37
+ postgresBrokerId: fc?.storage?.brokerId ?? Bun.env.BUNQUEUE_BROKER_ID,
38
+ postgresPoolSize: positiveInteger(fc?.storage?.poolSize ?? parseInt(Bun.env.BUNQUEUE_POSTGRES_POOL_SIZE ?? '4', 10), 4),
39
+ postgresLeaseDurationMs: positiveInteger(fc?.storage?.leaseDurationMs ??
40
+ parseInt(Bun.env.BUNQUEUE_POSTGRES_LEASE_DURATION_MS ?? '30000', 10), 30_000),
41
+ postgresPollIntervalMs: positiveInteger(fc?.storage?.pollIntervalMs ??
42
+ parseInt(Bun.env.BUNQUEUE_POSTGRES_POLL_INTERVAL_MS ?? '250', 10), 250),
43
+ postgresStatementTimeoutMs: positiveInteger(fc?.storage?.statementTimeoutMs ??
44
+ parseInt(Bun.env.BUNQUEUE_POSTGRES_STATEMENT_TIMEOUT_MS ?? '30000', 10), 30_000),
45
+ postgresLockTimeoutMs: positiveInteger(fc?.storage?.lockTimeoutMs ??
46
+ parseInt(Bun.env.BUNQUEUE_POSTGRES_LOCK_TIMEOUT_MS ?? '5000', 10), 5_000),
47
+ postgresIdleTransactionTimeoutMs: positiveInteger(fc?.storage?.idleTransactionTimeoutMs ??
48
+ parseInt(Bun.env.BUNQUEUE_POSTGRES_IDLE_TRANSACTION_TIMEOUT_MS ?? '30000', 10), 30_000),
49
+ postgresMaxConcurrentOperations: positiveInteger(fc?.storage?.maxConcurrentOperations ??
50
+ parseInt(Bun.env.BUNQUEUE_POSTGRES_MAX_CONCURRENT_OPERATIONS ?? '16', 10), 16),
51
+ postgresMaxQueuedOperations: nonNegativeInteger(fc?.storage?.maxQueuedOperations ??
52
+ parseInt(Bun.env.BUNQUEUE_POSTGRES_MAX_QUEUED_OPERATIONS ?? '128', 10), 128),
53
+ postgresMaxSnapshotJobs: positiveInteger(fc?.storage?.maxSnapshotJobs ??
54
+ parseInt(Bun.env.BUNQUEUE_POSTGRES_MAX_SNAPSHOT_JOBS ?? '100000', 10), 100_000),
55
+ postgresMaxSnapshotPayloadBytes: positiveInteger(fc?.storage?.maxSnapshotPayloadBytes ??
56
+ parseInt(Bun.env.BUNQUEUE_POSTGRES_MAX_SNAPSHOT_PAYLOAD_BYTES ?? '268435456', 10), 256 * 1024 * 1024),
25
57
  corsOrigins: fc?.cors?.origins ?? Bun.env.CORS_ALLOW_ORIGIN?.split(',').filter(Boolean) ?? [],
26
58
  requireAuthForMetrics: fc?.auth?.requireAuthForMetrics ?? Bun.env.METRICS_AUTH === 'true',
27
59
  maxPrometheusQueues: nonNegativeInteger(fc?.telemetry?.maxPrometheusQueues ?? parseInt(Bun.env.METRICS_MAX_QUEUES ?? '100', 10), 100),
@@ -31,9 +63,22 @@ export function resolveServerConfig(fileConfig) {
31
63
  statsIntervalMs: fc?.timeouts?.stats ?? parseInt(Bun.env.STATS_INTERVAL_MS ?? '300000', 10),
32
64
  };
33
65
  }
66
+ function resolveStorageDriver(configured, postgresUrl, dataPath) {
67
+ if (configured === 'memory' || configured === 'sqlite' || configured === 'postgres') {
68
+ return configured;
69
+ }
70
+ if (configured)
71
+ throw new Error(`Unsupported storage driver: ${configured}`);
72
+ if (postgresUrl)
73
+ return 'postgres';
74
+ return dataPath ? 'sqlite' : 'memory';
75
+ }
34
76
  function nonNegativeInteger(value, fallback) {
35
77
  return Number.isFinite(value) && value >= 0 ? Math.floor(value) : fallback;
36
78
  }
79
+ function positiveInteger(value, fallback) {
80
+ return Number.isFinite(value) && value > 0 ? Math.floor(value) : fallback;
81
+ }
37
82
  /**
38
83
  * Resolve server TLS options from resolved config. Returns null when TLS is
39
84
  * not configured; throws when only one of cert/key is set (fail fast at
@@ -20,7 +20,25 @@ export interface BunqueueConfig {
20
20
  requireAuthForMetrics?: boolean;
21
21
  };
22
22
  storage?: {
23
+ /** Persistence backend. Inferred from url/dataPath when omitted. */
24
+ driver?: 'memory' | 'sqlite' | 'postgres';
23
25
  dataPath?: string;
26
+ /** PostgreSQL connection URL. Required when driver is postgres. */
27
+ url?: string;
28
+ /** Isolates independent bunqueue installations sharing one PostgreSQL database. */
29
+ namespace?: string;
30
+ /** Stable identifier for this broker process; generated automatically when omitted. */
31
+ brokerId?: string;
32
+ poolSize?: number;
33
+ leaseDurationMs?: number;
34
+ pollIntervalMs?: number;
35
+ statementTimeoutMs?: number;
36
+ lockTimeoutMs?: number;
37
+ idleTransactionTimeoutMs?: number;
38
+ maxConcurrentOperations?: number;
39
+ maxQueuedOperations?: number;
40
+ maxSnapshotJobs?: number;
41
+ maxSnapshotPayloadBytes?: number;
24
42
  };
25
43
  telemetry?: {
26
44
  /** Maximum queue label values exposed to Prometheus; zero disables per-queue series. */
@@ -44,6 +44,8 @@ export declare class DlqShard {
44
44
  getFiltered(queue: string, filter: DlqFilter): DlqEntry[];
45
45
  /** Remove entry from DLQ by job ID */
46
46
  remove(queue: string, jobId: JobId): DlqEntry | null;
47
+ /** Remove every entry with the same job ID from one queue. */
48
+ removeAll(queue: string, jobId: JobId): DlqEntry[];
47
49
  /** Get entries ready for auto-retry */
48
50
  getAutoRetryEntries(queue: string, now?: number): DlqEntry[];
49
51
  /** Get expired entries for cleanup */
@@ -135,6 +135,22 @@ export class DlqShard {
135
135
  this.stats.decrementDlq();
136
136
  return entries.splice(idx, 1)[0];
137
137
  }
138
+ /** Remove every entry with the same job ID from one queue. */
139
+ removeAll(queue, jobId) {
140
+ const entries = this.dlq.get(queue);
141
+ if (!entries)
142
+ return [];
143
+ const removed = [];
144
+ const remaining = [];
145
+ for (const entry of entries) {
146
+ (entry.job.id === jobId ? removed : remaining).push(entry);
147
+ }
148
+ if (removed.length === 0)
149
+ return removed;
150
+ this.dlq.set(queue, remaining);
151
+ this.stats.decrementDlq(removed.length);
152
+ return removed;
153
+ }
138
154
  /** Get entries ready for auto-retry */
139
155
  getAutoRetryEntries(queue, now = Date.now()) {
140
156
  const entries = this.dlq.get(queue);
@@ -18,6 +18,7 @@ export declare class ShardDlq extends ShardDependencies {
18
18
  getDlq(queue: string, count?: number): Job[];
19
19
  getDlqFiltered(queue: string, filter: DlqFilter): DlqEntry[];
20
20
  removeFromDlq(queue: string, jobId: JobId): DlqEntry | null;
21
+ removeAllFromDlq(queue: string, jobId: JobId): DlqEntry[];
21
22
  getAutoRetryEntries(queue: string, now?: number): DlqEntry[];
22
23
  getExpiredEntries(queue: string, now?: number): DlqEntry[];
23
24
  purgeExpired(queue: string, now?: number): number;
@@ -56,6 +56,9 @@ export class ShardDlq extends ShardDependencies {
56
56
  removeFromDlq(queue, jobId) {
57
57
  return this.dlqManager.remove(queue, jobId);
58
58
  }
59
+ removeAllFromDlq(queue, jobId) {
60
+ return this.dlqManager.removeAll(queue, jobId);
61
+ }
59
62
  getAutoRetryEntries(queue, now = Date.now()) {
60
63
  return this.dlqManager.getAutoRetryEntries(queue, now);
61
64
  }
@@ -21,6 +21,11 @@ export interface PurgeDlqCommand extends BaseCommand {
21
21
  readonly cmd: 'PurgeDlq';
22
22
  readonly queue: string;
23
23
  }
24
+ export interface RemoveDlqJobCommand extends BaseCommand {
25
+ readonly cmd: 'RemoveDlqJob';
26
+ readonly queue: string;
27
+ readonly jobId: string;
28
+ }
24
29
  export interface RetryCompletedCommand extends BaseCommand {
25
30
  readonly cmd: 'RetryCompleted';
26
31
  readonly queue: string;
@@ -9,5 +9,5 @@ import type * as Monitoring from './monitoring';
9
9
  import type * as Protocol from './protocol';
10
10
  import type * as Query from './query';
11
11
  import type * as Workers from './workers';
12
- export type Command = Core.PushCommand | Core.PushBatchCommand | Core.PushFlowCommand | Core.PullCommand | Core.PullBatchCommand | Core.AckCommand | Core.AckBatchCommand | Core.FailCommand | Query.GetJobCommand | Query.GetStateCommand | Query.GetResultCommand | Query.GetJobsCommand | Query.GetJobCountsCommand | Query.GetCountsPerPriorityCommand | Query.GetJobByCustomIdCommand | Query.CountCommand | Query.GetProgressCommand | Query.GetChildrenValuesCommand | Management.CancelCommand | Management.ProgressCommand | Management.UpdateCommand | Management.ChangePriorityCommand | Management.PromoteCommand | Management.WaitJobCommand | Management.MoveToDelayedCommand | Management.DiscardCommand | Management.PauseCommand | Management.ResumeCommand | Management.IsPausedCommand | Management.DrainCommand | Management.ObliterateCommand | Management.ListQueuesCommand | Management.CleanCommand | Dlq.DlqCommand | Dlq.GetDlqStatsCommand | Dlq.RetryDlqCommand | Dlq.PurgeDlqCommand | Dlq.RetryCompletedCommand | Dlq.SetDlqConfigCommand | Dlq.GetDlqConfigCommand | Limits.GetQueueLimitsCommand | Limits.GetDeduplicationJobIdCommand | Limits.RemoveDeduplicationKeyCommand | Limits.RemoveJobDeduplicationKeyCommand | Limits.MoveToWaitingChildrenCommand | Limits.RateLimitCommand | Limits.SetConcurrencyCommand | Limits.RateLimitClearCommand | Limits.ClearConcurrencyCommand | Limits.SetStallConfigCommand | Limits.GetStallConfigCommand | Cron.CronCommand | Cron.CronDeleteCommand | Cron.CronListCommand | Cron.CronGetCommand | Monitoring.AddLogCommand | Monitoring.GetLogsCommand | Monitoring.AddWebhookCommand | Monitoring.RemoveWebhookCommand | Monitoring.ListWebhooksCommand | Monitoring.StatsCommand | Monitoring.MetricsCommand | Monitoring.TrimEventsCommand | Monitoring.PrometheusCommand | Monitoring.StorageStatusCommand | Workers.HeartbeatCommand | Workers.JobHeartbeatCommand | Workers.JobHeartbeatBatchCommand | Workers.PingCommand | Workers.RegisterWorkerCommand | Workers.UnregisterWorkerCommand | Workers.ListWorkersCommand | Extended.ClearLogsCommand | Extended.ExtendLockCommand | Extended.ExtendLocksCommand | Extended.ChangeDelayCommand | Extended.SetWebhookEnabledCommand | Extended.CompactMemoryCommand | Extended.UpdateParentCommand | Extended.GetFailedChildrenValuesCommand | Extended.GetIgnoredChildrenFailuresCommand | Extended.RemoveChildDependencyCommand | Extended.RemoveUnprocessedChildrenCommand | Extended.MoveToWaitCommand | Extended.PromoteJobsCommand | Dashboard.DashboardOverviewCommand | Dashboard.DashboardQueuesCommand | Dashboard.DashboardQueueCommand | Protocol.AuthCommand | Protocol.HelloCommand | Protocol.SubscribeEventsCommand | Protocol.UnsubscribeEventsCommand;
12
+ export type Command = Core.PushCommand | Core.PushBatchCommand | Core.PushFlowCommand | Core.PullCommand | Core.PullBatchCommand | Core.AckCommand | Core.AckBatchCommand | Core.FailCommand | Query.GetJobCommand | Query.GetStateCommand | Query.GetResultCommand | Query.GetJobsCommand | Query.GetJobCountsCommand | Query.GetCountsPerPriorityCommand | Query.GetJobByCustomIdCommand | Query.CountCommand | Query.GetProgressCommand | Query.GetChildrenValuesCommand | Management.CancelCommand | Management.ProgressCommand | Management.UpdateCommand | Management.ChangePriorityCommand | Management.PromoteCommand | Management.WaitJobCommand | Management.MoveToDelayedCommand | Management.DiscardCommand | Management.PauseCommand | Management.ResumeCommand | Management.IsPausedCommand | Management.DrainCommand | Management.ObliterateCommand | Management.ListQueuesCommand | Management.CleanCommand | Dlq.DlqCommand | Dlq.GetDlqStatsCommand | Dlq.RetryDlqCommand | Dlq.PurgeDlqCommand | Dlq.RemoveDlqJobCommand | Dlq.RetryCompletedCommand | Dlq.SetDlqConfigCommand | Dlq.GetDlqConfigCommand | Limits.GetQueueLimitsCommand | Limits.GetDeduplicationJobIdCommand | Limits.RemoveDeduplicationKeyCommand | Limits.RemoveJobDeduplicationKeyCommand | Limits.MoveToWaitingChildrenCommand | Limits.RateLimitCommand | Limits.SetConcurrencyCommand | Limits.RateLimitClearCommand | Limits.ClearConcurrencyCommand | Limits.SetStallConfigCommand | Limits.GetStallConfigCommand | Cron.CronCommand | Cron.CronDeleteCommand | Cron.CronListCommand | Cron.CronGetCommand | Monitoring.AddLogCommand | Monitoring.GetLogsCommand | Monitoring.AddWebhookCommand | Monitoring.RemoveWebhookCommand | Monitoring.ListWebhooksCommand | Monitoring.StatsCommand | Monitoring.MetricsCommand | Monitoring.TrimEventsCommand | Monitoring.PrometheusCommand | Monitoring.StorageStatusCommand | Workers.HeartbeatCommand | Workers.JobHeartbeatCommand | Workers.JobHeartbeatBatchCommand | Workers.PingCommand | Workers.RegisterWorkerCommand | Workers.UnregisterWorkerCommand | Workers.ListWorkersCommand | Extended.ClearLogsCommand | Extended.ExtendLockCommand | Extended.ExtendLocksCommand | Extended.ChangeDelayCommand | Extended.SetWebhookEnabledCommand | Extended.CompactMemoryCommand | Extended.UpdateParentCommand | Extended.GetFailedChildrenValuesCommand | Extended.GetIgnoredChildrenFailuresCommand | Extended.RemoveChildDependencyCommand | Extended.RemoveUnprocessedChildrenCommand | Extended.MoveToWaitCommand | Extended.PromoteJobsCommand | Dashboard.DashboardOverviewCommand | Dashboard.DashboardQueuesCommand | Dashboard.DashboardQueueCommand | Protocol.AuthCommand | Protocol.HelloCommand | Protocol.SubscribeEventsCommand | Protocol.UnsubscribeEventsCommand;
13
13
  export type CommandType = Command['cmd'];
@@ -78,6 +78,11 @@ export interface CronJobInput {
78
78
  /** Job options applied to each spawned job (retry/cleanup policy, etc.) */
79
79
  jobOptions?: CronJobOptions;
80
80
  }
81
+ /** Validate the calendar/interval timing fields before scheduler mutation. */
82
+ export declare function assertValidCronTiming(input: {
83
+ readonly schedule?: string | null;
84
+ readonly repeatEvery?: number | null;
85
+ }): void;
81
86
  /** Create a new cron job */
82
87
  export declare function createCronJob(input: CronJobInput, nextRun: number): CronJob;
83
88
  /** Check if cron job has reached its execution limit */
@@ -2,11 +2,22 @@
2
2
  * Cron job domain types
3
3
  */
4
4
  import { normalizeJobPayload } from '../job/payload';
5
- /** Create a new cron job */
6
- export function createCronJob(input, nextRun) {
7
- if (!input.schedule && !input.repeatEvery) {
5
+ /** Validate the calendar/interval timing fields before scheduler mutation. */
6
+ export function assertValidCronTiming(input) {
7
+ if (input.repeatEvery !== undefined && input.repeatEvery !== null) {
8
+ if (typeof input.repeatEvery !== 'number' ||
9
+ !Number.isSafeInteger(input.repeatEvery) ||
10
+ input.repeatEvery < 1) {
11
+ throw new Error('Cron repeatEvery must be a positive safe integer number of milliseconds');
12
+ }
13
+ }
14
+ if (!input.schedule && (input.repeatEvery === undefined || input.repeatEvery === null)) {
8
15
  throw new Error('Cron job must have either schedule or repeatEvery');
9
16
  }
17
+ }
18
+ /** Create a new cron job */
19
+ export function createCronJob(input, nextRun) {
20
+ assertValidCronTiming(input);
10
21
  const payload = normalizeJobPayload({ name: input.jobName, data: input.data });
11
22
  return {
12
23
  name: input.name,
@@ -89,7 +89,7 @@ export interface DlqConfig {
89
89
  /** Default DLQ configuration */
90
90
  export declare const DEFAULT_DLQ_CONFIG: DlqConfig;
91
91
  /** Create a DLQ entry from a failed job */
92
- export declare function createDlqEntry(job: Job, reason: FailureReason, error: string | null, config?: DlqConfig): DlqEntry;
92
+ export declare function createDlqEntry(job: Job, reason: FailureReason, error: string | null, config?: DlqConfig, now?: number): DlqEntry;
93
93
  /** Add attempt record to existing DLQ entry */
94
94
  export declare function addAttemptRecord(entry: DlqEntry, reason: FailureReason, error: string | null): void;
95
95
  /** Check if DLQ entry is expired */
@@ -63,8 +63,7 @@ export const DEFAULT_DLQ_CONFIG = {
63
63
  maxEntries: 10000,
64
64
  };
65
65
  /** Create a DLQ entry from a failed job */
66
- export function createDlqEntry(job, reason, error, config = DEFAULT_DLQ_CONFIG) {
67
- const now = Date.now();
66
+ export function createDlqEntry(job, reason, error, config = DEFAULT_DLQ_CONFIG, now = Date.now()) {
68
67
  const retained = getDlqRetryState(job);
69
68
  const alreadyEntered = retained?.enteredAt !== null && retained?.enteredAt !== undefined;
70
69
  const attemptRecord = createAttemptRecord(job, reason, error, now);
@@ -83,7 +83,7 @@ export interface Job {
83
83
  readonly deduplicationReplace: boolean;
84
84
  readonly debounceId: string | null;
85
85
  readonly debounceTtl: number | null;
86
- /** Whether each generation bypasses the persistence write buffer. */
86
+ /** Whether SQLite admission bypasses its write buffer; PostgreSQL is always transactional. */
87
87
  readonly durable?: boolean;
88
88
  timeline: JobTimelineEntry[];
89
89
  }
@@ -7,6 +7,8 @@
7
7
  */
8
8
  import { cloudLog } from './logger';
9
9
  import { COMMANDS } from './commands';
10
+ import { resolveCloudQueueAdapter } from './queueAdapter/registry';
11
+ import { sanitizeServerError } from '../server/errors';
10
12
  /**
11
13
  * Normalize object keys: PascalCase/UpperCase → camelCase.
12
14
  * Skips user data fields (data, result, backoffConfig, repeat) — those are passed as-is.
@@ -51,7 +53,7 @@ export async function handleCommand(queueManager, cmd, context) {
51
53
  type: 'command_result',
52
54
  id: cmd.id,
53
55
  success: false,
54
- error: err instanceof Error ? err.message : String(err),
56
+ error: sanitizeServerError(err),
55
57
  };
56
58
  }
57
59
  }
@@ -66,7 +68,7 @@ export async function handleCommand(queueManager, cmd, context) {
66
68
  };
67
69
  }
68
70
  try {
69
- const raw = await handler(queueManager, cmd, context);
71
+ const raw = await handler(resolveCloudQueueAdapter(queueManager), cmd, context);
70
72
  const data = camelKeys(raw);
71
73
  cloudLog.info('Remote command executed', { action: cmd.action, id: cmd.id });
72
74
  return { type: 'command_result', id: cmd.id, success: true, data };
@@ -81,7 +83,7 @@ export async function handleCommand(queueManager, cmd, context) {
81
83
  type: 'command_result',
82
84
  id: cmd.id,
83
85
  success: false,
84
- error: err instanceof Error ? err.message : String(err),
86
+ error: sanitizeServerError(err),
85
87
  };
86
88
  }
87
89
  }
@@ -1,7 +1,7 @@
1
1
  export const INTEGRATION_COMMANDS = {
2
- 'cron:upsert': (queueManager, command) => {
3
- queueManager.removeCron(command.name ?? '');
4
- const cron = queueManager.addCron({
2
+ 'cron:upsert': async (adapter, command) => {
3
+ await adapter.removeCron(command.name ?? '');
4
+ const cron = await adapter.addCron({
5
5
  name: command.name ?? '',
6
6
  jobName: 'default',
7
7
  queue: command.queue ?? '',
@@ -10,18 +10,18 @@ export const INTEGRATION_COMMANDS = {
10
10
  });
11
11
  return { name: cron.name, nextRun: cron.nextRun };
12
12
  },
13
- 'cron:delete': (queueManager, command) => ({
14
- deleted: queueManager.removeCron(command.name ?? ''),
13
+ 'cron:delete': async (adapter, command) => ({
14
+ deleted: await adapter.removeCron(command.name ?? ''),
15
15
  }),
16
- 'webhook:add': (queueManager, command) => {
17
- const webhook = queueManager.webhookManager.add(command.url ?? '', command.events ?? [], command.queue ?? undefined, command.secret ?? undefined);
16
+ 'webhook:add': (adapter, command) => {
17
+ const webhook = adapter.manager.webhookManager.add(command.url ?? '', command.events ?? [], command.queue ?? undefined, command.secret ?? undefined);
18
18
  return { id: webhook.id, url: webhook.url, events: webhook.events };
19
19
  },
20
- 'webhook:remove': (queueManager, command) => ({
21
- removed: queueManager.webhookManager.remove(command.webhookId ?? ''),
20
+ 'webhook:remove': (adapter, command) => ({
21
+ removed: adapter.manager.webhookManager.remove(command.webhookId ?? ''),
22
22
  }),
23
- 'webhook:set-enabled': (queueManager, command) => ({
24
- updated: queueManager.webhookManager.setEnabled(command.webhookId ?? '', command.enabled ?? true),
23
+ 'webhook:set-enabled': (adapter, command) => ({
24
+ updated: adapter.manager.webhookManager.setEnabled(command.webhookId ?? '', command.enabled ?? true),
25
25
  }),
26
26
  's3:backup': async (_queueManager, _command, context) => {
27
27
  if (!context?.triggerBackup)