@shivaedev/effect-pg-boss 0.6.0 → 0.6.1
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.
- package/CHANGELOG.md +7 -0
- package/README.md +8 -0
- package/dist/server/internal/jobControl.d.ts.map +1 -1
- package/dist/server/internal/jobControl.js +2 -1
- package/dist/server/internal/jobControl.js.map +1 -1
- package/dist/server/internal/register.d.ts.map +1 -1
- package/dist/server/internal/register.js +4 -3
- package/dist/server/internal/register.js.map +1 -1
- package/dist/server/internal/service.d.ts.map +1 -1
- package/dist/server/internal/service.js +4 -3
- package/dist/server/internal/service.js.map +1 -1
- package/dist/server/internal/tracing.d.ts +6 -0
- package/dist/server/internal/tracing.d.ts.map +1 -0
- package/dist/server/internal/tracing.js +37 -0
- package/dist/server/internal/tracing.js.map +1 -0
- package/package.json +1 -1
- package/src/server/internal/jobControl.ts +2 -1
- package/src/server/internal/register.ts +4 -2
- package/src/server/internal/service.ts +10 -4
- package/src/server/internal/tracing.ts +44 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.6.1 - 2026-10-17
|
|
4
|
+
|
|
5
|
+
### Fixed
|
|
6
|
+
|
|
7
|
+
- Run each queue and scheduled job attempt inside a root consumer span named for its queue, with job identity, attempt and retry-count attributes and handler failures. Handler steps share that job trace.
|
|
8
|
+
- Persist the enqueueing Effect span context in pg-boss job data and link the job span to it. Handlers and `getJob` still decode the original payload Schema; direct pg-boss data readers see an envelope for traced sends.
|
|
9
|
+
|
|
3
10
|
## 0.6.0 - 2026-10-17
|
|
4
11
|
|
|
5
12
|
### Added
|
package/README.md
CHANGED
|
@@ -154,6 +154,14 @@ Provide `Jobs` through the application's existing runtime. `enqueue` takes the d
|
|
|
154
154
|
|
|
155
155
|
`PgBossPayloadError` names a payload boundary failure; malformed durable input is rejected before the worker's domain code runs. The PostgreSQL test also checks that invalid data sent directly to pg-boss reaches the dead-letter queue without reaching the handler.
|
|
156
156
|
|
|
157
|
+
### Trace jobs
|
|
158
|
+
|
|
159
|
+
Each queue or scheduled job attempt runs in one root consumer span named for its queue. The span encloses payload decoding and the whole handler, so top-level `Effect.fn` steps are children of the job span. Its attributes include `job.id`, `job.queue`, `job.name`, the one-based `job.attempt` and pg-boss's zero-based `job.retry_count`. A failed handler ends the span with its failure.
|
|
160
|
+
|
|
161
|
+
`enqueue` captures the current Effect span, including an external parent span, when present. It stores that context in a typed envelope in pg-boss's existing job `data`; the adapter unwraps the envelope before Schema decoding in the handler and `getJob`, so the application's payload Schema stays unchanged. Jobs sent without a span keep their ordinary encoded payload, and workers also accept those unwrapped jobs. Direct pg-boss data readers see the envelope for traced sends.
|
|
162
|
+
|
|
163
|
+
The consumer span links to the sender rather than sharing its parent trace, following OpenTelemetry messaging conventions for asynchronous processing. Each retry gets its own job trace. Provide the application's Effect tracer when building the worker Layer; the worker uses that captured tracer. The PostgreSQL tracing tests use Effect's in-memory tracer and a producer that shuts down before its worker starts; the scheduled-worker test checks the same span boundary with a fake client.
|
|
164
|
+
|
|
157
165
|
### Read health
|
|
158
166
|
|
|
159
167
|
```ts
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jobControl.d.ts","sourceRoot":"","sources":["../../../src/server/internal/jobControl.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"jobControl.d.ts","sourceRoot":"","sources":["../../../src/server/internal/jobControl.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG/C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,wBAAgB,SAAS,CAAC,MAAM,EAAE,YAAY,GAAG,aAAa,CAAC,QAAQ,CAAC,CAoBvE;AAED,wBAAgB,QAAQ,CAAC,MAAM,EAAE,YAAY,GAAG,aAAa,CAAC,OAAO,CAAC,CAkBrE"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Effect, Option, Redacted, Schema } from "effect";
|
|
2
2
|
import { PgBossPayloadError, toPgBossError } from "#error.ts";
|
|
3
|
+
import { payloadOf } from "#internal/tracing.ts";
|
|
3
4
|
export function getJobFor(client) {
|
|
4
5
|
return (queue, id) => Effect.tryPromise({
|
|
5
6
|
catch: (error) => toPgBossError("getJob", error, queue.name),
|
|
@@ -11,7 +12,7 @@ export function getJobFor(client) {
|
|
|
11
12
|
},
|
|
12
13
|
}).pipe(Effect.flatMap((job) => job === undefined
|
|
13
14
|
? Effect.succeed(Option.none())
|
|
14
|
-
: Schema.decodeUnknownEffect(queue.schema)(job.data).pipe(Effect.mapError((error) => new PgBossPayloadError({ direction: "decode", original: Redacted.make(error), queue: queue.name })), Effect.map((data) => Option.some({ ...job, data })))));
|
|
15
|
+
: Schema.decodeUnknownEffect(queue.schema)(payloadOf(job.data)).pipe(Effect.mapError((error) => new PgBossPayloadError({ direction: "decode", original: Redacted.make(error), queue: queue.name })), Effect.map((data) => Option.some({ ...job, data })))));
|
|
15
16
|
}
|
|
16
17
|
export function retryFor(client) {
|
|
17
18
|
return (queue, id) => Effect.tryPromise({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jobControl.js","sourceRoot":"","sources":["../../../src/server/internal/jobControl.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAE1D,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"jobControl.js","sourceRoot":"","sources":["../../../src/server/internal/jobControl.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../../src/server/internal/register.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,EAAoB,MAAM,QAAQ,CAAC;AAEhE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,KAAK,eAAe,EAA4E,MAAM,gBAAgB,CAAC;AAChI,OAAO,EAAsB,uBAAuB,EAAiB,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../../src/server/internal/register.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,EAAoB,MAAM,QAAQ,CAAC;AAEhE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,KAAK,eAAe,EAA4E,MAAM,gBAAgB,CAAC;AAChI,OAAO,EAAsB,uBAAuB,EAAiB,MAAM,WAAW,CAAC;AAgBvF,eAAO,MAAM,gBAAgB,iBAAkB,eAAe,KAAG,MAWhE,CAAC;AAsEF,eAAO,MAAM,iBAAiB,kBAAmB,SAAS,eAAe,EAAE,KAAG,SAAS,MAAM,EAM5F,CAAC;AAEF,eAAO,MAAM,YAAY,GAAI,CAAC,UACrB,YAAY,iBACL,SAAS,eAAe,EAAE,WAChC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,kBACX,OAAO,KACrB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,WAAW,EAAE,WAAW,GAAG,uBAAuB,CAc7E,CAAC"}
|
|
@@ -2,6 +2,7 @@ import { Effect, Redacted, Schema } from "effect";
|
|
|
2
2
|
import { jobContext } from "#definition.ts";
|
|
3
3
|
import { PgBossPayloadError, PgBossQueueOptionsError, toPgBossError } from "#error.ts";
|
|
4
4
|
import { ensureQueue } from "#internal/ensureQueue.ts";
|
|
5
|
+
import { payloadOf, traceJob } from "#internal/tracing.ts";
|
|
5
6
|
function isQueueWorker(registration) {
|
|
6
7
|
return registration._tag === "QueueWorker";
|
|
7
8
|
}
|
|
@@ -27,11 +28,11 @@ function workerContext(context) {
|
|
|
27
28
|
return context;
|
|
28
29
|
}
|
|
29
30
|
function runQueueWorker(worker, job, context) {
|
|
30
|
-
return Effect.runPromise(Schema.decodeUnknownEffect(worker.queue.schema)(job.data).pipe(Effect.mapError((error) => new PgBossPayloadError({
|
|
31
|
+
return Effect.runPromise(Schema.decodeUnknownEffect(worker.queue.schema)(payloadOf(job.data)).pipe(Effect.mapError((error) => new PgBossPayloadError({
|
|
31
32
|
direction: "decode",
|
|
32
33
|
original: Redacted.make(error),
|
|
33
34
|
queue: worker.queue.name,
|
|
34
|
-
})), Effect.flatMap((payload) => worker.handler(payload, jobContext(job))), Effect.provide(context)), { signal: job.signal });
|
|
35
|
+
})), Effect.flatMap((payload) => worker.handler(payload, jobContext(job))), (effect) => traceJob(effect, job, worker.queue.name), Effect.provide(context)), { signal: job.signal });
|
|
35
36
|
}
|
|
36
37
|
async function registerQueue(client, registration, context, replaceWorker) {
|
|
37
38
|
const queue = registration._tag === "QueueWorker" ? registration.queue : registration;
|
|
@@ -57,7 +58,7 @@ async function registerSchedule(client, worker, context, replaceWorker) {
|
|
|
57
58
|
await ensureQueue(client, schedule.name, schedule.queueOptions);
|
|
58
59
|
await client.work(schedule.name, schedule.workerOptions, async (jobs) => {
|
|
59
60
|
for (const job of jobs) {
|
|
60
|
-
await Effect.runPromise(Effect.provide(worker.effect, context), {
|
|
61
|
+
await Effect.runPromise(Effect.provide(traceJob(worker.effect, job, schedule.name), context), {
|
|
61
62
|
signal: job.signal,
|
|
62
63
|
});
|
|
63
64
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"register.js","sourceRoot":"","sources":["../../../src/server/internal/register.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAGhE,OAAO,EAAwB,UAAU,EAAgE,MAAM,gBAAgB,CAAC;AAChI,OAAO,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AACvF,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"register.js","sourceRoot":"","sources":["../../../src/server/internal/register.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../src/server/internal/service.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../src/server/internal/service.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAM/C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,eAAO,MAAM,WAAW,WAAY,YAAY,SAAS,SAAS,MAAM,EAAE,sBAAsB,aAoC9F,CAAC"}
|
|
@@ -3,6 +3,7 @@ import { PgBossPayloadError, toPgBossError } from "#error.ts";
|
|
|
3
3
|
import { countsFor } from "#internal/countsFor.ts";
|
|
4
4
|
import { healthFor } from "#internal/health.ts";
|
|
5
5
|
import { getJobFor, retryFor } from "#internal/jobControl.ts";
|
|
6
|
+
import { capturePayload } from "#internal/tracing.ts";
|
|
6
7
|
export const makeService = (client, names, schema = "pgboss") => ({
|
|
7
8
|
counts: (queue) => countsFor(client, schema, queue.name),
|
|
8
9
|
enqueue: (queue, payload, options) => Schema.encodeUnknownEffect(queue.schema)(payload).pipe(Effect.mapError((error) => new PgBossPayloadError({
|
|
@@ -17,10 +18,10 @@ export const makeService = (client, names, schema = "pgboss") => ({
|
|
|
17
18
|
queue: queue.name,
|
|
18
19
|
}));
|
|
19
20
|
}
|
|
20
|
-
return Effect.tryPromise({
|
|
21
|
+
return capturePayload(encoded).pipe(Effect.flatMap((data) => Effect.tryPromise({
|
|
21
22
|
catch: (error) => toPgBossError("enqueue", error, queue.name),
|
|
22
|
-
try: () => client.send(queue.name,
|
|
23
|
-
})
|
|
23
|
+
try: () => client.send(queue.name, data, options),
|
|
24
|
+
})), Effect.map(Option.fromNullishOr));
|
|
24
25
|
})),
|
|
25
26
|
getJob: getJobFor(client),
|
|
26
27
|
health: healthFor(client, names),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../../src/server/internal/service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAE1D,OAAO,EAAoB,kBAAkB,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAChF,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../../src/server/internal/service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAE1D,OAAO,EAAoB,kBAAkB,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAChF,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAGtD,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,MAAoB,EAAE,KAAwB,EAAE,MAAM,GAAG,QAAQ,EAAiB,EAAE,CAAC,CAAC;IACjH,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC;IACxD,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,CACpC,MAAM,CAAC,mBAAmB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CACrD,MAAM,CAAC,QAAQ,CACd,CAAC,KAAK,EAAE,EAAE,CACT,IAAI,kBAAkB,CAAC;QACtB,SAAS,EAAE,QAAQ;QACnB,QAAQ,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;QAC9B,KAAK,EAAE,KAAK,CAAC,IAAI;KACjB,CAAC,CACH,EACD,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,EAA0E,EAAE;QAClG,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;YACrD,OAAO,MAAM,CAAC,IAAI,CACjB,IAAI,kBAAkB,CAAC;gBACtB,SAAS,EAAE,QAAQ;gBACnB,QAAQ,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC,yCAAyC,CAAC,CAAC;gBACjF,KAAK,EAAE,KAAK,CAAC,IAAI;aACjB,CAAC,CACF,CAAC;QACH,CAAC;QACD,OAAO,cAAc,CAAC,OAAO,CAAC,CAAC,IAAI,CAClC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CACvB,MAAM,CAAC,UAAU,CAAC;YACjB,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,aAAa,CAAC,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC;YAC7D,GAAG,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC;SACjD,CAAC,CACF,EACD,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC,CAChC,CAAC;IACH,CAAC,CAAC,CACF;IACF,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC;IACzB,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC;IAChC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC;CACvB,CAAC,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { Effect, Tracer } from "effect";
|
|
2
|
+
import type { Job } from "pg-boss";
|
|
3
|
+
export declare function capturePayload(payload: object): Effect.Effect<object>;
|
|
4
|
+
export declare function payloadOf(data: unknown): unknown;
|
|
5
|
+
export declare function traceJob<A, E, R>(effect: Effect.Effect<A, E, R>, job: Job<unknown>, queue: string): Effect.Effect<A, E, Exclude<R, Tracer.ParentSpan>>;
|
|
6
|
+
//# sourceMappingURL=tracing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tracing.d.ts","sourceRoot":"","sources":["../../../src/server/internal/tracing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAkB,MAAM,EAAE,MAAM,QAAQ,CAAC;AACxD,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,SAAS,CAAC;AAUnC,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAUrE;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAEhD;AAED,wBAAgB,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,MAAM,sDAgBjG"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { Effect, Option, Schema, Tracer } from "effect";
|
|
2
|
+
const TracedPayload = Schema.Struct({
|
|
3
|
+
_tag: Schema.Literal("@shivaedev/effect-pg-boss/TracedPayload"),
|
|
4
|
+
payload: Schema.Unknown,
|
|
5
|
+
span: Schema.Struct({ sampled: Schema.Boolean, spanId: Schema.String, traceId: Schema.String }),
|
|
6
|
+
});
|
|
7
|
+
const isTracedPayload = Schema.is(TracedPayload);
|
|
8
|
+
export function capturePayload(payload) {
|
|
9
|
+
return Effect.map(Effect.option(Effect.currentParentSpan), (span) => Option.isNone(span)
|
|
10
|
+
? payload
|
|
11
|
+
: {
|
|
12
|
+
_tag: "@shivaedev/effect-pg-boss/TracedPayload",
|
|
13
|
+
payload,
|
|
14
|
+
span: { sampled: span.value.sampled, spanId: span.value.spanId, traceId: span.value.traceId },
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
export function payloadOf(data) {
|
|
18
|
+
return isTracedPayload(data) ? data.payload : data;
|
|
19
|
+
}
|
|
20
|
+
export function traceJob(effect, job, queue) {
|
|
21
|
+
return Effect.withSpan(effect, queue, {
|
|
22
|
+
attributes: {
|
|
23
|
+
"job.attempt": job.retryCount + 1,
|
|
24
|
+
"job.id": job.id,
|
|
25
|
+
"job.name": job.name,
|
|
26
|
+
"job.queue": queue,
|
|
27
|
+
"job.retry_count": job.retryCount,
|
|
28
|
+
"messaging.destination.name": queue,
|
|
29
|
+
"messaging.message.id": job.id,
|
|
30
|
+
"messaging.system": "pg-boss",
|
|
31
|
+
},
|
|
32
|
+
kind: "consumer",
|
|
33
|
+
links: isTracedPayload(job.data) ? [{ attributes: {}, span: Tracer.externalSpan(job.data.span) }] : [],
|
|
34
|
+
root: true,
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=tracing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tracing.js","sourceRoot":"","sources":["../../../src/server/internal/tracing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAGxD,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC;IACnC,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,yCAAyC,CAAC;IAC/D,OAAO,EAAE,MAAM,CAAC,OAAO;IACvB,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;CAC/F,CAAC,CAAC;AAEH,MAAM,eAAe,GAAG,MAAM,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC;AAEjD,MAAM,UAAU,cAAc,CAAC,OAAe;IAC7C,OAAO,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CACnE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;QAClB,CAAC,CAAC,OAAO;QACT,CAAC,CAAE;YACD,IAAI,EAAE,yCAAyC;YAC/C,OAAO;YACP,IAAI,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE;SACxD,CACxC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAa;IACtC,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,QAAQ,CAAU,MAA8B,EAAE,GAAiB,EAAE,KAAa;IACjG,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE;QACrC,UAAU,EAAE;YACX,aAAa,EAAE,GAAG,CAAC,UAAU,GAAG,CAAC;YACjC,QAAQ,EAAE,GAAG,CAAC,EAAE;YAChB,UAAU,EAAE,GAAG,CAAC,IAAI;YACpB,WAAW,EAAE,KAAK;YAClB,iBAAiB,EAAE,GAAG,CAAC,UAAU;YACjC,4BAA4B,EAAE,KAAK;YACnC,sBAAsB,EAAE,GAAG,CAAC,EAAE;YAC9B,kBAAkB,EAAE,SAAS;SAC7B;QACD,IAAI,EAAE,UAAU;QAChB,KAAK,EAAE,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE;QACtG,IAAI,EAAE,IAAI;KACV,CAAC,CAAC;AACJ,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@shivaedev/effect-pg-boss",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.1",
|
|
4
4
|
"description": "Effect-native jobs and lifecycle management for pg-boss",
|
|
5
5
|
"homepage": "https://github.com/ShivaeDev/platform/tree/main/packages/effect-pg-boss#readme",
|
|
6
6
|
"bugs": {
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Effect, Option, Redacted, Schema } from "effect";
|
|
2
2
|
import type { PgBossClient } from "#client.ts";
|
|
3
3
|
import { PgBossPayloadError, toPgBossError } from "#error.ts";
|
|
4
|
+
import { payloadOf } from "#internal/tracing.ts";
|
|
4
5
|
import type { PgBossService } from "#service.ts";
|
|
5
6
|
|
|
6
7
|
export function getJobFor(client: PgBossClient): PgBossService["getJob"] {
|
|
@@ -17,7 +18,7 @@ export function getJobFor(client: PgBossClient): PgBossService["getJob"] {
|
|
|
17
18
|
Effect.flatMap((job) =>
|
|
18
19
|
job === undefined
|
|
19
20
|
? Effect.succeed(Option.none())
|
|
20
|
-
: Schema.decodeUnknownEffect(queue.schema)(job.data).pipe(
|
|
21
|
+
: Schema.decodeUnknownEffect(queue.schema)(payloadOf(job.data)).pipe(
|
|
21
22
|
Effect.mapError((error) => new PgBossPayloadError({ direction: "decode", original: Redacted.make(error), queue: queue.name })),
|
|
22
23
|
Effect.map((data) => Option.some({ ...job, data })),
|
|
23
24
|
),
|
|
@@ -4,6 +4,7 @@ import type { PgBossClient } from "#client.ts";
|
|
|
4
4
|
import { type JobRegistration, jobContext, type QueueDefinition, type QueueWorker, type ScheduledWorker } from "#definition.ts";
|
|
5
5
|
import { PgBossPayloadError, PgBossQueueOptionsError, toPgBossError } from "#error.ts";
|
|
6
6
|
import { ensureQueue } from "#internal/ensureQueue.ts";
|
|
7
|
+
import { payloadOf, traceJob } from "#internal/tracing.ts";
|
|
7
8
|
|
|
8
9
|
function isQueueWorker(registration: JobRegistration): registration is QueueWorker {
|
|
9
10
|
return registration._tag === "QueueWorker";
|
|
@@ -38,7 +39,7 @@ function workerContext(context: unknown): unknown {
|
|
|
38
39
|
|
|
39
40
|
function runQueueWorker(worker: QueueWorker, job: Job<unknown>, context: Context.Context<unknown>): Promise<unknown> {
|
|
40
41
|
return Effect.runPromise(
|
|
41
|
-
Schema.decodeUnknownEffect(worker.queue.schema)(job.data).pipe(
|
|
42
|
+
Schema.decodeUnknownEffect(worker.queue.schema)(payloadOf(job.data)).pipe(
|
|
42
43
|
Effect.mapError(
|
|
43
44
|
(error) =>
|
|
44
45
|
new PgBossPayloadError({
|
|
@@ -48,6 +49,7 @@ function runQueueWorker(worker: QueueWorker, job: Job<unknown>, context: Context
|
|
|
48
49
|
}),
|
|
49
50
|
),
|
|
50
51
|
Effect.flatMap((payload) => worker.handler(payload, jobContext(job))),
|
|
52
|
+
(effect) => traceJob(effect, job, worker.queue.name),
|
|
51
53
|
Effect.provide(context),
|
|
52
54
|
),
|
|
53
55
|
{ signal: job.signal },
|
|
@@ -89,7 +91,7 @@ async function registerSchedule(
|
|
|
89
91
|
await ensureQueue(client, schedule.name, schedule.queueOptions);
|
|
90
92
|
await client.work(schedule.name, schedule.workerOptions, async (jobs: readonly Job<unknown>[]) => {
|
|
91
93
|
for (const job of jobs) {
|
|
92
|
-
await Effect.runPromise(Effect.provide(worker.effect, context), {
|
|
94
|
+
await Effect.runPromise(Effect.provide(traceJob(worker.effect, job, schedule.name), context), {
|
|
93
95
|
signal: job.signal,
|
|
94
96
|
});
|
|
95
97
|
}
|
|
@@ -4,6 +4,7 @@ import { type PgBossError, PgBossPayloadError, toPgBossError } from "#error.ts";
|
|
|
4
4
|
import { countsFor } from "#internal/countsFor.ts";
|
|
5
5
|
import { healthFor } from "#internal/health.ts";
|
|
6
6
|
import { getJobFor, retryFor } from "#internal/jobControl.ts";
|
|
7
|
+
import { capturePayload } from "#internal/tracing.ts";
|
|
7
8
|
import type { PgBossService } from "#service.ts";
|
|
8
9
|
|
|
9
10
|
export const makeService = (client: PgBossClient, names: readonly string[], schema = "pgboss"): PgBossService => ({
|
|
@@ -28,10 +29,15 @@ export const makeService = (client: PgBossClient, names: readonly string[], sche
|
|
|
28
29
|
}),
|
|
29
30
|
);
|
|
30
31
|
}
|
|
31
|
-
return
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
32
|
+
return capturePayload(encoded).pipe(
|
|
33
|
+
Effect.flatMap((data) =>
|
|
34
|
+
Effect.tryPromise({
|
|
35
|
+
catch: (error) => toPgBossError("enqueue", error, queue.name),
|
|
36
|
+
try: () => client.send(queue.name, data, options),
|
|
37
|
+
}),
|
|
38
|
+
),
|
|
39
|
+
Effect.map(Option.fromNullishOr),
|
|
40
|
+
);
|
|
35
41
|
}),
|
|
36
42
|
),
|
|
37
43
|
getJob: getJobFor(client),
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { Effect, Option, Schema, Tracer } from "effect";
|
|
2
|
+
import type { Job } from "pg-boss";
|
|
3
|
+
|
|
4
|
+
const TracedPayload = Schema.Struct({
|
|
5
|
+
_tag: Schema.Literal("@shivaedev/effect-pg-boss/TracedPayload"),
|
|
6
|
+
payload: Schema.Unknown,
|
|
7
|
+
span: Schema.Struct({ sampled: Schema.Boolean, spanId: Schema.String, traceId: Schema.String }),
|
|
8
|
+
});
|
|
9
|
+
|
|
10
|
+
const isTracedPayload = Schema.is(TracedPayload);
|
|
11
|
+
|
|
12
|
+
export function capturePayload(payload: object): Effect.Effect<object> {
|
|
13
|
+
return Effect.map(Effect.option(Effect.currentParentSpan), (span) =>
|
|
14
|
+
Option.isNone(span)
|
|
15
|
+
? payload
|
|
16
|
+
: ({
|
|
17
|
+
_tag: "@shivaedev/effect-pg-boss/TracedPayload",
|
|
18
|
+
payload,
|
|
19
|
+
span: { sampled: span.value.sampled, spanId: span.value.spanId, traceId: span.value.traceId },
|
|
20
|
+
} satisfies typeof TracedPayload.Type),
|
|
21
|
+
);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export function payloadOf(data: unknown): unknown {
|
|
25
|
+
return isTracedPayload(data) ? data.payload : data;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export function traceJob<A, E, R>(effect: Effect.Effect<A, E, R>, job: Job<unknown>, queue: string) {
|
|
29
|
+
return Effect.withSpan(effect, queue, {
|
|
30
|
+
attributes: {
|
|
31
|
+
"job.attempt": job.retryCount + 1,
|
|
32
|
+
"job.id": job.id,
|
|
33
|
+
"job.name": job.name,
|
|
34
|
+
"job.queue": queue,
|
|
35
|
+
"job.retry_count": job.retryCount,
|
|
36
|
+
"messaging.destination.name": queue,
|
|
37
|
+
"messaging.message.id": job.id,
|
|
38
|
+
"messaging.system": "pg-boss",
|
|
39
|
+
},
|
|
40
|
+
kind: "consumer",
|
|
41
|
+
links: isTracedPayload(job.data) ? [{ attributes: {}, span: Tracer.externalSpan(job.data.span) }] : [],
|
|
42
|
+
root: true,
|
|
43
|
+
});
|
|
44
|
+
}
|