@shivaedev/jobs 0.35.1 → 0.36.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 (101) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/README.md +3 -83
  3. package/dist/server/adapters/inspectionChanges.d.ts.map +1 -1
  4. package/dist/server/adapters/inspectionChanges.js +17 -2
  5. package/dist/server/adapters/inspectionChanges.js.map +1 -1
  6. package/dist/server/adapters/localInspectionChanges.d.ts +3 -0
  7. package/dist/server/adapters/localInspectionChanges.d.ts.map +1 -0
  8. package/dist/server/adapters/localInspectionChanges.js +2 -0
  9. package/dist/server/adapters/localInspectionChanges.js.map +1 -0
  10. package/dist/server/adapters/settleDeferral.d.ts.map +1 -1
  11. package/dist/server/adapters/settleDeferral.js +4 -2
  12. package/dist/server/adapters/settleDeferral.js.map +1 -1
  13. package/dist/server/error.d.ts +1 -20
  14. package/dist/server/error.d.ts.map +1 -1
  15. package/dist/server/error.js +1 -8
  16. package/dist/server/error.js.map +1 -1
  17. package/dist/server/internal/engine.d.ts +1 -6
  18. package/dist/server/internal/engine.d.ts.map +1 -1
  19. package/dist/server/internal/engine.js +0 -2
  20. package/dist/server/internal/engine.js.map +1 -1
  21. package/package.json +11 -10
  22. package/src/server/adapters/inspectionChanges.ts +17 -2
  23. package/src/server/adapters/localInspectionChanges.ts +3 -0
  24. package/src/server/adapters/settleDeferral.ts +4 -2
  25. package/src/server/error.ts +1 -17
  26. package/src/server/internal/engine.ts +1 -8
  27. package/dist/server/adapters/expireAttempt.d.ts +0 -4
  28. package/dist/server/adapters/expireAttempt.d.ts.map +0 -1
  29. package/dist/server/adapters/expireAttempt.js +0 -17
  30. package/dist/server/adapters/expireAttempt.js.map +0 -1
  31. package/dist/server/adapters/testingClient.d.ts +0 -13
  32. package/dist/server/adapters/testingClient.d.ts.map +0 -1
  33. package/dist/server/adapters/testingClient.js +0 -101
  34. package/dist/server/adapters/testingClient.js.map +0 -1
  35. package/dist/server/adapters/testingController.d.ts +0 -80
  36. package/dist/server/adapters/testingController.d.ts.map +0 -1
  37. package/dist/server/adapters/testingController.js +0 -120
  38. package/dist/server/adapters/testingController.js.map +0 -1
  39. package/dist/server/adapters/testingDueNow.d.ts +0 -7
  40. package/dist/server/adapters/testingDueNow.d.ts.map +0 -1
  41. package/dist/server/adapters/testingDueNow.js +0 -26
  42. package/dist/server/adapters/testingDueNow.js.map +0 -1
  43. package/dist/server/adapters/testingEngine.d.ts +0 -5
  44. package/dist/server/adapters/testingEngine.d.ts.map +0 -1
  45. package/dist/server/adapters/testingEngine.js +0 -12
  46. package/dist/server/adapters/testingEngine.js.map +0 -1
  47. package/dist/server/adapters/testingExpirations.d.ts +0 -8
  48. package/dist/server/adapters/testingExpirations.d.ts.map +0 -1
  49. package/dist/server/adapters/testingExpirations.js +0 -27
  50. package/dist/server/adapters/testingExpirations.js.map +0 -1
  51. package/dist/server/adapters/testingInspectionClient.d.ts +0 -5
  52. package/dist/server/adapters/testingInspectionClient.d.ts.map +0 -1
  53. package/dist/server/adapters/testingInspectionClient.js +0 -52
  54. package/dist/server/adapters/testingInspectionClient.js.map +0 -1
  55. package/dist/server/adapters/testingTime.d.ts +0 -10
  56. package/dist/server/adapters/testingTime.d.ts.map +0 -1
  57. package/dist/server/adapters/testingTime.js +0 -18
  58. package/dist/server/adapters/testingTime.js.map +0 -1
  59. package/dist/server/internal/adapters/deferralChanges.d.ts +0 -3
  60. package/dist/server/internal/adapters/deferralChanges.d.ts.map +0 -1
  61. package/dist/server/internal/adapters/deferralChanges.js +0 -2
  62. package/dist/server/internal/adapters/deferralChanges.js.map +0 -1
  63. package/dist/server/internal/adapters/testingFetches.d.ts +0 -7
  64. package/dist/server/internal/adapters/testingFetches.d.ts.map +0 -1
  65. package/dist/server/internal/adapters/testingFetches.js +0 -30
  66. package/dist/server/internal/adapters/testingFetches.js.map +0 -1
  67. package/dist/server/internal/testingIdle.d.ts +0 -17
  68. package/dist/server/internal/testingIdle.d.ts.map +0 -1
  69. package/dist/server/internal/testingIdle.js +0 -18
  70. package/dist/server/internal/testingIdle.js.map +0 -1
  71. package/dist/server/internal/testingOperation.d.ts +0 -5
  72. package/dist/server/internal/testingOperation.d.ts.map +0 -1
  73. package/dist/server/internal/testingOperation.js +0 -12
  74. package/dist/server/internal/testingOperation.js.map +0 -1
  75. package/dist/server/internal/testingSchedules.d.ts +0 -14
  76. package/dist/server/internal/testingSchedules.d.ts.map +0 -1
  77. package/dist/server/internal/testingSchedules.js +0 -20
  78. package/dist/server/internal/testingSchedules.js.map +0 -1
  79. package/dist/server/internal/testingWaits.d.ts +0 -20
  80. package/dist/server/internal/testingWaits.d.ts.map +0 -1
  81. package/dist/server/internal/testingWaits.js +0 -53
  82. package/dist/server/internal/testingWaits.js.map +0 -1
  83. package/dist/server/testing.d.ts +0 -89
  84. package/dist/server/testing.d.ts.map +0 -1
  85. package/dist/server/testing.js +0 -12
  86. package/dist/server/testing.js.map +0 -1
  87. package/src/server/adapters/expireAttempt.ts +0 -22
  88. package/src/server/adapters/testingClient.ts +0 -123
  89. package/src/server/adapters/testingController.ts +0 -137
  90. package/src/server/adapters/testingDueNow.ts +0 -32
  91. package/src/server/adapters/testingEngine.ts +0 -15
  92. package/src/server/adapters/testingExpirations.ts +0 -33
  93. package/src/server/adapters/testingInspectionClient.ts +0 -70
  94. package/src/server/adapters/testingTime.ts +0 -25
  95. package/src/server/internal/adapters/deferralChanges.ts +0 -3
  96. package/src/server/internal/adapters/testingFetches.ts +0 -36
  97. package/src/server/internal/testingIdle.ts +0 -36
  98. package/src/server/internal/testingOperation.ts +0 -18
  99. package/src/server/internal/testingSchedules.ts +0 -35
  100. package/src/server/internal/testingWaits.ts +0 -94
  101. package/src/server/testing.ts +0 -31
