@synkro/core 0.1.0 → 0.3.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 +123 -1
- package/dist/handler-registry.d.ts +2 -2
- package/dist/handler-registry.d.ts.map +1 -1
- package/dist/handler-registry.js +34 -6
- package/dist/handler-registry.js.map +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +10 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/workflow-registry.d.ts +6 -0
- package/dist/workflow-registry.d.ts.map +1 -1
- package/dist/workflow-registry.js +99 -10
- package/dist/workflow-registry.js.map +1 -1
- package/package.json +1 -1
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
|
|
|
@@ -118,19 +229,30 @@ Disconnects all Redis clients.
|
|
|
118
229
|
## Types
|
|
119
230
|
|
|
120
231
|
```ts
|
|
232
|
+
type RetryConfig = {
|
|
233
|
+
maxRetries: number;
|
|
234
|
+
};
|
|
235
|
+
|
|
121
236
|
type SynkroEvent = {
|
|
122
237
|
type: string;
|
|
123
238
|
handler: HandlerFunction;
|
|
239
|
+
retry?: RetryConfig;
|
|
124
240
|
};
|
|
125
241
|
|
|
126
242
|
type SynkroWorkflow = {
|
|
127
243
|
name: string;
|
|
128
244
|
steps: SynkroWorkflowStep[];
|
|
245
|
+
onComplete?: string;
|
|
246
|
+
onSuccess?: string;
|
|
247
|
+
onFailure?: string;
|
|
129
248
|
};
|
|
130
249
|
|
|
131
250
|
type SynkroWorkflowStep = {
|
|
132
251
|
type: string;
|
|
133
252
|
handler: HandlerFunction;
|
|
253
|
+
retry?: RetryConfig;
|
|
254
|
+
onSuccess?: string;
|
|
255
|
+
onFailure?: string;
|
|
134
256
|
};
|
|
135
257
|
|
|
136
258
|
type HandlerCtx = {
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import type { RedisManager } from "./redis.js";
|
|
2
|
-
import type { HandlerFunction } from "./types.js";
|
|
2
|
+
import type { HandlerFunction, RetryConfig } from "./types.js";
|
|
3
3
|
export declare class HandlerRegistry {
|
|
4
4
|
private redis;
|
|
5
5
|
private handlers;
|
|
6
6
|
constructor(redis: RedisManager);
|
|
7
|
-
register(eventType: string, handlerFn: HandlerFunction): void;
|
|
7
|
+
register(eventType: string, handlerFn: HandlerFunction, retry?: RetryConfig): void;
|
|
8
8
|
private handleMessage;
|
|
9
9
|
}
|
|
10
10
|
//# sourceMappingURL=handler-registry.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handler-registry.d.ts","sourceRoot":"","sources":["../package/handler-registry.ts"],"names":[],"mappings":"
|
|
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;CAgD5B"}
|
package/dist/handler-registry.js
CHANGED
|
@@ -1,23 +1,51 @@
|
|
|
1
|
+
import { logger } from "./logger.js";
|
|
1
2
|
export class HandlerRegistry {
|
|
2
3
|
redis;
|
|
3
4
|
handlers = new Map();
|
|
4
5
|
constructor(redis) {
|
|
5
6
|
this.redis = redis;
|
|
6
7
|
}
|
|
7
|
-
register(eventType, handlerFn) {
|
|
8
|
-
this.handlers.set(eventType,
|
|
8
|
+
register(eventType, handlerFn, retry) {
|
|
9
|
+
this.handlers.set(eventType, {
|
|
10
|
+
handler: handlerFn,
|
|
11
|
+
...(retry && { retry }),
|
|
12
|
+
});
|
|
9
13
|
this.redis.subscribeToChannel(eventType, (message) => {
|
|
10
14
|
this.handleMessage(eventType, message);
|
|
11
15
|
});
|
|
12
16
|
}
|
|
13
17
|
async handleMessage(eventType, message) {
|
|
14
|
-
const
|
|
15
|
-
if (!
|
|
18
|
+
const entry = this.handlers.get(eventType);
|
|
19
|
+
if (!entry) {
|
|
16
20
|
return;
|
|
17
21
|
}
|
|
18
22
|
const event = JSON.parse(message);
|
|
19
|
-
|
|
20
|
-
|
|
23
|
+
const maxRetries = entry.retry?.maxRetries ?? 0;
|
|
24
|
+
for (let attempt = 0; attempt <= maxRetries; attempt++) {
|
|
25
|
+
try {
|
|
26
|
+
await entry.handler({
|
|
27
|
+
requestId: event.requestId,
|
|
28
|
+
payload: event.payload,
|
|
29
|
+
});
|
|
30
|
+
this.redis.publishMessage(`event:${eventType}:completed`, JSON.stringify({
|
|
31
|
+
requestId: event.requestId,
|
|
32
|
+
payload: event.payload,
|
|
33
|
+
}));
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
catch (error) {
|
|
37
|
+
if (attempt < maxRetries) {
|
|
38
|
+
logger.warn(`[HandlerRegistry] - Handler "${eventType}" failed (attempt ${attempt + 1}/${maxRetries + 1}), retrying...`);
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
logger.error(`[HandlerRegistry] - Handler "${eventType}" failed after ${maxRetries + 1} attempt(s): ${error}`);
|
|
42
|
+
this.redis.publishMessage(`event:${eventType}:failed`, JSON.stringify({
|
|
43
|
+
requestId: event.requestId,
|
|
44
|
+
payload: event.payload,
|
|
45
|
+
}));
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
21
49
|
}
|
|
22
50
|
}
|
|
23
51
|
//# sourceMappingURL=handler-registry.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handler-registry.js","sourceRoot":"","sources":["../package/handler-registry.ts"],"names":[],"mappings":"
|
|
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;oBAEF,IAAI,CAAC,KAAK,CAAC,cAAc,CACvB,SAAS,SAAS,SAAS,EAC3B,IAAI,CAAC,SAAS,CAAC;wBACb,SAAS,EAAE,KAAK,CAAC,SAAS;wBAC1B,OAAO,EAAE,KAAK,CAAC,OAAO;qBACvB,CAAC,CACH,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;CACF"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import type { HandlerFunction, SynkroOptions } from "./types.js";
|
|
1
|
+
import type { HandlerFunction, RetryConfig, SynkroOptions } from "./types.js";
|
|
2
2
|
export declare class Synkro {
|
|
3
3
|
private redis;
|
|
4
4
|
private handlerRegistry;
|
|
5
5
|
private workflowRegistry;
|
|
6
6
|
private constructor();
|
|
7
7
|
static start(options: SynkroOptions): Promise<Synkro>;
|
|
8
|
-
on(eventType: string, handler: HandlerFunction): void;
|
|
8
|
+
on(eventType: string, handler: HandlerFunction, retry?: RetryConfig): void;
|
|
9
9
|
publish(event: string, payload?: unknown, requestId?: string): Promise<string>;
|
|
10
10
|
stop(): Promise<void>;
|
|
11
11
|
}
|
|
12
|
-
export type { HandlerCtx, HandlerFunction, SynkroEvent, SynkroOptions, SynkroWorkflow, SynkroWorkflowStep, } from "./types.js";
|
|
12
|
+
export type { HandlerCtx, HandlerFunction, RetryConfig, SynkroEvent, SynkroOptions, SynkroWorkflow, SynkroWorkflowStep, } from "./types.js";
|
|
13
13
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../package/index.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,
|
|
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"}
|
package/dist/index.js
CHANGED
|
@@ -18,7 +18,7 @@ export class Synkro {
|
|
|
18
18
|
const instance = new Synkro(redis);
|
|
19
19
|
if (options.events) {
|
|
20
20
|
for (const event of options.events) {
|
|
21
|
-
instance.on(event.type, event.handler);
|
|
21
|
+
instance.on(event.type, event.handler, event.retry);
|
|
22
22
|
}
|
|
23
23
|
}
|
|
24
24
|
if (options.workflows) {
|
|
@@ -26,8 +26,8 @@ export class Synkro {
|
|
|
26
26
|
}
|
|
27
27
|
return instance;
|
|
28
28
|
}
|
|
29
|
-
on(eventType, handler) {
|
|
30
|
-
this.handlerRegistry.register(eventType, handler);
|
|
29
|
+
on(eventType, handler, retry) {
|
|
30
|
+
this.handlerRegistry.register(eventType, handler, retry);
|
|
31
31
|
}
|
|
32
32
|
async publish(event, payload, requestId) {
|
|
33
33
|
requestId = requestId ?? randomUUID();
|
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;
|
|
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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -1,14 +1,24 @@
|
|
|
1
|
+
export type RetryConfig = {
|
|
2
|
+
maxRetries: number;
|
|
3
|
+
};
|
|
1
4
|
export type SynkroEvent = {
|
|
2
5
|
type: string;
|
|
3
6
|
handler: HandlerFunction;
|
|
7
|
+
retry?: RetryConfig;
|
|
4
8
|
};
|
|
5
9
|
export type SynkroWorkflowStep = {
|
|
6
10
|
type: string;
|
|
7
11
|
handler: HandlerFunction;
|
|
12
|
+
retry?: RetryConfig;
|
|
13
|
+
onSuccess?: string;
|
|
14
|
+
onFailure?: string;
|
|
8
15
|
};
|
|
9
16
|
export type SynkroWorkflow = {
|
|
10
17
|
name: string;
|
|
11
18
|
steps: SynkroWorkflowStep[];
|
|
19
|
+
onComplete?: string;
|
|
20
|
+
onSuccess?: string;
|
|
21
|
+
onFailure?: string;
|
|
12
22
|
};
|
|
13
23
|
export type SynkroOptions = {
|
|
14
24
|
redisUrl: string;
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../package/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,eAAe,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,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"}
|
|
@@ -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;
|
|
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;
|
|
@@ -19,7 +28,7 @@ export class WorkflowRegistry {
|
|
|
19
28
|
}
|
|
20
29
|
this.eventToWorkflows.get(key).push({ workflow, stepIndex: i });
|
|
21
30
|
const channel = this.stepChannel(workflow.name, step.type);
|
|
22
|
-
this.handlerRegistry.register(channel, step.handler);
|
|
31
|
+
this.handlerRegistry.register(channel, step.handler, step.retry);
|
|
23
32
|
}
|
|
24
33
|
this.subscribeToWorkflowEvents(workflow);
|
|
25
34
|
logger.debug(`[WorkflowRegistry] - Workflow "${workflow.name}" registered with ${workflow.steps.length} steps`);
|
|
@@ -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
|
-
|
|
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
|
|
68
|
-
|
|
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.
|
|
121
|
+
state.status = "failed";
|
|
76
122
|
await this.saveState(requestId, state);
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
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":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAYrC,MAAM,OAAO,gBAAgB;
|
|
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.
|
|
3
|
+
"version": "0.3.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",
|