bunqueue 2.8.60 → 2.9.2

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 (427) hide show
  1. package/README.md +114 -78
  2. package/dist/application/background/dlq.js +2 -0
  3. package/dist/application/background/recovery/active.d.ts +1 -0
  4. package/dist/application/background/recovery/active.js +12 -0
  5. package/dist/application/background/recovery/index.js +3 -1
  6. package/dist/application/background/recovery/pending.js +1 -0
  7. package/dist/application/cleanupTasks.js +4 -16
  8. package/dist/application/contextFactory.js +8 -0
  9. package/dist/application/dlqManager.d.ts +10 -0
  10. package/dist/application/dlqManager.js +48 -9
  11. package/dist/application/dlqRetry.js +60 -38
  12. package/dist/application/eventsManager.d.ts +9 -2
  13. package/dist/application/eventsManager.js +106 -55
  14. package/dist/application/operations/ackHelpers.d.ts +1 -4
  15. package/dist/application/operations/ackHelpers.js +39 -14
  16. package/dist/application/operations/flowPush.js +1 -0
  17. package/dist/application/operations/flowValidation.js +4 -4
  18. package/dist/application/operations/jobManagement.d.ts +4 -0
  19. package/dist/application/operations/jobMoveOperations.js +9 -4
  20. package/dist/application/operations/pull.d.ts +7 -2
  21. package/dist/application/operations/pull.js +15 -57
  22. package/dist/application/operations/pullFinalization.d.ts +6 -0
  23. package/dist/application/operations/pullFinalization.js +69 -0
  24. package/dist/application/operations/pullStateTransition.d.ts +8 -7
  25. package/dist/application/operations/pullStateTransition.js +25 -18
  26. package/dist/application/operations/push.js +3 -0
  27. package/dist/application/operations/pushBatch.js +14 -7
  28. package/dist/application/operations/pushContext.d.ts +2 -1
  29. package/dist/application/postgres-queue-manager/batchSnapshot.d.ts +16 -0
  30. package/dist/application/postgres-queue-manager/batchSnapshot.js +17 -0
  31. package/dist/application/postgres-queue-manager/cloud.d.ts +30 -0
  32. package/dist/application/postgres-queue-manager/cloud.js +55 -0
  33. package/dist/application/postgres-queue-manager/config.d.ts +5 -0
  34. package/dist/application/postgres-queue-manager/config.js +1 -0
  35. package/dist/application/postgres-queue-manager/control.d.ts +30 -0
  36. package/dist/application/postgres-queue-manager/control.js +210 -0
  37. package/dist/application/postgres-queue-manager/deferredWrites.d.ts +13 -0
  38. package/dist/application/postgres-queue-manager/deferredWrites.js +60 -0
  39. package/dist/application/postgres-queue-manager/delivery.d.ts +20 -0
  40. package/dist/application/postgres-queue-manager/delivery.js +83 -0
  41. package/dist/application/postgres-queue-manager/groupQueries.d.ts +10 -0
  42. package/dist/application/postgres-queue-manager/groupQueries.js +40 -0
  43. package/dist/application/postgres-queue-manager/lease.d.ts +13 -0
  44. package/dist/application/postgres-queue-manager/lease.js +88 -0
  45. package/dist/application/postgres-queue-manager/lifetimeMetrics.d.ts +32 -0
  46. package/dist/application/postgres-queue-manager/lifetimeMetrics.js +53 -0
  47. package/dist/application/postgres-queue-manager/maintenance.d.ts +14 -0
  48. package/dist/application/postgres-queue-manager/maintenance.js +100 -0
  49. package/dist/application/postgres-queue-manager/operationGate.d.ts +26 -0
  50. package/dist/application/postgres-queue-manager/operationGate.js +96 -0
  51. package/dist/application/postgres-queue-manager/operations.d.ts +25 -0
  52. package/dist/application/postgres-queue-manager/operations.js +194 -0
  53. package/dist/application/postgres-queue-manager/projectionRefreshes.d.ts +43 -0
  54. package/dist/application/postgres-queue-manager/projectionRefreshes.js +170 -0
  55. package/dist/application/postgres-queue-manager/queries.d.ts +142 -0
  56. package/dist/application/postgres-queue-manager/queries.js +231 -0
  57. package/dist/application/postgres-queue-manager/relationships.d.ts +10 -0
  58. package/dist/application/postgres-queue-manager/relationships.js +45 -0
  59. package/dist/application/postgres-queue-manager/services.d.ts +31 -0
  60. package/dist/application/postgres-queue-manager/services.js +149 -0
  61. package/dist/application/postgres-queue-manager/snapshot.d.ts +51 -0
  62. package/dist/application/postgres-queue-manager/snapshot.js +236 -0
  63. package/dist/application/postgres-queue-manager/snapshotViews.d.ts +15 -0
  64. package/dist/application/postgres-queue-manager/snapshotViews.js +100 -0
  65. package/dist/application/postgres-queue-manager/startupEventBuffer.d.ts +12 -0
  66. package/dist/application/postgres-queue-manager/startupEventBuffer.js +36 -0
  67. package/dist/application/postgres-queue-manager/state.d.ts +47 -0
  68. package/dist/application/postgres-queue-manager/state.js +273 -0
  69. package/dist/application/postgres-queue-manager/terminalDelivery.d.ts +20 -0
  70. package/dist/application/postgres-queue-manager/terminalDelivery.js +100 -0
  71. package/dist/application/postgresQueueManager.d.ts +2 -0
  72. package/dist/application/postgresQueueManager.js +1 -0
  73. package/dist/application/queue-manager/control.js +1 -0
  74. package/dist/application/queue-manager/delivery.d.ts +5 -4
  75. package/dist/application/queue-manager/delivery.js +15 -8
  76. package/dist/application/queue-manager/flow-failures.js +4 -0
  77. package/dist/application/queue-manager/limits.d.ts +13 -0
  78. package/dist/application/queue-manager/limits.js +65 -0
  79. package/dist/application/queue-manager/observability.js +15 -3
  80. package/dist/application/queue-manager/queries.d.ts +7 -0
  81. package/dist/application/queue-manager/queries.js +9 -0
  82. package/dist/application/queue-manager/services.d.ts +1 -1
  83. package/dist/application/queue-manager/services.js +4 -2
  84. package/dist/application/queue-manager/state.js +17 -2
  85. package/dist/application/queueTelemetryJournal.d.ts +2 -0
  86. package/dist/application/queueTelemetryJournal.js +23 -0
  87. package/dist/application/types/ack.d.ts +3 -1
  88. package/dist/cli/commandRouter.d.ts +1 -1
  89. package/dist/cli/commands/server.js +1 -1
  90. package/dist/client/flowPush.js +6 -0
  91. package/dist/client/forwarder.d.ts +6 -4
  92. package/dist/client/forwarder.js +5 -3
  93. package/dist/client/groupId.d.ts +1 -0
  94. package/dist/client/groupId.js +1 -0
  95. package/dist/client/index.d.ts +1 -1
  96. package/dist/client/jobHelpers.js +1 -0
  97. package/dist/client/queue/dlq.d.ts +2 -0
  98. package/dist/client/queue/dlq.js +14 -0
  99. package/dist/client/queue/dlqOps.d.ts +2 -0
  100. package/dist/client/queue/dlqOps.js +4 -0
  101. package/dist/client/queue/helpers.js +2 -0
  102. package/dist/client/queue/operations/add/bulk.js +4 -4
  103. package/dist/client/queue/operations/add/payload.d.ts +1 -0
  104. package/dist/client/queue/operations/add/payload.js +7 -1
  105. package/dist/client/queue/operations/add/single.js +3 -3
  106. package/dist/client/queue/operations/groups.d.ts +21 -0
  107. package/dist/client/queue/operations/groups.js +88 -0
  108. package/dist/client/queue/runtime/configuration.d.ts +4 -0
  109. package/dist/client/queue/runtime/configuration.js +8 -0
  110. package/dist/client/queue/runtime/queries.d.ts +13 -0
  111. package/dist/client/queue/runtime/queries.js +31 -0
  112. package/dist/client/queue/runtime/state.d.ts +4 -0
  113. package/dist/client/queue/runtime/state.js +1 -0
  114. package/dist/client/types/index.d.ts +2 -2
  115. package/dist/client/types/options.d.ts +4 -0
  116. package/dist/client/types/worker.d.ts +8 -0
  117. package/dist/client/worker/runtime/execution.js +4 -8
  118. package/dist/client/worker/runtime/options.js +3 -0
  119. package/dist/client/worker/runtime/polling.d.ts +1 -0
  120. package/dist/client/worker/runtime/polling.js +9 -0
  121. package/dist/client/worker/types/options.d.ts +2 -1
  122. package/dist/client/worker/workerPull.d.ts +2 -0
  123. package/dist/client/worker/workerPull.js +6 -4
  124. package/dist/config/resolve.d.ts +14 -0
  125. package/dist/config/resolve.js +50 -5
  126. package/dist/config/types.d.ts +18 -0
  127. package/dist/domain/job/groupFifoOrder.d.ts +9 -0
  128. package/dist/domain/job/groupFifoOrder.js +26 -0
  129. package/dist/domain/queue/dlqShard.d.ts +2 -0
  130. package/dist/domain/queue/dlqShard.js +16 -0
  131. package/dist/domain/queue/groupLimiterManager.d.ts +23 -0
  132. package/dist/domain/queue/groupLimiterManager.js +107 -0
  133. package/dist/domain/queue/groupScheduler.d.ts +31 -0
  134. package/dist/domain/queue/groupScheduler.js +256 -0
  135. package/dist/domain/queue/groupSchedulerOrder.d.ts +6 -0
  136. package/dist/domain/queue/groupSchedulerOrder.js +30 -0
  137. package/dist/domain/queue/priorityQueue.d.ts +13 -23
  138. package/dist/domain/queue/priorityQueue.js +53 -42
  139. package/dist/domain/queue/shard/dlq.d.ts +1 -0
  140. package/dist/domain/queue/shard/dlq.js +3 -0
  141. package/dist/domain/queue/shard/keys.d.ts +1 -0
  142. package/dist/domain/queue/shard/keys.js +25 -2
  143. package/dist/domain/queue/shard/lifecycle.js +4 -0
  144. package/dist/domain/queue/shard/limits.d.ts +20 -1
  145. package/dist/domain/queue/shard/limits.js +56 -0
  146. package/dist/domain/queue/shard/state.d.ts +5 -0
  147. package/dist/domain/queue/shard/state.js +9 -1
  148. package/dist/domain/types/commands/core.d.ts +3 -0
  149. package/dist/domain/types/commands/dlq.d.ts +5 -0
  150. package/dist/domain/types/commands/limits.d.ts +41 -0
  151. package/dist/domain/types/commands/union.d.ts +1 -1
  152. package/dist/domain/types/cron.d.ts +5 -0
  153. package/dist/domain/types/cron.js +14 -3
  154. package/dist/domain/types/dlq.d.ts +1 -1
  155. package/dist/domain/types/dlq.js +1 -2
  156. package/dist/domain/types/group.d.ts +21 -0
  157. package/dist/domain/types/group.js +78 -0
  158. package/dist/domain/types/jobs/model.d.ts +1 -1
  159. package/dist/domain/types/priorityQueue.d.ts +1 -0
  160. package/dist/infrastructure/cloud/commandHandler.js +5 -3
  161. package/dist/infrastructure/cloud/commands/integrations.js +11 -11
  162. package/dist/infrastructure/cloud/commands/jobs.js +48 -40
  163. package/dist/infrastructure/cloud/commands/queues.js +61 -75
  164. package/dist/infrastructure/cloud/queueAdapter/local.d.ts +41 -0
  165. package/dist/infrastructure/cloud/queueAdapter/local.js +187 -0
  166. package/dist/infrastructure/cloud/queueAdapter/postgres.d.ts +42 -0
  167. package/dist/infrastructure/cloud/queueAdapter/postgres.js +188 -0
  168. package/dist/infrastructure/cloud/queueAdapter/registry.d.ts +4 -0
  169. package/dist/infrastructure/cloud/queueAdapter/registry.js +15 -0
  170. package/dist/infrastructure/cloud/queueAdapter/types.d.ts +87 -0
  171. package/dist/infrastructure/cloud/queueAdapter/types.js +1 -0
  172. package/dist/infrastructure/cloud/snapshot/analytics.d.ts +2 -0
  173. package/dist/infrastructure/cloud/snapshot/analytics.js +7 -0
  174. package/dist/infrastructure/cloud/snapshot/collector.d.ts +4 -0
  175. package/dist/infrastructure/cloud/snapshot/collector.js +39 -1
  176. package/dist/infrastructure/cloud/snapshot/config.d.ts +3 -0
  177. package/dist/infrastructure/cloud/snapshot/config.js +43 -0
  178. package/dist/infrastructure/cloud/snapshot/jobs.d.ts +3 -0
  179. package/dist/infrastructure/cloud/snapshot/jobs.js +32 -1
  180. package/dist/infrastructure/cloud/snapshotCollector.js +20 -35
  181. package/dist/infrastructure/cloud/snapshotHelpers.d.ts +3 -3
  182. package/dist/infrastructure/cloud/snapshotHelpers.js +3 -3
  183. package/dist/infrastructure/cloud/statsRefresh.js +2 -1
  184. package/dist/infrastructure/cloud/types/command.d.ts +2 -2
  185. package/dist/infrastructure/persistence/jobOptionsBlob.d.ts +1 -0
  186. package/dist/infrastructure/persistence/jobOptionsBlob.js +10 -2
  187. package/dist/infrastructure/persistence/migrations.js +11 -0
  188. package/dist/infrastructure/persistence/postgres/admission.d.ts +18 -0
  189. package/dist/infrastructure/persistence/postgres/admission.js +196 -0
  190. package/dist/infrastructure/persistence/postgres/admissionParent.d.ts +5 -0
  191. package/dist/infrastructure/persistence/postgres/admissionParent.js +35 -0
  192. package/dist/infrastructure/persistence/postgres/admissionResult.d.ts +9 -0
  193. package/dist/infrastructure/persistence/postgres/admissionResult.js +1 -0
  194. package/dist/infrastructure/persistence/postgres/admissionStore.d.ts +12 -0
  195. package/dist/infrastructure/persistence/postgres/admissionStore.js +101 -0
  196. package/dist/infrastructure/persistence/postgres/advisoryLocks.d.ts +2 -0
  197. package/dist/infrastructure/persistence/postgres/advisoryLocks.js +13 -0
  198. package/dist/infrastructure/persistence/postgres/batchAdmission.d.ts +11 -0
  199. package/dist/infrastructure/persistence/postgres/batchAdmission.js +128 -0
  200. package/dist/infrastructure/persistence/postgres/batchCompletion.d.ts +4 -0
  201. package/dist/infrastructure/persistence/postgres/batchCompletion.js +174 -0
  202. package/dist/infrastructure/persistence/postgres/batchEvents.d.ts +14 -0
  203. package/dist/infrastructure/persistence/postgres/batchEvents.js +72 -0
  204. package/dist/infrastructure/persistence/postgres/brokerSessions.d.ts +14 -0
  205. package/dist/infrastructure/persistence/postgres/brokerSessions.js +94 -0
  206. package/dist/infrastructure/persistence/postgres/claimBatch.d.ts +14 -0
  207. package/dist/infrastructure/persistence/postgres/claimBatch.js +69 -0
  208. package/dist/infrastructure/persistence/postgres/claimSelection.d.ts +11 -0
  209. package/dist/infrastructure/persistence/postgres/claimSelection.js +140 -0
  210. package/dist/infrastructure/persistence/postgres/claims.d.ts +10 -0
  211. package/dist/infrastructure/persistence/postgres/claims.js +153 -0
  212. package/dist/infrastructure/persistence/postgres/cloudReadModel.d.ts +26 -0
  213. package/dist/infrastructure/persistence/postgres/cloudReadModel.js +123 -0
  214. package/dist/infrastructure/persistence/postgres/codec.d.ts +30 -0
  215. package/dist/infrastructure/persistence/postgres/codec.js +82 -0
  216. package/dist/infrastructure/persistence/postgres/completionEvents.d.ts +11 -0
  217. package/dist/infrastructure/persistence/postgres/completionEvents.js +21 -0
  218. package/dist/infrastructure/persistence/postgres/completionLifecycle.d.ts +11 -0
  219. package/dist/infrastructure/persistence/postgres/completionLifecycle.js +145 -0
  220. package/dist/infrastructure/persistence/postgres/completionOutcome.d.ts +4 -0
  221. package/dist/infrastructure/persistence/postgres/completionOutcome.js +112 -0
  222. package/dist/infrastructure/persistence/postgres/completionQueries.d.ts +10 -0
  223. package/dist/infrastructure/persistence/postgres/completionQueries.js +87 -0
  224. package/dist/infrastructure/persistence/postgres/connection.d.ts +3 -0
  225. package/dist/infrastructure/persistence/postgres/connection.js +15 -0
  226. package/dist/infrastructure/persistence/postgres/context.d.ts +28 -0
  227. package/dist/infrastructure/persistence/postgres/context.js +74 -0
  228. package/dist/infrastructure/persistence/postgres/control.d.ts +23 -0
  229. package/dist/infrastructure/persistence/postgres/control.js +105 -0
  230. package/dist/infrastructure/persistence/postgres/crons.d.ts +18 -0
  231. package/dist/infrastructure/persistence/postgres/crons.js +205 -0
  232. package/dist/infrastructure/persistence/postgres/deduplication.d.ts +9 -0
  233. package/dist/infrastructure/persistence/postgres/deduplication.js +47 -0
  234. package/dist/infrastructure/persistence/postgres/dependencyDestruction.d.ts +14 -0
  235. package/dist/infrastructure/persistence/postgres/dependencyDestruction.js +74 -0
  236. package/dist/infrastructure/persistence/postgres/dependencyPromotion.d.ts +29 -0
  237. package/dist/infrastructure/persistence/postgres/dependencyPromotion.js +212 -0
  238. package/dist/infrastructure/persistence/postgres/destructiveMutations.d.ts +4 -0
  239. package/dist/infrastructure/persistence/postgres/destructiveMutations.js +111 -0
  240. package/dist/infrastructure/persistence/postgres/dlqLifecycle.d.ts +13 -0
  241. package/dist/infrastructure/persistence/postgres/dlqLifecycle.js +184 -0
  242. package/dist/infrastructure/persistence/postgres/dlqMaintenance.d.ts +6 -0
  243. package/dist/infrastructure/persistence/postgres/dlqMaintenance.js +36 -0
  244. package/dist/infrastructure/persistence/postgres/dlqRetryPlan.d.ts +21 -0
  245. package/dist/infrastructure/persistence/postgres/dlqRetryPlan.js +92 -0
  246. package/dist/infrastructure/persistence/postgres/eventCatchupCursors.d.ts +32 -0
  247. package/dist/infrastructure/persistence/postgres/eventCatchupCursors.js +66 -0
  248. package/dist/infrastructure/persistence/postgres/eventCommitGc.d.ts +27 -0
  249. package/dist/infrastructure/persistence/postgres/eventCommitGc.js +62 -0
  250. package/dist/infrastructure/persistence/postgres/eventJournal.d.ts +18 -0
  251. package/dist/infrastructure/persistence/postgres/eventJournal.js +76 -0
  252. package/dist/infrastructure/persistence/postgres/eventJournalSchema.d.ts +5 -0
  253. package/dist/infrastructure/persistence/postgres/eventJournalSchema.js +267 -0
  254. package/dist/infrastructure/persistence/postgres/eventPruneWatermarks.d.ts +26 -0
  255. package/dist/infrastructure/persistence/postgres/eventPruneWatermarks.js +129 -0
  256. package/dist/infrastructure/persistence/postgres/eventRetention.d.ts +18 -0
  257. package/dist/infrastructure/persistence/postgres/eventRetention.js +76 -0
  258. package/dist/infrastructure/persistence/postgres/events.d.ts +45 -0
  259. package/dist/infrastructure/persistence/postgres/events.js +276 -0
  260. package/dist/infrastructure/persistence/postgres/expiry.d.ts +3 -0
  261. package/dist/infrastructure/persistence/postgres/expiry.js +74 -0
  262. package/dist/infrastructure/persistence/postgres/flowFailures.d.ts +17 -0
  263. package/dist/infrastructure/persistence/postgres/flowFailures.js +199 -0
  264. package/dist/infrastructure/persistence/postgres/groupClaims.d.ts +15 -0
  265. package/dist/infrastructure/persistence/postgres/groupClaims.js +95 -0
  266. package/dist/infrastructure/persistence/postgres/groupSchema.d.ts +2 -0
  267. package/dist/infrastructure/persistence/postgres/groupSchema.js +155 -0
  268. package/dist/infrastructure/persistence/postgres/groupSchemaFingerprint.d.ts +3 -0
  269. package/dist/infrastructure/persistence/postgres/groupSchemaFingerprint.js +127 -0
  270. package/dist/infrastructure/persistence/postgres/groupStateRetention.d.ts +3 -0
  271. package/dist/infrastructure/persistence/postgres/groupStateRetention.js +93 -0
  272. package/dist/infrastructure/persistence/postgres/groups.d.ts +11 -0
  273. package/dist/infrastructure/persistence/postgres/groups.js +117 -0
  274. package/dist/infrastructure/persistence/postgres/jobData.d.ts +3 -0
  275. package/dist/infrastructure/persistence/postgres/jobData.js +32 -0
  276. package/dist/infrastructure/persistence/postgres/leaseRelease.d.ts +9 -0
  277. package/dist/infrastructure/persistence/postgres/leaseRelease.js +120 -0
  278. package/dist/infrastructure/persistence/postgres/leaseRenewal.d.ts +4 -0
  279. package/dist/infrastructure/persistence/postgres/leaseRenewal.js +35 -0
  280. package/dist/infrastructure/persistence/postgres/lifetimeMetrics.d.ts +15 -0
  281. package/dist/infrastructure/persistence/postgres/lifetimeMetrics.js +46 -0
  282. package/dist/infrastructure/persistence/postgres/lifetimeMetricsFinalizer.d.ts +4 -0
  283. package/dist/infrastructure/persistence/postgres/lifetimeMetricsFinalizer.js +13 -0
  284. package/dist/infrastructure/persistence/postgres/logs.d.ts +6 -0
  285. package/dist/infrastructure/persistence/postgres/logs.js +70 -0
  286. package/dist/infrastructure/persistence/postgres/maintenance.d.ts +6 -0
  287. package/dist/infrastructure/persistence/postgres/maintenance.js +138 -0
  288. package/dist/infrastructure/persistence/postgres/maintenanceFlights.d.ts +14 -0
  289. package/dist/infrastructure/persistence/postgres/maintenanceFlights.js +66 -0
  290. package/dist/infrastructure/persistence/postgres/metricWrites.d.ts +9 -0
  291. package/dist/infrastructure/persistence/postgres/metricWrites.js +94 -0
  292. package/dist/infrastructure/persistence/postgres/mutations.d.ts +9 -0
  293. package/dist/infrastructure/persistence/postgres/mutations.js +171 -0
  294. package/dist/infrastructure/persistence/postgres/outcomes.d.ts +4 -0
  295. package/dist/infrastructure/persistence/postgres/outcomes.js +194 -0
  296. package/dist/infrastructure/persistence/postgres/policies.d.ts +11 -0
  297. package/dist/infrastructure/persistence/postgres/policies.js +18 -0
  298. package/dist/infrastructure/persistence/postgres/postCommitMaintenance.d.ts +17 -0
  299. package/dist/infrastructure/persistence/postgres/postCommitMaintenance.js +117 -0
  300. package/dist/infrastructure/persistence/postgres/promotion.d.ts +3 -0
  301. package/dist/infrastructure/persistence/postgres/promotion.js +43 -0
  302. package/dist/infrastructure/persistence/postgres/queries.d.ts +22 -0
  303. package/dist/infrastructure/persistence/postgres/queries.js +152 -0
  304. package/dist/infrastructure/persistence/postgres/queueDestruction.d.ts +3 -0
  305. package/dist/infrastructure/persistence/postgres/queueDestruction.js +158 -0
  306. package/dist/infrastructure/persistence/postgres/queueLifecycle.d.ts +10 -0
  307. package/dist/infrastructure/persistence/postgres/queueLifecycle.js +60 -0
  308. package/dist/infrastructure/persistence/postgres/rateLimit.d.ts +6 -0
  309. package/dist/infrastructure/persistence/postgres/rateLimit.js +10 -0
  310. package/dist/infrastructure/persistence/postgres/readModels.d.ts +32 -0
  311. package/dist/infrastructure/persistence/postgres/readModels.js +72 -0
  312. package/dist/infrastructure/persistence/postgres/recovery.d.ts +3 -0
  313. package/dist/infrastructure/persistence/postgres/recovery.js +178 -0
  314. package/dist/infrastructure/persistence/postgres/relationships.d.ts +9 -0
  315. package/dist/infrastructure/persistence/postgres/relationships.js +201 -0
  316. package/dist/infrastructure/persistence/postgres/removeUnprocessedChildren.d.ts +4 -0
  317. package/dist/infrastructure/persistence/postgres/removeUnprocessedChildren.js +241 -0
  318. package/dist/infrastructure/persistence/postgres/repeatMutations.d.ts +5 -0
  319. package/dist/infrastructure/persistence/postgres/repeatMutations.js +37 -0
  320. package/dist/infrastructure/persistence/postgres/runtime.d.ts +45 -0
  321. package/dist/infrastructure/persistence/postgres/runtime.js +238 -0
  322. package/dist/infrastructure/persistence/postgres/runtimeConfig.d.ts +21 -0
  323. package/dist/infrastructure/persistence/postgres/runtimeConfig.js +39 -0
  324. package/dist/infrastructure/persistence/postgres/schema.d.ts +4 -0
  325. package/dist/infrastructure/persistence/postgres/schema.js +261 -0
  326. package/dist/infrastructure/persistence/postgres/schemaInitialization.d.ts +3 -0
  327. package/dist/infrastructure/persistence/postgres/schemaInitialization.js +226 -0
  328. package/dist/infrastructure/persistence/postgres/serialAdmission.d.ts +6 -0
  329. package/dist/infrastructure/persistence/postgres/serialAdmission.js +96 -0
  330. package/dist/infrastructure/persistence/postgres/snapshotBudget.d.ts +3 -0
  331. package/dist/infrastructure/persistence/postgres/snapshotBudget.js +83 -0
  332. package/dist/infrastructure/persistence/postgres/storageHealth.d.ts +10 -0
  333. package/dist/infrastructure/persistence/postgres/storageHealth.js +29 -0
  334. package/dist/infrastructure/persistence/postgres/store.d.ts +100 -0
  335. package/dist/infrastructure/persistence/postgres/store.js +180 -0
  336. package/dist/infrastructure/persistence/postgres/telemetry.d.ts +8 -0
  337. package/dist/infrastructure/persistence/postgres/telemetry.js +100 -0
  338. package/dist/infrastructure/persistence/postgres/terminal.d.ts +8 -0
  339. package/dist/infrastructure/persistence/postgres/terminal.js +137 -0
  340. package/dist/infrastructure/persistence/postgres/transactionRetry.d.ts +6 -0
  341. package/dist/infrastructure/persistence/postgres/transactionRetry.js +42 -0
  342. package/dist/infrastructure/persistence/postgres/types.d.ts +176 -0
  343. package/dist/infrastructure/persistence/postgres/types.js +1 -0
  344. package/dist/infrastructure/persistence/postgres/workers.d.ts +15 -0
  345. package/dist/infrastructure/persistence/postgres/workers.js +126 -0
  346. package/dist/infrastructure/persistence/postgres.d.ts +2 -0
  347. package/dist/infrastructure/persistence/postgres.js +1 -0
  348. package/dist/infrastructure/persistence/schema.d.ts +2 -2
  349. package/dist/infrastructure/persistence/schema.js +12 -1
  350. package/dist/infrastructure/persistence/sqlite/control.d.ts +14 -0
  351. package/dist/infrastructure/persistence/sqlite/control.js +69 -0
  352. package/dist/infrastructure/persistence/sqlite/jobs.d.ts +12 -0
  353. package/dist/infrastructure/persistence/sqlite/jobs.js +38 -0
  354. package/dist/infrastructure/persistence/sqlite/telemetry.d.ts +2 -1
  355. package/dist/infrastructure/persistence/sqlite/telemetry.js +5 -64
  356. package/dist/infrastructure/persistence/sqlite/telemetryWrites.d.ts +4 -0
  357. package/dist/infrastructure/persistence/sqlite/telemetryWrites.js +123 -0
  358. package/dist/infrastructure/persistence/sqliteSerializer.js +2 -0
  359. package/dist/infrastructure/scheduler/cron/persisted.d.ts +5 -0
  360. package/dist/infrastructure/scheduler/cron/persisted.js +27 -0
  361. package/dist/infrastructure/scheduler/cron/runtime.js +5 -10
  362. package/dist/infrastructure/scheduler/cron/validation.d.ts +3 -0
  363. package/dist/infrastructure/scheduler/cron/validation.js +11 -0
  364. package/dist/infrastructure/scheduler/cronParser.d.ts +1 -1
  365. package/dist/infrastructure/scheduler/cronParser.js +144 -11
  366. package/dist/infrastructure/server/bootstrap.d.ts +2 -3
  367. package/dist/infrastructure/server/bootstrap.js +33 -59
  368. package/dist/infrastructure/server/errors.d.ts +4 -0
  369. package/dist/infrastructure/server/errors.js +54 -0
  370. package/dist/infrastructure/server/handler-routes/control.d.ts +5 -5
  371. package/dist/infrastructure/server/handler-routes/control.js +16 -1
  372. package/dist/infrastructure/server/handler-routes/monitoring.d.ts +2 -2
  373. package/dist/infrastructure/server/handler.js +9 -11
  374. package/dist/infrastructure/server/handlers/advanced/dependencies.js +7 -6
  375. package/dist/infrastructure/server/handlers/advanced/jobs.js +19 -6
  376. package/dist/infrastructure/server/handlers/advanced/queue.d.ts +9 -9
  377. package/dist/infrastructure/server/handlers/advanced/queue.js +91 -27
  378. package/dist/infrastructure/server/handlers/core.d.ts +0 -5
  379. package/dist/infrastructure/server/handlers/core.js +47 -49
  380. package/dist/infrastructure/server/handlers/cron.d.ts +4 -4
  381. package/dist/infrastructure/server/handlers/cron.js +60 -59
  382. package/dist/infrastructure/server/handlers/dashboard.d.ts +1 -1
  383. package/dist/infrastructure/server/handlers/dashboard.js +21 -8
  384. package/dist/infrastructure/server/handlers/dlq.d.ts +6 -3
  385. package/dist/infrastructure/server/handlers/dlq.js +35 -9
  386. package/dist/infrastructure/server/handlers/flow.js +2 -1
  387. package/dist/infrastructure/server/handlers/groups.d.ts +11 -0
  388. package/dist/infrastructure/server/handlers/groups.js +55 -0
  389. package/dist/infrastructure/server/handlers/management.d.ts +5 -5
  390. package/dist/infrastructure/server/handlers/management.js +36 -9
  391. package/dist/infrastructure/server/handlers/monitoring/health.d.ts +5 -5
  392. package/dist/infrastructure/server/handlers/monitoring/health.js +45 -16
  393. package/dist/infrastructure/server/handlers/monitoring/operations.d.ts +1 -1
  394. package/dist/infrastructure/server/handlers/monitoring/operations.js +8 -1
  395. package/dist/infrastructure/server/handlers/monitoring/workers.d.ts +3 -3
  396. package/dist/infrastructure/server/handlers/monitoring/workers.js +31 -7
  397. package/dist/infrastructure/server/handlers/pushBatchValidation.d.ts +3 -1
  398. package/dist/infrastructure/server/handlers/pushBatchValidation.js +56 -8
  399. package/dist/infrastructure/server/handlers/query.d.ts +1 -1
  400. package/dist/infrastructure/server/handlers/query.js +5 -4
  401. package/dist/infrastructure/server/http.js +2 -2
  402. package/dist/infrastructure/server/httpDashboardEndpoints.d.ts +1 -1
  403. package/dist/infrastructure/server/httpDashboardEndpoints.js +19 -6
  404. package/dist/infrastructure/server/httpEndpoints.js +18 -7
  405. package/dist/infrastructure/server/httpRouteQueues.js +11 -1
  406. package/dist/infrastructure/server/protocol/validation.d.ts +1 -0
  407. package/dist/infrastructure/server/protocol/validation.js +1 -0
  408. package/dist/infrastructure/server/protocol.d.ts +1 -1
  409. package/dist/infrastructure/server/protocol.js +1 -1
  410. package/dist/infrastructure/server/shutdownCoordinator.d.ts +24 -0
  411. package/dist/infrastructure/server/shutdownCoordinator.js +106 -0
  412. package/dist/infrastructure/server/sseHandler.js +8 -3
  413. package/dist/infrastructure/server/storageAdapter.d.ts +29 -0
  414. package/dist/infrastructure/server/storageAdapter.js +61 -0
  415. package/dist/infrastructure/server/storageManager.d.ts +12 -0
  416. package/dist/infrastructure/server/storageManager.js +102 -0
  417. package/dist/infrastructure/server/tcp.js +2 -3
  418. package/dist/infrastructure/server/ws/snapshots.d.ts +1 -1
  419. package/dist/infrastructure/server/ws/snapshots.js +19 -4
  420. package/dist/infrastructure/server/wsHandler.js +10 -5
  421. package/dist/main.js +1 -1
  422. package/dist/mcp/backend/embedded/services.js +2 -1
  423. package/dist/mcp/index.d.ts +2 -2
  424. package/dist/mcp/index.js +2 -2
  425. package/dist/shared/storageHealth.d.ts +9 -0
  426. package/dist/shared/storageHealth.js +12 -0
  427. package/package.json +75 -65
