@adonis-agora/durable 0.46.1 → 0.48.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 +31 -0
- package/dist/assets/spa/assets/{index-DU6cGcJz.css → index-DtGMBUDm.css} +1 -1
- package/dist/assets/spa/assets/{index-CL6q2kMB.js → index-_VISH9Xg.js} +4 -4
- package/dist/assets/spa/assets/index-_VISH9Xg.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/durable_provider.d.ts +0 -25
- package/dist/providers/durable_provider.d.ts.map +1 -1
- package/dist/providers/durable_provider.js +29 -5
- package/dist/providers/durable_provider.js.map +1 -1
- package/dist/src/codec-state-store.d.ts +3 -0
- package/dist/src/codec-state-store.d.ts.map +1 -1
- package/dist/src/codec-state-store.js +7 -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/index.d.ts +1 -1
- package/dist/src/dashboard/index.js +1 -1
- package/dist/src/engine.d.ts +47 -0
- package/dist/src/engine.d.ts.map +1 -1
- package/dist/src/engine.js +251 -18
- package/dist/src/engine.js.map +1 -1
- package/dist/src/errors.d.ts +18 -11
- package/dist/src/errors.d.ts.map +1 -1
- package/dist/src/errors.js +9 -7
- package/dist/src/errors.js.map +1 -1
- package/dist/src/fan-join.d.ts +4 -3
- package/dist/src/fan-join.d.ts.map +1 -1
- package/dist/src/fan-join.js +5 -4
- 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 +3 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +3 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/interfaces.d.ts +49 -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/stores/lucid.d.ts +1 -0
- package/dist/src/stores/lucid.d.ts.map +1 -1
- package/dist/src/stores/lucid.js +11 -1
- 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 +7 -0
- 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 +19 -0
- package/dist/src/testing-kit/state-store-conformance.js.map +1 -1
- package/dist/src/transports/bullmq/bullmq-transport.d.ts.map +1 -1
- package/dist/src/transports/bullmq/bullmq-transport.js +13 -3
- package/dist/src/transports/bullmq/bullmq-transport.js.map +1 -1
- package/dist/src/transports/bullmq/deps.d.ts +4 -0
- package/dist/src/transports/bullmq/deps.d.ts.map +1 -1
- package/dist/src/transports/bullmq/deps.js.map +1 -1
- package/dist/src/transports/bullmq/serialization.d.ts +16 -0
- package/dist/src/transports/bullmq/serialization.d.ts.map +1 -1
- package/dist/src/transports/bullmq/serialization.js +8 -0
- package/dist/src/transports/bullmq/serialization.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 +12 -0
- package/dist/src/transports/factory.d.ts.map +1 -1
- package/dist/src/transports/factory.js +24 -0
- 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.map +1 -1
- package/dist/src/workflow-ctx.js +19 -5
- 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 +4 -4
- package/skills/durable-workflows/SKILL.md +4 -1
- package/dist/assets/spa/assets/index-CL6q2kMB.js.map +0 -1
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { Database } from '@adonisjs/lucid/database';
|
|
2
|
+
import type { WorkerKeyStore } from './worker-keys.js';
|
|
3
|
+
export interface LucidWorkerKeysOptions {
|
|
4
|
+
/** Lucid connection name to use. Defaults to the `Database` default connection. */
|
|
5
|
+
connectionName?: string | undefined;
|
|
6
|
+
/** Create the worker-key table on first use if missing. Default true. */
|
|
7
|
+
autoCreate?: boolean | undefined;
|
|
8
|
+
/** Clock (epoch ms) used to sweep expired keys on write. Default `Date.now`. */
|
|
9
|
+
now?: (() => number) | undefined;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* A {@link WorkerKeyStore} over the app's database: the `durable_transport_worker_keys` table (`key`
|
|
13
|
+
* PK, `value`, `expires_at`). A write upserts its key and sweeps the expired ones. Shared by the db
|
|
14
|
+
* transport and the queue transport, whose queues hold no key a control plane could read back.
|
|
15
|
+
*/
|
|
16
|
+
export declare function lucidWorkerKeys(db: Database, opts?: LucidWorkerKeysOptions): WorkerKeyStore;
|
|
17
|
+
//# sourceMappingURL=worker-keys-db.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker-keys-db.d.ts","sourceRoot":"","sources":["../../../src/transports/worker-keys-db.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAEzD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEvD,MAAM,WAAW,sBAAsB;IACrC,mFAAmF;IACnF,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,yEAAyE;IACzE,UAAU,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACjC,gFAAgF;IAChF,GAAG,CAAC,EAAE,CAAC,MAAM,MAAM,CAAC,GAAG,SAAS,CAAC;CAClC;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,GAAE,sBAA2B,GAAG,cAAc,CAiC/F"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { createWorkerKeysTable, WORKER_KEYS_TABLE } from './db-schema.js';
|
|
2
|
+
/**
|
|
3
|
+
* A {@link WorkerKeyStore} over the app's database: the `durable_transport_worker_keys` table (`key`
|
|
4
|
+
* PK, `value`, `expires_at`). A write upserts its key and sweeps the expired ones. Shared by the db
|
|
5
|
+
* transport and the queue transport, whose queues hold no key a control plane could read back.
|
|
6
|
+
*/
|
|
7
|
+
export function lucidWorkerKeys(db, opts = {}) {
|
|
8
|
+
const client = () => (opts.connectionName ? db.connection(opts.connectionName) : db.connection());
|
|
9
|
+
const now = opts.now ?? Date.now;
|
|
10
|
+
let schemaReady;
|
|
11
|
+
const ensureSchema = () => {
|
|
12
|
+
if (opts.autoCreate === false)
|
|
13
|
+
return Promise.resolve();
|
|
14
|
+
schemaReady ??= createWorkerKeysTable(db);
|
|
15
|
+
return schemaReady;
|
|
16
|
+
};
|
|
17
|
+
return {
|
|
18
|
+
put: async (key, value, expiresAt) => {
|
|
19
|
+
await ensureSchema();
|
|
20
|
+
await client().from(WORKER_KEYS_TABLE).where('expires_at', '<=', now()).delete();
|
|
21
|
+
await client()
|
|
22
|
+
.insertQuery()
|
|
23
|
+
.table(WORKER_KEYS_TABLE)
|
|
24
|
+
.knexQuery.insert({ key, value, expires_at: expiresAt })
|
|
25
|
+
.onConflict('key')
|
|
26
|
+
.merge();
|
|
27
|
+
},
|
|
28
|
+
remove: async (keys) => {
|
|
29
|
+
if (keys.length === 0)
|
|
30
|
+
return;
|
|
31
|
+
await ensureSchema();
|
|
32
|
+
await client().from(WORKER_KEYS_TABLE).whereIn('key', keys).delete();
|
|
33
|
+
},
|
|
34
|
+
live: async (at) => {
|
|
35
|
+
await ensureSchema();
|
|
36
|
+
return (await client()
|
|
37
|
+
.from(WORKER_KEYS_TABLE)
|
|
38
|
+
.where('expires_at', '>', at)
|
|
39
|
+
.select('key', 'value'));
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=worker-keys-db.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker-keys-db.js","sourceRoot":"","sources":["../../../src/transports/worker-keys-db.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAY1E;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,EAAY,EAAE,IAAI,GAA2B,EAAE;IAC7E,MAAM,MAAM,GAAG,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC,CAAC;IAClG,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC;IACjC,IAAI,WAAsC,CAAC;IAC3C,MAAM,YAAY,GAAG,GAAkB,EAAE;QACvC,IAAI,IAAI,CAAC,UAAU,KAAK,KAAK;YAAE,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;QACxD,WAAW,KAAK,qBAAqB,CAAC,EAAE,CAAC,CAAC;QAC1C,OAAO,WAAW,CAAC;IACrB,CAAC,CAAC;IACF,OAAO;QACL,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE;YACnC,MAAM,YAAY,EAAE,CAAC;YACrB,MAAM,MAAM,EAAE,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,KAAK,CAAC,YAAY,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;YACjF,MAAM,MAAM,EAAE;iBACX,WAAW,EAAE;iBACb,KAAK,CAAC,iBAAiB,CAAC;iBACxB,SAAS,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC;iBACvD,UAAU,CAAC,KAAK,CAAC;iBACjB,KAAK,EAAE,CAAC;QACb,CAAC;QACD,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YACrB,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO;YAC9B,MAAM,YAAY,EAAE,CAAC;YACrB,MAAM,MAAM,EAAE,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;QACvE,CAAC;QACD,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE;YACjB,MAAM,YAAY,EAAE,CAAC;YACrB,OAAO,CAAC,MAAM,MAAM,EAAE;iBACnB,IAAI,CAAC,iBAAiB,CAAC;iBACvB,KAAK,CAAC,YAAY,EAAE,GAAG,EAAE,EAAE,CAAC;iBAC5B,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAqC,CAAC;QACjE,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import type { WorkerDescriptor } from '../handshake/descriptor.js';
|
|
2
|
+
import type { DescriptorRedis } from '../worker-runtime/registry.js';
|
|
3
|
+
/**
|
|
4
|
+
* The worker advertisement keyspace (design §7.2) for a transport with no Redis: the
|
|
5
|
+
* `${P}-worker-descriptor:<token>:<instance>` and `${P}-worker-heartbeat:<token>:<instance>` keys a
|
|
6
|
+
* {@link import('../worker-runtime/worker-runtime.js').WorkerRuntime} writes, each with an expiry, so a
|
|
7
|
+
* worker that dies without a clean stop drops out once its last write expires — the same liveness the
|
|
8
|
+
* Redis `SET … EX` keys give the BullMQ transport.
|
|
9
|
+
*/
|
|
10
|
+
export interface WorkerKeyStore {
|
|
11
|
+
/** Write `key`, live until `expiresAt` (epoch ms). Overwrites. */
|
|
12
|
+
put(key: string, value: string, expiresAt: number): Promise<void>;
|
|
13
|
+
/** Remove `keys` (a clean stop). */
|
|
14
|
+
remove(keys: string[]): Promise<void>;
|
|
15
|
+
/** Every key still live at `now`, with its value. */
|
|
16
|
+
live(now: number): Promise<{
|
|
17
|
+
key: string;
|
|
18
|
+
value: string;
|
|
19
|
+
}[]>;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* The {@link DescriptorRedis} port the worker registry writes through, over a {@link WorkerKeyStore}:
|
|
23
|
+
* `set(key, value, 'EX', ttl)` becomes a put live for `ttl` seconds.
|
|
24
|
+
*/
|
|
25
|
+
export declare function workerKeyWriter(store: WorkerKeyStore, now: () => number): DescriptorRedis;
|
|
26
|
+
/** The live descriptors advertised on `token`. A malformed value reads as absent. */
|
|
27
|
+
export declare function descriptorsOn(entries: readonly {
|
|
28
|
+
key: string;
|
|
29
|
+
value: string;
|
|
30
|
+
}[], token: string): WorkerDescriptor[];
|
|
31
|
+
/** The routing tokens with at least one live worker heartbeat. */
|
|
32
|
+
export declare function liveGroupsOf(entries: readonly {
|
|
33
|
+
key: string;
|
|
34
|
+
}[]): string[];
|
|
35
|
+
/** A {@link WorkerKeyStore} held in memory, for transports whose workers share the process. */
|
|
36
|
+
export declare class MemoryWorkerKeys implements WorkerKeyStore {
|
|
37
|
+
#private;
|
|
38
|
+
put(key: string, value: string, expiresAt: number): Promise<void>;
|
|
39
|
+
remove(keys: string[]): Promise<void>;
|
|
40
|
+
live(now: number): Promise<{
|
|
41
|
+
key: string;
|
|
42
|
+
value: string;
|
|
43
|
+
}[]>;
|
|
44
|
+
}
|
|
45
|
+
/** A {@link WorkerKeyStore} that holds nothing: what a transport with no place for the keys uses. */
|
|
46
|
+
export declare const NO_WORKER_KEYS: WorkerKeyStore;
|
|
47
|
+
/**
|
|
48
|
+
* The live advertisement keys of `store`, reused for `cacheMs` (the engine asks for a token's
|
|
49
|
+
* descriptors before every dispatch, and the fleet changes on the advertisement cadence). `[]` when
|
|
50
|
+
* the store cannot be read, so routing falls back to what it does with no advertisement.
|
|
51
|
+
*/
|
|
52
|
+
export declare function cachedLiveKeys(store: WorkerKeyStore, cacheMs: number, now: () => number): () => Promise<{
|
|
53
|
+
key: string;
|
|
54
|
+
value: string;
|
|
55
|
+
}[]>;
|
|
56
|
+
//# sourceMappingURL=worker-keys.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker-keys.d.ts","sourceRoot":"","sources":["../../../src/transports/worker-keys.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAErE;;;;;;GAMG;AACH,MAAM,WAAW,cAAc;IAC7B,kEAAkE;IAClE,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClE,oCAAoC;IACpC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,qDAAqD;IACrD,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC,CAAC;CAC9D;AAKD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,EAAE,MAAM,MAAM,GAAG,eAAe,CAKzF;AAED,qFAAqF;AACrF,wBAAgB,aAAa,CAC3B,OAAO,EAAE,SAAS;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EAAE,EAClD,KAAK,EAAE,MAAM,GACZ,gBAAgB,EAAE,CAYpB;AAED,kEAAkE;AAClE,wBAAgB,YAAY,CAAC,OAAO,EAAE,SAAS;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,EAAE,GAAG,MAAM,EAAE,CAW1E;AAED,+FAA+F;AAC/F,qBAAa,gBAAiB,YAAW,cAAc;;IAG/C,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEtE;IAEK,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAE1C;IAEK,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC,CAOjE;CACF;AAED,qGAAqG;AACrG,eAAO,MAAM,cAAc,EAAE,cAI5B,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,cAAc,EACrB,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,MAAM,GAChB,MAAM,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EAAE,CAAC,CAajD"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
const DESCRIPTOR_SEGMENT = '-worker-descriptor:';
|
|
2
|
+
const HEARTBEAT_SEGMENT = '-worker-heartbeat:';
|
|
3
|
+
/**
|
|
4
|
+
* The {@link DescriptorRedis} port the worker registry writes through, over a {@link WorkerKeyStore}:
|
|
5
|
+
* `set(key, value, 'EX', ttl)` becomes a put live for `ttl` seconds.
|
|
6
|
+
*/
|
|
7
|
+
export function workerKeyWriter(store, now) {
|
|
8
|
+
return {
|
|
9
|
+
set: (key, value, _mode, ttl) => store.put(key, value, now() + ttl * 1000),
|
|
10
|
+
del: (...keys) => store.remove(keys),
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
/** The live descriptors advertised on `token`. A malformed value reads as absent. */
|
|
14
|
+
export function descriptorsOn(entries, token) {
|
|
15
|
+
const marker = `${DESCRIPTOR_SEGMENT}${token}:`;
|
|
16
|
+
const descriptors = [];
|
|
17
|
+
for (const { key, value } of entries) {
|
|
18
|
+
if (!key.includes(marker))
|
|
19
|
+
continue;
|
|
20
|
+
try {
|
|
21
|
+
descriptors.push(JSON.parse(value));
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
/* a malformed descriptor never blocks routing — treat it as absent */
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return descriptors;
|
|
28
|
+
}
|
|
29
|
+
/** The routing tokens with at least one live worker heartbeat. */
|
|
30
|
+
export function liveGroupsOf(entries) {
|
|
31
|
+
const groups = new Set();
|
|
32
|
+
for (const { key } of entries) {
|
|
33
|
+
const at = key.indexOf(HEARTBEAT_SEGMENT);
|
|
34
|
+
if (at === -1)
|
|
35
|
+
continue;
|
|
36
|
+
const rest = key.slice(at + HEARTBEAT_SEGMENT.length);
|
|
37
|
+
const sep = rest.indexOf(':');
|
|
38
|
+
const group = sep === -1 ? rest : rest.slice(0, sep);
|
|
39
|
+
if (group)
|
|
40
|
+
groups.add(group);
|
|
41
|
+
}
|
|
42
|
+
return [...groups];
|
|
43
|
+
}
|
|
44
|
+
/** A {@link WorkerKeyStore} held in memory, for transports whose workers share the process. */
|
|
45
|
+
export class MemoryWorkerKeys {
|
|
46
|
+
#entries = new Map();
|
|
47
|
+
async put(key, value, expiresAt) {
|
|
48
|
+
this.#entries.set(key, { value, expiresAt });
|
|
49
|
+
}
|
|
50
|
+
async remove(keys) {
|
|
51
|
+
for (const key of keys)
|
|
52
|
+
this.#entries.delete(key);
|
|
53
|
+
}
|
|
54
|
+
async live(now) {
|
|
55
|
+
const out = [];
|
|
56
|
+
for (const [key, entry] of this.#entries) {
|
|
57
|
+
if (entry.expiresAt > now)
|
|
58
|
+
out.push({ key, value: entry.value });
|
|
59
|
+
else
|
|
60
|
+
this.#entries.delete(key);
|
|
61
|
+
}
|
|
62
|
+
return out;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/** A {@link WorkerKeyStore} that holds nothing: what a transport with no place for the keys uses. */
|
|
66
|
+
export const NO_WORKER_KEYS = {
|
|
67
|
+
put: async () => { },
|
|
68
|
+
remove: async () => { },
|
|
69
|
+
live: async () => [],
|
|
70
|
+
};
|
|
71
|
+
/**
|
|
72
|
+
* The live advertisement keys of `store`, reused for `cacheMs` (the engine asks for a token's
|
|
73
|
+
* descriptors before every dispatch, and the fleet changes on the advertisement cadence). `[]` when
|
|
74
|
+
* the store cannot be read, so routing falls back to what it does with no advertisement.
|
|
75
|
+
*/
|
|
76
|
+
export function cachedLiveKeys(store, cacheMs, now) {
|
|
77
|
+
let read;
|
|
78
|
+
return async () => {
|
|
79
|
+
const at = now();
|
|
80
|
+
if (read && at - read.at < cacheMs)
|
|
81
|
+
return read.entries;
|
|
82
|
+
try {
|
|
83
|
+
const entries = await store.live(at);
|
|
84
|
+
read = { at, entries };
|
|
85
|
+
return entries;
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
return [];
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=worker-keys.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker-keys.js","sourceRoot":"","sources":["../../../src/transports/worker-keys.ts"],"names":[],"mappings":"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"}
|
|
@@ -18,5 +18,5 @@ export { collectSteps, type DiscoveredStep, registerStep, registerSteps, registe
|
|
|
18
18
|
export { type GatherCall, type GatherItemError, type GatherMode, isWorkflowTask, type RunWorkflowTurnOptions, runWorkflowTurn, type WorkflowBody, type WorkflowBodyResolver, WorkflowGatherFailedError, WorkflowNondeterminismError, WorkflowStepFailedError, WorkflowTurnCancelled, type WorkflowTurnCtx, type WorkflowTurnHandler, } from '../workflow-turn.js';
|
|
19
19
|
export { effectivePrefix, routingToken, workerDescriptorKey, workerDescriptorKeyPrefix, workerHeartbeatKey, } from './naming.js';
|
|
20
20
|
export { type DescriptorRedis, NoopWorkerRegistry, RedisWorkerRegistry, type WorkerRegistry, } from './registry.js';
|
|
21
|
-
export { WORKER_SDK, WorkerRuntime, type WorkerRuntimeLogger, type WorkerRuntimeOptions, type WorkerTransport, } from './worker-runtime.js';
|
|
21
|
+
export { WORKER_SDK, WorkerRuntime, type WorkerRuntimeLogger, type WorkerRuntimeOptions, type WorkerTransport, type WorkflowRegistrationMeta, } from './worker-runtime.js';
|
|
22
22
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/worker-runtime/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,EACL,wBAAwB,EACxB,cAAc,EACd,KAAK,eAAe,EACpB,eAAe,EACf,mBAAmB,EACnB,KAAK,gBAAgB,EACrB,KAAK,eAAe,GACrB,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EAAE,cAAc,EAAE,KAAK,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAElE,OAAO,EACL,YAAY,EACZ,KAAK,cAAc,EACnB,YAAY,EACZ,aAAa,EACb,uBAAuB,EACvB,oBAAoB,EACpB,KAAK,UAAU,EACf,KAAK,WAAW,GACjB,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EACL,KAAK,UAAU,EACf,KAAK,eAAe,EACpB,KAAK,UAAU,EACf,cAAc,EACd,KAAK,sBAAsB,EAC3B,eAAe,EACf,KAAK,YAAY,EACjB,KAAK,oBAAoB,EACzB,yBAAyB,EACzB,2BAA2B,EAC3B,uBAAuB,EACvB,qBAAqB,EACrB,KAAK,eAAe,EACpB,KAAK,mBAAmB,GACzB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,eAAe,EACf,YAAY,EACZ,mBAAmB,EACnB,yBAAyB,EACzB,kBAAkB,GACnB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,KAAK,eAAe,EACpB,kBAAkB,EAClB,mBAAmB,EACnB,KAAK,cAAc,GACpB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,UAAU,EACV,aAAa,EACb,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EACzB,KAAK,eAAe,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/worker-runtime/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,EACL,wBAAwB,EACxB,cAAc,EACd,KAAK,eAAe,EACpB,eAAe,EACf,mBAAmB,EACnB,KAAK,gBAAgB,EACrB,KAAK,eAAe,GACrB,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EAAE,cAAc,EAAE,KAAK,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAElE,OAAO,EACL,YAAY,EACZ,KAAK,cAAc,EACnB,YAAY,EACZ,aAAa,EACb,uBAAuB,EACvB,oBAAoB,EACpB,KAAK,UAAU,EACf,KAAK,WAAW,GACjB,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EACL,KAAK,UAAU,EACf,KAAK,eAAe,EACpB,KAAK,UAAU,EACf,cAAc,EACd,KAAK,sBAAsB,EAC3B,eAAe,EACf,KAAK,YAAY,EACjB,KAAK,oBAAoB,EACzB,yBAAyB,EACzB,2BAA2B,EAC3B,uBAAuB,EACvB,qBAAqB,EACrB,KAAK,eAAe,EACpB,KAAK,mBAAmB,GACzB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,eAAe,EACf,YAAY,EACZ,mBAAmB,EACnB,yBAAyB,EACzB,kBAAkB,GACnB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,KAAK,eAAe,EACpB,kBAAkB,EAClB,mBAAmB,EACnB,KAAK,cAAc,GACpB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,UAAU,EACV,aAAa,EACb,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EACzB,KAAK,eAAe,EACpB,KAAK,wBAAwB,GAC9B,MAAM,qBAAqB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/worker-runtime/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,oGAAoG;AACpG,OAAO,EACL,wBAAwB,EACxB,cAAc,EAEd,eAAe,EACf,mBAAmB,GAGpB,MAAM,4BAA4B,CAAC;AACpC,4FAA4F;AAC5F,OAAO,EAAE,cAAc,EAAoB,MAAM,gBAAgB,CAAC;AAClE,sGAAsG;AACtG,OAAO,EACL,YAAY,EAEZ,YAAY,EACZ,aAAa,EACb,uBAAuB,EACvB,oBAAoB,GAGrB,MAAM,sBAAsB,CAAC;AAC9B,uGAAuG;AACvG,0GAA0G;AAC1G,OAAO,EAIL,cAAc,EAEd,eAAe,EAGf,yBAAyB,EACzB,2BAA2B,EAC3B,uBAAuB,EACvB,qBAAqB,GAGtB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,eAAe,EACf,YAAY,EACZ,mBAAmB,EACnB,yBAAyB,EACzB,kBAAkB,GACnB,MAAM,aAAa,CAAC;AACrB,OAAO,EAEL,kBAAkB,EAClB,mBAAmB,GAEpB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,UAAU,EACV,aAAa,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/worker-runtime/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,oGAAoG;AACpG,OAAO,EACL,wBAAwB,EACxB,cAAc,EAEd,eAAe,EACf,mBAAmB,GAGpB,MAAM,4BAA4B,CAAC;AACpC,4FAA4F;AAC5F,OAAO,EAAE,cAAc,EAAoB,MAAM,gBAAgB,CAAC;AAClE,sGAAsG;AACtG,OAAO,EACL,YAAY,EAEZ,YAAY,EACZ,aAAa,EACb,uBAAuB,EACvB,oBAAoB,GAGrB,MAAM,sBAAsB,CAAC;AAC9B,uGAAuG;AACvG,0GAA0G;AAC1G,OAAO,EAIL,cAAc,EAEd,eAAe,EAGf,yBAAyB,EACzB,2BAA2B,EAC3B,uBAAuB,EACvB,qBAAqB,GAGtB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,eAAe,EACf,YAAY,EACZ,mBAAmB,EACnB,yBAAyB,EACzB,kBAAkB,GACnB,MAAM,aAAa,CAAC;AACrB,OAAO,EAEL,kBAAkB,EAClB,mBAAmB,GAEpB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,UAAU,EACV,aAAa,GAKd,MAAM,qBAAqB,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type WorkerDescriptor } from '../handshake/descriptor.js';
|
|
1
|
+
import { type WorkerDescriptor, type WorkflowRegistration } from '../handshake/descriptor.js';
|
|
2
2
|
import type { WorkflowStepEvent } from '../interfaces.js';
|
|
3
3
|
import type { StepHandler } from '../protocol.js';
|
|
4
4
|
import { type WorkflowBody, type WorkflowTurnHandler } from '../workflow-turn.js';
|
|
@@ -89,6 +89,11 @@ export interface WorkerRuntimeOptions {
|
|
|
89
89
|
* It holds no store and reads none — every durable decision stays on the control-plane; this object
|
|
90
90
|
* only runs bodies and says who it is.
|
|
91
91
|
*/
|
|
92
|
+
/**
|
|
93
|
+
* What a worker announces about a workflow beyond its name (design §7.9): version, capability demand,
|
|
94
|
+
* declaring package, and the onError routes the engine applies to it when serving it by convention.
|
|
95
|
+
*/
|
|
96
|
+
export type WorkflowRegistrationMeta = Omit<WorkflowRegistration, 'name' | 'group'>;
|
|
92
97
|
export declare class WorkerRuntime {
|
|
93
98
|
#private;
|
|
94
99
|
constructor(options: WorkerRuntimeOptions);
|
|
@@ -122,7 +127,7 @@ export declare class WorkerRuntime {
|
|
|
122
127
|
* authoring surface (they own the store). Re-registering swaps the body; if the transport can't carry
|
|
123
128
|
* workflow tasks (`handleWorkflow` absent) the name is still advertised, just not executed here.
|
|
124
129
|
*/
|
|
125
|
-
registerWorkflow(name: string, body: WorkflowBody): void;
|
|
130
|
+
registerWorkflow(name: string, body: WorkflowBody, meta?: WorkflowRegistrationMeta): void;
|
|
126
131
|
/**
|
|
127
132
|
* Advertise a workflow NAME in the descriptor WITHOUT a runnable body (routing + capability
|
|
128
133
|
* negotiation only, design §7.1) — e.g. this pod routes/observes a workflow another worker executes.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worker-runtime.d.ts","sourceRoot":"","sources":["../../../src/worker-runtime/worker-runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,gBAAgB,
|
|
1
|
+
{"version":3,"file":"worker-runtime.d.ts","sourceRoot":"","sources":["../../../src/worker-runtime/worker-runtime.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,24 +6,6 @@ import { NoopWorkerRegistry } from './registry.js';
|
|
|
6
6
|
/** SDK identity stamped on the descriptor when the caller doesn't override it (observability only). */
|
|
7
7
|
export const WORKER_SDK = { name: '@adonis-agora/durable', version: '0.9.0' };
|
|
8
8
|
const SILENT_LOGGER = { info: () => { }, error: () => { } };
|
|
9
|
-
/**
|
|
10
|
-
* A **store-less** worker runtime (design §4): it executes step bodies pulled off the transport and
|
|
11
|
-
* advertises what it can serve — and has, by construction, NO store field and imports NO Lucid (proven
|
|
12
|
-
* by the `no-lucid` structural test). It is deliberately NOT a store-optional engine: isolation is a
|
|
13
|
-
* structural fact, not a runtime `if (this.store)`.
|
|
14
|
-
*
|
|
15
|
-
* Responsibilities:
|
|
16
|
-
* - **Register handlers** — {@link registerStep} (also `handle`, so `step-discovery`'s
|
|
17
|
-
* `registerStepsFromDir/Barrel` can target the runtime directly) forwards to `transport.handle`,
|
|
18
|
-
* which subscribes `${P}-tasks-<token>` and runs each task through the shared `runStepHandler`,
|
|
19
|
-
* publishing the result. Workflow NAMES ({@link registerWorkflowName}) populate the descriptor.
|
|
20
|
-
* - **Advertise** ({@link start}) — publishes the {@link WorkerDescriptor} to
|
|
21
|
-
* `${P}-worker-descriptor:<token>:<instance>` and beats the compact `{ ts, status, descriptorHash }`
|
|
22
|
-
* to `${P}-worker-heartbeat:<token>:<instance>` on a schedule (design §7.2 two-tier ETag scheme).
|
|
23
|
-
*
|
|
24
|
-
* It holds no store and reads none — every durable decision stays on the control-plane; this object
|
|
25
|
-
* only runs bodies and says who it is.
|
|
26
|
-
*/
|
|
27
9
|
export class WorkerRuntime {
|
|
28
10
|
#transport;
|
|
29
11
|
#partition;
|
|
@@ -42,6 +24,8 @@ export class WorkerRuntime {
|
|
|
42
24
|
#workflows = new Set();
|
|
43
25
|
// Worker-side workflow turn bodies, keyed by name — the resolver `runWorkflowTurn` replays against.
|
|
44
26
|
#workflowBodies = new Map();
|
|
27
|
+
// What this worker announces about each workflow it runs, beyond its name (design §7.9).
|
|
28
|
+
#workflowMeta = new Map();
|
|
45
29
|
#startedAt;
|
|
46
30
|
#beatTimer;
|
|
47
31
|
#started = false;
|
|
@@ -106,9 +90,14 @@ export class WorkerRuntime {
|
|
|
106
90
|
* authoring surface (they own the store). Re-registering swaps the body; if the transport can't carry
|
|
107
91
|
* workflow tasks (`handleWorkflow` absent) the name is still advertised, just not executed here.
|
|
108
92
|
*/
|
|
109
|
-
registerWorkflow(name, body) {
|
|
93
|
+
registerWorkflow(name, body, meta) {
|
|
110
94
|
const firstBody = !this.#workflowBodies.has(name);
|
|
111
95
|
this.#workflowBodies.set(name, body);
|
|
96
|
+
const metaChanged = JSON.stringify(meta) !== JSON.stringify(this.#workflowMeta.get(name));
|
|
97
|
+
if (meta)
|
|
98
|
+
this.#workflowMeta.set(name, meta);
|
|
99
|
+
else
|
|
100
|
+
this.#workflowMeta.delete(name);
|
|
112
101
|
// Wire the transport's turn consumer ONCE per name (the resolver reads the live #workflowBodies map,
|
|
113
102
|
// so a later re-register is picked up without re-wiring). No-op if the transport can't carry turns.
|
|
114
103
|
if (firstBody && this.#transport.handleWorkflow) {
|
|
@@ -123,7 +112,7 @@ export class WorkerRuntime {
|
|
|
123
112
|
}
|
|
124
113
|
const isNew = !this.#workflows.has(name);
|
|
125
114
|
this.#workflows.add(name);
|
|
126
|
-
if (isNew && this.#started)
|
|
115
|
+
if ((isNew || metaChanged) && this.#started)
|
|
127
116
|
void this.#advertise();
|
|
128
117
|
}
|
|
129
118
|
/**
|
|
@@ -164,11 +153,24 @@ export class WorkerRuntime {
|
|
|
164
153
|
capabilities: [...this.#capabilities],
|
|
165
154
|
workflows: [...this.#workflows].sort(),
|
|
166
155
|
steps: [...this.#steps].sort(),
|
|
156
|
+
...(this.#workflowBodies.size > 0 ? { registrations: this.#registrations() } : {}),
|
|
167
157
|
...(this.#partition ? { partition: this.#partition } : {}),
|
|
168
158
|
...(this.#namespace !== undefined ? { namespace: this.#namespace } : {}),
|
|
169
159
|
startedAt: this.#startedAt,
|
|
170
160
|
};
|
|
171
161
|
}
|
|
162
|
+
/**
|
|
163
|
+
* The workflows this worker ANNOUNCES it can execute (design §7.9): only those it holds a body for —
|
|
164
|
+
* a name advertised through {@link registerWorkflowName} is routed elsewhere, not run here — each
|
|
165
|
+
* with the routing token it consumes and the meta it was registered with.
|
|
166
|
+
*/
|
|
167
|
+
#registrations() {
|
|
168
|
+
return [...this.#workflowBodies.keys()].sort().map((name) => ({
|
|
169
|
+
name,
|
|
170
|
+
...this.#workflowMeta.get(name),
|
|
171
|
+
group: routingToken(name, this.#partition),
|
|
172
|
+
}));
|
|
173
|
+
}
|
|
172
174
|
/** The `${P}-worker-descriptor:<token>:<instance>` / `${P}-worker-heartbeat:<token>:<instance>` keys
|
|
173
175
|
* this worker owns — one per DISTINCT routing token across its registered steps + workflows. */
|
|
174
176
|
#tokens() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worker-runtime.js","sourceRoot":"","sources":["../../../src/worker-runtime/worker-runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,wBAAwB,EACxB,eAAe,
|
|
1
|
+
{"version":3,"file":"worker-runtime.js","sourceRoot":"","sources":["../../../src/worker-runtime/worker-runtime.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflow-ctx.d.ts","sourceRoot":"","sources":["../../src/workflow-ctx.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"workflow-ctx.d.ts","sourceRoot":"","sources":["../../src/workflow-ctx.ts"],"names":[],"mappings":"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"}
|
package/dist/src/workflow-ctx.js
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { backoffDelay } from './backoff.js';
|
|
2
2
|
import { instantCheckpoint } from './checkpoints.js';
|
|
3
|
-
import { unwrapCompletion } from './completion.js';
|
|
3
|
+
import { completionError, unwrapCompletion } from './completion.js';
|
|
4
4
|
import { parseDuration } from './duration.js';
|
|
5
5
|
import { ContinueAsNew, FatalError, GatherError, NestedWorkflowCallError, NonDeterminismError, SignalTimeoutError, WorkflowSuspended, } from './errors.js';
|
|
6
6
|
import { EVENT_BUFFER_SCAN_LIMIT, eventMatches, eventToken } from './events.js';
|
|
7
7
|
import { allChildId, allFoldedName, allGroup, allWait, allWaves, FOLDED_PREFIX, fanJoin, } from './fan-join.js';
|
|
8
|
+
import { codeAndDetails } from './on-error.js';
|
|
8
9
|
import { breakpointToken } from './protocol.js';
|
|
9
10
|
import { createStepLogger } from './step-logger.js';
|
|
10
11
|
import { stepConfigOf, stepNameOf } from './step-name-symbol.js';
|
|
@@ -167,6 +168,7 @@ export function createWorkflowCtx(host, runId, compensations, workflow = '') {
|
|
|
167
168
|
error: {
|
|
168
169
|
message: err instanceof Error ? err.message : String(err),
|
|
169
170
|
stack: err instanceof Error ? err.stack : undefined,
|
|
171
|
+
...codeAndDetails(err),
|
|
170
172
|
},
|
|
171
173
|
events,
|
|
172
174
|
attempts: attempt,
|
|
@@ -496,11 +498,12 @@ export function createWorkflowCtx(host, runId, compensations, workflow = '') {
|
|
|
496
498
|
// With `concurrency`, children go out in waves and the parent wakes once per settled wave to send
|
|
497
499
|
// the next one. When all resolve, outputs are returned in INPUT order (waitAll), or a GatherError
|
|
498
500
|
// is thrown carrying the per-item failures. Parity with the Python SDK's `gather_children`.
|
|
499
|
-
|
|
501
|
+
// `settle` is `ctx.allSettled`: the same waitAll fan, resolving with a `Settled` per item instead.
|
|
502
|
+
const fan = async (workflow, inputs, opts, settle) => {
|
|
500
503
|
// Empty: reserve no positions and produce no side effects (degenerate identity).
|
|
501
504
|
if (inputs.length === 0)
|
|
502
505
|
return [];
|
|
503
|
-
const mode = opts?.mode ?? 'waitAll';
|
|
506
|
+
const mode = settle ? 'waitAll' : (opts?.mode ?? 'waitAll');
|
|
504
507
|
const name = workflowName(workflow);
|
|
505
508
|
const waves = allWaves(inputs.length, opts?.concurrency);
|
|
506
509
|
// Reserve the whole block in list order BEFORE any dispatch — replay re-derives identical seqs.
|
|
@@ -669,21 +672,31 @@ export function createWorkflowCtx(host, runId, compensations, workflow = '') {
|
|
|
669
672
|
}
|
|
670
673
|
// All resolved: build outputs in INPUT order, aggregating any failures.
|
|
671
674
|
const outputs = [];
|
|
675
|
+
const results = [];
|
|
672
676
|
const failures = [];
|
|
673
677
|
for (let i = 0; i < inputs.length; i += 1) {
|
|
674
678
|
const c = existing[i]?.output;
|
|
675
679
|
if (c && typeof c === 'object' && 'ok' in c && c.ok === false) {
|
|
676
|
-
|
|
680
|
+
const { message, ...rest } = completionError({ ...c, error: c.error ?? 'unknown' });
|
|
681
|
+
const failure = { id: id(i), error: message, ...rest };
|
|
682
|
+
failures.push({ index: i, ...failure });
|
|
683
|
+
results.push({ status: 'rejected', ...failure });
|
|
677
684
|
outputs.push(undefined);
|
|
678
685
|
}
|
|
679
686
|
else {
|
|
680
|
-
|
|
687
|
+
const value = c?.value;
|
|
688
|
+
results.push({ status: 'fulfilled', value });
|
|
689
|
+
outputs.push(value);
|
|
681
690
|
}
|
|
682
691
|
}
|
|
692
|
+
if (settle)
|
|
693
|
+
return results;
|
|
683
694
|
if (failures.length > 0)
|
|
684
695
|
throw new GatherError(failures, inputs.length);
|
|
685
696
|
return outputs;
|
|
686
697
|
};
|
|
698
|
+
const all = (workflow, inputs, opts) => fan(workflow, inputs, opts, false);
|
|
699
|
+
const allSettled = (workflow, inputs, opts) => fan(workflow, inputs, opts, true);
|
|
687
700
|
// A fan's checkpoints: from the replay snapshot, plus ONE prefix query for any the snapshot does
|
|
688
701
|
// not hold (on the first dispatch, all of them) instead of a lookup per child. A folded checkpoint
|
|
689
702
|
// is expanded back into one completed checkpoint per child it stands for; `folded` marks those.
|
|
@@ -1007,6 +1020,7 @@ export function createWorkflowCtx(host, runId, compensations, workflow = '') {
|
|
|
1007
1020
|
task: guard('task', task),
|
|
1008
1021
|
child: guard('child', child),
|
|
1009
1022
|
all: guard('all', all),
|
|
1023
|
+
allSettled: guard('allSettled', allSettled),
|
|
1010
1024
|
startChild: guard('startChild', startChild),
|
|
1011
1025
|
breakpoint: guard('breakpoint', breakpoint),
|
|
1012
1026
|
webhook: guardedWebhook,
|