@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,104 +1,12 @@
1
- import { Duration, Effect, Redacted } from "effect";
2
- import { testingDueNow } from "#adapters/testingDueNow.ts";
3
- import { defaultClientFactory } from "#defaultClientFactory.ts";
4
- import { PgBossTestingError } from "#error.ts";
5
- import { testingFetches } from "#internal/adapters/testingFetches.ts";
6
- import { testingClient } from "#internal/testingClient.ts";
7
- import { testingDeferrals } from "#internal/testingDeferrals.ts";
8
- import { testingIdle } from "#internal/testingIdle.ts";
9
- import { testingOperation, testingReadout } from "#internal/testingReadout.ts";
10
- import { testingSchedules } from "#internal/testingSchedules.ts";
11
- import { testingSignal } from "#internal/testingSignal.ts";
12
- import { testingSnapshot } from "#internal/testingSnapshot.ts";
13
- import { testingWaits } from "#internal/testingWaits.ts";
1
+ import { Effect } from "effect";
2
+ import { testingController } from "#server/adapters/testingController.ts";
3
+ export function makePgBossTesting(options = {}) {
4
+ return testingController(options);
5
+ }
14
6
  export const testRetryPolicy = Object.freeze({ retryBackoff: false, retryDelay: 0 });
15
7
  export function linkedWorkerSpans(sender, spans) {
16
8
  return Effect.sync(() => spans.filter((span) => span.kind === "consumer"
17
9
  && span.attributes.get("messaging.system") === "pg-boss"
18
10
  && span.links.some((link) => link.span.spanId === sender.spanId && link.span.traceId === sender.traceId)));
19
11
  }