@@ -0,0 +1,61 @@
1
+ /** Immutable adapter registry: adding an engine does not change server bootstrap. */
2
+ export class StorageAdapterRegistry {
3
+ adapters = new Map();
4
+ constructor(adapters) {
5
+ for (const adapter of adapters) {
6
+ if (this.adapters.has(adapter.driver)) {
7
+ throw new Error(`Duplicate storage adapter: ${adapter.driver}`);
8
+ }
9
+ this.adapters.set(adapter.driver, adapter);
10
+ }
11
+ }
12
+ resolve(driver) {
13
+ const adapter = this.adapters.get(driver);
14
+ if (!adapter)
15
+ throw new Error(`Unsupported storage driver: ${driver}`);
16
+ return adapter;
17
+ }
18
+ drivers() {
19
+ return [...this.adapters.keys()];
20
+ }
21
+ }
22
+ /** Lifecycle facade that remembers which strategy owns each created manager. */
23
+ export class ServerStorageManager {
24
+ registry;
25
+ owners = new WeakMap();
26
+ shutdowns = new WeakMap();
27
+ constructor(registry) {
28
+ this.registry = registry;
29
+ }
30
+ startupError(config) {
31
+ return this.registry.resolve(config.storageDriver).startupError(config);
32
+ }
33
+ async create(config) {
34
+ const adapter = this.registry.resolve(config.storageDriver);
35
+ const manager = await adapter.create(config);
36
+ this.owners.set(manager, adapter);
37
+ return manager;
38
+ }
39
+ async shutdown(manager) {
40
+ const pending = this.shutdowns.get(manager);
41
+ if (pending) {
42
+ await pending;
43
+ return true;
44
+ }
45
+ const adapter = this.owners.get(manager);
46
+ if (!adapter)
47
+ return false;
48
+ const shutdown = adapter
49
+ .shutdown(manager)
50
+ .then(() => {
51
+ this.owners.delete(manager);
52
+ })
53
+ .finally(() => this.shutdowns.delete(manager));
54
+ this.shutdowns.set(manager, shutdown);
55
+ await shutdown;
56
+ return true;
57
+ }
58
+ display(config) {
59
+ return this.registry.resolve(config.storageDriver).display(config);
60
+ }
61
+ }
@@ -0,0 +1,12 @@
1
+ import { QueueManager } from '../../application/queueManager';
2
+ import type { ResolvedConfig } from '../../config';
3
+ import { ServerStorageManager, StorageAdapterRegistry } from './storageAdapter';
4
+ export declare const serverStorageAdapters: StorageAdapterRegistry;
5
+ export declare const serverStorageManager: ServerStorageManager;
6
+ export declare function storageStartupError(config: ResolvedConfig): string | null;
7
+ export declare function backupStartupError(config: Pick<ResolvedConfig, 's3BackupEnabled' | 'dataPath'> & {
8
+ storageDriver?: ResolvedConfig['storageDriver'];
9
+ }): string | null;
10
+ export declare function createServerQueueManager(config: ResolvedConfig): Promise<QueueManager>;
11
+ export declare function shutdownServerQueueManager(manager: QueueManager): Promise<void>;
12
+ export declare function storageDisplay(config: ResolvedConfig): string;
@@ -0,0 +1,102 @@
1
+ import { PostgresQueueManager } from '../../application/postgresQueueManager';
2
+ import { QueueManager } from '../../application/queueManager';
3
+ import { ServerStorageManager, StorageAdapterRegistry, } from './storageAdapter';
4
+ function localAdapter(driver) {
5
+ return {
6
+ driver,
7
+ startupError: (config) => driver === 'sqlite' && !config.dataPath
8
+ ? 'SQLite storage requires storage.dataPath or BUNQUEUE_DATA_PATH.'
9
+ : null,
10
+ create: (config) => Promise.resolve(new QueueManager({
11
+ ...(driver === 'sqlite' && { dataPath: config.dataPath }),
12
+ maxPrometheusQueues: config.maxPrometheusQueues,
13
+ })),
14
+ shutdown: (manager) => {
15
+ manager.shutdown();
16
+ return Promise.resolve();
17
+ },
18
+ display: (config) => driver === 'sqlite' && config.dataPath
19
+ ? `SQLite · ${config.dataPath}`
20
+ : 'in-memory · ephemeral',
21
+ };
22
+ }
23
+ const postgresAdapter = {
24
+ driver: 'postgres',
25
+ startupError(config) {
26
+ if (!config.postgresUrl) {
27
+ return 'PostgreSQL storage requires storage.url or BUNQUEUE_POSTGRES_URL.';
28
+ }
29
+ if (config.dataPath) {
30
+ return 'PostgreSQL storage cannot be combined with SQLite dataPath configuration.';
31
+ }
32
+ return null;
33
+ },
34
+ async create(config) {
35
+ if (!config.postgresUrl)
36
+ throw new Error('PostgreSQL storage URL is missing');
37
+ const manager = new PostgresQueueManager({
38
+ maxPrometheusQueues: config.maxPrometheusQueues,
39
+ postgres: {
40
+ url: config.postgresUrl,
41
+ namespace: config.postgresNamespace,
42
+ poolSize: config.postgresPoolSize,
43
+ leaseDurationMs: config.postgresLeaseDurationMs,
44
+ pollIntervalMs: config.postgresPollIntervalMs,
45
+ statementTimeoutMs: config.postgresStatementTimeoutMs,
46
+ lockTimeoutMs: config.postgresLockTimeoutMs,
47
+ idleTransactionTimeoutMs: config.postgresIdleTransactionTimeoutMs,
48
+ maxConcurrentOperations: config.postgresMaxConcurrentOperations,
49
+ maxQueuedOperations: config.postgresMaxQueuedOperations,
50
+ maxSnapshotJobs: config.postgresMaxSnapshotJobs,
51
+ maxSnapshotPayloadBytes: config.postgresMaxSnapshotPayloadBytes,
52
+ ...(config.postgresBrokerId && { brokerId: config.postgresBrokerId }),
53
+ },
54
+ });
55
+ try {
56
+ await manager.waitUntilReady();
57
+ return manager;
58
+ }
59
+ catch (error) {
60
+ await manager.shutdownPostgres().catch(() => undefined);
61
+ throw error;
62
+ }
63
+ },
64
+ async shutdown(manager) {
65
+ if (!(manager instanceof PostgresQueueManager)) {
66
+ throw new Error('PostgreSQL adapter received an incompatible queue manager');
67
+ }
68
+ await manager.shutdownPostgres();
69
+ },
70
+ display: (config) => `PostgreSQL · namespace ${config.postgresNamespace}`,
71
+ };
72
+ export const serverStorageAdapters = new StorageAdapterRegistry([
73
+ localAdapter('memory'),
74
+ localAdapter('sqlite'),
75
+ postgresAdapter,
76
+ ]);
77
+ export const serverStorageManager = new ServerStorageManager(serverStorageAdapters);
78
+ export function storageStartupError(config) {
79
+ return serverStorageManager.startupError(config);
80
+ }
81
+ export function backupStartupError(config) {
82
+ const driver = config.storageDriver ?? (config.dataPath ? 'sqlite' : 'memory');
83
+ if (config.s3BackupEnabled && (driver !== 'sqlite' || !config.dataPath)) {
84
+ return ('S3 backup requires persistent SQLite storage. Set BUNQUEUE_DATA_PATH ' +
85
+ 'or storage.dataPath before enabling S3_BACKUP_ENABLED.');
86
+ }
87
+ return null;
88
+ }
89
+ export async function createServerQueueManager(config) {
90
+ return await serverStorageManager.create(config);
91
+ }
92
+ export async function shutdownServerQueueManager(manager) {
93
+ if (await serverStorageManager.shutdown(manager))
94
+ return;
95
+ if (manager instanceof PostgresQueueManager)
96
+ await manager.shutdownPostgres();
97
+ else
98
+ manager.shutdown();
99
+ }
100
+ export function storageDisplay(config) {
101
+ return serverStorageManager.display(config);
102
+ }
@@ -2,6 +2,7 @@ import { tcpLog } from '../../shared/logger';
2
2
  import { decodeMessagePack } from '../../shared/msgpack';
