bunqueue 2.8.60 → 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 (324) hide show
  1. package/README.md +108 -76
  2. package/dist/application/background/dlq.js +2 -0
  3. package/dist/application/contextFactory.js +5 -0
  4. package/dist/application/dlqManager.d.ts +10 -0
  5. package/dist/application/dlqManager.js +47 -9
  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/operations/jobManagement.d.ts +4 -0
  10. package/dist/application/operations/jobMoveOperations.js +9 -4
  11. package/dist/application/postgres-queue-manager/batchSnapshot.d.ts +16 -0
  12. package/dist/application/postgres-queue-manager/batchSnapshot.js +17 -0
  13. package/dist/application/postgres-queue-manager/cloud.d.ts +30 -0
  14. package/dist/application/postgres-queue-manager/cloud.js +55 -0
  15. package/dist/application/postgres-queue-manager/config.d.ts +5 -0
  16. package/dist/application/postgres-queue-manager/config.js +1 -0
  17. package/dist/application/postgres-queue-manager/control.d.ts +26 -0
  18. package/dist/application/postgres-queue-manager/control.js +186 -0
  19. package/dist/application/postgres-queue-manager/deferredWrites.d.ts +13 -0
  20. package/dist/application/postgres-queue-manager/deferredWrites.js +60 -0
  21. package/dist/application/postgres-queue-manager/delivery.d.ts +19 -0
  22. package/dist/application/postgres-queue-manager/delivery.js +80 -0
  23. package/dist/application/postgres-queue-manager/lease.d.ts +13 -0
  24. package/dist/application/postgres-queue-manager/lease.js +88 -0
  25. package/dist/application/postgres-queue-manager/lifetimeMetrics.d.ts +32 -0
  26. package/dist/application/postgres-queue-manager/lifetimeMetrics.js +53 -0
  27. package/dist/application/postgres-queue-manager/maintenance.d.ts +14 -0
  28. package/dist/application/postgres-queue-manager/maintenance.js +100 -0
  29. package/dist/application/postgres-queue-manager/operationGate.d.ts +26 -0
  30. package/dist/application/postgres-queue-manager/operationGate.js +96 -0
  31. package/dist/application/postgres-queue-manager/operations.d.ts +25 -0
  32. package/dist/application/postgres-queue-manager/operations.js +194 -0
  33. package/dist/application/postgres-queue-manager/projectionRefreshes.d.ts +43 -0
  34. package/dist/application/postgres-queue-manager/projectionRefreshes.js +170 -0
  35. package/dist/application/postgres-queue-manager/queries.d.ts +142 -0
  36. package/dist/application/postgres-queue-manager/queries.js +231 -0
  37. package/dist/application/postgres-queue-manager/relationships.d.ts +10 -0
  38. package/dist/application/postgres-queue-manager/relationships.js +45 -0
  39. package/dist/application/postgres-queue-manager/services.d.ts +31 -0
  40. package/dist/application/postgres-queue-manager/services.js +149 -0
  41. package/dist/application/postgres-queue-manager/snapshot.d.ts +51 -0
  42. package/dist/application/postgres-queue-manager/snapshot.js +236 -0
  43. package/dist/application/postgres-queue-manager/snapshotViews.d.ts +15 -0
  44. package/dist/application/postgres-queue-manager/snapshotViews.js +100 -0
  45. package/dist/application/postgres-queue-manager/startupEventBuffer.d.ts +12 -0
  46. package/dist/application/postgres-queue-manager/startupEventBuffer.js +36 -0
  47. package/dist/application/postgres-queue-manager/state.d.ts +47 -0
  48. package/dist/application/postgres-queue-manager/state.js +273 -0
  49. package/dist/application/postgres-queue-manager/terminalDelivery.d.ts +20 -0
  50. package/dist/application/postgres-queue-manager/terminalDelivery.js +100 -0
  51. package/dist/application/postgresQueueManager.d.ts +2 -0
  52. package/dist/application/postgresQueueManager.js +1 -0
  53. package/dist/application/queue-manager/flow-failures.js +4 -0
  54. package/dist/application/queue-manager/limits.d.ts +2 -0
  55. package/dist/application/queue-manager/limits.js +4 -0
  56. package/dist/application/queue-manager/observability.js +15 -3
  57. package/dist/application/queue-manager/queries.d.ts +7 -0
  58. package/dist/application/queue-manager/queries.js +9 -0
  59. package/dist/application/queue-manager/services.d.ts +1 -1
  60. package/dist/application/queue-manager/services.js +4 -2
  61. package/dist/application/queue-manager/state.js +16 -1
  62. package/dist/cli/commands/server.js +1 -1
  63. package/dist/client/forwarder.d.ts +6 -4
  64. package/dist/client/forwarder.js +5 -3
  65. package/dist/client/queue/dlq.d.ts +2 -0
  66. package/dist/client/queue/dlq.js +14 -0
  67. package/dist/client/queue/dlqOps.d.ts +2 -0
  68. package/dist/client/queue/dlqOps.js +4 -0
  69. package/dist/client/queue/helpers.js +2 -0
  70. package/dist/client/queue/runtime/configuration.d.ts +4 -0
  71. package/dist/client/queue/runtime/configuration.js +8 -0
  72. package/dist/client/worker/runtime/execution.js +3 -8
  73. package/dist/client/worker/runtime/polling.d.ts +1 -0
  74. package/dist/client/worker/runtime/polling.js +9 -0
  75. package/dist/config/resolve.d.ts +14 -0
  76. package/dist/config/resolve.js +50 -5
  77. package/dist/config/types.d.ts +18 -0
  78. package/dist/domain/queue/dlqShard.d.ts +2 -0
  79. package/dist/domain/queue/dlqShard.js +16 -0
  80. package/dist/domain/queue/shard/dlq.d.ts +1 -0
  81. package/dist/domain/queue/shard/dlq.js +3 -0
  82. package/dist/domain/types/commands/dlq.d.ts +5 -0
  83. package/dist/domain/types/commands/union.d.ts +1 -1
  84. package/dist/domain/types/cron.d.ts +5 -0
  85. package/dist/domain/types/cron.js +14 -3
  86. package/dist/domain/types/dlq.d.ts +1 -1
  87. package/dist/domain/types/dlq.js +1 -2
  88. package/dist/domain/types/jobs/model.d.ts +1 -1
  89. package/dist/infrastructure/cloud/commandHandler.js +5 -3
  90. package/dist/infrastructure/cloud/commands/integrations.js +11 -11
  91. package/dist/infrastructure/cloud/commands/jobs.js +48 -40
  92. package/dist/infrastructure/cloud/commands/queues.js +61 -75
  93. package/dist/infrastructure/cloud/queueAdapter/local.d.ts +41 -0
  94. package/dist/infrastructure/cloud/queueAdapter/local.js +187 -0
  95. package/dist/infrastructure/cloud/queueAdapter/postgres.d.ts +42 -0
  96. package/dist/infrastructure/cloud/queueAdapter/postgres.js +188 -0
  97. package/dist/infrastructure/cloud/queueAdapter/registry.d.ts +4 -0
  98. package/dist/infrastructure/cloud/queueAdapter/registry.js +15 -0
  99. package/dist/infrastructure/cloud/queueAdapter/types.d.ts +87 -0
  100. package/dist/infrastructure/cloud/queueAdapter/types.js +1 -0
  101. package/dist/infrastructure/cloud/snapshot/analytics.d.ts +2 -0
  102. package/dist/infrastructure/cloud/snapshot/analytics.js +7 -0
  103. package/dist/infrastructure/cloud/snapshot/collector.d.ts +4 -0
  104. package/dist/infrastructure/cloud/snapshot/collector.js +39 -1
  105. package/dist/infrastructure/cloud/snapshot/config.d.ts +3 -0
  106. package/dist/infrastructure/cloud/snapshot/config.js +43 -0
  107. package/dist/infrastructure/cloud/snapshot/jobs.d.ts +3 -0
  108. package/dist/infrastructure/cloud/snapshot/jobs.js +32 -1
  109. package/dist/infrastructure/cloud/snapshotCollector.js +20 -35
  110. package/dist/infrastructure/cloud/snapshotHelpers.d.ts +3 -3
  111. package/dist/infrastructure/cloud/snapshotHelpers.js +3 -3
  112. package/dist/infrastructure/cloud/statsRefresh.js +2 -1
  113. package/dist/infrastructure/cloud/types/command.d.ts +2 -2
  114. package/dist/infrastructure/persistence/postgres/admission.d.ts +18 -0
  115. package/dist/infrastructure/persistence/postgres/admission.js +193 -0
  116. package/dist/infrastructure/persistence/postgres/admissionParent.d.ts +5 -0
  117. package/dist/infrastructure/persistence/postgres/admissionParent.js +35 -0
  118. package/dist/infrastructure/persistence/postgres/admissionResult.d.ts +9 -0
  119. package/dist/infrastructure/persistence/postgres/admissionResult.js +1 -0
  120. package/dist/infrastructure/persistence/postgres/admissionStore.d.ts +12 -0
  121. package/dist/infrastructure/persistence/postgres/admissionStore.js +101 -0
  122. package/dist/infrastructure/persistence/postgres/advisoryLocks.d.ts +2 -0
  123. package/dist/infrastructure/persistence/postgres/advisoryLocks.js +13 -0
  124. package/dist/infrastructure/persistence/postgres/batchAdmission.d.ts +11 -0
  125. package/dist/infrastructure/persistence/postgres/batchAdmission.js +110 -0
  126. package/dist/infrastructure/persistence/postgres/batchCompletion.d.ts +4 -0
  127. package/dist/infrastructure/persistence/postgres/batchCompletion.js +174 -0
  128. package/dist/infrastructure/persistence/postgres/batchEvents.d.ts +14 -0
  129. package/dist/infrastructure/persistence/postgres/batchEvents.js +72 -0
  130. package/dist/infrastructure/persistence/postgres/brokerSessions.d.ts +14 -0
  131. package/dist/infrastructure/persistence/postgres/brokerSessions.js +94 -0
  132. package/dist/infrastructure/persistence/postgres/claimBatch.d.ts +11 -0
  133. package/dist/infrastructure/persistence/postgres/claimBatch.js +56 -0
  134. package/dist/infrastructure/persistence/postgres/claimSelection.d.ts +4 -0
  135. package/dist/infrastructure/persistence/postgres/claimSelection.js +198 -0
  136. package/dist/infrastructure/persistence/postgres/claims.d.ts +3 -0
  137. package/dist/infrastructure/persistence/postgres/claims.js +137 -0
  138. package/dist/infrastructure/persistence/postgres/cloudReadModel.d.ts +26 -0
  139. package/dist/infrastructure/persistence/postgres/cloudReadModel.js +123 -0
  140. package/dist/infrastructure/persistence/postgres/codec.d.ts +30 -0
  141. package/dist/infrastructure/persistence/postgres/codec.js +82 -0
  142. package/dist/infrastructure/persistence/postgres/completionEvents.d.ts +11 -0
  143. package/dist/infrastructure/persistence/postgres/completionEvents.js +21 -0
  144. package/dist/infrastructure/persistence/postgres/completionLifecycle.d.ts +11 -0
  145. package/dist/infrastructure/persistence/postgres/completionLifecycle.js +145 -0
  146. package/dist/infrastructure/persistence/postgres/completionOutcome.d.ts +4 -0
  147. package/dist/infrastructure/persistence/postgres/completionOutcome.js +112 -0
  148. package/dist/infrastructure/persistence/postgres/completionQueries.d.ts +10 -0
  149. package/dist/infrastructure/persistence/postgres/completionQueries.js +87 -0
  150. package/dist/infrastructure/persistence/postgres/connection.d.ts +3 -0
  151. package/dist/infrastructure/persistence/postgres/connection.js +15 -0
  152. package/dist/infrastructure/persistence/postgres/context.d.ts +28 -0
  153. package/dist/infrastructure/persistence/postgres/context.js +74 -0
  154. package/dist/infrastructure/persistence/postgres/control.d.ts +23 -0
  155. package/dist/infrastructure/persistence/postgres/control.js +105 -0
  156. package/dist/infrastructure/persistence/postgres/crons.d.ts +18 -0
  157. package/dist/infrastructure/persistence/postgres/crons.js +205 -0
  158. package/dist/infrastructure/persistence/postgres/deduplication.d.ts +9 -0
  159. package/dist/infrastructure/persistence/postgres/deduplication.js +47 -0
  160. package/dist/infrastructure/persistence/postgres/dependencyDestruction.d.ts +14 -0
  161. package/dist/infrastructure/persistence/postgres/dependencyDestruction.js +74 -0
  162. package/dist/infrastructure/persistence/postgres/dependencyPromotion.d.ts +29 -0
  163. package/dist/infrastructure/persistence/postgres/dependencyPromotion.js +212 -0
  164. package/dist/infrastructure/persistence/postgres/destructiveMutations.d.ts +4 -0
  165. package/dist/infrastructure/persistence/postgres/destructiveMutations.js +111 -0
  166. package/dist/infrastructure/persistence/postgres/dlqLifecycle.d.ts +13 -0
  167. package/dist/infrastructure/persistence/postgres/dlqLifecycle.js +184 -0
  168. package/dist/infrastructure/persistence/postgres/dlqMaintenance.d.ts +6 -0
  169. package/dist/infrastructure/persistence/postgres/dlqMaintenance.js +36 -0
  170. package/dist/infrastructure/persistence/postgres/dlqRetryPlan.d.ts +21 -0
  171. package/dist/infrastructure/persistence/postgres/dlqRetryPlan.js +92 -0
  172. package/dist/infrastructure/persistence/postgres/eventCommitGc.d.ts +27 -0
  173. package/dist/infrastructure/persistence/postgres/eventCommitGc.js +62 -0
  174. package/dist/infrastructure/persistence/postgres/eventJournal.d.ts +18 -0
  175. package/dist/infrastructure/persistence/postgres/eventJournal.js +76 -0
  176. package/dist/infrastructure/persistence/postgres/eventJournalSchema.d.ts +5 -0
  177. package/dist/infrastructure/persistence/postgres/eventJournalSchema.js +253 -0
  178. package/dist/infrastructure/persistence/postgres/eventPruneWatermarks.d.ts +24 -0
  179. package/dist/infrastructure/persistence/postgres/eventPruneWatermarks.js +111 -0
  180. package/dist/infrastructure/persistence/postgres/eventRetention.d.ts +18 -0
  181. package/dist/infrastructure/persistence/postgres/eventRetention.js +76 -0
  182. package/dist/infrastructure/persistence/postgres/events.d.ts +45 -0
  183. package/dist/infrastructure/persistence/postgres/events.js +249 -0
  184. package/dist/infrastructure/persistence/postgres/expiry.d.ts +3 -0
  185. package/dist/infrastructure/persistence/postgres/expiry.js +74 -0
  186. package/dist/infrastructure/persistence/postgres/flowFailures.d.ts +17 -0
  187. package/dist/infrastructure/persistence/postgres/flowFailures.js +199 -0
  188. package/dist/infrastructure/persistence/postgres/jobData.d.ts +3 -0
  189. package/dist/infrastructure/persistence/postgres/jobData.js +32 -0
  190. package/dist/infrastructure/persistence/postgres/leaseRelease.d.ts +9 -0
  191. package/dist/infrastructure/persistence/postgres/leaseRelease.js +120 -0
  192. package/dist/infrastructure/persistence/postgres/leaseRenewal.d.ts +4 -0
  193. package/dist/infrastructure/persistence/postgres/leaseRenewal.js +35 -0
  194. package/dist/infrastructure/persistence/postgres/lifetimeMetrics.d.ts +15 -0
  195. package/dist/infrastructure/persistence/postgres/lifetimeMetrics.js +46 -0
  196. package/dist/infrastructure/persistence/postgres/lifetimeMetricsFinalizer.d.ts +4 -0
  197. package/dist/infrastructure/persistence/postgres/lifetimeMetricsFinalizer.js +13 -0
  198. package/dist/infrastructure/persistence/postgres/logs.d.ts +6 -0
  199. package/dist/infrastructure/persistence/postgres/logs.js +70 -0
  200. package/dist/infrastructure/persistence/postgres/maintenance.d.ts +6 -0
  201. package/dist/infrastructure/persistence/postgres/maintenance.js +138 -0
  202. package/dist/infrastructure/persistence/postgres/maintenanceFlights.d.ts +14 -0
  203. package/dist/infrastructure/persistence/postgres/maintenanceFlights.js +66 -0
  204. package/dist/infrastructure/persistence/postgres/metricWrites.d.ts +9 -0
  205. package/dist/infrastructure/persistence/postgres/metricWrites.js +94 -0
  206. package/dist/infrastructure/persistence/postgres/mutations.d.ts +9 -0
  207. package/dist/infrastructure/persistence/postgres/mutations.js +171 -0
  208. package/dist/infrastructure/persistence/postgres/outcomes.d.ts +4 -0
  209. package/dist/infrastructure/persistence/postgres/outcomes.js +194 -0
  210. package/dist/infrastructure/persistence/postgres/policies.d.ts +11 -0
  211. package/dist/infrastructure/persistence/postgres/policies.js +18 -0
  212. package/dist/infrastructure/persistence/postgres/postCommitMaintenance.d.ts +17 -0
  213. package/dist/infrastructure/persistence/postgres/postCommitMaintenance.js +117 -0
  214. package/dist/infrastructure/persistence/postgres/promotion.d.ts +3 -0
  215. package/dist/infrastructure/persistence/postgres/promotion.js +43 -0
  216. package/dist/infrastructure/persistence/postgres/queries.d.ts +22 -0
  217. package/dist/infrastructure/persistence/postgres/queries.js +152 -0
  218. package/dist/infrastructure/persistence/postgres/queueDestruction.d.ts +3 -0
  219. package/dist/infrastructure/persistence/postgres/queueDestruction.js +154 -0
  220. package/dist/infrastructure/persistence/postgres/queueLifecycle.d.ts +10 -0
  221. package/dist/infrastructure/persistence/postgres/queueLifecycle.js +60 -0
  222. package/dist/infrastructure/persistence/postgres/rateLimit.d.ts +6 -0
  223. package/dist/infrastructure/persistence/postgres/rateLimit.js +10 -0
  224. package/dist/infrastructure/persistence/postgres/readModels.d.ts +32 -0
  225. package/dist/infrastructure/persistence/postgres/readModels.js +72 -0
  226. package/dist/infrastructure/persistence/postgres/recovery.d.ts +3 -0
  227. package/dist/infrastructure/persistence/postgres/recovery.js +178 -0
  228. package/dist/infrastructure/persistence/postgres/relationships.d.ts +9 -0
  229. package/dist/infrastructure/persistence/postgres/relationships.js +201 -0
  230. package/dist/infrastructure/persistence/postgres/removeUnprocessedChildren.d.ts +4 -0
  231. package/dist/infrastructure/persistence/postgres/removeUnprocessedChildren.js +241 -0
  232. package/dist/infrastructure/persistence/postgres/repeatMutations.d.ts +5 -0
  233. package/dist/infrastructure/persistence/postgres/repeatMutations.js +37 -0
  234. package/dist/infrastructure/persistence/postgres/runtime.d.ts +46 -0
  235. package/dist/infrastructure/persistence/postgres/runtime.js +236 -0
  236. package/dist/infrastructure/persistence/postgres/runtimeConfig.d.ts +21 -0
  237. package/dist/infrastructure/persistence/postgres/runtimeConfig.js +39 -0
  238. package/dist/infrastructure/persistence/postgres/schema.d.ts +4 -0
  239. package/dist/infrastructure/persistence/postgres/schema.js +257 -0
  240. package/dist/infrastructure/persistence/postgres/schemaInitialization.d.ts +3 -0
  241. package/dist/infrastructure/persistence/postgres/schemaInitialization.js +221 -0
  242. package/dist/infrastructure/persistence/postgres/serialAdmission.d.ts +6 -0
  243. package/dist/infrastructure/persistence/postgres/serialAdmission.js +96 -0
  244. package/dist/infrastructure/persistence/postgres/snapshotBudget.d.ts +3 -0
  245. package/dist/infrastructure/persistence/postgres/snapshotBudget.js +83 -0
  246. package/dist/infrastructure/persistence/postgres/storageHealth.d.ts +10 -0
  247. package/dist/infrastructure/persistence/postgres/storageHealth.js +29 -0
  248. package/dist/infrastructure/persistence/postgres/store.d.ts +90 -0
  249. package/dist/infrastructure/persistence/postgres/store.js +136 -0
  250. package/dist/infrastructure/persistence/postgres/telemetry.d.ts +6 -0
  251. package/dist/infrastructure/persistence/postgres/telemetry.js +88 -0
  252. package/dist/infrastructure/persistence/postgres/terminal.d.ts +8 -0
  253. package/dist/infrastructure/persistence/postgres/terminal.js +137 -0
  254. package/dist/infrastructure/persistence/postgres/transactionRetry.d.ts +6 -0
  255. package/dist/infrastructure/persistence/postgres/transactionRetry.js +42 -0
  256. package/dist/infrastructure/persistence/postgres/types.d.ts +175 -0
  257. package/dist/infrastructure/persistence/postgres/types.js +1 -0
  258. package/dist/infrastructure/persistence/postgres/workers.d.ts +15 -0
  259. package/dist/infrastructure/persistence/postgres/workers.js +126 -0
  260. package/dist/infrastructure/persistence/postgres.d.ts +2 -0
  261. package/dist/infrastructure/persistence/postgres.js +1 -0
  262. package/dist/infrastructure/persistence/sqlite/jobs.js +2 -0
  263. package/dist/infrastructure/scheduler/cron/persisted.d.ts +5 -0
  264. package/dist/infrastructure/scheduler/cron/persisted.js +27 -0
  265. package/dist/infrastructure/scheduler/cron/runtime.js +5 -10
  266. package/dist/infrastructure/scheduler/cron/validation.d.ts +3 -0
  267. package/dist/infrastructure/scheduler/cron/validation.js +11 -0
  268. package/dist/infrastructure/scheduler/cronParser.d.ts +1 -1
  269. package/dist/infrastructure/scheduler/cronParser.js +144 -11
  270. package/dist/infrastructure/server/bootstrap.d.ts +2 -3
  271. package/dist/infrastructure/server/bootstrap.js +33 -59
  272. package/dist/infrastructure/server/errors.d.ts +4 -0
  273. package/dist/infrastructure/server/errors.js +54 -0
  274. package/dist/infrastructure/server/handler-routes/control.d.ts +5 -5
  275. package/dist/infrastructure/server/handler-routes/control.js +3 -1
  276. package/dist/infrastructure/server/handler-routes/monitoring.d.ts +2 -2
  277. package/dist/infrastructure/server/handler.js +9 -11
  278. package/dist/infrastructure/server/handlers/advanced/dependencies.js +7 -6
  279. package/dist/infrastructure/server/handlers/advanced/jobs.js +19 -6
  280. package/dist/infrastructure/server/handlers/advanced/queue.d.ts +9 -9
  281. package/dist/infrastructure/server/handlers/advanced/queue.js +91 -27
  282. package/dist/infrastructure/server/handlers/core.js +32 -31
  283. package/dist/infrastructure/server/handlers/cron.d.ts +4 -4
  284. package/dist/infrastructure/server/handlers/cron.js +60 -59
  285. package/dist/infrastructure/server/handlers/dashboard.d.ts +1 -1
  286. package/dist/infrastructure/server/handlers/dashboard.js +21 -8
  287. package/dist/infrastructure/server/handlers/dlq.d.ts +6 -3
  288. package/dist/infrastructure/server/handlers/dlq.js +35 -9
  289. package/dist/infrastructure/server/handlers/flow.js +2 -1
  290. package/dist/infrastructure/server/handlers/management.d.ts +5 -5
  291. package/dist/infrastructure/server/handlers/management.js +36 -9
  292. package/dist/infrastructure/server/handlers/monitoring/health.d.ts +5 -5
  293. package/dist/infrastructure/server/handlers/monitoring/health.js +45 -16
  294. package/dist/infrastructure/server/handlers/monitoring/operations.d.ts +1 -1
  295. package/dist/infrastructure/server/handlers/monitoring/operations.js +8 -1
  296. package/dist/infrastructure/server/handlers/monitoring/workers.d.ts +3 -3
  297. package/dist/infrastructure/server/handlers/monitoring/workers.js +31 -7
  298. package/dist/infrastructure/server/handlers/pushBatchValidation.d.ts +3 -1
  299. package/dist/infrastructure/server/handlers/pushBatchValidation.js +52 -7
  300. package/dist/infrastructure/server/handlers/query.d.ts +1 -1
  301. package/dist/infrastructure/server/handlers/query.js +5 -4
  302. package/dist/infrastructure/server/http.js +2 -2
  303. package/dist/infrastructure/server/httpDashboardEndpoints.d.ts +1 -1
  304. package/dist/infrastructure/server/httpDashboardEndpoints.js +19 -6
  305. package/dist/infrastructure/server/httpEndpoints.js +18 -7
  306. package/dist/infrastructure/server/httpRouteQueues.js +11 -1
  307. package/dist/infrastructure/server/shutdownCoordinator.d.ts +24 -0
  308. package/dist/infrastructure/server/shutdownCoordinator.js +106 -0
  309. package/dist/infrastructure/server/sseHandler.js +8 -3
  310. package/dist/infrastructure/server/storageAdapter.d.ts +29 -0
  311. package/dist/infrastructure/server/storageAdapter.js +61 -0
  312. package/dist/infrastructure/server/storageManager.d.ts +12 -0
  313. package/dist/infrastructure/server/storageManager.js +102 -0
  314. package/dist/infrastructure/server/tcp.js +2 -3
  315. package/dist/infrastructure/server/ws/snapshots.d.ts +1 -1
  316. package/dist/infrastructure/server/ws/snapshots.js +19 -4
  317. package/dist/infrastructure/server/wsHandler.js +10 -5
  318. package/dist/main.js +1 -1
  319. package/dist/mcp/backend/embedded/services.js +2 -1
  320. package/dist/mcp/index.d.ts +2 -2
  321. package/dist/mcp/index.js +2 -2
  322. package/dist/shared/storageHealth.d.ts +9 -0
  323. package/dist/shared/storageHealth.js +12 -0
  324. package/package.json +74 -65
