bunqueue 2.8.54 → 2.8.57
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 -442
- package/dist/application/cleanupTasks.js +1 -0
- package/dist/application/clientTracking.js +2 -0
- package/dist/application/contextFactory.d.ts +13 -90
- package/dist/application/contextFactory.js +8 -0
- package/dist/application/dependencyResultTracker.d.ts +1 -0
- package/dist/application/dependencyResultTracker.js +3 -0
- package/dist/application/dlqManager.d.ts +2 -8
- package/dist/application/dlqManager.js +33 -162
- package/dist/application/dlqRetry.d.ts +12 -0
- package/dist/application/dlqRetry.js +97 -0
- package/dist/application/lockManager.js +21 -1
- 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 +10 -3
- 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 +44 -7
- 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 -400
- package/dist/application/queueManager.js +3 -1922
- 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 +6 -1
- 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.js → types/config.js} +3 -4
- 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/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 +31 -16
- 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 +0 -4
- package/dist/client/jobConversion.js +32 -33
- package/dist/client/jobConversionHelpers.d.ts +18 -2
- package/dist/client/jobConversionHelpers.js +17 -10
- package/dist/client/jobConversionTypes.d.ts +5 -1
- package/dist/client/jobHelpers.d.ts +7 -2
- package/dist/client/jobHelpers.js +16 -8
- package/dist/client/queue/dlq.js +12 -14
- package/dist/client/queue/dlqJobMethods.js +11 -10
- package/dist/client/queue/dlqOps.js +2 -8
- 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 +82 -24
- package/dist/client/queue/jobProxy.d.ts +4 -50
- package/dist/client/queue/jobProxy.js +3 -516
- 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 -364
- package/dist/client/queue/operations/management.js +2 -1
- package/dist/client/queue/operations/query.js +20 -63
- package/dist/client/queue/queue.d.ts +6 -192
- package/dist/client/queue/queue.js +6 -559
- 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/{queueTypes.d.ts → types/contexts.d.ts} +2 -2
- 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 +4 -8
- package/dist/client/queue/workers.js +22 -14
- package/dist/client/queue-events/tcpSubscription.d.ts +23 -0
- package/dist/client/queue-events/tcpSubscription.js +99 -0
- 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/{types.js → constants.js} +0 -6
- 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 +67 -124
- package/dist/client/worker/processorHandlers.d.ts +4 -61
- package/dist/client/worker/processorHandlers.js +4 -398
- 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 -928
- 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/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 -145
- package/dist/domain/queue/shard.js +4 -409
- 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 -555
- 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 +2 -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 -280
- package/dist/infrastructure/persistence/sqlite.js +3 -1013
- 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 -270
- 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/flow.js +6 -1
- package/dist/infrastructure/server/handlers/introspection.js +1 -1
- 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 +12 -3
- 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
- package/dist/application/types.d.ts +0 -148
- package/dist/client/sandboxed/types.d.ts +0 -79
- package/dist/client/sandboxed/types.js +0 -5
- package/dist/client/worker/types.d.ts +0 -50
- /package/dist/client/queue/{queueTypes.js → types/contexts.js} +0 -0
|
@@ -1,442 +1,6 @@
|
|
|
1
|
-
/**
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
import { createDlqEntry } from '../domain/types/dlq';
|
|
8
|
-
import { calculateBackoff } from '../domain/types/job';
|
|
9
|
-
import * as dlqOps from './dlqManager';
|
|
10
|
-
import { checkExpiredLocks } from './lockManager';
|
|
11
|
-
import { cleanup } from './cleanupTasks';
|
|
12
|
-
import { checkStalledJobs } from './stallDetection';
|
|
13
|
-
import { checkpointDependencyPromotion, dependencyReadyState, processPendingDependencies, } from './dependencyProcessor';
|
|
14
|
-
import { handleTaskError, handleTaskSuccess, getTaskErrorStats } from './taskErrorTracking';
|
|
15
|
-
import { runMonitoringChecks } from './monitoringChecks';
|
|
16
|
-
import { isCorruptDependsOn, persistedJobState, } from '../infrastructure/persistence/sqliteSerializer';
|
|
17
|
-
import { reconcileDependencyCompletionPins } from './dependencyCompletions';
|
|
18
|
-
export { getTaskErrorStats };
|
|
19
|
-
/**
|
|
20
|
-
* Start all background tasks
|
|
21
|
-
* Returns handles that can be used to stop tasks later
|
|
22
|
-
*/
|
|
23
|
-
export function startBackgroundTasks(ctx, cronScheduler) {
|
|
24
|
-
const cleanupInterval = setInterval(() => {
|
|
25
|
-
cleanup(ctx)
|
|
26
|
-
.then(() => {
|
|
27
|
-
handleTaskSuccess('cleanup');
|
|
28
|
-
// Run monitoring checks after cleanup (same interval)
|
|
29
|
-
runMonitoringChecks({
|
|
30
|
-
queueNamesCache: ctx.queueNamesCache,
|
|
31
|
-
shards: ctx.shards,
|
|
32
|
-
processingShards: ctx.processingShards,
|
|
33
|
-
workerManager: ctx.workerManager,
|
|
34
|
-
storage: ctx.storage,
|
|
35
|
-
dashboardEmit: ctx.dashboardEmit,
|
|
36
|
-
state: ctx.monitoringState,
|
|
37
|
-
});
|
|
38
|
-
})
|
|
39
|
-
.catch((err) => {
|
|
40
|
-
handleTaskError('cleanup', err);
|
|
41
|
-
});
|
|
42
|
-
}, ctx.config.cleanupIntervalMs);
|
|
43
|
-
const timeoutInterval = setInterval(() => {
|
|
44
|
-
checkJobTimeouts(ctx);
|
|
45
|
-
}, ctx.config.jobTimeoutCheckMs);
|
|
46
|
-
// Safety fallback: event-driven path in queueManager handles the fast path
|
|
47
|
-
const depCheckInterval = setInterval(() => {
|
|
48
|
-
if (ctx.pendingDepChecks.size === 0)
|
|
49
|
-
return;
|
|
50
|
-
processPendingDependencies(ctx)
|
|
51
|
-
.then(() => {
|
|
52
|
-
handleTaskSuccess('dependency');
|
|
53
|
-
})
|
|
54
|
-
.catch((err) => {
|
|
55
|
-
handleTaskError('dependency', err);
|
|
56
|
-
});
|
|
57
|
-
}, ctx.config.dependencyCheckMs);
|
|
58
|
-
const stallCheckInterval = setInterval(() => {
|
|
59
|
-
checkStalledJobs(ctx);
|
|
60
|
-
}, ctx.config.stallCheckMs);
|
|
61
|
-
const dlqMaintenanceInterval = setInterval(() => {
|
|
62
|
-
performDlqMaintenance(ctx);
|
|
63
|
-
}, ctx.config.dlqMaintenanceMs);
|
|
64
|
-
// Lock expiration check runs at same interval as stall check
|
|
65
|
-
const lockCheckInterval = setInterval(() => {
|
|
66
|
-
checkExpiredLocks(getLockContext(ctx))
|
|
67
|
-
.then(() => {
|
|
68
|
-
handleTaskSuccess('lockExpiration');
|
|
69
|
-
})
|
|
70
|
-
.catch((err) => {
|
|
71
|
-
handleTaskError('lockExpiration', err);
|
|
72
|
-
});
|
|
73
|
-
}, ctx.config.stallCheckMs);
|
|
74
|
-
cronScheduler.start();
|
|
75
|
-
return {
|
|
76
|
-
cleanupInterval,
|
|
77
|
-
timeoutInterval,
|
|
78
|
-
depCheckInterval,
|
|
79
|
-
stallCheckInterval,
|
|
80
|
-
dlqMaintenanceInterval,
|
|
81
|
-
lockCheckInterval,
|
|
82
|
-
cronScheduler,
|
|
83
|
-
};
|
|
84
|
-
}
|
|
85
|
-
/**
|
|
86
|
-
* Stop all background tasks
|
|
87
|
-
*/
|
|
88
|
-
export function stopBackgroundTasks(handles) {
|
|
89
|
-
clearInterval(handles.cleanupInterval);
|
|
90
|
-
clearInterval(handles.timeoutInterval);
|
|
91
|
-
clearInterval(handles.depCheckInterval);
|
|
92
|
-
clearInterval(handles.stallCheckInterval);
|
|
93
|
-
clearInterval(handles.dlqMaintenanceInterval);
|
|
94
|
-
clearInterval(handles.lockCheckInterval);
|
|
95
|
-
handles.cronScheduler.stop();
|
|
96
|
-
}
|
|
97
|
-
/** Extract lock context from background context */
|
|
98
|
-
function getLockContext(ctx) {
|
|
99
|
-
return {
|
|
100
|
-
jobIndex: ctx.jobIndex,
|
|
101
|
-
jobLocks: ctx.jobLocks,
|
|
102
|
-
clientJobs: ctx.clientJobs,
|
|
103
|
-
processingShards: ctx.processingShards,
|
|
104
|
-
processingLocks: ctx.processingLocks,
|
|
105
|
-
shards: ctx.shards,
|
|
106
|
-
shardLocks: ctx.shardLocks,
|
|
107
|
-
eventsManager: ctx.eventsManager,
|
|
108
|
-
dashboardEmit: ctx.dashboardEmit,
|
|
109
|
-
// #110: without storage, handleMaxStallsExceeded's saveDlqEntry/deleteJob
|
|
110
|
-
// (the #97 fix) silently no-op via optional chaining on the ONLY
|
|
111
|
-
// production path to checkExpiredLocks — the DLQ move never persists and
|
|
112
|
-
// SQLite keeps an orphan `active` row. LockContext.storage is optional,
|
|
113
|
-
// which is why this omission compiled unnoticed since 2.8.17.
|
|
114
|
-
storage: ctx.storage,
|
|
115
|
-
};
|
|
116
|
-
}
|
|
117
|
-
// ============ Job Timeouts ============
|
|
118
|
-
export function checkJobTimeouts(ctx) {
|
|
119
|
-
const now = Date.now();
|
|
120
|
-
for (const procShard of ctx.processingShards) {
|
|
121
|
-
for (const [jobId, job] of procShard) {
|
|
122
|
-
if (job.timeout && job.startedAt && now - job.startedAt > job.timeout) {
|
|
123
|
-
ctx.dashboardEmit?.('job:timeout', {
|
|
124
|
-
jobId: String(jobId),
|
|
125
|
-
queue: job.queue,
|
|
126
|
-
timeout: job.timeout,
|
|
127
|
-
});
|
|
128
|
-
// Mark as timed-out BEFORE requeuing for retry, so a late ACK from the
|
|
129
|
-
// (still-hung) worker that exceeded the deadline is discarded instead of
|
|
130
|
-
// phantom-completing the job and skipping the retry. See ack-recovery in
|
|
131
|
-
// queueManager.ack (timedOutJobs guard).
|
|
132
|
-
ctx.timedOutJobs?.add(jobId);
|
|
133
|
-
ctx.fail(jobId, 'Job timeout exceeded').catch((err) => {
|
|
134
|
-
queueLog.error('Failed to mark timed out job as failed', {
|
|
135
|
-
jobId: String(jobId),
|
|
136
|
-
error: String(err),
|
|
137
|
-
});
|
|
138
|
-
});
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
// ============ DLQ Maintenance ============
|
|
144
|
-
function performDlqMaintenance(ctx) {
|
|
145
|
-
const dlqCtx = {
|
|
146
|
-
shards: ctx.shards,
|
|
147
|
-
jobIndex: ctx.jobIndex,
|
|
148
|
-
jobResults: ctx.jobResults,
|
|
149
|
-
jobLogs: ctx.jobLogs,
|
|
150
|
-
storage: ctx.storage,
|
|
151
|
-
};
|
|
152
|
-
for (const queueName of ctx.queueNamesCache) {
|
|
153
|
-
try {
|
|
154
|
-
const retried = dlqOps.processAutoRetry(queueName, dlqCtx);
|
|
155
|
-
if (retried > 0) {
|
|
156
|
-
ctx.dashboardEmit?.('dlq:auto-retried', { queue: queueName, count: retried });
|
|
157
|
-
}
|
|
158
|
-
const expired = dlqOps.purgeExpiredDlq(queueName, dlqCtx);
|
|
159
|
-
if (expired > 0)
|
|
160
|
-
ctx.dashboardEmit?.('dlq:expired', { queue: queueName, count: expired });
|
|
161
|
-
}
|
|
162
|
-
catch (err) {
|
|
163
|
-
queueLog.error('DLQ maintenance failed', { queue: queueName, error: String(err) });
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
// ============ Recovery ============
|
|
168
|
-
/** Batch size for paginated recovery */
|
|
169
|
-
const RECOVERY_BATCH_SIZE = 10000;
|
|
170
|
-
/**
|
|
171
|
-
* Route a job whose `depends_on` blob was corrupt on disk straight to the DLQ.
|
|
172
|
-
*
|
|
173
|
-
* Its real dependency metadata is unrecoverable, so it must never be enqueued
|
|
174
|
-
* as "ready" (out-of-order execution) nor parked in waitingDeps behind a
|
|
175
|
-
* dependency that can never complete (an unbounded leak).
|
|
176
|
-
*
|
|
177
|
-
* We persist the DLQ entry to disk and drop the jobs row here, but do NOT add
|
|
178
|
-
* it to the in-memory DLQ — the later `loadDlq()` pass (which runs after both
|
|
179
|
-
* recovery phases) restores every persisted entry into memory exactly once.
|
|
180
|
-
* Adding it here too would double-count it. The job row is deleted so that pass
|
|
181
|
-
* sees only the DLQ table.
|
|
182
|
-
*/
|
|
183
|
-
function quarantineCorruptDependsOn(ctx, job) {
|
|
184
|
-
if (!ctx.storage)
|
|
185
|
-
return;
|
|
186
|
-
const entry = createDlqEntry(job, "unknown" /* FailureReason.Unknown */, 'corrupt-dependency-metadata');
|
|
187
|
-
ctx.storage.saveDlqEntry(entry);
|
|
188
|
-
ctx.storage.deleteJob(job.id);
|
|
189
|
-
ctx.registerQueueName(job.queue);
|
|
190
|
-
queueLog.error('Recovered job with corrupt depends_on metadata -> routed to DLQ', {
|
|
191
|
-
jobId: String(job.id),
|
|
192
|
-
queue: job.queue,
|
|
193
|
-
});
|
|
194
|
-
}
|
|
195
|
-
// eslint-disable-next-line complexity
|
|
196
|
-
export function recover(ctx) {
|
|
197
|
-
if (!ctx.storage)
|
|
198
|
-
return;
|
|
199
|
-
// Keep the full pre-reconciliation window outside the bounded RAM tracker.
|
|
200
|
-
// A restart may lower maxCompletedJobs; pruning before Phase 2 reconstructs
|
|
201
|
-
// reverse edges could discard an old proof still owned by a waiting parent.
|
|
202
|
-
const dependencyCompletions = ctx.storage.loadDependencyCompletions();
|
|
203
|
-
// Load completed job IDs from SQLite for dependency checking
|
|
204
|
-
const completedInDb = ctx.storage.loadCompletedJobIds();
|
|
205
|
-
for (const record of dependencyCompletions)
|
|
206
|
-
completedInDb.add(record.jobId);
|
|
207
|
-
// Load DLQ job IDs so Phase 1 can skip stale active rows for DLQ'd jobs
|
|
208
|
-
// (legacy DBs predate the DLQ-row cleanup fix in failJob).
|
|
209
|
-
const dlqJobIds = ctx.storage.loadDlqJobIds();
|
|
210
|
-
const queueStates = ctx.storage.loadQueueState();
|
|
211
|
-
// Recovery bounds are needed before Phase 1 classifies interrupted active
|
|
212
|
-
// jobs. Restore the stall policy first; paused/limiter state can wait until
|
|
213
|
-
// the queues themselves have been rebuilt below.
|
|
214
|
-
for (const qs of queueStates) {
|
|
215
|
-
if (qs.stallConfig) {
|
|
216
|
-
ctx.shards[shardIndex(qs.name)].setStallConfig(qs.name, qs.stallConfig);
|
|
217
|
-
}
|
|
218
|
-
if (qs.dlqConfig) {
|
|
219
|
-
ctx.shards[shardIndex(qs.name)].setDlqConfig(qs.name, qs.dlqConfig);
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
const now = Date.now();
|
|
223
|
-
// === PHASE 1: Recover active jobs (were processing when server stopped) ===
|
|
224
|
-
// These jobs are considered "stalled" and need to be retried or moved to DLQ
|
|
225
|
-
while (true) {
|
|
226
|
-
// Every successfully handled row leaves state='active' (retry -> waiting, or
|
|
227
|
-
// delete -> DLQ/discard). Always read the first page: advancing OFFSET over
|
|
228
|
-
// this shrinking result set would skip up to half of the active rows.
|
|
229
|
-
const activeJobs = ctx.storage.loadActiveJobs(RECOVERY_BATCH_SIZE, 0);
|
|
230
|
-
if (activeJobs.length === 0)
|
|
231
|
-
break;
|
|
232
|
-
for (const job of activeJobs) {
|
|
233
|
-
const idx = shardIndex(job.queue);
|
|
234
|
-
const shard = ctx.shards[idx];
|
|
235
|
-
const stallConfig = shard.getStallConfig(job.queue);
|
|
236
|
-
// Skip recovery for cron jobs with preventOverlap (uniqueKey='cron:*').
|
|
237
|
-
// These jobs will be re-created by the cron scheduler at the next tick.
|
|
238
|
-
// Re-queuing them would cause the "starts right away" bug (#73).
|
|
239
|
-
if (job.uniqueKey?.startsWith('cron:')) {
|
|
240
|
-
ctx.storage.deleteJob(job.id);
|
|
241
|
-
ctx.registerQueueName(job.queue);
|
|
242
|
-
continue;
|
|
243
|
-
}
|
|
244
|
-
// Skip jobs already present in DLQ (stale 'active' row from before the
|
|
245
|
-
// failJob fix). Drop the orphan row so Phase 2 and subsequent queries
|
|
246
|
-
// don't double-count it.
|
|
247
|
-
if (dlqJobIds.has(job.id)) {
|
|
248
|
-
ctx.storage.deleteJob(job.id);
|
|
249
|
-
ctx.registerQueueName(job.queue);
|
|
250
|
-
continue;
|
|
251
|
-
}
|
|
252
|
-
// A corrupt depends_on blob makes the job's real dependencies
|
|
253
|
-
// unrecoverable: route it to the DLQ instead of retrying it (which could
|
|
254
|
-
// execute it out-of-order once stalls are exhausted).
|
|
255
|
-
if (isCorruptDependsOn(job)) {
|
|
256
|
-
quarantineCorruptDependsOn(ctx, job);
|
|
257
|
-
continue;
|
|
258
|
-
}
|
|
259
|
-
// Increment stall count (job was interrupted)
|
|
260
|
-
job.stallCount = (job.stallCount || 0) + 1;
|
|
261
|
-
job.attempts++;
|
|
262
|
-
job.startedAt = null;
|
|
263
|
-
job.lastHeartbeat = now;
|
|
264
|
-
// A crash consumes one processing attempt and one stall allowance. Both
|
|
265
|
-
// bounds are terminal: requeueing after either reaches its configured
|
|
266
|
-
// maximum would make attempts/stalls unbounded across restart loops.
|
|
267
|
-
const maxStalls = stallConfig.maxStalls ?? 3;
|
|
268
|
-
const attemptsExhausted = job.attempts >= job.maxAttempts;
|
|
269
|
-
const stallsExhausted = maxStalls > 0 && job.stallCount >= maxStalls;
|
|
270
|
-
if (attemptsExhausted || stallsExhausted) {
|
|
271
|
-
// Move to DLQ
|
|
272
|
-
const reason = attemptsExhausted
|
|
273
|
-
? "max_attempts_exceeded" /* FailureReason.MaxAttemptsExceeded */
|
|
274
|
-
: "stalled" /* FailureReason.Stalled */;
|
|
275
|
-
const error = attemptsExhausted
|
|
276
|
-
? `Job reached max attempts (${job.maxAttempts}) during startup recovery`
|
|
277
|
-
: `Job stalled ${job.stallCount} times (recovered at startup)`;
|
|
278
|
-
// Persist only here; the later loadDlq() phase is the single in-memory
|
|
279
|
-
// restore path. Adding to the shard now and restoring the same row below
|
|
280
|
-
// would duplicate the DLQ entry after every terminal crash recovery.
|
|
281
|
-
const entry = createDlqEntry(job, reason, error, shard.getDlqConfig(job.queue));
|
|
282
|
-
ctx.storage.saveDlqEntry(entry);
|
|
283
|
-
ctx.storage.deleteJob(job.id);
|
|
284
|
-
}
|
|
285
|
-
else {
|
|
286
|
-
// Persist the retry here, but let Phase 2 be the single authoritative
|
|
287
|
-
// enqueue path. Enqueuing in both phases replaces the priority-queue entry
|
|
288
|
-
// by ID but increments queued/delayed counters twice.
|
|
289
|
-
job.runAt = now + calculateBackoff(job);
|
|
290
|
-
ctx.storage.updateForRetry(job);
|
|
291
|
-
}
|
|
292
|
-
ctx.registerQueueName(job.queue);
|
|
293
|
-
}
|
|
294
|
-
if (activeJobs.length < RECOVERY_BATCH_SIZE)
|
|
295
|
-
break;
|
|
296
|
-
}
|
|
297
|
-
// === PHASE 2: Load pending jobs ===
|
|
298
|
-
let offset = 0;
|
|
299
|
-
const corruptPendingJobs = [];
|
|
300
|
-
// Load pending jobs in batches to avoid memory spikes
|
|
301
|
-
while (true) {
|
|
302
|
-
const jobs = ctx.storage.loadPendingJobs(RECOVERY_BATCH_SIZE, offset);
|
|
303
|
-
if (jobs.length === 0)
|
|
304
|
-
break;
|
|
305
|
-
for (const job of jobs) {
|
|
306
|
-
const idx = shardIndex(job.queue);
|
|
307
|
-
const shard = ctx.shards[idx];
|
|
308
|
-
// A corrupt depends_on blob means the real dependencies are unrecoverable.
|
|
309
|
-
// Route the job to the DLQ rather than enqueuing it as ready (out-of-order
|
|
310
|
-
// execution) or parking it in waitingDeps forever (unbounded leak).
|
|
311
|
-
if (isCorruptDependsOn(job)) {
|
|
312
|
-
// Keep the SQLite pending result set stable until OFFSET pagination has
|
|
313
|
-
// finished. Deleting this row now shifts a healthy row across the next
|
|
314
|
-
// page boundary and leaves it absent from the in-memory queue.
|
|
315
|
-
corruptPendingJobs.push(job);
|
|
316
|
-
continue;
|
|
317
|
-
}
|
|
318
|
-
// Check if job has unmet dependencies
|
|
319
|
-
// A ready persisted state is an authoritative checkpoint: dependency
|
|
320
|
-
// proofs are deliberately bounded and may have expired after promotion.
|
|
321
|
-
const hasDependencies = job.dependsOn && job.dependsOn.length > 0;
|
|
322
|
-
const recoveredState = persistedJobState(job);
|
|
323
|
-
const wasAlreadyPromoted = recoveredState === 'waiting' ||
|
|
324
|
-
recoveredState === 'prioritized' ||
|
|
325
|
-
recoveredState === 'delayed';
|
|
326
|
-
const needsWaitingDeps = hasDependencies &&
|
|
327
|
-
!wasAlreadyPromoted &&
|
|
328
|
-
!job.dependsOn.every((depId) => ctx.completedJobs.has(depId) || completedInDb.has(depId));
|
|
329
|
-
const manuallyWaitingChildren = recoveredState === 'waiting-children' && !hasDependencies;
|
|
330
|
-
if (manuallyWaitingChildren) {
|
|
331
|
-
shard.waitingChildren.set(job.id, job);
|
|
332
|
-
}
|
|
333
|
-
else if (needsWaitingDeps) {
|
|
334
|
-
// Job is waiting for dependencies - don't add to main queue
|
|
335
|
-
shard.waitingDeps.set(job.id, job);
|
|
336
|
-
shard.registerDependencies(job.id, job.dependsOn);
|
|
337
|
-
// Note: don't call incrementQueued for waitingDeps jobs (matches push.ts behavior)
|
|
338
|
-
}
|
|
339
|
-
else {
|
|
340
|
-
// Job is ready to process
|
|
341
|
-
shard.getQueue(job.queue).push(job);
|
|
342
|
-
// Update running counters for O(1) stats and temporal index
|
|
343
|
-
const state = dependencyReadyState(job, now);
|
|
344
|
-
const isDelayed = state === 'delayed';
|
|
345
|
-
shard.incrementQueued(job.id, isDelayed, job.createdAt, job.queue, job.runAt);
|
|
346
|
-
if (hasDependencies)
|
|
347
|
-
checkpointDependencyPromotion(job, state, now, ctx.storage);
|
|
348
|
-
}
|
|
349
|
-
ctx.jobIndex.set(job.id, { type: 'queue', shardIdx: idx, queueName: job.queue });
|
|
350
|
-
ctx.dependencyResults.registerConsumer(job.id, job.dependsOn);
|
|
351
|
-
for (const dependencyId of job.dependsOn) {
|
|
352
|
-
if (ctx.jobResults.has(dependencyId)) {
|
|
353
|
-
ctx.dependencyResults.retain(dependencyId, ctx.jobResults.get(dependencyId));
|
|
354
|
-
}
|
|
355
|
-
}
|
|
356
|
-
// Restore customId mapping for deduplication (fixes idempotency on restart)
|
|
357
|
-
if (job.customId) {
|
|
358
|
-
ctx.customIdMap.set(job.customId, job.id);
|
|
359
|
-
}
|
|
360
|
-
// Restore uniqueKey mapping for TTL-based deduplication
|
|
361
|
-
if (job.uniqueKey) {
|
|
362
|
-
shard.registerUniqueKeyWithTtl(job.queue, job.uniqueKey, job.id, job.deduplicationTtl ?? undefined);
|
|
363
|
-
}
|
|
364
|
-
ctx.registerQueueName(job.queue);
|
|
365
|
-
}
|
|
366
|
-
offset += jobs.length;
|
|
367
|
-
// If we got less than batch size, we're done
|
|
368
|
-
if (jobs.length < RECOVERY_BATCH_SIZE)
|
|
369
|
-
break;
|
|
370
|
-
}
|
|
371
|
-
// Quarantine only after the paginated scan so deletions cannot move page
|
|
372
|
-
// boundaries. loadDlq() below restores these entries into memory exactly once.
|
|
373
|
-
for (const job of corruptPendingJobs) {
|
|
374
|
-
quarantineCorruptDependsOn(ctx, job);
|
|
375
|
-
}
|
|
376
|
-
// Load DLQ entries
|
|
377
|
-
const dlqEntries = ctx.storage.loadDlq();
|
|
378
|
-
for (const [queue, entries] of dlqEntries) {
|
|
379
|
-
const idx = shardIndex(queue);
|
|
380
|
-
const shard = ctx.shards[idx];
|
|
381
|
-
for (const entry of entries) {
|
|
382
|
-
shard.restoreDlqEntry(queue, entry);
|
|
383
|
-
// Populate jobIndex so getJob/getJobState resolve DLQ'd jobs post-restart.
|
|
384
|
-
ctx.jobIndex.set(entry.job.id, { type: 'dlq', queueName: queue });
|
|
385
|
-
}
|
|
386
|
-
ctx.registerQueueName(queue);
|
|
387
|
-
}
|
|
388
|
-
// === Restore queue control-state (#100) ===
|
|
389
|
-
// paused / rate-limit / concurrency live only in LimiterManager's in-memory
|
|
390
|
-
// Map; without this load every queue silently un-pauses and loses its limits
|
|
391
|
-
// on restart. Applied directly to the owning shard (in-memory only — these
|
|
392
|
-
// setters do not re-persist, so there is no write-back loop).
|
|
393
|
-
for (const qs of queueStates) {
|
|
394
|
-
const shard = ctx.shards[shardIndex(qs.name)];
|
|
395
|
-
if (qs.paused)
|
|
396
|
-
shard.pause(qs.name);
|
|
397
|
-
if (qs.rateLimit !== null) {
|
|
398
|
-
// TTL'd limits are temporary by definition: an already-expired one must
|
|
399
|
-
// not resurrect as permanent. A still-live one is restored with its
|
|
400
|
-
// remaining TTL so it keeps expiring broker-side.
|
|
401
|
-
const remainingTtl = qs.rateLimitExpiresAt === null ? undefined : qs.rateLimitExpiresAt - Date.now();
|
|
402
|
-
if (remainingTtl === undefined || remainingTtl > 0) {
|
|
403
|
-
shard.setRateLimit(qs.name, qs.rateLimit, qs.rateLimitDuration ?? undefined, remainingTtl);
|
|
404
|
-
}
|
|
405
|
-
}
|
|
406
|
-
if (qs.concurrencyLimit !== null)
|
|
407
|
-
shard.setConcurrency(qs.name, qs.concurrencyLimit);
|
|
408
|
-
ctx.registerQueueName(qs.name);
|
|
409
|
-
}
|
|
410
|
-
// === PHASE 3: Recover completed jobs ===
|
|
411
|
-
// Required for clean('completed'), stats.completed, and in-memory lookups
|
|
412
|
-
// on jobs that completed before a server restart (issue #84).
|
|
413
|
-
// Capped at maxCompletedJobs (matches BoundedSet cap) so we don't exceed
|
|
414
|
-
// the in-memory budget when SQLite contains more rows than the cap.
|
|
415
|
-
// Note: we deliberately do NOT populate customIdMap here — Phase 2 owns
|
|
416
|
-
// dedup for pending jobs, and push.ts handles customId collision against
|
|
417
|
-
// completed jobs via the storage fallback. Touching customIdMap here would
|
|
418
|
-
// LRU-evict pending-job mappings when many completed jobs have customIds.
|
|
419
|
-
const completedCap = ctx.config.maxCompletedJobs;
|
|
420
|
-
let completedLoaded = 0;
|
|
421
|
-
let completedOffset = 0;
|
|
422
|
-
while (completedLoaded < completedCap) {
|
|
423
|
-
const remaining = completedCap - completedLoaded;
|
|
424
|
-
const batchSize = Math.min(RECOVERY_BATCH_SIZE, remaining);
|
|
425
|
-
const completedBatch = ctx.storage.loadCompletedJobs(batchSize, completedOffset);
|
|
426
|
-
if (completedBatch.length === 0)
|
|
427
|
-
break;
|
|
428
|
-
for (const job of completedBatch) {
|
|
429
|
-
ctx.jobIndex.set(job.id, { type: 'completed', queueName: job.queue });
|
|
430
|
-
ctx.completedJobs.add(job.id);
|
|
431
|
-
ctx.completedJobsData.set(job.id, job);
|
|
432
|
-
ctx.registerQueueName(job.queue);
|
|
433
|
-
}
|
|
434
|
-
completedLoaded += completedBatch.length;
|
|
435
|
-
completedOffset += completedBatch.length;
|
|
436
|
-
if (completedBatch.length < batchSize)
|
|
437
|
-
break;
|
|
438
|
-
}
|
|
439
|
-
reconcileDependencyCompletionPins(ctx);
|
|
440
|
-
}
|
|
441
|
-
// Re-export for backward compatibility
|
|
442
|
-
export { processPendingDependencies };
|
|
1
|
+
/** Stable background-task import surface. */
|
|
2
|
+
export { startBackgroundTasks, stopBackgroundTasks } from './background/lifecycle';
|
|
3
|
+
export { recover } from './background/recovery';
|
|
4
|
+
export { checkJobTimeouts } from './background/timeouts';
|
|
5
|
+
export { processPendingDependencies } from './dependencyProcessor';
|
|
6
|
+
export { getTaskErrorStats } from './taskErrorTracking';
|
|
@@ -50,6 +50,7 @@ async function cleanOrphanedProcessingEntries(ctx, now, stallTimeout) {
|
|
|
50
50
|
const job = ctx.processingShards[i].get(jobId);
|
|
51
51
|
if (job) {
|
|
52
52
|
ctx.processingShards[i].delete(jobId);
|
|
53
|
+
ctx.timeoutScheduler.cancel(jobId);
|
|
53
54
|
ctx.jobIndex.delete(jobId);
|
|
54
55
|
removed++;
|
|
55
56
|
}
|
|
@@ -165,6 +165,7 @@ export function forceReleaseClientJobs(clientId, ctx) {
|
|
|
165
165
|
// gate passes on the next eligible tick.
|
|
166
166
|
job.lastHeartbeat = 0;
|
|
167
167
|
job.startedAt = 0;
|
|
168
|
+
ctx.timeoutScheduler.cancel(jobId);
|
|
168
169
|
touched++;
|
|
169
170
|
}
|
|
170
171
|
ctx.clientJobs.delete(clientId);
|
|
@@ -176,6 +177,7 @@ function releaseJobToQueue(opts) {
|
|
|
176
177
|
const shard = ctx.shards[queueShardIdx];
|
|
177
178
|
// Remove from processing
|
|
178
179
|
ctx.processingShards[procIdx].delete(jobId);
|
|
180
|
+
ctx.timeoutScheduler.cancel(jobId);
|
|
179
181
|
// Release lock if exists
|
|
180
182
|
ctx.jobLocks.delete(jobId);
|
|
181
183
|
// Release all job resources (concurrency, uniqueKey, groupId)
|
|
@@ -1,19 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* ContextFactory - Builds context objects for delegated operations
|
|
3
3
|
*/
|
|
4
|
-
import type { Job, JobId, JobLock } from '../domain/types/job';
|
|
5
|
-
import type { JobLocation } from '../domain/types/queue';
|
|
6
|
-
import type { JobLogEntry } from '../domain/types/worker';
|
|
7
|
-
import type { Shard } from '../domain/queue/shard';
|
|
8
|
-
import type { SqliteStorage } from '../infrastructure/persistence/sqlite';
|
|
9
|
-
import type { RWLock } from '../shared/lock';
|
|
10
|
-
import type { LRUMap, BoundedSet, BoundedMap, MapLike } from '../shared/lru';
|
|
11
|
-
import type { WebhookManager } from './webhookManager';
|
|
12
|
-
import type { WorkerManager } from './workerManager';
|
|
13
|
-
import type { EventsManager } from './eventsManager';
|
|
14
|
-
import type { MonitoringState } from './monitoringChecks';
|
|
15
|
-
import type { DependencyResultTracker } from './dependencyResultTracker';
|
|
16
|
-
import type { DependencyCompletionTracker } from './dependencyCompletions';
|
|
17
4
|
import type { LockContext, BackgroundContext, StatsContext } from './types';
|
|
18
5
|
import type { PushContext } from './operations/push';
|
|
19
6
|
import type { PullContext } from './operations/pull';
|
|
@@ -21,72 +8,8 @@ import type { AckContext } from './operations/ack';
|
|
|
21
8
|
import type { JobManagementContext } from './operations/jobManagement';
|
|
22
9
|
import type { QueryContext } from './operations/queryOperations';
|
|
23
10
|
import type { DlqContext, RetryCompletedContext } from './dlqManager';
|
|
24
|
-
import type {
|
|
25
|
-
|
|
26
|
-
export interface ContextDependencies {
|
|
27
|
-
config: typeof DEFAULT_CONFIG & {
|
|
28
|
-
dataPath?: string;
|
|
29
|
-
};
|
|
30
|
-
storage: SqliteStorage | null;
|
|
31
|
-
shards: Shard[];
|
|
32
|
-
shardLocks: RWLock[];
|
|
33
|
-
customIdLock: RWLock;
|
|
34
|
-
processingShards: Map<JobId, Job>[];
|
|
35
|
-
processingLocks: RWLock[];
|
|
36
|
-
jobIndex: Map<JobId, JobLocation>;
|
|
37
|
-
completedJobs: BoundedSet<JobId>;
|
|
38
|
-
completedJobsData: BoundedMap<JobId, Job>;
|
|
39
|
-
depCompletions?: DependencyCompletionTracker;
|
|
40
|
-
timedOutJobs?: BoundedSet<JobId>;
|
|
41
|
-
jobResults: LRUMap<JobId, unknown>;
|
|
42
|
-
dependencyResults: DependencyResultTracker;
|
|
43
|
-
customIdMap: LRUMap<string, JobId>;
|
|
44
|
-
jobLogs: LRUMap<JobId, JobLogEntry[]>;
|
|
45
|
-
jobLocks: Map<JobId, JobLock>;
|
|
46
|
-
clientJobs: Map<string, Set<JobId>>;
|
|
47
|
-
stalledCandidates: Set<JobId>;
|
|
48
|
-
pendingDepChecks: Set<JobId>;
|
|
49
|
-
queueNamesCache: Set<string>;
|
|
50
|
-
repeatChain: Map<JobId, JobId>;
|
|
51
|
-
eventsManager: EventsManager;
|
|
52
|
-
webhookManager: WebhookManager;
|
|
53
|
-
workerManager: WorkerManager;
|
|
54
|
-
monitoringState: MonitoringState;
|
|
55
|
-
metrics: {
|
|
56
|
-
totalPushed: {
|
|
57
|
-
value: bigint;
|
|
58
|
-
};
|
|
59
|
-
totalPulled: {
|
|
60
|
-
value: bigint;
|
|
61
|
-
};
|
|
62
|
-
totalCompleted: {
|
|
63
|
-
value: bigint;
|
|
64
|
-
};
|
|
65
|
-
totalFailed: {
|
|
66
|
-
value: bigint;
|
|
67
|
-
};
|
|
68
|
-
};
|
|
69
|
-
startTime: number;
|
|
70
|
-
maxLogsPerJob: number;
|
|
71
|
-
perQueueMetrics: MapLike<string, {
|
|
72
|
-
totalCompleted: bigint;
|
|
73
|
-
totalFailed: bigint;
|
|
74
|
-
}>;
|
|
75
|
-
}
|
|
76
|
-
/** Callbacks needed for some contexts */
|
|
77
|
-
export interface ContextCallbacks {
|
|
78
|
-
fail: (jobId: JobId, error?: string, token?: string) => Promise<void>;
|
|
79
|
-
registerQueueName: (queue: string) => void;
|
|
80
|
-
unregisterQueueName: (queue: string) => void;
|
|
81
|
-
onJobCompleted: (completedId: JobId) => void;
|
|
82
|
-
onJobFailed?: (failedId: JobId) => void;
|
|
83
|
-
onJobsCompleted: (completedIds: JobId[]) => void;
|
|
84
|
-
hasPendingDeps: () => boolean;
|
|
85
|
-
onRepeat: (job: Job) => void;
|
|
86
|
-
emitDashboardEvent?: (event: string, data: Record<string, unknown>) => void;
|
|
87
|
-
onChildTerminalFailure?: (childJob: Job, error: string | undefined) => Promise<void>;
|
|
88
|
-
onChildDependencyOption?: (childJob: Job, error: string | undefined) => Promise<void>;
|
|
89
|
-
}
|
|
11
|
+
import type { ContextCallbacks, ContextDependencies } from './types/contextFactory';
|
|
12
|
+
export type { ContextCallbacks, ContextDependencies } from './types/contextFactory';
|
|
90
13
|
/**
|
|
91
14
|
* Factory for building context objects
|
|
92
15
|
*/
|
|
@@ -105,19 +28,19 @@ export declare class ContextFactory {
|
|
|
105
28
|
getDlqContext(): DlqContext;
|
|
106
29
|
getRetryCompletedContext(): RetryCompletedContext;
|
|
107
30
|
getLogsContext(): {
|
|
108
|
-
jobIndex: Map<JobId, JobLocation>;
|
|
109
|
-
jobLogs: LRUMap<JobId, JobLogEntry[]>;
|
|
31
|
+
jobIndex: Map<import("../domain/types").JobId, import("../domain/types").JobLocation>;
|
|
32
|
+
jobLogs: import("../shared/lruMap").LRUMap<import("../domain/types").JobId, import("../domain/types/worker").JobLogEntry[]>;
|
|
110
33
|
maxLogsPerJob: number;
|
|
111
34
|
};
|
|
112
35
|
getQueueControlContext(): {
|
|
113
|
-
shards: Shard[];
|
|
114
|
-
jobIndex: Map<JobId, JobLocation>;
|
|
115
|
-
processingShards: Map<JobId, Job>[];
|
|
116
|
-
completedJobs: BoundedSet<JobId>;
|
|
117
|
-
completedJobsData: BoundedMap<JobId, Job>;
|
|
118
|
-
jobResults: LRUMap<JobId, unknown>;
|
|
119
|
-
dependencyResults: DependencyResultTracker;
|
|
120
|
-
jobLogs: LRUMap<JobId, JobLogEntry[]>;
|
|
121
|
-
storage: SqliteStorage | null;
|
|
36
|
+
shards: import("../domain/queue").Shard[];
|
|
37
|
+
jobIndex: Map<import("../domain/types").JobId, import("../domain/types").JobLocation>;
|
|
38
|
+
processingShards: Map<import("../domain/types").JobId, import("../domain/types").Job>[];
|
|
39
|
+
completedJobs: import("../shared/boundedSet").BoundedSet<import("../domain/types").JobId>;
|
|
40
|
+
completedJobsData: import("../shared/boundedMap").BoundedMap<import("../domain/types").JobId, import("../domain/types").Job>;
|
|
41
|
+
jobResults: import("../shared/lruMap").LRUMap<import("../domain/types").JobId, unknown>;
|
|
42
|
+
dependencyResults: import("./dependencyResultTracker").DependencyResultTracker;
|
|
43
|
+
jobLogs: import("../shared/lruMap").LRUMap<import("../domain/types").JobId, import("../domain/types/worker").JobLogEntry[]>;
|
|
44
|
+
storage: import("../infrastructure/persistence").SqliteStorage | null;
|
|
122
45
|
};
|
|
123
46
|
}
|
|
@@ -15,6 +15,7 @@ export class ContextFactory {
|
|
|
15
15
|
return {
|
|
16
16
|
jobIndex: this.deps.jobIndex,
|
|
17
17
|
jobLocks: this.deps.jobLocks,
|
|
18
|
+
retiredCronLeaseTokens: this.deps.retiredCronLeaseTokens,
|
|
18
19
|
clientJobs: this.deps.clientJobs,
|
|
19
20
|
processingShards: this.deps.processingShards,
|
|
20
21
|
processingLocks: this.deps.processingLocks,
|
|
@@ -22,6 +23,7 @@ export class ContextFactory {
|
|
|
22
23
|
shardLocks: this.deps.shardLocks,
|
|
23
24
|
eventsManager: this.deps.eventsManager,
|
|
24
25
|
storage: this.deps.storage,
|
|
26
|
+
timeoutScheduler: this.deps.timeoutScheduler,
|
|
25
27
|
};
|
|
26
28
|
}
|
|
27
29
|
getBackgroundContext() {
|
|
@@ -37,11 +39,14 @@ export class ContextFactory {
|
|
|
37
39
|
depCompletions: this.deps.depCompletions,
|
|
38
40
|
maxDependencyCompletions: this.deps.config.maxCompletedJobs,
|
|
39
41
|
timedOutJobs: this.deps.timedOutJobs,
|
|
42
|
+
retiredTimeoutLeaseTokens: this.deps.retiredTimeoutLeaseTokens,
|
|
43
|
+
timeoutScheduler: this.deps.timeoutScheduler,
|
|
40
44
|
jobResults: this.deps.jobResults,
|
|
41
45
|
dependencyResults: this.deps.dependencyResults,
|
|
42
46
|
customIdMap: this.deps.customIdMap,
|
|
43
47
|
jobLogs: this.deps.jobLogs,
|
|
44
48
|
jobLocks: this.deps.jobLocks,
|
|
49
|
+
retiredCronLeaseTokens: this.deps.retiredCronLeaseTokens,
|
|
45
50
|
clientJobs: this.deps.clientJobs,
|
|
46
51
|
stalledCandidates: this.deps.stalledCandidates,
|
|
47
52
|
pendingDepChecks: this.deps.pendingDepChecks,
|
|
@@ -89,6 +94,8 @@ export class ContextFactory {
|
|
|
89
94
|
depCompletions: this.deps.depCompletions,
|
|
90
95
|
maxDependencyCompletions: this.deps.config.maxCompletedJobs,
|
|
91
96
|
timedOutJobs: this.deps.timedOutJobs,
|
|
97
|
+
retiredTimeoutLeaseTokens: this.deps.retiredTimeoutLeaseTokens,
|
|
98
|
+
retiredCronLeaseTokens: this.deps.retiredCronLeaseTokens,
|
|
92
99
|
jobResults: this.deps.jobResults,
|
|
93
100
|
dependencyResults: this.deps.dependencyResults,
|
|
94
101
|
customIdMap: this.deps.customIdMap,
|
|
@@ -121,6 +128,7 @@ export class ContextFactory {
|
|
|
121
128
|
processingLocks: this.deps.processingLocks,
|
|
122
129
|
completedJobs: this.deps.completedJobs,
|
|
123
130
|
completedJobsData: this.deps.completedJobsData,
|
|
131
|
+
retiredCronLeaseTokens: this.deps.retiredCronLeaseTokens,
|
|
124
132
|
depCompletions: this.deps.depCompletions,
|
|
125
133
|
maxDependencyCompletions: this.deps.config.maxCompletedJobs,
|
|
126
134
|
jobResults: this.deps.jobResults,
|
|
@@ -11,6 +11,7 @@ export declare class DependencyResultTracker {
|
|
|
11
11
|
retain(dependencyId: JobId, result: unknown): void;
|
|
12
12
|
has(dependencyId: JobId): boolean;
|
|
13
13
|
get(dependencyId: JobId): unknown;
|
|
14
|
+
hasConsumers(dependencyId: JobId): boolean;
|
|
14
15
|
releaseConsumer(consumerId: JobId): void;
|
|
15
16
|
releaseDependency(consumerId: JobId, dependencyId: JobId): void;
|
|
16
17
|
clear(): void;
|
|
@@ -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)
|