@shivaedev/jobs 0.31.0 → 0.32.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 (191) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/README.md +57 -26
  3. package/dist/server/adapters/inspection.d.ts +5 -0
  4. package/dist/server/adapters/inspection.d.ts.map +1 -0
  5. package/dist/server/adapters/inspection.js +25 -0
  6. package/dist/server/adapters/inspection.js.map +1 -0
  7. package/dist/server/adapters/inspectionChanges.d.ts +7 -0
  8. package/dist/server/adapters/inspectionChanges.d.ts.map +1 -0
  9. package/dist/server/adapters/inspectionChanges.js +23 -0
  10. package/dist/server/adapters/inspectionChanges.js.map +1 -0
  11. package/dist/server/adapters/inspectionDeferrals.d.ts +10 -0
  12. package/dist/server/adapters/inspectionDeferrals.d.ts.map +1 -0
  13. package/dist/server/adapters/inspectionDeferrals.js +13 -0
  14. package/dist/server/adapters/inspectionDeferrals.js.map +1 -0
  15. package/dist/server/adapters/inspectionJobs.d.ts +50 -0
  16. package/dist/server/adapters/inspectionJobs.d.ts.map +1 -0
  17. package/dist/server/adapters/inspectionJobs.js +21 -0
  18. package/dist/server/adapters/inspectionJobs.js.map +1 -0
  19. package/dist/server/adapters/inspectionOperation.d.ts +3 -0
  20. package/dist/server/adapters/inspectionOperation.d.ts.map +1 -0
  21. package/dist/server/adapters/inspectionOperation.js +6 -0
  22. package/dist/server/adapters/inspectionOperation.js.map +1 -0
  23. package/dist/server/adapters/inspectionPlan.d.ts +3 -0
  24. package/dist/server/adapters/inspectionPlan.d.ts.map +1 -0
  25. package/dist/server/adapters/inspectionPlan.js +20 -0
  26. package/dist/server/adapters/inspectionPlan.js.map +1 -0
  27. package/dist/server/adapters/inspectionReads.d.ts +59 -0
  28. package/dist/server/adapters/inspectionReads.d.ts.map +1 -0
  29. package/dist/server/adapters/inspectionReads.js +44 -0
  30. package/dist/server/adapters/inspectionReads.js.map +1 -0
  31. package/dist/server/adapters/inspectionSnapshot.d.ts +6 -0
  32. package/dist/server/adapters/inspectionSnapshot.d.ts.map +1 -0
  33. package/dist/server/{internal/testingSnapshot.js → adapters/inspectionSnapshot.js} +9 -7
  34. package/dist/server/adapters/inspectionSnapshot.js.map +1 -0
  35. package/dist/server/adapters/jobEngine.d.ts.map +1 -1
  36. package/dist/server/adapters/jobEngine.js +0 -4
  37. package/dist/server/adapters/jobEngine.js.map +1 -1
  38. package/dist/server/adapters/payloadIdentity.d.ts +3 -0
  39. package/dist/server/adapters/payloadIdentity.d.ts.map +1 -0
  40. package/dist/server/adapters/payloadIdentity.js +14 -0
  41. package/dist/server/adapters/payloadIdentity.js.map +1 -0
  42. package/dist/server/{internal/testingSignal.d.ts → adapters/queueSignal.d.ts} +2 -2
  43. package/dist/server/adapters/queueSignal.d.ts.map +1 -0
  44. package/dist/server/{internal/testingSignal.js → adapters/queueSignal.js} +2 -2
  45. package/dist/server/adapters/queueSignal.js.map +1 -0
  46. package/dist/server/adapters/testingClient.d.ts +1 -2
  47. package/dist/server/adapters/testingClient.d.ts.map +1 -1
  48. package/dist/server/adapters/testingClient.js +23 -45
  49. package/dist/server/adapters/testingClient.js.map +1 -1
  50. package/dist/server/adapters/testingController.d.ts +57 -12
  51. package/dist/server/adapters/testingController.d.ts.map +1 -1
  52. package/dist/server/adapters/testingController.js +28 -18
  53. package/dist/server/adapters/testingController.js.map +1 -1
  54. package/dist/server/adapters/testingDueNow.js +1 -1
  55. package/dist/server/adapters/testingDueNow.js.map +1 -1
  56. package/dist/server/adapters/testingEngine.d.ts.map +1 -1
  57. package/dist/server/adapters/testingEngine.js +0 -11
  58. package/dist/server/adapters/testingEngine.js.map +1 -1
  59. package/dist/server/adapters/testingInspectionClient.d.ts +5 -0
  60. package/dist/server/adapters/testingInspectionClient.d.ts.map +1 -0
  61. package/dist/server/adapters/testingInspectionClient.js +52 -0
  62. package/dist/server/adapters/testingInspectionClient.js.map +1 -0
  63. package/dist/server/client.d.ts +3 -0
  64. package/dist/server/client.d.ts.map +1 -1
  65. package/dist/server/clientOptions.d.ts +0 -1
  66. package/dist/server/clientOptions.d.ts.map +1 -1
  67. package/dist/server/definition.d.ts +12 -11
  68. package/dist/server/definition.d.ts.map +1 -1
  69. package/dist/server/definition.js +2 -1
  70. package/dist/server/definition.js.map +1 -1
  71. package/dist/server/engineClient.d.ts +0 -5
  72. package/dist/server/engineClient.d.ts.map +1 -1
  73. package/dist/server/enqueueOptions.d.ts +6 -0
  74. package/dist/server/enqueueOptions.d.ts.map +1 -1
  75. package/dist/server/error.d.ts +1 -1
  76. package/dist/server/error.d.ts.map +1 -1
  77. package/dist/server/error.js.map +1 -1
  78. package/dist/server/inspection.d.ts +102 -0
  79. package/dist/server/inspection.d.ts.map +1 -0
  80. package/dist/server/inspection.js +30 -0
  81. package/dist/server/inspection.js.map +1 -0
  82. package/dist/server/internal/adapters/testingFetches.d.ts +2 -2
  83. package/dist/server/internal/adapters/testingFetches.d.ts.map +1 -1
  84. package/dist/server/internal/adapters/testingFetches.js.map +1 -1
  85. package/dist/server/internal/deferral.d.ts +0 -2
  86. package/dist/server/internal/deferral.d.ts.map +1 -1
  87. package/dist/server/internal/deferral.js +0 -1
  88. package/dist/server/internal/deferral.js.map +1 -1
  89. package/dist/server/internal/engine.d.ts +0 -5
  90. package/dist/server/internal/engine.d.ts.map +1 -1
  91. package/dist/server/internal/engine.js.map +1 -1
  92. package/dist/server/internal/enqueueFor.d.ts.map +1 -1
  93. package/dist/server/internal/enqueueFor.js +11 -1
  94. package/dist/server/internal/enqueueFor.js.map +1 -1
  95. package/dist/server/internal/jobStorePlans.d.ts.map +1 -1
  96. package/dist/server/internal/jobStorePlans.js +2 -1
  97. package/dist/server/internal/jobStorePlans.js.map +1 -1
  98. package/dist/server/internal/makeService.d.ts.map +1 -1
  99. package/dist/server/internal/makeService.js +7 -6
  100. package/dist/server/internal/makeService.js.map +1 -1
  101. package/dist/server/internal/register.d.ts.map +1 -1
  102. package/dist/server/internal/register.js +0 -4
  103. package/dist/server/internal/register.js.map +1 -1
  104. package/dist/server/internal/testingIdle.d.ts +3 -2
  105. package/dist/server/internal/testingIdle.d.ts.map +1 -1
  106. package/dist/server/internal/testingIdle.js +5 -25
  107. package/dist/server/internal/testingIdle.js.map +1 -1
  108. package/dist/server/internal/testingOperation.d.ts +5 -0
  109. package/dist/server/internal/testingOperation.d.ts.map +1 -0
  110. package/dist/server/internal/testingOperation.js +12 -0
  111. package/dist/server/internal/testingOperation.js.map +1 -0
  112. package/dist/server/internal/testingSchedules.d.ts +8 -5
  113. package/dist/server/internal/testingSchedules.d.ts.map +1 -1
  114. package/dist/server/internal/testingSchedules.js +14 -9
  115. package/dist/server/internal/testingSchedules.js.map +1 -1
  116. package/dist/server/internal/testingWaits.d.ts +7 -4
  117. package/dist/server/internal/testingWaits.d.ts.map +1 -1
  118. package/dist/server/internal/testingWaits.js +5 -6
  119. package/dist/server/internal/testingWaits.js.map +1 -1
  120. package/dist/server/schema.d.ts.map +1 -1
  121. package/dist/server/schema.js +5 -0
  122. package/dist/server/schema.js.map +1 -1
  123. package/dist/server/service.d.ts +4 -4
  124. package/dist/server/service.d.ts.map +1 -1
  125. package/dist/server/service.js +1 -0
  126. package/dist/server/service.js.map +1 -1
  127. package/dist/server/testing.d.ts +60 -25
  128. package/dist/server/testing.d.ts.map +1 -1
  129. package/dist/server/testing.js.map +1 -1
  130. package/package.json +6 -6
  131. package/src/server/adapters/inspection.ts +31 -0
  132. package/src/server/adapters/inspectionChanges.ts +31 -0
  133. package/src/server/{internal/testingDeferrals.ts → adapters/inspectionDeferrals.ts} +10 -12
  134. package/src/server/adapters/inspectionJobs.ts +28 -0
  135. package/src/server/adapters/inspectionOperation.ts +6 -0
  136. package/src/server/adapters/inspectionPlan.ts +21 -0
  137. package/src/server/adapters/inspectionReads.ts +55 -0
  138. package/src/server/{internal/testingSnapshot.ts → adapters/inspectionSnapshot.ts} +15 -17
  139. package/src/server/adapters/jobEngine.ts +0 -4
  140. package/src/server/adapters/payloadIdentity.ts +15 -0
  141. package/src/server/{internal/testingSignal.ts → adapters/queueSignal.ts} +1 -1
  142. package/src/server/adapters/testingClient.ts +9 -30
  143. package/src/server/adapters/testingController.ts +37 -21
  144. package/src/server/adapters/testingDueNow.ts +1 -1
  145. package/src/server/adapters/testingEngine.ts +0 -13
  146. package/src/server/adapters/testingInspectionClient.ts +70 -0
  147. package/src/server/client.ts +3 -0
  148. package/src/server/clientOptions.ts +0 -1
  149. package/src/server/definition.ts +18 -12
  150. package/src/server/engineClient.ts +0 -2
  151. package/src/server/enqueueOptions.ts +5 -0
  152. package/src/server/error.ts +1 -0
  153. package/src/server/inspection.ts +50 -0
  154. package/src/server/internal/adapters/testingFetches.ts +2 -2
  155. package/src/server/internal/deferral.ts +0 -2
  156. package/src/server/internal/engine.ts +0 -6
  157. package/src/server/internal/enqueueFor.ts +14 -1
  158. package/src/server/internal/jobStorePlans.ts +2 -1
  159. package/src/server/internal/makeService.ts +7 -6
  160. package/src/server/internal/register.ts +0 -4
  161. package/src/server/internal/testingIdle.ts +7 -30
  162. package/src/server/internal/testingOperation.ts +18 -0
  163. package/src/server/internal/testingSchedules.ts +28 -16
  164. package/src/server/internal/testingWaits.ts +10 -11
  165. package/src/server/schema.ts +5 -0
  166. package/src/server/service.ts +5 -2
  167. package/src/server/testing.ts +1 -12
  168. package/dist/server/adapters/observeTestingSettlements.d.ts +0 -6
  169. package/dist/server/adapters/observeTestingSettlements.d.ts.map +0 -1
  170. package/dist/server/adapters/observeTestingSettlements.js +0 -35
  171. package/dist/server/adapters/observeTestingSettlements.js.map +0 -1
  172. package/dist/server/internal/testingDeferrals.d.ts +0 -10
  173. package/dist/server/internal/testingDeferrals.d.ts.map +0 -1
  174. package/dist/server/internal/testingDeferrals.js +0 -15
  175. package/dist/server/internal/testingDeferrals.js.map +0 -1
  176. package/dist/server/internal/testingReadout.d.ts +0 -10
  177. package/dist/server/internal/testingReadout.d.ts.map +0 -1
  178. package/dist/server/internal/testingReadout.js +0 -13
  179. package/dist/server/internal/testingReadout.js.map +0 -1
  180. package/dist/server/internal/testingRegistrations.d.ts +0 -4
  181. package/dist/server/internal/testingRegistrations.d.ts.map +0 -1
  182. package/dist/server/internal/testingRegistrations.js +0 -8
  183. package/dist/server/internal/testingRegistrations.js.map +0 -1
  184. package/dist/server/internal/testingSignal.d.ts.map +0 -1
  185. package/dist/server/internal/testingSignal.js.map +0 -1
  186. package/dist/server/internal/testingSnapshot.d.ts +0 -6
  187. package/dist/server/internal/testingSnapshot.d.ts.map +0 -1
  188. package/dist/server/internal/testingSnapshot.js.map +0 -1
  189. package/src/server/adapters/observeTestingSettlements.ts +0 -36
  190. package/src/server/internal/testingReadout.ts +0 -25
  191. package/src/server/internal/testingRegistrations.ts +0 -10