@@ -0,0 +1,54 @@
1
+ const SQLSTATE_CODE = /^(?:[0-9][0-9A-Z]|F0|HV|P0|XX)[0-9A-Z]{3}$/;
2
+ const INFRASTRUCTURE_CODE = /^(?:SQLITE|POSTGRES|ECONN|EAI_|ENET|EHOST|ETIMEDOUT|EPIPE|ENOTFOUND|EADDR|UND_ERR)/i;
3
+ const INFRASTRUCTURE_MESSAGE = /(?:SQLITE|Postgres(?:SQL)?|SQLSTATE|database|duplicate key|\bconstraint\b|\brelation\b|\bdriver\b|connection (?:refused|reset|terminated)|getaddrinfo|\b(?:ECONN|EAI_|ENET|EHOST|ETIMEDOUT|EPIPE|ENOTFOUND|EADDR|UND_ERR)[A-Z_]*)/i;
4
+ const HOST_ENDPOINT_MESSAGE = /(?:\b(?:localhost|[a-z0-9-]+(?:\.[a-z0-9-]+)+|\d{1,3}(?:\.\d{1,3}){3}):\d{2,5}\b|\[[0-9a-f:]+\]:\d{2,5})/i;
5
+ const MAX_DIAGNOSTIC_LENGTH = 2_000;
6
+ function errorField(error, field) {
7
+ if (typeof error !== 'object' || error === null || !(field in error))
8
+ return '';
9
+ const value = error[field];
10
+ return typeof value === 'string' ? value : '';
11
+ }
12
+ function bounded(value) {
13
+ return value.length <= MAX_DIAGNOSTIC_LENGTH
14
+ ? value
15
+ : `${value.slice(0, MAX_DIAGNOSTIC_LENGTH)}...`;
16
+ }
17
+ function errorMessage(error) {
18
+ if (error instanceof Error)
19
+ return error.message;
20
+ if (typeof error === 'string')
21
+ return error;
22
+ if (typeof error !== 'object' || error === null || !('message' in error))
23
+ return 'Unknown error';
24
+ const message = error['message'];
25
+ return typeof message === 'string' ? message : 'Unknown error';
26
+ }
27
+ /** Preserve actionable domain errors while redacting storage and network diagnostics. */
28
+ export function sanitizeServerError(error) {
29
+ const message = errorMessage(error);
30
+ const code = errorField(error, 'code');
31
+ const name = errorField(error, 'name');
32
+ const infrastructureError = SQLSTATE_CODE.test(code) ||
33
+ INFRASTRUCTURE_CODE.test(code) ||
34
+ /^(?:(?:Database|Postgres|SQLite|SQL).*Error|ConnectionError)$/i.test(name) ||
35
+ INFRASTRUCTURE_MESSAGE.test(message) ||
36
+ HOST_ENDPOINT_MESSAGE.test(message);
37
+ return infrastructureError ? 'Internal server error' : message;
38
+ }
39
+ /** Keep bounded local diagnostics for redacted infrastructure failures. */
40
+ export function serverErrorDiagnostics(error) {
41
+ const diagnostic = { error: bounded(errorMessage(error)) };
42
+ for (const [source, target] of [
43
+ ['name', 'name'],
44
+ ['code', 'code'],
45
+ ['errno', 'sqlState'],
46
+ ['where', 'where'],
47
+ ['routine', 'routine'],
48
+ ]) {
49
+ const value = errorField(error, source);
50
+ if (value)
51
+ diagnostic[target] = bounded(value);
52
+ }
53
+ return diagnostic;
54
+ }
@@ -1,8 +1,8 @@
1
1
  import type { Command } from '../../../domain/types/command';
