@adonis-agora/durable 0.47.0 → 0.49.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/CHANGELOG.md +55 -0
- package/dist/assets/spa/assets/index-6nmSTfT7.css +1 -0
- package/dist/assets/spa/assets/index-DdB9zxuX.js +16 -0
- package/dist/assets/spa/assets/index-DdB9zxuX.js.map +1 -0
- package/dist/assets/spa/index.html +2 -2
- package/dist/configure.d.ts.map +1 -1
- package/dist/configure.js +1 -0
- package/dist/configure.js.map +1 -1
- package/dist/providers/dashboard_provider.d.ts +3 -1
- package/dist/providers/dashboard_provider.d.ts.map +1 -1
- package/dist/providers/dashboard_provider.js +7 -2
- package/dist/providers/dashboard_provider.js.map +1 -1
- package/dist/providers/durable_provider.d.ts +0 -25
- package/dist/providers/durable_provider.d.ts.map +1 -1
- package/dist/providers/durable_provider.js +30 -5
- package/dist/providers/durable_provider.js.map +1 -1
- package/dist/src/codec-state-store.d.ts +2 -0
- package/dist/src/codec-state-store.d.ts.map +1 -1
- package/dist/src/codec-state-store.js +6 -0
- package/dist/src/codec-state-store.js.map +1 -1
- package/dist/src/completion.d.ts +11 -0
- package/dist/src/completion.d.ts.map +1 -1
- package/dist/src/completion.js +18 -1
- package/dist/src/completion.js.map +1 -1
- package/dist/src/dashboard/gateway-adapter.d.ts.map +1 -1
- package/dist/src/dashboard/gateway-adapter.js +10 -0
- package/dist/src/dashboard/gateway-adapter.js.map +1 -1
- package/dist/src/dashboard/handlers.d.ts +22 -1
- package/dist/src/dashboard/handlers.d.ts.map +1 -1
- package/dist/src/dashboard/handlers.js +63 -10
- package/dist/src/dashboard/handlers.js.map +1 -1
- package/dist/src/dashboard/index.d.ts +1 -1
- package/dist/src/dashboard/index.js +1 -1
- package/dist/src/dashboard/openapi.d.ts.map +1 -1
- package/dist/src/dashboard/openapi.js +26 -2
- package/dist/src/dashboard/openapi.js.map +1 -1
- package/dist/src/define_config.d.ts +6 -0
- package/dist/src/define_config.d.ts.map +1 -1
- package/dist/src/define_config.js.map +1 -1
- package/dist/src/engine.d.ts +89 -3
- package/dist/src/engine.d.ts.map +1 -1
- package/dist/src/engine.js +448 -39
- package/dist/src/engine.js.map +1 -1
- package/dist/src/errors.d.ts +30 -12
- package/dist/src/errors.d.ts.map +1 -1
- package/dist/src/errors.js +17 -8
- package/dist/src/errors.js.map +1 -1
- package/dist/src/fan-join.d.ts +36 -6
- package/dist/src/fan-join.d.ts.map +1 -1
- package/dist/src/fan-join.js +63 -8
- package/dist/src/fan-join.js.map +1 -1
- package/dist/src/handshake/announced.d.ts +94 -0
- package/dist/src/handshake/announced.d.ts.map +1 -0
- package/dist/src/handshake/announced.js +113 -0
- package/dist/src/handshake/announced.js.map +1 -0
- package/dist/src/handshake/descriptor.d.ts +59 -0
- package/dist/src/handshake/descriptor.d.ts.map +1 -1
- package/dist/src/handshake/descriptor.js +38 -0
- package/dist/src/handshake/descriptor.js.map +1 -1
- package/dist/src/index.d.ts +6 -3
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +5 -2
- package/dist/src/index.js.map +1 -1
- package/dist/src/interfaces.d.ts +85 -4
- package/dist/src/interfaces.d.ts.map +1 -1
- package/dist/src/interfaces.js.map +1 -1
- package/dist/src/metrics.d.ts +5 -0
- package/dist/src/metrics.d.ts.map +1 -1
- package/dist/src/metrics.js +14 -1
- package/dist/src/metrics.js.map +1 -1
- package/dist/src/on-error.d.ts +59 -0
- package/dist/src/on-error.d.ts.map +1 -0
- package/dist/src/on-error.js +71 -0
- package/dist/src/on-error.js.map +1 -0
- package/dist/src/otel/durable-metrics.d.ts +6 -0
- package/dist/src/otel/durable-metrics.d.ts.map +1 -1
- package/dist/src/otel/durable-metrics.js +22 -2
- package/dist/src/otel/durable-metrics.js.map +1 -1
- package/dist/src/otel/durable-otel.d.ts.map +1 -1
- package/dist/src/otel/durable-otel.js +15 -0
- package/dist/src/otel/durable-otel.js.map +1 -1
- package/dist/src/protocol.d.ts.map +1 -1
- package/dist/src/protocol.js +1 -0
- package/dist/src/protocol.js.map +1 -1
- package/dist/src/run-detail-summary.d.ts +98 -0
- package/dist/src/run-detail-summary.d.ts.map +1 -0
- package/dist/src/run-detail-summary.js +150 -0
- package/dist/src/run-detail-summary.js.map +1 -0
- package/dist/src/run-gateway/interface.d.ts +11 -0
- package/dist/src/run-gateway/interface.d.ts.map +1 -1
- package/dist/src/run-gateway/proxy-run-gateway.d.ts +3 -0
- package/dist/src/run-gateway/proxy-run-gateway.d.ts.map +1 -1
- package/dist/src/run-gateway/proxy-run-gateway.js +8 -0
- package/dist/src/run-gateway/proxy-run-gateway.js.map +1 -1
- package/dist/src/run-gateway/run-request-responder.d.ts +4 -3
- package/dist/src/run-gateway/run-request-responder.d.ts.map +1 -1
- package/dist/src/run-gateway/run-request-responder.js +23 -3
- package/dist/src/run-gateway/run-request-responder.js.map +1 -1
- package/dist/src/run-gateway/store-run-gateway.d.ts +3 -0
- package/dist/src/run-gateway/store-run-gateway.d.ts.map +1 -1
- package/dist/src/run-gateway/store-run-gateway.js +7 -0
- package/dist/src/run-gateway/store-run-gateway.js.map +1 -1
- package/dist/src/stores/lucid.d.ts +1 -0
- package/dist/src/stores/lucid.d.ts.map +1 -1
- package/dist/src/stores/lucid.js +17 -4
- package/dist/src/stores/lucid.js.map +1 -1
- package/dist/src/testing/in-memory-state-store.d.ts +1 -0
- package/dist/src/testing/in-memory-state-store.d.ts.map +1 -1
- package/dist/src/testing/in-memory-state-store.js +14 -6
- package/dist/src/testing/in-memory-state-store.js.map +1 -1
- package/dist/src/testing-kit/state-store-conformance.d.ts.map +1 -1
- package/dist/src/testing-kit/state-store-conformance.js +59 -0
- package/dist/src/testing-kit/state-store-conformance.js.map +1 -1
- package/dist/src/transports/bullmq/adaptive-concurrency.d.ts +144 -0
- package/dist/src/transports/bullmq/adaptive-concurrency.d.ts.map +1 -0
- package/dist/src/transports/bullmq/adaptive-concurrency.js +312 -0
- package/dist/src/transports/bullmq/adaptive-concurrency.js.map +1 -0
- package/dist/src/transports/bullmq/bullmq-transport.d.ts +18 -1
- package/dist/src/transports/bullmq/bullmq-transport.d.ts.map +1 -1
- package/dist/src/transports/bullmq/bullmq-transport.js +50 -49
- package/dist/src/transports/bullmq/bullmq-transport.js.map +1 -1
- package/dist/src/transports/bullmq/deps.d.ts +11 -1
- package/dist/src/transports/bullmq/deps.d.ts.map +1 -1
- package/dist/src/transports/bullmq/deps.js +12 -1
- package/dist/src/transports/bullmq/deps.js.map +1 -1
- package/dist/src/transports/bullmq/index.d.ts +1 -0
- package/dist/src/transports/bullmq/index.d.ts.map +1 -1
- package/dist/src/transports/bullmq/index.js +1 -0
- package/dist/src/transports/bullmq/index.js.map +1 -1
- package/dist/src/transports/db-schema.d.ts +12 -0
- package/dist/src/transports/db-schema.d.ts.map +1 -1
- package/dist/src/transports/db-schema.js +24 -0
- package/dist/src/transports/db-schema.js.map +1 -1
- package/dist/src/transports/db.d.ts +14 -0
- package/dist/src/transports/db.d.ts.map +1 -1
- package/dist/src/transports/db.js +34 -0
- package/dist/src/transports/db.js.map +1 -1
- package/dist/src/transports/event-emitter.d.ts +8 -0
- package/dist/src/transports/event-emitter.d.ts.map +1 -1
- package/dist/src/transports/event-emitter.js +27 -0
- package/dist/src/transports/event-emitter.js.map +1 -1
- package/dist/src/transports/factory.d.ts +33 -2
- package/dist/src/transports/factory.d.ts.map +1 -1
- package/dist/src/transports/factory.js +29 -1
- package/dist/src/transports/factory.js.map +1 -1
- package/dist/src/transports/queue.d.ts +19 -0
- package/dist/src/transports/queue.d.ts.map +1 -1
- package/dist/src/transports/queue.js +17 -0
- package/dist/src/transports/queue.js.map +1 -1
- package/dist/src/transports/worker-keys-db.d.ts +17 -0
- package/dist/src/transports/worker-keys-db.d.ts.map +1 -0
- package/dist/src/transports/worker-keys-db.js +43 -0
- package/dist/src/transports/worker-keys-db.js.map +1 -0
- package/dist/src/transports/worker-keys.d.ts +56 -0
- package/dist/src/transports/worker-keys.d.ts.map +1 -0
- package/dist/src/transports/worker-keys.js +92 -0
- package/dist/src/transports/worker-keys.js.map +1 -0
- package/dist/src/worker-runtime/index.d.ts +1 -1
- package/dist/src/worker-runtime/index.d.ts.map +1 -1
- package/dist/src/worker-runtime/index.js.map +1 -1
- package/dist/src/worker-runtime/worker-runtime.d.ts +7 -2
- package/dist/src/worker-runtime/worker-runtime.d.ts.map +1 -1
- package/dist/src/worker-runtime/worker-runtime.js +22 -20
- package/dist/src/worker-runtime/worker-runtime.js.map +1 -1
- package/dist/src/workflow-ctx.d.ts +13 -1
- package/dist/src/workflow-ctx.d.ts.map +1 -1
- package/dist/src/workflow-ctx.js +44 -6
- package/dist/src/workflow-ctx.js.map +1 -1
- package/dist/src/workflow-discovery.d.ts.map +1 -1
- package/dist/src/workflow-discovery.js +2 -1
- package/dist/src/workflow-discovery.js.map +1 -1
- package/dist/src/workflow-ref.d.ts +31 -0
- package/dist/src/workflow-ref.d.ts.map +1 -1
- package/dist/src/workflow-ref.js +22 -0
- package/dist/src/workflow-ref.js.map +1 -1
- package/dist/stubs/database/migrations/create_durable_transport_worker_keys.stub +24 -0
- package/package.json +5 -5
- package/skills/durable-cluster/SKILL.md +10 -0
- package/skills/durable-transports-stores/SKILL.md +37 -0
- package/skills/durable-workflows/SKILL.md +22 -1
- package/dist/assets/spa/assets/index-CL6q2kMB.js +0 -16
- package/dist/assets/spa/assets/index-CL6q2kMB.js.map +0 -1
- package/dist/assets/spa/assets/index-DU6cGcJz.css +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflow-discovery.d.ts","sourceRoot":"","sources":["../../src/workflow-discovery.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD,OAAO,
|
|
1
|
+
{"version":3,"file":"workflow-discovery.d.ts","sourceRoot":"","sources":["../../src/workflow-discovery.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD,OAAO,EAEL,KAAK,YAAY,EAGlB,MAAM,mBAAmB,CAAC;AAE3B;;;;;;;GAOG;AACH,MAAM,MAAM,uBAAuB,GAAG,UAAU;IAC9C,GAAG,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;CAC/D,CAAC;AAEF;2CAC2C;AAC3C,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,YAAY,CAAC;IACnB,GAAG,EAAE,uBAAuB,CAAC;CAC9B;AAED;;;;;;GAMG;AACH,MAAM,MAAM,oBAAoB,GAAG,CACjC,IAAI,EAAE,uBAAuB,KAC1B,uBAAuB,CAAC,WAAW,CAAC,GAAG,OAAO,CAAC,uBAAuB,CAAC,WAAW,CAAC,CAAC,CAAC;AAQ1F;;;;;;;;;;GAUG;AACH,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,cAAc,EACtB,GAAG,EAAE,OAAO,EACZ,OAAO,GAAE,oBAA6C,GACrD,OAAO,CAAC,OAAO,CAAC,CAmClB;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,GAAG,KAAK,GAAG,KAAK,GAAG,IAAI,CAY9E;AAED;;;;;;;;;GASG;AACH,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAyBlF;AAED;;;;GAIG;AACH,wBAAsB,wBAAwB,CAC5C,MAAM,EAAE,cAAc,EACtB,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,YAAY,EAAE,CAAC,CAIzB;AAED;;;;;;GAMG;AACH,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;AAErF;;;;;;;GAOG;AACH,wBAAsB,2BAA2B,CAC/C,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,eAAe,EACvB,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,YAAY,EAAE,CAAC,CAezB"}
|
|
@@ -2,7 +2,7 @@ import { readdir } from 'node:fs/promises';
|
|
|
2
2
|
import { extname, join } from 'node:path';
|
|
3
3
|
import { pathToFileURL } from 'node:url';
|
|
4
4
|
import { eventTriggerCanonicalName, workflowEvents } from './workflow-events.js';
|
|
5
|
-
import { workflowMeta, workflowSchedules } from './workflow-ref.js';
|
|
5
|
+
import { onErrorRoutesOf, workflowMeta, workflowSchedules, } from './workflow-ref.js';
|
|
6
6
|
function defaultWorkflowFactory(ctor) {
|
|
7
7
|
return new ctor();
|
|
8
8
|
}
|
|
@@ -41,6 +41,7 @@ export async function registerWorkflowClass(engine, cls, factory = defaultWorkfl
|
|
|
41
41
|
...(meta.singleton ? { singleton: meta.singleton } : {}),
|
|
42
42
|
...(meta.concurrency ? { concurrency: meta.concurrency } : {}),
|
|
43
43
|
...(meta.origin ? { origin: meta.origin } : {}),
|
|
44
|
+
...(meta.onError?.length ? { onError: onErrorRoutesOf(meta) } : {}),
|
|
44
45
|
});
|
|
45
46
|
// Collect any colocated `static schedule` on the class so the worker loop can fire it alongside the
|
|
46
47
|
// config schedules. Both discovery paths (dir scan + generated barrel) funnel through here, so this
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflow-discovery.js","sourceRoot":"","sources":["../../src/workflow-discovery.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,yBAAyB,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACjF,OAAO,
|
|
1
|
+
{"version":3,"file":"workflow-discovery.js","sourceRoot":"","sources":["../../src/workflow-discovery.ts"],"names":[],"mappings":"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"}
|
|
@@ -44,6 +44,19 @@ export interface WorkflowOptions {
|
|
|
44
44
|
* facet; omit for an app-local workflow (renders as "unknown" until attributed).
|
|
45
45
|
*/
|
|
46
46
|
origin?: string;
|
|
47
|
+
/**
|
|
48
|
+
* Route failed runs to a handler workflow by error `code`, instead of failing them: when a run ends
|
|
49
|
+
* `failed` with a matching code, the engine starts `workflow` with an `OnErrorInput`
|
|
50
|
+
* (`{ runId, workflow, input, error }`), the run waits for it, and settles with its outcome. `code`
|
|
51
|
+
* is a string or an error class with a `static code`; omit it for the catch-all. e.g.
|
|
52
|
+
* `onError: [{ code: InvalidLine, workflow: LineDeadLetterWorkflow }]`.
|
|
53
|
+
*/
|
|
54
|
+
onError?: {
|
|
55
|
+
code?: string | {
|
|
56
|
+
readonly code: string;
|
|
57
|
+
};
|
|
58
|
+
workflow: WorkflowRef;
|
|
59
|
+
}[];
|
|
47
60
|
}
|
|
48
61
|
/** The metadata read off a workflow class's `static workflow` config for discovery + registration. */
|
|
49
62
|
export interface WorkflowMeta extends WorkflowOptions {
|
|
@@ -113,4 +126,22 @@ export type WorkflowOutputOf<C> = C extends abstract new (...args: never[]) => {
|
|
|
113
126
|
* no `static workflow` config (so it has no registered name).
|
|
114
127
|
*/
|
|
115
128
|
export declare function workflowName(ref: WorkflowRef): string;
|
|
129
|
+
/** A class's `onError` routes, with class refs resolved to names and error classes to their codes. */
|
|
130
|
+
export declare function onErrorRoutesOf(meta: WorkflowOptions): {
|
|
131
|
+
code?: string;
|
|
132
|
+
workflow: string;
|
|
133
|
+
}[];
|
|
134
|
+
/**
|
|
135
|
+
* What a worker announces about a workflow class it runs (design §7.9): its version, declaring package
|
|
136
|
+
* and onError routes — pass it as `WorkerRuntime.registerWorkflow`'s `meta`. Undefined for a class
|
|
137
|
+
* carrying no `static workflow` config.
|
|
138
|
+
*/
|
|
139
|
+
export declare function workflowAnnouncement(target: unknown): {
|
|
140
|
+
version: string;
|
|
141
|
+
origin?: string;
|
|
142
|
+
onError?: {
|
|
143
|
+
code?: string;
|
|
144
|
+
workflow: string;
|
|
145
|
+
}[];
|
|
146
|
+
} | undefined;
|
|
116
147
|
//# sourceMappingURL=workflow-ref.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflow-ref.d.ts","sourceRoot":"","sources":["../../src/workflow-ref.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,KAAK,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAEhF,2GAA2G;AAC3G,MAAM,WAAW,eAAe;IAC9B,+EAA+E;IAC/E,IAAI,EAAE,MAAM,CAAC;IACb,yFAAyF;IACzF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gEAAgE;IAChE,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,kFAAkF;IAClF,gBAAgB,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACnC,oFAAoF;IACpF,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB;;;;;;;;OAQG;IACH,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B;;;;;;OAMG;IACH,WAAW,CAAC,EAAE,iBAAiB,CAAC;IAChC;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"workflow-ref.d.ts","sourceRoot":"","sources":["../../src/workflow-ref.ts"],"names":[],"mappings":"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"}
|
package/dist/src/workflow-ref.js
CHANGED
|
@@ -91,4 +91,26 @@ export function workflowName(ref) {
|
|
|
91
91
|
}
|
|
92
92
|
return name;
|
|
93
93
|
}
|
|
94
|
+
/** A class's `onError` routes, with class refs resolved to names and error classes to their codes. */
|
|
95
|
+
export function onErrorRoutesOf(meta) {
|
|
96
|
+
return (meta.onError ?? []).map(({ code, workflow }) => ({
|
|
97
|
+
...(code === undefined ? {} : { code: typeof code === 'string' ? code : code.code }),
|
|
98
|
+
workflow: workflowName(workflow),
|
|
99
|
+
}));
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* What a worker announces about a workflow class it runs (design §7.9): its version, declaring package
|
|
103
|
+
* and onError routes — pass it as `WorkerRuntime.registerWorkflow`'s `meta`. Undefined for a class
|
|
104
|
+
* carrying no `static workflow` config.
|
|
105
|
+
*/
|
|
106
|
+
export function workflowAnnouncement(target) {
|
|
107
|
+
const meta = workflowMeta(target);
|
|
108
|
+
if (!meta)
|
|
109
|
+
return undefined;
|
|
110
|
+
return {
|
|
111
|
+
version: meta.version,
|
|
112
|
+
...(meta.origin ? { origin: meta.origin } : {}),
|
|
113
|
+
...(meta.onError?.length ? { onError: onErrorRoutesOf(meta) } : {}),
|
|
114
|
+
};
|
|
115
|
+
}
|
|
94
116
|
//# sourceMappingURL=workflow-ref.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflow-ref.js","sourceRoot":"","sources":["../../src/workflow-ref.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;
|
|
1
|
+
{"version":3,"file":"workflow-ref.js","sourceRoot":"","sources":["../../src/workflow-ref.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAyDH;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,MAAe;IAC1C,IAAI,OAAO,MAAM,KAAK,UAAU;QAAE,OAAO,SAAS,CAAC;IACnD,MAAM,MAAM,GAAI,MAAyC,CAAC,QAAQ,CAAC;IACnE,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC5E,OAAO,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,GAAG,EAAE,CAAC;IACvD,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAe;IAC/C,MAAM,IAAI,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IAClC,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,CAAC;IACrB,MAAM,GAAG,GAAI,MAA2E,CAAC,QAAQ,CAAC;IAClG,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,CAAC;IACpB,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAC7C,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QACxB,GAAG,CAAC;QACJ,QAAQ,EAAE,IAAI,CAAC,IAAI;QACnB,GAAG,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;KACjE,CAAC,CAAC,CAAC;AACN,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,UAAU,SAAS,CACvB,MAAyD;IAEzD,OAAO,CAAC,MAAM,EAAE,EAAE;QAChB,MAAM,GAAG,GAAG,MAEX,CAAC;QACF,MAAM,QAAQ,GACZ,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAChG,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QACxD,GAAG,CAAC,QAAQ,GAAG,CAAC,GAAG,KAAK,EAAE,GAAG,QAAQ,CAAC,CAAC;IACzC,CAAC,CAAC;AACJ,CAAC;AAgCD;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,GAAgB;IAC3C,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,GAAG,CAAC;IACxC,MAAM,IAAI,GAAG,YAAY,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC;IACrC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CACb,kBAAkB,GAAG,CAAC,IAAI,2EAA2E,CACtG,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,sGAAsG;AACtG,MAAM,UAAU,eAAe,CAAC,IAAqB;IACnD,OAAO,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;QACvD,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACpF,QAAQ,EAAE,YAAY,CAAC,QAAQ,CAAC;KACjC,CAAC,CAAC,CAAC;AACN,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAClC,MAAe;IAIf,MAAM,IAAI,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IAClC,IAAI,CAAC,IAAI;QAAE,OAAO,SAAS,CAAC;IAC5B,OAAO;QACL,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/C,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACpE,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
{{{
|
|
2
|
+
exports({ to: app.migrationsPath(`${new Date().getTime()}_create_durable_transport_worker_keys.ts`) })
|
|
3
|
+
}}}
|
|
4
|
+
import { BaseSchema } from '@adonisjs/lucid/schema'
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* The worker advertisement keys for the @adonis-agora/durable \`db\` transport: the descriptor and
|
|
8
|
+
* heartbeat a worker runtime publishes (what it serves, and that it is alive), each with an expiry so a
|
|
9
|
+
* dead worker drops out. Only needed when you select the \`db\` transport in config/durable.ts.
|
|
10
|
+
*/
|
|
11
|
+
export default class extends BaseSchema {
|
|
12
|
+
async up() {
|
|
13
|
+
this.schema.createTable('durable_transport_worker_keys', (table) => {
|
|
14
|
+
table.string('key', 512).primary()
|
|
15
|
+
table.text('value').notNullable()
|
|
16
|
+
table.bigInteger('expires_at').notNullable()
|
|
17
|
+
table.index(['expires_at'], 'durable_transport_worker_keys_expires_idx')
|
|
18
|
+
})
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
async down() {
|
|
22
|
+
this.schema.dropTableIfExists('durable_transport_worker_keys')
|
|
23
|
+
}
|
|
24
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@adonis-agora/durable",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.49.0",
|
|
4
4
|
"description": "Durable cross-app workflows for AdonisJS — deterministic replay engine, AdonisJS binding, ace commands, dashboard, OpenTelemetry, Telescope, testing harness and Redis admission, all in one package. Part of the Agora ecosystem.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -170,8 +170,8 @@
|
|
|
170
170
|
}
|
|
171
171
|
},
|
|
172
172
|
"devDependencies": {
|
|
173
|
-
"@adonis-agora/durable-dashboard": "0.
|
|
174
|
-
"@adonisjs/assembler": "8.
|
|
173
|
+
"@adonis-agora/durable-dashboard": "0.8.0",
|
|
174
|
+
"@adonisjs/assembler": "8.6.0",
|
|
175
175
|
"@adonisjs/core": "7.6.0",
|
|
176
176
|
"@adonisjs/lucid": "22.4.2",
|
|
177
177
|
"@adonisjs/queue": "0.7.0",
|
|
@@ -180,11 +180,11 @@
|
|
|
180
180
|
"@opentelemetry/context-async-hooks": "2.12.0",
|
|
181
181
|
"@opentelemetry/sdk-trace-base": "2.12.0",
|
|
182
182
|
"@poppinss/hooks": "7.3.1",
|
|
183
|
-
"@tanstack/intent": "0.5.
|
|
183
|
+
"@tanstack/intent": "0.5.6",
|
|
184
184
|
"@types/better-sqlite3": "9.6.0",
|
|
185
185
|
"@types/node": "26.6.5",
|
|
186
186
|
"better-sqlite3": "13.0.3",
|
|
187
|
-
"bullmq": "6.3.
|
|
187
|
+
"bullmq": "6.3.17",
|
|
188
188
|
"cron-parser": "5.10.2",
|
|
189
189
|
"ioredis": "6.0.0",
|
|
190
190
|
"typescript": "7.0.2",
|
|
@@ -105,8 +105,18 @@ export default class RunsController {
|
|
|
105
105
|
```
|
|
106
106
|
|
|
107
107
|
Verbs: `getRun`, `listRuns`, `getCheckpoints`, `getRunChildren`,
|
|
108
|
+
`getRunDetail` / `getFanMembers` (optional; summarize and page wide fans),
|
|
108
109
|
`getSearchAttributes`, `start`, `signal`, `cancel`, `redispatchPending`,
|
|
109
110
|
`workerHealth`, `subscribe`, `topology()`. Never branch on `role`.
|
|
111
|
+
|
|
112
|
+
```ts
|
|
113
|
+
// Each fan of more than 50 members — or declared wider than 50 — comes back as one FanSummary in `fans`.
|
|
114
|
+
const detail = await runGateway.getRunDetail?.(params.id, { summarizeFansOver: 50 })
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
A tenant pod's dashboard reads run detail through the `getRunDetail` verb, and
|
|
118
|
+
an older control plane rejects unknown verbs: upgrade the control plane first,
|
|
119
|
+
or with its tenants.
|
|
110
120
|
Source: `docs/cluster/roles-and-config.mdx`.
|
|
111
121
|
|
|
112
122
|
### Pattern 2 — capability-aware routing and blocked runs
|
|
@@ -23,6 +23,7 @@ sources:
|
|
|
23
23
|
- 'DavideCarvalho/adonis-durable:docs/transports/control-plane.mdx'
|
|
24
24
|
- 'DavideCarvalho/adonis-durable:docs/stores/index.mdx'
|
|
25
25
|
- 'DavideCarvalho/adonis-durable:docs/stores/lucid.mdx'
|
|
26
|
+
- 'DavideCarvalho/adonis-durable:docs/cluster/interop.mdx'
|
|
26
27
|
---
|
|
27
28
|
|
|
28
29
|
# Transports & state stores
|
|
@@ -104,6 +105,33 @@ One instance consumes engine-side results; run one or more `node ace
|
|
|
104
105
|
durable:work` workers serving the step names. Source:
|
|
105
106
|
`docs/transports/queue.mdx`.
|
|
106
107
|
|
|
108
|
+
For wide fans (`ctx.all` over thousands of steps), raise how many results an
|
|
109
|
+
instance settles at once on `bullmq` (`queue` and `db` have no such option),
|
|
110
|
+
let its workers size their step concurrency, and size the engine's due-timer
|
|
111
|
+
batch:
|
|
112
|
+
|
|
113
|
+
```ts title="config/durable.ts"
|
|
114
|
+
export default defineConfig({
|
|
115
|
+
timerBatchSize: 1000, // due runs per timer pass, most overdue first (default 500)
|
|
116
|
+
transports: {
|
|
117
|
+
bullmq: transports.bullmq({
|
|
118
|
+
connection: { host: '127.0.0.1', port: 6379 },
|
|
119
|
+
resultConcurrency: 16, // default 1
|
|
120
|
+
// A number pins each task queue's concurrency (default 1). 'adaptive' moves it
|
|
121
|
+
// every tickMs: +1 while steps saturate the limit at steady latency, down by the
|
|
122
|
+
// latency gradient when they queue, -1 on >20% errors / a stall / the CPU ceiling,
|
|
123
|
+
// -20% at ramCeilingPct of the cgroup (else host) memory limit.
|
|
124
|
+
concurrency: { mode: 'adaptive', min: 1, max: 32, start: 1, tickMs: 2000, ramCeilingPct: 85 },
|
|
125
|
+
}),
|
|
126
|
+
},
|
|
127
|
+
})
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
Only step durations feed the adaptive window (workflow turns count as in-flight
|
|
131
|
+
work and progress); a non-finite or out-of-range field falls back to its default, and
|
|
132
|
+
`cpuCeilingPct` is off unless set. In adaptive mode the decisions, step-events, start-run and run-request consumers run
|
|
133
|
+
at 1 (results run at `resultConcurrency`). Sources: `docs/transports/index.mdx`, `docs/cluster/interop.mdx`.
|
|
134
|
+
|
|
107
135
|
### Pattern 3 — multi-replica fan-out: the control plane
|
|
108
136
|
|
|
109
137
|
The task transport is point-to-point; lifecycle events and cancellation need a
|
|
@@ -178,6 +206,15 @@ export default defineConfig({
|
|
|
178
206
|
})
|
|
179
207
|
```
|
|
180
208
|
|
|
209
|
+
A custom store should implement `countCheckpoints(runId, fromSeq, toSeq,
|
|
210
|
+
statuses)` as a `COUNT` (the step-fan join barrier calls it on every result;
|
|
211
|
+
without it the engine loads the run's checkpoints per result), implement
|
|
212
|
+
`saveCheckpointIfPending` as one conditional `UPDATE ... WHERE status = 'pending'`
|
|
213
|
+
(without it a blind save can put a settled step back to `pending`), and return
|
|
214
|
+
`listDueTimers` most overdue first, with or without a `limit`. Run
|
|
215
|
+
`runStateStoreContract` from `@adonis-agora/durable/testing/conformance`, which
|
|
216
|
+
covers all three and fails a store missing either method.
|
|
217
|
+
|
|
181
218
|
Source: `docs/stores/lucid.mdx`, `docs/stores/index.mdx`.
|
|
182
219
|
|
|
183
220
|
## Common mistakes
|
|
@@ -176,12 +176,33 @@ if (input.n < 3) await ctx.continueAsNew({ n: input.n + 1 }) // clean history pe
|
|
|
176
176
|
|
|
177
177
|
`ctx.all` default mode is `waitAll`: every sibling finishes, then the call throws
|
|
178
178
|
a `GatherError` carrying `.failures`; `{ mode: 'failFast' }` cancels remaining
|
|
179
|
-
siblings (plain cancel — no saga).
|
|
179
|
+
siblings (plain cancel — no saga). When some items failing is an expected outcome,
|
|
180
|
+
use `ctx.allSettled(Workflow, inputs, { concurrency })` instead: the same fan,
|
|
181
|
+
resolving with `{ status: 'fulfilled', value } | { status: 'rejected', id, error, code?, details? }`
|
|
182
|
+
per input and never throwing for a child. Child ids derive from the call position and
|
|
180
183
|
are replay-stable; never pass a random one. `{ concurrency: n }` caps how many
|
|
181
184
|
children run at once (waves of `floor(n / 2)`, two at a time), and the wave goes into each child
|
|
182
185
|
id), so changing it for an in-flight run is non-deterministic, like changing
|
|
183
186
|
`inputs`.
|
|
184
187
|
|
|
188
|
+
For the same step over many inputs, pass the step reference (`defineStep` ref
|
|
189
|
+
or `@Step` method) to `ctx.all`. It
|
|
190
|
+
dispatches one step per input, wakes the workflow once per settled wave instead
|
|
191
|
+
of once per result, and returns the outputs in input order (a `GatherError`
|
|
192
|
+
carries the failed indexes, as for a child fan):
|
|
193
|
+
|
|
194
|
+
```ts
|
|
195
|
+
const results = await ctx.all(processLine, lines, { concurrency: 500 })
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
`ctx.allSettled(processLine, lines, { concurrency })` is the same step fan,
|
|
199
|
+
resolving with a `Settled` per input instead of throwing.
|
|
200
|
+
|
|
201
|
+
Prefer it to `Promise.all` past a handful of steps (every result of a
|
|
202
|
+
`Promise.all` replays the workflow: O(N²) checkpoint reads), and to a
|
|
203
|
+
child-workflow `ctx.all` when each item is just a step. A `queue` or a
|
|
204
|
+
`timeoutMs` is rejected on a step fan.
|
|
205
|
+
|
|
185
206
|
Serialize runs per subject with a singleton — runs sharing a key queue FIFO and
|
|
186
207
|
are race-free across instances:
|
|
187
208
|
|