@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.
Files changed (381) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/README.md +52 -19
  3. package/dist/display.d.ts +14 -0
  4. package/dist/display.d.ts.map +1 -0
  5. package/dist/display.js +2 -0
  6. package/dist/display.js.map +1 -0
  7. package/dist/server/ClientDatabase.d.ts +21 -0
  8. package/dist/server/ClientDatabase.d.ts.map +1 -0
  9. package/dist/server/ClientDatabase.js +2 -0
  10. package/dist/server/ClientDatabase.js.map +1 -0
  11. package/dist/server/PgBoss.d.ts +2 -2
  12. package/dist/server/PgBoss.d.ts.map +1 -1
  13. package/dist/server/adapters/batchClockOffset.d.ts +2 -2
  14. package/dist/server/adapters/batchClockOffset.d.ts.map +1 -1
  15. package/dist/server/adapters/batchClockOffset.js +5 -4
  16. package/dist/server/adapters/batchClockOffset.js.map +1 -1
  17. package/dist/server/adapters/batchHandler.d.ts +5 -0
  18. package/dist/server/adapters/batchHandler.d.ts.map +1 -0
  19. package/dist/server/{internal → adapters}/batchHandler.js +6 -6
  20. package/dist/server/adapters/batchHandler.js.map +1 -0
  21. package/dist/server/adapters/clientCache.d.ts +10 -0
  22. package/dist/server/adapters/clientCache.d.ts.map +1 -0
  23. package/dist/server/{internal → adapters}/clientCache.js +5 -19
  24. package/dist/server/adapters/clientCache.js.map +1 -0
  25. package/dist/server/adapters/clientErrorLogger.js +1 -1
  26. package/dist/server/adapters/clientErrorLogger.js.map +1 -1
  27. package/dist/server/adapters/defaultClientFactory.d.ts +4 -0
  28. package/dist/server/adapters/defaultClientFactory.d.ts.map +1 -0
  29. package/dist/server/adapters/defaultClientFactory.js.map +1 -0
  30. package/dist/server/adapters/deferralCount.d.ts +3 -3
  31. package/dist/server/adapters/deferralCount.d.ts.map +1 -1
  32. package/dist/server/adapters/deferralCount.js +2 -2
  33. package/dist/server/adapters/deferralCount.js.map +1 -1
  34. package/dist/server/adapters/expireAttempt.d.ts +4 -0
  35. package/dist/server/adapters/expireAttempt.d.ts.map +1 -0
  36. package/dist/server/{internal → adapters}/expireAttempt.js +1 -1
  37. package/dist/server/{internal → adapters}/expireAttempt.js.map +1 -1
  38. package/dist/server/adapters/installSchema.d.ts +1 -1
  39. package/dist/server/adapters/installSchema.d.ts.map +1 -1
  40. package/dist/server/adapters/installSchema.js +1 -1
  41. package/dist/server/adapters/installSchema.js.map +1 -1
  42. package/dist/server/adapters/jobEngine.d.ts +5 -0
  43. package/dist/server/adapters/jobEngine.d.ts.map +1 -0
  44. package/dist/server/adapters/jobEngine.js +50 -0
  45. package/dist/server/adapters/jobEngine.js.map +1 -0
  46. package/dist/server/adapters/lifecycle.d.ts +11 -0
  47. package/dist/server/adapters/lifecycle.d.ts.map +1 -0
  48. package/dist/server/adapters/lifecycle.js +48 -0
  49. package/dist/server/adapters/lifecycle.js.map +1 -0
  50. package/dist/server/adapters/listJobs.d.ts +5 -0
  51. package/dist/server/adapters/listJobs.d.ts.map +1 -0
  52. package/dist/server/adapters/listJobs.js +37 -0
  53. package/dist/server/adapters/listJobs.js.map +1 -0
  54. package/dist/server/adapters/observeTestingSettlements.d.ts +6 -0
  55. package/dist/server/adapters/observeTestingSettlements.d.ts.map +1 -0
  56. package/dist/server/adapters/observeTestingSettlements.js.map +1 -0
  57. package/dist/server/adapters/queueAdministration.d.ts +4 -0
  58. package/dist/server/adapters/queueAdministration.d.ts.map +1 -0
  59. package/dist/server/adapters/queueAdministration.js +42 -0
  60. package/dist/server/adapters/queueAdministration.js.map +1 -0
  61. package/dist/server/adapters/registerWorker.d.ts +5 -3
  62. package/dist/server/adapters/registerWorker.d.ts.map +1 -1
  63. package/dist/server/adapters/registerWorker.js +9 -6
  64. package/dist/server/adapters/registerWorker.js.map +1 -1
  65. package/dist/server/adapters/retireJobs.d.ts +3 -3
  66. package/dist/server/adapters/retireJobs.d.ts.map +1 -1
  67. package/dist/server/adapters/retireJobs.js +3 -3
  68. package/dist/server/adapters/retireJobs.js.map +1 -1
  69. package/dist/server/adapters/schemaIndexBuilds.d.ts +2 -2
  70. package/dist/server/adapters/schemaIndexBuilds.d.ts.map +1 -1
  71. package/dist/server/adapters/schemaIndexBuilds.js.map +1 -1
  72. package/dist/server/adapters/settleDeferral.d.ts +7 -0
  73. package/dist/server/adapters/settleDeferral.d.ts.map +1 -0
  74. package/dist/server/{internal → adapters}/settleDeferral.js +2 -2
  75. package/dist/server/adapters/settleDeferral.js.map +1 -0
  76. package/dist/server/adapters/testingClient.d.ts +14 -0
  77. package/dist/server/adapters/testingClient.d.ts.map +1 -0
  78. package/dist/server/{internal → adapters}/testingClient.js +12 -11
  79. package/dist/server/adapters/testingClient.js.map +1 -0
  80. package/dist/server/adapters/testingController.d.ts +34 -0
  81. package/dist/server/adapters/testingController.d.ts.map +1 -0
  82. package/dist/server/adapters/testingController.js +98 -0
  83. package/dist/server/adapters/testingController.js.map +1 -0
  84. package/dist/server/adapters/testingDueNow.d.ts +3 -3
  85. package/dist/server/adapters/testingDueNow.d.ts.map +1 -1
  86. package/dist/server/adapters/testingDueNow.js +2 -2
  87. package/dist/server/adapters/testingDueNow.js.map +1 -1
  88. package/dist/server/adapters/testingEngine.d.ts +5 -0
  89. package/dist/server/adapters/testingEngine.d.ts.map +1 -0
  90. package/dist/server/adapters/testingEngine.js +23 -0
  91. package/dist/server/adapters/testingEngine.js.map +1 -0
  92. package/dist/server/adapters/testingExpirations.d.ts +6 -4
  93. package/dist/server/adapters/testingExpirations.d.ts.map +1 -1
  94. package/dist/server/adapters/testingExpirations.js.map +1 -1
  95. package/dist/server/adapters/transactionDb.d.ts +2 -2
  96. package/dist/server/adapters/transactionDb.d.ts.map +1 -1
  97. package/dist/server/adapters/transactionDb.js.map +1 -1
  98. package/dist/server/client.d.ts +92 -18
  99. package/dist/server/client.d.ts.map +1 -1
  100. package/dist/server/clientOptions.d.ts +75 -0
  101. package/dist/server/clientOptions.d.ts.map +1 -0
  102. package/dist/server/clientOptions.js +2 -0
  103. package/dist/server/clientOptions.js.map +1 -0
  104. package/dist/server/defineSchedule.d.ts +1 -1
  105. package/dist/server/defineSchedule.d.ts.map +1 -1
  106. package/dist/server/defineSchedule.js +2 -1
  107. package/dist/server/defineSchedule.js.map +1 -1
  108. package/dist/server/definition.d.ts +17 -15
  109. package/dist/server/definition.d.ts.map +1 -1
  110. package/dist/server/definition.js +3 -1
  111. package/dist/server/definition.js.map +1 -1
  112. package/dist/server/engineClient.d.ts +26 -0
  113. package/dist/server/engineClient.d.ts.map +1 -0
  114. package/dist/server/engineClient.js +2 -0
  115. package/dist/server/engineClient.js.map +1 -0
  116. package/dist/server/enqueueOptions.d.ts +22 -0
  117. package/dist/server/enqueueOptions.d.ts.map +1 -0
  118. package/dist/server/enqueueOptions.js +2 -0
  119. package/dist/server/enqueueOptions.js.map +1 -0
  120. package/dist/server/error.d.ts +11 -1
  121. package/dist/server/error.d.ts.map +1 -1
  122. package/dist/server/error.js +8 -1
  123. package/dist/server/error.js.map +1 -1
  124. package/dist/server/health.d.ts +2 -2
  125. package/dist/server/health.d.ts.map +1 -1
  126. package/dist/server/internal/acquireClient.d.ts +11 -0
  127. package/dist/server/internal/acquireClient.d.ts.map +1 -0
  128. package/dist/server/internal/acquireClient.js +21 -0
  129. package/dist/server/internal/acquireClient.js.map +1 -0
  130. package/dist/server/internal/adapters/testingFetches.d.ts +2 -2
  131. package/dist/server/internal/adapters/testingFetches.d.ts.map +1 -1
  132. package/dist/server/internal/adapters/testingFetches.js.map +1 -1
  133. package/dist/server/internal/clientErrors.d.ts +1 -1
  134. package/dist/server/internal/clientErrors.d.ts.map +1 -1
  135. package/dist/server/internal/countsFor.d.ts +3 -3
  136. package/dist/server/internal/countsFor.d.ts.map +1 -1
  137. package/dist/server/internal/countsFor.js +2 -2
  138. package/dist/server/internal/countsFor.js.map +1 -1
  139. package/dist/server/internal/deadLetterResolutionPlan.js +1 -1
  140. package/dist/server/internal/deadLetterResolutionPlan.js.map +1 -1
  141. package/dist/server/internal/deadlineOf.d.ts +2 -2
  142. package/dist/server/internal/deadlineOf.d.ts.map +1 -1
  143. package/dist/server/internal/deadlineOf.js.map +1 -1
  144. package/dist/server/internal/deferrableAttempt.d.ts +4 -5
  145. package/dist/server/internal/deferrableAttempt.d.ts.map +1 -1
  146. package/dist/server/internal/deferrableAttempt.js +5 -14
  147. package/dist/server/internal/deferrableAttempt.js.map +1 -1
  148. package/dist/server/internal/deferral.d.ts +3 -3
  149. package/dist/server/internal/deferral.d.ts.map +1 -1
  150. package/dist/server/internal/deferral.js.map +1 -1
  151. package/dist/server/internal/deferralStorePlan.js +2 -2
  152. package/dist/server/internal/deferralStorePlan.js.map +1 -1
  153. package/dist/server/internal/definitionOptions.d.ts +7 -7
  154. package/dist/server/internal/definitionOptions.d.ts.map +1 -1
  155. package/dist/server/internal/engine.d.ts +30 -0
  156. package/dist/server/internal/engine.d.ts.map +1 -0
  157. package/dist/server/internal/engine.js +6 -0
  158. package/dist/server/internal/engine.js.map +1 -0
  159. package/dist/server/internal/enqueueFor.d.ts +2 -2
  160. package/dist/server/internal/enqueueFor.d.ts.map +1 -1
  161. package/dist/server/internal/enqueueFor.js +3 -3
  162. package/dist/server/internal/enqueueFor.js.map +1 -1
  163. package/dist/server/internal/ensureQueue.d.ts +2 -3
  164. package/dist/server/internal/ensureQueue.d.ts.map +1 -1
  165. package/dist/server/internal/ensureQueue.js +2 -2
  166. package/dist/server/internal/ensureQueue.js.map +1 -1
  167. package/dist/server/internal/healthFor.d.ts +3 -3
  168. package/dist/server/internal/healthFor.d.ts.map +1 -1
  169. package/dist/server/internal/healthFor.js +2 -2
  170. package/dist/server/internal/healthFor.js.map +1 -1
  171. package/dist/server/internal/jobControl.d.ts +9 -4
  172. package/dist/server/internal/jobControl.d.ts.map +1 -1
  173. package/dist/server/internal/jobControl.js +13 -40
  174. package/dist/server/internal/jobControl.js.map +1 -1
  175. package/dist/server/internal/jobListings.d.ts +16 -0
  176. package/dist/server/internal/jobListings.d.ts.map +1 -0
  177. package/dist/server/internal/jobListings.js +52 -0
  178. package/dist/server/internal/jobListings.js.map +1 -0
  179. package/dist/server/internal/jobStorePlans.js +2 -2
  180. package/dist/server/internal/jobStorePlans.js.map +1 -1
  181. package/dist/server/internal/lifecycle.d.ts +11 -7
  182. package/dist/server/internal/lifecycle.d.ts.map +1 -1
  183. package/dist/server/internal/lifecycle.js +2 -49
  184. package/dist/server/internal/lifecycle.js.map +1 -1
  185. package/dist/server/internal/makeService.d.ts +5 -3
  186. package/dist/server/internal/makeService.d.ts.map +1 -1
  187. package/dist/server/internal/makeService.js +15 -11
  188. package/dist/server/internal/makeService.js.map +1 -1
  189. package/dist/server/internal/register.d.ts +5 -5
  190. package/dist/server/internal/register.d.ts.map +1 -1
  191. package/dist/server/internal/register.js +6 -6
  192. package/dist/server/internal/register.js.map +1 -1
  193. package/dist/server/internal/registerReleasedJobs.d.ts +4 -4
  194. package/dist/server/internal/registerReleasedJobs.d.ts.map +1 -1
  195. package/dist/server/internal/registerReleasedJobs.js +2 -2
  196. package/dist/server/internal/registerReleasedJobs.js.map +1 -1
  197. package/dist/server/internal/retryWake.d.ts +1 -1
  198. package/dist/server/internal/retryWake.d.ts.map +1 -1
  199. package/dist/server/internal/retryWake.js +2 -2
  200. package/dist/server/internal/retryWake.js.map +1 -1
  201. package/dist/server/internal/runQueueWorker.d.ts +4 -4
  202. package/dist/server/internal/runQueueWorker.d.ts.map +1 -1
  203. package/dist/server/internal/runQueueWorker.js +5 -5
  204. package/dist/server/internal/runQueueWorker.js.map +1 -1
  205. package/dist/server/internal/storedRows.d.ts +2 -2
  206. package/dist/server/internal/storedRows.d.ts.map +1 -1
  207. package/dist/server/internal/storedRows.js +2 -2
  208. package/dist/server/internal/storedRows.js.map +1 -1
  209. package/dist/server/internal/testingDeferrals.d.ts +3 -3
  210. package/dist/server/internal/testingDeferrals.d.ts.map +1 -1
  211. package/dist/server/internal/testingDeferrals.js +2 -2
  212. package/dist/server/internal/testingDeferrals.js.map +1 -1
  213. package/dist/server/internal/testingIdle.d.ts +3 -3
  214. package/dist/server/internal/testingIdle.d.ts.map +1 -1
  215. package/dist/server/internal/testingIdle.js +2 -2
  216. package/dist/server/internal/testingIdle.js.map +1 -1
  217. package/dist/server/internal/testingReadout.d.ts +7 -41
  218. package/dist/server/internal/testingReadout.d.ts.map +1 -1
  219. package/dist/server/internal/testingReadout.js +2 -2
  220. package/dist/server/internal/testingReadout.js.map +1 -1
  221. package/dist/server/internal/testingRegistrations.d.ts +1 -1
  222. package/dist/server/internal/testingRegistrations.d.ts.map +1 -1
  223. package/dist/server/internal/testingSchedules.d.ts +3 -3
  224. package/dist/server/internal/testingSchedules.d.ts.map +1 -1
  225. package/dist/server/internal/testingSchedules.js +1 -1
  226. package/dist/server/internal/testingSchedules.js.map +1 -1
  227. package/dist/server/internal/testingSnapshot.d.ts +4 -4
  228. package/dist/server/internal/testingSnapshot.d.ts.map +1 -1
  229. package/dist/server/internal/testingSnapshot.js +2 -2
  230. package/dist/server/internal/testingSnapshot.js.map +1 -1
  231. package/dist/server/internal/testingWaits.d.ts +8 -7
  232. package/dist/server/internal/testingWaits.d.ts.map +1 -1
  233. package/dist/server/internal/testingWaits.js +3 -3
  234. package/dist/server/internal/testingWaits.js.map +1 -1
  235. package/dist/server/internal/tracing.d.ts +2 -2
  236. package/dist/server/internal/tracing.d.ts.map +1 -1
  237. package/dist/server/internal/tracing.js.map +1 -1
  238. package/dist/server/internal/validateQueueNames.d.ts +2 -2
  239. package/dist/server/internal/validateQueueNames.d.ts.map +1 -1
  240. package/dist/server/internal/validateQueueNames.js +1 -1
  241. package/dist/server/internal/validateQueueNames.js.map +1 -1
  242. package/dist/server/internal/waitForBatchExpiry.d.ts +4 -4
  243. package/dist/server/internal/waitForBatchExpiry.d.ts.map +1 -1
  244. package/dist/server/internal/waitForBatchExpiry.js +1 -1
  245. package/dist/server/internal/waitForBatchExpiry.js.map +1 -1
  246. package/dist/server/job.d.ts +42 -0
  247. package/dist/server/job.d.ts.map +1 -0
  248. package/dist/server/job.js +2 -0
  249. package/dist/server/job.js.map +1 -0
  250. package/dist/server/jobModule.d.ts +6 -4
  251. package/dist/server/jobModule.d.ts.map +1 -1
  252. package/dist/server/jobModule.js +7 -5
  253. package/dist/server/jobModule.js.map +1 -1
  254. package/dist/server/queueOptions.d.ts +19 -0
  255. package/dist/server/queueOptions.d.ts.map +1 -0
  256. package/dist/server/queueOptions.js +2 -0
  257. package/dist/server/queueOptions.js.map +1 -0
  258. package/dist/server/readJobFailure.d.ts +5 -0
  259. package/dist/server/readJobFailure.d.ts.map +1 -0
  260. package/dist/server/readJobFailure.js +8 -0
  261. package/dist/server/readJobFailure.js.map +1 -0
  262. package/dist/server/schema.d.ts +1 -1
  263. package/dist/server/schema.d.ts.map +1 -1
  264. package/dist/server/schema.js +18 -7
  265. package/dist/server/schema.js.map +1 -1
  266. package/dist/server/service.d.ts +15 -10
  267. package/dist/server/service.d.ts.map +1 -1
  268. package/dist/server/service.js +18 -27
  269. package/dist/server/service.js.map +1 -1
  270. package/dist/server/testing.d.ts +30 -69
  271. package/dist/server/testing.d.ts.map +1 -1
  272. package/dist/server/testing.js +5 -97
  273. package/dist/server/testing.js.map +1 -1
  274. package/dist/server/workerOptions.d.ts +25 -0
  275. package/dist/server/workerOptions.d.ts.map +1 -0
  276. package/dist/server/workerOptions.js +2 -0
  277. package/dist/server/workerOptions.js.map +1 -0
  278. package/package.json +11 -16
  279. package/src/display.ts +12 -0
  280. package/src/server/ClientDatabase.ts +7 -0
  281. package/src/server/PgBoss.ts +2 -2
  282. package/src/server/adapters/batchClockOffset.ts +8 -5
  283. package/src/server/{internal → adapters}/batchHandler.ts +13 -13
  284. package/src/server/{internal → adapters}/clientCache.ts +10 -22
  285. package/src/server/adapters/clientErrorLogger.ts +1 -1
  286. package/src/server/{defaultClientFactory.ts → adapters/defaultClientFactory.ts} +4 -2
  287. package/src/server/adapters/deferralCount.ts +5 -5
  288. package/src/server/{internal → adapters}/expireAttempt.ts +4 -3
  289. package/src/server/adapters/installSchema.ts +2 -2
  290. package/src/server/adapters/jobEngine.ts +59 -0
  291. package/src/server/adapters/lifecycle.ts +67 -0
  292. package/src/server/adapters/listJobs.ts +43 -0
  293. package/src/server/{internal → adapters}/observeTestingSettlements.ts +2 -2
  294. package/src/server/adapters/queueAdministration.ts +47 -0
  295. package/src/server/adapters/registerWorker.ts +17 -12
  296. package/src/server/adapters/retireJobs.ts +5 -5
  297. package/src/server/adapters/schemaIndexBuilds.ts +2 -2
  298. package/src/server/{internal → adapters}/settleDeferral.ts +5 -5
  299. package/src/server/{internal → adapters}/testingClient.ts +31 -26
  300. package/src/server/adapters/testingController.ts +109 -0
  301. package/src/server/adapters/testingDueNow.ts +5 -5
  302. package/src/server/adapters/testingEngine.ts +28 -0
  303. package/src/server/adapters/testingExpirations.ts +6 -4
  304. package/src/server/adapters/transactionDb.ts +2 -2
  305. package/src/server/client.ts +83 -30
  306. package/src/server/clientOptions.ts +81 -0
  307. package/src/server/defineSchedule.ts +3 -2
  308. package/src/server/definition.ts +20 -17
  309. package/src/server/engineClient.ts +24 -0
  310. package/src/server/enqueueOptions.ts +20 -0
  311. package/src/server/error.ts +17 -2
  312. package/src/server/health.ts +2 -2
  313. package/src/server/internal/acquireClient.ts +26 -0
  314. package/src/server/internal/adapters/testingFetches.ts +2 -2
  315. package/src/server/internal/clientErrors.ts +1 -1
  316. package/src/server/internal/countsFor.ts +5 -5
  317. package/src/server/internal/deadLetterResolutionPlan.ts +1 -1
  318. package/src/server/internal/deadlineOf.ts +2 -2
  319. package/src/server/internal/deferrableAttempt.ts +5 -22
  320. package/src/server/internal/deferral.ts +3 -3
  321. package/src/server/internal/deferralStorePlan.ts +2 -2
  322. package/src/server/internal/definitionOptions.ts +1 -1
  323. package/src/server/internal/engine.ts +41 -0
  324. package/src/server/internal/enqueueFor.ts +5 -5
  325. package/src/server/internal/ensureQueue.ts +5 -6
  326. package/src/server/internal/healthFor.ts +4 -4
  327. package/src/server/internal/jobControl.ts +15 -50
  328. package/src/server/internal/jobListings.ts +85 -0
  329. package/src/server/internal/jobStorePlans.ts +2 -2
  330. package/src/server/internal/lifecycle.ts +14 -55
  331. package/src/server/internal/makeService.ts +21 -13
  332. package/src/server/internal/register.ts +9 -9
  333. package/src/server/internal/registerReleasedJobs.ts +5 -5
  334. package/src/server/internal/retryWake.ts +3 -3
  335. package/src/server/internal/runQueueWorker.ts +8 -8
  336. package/src/server/internal/storedRows.ts +3 -3
  337. package/src/server/internal/testingDeferrals.ts +5 -5
  338. package/src/server/internal/testingIdle.ts +5 -5
  339. package/src/server/internal/testingReadout.ts +12 -6
  340. package/src/server/internal/testingRegistrations.ts +1 -1
  341. package/src/server/internal/testingSchedules.ts +4 -4
  342. package/src/server/internal/testingSnapshot.ts +6 -6
  343. package/src/server/internal/testingWaits.ts +11 -10
  344. package/src/server/internal/tracing.ts +2 -2
  345. package/src/server/internal/validateQueueNames.ts +2 -2
  346. package/src/server/internal/waitForBatchExpiry.ts +4 -4
  347. package/src/server/job.ts +42 -0
  348. package/src/server/jobModule.ts +19 -7
  349. package/src/server/queueOptions.ts +20 -0
  350. package/src/server/readJobFailure.ts +12 -0
  351. package/src/server/schema.ts +18 -7
  352. package/src/server/service.ts +40 -44
  353. package/src/server/testing.ts +7 -109
  354. package/src/server/workerOptions.ts +28 -0
  355. package/dist/server/defaultClientFactory.d.ts +0 -3
  356. package/dist/server/defaultClientFactory.d.ts.map +0 -1
  357. package/dist/server/defaultClientFactory.js.map +0 -1
  358. package/dist/server/internal/batchHandler.d.ts +0 -5
  359. package/dist/server/internal/batchHandler.d.ts.map +0 -1
  360. package/dist/server/internal/batchHandler.js.map +0 -1
  361. package/dist/server/internal/clientCache.d.ts +0 -8
  362. package/dist/server/internal/clientCache.d.ts.map +0 -1
  363. package/dist/server/internal/clientCache.js.map +0 -1
  364. package/dist/server/internal/expireAttempt.d.ts +0 -3
  365. package/dist/server/internal/expireAttempt.d.ts.map +0 -1
  366. package/dist/server/internal/listJobs.d.ts +0 -5
  367. package/dist/server/internal/listJobs.d.ts.map +0 -1
  368. package/dist/server/internal/listJobs.js +0 -75
  369. package/dist/server/internal/listJobs.js.map +0 -1
  370. package/dist/server/internal/observeTestingSettlements.d.ts +0 -6
  371. package/dist/server/internal/observeTestingSettlements.d.ts.map +0 -1
  372. package/dist/server/internal/observeTestingSettlements.js.map +0 -1
  373. package/dist/server/internal/settleDeferral.d.ts +0 -7
  374. package/dist/server/internal/settleDeferral.d.ts.map +0 -1
  375. package/dist/server/internal/settleDeferral.js.map +0 -1
  376. package/dist/server/internal/testingClient.d.ts +0 -13
  377. package/dist/server/internal/testingClient.d.ts.map +0 -1
  378. package/dist/server/internal/testingClient.js.map +0 -1
  379. package/src/server/internal/listJobs.ts +0 -116
  380. /package/dist/server/{defaultClientFactory.js → adapters/defaultClientFactory.js} +0 -0
  381. /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 { ConstructorOptions, StopOptions } from "pg-boss";
