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
@@ -0,0 +1,149 @@
1
+ import { PostgresQueueManagerControl } from './control';
2
+ /** Durable PostgreSQL-backed broker services shared across every broker instance. */
3
+ export class PostgresQueueManagerServices extends PostgresQueueManagerControl {
4
+ registerWorker(name, queues, concurrency, options) {
5
+ return this.operations.runSync(() => {
6
+ const worker = super.registerWorker(name, queues, concurrency, options);
7
+ this.enqueueWrite(() => this.postgresStore.saveWorker(worker));
8
+ return worker;
9
+ });
10
+ }
11
+ async registerWorkerDurable(name, queues, concurrency, options) {
12
+ return await this.runPostgresOperation(async () => {
13
+ await this.postgresReady;
14
+ const worker = super.registerWorker(name, queues, concurrency, options);
15
+ try {
16
+ await this.postgresStore.saveWorker(worker);
17
+ return worker;
18
+ }
19
+ catch (error) {
20
+ super.unregisterWorker(worker.id);
21
+ throw error;
22
+ }
23
+ });
24
+ }
25
+ unregisterWorker(id) {
26
+ const admitted = this.operations.tryRunSync(() => {
27
+ const removed = super.unregisterWorker(id);
28
+ this.enqueueWrite(() => this.postgresStore.removeWorker(id).then(() => undefined));
29
+ return removed;
30
+ });
31
+ return admitted.accepted ? admitted.value : super.unregisterWorker(id);
32
+ }
33
+ async unregisterWorkerDurable(id, clientId) {
34
+ return await this.runPostgresOperation(async () => {
35
+ await this.postgresReady;
36
+ const removed = await this.postgresStore.removeWorker(id, clientId);
37
+ super.unregisterWorker(id);
38
+ return removed;
39
+ });
40
+ }
41
+ unregisterWorkersByClientId(clientId) {
42
+ const admitted = this.operations.tryRunSync(() => {
43
+ const removed = super.unregisterWorkersByClientId(clientId);
44
+ this.enqueueWrite(() => this.postgresStore.removeClientWorkers(clientId).then(() => undefined));
45
+ return removed;
46
+ });
47
+ return admitted.accepted ? admitted.value : super.unregisterWorkersByClientId(clientId);
48
+ }
49
+ async heartbeatWorkerDurable(id, stats, clientId) {
50
+ return await this.runPostgresOperation(async () => {
51
+ await this.postgresReady;
52
+ const updated = await this.postgresStore.heartbeatWorker(id, stats, clientId);
53
+ if (updated)
54
+ this.workerManager.heartbeat(id, stats);
55
+ return updated;
56
+ });
57
+ }
58
+ async listWorkersDurable() {
59
+ return await this.runPostgresOperation(async () => {
60
+ await this.postgresReady;
61
+ return await this.postgresStore.listWorkers();
62
+ });
63
+ }
64
+ async findMissingDependenciesDurable(ids) {
65
+ return await this.runPostgresOperation(async () => {
66
+ await this.postgresReady;
67
+ return await this.postgresStore.findMissingDependencies(ids);
68
+ });
69
+ }
70
+ addCron(input) {
71
+ return this.operations.runSync(() => {
72
+ const cron = this.cronScheduler.add(input);
73
+ this.enqueueWrite(async () => {
74
+ const stored = await this.postgresStore.addCron(input);
75
+ cron.executions = stored.executions;
76
+ cron.nextRun = stored.nextRun;
77
+ });
78
+ return cron;
79
+ });
80
+ }
81
+ async addCronDurable(input) {
82
+ return await this.runPostgresOperation(async () => {
83
+ await this.postgresReady;
84
+ const stored = await this.postgresStore.addCron(input);
85
+ const local = this.cronScheduler.add(input);
86
+ local.executions = stored.executions;
87
+ local.nextRun = stored.nextRun;
88
+ return stored;
89
+ });
90
+ }
91
+ removeCron(name) {
92
+ return this.operations.runSync(() => {
93
+ const removed = this.cronScheduler.remove(name);
94
+ this.enqueueWrite(() => this.postgresStore.removeCron(name).then(() => undefined));
95
+ return removed;
96
+ });
97
+ }
98
+ async removeCronDurable(name) {
99
+ return await this.runPostgresOperation(async () => {
100
+ await this.postgresReady;
101
+ const removed = await this.postgresStore.removeCron(name);
102
+ if (removed)
103
+ this.cronScheduler.remove(name);
104
+ return removed;
105
+ });
106
+ }
107
+ async getCronDurable(name) {
108
+ return await this.runPostgresOperation(async () => {
109
+ await this.postgresReady;
110
+ return await this.postgresStore.getCron(name);
111
+ });
112
+ }
113
+ async listCronsDurable() {
114
+ return await this.runPostgresOperation(async () => {
115
+ await this.postgresReady;
116
+ return await this.postgresStore.listCrons();
117
+ });
118
+ }
119
+ async addLogDurable(id, message, level = 'info') {
120
+ return await this.runPostgresOperation(async () => {
121
+ await this.postgresReady;
122
+ return await this.postgresStore.addLog(id, message, level);
123
+ });
124
+ }
125
+ async getLogsDurable(id) {
126
+ return await this.runPostgresOperation(async () => {
127
+ await this.postgresReady;
128
+ return await this.postgresStore.getLogs(id);
129
+ });
130
+ }
131
+ async clearLogsDurable(id, keepLogs) {
132
+ return await this.runPostgresOperation(async () => {
133
+ await this.postgresReady;
134
+ await this.postgresStore.clearLogs(id, keepLogs);
135
+ });
136
+ }
137
+ async getQueueMetricsDurable(queue, type, start = 0, end = -1) {
138
+ return await this.runPostgresOperation(async () => {
139
+ await this.postgresReady;
140
+ return await this.postgresStore.getQueueMetrics(queue, type, start, end);
141
+ });
142
+ }
143
+ async trimQueueEventsDurable(queue, maxLength) {
144
+ return await this.runPostgresOperation(async () => {
145
+ await this.postgresReady;
146
+ return await this.postgresStore.trimQueueEvents(queue, maxLength);
147
+ });
148
+ }
149
+ }
@@ -0,0 +1,51 @@
1
+ import type { DlqEntry, DlqFilter } from '../../domain/types/dlq';
2
+ import type { Job, JobId } from '../../domain/types/job';
3
+ import type { JobLocation } from '../../domain/types/queue';
4
+ import type { ClaimedPostgresJob, PostgresCompletionResult, PostgresCounts, PostgresJobState, PostgresQueueState, PostgresStoredJob, PostgresStoreEvent } from '../../infrastructure/persistence/postgres';
5
+ /** Eventually-consistent read model; PostgreSQL remains authoritative for every transition. */
6
+ export declare class PostgresQueueSnapshot {
7
+ private readonly maxCompletedJobs;
8
+ private readonly maxJobResults;
9
+ private readonly jobs;
10
+ private readonly results;
11
+ private readonly queues;
12
+ private readonly knownQueues;
13
+ private readonly completedOrder;
14
+ constructor(maxCompletedJobs: number, maxJobResults: number);
15
+ hydrate(rows: readonly PostgresStoredJob[]): void;
16
+ replaceQueue(queue: string, rows: readonly PostgresStoredJob[], state: PostgresQueueState, completions?: readonly PostgresCompletionResult[]): void;
17
+ removeQueue(queue: string): JobId[];
18
+ hydrateResults(entries: readonly PostgresCompletionResult[]): void;
19
+ put(row: PostgresStoredJob): void;
20
+ claim(claimed: ClaimedPostgresJob): void;
21
+ remove(id: JobId): void;
22
+ reconcile(id: JobId, row: PostgresStoredJob | null, completion: PostgresCompletionResult | null): void;
23
+ setQueueState(state: PostgresQueueState): void;
24
+ apply(event: PostgresStoreEvent): void;
25
+ get(id: JobId): PostgresStoredJob | null;
26
+ getResult(id: JobId): unknown;
27
+ hasResult(id: JobId): boolean;
28
+ locations(): Map<JobId, JobLocation>;
29
+ completedIds(): Set<JobId>;
30
+ completionIds(): Set<JobId>;
31
+ private putCompletion;
32
+ private putResult;
33
+ private removeQueueResults;
34
+ private trimCompletedJobs;
35
+ getByCustomId(customId: string): Job | null;
36
+ getByUniqueKey(queue: string, key: string): Job | null;
37
+ ids(queue: string, states?: readonly PostgresJobState[]): JobId[];
38
+ removeStates(queue: string, states: readonly PostgresJobState[]): number;
39
+ queueState(queue: string): PostgresQueueState | null;
40
+ queueNames(): string[];
41
+ list(queue: string, options?: {
42
+ state?: string | string[];
43
+ start?: number;
44
+ end?: number;
45
+ asc?: boolean;
46
+ }): Job[];
47
+ counts(queue?: string): PostgresCounts;
48
+ priorities(queue: string): Record<number, number>;
49
+ dlq(queue: string, filter?: DlqFilter): DlqEntry[];
50
+ size(): number;
51
+ }
@@ -0,0 +1,236 @@
1
+ import { processingShardIndex, shardIndex } from '../../shared/hash';
2
+ import { LRUMap } from '../../shared/lru';
3
+ import { countSnapshotJobs, countSnapshotPriorities, findSnapshotJob, listSnapshotDlq, listSnapshotJobs, snapshotJobIds, snapshotQueueNames, } from './snapshotViews';
4
+ /** Eventually-consistent read model; PostgreSQL remains authoritative for every transition. */
5
+ export class PostgresQueueSnapshot {
6
+ maxCompletedJobs;
7
+ maxJobResults;
8
+ jobs = new Map();
9
+ results;
10
+ queues = new Map();
11
+ knownQueues = new Set();
12
+ completedOrder = new Map();
13
+ constructor(maxCompletedJobs, maxJobResults) {
14
+ this.maxCompletedJobs = maxCompletedJobs;
15
+ this.maxJobResults = maxJobResults;
16
+ this.results = new LRUMap(maxJobResults);
17
+ }
18
+ hydrate(rows) {
19
+ this.jobs.clear();
20
+ this.completedOrder.clear();
21
+ this.knownQueues.clear();
22
+ for (const row of rows)
23
+ this.put(row);
24
+ }
25
+ replaceQueue(queue, rows, state, completions = []) {
26
+ for (const [id, row] of this.jobs) {
27
+ if (row.job.queue === queue)
28
+ this.remove(id);
29
+ }
30
+ this.removeQueueResults(queue);
31
+ for (const row of rows)
32
+ this.put(row);
33
+ for (const completion of completions)
34
+ this.putCompletion(completion);
35
+ this.queues.set(queue, state);
36
+ this.knownQueues.add(queue);
37
+ }
38
+ removeQueue(queue) {
39
+ const removed = [];
40
+ for (const [id, row] of this.jobs) {
41
+ if (row.job.queue !== queue)
42
+ continue;
43
+ this.remove(id);
44
+ removed.push(id);
45
+ }
46
+ this.removeQueueResults(queue);
47
+ this.queues.delete(queue);
48
+ this.knownQueues.delete(queue);
49
+ return removed;
50
+ }
51
+ hydrateResults(entries) {
52
+ this.results.clear();
53
+ for (const entry of entries)
54
+ this.putCompletion(entry);
55
+ }
56
+ put(row) {
57
+ this.knownQueues.add(row.job.queue);
58
+ this.completedOrder.delete(row.job.id);
59
+ this.jobs.set(row.job.id, row);
60
+ this.results.delete(row.job.id);
61
+ if (row.state === 'completed') {
62
+ this.putResult(row.job.id, row.job.queue, row.result);
63
+ this.completedOrder.set(row.job.id, true);
64
+ this.trimCompletedJobs();
65
+ }
66
+ }
67
+ claim(claimed) {
68
+ const current = this.jobs.get(claimed.job.id);
69
+ this.put({
70
+ job: claimed.job,
71
+ state: 'active',
72
+ result: current?.result,
73
+ error: null,
74
+ dlqEntry: null,
75
+ dlqRetryState: current?.dlqRetryState ?? null,
76
+ token: claimed.token,
77
+ leaseOwner: claimed.owner,
78
+ leaseBrokerId: claimed.brokerId,
79
+ leaseUntil: claimed.leaseUntil,
80
+ leaseRenewals: 0,
81
+ version: (current?.version ?? 0) + 1,
82
+ });
83
+ }
84
+ remove(id) {
85
+ this.jobs.delete(id);
86
+ this.completedOrder.delete(id);
87
+ this.results.delete(id);
88
+ }
89
+ reconcile(id, row, completion) {
90
+ if (row) {
91
+ this.put(row);
92
+ return;
93
+ }
94
+ this.remove(id);
95
+ if (completion)
96
+ this.putCompletion(completion);
97
+ }
98
+ setQueueState(state) {
99
+ this.queues.set(state.queue, state);
100
+ this.knownQueues.add(state.queue);
101
+ }
102
+ apply(event) {
103
+ if (event.removed || event.type === 'removed') {
104
+ this.remove(event.jobId);
105
+ if (event.type === 'completed' &&
106
+ event.state === 'completed' &&
107
+ Object.hasOwn(event, 'result')) {
108
+ this.putResult(event.jobId, event.queue, event.result);
109
+ }
110
+ return;
111
+ }
112
+ if (Object.hasOwn(event, 'result'))
113
+ this.putResult(event.jobId, event.queue, event.result);
114
+ if (!event.job || !event.state)
115
+ return;
116
+ const current = this.jobs.get(event.jobId);
117
+ this.put({
118
+ job: event.job,
119
+ state: event.state,
120
+ result: Object.hasOwn(event, 'result') ? event.result : current?.result,
121
+ error: event.error ?? current?.error ?? null,
122
+ dlqEntry: Object.hasOwn(event, 'dlqEntry')
123
+ ? (event.dlqEntry ?? null)
124
+ : (current?.dlqEntry ?? null),
125
+ dlqRetryState: Object.hasOwn(event, 'dlqRetryState')
126
+ ? (event.dlqRetryState ?? null)
127
+ : (current?.dlqRetryState ?? null),
128
+ token: event.state === 'active' ? (current?.token ?? null) : null,
129
+ leaseOwner: event.state === 'active' ? (current?.leaseOwner ?? null) : null,
130
+ leaseBrokerId: event.state === 'active' ? (current?.leaseBrokerId ?? null) : null,
131
+ leaseUntil: event.state === 'active' ? (current?.leaseUntil ?? null) : null,
132
+ leaseRenewals: event.state === 'active' ? (current?.leaseRenewals ?? 0) : 0,
133
+ version: (current?.version ?? 0) + 1,
134
+ });
135
+ }
136
+ get(id) {
137
+ return this.jobs.get(id) ?? null;
138
+ }
139
+ getResult(id) {
140
+ return this.results.get(id)?.result;
141
+ }
142
+ hasResult(id) {
143
+ return this.results.has(id);
144
+ }
145
+ locations() {
146
+ const locations = new Map();
147
+ for (const [id, row] of this.jobs) {
148
+ if (row.state === 'active') {
149
+ locations.set(id, { type: 'processing', shardIdx: processingShardIndex(id) });
150
+ }
151
+ else if (row.state === 'completed') {
152
+ locations.set(id, { type: 'completed', queueName: row.job.queue });
153
+ }
154
+ else if (row.state === 'failed') {
155
+ locations.set(id, { type: 'dlq', queueName: row.job.queue });
156
+ }
157
+ else {
158
+ locations.set(id, {
159
+ type: 'queue',
160
+ shardIdx: shardIndex(row.job.queue),
161
+ queueName: row.job.queue,
162
+ });
163
+ }
164
+ }
165
+ return locations;
166
+ }
167
+ completedIds() {
168
+ return new Set([...this.jobs.values()].flatMap((row) => (row.state === 'completed' ? [row.job.id] : [])));
169
+ }
170
+ completionIds() {
171
+ return new Set([...this.completedIds(), ...this.results.keys()]);
172
+ }
173
+ putCompletion(entry) {
174
+ this.putResult(entry.jobId, entry.queue, entry.result);
175
+ }
176
+ putResult(id, queue, result) {
177
+ if (this.maxJobResults === 0)
178
+ return;
179
+ this.results.set(id, { queue, result });
180
+ }
181
+ removeQueueResults(queue) {
182
+ for (const [id, entry] of this.results) {
183
+ if (entry.queue === queue)
184
+ this.results.delete(id);
185
+ }
186
+ }
187
+ trimCompletedJobs() {
188
+ while (this.completedOrder.size > this.maxCompletedJobs) {
189
+ const oldest = this.completedOrder.keys().next().value;
190
+ if (oldest === undefined)
191
+ return;
192
+ this.completedOrder.delete(oldest);
193
+ this.jobs.delete(oldest);
194
+ }
195
+ }
196
+ getByCustomId(customId) {
197
+ return findSnapshotJob(this.jobs, (job) => job.customId === customId);
198
+ }
199
+ getByUniqueKey(queue, key) {
200
+ return findSnapshotJob(this.jobs, (job) => job.queue === queue && job.uniqueKey === key);
201
+ }
202
+ ids(queue, states) {
203
+ return snapshotJobIds(this.jobs, queue, states);
204
+ }
205
+ removeStates(queue, states) {
206
+ let count = 0;
207
+ for (const [id, row] of this.jobs) {
208
+ if (row.job.queue !== queue || !states.includes(row.state))
209
+ continue;
210
+ this.remove(id);
211
+ count++;
212
+ }
213
+ return count;
214
+ }
215
+ queueState(queue) {
216
+ return this.queues.get(queue) ?? null;
217
+ }
218
+ queueNames() {
219
+ return snapshotQueueNames(this.jobs, this.queues, this.knownQueues);
220
+ }
221
+ list(queue, options = {}) {
222
+ return listSnapshotJobs(this.jobs, this.queues, queue, options);
223
+ }
224
+ counts(queue) {
225
+ return countSnapshotJobs(this.jobs, queue);
226
+ }
227
+ priorities(queue) {
228
+ return countSnapshotPriorities(this.jobs, queue);
229
+ }
230
+ dlq(queue, filter) {
231
+ return listSnapshotDlq(this.jobs, queue, filter);
232
+ }
233
+ size() {
234
+ return this.jobs.size;
235
+ }
236
+ }
@@ -0,0 +1,15 @@
1
+ import type { DlqEntry, DlqFilter } from '../../domain/types/dlq';
2
+ import type { Job, JobId } from '../../domain/types/job';
3
+ import type { PostgresCounts, PostgresJobState, PostgresQueueState, PostgresStoredJob } from '../../infrastructure/persistence/postgres';
4
+ export declare function findSnapshotJob(jobs: ReadonlyMap<JobId, PostgresStoredJob>, predicate: (job: Job) => boolean): Job | null;
5
+ export declare function snapshotJobIds(jobs: ReadonlyMap<JobId, PostgresStoredJob>, queue: string, states?: readonly PostgresJobState[]): JobId[];
6
+ export declare function snapshotQueueNames(jobs: ReadonlyMap<JobId, PostgresStoredJob>, queues: ReadonlyMap<string, PostgresQueueState>, knownQueues?: ReadonlySet<string>): string[];
7
+ export declare function listSnapshotJobs(jobs: ReadonlyMap<JobId, PostgresStoredJob>, queues: ReadonlyMap<string, PostgresQueueState>, queue: string, options: {
8
+ state?: string | string[];
9
+ start?: number;
10
+ end?: number;
11
+ asc?: boolean;
12
+ }): Job[];
13
+ export declare function countSnapshotJobs(jobs: ReadonlyMap<JobId, PostgresStoredJob>, queue?: string): PostgresCounts;
14
+ export declare function countSnapshotPriorities(jobs: ReadonlyMap<JobId, PostgresStoredJob>, queue: string): Record<number, number>;
15
+ export declare function listSnapshotDlq(jobs: ReadonlyMap<JobId, PostgresStoredJob>, queue: string, filter?: DlqFilter): DlqEntry[];
@@ -0,0 +1,100 @@
1
+ const EMPTY_COUNTS = {
2
+ waiting: 0,
3
+ prioritized: 0,
4
+ delayed: 0,
5
+ active: 0,
6
+ completed: 0,
7
+ failed: 0,
8
+ waitingChildren: 0,
9
+ };
10
+ function stateMatches(state, requested, paused) {
11
+ if (!requested)
12
+ return true;
13
+ if (requested.includes('paused') && paused) {
14
+ if (state === 'waiting' || state === 'prioritized')
15
+ return true;
16
+ }
17
+ if (paused && (state === 'waiting' || state === 'prioritized'))
18
+ return false;
19
+ return requested.includes(state);
20
+ }
21
+ function compareIds(left, right) {
22
+ return left < right ? -1 : left > right ? 1 : 0;
23
+ }
24
+ export function findSnapshotJob(jobs, predicate) {
25
+ for (const row of jobs.values())
26
+ if (predicate(row.job))
27
+ return row.job;
28
+ return null;
29
+ }
30
+ export function snapshotJobIds(jobs, queue, states) {
31
+ return [...jobs.values()].flatMap((row) => row.job.queue === queue && (!states || states.includes(row.state)) ? [row.job.id] : []);
32
+ }
33
+ export function snapshotQueueNames(jobs, queues, knownQueues = new Set()) {
34
+ const names = new Set([...knownQueues, ...queues.keys()]);
35
+ for (const row of jobs.values())
36
+ names.add(row.job.queue);
37
+ return [...names].sort();
38
+ }
39
+ export function listSnapshotJobs(jobs, queues, queue, options) {
40
+ const requested = options.state === undefined || (Array.isArray(options.state) && options.state.length === 0)
41
+ ? null
42
+ : Array.isArray(options.state)
43
+ ? options.state
44
+ : [options.state];
45
+ const paused = queues.get(queue)?.paused ?? false;
46
+ const rows = [...jobs.values()].filter((row) => row.job.queue === queue && stateMatches(row.state, requested, paused));
47
+ const asc = options.asc ?? true;
48
+ rows.sort((left, right) => {
49
+ const created = left.job.createdAt - right.job.createdAt;
50
+ if (created !== 0)
51
+ return asc ? created : -created;
52
+ return asc
53
+ ? compareIds(String(left.job.id), String(right.job.id))
54
+ : compareIds(String(right.job.id), String(left.job.id));
55
+ });
56
+ const start = Math.max(0, options.start ?? 0);
57
+ const end = Math.max(start, options.end ?? 100);
58
+ return rows.slice(start, end).map((row) => row.job);
59
+ }
60
+ export function countSnapshotJobs(jobs, queue) {
61
+ const counts = { ...EMPTY_COUNTS };
62
+ for (const row of jobs.values()) {
63
+ if (queue && row.job.queue !== queue)
64
+ continue;
65
+ if (row.state === 'waiting-children')
66
+ counts.waitingChildren++;
67
+ else
68
+ counts[row.state]++;
69
+ }
70
+ return counts;
71
+ }
72
+ export function countSnapshotPriorities(jobs, queue) {
73
+ const counts = {};
74
+ for (const row of jobs.values()) {
75
+ if (row.job.queue !== queue || !['waiting', 'prioritized', 'delayed'].includes(row.state)) {
76
+ continue;
77
+ }
78
+ counts[row.job.priority] = (counts[row.job.priority] ?? 0) + 1;
79
+ }
80
+ return counts;
81
+ }
82
+ export function listSnapshotDlq(jobs, queue, filter) {
83
+ const now = Date.now();
84
+ let entries = [...jobs.values()].flatMap((row) => row.job.queue === queue && row.state === 'failed' && row.dlqEntry ? [row.dlqEntry] : []);
85
+ if (filter?.reason)
86
+ entries = entries.filter((entry) => entry.reason === filter.reason);
87
+ const olderThan = filter?.olderThan;
88
+ const newerThan = filter?.newerThan;
89
+ if (olderThan)
90
+ entries = entries.filter((entry) => entry.enteredAt < olderThan);
91
+ if (newerThan)
92
+ entries = entries.filter((entry) => entry.enteredAt > newerThan);
93
+ if (filter?.expired !== undefined) {
94
+ entries = entries.filter((entry) => (entry.expiresAt !== null && entry.expiresAt <= now) === filter.expired);
95
+ }
96
+ const offset = Math.max(0, filter?.offset ?? 0);
97
+ return entries
98
+ .sort((left, right) => right.enteredAt - left.enteredAt || compareIds(String(right.job.id), String(left.job.id)))
99
+ .slice(offset, offset + Math.max(0, filter?.limit ?? entries.length));
100
+ }
@@ -0,0 +1,12 @@
1
+ import type { PostgresDeliveredStoreEvent } from '../../infrastructure/persistence/postgres';
2
+ /** Bounded capture used to reconcile events with an in-flight authoritative snapshot. */
3
+ export declare class PostgresStartupEventBuffer {
4
+ private readonly limit;
5
+ private readonly events;
6
+ private didOverflow;
7
+ constructor(limit?: number);
8
+ get overflowed(): boolean;
9
+ capture(event: PostgresDeliveredStoreEvent): void;
10
+ reset(): void;
11
+ take(): readonly PostgresDeliveredStoreEvent[] | null;
12
+ }
@@ -0,0 +1,36 @@
1
+ const DEFAULT_STARTUP_EVENT_LIMIT = 256;
2
+ /** Bounded capture used to reconcile events with an in-flight authoritative snapshot. */
3
+ export class PostgresStartupEventBuffer {
4
+ limit;
5
+ events = [];
6
+ didOverflow = false;
7
+ constructor(limit = DEFAULT_STARTUP_EVENT_LIMIT) {
8
+ this.limit = limit;
9
+ if (!Number.isSafeInteger(limit) || limit < 1) {
10
+ throw new RangeError('PostgreSQL startup event buffer limit must be a positive integer');
11
+ }
12
+ }
13
+ get overflowed() {
14
+ return this.didOverflow;
15
+ }
16
+ capture(event) {
17
+ if (this.didOverflow)
18
+ return;
19
+ if (this.events.length === this.limit) {
20
+ this.didOverflow = true;
21
+ this.events.length = 0;
22
+ return;
23
+ }
24
+ this.events.push(event);
25
+ }
26
+ reset() {
27
+ this.events.length = 0;
28
+ this.didOverflow = false;
29
+ }
30
+ take() {
31
+ if (this.didOverflow)
32
+ return null;
33
+ const captured = this.events.splice(0);
34
+ return captured;
35
+ }
36
+ }
@@ -0,0 +1,47 @@
1
+ import type { JobId } from '../../domain/types/job';
2
+ import { PostgresQueueStore, type PostgresStoredJob } from '../../infrastructure/persistence/postgres';
3
+ import { QueueManager } from '../queueManager';
4
+ import type { PostgresQueueManagerConfig } from './config';
5
+ import { PostgresQueueSnapshot } from './snapshot';
6
+ import { PostgresOperationGate } from './operationGate';
7
+ export declare abstract class PostgresQueueManagerState extends QueueManager {
8
+ protected readonly postgresStore: PostgresQueueStore;
9
+ protected readonly postgresSnapshot: PostgresQueueSnapshot;
10
+ protected readonly activeTokens: Map<JobId, string>;
11
+ protected readonly postgresReady: Promise<void>;
12
+ private readonly refreshes;
13
+ private readonly dirtyQueues;
14
+ private readonly queueEventVersions;
15
+ private snapshotEventBuffer;
16
+ private terminalMetricBaselineCommitSeq;
17
+ private readonly unsubscribeEvent;
18
+ private readonly unsubscribeInvalidation;
19
+ private readonly writes;
20
+ protected readonly operations: PostgresOperationGate;
21
+ private readonly projectionRefreshes;
22
+ private shutdownPromise;
23
+ private shutdownComplete;
24
+ private baseStopped;
25
+ private stopQueueRefreshes;
26
+ constructor(config: PostgresQueueManagerConfig);
27
+ waitUntilReady(): Promise<void>;
28
+ flushPostgresWrites(): Promise<void>;
29
+ shutdownPostgres(): Promise<void>;
30
+ shutdown(): void;
31
+ private performPostgresShutdown;
32
+ protected tokenFor(id: JobId, token?: string): string | null;
33
+ protected forgetToken(id: JobId): void;
34
+ protected runPostgresOperation<T>(operation: () => Promise<T>): Promise<T>;
35
+ protected refreshJob(id: JobId, queue?: string): Promise<void>;
36
+ protected fetchPostgresJob(id: JobId): Promise<PostgresStoredJob | null>;
37
+ protected refreshJobs(ids: readonly JobId[], queue?: string): Promise<void>;
38
+ protected refreshQueue(queue: string): Promise<boolean>;
39
+ protected refreshQueueAfterCommit(queue: string): Promise<void>;
40
+ protected enqueueWrite(operation: () => Promise<void>): void;
41
+ private initializePostgres;
42
+ private scheduleQueueRefresh;
43
+ private refreshDirtyQueue;
44
+ private onStoreEvent;
45
+ protected applyPostgresClaim(claim: Parameters<PostgresQueueSnapshot['claim']>[0]): void;
46
+ private stopBaseRuntime;
47
+ }