@@ -1,23 +1,35 @@
1
+ import { Effect, Redacted } from "effect";
2
+ import type { PgBossClient } from "#server/client.ts";
1
3
  import type { ScheduleDefinition } from "#server/definition.ts";
2
- import type { EngineClient } from "#server/engineClient.ts";
3
- import { testingOperation } from "#server/internal/testingReadout.ts";
4
+ import { PgBossTestingError } from "#server/error.ts";
5
+ import type { PgBossInspectionService } from "#server/inspection.ts";
6
+ import { testingInspection, testingOperation } from "#server/internal/testingOperation.ts";
4
7
 
5
- export function testingSchedules(client: () => EngineClient, changed: () => void) {
8
+ export function testingSchedules(client: () => PgBossClient, inspection: () => PgBossInspectionService) {
6
9
  return {
7
10
  schedules: () =>
8
- testingOperation("schedules", async () => (await client().getSchedules()).map(({ name, cron, timezone }) => ({ cron, name, timezone }))),
9
- trigger: (schedule: Pick<ScheduleDefinition, "name" | "scheduleOptions">) =>
10
- testingOperation(
11
- "trigger",
12
- async () => {
13
- const [registered] = await client().getSchedules(schedule.name, schedule.scheduleOptions.key ?? "");
14
- if (registered === undefined) {
15
- throw new Error("Schedule is not registered");
16
- }
17
- await client().send(registered.name, registered.data, { ...registered.options, startAfter: 0 });
18
- changed();
19
- },
20
- schedule.name,
11
+ Effect.suspend(() => testingInspection("schedules", inspection().schedules())).pipe(
12
+ Effect.map((schedules) => schedules.map(({ name, cron, timezone }) => ({ cron, name, timezone }))),
21
13
  ),
14
+ trigger: (schedule: Pick<ScheduleDefinition, "name" | "scheduleOptions">) =>
15
+ Effect.gen(function* () {
16
+ const [registered] = yield* testingInspection(
17
+ "trigger",
18
+ inspection().schedules(schedule.name, schedule.scheduleOptions.key ?? ""),
19
+ schedule.name,
20
+ );
21
+ if (registered === undefined) {
22
+ return yield* new PgBossTestingError({
23
+ operation: "trigger",
24
+ original: Redacted.make(new Error("Schedule is not registered")),
25
+ queue: schedule.name,
26
+ });
27
+ }
28
+ return yield* testingOperation(
29
+ "trigger",
30
+ () => client().send(registered.name, registered.data, { ...registered.options, startAfter: 0 }),
31
+ schedule.name,
32
+ );
33
+ }),
22
34
  };
23
35
  }
@@ -1,10 +1,9 @@
1
- import { Clock, Duration, Effect, Option, Redacted } from "effect";
1
+ import { Clock, Duration, Effect, Option, Redacted, type Schema } from "effect";
2
2
  import type { JobPayloadSchema, QueueDefinition } from "#server/definition.ts";
3
- import type { EngineClient } from "#server/engineClient.ts";
4
3
  import { type PgBossPayloadError, PgBossTestingError, PgBossWaitError } from "#server/error.ts";
4
+ import type { PgBossInspectionService } from "#server/inspection.ts";
5
5
  import type { TestingFetches } from "#server/internal/adapters/testingFetches.ts";
6
- import { decodeStoredData } from "#server/internal/storedRows.ts";
7
- import { testingOperation } from "#server/internal/testingReadout.ts";
6
+ import { testingInspection } from "#server/internal/testingOperation.ts";
8
7
  import type { Job, JobState } from "#server/job.ts";
9
8
  import type { PgBossTestingWaitOptions } from "#server/testing.ts";
10
9
 
@@ -50,7 +49,7 @@ function fetchesRefused(queue: Pick<QueueDefinition, "name">, original: Error) {
50
49
  return new PgBossTestingError({ operation: "fetchesPass", original: Redacted.make(original), queue: queue.name });
51
50
  }
52
51
 
53
- export function testingWaits(client: () => EngineClient, fetches: () => TestingFetches | undefined, signal: Signal) {
52
+ export function testingWaits(inspection: () => PgBossInspectionService, fetches: () => TestingFetches | undefined, signal: Signal) {
54
53
  return {
55
54
  fetchesPass: (queue: Pick<QueueDefinition, "name">, count: number, options?: PgBossTestingWaitOptions) =>
56
55
  Effect.gen(function* () {
@@ -73,8 +72,8 @@ export function testingWaits(client: () => EngineClient, fetches: () => TestingF
73
72
  options,
74
73
  );
75
74
  }),
76
- untilJob: <TName extends string, TPayload extends JobPayloadSchema>(
77
- queue: Pick<QueueDefinition<TName, TPayload>, "name" | "schema">,
75
+ untilJob: <TName extends string, TPayload extends JobPayloadSchema | typeof Schema.Null>(
76
+ queue: { readonly name: TName; readonly schema: TPayload },
78
77
  id: string,
79
78
  state: JobState,
80
79
  options?: PgBossTestingWaitOptions,
@@ -82,15 +81,15 @@ export function testingWaits(client: () => EngineClient, fetches: () => TestingF
82
81
  waitUntil(
83
82
  signal,
84
83
  `job ${id} in ${queue.name} is ${state}`,
85
- testingOperation("untilJob", () => client().getJobById<unknown>(queue.name, id), queue.name).pipe(
86
- Effect.flatMap((job): Effect.Effect<Reading<Job<TPayload["Type"]>>, PgBossPayloadError, TPayload["DecodingServices"]> => {
87
- if (job === null) {
84
+ Effect.suspend(() => testingInspection("untilJob", inspection().jobs(queue, { id }), queue.name)).pipe(
85
+ Effect.flatMap(([job]): Effect.Effect<Reading<Job<TPayload["Type"]>>, PgBossPayloadError, TPayload["DecodingServices"]> => {
86
+ if (job === undefined) {
88
87
  return Effect.succeed({ arrived: Option.none(), seen: "no such job" });
89
88
  }
90
89
  if (job.state !== state) {
91
90
  return Effect.succeed({ arrived: Option.none(), seen: job.state });
92
91
  }
93
- return Effect.map(decodeStoredData(queue, job.data), (data) => ({ arrived: Option.some({ ...job, data }), seen: job.state }));
92
+ return Effect.succeed({ arrived: Option.some(job), seen: job.state });
94
93
  }),
95
94
  ),
96
95
  options,
@@ -43,10 +43,15 @@ export function pgBossSchema(options: PgBossSchemaOptions = {}): SchemaComponent
43
43
  const deferrals = sql`${sql(schema)}.${sql("effect_job_deferral")}`;
44
44
  const cleanup = sql`${sql(schema)}.${sql("effect_job_deferral_keep_until")}`;
45
45
  const stately = sql`${sql(schema)}.${sql("effect_stately_deferral")}()`;
46
+ const changed = sql`${sql(schema)}.${sql("effect_job_changed")}()`;
46
47
  const missing = yield* sql`SELECT name FROM (VALUES
47
48
  ('dead-letter resolution trigger', EXISTS (
48
49
  SELECT 1 FROM pg_trigger WHERE tgrelid = to_regclass(${job.compile()[0]}) AND tgname = 'effect_dead_letter_resolution'
49
50
  )),
51
+ ('effect_job_changed()', to_regprocedure(${changed.compile()[0]}) IS NOT NULL),
52
+ ('effect_job_changed trigger', EXISTS (
53
+ SELECT 1 FROM pg_trigger WHERE tgrelid = to_regclass(${job.compile()[0]}) AND tgname = 'effect_job_changed'
54
+ )),
50
55
  ('effect_job_deferral', to_regclass(${deferrals.compile()[0]}) IS NOT NULL),
51
56
  ('effect_job_deferral_keep_until', to_regclass(${cleanup.compile()[0]}) IS NOT NULL),
52
57
  ('effect_stately_deferral()', to_regprocedure(${stately.compile()[0]}) IS NOT NULL),
@@ -7,7 +7,7 @@ import { clientEngine } from "#server/adapters/lifecycle.ts";
7
7
  import type { PgBossClientFactory } from "#server/client.ts";
8
8
  import type { ClientOptions, StopOptions } from "#server/clientOptions.ts";
9
9
  import type { JobPayloadSchema, JobRegistration, QueueDefinition, RegistrationRequirements, ScheduleDefinition } from "#server/definition.ts";
10
- import type { EnqueueOptions } from "#server/enqueueOptions.ts";
10
+ import type { QueueEnqueueOptions } from "#server/enqueueOptions.ts";
11
11
  import type {
12
12
  PgBossClientOptionsError,
13
13
  PgBossError,
@@ -17,6 +17,7 @@ import type {
17
17
  PgBossQueueOptionsError,
18
18
  } from "#server/error.ts";
19
19
  import type { DeadLetteredJob, JobPage, JobPageOptions, JobsHealth, ListedJob, QueueCounts } from "#server/health.ts";
20
+ import type { PgBossInspectionService } from "#server/inspection.ts";
20
21
  import { acquireClient } from "#server/internal/acquireClient.ts";
21
22
  import { logClientError, subscribeClientErrors } from "#server/internal/clientErrors.ts";
22
23
  import { JobEngine } from "#server/internal/engine.ts";
@@ -38,7 +39,7 @@ export interface PgBossService {
38
39
  readonly enqueue: <const TName extends string, const TPayload extends JobPayloadSchema, const TQueue extends QueueDefinition<TName, TPayload>>(
39
40
  queue: QueueDefinition<TName, TPayload> & TQueue,
40
41
  payload: NoInfer<Schema.Schema.Type<TPayload>>,
41
- options?: NoInfer<TQueue["key"] extends undefined ? EnqueueOptions : Omit<EnqueueOptions, "singletonKey"> & { readonly singletonKey?: never }>,
42
+ options?: NoInfer<QueueEnqueueOptions<TQueue>>,
42
43
  ) => Effect.Effect<Option.Option<string>, PgBossError | PgBossPayloadError, TPayload["EncodingServices"]>;
43
44
  readonly failedJobs: <const TName extends string, const TPayload extends JobPayloadSchema | typeof Schema.Null>(
44
45
  queue: { readonly name: TName; readonly schema: TPayload },
@@ -49,6 +50,7 @@ export interface PgBossService {
49
50
  id: string,
50
51
  ) => Effect.Effect<Option.Option<Job<unknown>>, PgBossError | PgBossPayloadError, TPayload["DecodingServices"]>;
51
52
  readonly health: (queues?: readonly Pick<QueueDefinition, "name">[]) => Effect.Effect<JobsHealth, PgBossError>;
53
+ readonly inspection: () => Effect.Effect<PgBossInspectionService>;
52
54
  readonly refreshQueueStats: (queue?: Pick<QueueDefinition, "name">) => Effect.Effect<void, PgBossError>;
53
55
  readonly retry: (queue: Pick<QueueDefinition, "name">, id: string) => Effect.Effect<void, PgBossError>;
54
56
  readonly unschedule: (schedule: Pick<ScheduleDefinition, "name" | "scheduleOptions">) => Effect.Effect<void, PgBossError | PgBossNotFoundError>;
@@ -117,6 +119,7 @@ export function makePgBoss<const TIdentifier extends string>(identifier: TIdenti
117
119
  failedJobs: genericMethod(service.failedJobs),
118
120
  getJob: genericMethod(service.getJob),
119
121
  health: service.health,
122
+ inspection: service.inspection,
120
123
  refreshQueueStats: service.refreshQueueStats,
121
124
  retry: service.retry,
122
125
  unschedule: service.unschedule,
@@ -1,21 +1,10 @@
1
- import { type DateTime, type Duration, Effect, type Tracer } from "effect";
1
+ import { type Duration, Effect, type Tracer } from "effect";
2
2
  import { testingController } from "#server/adapters/testingController.ts";
3
- import type { JobPayloadSchema, QueueDefinition } from "#server/definition.ts";
4
3
 
5
4
  export function makePgBossTesting(options: PgBossTestingOptions = {}) {
6
5
  return testingController(options);
7
6
  }
8
7
 
9
- export type SnapshotQueue = Pick<QueueDefinition<string, JobPayloadSchema>, "name" | "schema">;
10
-
11
- export interface UnfinishedJob<TQueue extends SnapshotQueue> {
12
- readonly data: TQueue["schema"]["Type"];
13
- readonly id: string;
14
- readonly queue: TQueue["name"];
15
- readonly startAfter: DateTime.Utc;
16
- readonly state: "active" | "created" | "deferred" | "failed" | "retry";
17
- }
18
-
19
8
  export interface PgBossTestingWaitOptions {
20
9
  readonly within?: Duration.Input;
21
10
  }
@@ -1,6 +0,0 @@
1
- import type { EngineClient } from "#server/engineClient.ts";
2
- export declare function observeTestingSettlements(client: EngineClient, settled: (name: string) => void): {
3
- close(): void;
4
- watch(name: string): void;
5
- };
6
- //# sourceMappingURL=observeTestingSettlements.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"observeTestingSettlements.d.ts","sourceRoot":"","sources":["../../../src/server/adapters/observeTestingSettlements.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAE5D,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI;IAG7F,KAAK;IAML,KAAK,OAAO,MAAM;EAwBnB"}
@@ -1,35 +0,0 @@
1
- export function observeTestingSettlements(client, settled) {
2
- const observers = new Map();
3
- return {
4
- close() {
5
- for (const close of observers.values()) {
6
- close();
7
- }
8
- observers.clear();
9
- },
10
- watch(name) {
11
- if (observers.has(name)) {
12
- return;
13
- }
14
- const spy = client.getSpy(name);
15
- let open = true;
16
- async function observe() {
17
- while (true) {
18
- await Promise.race([spy.waitForJob(() => true, "completed"), spy.waitForJob(() => true, "failed")]);
19
- if (!open) {
20
- return;
21
- }
22
- // This controller owns the spy; clear history and the losing wait before rearming both outcomes.
23
- spy.clear();
24
- settled(name);
25
- }
26
- }
27
- observers.set(name, () => {
28
- open = false;
29
- spy.clear();
30
- });
31
- void observe().catch((error) => client.emit("error", error instanceof Error ? error : new Error(String(error))));
32
- },
33
- };
34
- }
35
- //# sourceMappingURL=observeTestingSettlements.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"observeTestingSettlements.js","sourceRoot":"","sources":["../../../src/server/adapters/observeTestingSettlements.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,yBAAyB,CAAC,MAAoB,EAAE,OAA+B;IAC9F,MAAM,SAAS,GAAG,IAAI,GAAG,EAAsB,CAAC;IAChD,OAAO;QACN,KAAK;YACJ,KAAK,MAAM,KAAK,IAAI,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC;gBACxC,KAAK,EAAE,CAAC;YACT,CAAC;YACD,SAAS,CAAC,KAAK,EAAE,CAAC;QACnB,CAAC;QACD,KAAK,CAAC,IAAY;YACjB,IAAI,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBACzB,OAAO;YACR,CAAC;YACD,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAChC,IAAI,IAAI,GAAG,IAAI,CAAC;YAChB,KAAK,UAAU,OAAO;gBACrB,OAAO,IAAI,EAAE,CAAC;oBACb,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,WAAW,CAAC,EAAE,GAAG,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;oBACpG,IAAI,CAAC,IAAI,EAAE,CAAC;wBACX,OAAO;oBACR,CAAC;oBACD,iGAAiG;oBACjG,GAAG,CAAC,KAAK,EAAE,CAAC;oBACZ,OAAO,CAAC,IAAI,CAAC,CAAC;gBACf,CAAC;YACF,CAAC;YACD,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,EAAE;gBACxB,IAAI,GAAG,KAAK,CAAC;gBACb,GAAG,CAAC,KAAK,EAAE,CAAC;YACb,CAAC,CAAC,CAAC;YACH,KAAK,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3H,CAAC;KACD,CAAC;AACH,CAAC"}
@@ -1,10 +0,0 @@
1
- import { DateTime } from "effect";
2
- import type { QueueDefinition } from "#server/definition.ts";
3
- import type { EngineClient } from "#server/engineClient.ts";
4
- export declare function testingDeferrals(client: () => EngineClient): {
5
- deferred: (queue: Pick<QueueDefinition, "name">) => import("effect/Effect").Effect<{
6
- at: DateTime.Utc;
7
- reason: string;
8
- }[], import("../error.ts").PgBossTestingError, never>;
9
- };
10
- //# sourceMappingURL=testingDeferrals.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"testingDeferrals.d.ts","sourceRoot":"","sources":["../../../src/server/internal/testingDeferrals.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAClC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAI5D,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,YAAY;IAEzD,QAAQ,UAAU,IAAI,CAAC,eAAe,EAAE,MAAM,CAAC;;;;EAahD"}
@@ -1,15 +0,0 @@
1
- import { DateTime } from "effect";
2
- import { deferralOf } from "#server/internal/deferral.ts";
3
- import { testingOperation } from "#server/internal/testingReadout.ts";
4
- export function testingDeferrals(client) {
5
- return {
6
- deferred: (queue) => testingOperation("deferred", async () => {
7
- const jobs = await client().findJobs(queue.name);
8
- return jobs.flatMap((job) => {
9
- const deferral = job.state === "retry" && job.startedOn === null ? deferralOf(job) : undefined;
10
- return deferral === undefined ? [] : [{ at: DateTime.makeUnsafe(job.startAfter), reason: deferral.reason }];
11
- });
12
- }, queue.name),
13
- };
14
- }
15
- //# sourceMappingURL=testingDeferrals.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"testingDeferrals.js","sourceRoot":"","sources":["../../../src/server/internal/testingDeferrals.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAGlC,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AAEtE,MAAM,UAAU,gBAAgB,CAAC,MAA0B;IAC1D,OAAO;QACN,QAAQ,EAAE,CAAC,KAAoC,EAAE,EAAE,CAClD,gBAAgB,CACf,UAAU,EACV,KAAK,IAAI,EAAE;YACV,MAAM,IAAI,GAAG,MAAM,MAAM,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACjD,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;gBAC3B,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,KAAK,OAAO,IAAI,GAAG,CAAC,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;gBAC/F,OAAO,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;YAC7G,CAAC,CAAC,CAAC;QACJ,CAAC,EACD,KAAK,CAAC,IAAI,CACV;KACF,CAAC;AACH,CAAC"}
@@ -1,10 +0,0 @@
1
- import { Effect } from "effect";
2
- import type { JobReadOptions } from "#server/client.ts";
3
- import type { JobPayloadSchema, QueueDefinition } from "#server/definition.ts";
4
- import type { EngineClient } from "#server/engineClient.ts";
5
- import type { PgBossPayloadError } from "#server/error.ts";
6
- import { PgBossTestingError } from "#server/error.ts";
7
- import type { Job } from "#server/job.ts";
8
- export declare function testingOperation<A>(operation: string, run: () => Promise<A>, queue?: string): Effect.Effect<A, PgBossTestingError, never>;
9
- export declare function testingReadout(client: () => EngineClient): <TName extends string, TPayload extends JobPayloadSchema>(queue: QueueDefinition<TName, TPayload>, options?: JobReadOptions) => Effect.Effect<Job<TPayload["Type"]>[], PgBossTestingError | PgBossPayloadError, TPayload["DecodingServices"]>;
10
- //# sourceMappingURL=testingReadout.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"testingReadout.d.ts","sourceRoot":"","sources":["../../../src/server/internal/testingReadout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAY,MAAM,QAAQ,CAAC;AAC1C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC/E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAEtD,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AAE1C,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,MAAM,+CAK3F;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,YAAY,IAChD,KAAK,SAAS,MAAM,EAAE,QAAQ,SAAS,gBAAgB,SACvD,eAAe,CAAC,KAAK,EAAE,QAAQ,CAAC,YAC7B,cAAc,KACtB,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,kBAAkB,GAAG,kBAAkB,EAAE,QAAQ,CAAC,kBAAkB,CAAC,CAAC,CAIhH"}
@@ -1,13 +0,0 @@
1
- import { Effect, Redacted } from "effect";
2
- import { PgBossTestingError } from "#server/error.ts";
3
- import { decodeStoredData } from "#server/internal/storedRows.ts";
4
- export function testingOperation(operation, run, queue) {
5
- return Effect.tryPromise({
6
- catch: (original) => new PgBossTestingError({ operation, original: Redacted.make(original), queue }),
7
- try: run,
8
- });
9
- }
10
- export function testingReadout(client) {
11
- return (queue, options) => testingOperation("jobs", () => client().findJobs(queue.name, options), queue.name).pipe(Effect.flatMap((jobs) => Effect.forEach(jobs, (job) => decodeStoredData(queue, job.data).pipe(Effect.map((data) => ({ ...job, data }))))));
12
- }
13
- //# sourceMappingURL=testingReadout.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"testingReadout.js","sourceRoot":"","sources":["../../../src/server/internal/testingReadout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAK1C,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAGlE,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,cAAc,CAAC,MAA0B;IACxD,OAAO,CACN,KAAuC,EACvC,OAAwB,EACwF,EAAE,CAClH,gBAAgB,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAU,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAC/F,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,gBAAgB,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CACzI,CAAC;AACJ,CAAC"}
@@ -1,4 +0,0 @@
1
- import type { PgBossClient } from "#server/client.ts";
2
- export declare const testingRegistration: unique symbol;
3
- export declare function registerTestingQueue(client: PgBossClient, name: string): void;
4
- //# sourceMappingURL=testingRegistrations.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"testingRegistrations.d.ts","sourceRoot":"","sources":["../../../src/server/internal/testingRegistrations.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD,eAAO,MAAM,mBAAmB,eAAsC,CAAC;AAEvE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,QAKtE"}
@@ -1,8 +0,0 @@
1
- export const testingRegistration = Symbol("jobs testing registration");
2
- export function registerTestingQueue(client, name) {
3
- const observe = Reflect.get(client, testingRegistration);
4
- if (typeof observe === "function") {
5
- observe(name);
6
- }
7
- }
8
- //# sourceMappingURL=testingRegistrations.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"testingRegistrations.js","sourceRoot":"","sources":["../../../src/server/internal/testingRegistrations.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,mBAAmB,GAAG,MAAM,CAAC,2BAA2B,CAAC,CAAC;AAEvE,MAAM,UAAU,oBAAoB,CAAC,MAAoB,EAAE,IAAY;IACtE,MAAM,OAAO,GAAY,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;IAClE,IAAI,OAAO,OAAO,KAAK,UAAU,EAAE,CAAC;QACnC,OAAO,CAAC,IAAI,CAAC,CAAC;IACf,CAAC;AACF,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"testingSignal.d.ts","sourceRoot":"","sources":["../../../src/server/internal/testingSignal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,wBAAgB,aAAa;IAI3B,OAAO;IASP,QAAQ;IACR,aAAa,UAAU,MAAM,KAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;EAatD"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"testingSignal.js","sourceRoot":"","sources":["../../../src/server/internal/testingSignal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,MAAM,UAAU,aAAa;IAC5B,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,MAAM,SAAS,GAAG,IAAI,GAAG,EAA8B,CAAC;IACxD,OAAO;QACN,OAAO;YACN,QAAQ,IAAI,CAAC,CAAC;YACd,iGAAiG;YACjG,MAAM,OAAO,GAAG,CAAC,GAAG,SAAS,CAAC,CAAC;YAC/B,SAAS,CAAC,KAAK,EAAE,CAAC;YAClB,KAAK,MAAM,QAAQ,IAAI,OAAO,EAAE,CAAC;gBAChC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YACpB,CAAC;QACF,CAAC;QACD,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC;QACrC,aAAa,EAAE,CAAC,KAAa,EAAyB,EAAE,CACvD,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,EAAE;YAC1B,IAAI,QAAQ,KAAK,KAAK,EAAE,CAAC;gBACxB,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;gBACjC,OAAO;YACR,CAAC;YACD,SAAS,QAAQ,CAAC,OAAe;gBAChC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;YACjC,CAAC;YACD,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACxB,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;QACtD,CAAC,CAAC;KACH,CAAC;AACH,CAAC"}
@@ -1,6 +0,0 @@
1
- import { Effect } from "effect";
2
- import type { EngineClient } from "#server/engineClient.ts";
3
- import type { PgBossPayloadError, PgBossTestingError } from "#server/error.ts";
4
- import type { SnapshotQueue, UnfinishedJob } from "#server/testing.ts";
5
- export declare function testingSnapshot(client: () => EngineClient, schema: () => string): <const TQueues extends readonly SnapshotQueue[]>(queues: TQueues) => Effect.Effect<readonly UnfinishedJob<TQueues[number]>[], PgBossPayloadError | PgBossTestingError, TQueues[number]["schema"]["DecodingServices"]>;
6
- //# sourceMappingURL=testingSnapshot.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"testingSnapshot.d.ts","sourceRoot":"","sources":["../../../src/server/internal/testingSnapshot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAU,MAAM,QAAQ,CAAC;AACxC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,KAAK,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAG/E,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAYvE,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,YAAY,EAAE,MAAM,EAAE,MAAM,MAAM,IACvE,KAAK,CAAC,OAAO,SAAS,SAAS,aAAa,EAAE,UAC7C,OAAO,KACb,MAAM,CAAC,MAAM,CACf,SAAS,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,EACzC,kBAAkB,GAAG,kBAAkB,EACvC,OAAO,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC,kBAAkB,CAAC,CAC7C,CA+BD"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"testingSnapshot.js","sourceRoot":"","sources":["../../../src/server/internal/testingSnapshot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAGxC,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAChF,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AAGtE,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CACxB,MAAM,CAAC,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC,OAAO;IACpB,EAAE,EAAE,MAAM,CAAC,MAAM;IACjB,KAAK,EAAE,MAAM,CAAC,MAAM;IACpB,UAAU,EAAE,MAAM,CAAC,mBAAmB;IACtC,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;CAC5E,CAAC,CACF,CAAC;AAEF,MAAM,UAAU,eAAe,CAAC,MAA0B,EAAE,MAAoB;IAC/E,OAAO,CACN,MAAe,EAKd,EAAE;QACH,MAAM,MAAM,GAAG,IAAI,GAAG,CAA0B,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;QAC5F,OAAO,gBAAgB,CAAC,UAAU,EAAE,KAAK,IAAI,EAAE;YAC9C,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC;YACtC,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,EAAE;iBAC7B,KAAK,EAAE;iBACP,UAAU,CACV;0EACqE,MAAM;;;YAGpE,MAAM;;6BAEW,EACxB,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CACpB,CAAC;YACH,OAAO,MAAM,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;QAChD,CAAC,CAAC,CAAC,IAAI,CACN,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CACvB,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE;YACtD,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC/B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACzB,OAAO,MAAM,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,uDAAuD,IAAI,EAAE,CAAC,CAAC,CAAC;YAC7F,CAAC;YACD,OAAO,gBAAgB,CAAqD,KAAK,EAAE,IAAI,CAAC,CAAC,IAAI,CAC5F,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,EAAkC,EAAE,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CACvG,CAAC;QACH,CAAC,CAAC,CACF,CACD,CAAC;IACH,CAAC,CAAC;AACH,CAAC"}
@@ -1,36 +0,0 @@
1
- import type { EngineClient } from "#server/engineClient.ts";
2
-
3
- export function observeTestingSettlements(client: EngineClient, settled: (name: string) => void) {
4
- const observers = new Map<string, () => void>();
5
- return {
6
- close() {
7
- for (const close of observers.values()) {
8
- close();
9
- }
10
- observers.clear();
11
- },
12
- watch(name: string) {
13
- if (observers.has(name)) {
14
- return;
15
- }
16
- const spy = client.getSpy(name);
17
- let open = true;
18
- async function observe() {
19
- while (true) {
20
- await Promise.race([spy.waitForJob(() => true, "completed"), spy.waitForJob(() => true, "failed")]);
21
- if (!open) {
22
- return;
23
- }
24
- // This controller owns the spy; clear history and the losing wait before rearming both outcomes.
25
- spy.clear();
26
- settled(name);
27
- }
28
- }
29
- observers.set(name, () => {
30
- open = false;
31
- spy.clear();
32
- });
33
- void observe().catch((error: unknown) => client.emit("error", error instanceof Error ? error : new Error(String(error))));
34
- },
35
- };
36
- }
@@ -1,25 +0,0 @@
1
- import { Effect, Redacted } from "effect";
2
- import type { JobReadOptions } from "#server/client.ts";
3
- import type { JobPayloadSchema, QueueDefinition } from "#server/definition.ts";
4
- import type { EngineClient } from "#server/engineClient.ts";
5
- import type { PgBossPayloadError } from "#server/error.ts";
6
- import { PgBossTestingError } from "#server/error.ts";
7
- import { decodeStoredData } from "#server/internal/storedRows.ts";
8
- import type { Job } from "#server/job.ts";
9
-
10
- export function testingOperation<A>(operation: string, run: () => Promise<A>, queue?: string) {
11
- return Effect.tryPromise({
12
- catch: (original) => new PgBossTestingError({ operation, original: Redacted.make(original), queue }),
13
- try: run,
14
- });
15
- }
16
-
17
- export function testingReadout(client: () => EngineClient) {
18
- return <TName extends string, TPayload extends JobPayloadSchema>(
19
- queue: QueueDefinition<TName, TPayload>,
20
- options?: JobReadOptions,
21
- ): Effect.Effect<Job<TPayload["Type"]>[], PgBossTestingError | PgBossPayloadError, TPayload["DecodingServices"]> =>
22
- testingOperation("jobs", () => client().findJobs<unknown>(queue.name, options), queue.name).pipe(
23
- Effect.flatMap((jobs) => Effect.forEach(jobs, (job) => decodeStoredData(queue, job.data).pipe(Effect.map((data) => ({ ...job, data }))))),
24
- );
25
- }
@@ -1,10 +0,0 @@
1
- import type { PgBossClient } from "#server/client.ts";
2
-
3
- export const testingRegistration = Symbol("jobs testing registration");
4
-
5
- export function registerTestingQueue(client: PgBossClient, name: string) {
6
- const observe: unknown = Reflect.get(client, testingRegistration);
7
- if (typeof observe === "function") {
8
- observe(name);
9
- }
10
- }