3
3
  import { withSemaphore } from '../../shared/semaphore';
4
4
  import { handleCommand } from './handler';
5
+ import { sanitizeServerError } from './errors';
5
6
  import { FrameSizeError } from './protocol';
6
7
  import { getRateLimiter } from './rateLimiter';
7
8
  import { TcpConnectionRegistry } from './tcp/connections';
@@ -69,9 +70,7 @@ export function createTcpServer(queueManager, config) {
69
70
  registry.dropForWriteOverflow(socket);
70
71
  }
71
72
  catch (error) {
72
- const raw = error instanceof Error ? error.message : 'Unknown error';
73
- const message = raw.includes('SQLITE') || raw.includes('database') ? 'Internal server error' : raw;
74
- writeQueue.write(socket, tcpErrorResponse(message, command.reqId));
73
+ writeQueue.write(socket, tcpErrorResponse(sanitizeServerError(error), command.reqId));
75
74
  registry.dropForWriteOverflow(socket);
76
75
  }
77
76
  });
@@ -1,4 +1,4 @@
1
1
  import type { QueueManager } from '../../../application/queueManager';
2
- export declare function buildStatsSnapshot(queueManager: QueueManager): Record<string, unknown>;
2
+ export declare function buildStatsSnapshot(queueManager: QueueManager): Record<string, unknown> | Promise<Record<string, unknown>>;
3
3
  export declare function buildHealthSnapshot(queueManager: QueueManager, connectionCount: number, connectionType?: 'ws' | 'sse'): Record<string, unknown>;
