@shivaedev/jobs 0.22.1 → 0.23.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 +30 -0
- package/README.md +47 -53
- package/dist/JobFailure.d.ts +7 -0
- package/dist/JobFailure.d.ts.map +1 -0
- package/dist/JobFailure.js +8 -0
- package/dist/JobFailure.js.map +1 -0
- package/dist/server/PgBoss.d.ts +11 -0
- package/dist/server/PgBoss.d.ts.map +1 -0
- package/dist/server/PgBoss.js +4 -0
- package/dist/server/PgBoss.js.map +1 -0
- package/dist/server/client.d.ts +1 -1
- package/dist/server/client.d.ts.map +1 -1
- package/dist/server/health.d.ts +3 -2
- package/dist/server/health.d.ts.map +1 -1
- package/dist/server/health.js.map +1 -1
- package/dist/server/internal/batchHandler.d.ts +2 -1
- package/dist/server/internal/batchHandler.d.ts.map +1 -1
- package/dist/server/internal/batchHandler.js +49 -31
- package/dist/server/internal/batchHandler.js.map +1 -1
- package/dist/server/internal/clientErrors.d.ts.map +1 -1
- package/dist/server/internal/clientErrors.js +2 -1
- package/dist/server/internal/clientErrors.js.map +1 -1
- package/dist/server/internal/deferrableAttempt.d.ts +1 -1
- package/dist/server/internal/deferrableAttempt.d.ts.map +1 -1
- package/dist/server/internal/deferrableAttempt.js +5 -1
- package/dist/server/internal/deferrableAttempt.js.map +1 -1
- package/dist/server/internal/ensureQueue.d.ts +2 -1
- package/dist/server/internal/ensureQueue.d.ts.map +1 -1
- package/dist/server/internal/ensureQueue.js +16 -21
- package/dist/server/internal/ensureQueue.js.map +1 -1
- package/dist/server/internal/failureOutput.d.ts +4 -0
- package/dist/server/internal/failureOutput.d.ts.map +1 -0
- package/dist/server/internal/failureOutput.js +9 -0
- package/dist/server/internal/failureOutput.js.map +1 -0
- package/dist/server/internal/lifecycle.d.ts +1 -1
- package/dist/server/internal/lifecycle.d.ts.map +1 -1
- package/dist/server/internal/lifecycle.js +10 -16
- package/dist/server/internal/lifecycle.js.map +1 -1
- package/dist/server/internal/listJobs.d.ts.map +1 -1
- package/dist/server/internal/listJobs.js +44 -39
- package/dist/server/internal/listJobs.js.map +1 -1
- package/dist/server/internal/makeService.js +1 -1
- package/dist/server/internal/makeService.js.map +1 -1
- package/dist/server/internal/register.d.ts +4 -3
- package/dist/server/internal/register.d.ts.map +1 -1
- package/dist/server/internal/register.js +34 -48
- package/dist/server/internal/register.js.map +1 -1
- package/dist/server/internal/registerReleasedJobs.d.ts +2 -1
- package/dist/server/internal/registerReleasedJobs.d.ts.map +1 -1
- package/dist/server/internal/registerReleasedJobs.js +3 -3
- package/dist/server/internal/registerReleasedJobs.js.map +1 -1
- package/dist/server/internal/registerWorker.d.ts +3 -2
- package/dist/server/internal/registerWorker.d.ts.map +1 -1
- package/dist/server/internal/registerWorker.js +26 -33
- package/dist/server/internal/registerWorker.js.map +1 -1
- package/dist/server/internal/retryWake.d.ts +4 -0
- package/dist/server/internal/retryWake.d.ts.map +1 -0
- package/dist/server/internal/retryWake.js +32 -0
- package/dist/server/internal/retryWake.js.map +1 -0
- package/dist/server/internal/runQueueWorker.d.ts +5 -0
- package/dist/server/internal/runQueueWorker.d.ts.map +1 -0
- package/dist/server/internal/runQueueWorker.js +12 -0
- package/dist/server/internal/runQueueWorker.js.map +1 -0
- package/dist/server/internal/schemaIndexBuilds.d.ts.map +1 -1
- package/dist/server/internal/schemaIndexBuilds.js +5 -2
- package/dist/server/internal/schemaIndexBuilds.js.map +1 -1
- package/dist/server/schema.d.ts.map +1 -1
- package/dist/server/schema.js +16 -5
- package/dist/server/schema.js.map +1 -1
- package/dist/server/service.d.ts +13 -8
- package/dist/server/service.d.ts.map +1 -1
- package/dist/server/service.js +53 -22
- package/dist/server/service.js.map +1 -1
- package/package.json +14 -8
- package/src/JobFailure.ts +9 -0
- package/src/server/PgBoss.ts +8 -0
- package/src/server/client.ts +1 -1
- package/src/server/health.ts +3 -2
- package/src/server/internal/batchHandler.ts +61 -42
- package/src/server/internal/clientErrors.ts +2 -1
- package/src/server/internal/deferrableAttempt.ts +5 -1
- package/src/server/internal/ensureQueue.ts +18 -20
- package/src/server/internal/failureOutput.ts +9 -0
- package/src/server/internal/lifecycle.ts +13 -16
- package/src/server/internal/listJobs.ts +57 -47
- package/src/server/internal/makeService.ts +1 -1
- package/src/server/internal/register.ts +68 -66
- package/src/server/internal/registerReleasedJobs.ts +8 -3
- package/src/server/internal/registerWorker.ts +35 -46
- package/src/server/internal/retryWake.ts +33 -0
- package/src/server/internal/runQueueWorker.ts +19 -0
- package/src/server/internal/schemaIndexBuilds.ts +6 -2
- package/src/server/schema.ts +22 -6
- package/src/server/service.ts +84 -49
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registerReleasedJobs.js","sourceRoot":"","sources":["../../../src/server/internal/registerReleasedJobs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAGhE,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"registerReleasedJobs.js","sourceRoot":"","sources":["../../../src/server/internal/registerReleasedJobs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAGhE,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAE1C,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAE/D,MAAM,CAAC,MAAM,oBAAoB,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,EAC9D,MAAoB,EACpB,IAAgC,EAChC,OAA2B,EAC3B,cAAuB,EACvB,OAAqB,EACrB,MAA0B,EAC1B,QAAiB;IAEjB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC;IAC1D,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,iBAAiB,CAAC,CAAC;IACrE,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;IAClC,MAAM,QAAQ,GAAG,YAAY,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,IAAI,CACzG,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,CACzC,CAAC;IACF,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnD,OAAO,KAAK,CAAC,CAAC,QAAQ,CAAC;IACxB,CAAC;IACD,KAAK,CAAC,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;IAC7F,IAAI,OAAO,GAAG,cAAc,CAAC;IAC7B,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,EAAE,CACvC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QACnB,IAAI,MAAM,EAAE,CAAC;YACZ,KAAK,CAAC,CAAC,QAAQ,CAAC;YAChB,OAAO,GAAG,IAAI,CAAC;YACf,IAAI,MAAM,EAAE,CAAC;gBACZ,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,sCAAsC,CAAC,CAAC;YAC/D,CAAC;QACF,CAAC;aAAM,IAAI,OAAO,EAAE,CAAC;YACpB,KAAK,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC;gBACxB,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,KAAK,CAAC;gBAClD,GAAG,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;aACnF,CAAC,CAAC;YACH,OAAO,GAAG,KAAK,CAAC;YAChB,MAAM,GAAG,IAAI,CAAC;YACd,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,6CAA6C,CAAC,CAAC;QACtE,CAAC;IACF,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAChC,CAAC;AACH,CAAC,CAAC,CAAC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { type Context, Effect,
|
|
1
|
+
import { type Context, Effect, Scope } from "effect";
|
|
2
2
|
import type { Job, WorkOptions } from "pg-boss";
|
|
3
3
|
import type { PgBossClient } from "#client.ts";
|
|
4
|
-
|
|
4
|
+
import { type PgBossRunner } from "#internal/batchHandler.ts";
|
|
5
|
+
export declare const registerWorker: (client: PgBossClient, name: string, options: WorkOptions, run: (job: Job<unknown>) => Effect.Effect<unknown, unknown, unknown>, scope: Scope.Scope, schema: string, maxDeferrals: number, context: Context.Context<unknown>, execute: PgBossRunner, graceful: boolean) => Effect.Effect<string, import("#error.ts").PgBossError, never>;
|
|
5
6
|
//# sourceMappingURL=registerWorker.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registerWorker.d.ts","sourceRoot":"","sources":["../../../src/server/internal/registerWorker.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"registerWorker.d.ts","sourceRoot":"","sources":["../../../src/server/internal/registerWorker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,EAAS,KAAK,EAAE,MAAM,QAAQ,CAAC;AAC5D,OAAO,KAAK,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,OAAO,EAAgB,KAAK,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAK5E,eAAO,MAAM,cAAc,wEAIf,GAAG,CAAC,OAAO,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,yMAmCnE,CAAC"}
|
|
@@ -1,37 +1,30 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Effect, Fiber, Scope } from "effect";
|
|
2
|
+
import { toPgBossError } from "#error.ts";
|
|
2
3
|
import { batchHandler } from "#internal/batchHandler.ts";
|
|
3
4
|
import { deferrableAttempt } from "#internal/deferrableAttempt.ts";
|
|
5
|
+
import { retryWake } from "#internal/retryWake.ts";
|
|
4
6
|
import { traceJob } from "#internal/tracing.ts";
|
|
5
|
-
export
|
|
6
|
-
const
|
|
7
|
-
|
|
8
|
-
return Effect.provide(
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
.filter((worker) => worker.workId === workId)
|
|
29
|
-
.map((worker) => worker.id) ?? [workId];
|
|
30
|
-
for (const workerId of workerIds) {
|
|
31
|
-
client.notifyWorker?.(workerId);
|
|
32
|
-
}
|
|
33
|
-
}).pipe(Effect.forkIn(scope)));
|
|
34
|
-
}, Effect.runPromiseWith(context)));
|
|
35
|
-
return registration;
|
|
36
|
-
}
|
|
7
|
+
export const registerWorker = Effect.fnUntraced(function* (client, name, options, run, scope, schema, maxDeferrals, context, execute, graceful) {
|
|
8
|
+
const fibers = yield* Scope.fork(scope);
|
|
9
|
+
function runJob(job) {
|
|
10
|
+
return Effect.provide(traceJob(deferrableAttempt(run(job), client, schema, job, maxDeferrals), job, name), context);
|
|
11
|
+
}
|
|
12
|
+
function afterFailure(attempt) {
|
|
13
|
+
return retryWake(client, name, attempt.id, registration).pipe(Effect.forkIn(fibers), Effect.asVoid);
|
|
14
|
+
}
|
|
15
|
+
const handle = yield* Effect.try({
|
|
16
|
+
catch: (error) => toPgBossError("register", error, name),
|
|
17
|
+
try: () => batchHandler(client, name, runJob, afterFailure),
|
|
18
|
+
});
|
|
19
|
+
const registration = yield* Effect.try({
|
|
20
|
+
catch: (error) => toPgBossError("register", error, name),
|
|
21
|
+
try: () => client.work(name, { ...options, includeMetadata: true }, (jobs) => execute(handle(jobs).pipe(Effect.forkIn(fibers), Effect.flatMap(Fiber.join)))),
|
|
22
|
+
});
|
|
23
|
+
const id = yield* Effect.tryPromise({ catch: (error) => toPgBossError("register", error, name), try: () => registration });
|
|
24
|
+
yield* Scope.addFinalizer(scope, Effect.tryPromise({
|
|
25
|
+
catch: (error) => toPgBossError("stop", error, name),
|
|
26
|
+
try: () => client.offWork(name, { id, wait: graceful }),
|
|
27
|
+
}).pipe(Effect.catch(Effect.logError)));
|
|
28
|
+
return id;
|
|
29
|
+
});
|
|
37
30
|
//# sourceMappingURL=registerWorker.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registerWorker.js","sourceRoot":"","sources":["../../../src/server/internal/registerWorker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,
|
|
1
|
+
{"version":3,"file":"registerWorker.js","sourceRoot":"","sources":["../../../src/server/internal/registerWorker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAG5D,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAqB,MAAM,2BAA2B,CAAC;AAC5E,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAEhD,MAAM,CAAC,MAAM,cAAc,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,EACxD,MAAoB,EACpB,IAAY,EACZ,OAAoB,EACpB,GAAoE,EACpE,KAAkB,EAClB,MAAc,EACd,YAAoB,EACpB,OAAiC,EACjC,OAAqB,EACrB,QAAiB;IAEjB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACxC,SAAS,MAAM,CAAC,GAAiB;QAChC,OAAO,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,YAAY,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;IACrH,CAAC;IACD,SAAS,YAAY,CAAC,OAAqB;QAC1C,OAAO,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IACrG,CAAC;IACD,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;QAChC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,KAAK,EAAE,IAAI,CAAC;QACxD,GAAG,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC;KAC3D,CAAC,CAAC;IACH,MAAM,YAAY,GAAoB,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;QACvD,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,KAAK,EAAE,IAAI,CAAC;QACxD,GAAG,EAAE,GAAG,EAAE,CACT,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,GAAG,OAAO,EAAE,eAAe,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,CACjE,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAC7E;KACF,CAAC,CAAC;IACH,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,YAAY,EAAE,CAAC,CAAC;IAC3H,KAAK,CAAC,CAAC,KAAK,CAAC,YAAY,CACxB,KAAK,EACL,MAAM,CAAC,UAAU,CAAC;QACjB,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC;QACpD,GAAG,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;KACvD,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CACtC,CAAC;IACF,OAAO,EAAE,CAAC;AACX,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retryWake.d.ts","sourceRoot":"","sources":["../../../src/server/internal/retryWake.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEvC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG/C,wBAAgB,SAAS,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CA2B5H"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { Clock, Effect } from "effect";
|
|
2
|
+
import { redactDiagnosticCause } from "@shivaedev/errors/redactCause.ts";
|
|
3
|
+
import { toPgBossError } from "#error.ts";
|
|
4
|
+
export function retryWake(client, name, id, registration) {
|
|
5
|
+
return Effect.gen(function* () {
|
|
6
|
+
const findJobs = client.findJobs?.bind(client);
|
|
7
|
+
if (findJobs === undefined || client.notifyWorker === undefined) {
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
10
|
+
const jobs = yield* Effect.tryPromise({ catch: (error) => toPgBossError("settle", error, name), try: () => findJobs(name, { id }) });
|
|
11
|
+
const job = jobs[0];
|
|
12
|
+
if (job?.state !== "retry") {
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
const workId = yield* Effect.tryPromise({ catch: (error) => toPgBossError("register", error, name), try: () => registration });
|
|
16
|
+
// Host timers can fire early; PostgreSQL retains precision that Date drops.
|
|
17
|
+
const deadline = job.startAfter.getTime() + 1;
|
|
18
|
+
let remaining = deadline - (yield* Clock.currentTimeMillis);
|
|
19
|
+
while (remaining > 0) {
|
|
20
|
+
yield* Effect.sleep(remaining);
|
|
21
|
+
remaining = deadline - (yield* Clock.currentTimeMillis);
|
|
22
|
+
}
|
|
23
|
+
const workerIds = client
|
|
24
|
+
.getWipData?.()
|
|
25
|
+
.filter((worker) => worker.workId === workId)
|
|
26
|
+
.map((worker) => worker.id) ?? [workId];
|
|
27
|
+
for (const workerId of workerIds) {
|
|
28
|
+
client.notifyWorker(workerId);
|
|
29
|
+
}
|
|
30
|
+
}).pipe(Effect.catchCause((cause) => Effect.logError(redactDiagnosticCause(cause))));
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=retryWake.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retryWake.js","sourceRoot":"","sources":["../../../src/server/internal/retryWake.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AAEzE,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAE1C,MAAM,UAAU,SAAS,CAAC,MAAoB,EAAE,IAAY,EAAE,EAAU,EAAE,YAA6B;IACtG,OAAO,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QAC1B,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QAC/C,IAAI,QAAQ,KAAK,SAAS,IAAI,MAAM,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;YACjE,OAAO;QACR,CAAC;QACD,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;QACrI,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,IAAI,GAAG,EAAE,KAAK,KAAK,OAAO,EAAE,CAAC;YAC5B,OAAO;QACR,CAAC;QACD,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,YAAY,EAAE,CAAC,CAAC;QAC/H,4EAA4E;QAC5E,MAAM,QAAQ,GAAG,GAAG,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAC9C,IAAI,SAAS,GAAG,QAAQ,GAAG,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;QAC5D,OAAO,SAAS,GAAG,CAAC,EAAE,CAAC;YACtB,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YAC/B,SAAS,GAAG,QAAQ,GAAG,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;QACzD,CAAC;QACD,MAAM,SAAS,GAAG,MAAM;aACtB,UAAU,EAAE,EAAE;aACd,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC;aAC5C,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACzC,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YAClC,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QAC/B,CAAC;IACF,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACtF,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { Effect } from "effect";
|
|
2
|
+
import type { Job } from "pg-boss";
|
|
3
|
+
import { type QueueWorker } from "#definition.ts";
|
|
4
|
+
export declare function runQueueWorker(worker: QueueWorker, job: Job<unknown>): Effect.Effect<unknown, unknown, unknown>;
|
|
5
|
+
//# sourceMappingURL=runQueueWorker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runQueueWorker.d.ts","sourceRoot":"","sources":["../../../src/server/internal/runQueueWorker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAoB,MAAM,QAAQ,CAAC;AAClD,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAc,KAAK,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAI9D,wBAAgB,cAAc,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC,4CAYpE"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Effect, Redacted, Schema } from "effect";
|
|
2
|
+
import { jobContext } from "#definition.ts";
|
|
3
|
+
import { PgBossPayloadError } from "#error.ts";
|
|
4
|
+
import { payloadOf } from "#internal/tracing.ts";
|
|
5
|
+
export function runQueueWorker(worker, job) {
|
|
6
|
+
return Schema.decodeUnknownEffect(worker.queue.schema)(payloadOf(job.data)).pipe(Effect.mapError((error) => new PgBossPayloadError({
|
|
7
|
+
direction: "decode",
|
|
8
|
+
original: Redacted.make(error),
|
|
9
|
+
queue: worker.queue.name,
|
|
10
|
+
})), Effect.flatMap((payload) => worker.handler(payload, jobContext(job))));
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=runQueueWorker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runQueueWorker.js","sourceRoot":"","sources":["../../../src/server/internal/runQueueWorker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAElD,OAAO,EAAE,UAAU,EAAoB,MAAM,gBAAgB,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEjD,MAAM,UAAU,cAAc,CAAC,MAAmB,EAAE,GAAiB;IACpE,OAAO,MAAM,CAAC,mBAAmB,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAC/E,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,MAAM,CAAC,KAAK,CAAC,IAAI;KACxB,CAAC,CACH,EACD,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CACrE,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schemaIndexBuilds.d.ts","sourceRoot":"","sources":["../../../src/server/internal/schemaIndexBuilds.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"schemaIndexBuilds.d.ts","sourceRoot":"","sources":["../../../src/server/internal/schemaIndexBuilds.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAmBtC,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,MAAM,CAQzI;AAED,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBvF"}
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
import { Schema } from "effect";
|
|
2
|
+
const IndexBuilds = Schema.Array(Schema.Struct({ command: Schema.String, id: Schema.String }));
|
|
3
|
+
const IndexValidity = Schema.Array(Schema.Struct({ invalid: Schema.Boolean }));
|
|
1
4
|
const BUILD_PREFIX = "effect-pg-boss-schema:";
|
|
2
5
|
function indexName(command) {
|
|
3
6
|
const match = /^\s*(?:CREATE (?:UNIQUE )?INDEX CONCURRENTLY IF NOT EXISTS |DROP INDEX CONCURRENTLY IF EXISTS (?:(?:"[^"]+"|\w+)\.))(?<name>\w+)/mu.exec(command);
|
|
@@ -19,11 +22,11 @@ export function pendingIndexInserts(schema, version, commands, quote) {
|
|
|
19
22
|
export async function resumeSchemaIndexes(client, schema) {
|
|
20
23
|
const db = client.getDb();
|
|
21
24
|
const { rows } = await db.executeSql(`SELECT id, command FROM ${schema}.bam WHERE starts_with(name, $1) AND status <> 'completed' ORDER BY created_on, name`, [BUILD_PREFIX]);
|
|
22
|
-
for (const row of rows) {
|
|
25
|
+
for (const row of Schema.decodeUnknownSync(IndexBuilds)(rows)) {
|
|
23
26
|
const name = indexName(row.command);
|
|
24
27
|
if (/^\s*CREATE /mu.test(row.command)) {
|
|
25
28
|
const probe = await db.executeSql("SELECT NOT indisvalid AS invalid FROM pg_index WHERE indexrelid = to_regclass($1)", [`${schema}.${name}`]);
|
|
26
|
-
if (probe.rows[0]?.invalid === true) {
|
|
29
|
+
if (Schema.decodeUnknownSync(IndexValidity)(probe.rows)[0]?.invalid === true) {
|
|
27
30
|
await db.executeSql(`DROP INDEX CONCURRENTLY IF EXISTS ${schema}."${name}"`);
|
|
28
31
|
}
|
|
29
32
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schemaIndexBuilds.js","sourceRoot":"","sources":["../../../src/server/internal/schemaIndexBuilds.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"schemaIndexBuilds.js","sourceRoot":"","sources":["../../../src/server/internal/schemaIndexBuilds.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAGhC,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,EAAE,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;AAC/F,MAAM,aAAa,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;AAE/E,MAAM,YAAY,GAAG,wBAAwB,CAAC;AAE9C,SAAS,SAAS,CAAC,OAAe;IACjC,MAAM,KAAK,GACV,oIAAoI,CAAC,IAAI,CACxI,OAAO,CACP,CAAC;IACH,MAAM,IAAI,GAAG,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC;IACjC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;IAClE,CAAC;IACD,OAAO,IAAI,CAAC;AACb,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,MAAc,EAAE,OAAe,EAAE,QAA2B,EAAE,KAA+B;IAChI,OAAO,QAAQ;SACb,GAAG,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,EAAE;QAC1B,MAAM,KAAK,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QACxD,MAAM,IAAI,GAAG,GAAG,YAAY,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;QACnE,OAAO,eAAe,MAAM,qDAAqD,KAAK,CAAC,IAAI,CAAC,KAAK,OAAO,KAAK,KAAK,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;IAClJ,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAC;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,MAAc,EAAE,MAAc;IACvE,MAAM,EAAE,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC;IAC1B,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC,UAAU,CACnC,2BAA2B,MAAM,sFAAsF,EACvH,CAAC,YAAY,CAAC,CACd,CAAC;IACF,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/D,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACpC,IAAI,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YACvC,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,UAAU,CAAC,mFAAmF,EAAE,CAAC,GAAG,MAAM,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC;YAC9I,IAAI,MAAM,CAAC,iBAAiB,CAAC,aAAa,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI,EAAE,CAAC;gBAC9E,MAAM,EAAE,CAAC,UAAU,CAAC,qCAAqC,MAAM,KAAK,IAAI,GAAG,CAAC,CAAC;YAC9E,CAAC;QACF,CAAC;QACD,MAAM,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACjC,MAAM,EAAE,CAAC,UAAU,CAAC,UAAU,MAAM,+EAA+E,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAChI,CAAC;AACF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/server/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/server/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAU,MAAM,QAAQ,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAIvC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AACzE,OAAO,EAAE,KAAK,WAAW,EAAiB,MAAM,WAAW,CAAC;AAc5D,MAAM,WAAW,mBAAmB;IACnC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CACzB;AAuCD,wBAAgB,mBAAmB,CAAC,OAAO,GAAE,mBAAwB,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,EAAE,SAAS,CAAC,SAAS,CAAC,CAe5H;AAED,wBAAgB,YAAY,CAAC,OAAO,GAAE,mBAAwB,GAAG,eAAe,CAqB/E"}
|
package/dist/server/schema.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Effect } from "effect";
|
|
1
|
+
import { Effect, Schema } from "effect";
|
|
2
2
|
import { SqlClient } from "effect/sql";
|
|
3
3
|
import { getConstructionPlans, getMigrationPlans, PgBoss } from "pg-boss";
|
|
4
4
|
import pgBossPackage from "pg-boss/package.json" with { type: "json" };
|
|
@@ -6,6 +6,12 @@ import { toPgBossError } from "#error.ts";
|
|
|
6
6
|
import { deferralStorePlan } from "#internal/deferralStorePlan.ts";
|
|
7
7
|
import { runSchemaPlan } from "#internal/runSchemaPlan.ts";
|
|
8
8
|
import { resumeSchemaIndexes } from "#internal/schemaIndexBuilds.ts";
|
|
9
|
+
const Partitions = Schema.Array(Schema.Struct({
|
|
10
|
+
policy: Schema.String,
|
|
11
|
+
tableName: Schema.String,
|
|
12
|
+
}));
|
|
13
|
+
const InstalledSchema = Schema.Array(Schema.Struct({ name: Schema.NullOr(Schema.String) }));
|
|
14
|
+
const InstalledVersion = Schema.Array(Schema.Struct({ version: Schema.Number }));
|
|
9
15
|
async function installSchema(connection, options, run) {
|
|
10
16
|
const schema = options.schema ?? "pgboss";
|
|
11
17
|
const construction = getConstructionPlans(schema);
|
|
@@ -28,8 +34,11 @@ async function installSchema(connection, options, run) {
|
|
|
28
34
|
await resumeSchemaIndexes(client, schema);
|
|
29
35
|
}
|
|
30
36
|
if (version < pgBossPackage.pgboss.schema) {
|
|
31
|
-
const partitionTables =
|
|
32
|
-
await runSchemaPlan(connection, getMigrationPlans(schema, version, { partitionTables }), run, {
|
|
37
|
+
const partitionTables = Schema.decodeUnknownSync(Partitions)(await run(connection.executeUnprepared(`SELECT table_name AS "tableName", policy FROM ${schema}.queue WHERE partition = true`, [], undefined)));
|
|
38
|
+
await runSchemaPlan(connection, getMigrationPlans(schema, version, { partitionTables: Array.from(partitionTables) }), run, {
|
|
39
|
+
schema,
|
|
40
|
+
version: pgBossPackage.pgboss.schema,
|
|
41
|
+
});
|
|
33
42
|
await resumeSchemaIndexes(client, schema);
|
|
34
43
|
}
|
|
35
44
|
}
|
|
@@ -55,8 +64,10 @@ export function pgBossSchema(options = {}) {
|
|
|
55
64
|
pending: Effect.gen(function* () {
|
|
56
65
|
const sql = yield* SqlClient.SqlClient;
|
|
57
66
|
const table = sql `${sql(schema)}.${sql("version")}`;
|
|
58
|
-
const [installed] = yield* sql `select to_regclass(${table.compile()[0]})::text as name`.withoutTransform;
|
|
59
|
-
const [row] = installed === undefined || installed.name === null
|
|
67
|
+
const [installed] = yield* sql `select to_regclass(${table.compile()[0]})::text as name`.withoutTransform.pipe(Effect.flatMap(Schema.decodeUnknownEffect(InstalledSchema)));
|
|
68
|
+
const [row] = installed === undefined || installed.name === null
|
|
69
|
+
? []
|
|
70
|
+
: yield* sql `select version from ${table}`.withoutTransform.pipe(Effect.flatMap(Schema.decodeUnknownEffect(InstalledVersion)));
|
|
60
71
|
const required = pgBossPackage.pgboss.schema;
|
|
61
72
|
return row === undefined || row.version < required
|
|
62
73
|
? `schema ${schema}, installed version ${row?.version ?? "missing"}, required version ${required}`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/server/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/server/schema.ts"],"names":[],"mappings":"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"}
|
package/dist/server/service.d.ts
CHANGED
|
@@ -1,38 +1,43 @@
|
|
|
1
|
-
import { Context, Effect, Layer, type Option, type Schema } from "effect";
|
|
1
|
+
import { Context, Effect, Layer, type Option, Redacted, type Schema } from "effect";
|
|
2
2
|
import type { ConstructorOptions, JobWithMetadata, SendOptions, StopOptions } from "pg-boss";
|
|
3
3
|
import type { PgBossClientFactory } from "#client.ts";
|
|
4
4
|
import type { JobPayloadSchema, JobRegistration, QueueDefinition, RegistrationRequirements } from "#definition.ts";
|
|
5
5
|
import type { PgBossClientOptionsError, PgBossError, PgBossPayloadError, PgBossQueueOptionsError } from "#error.ts";
|
|
6
6
|
import type { DeadLetteredJob, JobPage, JobPageOptions, JobsHealth, ListedJob, QueueCounts } from "#health.ts";
|
|
7
|
+
import { PgBoss } from "#PgBoss.ts";
|
|
7
8
|
export interface PgBossService {
|
|
8
9
|
readonly counts: (queue: Pick<QueueDefinition, "name">) => Effect.Effect<QueueCounts, PgBossError>;
|
|
9
10
|
readonly deadLetteredJobs: <const TName extends string, const TPayload extends JobPayloadSchema | typeof Schema.Null>(queue: {
|
|
10
11
|
readonly name: TName;
|
|
11
12
|
readonly schema: TPayload;
|
|
12
|
-
}, options: JobPageOptions) => Effect.Effect<JobPage<DeadLetteredJob<TPayload["Type"]>>, PgBossError | PgBossPayloadError, TPayload["DecodingServices"]>;
|
|
13
|
+
}, options: JobPageOptions) => Effect.Effect<JobPage<DeadLetteredJob<TPayload["Type"]>>, PgBossError | PgBossPayloadError | Schema.SchemaError, TPayload["DecodingServices"]>;
|
|
13
14
|
readonly enqueue: <const TName extends string, const TPayload extends JobPayloadSchema, const TQueue extends QueueDefinition<TName, TPayload>>(queue: QueueDefinition<TName, TPayload> & TQueue, payload: NoInfer<Schema.Schema.Type<TPayload>>, options?: NoInfer<TQueue["key"] extends undefined ? SendOptions : Omit<SendOptions, "singletonKey"> & {
|
|
14
15
|
readonly singletonKey?: never;
|
|
15
16
|
}>) => Effect.Effect<Option.Option<string>, PgBossError | PgBossPayloadError, TPayload["EncodingServices"]>;
|
|
16
17
|
readonly failedJobs: <const TName extends string, const TPayload extends JobPayloadSchema | typeof Schema.Null>(queue: {
|
|
17
18
|
readonly name: TName;
|
|
18
19
|
readonly schema: TPayload;
|
|
19
|
-
}, options: JobPageOptions) => Effect.Effect<JobPage<ListedJob<TPayload["Type"]>>, PgBossError | PgBossPayloadError, TPayload["DecodingServices"]>;
|
|
20
|
+
}, options: JobPageOptions) => Effect.Effect<JobPage<ListedJob<TPayload["Type"]>>, PgBossError | PgBossPayloadError | Schema.SchemaError, TPayload["DecodingServices"]>;
|
|
20
21
|
readonly getJob: <const TName extends string, const TPayload extends JobPayloadSchema | typeof Schema.Null>(queue: {
|
|
21
22
|
readonly name: TName;
|
|
22
23
|
readonly schema: TPayload;
|
|
23
24
|
}, id: string) => Effect.Effect<Option.Option<JobWithMetadata<TPayload["Type"]>>, PgBossError | PgBossPayloadError, TPayload["DecodingServices"]>;
|
|
24
|
-
readonly health: Effect.Effect<JobsHealth, PgBossError>;
|
|
25
|
+
readonly health: () => Effect.Effect<JobsHealth, PgBossError>;
|
|
25
26
|
readonly retry: (queue: Pick<QueueDefinition, "name">, id: string) => Effect.Effect<void, PgBossError>;
|
|
26
27
|
}
|
|
27
|
-
export type
|
|
28
|
+
export type PgBossOptions = Omit<ConstructorOptions, "connectionString"> & {
|
|
29
|
+
readonly connectionString?: Redacted.Redacted<string>;
|
|
28
30
|
readonly clientFactory?: PgBossClientFactory;
|
|
29
31
|
readonly clientCacheKey?: string | symbol | undefined;
|
|
30
|
-
readonly jobs: TRegistrations;
|
|
31
|
-
readonly onError?: (error: Error) => Effect.Effect<unknown, never, TErrorRequirements>;
|
|
32
32
|
readonly stop?: StopOptions;
|
|
33
33
|
};
|
|
34
|
+
export declare function pgBossLayer(options: PgBossOptions): Layer.Layer<PgBoss, PgBossError | PgBossClientOptionsError>;
|
|
35
|
+
export interface PgBossLayerOptions<TRegistrations extends readonly JobRegistration[], TErrorRequirements> {
|
|
36
|
+
readonly jobs: TRegistrations;
|
|
37
|
+
readonly onError?: (error: Error) => Effect.Effect<unknown, never, TErrorRequirements>;
|
|
38
|
+
}
|
|
34
39
|
export interface PgBossDefinition<TIdentifier extends string = string> extends Context.Service<TIdentifier, PgBossService> {
|
|
35
|
-
readonly layer: <const TRegistrations extends readonly JobRegistration[], TErrorRequirements = never>(options: PgBossLayerOptions<TRegistrations, TErrorRequirements>) => Layer.Layer<TIdentifier, PgBossError | PgBossQueueOptionsError |
|
|
40
|
+
readonly layer: <const TRegistrations extends readonly JobRegistration[], TErrorRequirements = never>(options: PgBossLayerOptions<TRegistrations, TErrorRequirements>) => Layer.Layer<TIdentifier, PgBossError | PgBossQueueOptionsError, PgBoss | Exclude<RegistrationRequirements<TRegistrations>, TIdentifier> | TErrorRequirements>;
|
|
36
41
|
}
|
|
37
42
|
export declare function makePgBoss<const TIdentifier extends string>(identifier: TIdentifier): PgBossDefinition<TIdentifier>;
|
|
38
43
|
//# sourceMappingURL=service.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/server/service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/server/service.ts"],"names":[],"mappings":"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"}
|
package/dist/server/service.js
CHANGED
|
@@ -1,32 +1,63 @@
|
|
|
1
|
-
import { Context, Effect, Layer } from "effect";
|
|
1
|
+
import { Context, Effect, Exit, Layer, Redacted, Scope } from "effect";
|
|
2
|
+
import { defineService } from "@shivaedev/service/defineService.ts";
|
|
3
|
+
import { genericMethod } from "@shivaedev/service/genericMethod.ts";
|
|
2
4
|
import { logClientError, subscribeClientErrors } from "#internal/clientErrors.ts";
|
|
3
5
|
import { acquireClient, releaseClient } from "#internal/lifecycle.ts";
|
|
4
6
|
import { makeService } from "#internal/makeService.ts";
|
|
5
7
|
import { registrationName } from "#internal/register.ts";
|
|
6
8
|
import { registerReleasedJobs } from "#internal/registerReleasedJobs.ts";
|
|
9
|
+
import { PgBoss } from "#PgBoss.ts";
|
|
10
|
+
export function pgBossLayer(options) {
|
|
11
|
+
const { connectionString, clientFactory, clientCacheKey, stop, ...settings } = options;
|
|
12
|
+
return Layer.effect(PgBoss, Effect.gen(function* () {
|
|
13
|
+
const dependencies = yield* Effect.context();
|
|
14
|
+
const execute = Effect.runPromiseWith(dependencies);
|
|
15
|
+
const acquired = yield* Effect.acquireRelease(acquireClient({
|
|
16
|
+
clientCacheKey,
|
|
17
|
+
clientFactory,
|
|
18
|
+
constructor: {
|
|
19
|
+
...settings,
|
|
20
|
+
...(connectionString === undefined ? {} : { connectionString: Redacted.value(connectionString) }),
|
|
21
|
+
},
|
|
22
|
+
}, (error) => {
|
|
23
|
+
void execute(logClientError(error));
|
|
24
|
+
}), (client) => releaseClient(client, stop));
|
|
25
|
+
return { ...acquired, schema: settings.schema, stop };
|
|
26
|
+
}));
|
|
27
|
+
}
|
|
7
28
|
export function makePgBoss(identifier) {
|
|
8
|
-
|
|
29
|
+
function definition(options, dependencies) {
|
|
30
|
+
return defineService({
|
|
31
|
+
id: identifier,
|
|
32
|
+
initialize: Effect.gen(function* () {
|
|
33
|
+
const acquired = yield* PgBoss;
|
|
34
|
+
const execute = Effect.runPromiseWith(dependencies);
|
|
35
|
+
const workerScope = yield* Scope.make();
|
|
36
|
+
const service = makeService(acquired.client, options.jobs.map(registrationName), acquired.schema);
|
|
37
|
+
const context = Context.add(dependencies, Service, service);
|
|
38
|
+
const reportError = options.onError ?? logClientError;
|
|
39
|
+
const unsubscribe = subscribeClientErrors(acquired.client, (error) => {
|
|
40
|
+
void execute(Effect.exit(Effect.provide(reportError(error), context)));
|
|
41
|
+
});
|
|
42
|
+
yield* Effect.addFinalizer(() => Scope.close(workerScope, Exit.void).pipe(Effect.ensuring(Effect.sync(unsubscribe))));
|
|
43
|
+
yield* registerReleasedJobs(acquired.client, options.jobs, context, acquired.reused, (effect) => execute(effect), acquired.schema, acquired.stop?.graceful !== false).pipe(Effect.provideService(Scope.Scope, workerScope), Effect.provide(dependencies));
|
|
44
|
+
return service;
|
|
45
|
+
}),
|
|
46
|
+
methods: (service) => ({
|
|
47
|
+
counts: service.counts,
|
|
48
|
+
deadLetteredJobs: genericMethod(service.deadLetteredJobs),
|
|
49
|
+
enqueue: genericMethod(service.enqueue),
|
|
50
|
+
failedJobs: genericMethod(service.failedJobs),
|
|
51
|
+
getJob: genericMethod(service.getJob),
|
|
52
|
+
health: service.health,
|
|
53
|
+
retry: service.retry,
|
|
54
|
+
}),
|
|
55
|
+
requires: [PgBoss],
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
const Service = definition({ jobs: [] }, Context.empty());
|
|
9
59
|
function layer(options) {
|
|
10
|
-
|
|
11
|
-
const { clientFactory, clientCacheKey, jobs, onError, stop, ...constructorOptions } = options;
|
|
12
|
-
const acquire = Effect.acquireRelease(Effect.gen(function* () {
|
|
13
|
-
const dependencies = yield* Effect.context();
|
|
14
|
-
const acquired = yield* acquireClient({
|
|
15
|
-
clientCacheKey,
|
|
16
|
-
clientFactory,
|
|
17
|
-
constructor: constructorOptions,
|
|
18
|
-
});
|
|
19
|
-
const service = makeService(acquired.client, names, constructorOptions.schema);
|
|
20
|
-
const context = Context.add(dependencies, Service, service);
|
|
21
|
-
const reportError = onError ?? logClientError;
|
|
22
|
-
function errorListener(error) {
|
|
23
|
-
void Effect.runPromise(Effect.exit(Effect.provide(reportError(error), context)));
|
|
24
|
-
}
|
|
25
|
-
const unsubscribe = subscribeClientErrors(acquired.client, errorListener);
|
|
26
|
-
const registration = registerReleasedJobs(acquired.client, jobs, context, acquired.reused, constructorOptions.schema);
|
|
27
|
-
return yield* registration.pipe(Effect.as({ acquired, service, unsubscribe }), Effect.onError(() => releaseClient(acquired, stop).pipe(Effect.ensuring(Effect.sync(unsubscribe)))));
|
|
28
|
-
}), (resource) => releaseClient(resource.acquired, stop).pipe(Effect.ensuring(Effect.sync(resource.unsubscribe))));
|
|
29
|
-
return Layer.effect(Service, Effect.map(acquire, ({ service }) => service));
|
|
60
|
+
return Layer.unwrap(Effect.map(Effect.context(), (dependencies) => definition(options, dependencies).layer));
|
|
30
61
|
}
|
|
31
62
|
return Object.assign(Service, { layer });
|
|
32
63
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/server/service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/server/service.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@shivaedev/jobs",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.23.1",
|
|
4
4
|
"description": "Effect-native jobs and lifecycle management for pg-boss",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"effect"
|
|
@@ -23,6 +23,11 @@
|
|
|
23
23
|
"source": "./src/server/*.ts",
|
|
24
24
|
"types": "./dist/server/*.d.ts",
|
|
25
25
|
"default": "./dist/server/*.js"
|
|
26
|
+
},
|
|
27
|
+
"#JobFailure.ts": {
|
|
28
|
+
"source": "./src/JobFailure.ts",
|
|
29
|
+
"types": "./dist/JobFailure.d.ts",
|
|
30
|
+
"default": "./dist/JobFailure.js"
|
|
26
31
|
}
|
|
27
32
|
},
|
|
28
33
|
"exports": {
|
|
@@ -31,8 +36,7 @@
|
|
|
31
36
|
"types": "./dist/*.d.ts",
|
|
32
37
|
"default": "./dist/*.js"
|
|
33
38
|
},
|
|
34
|
-
"./package.json": "./package.json"
|
|
35
|
-
"./server/internal/*": null
|
|
39
|
+
"./package.json": "./package.json"
|
|
36
40
|
},
|
|
37
41
|
"files": [
|
|
38
42
|
"dist",
|
|
@@ -44,13 +48,15 @@
|
|
|
44
48
|
"README.md"
|
|
45
49
|
],
|
|
46
50
|
"dependencies": {
|
|
47
|
-
"@shivaedev/
|
|
51
|
+
"@shivaedev/errors": "0.1.2",
|
|
52
|
+
"@shivaedev/service": "0.6.0",
|
|
53
|
+
"@shivaedev/sql": "0.26.1"
|
|
48
54
|
},
|
|
49
55
|
"devDependencies": {
|
|
50
|
-
"@shivaedev/quality": "0.
|
|
51
|
-
"@shivaedev/test": "0.
|
|
52
|
-
"@shivaedev/test-sql": "0.
|
|
53
|
-
"@shivaedev/test-story": "0.
|
|
56
|
+
"@shivaedev/quality": "0.47.0",
|
|
57
|
+
"@shivaedev/test": "0.11.0",
|
|
58
|
+
"@shivaedev/test-sql": "0.13.0",
|
|
59
|
+
"@shivaedev/test-story": "0.25.1",
|
|
54
60
|
"@types/node": "24.19.2",
|
|
55
61
|
"effect": "4.0.6",
|
|
56
62
|
"pg-boss": "12.38.0",
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Effect, Schema, SchemaGetter } from "effect";
|
|
2
|
+
import { isSensitiveKey, redactText } from "@shivaedev/errors/sensitive.ts";
|
|
3
|
+
|
|
4
|
+
const redactMessage = SchemaGetter.transform((message: string) => redactText(message, isSensitiveKey));
|
|
5
|
+
export const JobFailure = Schema.Struct({
|
|
6
|
+
_tag: Schema.String.pipe(Schema.withDecodingDefaultKey(Effect.succeed("Error"))),
|
|
7
|
+
message: Schema.String.pipe(Schema.decodeTo(Schema.String, { decode: redactMessage, encode: redactMessage })),
|
|
8
|
+
});
|
|
9
|
+
export type JobFailure = typeof JobFailure.Type;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Context } from "effect";
|
|
2
|
+
import type { StopOptions } from "pg-boss";
|
|
3
|
+
import type { AcquiredClient } from "#internal/lifecycle.ts";
|
|
4
|
+
|
|
5
|
+
export class PgBoss extends Context.Service<
|
|
6
|
+
PgBoss,
|
|
7
|
+
AcquiredClient & { readonly schema: string | undefined; readonly stop: StopOptions | undefined }
|
|
8
|
+
>()("@shivaedev/jobs/PgBoss") {}
|
package/src/server/client.ts
CHANGED
|
@@ -23,7 +23,7 @@ export interface PgBossClient {
|
|
|
23
23
|
readonly getWipData?: PgBoss["getWipData"];
|
|
24
24
|
readonly notifyWorker?: PgBoss["notifyWorker"];
|
|
25
25
|
readonly off: (event: "error", listener: (error: Error) => void) => unknown;
|
|
26
|
-
readonly offWork:
|
|
26
|
+
readonly offWork: PgBoss["offWork"];
|
|
27
27
|
readonly on: (event: "error", listener: (error: Error) => void) => unknown;
|
|
28
28
|
readonly retry?: PgBoss["retry"];
|
|
29
29
|
readonly schedule: (name: string, cron: string, data?: object | null, options?: ScheduleOptions) => Promise<void>;
|
package/src/server/health.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { DateTime, Option } from "effect";
|
|
2
2
|
import type { JobWithMetadata } from "pg-boss";
|
|
3
|
+
import type { JobFailure } from "#JobFailure.ts";
|
|
3
4
|
|
|
4
5
|
export interface QueueCounts {
|
|
5
6
|
readonly activeCount: number;
|
|
@@ -36,7 +37,7 @@ export interface ListedJob<TData> {
|
|
|
36
37
|
readonly createdOn: DateTime.Utc;
|
|
37
38
|
readonly data: TData;
|
|
38
39
|
readonly id: string;
|
|
39
|
-
readonly output:
|
|
40
|
+
readonly output: JobFailure | null;
|
|
40
41
|
readonly queue: string;
|
|
41
42
|
readonly retryCount: number;
|
|
42
43
|
readonly retryLimit: number;
|
|
@@ -46,7 +47,7 @@ export interface ListedJob<TData> {
|
|
|
46
47
|
|
|
47
48
|
export interface DeadLetteredJob<TData> extends ListedJob<TData> {
|
|
48
49
|
readonly sourceId: Option.Option<string>;
|
|
49
|
-
readonly sourceOutput:
|
|
50
|
+
readonly sourceOutput: JobFailure | null;
|
|
50
51
|
}
|
|
51
52
|
|
|
52
53
|
export interface JobPageOptions {
|