@kelpie/server 0.13.0 → 0.15.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.
- package/dist/boot.d.ts +9 -0
- package/dist/boot.d.ts.map +1 -1
- package/dist/boot.js +11 -2
- package/dist/boot.js.map +1 -1
- package/dist/index.d.ts +6 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/jobs.d.ts +110 -0
- package/dist/lib/jobs.d.ts.map +1 -0
- package/dist/lib/jobs.js +5 -0
- package/dist/lib/jobs.js.map +1 -0
- package/dist/runtime/jobs.d.ts +63 -0
- package/dist/runtime/jobs.d.ts.map +1 -0
- package/dist/runtime/jobs.js +231 -0
- package/dist/runtime/jobs.js.map +1 -0
- package/dist/runtime/module.d.ts +12 -0
- package/dist/runtime/module.d.ts.map +1 -1
- package/dist/runtime/registry.d.ts +8 -0
- package/dist/runtime/registry.d.ts.map +1 -1
- package/dist/runtime/registry.js +15 -0
- package/dist/runtime/registry.js.map +1 -1
- package/dist/runtime/transaction.d.ts +19 -0
- package/dist/runtime/transaction.d.ts.map +1 -1
- package/dist/runtime/transaction.js +7 -0
- package/dist/runtime/transaction.js.map +1 -1
- package/dist/testing/app.d.ts +7 -0
- package/dist/testing/app.d.ts.map +1 -1
- package/dist/testing/app.js +1 -0
- package/dist/testing/app.js.map +1 -1
- package/dist/testing/database.d.ts +7 -0
- package/dist/testing/database.d.ts.map +1 -1
- package/dist/testing/database.js +26 -2
- package/dist/testing/database.js.map +1 -1
- package/dist/testing/services.d.ts +7 -0
- package/dist/testing/services.d.ts.map +1 -1
- package/dist/testing/services.js +8 -1
- package/dist/testing/services.js.map +1 -1
- package/dist/worker.d.ts +15 -0
- package/dist/worker.d.ts.map +1 -0
- package/dist/worker.js +19 -0
- package/dist/worker.js.map +1 -0
- package/package.json +3 -2
- package/src/boot.ts +20 -2
- package/src/index.ts +17 -0
- package/src/lib/jobs.ts +126 -0
- package/src/runtime/jobs.ts +358 -0
- package/src/runtime/module.ts +12 -0
- package/src/runtime/registry.ts +24 -0
- package/src/runtime/transaction.ts +43 -0
- package/src/testing/app.ts +8 -0
- package/src/testing/database.ts +35 -2
- package/src/testing/services.ts +15 -1
- package/src/worker.ts +20 -0
package/dist/boot.d.ts
CHANGED
|
@@ -4,6 +4,7 @@ import type { IdFactory } from './lib/ids.ts';
|
|
|
4
4
|
import type { KelpieConfigInput } from './lib/kelpieConfigFile.ts';
|
|
5
5
|
import type { Logger } from './lib/logger.ts';
|
|
6
6
|
import type { CredentialDependencies } from './modules/auth/credentials.ts';
|
|
7
|
+
import type { JobsRuntime } from './runtime/jobs.ts';
|
|
7
8
|
import type { ModuleContributions } from './runtime/registry.ts';
|
|
8
9
|
/**
|
|
9
10
|
* A resolved assembly: config parsed, database connected, modules registered.
|
|
@@ -24,6 +25,14 @@ export interface AssemblyBoot {
|
|
|
24
25
|
readonly createId: IdFactory;
|
|
25
26
|
readonly credentials: CredentialDependencies;
|
|
26
27
|
readonly contributions: ModuleContributions;
|
|
28
|
+
/**
|
|
29
|
+
* The pg-boss-backed job runtime the modules registered against. The
|
|
30
|
+
* entry point owns its lifecycle: call `jobs.migrate()` alongside
|
|
31
|
+
* `runMigrations`, `jobs.start()` before serving, and — on the worker —
|
|
32
|
+
* `jobs.startWorking()` right after. `jobs.stop()` drains before
|
|
33
|
+
* `database.close()`.
|
|
34
|
+
*/
|
|
35
|
+
readonly jobs: JobsRuntime;
|
|
27
36
|
}
|
|
28
37
|
/**
|
|
29
38
|
* Resolves an assembly's config, connects the database, and runs the module
|
package/dist/boot.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"boot.d.ts","sourceRoot":"","sources":["../src/boot.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAEhE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AAE3D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAE7C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAA;AAElE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAG7C,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAA;AAG3E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAGhE;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAA;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,CAAA;IACrC,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAA;IAC5B,QAAQ,CAAC,WAAW,EAAE,sBAAsB,CAAA;IAC5C,QAAQ,CAAC,aAAa,EAAE,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"boot.d.ts","sourceRoot":"","sources":["../src/boot.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAEhE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AAE3D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAE7C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAA;AAElE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAG7C,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAA;AAG3E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAEpD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAGhE;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAA;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,CAAA;IACrC,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAA;IAC5B,QAAQ,CAAC,WAAW,EAAE,sBAAsB,CAAA;IAC5C,QAAQ,CAAC,aAAa,EAAE,mBAAmB,CAAA;IAC3C;;;;;;OAMG;IACH,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAA;CAC3B;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,YAAY,CAChC,YAAY,EAAE,iBAAiB,EAC/B,WAAW,EAAE,WAAW,GACvB,OAAO,CAAC,YAAY,CAAC,CA2CvB"}
|
package/dist/boot.js
CHANGED
|
@@ -5,6 +5,7 @@ import { createLogger, createTransportForDestination } from './lib/logger.js';
|
|
|
5
5
|
import { readModuleConfigFile } from './lib/moduleConfig.js';
|
|
6
6
|
import { resolveActorFrom } from './modules/auth/credentials.js';
|
|
7
7
|
import { createEventBus } from './runtime/events.js';
|
|
8
|
+
import { createJobsRuntime } from './runtime/jobs.js';
|
|
8
9
|
import { registerModules } from './runtime/registry.js';
|
|
9
10
|
import { createTransactionScope } from './runtime/transaction.js';
|
|
10
11
|
/**
|
|
@@ -28,6 +29,7 @@ export async function bootAssembly(kelpieConfig, environment) {
|
|
|
28
29
|
});
|
|
29
30
|
const database = connectDatabase(config.databaseUrl, logger);
|
|
30
31
|
const events = createEventBus(logger);
|
|
32
|
+
const jobs = createJobsRuntime({ connectionString: config.databaseUrl, logger });
|
|
31
33
|
const createId = createIdFactory();
|
|
32
34
|
const credentials = { db: database.db, now: () => new Date() };
|
|
33
35
|
const moduleConfig = readModuleConfigFile(config.moduleConfigPath);
|
|
@@ -37,10 +39,17 @@ export async function bootAssembly(kelpieConfig, environment) {
|
|
|
37
39
|
logger,
|
|
38
40
|
events,
|
|
39
41
|
moduleConfig,
|
|
42
|
+
jobs: jobs.registry,
|
|
40
43
|
resolveActor: (context) => resolveActorFrom(credentials, context),
|
|
41
44
|
services: {
|
|
42
45
|
db: database.db,
|
|
43
|
-
transaction: createTransactionScope({
|
|
46
|
+
transaction: createTransactionScope({
|
|
47
|
+
db: database.db,
|
|
48
|
+
bus: events,
|
|
49
|
+
logger,
|
|
50
|
+
createId,
|
|
51
|
+
enqueueOnTx: jobs.enqueueOnTx,
|
|
52
|
+
}),
|
|
44
53
|
createId,
|
|
45
54
|
now: () => new Date(),
|
|
46
55
|
appBaseUrl: config.appBaseUrl,
|
|
@@ -53,6 +62,6 @@ export async function bootAssembly(kelpieConfig, environment) {
|
|
|
53
62
|
// `kelpie.config.ts`. `from` is the address on every outgoing message.
|
|
54
63
|
email: { provider: config.email.EMAIL_PROVIDER, from: config.email.EMAIL_FROM },
|
|
55
64
|
});
|
|
56
|
-
return { config, logger, database, createId, credentials, contributions };
|
|
65
|
+
return { config, logger, database, createId, credentials, contributions, jobs };
|
|
57
66
|
}
|
|
58
67
|
//# sourceMappingURL=boot.js.map
|
package/dist/boot.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"boot.js","sourceRoot":"","sources":["../src/boot.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAEnD,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAE9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAA;AAE/D,OAAO,EAAE,YAAY,EAAE,6BAA6B,EAAE,MAAM,iBAAiB,CAAA;AAE7E,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAA;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAA;AAEhE,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAEvD,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAA;
|
|
1
|
+
{"version":3,"file":"boot.js","sourceRoot":"","sources":["../src/boot.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -3,6 +3,11 @@ export { createApp } from './app.ts';
|
|
|
3
3
|
export type { AppDependencies, AppBindings } from './app.ts';
|
|
4
4
|
export { bootAssembly } from './boot.ts';
|
|
5
5
|
export type { AssemblyBoot } from './boot.ts';
|
|
6
|
+
export { startWorker } from './worker.ts';
|
|
7
|
+
export { createJobsRuntime } from './runtime/jobs.ts';
|
|
8
|
+
export type { JobsRuntime, JobsRuntimeOptions } from './runtime/jobs.ts';
|
|
9
|
+
export { deadLetterQueueName } from './lib/jobs.ts';
|
|
10
|
+
export type { EnqueueOptions, JobContext, JobDefaults, JobDefinition, JobHandle, JobHandler, JobRegistry, TransactionJobs, } from './lib/jobs.ts';
|
|
6
11
|
export { WebBundleError, serveWebBundle } from './webBundle.ts';
|
|
7
12
|
export type { WebBundleOptions } from './webBundle.ts';
|
|
8
13
|
export { ConfigurationError, loadConfig } from './lib/config.ts';
|
|
@@ -41,7 +46,7 @@ export { RECORD_OBJECT_TYPES, checkEventCycle, createEventBus, currentEventChain
|
|
|
41
46
|
export type { AnyEventHandler, CycleGuardOutcome, EventBus, EventBusOptions, EventCatalog, EventChainEntry, EventHandler, EventName, KelpieEventMap, RecordObjectType, SubscribeOptions, } from './runtime/events.ts';
|
|
42
47
|
export type { ModuleEventCatalog } from './runtime/module.ts';
|
|
43
48
|
export { createTransactionScope } from './runtime/transaction.ts';
|
|
44
|
-
export type { BufferedEvents, Transaction, TransactionContext, TransactionOptions, TransactionScope, TransactionScopeDependencies, } from './runtime/transaction.ts';
|
|
49
|
+
export type { BufferedEvents, EnqueueOnTransaction, Transaction, TransactionContext, TransactionOptions, TransactionScope, TransactionScopeDependencies, } from './runtime/transaction.ts';
|
|
45
50
|
export { planMigrations, runMigrations } from './runtime/migrate.ts';
|
|
46
51
|
export type { MigrationPlanStep } from './runtime/migrate.ts';
|
|
47
52
|
export { coreMigrationsDirectory, coreModules } from './modules/core.ts';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -4,6 +4,9 @@
|
|
|
4
4
|
import './modules/eventCatalogs.js';
|
|
5
5
|
export { createApp } from './app.js';
|
|
6
6
|
export { bootAssembly } from './boot.js';
|
|
7
|
+
export { startWorker } from './worker.js';
|
|
8
|
+
export { createJobsRuntime } from './runtime/jobs.js';
|
|
9
|
+
export { deadLetterQueueName } from './lib/jobs.js';
|
|
7
10
|
export { WebBundleError, serveWebBundle } from './webBundle.js';
|
|
8
11
|
export { ConfigurationError, loadConfig } from './lib/config.js';
|
|
9
12
|
export { fromEnv, isFromEnvMarker, resolveMarker, resolveMarkers } from './lib/fromEnv.js';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,6EAA6E;AAC7E,4EAA4E;AAC5E,OAAO,4BAA4B,CAAA;AAEnC,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAGpC,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAGxC,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAG/D,OAAO,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAGhE,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAG1F,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAA;AASnF,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AAGpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AAEvD,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAA;AAEnF,OAAO,EACL,qBAAqB,EACrB,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,EACf,oBAAoB,EACpB,iBAAiB,GAClB,MAAM,mBAAmB,CAAA;AAG1B,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAA;AAE3C,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AAGxE,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAA;AAGjH,OAAO,EAAE,uBAAuB,EAAE,YAAY,EAAE,sBAAsB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAClH,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAE5E,OAAO,EACL,qBAAqB,EACrB,kBAAkB,EAClB,4BAA4B,GAC7B,MAAM,kBAAkB,CAAA;AAGzB,OAAO,EACL,QAAQ,EACR,mBAAmB,EACnB,cAAc,EACd,uBAAuB,EACvB,iBAAiB,EACjB,WAAW,EACX,cAAc,GACf,MAAM,iBAAiB,CAAA;AAUxB,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAG1D,OAAO,EACL,sBAAsB,EACtB,YAAY,EACZ,qBAAqB,EACrB,6BAA6B,GAC9B,MAAM,iBAAiB,CAAA;AAiBxB,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAElE,OAAO,EAAE,yBAAyB,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAA;AAUlG,OAAO,EAAE,WAAW,EAAE,MAAM,qCAAqC,CAAA;AAEjE,OAAO,EACL,mBAAmB,EACnB,eAAe,EACf,cAAc,EACd,iBAAiB,GAClB,MAAM,qBAAqB,CAAA;AAgB5B,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import type { ZodType } from 'zod';
|
|
2
|
+
import type { Logger } from './logger.ts';
|
|
3
|
+
/**
|
|
4
|
+
* The port core runs background work through.
|
|
5
|
+
*
|
|
6
|
+
* A module declares a handle at register time with `context.jobs.define(...)`
|
|
7
|
+
* and enqueues against it from a service. The insert lives inside the same
|
|
8
|
+
* Drizzle transaction as the write it belongs to, so a rolled-back write
|
|
9
|
+
* never leaves an orphan job behind. Handlers run out of process — on the
|
|
10
|
+
* worker entry point, or inline when the API runs its own worker — and see
|
|
11
|
+
* the same payload the caller passed, validated against the module's Zod
|
|
12
|
+
* schema before it reaches user code.
|
|
13
|
+
*
|
|
14
|
+
* The port itself knows nothing about pg-boss. `runtime/jobs.ts` binds it to
|
|
15
|
+
* a real provider at boot; tests bind it to a stub. Nothing outside the
|
|
16
|
+
* runtime imports the provider directly.
|
|
17
|
+
*
|
|
18
|
+
* Why a handle rather than a global name map: consumers of `@kelpie/server`
|
|
19
|
+
* installed from npm lost the `KelpieEventMap` augmentation until every
|
|
20
|
+
* catalog was pulled in from the entry point (see
|
|
21
|
+
* `modules/eventCatalogs.ts`). A handle keeps the payload type on the value
|
|
22
|
+
* the module exports, so `enqueue(handle, data)` typechecks without
|
|
23
|
+
* declaration merging across the package boundary.
|
|
24
|
+
*/
|
|
25
|
+
/**
|
|
26
|
+
* Marker property carrying the handle's payload type. Never assigned at
|
|
27
|
+
* runtime; the `?` on the property makes an untagged plain object satisfy the
|
|
28
|
+
* shape at read time, so a stub handle in a test can be built without
|
|
29
|
+
* `unsafeCast`.
|
|
30
|
+
*/
|
|
31
|
+
declare const JobHandleDataMarker: unique symbol;
|
|
32
|
+
/** A typed reference a module exports after `define()`. */
|
|
33
|
+
export interface JobHandle<Data> {
|
|
34
|
+
readonly name: string;
|
|
35
|
+
readonly [JobHandleDataMarker]?: Data;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Defaults every enqueue on this queue inherits, unless the caller overrides
|
|
39
|
+
* on a per-`enqueue` basis. `localConcurrency` sizes the work loop on the
|
|
40
|
+
* worker; the rest match pg-boss's `QueueOptions` names.
|
|
41
|
+
*
|
|
42
|
+
* `retryDelay` is in seconds. pg-boss's default is 0 (immediate retry).
|
|
43
|
+
* `retryLimit` counts the retries pg-boss does after the first run; a job
|
|
44
|
+
* with `retryLimit: 2` runs at most three times.
|
|
45
|
+
*/
|
|
46
|
+
export interface JobDefaults {
|
|
47
|
+
readonly retryLimit?: number;
|
|
48
|
+
readonly retryDelay?: number;
|
|
49
|
+
readonly retryBackoff?: boolean;
|
|
50
|
+
readonly retryDelayMax?: number;
|
|
51
|
+
readonly expireInSeconds?: number;
|
|
52
|
+
readonly localConcurrency?: number;
|
|
53
|
+
}
|
|
54
|
+
/** Passed to a job handler when a worker picks the job up. */
|
|
55
|
+
export interface JobContext<Data> {
|
|
56
|
+
readonly id: string;
|
|
57
|
+
readonly data: Data;
|
|
58
|
+
readonly log: Logger;
|
|
59
|
+
/** Fires when pg-boss decides the job has expired. Long-running handlers should honour it. */
|
|
60
|
+
readonly signal: AbortSignal;
|
|
61
|
+
}
|
|
62
|
+
export type JobHandler<Data> = (context: JobContext<Data>) => Promise<void>;
|
|
63
|
+
export interface JobDefinition<Data> {
|
|
64
|
+
/**
|
|
65
|
+
* The queue name pg-boss stores against. Must be unique across the
|
|
66
|
+
* assembly; a second `define()` with the same name fails boot.
|
|
67
|
+
*
|
|
68
|
+
* Prefix with the module id — `webhooks.deliver`, `agent-tasks.dispatch` —
|
|
69
|
+
* so operators reading `pgboss.job` see who owns it.
|
|
70
|
+
*/
|
|
71
|
+
readonly name: string;
|
|
72
|
+
/**
|
|
73
|
+
* Parses the payload at handle time before it reaches user code. A job
|
|
74
|
+
* whose payload no longer matches fails, retries, and eventually
|
|
75
|
+
* dead-letters like any other failure.
|
|
76
|
+
*/
|
|
77
|
+
readonly schema: ZodType<Data>;
|
|
78
|
+
readonly handler: JobHandler<Data>;
|
|
79
|
+
readonly defaults?: JobDefaults;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* The registration surface exposed to a module through `context.jobs`. Modules
|
|
83
|
+
* hand a definition in and receive a typed handle to enqueue against.
|
|
84
|
+
*/
|
|
85
|
+
export interface JobRegistry {
|
|
86
|
+
define<Data>(definition: JobDefinition<Data>): JobHandle<Data>;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Options a caller may override per `enqueue`. Deliberately narrow: features
|
|
90
|
+
* beyond retries, a singleton key, and a deferred start are out of scope until
|
|
91
|
+
* a consumer needs them (`crm-brief.md` cost/maintainability trade-offs).
|
|
92
|
+
*/
|
|
93
|
+
export interface EnqueueOptions {
|
|
94
|
+
readonly retryLimit?: number;
|
|
95
|
+
readonly retryBackoff?: boolean;
|
|
96
|
+
readonly singletonKey?: string;
|
|
97
|
+
readonly startAfter?: number | string | Date;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Exposed on the transaction context next to `events`. `enqueue` runs its
|
|
101
|
+
* insert inside the caller's transaction via pg-boss's `fromDrizzle` adapter,
|
|
102
|
+
* so a rollback discards the job with the write.
|
|
103
|
+
*/
|
|
104
|
+
export interface TransactionJobs {
|
|
105
|
+
enqueue<Data>(handle: JobHandle<Data>, data: Data, options?: EnqueueOptions): Promise<string | null>;
|
|
106
|
+
}
|
|
107
|
+
/** The name pg-boss stores the dead-letter queue under, given a handle name. */
|
|
108
|
+
export declare function deadLetterQueueName(jobName: string): string;
|
|
109
|
+
export {};
|
|
110
|
+
//# sourceMappingURL=jobs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jobs.d.ts","sourceRoot":"","sources":["../../src/lib/jobs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,KAAK,CAAA;AAElC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEzC;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH;;;;;GAKG;AACH,OAAO,CAAC,MAAM,mBAAmB,EAAE,OAAO,MAAM,CAAA;AAEhD,2DAA2D;AAC3D,MAAM,WAAW,SAAS,CAAC,IAAI;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,CAAC,mBAAmB,CAAC,CAAC,EAAE,IAAI,CAAA;CACtC;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAA;IAC/B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAA;IAC/B,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAA;IACjC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;CACnC;AAED,8DAA8D;AAC9D,MAAM,WAAW,UAAU,CAAC,IAAI;IAC9B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAA;IACnB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,8FAA8F;IAC9F,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAA;CAC7B;AAED,MAAM,MAAM,UAAU,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,IAAI,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;AAE3E,MAAM,WAAW,aAAa,CAAC,IAAI;IACjC;;;;;;OAMG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB;;;;OAIG;IACH,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;IAC9B,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC,IAAI,CAAC,CAAA;IAClC,QAAQ,CAAC,QAAQ,CAAC,EAAE,WAAW,CAAA;CAChC;AAED;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B,MAAM,CAAC,IAAI,EAAE,UAAU,EAAE,aAAa,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,IAAI,CAAC,CAAA;CAC/D;AAED;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAA;IAC/B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAA;IAC9B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAA;CAC7C;AAED;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC9B,OAAO,CAAC,IAAI,EACV,MAAM,EAAE,SAAS,CAAC,IAAI,CAAC,EACvB,IAAI,EAAE,IAAI,EACV,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAA;CAC1B;AAED,gFAAgF;AAChF,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE3D"}
|
package/dist/lib/jobs.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jobs.js","sourceRoot":"","sources":["../../src/lib/jobs.ts"],"names":[],"mappings":"AA0HA,gFAAgF;AAChF,MAAM,UAAU,mBAAmB,CAAC,OAAe;IACjD,OAAO,GAAG,OAAO,OAAO,CAAA;AAC1B,CAAC"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import type { Logger } from '../lib/logger.ts';
|
|
2
|
+
import type { EnqueueOptions, JobHandle, JobRegistry } from '../lib/jobs.ts';
|
|
3
|
+
import type { Transaction } from './transaction.ts';
|
|
4
|
+
export interface JobsRuntimeOptions {
|
|
5
|
+
readonly connectionString: string;
|
|
6
|
+
readonly logger: Logger;
|
|
7
|
+
/**
|
|
8
|
+
* Polling floor. LISTEN/NOTIFY wakes a worker immediately when a job is
|
|
9
|
+
* inserted via `send()`, but pg-boss's own retry re-insert (inside
|
|
10
|
+
* `fail()`) never notifies, so a retried job is only ever picked up by
|
|
11
|
+
* this poll — as is a fresh job if the listener never opened. Also used
|
|
12
|
+
* as pg-boss's `notifyPollingIntervalSeconds`, so NOTIFY-active queues
|
|
13
|
+
* poll no slower than this either. Default 2s in production; tests pass
|
|
14
|
+
* a shorter value so a retry runs within the test's own budget.
|
|
15
|
+
*/
|
|
16
|
+
readonly pollingIntervalSeconds?: number;
|
|
17
|
+
/**
|
|
18
|
+
* How many workers the runtime spins up per handle when a definition does
|
|
19
|
+
* not override `defaults.localConcurrency`. Matches pg-boss's default.
|
|
20
|
+
*/
|
|
21
|
+
readonly defaultLocalConcurrency?: number;
|
|
22
|
+
}
|
|
23
|
+
export interface JobsRuntime {
|
|
24
|
+
/** The port modules bind to at register time. */
|
|
25
|
+
readonly registry: JobRegistry;
|
|
26
|
+
/** True once `register` has been called with this name. Used by tests. */
|
|
27
|
+
hasHandle(name: string): boolean;
|
|
28
|
+
/**
|
|
29
|
+
* Applies pg-boss's own schema migration. Idempotent: safe to run on every
|
|
30
|
+
* boot. Uses a throwaway `PgBoss` in `migrate: true, createSchema: true`
|
|
31
|
+
* mode, matching the release-command flow the cloud runs.
|
|
32
|
+
*/
|
|
33
|
+
migrate(): Promise<void>;
|
|
34
|
+
/**
|
|
35
|
+
* Opens the persistent pg-boss instance and declares every registered
|
|
36
|
+
* queue plus its dead-letter counterpart. Must run before `enqueueOnTx`
|
|
37
|
+
* or `startWorking`. `migrate: false` here: `migrate()` above owns that
|
|
38
|
+
* step, so instances never race the migration.
|
|
39
|
+
*/
|
|
40
|
+
start(): Promise<void>;
|
|
41
|
+
/**
|
|
42
|
+
* Starts the `work()` loop for every registered handle. The worker entry
|
|
43
|
+
* point calls this; the API calls it too unless `--no-worker` is set.
|
|
44
|
+
* Handler errors are logged and rethrown so pg-boss retries or
|
|
45
|
+
* dead-letters the job.
|
|
46
|
+
*/
|
|
47
|
+
startWorking(): Promise<void>;
|
|
48
|
+
/**
|
|
49
|
+
* Enqueues a job on the caller's transaction via `fromDrizzle(tx, sql)`.
|
|
50
|
+
* The insert commits with the surrounding write; a rollback discards it.
|
|
51
|
+
* Rejects when no `handle` was registered for `name` (this would be a
|
|
52
|
+
* boot-time bug, not a runtime one).
|
|
53
|
+
*/
|
|
54
|
+
enqueueOnTx<Data>(tx: Transaction, handle: JobHandle<Data>, data: Data, options?: EnqueueOptions): Promise<string | null>;
|
|
55
|
+
/**
|
|
56
|
+
* Drains in-flight work and closes the pg-boss instance. `offWork({wait:
|
|
57
|
+
* true})` awaits every handler mid-flight; `boss.stop` then tears down
|
|
58
|
+
* the connection pool.
|
|
59
|
+
*/
|
|
60
|
+
stop(): Promise<void>;
|
|
61
|
+
}
|
|
62
|
+
export declare function createJobsRuntime(options: JobsRuntimeOptions): JobsRuntime;
|
|
63
|
+
//# sourceMappingURL=jobs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jobs.d.ts","sourceRoot":"","sources":["../../src/runtime/jobs.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,KAAK,EACV,cAAc,EAGd,SAAS,EACT,WAAW,EACZ,MAAM,gBAAgB,CAAA;AAEvB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAqCnD,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAA;IACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB;;;;;;;;OAQG;IACH,QAAQ,CAAC,sBAAsB,CAAC,EAAE,MAAM,CAAA;IACxC;;;OAGG;IACH,QAAQ,CAAC,uBAAuB,CAAC,EAAE,MAAM,CAAA;CAC1C;AAED,MAAM,WAAW,WAAW;IAC1B,iDAAiD;IACjD,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAA;IAC9B,0EAA0E;IAC1E,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAA;IAChC;;;;OAIG;IACH,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IACxB;;;;;OAKG;IACH,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IACtB;;;;;OAKG;IACH,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IAC7B;;;;;OAKG;IACH,WAAW,CAAC,IAAI,EACd,EAAE,EAAE,WAAW,EACf,MAAM,EAAE,SAAS,CAAC,IAAI,CAAC,EACvB,IAAI,EAAE,IAAI,EACV,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAA;IACzB;;;;OAIG;IACH,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CACtB;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,kBAAkB,GAAG,WAAW,CAiP1E"}
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
import { sql } from 'drizzle-orm';
|
|
2
|
+
import { PgBoss, fromDrizzle } from 'pg-boss';
|
|
3
|
+
import { describeThrown } from '../lib/errors.js';
|
|
4
|
+
import { deadLetterQueueName } from '../lib/jobs.js';
|
|
5
|
+
/**
|
|
6
|
+
* The pg-boss provider that binds the job port defined in `lib/jobs.ts` to a
|
|
7
|
+
* real Postgres-backed queue.
|
|
8
|
+
*
|
|
9
|
+
* Two phases:
|
|
10
|
+
*
|
|
11
|
+
* 1. Registration, at boot. Modules call `context.jobs.define(...)` during
|
|
12
|
+
* `register`. The registry records the definition (fails boot on a
|
|
13
|
+
* duplicate name) and returns the handle. Nothing touches the database
|
|
14
|
+
* yet.
|
|
15
|
+
* 2. `start()`, from the entry point. Opens the pg-boss instance, primes the
|
|
16
|
+
* queue cache, and calls `createQueue` for every registered handle plus
|
|
17
|
+
* its dead-letter queue. Idempotent (`create_queue` upserts).
|
|
18
|
+
*
|
|
19
|
+
* The API and the worker both call `start()`: the API needs a boss instance
|
|
20
|
+
* to insert jobs on request-scoped transactions; the worker adds a
|
|
21
|
+
* `startWorking()` step that runs `work()` per handle.
|
|
22
|
+
*
|
|
23
|
+
* @see modules.md for how jobs sit next to the event bus.
|
|
24
|
+
*/
|
|
25
|
+
/**
|
|
26
|
+
* The pg-boss schema name. Fixed here rather than configurable per assembly:
|
|
27
|
+
* self-hosters run one Postgres per Kelpie install and would gain nothing
|
|
28
|
+
* from renaming the schema.
|
|
29
|
+
*/
|
|
30
|
+
const PGBOSS_SCHEMA = 'pgboss';
|
|
31
|
+
const DEFAULT_LOCAL_CONCURRENCY = 5;
|
|
32
|
+
export function createJobsRuntime(options) {
|
|
33
|
+
const registered = new Map();
|
|
34
|
+
// Tracks which handles have had `createQueue` run and which have had
|
|
35
|
+
// `work()` called, so a runtime that registers a fresh handle after
|
|
36
|
+
// `start()` (a test that adds one mid-suite) still gets its queue built
|
|
37
|
+
// and its worker started without redoing the ones already up.
|
|
38
|
+
const queuesCreated = new Set();
|
|
39
|
+
const workersStarted = new Set();
|
|
40
|
+
let boss;
|
|
41
|
+
function requireBoss() {
|
|
42
|
+
if (boss === undefined) {
|
|
43
|
+
throw new Error('jobs runtime used before start(): call jobs.start() at boot');
|
|
44
|
+
}
|
|
45
|
+
return boss;
|
|
46
|
+
}
|
|
47
|
+
const registry = {
|
|
48
|
+
define(definition) {
|
|
49
|
+
if (registered.has(definition.name)) {
|
|
50
|
+
throw new Error(`job "${definition.name}" is defined twice`);
|
|
51
|
+
}
|
|
52
|
+
const handle = { name: definition.name };
|
|
53
|
+
registered.set(definition.name, {
|
|
54
|
+
definition: definition,
|
|
55
|
+
handle: handle,
|
|
56
|
+
});
|
|
57
|
+
return handle;
|
|
58
|
+
},
|
|
59
|
+
};
|
|
60
|
+
async function migrate() {
|
|
61
|
+
// A throwaway instance in migrate/createSchema mode. Cheaper than
|
|
62
|
+
// vendoring the SQL: pg-boss owns its schema, and `getConstructionPlans`
|
|
63
|
+
// / `getMigrationPlans` produce statements we would just execute in the
|
|
64
|
+
// same order the library does itself. `supervise: false, schedule: false`
|
|
65
|
+
// keeps the instance from spawning any background work while it lives.
|
|
66
|
+
const migrator = new PgBoss({
|
|
67
|
+
connectionString: options.connectionString,
|
|
68
|
+
schema: PGBOSS_SCHEMA,
|
|
69
|
+
migrate: true,
|
|
70
|
+
createSchema: true,
|
|
71
|
+
supervise: false,
|
|
72
|
+
schedule: false,
|
|
73
|
+
});
|
|
74
|
+
try {
|
|
75
|
+
await migrator.start();
|
|
76
|
+
}
|
|
77
|
+
finally {
|
|
78
|
+
await migrator.stop({ graceful: false, close: true, timeout: 5_000 });
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
async function ensureQueuesFor(instance) {
|
|
82
|
+
for (const { definition } of registered.values()) {
|
|
83
|
+
if (queuesCreated.has(definition.name)) {
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
const deadLetter = deadLetterQueueName(definition.name);
|
|
87
|
+
// Dead letter queue must exist before the main queue references it.
|
|
88
|
+
await instance.createQueue(deadLetter, {
|
|
89
|
+
policy: 'standard',
|
|
90
|
+
notify: false,
|
|
91
|
+
});
|
|
92
|
+
await instance.createQueue(definition.name, {
|
|
93
|
+
policy: 'standard',
|
|
94
|
+
deadLetter,
|
|
95
|
+
notify: true,
|
|
96
|
+
...(definition.defaults?.retryLimit === undefined
|
|
97
|
+
? {}
|
|
98
|
+
: { retryLimit: definition.defaults.retryLimit }),
|
|
99
|
+
...(definition.defaults?.retryDelay === undefined
|
|
100
|
+
? {}
|
|
101
|
+
: { retryDelay: definition.defaults.retryDelay }),
|
|
102
|
+
...(definition.defaults?.retryBackoff === undefined
|
|
103
|
+
? {}
|
|
104
|
+
: { retryBackoff: definition.defaults.retryBackoff }),
|
|
105
|
+
...(definition.defaults?.retryDelayMax === undefined
|
|
106
|
+
? {}
|
|
107
|
+
: { retryDelayMax: definition.defaults.retryDelayMax }),
|
|
108
|
+
...(definition.defaults?.expireInSeconds === undefined
|
|
109
|
+
? {}
|
|
110
|
+
: { expireInSeconds: definition.defaults.expireInSeconds }),
|
|
111
|
+
});
|
|
112
|
+
queuesCreated.add(definition.name);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
async function start() {
|
|
116
|
+
if (boss === undefined) {
|
|
117
|
+
const instance = new PgBoss({
|
|
118
|
+
connectionString: options.connectionString,
|
|
119
|
+
schema: PGBOSS_SCHEMA,
|
|
120
|
+
migrate: false,
|
|
121
|
+
createSchema: false,
|
|
122
|
+
supervise: false,
|
|
123
|
+
schedule: false,
|
|
124
|
+
useListenNotify: true,
|
|
125
|
+
});
|
|
126
|
+
instance.on('error', (error) => {
|
|
127
|
+
options.logger.error('pg-boss error', { error: describeThrown(error) });
|
|
128
|
+
});
|
|
129
|
+
await instance.start();
|
|
130
|
+
boss = instance;
|
|
131
|
+
}
|
|
132
|
+
await ensureQueuesFor(boss);
|
|
133
|
+
}
|
|
134
|
+
async function startWorking() {
|
|
135
|
+
const instance = requireBoss();
|
|
136
|
+
const pollingIntervalSeconds = options.pollingIntervalSeconds ?? 2;
|
|
137
|
+
const defaultLocalConcurrency = options.defaultLocalConcurrency ?? DEFAULT_LOCAL_CONCURRENCY;
|
|
138
|
+
for (const { definition } of registered.values()) {
|
|
139
|
+
if (workersStarted.has(definition.name)) {
|
|
140
|
+
continue;
|
|
141
|
+
}
|
|
142
|
+
const localConcurrency = definition.defaults?.localConcurrency ?? defaultLocalConcurrency;
|
|
143
|
+
await instance.work(definition.name, {
|
|
144
|
+
batchSize: 1,
|
|
145
|
+
localConcurrency,
|
|
146
|
+
pollingIntervalSeconds,
|
|
147
|
+
notifyPollingIntervalSeconds: pollingIntervalSeconds,
|
|
148
|
+
}, async (batch) => {
|
|
149
|
+
const job = batch[0];
|
|
150
|
+
if (job === undefined) {
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
const parsed = definition.schema.safeParse(job.data);
|
|
154
|
+
if (!parsed.success) {
|
|
155
|
+
options.logger.error('job payload rejected by schema', {
|
|
156
|
+
job: definition.name,
|
|
157
|
+
id: job.id,
|
|
158
|
+
issues: parsed.error.issues,
|
|
159
|
+
});
|
|
160
|
+
throw new Error(`job "${definition.name}" payload does not match its schema: ${parsed.error.issues
|
|
161
|
+
.map((issue) => issue.message)
|
|
162
|
+
.join('; ')}`);
|
|
163
|
+
}
|
|
164
|
+
const jobLogger = options.logger.child({ job: definition.name, jobId: job.id });
|
|
165
|
+
const context = {
|
|
166
|
+
id: job.id,
|
|
167
|
+
data: parsed.data,
|
|
168
|
+
log: jobLogger,
|
|
169
|
+
signal: job.signal,
|
|
170
|
+
};
|
|
171
|
+
try {
|
|
172
|
+
await definition.handler(context);
|
|
173
|
+
}
|
|
174
|
+
catch (error) {
|
|
175
|
+
jobLogger.error('job handler failed', { error: describeThrown(error) });
|
|
176
|
+
throw error;
|
|
177
|
+
}
|
|
178
|
+
});
|
|
179
|
+
workersStarted.add(definition.name);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
async function enqueueOnTx(tx, handle, data, enqueueOptions = {}) {
|
|
183
|
+
const instance = requireBoss();
|
|
184
|
+
const entry = registered.get(handle.name);
|
|
185
|
+
if (entry === undefined) {
|
|
186
|
+
throw new Error(`enqueue for unregistered job "${handle.name}"`);
|
|
187
|
+
}
|
|
188
|
+
return instance.send(handle.name, data, {
|
|
189
|
+
db: fromDrizzle(tx, sql),
|
|
190
|
+
...(enqueueOptions.retryLimit === undefined ? {} : { retryLimit: enqueueOptions.retryLimit }),
|
|
191
|
+
...(enqueueOptions.retryBackoff === undefined
|
|
192
|
+
? {}
|
|
193
|
+
: { retryBackoff: enqueueOptions.retryBackoff }),
|
|
194
|
+
...(enqueueOptions.singletonKey === undefined
|
|
195
|
+
? {}
|
|
196
|
+
: { singletonKey: enqueueOptions.singletonKey }),
|
|
197
|
+
...(enqueueOptions.startAfter === undefined ? {} : { startAfter: enqueueOptions.startAfter }),
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
async function stop() {
|
|
201
|
+
const instance = boss;
|
|
202
|
+
if (instance === undefined) {
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
for (const name of workersStarted) {
|
|
206
|
+
try {
|
|
207
|
+
await instance.offWork(name, { wait: true });
|
|
208
|
+
}
|
|
209
|
+
catch (error) {
|
|
210
|
+
options.logger.error('offWork failed', {
|
|
211
|
+
job: name,
|
|
212
|
+
error: describeThrown(error),
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
workersStarted.clear();
|
|
217
|
+
await instance.stop({ graceful: true, close: true, timeout: 30_000 });
|
|
218
|
+
boss = undefined;
|
|
219
|
+
queuesCreated.clear();
|
|
220
|
+
}
|
|
221
|
+
return {
|
|
222
|
+
registry,
|
|
223
|
+
hasHandle: (name) => registered.has(name),
|
|
224
|
+
migrate,
|
|
225
|
+
start,
|
|
226
|
+
startWorking,
|
|
227
|
+
enqueueOnTx,
|
|
228
|
+
stop,
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
//# sourceMappingURL=jobs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jobs.js","sourceRoot":"","sources":["../../src/runtime/jobs.ts"],"names":[],"mappings":"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"}
|
package/dist/runtime/module.d.ts
CHANGED
|
@@ -4,6 +4,7 @@ import type { Actor } from '../lib/actor.ts';
|
|
|
4
4
|
import type { Database } from '../lib/database.ts';
|
|
5
5
|
import type { EmailSender } from '../lib/email.ts';
|
|
6
6
|
import type { IdFactory } from '../lib/ids.ts';
|
|
7
|
+
import type { JobRegistry } from '../lib/jobs.ts';
|
|
7
8
|
import type { Logger } from '../lib/logger.ts';
|
|
8
9
|
import type { SecretEncryptionConfig } from '../lib/secrets.ts';
|
|
9
10
|
import type { EntitlementRegistry } from './entitlements.ts';
|
|
@@ -225,6 +226,17 @@ export interface ModuleContext extends ModuleServices {
|
|
|
225
226
|
* commits, and must be idempotent.
|
|
226
227
|
*/
|
|
227
228
|
readonly events: EventBus;
|
|
229
|
+
/**
|
|
230
|
+
* Declares a background job. Modules call `context.jobs.define(...)` at
|
|
231
|
+
* register time and receive a typed handle to enqueue against. The insert
|
|
232
|
+
* lives inside the caller's transaction (`services.transaction`) so a
|
|
233
|
+
* rollback discards the job.
|
|
234
|
+
*
|
|
235
|
+
* A second `define` with the same name fails boot. Handlers run out of
|
|
236
|
+
* process on the worker entry point, or inline when the API runs its own
|
|
237
|
+
* worker.
|
|
238
|
+
*/
|
|
239
|
+
readonly jobs: JobRegistry;
|
|
228
240
|
/**
|
|
229
241
|
* Declare capabilities and check grants. Every check is granted and unlimited
|
|
230
242
|
* until a module registers a provider.
|