3
- import type { PgBossClient, PgBossClientFactory } from "#client.ts";
4
- import { defaultClientFactory } from "#defaultClientFactory.ts";
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: ConstructorOptions;
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
- async function startClient(options: AcquireClientOptions, report: (error: Error) => void): Promise<PgBossClient> {
23
- const client = (options.clientFactory ?? defaultClientFactory)(options.constructor);
24
- observeClientErrors(client, report);
25
- try {
26
- await client.start();
27
- if (options.constructor.migrate !== false && client.getDb !== undefined) {
28
- for (const plan of jobStorePlans(options.constructor.schema ?? "pgboss")) {
29
- await client.getDb().executeSql(plan);
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 type { PgBossClient } from "#client.ts";
2
- import { countsFor } from "#internal/countsFor.ts";
3
- import { enqueueFor } from "#internal/enqueueFor.ts";
4
- import { healthFor } from "#internal/healthFor.ts";
5
- import { getJobFor, retryFor } from "#internal/jobControl.ts";
6
- import { deadLetteredJobsFor, failedJobsFor } from "#internal/listJobs.ts";
7
- import type { PgBossService } from "#service.ts";
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 function makeService(client: PgBossClient, names: readonly string[], schema = "pgboss"): PgBossService {
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
- deadLetteredJobs: deadLetteredJobsFor(client, schema),
19
+ deleteQueue: engine.deleteQueue,
20
+ ...(yield* jobListings),
13
21
  enqueue: enqueueFor(client),
14
- failedJobs: failedJobsFor(client, schema),
15
- getJob: getJobFor(client),
22
+ ...(yield* jobControl),
16
23
  health: (queues) => healthFor(client, queues === undefined ? names : queues.map((queue) => queue.name)),
17
- retry: retryFor(client),
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 type { StopOptions } from "pg-boss";
3
- import { registerWorker } from "#adapters/registerWorker.ts";
4
- import { workerDiagnostics } from "#adapters/workerDiagnostics.ts";
5
- import type { PgBossClient } from "#client.ts";
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 { JobRegistration } from "#definition.ts";
7
- import { toPgBossError } from "#error.ts";
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 type { Job } from "pg-boss";
3
- import { deferralCount } from "#adapters/deferralCount.ts";
4
- import { workerDiagnostics } from "#adapters/workerDiagnostics.ts";
5
- import type { PgBossClient } from "#client.ts";
6
- import { type JobPayloadSchema, jobContext, type QueueWorker } from "#definition.ts";
7
- import { PgBossPayloadError } from "#error.ts";
8
- import { payloadOf } from "#internal/tracing.ts";
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: Job<unknown>,
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 { PgBoss } from "pg-boss";
3
- import type { QueueDefinition } from "#definition.ts";
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: () => PgBoss) {
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 { PgBoss } from "pg-boss";
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: () => PgBoss,
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 { FindJobsOptions, PgBoss } from "pg-boss";
3
- import type { JobPayloadSchema, QueueDefinition } from "#definition.ts";
4
- import { PgBossTestingError } from "#error.ts";
5
- import { decodeStoredData } from "#internal/storedRows.ts";
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: () => PgBoss) {
15
- return <TName extends string, TPayload extends JobPayloadSchema>(queue: QueueDefinition<TName, TPayload>, options?: FindJobsOptions) =>
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,4 +1,4 @@
1
- import type { PgBossClient } from "#client.ts";
1
+ import type { PgBossClient } from "#server/client.ts";
2
2
 
3
3
  export const testingRegistration = Symbol("jobs testing registration");
4
4
 
@@ -1,8 +1,8 @@
1
- import type { PgBoss } from "pg-boss";
2
- import type { ScheduleDefinition } from "#definition.ts";
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: () => PgBoss, changed: () => void) {
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 { PgBoss } from "pg-boss";
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: () => PgBoss, schema: () => string) {
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 { JobWithMetadata, PgBoss } from "pg-boss";
3
- import type { JobPayloadSchema, QueueDefinition } from "#definition.ts";
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 { PgBossTestingWaitOptions } from "#testing.ts";
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: () => PgBoss, fetches: () => TestingFetches | undefined, signal: Signal) {
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: JobWithMetadata["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<JobWithMetadata<TPayload["Type"]>>, PgBossPayloadError, TPayload["DecodingServices"]> => {
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 { Job } from "pg-boss";
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: Job<unknown>, queue: string) {
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 { Job } from "pg-boss";
3
- import type { PgBossClient } from "#client.ts";
4
- import { type PgBossError, toPgBossError } from "#error.ts";
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 Job<unknown>[],
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
+ }
@@ -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
- const queues = options.jobs.map((job) => {
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
+ }
@@ -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 InstalledResolution = Schema.Array(Schema.Struct({ installed: Schema.Boolean }));
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 [resolution] = yield* sql`SELECT EXISTS (
44
- SELECT 1 FROM pg_trigger WHERE tgrelid = to_regclass(${job.compile()[0]}) AND tgname = 'effect_dead_letter_resolution'
45
- ) AS installed`.withoutTransform.pipe(Effect.flatMap(Schema.decodeUnknownEffect(InstalledResolution)));
46
- return resolution?.installed ? undefined : `schema ${schema}, missing dead-letter resolution trigger`;
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
  }