@shivaedev/jobs 0.29.2 → 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 (383) hide show
  1. package/CHANGELOG.md +39 -0
  2. package/README.md +74 -22
  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 +16 -7
  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 +15 -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 +20 -18
  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 +17 -29
  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 +6 -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 +11 -5
  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 +4 -0
  222. package/dist/server/internal/testingRegistrations.d.ts.map +1 -0
  223. package/dist/server/internal/testingRegistrations.js +8 -0
  224. package/dist/server/internal/testingRegistrations.js.map +1 -0
  225. package/dist/server/internal/testingSchedules.d.ts +3 -3
  226. package/dist/server/internal/testingSchedules.d.ts.map +1 -1
  227. package/dist/server/internal/testingSchedules.js +1 -1
  228. package/dist/server/internal/testingSchedules.js.map +1 -1
  229. package/dist/server/internal/testingSnapshot.d.ts +4 -4
  230. package/dist/server/internal/testingSnapshot.d.ts.map +1 -1
  231. package/dist/server/internal/testingSnapshot.js +7 -4
  232. package/dist/server/internal/testingSnapshot.js.map +1 -1
  233. package/dist/server/internal/testingWaits.d.ts +8 -7
  234. package/dist/server/internal/testingWaits.d.ts.map +1 -1
  235. package/dist/server/internal/testingWaits.js +3 -3
  236. package/dist/server/internal/testingWaits.js.map +1 -1
  237. package/dist/server/internal/tracing.d.ts +2 -2
  238. package/dist/server/internal/tracing.d.ts.map +1 -1
  239. package/dist/server/internal/tracing.js.map +1 -1
  240. package/dist/server/internal/validateQueueNames.d.ts +2 -2
  241. package/dist/server/internal/validateQueueNames.d.ts.map +1 -1
  242. package/dist/server/internal/validateQueueNames.js +1 -1
  243. package/dist/server/internal/validateQueueNames.js.map +1 -1
  244. package/dist/server/internal/waitForBatchExpiry.d.ts +4 -4
  245. package/dist/server/internal/waitForBatchExpiry.d.ts.map +1 -1
  246. package/dist/server/internal/waitForBatchExpiry.js +1 -1
  247. package/dist/server/internal/waitForBatchExpiry.js.map +1 -1
  248. package/dist/server/job.d.ts +42 -0
  249. package/dist/server/job.d.ts.map +1 -0
  250. package/dist/server/job.js +2 -0
  251. package/dist/server/job.js.map +1 -0
  252. package/dist/server/jobModule.d.ts +9 -0
  253. package/dist/server/jobModule.d.ts.map +1 -0
  254. package/dist/server/jobModule.js +15 -0
  255. package/dist/server/jobModule.js.map +1 -0
  256. package/dist/server/queueOptions.d.ts +19 -0
  257. package/dist/server/queueOptions.d.ts.map +1 -0
  258. package/dist/server/queueOptions.js +2 -0
  259. package/dist/server/queueOptions.js.map +1 -0
  260. package/dist/server/readJobFailure.d.ts +5 -0
  261. package/dist/server/readJobFailure.d.ts.map +1 -0
  262. package/dist/server/readJobFailure.js +8 -0
  263. package/dist/server/readJobFailure.js.map +1 -0
  264. package/dist/server/schema.d.ts +1 -1
  265. package/dist/server/schema.d.ts.map +1 -1
  266. package/dist/server/schema.js +18 -7
  267. package/dist/server/schema.js.map +1 -1
  268. package/dist/server/service.d.ts +15 -10
  269. package/dist/server/service.d.ts.map +1 -1
  270. package/dist/server/service.js +26 -33
  271. package/dist/server/service.js.map +1 -1
  272. package/dist/server/testing.d.ts +32 -70
  273. package/dist/server/testing.d.ts.map +1 -1
  274. package/dist/server/testing.js +9 -96
  275. package/dist/server/testing.js.map +1 -1
  276. package/dist/server/workerOptions.d.ts +25 -0
  277. package/dist/server/workerOptions.d.ts.map +1 -0
  278. package/dist/server/workerOptions.js +2 -0
  279. package/dist/server/workerOptions.js.map +1 -0
  280. package/package.json +11 -16
  281. package/src/display.ts +12 -0
  282. package/src/server/ClientDatabase.ts +7 -0
  283. package/src/server/PgBoss.ts +2 -2
  284. package/src/server/adapters/batchClockOffset.ts +8 -5
  285. package/src/server/{internal → adapters}/batchHandler.ts +13 -13
  286. package/src/server/{internal → adapters}/clientCache.ts +10 -22
  287. package/src/server/adapters/clientErrorLogger.ts +1 -1
  288. package/src/server/{defaultClientFactory.ts → adapters/defaultClientFactory.ts} +4 -2
  289. package/src/server/adapters/deferralCount.ts +5 -5
  290. package/src/server/{internal → adapters}/expireAttempt.ts +4 -3
  291. package/src/server/adapters/installSchema.ts +2 -2
  292. package/src/server/adapters/jobEngine.ts +59 -0
  293. package/src/server/adapters/lifecycle.ts +67 -0
  294. package/src/server/adapters/listJobs.ts +43 -0
  295. package/src/server/{internal → adapters}/observeTestingSettlements.ts +2 -2
  296. package/src/server/adapters/queueAdministration.ts +47 -0
  297. package/src/server/adapters/registerWorker.ts +24 -13
  298. package/src/server/adapters/retireJobs.ts +5 -5
  299. package/src/server/adapters/schemaIndexBuilds.ts +2 -2
  300. package/src/server/{internal → adapters}/settleDeferral.ts +5 -5
  301. package/src/server/{internal → adapters}/testingClient.ts +34 -26
  302. package/src/server/adapters/testingController.ts +109 -0
  303. package/src/server/adapters/testingDueNow.ts +5 -5
  304. package/src/server/adapters/testingEngine.ts +28 -0
  305. package/src/server/adapters/testingExpirations.ts +6 -4
  306. package/src/server/adapters/transactionDb.ts +2 -2
  307. package/src/server/client.ts +83 -30
  308. package/src/server/clientOptions.ts +81 -0
  309. package/src/server/defineSchedule.ts +3 -2
  310. package/src/server/definition.ts +24 -20
  311. package/src/server/engineClient.ts +24 -0
  312. package/src/server/enqueueOptions.ts +20 -0
  313. package/src/server/error.ts +17 -2
  314. package/src/server/health.ts +2 -2
  315. package/src/server/internal/acquireClient.ts +26 -0
  316. package/src/server/internal/adapters/testingFetches.ts +2 -2
  317. package/src/server/internal/clientErrors.ts +1 -1
  318. package/src/server/internal/countsFor.ts +5 -5
  319. package/src/server/internal/deadLetterResolutionPlan.ts +1 -1
  320. package/src/server/internal/deadlineOf.ts +2 -2
  321. package/src/server/internal/deferrableAttempt.ts +5 -22
  322. package/src/server/internal/deferral.ts +3 -3
  323. package/src/server/internal/deferralStorePlan.ts +2 -2
  324. package/src/server/internal/definitionOptions.ts +1 -1
  325. package/src/server/internal/engine.ts +41 -0
  326. package/src/server/internal/enqueueFor.ts +5 -5
  327. package/src/server/internal/ensureQueue.ts +5 -6
  328. package/src/server/internal/healthFor.ts +4 -4
  329. package/src/server/internal/jobControl.ts +15 -50
  330. package/src/server/internal/jobListings.ts +85 -0
  331. package/src/server/internal/jobStorePlans.ts +2 -2
  332. package/src/server/internal/lifecycle.ts +14 -55
  333. package/src/server/internal/makeService.ts +21 -13
  334. package/src/server/internal/register.ts +27 -45
  335. package/src/server/internal/registerReleasedJobs.ts +6 -6
  336. package/src/server/internal/retryWake.ts +3 -3
  337. package/src/server/internal/runQueueWorker.ts +14 -8
  338. package/src/server/internal/storedRows.ts +3 -3
  339. package/src/server/internal/testingDeferrals.ts +5 -5
  340. package/src/server/internal/testingIdle.ts +13 -8
  341. package/src/server/internal/testingReadout.ts +12 -6
  342. package/src/server/internal/testingRegistrations.ts +10 -0
  343. package/src/server/internal/testingSchedules.ts +4 -4
  344. package/src/server/internal/testingSnapshot.ts +11 -8
  345. package/src/server/internal/testingWaits.ts +11 -10
  346. package/src/server/internal/tracing.ts +2 -2
  347. package/src/server/internal/validateQueueNames.ts +2 -2
  348. package/src/server/internal/waitForBatchExpiry.ts +4 -4
  349. package/src/server/job.ts +42 -0
  350. package/src/server/jobModule.ts +30 -0
  351. package/src/server/queueOptions.ts +20 -0
  352. package/src/server/readJobFailure.ts +12 -0
  353. package/src/server/schema.ts +18 -7
  354. package/src/server/service.ts +63 -59
  355. package/src/server/testing.ts +17 -108
  356. package/src/server/workerOptions.ts +28 -0
  357. package/dist/server/defaultClientFactory.d.ts +0 -3
  358. package/dist/server/defaultClientFactory.d.ts.map +0 -1
  359. package/dist/server/defaultClientFactory.js.map +0 -1
  360. package/dist/server/internal/batchHandler.d.ts +0 -5
  361. package/dist/server/internal/batchHandler.d.ts.map +0 -1
  362. package/dist/server/internal/batchHandler.js.map +0 -1
  363. package/dist/server/internal/clientCache.d.ts +0 -8
  364. package/dist/server/internal/clientCache.d.ts.map +0 -1
  365. package/dist/server/internal/clientCache.js.map +0 -1
  366. package/dist/server/internal/expireAttempt.d.ts +0 -3
  367. package/dist/server/internal/expireAttempt.d.ts.map +0 -1
  368. package/dist/server/internal/listJobs.d.ts +0 -5
  369. package/dist/server/internal/listJobs.d.ts.map +0 -1
  370. package/dist/server/internal/listJobs.js +0 -75
  371. package/dist/server/internal/listJobs.js.map +0 -1
  372. package/dist/server/internal/observeTestingSettlements.d.ts +0 -6
  373. package/dist/server/internal/observeTestingSettlements.d.ts.map +0 -1
  374. package/dist/server/internal/observeTestingSettlements.js.map +0 -1
  375. package/dist/server/internal/settleDeferral.d.ts +0 -7
  376. package/dist/server/internal/settleDeferral.d.ts.map +0 -1
  377. package/dist/server/internal/settleDeferral.js.map +0 -1
  378. package/dist/server/internal/testingClient.d.ts +0 -13
  379. package/dist/server/internal/testingClient.d.ts.map +0 -1
  380. package/dist/server/internal/testingClient.js.map +0 -1
  381. package/src/server/internal/listJobs.ts +0 -116
  382. /package/dist/server/{defaultClientFactory.js → adapters/defaultClientFactory.js} +0 -0
  383. /package/dist/server/{internal → adapters}/observeTestingSettlements.js +0 -0