20
- export function makePgBossTesting(options = {}) {
21
- let current;
22
- let fetches;
23
- let schema = "pgboss";
24
- const signal = testingSignal();
25
- const work = { batches: new Set(), queues: new Set() };
26
- const controls = {
27
- changed: signal.changed,
28
- expirations: new Map(),
29
- expirySeconds: new Map(),
30
- failures: new Set(),
31
- retryPolicy: options.retryPolicy ?? {},
32
- work,
33
- };
34
- function client() {
35
- if (current === undefined) {
36
- throw new Error("Provide the testing clientFactory to a jobs Layer first");
37
- }
38
- return current;
39
- }
40
- const clientFactory = (clientOptions) => {
41
- if (current !== undefined) {
42
- throw new Error("A testing controller owns one jobs client; create a controller per runtime");
43
- }
44
- schema = clientOptions.schema ?? "pgboss";
45
- current = defaultClientFactory({ ...clientOptions, "__test__enableSpies": true });
46
- fetches = testingFetches(current.getDb(), signal.changed);
47
- return testingClient(current, clientOptions.schema ?? "pgboss", controls);
48
- };
49
- return {
50
- ...testingDeferrals(client),
51
- ...testingDueNow(client, () => schema, signal.changed),
52
- ...testingSchedules(client, signal.changed),
53
- ...testingWaits(client, () => fetches, signal),
54
- checkBatchWindow: (queue, millisecondsPerJob) => testingOperation("checkBatchWindow", async () => {
55
- const stored = await client().getQueue(queue.name);
56
- if (stored === null) {
57
- throw new Error("Queue is not registered");
58
- }
59
- if (stored.expireInSeconds === undefined) {
60
- throw new Error("Queue has no expiry window");
61
- }
62
- if (!Number.isFinite(millisecondsPerJob) || millisecondsPerJob < 0) {
63
- throw new RangeError("Job duration must be nonnegative and finite");
64
- }
65
- const required = (queue.workerOptions.batchSize ?? 10) * millisecondsPerJob;
66
- if (required >= stored.expireInSeconds * 1000) {
67
- throw new Error("Sequential batch work must fit within the queue expiry window");
68
- }
69
- }, queue.name),
70
- checkSchemaVersion: (expected) => testingOperation("checkSchemaVersion", async () => {
71
- if ((await client().schemaVersion()) !== expected) {
72
- throw new Error(`Expected pg-boss schema version ${expected}`);
73
- }
74
- }),
75
- clientFactory,
76
- expireAfter: (queue, attempts) => Effect.try({
77
- catch: (original) => new PgBossTestingError({ operation: "expireAfter", original: Redacted.make(original), queue: queue.name }),
78
- try: () => {
79
- if (!Number.isSafeInteger(attempts) || attempts < 1) {
80
- throw new RangeError("Attempts must be a positive integer");
81
- }
82
- controls.expirations.set(queue.name, attempts);
83
- },
84
- }),
85
- expireIn: (queue, duration) => Effect.try({
86
- catch: (original) => new PgBossTestingError({ operation: "expireIn", original: Redacted.make(original), queue: queue.name }),
87
- try: () => {
88
- const milliseconds = Duration.toMillis(Duration.fromInputUnsafe(duration));
89
- if (!Number.isFinite(milliseconds) || milliseconds < 1000) {
90
- throw new RangeError("Expiry must be finite and at least one second");
91
- }
92
- controls.expirySeconds.set(queue.name, Math.ceil(milliseconds / 1000));
93
- },
94
- }),
95
- failNextSend: (queue) => Effect.sync(() => controls.failures.add(queue.name)).pipe(Effect.asVoid),
96
- jobs: testingReadout(client),
97
- revision: signal.revision,
98
- schemaVersion: testingOperation("schemaVersion", () => client().schemaVersion()),
99
- snapshot: testingSnapshot(client, () => schema),
100
- waitForChange: signal.waitForChange,
101
- waitForIdle: testingIdle(client, () => schema, work, signal),
102
- };
103
- }
104
12
  //# sourceMappingURL=testing.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"testing.js","sourceRoot":"","sources":["../../src/server/testing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAe,MAAM,QAAQ,CAAC;AAEhF,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAE3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAEhE,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAuB,cAAc,EAAE,MAAM,sCAAsC,CAAC;AAC3F,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAoB,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACzE,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC/E,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAgBzD,MAAM,CAAC,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,YAAY,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC;AAMrF,MAAM,UAAU,iBAAiB,CAAC,MAAkD,EAAE,KAA6B;IAClH,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CACvB,KAAK,CAAC,MAAM,CACX,CAAC,IAAI,EAAE,EAAE,CACR,IAAI,CAAC,IAAI,KAAK,UAAU;WACrB,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,kBAAkB,CAAC,KAAK,SAAS;WACrD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,KAAK,MAAM,CAAC,OAAO,CAAC,CACzG,CACD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,OAAO,GAAyB,EAAE;IACnE,IAAI,OAA2B,CAAC;IAChC,IAAI,OAAmC,CAAC;IACxC,IAAI,MAAM,GAAG,QAAQ,CAAC;IACtB,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;IAC/B,MAAM,IAAI,GAAgB,EAAE,OAAO,EAAE,IAAI,GAAG,EAAE,EAAE,MAAM,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC;IACpE,MAAM,QAAQ,GAAG;QAChB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,WAAW,EAAE,IAAI,GAAG,EAAkB;QACtC,aAAa,EAAE,IAAI,GAAG,EAAkB;QACxC,QAAQ,EAAE,IAAI,GAAG,EAAU;QAC3B,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,EAAE;QACtC,IAAI;KACJ,CAAC;IACF,SAAS,MAAM;QACd,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;QAC5E,CAAC;QACD,OAAO,OAAO,CAAC;IAChB,CAAC;IACD,MAAM,aAAa,GAAwB,CAAC,aAAa,EAAE,EAAE;QAC5D,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,4EAA4E,CAAC,CAAC;QAC/F,CAAC;QACD,MAAM,GAAG,aAAa,CAAC,MAAM,IAAI,QAAQ,CAAC;QAC1C,OAAO,GAAG,oBAAoB,CAAC,EAAE,GAAG,aAAa,EAAE,qBAAqB,EAAE,IAAI,EAAE,CAAC,CAAC;QAClF,OAAO,GAAG,cAAc,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;QAC1D,OAAO,aAAa,CAAC,OAAO,EAAE,aAAa,CAAC,MAAM,IAAI,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC3E,CAAC,CAAC;IACF,OAAO;QACN,GAAG,gBAAgB,CAAC,MAAM,CAAC;QAC3B,GAAG,aAAa,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC;QACtD,GAAG,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC;QAC3C,GAAG,YAAY,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC;QAC9C,gBAAgB,EAAE,CAAC,KAAsD,EAAE,kBAA0B,EAAE,EAAE,CACxG,gBAAgB,CACf,kBAAkB,EAClB,KAAK,IAAI,EAAE;YACV,MAAM,MAAM,GAAG,MAAM,MAAM,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACnD,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;gBACrB,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;YAC5C,CAAC;YACD,IAAI,MAAM,CAAC,eAAe,KAAK,SAAS,EAAE,CAAC;gBAC1C,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;YAC/C,CAAC;YACD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAAC,IAAI,kBAAkB,GAAG,CAAC,EAAE,CAAC;gBACpE,MAAM,IAAI,UAAU,CAAC,6CAA6C,CAAC,CAAC;YACrE,CAAC;YACD,MAAM,QAAQ,GAAG,CAAC,KAAK,CAAC,aAAa,CAAC,SAAS,IAAI,EAAE,CAAC,GAAG,kBAAkB,CAAC;YAC5E,IAAI,QAAQ,IAAI,MAAM,CAAC,eAAe,GAAG,IAAI,EAAE,CAAC;gBAC/C,MAAM,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAC;YAClF,CAAC;QACF,CAAC,EACD,KAAK,CAAC,IAAI,CACV;QACF,kBAAkB,EAAE,CAAC,QAAgB,EAAE,EAAE,CACxC,gBAAgB,CAAC,oBAAoB,EAAE,KAAK,IAAI,EAAE;YACjD,IAAI,CAAC,MAAM,MAAM,EAAE,CAAC,aAAa,EAAE,CAAC,KAAK,QAAQ,EAAE,CAAC;gBACnD,MAAM,IAAI,KAAK,CAAC,mCAAmC,QAAQ,EAAE,CAAC,CAAC;YAChE,CAAC;QACF,CAAC,CAAC;QACH,aAAa;QACb,WAAW,EAAE,CAAC,KAAoC,EAAE,QAAgB,EAAE,EAAE,CACvE,MAAM,CAAC,GAAG,CAAC;YACV,KAAK,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,kBAAkB,CAAC,EAAE,SAAS,EAAE,aAAa,EAAE,QAAQ,EAAE,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;YAC/H,GAAG,EAAE,GAAG,EAAE;gBACT,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;oBACrD,MAAM,IAAI,UAAU,CAAC,qCAAqC,CAAC,CAAC;gBAC7D,CAAC;gBACD,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YAChD,CAAC;SACD,CAAC;QACH,QAAQ,EAAE,CAAC,KAAoC,EAAE,QAAwB,EAAE,EAAE,CAC5E,MAAM,CAAC,GAAG,CAAC;YACV,KAAK,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,kBAAkB,CAAC,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;YAC5H,GAAG,EAAE,GAAG,EAAE;gBACT,MAAM,YAAY,GAAG,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAC3E,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,YAAY,GAAG,IAAI,EAAE,CAAC;oBAC3D,MAAM,IAAI,UAAU,CAAC,+CAA+C,CAAC,CAAC;gBACvE,CAAC;gBACD,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC,CAAC;YACxE,CAAC;SACD,CAAC;QACH,YAAY,EAAE,CAAC,KAAoC,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;QAChI,IAAI,EAAE,cAAc,CAAC,MAAM,CAAC;QAC5B,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,aAAa,EAAE,gBAAgB,CAAC,eAAe,EAAE,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC,aAAa,EAAE,CAAC;QAChF,QAAQ,EAAE,eAAe,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC;QAC/C,aAAa,EAAE,MAAM,CAAC,aAAa;QACnC,WAAW,EAAE,WAAW,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC;KAC5D,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"testing.js","sourceRoot":"","sources":["../../src/server/testing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgC,MAAM,EAAe,MAAM,QAAQ,CAAC;AAC3E,OAAO,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AAG1E,MAAM,UAAU,iBAAiB,CAAC,OAAO,GAAyB,EAAE;IACnE,OAAO,iBAAiB,CAAC,OAAO,CAAC,CAAC;AACnC,CAAC;AAgBD,MAAM,CAAC,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,YAAY,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC;AAMrF,MAAM,UAAU,iBAAiB,CAAC,MAAkD,EAAE,KAA6B;IAClH,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CACvB,KAAK,CAAC,MAAM,CACX,CAAC,IAAI,EAAE,EAAE,CACR,IAAI,CAAC,IAAI,KAAK,UAAU;WACrB,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,kBAAkB,CAAC,KAAK,SAAS;WACrD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,KAAK,MAAM,CAAC,OAAO,CAAC,CACzG,CACD,CAAC;AACH,CAAC"}
