@synkro/core 0.2.0 → 0.4.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/README.md CHANGED
@@ -6,6 +6,9 @@ Lightweight workflow and state machine orchestrator powered by Redis. Define eve
6
6
 
7
7
  - **Standalone Events** — Simple pub/sub event handlers with Redis
8
8
  - **Sequential Workflows** — Multi-step workflows that execute in order, with state tracked in Redis
9
+ - **Conditional Routing** — Branch to different steps based on handler success or failure
10
+ - **Workflow Chaining** — Trigger follow-up workflows on completion, success, or failure
11
+ - **Retry Support** — Configurable retry logic per step
9
12
  - **Simple API** — Single `Synkro` class with minimal configuration
10
13
  - **TypeScript** — Full type support out of the box
11
14
 
@@ -75,6 +78,113 @@ const synkro = await Synkro.start({
75
78
  await synkro.publish("ProcessOrder", { orderId: "abc-123", amount: 49.99 });
76
79
  ```
77
80
 
81
+ ### Conditional Routing
82
+
83
+ Use `onSuccess` and `onFailure` on a step to branch to different steps based on the handler outcome. If a handler throws (after all retries), the workflow routes to the `onFailure` step. On success, it routes to the `onSuccess` step.
84
+
85
+ ```ts
86
+ {
87
+ name: "ProcessDocument",
88
+ steps: [
89
+ {
90
+ type: "RunOCR",
91
+ handler: ocrHandler,
92
+ retry: { maxRetries: 2 },
93
+ onSuccess: "ProcessingSucceeded",
94
+ onFailure: "ProcessingFailed",
95
+ },
96
+ {
97
+ type: "ProcessingSucceeded",
98
+ handler: async (ctx) => {
99
+ console.log("OCR completed successfully");
100
+ },
101
+ },
102
+ {
103
+ type: "ProcessingFailed",
104
+ handler: async (ctx) => {
105
+ console.log("OCR failed, notifying support");
106
+ },
107
+ },
108
+ ],
109
+ }
110
+ ```
111
+
112
+ Steps referenced by `onSuccess`/`onFailure` are treated as branch targets. When a branch target completes, the workflow skips over sibling branch targets and advances to the next regular step (if any), or completes.
113
+
114
+ ```ts
115
+ {
116
+ name: "ProcessOrder",
117
+ steps: [
118
+ {
119
+ type: "Payment",
120
+ handler: paymentHandler,
121
+ onSuccess: "PaymentCompleted",
122
+ onFailure: "PaymentFailed",
123
+ },
124
+ { type: "PaymentCompleted", handler: completedHandler },
125
+ { type: "PaymentFailed", handler: failedHandler },
126
+ { type: "SendNotification", handler: notifyHandler }, // runs after either branch
127
+ ],
128
+ }
129
+ ```
130
+
131
+ Steps without `onSuccess`/`onFailure` advance sequentially as before.
132
+
133
+ ### Workflow Chaining
134
+
135
+ Trigger follow-up workflows when a workflow finishes:
136
+
137
+ - **`onSuccess`** — starts a workflow when the current one completes successfully
138
+ - **`onFailure`** — starts a workflow when the current one fails
139
+ - **`onComplete`** — starts a workflow regardless of outcome (runs after `onSuccess`/`onFailure`)
140
+
141
+ ```ts
142
+ const workflows = [
143
+ {
144
+ name: "ProcessOrder",
145
+ onSuccess: "StartShipment",
146
+ onFailure: "HandleError",
147
+ onComplete: "NotifyCustomer",
148
+ steps: [
149
+ { type: "ValidateStock", handler: stockHandler },
150
+ { type: "ProcessPayment", handler: paymentHandler },
151
+ ],
152
+ },
153
+ {
154
+ name: "StartShipment",
155
+ steps: [
156
+ { type: "ShipOrder", handler: shipHandler },
157
+ ],
158
+ },
159
+ {
160
+ name: "HandleError",
161
+ steps: [
162
+ { type: "LogError", handler: errorHandler },
163
+ ],
164
+ },
165
+ {
166
+ name: "NotifyCustomer",
167
+ steps: [
168
+ { type: "SendEmail", handler: emailHandler },
169
+ ],
170
+ },
171
+ ];
172
+ ```
173
+
174
+ Chained workflows inherit the same `requestId` and `payload` from the completed workflow.
175
+
176
+ ### Retry
177
+
178
+ Configure retries per step. The handler will be retried up to `maxRetries` times before being considered failed.
179
+
180
+ ```ts
181
+ {
182
+ type: "ProcessPayment",
183
+ handler: paymentHandler,
184
+ retry: { maxRetries: 3 },
185
+ }
186
+ ```
187
+
78
188
  ## API
79
189
 
80
190
  ### `Synkro.start(options): Promise<Synkro>`
@@ -84,12 +194,13 @@ Creates and returns a running instance.
84
194
  ```ts
85
195
  type SynkroOptions = {
86
196
  redisUrl: string;
197
+ debug?: boolean;
87
198
  events?: SynkroEvent[];
88
199
  workflows?: SynkroWorkflow[];
89
200
  };
90
201
  ```
91
202
 
92
- ### `synkro.on(eventType, handler): void`
203
+ ### `synkro.on(eventType, handler, retry?): void`
93
204
 
94
205
  Registers an event handler at runtime.
95
206
 
@@ -111,6 +222,29 @@ const id = await synkro.publish("UserSignedUp", { email: "user@example.com" });
111
222
  const id = await synkro.publish("UserSignedUp", { email: "user@example.com" }, "my-custom-id");
112
223
  ```
113
224
 
225
+ ### `ctx.publish(event, payload?, requestId?): Promise<string>`
226
+
227
+ Publishes an event or starts a workflow from inside a handler. Same signature as `synkro.publish`.
228
+
229
+ ```ts
230
+ synkro.on("OrderCompleted", async (ctx) => {
231
+ const { orderId } = ctx.payload as { orderId: string };
232
+ await ctx.publish("SendInvoice", { orderId });
233
+ });
234
+ ```
235
+
236
+ ### `ctx.setPayload(data): void`
237
+
238
+ Merges the given object into `ctx.payload`. The updated payload propagates to subsequent workflow steps and completion/failure events.
239
+
240
+ ```ts
241
+ synkro.on("ValidateStock", async (ctx) => {
242
+ const available = true;
243
+ ctx.setPayload({ stockAvailable: available });
244
+ // ctx.payload is now { ...originalPayload, stockAvailable: true }
245
+ });
246
+ ```
247
+
114
248
  ### `synkro.stop(): Promise<void>`
115
249
 
116
250
  Disconnects all Redis clients.
@@ -118,26 +252,45 @@ Disconnects all Redis clients.
118
252
  ## Types
119
253
 
120
254
  ```ts
255
+ type RetryConfig = {
256
+ maxRetries: number;
257
+ };
258
+
121
259
  type SynkroEvent = {
122
260
  type: string;
123
261
  handler: HandlerFunction;
262
+ retry?: RetryConfig;
124
263
  };
125
264
 
126
265
  type SynkroWorkflow = {
127
266
  name: string;
128
267
  steps: SynkroWorkflowStep[];
268
+ onComplete?: string;
269
+ onSuccess?: string;
270
+ onFailure?: string;
129
271
  };
130
272
 
131
273
  type SynkroWorkflowStep = {
132
274
  type: string;
133
275
  handler: HandlerFunction;
276
+ retry?: RetryConfig;
277
+ onSuccess?: string;
278
+ onFailure?: string;
134
279
  };
135
280
 
136
281
  type HandlerCtx = {
137
282
  requestId: string;
138
283
  payload: unknown;
284
+ publish: PublishFunction;
285
+ setPayload: (data: Record<string, unknown>) => void;
139
286
  };
140
287
 
288
+ type PublishFunction = (
289
+ event: string,
290
+ payload?: unknown,
291
+ requestId?: string,
292
+ ) => Promise<string>;
293
+
141
294
  type HandlerFunction = (ctx: HandlerCtx) => void | Promise<void>;
142
295
  ```
143
296
 
@@ -1,9 +1,11 @@
1
1
  import type { RedisManager } from "./redis.js";
2
- import type { HandlerFunction, RetryConfig } from "./types.js";
2
+ import type { HandlerFunction, PublishFunction, RetryConfig } from "./types.js";
3
3
  export declare class HandlerRegistry {
4
4
  private redis;
5
5
  private handlers;
6
+ private publishFn;
6
7
  constructor(redis: RedisManager);
8
+ setPublishFn(fn: PublishFunction): void;
7
9
  register(eventType: string, handlerFn: HandlerFunction, retry?: RetryConfig): void;
8
10
  private handleMessage;
9
11
  }
@@ -1 +1 @@
1
- {"version":3,"file":"handler-registry.d.ts","sourceRoot":"","sources":["../package/handler-registry.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,KAAK,EAAc,eAAe,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAO3E,qBAAa,eAAe;IAGd,OAAO,CAAC,KAAK;IAFzB,OAAO,CAAC,QAAQ,CAAmC;gBAE/B,KAAK,EAAE,YAAY;IAEvC,QAAQ,CACN,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,eAAe,EAC1B,KAAK,CAAC,EAAE,WAAW,GAClB,IAAI;YAWO,aAAa;CAwC5B"}
1
+ {"version":3,"file":"handler-registry.d.ts","sourceRoot":"","sources":["../package/handler-registry.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,KAAK,EAEV,eAAe,EACf,eAAe,EACf,WAAW,EACZ,MAAM,YAAY,CAAC;AAOpB,qBAAa,eAAe;IAKd,OAAO,CAAC,KAAK;IAJzB,OAAO,CAAC,QAAQ,CAAmC;IAEnD,OAAO,CAAC,SAAS,CAAgC;gBAE7B,KAAK,EAAE,YAAY;IAEvC,YAAY,CAAC,EAAE,EAAE,eAAe,GAAG,IAAI;IAIvC,QAAQ,CACN,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,eAAe,EAC1B,KAAK,CAAC,EAAE,WAAW,GAClB,IAAI;YAWO,aAAa;CAyD5B"}
@@ -2,9 +2,13 @@ import { logger } from "./logger.js";
2
2
  export class HandlerRegistry {
3
3
  redis;
4
4
  handlers = new Map();
5
+ publishFn = null;
5
6
  constructor(redis) {
6
7
  this.redis = redis;
7
8
  }
9
+ setPublishFn(fn) {
10
+ this.publishFn = fn;
11
+ }
8
12
  register(eventType, handlerFn, retry) {
9
13
  this.handlers.set(eventType, {
10
14
  handler: handlerFn,
@@ -21,15 +25,23 @@ export class HandlerRegistry {
21
25
  }
22
26
  const event = JSON.parse(message);
23
27
  const maxRetries = entry.retry?.maxRetries ?? 0;
28
+ const ctx = {
29
+ requestId: event.requestId,
30
+ payload: event.payload,
31
+ publish: this.publishFn,
32
+ setPayload(data) {
33
+ ctx.payload =
34
+ typeof ctx.payload === "object" && ctx.payload !== null
35
+ ? { ...ctx.payload, ...data }
36
+ : data;
37
+ },
38
+ };
24
39
  for (let attempt = 0; attempt <= maxRetries; attempt++) {
25
40
  try {
26
- await entry.handler({
27
- requestId: event.requestId,
28
- payload: event.payload,
29
- });
41
+ await entry.handler(ctx);
30
42
  this.redis.publishMessage(`event:${eventType}:completed`, JSON.stringify({
31
- requestId: event.requestId,
32
- payload: event.payload,
43
+ requestId: ctx.requestId,
44
+ payload: ctx.payload,
33
45
  }));
34
46
  return;
35
47
  }
@@ -39,6 +51,10 @@ export class HandlerRegistry {
39
51
  }
40
52
  else {
41
53
  logger.error(`[HandlerRegistry] - Handler "${eventType}" failed after ${maxRetries + 1} attempt(s): ${error}`);
54
+ this.redis.publishMessage(`event:${eventType}:failed`, JSON.stringify({
55
+ requestId: ctx.requestId,
56
+ payload: ctx.payload,
57
+ }));
42
58
  }
43
59
  }
44
60
  }
@@ -1 +1 @@
1
- {"version":3,"file":"handler-registry.js","sourceRoot":"","sources":["../package/handler-registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAUrC,MAAM,OAAO,eAAe;IAGN;IAFZ,QAAQ,GAAG,IAAI,GAAG,EAAwB,CAAC;IAEnD,YAAoB,KAAmB;QAAnB,UAAK,GAAL,KAAK,CAAc;IAAG,CAAC;IAE3C,QAAQ,CACN,SAAiB,EACjB,SAA0B,EAC1B,KAAmB;QAEnB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE;YAC3B,OAAO,EAAE,SAAS;YAClB,GAAG,CAAC,KAAK,IAAI,EAAE,KAAK,EAAE,CAAC;SACxB,CAAC,CAAC;QAEH,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,SAAS,EAAE,CAAC,OAAe,EAAE,EAAE;YAC3D,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,aAAa,CACzB,SAAiB,EACjB,OAAe;QAEf,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC3C,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO;QACT,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAe,CAAC;QAChD,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,EAAE,UAAU,IAAI,CAAC,CAAC;QAEhD,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,UAAU,EAAE,OAAO,EAAE,EAAE,CAAC;YACvD,IAAI,CAAC;gBACH,MAAM,KAAK,CAAC,OAAO,CAAC;oBAClB,SAAS,EAAE,KAAK,CAAC,SAAS;oBAC1B,OAAO,EAAE,KAAK,CAAC,OAAO;iBACvB,CAAC,CAAC;gBAEH,IAAI,CAAC,KAAK,CAAC,cAAc,CACvB,SAAS,SAAS,YAAY,EAC9B,IAAI,CAAC,SAAS,CAAC;oBACb,SAAS,EAAE,KAAK,CAAC,SAAS;oBAC1B,OAAO,EAAE,KAAK,CAAC,OAAO;iBACvB,CAAC,CACH,CAAC;gBACF,OAAO;YACT,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,OAAO,GAAG,UAAU,EAAE,CAAC;oBACzB,MAAM,CAAC,IAAI,CACT,gCAAgC,SAAS,qBAAqB,OAAO,GAAG,CAAC,IAAI,UAAU,GAAG,CAAC,gBAAgB,CAC5G,CAAC;gBACJ,CAAC;qBAAM,CAAC;oBACN,MAAM,CAAC,KAAK,CACV,gCAAgC,SAAS,kBAAkB,UAAU,GAAG,CAAC,gBAAgB,KAAK,EAAE,CACjG,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;CACF"}
1
+ {"version":3,"file":"handler-registry.js","sourceRoot":"","sources":["../package/handler-registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAerC,MAAM,OAAO,eAAe;IAKN;IAJZ,QAAQ,GAAG,IAAI,GAAG,EAAwB,CAAC;IAE3C,SAAS,GAA2B,IAAI,CAAC;IAEjD,YAAoB,KAAmB;QAAnB,UAAK,GAAL,KAAK,CAAc;IAAG,CAAC;IAE3C,YAAY,CAAC,EAAmB;QAC9B,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;IACtB,CAAC;IAED,QAAQ,CACN,SAAiB,EACjB,SAA0B,EAC1B,KAAmB;QAEnB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE;YAC3B,OAAO,EAAE,SAAS;YAClB,GAAG,CAAC,KAAK,IAAI,EAAE,KAAK,EAAE,CAAC;SACxB,CAAC,CAAC;QAEH,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,SAAS,EAAE,CAAC,OAAe,EAAE,EAAE;YAC3D,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,aAAa,CACzB,SAAiB,EACjB,OAAe;QAEf,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC3C,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO;QACT,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAA4C,CAAC;QAC7E,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,EAAE,UAAU,IAAI,CAAC,CAAC;QAEhD,MAAM,GAAG,GAAe;YACtB,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,OAAO,EAAE,IAAI,CAAC,SAAU;YACxB,UAAU,CAAC,IAA6B;gBACtC,GAAG,CAAC,OAAO;oBACT,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,IAAI,GAAG,CAAC,OAAO,KAAK,IAAI;wBACrD,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,OAAO,EAAE,GAAG,IAAI,EAAE;wBAC7B,CAAC,CAAC,IAAI,CAAC;YACb,CAAC;SACF,CAAC;QAEF,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,UAAU,EAAE,OAAO,EAAE,EAAE,CAAC;YACvD,IAAI,CAAC;gBACH,MAAM,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;gBAEzB,IAAI,CAAC,KAAK,CAAC,cAAc,CACvB,SAAS,SAAS,YAAY,EAC9B,IAAI,CAAC,SAAS,CAAC;oBACb,SAAS,EAAE,GAAG,CAAC,SAAS;oBACxB,OAAO,EAAE,GAAG,CAAC,OAAO;iBACrB,CAAC,CACH,CAAC;gBACF,OAAO;YACT,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,OAAO,GAAG,UAAU,EAAE,CAAC;oBACzB,MAAM,CAAC,IAAI,CACT,gCAAgC,SAAS,qBAAqB,OAAO,GAAG,CAAC,IAAI,UAAU,GAAG,CAAC,gBAAgB,CAC5G,CAAC;gBACJ,CAAC;qBAAM,CAAC;oBACN,MAAM,CAAC,KAAK,CACV,gCAAgC,SAAS,kBAAkB,UAAU,GAAG,CAAC,gBAAgB,KAAK,EAAE,CACjG,CAAC;oBAEF,IAAI,CAAC,KAAK,CAAC,cAAc,CACvB,SAAS,SAAS,SAAS,EAC3B,IAAI,CAAC,SAAS,CAAC;wBACb,SAAS,EAAE,GAAG,CAAC,SAAS;wBACxB,OAAO,EAAE,GAAG,CAAC,OAAO;qBACrB,CAAC,CACH,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;CACF"}
package/dist/index.d.ts CHANGED
@@ -9,5 +9,5 @@ export declare class Synkro {
9
9
  publish(event: string, payload?: unknown, requestId?: string): Promise<string>;
10
10
  stop(): Promise<void>;
11
11
  }
12
- export type { HandlerCtx, HandlerFunction, RetryConfig, SynkroEvent, SynkroOptions, SynkroWorkflow, SynkroWorkflowStep, } from "./types.js";
12
+ export type { HandlerCtx, HandlerFunction, PublishFunction, RetryConfig, SynkroEvent, SynkroOptions, SynkroWorkflow, SynkroWorkflowStep, } from "./types.js";
13
13
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../package/index.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACV,eAAe,EACf,WAAW,EACX,aAAa,EACd,MAAM,YAAY,CAAC;AAEpB,qBAAa,MAAM;IACjB,OAAO,CAAC,KAAK,CAAe;IAC5B,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,gBAAgB,CAAmB;IAE3C,OAAO;WAMM,KAAK,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC;IAkB3D,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,EAAE,KAAK,CAAC,EAAE,WAAW,GAAG,IAAI;IAIpE,OAAO,CACX,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,OAAO,EACjB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,CAAC;IAeZ,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAG5B;AAED,YAAY,EACV,UAAU,EACV,eAAe,EACf,WAAW,EACX,WAAW,EACX,aAAa,EACb,cAAc,EACd,kBAAkB,GACnB,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../package/index.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACV,eAAe,EACf,WAAW,EACX,aAAa,EACd,MAAM,YAAY,CAAC;AAEpB,qBAAa,MAAM;IACjB,OAAO,CAAC,KAAK,CAAe;IAC5B,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,gBAAgB,CAAmB;IAE3C,OAAO;WAOM,KAAK,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC;IAkB3D,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,EAAE,KAAK,CAAC,EAAE,WAAW,GAAG,IAAI;IAIpE,OAAO,CACX,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,OAAO,EACjB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,CAAC;IAeZ,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAG5B;AAED,YAAY,EACV,UAAU,EACV,eAAe,EACf,eAAe,EACf,WAAW,EACX,WAAW,EACX,aAAa,EACb,cAAc,EACd,kBAAkB,GACnB,MAAM,YAAY,CAAC"}
package/dist/index.js CHANGED
@@ -11,6 +11,7 @@ export class Synkro {
11
11
  this.redis = redis;
12
12
  this.handlerRegistry = new HandlerRegistry(redis);
13
13
  this.workflowRegistry = new WorkflowRegistry(redis, this.handlerRegistry);
14
+ this.handlerRegistry.setPublishFn(this.publish.bind(this));
14
15
  }
15
16
  static async start(options) {
16
17
  setDebug(options.debug ?? false);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../package/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAQ1D,MAAM,OAAO,MAAM;IACT,KAAK,CAAe;IACpB,eAAe,CAAkB;IACjC,gBAAgB,CAAmB;IAE3C,YAAoB,KAAmB;QACrC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,eAAe,GAAG,IAAI,eAAe,CAAC,KAAK,CAAC,CAAC;QAClD,IAAI,CAAC,gBAAgB,GAAG,IAAI,gBAAgB,CAAC,KAAK,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;IAC5E,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,OAAsB;QACvC,QAAQ,CAAC,OAAO,CAAC,KAAK,IAAI,KAAK,CAAC,CAAC;QACjC,MAAM,KAAK,GAAG,IAAI,YAAY,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACjD,MAAM,QAAQ,GAAG,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC;QAEnC,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;gBACnC,QAAQ,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;YACtD,CAAC;QACH,CAAC;QAED,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;YACtB,QAAQ,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACjE,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,EAAE,CAAC,SAAiB,EAAE,OAAwB,EAAE,KAAmB;QACjE,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,SAAS,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;IAC3D,CAAC;IAED,KAAK,CAAC,OAAO,CACX,KAAa,EACb,OAAiB,EACjB,SAAkB;QAElB,SAAS,GAAG,SAAS,IAAI,UAAU,EAAE,CAAC;QAEtC,IAAI,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;YAC7C,MAAM,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;YACrE,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,cAAc,CACvB,KAAK,EACL,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CACvC,CAAC;QACF,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,KAAK,CAAC,IAAI;QACR,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;IAChC,CAAC;CACF"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../package/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAQ1D,MAAM,OAAO,MAAM;IACT,KAAK,CAAe;IACpB,eAAe,CAAkB;IACjC,gBAAgB,CAAmB;IAE3C,YAAoB,KAAmB;QACrC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,eAAe,GAAG,IAAI,eAAe,CAAC,KAAK,CAAC,CAAC;QAClD,IAAI,CAAC,gBAAgB,GAAG,IAAI,gBAAgB,CAAC,KAAK,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;QAC1E,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC7D,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,OAAsB;QACvC,QAAQ,CAAC,OAAO,CAAC,KAAK,IAAI,KAAK,CAAC,CAAC;QACjC,MAAM,KAAK,GAAG,IAAI,YAAY,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACjD,MAAM,QAAQ,GAAG,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC;QAEnC,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;gBACnC,QAAQ,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;YACtD,CAAC;QACH,CAAC;QAED,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;YACtB,QAAQ,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACjE,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,EAAE,CAAC,SAAiB,EAAE,OAAwB,EAAE,KAAmB;QACjE,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,SAAS,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;IAC3D,CAAC;IAED,KAAK,CAAC,OAAO,CACX,KAAa,EACb,OAAiB,EACjB,SAAkB;QAElB,SAAS,GAAG,SAAS,IAAI,UAAU,EAAE,CAAC;QAEtC,IAAI,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;YAC7C,MAAM,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;YACrE,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,cAAc,CACvB,KAAK,EACL,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CACvC,CAAC;QACF,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,KAAK,CAAC,IAAI;QACR,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;IAChC,CAAC;CACF"}
package/dist/types.d.ts CHANGED
@@ -10,10 +10,15 @@ export type SynkroWorkflowStep = {
10
10
  type: string;
11
11
  handler: HandlerFunction;
12
12
  retry?: RetryConfig;
13
+ onSuccess?: string;
14
+ onFailure?: string;
13
15
  };
14
16
  export type SynkroWorkflow = {
15
17
  name: string;
16
18
  steps: SynkroWorkflowStep[];
19
+ onComplete?: string;
20
+ onSuccess?: string;
21
+ onFailure?: string;
17
22
  };
18
23
  export type SynkroOptions = {
19
24
  redisUrl: string;
@@ -21,9 +26,12 @@ export type SynkroOptions = {
21
26
  events?: SynkroEvent[];
22
27
  workflows?: SynkroWorkflow[];
23
28
  };
29
+ export type PublishFunction = (event: string, payload?: unknown, requestId?: string) => Promise<string>;
24
30
  export type HandlerCtx = {
25
31
  requestId: string;
26
32
  payload: unknown;
33
+ publish: PublishFunction;
34
+ setPayload: (data: Record<string, unknown>) => void;
27
35
  };
28
36
  export type HandlerFunction = (ctx: HandlerCtx) => void | Promise<void>;
29
37
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../package/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GAAG;IACxB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,eAAe,CAAC;IACzB,KAAK,CAAC,EAAE,WAAW,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,eAAe,CAAC;IACzB,KAAK,CAAC,EAAE,WAAW,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,kBAAkB,EAAE,CAAC;CAC7B,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,WAAW,EAAE,CAAC;IACvB,SAAS,CAAC,EAAE,cAAc,EAAE,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG,CAAC,GAAG,EAAE,UAAU,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../package/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GAAG;IACxB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,eAAe,CAAC;IACzB,KAAK,CAAC,EAAE,WAAW,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,eAAe,CAAC;IACzB,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,kBAAkB,EAAE,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,WAAW,EAAE,CAAC;IACvB,SAAS,CAAC,EAAE,cAAc,EAAE,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG,CAC5B,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,OAAO,EACjB,SAAS,CAAC,EAAE,MAAM,KACf,OAAO,CAAC,MAAM,CAAC,CAAC;AAErB,MAAM,MAAM,UAAU,GAAG;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,eAAe,CAAC;IACzB,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;CACrD,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG,CAAC,GAAG,EAAE,UAAU,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC"}
@@ -5,6 +5,7 @@ export declare class WorkflowRegistry {
5
5
  private redis;
6
6
  private handlerRegistry;
7
7
  private workflows;
8
+ private branchTargets;
8
9
  private eventToWorkflows;
9
10
  constructor(redis: RedisManager, handlerRegistry: HandlerRegistry);
10
11
  registerWorkflows(workflows: SynkroWorkflow[]): void;
@@ -12,6 +13,11 @@ export declare class WorkflowRegistry {
12
13
  startWorkflow(workflowName: string, requestId: string, payload: unknown): Promise<void>;
13
14
  private subscribeToWorkflowEvents;
14
15
  private handleStepCompletion;
16
+ private handleStepFailure;
17
+ private routeToStep;
18
+ private triggerNextWorkflows;
19
+ private findNextStep;
20
+ private findStepIndex;
15
21
  private stepChannel;
16
22
  private stateKey;
17
23
  private saveState;
@@ -1 +1 @@
1
- {"version":3,"file":"workflow-registry.d.ts","sourceRoot":"","sources":["../package/workflow-registry.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAQjD,qBAAa,gBAAgB;IAQzB,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,eAAe;IARzB,OAAO,CAAC,SAAS,CAAqC;IACtD,OAAO,CAAC,gBAAgB,CAGpB;gBAGM,KAAK,EAAE,YAAY,EACnB,eAAe,EAAE,eAAe;IAG1C,iBAAiB,CAAC,SAAS,EAAE,cAAc,EAAE,GAAG,IAAI;IAwBpD,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI5B,aAAa,CACjB,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,IAAI,CAAC;IA2BhB,OAAO,CAAC,yBAAyB;YAYnB,oBAAoB;IAiDlC,OAAO,CAAC,WAAW;IAInB,OAAO,CAAC,QAAQ;YAIF,SAAS;YAWT,QAAQ;CAKvB"}
1
+ {"version":3,"file":"workflow-registry.d.ts","sourceRoot":"","sources":["../package/workflow-registry.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAQjD,qBAAa,gBAAgB;IASzB,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,eAAe;IATzB,OAAO,CAAC,SAAS,CAAqC;IACtD,OAAO,CAAC,aAAa,CAAkC;IACvD,OAAO,CAAC,gBAAgB,CAGpB;gBAGM,KAAK,EAAE,YAAY,EACnB,eAAe,EAAE,eAAe;IAG1C,iBAAiB,CAAC,SAAS,EAAE,cAAc,EAAE,GAAG,IAAI;IA+BpD,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI5B,aAAa,CACjB,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,IAAI,CAAC;IA2BhB,OAAO,CAAC,yBAAyB;YAqBnB,oBAAoB;YAqDpB,iBAAiB;YA6CjB,WAAW;YAyBX,oBAAoB;IAgClC,OAAO,CAAC,YAAY;IAUpB,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,WAAW;IAInB,OAAO,CAAC,QAAQ;YAIF,SAAS;YAWT,QAAQ;CAKvB"}
@@ -3,6 +3,7 @@ export class WorkflowRegistry {
3
3
  redis;
4
4
  handlerRegistry;
5
5
  workflows = new Map();
6
+ branchTargets = new Map();
6
7
  eventToWorkflows = new Map();
7
8
  constructor(redis, handlerRegistry) {
8
9
  this.redis = redis;
@@ -11,6 +12,14 @@ export class WorkflowRegistry {
11
12
  registerWorkflows(workflows) {
12
13
  for (const workflow of workflows) {
13
14
  this.workflows.set(workflow.name, workflow);
15
+ const targets = new Set();
16
+ for (const step of workflow.steps) {
17
+ if (step.onSuccess)
18
+ targets.add(step.onSuccess);
19
+ if (step.onFailure)
20
+ targets.add(step.onFailure);
21
+ }
22
+ this.branchTargets.set(workflow.name, targets);
14
23
  for (let i = 0; i < workflow.steps.length; i++) {
15
24
  const step = workflow.steps[i];
16
25
  const key = step.type;
@@ -48,10 +57,12 @@ export class WorkflowRegistry {
48
57
  for (let i = 0; i < workflow.steps.length; i++) {
49
58
  const step = workflow.steps[i];
50
59
  const channel = this.stepChannel(workflow.name, step.type);
51
- const completionChannel = `event:${channel}:completed`;
52
- this.redis.subscribeToChannel(completionChannel, (message) => {
60
+ this.redis.subscribeToChannel(`event:${channel}:completed`, (message) => {
53
61
  this.handleStepCompletion(workflow, i, message);
54
62
  });
63
+ this.redis.subscribeToChannel(`event:${channel}:failed`, (message) => {
64
+ this.handleStepFailure(workflow, i, message);
65
+ });
55
66
  }
56
67
  }
57
68
  async handleStepCompletion(workflow, stepIndex, message) {
@@ -64,20 +75,98 @@ export class WorkflowRegistry {
64
75
  logger.warn(`[WorkflowRegistry] - Step mismatch for "${workflow.name}" (requestId: ${requestId}): expected step ${state.currentStep}, got ${stepIndex}`);
65
76
  return;
66
77
  }
67
- const nextStepIndex = stepIndex + 1;
68
- if (nextStepIndex >= workflow.steps.length) {
78
+ const currentStep = workflow.steps[stepIndex];
79
+ const onSuccess = currentStep.onSuccess;
80
+ if (onSuccess) {
81
+ const targetIndex = this.findStepIndex(workflow, onSuccess);
82
+ if (targetIndex === -1) {
83
+ logger.error(`[WorkflowRegistry] - onSuccess target "${onSuccess}" not found in workflow "${workflow.name}"`);
84
+ return;
85
+ }
86
+ await this.routeToStep(workflow, requestId, targetIndex, payload);
87
+ return;
88
+ }
89
+ const nextStepIndex = this.findNextStep(workflow, stepIndex);
90
+ if (nextStepIndex === -1) {
69
91
  state.status = "completed";
70
92
  state.currentStep = stepIndex;
71
93
  await this.saveState(requestId, state);
72
94
  logger.debug(`[WorkflowRegistry] - Workflow "${workflow.name}" completed (requestId: ${requestId})`);
95
+ await this.triggerNextWorkflows(workflow, "completed", requestId, payload);
96
+ return;
97
+ }
98
+ await this.routeToStep(workflow, requestId, nextStepIndex, payload);
99
+ }
100
+ async handleStepFailure(workflow, stepIndex, message) {
101
+ const { requestId, payload } = JSON.parse(message);
102
+ const state = await this.getState(requestId);
103
+ if (!state || state.workflowName !== workflow.name) {
104
+ return;
105
+ }
106
+ if (state.currentStep !== stepIndex) {
107
+ logger.warn(`[WorkflowRegistry] - Step mismatch for "${workflow.name}" (requestId: ${requestId}): expected step ${state.currentStep}, got ${stepIndex}`);
108
+ return;
109
+ }
110
+ const currentStep = workflow.steps[stepIndex];
111
+ const onFailure = currentStep.onFailure;
112
+ if (onFailure) {
113
+ const targetIndex = this.findStepIndex(workflow, onFailure);
114
+ if (targetIndex === -1) {
115
+ logger.error(`[WorkflowRegistry] - onFailure target "${onFailure}" not found in workflow "${workflow.name}"`);
116
+ return;
117
+ }
118
+ await this.routeToStep(workflow, requestId, targetIndex, payload);
73
119
  return;
74
120
  }
75
- state.currentStep = nextStepIndex;
121
+ state.status = "failed";
76
122
  await this.saveState(requestId, state);
77
- const nextStep = workflow.steps[nextStepIndex];
78
- const nextChannel = this.stepChannel(workflow.name, nextStep.type);
79
- logger.debug(`[WorkflowRegistry] - Workflow "${workflow.name}" advancing to step ${nextStepIndex}: "${nextStep.type}" (requestId: ${requestId})`);
80
- this.redis.publishMessage(nextChannel, JSON.stringify({ requestId, payload }));
123
+ logger.error(`[WorkflowRegistry] - Workflow "${workflow.name}" failed at step "${currentStep.type}" (requestId: ${requestId})`);
124
+ await this.triggerNextWorkflows(workflow, "failed", requestId, payload);
125
+ }
126
+ async routeToStep(workflow, requestId, targetIndex, payload) {
127
+ const state = {
128
+ workflowName: workflow.name,
129
+ currentStep: targetIndex,
130
+ status: "running",
131
+ };
132
+ await this.saveState(requestId, state);
133
+ const targetStep = workflow.steps[targetIndex];
134
+ const channel = this.stepChannel(workflow.name, targetStep.type);
135
+ logger.debug(`[WorkflowRegistry] - Workflow "${workflow.name}" advancing to step ${targetIndex}: "${targetStep.type}" (requestId: ${requestId})`);
136
+ this.redis.publishMessage(channel, JSON.stringify({ requestId, payload }));
137
+ }
138
+ async triggerNextWorkflows(workflow, outcome, requestId, payload) {
139
+ const targets = [];
140
+ if (outcome === "completed" && workflow.onSuccess) {
141
+ targets.push(workflow.onSuccess);
142
+ }
143
+ if (outcome === "failed" && workflow.onFailure) {
144
+ targets.push(workflow.onFailure);
145
+ }
146
+ if (workflow.onComplete) {
147
+ targets.push(workflow.onComplete);
148
+ }
149
+ for (const target of targets) {
150
+ if (this.workflows.has(target)) {
151
+ logger.debug(`[WorkflowRegistry] - Workflow "${workflow.name}" triggering workflow "${target}" (requestId: ${requestId})`);
152
+ await this.startWorkflow(target, requestId, payload);
153
+ }
154
+ else {
155
+ logger.error(`[WorkflowRegistry] - Chained workflow "${target}" not found (from "${workflow.name}")`);
156
+ }
157
+ }
158
+ }
159
+ findNextStep(workflow, currentIndex) {
160
+ const targets = this.branchTargets.get(workflow.name);
161
+ for (let i = currentIndex + 1; i < workflow.steps.length; i++) {
162
+ if (!targets?.has(workflow.steps[i].type)) {
163
+ return i;
164
+ }
165
+ }
166
+ return -1;
167
+ }
168
+ findStepIndex(workflow, stepType) {
169
+ return workflow.steps.findIndex((step) => step.type === stepType);
81
170
  }
82
171
  stepChannel(workflowName, stepType) {
83
172
  return `workflow:${workflowName}:${stepType}`;
@@ -1 +1 @@
1
- {"version":3,"file":"workflow-registry.js","sourceRoot":"","sources":["../package/workflow-registry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"workflow-registry.js","sourceRoot":"","sources":["../package/workflow-registry.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@synkro/core",
3
- "version": "0.2.0",
3
+ "version": "0.4.0",
4
4
  "description": "Lightweight workflow and state machine orchestrator powered by Redis. Define event-driven workflows via configuration or code.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",