@@ -1,30 +0,0 @@
1
- // pg-boss offers no hook for a worker fetch that finds nothing, so the controller recognizes its claim statement on the client's database.
2
- const claim = /UPDATE\s+\S+\s+j\s+SET\s+state\s*=\s*'active'/u;
3
- const claimedQueue = /\bj\.name\s*=\s*'(?<queue>[^']+)'/u;
4
- export function testingFetches(db, changed) {
5
- const begun = new Map();
6
- const passed = new Map();
7
- const executeSql = db.executeSql.bind(db);
8
- db.executeSql = async (text, values) => {
9
- const queue = claim.test(text) ? claimedQueue.exec(text)?.groups?.queue : undefined;
10
- if (queue === undefined) {
11
- return executeSql(text, values);
12
- }
13
- const ordinal = (begun.get(queue) ?? 0) + 1;
14
- begun.set(queue, ordinal);
15
- try {
16
- return await executeSql(text, values);
17
- }
18
- finally {
19
- const ordinals = passed.get(queue) ?? [];
20
- ordinals.push(ordinal);
21
- passed.set(queue, ordinals);
22
- changed();
23
- }
24
- };
25
- return {
26
- begun: (queue) => begun.get(queue) ?? 0,
27
- passedSince: (queue, mark) => (passed.get(queue) ?? []).filter((ordinal) => ordinal > mark).length,
28
- };
29
- }
30
- //# sourceMappingURL=testingFetches.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"testingFetches.js","sourceRoot":"","sources":["../../../../src/server/internal/adapters/testingFetches.ts"],"names":[],"mappings":"AAEA,2IAA2I;AAC3I,MAAM,KAAK,GAAG,gDAAgD,CAAC;AAC/D,MAAM,YAAY,GAAG,oCAAoC,CAAC;AAO1D,MAAM,UAAU,cAAc,CAAC,EAAkB,EAAE,OAAmB;IACrE,MAAM,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAC;IACxC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAoB,CAAC;IAC3C,MAAM,UAAU,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC1C,EAAE,CAAC,UAAU,GAAG,KAAK,EAAE,IAAY,EAAE,MAAkB,EAAE,EAAE;QAC1D,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;QACpF,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACzB,OAAO,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACjC,CAAC;QACD,MAAM,OAAO,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QAC5C,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAC1B,IAAI,CAAC;YACJ,OAAO,MAAM,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACvC,CAAC;gBAAS,CAAC;YACV,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;YACzC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACvB,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;YAC5B,OAAO,EAAE,CAAC;QACX,CAAC;IACF,CAAC,CAAC;IACF,OAAO;QACN,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;QACvC,WAAW,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC,MAAM;KAClG,CAAC;AACH,CAAC"}
@@ -1,17 +0,0 @@
1
- import { Effect } from "effect";
2
- import type { PgBossTestingError } from "#server/error.ts";
3
- import type { PgBossInspectionService } from "#server/inspection.ts";
4
- export interface TestingBatch {
5
- readonly jobs: ReadonlyMap<string, number>;
6
- readonly name: string;
7
- settled: boolean;
8
- }
9
- export interface TestingWork {
10
- readonly batches: Set<TestingBatch>;
11
- readonly queues: Set<string>;
12
- }
13
- export declare function testingIdle(inspection: () => PgBossInspectionService, work: TestingWork, signal: {
14
- readonly revision: Effect.Effect<number>;
15
- readonly waitForChange: (after: number) => Effect.Effect<number>;
16
- }, wake?: Effect.Effect<void>): Effect.Effect<void, PgBossTestingError>;
17
- //# sourceMappingURL=testingIdle.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"testingIdle.d.ts","sourceRoot":"","sources":["../../../src/server/internal/testingIdle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAGrE,MAAM,WAAW,YAAY;IAC5B,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC3B,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,YAAY,CAAC,CAAC;IACpC,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CAC7B;AAED,wBAAgB,WAAW,CAC1B,UAAU,EAAE,MAAM,uBAAuB,EACzC,IAAI,EAAE,WAAW,EACjB,MAAM,EAAE;IAAE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAAC,QAAQ,CAAC,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;CAAE,EACtH,IAAI,GAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAe,GACrC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,kBAAkB,CAAC,CAczC"}
@@ -1,18 +0,0 @@
1
- import { Effect } from "effect";
2
- import { testingInspection } from "#server/internal/testingOperation.ts";
3
- export function testingIdle(inspection, work, signal, wake = Effect.void) {
4
- const busy = Effect.suspend(() => testingInspection("waitForIdle", inspection().busy([...work.queues].map((name) => ({ name })))));
5
- return Effect.gen(function* () {
6
- while (true) {
7
- const revision = yield* signal.revision;
8
- // A batch with no settlement since its fetch still holds active jobs, so it is busy without a read.
9
- const unsettled = [...work.batches].some((batch) => !batch.settled);
10
- if (work.queues.size === 0 || !(unsettled || (yield* busy))) {
11
- return;
12
- }
13
- yield* wake;
14
- yield* signal.waitForChange(revision);
15
- }
16
- });
17
- }
18
- //# sourceMappingURL=testingIdle.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"testingIdle.js","sourceRoot":"","sources":["../../../src/server/internal/testingIdle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAGhC,OAAO,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;AAazE,MAAM,UAAU,WAAW,CAC1B,UAAyC,EACzC,IAAiB,EACjB,MAAsH,EACtH,IAAI,GAAwB,MAAM,CAAC,IAAI;IAEvC,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,iBAAiB,CAAC,aAAa,EAAE,UAAU,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACnI,OAAO,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QAC1B,OAAO,IAAI,EAAE,CAAC;YACb,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC;YACxC,oGAAoG;YACpG,MAAM,SAAS,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACpE,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,SAAS,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;gBAC7D,OAAO;YACR,CAAC;YACD,KAAK,CAAC,CAAC,IAAI,CAAC;YACZ,KAAK,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QACvC,CAAC;IACF,CAAC,CAAC,CAAC;AACJ,CAAC"}
@@ -1,5 +0,0 @@
1
- import { Effect } from "effect";
2
- import { PgBossError, PgBossTestingError } from "#server/error.ts";
3
- export declare function testingOperation<A>(operation: string, run: () => Promise<A>, queue?: string): Effect.Effect<A, PgBossTestingError, never>;
4
- export declare function testingInspection<A, E, R>(operation: string, effect: Effect.Effect<A, E | PgBossError, R>, queue?: string): Effect.Effect<A, PgBossTestingError | Exclude<E, PgBossError>, R>;
5
- //# sourceMappingURL=testingOperation.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"testingOperation.d.ts","sourceRoot":"","sources":["../../../src/server/internal/testingOperation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAY,MAAM,QAAQ,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAEnE,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,MAAM,+CAK3F;AAED,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,MAAM,qEAOzH"}
@@ -1,12 +0,0 @@
1
- import { Effect, Redacted } from "effect";
2
- import { PgBossError, PgBossTestingError } from "#server/error.ts";
3
- export function testingOperation(operation, run, queue) {
4
- return Effect.tryPromise({
5
- catch: (original) => new PgBossTestingError({ operation, original: Redacted.make(original), queue }),
6
- try: run,
7
- });
8
- }
9
- export function testingInspection(operation, effect, queue) {
10
- return effect.pipe(Effect.catchIf((error) => error instanceof PgBossError, (error) => Effect.fail(new PgBossTestingError({ operation, original: error.original, queue: queue ?? error.queue }))));
11
- }
12
- //# sourceMappingURL=testingOperation.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"testingOperation.js","sourceRoot":"","sources":["../../../src/server/internal/testingOperation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAEnE,MAAM,UAAU,gBAAgB,CAAI,SAAiB,EAAE,GAAqB,EAAE,KAAc;IAC3F,OAAO,MAAM,CAAC,UAAU,CAAC;QACxB,KAAK,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,kBAAkB,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,CAAC;QACpG,GAAG,EAAE,GAAG;KACR,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAU,SAAiB,EAAE,MAA4C,EAAE,KAAc;IACzH,OAAO,MAAM,CAAC,IAAI,CACjB,MAAM,CAAC,OAAO,CACb,CAAC,KAAK,EAAwB,EAAE,CAAC,KAAK,YAAY,WAAW,EAC7D,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,kBAAkB,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CACpH,CACD,CAAC;AACH,CAAC"}
@@ -1,14 +0,0 @@
1
- import { Effect } from "effect";
2
- import type { PgBossClient } from "#server/client.ts";
3
- import type { ScheduleDefinition } from "#server/definition.ts";
4
- import { PgBossTestingError } from "#server/error.ts";
5
- import type { PgBossInspectionService } from "#server/inspection.ts";
6
- export declare function testingSchedules(client: () => PgBossClient, inspection: () => PgBossInspectionService): {
7
- schedules: () => Effect.Effect<{
8
- cron: string;
9
- name: string;
10
- timezone: string;
11
- }[], PgBossTestingError, never>;
12
- trigger: (schedule: Pick<ScheduleDefinition, "name" | "scheduleOptions">) => Effect.Effect<string | null, PgBossTestingError, never>;
13
- };
14
- //# sourceMappingURL=testingSchedules.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"testingSchedules.d.ts","sourceRoot":"","sources":["../../../src/server/internal/testingSchedules.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAY,MAAM,QAAQ,CAAC;AAC1C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAGrE,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,YAAY,EAAE,UAAU,EAAE,MAAM,uBAAuB;IAEpG,SAAS;;;;;IAIT,OAAO,aAAa,IAAI,CAAC,kBAAkB,EAAE,MAAM,GAAG,iBAAiB,CAAC;EAqBzE"}
@@ -1,20 +0,0 @@
1
- import { Effect, Redacted } from "effect";
2
- import { PgBossTestingError } from "#server/error.ts";
3
- import { testingInspection, testingOperation } from "#server/internal/testingOperation.ts";
4
- export function testingSchedules(client, inspection) {
5
- return {
6
- schedules: () => Effect.suspend(() => testingInspection("schedules", inspection().schedules())).pipe(Effect.map((schedules) => schedules.map(({ name, cron, timezone }) => ({ cron, name, timezone })))),
7
- trigger: (schedule) => Effect.gen(function* () {
8
- const [registered] = yield* testingInspection("trigger", inspection().schedules(schedule.name, schedule.scheduleOptions.key ?? ""), schedule.name);
9
- if (registered === undefined) {
10
- return yield* new PgBossTestingError({
11
- operation: "trigger",
12
- original: Redacted.make(new Error("Schedule is not registered")),
13
- queue: schedule.name,
14
- });
15
- }
16
- return yield* testingOperation("trigger", () => client().send(registered.name, registered.data, { ...registered.options, startAfter: 0 }), schedule.name);
17
- }),
18
- };
19
- }
20
- //# sourceMappingURL=testingSchedules.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"testingSchedules.js","sourceRoot":"","sources":["../../../src/server/internal/testingSchedules.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAG1C,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAEtD,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,sCAAsC,CAAC;AAE3F,MAAM,UAAU,gBAAgB,CAAC,MAA0B,EAAE,UAAyC;IACrG,OAAO;QACN,SAAS,EAAE,GAAG,EAAE,CACf,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,iBAAiB,CAAC,WAAW,EAAE,UAAU,EAAE,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,IAAI,CAClF,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,CAClG;QACF,OAAO,EAAE,CAAC,QAA8D,EAAE,EAAE,CAC3E,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YACnB,MAAM,CAAC,UAAU,CAAC,GAAG,KAAK,CAAC,CAAC,iBAAiB,CAC5C,SAAS,EACT,UAAU,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,eAAe,CAAC,GAAG,IAAI,EAAE,CAAC,EACzE,QAAQ,CAAC,IAAI,CACb,CAAC;YACF,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;gBAC9B,OAAO,KAAK,CAAC,CAAC,IAAI,kBAAkB,CAAC;oBACpC,SAAS,EAAE,SAAS;oBACpB,QAAQ,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;oBAChE,KAAK,EAAE,QAAQ,CAAC,IAAI;iBACpB,CAAC,CAAC;YACJ,CAAC;YACD,OAAO,KAAK,CAAC,CAAC,gBAAgB,CAC7B,SAAS,EACT,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,EAAE,GAAG,UAAU,CAAC,OAAO,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,EAC/F,QAAQ,CAAC,IAAI,CACb,CAAC;QACH,CAAC,CAAC;KACH,CAAC;AACH,CAAC"}
@@ -1,20 +0,0 @@
1
- import { Effect, type Schema } from "effect";
2
- import type { JobPayloadSchema, QueueDefinition } from "#server/definition.ts";
3
- import { type PgBossPayloadError, PgBossTestingError, PgBossWaitError } from "#server/error.ts";
4
- import type { PgBossInspectionService } from "#server/inspection.ts";
5
- import type { TestingFetches } from "#server/internal/adapters/testingFetches.ts";
6
- import type { Job, JobState } from "#server/job.ts";
7
- import type { PgBossTestingWaitOptions } from "#server/testing.ts";
8
- interface Signal {
9
- readonly revision: Effect.Effect<number>;
10
- readonly waitForChange: (after: number) => Effect.Effect<number>;
11
- }
12
- export declare function testingWaits(inspection: () => PgBossInspectionService, fetches: () => TestingFetches | undefined, signal: Signal): {
13
- fetchesPass: (queue: Pick<QueueDefinition, "name">, count: number, options?: PgBossTestingWaitOptions) => Effect.Effect<unknown, PgBossTestingError | PgBossWaitError, never>;
14
- untilJob: <TName extends string, TPayload extends JobPayloadSchema | typeof Schema.Null>(queue: {
15
- readonly name: TName;
16
- readonly schema: TPayload;
17
- }, id: string, state: JobState, options?: PgBossTestingWaitOptions) => Effect.Effect<Job<TPayload["Type"]>, PgBossPayloadError | PgBossTestingError | PgBossWaitError, TPayload["DecodingServices"]>;
18
- };
19
- export {};
20
- //# sourceMappingURL=testingWaits.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"testingWaits.d.ts","sourceRoot":"","sources":["../../../src/server/internal/testingWaits.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,MAAM,EAAoB,KAAK,MAAM,EAAE,MAAM,QAAQ,CAAC;AACzE,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC/E,OAAO,EAAE,KAAK,kBAAkB,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAChG,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AACrE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6CAA6C,CAAC;AAElF,OAAO,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAOnE,UAAU,MAAM;IACf,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACzC,QAAQ,CAAC,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;CACjE;AA8BD,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,uBAAuB,EAAE,OAAO,EAAE,MAAM,cAAc,GAAG,SAAS,EAAE,MAAM,EAAE,MAAM;IAE/H,WAAW,UAAU,IAAI,CAAC,eAAe,EAAE,MAAM,CAAC,SAAS,MAAM,YAAY,wBAAwB;IAqBrG,QAAQ,GAAG,KAAK,SAAS,MAAM,EAAE,QAAQ,SAAS,gBAAgB,GAAG,OAAO,MAAM,CAAC,IAAI,SAC/E;QAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;QAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAA;KAAE,MACtD,MAAM,SACH,QAAQ,YACL,wBAAwB;EAmBpC"}
@@ -1,53 +0,0 @@
1
- import { Duration, Effect, Option, Redacted } from "effect";
2
- import { PgBossTestingError, PgBossWaitError } from "#server/error.ts";
3
- import { testingInspection } from "#server/internal/testingOperation.ts";
4
- function waitUntil(signal, waitingFor, read, options) {
5
- const within = Duration.fromInputUnsafe(options?.within ?? "20 seconds");
6
- return Effect.suspend(() => {
7
- let lastSeen = "nothing yet";
8
- const wait = Effect.gen(function* () {
9
- while (true) {
10
- const revision = yield* signal.revision;
11
- const { arrived, seen } = yield* read;
12
- lastSeen = seen;
13
- if (Option.isSome(arrived)) {
14
- return arrived.value;
15
- }
16
- yield* signal.waitForChange(revision);
17
- }
18
- });
19
- return wait.pipe(Effect.timeoutOrElse({ duration: within, orElse: () => Effect.fail(new PgBossWaitError({ lastSeen, waitingFor, within })) }));
20
- });
21
- }
22
- function fetchesRefused(queue, original) {
23
- return new PgBossTestingError({ operation: "fetchesPass", original: Redacted.make(original), queue: queue.name });
24
- }
25
- export function testingWaits(inspection, fetches, signal) {
26
- return {
27
- fetchesPass: (queue, count, options) => Effect.gen(function* () {
28
- if (!Number.isSafeInteger(count) || count < 1) {
29
- return yield* fetchesRefused(queue, new RangeError("Fetch count must be a positive integer"));
30
- }
31
- const observed = fetches();
32
- if (observed === undefined) {
33
- return yield* fetchesRefused(queue, new Error("Provide the testing clientFactory to a jobs Layer first"));
34
- }
35
- const begun = observed.begun(queue.name);
36
- const fetchesHave = count === 1 ? "fetch that began after the wait has" : "fetches that began after the wait have";
37
- return yield* waitUntil(signal, `${count} ${queue.name} ${fetchesHave} finished`, Effect.sync(() => {
38
- const passed = observed.passedSince(queue.name, begun);
39
- return { arrived: passed >= count ? Option.some(undefined) : Option.none(), seen: `${passed} finished` };
40
- }), options);
41
- }),
42
- untilJob: (queue, id, state, options) => waitUntil(signal, `job ${id} in ${queue.name} is ${state}`, Effect.suspend(() => testingInspection("untilJob", inspection().jobs(queue, { id }), queue.name)).pipe(Effect.flatMap(([job]) => {
43
- if (job === undefined) {
44
- return Effect.succeed({ arrived: Option.none(), seen: "no such job" });
45
- }
46
- if (job.state !== state) {
47
- return Effect.succeed({ arrived: Option.none(), seen: job.state });
48
- }
49
- return Effect.succeed({ arrived: Option.some(job), seen: job.state });
50
- })), options),
51
- };
52
- }
53
- //# sourceMappingURL=testingWaits.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"testingWaits.js","sourceRoot":"","sources":["../../../src/server/internal/testingWaits.ts"],"names":[],"mappings":"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"}
@@ -1,89 +0,0 @@
1
- import { type Duration, Effect, type Tracer } from "effect";
2
- import type { TestClock } from "effect/testing";
3
- export declare function makePgBossTesting(options?: PgBossTestingOptions): {
4
- runDeferredNow: (queue: Pick<import("./definition.ts").QueueDefinition, "name">) => Effect.Effect<void, import("./error.ts").PgBossTestingError, never>;
5
- runDueNow: (queue: Pick<import("./definition.ts").QueueDefinition, "name">) => Effect.Effect<void, import("./error.ts").PgBossTestingError, never>;
6
- timePasses: (duration: Duration.Input) => Effect.Effect<undefined, import("./error.ts").PgBossTestingError, never>;
7
- schedules: () => Effect.Effect<{
8
- cron: string;
9
- name: string;
10
- timezone: string;
11
- }[], import("./error.ts").PgBossTestingError, never>;
12
- trigger: (schedule: Pick<import("./definition.ts").ScheduleDefinition, "name" | "scheduleOptions">) => Effect.Effect<string | null, import("./error.ts").PgBossTestingError, never>;
13
- fetchesPass: (queue: Pick<import("./definition.ts").QueueDefinition, "name">, count: number, options?: PgBossTestingWaitOptions) => Effect.Effect<unknown, import("./error.ts").PgBossTestingError | import("./error.ts").PgBossWaitError, never>;
14
- untilJob: <TName extends string, TPayload extends import("./definition.ts").JobPayloadSchema | typeof import("effect/Schema").Null>(queue: {
15
- readonly name: TName;
16
- readonly schema: TPayload;
17
- }, 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, TPayload["DecodingServices"]>;
18
- deferred: (queue: Pick<import("./definition.ts").QueueDefinition, "name">) => Effect.Effect<{
19
- at: import("effect/DateTime").Utc;
20
- reason: string;
21
- }[], import("./error.ts").PgBossTestingError, never>;
22
- checkBatchWindow: (queue: Pick<import("./definition.ts").QueueDefinition, "name" | "workerOptions">, millisecondsPerJob: number) => Effect.Effect<void, import("./error.ts").PgBossTestingError, never>;
23
- checkSchemaVersion: (expected: number) => Effect.Effect<void, import("./error.ts").PgBossTestingError, never>;
24
- clientFactory: import("./client.ts").PgBossClientFactory;
25
- expireAfter: (queue: Pick<import("./definition.ts").QueueDefinition, "name">, attempts: number) => Effect.Effect<void, import("./error.ts").PgBossTestingError, never>;
26
- expireIn: (queue: Pick<import("./definition.ts").QueueDefinition, "name">, duration: Duration.Input) => Effect.Effect<void, import("./error.ts").PgBossTestingError, never>;
27
- failNextSend: (queue: Pick<import("./definition.ts").QueueDefinition, "name">) => Effect.Effect<void, never, never>;
28
- jobs: <TName extends string, TPayload extends import("./definition.ts").JobPayloadSchema | typeof import("effect/Schema").Null>(queue: {
29
- readonly name: TName;
30
- readonly schema: TPayload;
31
- }, readOptions?: import("./client.ts").JobReadOptions) => Effect.Effect<{
32
- expireInSeconds: number;
33
- groupId?: string | null;
34
- groupTier?: string | null;
35
- heartbeatSeconds: number | null;
36
- id: string;
37
- name: string;
38
- retryCount: number;
39
- signal: AbortSignal;
40
- blocked: boolean;
41
- blocking: boolean;
42
- completedOn: Date | null;
43
- createdOn: Date;
44
- deadLetter: string;
45
- deleteAfterSeconds: number;
46
- heartbeatOn: Date | null;
47
- keepUntil: Date;
48
- output: object | null;
49
- pendingDependencies: number;
50
- policy: string;
51
- priority: number;
52
- retryBackoff: boolean;
53
- retryDelay: number;
54
- retryDelayMax?: number;
55
- retryLimit: number;
56
- singletonKey: string | null;
57
- singletonOn: Date | null;
58
- sourceCreatedOn: Date | null;
59
- sourceId: string | null;
60
- sourceName: string | null;
61
- sourceOutput: object | null;
62
- sourceRetryCount: number | null;
63
- sourceRootId: string | null;
64
- startAfter: Date;
65
- startedOn: Date | null;
66
- state: import("./job.ts").JobState;
67
- data: TPayload["Type"];
68
- }[], import("./error.ts").PgBossPayloadError | import("./error.ts").PgBossTestingError, TPayload["DecodingServices"]>;
69
- refreshQueueStats: (queue?: Pick<import("./definition.ts").QueueDefinition, "name">) => Effect.Effect<void, import("./error.ts").PgBossTestingError, never>;
70
- revision: Effect.Effect<number, never, never>;
71
- schemaVersion: Effect.Effect<number | null, import("./error.ts").PgBossTestingError, never>;
72
- snapshot: <const TQueues extends readonly import("./inspection.ts").SnapshotQueue[]>(queues: TQueues) => Effect.Effect<readonly import("./inspection.ts").UnfinishedJob<TQueues[number]>[], import("./error.ts").PgBossPayloadError | import("./error.ts").PgBossTestingError, TQueues[number]["schema"]["DecodingServices"]>;
73
- waitForChange: (after: number) => Effect.Effect<number>;
74
- waitForIdle: Effect.Effect<void, import("./error.ts").PgBossTestingError, never>;
75
- };
76
- export interface PgBossTestingWaitOptions {
77
- readonly within?: Duration.Input;
78
- }
79
- export declare const testRetryPolicy: Readonly<{
80
- retryBackoff: false;
81
- retryDelay: 0;
82
- }>;
83
- export interface PgBossTestingOptions {
84
- readonly clock?: TestClock.TestClock;
85
- readonly retryPolicy?: typeof testRetryPolicy;
86
- }
87
- export declare function linkedWorkerSpans(sender: Pick<Tracer.AnySpan, "spanId" | "traceId">, spans: readonly Tracer.Span[]): Effect.Effect<Tracer.Span[], never, never>;
88
- export type PgBossTesting = ReturnType<typeof makePgBossTesting>;
89
- //# sourceMappingURL=testing.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../../src/server/testing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,EAAE,KAAK,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC5D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAGhD,wBAAgB,iBAAiB,CAAC,OAAO,GAAE,oBAAyB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAEnE;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,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC;IACrC,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,12 +0,0 @@
1
- import { Effect } from "effect";
2
- import { testingController } from "#server/adapters/testingController.ts";
3
- export function makePgBossTesting(options = {}) {
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)));
11
- }
12
- //# sourceMappingURL=testing.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"testing.js","sourceRoot":"","sources":["../../src/server/testing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,MAAM,EAAe,MAAM,QAAQ,CAAC;AAE5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AAE1E,MAAM,UAAU,iBAAiB,CAAC,OAAO,GAAyB,EAAE;IACnE,OAAO,iBAAiB,CAAC,OAAO,CAAC,CAAC;AACnC,CAAC;AAMD,MAAM,CAAC,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,YAAY,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC;AAOrF,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"}
@@ -1,22 +0,0 @@
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";
4
-
5
- export async function expireAttempt(client: EngineClient, schema: string, job: JobAttempt, cause: "expiry" | "heartbeat" = "expiry"): Promise<void> {
6
- if ((await client.schemaVersion()) !== 46) {
7
- throw new Error("Testing expiry requires pg-boss schema version 46");
8
- }
9
- const quoted = quotedSchema(schema);
10
- const timestamp = cause === "expiry" ? "started_on" : "heartbeat_on";
11
- const seconds = cause === "expiry" ? "expire_seconds" : "heartbeat_seconds";
12
- await client.getDb().executeSql(
13
- `UPDATE ${quoted}.job SET ${timestamp} = ${quoted}.job_now() - (${seconds} + 1) * interval '1 second'
14
- WHERE name = $1 AND id = $2 AND retry_count = $3 AND state = 'active'`,
15
- [job.name, job.id, job.retryCount],
16
- );
17
- // Supervision owns expiry and dead lettering; make its claim due with the job's deadline.
18
- await client
19
- .getDb()
20
- .executeSql(`UPDATE ${quoted}.queue SET monitor_claim_on = ${quoted}.job_now() - interval '1 week' WHERE name = $1`, [job.name]);
21
- await client.supervise(job.name);
22
- }
@@ -1,123 +0,0 @@
1
- import { Effect } from "effect";
2
- import { testingEngine } from "#server/adapters/testingEngine.ts";
3
- import { testingExpirations } from "#server/adapters/testingExpirations.ts";
4
- import type { ClientUpdateOptions, ClientUpdateRequest, ClientUpdateResult, PgBossClient } from "#server/client.ts";
5
- import type { EngineClient } from "#server/engineClient.ts";
6
- import type { EnqueueOptions } from "#server/enqueueOptions.ts";
7
- import { deferralChanges } from "#server/internal/adapters/deferralChanges.ts";
8
- import type { TestingBatch, TestingWork } from "#server/internal/testingIdle.ts";
9
- import type { WorkerJob } from "#server/job.ts";
10
-
11
- export interface TestingControls {
12
- readonly changed: () => void;
13
- readonly expirations: Map<string, number>;
14
- readonly expirySeconds: Map<string, number>;
15
- readonly failures: Set<string>;
16
- readonly retryPolicy: Pick<EnqueueOptions, "retryBackoff" | "retryDelay">;
17
- readonly work: TestingWork;
18
- }
19
-
20
- export function testingClient(client: EngineClient, schema: string, controls: TestingControls): EngineClient {
21
- const engine = testingEngine(client, schema);
22
- deferralChanges.set(client.getDb(), controls.changed);
23
-
24
- const expirations = testingExpirations(client);
25
- function update(request: ClientUpdateRequest): Promise<ClientUpdateResult>;
26
- function update(name: string, data: object | null | undefined, options?: ClientUpdateOptions): Promise<ClientUpdateResult>;
27
- async function update(request: string | ClientUpdateRequest, data?: object | null, options?: ClientUpdateOptions): Promise<ClientUpdateResult> {
28
- const result = typeof request === "string" ? await client.update(request, data, options) : await client.update(request);
29
- controls.changed();
30
- return result;
31
- }
32
- const overrides: Partial<PgBossClient> = {
33
- complete: async (...args) => {
34
- const result = await client.complete(...args);
35
- controls.changed();
36
- return result;
37
- },
38
- createQueue: (name, options) => {
39
- if (options?.deadLetter !== undefined) {
40
- controls.work.queues.add(name);
41
- }
42
- const { retryDelayMax, ...rest } = options ?? {};
43
- return client.createQueue(name, {
44
- ...rest,
45
- ...(controls.retryPolicy.retryBackoff === false || retryDelayMax === undefined ? {} : { retryDelayMax }),
46
- ...controls.retryPolicy,
47
- });
48
- },
49
- fail: async (...args) => {
50
- const result = await client.fail(...args);
51
- controls.changed();
52
- return result;
53
- },
54
- retry: async (...args) => {
55
- const result = await client.retry(...args);
56
- controls.changed();
57
- return result;
58
- },
59
- send: async (name, data, options) => {
60
- if (controls.failures.delete(name)) {
61
- throw new Error("Injected pg-boss send failure");
62
- }
63
- const attempts = controls.expirations.get(name);
64
- const expireInSeconds = controls.expirySeconds.get(name);
65
- const { retryDelayMax, ...rest } = options ?? {};
66
- const id = await expirations.send(
67
- name,
68
- data,
69
- {
70
- ...rest,
71
- ...(controls.retryPolicy.retryBackoff === false || retryDelayMax === undefined ? {} : { retryDelayMax }),
72
- ...controls.retryPolicy,
73
- ...(attempts === undefined ? {} : { retryLimit: attempts - 1 }),
74
- ...(expireInSeconds === undefined ? {} : { expireInSeconds }),
75
- },
76
- attempts,
77
- );
78
- controls.changed();
79
- return id;
80
- },
81
- update,
82
- updateQueue: (name, options) =>
83
- client.updateQueue(name, {
84
- ...options,
85
- ...controls.retryPolicy,
86
- ...(controls.retryPolicy.retryBackoff === false ? { retryDelayMax: null } : {}),
87
- }),
88
- work: async (name, options, handler) =>
89
- client.work(name, options, async (jobs: readonly WorkerJob<unknown>[]) => {
90
- const batch: TestingBatch = { jobs: new Map(jobs.map((job) => [job.id, job.retryCount])), name, settled: false };
91
- controls.work.batches.add(batch);
92
- controls.changed();
93
- try {
94
- const ready: WorkerJob<unknown>[] = [];
95
- for (const job of jobs) {
96
- const attempts = await expirations.attemptsFor(job);
97
- if (attempts !== undefined && job.retryCount + 1 >= attempts) {
98
- await Effect.runPromise(engine.expireAttempt(job));
99
- } else {
100
- ready.push(job);
101
- }
102
- }
103
- if (ready.length > 0) {
104
- await handler(ready);
105
- }
106
- } finally {
107
- controls.work.batches.delete(batch);
108
- controls.changed();
109
- }
110
- }),
111
- };
112
- const wrapped = new Proxy(client, {
113
- get(target, property) {
114
- if (Object.hasOwn(overrides, property)) {
115
- const override: unknown = Reflect.get(overrides, property);
116
- return override;
117
- }
118
- const value: unknown = Reflect.get(target, property);
119
- return typeof value === "function" ? value.bind(target) : value;
120
- },
121
- });
122
- return wrapped;
123
- }