@@ -0,0 +1,25 @@
1
+ export interface GroupConcurrencyConfig {
2
+ default: number;
3
+ tiers?: Record<string, number>;
4
+ }
5
+ export interface WorkerOptions {
6
+ batchSize?: number;
7
+ burstWhenBatchFull?: boolean;
8
+ burstWhenReadyExceeds?: number;
9
+ groupConcurrency?: number | GroupConcurrencyConfig;
10
+ heartbeatRefreshSeconds?: number;
11
+ ignoreStartAfter?: boolean;
12
+ includeMetadata?: boolean;
13
+ localConcurrency?: number;
14
+ localGroupConcurrency?: number | GroupConcurrencyConfig;
15
+ maxPriority?: number;
16
+ minPriority?: number;
17
+ notifyPollingIntervalSeconds?: number;
18
+ orderByCreatedOn?: boolean;
19
+ perJobResults?: boolean;
20
+ pollingIntervalSeconds?: number;
21
+ priority?: boolean;
22
+ transactional?: boolean;
23
+ transactionTimeoutSeconds?: number;
24
+ }
25
+ //# sourceMappingURL=workerOptions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workerOptions.d.ts","sourceRoot":"","sources":["../../src/server/workerOptions.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,sBAAsB;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC/B;AAED,MAAM,WAAW,aAAa;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,gBAAgB,CAAC,EAAE,MAAM,GAAG,sBAAsB,CAAC;IAEnD,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,eAAe,CAAC,EAAE,OAAO,CAAC;IAE1B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,qBAAqB,CAAC,EAAE,MAAM,GAAG,sBAAsB,CAAC;IACxD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,4BAA4B,CAAC,EAAE,MAAM,CAAC;IACtC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,aAAa,CAAC,EAAE,OAAO,CAAC;IAExB,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,yBAAyB,CAAC,EAAE,MAAM,CAAC;CACnC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=workerOptions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workerOptions.js","sourceRoot":"","sources":["../../src/server/workerOptions.ts"],"names":[],"mappings":""}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@shivaedev/jobs",
3
- "version": "0.30.0",
3
+ "version": "0.31.0",
4
4
  "description": "Effect-native jobs and lifecycle management for pg-boss",