2
2
  import type { Response } from '../../../domain/types/response';
3
3
  import type { HandlerContext } from '../types';
4
- export declare function routeQueueControlCommand(command: Command, context: HandlerContext, requestId?: string): Response | null;
5
- export declare function routeDlqCommand(command: Command, context: HandlerContext, requestId?: string): Response | null;
6
- export declare function routeRateLimitCommand(command: Command, context: HandlerContext, requestId?: string): Response | null;
7
- export declare function routeCronCommand(command: Command, context: HandlerContext, requestId?: string): Response | null;
8
- export declare function routeConfigCommand(command: Command, context: HandlerContext, requestId?: string): Response | null;
4
+ export declare function routeQueueControlCommand(command: Command, context: HandlerContext, requestId?: string): Response | Promise<Response> | null;
5
+ export declare function routeDlqCommand(command: Command, context: HandlerContext, requestId?: string): Response | Promise<Response> | null;
6
+ export declare function routeRateLimitCommand(command: Command, context: HandlerContext, requestId?: string): Response | Promise<Response> | null;
7
+ export declare function routeCronCommand(command: Command, context: HandlerContext, requestId?: string): Response | Promise<Response> | null;
8
+ export declare function routeConfigCommand(command: Command, context: HandlerContext, requestId?: string): Response | Promise<Response> | null;
@@ -1,6 +1,6 @@
1
1
  import { handleClean, handleClearConcurrency, handleGetDlqConfig, handleGetStallConfig, handleIsPaused, handleListQueues, handleObliterate, handleRateLimit, handleRateLimitClear, handleSetConcurrency, handleSetDlqConfig, handleSetStallConfig, } from '../handlers/advanced';
