@adonis-agora/durable 1.0.0-rc.7 → 1.0.0-rc.9
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 +24 -0
- package/dist/assets/spa/assets/index-BvIomPnC.js +16 -0
- package/dist/assets/spa/assets/index-BvIomPnC.js.map +1 -0
- package/dist/assets/spa/assets/index-DTm32ZXh.css +1 -0
- package/dist/assets/spa/index.html +2 -2
- package/dist/providers/durable_provider.d.ts.map +1 -1
- package/dist/providers/durable_provider.js +8 -3
- package/dist/providers/durable_provider.js.map +1 -1
- package/dist/src/dashboard/handlers.d.ts.map +1 -1
- package/dist/src/dashboard/handlers.js +6 -3
- 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/diagnostics/index.d.ts +11 -0
- package/dist/src/diagnostics/index.d.ts.map +1 -0
- package/dist/src/diagnostics/index.js +6 -0
- package/dist/src/diagnostics/index.js.map +1 -0
- package/dist/src/diagnostics/transport.d.ts +71 -0
- package/dist/src/diagnostics/transport.d.ts.map +1 -0
- package/dist/src/diagnostics/transport.js +188 -0
- package/dist/src/diagnostics/transport.js.map +1 -0
- package/dist/src/diagnostics-bridge.d.ts +2 -1
- package/dist/src/diagnostics-bridge.d.ts.map +1 -1
- package/dist/src/diagnostics-bridge.js +7 -1
- package/dist/src/diagnostics-bridge.js.map +1 -1
- package/dist/src/event-trigger-bridge.d.ts +5 -14
- package/dist/src/event-trigger-bridge.d.ts.map +1 -1
- package/dist/src/event-trigger-bridge.js +11 -99
- package/dist/src/event-trigger-bridge.js.map +1 -1
- package/dist/src/index.d.ts +1 -1
- package/dist/src/index.js +1 -1
- package/dist/src/interfaces.d.ts +1 -1
- package/dist/src/origin.js +3 -3
- package/dist/src/transports/bullmq/bullmq-transport.d.ts.map +1 -1
- package/dist/src/transports/bullmq/bullmq-transport.js +13 -2
- package/dist/src/transports/bullmq/bullmq-transport.js.map +1 -1
- package/dist/src/transports/db.d.ts.map +1 -1
- package/dist/src/transports/db.js +12 -1
- package/dist/src/transports/db.js.map +1 -1
- package/dist/src/transports/queue.d.ts.map +1 -1
- package/dist/src/transports/queue.js +13 -2
- package/dist/src/transports/queue.js.map +1 -1
- package/dist/src/workflow-discovery.d.ts +1 -1
- package/dist/src/workflow-discovery.d.ts.map +1 -1
- package/dist/src/workflow-discovery.js +4 -7
- package/dist/src/workflow-discovery.js.map +1 -1
- package/dist/src/workflow-events.d.ts +20 -51
- package/dist/src/workflow-events.d.ts.map +1 -1
- package/dist/src/workflow-events.js +12 -30
- package/dist/src/workflow-events.js.map +1 -1
- package/dist/src/workflow-ref.d.ts +1 -1
- package/package.json +12 -2
- package/skills/durable-cluster/SKILL.md +8 -4
- package/dist/assets/spa/assets/index-70hGzOnT.css +0 -1
- package/dist/assets/spa/assets/index-DSdVNM0u.js +0 -16
- package/dist/assets/spa/assets/index-DSdVNM0u.js.map +0 -1
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import type { DeliveredEvent, DeliveryTransportContext, DurableTransportConfig, ListenerDelivery, ListenerDeliveryTransport } from '@adonis-agora/diagnostics/delivery';
|
|
2
|
+
import type { ApplicationService } from '@adonisjs/core/types';
|
|
3
|
+
import { WorkflowEngine } from '../engine.js';
|
|
4
|
+
import type { StepOptions } from '../interfaces.js';
|
|
5
|
+
/** The internal workflow every diagnostics listener delivery runs as. */
|
|
6
|
+
export declare const DIAGNOSTICS_LISTENER_WORKFLOW = "durable.diagnostics.listener";
|
|
7
|
+
/** The origin stamped on those runs, so the console groups them under diagnostics. */
|
|
8
|
+
export declare const DIAGNOSTICS_LISTENER_ORIGIN = "@adonis-agora/diagnostics";
|
|
9
|
+
/** The prefix of every delivery run id: `diag:<event id>:<listener id>`. */
|
|
10
|
+
export declare const DIAGNOSTICS_RUN_PREFIX = "diag:";
|
|
11
|
+
/**
|
|
12
|
+
* The retry policy a listener gets when `transports.durable()` sets none: three attempts, one
|
|
13
|
+
* second apart and doubling, at most 30 seconds.
|
|
14
|
+
*/
|
|
15
|
+
export declare const DIAGNOSTICS_DEFAULT_RETRY: Readonly<StepOptions>;
|
|
16
|
+
/** The input of a delivery run: which listener, and the event it receives. */
|
|
17
|
+
export interface DiagnosticsListenerInput {
|
|
18
|
+
listenerId: string;
|
|
19
|
+
envelope: DeliveredEvent;
|
|
20
|
+
}
|
|
21
|
+
/** The run id of one delivery. The same event and listener always give the same id. */
|
|
22
|
+
export declare function diagnosticsRunId(eventId: string, listenerId: string): string;
|
|
23
|
+
/** The tags a delivery run carries, so the console can filter by lib, event or listener. */
|
|
24
|
+
export declare function diagnosticsRunTags(delivery: ListenerDelivery): string[];
|
|
25
|
+
/**
|
|
26
|
+
* Whether an engine event belongs to a delivery run. Durable does not forward those runs' own
|
|
27
|
+
* lifecycle events to the diagnostics bus: a listener on `durable` events would otherwise start a
|
|
28
|
+
* delivery run for every delivery run it caused, without end.
|
|
29
|
+
*/
|
|
30
|
+
export declare function isDiagnosticsDeliveryEvent(event: {
|
|
31
|
+
runId?: string | undefined;
|
|
32
|
+
workflow?: string | undefined;
|
|
33
|
+
}): boolean;
|
|
34
|
+
/** Validate `transports.durable(options)` and merge it over {@link DIAGNOSTICS_DEFAULT_RETRY}. */
|
|
35
|
+
export declare function diagnosticsStepOptions(config?: DurableTransportConfig): StepOptions;
|
|
36
|
+
/**
|
|
37
|
+
* Stop every diagnostics delivery transport created on `engine`: each one stops taking deliveries
|
|
38
|
+
* and waits for the runs it is creating. The durable provider calls it on shutdown before it drains
|
|
39
|
+
* the engine, whichever of the two providers shuts down first.
|
|
40
|
+
*/
|
|
41
|
+
export declare function stopDiagnosticsDeliveries(engine: WorkflowEngine): Promise<void>;
|
|
42
|
+
/**
|
|
43
|
+
* The {@link ListenerDeliveryTransport} behind `transports.durable()`: each `(listener, event)` is a
|
|
44
|
+
* run of {@link DIAGNOSTICS_LISTENER_WORKFLOW}, which calls the listener inside the `handle` step.
|
|
45
|
+
*/
|
|
46
|
+
export declare class DurableDeliveryTransport implements ListenerDeliveryTransport {
|
|
47
|
+
#private;
|
|
48
|
+
constructor(engine: WorkflowEngine);
|
|
49
|
+
/**
|
|
50
|
+
* Start one run per delivery and resolve once every run is stored. A delivery whose run already
|
|
51
|
+
* exists (the same event handed over twice) counts as delivered. When some starts fail, the others
|
|
52
|
+
* still go through and the returned promise rejects with the failures.
|
|
53
|
+
*/
|
|
54
|
+
deliver(deliveries: readonly ListenerDelivery[]): Promise<void>;
|
|
55
|
+
/** Stop taking deliveries and wait for the runs being created. */
|
|
56
|
+
stop(): Promise<void>;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Register {@link DIAGNOSTICS_LISTENER_WORKFLOW} on `engine`. Its run calls the listener through
|
|
60
|
+
* `invoke` in a `handle` step with the given retry policy. A listener this process does not know is
|
|
61
|
+
* a {@link FatalError}: retrying cannot make it appear.
|
|
62
|
+
*/
|
|
63
|
+
export declare function registerDiagnosticsListenerWorkflow(engine: WorkflowEngine, invoke: DeliveryTransportContext['invoke'], stepOptions: StepOptions): void;
|
|
64
|
+
/** Whether a durable engine is bound in `app`'s container. */
|
|
65
|
+
export declare function isConfigured(app: ApplicationService): boolean;
|
|
66
|
+
/**
|
|
67
|
+
* Create the delivery transport for this process: register the listener workflow on the app's
|
|
68
|
+
* engine, so this process can run deliveries, and return the transport that starts them.
|
|
69
|
+
*/
|
|
70
|
+
export declare function createDeliveryTransport(context: DeliveryTransportContext, config?: DurableTransportConfig): Promise<DurableDeliveryTransport>;
|
|
71
|
+
//# sourceMappingURL=transport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../../src/diagnostics/transport.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,wBAAwB,EACxB,sBAAsB,EACtB,gBAAgB,EAChB,yBAAyB,EAC1B,MAAM,oCAAoC,CAAC;AAC5C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C,OAAO,KAAK,EAAE,WAAW,EAAe,MAAM,kBAAkB,CAAC;AAEjE,yEAAyE;AACzE,eAAO,MAAM,6BAA6B,iCAAiC,CAAC;AAE5E,sFAAsF;AACtF,eAAO,MAAM,2BAA2B,8BAA8B,CAAC;AAEvE,4EAA4E;AAC5E,eAAO,MAAM,sBAAsB,UAAU,CAAC;AAK9C;;;GAGG;AACH,eAAO,MAAM,yBAAyB,EAAE,QAAQ,CAAC,WAAW,CAK1D,CAAC;AAEH,8EAA8E;AAC9E,MAAM,WAAW,wBAAwB;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,cAAc,CAAC;CAC1B;AAED,uFAAuF;AACvF,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAE5E;AAED,4FAA4F;AAC5F,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,gBAAgB,GAAG,MAAM,EAAE,CAOvE;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,KAAK,EAAE;IAChD,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC/B,GAAG,OAAO,CAGV;AAED,kGAAkG;AAClG,wBAAgB,sBAAsB,CAAC,MAAM,GAAE,sBAA2B,GAAG,WAAW,CA8BvF;AAKD;;;;GAIG;AACH,wBAAsB,yBAAyB,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAIrF;AAED;;;GAGG;AACH,qBAAa,wBAAyB,YAAW,yBAAyB;;IAKxE,YAAY,MAAM,EAAE,cAAc,EAQjC;IAED;;;;OAIG;IACH,OAAO,CAAC,UAAU,EAAE,SAAS,gBAAgB,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAW9D;IAkCD,kEAAkE;IAC5D,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAI1B;CACF;AAED;;;;GAIG;AACH,wBAAgB,mCAAmC,CACjD,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,wBAAwB,CAAC,QAAQ,CAAC,EAC1C,WAAW,EAAE,WAAW,GACvB,IAAI,CA8BN;AAED,8DAA8D;AAC9D,wBAAgB,YAAY,CAAC,GAAG,EAAE,kBAAkB,GAAG,OAAO,CAG7D;AAED;;;GAGG;AACH,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,wBAAwB,EACjC,MAAM,GAAE,sBAA2B,GAClC,OAAO,CAAC,wBAAwB,CAAC,CAKnC"}
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
import { WorkflowEngine } from '../engine.js';
|
|
2
|
+
import { FatalError, RunAlreadyExistsError } from '../errors.js';
|
|
3
|
+
/** The internal workflow every diagnostics listener delivery runs as. */
|
|
4
|
+
export const DIAGNOSTICS_LISTENER_WORKFLOW = 'durable.diagnostics.listener';
|
|
5
|
+
/** The origin stamped on those runs, so the console groups them under diagnostics. */
|
|
6
|
+
export const DIAGNOSTICS_LISTENER_ORIGIN = '@adonis-agora/diagnostics';
|
|
7
|
+
/** The prefix of every delivery run id: `diag:<event id>:<listener id>`. */
|
|
8
|
+
export const DIAGNOSTICS_RUN_PREFIX = 'diag:';
|
|
9
|
+
/** The error code `ctx.invoke` rejects with when this process has no listener with that id. */
|
|
10
|
+
const UNKNOWN_LISTENER = 'E_UNKNOWN_DIAGNOSTICS_LISTENER';
|
|
11
|
+
/**
|
|
12
|
+
* The retry policy a listener gets when `transports.durable()` sets none: three attempts, one
|
|
13
|
+
* second apart and doubling, at most 30 seconds.
|
|
14
|
+
*/
|
|
15
|
+
export const DIAGNOSTICS_DEFAULT_RETRY = Object.freeze({
|
|
16
|
+
retries: 3,
|
|
17
|
+
backoff: 'exp',
|
|
18
|
+
backoffMs: 1_000,
|
|
19
|
+
backoffMaxMs: 30_000,
|
|
20
|
+
});
|
|
21
|
+
/** The run id of one delivery. The same event and listener always give the same id. */
|
|
22
|
+
export function diagnosticsRunId(eventId, listenerId) {
|
|
23
|
+
return `${DIAGNOSTICS_RUN_PREFIX}${eventId}:${listenerId}`;
|
|
24
|
+
}
|
|
25
|
+
/** The tags a delivery run carries, so the console can filter by lib, event or listener. */
|
|
26
|
+
export function diagnosticsRunTags(delivery) {
|
|
27
|
+
return [
|
|
28
|
+
'diagnostics',
|
|
29
|
+
`lib:${delivery.envelope.lib}`,
|
|
30
|
+
`event:${delivery.envelope.event}`,
|
|
31
|
+
`listener:${delivery.listenerId}`,
|
|
32
|
+
];
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Whether an engine event belongs to a delivery run. Durable does not forward those runs' own
|
|
36
|
+
* lifecycle events to the diagnostics bus: a listener on `durable` events would otherwise start a
|
|
37
|
+
* delivery run for every delivery run it caused, without end.
|
|
38
|
+
*/
|
|
39
|
+
export function isDiagnosticsDeliveryEvent(event) {
|
|
40
|
+
if (event.workflow !== undefined)
|
|
41
|
+
return event.workflow === DIAGNOSTICS_LISTENER_WORKFLOW;
|
|
42
|
+
return typeof event.runId === 'string' && event.runId.startsWith(DIAGNOSTICS_RUN_PREFIX);
|
|
43
|
+
}
|
|
44
|
+
/** Validate `transports.durable(options)` and merge it over {@link DIAGNOSTICS_DEFAULT_RETRY}. */
|
|
45
|
+
export function diagnosticsStepOptions(config = {}) {
|
|
46
|
+
const options = { ...DIAGNOSTICS_DEFAULT_RETRY };
|
|
47
|
+
if (config.retries !== undefined) {
|
|
48
|
+
if (!Number.isInteger(config.retries) || config.retries < 1) {
|
|
49
|
+
throw new Error(`@adonis-agora/durable: transports.durable({ retries }) must be an integer of at least 1 (got ${String(config.retries)})`);
|
|
50
|
+
}
|
|
51
|
+
options.retries = config.retries;
|
|
52
|
+
}
|
|
53
|
+
for (const key of ['backoffMs', 'backoffMaxMs']) {
|
|
54
|
+
const value = config[key];
|
|
55
|
+
if (value === undefined)
|
|
56
|
+
continue;
|
|
57
|
+
if (typeof value !== 'number' || !Number.isFinite(value) || value < 0) {
|
|
58
|
+
throw new Error(`@adonis-agora/durable: transports.durable({ ${key} }) must be a number of milliseconds of at least 0 (got ${String(value)})`);
|
|
59
|
+
}
|
|
60
|
+
options[key] = value;
|
|
61
|
+
}
|
|
62
|
+
if (config.backoff !== undefined) {
|
|
63
|
+
if (config.backoff !== 'fixed' && config.backoff !== 'exp') {
|
|
64
|
+
throw new Error(`@adonis-agora/durable: transports.durable({ backoff }) must be 'fixed' or 'exp' (got ${String(config.backoff)})`);
|
|
65
|
+
}
|
|
66
|
+
options.backoff = config.backoff;
|
|
67
|
+
}
|
|
68
|
+
if (config.jitter !== undefined)
|
|
69
|
+
options.jitter = config.jitter === true;
|
|
70
|
+
return options;
|
|
71
|
+
}
|
|
72
|
+
/** The delivery transports alive per engine, stopped by the durable provider before it drains. */
|
|
73
|
+
const liveTransports = new WeakMap();
|
|
74
|
+
/**
|
|
75
|
+
* Stop every diagnostics delivery transport created on `engine`: each one stops taking deliveries
|
|
76
|
+
* and waits for the runs it is creating. The durable provider calls it on shutdown before it drains
|
|
77
|
+
* the engine, whichever of the two providers shuts down first.
|
|
78
|
+
*/
|
|
79
|
+
export async function stopDiagnosticsDeliveries(engine) {
|
|
80
|
+
const transports = liveTransports.get(engine);
|
|
81
|
+
if (!transports)
|
|
82
|
+
return;
|
|
83
|
+
await Promise.all([...transports].map((transport) => transport.stop()));
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* The {@link ListenerDeliveryTransport} behind `transports.durable()`: each `(listener, event)` is a
|
|
87
|
+
* run of {@link DIAGNOSTICS_LISTENER_WORKFLOW}, which calls the listener inside the `handle` step.
|
|
88
|
+
*/
|
|
89
|
+
export class DurableDeliveryTransport {
|
|
90
|
+
#engine;
|
|
91
|
+
#inFlight = new Set();
|
|
92
|
+
#stopped = false;
|
|
93
|
+
constructor(engine) {
|
|
94
|
+
this.#engine = engine;
|
|
95
|
+
let transports = liveTransports.get(engine);
|
|
96
|
+
if (!transports) {
|
|
97
|
+
transports = new Set();
|
|
98
|
+
liveTransports.set(engine, transports);
|
|
99
|
+
}
|
|
100
|
+
transports.add(this);
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Start one run per delivery and resolve once every run is stored. A delivery whose run already
|
|
104
|
+
* exists (the same event handed over twice) counts as delivered. When some starts fail, the others
|
|
105
|
+
* still go through and the returned promise rejects with the failures.
|
|
106
|
+
*/
|
|
107
|
+
deliver(deliveries) {
|
|
108
|
+
if (this.#stopped) {
|
|
109
|
+
return Promise.reject(new Error('@adonis-agora/durable: the diagnostics delivery transport is stopped'));
|
|
110
|
+
}
|
|
111
|
+
const work = this.#startAll(deliveries);
|
|
112
|
+
this.#inFlight.add(work);
|
|
113
|
+
const forget = () => this.#inFlight.delete(work);
|
|
114
|
+
work.then(forget, forget);
|
|
115
|
+
return work;
|
|
116
|
+
}
|
|
117
|
+
async #startAll(deliveries) {
|
|
118
|
+
const results = await Promise.allSettled(deliveries.map((d) => this.#start(d)));
|
|
119
|
+
const errors = results.flatMap((r) => (r.status === 'rejected' ? [r.reason] : []));
|
|
120
|
+
if (errors.length === 1)
|
|
121
|
+
throw errors[0];
|
|
122
|
+
if (errors.length > 1) {
|
|
123
|
+
throw new AggregateError(errors, `@adonis-agora/durable: ${errors.length} of ${deliveries.length} diagnostics deliveries could not be started`);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
async #start(delivery) {
|
|
127
|
+
const input = {
|
|
128
|
+
listenerId: delivery.listenerId,
|
|
129
|
+
envelope: delivery.envelope,
|
|
130
|
+
};
|
|
131
|
+
try {
|
|
132
|
+
await this.#engine.start(DIAGNOSTICS_LISTENER_WORKFLOW, input, diagnosticsRunId(delivery.envelope.id, delivery.listenerId), { tags: diagnosticsRunTags(delivery), origin: DIAGNOSTICS_LISTENER_ORIGIN });
|
|
133
|
+
}
|
|
134
|
+
catch (error) {
|
|
135
|
+
// `start` already reports a duplicate id as the existing run; a store that still throws it
|
|
136
|
+
// means the same thing: this delivery is already a run.
|
|
137
|
+
if (error instanceof RunAlreadyExistsError)
|
|
138
|
+
return;
|
|
139
|
+
throw error;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
/** Stop taking deliveries and wait for the runs being created. */
|
|
143
|
+
async stop() {
|
|
144
|
+
this.#stopped = true;
|
|
145
|
+
await Promise.allSettled([...this.#inFlight]);
|
|
146
|
+
liveTransports.get(this.#engine)?.delete(this);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Register {@link DIAGNOSTICS_LISTENER_WORKFLOW} on `engine`. Its run calls the listener through
|
|
151
|
+
* `invoke` in a `handle` step with the given retry policy. A listener this process does not know is
|
|
152
|
+
* a {@link FatalError}: retrying cannot make it appear.
|
|
153
|
+
*/
|
|
154
|
+
export function registerDiagnosticsListenerWorkflow(engine, invoke, stepOptions) {
|
|
155
|
+
engine.register(DIAGNOSTICS_LISTENER_WORKFLOW, '1', async (ctx, raw) => {
|
|
156
|
+
const { listenerId, envelope } = raw;
|
|
157
|
+
await ctx.localStep('handle', async () => {
|
|
158
|
+
try {
|
|
159
|
+
await invoke(listenerId, envelope);
|
|
160
|
+
}
|
|
161
|
+
catch (error) {
|
|
162
|
+
if (error?.code === UNKNOWN_LISTENER) {
|
|
163
|
+
throw new FatalError(error instanceof Error
|
|
164
|
+
? error.message
|
|
165
|
+
: `unknown diagnostics listener ${listenerId}`, UNKNOWN_LISTENER, { listenerId });
|
|
166
|
+
}
|
|
167
|
+
throw error;
|
|
168
|
+
}
|
|
169
|
+
return null;
|
|
170
|
+
}, stepOptions);
|
|
171
|
+
}, { tags: ['diagnostics'], origin: DIAGNOSTICS_LISTENER_ORIGIN });
|
|
172
|
+
}
|
|
173
|
+
/** Whether a durable engine is bound in `app`'s container. */
|
|
174
|
+
export function isConfigured(app) {
|
|
175
|
+
const container = app.container;
|
|
176
|
+
return typeof container.hasBinding === 'function' && container.hasBinding(WorkflowEngine);
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Create the delivery transport for this process: register the listener workflow on the app's
|
|
180
|
+
* engine, so this process can run deliveries, and return the transport that starts them.
|
|
181
|
+
*/
|
|
182
|
+
export async function createDeliveryTransport(context, config = {}) {
|
|
183
|
+
const stepOptions = diagnosticsStepOptions(config);
|
|
184
|
+
const engine = await context.app.container.make(WorkflowEngine);
|
|
185
|
+
registerDiagnosticsListenerWorkflow(engine, context.invoke, stepOptions);
|
|
186
|
+
return new DurableDeliveryTransport(engine);
|
|
187
|
+
}
|
|
188
|
+
//# sourceMappingURL=transport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport.js","sourceRoot":"","sources":["../../../src/diagnostics/transport.ts"],"names":[],"mappings":"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"}
|
|
@@ -27,7 +27,8 @@ export interface DurableDiagnosticsOptions {
|
|
|
27
27
|
* `hasSubscribers`, so an unsubscribed channel costs nothing, and it never throws back into the
|
|
28
28
|
* engine. Only the events THIS instance produced are forwarded by default (see
|
|
29
29
|
* {@link DurableDiagnosticsOptions.includeRemote}), so a fleet records each event once; all event
|
|
30
|
-
* types are forwarded — filtering is the subscriber's job
|
|
30
|
+
* types are forwarded — filtering is the subscriber's job — except those of the runs that deliver
|
|
31
|
+
* diagnostics listener calls (`transports.durable()`), which would otherwise feed themselves. An event of a child run
|
|
31
32
|
* the engine started (`ctx.all`, `ctx.child`, `ctx.startChild` without a caller-chosen id) also
|
|
32
33
|
* carries `parentRunId`: each child is its own run, so that field is how a subscriber (a Telescope
|
|
33
34
|
* search, say) finds every child of one parent, a whole `ctx.all` fan included. An event of a run a
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diagnostics-bridge.d.ts","sourceRoot":"","sources":["../../src/diagnostics-bridge.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"diagnostics-bridge.d.ts","sourceRoot":"","sources":["../../src/diagnostics-bridge.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAInD,mFAAmF;AACnF,MAAM,WAAW,kBAAkB;IACjC,SAAS,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;CAC/D;AAMD,oDAAoD;AACpD,MAAM,WAAW,yBAAyB;IACxC;;;;;;OAMG;IACH,aAAa,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CACrC;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,kBAAkB,EAC1B,OAAO,GAAE,yBAA8B,GACtC,MAAM,IAAI,CAyBZ"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { isDiagnosticsDeliveryEvent } from './diagnostics/transport.js';
|
|
1
2
|
import { parentRunIdOf } from './fan-join.js';
|
|
2
3
|
import { lifecycleSourceOf } from './lifecycle-events.js';
|
|
3
4
|
import { isRemoteEvent } from './remote-event.js';
|
|
@@ -16,7 +17,8 @@ const EMIT_SLOT = Symbol.for('@agora/diagnostics:emit');
|
|
|
16
17
|
* `hasSubscribers`, so an unsubscribed channel costs nothing, and it never throws back into the
|
|
17
18
|
* engine. Only the events THIS instance produced are forwarded by default (see
|
|
18
19
|
* {@link DurableDiagnosticsOptions.includeRemote}), so a fleet records each event once; all event
|
|
19
|
-
* types are forwarded — filtering is the subscriber's job
|
|
20
|
+
* types are forwarded — filtering is the subscriber's job — except those of the runs that deliver
|
|
21
|
+
* diagnostics listener calls (`transports.durable()`), which would otherwise feed themselves. An event of a child run
|
|
20
22
|
* the engine started (`ctx.all`, `ctx.child`, `ctx.startChild` without a caller-chosen id) also
|
|
21
23
|
* carries `parentRunId`: each child is its own run, so that field is how a subscriber (a Telescope
|
|
22
24
|
* search, say) finds every child of one parent, a whole `ctx.all` fan included. An event of a run a
|
|
@@ -32,6 +34,10 @@ export function attachDurableDiagnostics(engine, options = {}) {
|
|
|
32
34
|
return engine.subscribe((event) => {
|
|
33
35
|
if (!includeRemote && isRemoteEvent(event))
|
|
34
36
|
return;
|
|
37
|
+
// A run delivering a diagnostics listener call (`transports.durable()`) is not echoed back onto
|
|
38
|
+
// the bus: a listener on `durable` events would start a delivery run for each one, forever.
|
|
39
|
+
if (isDiagnosticsDeliveryEvent(event))
|
|
40
|
+
return;
|
|
35
41
|
const emit = globalThis[EMIT_SLOT];
|
|
36
42
|
if (typeof emit !== 'function')
|
|
37
43
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diagnostics-bridge.js","sourceRoot":"","sources":["../../src/diagnostics-bridge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAOlD,6GAA6G;AAC7G,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;AAexD
|
|
1
|
+
{"version":3,"file":"diagnostics-bridge.js","sourceRoot":"","sources":["../../src/diagnostics-bridge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,MAAM,4BAA4B,CAAC;AACxE,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAOlD,6GAA6G;AAC7G,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;AAexD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,UAAU,wBAAwB,CACtC,MAA0B,EAC1B,OAAO,GAA8B,EAAE;IAEvC,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,KAAK,IAAI,CAAC;IACrD,OAAO,MAAM,CAAC,SAAS,CAAC,CAAC,KAAkB,EAAE,EAAE;QAC7C,IAAI,CAAC,aAAa,IAAI,aAAa,CAAC,KAAK,CAAC;YAAE,OAAO;QACnD,gGAAgG;QAChG,4FAA4F;QAC5F,IAAI,0BAA0B,CAAC,KAAK,CAAC;YAAE,OAAO;QAC9C,MAAM,IAAI,GAAI,UAAsC,CAAC,SAAS,CAAuB,CAAC;QACtF,IAAI,OAAO,IAAI,KAAK,UAAU;YAAE,OAAO;QACvC,MAAM,WAAW,GAAG,aAAa,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC/C,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ;YAC3B,CAAC,CAAC,iBAAiB,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC;YAClE,CAAC,CAAC,SAAS,CAAC;QACd,IAAI,CACF,SAAS,EACT,KAAK,CAAC,IAAI,EACV,WAAW,IAAI,MAAM;YACnB,CAAC,CAAC;gBACE,GAAG,KAAK;gBACR,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACvC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,oBAAoB,EAAE,MAAM,CAAC,KAAK,EAAE,aAAa,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACtF;YACH,CAAC,CAAC,KAAK,CACV,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { WorkflowEngine } from './engine.js';
|
|
2
|
-
import {
|
|
2
|
+
import type { NormalizedEventTrigger } from './workflow-events.js';
|
|
3
3
|
/** The minimal Adonis emitter surface the bridge needs (its `on`/`off` take a handler). */
|
|
4
4
|
export interface EmitterLike {
|
|
5
5
|
on(event: string, handler: (payload: unknown) => void): unknown;
|
|
@@ -20,19 +20,10 @@ export interface EventTriggerBridgeOptions {
|
|
|
20
20
|
}) => void;
|
|
21
21
|
}
|
|
22
22
|
/**
|
|
23
|
-
* Bridge the
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
* of every workflow registered with `onEvent: [name]`, with the payload as input
|
|
28
|
-
* (idempotent by `evt:<id>:<workflow>`).
|
|
29
|
-
* - **Diagnostics** (`agora:<lib>:<event>` channels): exact triggers route through
|
|
30
|
-
* `publishEvent(canonical, payload)`; regex/any triggers start the workflow directly
|
|
31
|
-
* (the concrete name is unknown at registration time).
|
|
32
|
-
*
|
|
33
|
-
* Diagnostics channels are subscribed via `node:diagnostics_channel` + the registry slot
|
|
34
|
-
* (current + future channels), so durable needs no import of `@adonis-agora/diagnostics`.
|
|
35
|
-
* Missing source (no emitter) degrades gracefully — that trigger just never fires.
|
|
23
|
+
* Bridge the AdonisJS emitter events a workflow declares via `static on` / `@OnEvent` into the
|
|
24
|
+
* engine: each event becomes `engine.publishEvent(name, payload)` — a fresh run of every workflow
|
|
25
|
+
* registered with `onEvent: [name]`, with the payload as input (idempotent by
|
|
26
|
+
* `evt:<id>:<workflow>`). Without an emitter the triggers are inert.
|
|
36
27
|
*
|
|
37
28
|
* @returns a disposer that detaches every subscription.
|
|
38
29
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event-trigger-bridge.d.ts","sourceRoot":"","sources":["../../src/event-trigger-bridge.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"event-trigger-bridge.d.ts","sourceRoot":"","sources":["../../src/event-trigger-bridge.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAEnE,2FAA2F;AAC3F,MAAM,WAAW,WAAW;IAC1B,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,GAAG,OAAO,CAAC;IAChE,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,GAAG,OAAO,CAAC;CAClE;AAED,MAAM,WAAW,yBAAyB;IACxC,iDAAiD;IACjD,MAAM,EAAE,cAAc,CAAC;IACvB,wFAAwF;IACxF,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB;;;;OAIG;IACH,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE;QAAE,OAAO,EAAE,sBAAsB,CAAA;KAAE,KAAK,IAAI,CAAC;CAC/E;AAkCD;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,SAAS,sBAAsB,EAAE,EAC3C,OAAO,EAAE,yBAAyB,GACjC,MAAM,IAAI,CAeZ"}
|
|
@@ -1,10 +1,3 @@
|
|
|
1
|
-
import diagnostics_channel from 'node:diagnostics_channel';
|
|
2
|
-
import { eventTriggerCanonicalName } from './workflow-events.js';
|
|
3
|
-
/** The `@adonis-agora/diagnostics` channel registry, read STRUCTURALLY (durable never imports it). */
|
|
4
|
-
const DIAGNOSTICS_REGISTRY_KEY = Symbol.for('@agora/diagnostics:registry');
|
|
5
|
-
function diagnosticsRegistry() {
|
|
6
|
-
return globalThis[DIAGNOSTICS_REGISTRY_KEY];
|
|
7
|
-
}
|
|
8
1
|
/** Run a trigger's start/publish, routing a rejection to `onError` (or a warning). */
|
|
9
2
|
function fire(trigger, options, run) {
|
|
10
3
|
const report = (error) => {
|
|
@@ -27,30 +20,24 @@ function fire(trigger, options, run) {
|
|
|
27
20
|
}
|
|
28
21
|
}
|
|
29
22
|
/**
|
|
30
|
-
* Bridge the
|
|
31
|
-
*
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
* of every workflow registered with `onEvent: [name]`, with the payload as input
|
|
35
|
-
* (idempotent by `evt:<id>:<workflow>`).
|
|
36
|
-
* - **Diagnostics** (`agora:<lib>:<event>` channels): exact triggers route through
|
|
37
|
-
* `publishEvent(canonical, payload)`; regex/any triggers start the workflow directly
|
|
38
|
-
* (the concrete name is unknown at registration time).
|
|
39
|
-
*
|
|
40
|
-
* Diagnostics channels are subscribed via `node:diagnostics_channel` + the registry slot
|
|
41
|
-
* (current + future channels), so durable needs no import of `@adonis-agora/diagnostics`.
|
|
42
|
-
* Missing source (no emitter) degrades gracefully — that trigger just never fires.
|
|
23
|
+
* Bridge the AdonisJS emitter events a workflow declares via `static on` / `@OnEvent` into the
|
|
24
|
+
* engine: each event becomes `engine.publishEvent(name, payload)` — a fresh run of every workflow
|
|
25
|
+
* registered with `onEvent: [name]`, with the payload as input (idempotent by
|
|
26
|
+
* `evt:<id>:<workflow>`). Without an emitter the triggers are inert.
|
|
43
27
|
*
|
|
44
28
|
* @returns a disposer that detaches every subscription.
|
|
45
29
|
*/
|
|
46
30
|
export function attachEventTriggerBridge(triggers, options) {
|
|
47
31
|
const wires = [];
|
|
48
32
|
for (const trigger of triggers) {
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
33
|
+
// Only emitter triggers exist; a hand-built trigger with another source (the removed
|
|
34
|
+
// `source: 'diagnostics'`) must fail, not silently subscribe an emitter event of that name.
|
|
35
|
+
if (trigger.source !== 'emitter') {
|
|
36
|
+
throw new Error(`durable: event trigger of workflow "${trigger.workflow}" has source "${String(trigger.source)}"; only 'emitter' (\`@OnEvent\`) is supported.`);
|
|
37
|
+
}
|
|
53
38
|
}
|
|
39
|
+
for (const trigger of triggers)
|
|
40
|
+
wires.push(wireEmitter(trigger, options));
|
|
54
41
|
return () => {
|
|
55
42
|
while (wires.length)
|
|
56
43
|
wires.pop()?.disposer();
|
|
@@ -65,79 +52,4 @@ function wireEmitter(trigger, options) {
|
|
|
65
52
|
options.emitter.on(trigger.event, handler);
|
|
66
53
|
return { disposer: () => options.emitter?.off(trigger.event, handler) };
|
|
67
54
|
}
|
|
68
|
-
function wireDiagnostics(trigger, options) {
|
|
69
|
-
const exact = typeof trigger.event === 'string';
|
|
70
|
-
const re = trigger.event instanceof RegExp ? trigger.event : null;
|
|
71
|
-
const libPrefix = `agora:${trigger.lib}:`;
|
|
72
|
-
const subscriptions = new Map();
|
|
73
|
-
const onMessage = (message) => {
|
|
74
|
-
const envelope = message;
|
|
75
|
-
if (envelope === null || typeof envelope !== 'object')
|
|
76
|
-
return;
|
|
77
|
-
const payload = envelope.payload;
|
|
78
|
-
if (exact) {
|
|
79
|
-
const name = eventTriggerCanonicalName(trigger);
|
|
80
|
-
if (name !== null)
|
|
81
|
-
fire(trigger, options, () => options.engine.publishEvent(name, payload));
|
|
82
|
-
}
|
|
83
|
-
else {
|
|
84
|
-
// Regex/any: the concrete name is unknown upfront — start the workflow directly.
|
|
85
|
-
fire(trigger, options, () => options.engine.start(trigger.workflow, payload, crypto.randomUUID()));
|
|
86
|
-
}
|
|
87
|
-
};
|
|
88
|
-
const subscribeChannel = (name) => {
|
|
89
|
-
if (subscriptions.has(name))
|
|
90
|
-
return;
|
|
91
|
-
if (!name.startsWith(libPrefix))
|
|
92
|
-
return;
|
|
93
|
-
if (exact) {
|
|
94
|
-
if (name !== `${libPrefix}${trigger.event}`)
|
|
95
|
-
return;
|
|
96
|
-
}
|
|
97
|
-
else if (re) {
|
|
98
|
-
const eventPart = name.slice(libPrefix.length);
|
|
99
|
-
if (!eventPart.match(re))
|
|
100
|
-
return;
|
|
101
|
-
}
|
|
102
|
-
const handler = (msg) => onMessage(msg);
|
|
103
|
-
subscriptions.set(name, handler);
|
|
104
|
-
diagnostics_channel.channel(name).subscribe(handler);
|
|
105
|
-
};
|
|
106
|
-
// EXACT triggers know their channel (`agora:<lib>:<event>`) — subscribe directly, no
|
|
107
|
-
// registry needed. Regex/any triggers need the diagnostics registry to discover the
|
|
108
|
-
// current `agora:<lib>:*` channels (and to learn about future ones as they appear).
|
|
109
|
-
if (exact) {
|
|
110
|
-
subscribeChannel(`${libPrefix}${trigger.event}`);
|
|
111
|
-
}
|
|
112
|
-
else {
|
|
113
|
-
const registry = diagnosticsRegistry();
|
|
114
|
-
let registryListener = null;
|
|
115
|
-
if (registry) {
|
|
116
|
-
for (const name of registry.channels)
|
|
117
|
-
subscribeChannel(name);
|
|
118
|
-
registryListener = (name) => subscribeChannel(name);
|
|
119
|
-
registry.listeners.add(registryListener);
|
|
120
|
-
}
|
|
121
|
-
// Registry may be absent (diagnostics not loaded): subscribe to the lib's known
|
|
122
|
-
// channels is impossible without it — those triggers stay inert until it is.
|
|
123
|
-
return {
|
|
124
|
-
disposer: () => {
|
|
125
|
-
if (registryListener && registry)
|
|
126
|
-
registry.listeners.delete(registryListener);
|
|
127
|
-
for (const [name, handler] of subscriptions) {
|
|
128
|
-
diagnostics_channel.channel(name).unsubscribe(handler);
|
|
129
|
-
}
|
|
130
|
-
subscriptions.clear();
|
|
131
|
-
},
|
|
132
|
-
};
|
|
133
|
-
}
|
|
134
|
-
return {
|
|
135
|
-
disposer: () => {
|
|
136
|
-
for (const [name, handler] of subscriptions) {
|
|
137
|
-
diagnostics_channel.channel(name).unsubscribe(handler);
|
|
138
|
-
}
|
|
139
|
-
subscriptions.clear();
|
|
140
|
-
},
|
|
141
|
-
};
|
|
142
|
-
}
|
|
143
55
|
//# sourceMappingURL=event-trigger-bridge.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event-trigger-bridge.js","sourceRoot":"","sources":["../../src/event-trigger-bridge.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"event-trigger-bridge.js","sourceRoot":"","sources":["../../src/event-trigger-bridge.ts"],"names":[],"mappings":"AAsBA,sFAAsF;AACtF,SAAS,IAAI,CACX,OAA+B,EAC/B,OAAkC,EAClC,GAA2B;IAE3B,MAAM,MAAM,GAAG,CAAC,KAAc,EAAQ,EAAE;QACtC,IAAI,CAAC;YACH,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;gBACpB,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;gBACpC,OAAO;YACT,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,6EAA6E;QAC/E,CAAC;QACD,OAAO,CAAC,IAAI,CACV,yCAAyC,OAAO,CAAC,QAAQ,MAAM,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,EAC/F,KAAK,CACN,CAAC;IACJ,CAAC,CAAC;IACF,IAAI,CAAC;QACH,GAAG,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACtB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,CAAC;IAChB,CAAC;AACH,CAAC;AAOD;;;;;;;GAOG;AACH,MAAM,UAAU,wBAAwB,CACtC,QAA2C,EAC3C,OAAkC;IAElC,MAAM,KAAK,GAAW,EAAE,CAAC;IACzB,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,qFAAqF;QACrF,4FAA4F;QAC5F,IAAK,OAAgC,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC3D,MAAM,IAAI,KAAK,CACb,uCAAuC,OAAO,CAAC,QAAQ,iBAAiB,MAAM,CAAE,OAAgC,CAAC,MAAM,CAAC,gDAAgD,CACzK,CAAC;QACJ,CAAC;IACH,CAAC;IACD,KAAK,MAAM,OAAO,IAAI,QAAQ;QAAE,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;IAC1E,OAAO,GAAG,EAAE;QACV,OAAO,KAAK,CAAC,MAAM;YAAE,KAAK,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,CAAC;IAC/C,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,OAA+B,EAAE,OAAkC;IACtF,IAAI,CAAC,OAAO,CAAC,OAAO;QAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,CAAC;IACpD,MAAM,OAAO,GAAG,CAAC,OAAgB,EAAE,EAAE;QACnC,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;IACpF,CAAC,CAAC;IACF,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC3C,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,CAAC;AAC1E,CAAC"}
|
package/dist/src/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/** Keep in sync with this package's `version` in package.json. */
|
|
2
|
-
export declare const VERSION = "1.0.0-rc.
|
|
2
|
+
export declare const VERSION = "1.0.0-rc.9";
|
|
3
3
|
export { configure } from '../configure.js';
|
|
4
4
|
export * from './admission.js';
|
|
5
5
|
export type { AdmissionContext, AdmissionFactory, RedisAdmissionConfig, } from './admissions/factory.js';
|
package/dist/src/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/** Keep in sync with this package's `version` in package.json. */
|
|
2
|
-
export const VERSION = '1.0.0-rc.
|
|
2
|
+
export const VERSION = '1.0.0-rc.9';
|
|
3
3
|
// Re-export the configure hook from the package root so `node ace configure` finds it.
|
|
4
4
|
// AdonisJS imports the package MAIN and reads `configure` off the module namespace —
|
|
5
5
|
// the `./configure` subpath alone is never consulted.
|
package/dist/src/interfaces.d.ts
CHANGED
|
@@ -45,7 +45,7 @@ export interface WorkflowRun {
|
|
|
45
45
|
* at start from the workflow registration's `origin` (or a per-start override).
|
|
46
46
|
*
|
|
47
47
|
* The registration's origin is DERIVED unless declared: the nearest `package.json` `name` of the
|
|
48
|
-
* class's declaring file (captured by `@Scheduled` / `@OnEvent`
|
|
48
|
+
* class's declaring file (captured by `@Scheduled` / `@OnEvent`), else of the
|
|
49
49
|
* discovered module (`app/workflows/…`, a built `build/…`), else of the code calling
|
|
50
50
|
* `registerWorkflowClass` / `engine.register`. An explicit `static workflow.origin` or `register`
|
|
51
51
|
* `origin` option always wins. Derivation never guesses: when nothing resolves, the run has none.
|
package/dist/src/origin.js
CHANGED
|
@@ -12,9 +12,9 @@ import { fileURLToPath } from 'node:url';
|
|
|
12
12
|
* workflow cannot fail to provide — a FILE that belongs to the declaring package — mapped to the
|
|
13
13
|
* nearest enclosing `package.json` `name`. In order of precision:
|
|
14
14
|
*
|
|
15
|
-
* 1. **The class's declaring file**, captured by a class decorator (`@Scheduled`, `@OnEvent
|
|
16
|
-
*
|
|
17
|
-
*
|
|
15
|
+
* 1. **The class's declaring file**, captured by a class decorator (`@Scheduled`, `@OnEvent`) at
|
|
16
|
+
* decoration time — the one moment we are guaranteed to be executing inside the declaring
|
|
17
|
+
* module. Exact, but only present on decorated classes.
|
|
18
18
|
* 2. **The discovered module's file**: the `app/workflows` scan knows the absolute path of every
|
|
19
19
|
* module it imports, and a multi-root generated barrel keys each module by its app-relative path.
|
|
20
20
|
* A single-root barrel keys modules by name only, so its modules resolve from the app root the
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bullmq-transport.d.ts","sourceRoot":"","sources":["../../../../src/transports/bullmq/bullmq-transport.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,KAAK,EACV,WAAW,EACX,SAAS,EACT,UAAU,EACV,WAAW,EACX,QAAQ,EACR,UAAU,EACV,eAAe,EACf,UAAU,EACV,WAAW,EACX,SAAS,EACT,eAAe,EAEf,gBAAgB,EAChB,iBAAiB,EACjB,YAAY,EACb,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAkB,KAAK,WAAW,EAAqB,MAAM,mBAAmB,CAAC;AAExF,OAAO,EAAkB,KAAK,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAOlF,OAAO,EAAsB,KAAK,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AACvF,OAAO,EACL,KAAK,UAAU,EAGf,KAAK,SAAS,EAGf,MAAM,WAAW,CAAC;AAkCnB,MAAM,WAAW,sBAAsB;IACrC;;;;;;;;OAQG;IACH,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,2FAA2F;IAC3F,IAAI,EAAE,UAAU,CAAC;IACjB;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,oEAAoE;IACpE,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,yFAAyF;IACzF,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,mGAAmG;IACnG,OAAO,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IAC/C;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACvC;;;;;;;OAOG;IACH,WAAW,CAAC,EAAE,iBAAiB,GAAG,SAAS,CAAC;IAC5C;;;;;;;;;;OAUG;IACH,cAAc,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,SAAS,CAAC;IAC5C;;;;;;;;OAQG;IACH,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC;;;;;;;;;OASG;IACH,YAAY,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACnC,4GAA4G;IAC5G,eAAe,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,6GAA6G;IAC7G,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,0GAA0G;IAC1G,gBAAgB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACvC;AA2BD;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,eAAgB,YAAW,SAAS;;IA2G/C,YAAY,OAAO,EAAE,sBAAsB,EA6B1C;IAiGD;;;;;;;;;;;;;;OAcG;IACH,cAAc,IAAI,IAAI,CAErB;IAED;;mEAE+D;IAC/D,cAAc,IAAI,IAAI,CAIrB;IAgDD,iEAAiE;IACjE,IAAI,UAAU,IAAI,MAAM,CAEvB;IAED;;;OAGG;IACH,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAGpC;
|
|
1
|
+
{"version":3,"file":"bullmq-transport.d.ts","sourceRoot":"","sources":["../../../../src/transports/bullmq/bullmq-transport.ts"],"names":[],"mappings":"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"}
|
|
@@ -341,6 +341,17 @@ export class BullMQTransport {
|
|
|
341
341
|
return;
|
|
342
342
|
this.#namespace = namespace;
|
|
343
343
|
}
|
|
344
|
+
/**
|
|
345
|
+
* The partition this instance serves (the `@<partition>` suffix of the routing tokens it consumes):
|
|
346
|
+
* the explicit `partition`, else its namespace when that is set and not `default`. A namespaced
|
|
347
|
+
* engine stamps its runs with its namespace and dispatches their steps to `<name>@<namespace>`, so
|
|
348
|
+
* it serves those tokens by default, as nestjs-durable's `servingPartition()` does.
|
|
349
|
+
*/
|
|
350
|
+
#servingPartition() {
|
|
351
|
+
if (this.#partition !== undefined)
|
|
352
|
+
return this.#partition;
|
|
353
|
+
return this.#namespace && this.#namespace !== 'default' ? this.#namespace : undefined;
|
|
354
|
+
}
|
|
344
355
|
/** The user's `onError` when supplied, else undefined (so the helper falls back to console.warn). */
|
|
345
356
|
#subscribeErrorSink() {
|
|
346
357
|
return this.#hasOnError ? this.#onError : undefined;
|
|
@@ -500,7 +511,7 @@ export class BullMQTransport {
|
|
|
500
511
|
*/
|
|
501
512
|
handle(name, fn) {
|
|
502
513
|
this.#handlers.set(name, fn);
|
|
503
|
-
this.#ensureTaskWorker(routingToken(name, this.#
|
|
514
|
+
this.#ensureTaskWorker(routingToken(name, this.#servingPartition()));
|
|
504
515
|
}
|
|
505
516
|
/**
|
|
506
517
|
* Register a WORKFLOW turn consumer (worker side, design §4 / spec §6.3). Starts a DEDICATED task
|
|
@@ -511,7 +522,7 @@ export class BullMQTransport {
|
|
|
511
522
|
*/
|
|
512
523
|
handleWorkflow(name, turn) {
|
|
513
524
|
this.#workflowTurns.set(name, turn);
|
|
514
|
-
this.#ensureTaskWorker(routingToken(name, this.#
|
|
525
|
+
this.#ensureTaskWorker(routingToken(name, this.#servingPartition()));
|
|
515
526
|
}
|
|
516
527
|
/** Start (once per routing token) the discriminating task worker + its liveness heartbeat. Shared by
|
|
517
528
|
* {@link handle} (steps) and {@link handleWorkflow} (workflow turns) — both ride `${P}-tasks-<token>`. */
|