bunqueue 2.8.60 → 2.9.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +114 -78
- package/dist/application/background/dlq.js +2 -0
- package/dist/application/background/recovery/active.d.ts +1 -0
- package/dist/application/background/recovery/active.js +12 -0
- package/dist/application/background/recovery/index.js +3 -1
- package/dist/application/background/recovery/pending.js +1 -0
- package/dist/application/cleanupTasks.js +4 -16
- package/dist/application/contextFactory.js +8 -0
- package/dist/application/dlqManager.d.ts +10 -0
- package/dist/application/dlqManager.js +48 -9
- package/dist/application/dlqRetry.js +60 -38
- package/dist/application/eventsManager.d.ts +9 -2
- package/dist/application/eventsManager.js +106 -55
- package/dist/application/operations/ackHelpers.d.ts +1 -4
- package/dist/application/operations/ackHelpers.js +39 -14
- package/dist/application/operations/flowPush.js +1 -0
- package/dist/application/operations/flowValidation.js +4 -4
- package/dist/application/operations/jobManagement.d.ts +4 -0
- package/dist/application/operations/jobMoveOperations.js +9 -4
- package/dist/application/operations/pull.d.ts +7 -2
- package/dist/application/operations/pull.js +15 -57
- package/dist/application/operations/pullFinalization.d.ts +6 -0
- package/dist/application/operations/pullFinalization.js +69 -0
- package/dist/application/operations/pullStateTransition.d.ts +8 -7
- package/dist/application/operations/pullStateTransition.js +25 -18
- package/dist/application/operations/push.js +3 -0
- package/dist/application/operations/pushBatch.js +14 -7
- package/dist/application/operations/pushContext.d.ts +2 -1
- package/dist/application/postgres-queue-manager/batchSnapshot.d.ts +16 -0
- package/dist/application/postgres-queue-manager/batchSnapshot.js +17 -0
- package/dist/application/postgres-queue-manager/cloud.d.ts +30 -0
- package/dist/application/postgres-queue-manager/cloud.js +55 -0
- package/dist/application/postgres-queue-manager/config.d.ts +5 -0
- package/dist/application/postgres-queue-manager/config.js +1 -0
- package/dist/application/postgres-queue-manager/control.d.ts +30 -0
- package/dist/application/postgres-queue-manager/control.js +210 -0
- package/dist/application/postgres-queue-manager/deferredWrites.d.ts +13 -0
- package/dist/application/postgres-queue-manager/deferredWrites.js +60 -0
- package/dist/application/postgres-queue-manager/delivery.d.ts +20 -0
- package/dist/application/postgres-queue-manager/delivery.js +83 -0
- package/dist/application/postgres-queue-manager/groupQueries.d.ts +10 -0
- package/dist/application/postgres-queue-manager/groupQueries.js +40 -0
- package/dist/application/postgres-queue-manager/lease.d.ts +13 -0
- package/dist/application/postgres-queue-manager/lease.js +88 -0
- package/dist/application/postgres-queue-manager/lifetimeMetrics.d.ts +32 -0
- package/dist/application/postgres-queue-manager/lifetimeMetrics.js +53 -0
- package/dist/application/postgres-queue-manager/maintenance.d.ts +14 -0
- package/dist/application/postgres-queue-manager/maintenance.js +100 -0
- package/dist/application/postgres-queue-manager/operationGate.d.ts +26 -0
- package/dist/application/postgres-queue-manager/operationGate.js +96 -0
- package/dist/application/postgres-queue-manager/operations.d.ts +25 -0
- package/dist/application/postgres-queue-manager/operations.js +194 -0
- package/dist/application/postgres-queue-manager/projectionRefreshes.d.ts +43 -0
- package/dist/application/postgres-queue-manager/projectionRefreshes.js +170 -0
- package/dist/application/postgres-queue-manager/queries.d.ts +142 -0
- package/dist/application/postgres-queue-manager/queries.js +231 -0
- package/dist/application/postgres-queue-manager/relationships.d.ts +10 -0
- package/dist/application/postgres-queue-manager/relationships.js +45 -0
- package/dist/application/postgres-queue-manager/services.d.ts +31 -0
- package/dist/application/postgres-queue-manager/services.js +149 -0
- package/dist/application/postgres-queue-manager/snapshot.d.ts +51 -0
- package/dist/application/postgres-queue-manager/snapshot.js +236 -0
- package/dist/application/postgres-queue-manager/snapshotViews.d.ts +15 -0
- package/dist/application/postgres-queue-manager/snapshotViews.js +100 -0
- package/dist/application/postgres-queue-manager/startupEventBuffer.d.ts +12 -0
- package/dist/application/postgres-queue-manager/startupEventBuffer.js +36 -0
- package/dist/application/postgres-queue-manager/state.d.ts +47 -0
- package/dist/application/postgres-queue-manager/state.js +273 -0
- package/dist/application/postgres-queue-manager/terminalDelivery.d.ts +20 -0
- package/dist/application/postgres-queue-manager/terminalDelivery.js +100 -0
- package/dist/application/postgresQueueManager.d.ts +2 -0
- package/dist/application/postgresQueueManager.js +1 -0
- package/dist/application/queue-manager/control.js +1 -0
- package/dist/application/queue-manager/delivery.d.ts +5 -4
- package/dist/application/queue-manager/delivery.js +15 -8
- package/dist/application/queue-manager/flow-failures.js +4 -0
- package/dist/application/queue-manager/limits.d.ts +13 -0
- package/dist/application/queue-manager/limits.js +65 -0
- package/dist/application/queue-manager/observability.js +15 -3
- package/dist/application/queue-manager/queries.d.ts +7 -0
- package/dist/application/queue-manager/queries.js +9 -0
- package/dist/application/queue-manager/services.d.ts +1 -1
- package/dist/application/queue-manager/services.js +4 -2
- package/dist/application/queue-manager/state.js +17 -2
- package/dist/application/queueTelemetryJournal.d.ts +2 -0
- package/dist/application/queueTelemetryJournal.js +23 -0
- package/dist/application/types/ack.d.ts +3 -1
- package/dist/cli/commandRouter.d.ts +1 -1
- package/dist/cli/commands/server.js +1 -1
- package/dist/client/flowPush.js +6 -0
- package/dist/client/forwarder.d.ts +6 -4
- package/dist/client/forwarder.js +5 -3
- package/dist/client/groupId.d.ts +1 -0
- package/dist/client/groupId.js +1 -0
- package/dist/client/index.d.ts +1 -1
- package/dist/client/jobHelpers.js +1 -0
- package/dist/client/queue/dlq.d.ts +2 -0
- package/dist/client/queue/dlq.js +14 -0
- package/dist/client/queue/dlqOps.d.ts +2 -0
- package/dist/client/queue/dlqOps.js +4 -0
- package/dist/client/queue/helpers.js +2 -0
- package/dist/client/queue/operations/add/bulk.js +4 -4
- package/dist/client/queue/operations/add/payload.d.ts +1 -0
- package/dist/client/queue/operations/add/payload.js +7 -1
- package/dist/client/queue/operations/add/single.js +3 -3
- package/dist/client/queue/operations/groups.d.ts +21 -0
- package/dist/client/queue/operations/groups.js +88 -0
- package/dist/client/queue/runtime/configuration.d.ts +4 -0
- package/dist/client/queue/runtime/configuration.js +8 -0
- package/dist/client/queue/runtime/queries.d.ts +13 -0
- package/dist/client/queue/runtime/queries.js +31 -0
- package/dist/client/queue/runtime/state.d.ts +4 -0
- package/dist/client/queue/runtime/state.js +1 -0
- package/dist/client/types/index.d.ts +2 -2
- package/dist/client/types/options.d.ts +4 -0
- package/dist/client/types/worker.d.ts +8 -0
- package/dist/client/worker/runtime/execution.js +4 -8
- package/dist/client/worker/runtime/options.js +3 -0
- package/dist/client/worker/runtime/polling.d.ts +1 -0
- package/dist/client/worker/runtime/polling.js +9 -0
- package/dist/client/worker/types/options.d.ts +2 -1
- package/dist/client/worker/workerPull.d.ts +2 -0
- package/dist/client/worker/workerPull.js +6 -4
- package/dist/config/resolve.d.ts +14 -0
- package/dist/config/resolve.js +50 -5
- package/dist/config/types.d.ts +18 -0
- package/dist/domain/job/groupFifoOrder.d.ts +9 -0
- package/dist/domain/job/groupFifoOrder.js +26 -0
- package/dist/domain/queue/dlqShard.d.ts +2 -0
- package/dist/domain/queue/dlqShard.js +16 -0
- package/dist/domain/queue/groupLimiterManager.d.ts +23 -0
- package/dist/domain/queue/groupLimiterManager.js +107 -0
- package/dist/domain/queue/groupScheduler.d.ts +31 -0
- package/dist/domain/queue/groupScheduler.js +256 -0
- package/dist/domain/queue/groupSchedulerOrder.d.ts +6 -0
- package/dist/domain/queue/groupSchedulerOrder.js +30 -0
- package/dist/domain/queue/priorityQueue.d.ts +13 -23
- package/dist/domain/queue/priorityQueue.js +53 -42
- package/dist/domain/queue/shard/dlq.d.ts +1 -0
- package/dist/domain/queue/shard/dlq.js +3 -0
- package/dist/domain/queue/shard/keys.d.ts +1 -0
- package/dist/domain/queue/shard/keys.js +25 -2
- package/dist/domain/queue/shard/lifecycle.js +4 -0
- package/dist/domain/queue/shard/limits.d.ts +20 -1
- package/dist/domain/queue/shard/limits.js +56 -0
- package/dist/domain/queue/shard/state.d.ts +5 -0
- package/dist/domain/queue/shard/state.js +9 -1
- package/dist/domain/types/commands/core.d.ts +3 -0
- package/dist/domain/types/commands/dlq.d.ts +5 -0
- package/dist/domain/types/commands/limits.d.ts +41 -0
- package/dist/domain/types/commands/union.d.ts +1 -1
- package/dist/domain/types/cron.d.ts +5 -0
- package/dist/domain/types/cron.js +14 -3
- package/dist/domain/types/dlq.d.ts +1 -1
- package/dist/domain/types/dlq.js +1 -2
- package/dist/domain/types/group.d.ts +21 -0
- package/dist/domain/types/group.js +78 -0
- package/dist/domain/types/jobs/model.d.ts +1 -1
- package/dist/domain/types/priorityQueue.d.ts +1 -0
- package/dist/infrastructure/cloud/commandHandler.js +5 -3
- package/dist/infrastructure/cloud/commands/integrations.js +11 -11
- package/dist/infrastructure/cloud/commands/jobs.js +48 -40
- package/dist/infrastructure/cloud/commands/queues.js +61 -75
- package/dist/infrastructure/cloud/queueAdapter/local.d.ts +41 -0
- package/dist/infrastructure/cloud/queueAdapter/local.js +187 -0
- package/dist/infrastructure/cloud/queueAdapter/postgres.d.ts +42 -0
- package/dist/infrastructure/cloud/queueAdapter/postgres.js +188 -0
- package/dist/infrastructure/cloud/queueAdapter/registry.d.ts +4 -0
- package/dist/infrastructure/cloud/queueAdapter/registry.js +15 -0
- package/dist/infrastructure/cloud/queueAdapter/types.d.ts +87 -0
- package/dist/infrastructure/cloud/queueAdapter/types.js +1 -0
- package/dist/infrastructure/cloud/snapshot/analytics.d.ts +2 -0
- package/dist/infrastructure/cloud/snapshot/analytics.js +7 -0
- package/dist/infrastructure/cloud/snapshot/collector.d.ts +4 -0
- package/dist/infrastructure/cloud/snapshot/collector.js +39 -1
- package/dist/infrastructure/cloud/snapshot/config.d.ts +3 -0
- package/dist/infrastructure/cloud/snapshot/config.js +43 -0
- package/dist/infrastructure/cloud/snapshot/jobs.d.ts +3 -0
- package/dist/infrastructure/cloud/snapshot/jobs.js +32 -1
- package/dist/infrastructure/cloud/snapshotCollector.js +20 -35
- package/dist/infrastructure/cloud/snapshotHelpers.d.ts +3 -3
- package/dist/infrastructure/cloud/snapshotHelpers.js +3 -3
- package/dist/infrastructure/cloud/statsRefresh.js +2 -1
- package/dist/infrastructure/cloud/types/command.d.ts +2 -2
- package/dist/infrastructure/persistence/jobOptionsBlob.d.ts +1 -0
- package/dist/infrastructure/persistence/jobOptionsBlob.js +10 -2
- package/dist/infrastructure/persistence/migrations.js +11 -0
- package/dist/infrastructure/persistence/postgres/admission.d.ts +18 -0
- package/dist/infrastructure/persistence/postgres/admission.js +196 -0
- package/dist/infrastructure/persistence/postgres/admissionParent.d.ts +5 -0
- package/dist/infrastructure/persistence/postgres/admissionParent.js +35 -0
- package/dist/infrastructure/persistence/postgres/admissionResult.d.ts +9 -0
- package/dist/infrastructure/persistence/postgres/admissionResult.js +1 -0
- package/dist/infrastructure/persistence/postgres/admissionStore.d.ts +12 -0
- package/dist/infrastructure/persistence/postgres/admissionStore.js +101 -0
- package/dist/infrastructure/persistence/postgres/advisoryLocks.d.ts +2 -0
- package/dist/infrastructure/persistence/postgres/advisoryLocks.js +13 -0
- package/dist/infrastructure/persistence/postgres/batchAdmission.d.ts +11 -0
- package/dist/infrastructure/persistence/postgres/batchAdmission.js +128 -0
- package/dist/infrastructure/persistence/postgres/batchCompletion.d.ts +4 -0
- package/dist/infrastructure/persistence/postgres/batchCompletion.js +174 -0
- package/dist/infrastructure/persistence/postgres/batchEvents.d.ts +14 -0
- package/dist/infrastructure/persistence/postgres/batchEvents.js +72 -0
- package/dist/infrastructure/persistence/postgres/brokerSessions.d.ts +14 -0
- package/dist/infrastructure/persistence/postgres/brokerSessions.js +94 -0
- package/dist/infrastructure/persistence/postgres/claimBatch.d.ts +14 -0
- package/dist/infrastructure/persistence/postgres/claimBatch.js +69 -0
- package/dist/infrastructure/persistence/postgres/claimSelection.d.ts +11 -0
- package/dist/infrastructure/persistence/postgres/claimSelection.js +140 -0
- package/dist/infrastructure/persistence/postgres/claims.d.ts +10 -0
- package/dist/infrastructure/persistence/postgres/claims.js +153 -0
- package/dist/infrastructure/persistence/postgres/cloudReadModel.d.ts +26 -0
- package/dist/infrastructure/persistence/postgres/cloudReadModel.js +123 -0
- package/dist/infrastructure/persistence/postgres/codec.d.ts +30 -0
- package/dist/infrastructure/persistence/postgres/codec.js +82 -0
- package/dist/infrastructure/persistence/postgres/completionEvents.d.ts +11 -0
- package/dist/infrastructure/persistence/postgres/completionEvents.js +21 -0
- package/dist/infrastructure/persistence/postgres/completionLifecycle.d.ts +11 -0
- package/dist/infrastructure/persistence/postgres/completionLifecycle.js +145 -0
- package/dist/infrastructure/persistence/postgres/completionOutcome.d.ts +4 -0
- package/dist/infrastructure/persistence/postgres/completionOutcome.js +112 -0
- package/dist/infrastructure/persistence/postgres/completionQueries.d.ts +10 -0
- package/dist/infrastructure/persistence/postgres/completionQueries.js +87 -0
- package/dist/infrastructure/persistence/postgres/connection.d.ts +3 -0
- package/dist/infrastructure/persistence/postgres/connection.js +15 -0
- package/dist/infrastructure/persistence/postgres/context.d.ts +28 -0
- package/dist/infrastructure/persistence/postgres/context.js +74 -0
- package/dist/infrastructure/persistence/postgres/control.d.ts +23 -0
- package/dist/infrastructure/persistence/postgres/control.js +105 -0
- package/dist/infrastructure/persistence/postgres/crons.d.ts +18 -0
- package/dist/infrastructure/persistence/postgres/crons.js +205 -0
- package/dist/infrastructure/persistence/postgres/deduplication.d.ts +9 -0
- package/dist/infrastructure/persistence/postgres/deduplication.js +47 -0
- package/dist/infrastructure/persistence/postgres/dependencyDestruction.d.ts +14 -0
- package/dist/infrastructure/persistence/postgres/dependencyDestruction.js +74 -0
- package/dist/infrastructure/persistence/postgres/dependencyPromotion.d.ts +29 -0
- package/dist/infrastructure/persistence/postgres/dependencyPromotion.js +212 -0
- package/dist/infrastructure/persistence/postgres/destructiveMutations.d.ts +4 -0
- package/dist/infrastructure/persistence/postgres/destructiveMutations.js +111 -0
- package/dist/infrastructure/persistence/postgres/dlqLifecycle.d.ts +13 -0
- package/dist/infrastructure/persistence/postgres/dlqLifecycle.js +184 -0
- package/dist/infrastructure/persistence/postgres/dlqMaintenance.d.ts +6 -0
- package/dist/infrastructure/persistence/postgres/dlqMaintenance.js +36 -0
- package/dist/infrastructure/persistence/postgres/dlqRetryPlan.d.ts +21 -0
- package/dist/infrastructure/persistence/postgres/dlqRetryPlan.js +92 -0
- package/dist/infrastructure/persistence/postgres/eventCatchupCursors.d.ts +32 -0
- package/dist/infrastructure/persistence/postgres/eventCatchupCursors.js +66 -0
- package/dist/infrastructure/persistence/postgres/eventCommitGc.d.ts +27 -0
- package/dist/infrastructure/persistence/postgres/eventCommitGc.js +62 -0
- package/dist/infrastructure/persistence/postgres/eventJournal.d.ts +18 -0
- package/dist/infrastructure/persistence/postgres/eventJournal.js +76 -0
- package/dist/infrastructure/persistence/postgres/eventJournalSchema.d.ts +5 -0
- package/dist/infrastructure/persistence/postgres/eventJournalSchema.js +267 -0
- package/dist/infrastructure/persistence/postgres/eventPruneWatermarks.d.ts +26 -0
- package/dist/infrastructure/persistence/postgres/eventPruneWatermarks.js +129 -0
- package/dist/infrastructure/persistence/postgres/eventRetention.d.ts +18 -0
- package/dist/infrastructure/persistence/postgres/eventRetention.js +76 -0
- package/dist/infrastructure/persistence/postgres/events.d.ts +45 -0
- package/dist/infrastructure/persistence/postgres/events.js +276 -0
- package/dist/infrastructure/persistence/postgres/expiry.d.ts +3 -0
- package/dist/infrastructure/persistence/postgres/expiry.js +74 -0
- package/dist/infrastructure/persistence/postgres/flowFailures.d.ts +17 -0
- package/dist/infrastructure/persistence/postgres/flowFailures.js +199 -0
- package/dist/infrastructure/persistence/postgres/groupClaims.d.ts +15 -0
- package/dist/infrastructure/persistence/postgres/groupClaims.js +95 -0
- package/dist/infrastructure/persistence/postgres/groupSchema.d.ts +2 -0
- package/dist/infrastructure/persistence/postgres/groupSchema.js +155 -0
- package/dist/infrastructure/persistence/postgres/groupSchemaFingerprint.d.ts +3 -0
- package/dist/infrastructure/persistence/postgres/groupSchemaFingerprint.js +127 -0
- package/dist/infrastructure/persistence/postgres/groupStateRetention.d.ts +3 -0
- package/dist/infrastructure/persistence/postgres/groupStateRetention.js +93 -0
- package/dist/infrastructure/persistence/postgres/groups.d.ts +11 -0
- package/dist/infrastructure/persistence/postgres/groups.js +117 -0
- package/dist/infrastructure/persistence/postgres/jobData.d.ts +3 -0
- package/dist/infrastructure/persistence/postgres/jobData.js +32 -0
- package/dist/infrastructure/persistence/postgres/leaseRelease.d.ts +9 -0
- package/dist/infrastructure/persistence/postgres/leaseRelease.js +120 -0
- package/dist/infrastructure/persistence/postgres/leaseRenewal.d.ts +4 -0
- package/dist/infrastructure/persistence/postgres/leaseRenewal.js +35 -0
- package/dist/infrastructure/persistence/postgres/lifetimeMetrics.d.ts +15 -0
- package/dist/infrastructure/persistence/postgres/lifetimeMetrics.js +46 -0
- package/dist/infrastructure/persistence/postgres/lifetimeMetricsFinalizer.d.ts +4 -0
- package/dist/infrastructure/persistence/postgres/lifetimeMetricsFinalizer.js +13 -0
- package/dist/infrastructure/persistence/postgres/logs.d.ts +6 -0
- package/dist/infrastructure/persistence/postgres/logs.js +70 -0
- package/dist/infrastructure/persistence/postgres/maintenance.d.ts +6 -0
- package/dist/infrastructure/persistence/postgres/maintenance.js +138 -0
- package/dist/infrastructure/persistence/postgres/maintenanceFlights.d.ts +14 -0
- package/dist/infrastructure/persistence/postgres/maintenanceFlights.js +66 -0
- package/dist/infrastructure/persistence/postgres/metricWrites.d.ts +9 -0
- package/dist/infrastructure/persistence/postgres/metricWrites.js +94 -0
- package/dist/infrastructure/persistence/postgres/mutations.d.ts +9 -0
- package/dist/infrastructure/persistence/postgres/mutations.js +171 -0
- package/dist/infrastructure/persistence/postgres/outcomes.d.ts +4 -0
- package/dist/infrastructure/persistence/postgres/outcomes.js +194 -0
- package/dist/infrastructure/persistence/postgres/policies.d.ts +11 -0
- package/dist/infrastructure/persistence/postgres/policies.js +18 -0
- package/dist/infrastructure/persistence/postgres/postCommitMaintenance.d.ts +17 -0
- package/dist/infrastructure/persistence/postgres/postCommitMaintenance.js +117 -0
- package/dist/infrastructure/persistence/postgres/promotion.d.ts +3 -0
- package/dist/infrastructure/persistence/postgres/promotion.js +43 -0
- package/dist/infrastructure/persistence/postgres/queries.d.ts +22 -0
- package/dist/infrastructure/persistence/postgres/queries.js +152 -0
- package/dist/infrastructure/persistence/postgres/queueDestruction.d.ts +3 -0
- package/dist/infrastructure/persistence/postgres/queueDestruction.js +158 -0
- package/dist/infrastructure/persistence/postgres/queueLifecycle.d.ts +10 -0
- package/dist/infrastructure/persistence/postgres/queueLifecycle.js +60 -0
- package/dist/infrastructure/persistence/postgres/rateLimit.d.ts +6 -0
- package/dist/infrastructure/persistence/postgres/rateLimit.js +10 -0
- package/dist/infrastructure/persistence/postgres/readModels.d.ts +32 -0
- package/dist/infrastructure/persistence/postgres/readModels.js +72 -0
- package/dist/infrastructure/persistence/postgres/recovery.d.ts +3 -0
- package/dist/infrastructure/persistence/postgres/recovery.js +178 -0
- package/dist/infrastructure/persistence/postgres/relationships.d.ts +9 -0
- package/dist/infrastructure/persistence/postgres/relationships.js +201 -0
- package/dist/infrastructure/persistence/postgres/removeUnprocessedChildren.d.ts +4 -0
- package/dist/infrastructure/persistence/postgres/removeUnprocessedChildren.js +241 -0
- package/dist/infrastructure/persistence/postgres/repeatMutations.d.ts +5 -0
- package/dist/infrastructure/persistence/postgres/repeatMutations.js +37 -0
- package/dist/infrastructure/persistence/postgres/runtime.d.ts +45 -0
- package/dist/infrastructure/persistence/postgres/runtime.js +238 -0
- package/dist/infrastructure/persistence/postgres/runtimeConfig.d.ts +21 -0
- package/dist/infrastructure/persistence/postgres/runtimeConfig.js +39 -0
- package/dist/infrastructure/persistence/postgres/schema.d.ts +4 -0
- package/dist/infrastructure/persistence/postgres/schema.js +261 -0
- package/dist/infrastructure/persistence/postgres/schemaInitialization.d.ts +3 -0
- package/dist/infrastructure/persistence/postgres/schemaInitialization.js +226 -0
- package/dist/infrastructure/persistence/postgres/serialAdmission.d.ts +6 -0
- package/dist/infrastructure/persistence/postgres/serialAdmission.js +96 -0
- package/dist/infrastructure/persistence/postgres/snapshotBudget.d.ts +3 -0
- package/dist/infrastructure/persistence/postgres/snapshotBudget.js +83 -0
- package/dist/infrastructure/persistence/postgres/storageHealth.d.ts +10 -0
- package/dist/infrastructure/persistence/postgres/storageHealth.js +29 -0
- package/dist/infrastructure/persistence/postgres/store.d.ts +100 -0
- package/dist/infrastructure/persistence/postgres/store.js +180 -0
- package/dist/infrastructure/persistence/postgres/telemetry.d.ts +8 -0
- package/dist/infrastructure/persistence/postgres/telemetry.js +100 -0
- package/dist/infrastructure/persistence/postgres/terminal.d.ts +8 -0
- package/dist/infrastructure/persistence/postgres/terminal.js +137 -0
- package/dist/infrastructure/persistence/postgres/transactionRetry.d.ts +6 -0
- package/dist/infrastructure/persistence/postgres/transactionRetry.js +42 -0
- package/dist/infrastructure/persistence/postgres/types.d.ts +176 -0
- package/dist/infrastructure/persistence/postgres/types.js +1 -0
- package/dist/infrastructure/persistence/postgres/workers.d.ts +15 -0
- package/dist/infrastructure/persistence/postgres/workers.js +126 -0
- package/dist/infrastructure/persistence/postgres.d.ts +2 -0
- package/dist/infrastructure/persistence/postgres.js +1 -0
- package/dist/infrastructure/persistence/schema.d.ts +2 -2
- package/dist/infrastructure/persistence/schema.js +12 -1
- package/dist/infrastructure/persistence/sqlite/control.d.ts +14 -0
- package/dist/infrastructure/persistence/sqlite/control.js +69 -0
- package/dist/infrastructure/persistence/sqlite/jobs.d.ts +12 -0
- package/dist/infrastructure/persistence/sqlite/jobs.js +38 -0
- package/dist/infrastructure/persistence/sqlite/telemetry.d.ts +2 -1
- package/dist/infrastructure/persistence/sqlite/telemetry.js +5 -64
- package/dist/infrastructure/persistence/sqlite/telemetryWrites.d.ts +4 -0
- package/dist/infrastructure/persistence/sqlite/telemetryWrites.js +123 -0
- package/dist/infrastructure/persistence/sqliteSerializer.js +2 -0
- package/dist/infrastructure/scheduler/cron/persisted.d.ts +5 -0
- package/dist/infrastructure/scheduler/cron/persisted.js +27 -0
- package/dist/infrastructure/scheduler/cron/runtime.js +5 -10
- package/dist/infrastructure/scheduler/cron/validation.d.ts +3 -0
- package/dist/infrastructure/scheduler/cron/validation.js +11 -0
- package/dist/infrastructure/scheduler/cronParser.d.ts +1 -1
- package/dist/infrastructure/scheduler/cronParser.js +144 -11
- package/dist/infrastructure/server/bootstrap.d.ts +2 -3
- package/dist/infrastructure/server/bootstrap.js +33 -59
- package/dist/infrastructure/server/errors.d.ts +4 -0
- package/dist/infrastructure/server/errors.js +54 -0
- package/dist/infrastructure/server/handler-routes/control.d.ts +5 -5
- package/dist/infrastructure/server/handler-routes/control.js +16 -1
- package/dist/infrastructure/server/handler-routes/monitoring.d.ts +2 -2
- package/dist/infrastructure/server/handler.js +9 -11
- package/dist/infrastructure/server/handlers/advanced/dependencies.js +7 -6
- package/dist/infrastructure/server/handlers/advanced/jobs.js +19 -6
- package/dist/infrastructure/server/handlers/advanced/queue.d.ts +9 -9
- package/dist/infrastructure/server/handlers/advanced/queue.js +91 -27
- package/dist/infrastructure/server/handlers/core.d.ts +0 -5
- package/dist/infrastructure/server/handlers/core.js +47 -49
- package/dist/infrastructure/server/handlers/cron.d.ts +4 -4
- package/dist/infrastructure/server/handlers/cron.js +60 -59
- package/dist/infrastructure/server/handlers/dashboard.d.ts +1 -1
- package/dist/infrastructure/server/handlers/dashboard.js +21 -8
- package/dist/infrastructure/server/handlers/dlq.d.ts +6 -3
- package/dist/infrastructure/server/handlers/dlq.js +35 -9
- package/dist/infrastructure/server/handlers/flow.js +2 -1
- package/dist/infrastructure/server/handlers/groups.d.ts +11 -0
- package/dist/infrastructure/server/handlers/groups.js +55 -0
- package/dist/infrastructure/server/handlers/management.d.ts +5 -5
- package/dist/infrastructure/server/handlers/management.js +36 -9
- package/dist/infrastructure/server/handlers/monitoring/health.d.ts +5 -5
- package/dist/infrastructure/server/handlers/monitoring/health.js +45 -16
- package/dist/infrastructure/server/handlers/monitoring/operations.d.ts +1 -1
- package/dist/infrastructure/server/handlers/monitoring/operations.js +8 -1
- package/dist/infrastructure/server/handlers/monitoring/workers.d.ts +3 -3
- package/dist/infrastructure/server/handlers/monitoring/workers.js +31 -7
- package/dist/infrastructure/server/handlers/pushBatchValidation.d.ts +3 -1
- package/dist/infrastructure/server/handlers/pushBatchValidation.js +56 -8
- package/dist/infrastructure/server/handlers/query.d.ts +1 -1
- package/dist/infrastructure/server/handlers/query.js +5 -4
- package/dist/infrastructure/server/http.js +2 -2
- package/dist/infrastructure/server/httpDashboardEndpoints.d.ts +1 -1
- package/dist/infrastructure/server/httpDashboardEndpoints.js +19 -6
- package/dist/infrastructure/server/httpEndpoints.js +18 -7
- package/dist/infrastructure/server/httpRouteQueues.js +11 -1
- package/dist/infrastructure/server/protocol/validation.d.ts +1 -0
- package/dist/infrastructure/server/protocol/validation.js +1 -0
- package/dist/infrastructure/server/protocol.d.ts +1 -1
- package/dist/infrastructure/server/protocol.js +1 -1
- package/dist/infrastructure/server/shutdownCoordinator.d.ts +24 -0
- package/dist/infrastructure/server/shutdownCoordinator.js +106 -0
- package/dist/infrastructure/server/sseHandler.js +8 -3
- package/dist/infrastructure/server/storageAdapter.d.ts +29 -0
- package/dist/infrastructure/server/storageAdapter.js +61 -0
- package/dist/infrastructure/server/storageManager.d.ts +12 -0
- package/dist/infrastructure/server/storageManager.js +102 -0
- package/dist/infrastructure/server/tcp.js +2 -3
- package/dist/infrastructure/server/ws/snapshots.d.ts +1 -1
- package/dist/infrastructure/server/ws/snapshots.js +19 -4
- package/dist/infrastructure/server/wsHandler.js +10 -5
- package/dist/main.js +1 -1
- package/dist/mcp/backend/embedded/services.js +2 -1
- package/dist/mcp/index.d.ts +2 -2
- package/dist/mcp/index.js +2 -2
- package/dist/shared/storageHealth.d.ts +9 -0
- package/dist/shared/storageHealth.js +12 -0
- package/package.json +75 -65
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import { type DlqEntry, type DlqFilter, type DlqStats } from '../../domain/types/dlq';
|
|
2
|
+
import type { Job, JobId } from '../../domain/types/job';
|
|
3
|
+
import { PostgresQueueManagerGroupQueries } from './groupQueries';
|
|
4
|
+
export declare class PostgresQueueManagerQueries extends PostgresQueueManagerGroupQueries {
|
|
5
|
+
getJobIndex(): Map<JobId, import("../../domain/types").JobLocation>;
|
|
6
|
+
getCompletedJobs(): Set<JobId>;
|
|
7
|
+
getDepCompletions(): Set<JobId>;
|
|
8
|
+
getJob(jobId: JobId): Promise<Job | null>;
|
|
9
|
+
getJobState(jobId: JobId): Promise<string>;
|
|
10
|
+
getResult(jobId: JobId): unknown;
|
|
11
|
+
getCompletionAsync(jobId: JobId): Promise<{
|
|
12
|
+
found: boolean;
|
|
13
|
+
result: unknown;
|
|
14
|
+
}>;
|
|
15
|
+
getResultAsync(jobId: JobId): Promise<unknown>;
|
|
16
|
+
waitForJobCompletion(jobId: JobId, timeoutMs: number): Promise<boolean>;
|
|
17
|
+
getChildrenValues(parentJobId: JobId): Promise<Record<string, unknown>>;
|
|
18
|
+
getJobByCustomId(customId: string): Job | null;
|
|
19
|
+
getProgress(jobId: JobId): {
|
|
20
|
+
progress: number;
|
|
21
|
+
message: string | null;
|
|
22
|
+
} | null;
|
|
23
|
+
getJobs(queue: string, options?: {
|
|
24
|
+
state?: string | string[];
|
|
25
|
+
start?: number;
|
|
26
|
+
end?: number;
|
|
27
|
+
asc?: boolean;
|
|
28
|
+
}): Job[];
|
|
29
|
+
count(queue: string): number;
|
|
30
|
+
listQueues(): string[];
|
|
31
|
+
getCountsPerPriority(queue: string): Record<number, number>;
|
|
32
|
+
getDlq(queue: string, count?: number): Job[];
|
|
33
|
+
getDlqEntries(queue: string, filter?: DlqFilter): DlqEntry[];
|
|
34
|
+
getDlqCount(queue: string): number;
|
|
35
|
+
getDlqStats(queue: string): DlqStats;
|
|
36
|
+
isPaused(queue: string): boolean;
|
|
37
|
+
isPausedDurable(queue: string): Promise<boolean>;
|
|
38
|
+
getQueueLimits(queue: string): {
|
|
39
|
+
rateLimit: number | null;
|
|
40
|
+
concurrencyLimit: number | null;
|
|
41
|
+
};
|
|
42
|
+
getQueueLimitStatus(queue: string, _maxJobs?: number): {
|
|
43
|
+
rateLimit: {
|
|
44
|
+
max: number;
|
|
45
|
+
duration: number;
|
|
46
|
+
} | null;
|
|
47
|
+
rateLimitTtl: number;
|
|
48
|
+
concurrencyLimit: number | null;
|
|
49
|
+
maxed: boolean;
|
|
50
|
+
};
|
|
51
|
+
getQueueJobCounts(queueName: string): {
|
|
52
|
+
waiting: number;
|
|
53
|
+
prioritized: number;
|
|
54
|
+
delayed: number;
|
|
55
|
+
active: number;
|
|
56
|
+
completed: number;
|
|
57
|
+
failed: number;
|
|
58
|
+
'waiting-children': number;
|
|
59
|
+
totalCompleted: number;
|
|
60
|
+
totalFailed: number;
|
|
61
|
+
};
|
|
62
|
+
getQueueJobCountsBatch(queueNames: Iterable<string>): Map<string, {
|
|
63
|
+
waiting: number;
|
|
64
|
+
prioritized: number;
|
|
65
|
+
delayed: number;
|
|
66
|
+
active: number;
|
|
67
|
+
completed: number;
|
|
68
|
+
failed: number;
|
|
69
|
+
'waiting-children': number;
|
|
70
|
+
totalCompleted: number;
|
|
71
|
+
totalFailed: number;
|
|
72
|
+
}>;
|
|
73
|
+
getAllQueueJobCounts(): Map<string, {
|
|
74
|
+
waiting: number;
|
|
75
|
+
prioritized: number;
|
|
76
|
+
delayed: number;
|
|
77
|
+
active: number;
|
|
78
|
+
completed: number;
|
|
79
|
+
failed: number;
|
|
80
|
+
'waiting-children': number;
|
|
81
|
+
totalCompleted: number;
|
|
82
|
+
totalFailed: number;
|
|
83
|
+
}>;
|
|
84
|
+
getPerQueueStats(): Map<string, {
|
|
85
|
+
waiting: number;
|
|
86
|
+
prioritized: number;
|
|
87
|
+
delayed: number;
|
|
88
|
+
active: number;
|
|
89
|
+
dlq: number;
|
|
90
|
+
}>;
|
|
91
|
+
getStats(): {
|
|
92
|
+
waiting: number;
|
|
93
|
+
prioritized: number;
|
|
94
|
+
delayed: number;
|
|
95
|
+
active: number;
|
|
96
|
+
dlq: number;
|
|
97
|
+
completed: number;
|
|
98
|
+
'waiting-children': number;
|
|
99
|
+
totalPushed: bigint;
|
|
100
|
+
totalPulled: bigint;
|
|
101
|
+
totalCompleted: bigint;
|
|
102
|
+
totalFailed: bigint;
|
|
103
|
+
uptime: number;
|
|
104
|
+
cronJobs: number;
|
|
105
|
+
cronPending: number;
|
|
106
|
+
};
|
|
107
|
+
getQueuesSummary(): {
|
|
108
|
+
name: string;
|
|
109
|
+
paused: boolean;
|
|
110
|
+
counts: {
|
|
111
|
+
waiting: number;
|
|
112
|
+
prioritized: number;
|
|
113
|
+
active: number;
|
|
114
|
+
completed: number;
|
|
115
|
+
failed: number;
|
|
116
|
+
delayed: number;
|
|
117
|
+
};
|
|
118
|
+
}[];
|
|
119
|
+
getStorageStatus(): {
|
|
120
|
+
diskFull: boolean;
|
|
121
|
+
error: string | null;
|
|
122
|
+
since: number | null;
|
|
123
|
+
};
|
|
124
|
+
getMemoryStats(): {
|
|
125
|
+
jobIndex: number;
|
|
126
|
+
completedJobs: number;
|
|
127
|
+
jobResults: number;
|
|
128
|
+
jobLogs: number;
|
|
129
|
+
customIdMap: number;
|
|
130
|
+
jobLocks: number;
|
|
131
|
+
clientJobs: number;
|
|
132
|
+
clientJobsTotal: number;
|
|
133
|
+
pendingDepChecks: number;
|
|
134
|
+
stalledCandidates: number;
|
|
135
|
+
processingTotal: number;
|
|
136
|
+
queuedTotal: number;
|
|
137
|
+
waitingDepsTotal: number;
|
|
138
|
+
temporalIndexTotal: number;
|
|
139
|
+
delayedHeapTotal: number;
|
|
140
|
+
};
|
|
141
|
+
flushPersistence(): number;
|
|
142
|
+
}
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
import { PostgresQueueManagerGroupQueries } from './groupQueries';
|
|
2
|
+
function jobCounts(counts, totals) {
|
|
3
|
+
return {
|
|
4
|
+
waiting: counts.waiting,
|
|
5
|
+
prioritized: counts.prioritized,
|
|
6
|
+
delayed: counts.delayed,
|
|
7
|
+
active: counts.active,
|
|
8
|
+
completed: counts.completed,
|
|
9
|
+
failed: counts.failed,
|
|
10
|
+
'waiting-children': counts.waitingChildren,
|
|
11
|
+
totalCompleted: Number(totals?.totalCompleted ?? 0n),
|
|
12
|
+
totalFailed: Number(totals?.totalFailed ?? 0n),
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
export class PostgresQueueManagerQueries extends PostgresQueueManagerGroupQueries {
|
|
16
|
+
getJobIndex() {
|
|
17
|
+
return this.postgresSnapshot.locations();
|
|
18
|
+
}
|
|
19
|
+
getCompletedJobs() {
|
|
20
|
+
return this.postgresSnapshot.completedIds();
|
|
21
|
+
}
|
|
22
|
+
getDepCompletions() {
|
|
23
|
+
return this.postgresSnapshot.completionIds();
|
|
24
|
+
}
|
|
25
|
+
async getJob(jobId) {
|
|
26
|
+
return await this.runPostgresOperation(async () => {
|
|
27
|
+
await this.postgresReady;
|
|
28
|
+
const row = await this.fetchPostgresJob(jobId);
|
|
29
|
+
return row?.job ?? null;
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
async getJobState(jobId) {
|
|
33
|
+
return await this.runPostgresOperation(async () => {
|
|
34
|
+
await this.postgresReady;
|
|
35
|
+
const row = await this.fetchPostgresJob(jobId);
|
|
36
|
+
return row?.state ?? 'unknown';
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
getResult(jobId) {
|
|
40
|
+
return this.postgresSnapshot.getResult(jobId);
|
|
41
|
+
}
|
|
42
|
+
async getCompletionAsync(jobId) {
|
|
43
|
+
return await this.runPostgresOperation(async () => {
|
|
44
|
+
await this.postgresReady;
|
|
45
|
+
return await this.postgresStore.getResult(jobId);
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
async getResultAsync(jobId) {
|
|
49
|
+
return (await this.getCompletionAsync(jobId)).result;
|
|
50
|
+
}
|
|
51
|
+
async waitForJobCompletion(jobId, timeoutMs) {
|
|
52
|
+
const controller = new AbortController();
|
|
53
|
+
const waiting = super.waitForJobCompletion(jobId, timeoutMs, controller.signal);
|
|
54
|
+
try {
|
|
55
|
+
const completed = (await this.getCompletionAsync(jobId)).found;
|
|
56
|
+
return completed || (await waiting);
|
|
57
|
+
}
|
|
58
|
+
finally {
|
|
59
|
+
controller.abort();
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
async getChildrenValues(parentJobId) {
|
|
63
|
+
return await this.runPostgresOperation(async () => {
|
|
64
|
+
await this.postgresReady;
|
|
65
|
+
return await this.postgresStore.getChildrenValues(parentJobId);
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
getJobByCustomId(customId) {
|
|
69
|
+
return this.postgresSnapshot.getByCustomId(customId);
|
|
70
|
+
}
|
|
71
|
+
getProgress(jobId) {
|
|
72
|
+
const row = this.postgresSnapshot.get(jobId);
|
|
73
|
+
if (row?.state !== 'active')
|
|
74
|
+
return null;
|
|
75
|
+
return { progress: row.job.progress, message: row.job.progressMessage };
|
|
76
|
+
}
|
|
77
|
+
getJobs(queue, options = {}) {
|
|
78
|
+
return this.postgresSnapshot.list(queue, options);
|
|
79
|
+
}
|
|
80
|
+
count(queue) {
|
|
81
|
+
const counts = this.postgresSnapshot.counts(queue);
|
|
82
|
+
return counts.waiting + counts.prioritized + counts.delayed;
|
|
83
|
+
}
|
|
84
|
+
listQueues() {
|
|
85
|
+
return this.postgresSnapshot.queueNames();
|
|
86
|
+
}
|
|
87
|
+
getCountsPerPriority(queue) {
|
|
88
|
+
return this.postgresSnapshot.priorities(queue);
|
|
89
|
+
}
|
|
90
|
+
getDlq(queue, count) {
|
|
91
|
+
return this.postgresSnapshot
|
|
92
|
+
.dlq(queue, count === undefined ? undefined : { limit: count })
|
|
93
|
+
.map((entry) => entry.job);
|
|
94
|
+
}
|
|
95
|
+
getDlqEntries(queue, filter) {
|
|
96
|
+
return this.postgresSnapshot.dlq(queue, filter);
|
|
97
|
+
}
|
|
98
|
+
getDlqCount(queue) {
|
|
99
|
+
return this.postgresSnapshot.counts(queue).failed;
|
|
100
|
+
}
|
|
101
|
+
getDlqStats(queue) {
|
|
102
|
+
const entries = this.postgresSnapshot.dlq(queue);
|
|
103
|
+
const now = Date.now();
|
|
104
|
+
const byReason = {
|
|
105
|
+
["explicit_fail" /* FailureReason.ExplicitFail */]: 0,
|
|
106
|
+
["max_attempts_exceeded" /* FailureReason.MaxAttemptsExceeded */]: 0,
|
|
107
|
+
["timeout" /* FailureReason.Timeout */]: 0,
|
|
108
|
+
["stalled" /* FailureReason.Stalled */]: 0,
|
|
109
|
+
["ttl_expired" /* FailureReason.TtlExpired */]: 0,
|
|
110
|
+
["worker_lost" /* FailureReason.WorkerLost */]: 0,
|
|
111
|
+
["unknown" /* FailureReason.Unknown */]: 0,
|
|
112
|
+
};
|
|
113
|
+
for (const entry of entries)
|
|
114
|
+
byReason[entry.reason]++;
|
|
115
|
+
return {
|
|
116
|
+
total: entries.length,
|
|
117
|
+
byReason,
|
|
118
|
+
byQueue: { [queue]: entries.length },
|
|
119
|
+
pendingRetry: entries.filter((entry) => entry.nextRetryAt !== null && entry.nextRetryAt <= now).length,
|
|
120
|
+
expired: entries.filter((entry) => entry.expiresAt !== null && entry.expiresAt <= now).length,
|
|
121
|
+
oldestEntry: entries.length === 0 ? null : Math.min(...entries.map((entry) => entry.enteredAt)),
|
|
122
|
+
newestEntry: entries.length === 0 ? null : Math.max(...entries.map((entry) => entry.enteredAt)),
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
isPaused(queue) {
|
|
126
|
+
return this.postgresSnapshot.queueState(queue)?.paused ?? false;
|
|
127
|
+
}
|
|
128
|
+
async isPausedDurable(queue) {
|
|
129
|
+
return await this.runPostgresOperation(async () => {
|
|
130
|
+
await this.postgresReady;
|
|
131
|
+
return (await this.postgresStore.getQueueState(queue)).paused;
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
getQueueLimits(queue) {
|
|
135
|
+
const state = this.postgresSnapshot.queueState(queue);
|
|
136
|
+
const rateExpired = state?.rateExpiresAt !== null && (state?.rateExpiresAt ?? 0) <= Date.now();
|
|
137
|
+
return {
|
|
138
|
+
rateLimit: rateExpired ? null : (state?.rateLimit ?? null),
|
|
139
|
+
concurrencyLimit: state?.concurrencyLimit ?? null,
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
getQueueLimitStatus(queue, _maxJobs) {
|
|
143
|
+
const state = this.postgresSnapshot.queueState(queue);
|
|
144
|
+
const active = this.postgresSnapshot.counts(queue).active;
|
|
145
|
+
const concurrencyLimit = state?.concurrencyLimit ?? null;
|
|
146
|
+
const duration = state?.rateDurationMs ?? 1000;
|
|
147
|
+
const rateExpired = state?.rateExpiresAt !== null && (state?.rateExpiresAt ?? 0) <= Date.now();
|
|
148
|
+
const rateLimitTtl = state?.rateWindowStartedAt
|
|
149
|
+
? Math.max(0, state.rateWindowStartedAt + duration - Date.now())
|
|
150
|
+
: 0;
|
|
151
|
+
return {
|
|
152
|
+
rateLimit: rateExpired || state?.rateLimit === null || state?.rateLimit === undefined
|
|
153
|
+
? null
|
|
154
|
+
: { max: state.rateLimit, duration },
|
|
155
|
+
rateLimitTtl,
|
|
156
|
+
concurrencyLimit,
|
|
157
|
+
maxed: concurrencyLimit !== null && active >= concurrencyLimit,
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
getQueueJobCounts(queueName) {
|
|
161
|
+
return jobCounts(this.postgresSnapshot.counts(queueName), this.perQueueMetrics.get(queueName));
|
|
162
|
+
}
|
|
163
|
+
getQueueJobCountsBatch(queueNames) {
|
|
164
|
+
return new Map([...queueNames].map((queue) => [queue, this.getQueueJobCounts(queue)]));
|
|
165
|
+
}
|
|
166
|
+
getAllQueueJobCounts() {
|
|
167
|
+
return this.getQueueJobCountsBatch(this.listQueues());
|
|
168
|
+
}
|
|
169
|
+
getPerQueueStats() {
|
|
170
|
+
return new Map(this.listQueues().map((queue) => {
|
|
171
|
+
const counts = this.postgresSnapshot.counts(queue);
|
|
172
|
+
return [
|
|
173
|
+
queue,
|
|
174
|
+
{
|
|
175
|
+
waiting: counts.waiting,
|
|
176
|
+
prioritized: counts.prioritized,
|
|
177
|
+
delayed: counts.delayed,
|
|
178
|
+
active: counts.active,
|
|
179
|
+
dlq: counts.failed,
|
|
180
|
+
},
|
|
181
|
+
];
|
|
182
|
+
}));
|
|
183
|
+
}
|
|
184
|
+
getStats() {
|
|
185
|
+
const counts = this.postgresSnapshot.counts();
|
|
186
|
+
const cron = this.cronScheduler.getStats();
|
|
187
|
+
return {
|
|
188
|
+
waiting: counts.waiting,
|
|
189
|
+
prioritized: counts.prioritized,
|
|
190
|
+
delayed: counts.delayed,
|
|
191
|
+
active: counts.active,
|
|
192
|
+
dlq: counts.failed,
|
|
193
|
+
completed: counts.completed,
|
|
194
|
+
'waiting-children': counts.waitingChildren,
|
|
195
|
+
totalPushed: this.metrics.totalPushed.value,
|
|
196
|
+
totalPulled: this.metrics.totalPulled.value,
|
|
197
|
+
totalCompleted: this.metrics.totalCompleted.value,
|
|
198
|
+
totalFailed: this.metrics.totalFailed.value,
|
|
199
|
+
uptime: Date.now() - this.startTime,
|
|
200
|
+
cronJobs: cron.total,
|
|
201
|
+
cronPending: cron.pending,
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
getQueuesSummary() {
|
|
205
|
+
return this.listQueues().map((name) => {
|
|
206
|
+
const counts = this.postgresSnapshot.counts(name);
|
|
207
|
+
return {
|
|
208
|
+
name,
|
|
209
|
+
paused: this.isPaused(name),
|
|
210
|
+
counts: {
|
|
211
|
+
waiting: counts.waiting,
|
|
212
|
+
prioritized: counts.prioritized,
|
|
213
|
+
active: counts.active,
|
|
214
|
+
completed: counts.completed,
|
|
215
|
+
failed: counts.failed,
|
|
216
|
+
delayed: counts.delayed,
|
|
217
|
+
},
|
|
218
|
+
};
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
getStorageStatus() {
|
|
222
|
+
const health = this.postgresStore.health();
|
|
223
|
+
return { diskFull: false, error: health.error, since: health.since };
|
|
224
|
+
}
|
|
225
|
+
getMemoryStats() {
|
|
226
|
+
return { ...super.getMemoryStats(), jobIndex: this.postgresSnapshot.size() };
|
|
227
|
+
}
|
|
228
|
+
flushPersistence() {
|
|
229
|
+
return 0;
|
|
230
|
+
}
|
|
231
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { JobId } from '../../domain/types/job';
|
|
2
|
+
import { PostgresQueueManagerLease } from './lease';
|
|
3
|
+
/** PostgreSQL-backed parent/child relationship mutations. */
|
|
4
|
+
export declare class PostgresQueueManagerRelationships extends PostgresQueueManagerLease {
|
|
5
|
+
getFailedChildrenValues(parentId: JobId): Promise<Record<string, string>>;
|
|
6
|
+
getIgnoredChildrenFailures(parentId: JobId): Promise<Record<string, string>>;
|
|
7
|
+
updateJobParent(childId: JobId, parentId: JobId): Promise<void>;
|
|
8
|
+
removeChildDependency(childId: JobId): Promise<boolean>;
|
|
9
|
+
removeUnprocessedChildren(parentId: JobId): Promise<void>;
|
|
10
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { PostgresQueueManagerLease } from './lease';
|
|
2
|
+
/** PostgreSQL-backed parent/child relationship mutations. */
|
|
3
|
+
export class PostgresQueueManagerRelationships extends PostgresQueueManagerLease {
|
|
4
|
+
async getFailedChildrenValues(parentId) {
|
|
5
|
+
return await this.runPostgresOperation(async () => {
|
|
6
|
+
await this.postgresReady;
|
|
7
|
+
return await this.postgresStore.getFailedChildrenValues(parentId);
|
|
8
|
+
});
|
|
9
|
+
}
|
|
10
|
+
async getIgnoredChildrenFailures(parentId) {
|
|
11
|
+
return await this.runPostgresOperation(async () => {
|
|
12
|
+
await this.postgresReady;
|
|
13
|
+
return await this.postgresStore.getIgnoredChildrenFailures(parentId);
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
async updateJobParent(childId, parentId) {
|
|
17
|
+
return await this.runPostgresOperation(async () => {
|
|
18
|
+
await this.postgresReady;
|
|
19
|
+
await this.postgresStore.updateParent(childId, parentId);
|
|
20
|
+
await Promise.all([this.refreshJob(childId), this.refreshJob(parentId)]);
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
async removeChildDependency(childId) {
|
|
24
|
+
return await this.runPostgresOperation(async () => {
|
|
25
|
+
await this.postgresReady;
|
|
26
|
+
const child = await this.postgresStore.getJob(childId);
|
|
27
|
+
const parentId = child?.job.parentId ?? null;
|
|
28
|
+
const removed = await this.postgresStore.removeDependency(childId);
|
|
29
|
+
if (removed) {
|
|
30
|
+
await this.refreshJob(childId);
|
|
31
|
+
if (parentId)
|
|
32
|
+
await this.refreshJob(parentId);
|
|
33
|
+
}
|
|
34
|
+
return removed;
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
async removeUnprocessedChildren(parentId) {
|
|
38
|
+
return await this.runPostgresOperation(async () => {
|
|
39
|
+
await this.postgresReady;
|
|
40
|
+
const removed = await this.postgresStore.removeUnprocessedChildren(parentId);
|
|
41
|
+
if (removed.length > 0)
|
|
42
|
+
await this.refreshJobs([parentId, ...removed]);
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { CronJob, CronJobInput } from '../../domain/types/cron';
|
|
2
|
+
import type { JobId } from '../../domain/types/job';
|
|
3
|
+
import type { QueueMetrics, QueueMetricType } from '../../domain/types/metrics';
|
|
4
|
+
import type { CreateWorkerOptions, Worker } from '../../domain/types/worker';
|
|
5
|
+
import { PostgresQueueManagerControl } from './control';
|
|
6
|
+
/** Durable PostgreSQL-backed broker services shared across every broker instance. */
|
|
7
|
+
export declare class PostgresQueueManagerServices extends PostgresQueueManagerControl {
|
|
8
|
+
registerWorker(name: string, queues: string[], concurrency?: number, options?: CreateWorkerOptions): Worker;
|
|
9
|
+
registerWorkerDurable(name: string, queues: string[], concurrency?: number, options?: CreateWorkerOptions): Promise<Worker>;
|
|
10
|
+
unregisterWorker(id: string): boolean;
|
|
11
|
+
unregisterWorkerDurable(id: string, clientId?: string): Promise<boolean>;
|
|
12
|
+
unregisterWorkersByClientId(clientId: string): number;
|
|
13
|
+
heartbeatWorkerDurable(id: string, stats?: {
|
|
14
|
+
activeJobs?: number;
|
|
15
|
+
processed?: number;
|
|
16
|
+
failed?: number;
|
|
17
|
+
}, clientId?: string): Promise<boolean>;
|
|
18
|
+
listWorkersDurable(): Promise<Worker[]>;
|
|
19
|
+
findMissingDependenciesDurable(ids: readonly JobId[]): Promise<JobId[]>;
|
|
20
|
+
addCron(input: CronJobInput): CronJob;
|
|
21
|
+
addCronDurable(input: CronJobInput): Promise<CronJob>;
|
|
22
|
+
removeCron(name: string): boolean;
|
|
23
|
+
removeCronDurable(name: string): Promise<boolean>;
|
|
24
|
+
getCronDurable(name: string): Promise<CronJob | undefined>;
|
|
25
|
+
listCronsDurable(): Promise<CronJob[]>;
|
|
26
|
+
addLogDurable(id: JobId, message: string, level?: 'info' | 'warn' | 'error'): Promise<boolean>;
|
|
27
|
+
getLogsDurable(id: JobId): Promise<import("../../domain/types/worker").JobLogEntry[]>;
|
|
28
|
+
clearLogsDurable(id: JobId, keepLogs?: number): Promise<void>;
|
|
29
|
+
getQueueMetricsDurable(queue: string, type: QueueMetricType, start?: number, end?: number): Promise<QueueMetrics>;
|
|
30
|
+
trimQueueEventsDurable(queue: string, maxLength: number): Promise<number>;
|
|
31
|
+
}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import { PostgresQueueManagerControl } from './control';
|
|
2
|
+
/** Durable PostgreSQL-backed broker services shared across every broker instance. */
|
|
3
|
+
export class PostgresQueueManagerServices extends PostgresQueueManagerControl {
|
|
4
|
+
registerWorker(name, queues, concurrency, options) {
|
|
5
|
+
return this.operations.runSync(() => {
|
|
6
|
+
const worker = super.registerWorker(name, queues, concurrency, options);
|
|
7
|
+
this.enqueueWrite(() => this.postgresStore.saveWorker(worker));
|
|
8
|
+
return worker;
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
async registerWorkerDurable(name, queues, concurrency, options) {
|
|
12
|
+
return await this.runPostgresOperation(async () => {
|
|
13
|
+
await this.postgresReady;
|
|
14
|
+
const worker = super.registerWorker(name, queues, concurrency, options);
|
|
15
|
+
try {
|
|
16
|
+
await this.postgresStore.saveWorker(worker);
|
|
17
|
+
return worker;
|
|
18
|
+
}
|
|
19
|
+
catch (error) {
|
|
20
|
+
super.unregisterWorker(worker.id);
|
|
21
|
+
throw error;
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
unregisterWorker(id) {
|
|
26
|
+
const admitted = this.operations.tryRunSync(() => {
|
|
27
|
+
const removed = super.unregisterWorker(id);
|
|
28
|
+
this.enqueueWrite(() => this.postgresStore.removeWorker(id).then(() => undefined));
|
|
29
|
+
return removed;
|
|
30
|
+
});
|
|
31
|
+
return admitted.accepted ? admitted.value : super.unregisterWorker(id);
|
|
32
|
+
}
|
|
33
|
+
async unregisterWorkerDurable(id, clientId) {
|
|
34
|
+
return await this.runPostgresOperation(async () => {
|
|
35
|
+
await this.postgresReady;
|
|
36
|
+
const removed = await this.postgresStore.removeWorker(id, clientId);
|
|
37
|
+
super.unregisterWorker(id);
|
|
38
|
+
return removed;
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
unregisterWorkersByClientId(clientId) {
|
|
42
|
+
const admitted = this.operations.tryRunSync(() => {
|
|
43
|
+
const removed = super.unregisterWorkersByClientId(clientId);
|
|
44
|
+
this.enqueueWrite(() => this.postgresStore.removeClientWorkers(clientId).then(() => undefined));
|
|
45
|
+
return removed;
|
|
46
|
+
});
|
|
47
|
+
return admitted.accepted ? admitted.value : super.unregisterWorkersByClientId(clientId);
|
|
48
|
+
}
|
|
49
|
+
async heartbeatWorkerDurable(id, stats, clientId) {
|
|
50
|
+
return await this.runPostgresOperation(async () => {
|
|
51
|
+
await this.postgresReady;
|
|
52
|
+
const updated = await this.postgresStore.heartbeatWorker(id, stats, clientId);
|
|
53
|
+
if (updated)
|
|
54
|
+
this.workerManager.heartbeat(id, stats);
|
|
55
|
+
return updated;
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
async listWorkersDurable() {
|
|
59
|
+
return await this.runPostgresOperation(async () => {
|
|
60
|
+
await this.postgresReady;
|
|
61
|
+
return await this.postgresStore.listWorkers();
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
async findMissingDependenciesDurable(ids) {
|
|
65
|
+
return await this.runPostgresOperation(async () => {
|
|
66
|
+
await this.postgresReady;
|
|
67
|
+
return await this.postgresStore.findMissingDependencies(ids);
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
addCron(input) {
|
|
71
|
+
return this.operations.runSync(() => {
|
|
72
|
+
const cron = this.cronScheduler.add(input);
|
|
73
|
+
this.enqueueWrite(async () => {
|
|
74
|
+
const stored = await this.postgresStore.addCron(input);
|
|
75
|
+
cron.executions = stored.executions;
|
|
76
|
+
cron.nextRun = stored.nextRun;
|
|
77
|
+
});
|
|
78
|
+
return cron;
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
async addCronDurable(input) {
|
|
82
|
+
return await this.runPostgresOperation(async () => {
|
|
83
|
+
await this.postgresReady;
|
|
84
|
+
const stored = await this.postgresStore.addCron(input);
|
|
85
|
+
const local = this.cronScheduler.add(input);
|
|
86
|
+
local.executions = stored.executions;
|
|
87
|
+
local.nextRun = stored.nextRun;
|
|
88
|
+
return stored;
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
removeCron(name) {
|
|
92
|
+
return this.operations.runSync(() => {
|
|
93
|
+
const removed = this.cronScheduler.remove(name);
|
|
94
|
+
this.enqueueWrite(() => this.postgresStore.removeCron(name).then(() => undefined));
|
|
95
|
+
return removed;
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
async removeCronDurable(name) {
|
|
99
|
+
return await this.runPostgresOperation(async () => {
|
|
100
|
+
await this.postgresReady;
|
|
101
|
+
const removed = await this.postgresStore.removeCron(name);
|
|
102
|
+
if (removed)
|
|
103
|
+
this.cronScheduler.remove(name);
|
|
104
|
+
return removed;
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
async getCronDurable(name) {
|
|
108
|
+
return await this.runPostgresOperation(async () => {
|
|
109
|
+
await this.postgresReady;
|
|
110
|
+
return await this.postgresStore.getCron(name);
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
async listCronsDurable() {
|
|
114
|
+
return await this.runPostgresOperation(async () => {
|
|
115
|
+
await this.postgresReady;
|
|
116
|
+
return await this.postgresStore.listCrons();
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
async addLogDurable(id, message, level = 'info') {
|
|
120
|
+
return await this.runPostgresOperation(async () => {
|
|
121
|
+
await this.postgresReady;
|
|
122
|
+
return await this.postgresStore.addLog(id, message, level);
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
async getLogsDurable(id) {
|
|
126
|
+
return await this.runPostgresOperation(async () => {
|
|
127
|
+
await this.postgresReady;
|
|
128
|
+
return await this.postgresStore.getLogs(id);
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
async clearLogsDurable(id, keepLogs) {
|
|
132
|
+
return await this.runPostgresOperation(async () => {
|
|
133
|
+
await this.postgresReady;
|
|
134
|
+
await this.postgresStore.clearLogs(id, keepLogs);
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
async getQueueMetricsDurable(queue, type, start = 0, end = -1) {
|
|
138
|
+
return await this.runPostgresOperation(async () => {
|
|
139
|
+
await this.postgresReady;
|
|
140
|
+
return await this.postgresStore.getQueueMetrics(queue, type, start, end);
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
async trimQueueEventsDurable(queue, maxLength) {
|
|
144
|
+
return await this.runPostgresOperation(async () => {
|
|
145
|
+
await this.postgresReady;
|
|
146
|
+
return await this.postgresStore.trimQueueEvents(queue, maxLength);
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import type { DlqEntry, DlqFilter } from '../../domain/types/dlq';
|
|
2
|
+
import type { Job, JobId } from '../../domain/types/job';
|
|
3
|
+
import type { JobLocation } from '../../domain/types/queue';
|
|
4
|
+
import type { ClaimedPostgresJob, PostgresCompletionResult, PostgresCounts, PostgresJobState, PostgresQueueState, PostgresStoredJob, PostgresStoreEvent } from '../../infrastructure/persistence/postgres';
|
|
5
|
+
/** Eventually-consistent read model; PostgreSQL remains authoritative for every transition. */
|
|
6
|
+
export declare class PostgresQueueSnapshot {
|
|
7
|
+
private readonly maxCompletedJobs;
|
|
8
|
+
private readonly maxJobResults;
|
|
9
|
+
private readonly jobs;
|
|
10
|
+
private readonly results;
|
|
11
|
+
private readonly queues;
|
|
12
|
+
private readonly knownQueues;
|
|
13
|
+
private readonly completedOrder;
|
|
14
|
+
constructor(maxCompletedJobs: number, maxJobResults: number);
|
|
15
|
+
hydrate(rows: readonly PostgresStoredJob[]): void;
|
|
16
|
+
replaceQueue(queue: string, rows: readonly PostgresStoredJob[], state: PostgresQueueState, completions?: readonly PostgresCompletionResult[]): void;
|
|
17
|
+
removeQueue(queue: string): JobId[];
|
|
18
|
+
hydrateResults(entries: readonly PostgresCompletionResult[]): void;
|
|
19
|
+
put(row: PostgresStoredJob): void;
|
|
20
|
+
claim(claimed: ClaimedPostgresJob): void;
|
|
21
|
+
remove(id: JobId): void;
|
|
22
|
+
reconcile(id: JobId, row: PostgresStoredJob | null, completion: PostgresCompletionResult | null): void;
|
|
23
|
+
setQueueState(state: PostgresQueueState): void;
|
|
24
|
+
apply(event: PostgresStoreEvent): void;
|
|
25
|
+
get(id: JobId): PostgresStoredJob | null;
|
|
26
|
+
getResult(id: JobId): unknown;
|
|
27
|
+
hasResult(id: JobId): boolean;
|
|
28
|
+
locations(): Map<JobId, JobLocation>;
|
|
29
|
+
completedIds(): Set<JobId>;
|
|
30
|
+
completionIds(): Set<JobId>;
|
|
31
|
+
private putCompletion;
|
|
32
|
+
private putResult;
|
|
33
|
+
private removeQueueResults;
|
|
34
|
+
private trimCompletedJobs;
|
|
35
|
+
getByCustomId(customId: string): Job | null;
|
|
36
|
+
getByUniqueKey(queue: string, key: string): Job | null;
|
|
37
|
+
ids(queue: string, states?: readonly PostgresJobState[]): JobId[];
|
|
38
|
+
removeStates(queue: string, states: readonly PostgresJobState[]): number;
|
|
39
|
+
queueState(queue: string): PostgresQueueState | null;
|
|
40
|
+
queueNames(): string[];
|
|
41
|
+
list(queue: string, options?: {
|
|
42
|
+
state?: string | string[];
|
|
43
|
+
start?: number;
|
|
44
|
+
end?: number;
|
|
45
|
+
asc?: boolean;
|
|
46
|
+
}): Job[];
|
|
47
|
+
counts(queue?: string): PostgresCounts;
|
|
48
|
+
priorities(queue: string): Record<number, number>;
|
|
49
|
+
dlq(queue: string, filter?: DlqFilter): DlqEntry[];
|
|
50
|
+
size(): number;
|
|
51
|
+
}
|