@@ -1,14 +1,40 @@
1
- import { type DateTime, Duration, Effect } from "effect";
2
- import type { PgBossClientFactory } from "#client.ts";
3
- import type { JobPayloadSchema, QueueDefinition } from "#definition.ts";
4
- import { PgBossTestingError } from "#error.ts";
1
+ import { type DateTime, type Duration, Effect, type Tracer } from "effect";
2
+ import type { JobPayloadSchema, QueueDefinition } from "#server/definition.ts";
3
+ export declare function makePgBossTesting(options?: PgBossTestingOptions): {
4
+ runDeferredNow: (queue: Pick<QueueDefinition, "name">) => Effect.Effect<void, import("./error.ts").PgBossTestingError, never>;
5
+ runDueNow: (queue: Pick<QueueDefinition, "name">) => Effect.Effect<void, import("./error.ts").PgBossTestingError, never>;
6
+ deferred: (queue: Pick<QueueDefinition, "name">) => Effect.Effect<{
7
+ at: DateTime.Utc;
8
+ reason: string;
9
+ }[], import("./error.ts").PgBossTestingError, never>;
10
+ schedules: () => Effect.Effect<{
11
+ cron: string;
12
+ name: string;
13
+ timezone: string;
14
+ }[], import("./error.ts").PgBossTestingError, never>;
15
+ trigger: (schedule: Pick<import("#server/definition.ts").ScheduleDefinition, "name" | "scheduleOptions">) => Effect.Effect<void, import("./error.ts").PgBossTestingError, never>;
16
+ fetchesPass: (queue: Pick<QueueDefinition, "name">, count: number, options?: PgBossTestingWaitOptions) => Effect.Effect<unknown, import("./error.ts").PgBossTestingError | import("./error.ts").PgBossWaitError, never>;
17
+ untilJob: <TName extends string, TPayload extends JobPayloadSchema>(queue: Pick<QueueDefinition<TName, TPayload>, "name" | "schema">, id: string, state: import("./job.ts").JobState, options?: PgBossTestingWaitOptions) => Effect.Effect<import("./job.ts").Job<TPayload["Type"]>, import("./error.ts").PgBossPayloadError | import("./error.ts").PgBossTestingError | import("./error.ts").PgBossWaitError, Exclude<TPayload["DecodingServices"], never>>;
18
+ checkBatchWindow: (queue: Pick<QueueDefinition, "name" | "workerOptions">, millisecondsPerJob: number) => Effect.Effect<void, import("./error.ts").PgBossTestingError, never>;
19
+ checkSchemaVersion: (expected: number) => Effect.Effect<void, import("./error.ts").PgBossTestingError, never>;
20
+ clientFactory: import("./client.ts").PgBossClientFactory;
21
+ expireAfter: (queue: Pick<QueueDefinition, "name">, attempts: number) => Effect.Effect<void, import("./error.ts").PgBossTestingError, never>;
22
+ expireIn: (queue: Pick<QueueDefinition, "name">, duration: Duration.Input) => Effect.Effect<void, import("./error.ts").PgBossTestingError, never>;
23
+ failNextSend: (queue: Pick<QueueDefinition, "name">) => Effect.Effect<void, never, never>;
24
+ jobs: <TName extends string, TPayload extends JobPayloadSchema>(queue: QueueDefinition<TName, TPayload>, options?: import("./client.ts").JobReadOptions) => Effect.Effect<import("./job.ts").Job<TPayload["Type"]>[], import("./error.ts").PgBossTestingError | import("./error.ts").PgBossPayloadError, TPayload["DecodingServices"]>;
25
+ revision: Effect.Effect<number, never, never>;
26
+ schemaVersion: Effect.Effect<number | null, import("./error.ts").PgBossTestingError, never>;
27
+ snapshot: <const TQueues extends readonly SnapshotQueue[]>(queues: TQueues) => Effect.Effect<readonly UnfinishedJob<TQueues[number]>[], import("./error.ts").PgBossPayloadError | import("./error.ts").PgBossTestingError, TQueues[number]["schema"]["DecodingServices"]>;
28
+ waitForChange: (after: number) => Effect.Effect<number>;
29
+ waitForIdle: Effect.Effect<void, import("./error.ts").PgBossTestingError, never>;
30
+ };
5
31
  export type SnapshotQueue = Pick<QueueDefinition<string, JobPayloadSchema>, "name" | "schema">;