5
5
  "keywords": [
6
6
  "effect"
@@ -20,14 +20,9 @@
20
20
  "imports": {
21
21
  "#test/*": "./src/test-support/*",
22
22
  "#*.ts": {
23
- "source": "./src/server/*.ts",
24
- "types": "./dist/server/*.d.ts",
25
- "default": "./dist/server/*.js"
26
- },
27
- "#JobFailure.ts": {
28
- "source": "./src/JobFailure.ts",
29
- "types": "./dist/JobFailure.d.ts",
30
- "default": "./dist/JobFailure.js"
23
+ "source": "./src/*.ts",
24
+ "types": "./dist/*.d.ts",
25
+ "default": "./dist/*.js"
31
26
  }
32
27
  },
33
28
  "exports": {
@@ -48,16 +43,16 @@
48
43
  "README.md"
49
44
  ],
50
45
  "dependencies": {
51
- "@shivaedev/errors": "0.5.0",
46
+ "@shivaedev/errors": "0.6.0",
52
47
  "@shivaedev/service": "0.6.1",
53
- "@shivaedev/sql": "0.33.0"
48
+ "@shivaedev/sql": "0.34.0"
54
49
  },
55
50
  "devDependencies": {
56
- "@shivaedev/http": "0.4.0",
57
- "@shivaedev/quality": "0.56.0",
58
- "@shivaedev/test": "0.13.0",
59
- "@shivaedev/test-sql": "0.16.2",
60
- "@shivaedev/test-story": "0.34.0",
51
+ "@shivaedev/http": "0.5.0",
52
+ "@shivaedev/quality": "0.57.0",
53
+ "@shivaedev/test": "0.14.0",
54
+ "@shivaedev/test-sql": "0.17.0",
55
+ "@shivaedev/test-story": "0.35.0",
61
56
  "@types/node": "24.19.2",
62
57
  "effect": "4.0.6",
63
58
  "pg-boss": "12.38.0",
package/src/display.ts ADDED
@@ -0,0 +1,12 @@
1
+ import type { Schema } from "effect";
2
+
3
+ export interface SubjectColumn<TPayload extends Schema.Top> {
4
+ readonly field: Extract<keyof TPayload["Type"], string>;
5
+ readonly label: string;
6
+ }
7
+
8
+ export interface QueueDisplay {
9
+ readonly label?: string;
10
+ readonly name: string;
11
+ readonly subject?: readonly { readonly field: string; readonly label: string }[];
12
+ }
@@ -0,0 +1,7 @@
1
+ export interface ClientDatabase {
2
+ beginTransaction?: () => Promise<{ db: ClientDatabase; commit: () => Promise<void>; rollback: () => Promise<void> }>;
3
+ executeSql: (text: string, values?: unknown[]) => Promise<{ rows: Record<string, unknown>[] }>;
4
+ listen?: (channel: string, onNotification: (payload: string) => void, onReconnect: () => void) => Promise<{ close: () => Promise<void> }>;
5
+ poolCounts?: () => { max: number; total: number; idle: number; waiting: number } | null;
6
+ setSessionStatements?: (statements: string[]) => Promise<void>;
7
+ }
@@ -1,6 +1,6 @@
1
1
  import { Context } from "effect";
2
- import type { StopOptions } from "pg-boss";
3
- import type { AcquiredClient } from "#internal/lifecycle.ts";
2
+ import type { StopOptions } from "#server/clientOptions.ts";
3
+ import type { AcquiredClient } from "#server/internal/lifecycle.ts";
4
4
 
5
5
  export class PgBoss extends Context.Service<
6
6
  PgBoss,
@@ -1,7 +1,7 @@
1
- import { Clock, Effect } from "effect";
2
- import type { PgBossClient } from "#client.ts";
3
- import { toPgBossError } from "#error.ts";
4
- import { quotedSchema } from "#internal/storedRows.ts";
1
+ import { Clock, Effect, Schema } from "effect";
2
+ import type { PgBossClient } from "#server/client.ts";
3
+ import { toPgBossError } from "#server/error.ts";
4
+ import { quotedSchema } from "#server/internal/storedRows.ts";
5
5
 
6
6
  export const batchClockOffset = Effect.fnUntraced(function* (client: PgBossClient, schema: string, name: string) {
7
7
  const { rows } = yield* Effect.tryPromise({
@@ -13,5 +13,8 @@ export const batchClockOffset = Effect.fnUntraced(function* (client: PgBossClien
13
13
  return client.getDb().executeSql(`SELECT EXTRACT(EPOCH FROM ${quotedSchema(schema)}.job_now()) * 1000 AS now`);
14
14
  },
15
15
  });
16
- return (yield* Clock.currentTimeMillis) - Number(rows[0].now);
16
+ const row = yield* Schema.decodeUnknownEffect(Schema.Struct({ now: Schema.Union([Schema.String, Schema.Number]) }))(rows[0]).pipe(
17
+ Effect.mapError((error) => toPgBossError("settle", error, name)),
18
+ );
19
+ return (yield* Clock.currentTimeMillis) - Number(row.now);
17
20
  });
@@ -1,18 +1,18 @@
1
1
  import { Cause, Clock, Effect, Exit } from "effect";
2
- import type { Job } from "pg-boss";
3
- import { batchClockOffset } from "#adapters/batchClockOffset.ts";
4
- import type { PgBossClient } from "#client.ts";
5
- import { toPgBossError } from "#error.ts";
6
- import { deadlineOf } from "#internal/deadlineOf.ts";
7
- import { deferredAttempt } from "#internal/deferral.ts";
8
- import { failureOutput } from "#internal/failureOutput.ts";
9
- import { waitForBatchExpiry } from "#internal/waitForBatchExpiry.ts";
2
+ import { batchClockOffset } from "#server/adapters/batchClockOffset.ts";
3
+ import type { PgBossClient } from "#server/client.ts";
4
+ import { toPgBossError } from "#server/error.ts";
5
+ import { deadlineOf } from "#server/internal/deadlineOf.ts";
6
+ import { deferredAttempt } from "#server/internal/deferral.ts";
7
+ import { failureOutput } from "#server/internal/failureOutput.ts";
8
+ import { waitForBatchExpiry } from "#server/internal/waitForBatchExpiry.ts";
9
+ import type { WorkerJob } from "#server/job.ts";
10
10
 
11
11
  function settleAttempt(
12
12
  complete: NonNullable<PgBossClient["complete"]>,
13
13
  fail: NonNullable<PgBossClient["fail"]>,
14
14
  name: string,
15
- job: Job<unknown>,
15
+ job: WorkerJob<unknown>,
16
16
  exit: Exit.Exit<unknown, unknown>,
17
17
  ) {
18
18
  if (Exit.isSuccess(exit) && exit.value === deferredAttempt) {
@@ -51,15 +51,15 @@ export function batchHandler<R>(
51
51
  client: PgBossClient,
52
52
  name: string,
53
53
  schema: string,
54
- run: (job: Job<unknown>, deadline: number) => Effect.Effect<unknown, unknown, R>,
55
- afterRetry: (job: Job<unknown>) => Effect.Effect<void, unknown> = () => Effect.void,
54
+ run: (job: WorkerJob<unknown>, deadline: number) => Effect.Effect<unknown, unknown, R>,
55
+ afterRetry: (job: WorkerJob<unknown>) => Effect.Effect<void, unknown> = () => Effect.void,
56
56
  ) {
57
57
  const complete = client.complete?.bind(client);
58
58
  const fail = client.fail?.bind(client);
59
59
  if (complete === undefined || fail === undefined) {
60
60
  throw new TypeError("This pg-boss client does not support complete and fail");
61
61
  }
62
- const handle = Effect.fnUntraced(function* (job: Job<unknown>, offset: number) {
62
+ const handle = Effect.fnUntraced(function* (job: WorkerJob<unknown>, offset: number) {
63
63
  if (job.signal.aborted) {
64
64
  return "interrupted";
65
65
  }
@@ -78,7 +78,7 @@ export function batchHandler<R>(
78
78
  }
79
79
  return "settled";
80
80
  });
81
- return (jobs: readonly Job<unknown>[]) =>
81
+ return (jobs: readonly WorkerJob<unknown>[]) =>
82
82
  Effect.gen(function* () {
83
83
  const offset = yield* batchClockOffset(client, schema, name);
84
84
  const deadline = Math.max(...jobs.map((job) => deadlineOf(job) + offset));
@@ -1,11 +1,11 @@
1
1
  import { isDeepStrictEqual } from "node:util";
2
- import type { ConstructorOptions } from "pg-boss";
3
- import type { PgBossClient } from "#client.ts";
4
- import { PgBossClientOptionsError } from "#error.ts";
2
+ import type { ClientOptions } from "#server/clientOptions.ts";
3
+ import { PgBossClientOptionsError } from "#server/error.ts";
4
+ import type { StartingClient } from "./lifecycle.ts";
5
5
 
6
6
  interface CachedClient {
7
- readonly client: Promise<PgBossClient>;
8
- readonly constructorOptions: ConstructorOptions;
7
+ readonly client: StartingClient;
8
+ readonly constructorOptions: ClientOptions;
9
9
  references: number;
10
10
  }
11
11
 
@@ -23,13 +23,13 @@ function isCachedClient(value: unknown): value is CachedClient {
23
23
  return (
24
24
  typeof value === "object"
25
25
  && value !== null
26
- && Reflect.get(value, "client") instanceof Promise
26
+ && typeof Reflect.get(value, "client") === "object"
27
27
  && typeof Reflect.get(value, "constructorOptions") === "object"
28
28
  && typeof Reflect.get(value, "references") === "number"
29
29
  );
30
30
  }
31
31
 
32
- export async function acquireCachedClient(key: string | symbol, constructorOptions: ConstructorOptions, start: () => Promise<PgBossClient>) {
32
+ export function acquireCachedClient(key: string | symbol, constructorOptions: ClientOptions, start: () => StartingClient) {
33
33
  const existing = entryFor(key);
34
34
  if (existing !== undefined) {
35
35
  const options = [...new Set([...Object.keys(existing.constructorOptions), ...Object.keys(constructorOptions)])]
@@ -39,27 +39,15 @@ export async function acquireCachedClient(key: string | symbol, constructorOptio
39
39
  throw new PgBossClientOptionsError({ key, options });
40
40
  }
41
41
  existing.references += 1;
42
- try {
43
- return { client: await existing.client, reused: true };
44
- } catch (error) {
45
- existing.references -= 1;
46
- throw error;
47
- }
42
+ return { ...existing.client, reused: true };
48
43
  }
49
44
  const settings = { ...constructorOptions };
50
45
  const entry: CachedClient = { client: start(), constructorOptions: settings, references: 1 };
51
46
  clients.set(key, entry);
52
- try {
53
- return { client: await entry.client, reused: false };
54
- } catch (error) {
55
- if (clients.get(key) === entry) {
56
- clients.delete(key);
57
- }
58
- throw error;
59
- }
47
+ return { ...entry.client, reused: false };
60
48
  }
61
49
 
62
- export function releaseCachedClient(key: string | symbol): Promise<PgBossClient> | undefined {
50
+ export function releaseCachedClient(key: string | symbol): StartingClient | undefined {
63
51
  const entry = entryFor(key);
64
52
  if (entry === undefined) {
65
53
  return;
@@ -1,5 +1,5 @@
1
1
  import { Effect } from "effect";
2
- import { logClientError } from "#internal/clientErrors.ts";
2
+ import { logClientError } from "#server/internal/clientErrors.ts";
3
3
 
4
4
  export const clientErrorLogger = Effect.fnUntraced(function* () {
5
5
  const run = Effect.runForkWith(yield* Effect.context<never>());
@@ -1,7 +1,9 @@
1
1
  import { Socket } from "node:net";
2
- import { type ConstructorOptions, PgBoss } from "pg-boss";
2
+ import { PgBoss } from "pg-boss";
3
+ import type { ClientOptions } from "#server/clientOptions.ts";
4
+ import type { EngineClient } from "#server/engineClient.ts";
3
5
 
4
- export function defaultClientFactory(options: ConstructorOptions) {
6
+ export function defaultClientFactory(options: ClientOptions): EngineClient {
5
7
  const disconnected = new Set<Promise<void>>();
6
8
  const config = {
7
9
  ...options,
@@ -1,12 +1,12 @@
1
1
  import { Effect, Schema } from "effect";
2
- import type { Job } from "pg-boss";
3
- import type { PgBossClient } from "#client.ts";
4
- import { toPgBossError } from "#error.ts";
5
- import { quotedSchema } from "#internal/storedRows.ts";
2
+ import type { PgBossClient } from "#server/client.ts";
3
+ import { toPgBossError } from "#server/error.ts";
4
+ import { quotedSchema } from "#server/internal/storedRows.ts";
5
+ import type { WorkerJob } from "#server/job.ts";
6
6
 
7
7
  const Count = Schema.Struct({ count: Schema.NumberFromString });
8
8
 
9
- export const deferralCount = Effect.fnUntraced(function* (client: PgBossClient, schema: string, job: Job<unknown>) {
9
+ export const deferralCount = Effect.fnUntraced(function* (client: PgBossClient, schema: string, job: WorkerJob<unknown>) {
10
10
  const quoted = quotedSchema(schema);
11
11
  return yield* Effect.tryPromise({
12
12
  catch: (error) => toPgBossError("settle", error, job.name),
@@ -1,7 +1,8 @@
1
- import type { Job, PgBoss } from "pg-boss";
2
- import { quotedSchema } from "#internal/storedRows.ts";
1
+ import type { EngineClient } from "#server/engineClient.ts";
2
+ import type { JobAttempt } from "#server/internal/engine.ts";
3
+ import { quotedSchema } from "#server/internal/storedRows.ts";
3
4
 
4
- export async function expireAttempt(client: PgBoss, schema: string, job: Job<unknown>, cause: "expiry" | "heartbeat" = "expiry"): Promise<void> {
5
+ export async function expireAttempt(client: EngineClient, schema: string, job: JobAttempt, cause: "expiry" | "heartbeat" = "expiry"): Promise<void> {
5
6
  if ((await client.schemaVersion()) !== 46) {
6
7
  throw new Error("Testing expiry requires pg-boss schema version 46");
7
8
  }
@@ -3,8 +3,8 @@ import { SqlClient } from "effect/sql";
3
3
  import type { Connection } from "effect/sql/SqlConnection";
4
4
  import { getConstructionPlans, getMigrationPlans, PgBoss } from "pg-boss";
5
5
  import pgBossPackage from "pg-boss/package.json" with { type: "json" };
6
- import { jobStorePlans } from "#internal/jobStorePlans.ts";
7
- import type { PgBossSchemaOptions } from "#schema.ts";
6
+ import { jobStorePlans } from "#server/internal/jobStorePlans.ts";
7
+ import type { PgBossSchemaOptions } from "#server/schema.ts";
8
8
  import { runSchemaPlan } from "./runSchemaPlan.ts";
9
9
  import { resumeSchemaIndexes } from "./schemaIndexBuilds.ts";
10
10
 
@@ -0,0 +1,59 @@
1
+ import { type Context, Effect } from "effect";
2
+ import type { PgBossClient } from "#server/client.ts";
3
+ import { toPgBossError } from "#server/error.ts";
4
+ import { deferralObservers } from "#server/internal/deferral.ts";
5
+ import type { JobEngine } from "#server/internal/engine.ts";
6
+ import { listJobs } from "./listJobs.ts";
7
+ import { queueAdministration } from "./queueAdministration.ts";
8
+ import { settleDeferral } from "./settleDeferral.ts";
9
+
10
+ export function jobEngine(client: PgBossClient, schema = "pgboss"): Context.Service.Shape<typeof JobEngine> {
11
+ return {
12
+ ...queueAdministration(client),
13
+ getJob: (queue, id) =>
14
+ Effect.tryPromise({
15
+ catch: (error) => toPgBossError("getJob", error, queue),
16
+ try: async () => {
17
+ if (client.findJobs === undefined) {
18
+ throw new TypeError("This pg-boss client does not support findJobs");
19
+ }
20
+ return (await client.findJobs(queue, { id }))[0];
21
+ },
22
+ }),
23
+ listJobs: listJobs(client, schema),
24
+ retry: (queue, id) =>
25
+ Effect.tryPromise({
26
+ catch: (error) => toPgBossError("retry", error, queue),
27
+ try: async () => {
28
+ if (client.findJobs === undefined || client.retry === undefined || client.update === undefined) {
29
+ throw new TypeError("This pg-boss client does not support findJobs, retry and update");
30
+ }
31
+ const job = (await client.findJobs(queue, { id }))[0];
32
+ if (job?.state !== "failed" && job?.state !== "retry") {
33
+ return;
34
+ }
35
+ if (job.state === "failed") {
36
+ await client.retry(queue, id);
37
+ }
38
+ await client.update(queue, undefined, { id, startAfter: 0 });
39
+ },
40
+ }),
41
+ settleDeferral: (job, at, reason, maxDeferrals) =>
42
+ Effect.tryPromise({
43
+ catch: (error) => toPgBossError("settle", error, job.name),
44
+ try: () => settleDeferral(client, schema, job, at, reason, maxDeferrals),
45
+ }).pipe(
46
+ Effect.tap((settled) =>
47
+ Effect.sync(() => {
48
+ if (!settled.claimed || settled.deferred) {
49
+ // Native batch settlement must not match a sibling's new claim at the unchanged retry count.
50
+ job.retryCount = Number.MAX_SAFE_INTEGER;
51
+ }
52
+ if (settled.deferred) {
53
+ deferralObservers.get(client)?.();
54
+ }
55
+ }),
56
+ ),
57
+ ),
58
+ };
59
+ }
@@ -0,0 +1,67 @@
1
+ import { type Context, Effect, Exit, Scope } from "effect";
2
+ import type { PgBossClient } from "#server/client.ts";
3
+ import type { StopOptions } from "#server/clientOptions.ts";
4
+ import { PgBossClientOptionsError, toPgBossError } from "#server/error.ts";
5
+ import { observeClientErrors } from "#server/internal/clientErrors.ts";
6
+ import { jobStorePlans } from "#server/internal/jobStorePlans.ts";
7
+ import type { AcquireClientOptions, ClientEngine } from "#server/internal/lifecycle.ts";
8
+ import { acquireCachedClient, releaseCachedClient } from "./clientCache.ts";
9
+ import { defaultClientFactory } from "./defaultClientFactory.ts";
10
+
11
+ export interface StartingClient {
12
+ readonly client: PgBossClient;
13
+ readonly ready: Promise<void>;
14
+ readonly stop: (options?: StopOptions) => Promise<void>;
15
+ }
16
+
17
+ function startClient(options: AcquireClientOptions, report: (error: Error) => void): StartingClient {
18
+ const client = (options.clientFactory ?? defaultClientFactory)(options.constructor);
19
+ observeClientErrors(client, report);
20
+ let closing = false;
21
+ const ready = (async () => {
22
+ await client.start();
23
+ if (!closing && options.constructor.migrate !== false && client.getDb !== undefined) {
24
+ for (const plan of jobStorePlans(options.constructor.schema ?? "pgboss")) {
25
+ await client.getDb().executeSql(plan);
26
+ }
27
+ }
28
+ })();
29
+ return {
30
+ client,
31
+ ready,
32
+ stop: (settings) => {
33
+ closing = true;
34
+ return client.stop(settings);
35
+ },
36
+ };
37
+ }
38
+
39
+ const acquire = Effect.fnUntraced(function* (options: AcquireClientOptions, report: (error: Error) => void, stop?: StopOptions) {
40
+ const scope = yield* Scope.fork(yield* Scope.Scope);
41
+ return yield* Effect.gen(function* () {
42
+ const lease = yield* Effect.acquireRelease(
43
+ Effect.try({
44
+ catch: (error) => (error instanceof PgBossClientOptionsError ? error : toPgBossError("start", error)),
45
+ try: () =>
46
+ options.clientCacheKey === undefined
47
+ ? { ...startClient(options, report), reused: false }
48
+ : acquireCachedClient(options.clientCacheKey, options.constructor, () => startClient(options, report)),
49
+ }),
50
+ (acquired) =>
51
+ Effect.tryPromise({
52
+ catch: (error) => toPgBossError("stop", error),
53
+ try: async () => {
54
+ const client = options.clientCacheKey === undefined ? acquired : releaseCachedClient(options.clientCacheKey);
55
+ await client?.stop(stop);
56
+ },
57
+ }).pipe(Effect.catch(Effect.logError)),
58
+ );
59
+ yield* Effect.tryPromise({ catch: (error) => toPgBossError("start", error), try: () => lease.ready });
60
+ return { ...(options.clientCacheKey === undefined ? {} : { cacheKey: options.clientCacheKey }), client: lease.client, reused: lease.reused };
61
+ }).pipe(
62
+ Effect.provideService(Scope.Scope, scope),
63
+ Effect.onError((cause) => Scope.close(scope, Exit.failCause(cause))),
64
+ );
65
+ });
66
+
67
+ export const clientEngine: Context.Service.Shape<typeof ClientEngine> = { acquire };
@@ -0,0 +1,43 @@
1
+ import { type Context, Effect } from "effect";
2
+ import type { PgBossClient } from "#server/client.ts";
3
+ import { toPgBossError } from "#server/error.ts";
4
+ import { deadLetterQueueName } from "#server/health.ts";
5
+ import type { JobEngine } from "#server/internal/engine.ts";
6
+ import { quotedSchema } from "#server/internal/storedRows.ts";
7
+
8
+ export function listJobs(client: PgBossClient, schema: string): Context.Service.Shape<typeof JobEngine>["listJobs"] {
9
+ return (listing, queue, after, limit) =>
10
+ Effect.tryPromise({
11
+ catch: (error) => toPgBossError(listing, error, queue),
12
+ try: async () => {
13
+ if (client.getDb === undefined) {
14
+ throw new TypeError("This pg-boss client does not support getDb");
15
+ }
16
+ const quoted = quotedSchema(schema);
17
+ const { rows: storedRows } = await client.getDb().executeSql(
18
+ `SELECT
19
+ id,
20
+ name AS queue,
21
+ state,
22
+ retry_count AS "retryCount",
23
+ retry_limit AS "retryLimit",
24
+ created_on AS "createdOn",
25
+ started_on AS "startedOn",
26
+ completed_on AS "completedOn",
27
+ output,
28
+ data,
29
+ source_id AS "sourceId",
30
+ source_output AS "sourceOutput",
31
+ to_json(created_on) #>> '{}' AS "cursorAt"
32
+ FROM ${quoted}.job
33
+ WHERE name = $1
34
+ ${listing === "failedJobs" ? "AND state = 'failed'" : ""}
35
+ AND ($2::timestamptz IS NULL OR (created_on, id) < ($2::timestamptz, $3::uuid))
36
+ ORDER BY created_on DESC, id DESC
37
+ LIMIT $4`,
38
+ [listing === "failedJobs" ? queue : deadLetterQueueName(queue), after?.[0] ?? null, after?.[1] ?? null, limit + 1],
39
+ );
40
+ return storedRows;
41
+ },
42
+ });
43
+ }
@@ -1,6 +1,6 @@
1
- import type { PgBoss } from "pg-boss";
1
+ import type { EngineClient } from "#server/engineClient.ts";
2
2
 
3
- export function observeTestingSettlements(client: PgBoss, settled: (name: string) => void) {
3
+ export function observeTestingSettlements(client: EngineClient, settled: (name: string) => void) {
4
4
  const observers = new Map<string, () => void>();
5
5
  return {
6
6
  close() {