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
|
@@ -1,121 +1,4 @@
|
|
|
1
|
-
/**
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
import type { Database } from 'bun:sqlite';
|
|
6
|
-
import type { Job } from '../../domain/types/job';
|
|
7
|
-
/** Outcome of a batch insert after isolating per-row failures. */
|
|
8
|
-
export interface BatchInsertResult {
|
|
9
|
-
/** Jobs that hit a transient (non-constraint) error — caller should retry. */
|
|
10
|
-
transient: Job[];
|
|
11
|
-
/** Jobs rejected by a permanent constraint (e.g. duplicate id) — drop, never retry. */
|
|
12
|
-
conflicts: Job[];
|
|
13
|
-
/** The originating error from the fast-path failure, for logging. */
|
|
14
|
-
error?: Error;
|
|
15
|
-
}
|
|
16
|
-
/** Batch insert manager with prepared statement caching */
|
|
17
|
-
export declare class BatchInsertManager {
|
|
18
|
-
private readonly db;
|
|
19
|
-
private readonly cache;
|
|
20
|
-
constructor(db: Database);
|
|
21
|
-
/**
|
|
22
|
-
* Insert a batch of jobs using a single multi-row INSERT (50-100x speedup).
|
|
23
|
-
* On the common path every row succeeds and an empty result is returned.
|
|
24
|
-
*
|
|
25
|
-
* If the atomic batch fails (e.g. a single duplicate `jobs.id`), the rows are
|
|
26
|
-
* re-inserted ONE AT A TIME so a single bad row can no longer drop the rest:
|
|
27
|
-
* valid jobs persist, constraint violations are isolated as `conflicts` (drop,
|
|
28
|
-
* never retry — they would poison every future flush), and any transient
|
|
29
|
-
* failures are returned so the caller can retry just those. Never throws.
|
|
30
|
-
*/
|
|
31
|
-
insertJobsBatch(jobs: Job[]): BatchInsertResult;
|
|
32
|
-
/** Fallback path: insert each job independently, isolating per-row failures. */
|
|
33
|
-
private insertRowByRow;
|
|
34
|
-
/** Get or create cached prepared statement for batch insert */
|
|
35
|
-
private getBatchInsertStmt;
|
|
36
|
-
/** Insert a chunk of jobs with single multi-row INSERT */
|
|
37
|
-
private insertJobsChunk;
|
|
38
|
-
}
|
|
39
|
-
/** Extended error callback with retry information */
|
|
40
|
-
export type WriteBufferErrorCallback = (err: Error, jobCount: number, retryInfo?: {
|
|
41
|
-
retryCount: number;
|
|
42
|
-
nextBackoffMs: number;
|
|
43
|
-
maxRetries: number;
|
|
44
|
-
}) => void;
|
|
45
|
-
/** Callback when jobs are moved to dead letter after max retries */
|
|
46
|
-
export type CriticalErrorCallback = (jobs: Job[], lastError: Error, totalAttempts: number) => void;
|
|
47
|
-
/** Write buffer for batching inserts with double-buffering for atomic swap */
|
|
48
|
-
export declare class WriteBuffer {
|
|
49
|
-
/** Active buffer for new jobs */
|
|
50
|
-
private activeBuffer;
|
|
51
|
-
/** Flush buffer being written to disk */
|
|
52
|
-
private flushBuffer;
|
|
53
|
-
/** Lock to prevent concurrent flushes */
|
|
54
|
-
private flushing;
|
|
55
|
-
/** Flag to prevent operations after stop */
|
|
56
|
-
private stopped;
|
|
57
|
-
private timer;
|
|
58
|
-
private readonly batchManager;
|
|
59
|
-
private readonly bufferSize;
|
|
60
|
-
private readonly onError;
|
|
61
|
-
private readonly onCriticalError?;
|
|
62
|
-
/** Retry state for exponential backoff */
|
|
63
|
-
private retryCount;
|
|
64
|
-
private currentBackoffMs;
|
|
65
|
-
private readonly initialBackoffMs;
|
|
66
|
-
private readonly maxBackoffMs;
|
|
67
|
-
private readonly maxRetries;
|
|
68
|
-
private lastError;
|
|
69
|
-
private backoffTimer;
|
|
70
|
-
constructor(batchManager: BatchInsertManager, bufferSize: number, flushIntervalMs: number, onError: WriteBufferErrorCallback, onCriticalError?: CriticalErrorCallback);
|
|
71
|
-
/** Add job to buffer */
|
|
72
|
-
add(job: Job): void;
|
|
73
|
-
/** Add multiple jobs to buffer */
|
|
74
|
-
addBatch(jobs: Job[]): void;
|
|
75
|
-
/**
|
|
76
|
-
* Flush buffer to disk using double-buffering. Returns number of jobs persisted.
|
|
77
|
-
*
|
|
78
|
-
* Per-row isolation (see BatchInsertManager.insertJobsBatch): valid jobs are
|
|
79
|
-
* persisted even if a sibling row violates a constraint. Constraint conflicts
|
|
80
|
-
* (e.g. duplicate id) are dropped+reported and NEVER re-buffered — re-buffering
|
|
81
|
-
* them would poison every future flush and silently drop unrelated valid jobs
|
|
82
|
-
* (the #92-class data-loss bug). Transient failures are re-buffered and retried
|
|
83
|
-
* with exponential backoff, exactly as before.
|
|
84
|
-
*/
|
|
85
|
-
flush(): number;
|
|
86
|
-
/** Schedule a retry with exponential backoff */
|
|
87
|
-
private scheduleBackoffRetry;
|
|
88
|
-
/** Get pending job count (includes both buffers) */
|
|
89
|
-
get pendingCount(): number;
|
|
90
|
-
/**
|
|
91
|
-
* Remove any pending buffered inserts for a given jobId.
|
|
92
|
-
* Prevents a buffered insert from flushing to disk after an immediate deleteJob,
|
|
93
|
-
* which would leave an orphan row with stale state.
|
|
94
|
-
*/
|
|
95
|
-
removePending(jobId: string): void;
|
|
96
|
-
/**
|
|
97
|
-
* Check whether a job is still sitting in the WriteBuffer (not yet persisted).
|
|
98
|
-
* Used by state-transition writes (markActive/Completed/Failed) to decide
|
|
99
|
-
* whether they need to flush the buffer first — otherwise their UPDATE
|
|
100
|
-
* would silently match 0 rows and the state change would be lost when the
|
|
101
|
-
* buffered INSERT eventually writes with the original state.
|
|
102
|
-
*/
|
|
103
|
-
hasPending(jobId: string): boolean;
|
|
104
|
-
/** Stop auto-flush timer and flush pending jobs */
|
|
105
|
-
stop(): void;
|
|
106
|
-
/**
|
|
107
|
-
* Graceful shutdown with timeout.
|
|
108
|
-
* Attempts to flush pending jobs within the specified timeout.
|
|
109
|
-
* @param timeoutMs Maximum time to wait for flush (default: 5000ms)
|
|
110
|
-
* @returns Promise resolving to number of jobs flushed, or -1 if timed out
|
|
111
|
-
*/
|
|
112
|
-
stopGracefully(timeoutMs?: number): Promise<number>;
|
|
113
|
-
/** Report any remaining buffered jobs as lost via onCriticalError */
|
|
114
|
-
private reportLostJobs;
|
|
115
|
-
/** Get current retry state (for monitoring) */
|
|
116
|
-
getRetryState(): {
|
|
117
|
-
retryCount: number;
|
|
118
|
-
currentBackoffMs: number;
|
|
119
|
-
lastError: Error | null;
|
|
120
|
-
};
|
|
121
|
-
}
|
|
1
|
+
/** Stable batch-persistence import surface. */
|
|
2
|
+
export { BatchInsertManager } from './batchInsert';
|
|
3
|
+
export { WriteBuffer } from './writeBuffer';
|
|
4
|
+
export type { BatchInsertResult, CriticalErrorCallback, WriteBufferErrorCallback, } from './types/batch';
|
|
@@ -1,422 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
*/
|
|
5
|
-
import { pack, persistedInitialState, persistedStallCount } from './sqliteSerializer';
|
|
6
|
-
const COLS_PER_ROW = 29;
|
|
7
|
-
// SQLite has a limit of ~999 variables, so batch in chunks
|
|
8
|
-
const MAX_ROWS_PER_INSERT = Math.floor(999 / COLS_PER_ROW);
|
|
9
|
-
/**
|
|
10
|
-
* A constraint violation (e.g. a duplicate `jobs.id` PRIMARY KEY) is PERMANENT
|
|
11
|
-
* for that row — retrying never succeeds. It must be isolated from the rest of
|
|
12
|
-
* the batch, otherwise one bad row poisons the whole atomic flush and drops
|
|
13
|
-
* unrelated valid jobs (data loss, #92-class). Everything else (disk I/O, busy,
|
|
14
|
-
* full) is treated as transient and retried.
|
|
15
|
-
*/
|
|
16
|
-
function isConstraintError(err) {
|
|
17
|
-
const code = err.code ?? '';
|
|
18
|
-
return code.startsWith('SQLITE_CONSTRAINT') || /constraint failed/i.test(err.message);
|
|
19
|
-
}
|
|
20
|
-
/** Batch insert manager with prepared statement caching */
|
|
21
|
-
export class BatchInsertManager {
|
|
22
|
-
db;
|
|
23
|
-
cache = new Map();
|
|
24
|
-
constructor(db) {
|
|
25
|
-
this.db = db;
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* Insert a batch of jobs using a single multi-row INSERT (50-100x speedup).
|
|
29
|
-
* On the common path every row succeeds and an empty result is returned.
|
|
30
|
-
*
|
|
31
|
-
* If the atomic batch fails (e.g. a single duplicate `jobs.id`), the rows are
|
|
32
|
-
* re-inserted ONE AT A TIME so a single bad row can no longer drop the rest:
|
|
33
|
-
* valid jobs persist, constraint violations are isolated as `conflicts` (drop,
|
|
34
|
-
* never retry — they would poison every future flush), and any transient
|
|
35
|
-
* failures are returned so the caller can retry just those. Never throws.
|
|
36
|
-
*/
|
|
37
|
-
insertJobsBatch(jobs) {
|
|
38
|
-
if (jobs.length === 0)
|
|
39
|
-
return { transient: [], conflicts: [] };
|
|
40
|
-
const now = Date.now();
|
|
41
|
-
try {
|
|
42
|
-
this.db.transaction(() => {
|
|
43
|
-
for (let offset = 0; offset < jobs.length; offset += MAX_ROWS_PER_INSERT) {
|
|
44
|
-
const chunk = jobs.slice(offset, offset + MAX_ROWS_PER_INSERT);
|
|
45
|
-
this.insertJobsChunk(chunk, now);
|
|
46
|
-
}
|
|
47
|
-
})();
|
|
48
|
-
return { transient: [], conflicts: [] };
|
|
49
|
-
}
|
|
50
|
-
catch (err) {
|
|
51
|
-
const batchError = err instanceof Error ? err : new Error(String(err));
|
|
52
|
-
return this.insertRowByRow(jobs, now, batchError);
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
/** Fallback path: insert each job independently, isolating per-row failures. */
|
|
56
|
-
insertRowByRow(jobs, now, batchError) {
|
|
57
|
-
const transient = [];
|
|
58
|
-
const conflicts = [];
|
|
59
|
-
for (const job of jobs) {
|
|
60
|
-
try {
|
|
61
|
-
// Single-row INSERT, auto-committed: succeeds/fails independently.
|
|
62
|
-
this.insertJobsChunk([job], now);
|
|
63
|
-
}
|
|
64
|
-
catch (e) {
|
|
65
|
-
const err = e instanceof Error ? e : new Error(String(e));
|
|
66
|
-
if (isConstraintError(err))
|
|
67
|
-
conflicts.push(job);
|
|
68
|
-
else
|
|
69
|
-
transient.push(job);
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
return { transient, conflicts, error: batchError };
|
|
73
|
-
}
|
|
74
|
-
/** Get or create cached prepared statement for batch insert */
|
|
75
|
-
getBatchInsertStmt(size) {
|
|
76
|
-
let stmt = this.cache.get(size);
|
|
77
|
-
if (!stmt) {
|
|
78
|
-
const rowPlaceholder = '(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)';
|
|
79
|
-
const placeholders = Array(size).fill(rowPlaceholder).join(', ');
|
|
80
|
-
// ON CONFLICT(id) DO UPDATE (upsert): a colliding id overwrites in place instead
|
|
81
|
-
// of failing the whole flush. Without it, one stale ORPHAN row (left when
|
|
82
|
-
// obliterate()/a flush raced an in-flight insert) makes the batch throw UNIQUE,
|
|
83
|
-
// and reportLostJobs() then drops EVERY innocent job batched in the same flush
|
|
84
|
-
// window. Per-row conflict resolution isolates the collision; new ids stay a
|
|
85
|
-
// plain INSERT (zero extra cost). jobs has no triggers/FKs → no cascade.
|
|
86
|
-
const sql = `INSERT INTO jobs (
|
|
87
|
-
id, queue, data, priority, created_at, run_at, attempts, max_attempts,
|
|
88
|
-
backoff, ttl, timeout, unique_key, custom_id, depends_on, parent_id,
|
|
89
|
-
children_ids, tags, state, lifo, group_id, remove_on_complete, remove_on_fail,
|
|
90
|
-
fail_parent_on_failure, remove_dependency_on_failure,
|
|
91
|
-
continue_parent_on_failure, ignore_dependency_on_failure,
|
|
92
|
-
stall_timeout, stall_count, timeline
|
|
93
|
-
) VALUES ${placeholders}
|
|
94
|
-
ON CONFLICT(id) DO UPDATE SET
|
|
95
|
-
queue=excluded.queue, data=excluded.data, priority=excluded.priority,
|
|
96
|
-
created_at=excluded.created_at, run_at=excluded.run_at, attempts=excluded.attempts,
|
|
97
|
-
max_attempts=excluded.max_attempts, backoff=excluded.backoff, ttl=excluded.ttl,
|
|
98
|
-
timeout=excluded.timeout, unique_key=excluded.unique_key, custom_id=excluded.custom_id,
|
|
99
|
-
depends_on=excluded.depends_on, parent_id=excluded.parent_id, children_ids=excluded.children_ids,
|
|
100
|
-
tags=excluded.tags, state=excluded.state, lifo=excluded.lifo, group_id=excluded.group_id,
|
|
101
|
-
remove_on_complete=excluded.remove_on_complete, remove_on_fail=excluded.remove_on_fail,
|
|
102
|
-
fail_parent_on_failure=excluded.fail_parent_on_failure,
|
|
103
|
-
remove_dependency_on_failure=excluded.remove_dependency_on_failure,
|
|
104
|
-
continue_parent_on_failure=excluded.continue_parent_on_failure,
|
|
105
|
-
ignore_dependency_on_failure=excluded.ignore_dependency_on_failure,
|
|
106
|
-
stall_timeout=excluded.stall_timeout, stall_count=excluded.stall_count,
|
|
107
|
-
timeline=excluded.timeline,
|
|
108
|
-
started_at=excluded.started_at, completed_at=excluded.completed_at,
|
|
109
|
-
progress=excluded.progress, progress_msg=excluded.progress_msg,
|
|
110
|
-
last_heartbeat=excluded.last_heartbeat, stacktrace=excluded.stacktrace`;
|
|
111
|
-
stmt = this.db.prepare(sql);
|
|
112
|
-
// Cache statements for common batch sizes (1-100)
|
|
113
|
-
if (size <= 100) {
|
|
114
|
-
this.cache.set(size, stmt);
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
return stmt;
|
|
118
|
-
}
|
|
119
|
-
/** Insert a chunk of jobs with single multi-row INSERT */
|
|
120
|
-
insertJobsChunk(jobs, now) {
|
|
121
|
-
const stmt = this.getBatchInsertStmt(jobs.length);
|
|
122
|
-
// Flatten all values
|
|
123
|
-
const values = [];
|
|
124
|
-
for (const job of jobs) {
|
|
125
|
-
values.push(job.id, job.queue, pack(job.data), job.priority, job.createdAt, job.runAt, job.attempts, job.maxAttempts, job.backoff, job.ttl, job.timeout, job.uniqueKey, job.customId, job.dependsOn.length > 0 ? pack(job.dependsOn) : null, job.parentId, job.childrenIds.length > 0 ? pack(job.childrenIds) : null, job.tags.length > 0 ? pack(job.tags) : null, persistedInitialState(job, now), job.lifo ? 1 : 0, job.groupId, job.removeOnComplete ? 1 : 0, job.removeOnFail ? 1 : 0, job.failParentOnFailure ? 1 : 0, job.removeDependencyOnFailure ? 1 : 0, job.continueParentOnFailure ? 1 : 0, job.ignoreDependencyOnFailure ? 1 : 0, job.stallTimeout, persistedStallCount(job), job.timeline.length > 0 ? pack(job.timeline) : null);
|
|
126
|
-
}
|
|
127
|
-
stmt.run(...values);
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
/** Write buffer for batching inserts with double-buffering for atomic swap */
|
|
131
|
-
export class WriteBuffer {
|
|
132
|
-
/** Active buffer for new jobs */
|
|
133
|
-
activeBuffer = [];
|
|
134
|
-
/** Flush buffer being written to disk */
|
|
135
|
-
flushBuffer = [];
|
|
136
|
-
/** Lock to prevent concurrent flushes */
|
|
137
|
-
flushing = false;
|
|
138
|
-
/** Flag to prevent operations after stop */
|
|
139
|
-
stopped = false;
|
|
140
|
-
timer = null;
|
|
141
|
-
batchManager;
|
|
142
|
-
bufferSize;
|
|
143
|
-
onError;
|
|
144
|
-
onCriticalError;
|
|
145
|
-
/** Retry state for exponential backoff */
|
|
146
|
-
retryCount = 0;
|
|
147
|
-
currentBackoffMs = 100;
|
|
148
|
-
initialBackoffMs = 100;
|
|
149
|
-
maxBackoffMs = 30000;
|
|
150
|
-
maxRetries = 10;
|
|
151
|
-
lastError = null;
|
|
152
|
-
backoffTimer = null;
|
|
153
|
-
constructor(batchManager, bufferSize, flushIntervalMs, onError, onCriticalError) {
|
|
154
|
-
this.batchManager = batchManager;
|
|
155
|
-
this.bufferSize = bufferSize;
|
|
156
|
-
this.onError = onError;
|
|
157
|
-
this.onCriticalError = onCriticalError;
|
|
158
|
-
// Auto-flush timer
|
|
159
|
-
this.timer = setInterval(() => {
|
|
160
|
-
// Skip if stopped or in backoff mode
|
|
161
|
-
if (this.stopped || this.backoffTimer)
|
|
162
|
-
return;
|
|
163
|
-
try {
|
|
164
|
-
this.flush();
|
|
165
|
-
}
|
|
166
|
-
catch {
|
|
167
|
-
// Error already handled in flush
|
|
168
|
-
}
|
|
169
|
-
}, flushIntervalMs);
|
|
170
|
-
}
|
|
171
|
-
/** Add job to buffer */
|
|
172
|
-
add(job) {
|
|
173
|
-
this.activeBuffer.push(job);
|
|
174
|
-
if (this.activeBuffer.length >= this.bufferSize) {
|
|
175
|
-
this.flush();
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
/** Add multiple jobs to buffer */
|
|
179
|
-
addBatch(jobs) {
|
|
180
|
-
for (const job of jobs) {
|
|
181
|
-
this.activeBuffer.push(job);
|
|
182
|
-
}
|
|
183
|
-
if (this.activeBuffer.length >= this.bufferSize) {
|
|
184
|
-
this.flush();
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
/**
|
|
188
|
-
* Flush buffer to disk using double-buffering. Returns number of jobs persisted.
|
|
189
|
-
*
|
|
190
|
-
* Per-row isolation (see BatchInsertManager.insertJobsBatch): valid jobs are
|
|
191
|
-
* persisted even if a sibling row violates a constraint. Constraint conflicts
|
|
192
|
-
* (e.g. duplicate id) are dropped+reported and NEVER re-buffered — re-buffering
|
|
193
|
-
* them would poison every future flush and silently drop unrelated valid jobs
|
|
194
|
-
* (the #92-class data-loss bug). Transient failures are re-buffered and retried
|
|
195
|
-
* with exponential backoff, exactly as before.
|
|
196
|
-
*/
|
|
197
|
-
flush() {
|
|
198
|
-
// Prevent flush after stop or concurrent flushes
|
|
199
|
-
if (this.stopped || this.flushing)
|
|
200
|
-
return 0;
|
|
201
|
-
if (this.activeBuffer.length === 0)
|
|
202
|
-
return 0;
|
|
203
|
-
this.flushing = true;
|
|
204
|
-
// Atomic swap: move active to flush buffer
|
|
205
|
-
this.flushBuffer = this.activeBuffer;
|
|
206
|
-
this.activeBuffer = [];
|
|
207
|
-
const jobCount = this.flushBuffer.length;
|
|
208
|
-
try {
|
|
209
|
-
// BatchInsertManager.insertJobsBatch isolates per-row failures and never
|
|
210
|
-
// throws. Stay defensive: a manager that throws (or returns nothing) is
|
|
211
|
-
// treated as a transient failure of the whole batch, preserving the
|
|
212
|
-
// re-buffer/retry/critical-loss semantics.
|
|
213
|
-
let result;
|
|
214
|
-
try {
|
|
215
|
-
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- defensive against a non-conforming batch manager (e.g. a test double returning undefined)
|
|
216
|
-
result = this.batchManager.insertJobsBatch(this.flushBuffer) ?? {
|
|
217
|
-
transient: [],
|
|
218
|
-
conflicts: [],
|
|
219
|
-
};
|
|
220
|
-
}
|
|
221
|
-
catch (err) {
|
|
222
|
-
result = {
|
|
223
|
-
transient: this.flushBuffer,
|
|
224
|
-
conflicts: [],
|
|
225
|
-
error: err instanceof Error ? err : new Error(String(err)),
|
|
226
|
-
};
|
|
227
|
-
}
|
|
228
|
-
const { transient, conflicts, error } = result;
|
|
229
|
-
this.flushBuffer = [];
|
|
230
|
-
// Permanent constraint conflicts: drop + report once, never retry.
|
|
231
|
-
if (conflicts.length > 0) {
|
|
232
|
-
this.onError(error ?? new Error('Constraint violation'), conflicts.length);
|
|
233
|
-
}
|
|
234
|
-
// Transient failures: re-buffer just those and retry with backoff.
|
|
235
|
-
if (transient.length > 0) {
|
|
236
|
-
const error2 = error ?? new Error('Write buffer flush failed');
|
|
237
|
-
this.lastError = error2;
|
|
238
|
-
this.retryCount++;
|
|
239
|
-
// Prepend failed jobs back to active buffer (failed first, then new).
|
|
240
|
-
this.activeBuffer = transient.concat(this.activeBuffer);
|
|
241
|
-
if (this.retryCount >= this.maxRetries) {
|
|
242
|
-
const lostJobs = [...this.activeBuffer];
|
|
243
|
-
this.activeBuffer = [];
|
|
244
|
-
if (this.onCriticalError)
|
|
245
|
-
this.onCriticalError(lostJobs, error2, this.retryCount);
|
|
246
|
-
this.onError(error2, lostJobs.length, {
|
|
247
|
-
retryCount: this.retryCount,
|
|
248
|
-
nextBackoffMs: 0,
|
|
249
|
-
maxRetries: this.maxRetries,
|
|
250
|
-
});
|
|
251
|
-
this.retryCount = 0;
|
|
252
|
-
this.currentBackoffMs = this.initialBackoffMs;
|
|
253
|
-
this.lastError = null;
|
|
254
|
-
}
|
|
255
|
-
else {
|
|
256
|
-
const nextBackoffMs = Math.min(this.currentBackoffMs * 2, this.maxBackoffMs);
|
|
257
|
-
this.onError(error2, transient.length, {
|
|
258
|
-
retryCount: this.retryCount,
|
|
259
|
-
nextBackoffMs,
|
|
260
|
-
maxRetries: this.maxRetries,
|
|
261
|
-
});
|
|
262
|
-
this.scheduleBackoffRetry();
|
|
263
|
-
}
|
|
264
|
-
return jobCount - transient.length - conflicts.length;
|
|
265
|
-
}
|
|
266
|
-
// Success (or success-modulo-dropped-conflicts): reset retry state.
|
|
267
|
-
this.retryCount = 0;
|
|
268
|
-
this.currentBackoffMs = this.initialBackoffMs;
|
|
269
|
-
this.lastError = null;
|
|
270
|
-
return jobCount - conflicts.length;
|
|
271
|
-
}
|
|
272
|
-
finally {
|
|
273
|
-
this.flushing = false;
|
|
274
|
-
}
|
|
275
|
-
}
|
|
276
|
-
/** Schedule a retry with exponential backoff */
|
|
277
|
-
scheduleBackoffRetry() {
|
|
278
|
-
// Clear any existing backoff timer
|
|
279
|
-
if (this.backoffTimer) {
|
|
280
|
-
clearTimeout(this.backoffTimer);
|
|
281
|
-
}
|
|
282
|
-
// Update backoff for next attempt
|
|
283
|
-
this.currentBackoffMs = Math.min(this.currentBackoffMs * 2, this.maxBackoffMs);
|
|
284
|
-
this.backoffTimer = setTimeout(() => {
|
|
285
|
-
this.backoffTimer = null;
|
|
286
|
-
try {
|
|
287
|
-
this.flush();
|
|
288
|
-
}
|
|
289
|
-
catch {
|
|
290
|
-
// Error already handled in flush
|
|
291
|
-
}
|
|
292
|
-
}, this.currentBackoffMs);
|
|
293
|
-
}
|
|
294
|
-
/** Get pending job count (includes both buffers) */
|
|
295
|
-
get pendingCount() {
|
|
296
|
-
return this.activeBuffer.length + this.flushBuffer.length;
|
|
297
|
-
}
|
|
298
|
-
/**
|
|
299
|
-
* Remove any pending buffered inserts for a given jobId.
|
|
300
|
-
* Prevents a buffered insert from flushing to disk after an immediate deleteJob,
|
|
301
|
-
* which would leave an orphan row with stale state.
|
|
302
|
-
*/
|
|
303
|
-
removePending(jobId) {
|
|
304
|
-
const i = this.activeBuffer.findIndex((j) => j.id === jobId);
|
|
305
|
-
if (i !== -1)
|
|
306
|
-
this.activeBuffer.splice(i, 1);
|
|
307
|
-
const j = this.flushBuffer.findIndex((j) => j.id === jobId);
|
|
308
|
-
if (j !== -1)
|
|
309
|
-
this.flushBuffer.splice(j, 1);
|
|
310
|
-
}
|
|
311
|
-
/**
|
|
312
|
-
* Check whether a job is still sitting in the WriteBuffer (not yet persisted).
|
|
313
|
-
* Used by state-transition writes (markActive/Completed/Failed) to decide
|
|
314
|
-
* whether they need to flush the buffer first — otherwise their UPDATE
|
|
315
|
-
* would silently match 0 rows and the state change would be lost when the
|
|
316
|
-
* buffered INSERT eventually writes with the original state.
|
|
317
|
-
*/
|
|
318
|
-
hasPending(jobId) {
|
|
319
|
-
for (const j of this.activeBuffer)
|
|
320
|
-
if (j.id === jobId)
|
|
321
|
-
return true;
|
|
322
|
-
for (const j of this.flushBuffer)
|
|
323
|
-
if (j.id === jobId)
|
|
324
|
-
return true;
|
|
325
|
-
return false;
|
|
326
|
-
}
|
|
327
|
-
/** Stop auto-flush timer and flush pending jobs */
|
|
328
|
-
stop() {
|
|
329
|
-
// Clear auto-flush timer
|
|
330
|
-
if (this.timer) {
|
|
331
|
-
clearInterval(this.timer);
|
|
332
|
-
this.timer = null;
|
|
333
|
-
}
|
|
334
|
-
// Flush any pending jobs before stopping
|
|
335
|
-
if (this.pendingCount > 0) {
|
|
336
|
-
try {
|
|
337
|
-
this.flush();
|
|
338
|
-
}
|
|
339
|
-
catch {
|
|
340
|
-
// Flush failed during shutdown - jobs will be reported as lost below
|
|
341
|
-
}
|
|
342
|
-
}
|
|
343
|
-
// Mark as stopped to prevent any future flush attempts
|
|
344
|
-
this.stopped = true;
|
|
345
|
-
// Clear any backoff timer (pre-existing or scheduled by failed flush)
|
|
346
|
-
if (this.backoffTimer) {
|
|
347
|
-
clearTimeout(this.backoffTimer);
|
|
348
|
-
this.backoffTimer = null;
|
|
349
|
-
}
|
|
350
|
-
// Report any jobs still stuck in buffers as lost
|
|
351
|
-
this.reportLostJobs();
|
|
352
|
-
}
|
|
353
|
-
/**
|
|
354
|
-
* Graceful shutdown with timeout.
|
|
355
|
-
* Attempts to flush pending jobs within the specified timeout.
|
|
356
|
-
* @param timeoutMs Maximum time to wait for flush (default: 5000ms)
|
|
357
|
-
* @returns Promise resolving to number of jobs flushed, or -1 if timed out
|
|
358
|
-
*/
|
|
359
|
-
async stopGracefully(timeoutMs = 5000) {
|
|
360
|
-
// Clear backoff timer
|
|
361
|
-
if (this.backoffTimer) {
|
|
362
|
-
clearTimeout(this.backoffTimer);
|
|
363
|
-
this.backoffTimer = null;
|
|
364
|
-
}
|
|
365
|
-
// Clear auto-flush timer
|
|
366
|
-
if (this.timer) {
|
|
367
|
-
clearInterval(this.timer);
|
|
368
|
-
this.timer = null;
|
|
369
|
-
}
|
|
370
|
-
const pending = this.pendingCount;
|
|
371
|
-
if (pending === 0) {
|
|
372
|
-
this.stopped = true;
|
|
373
|
-
return 0;
|
|
374
|
-
}
|
|
375
|
-
// Try to flush with timeout
|
|
376
|
-
return new Promise((resolve) => {
|
|
377
|
-
const timeout = setTimeout(() => {
|
|
378
|
-
this.stopped = true;
|
|
379
|
-
this.reportLostJobs();
|
|
380
|
-
resolve(-1); // Timed out
|
|
381
|
-
}, timeoutMs);
|
|
382
|
-
try {
|
|
383
|
-
const flushed = this.flush();
|
|
384
|
-
clearTimeout(timeout);
|
|
385
|
-
this.stopped = true;
|
|
386
|
-
// flush() no longer throws on transient failure (it re-buffers); report
|
|
387
|
-
// anything that could not be persisted so it isn't silently lost.
|
|
388
|
-
if (this.pendingCount > 0)
|
|
389
|
-
this.reportLostJobs();
|
|
390
|
-
resolve(flushed);
|
|
391
|
-
}
|
|
392
|
-
catch {
|
|
393
|
-
// Flush failed - clear any backoff timer that flush() scheduled
|
|
394
|
-
if (this.backoffTimer) {
|
|
395
|
-
clearTimeout(this.backoffTimer);
|
|
396
|
-
this.backoffTimer = null;
|
|
397
|
-
}
|
|
398
|
-
clearTimeout(timeout);
|
|
399
|
-
this.stopped = true;
|
|
400
|
-
this.reportLostJobs();
|
|
401
|
-
resolve(0);
|
|
402
|
-
}
|
|
403
|
-
});
|
|
404
|
-
}
|
|
405
|
-
/** Report any remaining buffered jobs as lost via onCriticalError */
|
|
406
|
-
reportLostJobs() {
|
|
407
|
-
const remaining = this.activeBuffer.concat(this.flushBuffer);
|
|
408
|
-
if (remaining.length > 0 && this.onCriticalError) {
|
|
409
|
-
this.onCriticalError(remaining, this.lastError ?? new Error('Flush failed during shutdown'), this.retryCount);
|
|
410
|
-
this.activeBuffer = [];
|
|
411
|
-
this.flushBuffer = [];
|
|
412
|
-
}
|
|
413
|
-
}
|
|
414
|
-
/** Get current retry state (for monitoring) */
|
|
415
|
-
getRetryState() {
|
|
416
|
-
return {
|
|
417
|
-
retryCount: this.retryCount,
|
|
418
|
-
currentBackoffMs: this.currentBackoffMs,
|
|
419
|
-
lastError: this.lastError,
|
|
420
|
-
};
|
|
421
|
-
}
|
|
422
|
-
}
|
|
1
|
+
/** Stable batch-persistence import surface. */
|
|
2
|
+
export { BatchInsertManager } from './batchInsert';
|
|
3
|
+
export { WriteBuffer } from './writeBuffer';
|
|
@@ -4,12 +4,17 @@
|
|
|
4
4
|
* Uses msgpackr for 2-3x faster serialization
|
|
5
5
|
*/
|
|
6
6
|
import { type Job } from '../../domain/types/job';
|
|
7
|
-
import type
|
|
7
|
+
import { type DlqEntry } from '../../domain/types/dlq';
|
|
8
8
|
import type { DbJob } from './statements';
|
|
9
9
|
/** Encode data to MessagePack buffer */
|
|
10
10
|
export declare function pack(data: unknown): Uint8Array;
|
|
11
11
|
/** Decode MessagePack buffer to data */
|
|
12
12
|
export declare function unpack<T>(buffer: Uint8Array | null, fallback: T, context: string): T;
|
|
13
|
+
/** Decode a modern named payload or a pre-v31 name-in-data envelope. */
|
|
14
|
+
export declare function decodeStoredNamedPayload(name: string | null | undefined, buffer: Uint8Array, context: string): {
|
|
15
|
+
name: string;
|
|
16
|
+
data: unknown;
|
|
17
|
+
};
|
|
13
18
|
/**
|
|
14
19
|
* Normalize jobs constructed by pre-stallCount integrations at the persistence
|
|
15
20
|
* boundary. The database keeps its NOT NULL invariant while an omitted legacy
|
|
@@ -4,6 +4,9 @@
|
|
|
4
4
|
* Uses msgpackr for 2-3x faster serialization
|
|
5
5
|
*/
|
|
6
6
|
import { jobId } from '../../domain/types/job';
|
|
7
|
+
import { setDlqRetryState } from '../../domain/types/dlq';
|
|
8
|
+
import { normalizeLegacyJobPayload } from '../../domain/job/payload';
|
|
9
|
+
import { decodeJobOptions } from './jobOptionsBlob';
|
|
7
10
|
import { storageLog } from '../../shared/logger';
|
|
8
11
|
import { decodeMessagePack as msgpackDecode, encodeMessagePack as msgpackEncode, } from '../../shared/msgpack';
|
|
9
12
|
/** Encode data to MessagePack buffer */
|
|
@@ -22,6 +25,14 @@ export function unpack(buffer, fallback, context) {
|
|
|
22
25
|
return fallback;
|
|
23
26
|
}
|
|
24
27
|
}
|
|
28
|
+
/** Decode a modern named payload or a pre-v31 name-in-data envelope. */
|
|
29
|
+
export function decodeStoredNamedPayload(name, buffer, context) {
|
|
30
|
+
const data = unpack(buffer, {}, context);
|
|
31
|
+
if (name !== null && name !== undefined)
|
|
32
|
+
return { name, data };
|
|
33
|
+
const legacy = normalizeLegacyJobPayload({ data });
|
|
34
|
+
return { name: legacy.name, data: legacy.data };
|
|
35
|
+
}
|
|
25
36
|
/**
|
|
26
37
|
* Normalize jobs constructed by pre-stallCount integrations at the persistence
|
|
27
38
|
* boundary. The database keeps its NOT NULL invariant while an omitted legacy
|
|
@@ -88,6 +99,7 @@ function decodeDependsOn(buffer, context) {
|
|
|
88
99
|
/** Convert database row to Job object */
|
|
89
100
|
export function rowToJob(row) {
|
|
90
101
|
const jobContext = `rowToJob:${row.id}`;
|
|
102
|
+
const payload = decodeStoredNamedPayload(row.name, row.data, `${jobContext}:data`);
|
|
91
103
|
// A corrupt depends_on blob must NOT be silently swallowed into [] (which the
|
|
92
104
|
// recovery path treats as "ready, no deps" -> out-of-order execution).
|
|
93
105
|
// decodeDependsOn() surfaces the corruption via a `corrupt` flag; we then
|
|
@@ -99,10 +111,12 @@ export function rowToJob(row) {
|
|
|
99
111
|
? unpack(row.children_ids, [], `${jobContext}:childrenIds`)
|
|
100
112
|
: [];
|
|
101
113
|
const tags = row.tags ? unpack(row.tags, [], `${jobContext}:tags`) : [];
|
|
114
|
+
const extended = decodeJobOptions(row.extended_options, `${jobContext}:extendedOptions`);
|
|
102
115
|
const job = {
|
|
103
116
|
id: jobId(row.id),
|
|
104
117
|
queue: row.queue,
|
|
105
|
-
|
|
118
|
+
name: payload.name,
|
|
119
|
+
data: payload.data,
|
|
106
120
|
priority: row.priority,
|
|
107
121
|
createdAt: row.created_at,
|
|
108
122
|
runAt: row.run_at,
|
|
@@ -111,7 +125,7 @@ export function rowToJob(row) {
|
|
|
111
125
|
attempts: row.attempts,
|
|
112
126
|
maxAttempts: row.max_attempts,
|
|
113
127
|
backoff: row.backoff,
|
|
114
|
-
backoffConfig:
|
|
128
|
+
backoffConfig: extended.backoffConfig,
|
|
115
129
|
ttl: row.ttl,
|
|
116
130
|
timeout: row.timeout,
|
|
117
131
|
uniqueKey: row.unique_key,
|
|
@@ -127,23 +141,24 @@ export function rowToJob(row) {
|
|
|
127
141
|
progressMessage: row.progress_msg,
|
|
128
142
|
removeOnComplete: row.remove_on_complete === 1,
|
|
129
143
|
removeOnFail: row.remove_on_fail === 1,
|
|
130
|
-
repeat:
|
|
144
|
+
repeat: extended.repeat,
|
|
131
145
|
lastHeartbeat: row.last_heartbeat ?? row.created_at,
|
|
132
146
|
stallTimeout: row.stall_timeout,
|
|
133
147
|
stallCount: row.stall_count ?? 0,
|
|
134
148
|
// BullMQ v5 additional fields
|
|
135
|
-
stackTraceLimit:
|
|
136
|
-
keepLogs:
|
|
137
|
-
sizeLimit:
|
|
149
|
+
stackTraceLimit: extended.stackTraceLimit,
|
|
150
|
+
keepLogs: extended.keepLogs,
|
|
151
|
+
sizeLimit: extended.sizeLimit,
|
|
138
152
|
failParentOnFailure: row.fail_parent_on_failure === 1,
|
|
139
153
|
removeDependencyOnFailure: row.remove_dependency_on_failure === 1,
|
|
140
154
|
continueParentOnFailure: row.continue_parent_on_failure === 1,
|
|
141
155
|
ignoreDependencyOnFailure: row.ignore_dependency_on_failure === 1,
|
|
142
|
-
deduplicationTtl:
|
|
143
|
-
deduplicationExtend:
|
|
144
|
-
deduplicationReplace:
|
|
145
|
-
debounceId:
|
|
146
|
-
debounceTtl:
|
|
156
|
+
deduplicationTtl: extended.deduplicationTtl,
|
|
157
|
+
deduplicationExtend: extended.deduplicationExtend,
|
|
158
|
+
deduplicationReplace: extended.deduplicationReplace,
|
|
159
|
+
debounceId: extended.debounceId,
|
|
160
|
+
debounceTtl: extended.debounceTtl,
|
|
161
|
+
durable: extended.durable,
|
|
147
162
|
timeline: row.timeline
|
|
148
163
|
? unpack(row.timeline, [], `${jobContext}:timeline`)
|
|
149
164
|
: [],
|
|
@@ -151,6 +166,10 @@ export function rowToJob(row) {
|
|
|
151
166
|
? unpack(row.stacktrace, null, `${jobContext}:stacktrace`)
|
|
152
167
|
: null,
|
|
153
168
|
};
|
|
169
|
+
const dlqRetryState = row.dlq_retry_state
|
|
170
|
+
? unpack(row.dlq_retry_state, null, `${jobContext}:dlqRetryState`)
|
|
171
|
+
: null;
|
|
172
|
+
setDlqRetryState(job, dlqRetryState);
|
|
154
173
|
Object.defineProperty(job, PERSISTED_JOB_STATE, {
|
|
155
174
|
value: row.state,
|
|
156
175
|
enumerable: false,
|
|
@@ -183,10 +202,13 @@ function brandId(id) {
|
|
|
183
202
|
}
|
|
184
203
|
/** Reconstruct DlqEntry from MessagePack-decoded data */
|
|
185
204
|
export function reconstructDlqEntry(entry) {
|
|
205
|
+
const payload = normalizeLegacyJobPayload(entry.job);
|
|
186
206
|
return {
|
|
187
207
|
...entry,
|
|
188
208
|
job: {
|
|
189
209
|
...entry.job,
|
|
210
|
+
name: payload.name,
|
|
211
|
+
data: payload.data,
|
|
190
212
|
id: brandId(entry.job.id),
|
|
191
213
|
dependsOn: entry.job.dependsOn.map((id) => brandId(id)),
|
|
192
214
|
parentId: entry.job.parentId !== null ? brandId(entry.job.parentId) : null,
|