@shivaedev/jobs 0.30.0 → 0.31.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 +26 -0
- package/README.md +52 -19
- 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/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 +50 -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/observeTestingSettlements.d.ts +6 -0
- package/dist/server/adapters/observeTestingSettlements.d.ts.map +1 -0
- package/dist/server/adapters/observeTestingSettlements.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/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 +14 -0
- package/dist/server/adapters/testingClient.d.ts.map +1 -0
- package/dist/server/{internal → adapters}/testingClient.js +12 -11
- package/dist/server/adapters/testingClient.js.map +1 -0
- package/dist/server/adapters/testingController.d.ts +34 -0
- package/dist/server/adapters/testingController.d.ts.map +1 -0
- package/dist/server/adapters/testingController.js +98 -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 +23 -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/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 +92 -18
- package/dist/server/client.d.ts.map +1 -1
- package/dist/server/clientOptions.d.ts +75 -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 +17 -15
- package/dist/server/definition.d.ts.map +1 -1
- package/dist/server/definition.js +3 -1
- package/dist/server/definition.js.map +1 -1
- package/dist/server/engineClient.d.ts +26 -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 +22 -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/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 +3 -3
- package/dist/server/internal/deferral.d.ts.map +1 -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 +30 -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 +3 -3
- 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.js +2 -2
- 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 +15 -11
- 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 +6 -6
- 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/testingDeferrals.d.ts +3 -3
- package/dist/server/internal/testingDeferrals.d.ts.map +1 -1
- package/dist/server/internal/testingDeferrals.js +2 -2
- package/dist/server/internal/testingDeferrals.js.map +1 -1
- package/dist/server/internal/testingIdle.d.ts +3 -3
- package/dist/server/internal/testingIdle.d.ts.map +1 -1
- package/dist/server/internal/testingIdle.js +2 -2
- package/dist/server/internal/testingIdle.js.map +1 -1
- package/dist/server/internal/testingReadout.d.ts +7 -41
- package/dist/server/internal/testingReadout.d.ts.map +1 -1
- package/dist/server/internal/testingReadout.js +2 -2
- package/dist/server/internal/testingReadout.js.map +1 -1
- package/dist/server/internal/testingRegistrations.d.ts +1 -1
- package/dist/server/internal/testingRegistrations.d.ts.map +1 -1
- package/dist/server/internal/testingSchedules.d.ts +3 -3
- package/dist/server/internal/testingSchedules.d.ts.map +1 -1
- package/dist/server/internal/testingSchedules.js +1 -1
- package/dist/server/internal/testingSchedules.js.map +1 -1
- package/dist/server/internal/testingSnapshot.d.ts +4 -4
- package/dist/server/internal/testingSnapshot.d.ts.map +1 -1
- package/dist/server/internal/testingSnapshot.js +2 -2
- package/dist/server/internal/testingSnapshot.js.map +1 -1
- package/dist/server/internal/testingWaits.d.ts +8 -7
- package/dist/server/internal/testingWaits.d.ts.map +1 -1
- package/dist/server/internal/testingWaits.js +3 -3
- 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 +18 -7
- package/dist/server/schema.js.map +1 -1
- package/dist/server/service.d.ts +15 -10
- package/dist/server/service.d.ts.map +1 -1
- package/dist/server/service.js +18 -27
- package/dist/server/service.js.map +1 -1
- package/dist/server/testing.d.ts +30 -69
- 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/installSchema.ts +2 -2
- package/src/server/adapters/jobEngine.ts +59 -0
- package/src/server/adapters/lifecycle.ts +67 -0
- package/src/server/adapters/listJobs.ts +43 -0
- package/src/server/{internal → adapters}/observeTestingSettlements.ts +2 -2
- package/src/server/adapters/queueAdministration.ts +47 -0
- 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 +31 -26
- package/src/server/adapters/testingController.ts +109 -0
- package/src/server/adapters/testingDueNow.ts +5 -5
- package/src/server/adapters/testingEngine.ts +28 -0
- package/src/server/adapters/testingExpirations.ts +6 -4
- package/src/server/adapters/transactionDb.ts +2 -2
- package/src/server/client.ts +83 -30
- package/src/server/clientOptions.ts +81 -0
- package/src/server/defineSchedule.ts +3 -2
- package/src/server/definition.ts +20 -17
- package/src/server/engineClient.ts +24 -0
- package/src/server/enqueueOptions.ts +20 -0
- package/src/server/error.ts +17 -2
- package/src/server/health.ts +2 -2
- 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 +3 -3
- package/src/server/internal/deferralStorePlan.ts +2 -2
- package/src/server/internal/definitionOptions.ts +1 -1
- package/src/server/internal/engine.ts +41 -0
- package/src/server/internal/enqueueFor.ts +5 -5
- 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 +2 -2
- package/src/server/internal/lifecycle.ts +14 -55
- package/src/server/internal/makeService.ts +21 -13
- package/src/server/internal/register.ts +9 -9
- 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/testingDeferrals.ts +5 -5
- package/src/server/internal/testingIdle.ts +5 -5
- package/src/server/internal/testingReadout.ts +12 -6
- package/src/server/internal/testingRegistrations.ts +1 -1
- package/src/server/internal/testingSchedules.ts +4 -4
- package/src/server/internal/testingSnapshot.ts +6 -6
- package/src/server/internal/testingWaits.ts +11 -10
- 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 +18 -7
- package/src/server/service.ts +40 -44
- package/src/server/testing.ts +7 -109
- 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.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/src/server/internal/listJobs.ts +0 -116
- /package/dist/server/{defaultClientFactory.js → adapters/defaultClientFactory.js} +0 -0
- /package/dist/server/{internal → adapters}/observeTestingSettlements.js +0 -0
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { deadLetterResolutionPlan } from "#internal/deadLetterResolutionPlan.ts";
|
|
2
|
-
import { deferralStorePlan } from "#internal/deferralStorePlan.ts";
|
|
1
|
+
import { deadLetterResolutionPlan } from "#server/internal/deadLetterResolutionPlan.ts";
|
|
2
|
+
import { deferralStorePlan } from "#server/internal/deferralStorePlan.ts";
|
|
3
3
|
|
|
4
4
|
export function jobStorePlans(schema: string): readonly string[] {
|
|
5
5
|
return [deferralStorePlan(schema), deadLetterResolutionPlan(schema)];
|
|
@@ -1,16 +1,12 @@
|
|
|
1
|
-
import { Effect } from "effect";
|
|
2
|
-
import type {
|
|
3
|
-
import type {
|
|
4
|
-
import {
|
|
5
|
-
import { PgBossClientOptionsError, type PgBossError, toPgBossError } from "#error.ts";
|
|
6
|
-
import { jobStorePlans } from "#internal/jobStorePlans.ts";
|
|
7
|
-
import { acquireCachedClient, releaseCachedClient } from "./clientCache.ts";
|
|
8
|
-
import { observeClientErrors } from "./clientErrors.ts";
|
|
1
|
+
import { Context, type Effect, type Scope } from "effect";
|
|
2
|
+
import type { PgBossClient, PgBossClientFactory } from "#server/client.ts";
|
|
3
|
+
import type { ClientOptions, StopOptions } from "#server/clientOptions.ts";
|
|
4
|
+
import type { PgBossClientOptionsError, PgBossError } from "#server/error.ts";
|
|
9
5
|
|
|
10
6
|
export interface AcquireClientOptions {
|
|
11
7
|
readonly clientCacheKey?: string | symbol | undefined;
|
|
12
8
|
readonly clientFactory?: PgBossClientFactory | undefined;
|
|
13
|
-
readonly constructor:
|
|
9
|
+
readonly constructor: ClientOptions;
|
|
14
10
|
}
|
|
15
11
|
|
|
16
12
|
export interface AcquiredClient {
|
|
@@ -19,50 +15,13 @@ export interface AcquiredClient {
|
|
|
19
15
|
readonly reused: boolean;
|
|
20
16
|
}
|
|
21
17
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
return client;
|
|
33
|
-
} catch (error) {
|
|
34
|
-
try {
|
|
35
|
-
await client.stop();
|
|
36
|
-
} catch {
|
|
37
|
-
// Preserve the startup failure; stop is best effort on failed acquisition.
|
|
38
|
-
}
|
|
39
|
-
throw error;
|
|
18
|
+
export class ClientEngine extends Context.Service<
|
|
19
|
+
ClientEngine,
|
|
20
|
+
{
|
|
21
|
+
readonly acquire: (
|
|
22
|
+
options: AcquireClientOptions,
|
|
23
|
+
report: (error: Error) => void,
|
|
24
|
+
stop?: StopOptions,
|
|
25
|
+
) => Effect.Effect<AcquiredClient, PgBossError | PgBossClientOptionsError, Scope.Scope>;
|
|
40
26
|
}
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
export function acquireClient(
|
|
44
|
-
options: AcquireClientOptions,
|
|
45
|
-
report: (error: Error) => void,
|
|
46
|
-
): Effect.Effect<AcquiredClient, PgBossError | PgBossClientOptionsError> {
|
|
47
|
-
return Effect.tryPromise({
|
|
48
|
-
catch: (error) => (error instanceof PgBossClientOptionsError ? error : toPgBossError("start", error)),
|
|
49
|
-
try: async () => {
|
|
50
|
-
const cacheKey = options.clientCacheKey;
|
|
51
|
-
return cacheKey === undefined
|
|
52
|
-
? { client: await startClient(options, report), reused: false }
|
|
53
|
-
: { cacheKey, ...(await acquireCachedClient(cacheKey, options.constructor, () => startClient(options, report))) };
|
|
54
|
-
},
|
|
55
|
-
});
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
export function releaseClient(acquired: AcquiredClient, stopOptions?: StopOptions): Effect.Effect<void> {
|
|
59
|
-
return Effect.tryPromise({
|
|
60
|
-
catch: (error) => toPgBossError("stop", error),
|
|
61
|
-
try: async () => {
|
|
62
|
-
const client = acquired.cacheKey === undefined ? acquired.client : await releaseCachedClient(acquired.cacheKey);
|
|
63
|
-
if (client !== undefined) {
|
|
64
|
-
await client.stop(stopOptions);
|
|
65
|
-
}
|
|
66
|
-
},
|
|
67
|
-
}).pipe(Effect.catch((error) => Effect.logError(error)));
|
|
68
|
-
}
|
|
27
|
+
>()("@shivaedev/jobs/ClientEngine") {}
|
|
@@ -1,19 +1,27 @@
|
|
|
1
|
-
import
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import
|
|
1
|
+
import { Effect } from "effect";
|
|
2
|
+
import type { PgBossClient } from "#server/client.ts";
|
|
3
|
+
import { countsFor } from "#server/internal/countsFor.ts";
|
|
4
|
+
import { JobEngine } from "#server/internal/engine.ts";
|
|
5
|
+
import { enqueueFor } from "#server/internal/enqueueFor.ts";
|
|
6
|
+
import { healthFor } from "#server/internal/healthFor.ts";
|
|
7
|
+
import { jobControl } from "#server/internal/jobControl.ts";
|
|
8
|
+
import { jobListings } from "#server/internal/jobListings.ts";
|
|
9
|
+
import type { PgBossService } from "#server/service.ts";
|
|
8
10
|
|
|
9
|
-
export
|
|
11
|
+
export const makeService = Effect.fnUntraced(function* (
|
|
12
|
+
client: PgBossClient,
|
|
13
|
+
names: readonly string[],
|
|
14
|
+
schema = "pgboss",
|
|
15
|
+
): Effect.fn.Return<PgBossService, never, JobEngine> {
|
|
16
|
+
const engine = yield* JobEngine;
|
|
10
17
|
return {
|
|
11
18
|
counts: (queue) => countsFor(client, schema, queue.name),
|
|
12
|
-
|
|
19
|
+
deleteQueue: engine.deleteQueue,
|
|
20
|
+
...(yield* jobListings),
|
|
13
21
|
enqueue: enqueueFor(client),
|
|
14
|
-
|
|
15
|
-
getJob: getJobFor(client),
|
|
22
|
+
...(yield* jobControl),
|
|
16
23
|
health: (queues) => healthFor(client, queues === undefined ? names : queues.map((queue) => queue.name)),
|
|
17
|
-
|
|
24
|
+
refreshQueueStats: engine.refreshQueueStats,
|
|
25
|
+
unschedule: engine.unschedule,
|
|
18
26
|
};
|
|
19
|
-
}
|
|
27
|
+
});
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { type Context, Effect, Scope } from "effect";
|
|
2
|
-
import
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import type {
|
|
6
|
-
import type { JobPayloadSchema, JobRegistration, QueueDefinition, QueueWorker, ScheduleDefinition, ScheduledWorker } from "#definition.ts";
|
|
7
|
-
import { PgBossQueueOptionsError, toPgBossError } from "#error.ts";
|
|
8
|
-
import { ensureQueue } from "#internal/ensureQueue.ts";
|
|
9
|
-
import { runQueueWorker } from "#internal/runQueueWorker.ts";
|
|
10
|
-
import { registerTestingQueue } from "#internal/testingRegistrations.ts";
|
|
2
|
+
import { registerWorker } from "#server/adapters/registerWorker.ts";
|
|
3
|
+
import { workerDiagnostics } from "#server/adapters/workerDiagnostics.ts";
|
|
4
|
+
import type { PgBossClient } from "#server/client.ts";
|
|
5
|
+
import type { StopOptions } from "#server/clientOptions.ts";
|
|
6
|
+
import type { JobPayloadSchema, JobRegistration, QueueDefinition, QueueWorker, ScheduleDefinition, ScheduledWorker } from "#server/definition.ts";
|
|
7
|
+
import { PgBossQueueOptionsError, toPgBossError } from "#server/error.ts";
|
|
8
|
+
import { ensureQueue } from "#server/internal/ensureQueue.ts";
|
|
9
|
+
import { runQueueWorker } from "#server/internal/runQueueWorker.ts";
|
|
10
|
+
import { registerTestingQueue } from "#server/internal/testingRegistrations.ts";
|
|
11
11
|
|
|
12
12
|
function registrationDefinition(registration: JobRegistration): QueueDefinition | ScheduleDefinition {
|
|
13
13
|
if (registration._tag === "QueueDefinition") {
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { type Context, Effect, Option, Scope } from "effect";
|
|
2
|
-
import type { StopOptions } from "pg-boss";
|
|
3
2
|
import { WorkerRelease } from "@shivaedev/sql/WorkerRelease.ts";
|
|
4
|
-
import { retireJobs } from "#adapters/retireJobs.ts";
|
|
5
|
-
import type { PgBossClient } from "#client.ts";
|
|
6
|
-
import type {
|
|
7
|
-
import {
|
|
3
|
+
import { retireJobs } from "#server/adapters/retireJobs.ts";
|
|
4
|
+
import type { PgBossClient } from "#server/client.ts";
|
|
5
|
+
import type { StopOptions } from "#server/clientOptions.ts";
|
|
6
|
+
import type { JobRegistration } from "#server/definition.ts";
|
|
7
|
+
import { toPgBossError } from "#server/error.ts";
|
|
8
8
|
import { registerJobs, registrationName } from "./register.ts";
|
|
9
9
|
|
|
10
10
|
export const registerReleasedJobs = Effect.fnUntraced(function* <R>(
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { Clock, Effect } from "effect";
|
|
2
2
|
import { redactDiagnosticCause } from "@shivaedev/errors/redactCause.ts";
|
|
3
|
-
import { batchClockOffset } from "#adapters/batchClockOffset.ts";
|
|
4
|
-
import type { PgBossClient } from "#client.ts";
|
|
5
|
-
import { toPgBossError } from "#error.ts";
|
|
3
|
+
import { batchClockOffset } from "#server/adapters/batchClockOffset.ts";
|
|
4
|
+
import type { PgBossClient } from "#server/client.ts";
|
|
5
|
+
import { toPgBossError } from "#server/error.ts";
|
|
6
6
|
|
|
7
7
|
export function retryWake(client: PgBossClient, schema: string, name: string, id: string, registration: Promise<string>): Effect.Effect<void> {
|
|
8
8
|
return Effect.gen(function* () {
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import { Effect, Redacted, Schema } from "effect";
|
|
2
|
-
import
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import type
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
2
|
+
import { deferralCount } from "#server/adapters/deferralCount.ts";
|
|
3
|
+
import { workerDiagnostics } from "#server/adapters/workerDiagnostics.ts";
|
|
4
|
+
import type { PgBossClient } from "#server/client.ts";
|
|
5
|
+
import { type JobPayloadSchema, jobContext, type QueueWorker } from "#server/definition.ts";
|
|
6
|
+
import { PgBossPayloadError } from "#server/error.ts";
|
|
7
|
+
import { payloadOf } from "#server/internal/tracing.ts";
|
|
8
|
+
import type { WorkerJob } from "#server/job.ts";
|
|
9
9
|
|
|
10
10
|
export function runQueueWorker<R>(
|
|
11
11
|
worker: QueueWorker<JobPayloadSchema & { readonly DecodingServices: R }, R>,
|
|
12
|
-
job:
|
|
12
|
+
job: WorkerJob<unknown>,
|
|
13
13
|
deadline: number,
|
|
14
14
|
client: PgBossClient,
|
|
15
15
|
schema: string,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Effect, Redacted, Schema } from "effect";
|
|
2
|
-
import type { JobPayloadSchema } from "#definition.ts";
|
|
3
|
-
import { PgBossPayloadError } from "#error.ts";
|
|
4
|
-
import { payloadOf } from "#internal/tracing.ts";
|
|
2
|
+
import type { JobPayloadSchema } from "#server/definition.ts";
|
|
3
|
+
import { PgBossPayloadError } from "#server/error.ts";
|
|
4
|
+
import { payloadOf } from "#server/internal/tracing.ts";
|
|
5
5
|
|
|
6
6
|
export function quotedSchema(schema: string): string {
|
|
7
7
|
return `"${schema.replaceAll('"', '""')}"`;
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { DateTime } from "effect";
|
|
2
|
-
import type {
|
|
3
|
-
import type {
|
|
4
|
-
import { deferralOf } from "#internal/deferral.ts";
|
|
5
|
-
import { testingOperation } from "#internal/testingReadout.ts";
|
|
2
|
+
import type { QueueDefinition } from "#server/definition.ts";
|
|
3
|
+
import type { EngineClient } from "#server/engineClient.ts";
|
|
4
|
+
import { deferralOf } from "#server/internal/deferral.ts";
|
|
5
|
+
import { testingOperation } from "#server/internal/testingReadout.ts";
|
|
6
6
|
|
|
7
|
-
export function testingDeferrals(client: () =>
|
|
7
|
+
export function testingDeferrals(client: () => EngineClient) {
|
|
8
8
|
return {
|
|
9
9
|
deferred: (queue: Pick<QueueDefinition, "name">) =>
|
|
10
10
|
testingOperation(
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { Clock, Effect, Schema } from "effect";
|
|
2
|
-
import type {
|
|
3
|
-
import type { PgBossTestingError } from "#error.ts";
|
|
4
|
-
import { quotedSchema } from "#internal/storedRows.ts";
|
|
5
|
-
import { testingOperation } from "#internal/testingReadout.ts";
|
|
2
|
+
import type { EngineClient } from "#server/engineClient.ts";
|
|
3
|
+
import type { PgBossTestingError } from "#server/error.ts";
|
|
4
|
+
import { quotedSchema } from "#server/internal/storedRows.ts";
|
|
5
|
+
import { testingOperation } from "#server/internal/testingReadout.ts";
|
|
6
6
|
|
|
7
7
|
export interface TestingBatch {
|
|
8
8
|
readonly name: string;
|
|
@@ -17,7 +17,7 @@ export interface TestingWork {
|
|
|
17
17
|
const Busy = Schema.Struct({ busy: Schema.Boolean });
|
|
18
18
|
|
|
19
19
|
export function testingIdle(
|
|
20
|
-
client: () =>
|
|
20
|
+
client: () => EngineClient,
|
|
21
21
|
schema: () => string,
|
|
22
22
|
work: TestingWork,
|
|
23
23
|
signal: { readonly revision: Effect.Effect<number>; readonly waitForChange: (after: number) => Effect.Effect<number> },
|
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
import { Effect, Redacted } from "effect";
|
|
2
|
-
import type {
|
|
3
|
-
import type { JobPayloadSchema, QueueDefinition } from "#definition.ts";
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
2
|
+
import type { JobReadOptions } from "#server/client.ts";
|
|
3
|
+
import type { JobPayloadSchema, QueueDefinition } from "#server/definition.ts";
|
|
4
|
+
import type { EngineClient } from "#server/engineClient.ts";
|
|
5
|
+
import type { PgBossPayloadError } from "#server/error.ts";
|
|
6
|
+
import { PgBossTestingError } from "#server/error.ts";
|
|
7
|
+
import { decodeStoredData } from "#server/internal/storedRows.ts";
|
|
8
|
+
import type { Job } from "#server/job.ts";
|
|
6
9
|
|
|
7
10
|
export function testingOperation<A>(operation: string, run: () => Promise<A>, queue?: string) {
|
|
8
11
|
return Effect.tryPromise({
|
|
@@ -11,8 +14,11 @@ export function testingOperation<A>(operation: string, run: () => Promise<A>, qu
|
|
|
11
14
|
});
|
|
12
15
|
}
|
|
13
16
|
|
|
14
|
-
export function testingReadout(client: () =>
|
|
15
|
-
return <TName extends string, TPayload extends JobPayloadSchema>(
|
|
17
|
+
export function testingReadout(client: () => EngineClient) {
|
|
18
|
+
return <TName extends string, TPayload extends JobPayloadSchema>(
|
|
19
|
+
queue: QueueDefinition<TName, TPayload>,
|
|
20
|
+
options?: JobReadOptions,
|
|
21
|
+
): Effect.Effect<Job<TPayload["Type"]>[], PgBossTestingError | PgBossPayloadError, TPayload["DecodingServices"]> =>
|
|
16
22
|
testingOperation("jobs", () => client().findJobs<unknown>(queue.name, options), queue.name).pipe(
|
|
17
23
|
Effect.flatMap((jobs) => Effect.forEach(jobs, (job) => decodeStoredData(queue, job.data).pipe(Effect.map((data) => ({ ...job, data }))))),
|
|
18
24
|
);
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import type {
|
|
3
|
-
import { testingOperation } from "#internal/testingReadout.ts";
|
|
1
|
+
import type { ScheduleDefinition } from "#server/definition.ts";
|
|
2
|
+
import type { EngineClient } from "#server/engineClient.ts";
|
|
3
|
+
import { testingOperation } from "#server/internal/testingReadout.ts";
|
|
4
4
|
|
|
5
|
-
export function testingSchedules(client: () =>
|
|
5
|
+
export function testingSchedules(client: () => EngineClient, changed: () => void) {
|
|
6
6
|
return {
|
|
7
7
|
schedules: () =>
|
|
8
8
|
testingOperation("schedules", async () => (await client().getSchedules()).map(({ name, cron, timezone }) => ({ cron, name, timezone }))),
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { Effect, Schema } from "effect";
|
|
2
|
-
import type {
|
|
3
|
-
import type { PgBossPayloadError, PgBossTestingError } from "#error.ts";
|
|
4
|
-
import { decodeStoredData, quotedSchema } from "#internal/storedRows.ts";
|
|
5
|
-
import { testingOperation } from "#internal/testingReadout.ts";
|
|
6
|
-
import type { SnapshotQueue, UnfinishedJob } from "#testing.ts";
|
|
2
|
+
import type { EngineClient } from "#server/engineClient.ts";
|
|
3
|
+
import type { PgBossPayloadError, PgBossTestingError } from "#server/error.ts";
|
|
4
|
+
import { decodeStoredData, quotedSchema } from "#server/internal/storedRows.ts";
|
|
5
|
+
import { testingOperation } from "#server/internal/testingReadout.ts";
|
|
6
|
+
import type { SnapshotQueue, UnfinishedJob } from "#server/testing.ts";
|
|
7
7
|
|
|
8
8
|
const Rows = Schema.Array(
|
|
9
9
|
Schema.Struct({
|
|
@@ -15,7 +15,7 @@ const Rows = Schema.Array(
|
|
|
15
15
|
}),
|
|
16
16
|
);
|
|
17
17
|
|
|
18
|
-
export function testingSnapshot(client: () =>
|
|
18
|
+
export function testingSnapshot(client: () => EngineClient, schema: () => string) {
|
|
19
19
|
return <const TQueues extends readonly SnapshotQueue[]>(
|
|
20
20
|
queues: TQueues,
|
|
21
21
|
): Effect.Effect<
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import { Clock, Duration, Effect, Option, Redacted } from "effect";
|
|
2
|
-
import type {
|
|
3
|
-
import type {
|
|
4
|
-
import { type PgBossPayloadError, PgBossTestingError, PgBossWaitError } from "#error.ts";
|
|
5
|
-
import type { TestingFetches } from "#internal/adapters/testingFetches.ts";
|
|
6
|
-
import { decodeStoredData } from "#internal/storedRows.ts";
|
|
7
|
-
import { testingOperation } from "#internal/testingReadout.ts";
|
|
8
|
-
import type {
|
|
2
|
+
import type { JobPayloadSchema, QueueDefinition } from "#server/definition.ts";
|
|
3
|
+
import type { EngineClient } from "#server/engineClient.ts";
|
|
4
|
+
import { type PgBossPayloadError, PgBossTestingError, PgBossWaitError } from "#server/error.ts";
|
|
5
|
+
import type { TestingFetches } from "#server/internal/adapters/testingFetches.ts";
|
|
6
|
+
import { decodeStoredData } from "#server/internal/storedRows.ts";
|
|
7
|
+
import { testingOperation } from "#server/internal/testingReadout.ts";
|
|
8
|
+
import type { Job, JobState } from "#server/job.ts";
|
|
9
|
+
import type { PgBossTestingWaitOptions } from "#server/testing.ts";
|
|
9
10
|
|
|
10
11
|
interface Reading<A> {
|
|
11
12
|
readonly arrived: Option.Option<A>;
|
|
@@ -49,7 +50,7 @@ function fetchesRefused(queue: Pick<QueueDefinition, "name">, original: Error) {
|
|
|
49
50
|
return new PgBossTestingError({ operation: "fetchesPass", original: Redacted.make(original), queue: queue.name });
|
|
50
51
|
}
|
|
51
52
|
|
|
52
|
-
export function testingWaits(client: () =>
|
|
53
|
+
export function testingWaits(client: () => EngineClient, fetches: () => TestingFetches | undefined, signal: Signal) {
|
|
53
54
|
return {
|
|
54
55
|
fetchesPass: (queue: Pick<QueueDefinition, "name">, count: number, options?: PgBossTestingWaitOptions) =>
|
|
55
56
|
Effect.gen(function* () {
|
|
@@ -75,14 +76,14 @@ export function testingWaits(client: () => PgBoss, fetches: () => TestingFetches
|
|
|
75
76
|
untilJob: <TName extends string, TPayload extends JobPayloadSchema>(
|
|
76
77
|
queue: Pick<QueueDefinition<TName, TPayload>, "name" | "schema">,
|
|
77
78
|
id: string,
|
|
78
|
-
state:
|
|
79
|
+
state: JobState,
|
|
79
80
|
options?: PgBossTestingWaitOptions,
|
|
80
81
|
) =>
|
|
81
82
|
waitUntil(
|
|
82
83
|
signal,
|
|
83
84
|
`job ${id} in ${queue.name} is ${state}`,
|
|
84
85
|
testingOperation("untilJob", () => client().getJobById<unknown>(queue.name, id), queue.name).pipe(
|
|
85
|
-
Effect.flatMap((job): Effect.Effect<Reading<
|
|
86
|
+
Effect.flatMap((job): Effect.Effect<Reading<Job<TPayload["Type"]>>, PgBossPayloadError, TPayload["DecodingServices"]> => {
|
|
86
87
|
if (job === null) {
|
|
87
88
|
return Effect.succeed({ arrived: Option.none(), seen: "no such job" });
|
|
88
89
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Effect, Option, Schema, Tracer } from "effect";
|
|
2
|
-
import type {
|
|
2
|
+
import type { WorkerJob } from "#server/job.ts";
|
|
3
3
|
|
|
4
4
|
const TracedPayload = Schema.Struct({
|
|
5
5
|
_tag: Schema.Literal("@shivaedev/jobs/TracedPayload"),
|
|
@@ -25,7 +25,7 @@ export function payloadOf(data: unknown): unknown {
|
|
|
25
25
|
return isTracedPayload(data) ? data.payload : data;
|
|
26
26
|
}
|
|
27
27
|
|
|
28
|
-
export function traceJob<A, E, R>(effect: Effect.Effect<A, E, R>, job:
|
|
28
|
+
export function traceJob<A, E, R>(effect: Effect.Effect<A, E, R>, job: WorkerJob<unknown>, queue: string) {
|
|
29
29
|
return Effect.withSpan(effect, queue, {
|
|
30
30
|
attributes: {
|
|
31
31
|
"job.attempt": job.retryCount + 1,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Effect } from "effect";
|
|
2
|
-
import type { JobRegistration } from "#definition.ts";
|
|
3
|
-
import { PgBossQueueNamesError } from "#error.ts";
|
|
2
|
+
import type { JobRegistration } from "#server/definition.ts";
|
|
3
|
+
import { PgBossQueueNamesError } from "#server/error.ts";
|
|
4
4
|
import { registrationName } from "./register.ts";
|
|
5
5
|
|
|
6
6
|
export const validateQueueNames = Effect.fnUntraced(function* (jobs: readonly JobRegistration[], declared: readonly string[] | undefined) {
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { Clock, Effect } from "effect";
|
|
2
|
-
import type {
|
|
3
|
-
import type
|
|
4
|
-
import
|
|
2
|
+
import type { PgBossClient } from "#server/client.ts";
|
|
3
|
+
import { type PgBossError, toPgBossError } from "#server/error.ts";
|
|
4
|
+
import type { WorkerJob } from "#server/job.ts";
|
|
5
5
|
|
|
6
6
|
export function waitForBatchExpiry(
|
|
7
7
|
client: PgBossClient,
|
|
8
8
|
name: string,
|
|
9
|
-
jobs: readonly
|
|
9
|
+
jobs: readonly WorkerJob<unknown>[],
|
|
10
10
|
deadline: number,
|
|
11
11
|
): Effect.Effect<void, PgBossError> {
|
|
12
12
|
return Effect.gen(function* () {
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
export type JobState = "created" | "retry" | "active" | "completed" | "cancelled" | "failed";
|
|
2
|
+
|
|
3
|
+
export interface WorkerJob<T = unknown> {
|
|
4
|
+
data: T;
|
|
5
|
+
expireInSeconds: number;
|
|
6
|
+
groupId?: string | null;
|
|
7
|
+
groupTier?: string | null;
|
|
8
|
+
heartbeatSeconds: number | null;
|
|
9
|
+
id: string;
|
|
10
|
+
name: string;
|
|
11
|
+
retryCount: number;
|
|
12
|
+
signal: AbortSignal;
|
|
13
|
+
}
|
|
14
|
+
export interface Job<T = unknown> extends WorkerJob<T> {
|
|
15
|
+
blocked: boolean;
|
|
16
|
+
blocking: boolean;
|
|
17
|
+
completedOn: Date | null;
|
|
18
|
+
createdOn: Date;
|
|
19
|
+
deadLetter: string;
|
|
20
|
+
deleteAfterSeconds: number;
|
|
21
|
+
heartbeatOn: Date | null;
|
|
22
|
+
keepUntil: Date;
|
|
23
|
+
output: object | null;
|
|
24
|
+
pendingDependencies: number;
|
|
25
|
+
policy: string;
|
|
26
|
+
priority: number;
|
|
27
|
+
retryBackoff: boolean;
|
|
28
|
+
retryDelay: number;
|
|
29
|
+
retryDelayMax?: number;
|
|
30
|
+
retryLimit: number;
|
|
31
|
+
singletonKey: string | null;
|
|
32
|
+
singletonOn: Date | null;
|
|
33
|
+
sourceCreatedOn: Date | null;
|
|
34
|
+
sourceId: string | null;
|
|
35
|
+
sourceName: string | null;
|
|
36
|
+
sourceOutput: object | null;
|
|
37
|
+
sourceRetryCount: number | null;
|
|
38
|
+
sourceRootId: string | null;
|
|
39
|
+
startAfter: Date;
|
|
40
|
+
startedOn: Date | null;
|
|
41
|
+
state: JobState;
|
|
42
|
+
}
|
package/src/server/jobModule.ts
CHANGED
|
@@ -1,18 +1,30 @@
|
|
|
1
|
-
import type { JobRegistration } from "#definition.ts";
|
|
2
|
-
import type { PgBossDefinition, PgBossLayerOptions } from "#service.ts";
|
|
1
|
+
import type { JobRegistration, QueueDefinition, QueueWorker, ScheduledWorker } from "#server/definition.ts";
|
|
2
|
+
import type { PgBossDefinition, PgBossLayerOptions } from "#server/service.ts";
|
|
3
3
|
|
|
4
4
|
export function jobModule<TIdentifier extends string, const TJobs extends readonly JobRegistration[], R = never>(
|
|
5
5
|
layer: PgBossDefinition<TIdentifier>["layer"],
|
|
6
6
|
options: PgBossLayerOptions<TJobs, R>,
|
|
7
7
|
) {
|
|
8
|
-
|
|
8
|
+
return {
|
|
9
|
+
queues: moduleQueues(options.jobs),
|
|
10
|
+
workers: layer(options),
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
type ModuleQueue<TJob extends JobRegistration> = TJob extends QueueDefinition
|
|
15
|
+
? TJob
|
|
16
|
+
: TJob extends QueueWorker
|
|
17
|
+
? TJob["queue"]
|
|
18
|
+
: TJob extends ScheduledWorker
|
|
19
|
+
? TJob["schedule"]
|
|
20
|
+
: never;
|
|
21
|
+
|
|
22
|
+
function moduleQueues<const TJobs extends readonly JobRegistration[]>(jobs: TJobs): ModuleQueue<TJobs[number]>[];
|
|
23
|
+
function moduleQueues(jobs: readonly JobRegistration[]) {
|
|
24
|
+
return jobs.map((job) => {
|
|
9
25
|
if (job._tag === "QueueDefinition") {
|
|
10
26
|
return job;
|
|
11
27
|
}
|
|
12
28
|
return job._tag === "QueueWorker" ? job.queue : job.schedule;
|
|
13
29
|
});
|
|
14
|
-
return {
|
|
15
|
-
queues,
|
|
16
|
-
workers: layer(options),
|
|
17
|
-
};
|
|
18
30
|
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export type QueuePolicy = "standard" | "short" | "singleton" | "stately" | "exclusive" | "key_strict_fifo";
|
|
2
|
+
|
|
3
|
+
export interface RetryOptions {
|
|
4
|
+
deleteAfterSeconds?: number;
|
|
5
|
+
expireInSeconds?: number;
|
|
6
|
+
heartbeatSeconds?: number;
|
|
7
|
+
retentionSeconds?: number;
|
|
8
|
+
retryBackoff?: boolean;
|
|
9
|
+
retryDelay?: number;
|
|
10
|
+
retryDelayMax?: number;
|
|
11
|
+
retryLimit?: number;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export interface QueueOptions extends RetryOptions {
|
|
15
|
+
readonly maxDeferrals?: number;
|
|
16
|
+
readonly notify?: boolean;
|
|
17
|
+
readonly partition?: boolean;
|
|
18
|
+
readonly policy?: QueuePolicy;
|
|
19
|
+
readonly warningQueueSize?: number;
|
|
20
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Effect, Redacted, Schema } from "effect";
|
|
2
|
+
import { JobFailure } from "#JobFailure.ts";
|
|
3
|
+
import { PgBossPayloadError } from "#server/error.ts";
|
|
4
|
+
|
|
5
|
+
const StoredFailure = Schema.NullOr(Schema.Union([JobFailure, Schema.Struct({ value: JobFailure })]));
|
|
6
|
+
|
|
7
|
+
export function readJobFailure(queue: string, output: unknown): Effect.Effect<JobFailure | null, PgBossPayloadError> {
|
|
8
|
+
return Schema.decodeUnknownEffect(StoredFailure)(output).pipe(
|
|
9
|
+
Effect.map((failure) => (failure !== null && "value" in failure ? failure.value : failure)),
|
|
10
|
+
Effect.mapError((error) => new PgBossPayloadError({ direction: "decode", original: Redacted.make(error), queue })),
|
|
11
|
+
);
|
|
12
|
+
}
|
package/src/server/schema.ts
CHANGED
|
@@ -2,12 +2,12 @@ import { Effect, Schema } from "effect";
|
|
|
2
2
|
import { SqlClient } from "effect/sql";
|
|
3
3
|
import pgBossPackage from "pg-boss/package.json" with { type: "json" };
|
|
4
4
|
import type { SchemaComponent } from "@shivaedev/sql/SchemaComponent.ts";
|
|
5
|
-
import { installSchema } from "#adapters/installSchema.ts";
|
|
6
|
-
import { type PgBossError, toPgBossError } from "#error.ts";
|
|
5
|
+
import { installSchema } from "#server/adapters/installSchema.ts";
|
|
6
|
+
import { type PgBossError, toPgBossError } from "#server/error.ts";
|
|
7
7
|
|
|
8
8
|
const InstalledSchema = Schema.Array(Schema.Struct({ name: Schema.NullOr(Schema.String) }));
|
|
9
9
|
const InstalledVersion = Schema.Array(Schema.Struct({ version: Schema.Number }));
|
|
10
|
-
const
|
|
10
|
+
const MissingArtifacts = Schema.Array(Schema.Struct({ name: Schema.String }));
|
|
11
11
|
|
|
12
12
|
export interface PgBossSchemaOptions {
|
|
13
13
|
readonly schema?: string;
|
|
@@ -40,10 +40,21 @@ export function pgBossSchema(options: PgBossSchemaOptions = {}): SchemaComponent
|
|
|
40
40
|
return `schema ${schema}, installed version ${row?.version ?? "missing"}, required version ${required}`;
|
|
41
41
|
}
|
|
42
42
|
const job = sql`${sql(schema)}.${sql("job")}`;
|
|
43
|
-
const
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
43
|
+
const deferrals = sql`${sql(schema)}.${sql("effect_job_deferral")}`;
|
|
44
|
+
const cleanup = sql`${sql(schema)}.${sql("effect_job_deferral_keep_until")}`;
|
|
45
|
+
const stately = sql`${sql(schema)}.${sql("effect_stately_deferral")}()`;
|
|
46
|
+
const missing = yield* sql`SELECT name FROM (VALUES
|
|
47
|
+
('dead-letter resolution trigger', EXISTS (
|
|
48
|
+
SELECT 1 FROM pg_trigger WHERE tgrelid = to_regclass(${job.compile()[0]}) AND tgname = 'effect_dead_letter_resolution'
|
|
49
|
+
)),
|
|
50
|
+
('effect_job_deferral', to_regclass(${deferrals.compile()[0]}) IS NOT NULL),
|
|
51
|
+
('effect_job_deferral_keep_until', to_regclass(${cleanup.compile()[0]}) IS NOT NULL),
|
|
52
|
+
('effect_stately_deferral()', to_regprocedure(${stately.compile()[0]}) IS NOT NULL),
|
|
53
|
+
('effect_stately_deferral trigger', EXISTS (
|
|
54
|
+
SELECT 1 FROM pg_trigger WHERE tgrelid = to_regclass(${job.compile()[0]}) AND tgname = 'effect_stately_deferral'
|
|
55
|
+
))
|
|
56
|
+
) AS artifacts(name, installed) WHERE NOT installed`.withoutTransform.pipe(Effect.flatMap(Schema.decodeUnknownEffect(MissingArtifacts)));
|
|
57
|
+
return missing.length === 0 ? undefined : `schema ${schema}, missing ${missing.map(({ name }) => name).join(", ")}`;
|
|
47
58
|
}),
|
|
48
59
|
};
|
|
49
60
|
}
|