2
2
  import { handleCron, handleCronDelete, handleCronGet, handleCronList } from '../handlers/cron';
3
- import { handleDlq, handleGetDlqStats, handlePurgeDlq, handleRetryCompleted, handleRetryDlq, } from '../handlers/dlq';
3
+ import { handleDlq, handleGetDlqStats, handlePurgeDlq, handleRemoveDlqJob, handleRetryCompleted, handleRetryDlq, } from '../handlers/dlq';
4
4
  import { handleDrain, handlePause, handleResume } from '../handlers/management';
5
5
  export function routeQueueControlCommand(command, context, requestId) {
6
6
  switch (command.cmd) {
@@ -32,6 +32,8 @@ export function routeDlqCommand(command, context, requestId) {
32
32
  return handleRetryDlq(command, context, requestId);
33
33
  case 'PurgeDlq':
34
34
  return handlePurgeDlq(command, context, requestId);
35
+ case 'RemoveDlqJob':
36
+ return handleRemoveDlqJob(command, context, requestId);
35
37
  case 'RetryCompleted':
36
38
  return handleRetryCompleted(command, context, requestId);
37
39
  default:
@@ -1,5 +1,5 @@
1
1
  import type { Command } from '../../../domain/types/command';
2
2
  import type { Response } from '../../../domain/types/response';
3
3
  import type { HandlerContext } from '../types';
4
- export declare function routeMonitoringCommand(command: Command, context: HandlerContext, requestId?: string): Response | null;
5
- export declare function routeDashboardCommand(command: Command, context: HandlerContext, requestId?: string): Response | null;
4
+ export declare function routeMonitoringCommand(command: Command, context: HandlerContext, requestId?: string): Response | Promise<Response> | null;
5
+ export declare function routeDashboardCommand(command: Command, context: HandlerContext, requestId?: string): Response | Promise<Response> | null;
@@ -4,6 +4,7 @@
4
4
  */
5
5
  import * as resp from '../../domain/types/response';
6
6
  import { constantTimeEqual } from '../../shared/hash';
7
+ import { sanitizeServerError } from './errors';
7
8
  import { routeCoreCommand, routeQueryCommand, routeManagementCommand, routeQueueControlCommand, routeDlqCommand, routeRateLimitCommand, routeConfigCommand, routeCronCommand, routeMonitoringCommand, routeDashboardCommand, } from './handlerRoutes';
8
9
  /**
9
10
  * Handle authentication command
@@ -43,33 +44,30 @@ export async function handleCommand(cmd, ctx) {
43
44
  result = await routeManagementCommand(cmd, ctx, reqId);
44
45
  if (result)
45
46
  return result;
46
- result = routeQueueControlCommand(cmd, ctx, reqId);
47
+ result = await routeQueueControlCommand(cmd, ctx, reqId);
47
48
  if (result)
48
49
  return result;
49
- result = routeDlqCommand(cmd, ctx, reqId);
50
+ result = await routeDlqCommand(cmd, ctx, reqId);
50
51
  if (result)
51
52
  return result;
52
- result = routeRateLimitCommand(cmd, ctx, reqId);
53
+ result = await routeRateLimitCommand(cmd, ctx, reqId);
53
54
  if (result)
54
55
  return result;
55
- result = routeConfigCommand(cmd, ctx, reqId);
56
+ result = await routeConfigCommand(cmd, ctx, reqId);
56
57
  if (result)
57
58
  return result;
58
- result = routeCronCommand(cmd, ctx, reqId);
59
+ result = await routeCronCommand(cmd, ctx, reqId);
59
60
  if (result)
60
61
  return result;
61
- result = routeMonitoringCommand(cmd, ctx, reqId);
62
+ result = await routeMonitoringCommand(cmd, ctx, reqId);
62
63
  if (result)
63
64
  return result;
64
- result = routeDashboardCommand(cmd, ctx, reqId);
65
+ result = await routeDashboardCommand(cmd, ctx, reqId);
65
66
  if (result)
66
67
  return result;
67
68
  return resp.error(`Unknown command: ${cmd.cmd}`, reqId);
68
69
  }
69
70
  catch (err) {
70
- // Sanitize error messages to avoid leaking internal details to clients
71
- const raw = err instanceof Error ? err.message : 'Unknown error';
72
- const message = raw.includes('SQLITE') || raw.includes('database') ? 'Internal server error' : raw;
73
- return resp.error(message, reqId);
71
+ return resp.error(sanitizeServerError(err), reqId);
74
72
  }
75
73
  }
@@ -1,12 +1,13 @@
1
1
  import { jobId } from '../../../../domain/types/job';
2
2
  import * as response from '../../../../domain/types/response';
3
+ import { sanitizeServerError } from '../../errors';
3
4
  export async function handleGetFailedChildrenValues(command, context, requestId) {
4
5
  try {
5
6
  const values = await context.queueManager.getFailedChildrenValues(jobId(command.id));
6
7
  return { ok: true, values, reqId: requestId };
7
8
  }
8
- catch {
9
- return { ok: true, values: {}, reqId: requestId };
9
+ catch (error) {
10
+ return response.error(sanitizeServerError(error), requestId);
10
11
  }
11
12
  }
12
13
  export async function handleGetIgnoredChildrenFailures(command, context, requestId) {
@@ -14,8 +15,8 @@ export async function handleGetIgnoredChildrenFailures(command, context, request
14
15
  const values = await context.queueManager.getIgnoredChildrenFailures(jobId(command.id));
15
16
  return { ok: true, values, reqId: requestId };
16
17
  }
17
- catch {
18
- return { ok: true, values: {}, reqId: requestId };
18
+ catch (error) {
19
+ return response.error(sanitizeServerError(error), requestId);
19
20
  }
20
21
  }
21
22
  export async function handleRemoveChildDependency(command, context, requestId) {
@@ -24,7 +25,7 @@ export async function handleRemoveChildDependency(command, context, requestId) {
24
25
  return { ok: true, removed, reqId: requestId };
25
26
  }
26
27
  catch (error) {
27
- return response.error(error instanceof Error ? error.message : String(error), requestId);
28
+ return response.error(sanitizeServerError(error), requestId);
28
29
  }
29
30
  }
30
31
  export async function handleRemoveUnprocessedChildren(command, context, requestId) {
@@ -33,6 +34,6 @@ export async function handleRemoveUnprocessedChildren(command, context, requestI
33
34
  return response.ok(undefined, requestId);
34
35
  }
35
36
  catch (error) {
36
- return response.error(error instanceof Error ? error.message : String(error), requestId);
37
+ return response.error(sanitizeServerError(error), requestId);
37
38
  }
38
39
  }
@@ -1,6 +1,7 @@
1
1
  import { jobId } from '../../../../domain/types/job';
2
2
  import * as response from '../../../../domain/types/response';
3
3
  import { validateNumericField } from '../../protocol';
4
+ import { sanitizeServerError } from '../../errors';
4
5
  export async function handleUpdate(command, context, requestId) {
5
6
  const success = await context.queueManager.updateJobData(jobId(command.id), command.data);
6
7
  if (success)
@@ -35,7 +36,7 @@ export async function handleUpdateParent(command, context, requestId) {
35
36
  return response.ok(undefined, requestId);
36
37
  }
37
38
  catch (error) {
38
- return response.error(error instanceof Error ? error.message : 'Failed to update parent', requestId);
39
+ return response.error(sanitizeServerError(error), requestId);
39
40
  }
40
41
  }
41
42
  export async function handleMoveToDelayed(command, context, requestId) {
@@ -69,13 +70,22 @@ export async function handleWaitJob(command, context, requestId) {
69
70
  return response.error(timeoutError, requestId);
70
71
  const timeout = command.timeout ?? 30000;
71
72
  const job = await context.queueManager.getJob(id);
72
- if (!job)
73
- return response.error('Job not found', requestId);
73
+ if (!job) {
74
+ const completion = await context.queueManager.getCompletionAsync(id);
75
+ if (!completion.found)
76
+ return response.error('Job not found', requestId);
77
+ return {
78
+ ok: true,
79
+ completed: true,
80
+ result: completion.result,
81
+ reqId: requestId,
82
+ };
83
+ }
74
84
  if (job.completedAt) {
75
85
  return {
76
86
  ok: true,
77
87
  completed: true,
78
- result: context.queueManager.getResult(id),
88
+ result: await context.queueManager.getResultAsync(id),
79
89
  reqId: requestId,
80
90
  };
81
91
  }
@@ -84,7 +94,7 @@ export async function handleWaitJob(command, context, requestId) {
84
94
  return {
85
95
  ok: true,
86
96
  completed: true,
87
- result: context.queueManager.getResult(id),
97
+ result: await context.queueManager.getResultAsync(id),
88
98
  reqId: requestId,
89
99
  };
90
100
  }
@@ -121,7 +131,10 @@ export async function handleMoveToWait(command, context, requestId) {
121
131
  const job = await context.queueManager.getJob(id);
122
132
  if (!job)
123
133
  return response.error('Job not found', requestId);
124
- const count = context.queueManager.retryDlq(job.queue, id);
134
+ const manager = context.queueManager;
135
+ const count = manager.retryDlqDurable
136
+ ? await manager.retryDlqDurable(job.queue, id)
137
+ : manager.retryDlq(job.queue, id);
125
138
  return count > 0
126
139
  ? response.ok(undefined, requestId)
127
140
  : response.error('Failed job not in DLQ', requestId);
@@ -3,40 +3,40 @@ import type { Response } from '../../../../domain/types/response';
3
3
  import type { HandlerContext } from '../../types';
4
4
  export declare function handleIsPaused(command: Extract<Command, {
5
5
  cmd: 'IsPaused';
6
- }>, context: HandlerContext, requestId?: string): Response;
6
+ }>, context: HandlerContext, requestId?: string): Response | Promise<Response>;
7
7
  export declare function handleObliterate(command: Extract<Command, {
8
8
  cmd: 'Obliterate';
9
- }>, context: HandlerContext, requestId?: string): Response;
9
+ }>, context: HandlerContext, requestId?: string): Response | Promise<Response>;
10
10
  export declare function handleListQueues(_command: Extract<Command, {
11
11
  cmd: 'ListQueues';
12
12
  }>, context: HandlerContext, requestId?: string): Response;
13
13
  export declare function handleClean(command: Extract<Command, {
14
14
  cmd: 'Clean';
15
- }>, context: HandlerContext, requestId?: string): Response;
15
+ }>, context: HandlerContext, requestId?: string): Response | Promise<Response>;
16
16
  export declare function handleCount(command: Extract<Command, {
17
17
  cmd: 'Count';
18
18
  }>, context: HandlerContext, requestId?: string): Response;
19
19
  export declare function handleRateLimit(command: Extract<Command, {
20
20
  cmd: 'RateLimit';
21
- }>, context: HandlerContext, requestId?: string): Response;
21
+ }>, context: HandlerContext, requestId?: string): Response | Promise<Response>;
22
22
  export declare function handleRateLimitClear(command: Extract<Command, {
23
23
  cmd: 'RateLimitClear';
24
- }>, context: HandlerContext, requestId?: string): Response;
24
+ }>, context: HandlerContext, requestId?: string): Response | Promise<Response>;
25
25
  export declare function handleSetConcurrency(command: Extract<Command, {
26
26
  cmd: 'SetConcurrency';
27
- }>, context: HandlerContext, requestId?: string): Response;
27
+ }>, context: HandlerContext, requestId?: string): Response | Promise<Response>;
28
28
  export declare function handleClearConcurrency(command: Extract<Command, {
29
29
  cmd: 'ClearConcurrency';
30
- }>, context: HandlerContext, requestId?: string): Response;
30
+ }>, context: HandlerContext, requestId?: string): Response | Promise<Response>;
31
31
  export declare function handleSetStallConfig(command: Extract<Command, {
32
32
  cmd: 'SetStallConfig';
33
- }>, context: HandlerContext, requestId?: string): Response;
33
+ }>, context: HandlerContext, requestId?: string): Response | Promise<Response>;
34
34
  export declare function handleGetStallConfig(command: Extract<Command, {
35
35
  cmd: 'GetStallConfig';
36
36
  }>, context: HandlerContext, requestId?: string): Response;
37
37
  export declare function handleSetDlqConfig(command: Extract<Command, {
38
38
  cmd: 'SetDlqConfig';
39
- }>, context: HandlerContext, requestId?: string): Response;
39
+ }>, context: HandlerContext, requestId?: string): Response | Promise<Response>;
40
40
  export declare function handleGetDlqConfig(command: Extract<Command, {
41
41
  cmd: 'GetDlqConfig';
42
42
  }>, context: HandlerContext, requestId?: string): Response;
@@ -1,14 +1,26 @@
1
1
  import * as response from '../../../../domain/types/response';
2
2
  import { sanitizeConfigNumbers, toFiniteNumber } from './configNumbers';
3
3
  export function handleIsPaused(command, context, requestId) {
4
+ const manager = context.queueManager;
5
+ if (manager.isPausedDurable) {
6
+ return manager.isPausedDurable(command.queue).then((paused) => ({
7
+ ok: true,
8
+ paused,
9
+ reqId: requestId,
10
+ }));
11
+ }
4
12
  return {
5
13
  ok: true,
6
- paused: context.queueManager.isPaused(command.queue),
14
+ paused: manager.isPaused(command.queue),
7
15
  reqId: requestId,
8
16
  };
9
17
  }
10
18
  export function handleObliterate(command, context, requestId) {
11
- context.queueManager.obliterate(command.queue);
19
+ const manager = context.queueManager;
20
+ if (manager.obliterateDurable) {
21
+ return manager.obliterateDurable(command.queue).then(() => response.ok(undefined, requestId));
22
+ }
23
+ manager.obliterate(command.queue);
12
24
  return response.ok(undefined, requestId);
13
25
  }
14
26
  export function handleListQueues(_command, context, requestId) {
@@ -19,15 +31,24 @@ export function handleListQueues(_command, context, requestId) {
19
31
  };
20
32
  }
21
33
  export function handleClean(command, context, requestId) {
22
- const ids = context.queueManager.clean(command.queue, command.grace, command.state, command.limit);
34
+ const manager = context.queueManager;
35
+ if (manager.cleanDurable) {
36
+ return manager
37
+ .cleanDurable(command.queue, command.grace, command.state, command.limit)
38
+ .then((ids) => cleanResponse(manager, command.queue, command.state, ids, requestId));
39
+ }
40
+ const ids = manager.clean(command.queue, command.grace, command.state, command.limit);
41
+ return cleanResponse(manager, command.queue, command.state, ids, requestId);
42
+ }
43
+ function cleanResponse(manager, queue, state, ids, requestId) {
23
44
  if (ids.length > 0) {
24
- context.queueManager.emitDashboardEvent('queue:cleaned', {
25
- queue: command.queue,
26
- state: command.state,
45
+ manager.emitDashboardEvent('queue:cleaned', {
46
+ queue,
47
+ state,
27
48
  count: ids.length,
28
49
  });
29
50
  }
30
- return { ok: true, count: ids.length, ids, reqId: requestId };
51
+ return { ok: true, count: ids.length, ids: [...ids], reqId: requestId };
31
52
  }
32
53
  export function handleCount(command, context, requestId) {
33
54
  return { ok: true, count: context.queueManager.count(command.queue), reqId: requestId };
@@ -38,8 +59,19 @@ export function handleRateLimit(command, context, requestId) {
38
59
  return response.error('limit must be a finite number', requestId);
39
60
  const duration = toFiniteNumber(command.duration);
40
61
  const ttl = toFiniteNumber(command.ttl);
41
- context.queueManager.setRateLimit(command.queue, limit, duration, ttl);
42
- context.queueManager.emitDashboardEvent('ratelimit:set', {
62
+ const manager = context.queueManager;
63
+ if (manager.setRateLimitDurable) {
64
+ return manager.setRateLimitDurable(command.queue, limit, duration ?? 1000, ttl).then(() => {
65
+ manager.emitDashboardEvent('ratelimit:set', {
66
+ queue: command.queue,
67
+ max: limit,
68
+ duration: duration ?? 1000,
69
+ });
70
+ return response.ok(undefined, requestId);
71
+ });
72
+ }
73
+ manager.setRateLimit(command.queue, limit, duration, ttl);
74
+ manager.emitDashboardEvent('ratelimit:set', {
43
75
  queue: command.queue,
44
76
  max: limit,
45
77
  ...(duration !== undefined && { duration }),
@@ -48,24 +80,48 @@ export function handleRateLimit(command, context, requestId) {
48
80
  return response.ok(undefined, requestId);
49
81
  }
50
82
  export function handleRateLimitClear(command, context, requestId) {
51
- context.queueManager.clearRateLimit(command.queue);
52
- context.queueManager.emitDashboardEvent('ratelimit:cleared', { queue: command.queue });
83
+ const manager = context.queueManager;
84
+ if (manager.setRateLimitDurable) {
85
+ return manager.setRateLimitDurable(command.queue, null, null).then(() => {
86
+ manager.emitDashboardEvent('ratelimit:cleared', { queue: command.queue });
87
+ return response.ok(undefined, requestId);
88
+ });
89
+ }
90
+ manager.clearRateLimit(command.queue);
91
+ manager.emitDashboardEvent('ratelimit:cleared', { queue: command.queue });
53
92
  return response.ok(undefined, requestId);
54
93
  }
55
94
  export function handleSetConcurrency(command, context, requestId) {
56
95
  const limit = toFiniteNumber(command.limit);
57
96
  if (limit === undefined)
58
97
  return response.error('limit must be a finite number', requestId);
59
- context.queueManager.setConcurrency(command.queue, limit);
60
- context.queueManager.emitDashboardEvent('concurrency:set', {
98
+ const manager = context.queueManager;
99
+ if (manager.setConcurrencyDurable) {
100
+ return manager.setConcurrencyDurable(command.queue, limit).then(() => {
101
+ manager.emitDashboardEvent('concurrency:set', {
102
+ queue: command.queue,
103
+ concurrency: limit,
104
+ });
105
+ return response.ok(undefined, requestId);
106
+ });
107
+ }
108
+ manager.setConcurrency(command.queue, limit);
109
+ manager.emitDashboardEvent('concurrency:set', {
61
110
  queue: command.queue,
62
111
  concurrency: limit,
63
112
  });
64
113
  return response.ok(undefined, requestId);
65
114
  }
66
115
  export function handleClearConcurrency(command, context, requestId) {
67
- context.queueManager.clearConcurrency(command.queue);
68
- context.queueManager.emitDashboardEvent('concurrency:cleared', { queue: command.queue });
116
+ const manager = context.queueManager;
117
+ if (manager.setConcurrencyDurable) {
118
+ return manager.setConcurrencyDurable(command.queue, null).then(() => {
119
+ manager.emitDashboardEvent('concurrency:cleared', { queue: command.queue });
120
+ return response.ok(undefined, requestId);
121
+ });
122
+ }
123
+ manager.clearConcurrency(command.queue);
124
+ manager.emitDashboardEvent('concurrency:cleared', { queue: command.queue });
69
125
  return response.ok(undefined, requestId);
70
126
  }
71
127
  export function handleSetStallConfig(command, context, requestId) {
@@ -74,12 +130,16 @@ export function handleSetStallConfig(command, context, requestId) {
74
130
  'maxStalls',
75
131
  'gracePeriod',
76
132
  ]);
77
- context.queueManager.setStallConfig(command.queue, config);
78
- context.queueManager.emitDashboardEvent('config:stall-changed', {
79
- queue: command.queue,
80
- config,
81
- });
82
- return response.ok(undefined, requestId);
133
+ const manager = context.queueManager;
134
+ const complete = () => {
135
+ manager.emitDashboardEvent('config:stall-changed', { queue: command.queue, config });
136
+ return response.ok(undefined, requestId);
137
+ };
138
+ if (manager.setStallConfigDurable) {
139
+ return manager.setStallConfigDurable(command.queue, config).then(complete);
140
+ }
141
+ manager.setStallConfig(command.queue, config);
142
+ return complete();
83
143
  }
84
144
  export function handleGetStallConfig(command, context, requestId) {
85
145
  return {
@@ -95,12 +155,16 @@ export function handleSetDlqConfig(command, context, requestId) {
95
155
  'maxAge',
96
156
  'maxEntries',
97
157
  ]);
98
- context.queueManager.setDlqConfig(command.queue, config);
99
- context.queueManager.emitDashboardEvent('config:dlq-changed', {
100
- queue: command.queue,
101
- config,
102
- });
103
- return response.ok(undefined, requestId);
158
+ const manager = context.queueManager;
159
+ const complete = () => {
160
+ manager.emitDashboardEvent('config:dlq-changed', { queue: command.queue, config });
161
+ return response.ok(undefined, requestId);
162
+ };
163
+ if (manager.setDlqConfigDurable) {
164
+ return manager.setDlqConfigDurable(command.queue, config).then(complete);
165
+ }
166
+ manager.setDlqConfig(command.queue, config);
167
+ return complete();
104
168
  }
105
169
  export function handleGetDlqConfig(command, context, requestId) {
106
170
  return {
@@ -1,8 +1,10 @@
1
1
  /** Core command handlers for push, pull, acknowledgement, and failure. */
2
2
  import * as resp from '../../../domain/types/response';
3
3
  import { jobId, normalizeLegacyJobPayload } from '../../../domain/types/job';
4
+ import { tcpLog } from '../../../shared/logger';
5
+ import { sanitizeServerError, serverErrorDiagnostics } from '../errors';
4
6
  import { validateQueueName, validateJobData, validateJobOptions, validateNumericField, } from '../protocol';
5
- import { validatePushBatchJobs } from './pushBatchValidation';
7
+ import { validatePushBatchJobs, validatePushDependencies } from './pushBatchValidation';
6
8
  /** Handle PUSH command */
7
9
  export async function handlePush(cmd, ctx, reqId) {
8
10
  const queueError = validateQueueName(cmd.queue);
@@ -22,23 +24,10 @@ export async function handlePush(cmd, ctx, reqId) {
22
24
  });
23
25
  if (optionsError)
24
26
  return resp.error(optionsError, reqId);
25
- // Validate dependsOn references exist
26
- if (cmd.dependsOn && cmd.dependsOn.length > 0) {
27
- for (const depId of cmd.dependsOn) {
28
- const depJobId = jobId(depId);
29
- const exists = ctx.queueManager.getJobIndex().has(depJobId) ||
30
- ctx.queueManager.getCompletedJobs().has(depJobId) ||
31
- // A removeOnComplete parent that completed is recorded only here (its row
32
- // is deleted and it leaves jobIndex/completedJobs). The readiness path and
33
- // dependency processor already honor depCompletions; the gate must too, or
34
- // a late dependent is wrongly rejected with "Dependency job not found".
35
- ctx.queueManager.getDepCompletions().has(depJobId);
36
- if (!exists) {
37
- return resp.error(`Dependency job not found: ${depId}`, reqId);
38
- }
39
- }
40
- }
41
27
  try {
28
+ const dependencyError = await validatePushDependencies(cmd.dependsOn, ctx);
29
+ if (dependencyError)
30
+ return resp.error(dependencyError, reqId);
42
31
  const payload = normalizeLegacyJobPayload(cmd);
43
32
  const job = await ctx.queueManager.push(cmd.queue, {
44
33
  name: payload.name,
@@ -77,8 +66,7 @@ export async function handlePush(cmd, ctx, reqId) {
77
66
  return resp.ok(job.id, reqId);
78
67
  }
79
68
  catch (err) {
80
- const message = err instanceof Error ? err.message : String(err);
81
- return resp.error(message, reqId);
69
+ return resp.error(sanitizeServerError(err), reqId);
82
70
  }
83
71
  }
84
72
  /** Handle PUSHB (batch push) command */
@@ -88,15 +76,20 @@ export async function handlePushBatch(cmd, ctx, reqId) {
88
76
  return resp.error(queueError, reqId);
89
77
  // PUSH parity: per-job data/option bounds + dependsOn existence gate
90
78
  // (extended to earlier same-batch custom ids for intra-batch chains).
91
- const jobsError = validatePushBatchJobs(cmd.jobs, ctx);
92
- if (jobsError)
93
- return resp.error(jobsError, reqId);
94
- const inputs = cmd.jobs.map((job) => {
95
- const payload = normalizeLegacyJobPayload(job);
96
- return { ...job, name: payload.name, data: payload.data };
97
- });
98
- const ids = await ctx.queueManager.pushBatch(cmd.queue, inputs);
99
- return resp.batch(ids, reqId);
79
+ try {
80
+ const jobsError = await validatePushBatchJobs(cmd.jobs, ctx);
81
+ if (jobsError)
82
+ return resp.error(jobsError, reqId);
83
+ const inputs = cmd.jobs.map((job) => {
84
+ const payload = normalizeLegacyJobPayload(job);
85
+ return { ...job, name: payload.name, data: payload.data };
86
+ });
87
+ const ids = await ctx.queueManager.pushBatch(cmd.queue, inputs);
88
+ return resp.batch(ids, reqId);
89
+ }
90
+ catch (error) {
91
+ return resp.error(sanitizeServerError(error), reqId);
92
+ }
100
93
  }
101
94
  /** Handle PULL command */
102
95
  export async function handlePull(cmd, ctx, reqId) {
@@ -169,7 +162,7 @@ export async function handleAck(cmd, ctx, reqId) {
169
162
  return outcome ? resp.data(outcome, reqId) : resp.ok(undefined, reqId);
170
163
  }
171
164
  catch (err) {
172
- return resp.error(err instanceof Error ? err.message : String(err), reqId);
165
+ return resp.error(sanitizeServerError(err), reqId);
173
166
  }
174
167
  }
175
168
  /** Handle ACKB (batch ack) command - supports optional results and tokens */
@@ -210,7 +203,15 @@ export async function handleAckBatch(cmd, ctx, reqId) {
210
203
  return outcome ? resp.data(outcome, reqId) : resp.ok(undefined, reqId);
211
204
  }
212
205
  catch (err) {
213
- return resp.error(err instanceof Error ? err.message : String(err), reqId);
206
+ const message = sanitizeServerError(err);
207
+ if (message === 'Internal server error') {
208
+ tcpLog.error('ACKB failed', {
209
+ ...serverErrorDiagnostics(err),
210
+ batchSize: ids.length,
211
+ ...(reqId && { reqId }),
212
+ });
213
+ }
214
+ return resp.error(message, reqId);
214
215
  }
215
216
  }
216
217
  /** Handle FAIL command */
@@ -229,6 +230,6 @@ export async function handleFail(cmd, ctx, reqId) {
229
230
  return outcome ? resp.data(outcome, reqId) : resp.ok(undefined, reqId);
230
231
  }
231
232
  catch (err) {
232
- return resp.error(err instanceof Error ? err.message : String(err), reqId);
233
+ return resp.error(sanitizeServerError(err), reqId);
233
234
  }
234
235
  }
@@ -8,16 +8,16 @@ import type { HandlerContext } from '../types';
8
8
  /** Handle Cron command - add cron job */
9
9
  export declare function handleCron(cmd: Extract<Command, {
10
10
  cmd: 'Cron';
11
- }>, ctx: HandlerContext, reqId?: string): Response;
11
+ }>, ctx: HandlerContext, reqId?: string): Response | Promise<Response>;
12
12
  /** Handle CronGet command - get single cron job by name */
13
13
  export declare function handleCronGet(cmd: Extract<Command, {
14
14
  cmd: 'CronGet';
15
- }>, ctx: HandlerContext, reqId?: string): Response;
15
+ }>, ctx: HandlerContext, reqId?: string): Response | Promise<Response>;
16
16
  /** Handle CronDelete command - delete cron job */
17
17
  export declare function handleCronDelete(cmd: Extract<Command, {
18
18
  cmd: 'CronDelete';
19
- }>, ctx: HandlerContext, reqId?: string): Response;
19
+ }>, ctx: HandlerContext, reqId?: string): Response | Promise<Response>;
20
20
  /** Handle CronList command - list cron jobs */
21
21
  export declare function handleCronList(_cmd: Extract<Command, {
22
22
  cmd: 'CronList';
23
- }>, ctx: HandlerContext, reqId?: string): Response;
23
+ }>, ctx: HandlerContext, reqId?: string): Response | Promise<Response>;