bunqueue 2.8.53 → 2.8.56
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/application/background/dlq.d.ts +2 -0
- package/dist/application/background/dlq.js +26 -0
- package/dist/application/background/lifecycle.d.ts +4 -0
- package/dist/application/background/lifecycle.js +90 -0
- package/dist/application/background/recovery/active.d.ts +4 -0
- package/dist/application/background/recovery/active.js +69 -0
- package/dist/application/background/recovery/index.d.ts +2 -0
- package/dist/application/background/recovery/index.js +22 -0
- package/dist/application/background/recovery/pending.d.ts +3 -0
- package/dist/application/background/recovery/pending.js +69 -0
- package/dist/application/background/recovery/restore.d.ts +5 -0
- package/dist/application/background/recovery/restore.js +58 -0
- package/dist/application/background/recovery/shared.d.ts +6 -0
- package/dist/application/background/recovery/shared.js +15 -0
- package/dist/application/background/timeouts.d.ts +25 -0
- package/dist/application/background/timeouts.js +191 -0
- package/dist/application/backgroundTasks.d.ts +7 -31
- package/dist/application/backgroundTasks.js +6 -438
- package/dist/application/cleanupTasks.js +2 -1
- package/dist/application/clientTracking.js +3 -1
- package/dist/application/contextFactory.d.ts +13 -90
- package/dist/application/contextFactory.js +9 -0
- package/dist/application/dependencyResultTracker.d.ts +1 -0
- package/dist/application/dependencyResultTracker.js +3 -0
- package/dist/application/dlqManager.d.ts +9 -9
- package/dist/application/dlqManager.js +49 -167
- package/dist/application/dlqRetry.d.ts +12 -0
- package/dist/application/dlqRetry.js +97 -0
- package/dist/application/lockManager.js +24 -4
- package/dist/application/lockOperations.js +16 -3
- package/dist/application/operations/ack/batch.d.ts +8 -0
- package/dist/application/operations/ack/batch.js +64 -0
- package/dist/application/operations/ack/completion.d.ts +3 -0
- package/dist/application/operations/ack/completion.js +74 -0
- package/dist/application/operations/ack/failure.d.ts +3 -0
- package/dist/application/operations/ack/failure.js +160 -0
- package/dist/application/operations/ack.d.ts +5 -79
- package/dist/application/operations/ack.js +4 -319
- package/dist/application/operations/ackHelpers.d.ts +3 -52
- package/dist/application/operations/ackHelpers.js +11 -4
- package/dist/application/operations/customId.d.ts +18 -5
- package/dist/application/operations/customId.js +36 -25
- package/dist/application/operations/flowValidation.js +9 -4
- package/dist/application/operations/jobManagement.js +50 -11
- package/dist/application/operations/jobMoveOperations.js +3 -3
- package/dist/application/operations/jobStateTransitions.d.ts +1 -1
- package/dist/application/operations/jobStateTransitions.js +16 -2
- package/dist/application/operations/parentLink.d.ts +36 -0
- package/dist/application/operations/parentLink.js +153 -0
- package/dist/application/operations/parentLinkInput.d.ts +8 -0
- package/dist/application/operations/parentLinkInput.js +23 -0
- package/dist/application/operations/push.d.ts +5 -44
- package/dist/application/operations/push.js +62 -152
- package/dist/application/operations/pushAdmission.d.ts +32 -0
- package/dist/application/operations/pushAdmission.js +38 -0
- package/dist/application/operations/pushBatch.d.ts +4 -0
- package/dist/application/operations/pushBatch.js +136 -0
- package/dist/application/operations/pushContext.d.ts +39 -0
- package/dist/application/operations/pushContext.js +1 -0
- package/dist/application/operations/pushDeduplication.d.ts +42 -0
- package/dist/application/operations/pushDeduplication.js +131 -0
- package/dist/application/operations/pushInsert.d.ts +13 -1
- package/dist/application/operations/pushInsert.js +33 -17
- package/dist/application/operations/pushLocks.js +13 -9
- package/dist/application/operations/query/collect.d.ts +12 -0
- package/dist/application/operations/query/collect.js +118 -0
- package/dist/application/operations/query/jobLookup.d.ts +9 -0
- package/dist/application/operations/query/jobLookup.js +110 -0
- package/dist/application/operations/query/pagination.d.ts +8 -0
- package/dist/application/operations/query/pagination.js +90 -0
- package/dist/application/operations/query/state.d.ts +4 -0
- package/dist/application/operations/query/state.js +63 -0
- package/dist/application/operations/queryOperations.d.ts +5 -50
- package/dist/application/operations/queryOperations.js +4 -474
- package/dist/application/queue-manager/ack.d.ts +23 -0
- package/dist/application/queue-manager/ack.js +242 -0
- package/dist/application/queue-manager/configuration.d.ts +27 -0
- package/dist/application/queue-manager/configuration.js +84 -0
- package/dist/application/queue-manager/context.d.ts +5 -0
- package/dist/application/queue-manager/context.js +61 -0
- package/dist/application/queue-manager/control.d.ts +17 -0
- package/dist/application/queue-manager/control.js +133 -0
- package/dist/application/queue-manager/delivery.d.ts +32 -0
- package/dist/application/queue-manager/delivery.js +143 -0
- package/dist/application/queue-manager/dependencies.d.ts +8 -0
- package/dist/application/queue-manager/dependencies.js +127 -0
- package/dist/application/queue-manager/dependency-runtime.d.ts +8 -0
- package/dist/application/queue-manager/dependency-runtime.js +40 -0
- package/dist/application/queue-manager/flow-failures.d.ts +18 -0
- package/dist/application/queue-manager/flow-failures.js +107 -0
- package/dist/application/queue-manager/flow-options.d.ts +8 -0
- package/dist/application/queue-manager/flow-options.js +129 -0
- package/dist/application/queue-manager/job-management.d.ts +17 -0
- package/dist/application/queue-manager/job-management.js +100 -0
- package/dist/application/queue-manager/lifecycle.d.ts +4 -0
- package/dist/application/queue-manager/lifecycle.js +41 -0
- package/dist/application/queue-manager/limits.d.ts +41 -0
- package/dist/application/queue-manager/limits.js +108 -0
- package/dist/application/queue-manager/locks.d.ts +21 -0
- package/dist/application/queue-manager/locks.js +59 -0
- package/dist/application/queue-manager/observability.d.ts +16 -0
- package/dist/application/queue-manager/observability.js +44 -0
- package/dist/application/queue-manager/queries.d.ts +17 -0
- package/dist/application/queue-manager/queries.js +118 -0
- package/dist/application/queue-manager/repeat.d.ts +4 -0
- package/dist/application/queue-manager/repeat.js +26 -0
- package/dist/application/queue-manager/services.d.ts +19 -0
- package/dist/application/queue-manager/services.js +80 -0
- package/dist/application/queue-manager/state.d.ts +92 -0
- package/dist/application/queue-manager/state.js +144 -0
- package/dist/application/queue-manager/stats.d.ts +28 -0
- package/dist/application/queue-manager/stats.js +52 -0
- package/dist/application/queueManager.d.ts +4 -380
- package/dist/application/queueManager.js +3 -1880
- package/dist/application/queueTelemetryJournal.d.ts +20 -0
- package/dist/application/queueTelemetryJournal.js +133 -0
- package/dist/application/repeatJobs.d.ts +7 -0
- package/dist/application/repeatJobs.js +132 -0
- package/dist/application/stallDetection.js +9 -4
- package/dist/application/types/ack.d.ts +132 -0
- package/dist/application/types/ack.js +1 -0
- package/dist/application/types/background.d.ts +18 -0
- package/dist/application/types/background.js +1 -0
- package/dist/application/types/config.d.ts +37 -0
- package/dist/application/types/config.js +15 -0
- package/dist/application/types/contextFactory.d.ts +83 -0
- package/dist/application/types/contextFactory.js +1 -0
- package/dist/application/types/contexts.d.ts +110 -0
- package/dist/application/types/contexts.js +1 -0
- package/dist/application/types/index.d.ts +7 -0
- package/dist/application/types/index.js +1 -0
- package/dist/application/types/query.d.ts +23 -0
- package/dist/application/types/query.js +1 -0
- package/dist/application/types/queueManager.d.ts +94 -0
- package/dist/application/types/queueManager.js +1 -0
- package/dist/cli/commandRouter.d.ts +1 -1
- package/dist/cli/commands/core.js +1 -0
- package/dist/cli/output/collections.d.ts +8 -0
- package/dist/cli/output/collections.js +131 -0
- package/dist/cli/output/jobs.d.ts +2 -0
- package/dist/cli/output/jobs.js +61 -0
- package/dist/cli/output/style.d.ts +14 -0
- package/dist/cli/output/style.js +28 -0
- package/dist/cli/output/success.d.ts +1 -0
- package/dist/cli/output/success.js +108 -0
- package/dist/cli/output.d.ts +1 -6
- package/dist/cli/output.js +7 -395
- package/dist/client/bunqueue/dlqRateLimit.d.ts +8 -0
- package/dist/client/bunqueue/dlqRateLimit.js +24 -0
- package/dist/client/bunqueue/runtime.d.ts +35 -0
- package/dist/client/bunqueue/runtime.js +138 -0
- package/dist/client/bunqueue.d.ts +19 -34
- package/dist/client/bunqueue.js +45 -166
- package/dist/client/dlqConversion.d.ts +5 -0
- package/dist/client/dlqConversion.js +28 -0
- package/dist/client/events.d.ts +7 -56
- package/dist/client/events.js +38 -15
- package/dist/client/flow.d.ts +6 -12
- package/dist/client/flow.js +16 -34
- package/dist/client/flowJobDependencies.js +3 -1
- package/dist/client/flowJobFactory.d.ts +9 -1
- package/dist/client/flowJobFactory.js +25 -9
- package/dist/client/flowJobMoveMethods.d.ts +5 -5
- package/dist/client/flowJobMoveMethods.js +37 -17
- package/dist/client/flowLegacyPlan.js +22 -8
- package/dist/client/flowOptions.d.ts +1 -1
- package/dist/client/flowOptions.js +2 -1
- package/dist/client/flowPlan.js +2 -3
- package/dist/client/flowPush.d.ts +1 -0
- package/dist/client/flowPush.js +5 -1
- package/dist/client/flowReader.js +5 -5
- package/dist/client/flowResults.d.ts +11 -0
- package/dist/client/flowResults.js +42 -0
- package/dist/client/index.d.ts +3 -1
- package/dist/client/jobConversion.d.ts +3 -7
- package/dist/client/jobConversion.js +36 -33
- package/dist/client/jobConversionHelpers.d.ts +19 -3
- package/dist/client/jobConversionHelpers.js +20 -16
- package/dist/client/jobConversionTypes.d.ts +8 -0
- package/dist/client/jobDeduplication.d.ts +6 -0
- package/dist/client/jobDeduplication.js +14 -0
- package/dist/client/jobHelpers.d.ts +7 -2
- package/dist/client/jobHelpers.js +16 -8
- package/dist/client/queue/bullmqCompat.d.ts +18 -8
- package/dist/client/queue/bullmqCompat.js +39 -71
- package/dist/client/queue/deduplication.d.ts +2 -0
- package/dist/client/queue/deduplication.js +20 -11
- package/dist/client/queue/dlq.d.ts +11 -6
- package/dist/client/queue/dlq.js +57 -16
- package/dist/client/queue/dlqJobMethods.d.ts +9 -0
- package/dist/client/queue/dlqJobMethods.js +177 -0
- package/dist/client/queue/dlqOps.d.ts +2 -1
- package/dist/client/queue/dlqOps.js +4 -10
- package/dist/client/queue/dlqStats.d.ts +3 -0
- package/dist/client/queue/dlqStats.js +21 -0
- package/dist/client/queue/job-proxy/dependencies.d.ts +9 -0
- package/dist/client/queue/job-proxy/dependencies.js +67 -0
- package/dist/client/queue/job-proxy/reflection.d.ts +2 -0
- package/dist/client/queue/job-proxy/reflection.js +18 -0
- package/dist/client/queue/job-proxy/simple.d.ts +3 -0
- package/dist/client/queue/job-proxy/simple.js +316 -0
- package/dist/client/queue/job-proxy/tcp.d.ts +4 -0
- package/dist/client/queue/job-proxy/tcp.js +191 -0
- package/dist/client/queue/jobMetadata.d.ts +10 -0
- package/dist/client/queue/jobMetadata.js +24 -0
- package/dist/client/queue/jobMove.d.ts +4 -4
- package/dist/client/queue/jobMove.js +87 -24
- package/dist/client/queue/jobProxy.d.ts +4 -50
- package/dist/client/queue/jobProxy.js +3 -511
- package/dist/client/queue/operations/add/bulk.d.ts +7 -0
- package/dist/client/queue/operations/add/bulk.js +129 -0
- package/dist/client/queue/operations/add/payload.d.ts +24 -0
- package/dist/client/queue/operations/add/payload.js +85 -0
- package/dist/client/queue/operations/add/single.d.ts +3 -0
- package/dist/client/queue/operations/add/single.js +107 -0
- package/dist/client/queue/operations/add.d.ts +2 -47
- package/dist/client/queue/operations/add.js +2 -347
- package/dist/client/queue/operations/index.d.ts +1 -0
- package/dist/client/queue/operations/index.js +1 -0
- package/dist/client/queue/operations/management.d.ts +0 -4
- package/dist/client/queue/operations/management.js +35 -6
- package/dist/client/queue/operations/query.d.ts +1 -20
- package/dist/client/queue/operations/query.js +38 -116
- package/dist/client/queue/operations/queryStates.d.ts +13 -0
- package/dist/client/queue/operations/queryStates.js +32 -0
- package/dist/client/queue/operations/queryTcpPages.d.ts +14 -0
- package/dist/client/queue/operations/queryTcpPages.js +40 -0
- package/dist/client/queue/queue.d.ts +6 -189
- package/dist/client/queue/queue.js +6 -547
- package/dist/client/queue/rateLimit.d.ts +4 -4
- package/dist/client/queue/rateLimit.js +17 -8
- package/dist/client/queue/runtime/compatibility.d.ts +13 -0
- package/dist/client/queue/runtime/compatibility.js +38 -0
- package/dist/client/queue/runtime/configuration.d.ts +42 -0
- package/dist/client/queue/runtime/configuration.js +109 -0
- package/dist/client/queue/runtime/connection.d.ts +6 -0
- package/dist/client/queue/runtime/connection.js +16 -0
- package/dist/client/queue/runtime/control.d.ts +41 -0
- package/dist/client/queue/runtime/control.js +87 -0
- package/dist/client/queue/runtime/queries.d.ts +48 -0
- package/dist/client/queue/runtime/queries.js +95 -0
- package/dist/client/queue/runtime/scheduling.d.ts +33 -0
- package/dist/client/queue/runtime/scheduling.js +56 -0
- package/dist/client/queue/runtime/state.d.ts +96 -0
- package/dist/client/queue/runtime/state.js +149 -0
- package/dist/client/queue/scheduler.d.ts +2 -5
- package/dist/client/queue/scheduler.js +25 -23
- package/dist/client/queue/schedulerPagination.d.ts +7 -0
- package/dist/client/queue/schedulerPagination.js +10 -0
- package/dist/client/queue/types/add.d.ts +40 -0
- package/dist/client/queue/types/add.js +1 -0
- package/dist/client/queue/types/contexts.d.ts +33 -0
- package/dist/client/queue/types/contexts.js +5 -0
- package/dist/client/queue/types/index.d.ts +3 -0
- package/dist/client/queue/types/index.js +1 -0
- package/dist/client/queue/types/job.d.ts +50 -0
- package/dist/client/queue/types/job.js +1 -0
- package/dist/client/queue/types/runtime.d.ts +35 -0
- package/dist/client/queue/types/runtime.js +1 -0
- package/dist/client/queue/workers.d.ts +16 -8
- package/dist/client/queue/workers.js +42 -16
- package/dist/client/queue-events/tcpSubscription.d.ts +23 -0
- package/dist/client/queue-events/tcpSubscription.js +99 -0
- package/dist/client/queueGroup.d.ts +11 -0
- package/dist/client/queueGroup.js +28 -1
- package/dist/client/sandboxed/queueOps.d.ts +2 -2
- package/dist/client/sandboxed/queueOps.js +32 -5
- package/dist/client/sandboxed/runtime/dispatch.d.ts +13 -0
- package/dist/client/sandboxed/runtime/dispatch.js +186 -0
- package/dist/client/sandboxed/runtime/lifecycle.d.ts +20 -0
- package/dist/client/sandboxed/runtime/lifecycle.js +95 -0
- package/dist/client/sandboxed/runtime/log.d.ts +1 -0
- package/dist/client/sandboxed/runtime/log.js +15 -0
- package/dist/client/sandboxed/runtime/pool.d.ts +11 -0
- package/dist/client/sandboxed/runtime/pool.js +121 -0
- package/dist/client/sandboxed/runtime/recovery.d.ts +11 -0
- package/dist/client/sandboxed/runtime/recovery.js +122 -0
- package/dist/client/sandboxed/runtime/state.d.ts +39 -0
- package/dist/client/sandboxed/runtime/state.js +59 -0
- package/dist/client/sandboxed/types/index.d.ts +2 -0
- package/dist/client/sandboxed/types/index.js +1 -0
- package/dist/client/sandboxed/types/options.d.ts +27 -0
- package/dist/client/sandboxed/types/options.js +1 -0
- package/dist/client/sandboxed/types/process.d.ts +30 -0
- package/dist/client/sandboxed/types/process.js +1 -0
- package/dist/client/sandboxed/worker.d.ts +3 -85
- package/dist/client/sandboxed/worker.js +3 -557
- package/dist/client/sandboxed/wrapper.js +1 -0
- package/dist/client/tcp/client.d.ts +5 -112
- package/dist/client/tcp/client.js +5 -481
- package/dist/client/tcp/commandQueue.d.ts +23 -0
- package/dist/client/tcp/commandQueue.js +89 -0
- package/dist/client/tcp/connection.d.ts +4 -85
- package/dist/client/tcp/connection.js +3 -315
- package/dist/client/tcp/errors.d.ts +6 -0
- package/dist/client/tcp/errors.js +18 -0
- package/dist/client/tcp/runtime/commands.d.ts +9 -0
- package/dist/client/tcp/runtime/commands.js +124 -0
- package/dist/client/tcp/runtime/connectivity.d.ts +13 -0
- package/dist/client/tcp/runtime/connectivity.js +77 -0
- package/dist/client/tcp/runtime/health.d.ts +14 -0
- package/dist/client/tcp/runtime/health.js +127 -0
- package/dist/client/tcp/runtime/lifecycle.d.ts +8 -0
- package/dist/client/tcp/runtime/lifecycle.js +32 -0
- package/dist/client/tcp/runtime/state.d.ts +50 -0
- package/dist/client/tcp/runtime/state.js +45 -0
- package/dist/client/tcp/transport.d.ts +18 -0
- package/dist/client/tcp/transport.js +158 -0
- package/dist/client/tcp/types/command.d.ts +9 -0
- package/dist/client/tcp/types/command.js +1 -0
- package/dist/client/tcp/types/connection.d.ts +31 -0
- package/dist/client/tcp/types/connection.js +17 -0
- package/dist/client/tcp/types/index.d.ts +5 -0
- package/dist/client/tcp/types/index.js +1 -0
- package/dist/client/tcp/types/socket.d.ts +8 -0
- package/dist/client/tcp/types/socket.js +1 -0
- package/dist/client/tcp/types/tls.d.ts +4 -0
- package/dist/client/tcp/types/tls.js +1 -0
- package/dist/client/tcp/types.d.ts +2 -106
- package/dist/client/tcp/types.js +2 -22
- package/dist/client/types/connection.d.ts +29 -0
- package/dist/client/types/connection.js +1 -0
- package/dist/client/types/dlq.d.ts +45 -0
- package/dist/client/types/dlq.js +1 -0
- package/dist/client/types/events.d.ts +54 -0
- package/dist/client/types/events.js +1 -0
- package/dist/client/types/flow.d.ts +10 -0
- package/dist/client/types/flow.js +1 -0
- package/dist/client/types/index.d.ts +10 -0
- package/dist/client/types/index.js +1 -0
- package/dist/client/types/job.d.ts +127 -0
- package/dist/client/types/job.js +1 -0
- package/dist/client/types/metrics.d.ts +1 -0
- package/dist/client/types/metrics.js +1 -0
- package/dist/client/types/options.d.ts +62 -0
- package/dist/client/types/options.js +1 -0
- package/dist/client/types/worker.d.ts +38 -0
- package/dist/client/types/worker.js +1 -0
- package/dist/client/types.d.ts +2 -583
- package/dist/client/types.js +2 -6
- package/dist/client/worker/ackBatcher.d.ts +1 -1
- package/dist/client/worker/ackBatcher.js +17 -5
- package/dist/client/worker/ackOutcome.d.ts +8 -0
- package/dist/client/worker/ackOutcome.js +58 -0
- package/dist/client/worker/constants.d.ts +7 -0
- package/dist/client/worker/constants.js +7 -0
- package/dist/client/worker/groupConcurrency.js +3 -0
- package/dist/client/worker/handlers/completion.d.ts +28 -0
- package/dist/client/worker/handlers/completion.js +68 -0
- package/dist/client/worker/handlers/dependencies.d.ts +11 -0
- package/dist/client/worker/handlers/dependencies.js +107 -0
- package/dist/client/worker/handlers/mutations.d.ts +23 -0
- package/dist/client/worker/handlers/mutations.js +211 -0
- package/dist/client/worker/handlers/queries.d.ts +15 -0
- package/dist/client/worker/handlers/queries.js +100 -0
- package/dist/client/worker/index.d.ts +2 -2
- package/dist/client/worker/index.js +1 -1
- package/dist/client/worker/jobParser.js +4 -2
- package/dist/client/worker/processor.d.ts +2 -15
- package/dist/client/worker/processor.js +68 -125
- package/dist/client/worker/processorHandlers.d.ts +4 -65
- package/dist/client/worker/processorHandlers.js +4 -400
- package/dist/client/worker/processorOutcome.d.ts +14 -0
- package/dist/client/worker/processorOutcome.js +125 -0
- package/dist/client/worker/runtime/buffer.d.ts +8 -0
- package/dist/client/worker/runtime/buffer.js +50 -0
- package/dist/client/worker/runtime/control.d.ts +26 -0
- package/dist/client/worker/runtime/control.js +175 -0
- package/dist/client/worker/runtime/execution.d.ts +11 -0
- package/dist/client/worker/runtime/execution.js +123 -0
- package/dist/client/worker/runtime/lifecycle.d.ts +7 -0
- package/dist/client/worker/runtime/lifecycle.js +114 -0
- package/dist/client/worker/runtime/manual.d.ts +10 -0
- package/dist/client/worker/runtime/manual.js +137 -0
- package/dist/client/worker/runtime/options.d.ts +5 -0
- package/dist/client/worker/runtime/options.js +39 -0
- package/dist/client/worker/runtime/polling.d.ts +12 -0
- package/dist/client/worker/runtime/polling.js +123 -0
- package/dist/client/worker/runtime/state.d.ts +110 -0
- package/dist/client/worker/runtime/state.js +156 -0
- package/dist/client/worker/types/index.d.ts +5 -0
- package/dist/client/worker/types/index.js +1 -0
- package/dist/client/worker/types/manual.d.ts +7 -0
- package/dist/client/worker/types/manual.js +1 -0
- package/dist/client/worker/types/options.d.ts +24 -0
- package/dist/client/worker/types/options.js +1 -0
- package/dist/client/worker/types/outcome.d.ts +23 -0
- package/dist/client/worker/types/outcome.js +1 -0
- package/dist/client/worker/types/processor.d.ts +22 -0
- package/dist/client/worker/types/processor.js +1 -0
- package/dist/client/worker/types/transport.d.ts +11 -0
- package/dist/client/worker/types/transport.js +1 -0
- package/dist/client/worker/worker.d.ts +3 -160
- package/dist/client/worker/worker.js +3 -904
- package/dist/client/worker/workerRateLimiter.d.ts +5 -1
- package/dist/client/worker/workerRateLimiter.js +40 -20
- package/dist/client/worker.d.ts +1 -0
- package/dist/client/workflow/compensationChild.d.ts +2 -1
- package/dist/client/workflow/compensationChild.js +1 -1
- package/dist/client/workflow/compensationClaim.d.ts +11 -0
- package/dist/client/workflow/compensationClaim.js +30 -0
- package/dist/client/workflow/compensator.d.ts +7 -2
- package/dist/client/workflow/compensator.js +5 -11
- package/dist/client/workflow/recovery.js +25 -2
- package/dist/client/workflow/rollbackControl.js +1 -1
- package/dist/domain/job/constants.d.ts +12 -0
- package/dist/domain/job/constants.js +12 -0
- package/dist/domain/job/create.d.ts +2 -0
- package/dist/domain/job/create.js +103 -0
- package/dist/domain/job/ids.d.ts +5 -0
- package/dist/domain/job/ids.js +12 -0
- package/dist/domain/job/locks.d.ts +4 -0
- package/dist/domain/job/locks.js +23 -0
- package/dist/domain/job/payload.d.ts +18 -0
- package/dist/domain/job/payload.js +43 -0
- package/dist/domain/job/state.d.ts +8 -0
- package/dist/domain/job/state.js +51 -0
- package/dist/domain/job/terminal.d.ts +3 -0
- package/dist/domain/job/terminal.js +9 -0
- package/dist/domain/queue/dlqShard.d.ts +2 -0
- package/dist/domain/queue/dlqShard.js +34 -9
- package/dist/domain/queue/limiterManager.d.ts +11 -0
- package/dist/domain/queue/limiterManager.js +28 -0
- package/dist/domain/queue/priorityQueue.js +3 -39
- package/dist/domain/queue/priorityQueueOrder.d.ts +3 -0
- package/dist/domain/queue/priorityQueueOrder.js +21 -0
- package/dist/domain/queue/shard/dependencies.d.ts +11 -0
- package/dist/domain/queue/shard/dependencies.js +22 -0
- package/dist/domain/queue/shard/dlq.d.ts +25 -0
- package/dist/domain/queue/shard/dlq.js +71 -0
- package/dist/domain/queue/shard/keys.d.ts +18 -0
- package/dist/domain/queue/shard/keys.js +45 -0
- package/dist/domain/queue/shard/lifecycle.d.ts +10 -0
- package/dist/domain/queue/shard/lifecycle.js +43 -0
- package/dist/domain/queue/shard/limits.d.ts +24 -0
- package/dist/domain/queue/shard/limits.js +57 -0
- package/dist/domain/queue/shard/metrics.d.ts +32 -0
- package/dist/domain/queue/shard/metrics.js +72 -0
- package/dist/domain/queue/shard/state.d.ts +34 -0
- package/dist/domain/queue/shard/state.js +80 -0
- package/dist/domain/queue/shard.d.ts +5 -137
- package/dist/domain/queue/shard.js +4 -390
- package/dist/domain/queue/uniqueKeyManager.d.ts +3 -1
- package/dist/domain/queue/uniqueKeyManager.js +9 -1
- package/dist/domain/response/builders.d.ts +15 -0
- package/dist/domain/response/builders.js +39 -0
- package/dist/domain/types/command.d.ts +2 -522
- package/dist/domain/types/command.js +2 -5
- package/dist/domain/types/commands/base.d.ts +5 -0
- package/dist/domain/types/commands/base.js +1 -0
- package/dist/domain/types/commands/core.d.ts +106 -0
- package/dist/domain/types/commands/core.js +1 -0
- package/dist/domain/types/commands/cron.d.ts +36 -0
- package/dist/domain/types/commands/cron.js +1 -0
- package/dist/domain/types/commands/dashboard.d.ts +13 -0
- package/dist/domain/types/commands/dashboard.js +1 -0
- package/dist/domain/types/commands/dlq.d.ts +39 -0
- package/dist/domain/types/commands/dlq.js +1 -0
- package/dist/domain/types/commands/extended.d.ts +63 -0
- package/dist/domain/types/commands/extended.js +1 -0
- package/dist/domain/types/commands/index.d.ts +12 -0
- package/dist/domain/types/commands/index.js +12 -0
- package/dist/domain/types/commands/limits.d.ts +54 -0
- package/dist/domain/types/commands/limits.js +1 -0
- package/dist/domain/types/commands/management.d.ts +73 -0
- package/dist/domain/types/commands/management.js +1 -0
- package/dist/domain/types/commands/monitoring.d.ts +49 -0
- package/dist/domain/types/commands/monitoring.js +1 -0
- package/dist/domain/types/commands/protocol.d.ts +20 -0
- package/dist/domain/types/commands/protocol.js +1 -0
- package/dist/domain/types/commands/query.d.ts +46 -0
- package/dist/domain/types/commands/query.js +1 -0
- package/dist/domain/types/commands/union.d.ts +13 -0
- package/dist/domain/types/commands/union.js +1 -0
- package/dist/domain/types/commands/workers.d.ts +39 -0
- package/dist/domain/types/commands/workers.js +1 -0
- package/dist/domain/types/cron.d.ts +4 -2
- package/dist/domain/types/cron.js +3 -0
- package/dist/domain/types/dlq.d.ts +17 -0
- package/dist/domain/types/dlq.js +70 -14
- package/dist/domain/types/index.d.ts +2 -0
- package/dist/domain/types/index.js +1 -0
- package/dist/domain/types/job.d.ts +8 -269
- package/dist/domain/types/job.js +8 -234
- package/dist/domain/types/jobs/model.d.ts +152 -0
- package/dist/domain/types/jobs/model.js +1 -0
- package/dist/domain/types/metrics.d.ts +16 -0
- package/dist/domain/types/metrics.js +1 -0
- package/dist/domain/types/priorityQueue.d.ts +12 -0
- package/dist/domain/types/priorityQueue.js +1 -0
- package/dist/domain/types/protocol.d.ts +5 -0
- package/dist/domain/types/protocol.js +4 -0
- package/dist/domain/types/queue.d.ts +7 -0
- package/dist/domain/types/queue.js +13 -0
- package/dist/domain/types/response.d.ts +3 -192
- package/dist/domain/types/response.js +3 -101
- package/dist/domain/types/responses/model.d.ts +152 -0
- package/dist/domain/types/responses/model.js +1 -0
- package/dist/domain/types/shard.d.ts +4 -0
- package/dist/domain/types/shard.js +1 -0
- package/dist/infrastructure/cloud/cloudAgent.js +6 -0
- package/dist/infrastructure/cloud/commandHandler.d.ts +2 -41
- package/dist/infrastructure/cloud/commandHandler.js +1 -1
- package/dist/infrastructure/cloud/commands/integrations.d.ts +2 -0
- package/dist/infrastructure/cloud/commands/integrations.js +31 -0
- package/dist/infrastructure/cloud/commands/jobMapper.d.ts +56 -0
- package/dist/infrastructure/cloud/commands/jobMapper.js +72 -0
- package/dist/infrastructure/cloud/commands/jobs.d.ts +2 -0
- package/dist/infrastructure/cloud/commands/jobs.js +111 -0
- package/dist/infrastructure/cloud/commands/queues.d.ts +2 -0
- package/dist/infrastructure/cloud/commands/queues.js +126 -0
- package/dist/infrastructure/cloud/commands.d.ts +3 -10
- package/dist/infrastructure/cloud/commands.js +7 -344
- package/dist/infrastructure/cloud/snapshot/analytics.d.ts +16 -0
- package/dist/infrastructure/cloud/snapshot/analytics.js +132 -0
- package/dist/infrastructure/cloud/snapshot/collector.d.ts +24 -0
- package/dist/infrastructure/cloud/snapshot/collector.js +105 -0
- package/dist/infrastructure/cloud/snapshot/config.d.ts +5 -0
- package/dist/infrastructure/cloud/snapshot/config.js +86 -0
- package/dist/infrastructure/cloud/snapshot/jobs.d.ts +5 -0
- package/dist/infrastructure/cloud/snapshot/jobs.js +148 -0
- package/dist/infrastructure/cloud/snapshot/stalls.d.ts +3 -0
- package/dist/infrastructure/cloud/snapshot/stalls.js +34 -0
- package/dist/infrastructure/cloud/snapshotCollector.d.ts +2 -53
- package/dist/infrastructure/cloud/snapshotCollector.js +5 -107
- package/dist/infrastructure/cloud/snapshotHelpers.d.ts +5 -45
- package/dist/infrastructure/cloud/snapshotHelpers.js +4 -426
- package/dist/infrastructure/cloud/types/collector.d.ts +54 -0
- package/dist/infrastructure/cloud/types/collector.js +1 -0
- package/dist/infrastructure/cloud/types/command.d.ts +44 -0
- package/dist/infrastructure/cloud/types/command.js +1 -0
- package/dist/infrastructure/cloud/types/config.d.ts +18 -0
- package/dist/infrastructure/cloud/types/config.js +1 -0
- package/dist/infrastructure/cloud/types/event.d.ts +14 -0
- package/dist/infrastructure/cloud/types/event.js +1 -0
- package/dist/infrastructure/cloud/types/redact.d.ts +4 -0
- package/dist/infrastructure/cloud/types/redact.js +1 -0
- package/dist/infrastructure/cloud/types/snapshot.d.ts +52 -0
- package/dist/infrastructure/cloud/types/snapshot.js +1 -0
- package/dist/infrastructure/cloud/types/snapshotCore.d.ts +125 -0
- package/dist/infrastructure/cloud/types/snapshotCore.js +1 -0
- package/dist/infrastructure/cloud/types/snapshotJobs.d.ts +124 -0
- package/dist/infrastructure/cloud/types/snapshotJobs.js +1 -0
- package/dist/infrastructure/cloud/types/snapshotTelemetry.d.ts +100 -0
- package/dist/infrastructure/cloud/types/snapshotTelemetry.js +1 -0
- package/dist/infrastructure/cloud/types.d.ts +3 -445
- package/dist/infrastructure/cloud/types.js +0 -4
- package/dist/infrastructure/persistence/batchInsert.d.ts +13 -0
- package/dist/infrastructure/persistence/batchInsert.js +96 -0
- package/dist/infrastructure/persistence/jobOptionsBlob.d.ts +18 -0
- package/dist/infrastructure/persistence/jobOptionsBlob.js +56 -0
- package/dist/infrastructure/persistence/legacyNameMigration.d.ts +5 -0
- package/dist/infrastructure/persistence/legacyNameMigration.js +42 -0
- package/dist/infrastructure/persistence/migrations.d.ts +3 -0
- package/dist/infrastructure/persistence/migrations.js +120 -0
- package/dist/infrastructure/persistence/schema.d.ts +3 -5
- package/dist/infrastructure/persistence/schema.js +40 -136
- package/dist/infrastructure/persistence/sqlite/admission.d.ts +9 -0
- package/dist/infrastructure/persistence/sqlite/admission.js +34 -0
- package/dist/infrastructure/persistence/sqlite/control.d.ts +32 -0
- package/dist/infrastructure/persistence/sqlite/control.js +90 -0
- package/dist/infrastructure/persistence/sqlite/flows.d.ts +26 -0
- package/dist/infrastructure/persistence/sqlite/flows.js +167 -0
- package/dist/infrastructure/persistence/sqlite/jobs.d.ts +23 -0
- package/dist/infrastructure/persistence/sqlite/jobs.js +166 -0
- package/dist/infrastructure/persistence/sqlite/lifecycle.d.ts +6 -0
- package/dist/infrastructure/persistence/sqlite/lifecycle.js +30 -0
- package/dist/infrastructure/persistence/sqlite/mutations.d.ts +20 -0
- package/dist/infrastructure/persistence/sqlite/mutations.js +149 -0
- package/dist/infrastructure/persistence/sqlite/queries.d.ts +23 -0
- package/dist/infrastructure/persistence/sqlite/queries.js +89 -0
- package/dist/infrastructure/persistence/sqlite/records.d.ts +24 -0
- package/dist/infrastructure/persistence/sqlite/records.js +115 -0
- package/dist/infrastructure/persistence/sqlite/state.d.ts +36 -0
- package/dist/infrastructure/persistence/sqlite/state.js +207 -0
- package/dist/infrastructure/persistence/sqlite/telemetry.d.ts +16 -0
- package/dist/infrastructure/persistence/sqlite/telemetry.js +126 -0
- package/dist/infrastructure/persistence/sqlite.d.ts +5 -276
- package/dist/infrastructure/persistence/sqlite.js +3 -997
- package/dist/infrastructure/persistence/sqliteBatch.d.ts +4 -121
- package/dist/infrastructure/persistence/sqliteBatch.js +3 -422
- package/dist/infrastructure/persistence/sqliteSerializer.d.ts +6 -1
- package/dist/infrastructure/persistence/sqliteSerializer.js +33 -11
- package/dist/infrastructure/persistence/statements.d.ts +5 -1
- package/dist/infrastructure/persistence/statements.js +14 -9
- package/dist/infrastructure/persistence/types/admission.d.ts +8 -0
- package/dist/infrastructure/persistence/types/admission.js +1 -0
- package/dist/infrastructure/persistence/types/batch.d.ts +12 -0
- package/dist/infrastructure/persistence/types/batch.js +1 -0
- package/dist/infrastructure/persistence/types/sqlite.d.ts +17 -0
- package/dist/infrastructure/persistence/types/sqlite.js +1 -0
- package/dist/infrastructure/persistence/writeBuffer.d.ts +38 -0
- package/dist/infrastructure/persistence/writeBuffer.js +221 -0
- package/dist/infrastructure/scheduler/cron/execution.d.ts +12 -0
- package/dist/infrastructure/scheduler/cron/execution.js +150 -0
- package/dist/infrastructure/scheduler/cron/runtime.d.ts +31 -0
- package/dist/infrastructure/scheduler/cron/runtime.js +143 -0
- package/dist/infrastructure/scheduler/cronScheduler.d.ts +4 -117
- package/dist/infrastructure/scheduler/cronScheduler.js +3 -436
- package/dist/infrastructure/scheduler/types/cronScheduler.d.ts +16 -0
- package/dist/infrastructure/scheduler/types/cronScheduler.js +1 -0
- package/dist/infrastructure/server/bootstrap.js +3 -0
- package/dist/infrastructure/server/handler-routes/control.d.ts +8 -0
- package/dist/infrastructure/server/handler-routes/control.js +82 -0
- package/dist/infrastructure/server/handler-routes/jobs.d.ts +6 -0
- package/dist/infrastructure/server/handler-routes/jobs.js +110 -0
- package/dist/infrastructure/server/handler-routes/monitoring.d.ts +5 -0
- package/dist/infrastructure/server/handler-routes/monitoring.js +65 -0
- package/dist/infrastructure/server/handlerRoutes.d.ts +3 -26
- package/dist/infrastructure/server/handlerRoutes.js +3 -257
- package/dist/infrastructure/server/handlers/advanced/configNumbers.d.ts +2 -0
- package/dist/infrastructure/server/handlers/advanced/configNumbers.js +26 -0
- package/dist/infrastructure/server/handlers/advanced/dependencies.d.ts +15 -0
- package/dist/infrastructure/server/handlers/advanced/dependencies.js +38 -0
- package/dist/infrastructure/server/handlers/advanced/jobs.d.ts +33 -0
- package/dist/infrastructure/server/handlers/advanced/jobs.js +136 -0
- package/dist/infrastructure/server/handlers/advanced/queue.d.ts +42 -0
- package/dist/infrastructure/server/handlers/advanced/queue.js +111 -0
- package/dist/infrastructure/server/handlers/advanced.d.ts +3 -121
- package/dist/infrastructure/server/handlers/advanced.js +3 -336
- package/dist/infrastructure/server/handlers/core.d.ts +1 -4
- package/dist/infrastructure/server/handlers/core.js +37 -20
- package/dist/infrastructure/server/handlers/cron.js +9 -1
- package/dist/infrastructure/server/handlers/dlq.d.ts +3 -0
- package/dist/infrastructure/server/handlers/dlq.js +18 -4
- package/dist/infrastructure/server/handlers/flow.js +6 -1
- package/dist/infrastructure/server/handlers/introspection.d.ts +19 -0
- package/dist/infrastructure/server/handlers/introspection.js +21 -0
- package/dist/infrastructure/server/handlers/management.d.ts +8 -0
- package/dist/infrastructure/server/handlers/management.js +30 -0
- package/dist/infrastructure/server/handlers/monitoring/health.d.ts +13 -0
- package/dist/infrastructure/server/handlers/monitoring/health.js +61 -0
- package/dist/infrastructure/server/handlers/monitoring/operations.d.ts +8 -0
- package/dist/infrastructure/server/handlers/monitoring/operations.js +28 -0
- package/dist/infrastructure/server/handlers/monitoring/webhooks.d.ts +7 -0
- package/dist/infrastructure/server/handlers/monitoring/webhooks.js +56 -0
- package/dist/infrastructure/server/handlers/monitoring/workers.d.ts +6 -0
- package/dist/infrastructure/server/handlers/monitoring/workers.js +57 -0
- package/dist/infrastructure/server/handlers/monitoring.d.ts +4 -30
- package/dist/infrastructure/server/handlers/monitoring.js +4 -222
- package/dist/infrastructure/server/handlers/pushBatchValidation.d.ts +1 -1
- package/dist/infrastructure/server/handlers/pushBatchValidation.js +7 -0
- package/dist/infrastructure/server/handlers/query.js +13 -4
- package/dist/infrastructure/server/http-routes/jobAdvanced.d.ts +2 -0
- package/dist/infrastructure/server/http-routes/jobAdvanced.js +106 -0
- package/dist/infrastructure/server/http-routes/jobManagement.d.ts +2 -0
- package/dist/infrastructure/server/http-routes/jobManagement.js +74 -0
- package/dist/infrastructure/server/http-routes/queueJobs.d.ts +2 -0
- package/dist/infrastructure/server/http-routes/queueJobs.js +108 -0
- package/dist/infrastructure/server/httpRouteJobs.d.ts +1 -8
- package/dist/infrastructure/server/httpRouteJobs.js +33 -222
- package/dist/infrastructure/server/httpRouteQueues.d.ts +1 -6
- package/dist/infrastructure/server/httpRouteQueues.js +51 -217
- package/dist/infrastructure/server/httpRouteResources.js +1 -0
- package/dist/infrastructure/server/protocol/commands.d.ts +8 -0
- package/dist/infrastructure/server/protocol/commands.js +31 -0
- package/dist/infrastructure/server/protocol/frameParser.d.ts +16 -0
- package/dist/infrastructure/server/protocol/frameParser.js +65 -0
- package/dist/infrastructure/server/protocol/lineBuffer.d.ts +6 -0
- package/dist/infrastructure/server/protocol/lineBuffer.js +21 -0
- package/dist/infrastructure/server/protocol/validation.d.ts +9 -0
- package/dist/infrastructure/server/protocol/validation.js +75 -0
- package/dist/infrastructure/server/protocol.d.ts +5 -77
- package/dist/infrastructure/server/protocol.js +4 -265
- package/dist/infrastructure/server/rateLimiter.js +1 -0
- package/dist/infrastructure/server/socketWriteQueue.d.ts +1 -1
- package/dist/infrastructure/server/socketWriteQueue.js +8 -5
- package/dist/infrastructure/server/sse/constants.d.ts +5 -0
- package/dist/infrastructure/server/sse/constants.js +5 -0
- package/dist/infrastructure/server/sse/eventBuffer.d.ts +3 -0
- package/dist/infrastructure/server/sse/eventBuffer.js +21 -0
- package/dist/infrastructure/server/sseHandler.d.ts +2 -6
- package/dist/infrastructure/server/sseHandler.js +20 -96
- package/dist/infrastructure/server/tcp/clientRelease.d.ts +2 -0
- package/dist/infrastructure/server/tcp/clientRelease.js +18 -0
- package/dist/infrastructure/server/tcp/connections.d.ts +24 -0
- package/dist/infrastructure/server/tcp/connections.js +162 -0
- package/dist/infrastructure/server/tcp/constants.d.ts +3 -0
- package/dist/infrastructure/server/tcp/constants.js +3 -0
- package/dist/infrastructure/server/tcp/eventSubscriptions.d.ts +10 -0
- package/dist/infrastructure/server/tcp/eventSubscriptions.js +17 -0
- package/dist/infrastructure/server/tcp/responses.d.ts +3 -0
- package/dist/infrastructure/server/tcp/responses.js +8 -0
- package/dist/infrastructure/server/tcp.d.ts +10 -68
- package/dist/infrastructure/server/tcp.js +47 -256
- package/dist/infrastructure/server/types/protocol.d.ts +4 -0
- package/dist/infrastructure/server/types/protocol.js +1 -0
- package/dist/infrastructure/server/types/sse.d.ts +11 -0
- package/dist/infrastructure/server/types/sse.js +1 -0
- package/dist/infrastructure/server/types/tcpServer.d.ts +25 -0
- package/dist/infrastructure/server/types/tcpServer.js +1 -0
- package/dist/infrastructure/server/types/ws.d.ts +6 -0
- package/dist/infrastructure/server/types/ws.js +1 -0
- package/dist/infrastructure/server/ws/constants.d.ts +6 -0
- package/dist/infrastructure/server/ws/constants.js +130 -0
- package/dist/infrastructure/server/ws/snapshots.d.ts +4 -0
- package/dist/infrastructure/server/ws/snapshots.js +52 -0
- package/dist/infrastructure/server/ws/subscriptions.d.ts +10 -0
- package/dist/infrastructure/server/ws/subscriptions.js +39 -0
- package/dist/infrastructure/server/wsHandler.d.ts +2 -10
- package/dist/infrastructure/server/wsHandler.js +12 -237
- package/dist/mcp/adapter.d.ts +5 -403
- package/dist/mcp/adapter.js +6 -778
- package/dist/mcp/backend/embedded/base.d.ts +7 -0
- package/dist/mcp/backend/embedded/base.js +15 -0
- package/dist/mcp/backend/embedded/index.d.ts +14 -0
- package/dist/mcp/backend/embedded/index.js +22 -0
- package/dist/mcp/backend/embedded/jobs.d.ts +44 -0
- package/dist/mcp/backend/embedded/jobs.js +98 -0
- package/dist/mcp/backend/embedded/queues.d.ts +27 -0
- package/dist/mcp/backend/embedded/queues.js +84 -0
- package/dist/mcp/backend/embedded/services.d.ts +29 -0
- package/dist/mcp/backend/embedded/services.js +107 -0
- package/dist/mcp/backend/serializers.d.ts +7 -0
- package/dist/mcp/backend/serializers.js +32 -0
- package/dist/mcp/backend/tcp/base.d.ts +19 -0
- package/dist/mcp/backend/tcp/base.js +54 -0
- package/dist/mcp/backend/tcp/index.d.ts +14 -0
- package/dist/mcp/backend/tcp/index.js +20 -0
- package/dist/mcp/backend/tcp/jobs.d.ts +44 -0
- package/dist/mcp/backend/tcp/jobs.js +122 -0
- package/dist/mcp/backend/tcp/queues.d.ts +27 -0
- package/dist/mcp/backend/tcp/queues.js +89 -0
- package/dist/mcp/backend/tcp/services.d.ts +30 -0
- package/dist/mcp/backend/tcp/services.js +161 -0
- package/dist/mcp/types/adapter.d.ts +176 -0
- package/dist/mcp/types/adapter.js +1 -0
- package/dist/shared/asyncLock.d.ts +13 -0
- package/dist/shared/asyncLock.js +65 -0
- package/dist/shared/lock.d.ts +10 -72
- package/dist/shared/lock.js +7 -231
- package/dist/shared/lockError.d.ts +3 -0
- package/dist/shared/lockError.js +6 -0
- package/dist/shared/lockTimeout.d.ts +2 -0
- package/dist/shared/lockTimeout.js +2 -0
- package/dist/shared/rwLock.d.ts +22 -0
- package/dist/shared/rwLock.js +124 -0
- package/dist/shared/serialization.js +1 -0
- package/dist/shared/skipList.d.ts +0 -5
- package/dist/shared/skipList.js +10 -57
- package/dist/shared/skipListNodes.d.ts +6 -0
- package/dist/shared/skipListNodes.js +43 -0
- package/dist/shared/types/lock.d.ts +7 -0
- package/dist/shared/types/lock.js +1 -0
- package/dist/shared/types/skipList.d.ts +4 -0
- package/dist/shared/types/skipList.js +1 -0
- package/package.json +2 -1
|
@@ -35,6 +35,9 @@ export class DependencyResultTracker {
|
|
|
35
35
|
get(dependencyId) {
|
|
36
36
|
return this.protectedResults.get(dependencyId);
|
|
37
37
|
}
|
|
38
|
+
hasConsumers(dependencyId) {
|
|
39
|
+
return (this.consumersByDependency.get(dependencyId)?.size ?? 0) > 0;
|
|
40
|
+
}
|
|
38
41
|
releaseConsumer(consumerId) {
|
|
39
42
|
const dependencies = this.dependenciesByConsumer.get(consumerId);
|
|
40
43
|
if (!dependencies)
|
|
@@ -19,20 +19,13 @@ export interface DlqContext {
|
|
|
19
19
|
};
|
|
20
20
|
storage: SqliteStorage | null;
|
|
21
21
|
}
|
|
22
|
+
export { processAutoRetry, retryDlqByFilter, retryDlqJob, retryDlqJobs, } from './dlqRetry';
|
|
22
23
|
/** Get jobs from DLQ (backward compatible) */
|
|
23
24
|
export declare function getDlqJobs(queue: string, ctx: DlqContext, count?: number): Job[];
|
|
24
25
|
/** Get DLQ entries with full metadata */
|
|
25
26
|
export declare function getDlqEntries(queue: string, ctx: DlqContext, filter?: DlqFilter): DlqEntry[];
|
|
26
27
|
/** Get DLQ statistics */
|
|
27
28
|
export declare function getDlqStats(queue: string, ctx: DlqContext): DlqStats;
|
|
28
|
-
/** Retry a single job from DLQ */
|
|
29
|
-
export declare function retryDlqJob(queue: string, jobId: JobId, ctx: DlqContext): Job | null;
|
|
30
|
-
/** Retry jobs from DLQ (backward compatible) */
|
|
31
|
-
export declare function retryDlqJobs(queue: string, ctx: DlqContext, jobId?: JobId, limit?: number): number;
|
|
32
|
-
/** Retry jobs by filter */
|
|
33
|
-
export declare function retryDlqByFilter(queue: string, ctx: DlqContext, filter: DlqFilter): number;
|
|
34
|
-
/** Process auto-retry for a queue */
|
|
35
|
-
export declare function processAutoRetry(queue: string, ctx: DlqContext): number;
|
|
36
29
|
/** Purge expired entries from DLQ */
|
|
37
30
|
export declare function purgeExpiredDlq(queue: string, ctx: DlqContext): number;
|
|
38
31
|
/** Purge all jobs from DLQ */
|
|
@@ -47,9 +40,16 @@ export interface RetryCompletedContext extends DlqContext {
|
|
|
47
40
|
has(id: JobId): boolean;
|
|
48
41
|
delete(id: JobId): boolean;
|
|
49
42
|
} & Iterable<JobId>;
|
|
43
|
+
completedJobsData: {
|
|
44
|
+
get(id: JobId): Job | undefined;
|
|
45
|
+
delete(id: JobId): boolean;
|
|
46
|
+
};
|
|
50
47
|
jobResults: {
|
|
51
48
|
delete(id: JobId): boolean;
|
|
52
49
|
};
|
|
53
50
|
}
|
|
54
51
|
/** Retry completed jobs */
|
|
55
|
-
export declare function retryCompletedJobs(queue: string, ctx: RetryCompletedContext, jobId?: JobId
|
|
52
|
+
export declare function retryCompletedJobs(queue: string, ctx: RetryCompletedContext, jobId?: JobId, options?: {
|
|
53
|
+
limit?: number;
|
|
54
|
+
timestamp?: number;
|
|
55
|
+
}): number;
|
|
@@ -3,8 +3,9 @@
|
|
|
3
3
|
* Dead Letter Queue operations with auto-retry, metadata, and lifecycle management
|
|
4
4
|
*/
|
|
5
5
|
import { MAX_TIMELINE_ENTRIES } from '../domain/types/job';
|
|
6
|
-
import {
|
|
6
|
+
import { setDlqRetryState } from '../domain/types/dlq';
|
|
7
7
|
import { shardIndex } from '../shared/hash';
|
|
8
|
+
export { processAutoRetry, retryDlqByFilter, retryDlqJob, retryDlqJobs, } from './dlqRetry';
|
|
8
9
|
/** Get jobs from DLQ (backward compatible) */
|
|
9
10
|
export function getDlqJobs(queue, ctx, count) {
|
|
10
11
|
const idx = shardIndex(queue);
|
|
@@ -59,152 +60,6 @@ export function getDlqStats(queue, ctx) {
|
|
|
59
60
|
}
|
|
60
61
|
return stats;
|
|
61
62
|
}
|
|
62
|
-
/** Retry a single job from DLQ */
|
|
63
|
-
export function retryDlqJob(queue, jobId, ctx) {
|
|
64
|
-
const idx = shardIndex(queue);
|
|
65
|
-
const shard = ctx.shards[idx];
|
|
66
|
-
const now = Date.now();
|
|
67
|
-
const entry = shard.removeFromDlq(queue, jobId);
|
|
68
|
-
if (!entry)
|
|
69
|
-
return null;
|
|
70
|
-
// Delete from SQLite
|
|
71
|
-
ctx.storage?.deleteDlqEntry(jobId);
|
|
72
|
-
const job = entry.job;
|
|
73
|
-
job.attempts = 0;
|
|
74
|
-
job.runAt = now;
|
|
75
|
-
job.stallCount = 0;
|
|
76
|
-
job.lastHeartbeat = now;
|
|
77
|
-
if (job.timeline.length < MAX_TIMELINE_ENTRIES) {
|
|
78
|
-
job.timeline.push({ state: 'waiting', timestamp: now });
|
|
79
|
-
}
|
|
80
|
-
shard.getQueue(queue).push(job);
|
|
81
|
-
const isDelayed = job.runAt > now;
|
|
82
|
-
shard.incrementQueued(job.id, isDelayed, job.createdAt, queue, job.runAt);
|
|
83
|
-
ctx.jobIndex.set(job.id, { type: 'queue', shardIdx: idx, queueName: queue });
|
|
84
|
-
// Re-insert jobs row (deleted when job entered DLQ) so retry survives restart
|
|
85
|
-
ctx.storage?.insertJob(job, true);
|
|
86
|
-
return job;
|
|
87
|
-
}
|
|
88
|
-
/** Retry jobs from DLQ (backward compatible) */
|
|
89
|
-
export function retryDlqJobs(queue, ctx, jobId, limit) {
|
|
90
|
-
if (jobId) {
|
|
91
|
-
return retryDlqJob(queue, jobId, ctx) ? 1 : 0;
|
|
92
|
-
}
|
|
93
|
-
// Bounded retry (#111-class: `retryJobs({ state:'failed', count })`). Retry
|
|
94
|
-
// only the first `limit` DLQ entries, reusing the tested single-entry path so
|
|
95
|
-
// the remaining entries stay in the DLQ (memory + SQLite) instead of the
|
|
96
|
-
// clear-all fast path below wrongly draining the whole queue. Any provided
|
|
97
|
-
// `limit` engages the bounded path; a negative/NaN/fractional cap is clamped
|
|
98
|
-
// to a safe non-negative integer so it can never fall through to clear-all
|
|
99
|
-
// (skeptic: `limit >= 0` let `-1`/`NaN` drain the entire DLQ). `undefined`
|
|
100
|
-
// (no cap requested) still means "retry all" via the fast path below.
|
|
101
|
-
if (limit !== undefined) {
|
|
102
|
-
const cap = Number.isFinite(limit) && limit > 0 ? Math.floor(limit) : 0;
|
|
103
|
-
const idx = shardIndex(queue);
|
|
104
|
-
const shard = ctx.shards[idx];
|
|
105
|
-
// Snapshot ids first: retryDlqJob mutates the DLQ as it goes.
|
|
106
|
-
const ids = shard
|
|
107
|
-
.getDlqEntries(queue)
|
|
108
|
-
.slice(0, cap)
|
|
109
|
-
.map((e) => e.job.id);
|
|
110
|
-
let retried = 0;
|
|
111
|
-
for (const id of ids) {
|
|
112
|
-
if (retryDlqJob(queue, id, ctx))
|
|
113
|
-
retried++;
|
|
114
|
-
}
|
|
115
|
-
return retried;
|
|
116
|
-
}
|
|
117
|
-
const idx = shardIndex(queue);
|
|
118
|
-
const shard = ctx.shards[idx];
|
|
119
|
-
const entries = shard.getDlqEntries(queue);
|
|
120
|
-
const count = entries.length;
|
|
121
|
-
// Clear all entries from memory
|
|
122
|
-
shard.clearDlq(queue);
|
|
123
|
-
// Clear from SQLite
|
|
124
|
-
ctx.storage?.clearDlqQueue(queue);
|
|
125
|
-
const now = Date.now();
|
|
126
|
-
for (const entry of entries) {
|
|
127
|
-
const job = entry.job;
|
|
128
|
-
job.attempts = 0;
|
|
129
|
-
job.runAt = now;
|
|
130
|
-
job.stallCount = 0;
|
|
131
|
-
job.lastHeartbeat = now;
|
|
132
|
-
if (job.timeline.length < MAX_TIMELINE_ENTRIES) {
|
|
133
|
-
job.timeline.push({ state: 'waiting', timestamp: now });
|
|
134
|
-
}
|
|
135
|
-
shard.getQueue(queue).push(job);
|
|
136
|
-
const isDelayed = job.runAt > now;
|
|
137
|
-
shard.incrementQueued(job.id, isDelayed, job.createdAt, queue, job.runAt);
|
|
138
|
-
ctx.jobIndex.set(job.id, { type: 'queue', shardIdx: idx, queueName: queue });
|
|
139
|
-
ctx.storage?.insertJob(job, true);
|
|
140
|
-
}
|
|
141
|
-
return count;
|
|
142
|
-
}
|
|
143
|
-
/** Retry jobs by filter */
|
|
144
|
-
export function retryDlqByFilter(queue, ctx, filter) {
|
|
145
|
-
const idx = shardIndex(queue);
|
|
146
|
-
const shard = ctx.shards[idx];
|
|
147
|
-
const entries = shard.getDlqFiltered(queue, filter);
|
|
148
|
-
let count = 0;
|
|
149
|
-
const now = Date.now();
|
|
150
|
-
for (const entry of entries) {
|
|
151
|
-
const removed = shard.removeFromDlq(queue, entry.job.id);
|
|
152
|
-
if (!removed)
|
|
153
|
-
continue;
|
|
154
|
-
// Delete from SQLite
|
|
155
|
-
ctx.storage?.deleteDlqEntry(entry.job.id);
|
|
156
|
-
const job = entry.job;
|
|
157
|
-
job.attempts = 0;
|
|
158
|
-
job.runAt = now;
|
|
159
|
-
job.stallCount = 0;
|
|
160
|
-
job.lastHeartbeat = now;
|
|
161
|
-
if (job.timeline.length < MAX_TIMELINE_ENTRIES) {
|
|
162
|
-
job.timeline.push({ state: 'waiting', timestamp: now });
|
|
163
|
-
}
|
|
164
|
-
shard.getQueue(queue).push(job);
|
|
165
|
-
const isDelayed = job.runAt > now;
|
|
166
|
-
shard.incrementQueued(job.id, isDelayed, job.createdAt, queue, job.runAt);
|
|
167
|
-
ctx.jobIndex.set(job.id, { type: 'queue', shardIdx: idx, queueName: queue });
|
|
168
|
-
ctx.storage?.insertJob(job, true);
|
|
169
|
-
count++;
|
|
170
|
-
}
|
|
171
|
-
return count;
|
|
172
|
-
}
|
|
173
|
-
/** Process auto-retry for a queue */
|
|
174
|
-
export function processAutoRetry(queue, ctx) {
|
|
175
|
-
const idx = shardIndex(queue);
|
|
176
|
-
const shard = ctx.shards[idx];
|
|
177
|
-
const config = shard.getDlqConfig(queue);
|
|
178
|
-
if (!config.autoRetry)
|
|
179
|
-
return 0;
|
|
180
|
-
const now = Date.now();
|
|
181
|
-
const entries = shard.getAutoRetryEntries(queue, now);
|
|
182
|
-
let count = 0;
|
|
183
|
-
for (const entry of entries) {
|
|
184
|
-
// Update retry tracking
|
|
185
|
-
scheduleNextRetry(entry, config);
|
|
186
|
-
// Remove from DLQ
|
|
187
|
-
const removed = shard.removeFromDlq(queue, entry.job.id);
|
|
188
|
-
if (!removed)
|
|
189
|
-
continue;
|
|
190
|
-
// Re-queue job
|
|
191
|
-
const job = entry.job;
|
|
192
|
-
job.attempts = 0;
|
|
193
|
-
job.runAt = now;
|
|
194
|
-
job.stallCount = 0;
|
|
195
|
-
job.lastHeartbeat = now;
|
|
196
|
-
if (job.timeline.length < MAX_TIMELINE_ENTRIES) {
|
|
197
|
-
job.timeline.push({ state: 'waiting', timestamp: now });
|
|
198
|
-
}
|
|
199
|
-
shard.getQueue(queue).push(job);
|
|
200
|
-
const isDelayed = job.runAt > now;
|
|
201
|
-
shard.incrementQueued(job.id, isDelayed, job.createdAt, queue, job.runAt);
|
|
202
|
-
ctx.jobIndex.set(job.id, { type: 'queue', shardIdx: idx, queueName: queue });
|
|
203
|
-
ctx.storage?.insertJob(job, true);
|
|
204
|
-
count++;
|
|
205
|
-
}
|
|
206
|
-
return count;
|
|
207
|
-
}
|
|
208
63
|
/** Purge expired entries from DLQ */
|
|
209
64
|
export function purgeExpiredDlq(queue, ctx) {
|
|
210
65
|
const idx = shardIndex(queue);
|
|
@@ -260,41 +115,68 @@ export function getDlqConfig(queue, ctx) {
|
|
|
260
115
|
return ctx.shards[idx].getDlqConfig(queue);
|
|
261
116
|
}
|
|
262
117
|
/** Retry completed jobs */
|
|
263
|
-
export function retryCompletedJobs(queue, ctx, jobId) {
|
|
118
|
+
export function retryCompletedJobs(queue, ctx, jobId, options = {}) {
|
|
264
119
|
if (jobId) {
|
|
265
120
|
if (!ctx.completedJobs.has(jobId))
|
|
266
121
|
return 0;
|
|
267
|
-
const job = ctx.storage?.getJob(jobId);
|
|
122
|
+
const job = ctx.completedJobsData.get(jobId) ?? ctx.storage?.getJob(jobId);
|
|
268
123
|
if (job?.queue !== queue)
|
|
269
124
|
return 0;
|
|
270
125
|
return requeueCompletedJob(job, ctx);
|
|
271
126
|
}
|
|
127
|
+
const limit = options.limit === undefined
|
|
128
|
+
? Number.POSITIVE_INFINITY
|
|
129
|
+
: Number.isFinite(options.limit) && options.limit > 0
|
|
130
|
+
? Math.floor(options.limit)
|
|
131
|
+
: 0;
|
|
132
|
+
if (limit === 0)
|
|
133
|
+
return 0;
|
|
134
|
+
const timestamp = options.timestamp ?? Number.POSITIVE_INFINITY;
|
|
272
135
|
let count = 0;
|
|
273
|
-
for (const id of ctx.completedJobs) {
|
|
274
|
-
|
|
275
|
-
|
|
136
|
+
for (const id of [...ctx.completedJobs]) {
|
|
137
|
+
if (count >= limit)
|
|
138
|
+
break;
|
|
139
|
+
const job = ctx.completedJobsData.get(id) ?? ctx.storage?.getJob(id);
|
|
140
|
+
if (job?.queue === queue && job.completedAt !== null && job.completedAt <= timestamp) {
|
|
276
141
|
count += requeueCompletedJob(job, ctx);
|
|
142
|
+
}
|
|
277
143
|
}
|
|
278
144
|
return count;
|
|
279
145
|
}
|
|
280
146
|
/** Requeue a single completed job */
|
|
281
147
|
function requeueCompletedJob(job, ctx) {
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
job.progress = 0;
|
|
287
|
-
if (job.timeline.length < MAX_TIMELINE_ENTRIES) {
|
|
288
|
-
job.timeline.push({ state: 'waiting', timestamp: job.runAt });
|
|
148
|
+
const now = Date.now();
|
|
149
|
+
const timeline = [...job.timeline];
|
|
150
|
+
if (timeline.length < MAX_TIMELINE_ENTRIES) {
|
|
151
|
+
timeline.push({ state: 'waiting', timestamp: now });
|
|
289
152
|
}
|
|
290
|
-
const
|
|
153
|
+
const requeued = {
|
|
154
|
+
...job,
|
|
155
|
+
attempts: 0,
|
|
156
|
+
startedAt: null,
|
|
157
|
+
completedAt: null,
|
|
158
|
+
runAt: now,
|
|
159
|
+
progress: 0,
|
|
160
|
+
progressMessage: null,
|
|
161
|
+
lastHeartbeat: now,
|
|
162
|
+
timeline,
|
|
163
|
+
};
|
|
164
|
+
setDlqRetryState(requeued, null);
|
|
165
|
+
// Commit the durable transition before publishing the new in-memory state.
|
|
166
|
+
// A SQLite failure therefore leaves the completed generation authoritative.
|
|
167
|
+
ctx.storage?.requeueCompletedJob(requeued);
|
|
168
|
+
const idx = shardIndex(requeued.queue);
|
|
291
169
|
const shard = ctx.shards[idx];
|
|
292
|
-
shard.getQueue(
|
|
293
|
-
shard.incrementQueued(
|
|
294
|
-
ctx.jobIndex.set(
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
170
|
+
shard.getQueue(requeued.queue).push(requeued);
|
|
171
|
+
shard.incrementQueued(requeued.id, false, requeued.createdAt, requeued.queue, requeued.runAt);
|
|
172
|
+
ctx.jobIndex.set(requeued.id, {
|
|
173
|
+
type: 'queue',
|
|
174
|
+
shardIdx: idx,
|
|
175
|
+
queueName: requeued.queue,
|
|
176
|
+
});
|
|
177
|
+
ctx.completedJobs.delete(requeued.id);
|
|
178
|
+
ctx.completedJobsData.delete(requeued.id);
|
|
179
|
+
ctx.jobResults.delete(requeued.id);
|
|
180
|
+
shard.notify(requeued.queue);
|
|
299
181
|
return 1;
|
|
300
182
|
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/** DLQ manual and automatic retry transitions. */
|
|
2
|
+
import { type Job, type JobId } from '../domain/types/job';
|
|
3
|
+
import type { DlqFilter } from '../domain/types/dlq';
|
|
4
|
+
import type { DlqContext } from './dlqManager';
|
|
5
|
+
/** Retry a single job from DLQ and reset the automatic retry generation. */
|
|
6
|
+
export declare function retryDlqJob(queue: string, jobId: JobId, ctx: DlqContext): Job | null;
|
|
7
|
+
/** Retry jobs from DLQ, optionally bounded to the oldest `limit` entries. */
|
|
8
|
+
export declare function retryDlqJobs(queue: string, ctx: DlqContext, jobId?: JobId, limit?: number): number;
|
|
9
|
+
/** Retry all DLQ entries selected by a metadata filter. */
|
|
10
|
+
export declare function retryDlqByFilter(queue: string, ctx: DlqContext, filter: DlqFilter): number;
|
|
11
|
+
/** Dispatch due auto-retries while preserving their bounded retry chain. */
|
|
12
|
+
export declare function processAutoRetry(queue: string, ctx: DlqContext): number;
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/** DLQ manual and automatic retry transitions. */
|
|
2
|
+
import { MAX_TIMELINE_ENTRIES } from '../domain/types/job';
|
|
3
|
+
import { retainDlqRetryState, scheduleNextRetry, setDlqRetryState } from '../domain/types/dlq';
|
|
4
|
+
import { shardIndex } from '../shared/hash';
|
|
5
|
+
function prepareRetry(job, now) {
|
|
6
|
+
job.attempts = 0;
|
|
7
|
+
job.runAt = now;
|
|
8
|
+
job.startedAt = null;
|
|
9
|
+
job.stallCount = 0;
|
|
10
|
+
job.lastHeartbeat = now;
|
|
11
|
+
if (job.timeline.length < MAX_TIMELINE_ENTRIES) {
|
|
12
|
+
job.timeline.push({ state: 'waiting', timestamp: now });
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
function enqueueRetry(queue, job, now, ctx) {
|
|
16
|
+
const idx = shardIndex(queue);
|
|
17
|
+
const shard = ctx.shards[idx];
|
|
18
|
+
prepareRetry(job, now);
|
|
19
|
+
shard.getQueue(queue).push(job);
|
|
20
|
+
shard.incrementQueued(job.id, job.runAt > now, job.createdAt, queue, job.runAt);
|
|
21
|
+
ctx.jobIndex.set(job.id, { type: 'queue', shardIdx: idx, queueName: queue });
|
|
22
|
+
ctx.storage?.requeueDlqJob(job);
|
|
23
|
+
}
|
|
24
|
+
/** Retry a single job from DLQ and reset the automatic retry generation. */
|
|
25
|
+
export function retryDlqJob(queue, jobId, ctx) {
|
|
26
|
+
const shard = ctx.shards[shardIndex(queue)];
|
|
27
|
+
const entry = shard.removeFromDlq(queue, jobId);
|
|
28
|
+
if (!entry)
|
|
29
|
+
return null;
|
|
30
|
+
setDlqRetryState(entry.job, null);
|
|
31
|
+
enqueueRetry(queue, entry.job, Date.now(), ctx);
|
|
32
|
+
return entry.job;
|
|
33
|
+
}
|
|
34
|
+
/** Retry jobs from DLQ, optionally bounded to the oldest `limit` entries. */
|
|
35
|
+
export function retryDlqJobs(queue, ctx, jobId, limit) {
|
|
36
|
+
if (jobId)
|
|
37
|
+
return retryDlqJob(queue, jobId, ctx) ? 1 : 0;
|
|
38
|
+
const shard = ctx.shards[shardIndex(queue)];
|
|
39
|
+
if (limit !== undefined) {
|
|
40
|
+
const cap = Number.isFinite(limit) && limit > 0 ? Math.floor(limit) : 0;
|
|
41
|
+
const ids = shard
|
|
42
|
+
.getDlqEntries(queue)
|
|
43
|
+
.slice(0, cap)
|
|
44
|
+
.map((entry) => entry.job.id);
|
|
45
|
+
let retried = 0;
|
|
46
|
+
for (const id of ids) {
|
|
47
|
+
if (retryDlqJob(queue, id, ctx))
|
|
48
|
+
retried++;
|
|
49
|
+
}
|
|
50
|
+
return retried;
|
|
51
|
+
}
|
|
52
|
+
const entries = [...shard.getDlqEntries(queue)];
|
|
53
|
+
shard.clearDlq(queue);
|
|
54
|
+
ctx.storage?.clearDlqQueue(queue);
|
|
55
|
+
const now = Date.now();
|
|
56
|
+
for (const entry of entries) {
|
|
57
|
+
setDlqRetryState(entry.job, null);
|
|
58
|
+
enqueueRetry(queue, entry.job, now, ctx);
|
|
59
|
+
}
|
|
60
|
+
return entries.length;
|
|
61
|
+
}
|
|
62
|
+
/** Retry all DLQ entries selected by a metadata filter. */
|
|
63
|
+
export function retryDlqByFilter(queue, ctx, filter) {
|
|
64
|
+
const shard = ctx.shards[shardIndex(queue)];
|
|
65
|
+
const entries = [...shard.getDlqFiltered(queue, filter)];
|
|
66
|
+
const now = Date.now();
|
|
67
|
+
let retried = 0;
|
|
68
|
+
for (const entry of entries) {
|
|
69
|
+
const removed = shard.removeFromDlq(queue, entry.job.id);
|
|
70
|
+
if (!removed)
|
|
71
|
+
continue;
|
|
72
|
+
setDlqRetryState(removed.job, null);
|
|
73
|
+
enqueueRetry(queue, removed.job, now, ctx);
|
|
74
|
+
retried++;
|
|
75
|
+
}
|
|
76
|
+
return retried;
|
|
77
|
+
}
|
|
78
|
+
/** Dispatch due auto-retries while preserving their bounded retry chain. */
|
|
79
|
+
export function processAutoRetry(queue, ctx) {
|
|
80
|
+
const shard = ctx.shards[shardIndex(queue)];
|
|
81
|
+
const config = shard.getDlqConfig(queue);
|
|
82
|
+
if (!config.autoRetry)
|
|
83
|
+
return 0;
|
|
84
|
+
const now = Date.now();
|
|
85
|
+
const entries = [...shard.getAutoRetryEntries(queue, now)];
|
|
86
|
+
let retried = 0;
|
|
87
|
+
for (const entry of entries) {
|
|
88
|
+
const removed = shard.removeFromDlq(queue, entry.job.id);
|
|
89
|
+
if (!removed)
|
|
90
|
+
continue;
|
|
91
|
+
scheduleNextRetry(removed, config);
|
|
92
|
+
retainDlqRetryState(removed.job, removed);
|
|
93
|
+
enqueueRetry(queue, removed.job, now, ctx);
|
|
94
|
+
retried++;
|
|
95
|
+
}
|
|
96
|
+
return retried;
|
|
97
|
+
}
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
* Handles BullMQ-style lock-based job ownership
|
|
4
4
|
*/
|
|
5
5
|
import { isLockExpired } from '../domain/types/job';
|
|
6
|
+
import { recordJobFailureAttempt } from '../domain/types/dlq';
|
|
6
7
|
import { shardIndex, processingShardIndex } from '../shared/hash';
|
|
7
8
|
import { withWriteLock } from '../shared/lock';
|
|
8
9
|
// Re-export lock operations
|
|
@@ -59,6 +60,13 @@ export async function checkExpiredLocks(ctx) {
|
|
|
59
60
|
for (const [procIdx, items] of procMap) {
|
|
60
61
|
await withWriteLock(ctx.processingLocks[procIdx], async () => {
|
|
61
62
|
for (const { jobId, lock, job } of items) {
|
|
63
|
+
const currentJob = ctx.processingShards[procIdx].get(jobId);
|
|
64
|
+
const currentLock = ctx.jobLocks.get(jobId);
|
|
65
|
+
if (currentJob !== job ||
|
|
66
|
+
currentLock !== lock ||
|
|
67
|
+
!isLockExpired(currentLock, Date.now())) {
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
62
70
|
processExpiredLockInner(jobId, lock, job, shardIdx, procIdx, ctx, now);
|
|
63
71
|
}
|
|
64
72
|
});
|
|
@@ -76,12 +84,14 @@ function processExpiredLockInner(jobId, lock, job, shardIdx, procIdx, ctx, now)
|
|
|
76
84
|
const queue = shard.getQueue(job.queue);
|
|
77
85
|
// Remove from processing
|
|
78
86
|
ctx.processingShards[procIdx].delete(jobId);
|
|
87
|
+
ctx.timeoutScheduler.cancel(jobId);
|
|
79
88
|
// Discard cron jobs with preventOverlap instead of re-queuing (#75).
|
|
80
89
|
// During graceful shutdown, heartbeats stop and the lock expires before
|
|
81
90
|
// the job finishes. Re-queuing would cause "starts right away on reconnect".
|
|
82
91
|
// The cron scheduler will re-create the job at the next scheduled tick.
|
|
83
92
|
if (job.uniqueKey?.startsWith('cron:')) {
|
|
84
|
-
|
|
93
|
+
ctx.retiredCronLeaseTokens.set(jobId, lock.token);
|
|
94
|
+
shard.releaseJobResources(job.queue, job.uniqueKey, job.groupId, job.id);
|
|
85
95
|
ctx.jobIndex.delete(jobId);
|
|
86
96
|
ctx.storage?.deleteJob(jobId);
|
|
87
97
|
ctx.jobLocks.delete(jobId);
|
|
@@ -89,7 +99,6 @@ function processExpiredLockInner(jobId, lock, job, shardIdx, procIdx, ctx, now)
|
|
|
89
99
|
}
|
|
90
100
|
// Increment attempts and reset state
|
|
91
101
|
job.attempts++;
|
|
92
|
-
job.startedAt = null;
|
|
93
102
|
job.lastHeartbeat = now;
|
|
94
103
|
job.stallCount++;
|
|
95
104
|
// A lost lock consumes both retry budgets. Never requeue beyond either bound.
|
|
@@ -124,10 +133,11 @@ function handleRecoveryBoundExceeded(opts) {
|
|
|
124
133
|
// Release the concurrency slot (+group+uniqueKey) acquired at pull before
|
|
125
134
|
// moving to DLQ — otherwise the slot leaks (mirrors
|
|
126
135
|
// stallDetection.moveStalliedJobToDlq).
|
|
127
|
-
shard.releaseJobResources(job.queue, job.uniqueKey, job.groupId);
|
|
136
|
+
shard.releaseJobResources(job.queue, job.uniqueKey, job.groupId, job.id);
|
|
128
137
|
const entry = shard.addToDlq(job, attemptsExhausted ? "max_attempts_exceeded" /* FailureReason.MaxAttemptsExceeded */ : "stalled" /* FailureReason.Stalled */, attemptsExhausted
|
|
129
138
|
? `Lock expired at max attempts (${job.maxAttempts})`
|
|
130
139
|
: `Lock expired after ${lock.renewalCount} renewals`);
|
|
140
|
+
job.startedAt = null;
|
|
131
141
|
ctx.jobIndex.set(jobId, { type: 'dlq', queueName: job.queue });
|
|
132
142
|
// Persist the DLQ move like the sibling paths (ack.moveFailedJobToDlq,
|
|
133
143
|
// stallDetection.moveStalliedJobToDlq, backgroundTasks startup-recovery).
|
|
@@ -136,6 +146,13 @@ function handleRecoveryBoundExceeded(opts) {
|
|
|
136
146
|
// surviving row and throws `UNIQUE constraint failed: jobs.id` (#97).
|
|
137
147
|
ctx.storage?.saveDlqEntry(entry);
|
|
138
148
|
ctx.storage?.deleteJob(jobId);
|
|
149
|
+
ctx.eventsManager.broadcast({
|
|
150
|
+
eventType: "stalled" /* EventType.Stalled */,
|
|
151
|
+
jobId,
|
|
152
|
+
queue: job.queue,
|
|
153
|
+
timestamp: now,
|
|
154
|
+
data: { stallCount: job.stallCount, action: "move_to_dlq" /* StallAction.MoveToDlq */ },
|
|
155
|
+
});
|
|
139
156
|
ctx.eventsManager.broadcast({
|
|
140
157
|
eventType: "failed" /* EventType.Failed */,
|
|
141
158
|
jobId,
|
|
@@ -150,14 +167,17 @@ function handleRecoveryBoundExceeded(opts) {
|
|
|
150
167
|
function requeueExpiredJob(opts) {
|
|
151
168
|
const { jobId, job, queue, idx, ctx, now } = opts;
|
|
152
169
|
const shard = ctx.shards[idx];
|
|
170
|
+
recordJobFailureAttempt(job, "stalled" /* FailureReason.Stalled */, 'Lock expired', now);
|
|
171
|
+
job.startedAt = null;
|
|
153
172
|
// Release the concurrency slot (+group+uniqueKey) acquired at pull before
|
|
154
173
|
// re-pushing — otherwise the slot leaks and the queue wedges (mirrors
|
|
155
174
|
// stallDetection.retryStalliedJob).
|
|
156
|
-
shard.releaseJobResources(job.queue, job.uniqueKey, job.groupId);
|
|
175
|
+
shard.releaseJobResources(job.queue, job.uniqueKey, job.groupId, job.id);
|
|
157
176
|
queue.push(job);
|
|
158
177
|
const isDelayed = job.runAt > now;
|
|
159
178
|
shard.incrementQueued(jobId, isDelayed, job.createdAt, job.queue, job.runAt);
|
|
160
179
|
ctx.jobIndex.set(jobId, { type: 'queue', shardIdx: idx, queueName: job.queue });
|
|
180
|
+
ctx.storage?.updateForRetry(job);
|
|
161
181
|
shard.notify(job.queue);
|
|
162
182
|
ctx.eventsManager.broadcast({
|
|
163
183
|
eventType: "stalled" /* EventType.Stalled */,
|
|
@@ -10,9 +10,22 @@ export function createLock(jobId, owner, ctx, ttl = DEFAULT_LOCK_TTL) {
|
|
|
10
10
|
const loc = ctx.jobIndex.get(jobId);
|
|
11
11
|
if (loc?.type !== 'processing')
|
|
12
12
|
return null;
|
|
13
|
-
|
|
14
|
-
if (
|
|
15
|
-
|
|
13
|
+
const existing = ctx.jobLocks.get(jobId);
|
|
14
|
+
if (existing) {
|
|
15
|
+
const job = ctx.processingShards[loc.shardIdx].get(jobId);
|
|
16
|
+
const isNewGeneration = job?.startedAt !== null && job?.startedAt !== undefined && job.startedAt > existing.createdAt;
|
|
17
|
+
if (!isNewGeneration)
|
|
18
|
+
return null;
|
|
19
|
+
// Stall retry deliberately leaves the previous lease as a stale-outcome
|
|
20
|
+
// guard. Once that job is pulled again, replace the lease and detach the
|
|
21
|
+
// old connection before the new connection registers ownership.
|
|
22
|
+
ctx.jobLocks.delete(jobId);
|
|
23
|
+
for (const [clientId, jobs] of ctx.clientJobs) {
|
|
24
|
+
if (!jobs.delete(jobId))
|
|
25
|
+
continue;
|
|
26
|
+
if (jobs.size === 0)
|
|
27
|
+
ctx.clientJobs.delete(clientId);
|
|
28
|
+
}
|
|
16
29
|
}
|
|
17
30
|
const lock = createJobLock(jobId, owner, ttl);
|
|
18
31
|
ctx.jobLocks.set(jobId, lock);
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { JobId } from '../../../domain/types/job';
|
|
2
|
+
import type { AckContext, CompletionOptions } from '../../types/ack';
|
|
3
|
+
export declare function ackJobBatch(jobIds: JobId[], ctx: AckContext, leaseTokens?: Array<string | undefined>): Promise<boolean[]>;
|
|
4
|
+
export declare function ackJobBatchWithResults(items: Array<{
|
|
5
|
+
id: JobId;
|
|
6
|
+
result: unknown;
|
|
7
|
+
token?: string;
|
|
8
|
+
} & CompletionOptions>, ctx: AckContext): Promise<boolean[]>;
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { extractJobs, extractJobsWithResults, finalizeBatchAck, groupByProcShard, groupByQueueShard, groupItemsByProcShard, releaseResources, } from '../ackHelpers';
|
|
2
|
+
import { ackJob } from './completion';
|
|
3
|
+
function notifyReleasedQueues(shard, jobs) {
|
|
4
|
+
const releasedByQueue = new Map();
|
|
5
|
+
for (const job of jobs) {
|
|
6
|
+
releasedByQueue.set(job.queue, (releasedByQueue.get(job.queue) ?? 0) + 1);
|
|
7
|
+
}
|
|
8
|
+
for (const [queue, count] of releasedByQueue)
|
|
9
|
+
shard.notifyBatch(queue, count);
|
|
10
|
+
}
|
|
11
|
+
function alignApplied(jobIds, appliedIds) {
|
|
12
|
+
const counts = new Map();
|
|
13
|
+
for (const id of appliedIds)
|
|
14
|
+
counts.set(id, (counts.get(id) ?? 0) + 1);
|
|
15
|
+
return jobIds.map((id) => {
|
|
16
|
+
const remaining = counts.get(id) ?? 0;
|
|
17
|
+
if (remaining === 0)
|
|
18
|
+
return false;
|
|
19
|
+
counts.set(id, remaining - 1);
|
|
20
|
+
return true;
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
export async function ackJobBatch(jobIds, ctx, leaseTokens) {
|
|
24
|
+
if (jobIds.length === 0)
|
|
25
|
+
return [];
|
|
26
|
+
if (jobIds.length <= 4) {
|
|
27
|
+
return Promise.all(jobIds.map((id, index) => ackJob(id, undefined, ctx, { leaseToken: leaseTokens?.[index] })));
|
|
28
|
+
}
|
|
29
|
+
const batchContext = {
|
|
30
|
+
processingShards: ctx.processingShards,
|
|
31
|
+
processingLocks: ctx.processingLocks,
|
|
32
|
+
shards: ctx.shards,
|
|
33
|
+
shardLocks: ctx.shardLocks,
|
|
34
|
+
};
|
|
35
|
+
const byProcessingShard = groupByProcShard(jobIds);
|
|
36
|
+
const extractedJobs = await extractJobs(byProcessingShard, batchContext);
|
|
37
|
+
const byQueueShard = groupByQueueShard(extractedJobs);
|
|
38
|
+
await releaseResources(byQueueShard, batchContext);
|
|
39
|
+
for (const [index, jobs] of byQueueShard)
|
|
40
|
+
notifyReleasedQueues(ctx.shards[index], jobs);
|
|
41
|
+
finalizeBatchAck(extractedJobs, ctx, false);
|
|
42
|
+
return alignApplied(jobIds, extractedJobs.map((entry) => entry.id));
|
|
43
|
+
}
|
|
44
|
+
export async function ackJobBatchWithResults(items, ctx) {
|
|
45
|
+
if (items.length === 0)
|
|
46
|
+
return [];
|
|
47
|
+
if (items.length <= 4) {
|
|
48
|
+
return Promise.all(items.map((item) => ackJob(item.id, item.result, ctx, { ...item, leaseToken: item.token })));
|
|
49
|
+
}
|
|
50
|
+
const batchContext = {
|
|
51
|
+
processingShards: ctx.processingShards,
|
|
52
|
+
processingLocks: ctx.processingLocks,
|
|
53
|
+
shards: ctx.shards,
|
|
54
|
+
shardLocks: ctx.shardLocks,
|
|
55
|
+
};
|
|
56
|
+
const byProcessingShard = groupItemsByProcShard(items);
|
|
57
|
+
const extractedJobs = await extractJobsWithResults(byProcessingShard, batchContext);
|
|
58
|
+
const byQueueShard = groupByQueueShard(extractedJobs);
|
|
59
|
+
await releaseResources(byQueueShard, batchContext);
|
|
60
|
+
for (const [index, jobs] of byQueueShard)
|
|
61
|
+
notifyReleasedQueues(ctx.shards[index], jobs);
|
|
62
|
+
finalizeBatchAck(extractedJobs, ctx, true);
|
|
63
|
+
return alignApplied(items.map((item) => item.id), extractedJobs.map((entry) => entry.id));
|
|
64
|
+
}
|