6
32
  export interface UnfinishedJob<TQueue extends SnapshotQueue> {
7
33
  readonly data: TQueue["schema"]["Type"];
8
34
  readonly id: string;
9
35
  readonly queue: TQueue["name"];
10
36
  readonly startAfter: DateTime.Utc;
11
- readonly state: "active" | "created" | "failed" | "retry";
37
+ readonly state: "active" | "created" | "deferred" | "failed" | "retry";
12
38
  }
13
39
  export interface PgBossTestingWaitOptions {
14
40
  readonly within?: Duration.Input;
@@ -20,70 +46,6 @@ export declare const testRetryPolicy: Readonly<{
20
46
  export interface PgBossTestingOptions {
21
47
  readonly retryPolicy?: typeof testRetryPolicy;
22
48
  }
23
- export declare function makePgBossTesting(options?: PgBossTestingOptions): {
24
- runDeferredNow: (queue: Pick<QueueDefinition, "name">) => Effect.Effect<void, PgBossTestingError, never>;
25
- runDueNow: (queue: Pick<QueueDefinition, "name">) => Effect.Effect<void, PgBossTestingError, never>;
26
- deferred: (queue: Pick<QueueDefinition, "name">) => Effect.Effect<{
27
- at: DateTime.Utc;
28
- reason: string;
29
- }[], PgBossTestingError, never>;
30
- schedules: () => Effect.Effect<{
31
- cron: string;
32
- name: string;
33
- timezone: string;
34
- }[], PgBossTestingError, never>;
35
- trigger: (schedule: Pick<import("#definition.ts").ScheduleDefinition, "name" | "scheduleOptions">) => Effect.Effect<void, PgBossTestingError, never>;
36
- fetchesPass: (queue: Pick<QueueDefinition, "name">, count: number, options?: PgBossTestingWaitOptions) => Effect.Effect<unknown, PgBossTestingError | import("#error.ts").PgBossWaitError, never>;
37
- untilJob: <TName extends string, TPayload extends JobPayloadSchema>(queue: Pick<QueueDefinition<TName, TPayload>, "name" | "schema">, id: string, state: import("pg-boss").JobWithMetadata["state"], options?: PgBossTestingWaitOptions) => Effect.Effect<import("pg-boss").JobWithMetadata<TPayload["Type"]>, import("#error.ts").PgBossPayloadError | PgBossTestingError | import("#error.ts").PgBossWaitError, Exclude<TPayload["DecodingServices"], never>>;
38
- checkBatchWindow: (queue: Pick<QueueDefinition, "name" | "workerOptions">, millisecondsPerJob: number) => Effect.Effect<void, PgBossTestingError, never>;
39
- checkSchemaVersion: (expected: number) => Effect.Effect<void, PgBossTestingError, never>;
40
- clientFactory: PgBossClientFactory;
41
- expireAfter: (queue: Pick<QueueDefinition, "name">, attempts: number) => Effect.Effect<void, PgBossTestingError, never>;
42
- expireIn: (queue: Pick<QueueDefinition, "name">, duration: Duration.Input) => Effect.Effect<void, PgBossTestingError, never>;
43
- failNextSend: (queue: Pick<QueueDefinition, "name">) => Effect.Effect<void, never, never>;
44
- jobs: <TName extends string, TPayload extends JobPayloadSchema>(queue: QueueDefinition<TName, TPayload>, options?: import("pg-boss").FindJobsOptions) => Effect.Effect<{
45
- id: string;
46
- name: string;
47
- retryCount: number;
48
- signal: AbortSignal;
49
- groupId?: string | null;
50
- groupTier?: string | null;
51
- priority: number;
52
- state: 'created' | 'retry' | 'active' | 'completed' | 'cancelled' | 'failed';
53
- retryLimit: number;
54
- retryDelay: number;
55
- retryBackoff: boolean;
56
- retryDelayMax?: number;
57
- startAfter: Date;
58
- startedOn: Date;
59
- singletonKey: string | null;
60
- singletonOn: Date | null;
61
- expireInSeconds: number;
62
- deleteAfterSeconds: number;
63
- createdOn: Date;
64
- completedOn: Date | null;
65
- keepUntil: Date;
66
- policy: import("pg-boss").QueuePolicy;
67
- heartbeatOn: Date | null;
68
- heartbeatSeconds: number | null;
69
- blocked: boolean;
70
- blocking: boolean;
71
- pendingDependencies: number;
72
- deadLetter: string;
73
- output: object;
74
- sourceName: string | null;
75
- sourceId: string | null;
76
- sourceCreatedOn: Date | null;
77
- sourceRetryCount: number | null;
78
- sourceOutput: object | null;
79
- sourceRootId: string | null;
80
- data: TPayload["Type"];
81
- }[], import("#error.ts").PgBossPayloadError | PgBossTestingError, TPayload["DecodingServices"]>;
82
- revision: Effect.Effect<number, never, never>;
83
- schemaVersion: Effect.Effect<number | null, PgBossTestingError, never>;
84
- snapshot: <const TQueues extends readonly SnapshotQueue[]>(queues: TQueues) => Effect.Effect<readonly UnfinishedJob<TQueues[number]>[], import("#error.ts").PgBossPayloadError | PgBossTestingError, TQueues[number]["schema"]["DecodingServices"]>;
85
- waitForChange: (after: number) => Effect.Effect<number>;
86
- waitForIdle: Effect.Effect<void, PgBossTestingError, never>;
87
- };
49
+ export declare function linkedWorkerSpans(sender: Pick<Tracer.AnySpan, "spanId" | "traceId">, spans: readonly Tracer.Span[]): Effect.Effect<Tracer.Span[], never, never>;
88
50
  export type PgBossTesting = ReturnType<typeof makePgBossTesting>;
89
51
  //# sourceMappingURL=testing.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../../src/server/testing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAY,MAAM,QAAQ,CAAC;AAGnE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEtD,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACxE,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAW/C,MAAM,MAAM,aAAa,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,gBAAgB,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC,CAAC;AAE/F,MAAM,WAAW,aAAa,CAAC,MAAM,SAAS,aAAa;IAC1D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC;IACxC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IAC/B,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,GAAG,CAAC;IAClC,QAAQ,CAAC,KAAK,EAAE,QAAQ,GAAG,SAAS,GAAG,QAAQ,GAAG,OAAO,CAAC;CAC1D;AAED,MAAM,WAAW,wBAAwB;IACxC,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC;CACjC;AAED,eAAO,MAAM,eAAe;;;EAAwD,CAAC;AAErF,MAAM,WAAW,oBAAoB;IACpC,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,eAAe,CAAC;CAC9C;AAED,wBAAgB,iBAAiB,CAAC,OAAO,GAAE,oBAAyB;;;;;;;;;;;;;;;8BAkCxC,IAAI,CAAC,eAAe,EAAE,MAAM,GAAG,eAAe,CAAC,sBAAsB,MAAM;mCAqBtE,MAAM;;yBAOhB,IAAI,CAAC,eAAe,EAAE,MAAM,CAAC,YAAY,MAAM;sBAUlD,IAAI,CAAC,eAAe,EAAE,MAAM,CAAC,YAAY,QAAQ,CAAC,KAAK;0BAWnD,IAAI,CAAC,eAAe,EAAE,MAAM,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAQpD;AAED,MAAM,MAAM,aAAa,GAAG,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAAC"}
1
+ {"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../../src/server/testing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,QAAQ,EAAE,MAAM,EAAE,KAAK,MAAM,EAAE,MAAM,QAAQ,CAAC;AAE3E,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAE/E,wBAAgB,iBAAiB,CAAC,OAAO,GAAE,oBAAyB;;;;;;;;;;;;;;;;;;;;;;;;;;;EAEnE;AAED,MAAM,MAAM,aAAa,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,gBAAgB,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC,CAAC;AAE/F,MAAM,WAAW,aAAa,CAAC,MAAM,SAAS,aAAa;IAC1D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC;IACxC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IAC/B,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,GAAG,CAAC;IAClC,QAAQ,CAAC,KAAK,EAAE,QAAQ,GAAG,SAAS,GAAG,UAAU,GAAG,QAAQ,GAAG,OAAO,CAAC;CACvE;AAED,MAAM,WAAW,wBAAwB;IACxC,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC;CACjC;AAED,eAAO,MAAM,eAAe;;;EAAwD,CAAC;AAErF,MAAM,WAAW,oBAAoB;IACpC,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,eAAe,CAAC;CAC9C;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,QAAQ,GAAG,SAAS,CAAC,EAAE,KAAK,EAAE,SAAS,MAAM,CAAC,IAAI,EAAE,8CASlH;AAED,MAAM,MAAM,aAAa,GAAG,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAAC"}
@@ -1,99 +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";
14
- export const testRetryPolicy = Object.freeze({ retryBackoff: false, retryDelay: 0 });
1
+ import { Effect } from "effect";
2
+ import { testingController } from "#server/adapters/testingController.ts";
15
3
  export function makePgBossTesting(options = {}) {
16
- let current;
17
- let fetches;
18
- let schema = "pgboss";
19
- const signal = testingSignal();
20
- const work = { batches: new Set(), queues: new Set() };
21
- const controls = {
22
- changed: signal.changed,
23
- expirations: new Map(),
24
- expirySeconds: new Map(),
25
- failures: new Set(),
26
- retryPolicy: options.retryPolicy ?? {},
27
- work,
28
- };
29
- function client() {
30
- if (current === undefined) {
31
- throw new Error("Provide the testing clientFactory to a jobs Layer first");
32
- }
33
- return current;
34
- }
35
- const clientFactory = (clientOptions) => {
36
- if (current !== undefined) {
37
- throw new Error("A testing controller owns one jobs client; create a controller per runtime");
38
- }
39
- schema = clientOptions.schema ?? "pgboss";
40
- current = defaultClientFactory({ ...clientOptions, "__test__enableSpies": true });
41
- fetches = testingFetches(current.getDb(), signal.changed);
42
- return testingClient(current, clientOptions.schema ?? "pgboss", controls);
43
- };
44
- return {
45
- ...testingDeferrals(client),
46
- ...testingDueNow(client, () => schema, signal.changed),
47
- ...testingSchedules(client, signal.changed),
48
- ...testingWaits(client, () => fetches, signal),
49
- checkBatchWindow: (queue, millisecondsPerJob) => testingOperation("checkBatchWindow", async () => {
50
- const stored = await client().getQueue(queue.name);
51
- if (stored === null) {
52
- throw new Error("Queue is not registered");
53
- }
54
- if (stored.expireInSeconds === undefined) {
55
- throw new Error("Queue has no expiry window");
56
- }
57
- if (!Number.isFinite(millisecondsPerJob) || millisecondsPerJob < 0) {
58
- throw new RangeError("Job duration must be nonnegative and finite");
59
- }
60
- const required = (queue.workerOptions.batchSize ?? 10) * millisecondsPerJob;
61
- if (required >= stored.expireInSeconds * 1000) {
62
- throw new Error("Sequential batch work must fit within the queue expiry window");
63
- }
64
- }, queue.name),
65
- checkSchemaVersion: (expected) => testingOperation("checkSchemaVersion", async () => {
66
- if ((await client().schemaVersion()) !== expected) {
67
- throw new Error(`Expected pg-boss schema version ${expected}`);
68
- }
69
- }),
70
- clientFactory,
71
- expireAfter: (queue, attempts) => Effect.try({
72
- catch: (original) => new PgBossTestingError({ operation: "expireAfter", original: Redacted.make(original), queue: queue.name }),
73
- try: () => {
74
- if (!Number.isSafeInteger(attempts) || attempts < 1) {
75
- throw new RangeError("Attempts must be a positive integer");
76
- }
77
- controls.expirations.set(queue.name, attempts);
78
- },
79
- }),
80
- expireIn: (queue, duration) => Effect.try({
81
- catch: (original) => new PgBossTestingError({ operation: "expireIn", original: Redacted.make(original), queue: queue.name }),
82
- try: () => {
83
- const milliseconds = Duration.toMillis(Duration.fromInputUnsafe(duration));
84
- if (!Number.isFinite(milliseconds) || milliseconds < 1000) {
85
- throw new RangeError("Expiry must be finite and at least one second");
86
- }
87
- controls.expirySeconds.set(queue.name, Math.ceil(milliseconds / 1000));
88
- },
89
- }),
90
- failNextSend: (queue) => Effect.sync(() => controls.failures.add(queue.name)).pipe(Effect.asVoid),
91
- jobs: testingReadout(client),
92
- revision: signal.revision,
93
- schemaVersion: testingOperation("schemaVersion", () => client().schemaVersion()),
94
- snapshot: testingSnapshot(client, () => schema),
95
- waitForChange: signal.waitForChange,
96
- waitForIdle: testingIdle(client, () => schema, work, signal),
97
- };
4
+ return testingController(options);
5
+ }
6
+ export const testRetryPolicy = Object.freeze({ retryBackoff: false, retryDelay: 0 });
7
+ export function linkedWorkerSpans(sender, spans) {
8
+ return Effect.sync(() => spans.filter((span) => span.kind === "consumer"
9
+ && span.attributes.get("messaging.system") === "pg-boss"
10
+ && span.links.some((link) => link.span.spanId === sender.spanId && link.span.traceId === sender.traceId)));
98
11
  }
99
12
  //# sourceMappingURL=testing.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"testing.js","sourceRoot":"","sources":["../../src/server/testing.ts"],"names":[],"mappings":"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"}
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.29.2",
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.32.0"
48
+ "@shivaedev/sql": "0.34.0"
54
49
  },
55
50
  "devDependencies": {
56
- "@shivaedev/http": "0.4.0",
57
- "@shivaedev/quality": "0.55.0",
58
- "@shivaedev/test": "0.12.1",
59
- "@shivaedev/test-sql": "0.16.1",
60
- "@shivaedev/test-story": "0.33.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