@shivaedev/jobs 0.30.0 → 0.32.0
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/CHANGELOG.md +50 -0
- package/README.md +88 -24
- package/dist/display.d.ts +14 -0
- package/dist/display.d.ts.map +1 -0
- package/dist/display.js +2 -0
- package/dist/display.js.map +1 -0
- package/dist/server/ClientDatabase.d.ts +21 -0
- package/dist/server/ClientDatabase.d.ts.map +1 -0
- package/dist/server/ClientDatabase.js +2 -0
- package/dist/server/ClientDatabase.js.map +1 -0
- package/dist/server/PgBoss.d.ts +2 -2
- package/dist/server/PgBoss.d.ts.map +1 -1
- package/dist/server/adapters/batchClockOffset.d.ts +2 -2
- package/dist/server/adapters/batchClockOffset.d.ts.map +1 -1
- package/dist/server/adapters/batchClockOffset.js +5 -4
- package/dist/server/adapters/batchClockOffset.js.map +1 -1
- package/dist/server/adapters/batchHandler.d.ts +5 -0
- package/dist/server/adapters/batchHandler.d.ts.map +1 -0
- package/dist/server/{internal → adapters}/batchHandler.js +6 -6
- package/dist/server/adapters/batchHandler.js.map +1 -0
- package/dist/server/adapters/clientCache.d.ts +10 -0
- package/dist/server/adapters/clientCache.d.ts.map +1 -0
- package/dist/server/{internal → adapters}/clientCache.js +5 -19
- package/dist/server/adapters/clientCache.js.map +1 -0
- package/dist/server/adapters/clientErrorLogger.js +1 -1
- package/dist/server/adapters/clientErrorLogger.js.map +1 -1
- package/dist/server/adapters/defaultClientFactory.d.ts +4 -0
- package/dist/server/adapters/defaultClientFactory.d.ts.map +1 -0
- package/dist/server/adapters/defaultClientFactory.js.map +1 -0
- package/dist/server/adapters/deferralCount.d.ts +3 -3
- package/dist/server/adapters/deferralCount.d.ts.map +1 -1
- package/dist/server/adapters/deferralCount.js +2 -2
- package/dist/server/adapters/deferralCount.js.map +1 -1
- package/dist/server/adapters/expireAttempt.d.ts +4 -0
- package/dist/server/adapters/expireAttempt.d.ts.map +1 -0
- package/dist/server/{internal → adapters}/expireAttempt.js +1 -1
- package/dist/server/{internal → adapters}/expireAttempt.js.map +1 -1
- package/dist/server/adapters/inspection.d.ts +5 -0
- package/dist/server/adapters/inspection.d.ts.map +1 -0
- package/dist/server/adapters/inspection.js +25 -0
- package/dist/server/adapters/inspection.js.map +1 -0
- package/dist/server/adapters/inspectionChanges.d.ts +7 -0
- package/dist/server/adapters/inspectionChanges.d.ts.map +1 -0
- package/dist/server/adapters/inspectionChanges.js +23 -0
- package/dist/server/adapters/inspectionChanges.js.map +1 -0
- package/dist/server/adapters/inspectionDeferrals.d.ts +10 -0
- package/dist/server/adapters/inspectionDeferrals.d.ts.map +1 -0
- package/dist/server/adapters/inspectionDeferrals.js +13 -0
- package/dist/server/adapters/inspectionDeferrals.js.map +1 -0
- package/dist/server/adapters/inspectionJobs.d.ts +50 -0
- package/dist/server/adapters/inspectionJobs.d.ts.map +1 -0
- package/dist/server/adapters/inspectionJobs.js +21 -0
- package/dist/server/adapters/inspectionJobs.js.map +1 -0
- package/dist/server/adapters/inspectionOperation.d.ts +3 -0
- package/dist/server/adapters/inspectionOperation.d.ts.map +1 -0
- package/dist/server/adapters/inspectionOperation.js +6 -0
- package/dist/server/adapters/inspectionOperation.js.map +1 -0
- package/dist/server/adapters/inspectionPlan.d.ts +3 -0
- package/dist/server/adapters/inspectionPlan.d.ts.map +1 -0
- package/dist/server/adapters/inspectionPlan.js +20 -0
- package/dist/server/adapters/inspectionPlan.js.map +1 -0
- package/dist/server/adapters/inspectionReads.d.ts +59 -0
- package/dist/server/adapters/inspectionReads.d.ts.map +1 -0
- package/dist/server/adapters/inspectionReads.js +44 -0
- package/dist/server/adapters/inspectionReads.js.map +1 -0
- package/dist/server/adapters/inspectionSnapshot.d.ts +6 -0
- package/dist/server/adapters/inspectionSnapshot.d.ts.map +1 -0
- package/dist/server/{internal/testingSnapshot.js → adapters/inspectionSnapshot.js} +10 -8
- package/dist/server/adapters/inspectionSnapshot.js.map +1 -0
- package/dist/server/adapters/installSchema.d.ts +1 -1
- package/dist/server/adapters/installSchema.d.ts.map +1 -1
- package/dist/server/adapters/installSchema.js +1 -1
- package/dist/server/adapters/installSchema.js.map +1 -1
- package/dist/server/adapters/jobEngine.d.ts +5 -0
- package/dist/server/adapters/jobEngine.d.ts.map +1 -0
- package/dist/server/adapters/jobEngine.js +46 -0
- package/dist/server/adapters/jobEngine.js.map +1 -0
- package/dist/server/adapters/lifecycle.d.ts +11 -0
- package/dist/server/adapters/lifecycle.d.ts.map +1 -0
- package/dist/server/adapters/lifecycle.js +48 -0
- package/dist/server/adapters/lifecycle.js.map +1 -0
- package/dist/server/adapters/listJobs.d.ts +5 -0
- package/dist/server/adapters/listJobs.d.ts.map +1 -0
- package/dist/server/adapters/listJobs.js +37 -0
- package/dist/server/adapters/listJobs.js.map +1 -0
- package/dist/server/adapters/payloadIdentity.d.ts +3 -0
- package/dist/server/adapters/payloadIdentity.d.ts.map +1 -0
- package/dist/server/adapters/payloadIdentity.js +14 -0
- package/dist/server/adapters/payloadIdentity.js.map +1 -0
- package/dist/server/adapters/queueAdministration.d.ts +4 -0
- package/dist/server/adapters/queueAdministration.d.ts.map +1 -0
- package/dist/server/adapters/queueAdministration.js +42 -0
- package/dist/server/adapters/queueAdministration.js.map +1 -0
- package/dist/server/{internal/testingSignal.d.ts → adapters/queueSignal.d.ts} +2 -2
- package/dist/server/adapters/queueSignal.d.ts.map +1 -0
- package/dist/server/{internal/testingSignal.js → adapters/queueSignal.js} +2 -2
- package/dist/server/adapters/queueSignal.js.map +1 -0
- package/dist/server/adapters/registerWorker.d.ts +5 -3
- package/dist/server/adapters/registerWorker.d.ts.map +1 -1
- package/dist/server/adapters/registerWorker.js +9 -6
- package/dist/server/adapters/registerWorker.js.map +1 -1
- package/dist/server/adapters/retireJobs.d.ts +3 -3
- package/dist/server/adapters/retireJobs.d.ts.map +1 -1
- package/dist/server/adapters/retireJobs.js +3 -3
- package/dist/server/adapters/retireJobs.js.map +1 -1
- package/dist/server/adapters/schemaIndexBuilds.d.ts +2 -2
- package/dist/server/adapters/schemaIndexBuilds.d.ts.map +1 -1
- package/dist/server/adapters/schemaIndexBuilds.js.map +1 -1
- package/dist/server/adapters/settleDeferral.d.ts +7 -0
- package/dist/server/adapters/settleDeferral.d.ts.map +1 -0
- package/dist/server/{internal → adapters}/settleDeferral.js +2 -2
- package/dist/server/adapters/settleDeferral.js.map +1 -0
- package/dist/server/adapters/testingClient.d.ts +13 -0
- package/dist/server/adapters/testingClient.d.ts.map +1 -0
- package/dist/server/{internal → adapters}/testingClient.js +27 -48
- package/dist/server/adapters/testingClient.js.map +1 -0
- package/dist/server/adapters/testingController.d.ts +79 -0
- package/dist/server/adapters/testingController.d.ts.map +1 -0
- package/dist/server/adapters/testingController.js +108 -0
- package/dist/server/adapters/testingController.js.map +1 -0
- package/dist/server/adapters/testingDueNow.d.ts +3 -3
- package/dist/server/adapters/testingDueNow.d.ts.map +1 -1
- package/dist/server/adapters/testingDueNow.js +2 -2
- package/dist/server/adapters/testingDueNow.js.map +1 -1
- package/dist/server/adapters/testingEngine.d.ts +5 -0
- package/dist/server/adapters/testingEngine.d.ts.map +1 -0
- package/dist/server/adapters/testingEngine.js +12 -0
- package/dist/server/adapters/testingEngine.js.map +1 -0
- package/dist/server/adapters/testingExpirations.d.ts +6 -4
- package/dist/server/adapters/testingExpirations.d.ts.map +1 -1
- package/dist/server/adapters/testingExpirations.js.map +1 -1
- package/dist/server/adapters/testingInspectionClient.d.ts +5 -0
- package/dist/server/adapters/testingInspectionClient.d.ts.map +1 -0
- package/dist/server/adapters/testingInspectionClient.js +52 -0
- package/dist/server/adapters/testingInspectionClient.js.map +1 -0
- package/dist/server/adapters/transactionDb.d.ts +2 -2
- package/dist/server/adapters/transactionDb.d.ts.map +1 -1
- package/dist/server/adapters/transactionDb.js.map +1 -1
- package/dist/server/client.d.ts +95 -18
- package/dist/server/client.d.ts.map +1 -1
- package/dist/server/clientOptions.d.ts +74 -0
- package/dist/server/clientOptions.d.ts.map +1 -0
- package/dist/server/clientOptions.js +2 -0
- package/dist/server/clientOptions.js.map +1 -0
- package/dist/server/defineSchedule.d.ts +1 -1
- package/dist/server/defineSchedule.d.ts.map +1 -1
- package/dist/server/defineSchedule.js +2 -1
- package/dist/server/defineSchedule.js.map +1 -1
- package/dist/server/definition.d.ts +29 -26
- package/dist/server/definition.d.ts.map +1 -1
- package/dist/server/definition.js +5 -2
- package/dist/server/definition.js.map +1 -1
- package/dist/server/engineClient.d.ts +21 -0
- package/dist/server/engineClient.d.ts.map +1 -0
- package/dist/server/engineClient.js +2 -0
- package/dist/server/engineClient.js.map +1 -0
- package/dist/server/enqueueOptions.d.ts +28 -0
- package/dist/server/enqueueOptions.d.ts.map +1 -0
- package/dist/server/enqueueOptions.js +2 -0
- package/dist/server/enqueueOptions.js.map +1 -0
- package/dist/server/error.d.ts +11 -1
- package/dist/server/error.d.ts.map +1 -1
- package/dist/server/error.js +8 -1
- package/dist/server/error.js.map +1 -1
- package/dist/server/health.d.ts +2 -2
- package/dist/server/health.d.ts.map +1 -1
- package/dist/server/inspection.d.ts +102 -0
- package/dist/server/inspection.d.ts.map +1 -0
- package/dist/server/inspection.js +30 -0
- package/dist/server/inspection.js.map +1 -0
- package/dist/server/internal/acquireClient.d.ts +11 -0
- package/dist/server/internal/acquireClient.d.ts.map +1 -0
- package/dist/server/internal/acquireClient.js +21 -0
- package/dist/server/internal/acquireClient.js.map +1 -0
- package/dist/server/internal/adapters/testingFetches.d.ts +2 -2
- package/dist/server/internal/adapters/testingFetches.d.ts.map +1 -1
- package/dist/server/internal/adapters/testingFetches.js.map +1 -1
- package/dist/server/internal/clientErrors.d.ts +1 -1
- package/dist/server/internal/clientErrors.d.ts.map +1 -1
- package/dist/server/internal/countsFor.d.ts +3 -3
- package/dist/server/internal/countsFor.d.ts.map +1 -1
- package/dist/server/internal/countsFor.js +2 -2
- package/dist/server/internal/countsFor.js.map +1 -1
- package/dist/server/internal/deadLetterResolutionPlan.js +1 -1
- package/dist/server/internal/deadLetterResolutionPlan.js.map +1 -1
- package/dist/server/internal/deadlineOf.d.ts +2 -2
- package/dist/server/internal/deadlineOf.d.ts.map +1 -1
- package/dist/server/internal/deadlineOf.js.map +1 -1
- package/dist/server/internal/deferrableAttempt.d.ts +4 -5
- package/dist/server/internal/deferrableAttempt.d.ts.map +1 -1
- package/dist/server/internal/deferrableAttempt.js +5 -14
- package/dist/server/internal/deferrableAttempt.js.map +1 -1
- package/dist/server/internal/deferral.d.ts +2 -4
- package/dist/server/internal/deferral.d.ts.map +1 -1
- package/dist/server/internal/deferral.js +0 -1
- package/dist/server/internal/deferral.js.map +1 -1
- package/dist/server/internal/deferralStorePlan.js +2 -2
- package/dist/server/internal/deferralStorePlan.js.map +1 -1
- package/dist/server/internal/definitionOptions.d.ts +7 -7
- package/dist/server/internal/definitionOptions.d.ts.map +1 -1
- package/dist/server/internal/engine.d.ts +25 -0
- package/dist/server/internal/engine.d.ts.map +1 -0
- package/dist/server/internal/engine.js +6 -0
- package/dist/server/internal/engine.js.map +1 -0
- package/dist/server/internal/enqueueFor.d.ts +2 -2
- package/dist/server/internal/enqueueFor.d.ts.map +1 -1
- package/dist/server/internal/enqueueFor.js +14 -4
- package/dist/server/internal/enqueueFor.js.map +1 -1
- package/dist/server/internal/ensureQueue.d.ts +2 -3
- package/dist/server/internal/ensureQueue.d.ts.map +1 -1
- package/dist/server/internal/ensureQueue.js +2 -2
- package/dist/server/internal/ensureQueue.js.map +1 -1
- package/dist/server/internal/healthFor.d.ts +3 -3
- package/dist/server/internal/healthFor.d.ts.map +1 -1
- package/dist/server/internal/healthFor.js +2 -2
- package/dist/server/internal/healthFor.js.map +1 -1
- package/dist/server/internal/jobControl.d.ts +9 -4
- package/dist/server/internal/jobControl.d.ts.map +1 -1
- package/dist/server/internal/jobControl.js +13 -40
- package/dist/server/internal/jobControl.js.map +1 -1
- package/dist/server/internal/jobListings.d.ts +16 -0
- package/dist/server/internal/jobListings.d.ts.map +1 -0
- package/dist/server/internal/jobListings.js +52 -0
- package/dist/server/internal/jobListings.js.map +1 -0
- package/dist/server/internal/jobStorePlans.d.ts.map +1 -1
- package/dist/server/internal/jobStorePlans.js +4 -3
- package/dist/server/internal/jobStorePlans.js.map +1 -1
- package/dist/server/internal/lifecycle.d.ts +11 -7
- package/dist/server/internal/lifecycle.d.ts.map +1 -1
- package/dist/server/internal/lifecycle.js +2 -49
- package/dist/server/internal/lifecycle.js.map +1 -1
- package/dist/server/internal/makeService.d.ts +5 -3
- package/dist/server/internal/makeService.d.ts.map +1 -1
- package/dist/server/internal/makeService.js +18 -13
- package/dist/server/internal/makeService.js.map +1 -1
- package/dist/server/internal/register.d.ts +5 -5
- package/dist/server/internal/register.d.ts.map +1 -1
- package/dist/server/internal/register.js +5 -9
- package/dist/server/internal/register.js.map +1 -1
- package/dist/server/internal/registerReleasedJobs.d.ts +4 -4
- package/dist/server/internal/registerReleasedJobs.d.ts.map +1 -1
- package/dist/server/internal/registerReleasedJobs.js +2 -2
- package/dist/server/internal/registerReleasedJobs.js.map +1 -1
- package/dist/server/internal/retryWake.d.ts +1 -1
- package/dist/server/internal/retryWake.d.ts.map +1 -1
- package/dist/server/internal/retryWake.js +2 -2
- package/dist/server/internal/retryWake.js.map +1 -1
- package/dist/server/internal/runQueueWorker.d.ts +4 -4
- package/dist/server/internal/runQueueWorker.d.ts.map +1 -1
- package/dist/server/internal/runQueueWorker.js +5 -5
- package/dist/server/internal/runQueueWorker.js.map +1 -1
- package/dist/server/internal/storedRows.d.ts +2 -2
- package/dist/server/internal/storedRows.d.ts.map +1 -1
- package/dist/server/internal/storedRows.js +2 -2
- package/dist/server/internal/storedRows.js.map +1 -1
- package/dist/server/internal/testingIdle.d.ts +4 -3
- package/dist/server/internal/testingIdle.d.ts.map +1 -1
- package/dist/server/internal/testingIdle.js +5 -25
- package/dist/server/internal/testingIdle.js.map +1 -1
- package/dist/server/internal/testingOperation.d.ts +5 -0
- package/dist/server/internal/testingOperation.d.ts.map +1 -0
- package/dist/server/internal/testingOperation.js +12 -0
- package/dist/server/internal/testingOperation.js.map +1 -0
- package/dist/server/internal/testingSchedules.d.ts +9 -6
- package/dist/server/internal/testingSchedules.d.ts.map +1 -1
- package/dist/server/internal/testingSchedules.js +14 -9
- package/dist/server/internal/testingSchedules.js.map +1 -1
- package/dist/server/internal/testingWaits.d.ts +12 -8
- package/dist/server/internal/testingWaits.d.ts.map +1 -1
- package/dist/server/internal/testingWaits.js +6 -7
- package/dist/server/internal/testingWaits.js.map +1 -1
- package/dist/server/internal/tracing.d.ts +2 -2
- package/dist/server/internal/tracing.d.ts.map +1 -1
- package/dist/server/internal/tracing.js.map +1 -1
- package/dist/server/internal/validateQueueNames.d.ts +2 -2
- package/dist/server/internal/validateQueueNames.d.ts.map +1 -1
- package/dist/server/internal/validateQueueNames.js +1 -1
- package/dist/server/internal/validateQueueNames.js.map +1 -1
- package/dist/server/internal/waitForBatchExpiry.d.ts +4 -4
- package/dist/server/internal/waitForBatchExpiry.d.ts.map +1 -1
- package/dist/server/internal/waitForBatchExpiry.js +1 -1
- package/dist/server/internal/waitForBatchExpiry.js.map +1 -1
- package/dist/server/job.d.ts +42 -0
- package/dist/server/job.d.ts.map +1 -0
- package/dist/server/job.js +2 -0
- package/dist/server/job.js.map +1 -0
- package/dist/server/jobModule.d.ts +6 -4
- package/dist/server/jobModule.d.ts.map +1 -1
- package/dist/server/jobModule.js +7 -5
- package/dist/server/jobModule.js.map +1 -1
- package/dist/server/queueOptions.d.ts +19 -0
- package/dist/server/queueOptions.d.ts.map +1 -0
- package/dist/server/queueOptions.js +2 -0
- package/dist/server/queueOptions.js.map +1 -0
- package/dist/server/readJobFailure.d.ts +5 -0
- package/dist/server/readJobFailure.d.ts.map +1 -0
- package/dist/server/readJobFailure.js +8 -0
- package/dist/server/readJobFailure.js.map +1 -0
- package/dist/server/schema.d.ts +1 -1
- package/dist/server/schema.d.ts.map +1 -1
- package/dist/server/schema.js +23 -7
- package/dist/server/schema.js.map +1 -1
- package/dist/server/service.d.ts +17 -12
- package/dist/server/service.d.ts.map +1 -1
- package/dist/server/service.js +19 -27
- package/dist/server/service.js.map +1 -1
- package/dist/server/testing.d.ts +63 -67
- package/dist/server/testing.d.ts.map +1 -1
- package/dist/server/testing.js +5 -97
- package/dist/server/testing.js.map +1 -1
- package/dist/server/workerOptions.d.ts +25 -0
- package/dist/server/workerOptions.d.ts.map +1 -0
- package/dist/server/workerOptions.js +2 -0
- package/dist/server/workerOptions.js.map +1 -0
- package/package.json +11 -16
- package/src/display.ts +12 -0
- package/src/server/ClientDatabase.ts +7 -0
- package/src/server/PgBoss.ts +2 -2
- package/src/server/adapters/batchClockOffset.ts +8 -5
- package/src/server/{internal → adapters}/batchHandler.ts +13 -13
- package/src/server/{internal → adapters}/clientCache.ts +10 -22
- package/src/server/adapters/clientErrorLogger.ts +1 -1
- package/src/server/{defaultClientFactory.ts → adapters/defaultClientFactory.ts} +4 -2
- package/src/server/adapters/deferralCount.ts +5 -5
- package/src/server/{internal → adapters}/expireAttempt.ts +4 -3
- package/src/server/adapters/inspection.ts +31 -0
- package/src/server/adapters/inspectionChanges.ts +31 -0
- package/src/server/adapters/inspectionDeferrals.ts +20 -0
- package/src/server/adapters/inspectionJobs.ts +28 -0
- package/src/server/adapters/inspectionOperation.ts +6 -0
- package/src/server/adapters/inspectionPlan.ts +21 -0
- package/src/server/adapters/inspectionReads.ts +55 -0
- package/src/server/{internal/testingSnapshot.ts → adapters/inspectionSnapshot.ts} +16 -18
- package/src/server/adapters/installSchema.ts +2 -2
- package/src/server/adapters/jobEngine.ts +55 -0
- package/src/server/adapters/lifecycle.ts +67 -0
- package/src/server/adapters/listJobs.ts +43 -0
- package/src/server/adapters/payloadIdentity.ts +15 -0
- package/src/server/adapters/queueAdministration.ts +47 -0
- package/src/server/{internal/testingSignal.ts → adapters/queueSignal.ts} +1 -1
- package/src/server/adapters/registerWorker.ts +17 -12
- package/src/server/adapters/retireJobs.ts +5 -5
- package/src/server/adapters/schemaIndexBuilds.ts +2 -2
- package/src/server/{internal → adapters}/settleDeferral.ts +5 -5
- package/src/server/{internal → adapters}/testingClient.ts +24 -40
- package/src/server/adapters/testingController.ts +125 -0
- package/src/server/adapters/testingDueNow.ts +5 -5
- package/src/server/adapters/testingEngine.ts +15 -0
- package/src/server/adapters/testingExpirations.ts +6 -4
- package/src/server/adapters/testingInspectionClient.ts +70 -0
- package/src/server/adapters/transactionDb.ts +2 -2
- package/src/server/client.ts +86 -30
- package/src/server/clientOptions.ts +80 -0
- package/src/server/defineSchedule.ts +3 -2
- package/src/server/definition.ts +38 -29
- package/src/server/engineClient.ts +22 -0
- package/src/server/enqueueOptions.ts +25 -0
- package/src/server/error.ts +18 -2
- package/src/server/health.ts +2 -2
- package/src/server/inspection.ts +50 -0
- package/src/server/internal/acquireClient.ts +26 -0
- package/src/server/internal/adapters/testingFetches.ts +2 -2
- package/src/server/internal/clientErrors.ts +1 -1
- package/src/server/internal/countsFor.ts +5 -5
- package/src/server/internal/deadLetterResolutionPlan.ts +1 -1
- package/src/server/internal/deadlineOf.ts +2 -2
- package/src/server/internal/deferrableAttempt.ts +5 -22
- package/src/server/internal/deferral.ts +2 -4
- package/src/server/internal/deferralStorePlan.ts +2 -2
- package/src/server/internal/definitionOptions.ts +1 -1
- package/src/server/internal/engine.ts +35 -0
- package/src/server/internal/enqueueFor.ts +19 -6
- package/src/server/internal/ensureQueue.ts +5 -6
- package/src/server/internal/healthFor.ts +4 -4
- package/src/server/internal/jobControl.ts +15 -50
- package/src/server/internal/jobListings.ts +85 -0
- package/src/server/internal/jobStorePlans.ts +4 -3
- package/src/server/internal/lifecycle.ts +14 -55
- package/src/server/internal/makeService.ts +24 -15
- package/src/server/internal/register.ts +8 -12
- package/src/server/internal/registerReleasedJobs.ts +5 -5
- package/src/server/internal/retryWake.ts +3 -3
- package/src/server/internal/runQueueWorker.ts +8 -8
- package/src/server/internal/storedRows.ts +3 -3
- package/src/server/internal/testingIdle.ts +8 -31
- package/src/server/internal/testingOperation.ts +18 -0
- package/src/server/internal/testingSchedules.ts +29 -17
- package/src/server/internal/testingWaits.ts +16 -16
- package/src/server/internal/tracing.ts +2 -2
- package/src/server/internal/validateQueueNames.ts +2 -2
- package/src/server/internal/waitForBatchExpiry.ts +4 -4
- package/src/server/job.ts +42 -0
- package/src/server/jobModule.ts +19 -7
- package/src/server/queueOptions.ts +20 -0
- package/src/server/readJobFailure.ts +12 -0
- package/src/server/schema.ts +23 -7
- package/src/server/service.ts +43 -44
- package/src/server/testing.ts +4 -117
- package/src/server/workerOptions.ts +28 -0
- package/dist/server/defaultClientFactory.d.ts +0 -3
- package/dist/server/defaultClientFactory.d.ts.map +0 -1
- package/dist/server/defaultClientFactory.js.map +0 -1
- package/dist/server/internal/batchHandler.d.ts +0 -5
- package/dist/server/internal/batchHandler.d.ts.map +0 -1
- package/dist/server/internal/batchHandler.js.map +0 -1
- package/dist/server/internal/clientCache.d.ts +0 -8
- package/dist/server/internal/clientCache.d.ts.map +0 -1
- package/dist/server/internal/clientCache.js.map +0 -1
- package/dist/server/internal/expireAttempt.d.ts +0 -3
- package/dist/server/internal/expireAttempt.d.ts.map +0 -1
- package/dist/server/internal/listJobs.d.ts +0 -5
- package/dist/server/internal/listJobs.d.ts.map +0 -1
- package/dist/server/internal/listJobs.js +0 -75
- package/dist/server/internal/listJobs.js.map +0 -1
- package/dist/server/internal/observeTestingSettlements.d.ts +0 -6
- package/dist/server/internal/observeTestingSettlements.d.ts.map +0 -1
- package/dist/server/internal/observeTestingSettlements.js +0 -35
- package/dist/server/internal/observeTestingSettlements.js.map +0 -1
- package/dist/server/internal/settleDeferral.d.ts +0 -7
- package/dist/server/internal/settleDeferral.d.ts.map +0 -1
- package/dist/server/internal/settleDeferral.js.map +0 -1
- package/dist/server/internal/testingClient.d.ts +0 -13
- package/dist/server/internal/testingClient.d.ts.map +0 -1
- package/dist/server/internal/testingClient.js.map +0 -1
- package/dist/server/internal/testingDeferrals.d.ts +0 -10
- package/dist/server/internal/testingDeferrals.d.ts.map +0 -1
- package/dist/server/internal/testingDeferrals.js +0 -15
- package/dist/server/internal/testingDeferrals.js.map +0 -1
- package/dist/server/internal/testingReadout.d.ts +0 -44
- package/dist/server/internal/testingReadout.d.ts.map +0 -1
- package/dist/server/internal/testingReadout.js +0 -13
- package/dist/server/internal/testingReadout.js.map +0 -1
- package/dist/server/internal/testingRegistrations.d.ts +0 -4
- package/dist/server/internal/testingRegistrations.d.ts.map +0 -1
- package/dist/server/internal/testingRegistrations.js +0 -8
- package/dist/server/internal/testingRegistrations.js.map +0 -1
- package/dist/server/internal/testingSignal.d.ts.map +0 -1
- package/dist/server/internal/testingSignal.js.map +0 -1
- package/dist/server/internal/testingSnapshot.d.ts +0 -6
- package/dist/server/internal/testingSnapshot.d.ts.map +0 -1
- package/dist/server/internal/testingSnapshot.js.map +0 -1
- package/src/server/internal/listJobs.ts +0 -116
- package/src/server/internal/observeTestingSettlements.ts +0 -36
- package/src/server/internal/testingDeferrals.ts +0 -22
- package/src/server/internal/testingReadout.ts +0 -19
- package/src/server/internal/testingRegistrations.ts +0 -10
- /package/dist/server/{defaultClientFactory.js → adapters/defaultClientFactory.js} +0 -0
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import type { ClientDatabase } from "#server/ClientDatabase.ts";
|
|
2
|
+
|
|
3
|
+
export interface ClientOptions {
|
|
4
|
+
allowSchemaCaseVariant?: boolean;
|
|
5
|
+
"application_name"?: string;
|
|
6
|
+
|
|
7
|
+
backend?: "postgres" | "cockroachdb" | "yugabytedb" | "citus" | "pglite";
|
|
8
|
+
bamIntervalSeconds?: number;
|
|
9
|
+
|
|
10
|
+
clock?: Clock;
|
|
11
|
+
clockMonitorIntervalSeconds?: number;
|
|
12
|
+
connectionString?: string;
|
|
13
|
+
connectionTimeoutMillis?: number;
|
|
14
|
+
createSchema?: boolean;
|
|
15
|
+
cronMonitorIntervalSeconds?: number;
|
|
16
|
+
cronWorkerIntervalSeconds?: number;
|
|
17
|
+
database?: string;
|
|
18
|
+
db?: ClientDatabase;
|
|
19
|
+
flowIntervalSeconds?: number;
|
|
20
|
+
host?: string;
|
|
21
|
+
instanceHeartbeatSeconds?: number;
|
|
22
|
+
instanceName?: string;
|
|
23
|
+
maintenanceIntervalSeconds?: number;
|
|
24
|
+
max?: number;
|
|
25
|
+
migrate?: boolean;
|
|
26
|
+
monitorIntervalSeconds?: number;
|
|
27
|
+
monitorVacuum?: boolean;
|
|
28
|
+
notifyHeartbeatIntervalMs?: number;
|
|
29
|
+
notifyHeartbeatTimeoutMs?: number;
|
|
30
|
+
notifyKeepAliveInitialDelayMs?: number;
|
|
31
|
+
openTelemetry?: { enabled?: boolean; propagateContext?: boolean };
|
|
32
|
+
options?: string;
|
|
33
|
+
password?: string | (() => string | Promise<string>);
|
|
34
|
+
persistQueueStats?: boolean;
|
|
35
|
+
persistWarnings?: boolean;
|
|
36
|
+
port?: number;
|
|
37
|
+
queueCacheIntervalSeconds?: number;
|
|
38
|
+
queueStatRetentionDays?: number;
|
|
39
|
+
|
|
40
|
+
registerInstance?: boolean;
|
|
41
|
+
reindex?: boolean | ReindexOptions;
|
|
42
|
+
reindexIntervalSeconds?: number;
|
|
43
|
+
|
|
44
|
+
schedule?: boolean;
|
|
45
|
+
schema?: string;
|
|
46
|
+
ssl?: boolean | import("node:tls").ConnectionOptions;
|
|
47
|
+
|
|
48
|
+
supervise?: boolean;
|
|
49
|
+
superviseIntervalSeconds?: number;
|
|
50
|
+
useListenNotify?: boolean;
|
|
51
|
+
user?: string;
|
|
52
|
+
warningQueueSize?: number;
|
|
53
|
+
warningRetentionDays?: number;
|
|
54
|
+
warningSlowQuerySeconds?: number;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export interface ReindexOptions extends IndexBloatOptions {
|
|
58
|
+
force?: boolean;
|
|
59
|
+
maxIndexBytes?: number;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export interface IndexBloatOptions {
|
|
63
|
+
maxEntriesPerPage?: number;
|
|
64
|
+
minPages?: number;
|
|
65
|
+
minSizeRatio?: number;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export interface Clock {
|
|
69
|
+
clearInterval: (handle: unknown) => void;
|
|
70
|
+
clearTimeout: (handle: unknown) => void;
|
|
71
|
+
now: () => number;
|
|
72
|
+
setInterval: (fn: () => void, ms: number) => unknown;
|
|
73
|
+
setTimeout: (fn: () => void, ms: number) => unknown;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
export interface StopOptions {
|
|
77
|
+
close?: boolean;
|
|
78
|
+
graceful?: boolean;
|
|
79
|
+
timeout?: number;
|
|
80
|
+
}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import type { DefineScheduleOptions, ScheduleDefinition } from "#definition.ts";
|
|
2
|
-
import { maxDeferrals, nativeQueueOptions } from "#internal/definitionOptions.ts";
|
|
1
|
+
import type { DefineScheduleOptions, ScheduleDefinition } from "#server/definition.ts";
|
|
2
|
+
import { maxDeferrals, nativeQueueOptions } from "#server/internal/definitionOptions.ts";
|
|
3
3
|
|
|
4
4
|
export function defineSchedule<const TName extends string>(options: DefineScheduleOptions<TName>): ScheduleDefinition<TName> {
|
|
5
5
|
const definition: ScheduleDefinition<TName> = {
|
|
6
6
|
_tag: "ScheduleDefinition",
|
|
7
|
+
...(options.label === undefined ? {} : { label: options.label }),
|
|
7
8
|
cron: options.cron,
|
|
8
9
|
maxDeferrals: maxDeferrals(options.queue),
|
|
9
10
|
name: options.name,
|
package/src/server/definition.ts
CHANGED
|
@@ -1,18 +1,16 @@
|
|
|
1
1
|
import { Clock, Duration, Effect, Schema } from "effect";
|
|
2
|
-
import type {
|
|
3
|
-
import {
|
|
2
|
+
import type { QueueDisplay, SubjectColumn } from "#display.ts";
|
|
3
|
+
import type { ScheduleOptions } from "#server/enqueueOptions.ts";
|
|
4
|
+
import { maxDeferrals, nativeQueueOptions } from "#server/internal/definitionOptions.ts";
|
|
5
|
+
import type { WorkerJob } from "#server/job.ts";
|
|
6
|
+
import type { QueueOptions, QueuePolicy } from "#server/queueOptions.ts";
|
|
7
|
+
import type { WorkerOptions } from "#server/workerOptions.ts";
|
|
4
8
|
|
|
5
9
|
export class RetryAt extends Schema.TaggedError<RetryAt>()("RetryAt", {
|
|
6
10
|
at: Schema.DateTimeUtc,
|
|
7
11
|
reason: Schema.String,
|
|
8
12
|
}) {}
|
|
9
13
|
|
|
10
|
-
export type QueuePolicy = (typeof policies)[keyof typeof policies];
|
|
11
|
-
export type QueueOptions = Omit<Queue, "name" | "deadLetter" | "policy"> & {
|
|
12
|
-
readonly maxDeferrals?: number;
|
|
13
|
-
readonly policy?: QueuePolicy;
|
|
14
|
-
};
|
|
15
|
-
|
|
16
14
|
export interface JobPayloadSchema extends Schema.Top {
|
|
17
15
|
readonly Encoded: object;
|
|
18
16
|
readonly Type: object;
|
|
@@ -29,17 +27,18 @@ export interface JobContext {
|
|
|
29
27
|
readonly signal: AbortSignal;
|
|
30
28
|
}
|
|
31
29
|
|
|
32
|
-
export interface QueueDefinition<TName extends string = string, TPayload extends JobPayloadSchema = JobPayloadSchema> {
|
|
30
|
+
export interface QueueDefinition<TName extends string = string, TPayload extends JobPayloadSchema = JobPayloadSchema> extends QueueDisplay {
|
|
33
31
|
readonly _tag: "QueueDefinition";
|
|
34
32
|
readonly handle: <E, R>(
|
|
35
33
|
handler: (payload: Schema.Schema.Type<TPayload>, job: JobContext) => Effect.Effect<unknown, E, R>,
|
|
36
34
|
) => QueueWorker<TPayload, R>;
|
|
37
|
-
readonly
|
|
35
|
+
readonly id?: readonly string[] | undefined;
|
|
36
|
+
readonly key?: readonly string[] | undefined;
|
|
38
37
|
readonly maxDeferrals: number;
|
|
39
38
|
readonly name: TName;
|
|
40
|
-
readonly queueOptions: Omit<
|
|
39
|
+
readonly queueOptions: Omit<QueueOptions, "maxDeferrals">;
|
|
41
40
|
readonly schema: TPayload;
|
|
42
|
-
readonly workerOptions:
|
|
41
|
+
readonly workerOptions: WorkerOptions;
|
|
43
42
|
}
|
|
44
43
|
|
|
45
44
|
export interface QueueWorker<TPayload extends JobPayloadSchema = JobPayloadSchema, TRequirements = unknown> {
|
|
@@ -53,15 +52,15 @@ export type JobRegistration<TRequirements = unknown> =
|
|
|
53
52
|
| QueueWorker<JobPayloadSchema & { readonly DecodingServices: TRequirements }, TRequirements>
|
|
54
53
|
| ScheduledWorker<TRequirements>;
|
|
55
54
|
|
|
56
|
-
export interface ScheduleDefinition<TName extends string = string> {
|
|
55
|
+
export interface ScheduleDefinition<TName extends string = string> extends QueueDisplay {
|
|
57
56
|
readonly _tag: "ScheduleDefinition";
|
|
58
57
|
readonly cron: string;
|
|
59
58
|
readonly maxDeferrals: number;
|
|
60
59
|
readonly name: TName;
|
|
61
|
-
readonly queueOptions: Omit<
|
|
60
|
+
readonly queueOptions: Omit<QueueOptions, "maxDeferrals">;
|
|
62
61
|
readonly run: <E, R>(effect: Effect.Effect<unknown, E, R>) => ScheduledWorker<R>;
|
|
63
62
|
readonly scheduleOptions: ScheduleOptions;
|
|
64
|
-
readonly workerOptions:
|
|
63
|
+
readonly workerOptions: WorkerOptions;
|
|
65
64
|
}
|
|
66
65
|
|
|
67
66
|
export interface ScheduledWorker<TRequirements = unknown> {
|
|
@@ -78,30 +77,39 @@ export type RegistrationRequirements<TRegistrations extends readonly JobRegistra
|
|
|
78
77
|
: never
|
|
79
78
|
: never;
|
|
80
79
|
|
|
80
|
+
export type PayloadParts<TPayload extends JobPayloadSchema> = readonly {
|
|
81
|
+
[TField in Extract<keyof TPayload["Type"], string>]: TPayload["Type"][TField] extends string | number | boolean | null ? TField : never;
|
|
82
|
+
}[Extract<keyof TPayload["Type"], string>][];
|
|
83
|
+
|
|
81
84
|
export type DefineQueueOptions<TName extends string, TPayload extends JobPayloadSchema> = {
|
|
85
|
+
readonly id?: PayloadParts<NoInfer<TPayload>>;
|
|
86
|
+
readonly label?: string;
|
|
82
87
|
readonly name: TName;
|
|
83
88
|
readonly schema: TPayload;
|
|
84
|
-
readonly
|
|
89
|
+
readonly subject?: readonly SubjectColumn<NoInfer<TPayload>>[];
|
|
90
|
+
readonly worker?: WorkerOptions;
|
|
85
91
|
} & (
|
|
86
|
-
| { readonly key:
|
|
92
|
+
| { readonly key: PayloadParts<NoInfer<TPayload>>; readonly queue: QueueOptions & { readonly policy: "singleton" } }
|
|
87
93
|
| { readonly key?: never; readonly queue?: QueueOptions & { readonly policy?: Exclude<QueuePolicy, "singleton"> } }
|
|
88
94
|
);
|
|
89
95
|
|
|
90
|
-
export function defineQueue<
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
): QueueDefinition<TName, TPayload>;
|
|
96
|
+
export function defineQueue<
|
|
97
|
+
const TName extends string,
|
|
98
|
+
const TPayload extends JobPayloadSchema,
|
|
99
|
+
const TId extends readonly string[] | undefined = undefined,
|
|
100
|
+
const TKey extends readonly string[] | undefined = undefined,
|
|
101
|
+
>(
|
|
102
|
+
options: DefineQueueOptions<TName, TPayload> & { readonly id?: TId; readonly key?: TKey },
|
|
103
|
+
): QueueDefinition<TName, TPayload> & { readonly id?: TId; readonly key?: TKey };
|
|
99
104
|
export function defineQueue<const TName extends string, const TPayload extends JobPayloadSchema>(
|
|
100
105
|
options: DefineQueueOptions<TName, TPayload>,
|
|
101
106
|
): QueueDefinition<TName, TPayload> {
|
|
102
107
|
const definition: QueueDefinition<TName, TPayload> = {
|
|
103
108
|
_tag: "QueueDefinition",
|
|
104
|
-
|
|
109
|
+
id: options.id === undefined ? undefined : Object.freeze([...options.id]),
|
|
110
|
+
...(options.key === undefined ? {} : { key: Object.freeze([...options.key]) }),
|
|
111
|
+
...(options.label === undefined ? {} : { label: options.label }),
|
|
112
|
+
...(options.subject === undefined ? {} : { subject: Object.freeze(options.subject.map((column) => Object.freeze({ ...column }))) }),
|
|
105
113
|
handle: (handler) =>
|
|
106
114
|
Object.freeze({
|
|
107
115
|
_tag: "QueueWorker" as const,
|
|
@@ -119,13 +127,14 @@ export function defineQueue<const TName extends string, const TPayload extends J
|
|
|
119
127
|
|
|
120
128
|
export interface DefineScheduleOptions<TName extends string> {
|
|
121
129
|
readonly cron: string;
|
|
130
|
+
readonly label?: string;
|
|
122
131
|
readonly name: TName;
|
|
123
132
|
readonly queue?: QueueOptions;
|
|
124
133
|
readonly schedule?: ScheduleOptions;
|
|
125
|
-
readonly worker?:
|
|
134
|
+
readonly worker?: WorkerOptions;
|
|
126
135
|
}
|
|
127
136
|
|
|
128
|
-
export function jobContext(job:
|
|
137
|
+
export function jobContext(job: WorkerJob<unknown>, deadline: number, deferralCount = 0): JobContext {
|
|
129
138
|
return {
|
|
130
139
|
deferralCount,
|
|
131
140
|
expireInSeconds: job.expireInSeconds,
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { ClientDatabase } from "#server/ClientDatabase.ts";
|
|
2
|
+
import type { JobReadOptions, PgBossClient } from "#server/client.ts";
|
|
3
|
+
import type { ScheduleOptions } from "#server/enqueueOptions.ts";
|
|
4
|
+
import type { Job } from "#server/job.ts";
|
|
5
|
+
|
|
6
|
+
export interface EngineSchedule {
|
|
7
|
+
cron: string;
|
|
8
|
+
data?: object;
|
|
9
|
+
key: string;
|
|
10
|
+
name: string;
|
|
11
|
+
options?: ScheduleOptions;
|
|
12
|
+
timezone: string;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export interface EngineClient extends Required<PgBossClient> {
|
|
16
|
+
readonly emit: (event: "error", error: Error) => boolean;
|
|
17
|
+
readonly findJobs: <T = unknown>(name: string, options?: JobReadOptions) => Promise<Job<T>[]>;
|
|
18
|
+
readonly getDb: () => ClientDatabase;
|
|
19
|
+
readonly getSchedules: (name?: string, key?: string) => Promise<EngineSchedule[]>;
|
|
20
|
+
readonly schemaVersion: () => Promise<number | null>;
|
|
21
|
+
readonly supervise: (name?: string) => Promise<void>;
|
|
22
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { ClientDatabase } from "#server/ClientDatabase.ts";
|
|
2
|
+
import type { QueueDefinition } from "#server/definition.ts";
|
|
3
|
+
import type { RetryOptions } from "#server/queueOptions.ts";
|
|
4
|
+
|
|
5
|
+
export interface EnqueueOptions extends RetryOptions {
|
|
6
|
+
readonly db?: ClientDatabase;
|
|
7
|
+
readonly deadLetter?: string;
|
|
8
|
+
readonly group?: { readonly id: string; readonly tier?: string };
|
|
9
|
+
readonly id?: string;
|
|
10
|
+
readonly priority?: number;
|
|
11
|
+
readonly singletonKey?: string;
|
|
12
|
+
readonly singletonNextSlot?: boolean;
|
|
13
|
+
readonly singletonSeconds?: number;
|
|
14
|
+
readonly startAfter?: number | string | Date;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export type QueueEnqueueOptions<TQueue extends QueueDefinition> = Omit<EnqueueOptions, "id" | "singletonKey"> &
|
|
18
|
+
(TQueue["id"] extends undefined ? Pick<EnqueueOptions, "id"> : { readonly id?: never }) &
|
|
19
|
+
(TQueue["key"] extends undefined ? Pick<EnqueueOptions, "singletonKey"> : { readonly singletonKey?: never });
|
|
20
|
+
|
|
21
|
+
export interface ScheduleOptions extends EnqueueOptions {
|
|
22
|
+
readonly key?: string;
|
|
23
|
+
readonly missed?: "skip" | "once";
|
|
24
|
+
readonly tz?: string;
|
|
25
|
+
}
|
package/src/server/error.ts
CHANGED
|
@@ -1,19 +1,35 @@
|
|
|
1
1
|
import { Cause, Data, Duration, Redacted } from "effect";
|
|
2
|
-
import { failureOutput } from "#internal/failureOutput.ts";
|
|
2
|
+
import { failureOutput } from "#server/internal/failureOutput.ts";
|
|
3
3
|
|
|
4
4
|
export type PgBossOperation =
|
|
5
5
|
| "counts"
|
|
6
6
|
| "deadLetteredJobs"
|
|
7
|
+
| "deleteQueue"
|
|
7
8
|
| "enqueue"
|
|
8
9
|
| "failedJobs"
|
|
9
10
|
| "getJob"
|
|
10
11
|
| "health"
|
|
11
12
|
| "install"
|
|
13
|
+
| "inspect"
|
|
12
14
|
| "register"
|
|
15
|
+
| "refreshQueueStats"
|
|
13
16
|
| "retry"
|
|
14
17
|
| "settle"
|
|
15
18
|
| "start"
|
|
16
|
-
| "stop"
|
|
19
|
+
| "stop"
|
|
20
|
+
| "unschedule";
|
|
21
|
+
|
|
22
|
+
export class PgBossNotFoundError extends Data.TaggedError("PgBossNotFoundError")<{
|
|
23
|
+
readonly operation: "deleteQueue" | "unschedule";
|
|
24
|
+
readonly queue: string;
|
|
25
|
+
readonly key?: string;
|
|
26
|
+
}> {
|
|
27
|
+
override get message(): string {
|
|
28
|
+
return this.operation === "deleteQueue"
|
|
29
|
+
? `Queue ${this.queue} does not exist`
|
|
30
|
+
: `Schedule ${this.queue} with key ${JSON.stringify(this.key ?? "")} does not exist`;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
17
33
|
|
|
18
34
|
export class PgBossError extends Data.TaggedError("PgBossError")<{
|
|
19
35
|
readonly operation: PgBossOperation;
|
package/src/server/health.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { DateTime, Option } from "effect";
|
|
2
|
-
import type { JobWithMetadata } from "pg-boss";
|
|
3
2
|
import type { JobFailure } from "#JobFailure.ts";
|
|
3
|
+
import type { JobState } from "#server/job.ts";
|
|
4
4
|
|
|
5
5
|
export interface QueueCounts {
|
|
6
6
|
readonly activeCount: number;
|
|
@@ -42,7 +42,7 @@ export interface ListedJob<TData> {
|
|
|
42
42
|
readonly retryCount: number;
|
|
43
43
|
readonly retryLimit: number;
|
|
44
44
|
readonly startedOn: Option.Option<DateTime.Utc>;
|
|
45
|
-
readonly state:
|
|
45
|
+
readonly state: JobState;
|
|
46
46
|
}
|
|
47
47
|
|
|
48
48
|
export interface DeadLetteredJob<TData> extends ListedJob<TData> {
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { type DateTime, Effect } from "effect";
|
|
2
|
+
import { defineService } from "@shivaedev/service/defineService.ts";
|
|
3
|
+
import { genericMethod } from "@shivaedev/service/genericMethod.ts";
|
|
4
|
+
import { inspection } from "#server/adapters/inspection.ts";
|
|
5
|
+
import type { inspectionChanges } from "#server/adapters/inspectionChanges.ts";
|
|
6
|
+
import type { inspectionReads } from "#server/adapters/inspectionReads.ts";
|
|
7
|
+
import type { JobPayloadSchema, QueueDefinition } from "#server/definition.ts";
|
|
8
|
+
import { PgBoss } from "#server/PgBoss.ts";
|
|
9
|
+
import type { PgBossService } from "#server/service.ts";
|
|
10
|
+
|
|
11
|
+
export type SnapshotQueue = Pick<QueueDefinition<string, JobPayloadSchema>, "name" | "schema">;
|
|
12
|
+
|
|
13
|
+
export interface UnfinishedJob<TQueue extends SnapshotQueue> {
|
|
14
|
+
readonly data: TQueue["schema"]["Type"];
|
|
15
|
+
readonly id: string;
|
|
16
|
+
readonly queue: TQueue["name"];
|
|
17
|
+
readonly startAfter: DateTime.Utc;
|
|
18
|
+
readonly state: "active" | "created" | "deferred" | "failed" | "retry";
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export const PgBossInspection = defineService({
|
|
22
|
+
id: "@shivaedev/jobs/PgBossInspection",
|
|
23
|
+
initialize: Effect.gen(function* () {
|
|
24
|
+
const acquired = yield* PgBoss;
|
|
25
|
+
return yield* inspection(acquired.client, acquired.schema);
|
|
26
|
+
}),
|
|
27
|
+
methods: (service) => ({
|
|
28
|
+
busy: service.busy,
|
|
29
|
+
changes: service.changes,
|
|
30
|
+
counts: service.counts,
|
|
31
|
+
deadLetteredJobs: genericMethod(service.deadLetteredJobs),
|
|
32
|
+
deferred: service.deferred,
|
|
33
|
+
failedJobs: genericMethod(service.failedJobs),
|
|
34
|
+
getJob: genericMethod(service.getJob),
|
|
35
|
+
health: service.health,
|
|
36
|
+
jobs: genericMethod(service.jobs),
|
|
37
|
+
queue: service.queue,
|
|
38
|
+
schedules: service.schedules,
|
|
39
|
+
schemaVersion: service.schemaVersion,
|
|
40
|
+
snapshot: genericMethod(service.snapshot),
|
|
41
|
+
storedJobs: service.storedJobs,
|
|
42
|
+
}),
|
|
43
|
+
requires: [PgBoss] as const,
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
export type PgBossInspectionService = ReturnType<typeof inspectionReads> &
|
|
47
|
+
Pick<PgBossService, "counts" | "deadLetteredJobs" | "failedJobs" | "getJob"> & {
|
|
48
|
+
readonly health: (queues: readonly { readonly name: string }[]) => ReturnType<PgBossService["health"]>;
|
|
49
|
+
readonly changes: (queue?: { readonly name: string }) => ReturnType<typeof inspectionChanges>;
|
|
50
|
+
};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { Effect, Redacted } from "effect";
|
|
2
|
+
import { clientErrorLogger } from "#server/adapters/clientErrorLogger.ts";
|
|
3
|
+
import type { PgBossOptions } from "#server/service.ts";
|
|
4
|
+
import { ClientEngine } from "./lifecycle.ts";
|
|
5
|
+
|
|
6
|
+
export const acquireClient = Effect.fnUntraced(function* (options: PgBossOptions) {
|
|
7
|
+
const { connectionString, clientFactory, clientCacheKey, stop, ...settings } = options;
|
|
8
|
+
const constructorOptions = {
|
|
9
|
+
...settings,
|
|
10
|
+
idleTimeoutMillis: settings.idleTimeoutMillis ?? 60_000,
|
|
11
|
+
maxLifetimeSeconds: settings.maxLifetimeSeconds ?? 600,
|
|
12
|
+
...(connectionString === undefined ? {} : { connectionString: Redacted.value(connectionString) }),
|
|
13
|
+
};
|
|
14
|
+
const report = yield* clientErrorLogger();
|
|
15
|
+
const engine = yield* ClientEngine;
|
|
16
|
+
const acquired = yield* engine.acquire(
|
|
17
|
+
{
|
|
18
|
+
clientCacheKey,
|
|
19
|
+
clientFactory,
|
|
20
|
+
constructor: constructorOptions,
|
|
21
|
+
},
|
|
22
|
+
report,
|
|
23
|
+
stop,
|
|
24
|
+
);
|
|
25
|
+
return { ...acquired, schema: settings.schema, stop };
|
|
26
|
+
});
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { ClientDatabase } from "#server/ClientDatabase.ts";
|
|
2
2
|
|
|
3
3
|
// pg-boss offers no hook for a worker fetch that finds nothing, so the controller recognizes its claim statement on the client's database.
|
|
4
4
|
const claim = /UPDATE\s+\S+\s+j\s+SET\s+state\s*=\s*'active'/u;
|
|
@@ -9,7 +9,7 @@ export interface TestingFetches {
|
|
|
9
9
|
readonly passedSince: (queue: string, begun: number) => number;
|
|
10
10
|
}
|
|
11
11
|
|
|
12
|
-
export function testingFetches(db:
|
|
12
|
+
export function testingFetches(db: ClientDatabase, changed: () => void): TestingFetches {
|
|
13
13
|
const begun = new Map<string, number>();
|
|
14
14
|
const passed = new Map<string, number[]>();
|
|
15
15
|
const executeSql = db.executeSql.bind(db);
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { Effect, Schema } from "effect";
|
|
2
|
-
import type { PgBossClient } from "#client.ts";
|
|
3
|
-
import { toPgBossError } from "#error.ts";
|
|
4
|
-
import type { QueueCounts } from "#health.ts";
|
|
5
|
-
import { quotedSchema } from "#internal/storedRows.ts";
|
|
2
|
+
import type { PgBossClient } from "#server/client.ts";
|
|
3
|
+
import { toPgBossError } from "#server/error.ts";
|
|
4
|
+
import type { QueueCounts } from "#server/health.ts";
|
|
5
|
+
import { quotedSchema } from "#server/internal/storedRows.ts";
|
|
6
6
|
|
|
7
7
|
const Counts = Schema.Struct({
|
|
8
8
|
activeCount: Schema.Number,
|
|
@@ -11,7 +11,7 @@ const Counts = Schema.Struct({
|
|
|
11
11
|
totalCount: Schema.Number,
|
|
12
12
|
});
|
|
13
13
|
|
|
14
|
-
export function countsFor(client: PgBossClient, schema: string, name: string): Effect.Effect<QueueCounts, import("#error.ts").PgBossError> {
|
|
14
|
+
export function countsFor(client: PgBossClient, schema: string, name: string): Effect.Effect<QueueCounts, import("#server/error.ts").PgBossError> {
|
|
15
15
|
return Effect.tryPromise({
|
|
16
16
|
catch: (error) => toPgBossError("counts", error, name),
|
|
17
17
|
try: async () => {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { WorkerJob } from "#server/job.ts";
|
|
2
2
|
|
|
3
|
-
export function deadlineOf(job:
|
|
3
|
+
export function deadlineOf(job: WorkerJob<unknown>): number {
|
|
4
4
|
if (!("startedOn" in job && job.startedOn instanceof Date && Number.isFinite(job.startedOn.getTime()))) {
|
|
5
5
|
throw new TypeError("Worker jobs must include pg-boss startedOn metadata");
|
|
6
6
|
}
|
|
@@ -1,42 +1,25 @@
|
|
|
1
1
|
import { Clock, DateTime, Effect, Schema } from "effect";
|
|
2
|
-
import
|
|
3
|
-
import
|
|
4
|
-
import {
|
|
5
|
-
import { toPgBossError } from "#error.ts";
|
|
6
|
-
import { deferralObservers, deferredAttempt } from "#internal/deferral.ts";
|
|
7
|
-
import { settleDeferral } from "#internal/settleDeferral.ts";
|
|
2
|
+
import { RetryAt } from "#server/definition.ts";
|
|
3
|
+
import { deferredAttempt } from "#server/internal/deferral.ts";
|
|
4
|
+
import { type JobAttempt, JobEngine } from "#server/internal/engine.ts";
|
|
8
5
|
|
|
9
6
|
const recordDeferral = Effect.fnUntraced(function* (at: string, reason: string) {
|
|
10
7
|
const span = yield* Effect.currentSpan.pipe(Effect.orDie);
|
|
11
8
|
span.event("job.deferred", yield* Clock.currentTimeNanos, { at, reason });
|
|
12
9
|
});
|
|
13
10
|
|
|
14
|
-
export function deferrableAttempt<A, E, R>(
|
|
15
|
-
effect: Effect.Effect<A, E, R>,
|
|
16
|
-
client: PgBossClient,
|
|
17
|
-
schema: string,
|
|
18
|
-
job: Job<unknown>,
|
|
19
|
-
maxDeferrals: number,
|
|
20
|
-
) {
|
|
11
|
+
export function deferrableAttempt<A, E, R>(effect: Effect.Effect<A, E, R>, job: JobAttempt, maxDeferrals: number) {
|
|
21
12
|
return effect.pipe(
|
|
22
13
|
Effect.catchIf(Schema.is(RetryAt), (error) => {
|
|
23
14
|
if (maxDeferrals === 0) {
|
|
24
15
|
return Effect.fail(error);
|
|
25
16
|
}
|
|
26
17
|
const at = DateTime.formatIso(error.at);
|
|
27
|
-
return Effect.
|
|
28
|
-
catch: (failure) => toPgBossError("settle", failure, job.name),
|
|
29
|
-
try: () => settleDeferral(client, schema, job, at, error.reason, maxDeferrals),
|
|
30
|
-
}).pipe(
|
|
18
|
+
return Effect.flatMap(JobEngine, (engine) => engine.settleDeferral(job, at, error.reason, maxDeferrals)).pipe(
|
|
31
19
|
Effect.flatMap((settled) => {
|
|
32
20
|
if (settled.claimed && !settled.deferred) {
|
|
33
21
|
return Effect.fail(error);
|
|
34
22
|
}
|
|
35
|
-
// Native batch settlement must not match a sibling's new claim at the unchanged retry count.
|
|
36
|
-
job.retryCount = Number.MAX_SAFE_INTEGER;
|
|
37
|
-
if (settled.deferred) {
|
|
38
|
-
deferralObservers.get(client)?.();
|
|
39
|
-
}
|
|
40
23
|
return (settled.deferred ? recordDeferral(at, error.reason) : Effect.void).pipe(Effect.as(deferredAttempt));
|
|
41
24
|
}),
|
|
42
25
|
);
|
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
import { Schema } from "effect";
|
|
2
|
-
import type {
|
|
3
|
-
import type { PgBossClient } from "#client.ts";
|
|
2
|
+
import type { WorkerJob } from "#server/job.ts";
|
|
4
3
|
|
|
5
4
|
export const deferredAttempt = Symbol("deferredAttempt");
|
|
6
|
-
export const deferralObservers = new WeakMap<PgBossClient, () => void>();
|
|
7
5
|
export const STATELY_DEFERRAL_POLICY = "effect-stately-deferred";
|
|
8
6
|
|
|
9
7
|
export const Deferral = Schema.Struct({
|
|
@@ -13,7 +11,7 @@ export const Deferral = Schema.Struct({
|
|
|
13
11
|
|
|
14
12
|
const Output = Schema.Struct({ jobDeferral: Deferral });
|
|
15
13
|
|
|
16
|
-
export function deferralOf(job:
|
|
14
|
+
export function deferralOf(job: WorkerJob<unknown>) {
|
|
17
15
|
const output: unknown = Reflect.get(job, "output");
|
|
18
16
|
return Schema.is(Output)(output) ? output.jobDeferral : undefined;
|
|
19
17
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { STATELY_DEFERRAL_POLICY } from "#internal/deferral.ts";
|
|
2
|
-
import { quotedSchema } from "#internal/storedRows.ts";
|
|
1
|
+
import { STATELY_DEFERRAL_POLICY } from "#server/internal/deferral.ts";
|
|
2
|
+
import { quotedSchema } from "#server/internal/storedRows.ts";
|
|
3
3
|
|
|
4
4
|
export function deferralStorePlan(schema: string): string {
|
|
5
5
|
const quoted = quotedSchema(schema);
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { Context, type Effect } from "effect";
|
|
2
|
+
import type { PgBossClient } from "#server/client.ts";
|
|
3
|
+
import type { PgBossError, PgBossTestingError } from "#server/error.ts";
|
|
4
|
+
import type { PgBossService } from "#server/service.ts";
|
|
5
|
+
|
|
6
|
+
export type StoredJob = Awaited<ReturnType<NonNullable<PgBossClient["findJobs"]>>>[number];
|
|
7
|
+
export type JobAttempt = Pick<StoredJob, "name" | "id" | "retryCount">;
|
|
8
|
+
export type Listing = "deadLetteredJobs" | "failedJobs";
|
|
9
|
+
|
|
10
|
+
export class JobEngine extends Context.Service<
|
|
11
|
+
JobEngine,
|
|
12
|
+
Pick<PgBossService, "deleteQueue" | "refreshQueueStats" | "unschedule"> & {
|
|
13
|
+
readonly getJob: (queue: string, id: string) => Effect.Effect<StoredJob | undefined, PgBossError>;
|
|
14
|
+
readonly retry: (queue: string, id: string) => Effect.Effect<void, PgBossError>;
|
|
15
|
+
readonly listJobs: (
|
|
16
|
+
listing: Listing,
|
|
17
|
+
queue: string,
|
|
18
|
+
after: readonly [string, string] | undefined,
|
|
19
|
+
limit: number,
|
|
20
|
+
) => Effect.Effect<readonly unknown[], PgBossError>;
|
|
21
|
+
readonly settleDeferral: (
|
|
22
|
+
job: JobAttempt,
|
|
23
|
+
at: string,
|
|
24
|
+
reason: string,
|
|
25
|
+
maxDeferrals: number,
|
|
26
|
+
) => Effect.Effect<{ readonly claimed: boolean; readonly deferred: boolean }, PgBossError>;
|
|
27
|
+
}
|
|
28
|
+
>()("@shivaedev/jobs/JobEngine") {}
|
|
29
|
+
|
|
30
|
+
export class TestingEngine extends Context.Service<
|
|
31
|
+
TestingEngine,
|
|
32
|
+
{
|
|
33
|
+
readonly expireAttempt: (job: JobAttempt, cause?: "expiry" | "heartbeat") => Effect.Effect<void, PgBossTestingError>;
|
|
34
|
+
}
|
|
35
|
+
>()("@shivaedev/jobs/TestingEngine") {}
|
|
@@ -1,9 +1,22 @@
|
|
|
1
1
|
import { Effect, Option, Redacted, Schema } from "effect";
|
|
2
|
-
import {
|
|
3
|
-
import
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import type {
|
|
2
|
+
import { payloadJobId, payloadKey } from "#server/adapters/payloadIdentity.ts";
|
|
3
|
+
import { transactionDb } from "#server/adapters/transactionDb.ts";
|
|
4
|
+
import type { PgBossClient } from "#server/client.ts";
|
|
5
|
+
import type { QueueDefinition } from "#server/definition.ts";
|
|
6
|
+
import type { EnqueueOptions } from "#server/enqueueOptions.ts";
|
|
7
|
+
import { PgBossPayloadError, toPgBossError } from "#server/error.ts";
|
|
8
|
+
import { capturePayload } from "#server/internal/tracing.ts";
|
|
9
|
+
import type { PgBossService } from "#server/service.ts";
|
|
10
|
+
|
|
11
|
+
function identityOptions(queue: Pick<QueueDefinition, "id" | "key" | "name">, payload: object, options?: EnqueueOptions) {
|
|
12
|
+
return queue.id === undefined && queue.key === undefined
|
|
13
|
+
? options
|
|
14
|
+
: {
|
|
15
|
+
...options,
|
|
16
|
+
...(queue.id === undefined ? {} : { id: payloadJobId(queue.name, queue.id, payload) }),
|
|
17
|
+
...(queue.key === undefined ? {} : { singletonKey: payloadKey(queue.key, payload) }),
|
|
18
|
+
};
|
|
19
|
+
}
|
|
7
20
|
|
|
8
21
|
export function enqueueFor(client: PgBossClient): PgBossService["enqueue"] {
|
|
9
22
|
return (queue, payload, options) =>
|
|
@@ -20,7 +33,7 @@ export function enqueueFor(client: PgBossClient): PgBossService["enqueue"] {
|
|
|
20
33
|
}
|
|
21
34
|
const data = yield* capturePayload(encoded);
|
|
22
35
|
const db = yield* transactionDb;
|
|
23
|
-
const sendOptions = queue
|
|
36
|
+
const sendOptions = identityOptions(queue, payload, options);
|
|
24
37
|
const send = Effect.tryPromise({
|
|
25
38
|
catch: (error) => toPgBossError("enqueue", error, queue.name),
|
|
26
39
|
try: () => client.send(queue.name, data, db === undefined ? sendOptions : { ...sendOptions, db }),
|