4
4
  export declare function buildStorageSnapshot(queueManager: QueueManager): Record<string, unknown>;
@@ -1,9 +1,24 @@
1
1
  import { throughputTracker } from '../../../application/throughputTracker';
2
+ import { isStorageDegraded } from '../../../shared/storageHealth';
3
+ const WORKER_TIMEOUT_MS = parseInt(Bun.env.WORKER_TIMEOUT_MS ?? '30000', 10);
2
4
  export function buildStatsSnapshot(queueManager) {
5
+ const manager = queueManager;
6
+ if (manager.listWorkersDurable || manager.listCronsDurable) {
7
+ return Promise.all([
8
+ manager.listWorkersDurable
9
+ ? manager.listWorkersDurable()
10
+ : Promise.resolve(manager.workerManager.list()),
11
+ manager.listCronsDurable ? manager.listCronsDurable() : Promise.resolve(manager.listCrons()),
12
+ ]).then(([workers, crons]) => statsSnapshot(manager, workers, crons.length));
13
+ }
14
+ return statsSnapshot(manager, manager.workerManager.list(), manager.listCrons().length);
15
+ }
16
+ function statsSnapshot(queueManager, workers, cronJobs) {
3
17
  const stats = queueManager.getStats();
4
18
  const rates = throughputTracker.getRates();
5
19
  const perQueue = queueManager.getPerQueueStats();
6
- const workerStats = queueManager.workerManager.getStats();
20
+ const now = Date.now();
21
+ const activeWorkers = workers.filter((worker) => now - worker.lastSeen < WORKER_TIMEOUT_MS);
7
22
  const queues = {};
8
23
  for (const [name, value] of perQueue) {
9
24
  queues[name] = {
@@ -27,15 +42,15 @@ export function buildStatsSnapshot(queueManager) {
27
42
  pullPerSec: rates.pullPerSec,
28
43
  uptime: stats.uptime,
29
44
  queues,
30
- workers: { total: workerStats.total, active: workerStats.active },
31
- cronJobs: queueManager.listCrons().length,
45
+ workers: { total: workers.length, active: activeWorkers.length },
46
+ cronJobs,
32
47
  };
33
48
  }
34
49
  export function buildHealthSnapshot(queueManager, connectionCount, connectionType = 'ws') {
35
50
  const memory = process.memoryUsage();
36
51
  const storage = queueManager.getStorageStatus();
37
52
  return {
38
- ok: !storage.diskFull,
53
+ ok: !isStorageDegraded(storage),
39
54
  uptime: Math.floor(process.uptime()),
40
55
  memory: {
41
56
  rss: Math.round(memory.rss / 1024 / 1024),
@@ -12,6 +12,7 @@
12
12
  * Legacy: clients that never Subscribe get all events in old format
13
13
  */
14
14
  import { handleCommand } from './handler';
15
+ import { sanitizeServerError } from './errors';
15
16
  import { parseCommand, serializeResponse, errorResponse } from './protocol';
16
17
  import { QueueCountsScheduler } from './queueCountsScheduler';
17
18
  import { matchesWsSubscription, MAX_WS_CLIENTS, textDecoder, WS_BACKPRESSURE_BYTES, WS_EVENT_MAP, } from './ws/constants';
@@ -61,7 +62,7 @@ export class WsHandler {
61
62
  });
62
63
  this.statsInterval ??= setInterval(() => {
63
64
  if (this.clients.size > 0)
64
- this.broadcastStats(qm);
65
+ void this.broadcastStats(qm);
65
66
  }, 5000);
66
67
  this.healthInterval ??= setInterval(() => {
67
68
  if (this.clients.size > 0)
@@ -90,8 +91,13 @@ export class WsHandler {
90
91
  }
91
92
  }
92
93
  // ── Periodic broadcasts ──────────────────────────────────
93
- broadcastStats(qm) {
94
- this.emit('stats:snapshot', buildStatsSnapshot(qm));
94
+ async broadcastStats(qm) {
95
+ try {
96
+ this.emit('stats:snapshot', await buildStatsSnapshot(qm));
97
+ }
98
+ catch {
99
+ // A failed durable read must not be replaced by a stale local snapshot.
100
+ }
95
101
  }
96
102
  broadcastHealth(qm) {
97
103
  this.emit('health:status', buildHealthSnapshot(qm, this.clients.size));
@@ -199,8 +205,7 @@ export class WsHandler {
199
205
  ws.send(serializeResponse(response));
200
206
  }
201
207
  catch (err) {
202
- const msg = err instanceof Error ? err.message : 'Unknown error';
203
- ws.send(errorResponse(msg, cmd.reqId));
208
+ ws.send(errorResponse(sanitizeServerError(err), cmd.reqId));
204
209
  }
205
210
  }
206
211
  getClients() {
package/dist/main.js CHANGED
@@ -30,7 +30,7 @@ async function startServer() {
30
30
  // Load config file (bunqueue.config.ts) if present, then merge with env vars
31
31
  const fileConfig = await loadConfigFile();
32
32
  const config = resolveServerConfig(fileConfig);
33
- bootServer(fileConfig, config);
33
+ await bootServer(fileConfig, config);
34
34
  }
35
35
  // Logger env-var bootstrap only applies when this file is the entry point.
36
36
  // Imported consumers (e.g. user config files using `defineConfig`) must not
@@ -1,6 +1,7 @@
1
1
  import { jobId as toJobId } from '../../../domain/types/job';
2
2
  import { serializeMcpCron } from '../serializers';
3
3
  import { EmbeddedQueueBackend } from './queues';
4
+ import { clientStorageStatus } from '../../../shared/storageHealth';
4
5
  export class EmbeddedServiceBackend extends EmbeddedQueueBackend {
5
6
  addCron(input) {
6
7
  return Promise.resolve(serializeMcpCron(this.manager.addCron(input)));
@@ -93,7 +94,7 @@ export class EmbeddedServiceBackend extends EmbeddedQueueBackend {
93
94
  return Promise.resolve(this.manager.getPrometheusMetrics());
94
95
  }
95
96
  getStorageStatus() {
96
- const status = this.manager.getStorageStatus();
97
+ const status = clientStorageStatus(this.manager.getStorageStatus());
97
98
  return Promise.resolve({ diskFull: status.diskFull, error: status.error });
98
99
  }
99
100
  clearJobLogs(id, keepLogs) {
@@ -6,8 +6,8 @@
6
6
  * Uses the official @modelcontextprotocol/sdk for protocol compliance.
7
7
  *
8
8
  * Supports two connection modes:
9
- * - embedded (default): Direct SQLite access via QueueManager
10
- * - tcp: Connect to a remote bunqueue server
9
+ * - embedded (default): In-memory or direct SQLite access via QueueManager
10
+ * - tcp: Connect to a remote memory/SQLite or PostgreSQL-backed server
11
11
  *
12
12
  * @example Embedded mode (Claude Desktop):
13
13
  * ```json
package/dist/mcp/index.js CHANGED
@@ -7,8 +7,8 @@
7
7
  * Uses the official @modelcontextprotocol/sdk for protocol compliance.
8
8
  *
9
9
  * Supports two connection modes:
10
- * - embedded (default): Direct SQLite access via QueueManager
11
- * - tcp: Connect to a remote bunqueue server
10
+ * - embedded (default): In-memory or direct SQLite access via QueueManager
11
+ * - tcp: Connect to a remote memory/SQLite or PostgreSQL-backed server
12
12
  *
13
13
  * @example Embedded mode (Claude Desktop):
14
14
  * ```json
@@ -0,0 +1,9 @@
1
+ export interface StorageHealthStatus {
2
+ readonly diskFull: boolean;
3
+ readonly error: string | null;
4
+ readonly since: number | null;
5
+ }
6
+ /** A storage error is degraded even when the underlying failure is not a full disk. */
7
+ export declare function isStorageDegraded(status: StorageHealthStatus): boolean;
8
+ /** Project internal health into a client-safe copy without mutating runtime diagnostics. */
9
+ export declare function clientStorageStatus(status: StorageHealthStatus): StorageHealthStatus;
@@ -0,0 +1,12 @@
1
+ /** A storage error is degraded even when the underlying failure is not a full disk. */
2
+ export function isStorageDegraded(status) {
3
+ return status.diskFull || status.error !== null;
4
+ }
5
+ /** Project internal health into a client-safe copy without mutating runtime diagnostics. */
6
+ export function clientStorageStatus(status) {
7
+ return {
8
+ diskFull: status.diskFull,
9
+ error: status.error === null || status.diskFull ? status.error : 'Internal server error',
10
+ since: status.since,
11
+ };
12
+ }
package/package.json CHANGED
@@ -1,14 +1,74 @@
1
1
  {
2
2
  "name": "bunqueue",
3
- "version": "2.8.60",
4
- "description": "High-performance job queue for Bun & AI agents. SQLite persistence, cron scheduling, priorities, retries, DLQ, webhooks, native MCP server. Zero external infrastructure.",
5
- "type": "module",
6
- "main": "dist/main.js",
7
- "types": "dist/main.d.ts",
3
+ "version": "2.9.2",
4
+ "description": "High-performance job queue for Bun and AI agents. Memory or one-file SQLite, optional PostgreSQL 15–18 multi-broker persistence, cron, retries, DLQ, and MCP.",
5
+ "keywords": [
6
+ "agentic",
7
+ "ai",
8
+ "ai-agent",
9
+ "ai-native",
10
+ "automation",
11
+ "background-jobs",
12
+ "bullmq-alternative",
13
+ "bun",
14
+ "compensation",
15
+ "cron",
16
+ "dead-letter-queue",
17
+ "delayed-jobs",
18
+ "dlq",
19
+ "human-in-the-loop",
20
+ "inngest-alternative",
21
+ "job-queue",
22
+ "mcp",
23
+ "message-queue",
24
+ "model-context-protocol",
25
+ "multi-broker",
26
+ "multi-step",
27
+ "orchestration",
28
+ "postgresql",
29
+ "priority-queue",
30
+ "prometheus",
31
+ "queue",
32
+ "redis-alternative",
33
+ "retries",
34
+ "saga",
35
+ "saga-pattern",
36
+ "scheduler",
37
+ "sqlite",
38
+ "step-functions",
39
+ "task-queue",
40
+ "temporal-alternative",
41
+ "typescript",
42
+ "webhooks",
43
+ "worker",
44
+ "workflow",
45
+ "workflow-engine"
46
+ ],
47
+ "homepage": "https://bunqueue.dev",
48
+ "bugs": {
49
+ "url": "https://github.com/egeominotti/bunqueue/issues"
50
+ },
51
+ "license": "MIT",
52
+ "author": "egeominotti",
53
+ "repository": {
54
+ "type": "git",
55
+ "url": "git+https://github.com/egeominotti/bunqueue.git"
56
+ },
8
57
  "bin": {
9
58
  "bunqueue": "./dist/cli/index.js",
10
59
  "bunqueue-mcp": "./dist/mcp/index.js"
11
60
  },
61
+ "files": [
62
+ "dist/**/*.js",
63
+ "dist/**/*.d.ts",
64
+ "!dist/bunqueue",
65
+ "!dist/benchmark",
66
+ "README.md",
67
+ "LICENSE"
68
+ ],
69
+ "type": "module",
70
+ "main": "dist/main.js",
71
+ "types": "dist/main.d.ts",
12
72
  "exports": {
13
73
  ".": {
14
74
  "types": "./dist/main.d.ts",
@@ -42,14 +102,6 @@
42
102
  },
43
103
  "./package.json": "./package.json"
44
104
  },
45
- "files": [
46
- "dist/**/*.js",
47
- "dist/**/*.d.ts",
48
- "!dist/bunqueue",
49
- "!dist/benchmark",
50
- "README.md",
51
- "LICENSE"
52
- ],
53
105
  "scripts": {
54
106
  "prepare": "git config core.hooksPath .husky",
55
107
  "dev": "bun run --watch src/main.ts",
@@ -58,15 +110,24 @@
58
110
  "build:lib": "tsc -p tsconfig.build.json",
59
111
  "docs:api": "bun run scripts/build-api-reference.ts",
60
112
  "check:docs-data": "bun run scripts/check-docs-data.ts",
61
- "test": "BUNQUEUE_EMBEDDED=1 bun test",
113
+ "test": "BUNQUEUE_EMBEDDED=1 bun test --parallel=4",
62
114
  "test:core-e2e": "bun test test/core-e2e/core-public-api.e2e.test.ts",
63
115
  "test:model": "BUNQUEUE_EMBEDDED=1 bun test test/model-based/queue-model.test.ts test/model-based/workflow-model.test.ts test/model-based/flow-producer-model.test.ts test/model-based/backup-model.test.ts test/model-based/monitoring-model.test.ts test/model-based/enterprise-telemetry-model.test.ts",
116
+ "test:postgres": "bun scripts/test-postgres.ts",
117
+ "test:postgres:smoke": "bun scripts/test-postgres.ts --profile=smoke",
118
+ "test:postgres:destruction": "bun scripts/test-postgres.ts --profile=destruction",
119
+ "test:postgres:pressure": "BUNQUEUE_POSTGRES_TEN_BROKER_SOAK=1 bun scripts/test-postgres.ts --profile=pressure",
120
+ "test:postgres:battle": "BUNQUEUE_POSTGRES_TEN_BROKER_SOAK=1 BUNQUEUE_POSTGRES_FC_RUNS=100 bun scripts/test-postgres.ts --profile=battle",
121
+ "test:postgres:fast-check": "bun scripts/test-postgres.ts test/postgres-fast-check-*.test.ts",
122
+ "test:postgres:ten-broker": "BUNQUEUE_POSTGRES_TEN_BROKER_SOAK=1 bun scripts/test-postgres.ts test/postgres-ten-processes.test.ts",
64
123
  "test:sandbox": "bun run scripts/test-sandbox.ts",
65
124
  "test:sandbox:sdk": "bun run scripts/test-sdk-sandbox.ts",
66
125
  "bench": "bun run bench/comprehensive.ts",
67
126
  "bench:tcp": "bun run bench/tcp-bench.ts",
68
127
  "bench:autobatch": "bun run bench/local-autobatch.ts",
128
+ "bench:postgres:versions": "bun run bench/postgres-versions.ts",
69
129
  "bench:pushbulk": "bun run bench/pushbulk-delta.ts",
130
+ "bench:sqlite-lifecycle": "bun run bench/sqlite-lifecycle-batching.ts",
70
131
  "bench:workflow": "bun run bench/workflow-engine.ts",
71
132
  "bench:workflow:scale": "bun run bench/workflow-engine/scale.ts",
72
133
  "bench:joblist": "bun run bench/job-list-perf.ts",
@@ -81,7 +142,6 @@
81
142
  "prepublishOnly": "bun run build:lib"
82
143
  },
83
144
  "dependencies": {
84
- "croner": "10.0.1",
85
145
  "msgpackr": "^1.11.8"
86
146
  },
87
147
  "devDependencies": {
@@ -113,56 +173,6 @@
113
173
  "optional": true
114
174
  }
115
175
  },
116
- "keywords": [
117
- "bun",
118
- "job-queue",
119
- "message-queue",
120
- "task-queue",
121
- "background-jobs",
122
- "queue",
123
- "worker",
124
- "cron",
125
- "scheduler",
126
- "sqlite",
127
- "redis-alternative",
128
- "bullmq-alternative",
129
- "priority-queue",
130
- "delayed-jobs",
131
- "retries",
132
- "dead-letter-queue",
133
- "dlq",
134
- "webhooks",
135
- "prometheus",
136
- "typescript",
137
- "ai",
138
- "ai-agent",
139
- "ai-native",
140
- "mcp",
141
- "model-context-protocol",
142
- "agentic",
143
- "automation",
144
- "workflow",
145
- "workflow-engine",
146
- "orchestration",
147
- "saga",
148
- "saga-pattern",
149
- "temporal-alternative",
150
- "inngest-alternative",
151
- "step-functions",
152
- "multi-step",
153
- "compensation",
154
- "human-in-the-loop"
155
- ],
156
- "author": "egeominotti",
157
- "license": "MIT",
158
- "repository": {
159
- "type": "git",
160
- "url": "git+https://github.com/egeominotti/bunqueue.git"
161
- },
162
- "bugs": {
163
- "url": "https://github.com/egeominotti/bunqueue/issues"
164
- },
165
- "homepage": "https://bunqueue.dev",
166
176
  "engines": {
167
177
  "bun": ">=1.4.0"
168
178
  }