@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 +154 -1
- package/dist/handler-registry.d.ts +3 -1
- package/dist/handler-registry.d.ts.map +1 -1
- package/dist/handler-registry.js +22 -6
- package/dist/handler-registry.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +8 -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 +98 -9
- 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
|
|
|
@@ -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,
|
|
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"}
|
package/dist/handler-registry.js
CHANGED
|
@@ -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:
|
|
32
|
-
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;
|
|
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
|
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,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;
|
|
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;
|
|
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
|
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,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;
|
|
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;
|
|
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
|
-
|
|
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":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAYrC,MAAM,OAAO,gBAAgB;IASjB;IACA;IATF,SAAS,GAAG,IAAI,GAAG,EAA0B,CAAC;IAC9C,aAAa,GAAG,IAAI,GAAG,EAAuB,CAAC;IAC/C,gBAAgB,GAAG,IAAI,GAAG,EAG/B,CAAC;IAEJ,YACU,KAAmB,EACnB,eAAgC;QADhC,UAAK,GAAL,KAAK,CAAc;QACnB,oBAAe,GAAf,eAAe,CAAiB;IACvC,CAAC;IAEJ,iBAAiB,CAAC,SAA2B;QAC3C,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YAE5C,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;YAClC,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;gBAClC,IAAI,IAAI,CAAC,SAAS;oBAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBAChD,IAAI,IAAI,CAAC,SAAS;oBAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAClD,CAAC;YACD,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAE/C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC/C,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC;gBAChC,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC;gBAEtB,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;oBACpC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;gBACrC,CAAC;gBACD,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC;gBAEjE,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC3D,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;YACnE,CAAC;YAED,IAAI,CAAC,yBAAyB,CAAC,QAAQ,CAAC,CAAC;YACzC,MAAM,CAAC,KAAK,CACV,kCAAkC,QAAQ,CAAC,IAAI,qBAAqB,QAAQ,CAAC,KAAK,CAAC,MAAM,QAAQ,CAClG,CAAC;QACJ,CAAC;IACH,CAAC;IAED,WAAW,CAAC,IAAY;QACtB,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;IAED,KAAK,CAAC,aAAa,CACjB,YAAoB,EACpB,SAAiB,EACjB,OAAgB;QAEhB,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAClD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CACb,kCAAkC,YAAY,aAAa,CAC5D,CAAC;QACJ,CAAC;QAED,MAAM,KAAK,GAAkB;YAC3B,YAAY;YACZ,WAAW,EAAE,CAAC;YACd,MAAM,EAAE,SAAS;SAClB,CAAC;QACF,MAAM,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAEvC,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC;QACrC,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,YAAY,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;QAC/D,MAAM,CAAC,KAAK,CACV,2CAA2C,YAAY,iBAAiB,SAAS,kBAAkB,SAAS,CAAC,IAAI,GAAG,CACrH,CAAC;QAEF,IAAI,CAAC,KAAK,CAAC,cAAc,CACvB,OAAO,EACP,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CACvC,CAAC;IACJ,CAAC;IAEO,yBAAyB,CAAC,QAAwB;QACxD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC/C,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC;YAChC,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YAE3D,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAC3B,SAAS,OAAO,YAAY,EAC5B,CAAC,OAAe,EAAE,EAAE;gBAClB,IAAI,CAAC,oBAAoB,CAAC,QAAQ,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;YAClD,CAAC,CACF,CAAC;YAEF,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAC3B,SAAS,OAAO,SAAS,EACzB,CAAC,OAAe,EAAE,EAAE;gBAClB,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;YAC/C,CAAC,CACF,CAAC;QACJ,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,oBAAoB,CAChC,QAAwB,EACxB,SAAiB,EACjB,OAAe;QAEf,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAGhD,CAAC;QAEF,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QAC7C,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,YAAY,KAAK,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnD,OAAO;QACT,CAAC;QAED,IAAI,KAAK,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;YACpC,MAAM,CAAC,IAAI,CACT,2CAA2C,QAAQ,CAAC,IAAI,iBAAiB,SAAS,oBAAoB,KAAK,CAAC,WAAW,SAAS,SAAS,EAAE,CAC5I,CAAC;YACF,OAAO;QACT,CAAC;QAED,MAAM,WAAW,GAAG,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAE,CAAC;QAC/C,MAAM,SAAS,GAAG,WAAW,CAAC,SAAS,CAAC;QAExC,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;YAC5D,IAAI,WAAW,KAAK,CAAC,CAAC,EAAE,CAAC;gBACvB,MAAM,CAAC,KAAK,CACV,0CAA0C,SAAS,4BAA4B,QAAQ,CAAC,IAAI,GAAG,CAChG,CAAC;gBACF,OAAO;YACT,CAAC;YACD,MAAM,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;YAClE,OAAO;QACT,CAAC;QAED,MAAM,aAAa,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QAE7D,IAAI,aAAa,KAAK,CAAC,CAAC,EAAE,CAAC;YACzB,KAAK,CAAC,MAAM,GAAG,WAAW,CAAC;YAC3B,KAAK,CAAC,WAAW,GAAG,SAAS,CAAC;YAC9B,MAAM,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;YACvC,MAAM,CAAC,KAAK,CACV,kCAAkC,QAAQ,CAAC,IAAI,2BAA2B,SAAS,GAAG,CACvF,CAAC;YACF,MAAM,IAAI,CAAC,oBAAoB,CAAC,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;YAC3E,OAAO;QACT,CAAC;QAED,MAAM,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,SAAS,EAAE,aAAa,EAAE,OAAO,CAAC,CAAC;IACtE,CAAC;IAEO,KAAK,CAAC,iBAAiB,CAC7B,QAAwB,EACxB,SAAiB,EACjB,OAAe;QAEf,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAGhD,CAAC;QAEF,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QAC7C,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,YAAY,KAAK,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnD,OAAO;QACT,CAAC;QAED,IAAI,KAAK,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;YACpC,MAAM,CAAC,IAAI,CACT,2CAA2C,QAAQ,CAAC,IAAI,iBAAiB,SAAS,oBAAoB,KAAK,CAAC,WAAW,SAAS,SAAS,EAAE,CAC5I,CAAC;YACF,OAAO;QACT,CAAC;QAED,MAAM,WAAW,GAAG,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAE,CAAC;QAC/C,MAAM,SAAS,GAAG,WAAW,CAAC,SAAS,CAAC;QAExC,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;YAC5D,IAAI,WAAW,KAAK,CAAC,CAAC,EAAE,CAAC;gBACvB,MAAM,CAAC,KAAK,CACV,0CAA0C,SAAS,4BAA4B,QAAQ,CAAC,IAAI,GAAG,CAChG,CAAC;gBACF,OAAO;YACT,CAAC;YACD,MAAM,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;YAClE,OAAO;QACT,CAAC;QAED,KAAK,CAAC,MAAM,GAAG,QAAQ,CAAC;QACxB,MAAM,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QACvC,MAAM,CAAC,KAAK,CACV,kCAAkC,QAAQ,CAAC,IAAI,qBAAqB,WAAW,CAAC,IAAI,iBAAiB,SAAS,GAAG,CAClH,CAAC;QACF,MAAM,IAAI,CAAC,oBAAoB,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;IAC1E,CAAC;IAEO,KAAK,CAAC,WAAW,CACvB,QAAwB,EACxB,SAAiB,EACjB,WAAmB,EACnB,OAAgB;QAEhB,MAAM,KAAK,GAAkB;YAC3B,YAAY,EAAE,QAAQ,CAAC,IAAI;YAC3B,WAAW,EAAE,WAAW;YACxB,MAAM,EAAE,SAAS;SAClB,CAAC;QACF,MAAM,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAEvC,MAAM,UAAU,GAAG,QAAQ,CAAC,KAAK,CAAC,WAAW,CAAE,CAAC;QAChD,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC;QACjE,MAAM,CAAC,KAAK,CACV,kCAAkC,QAAQ,CAAC,IAAI,uBAAuB,WAAW,MAAM,UAAU,CAAC,IAAI,iBAAiB,SAAS,GAAG,CACpI,CAAC;QAEF,IAAI,CAAC,KAAK,CAAC,cAAc,CACvB,OAAO,EACP,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CACvC,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,oBAAoB,CAChC,QAAwB,EACxB,OAA+B,EAC/B,SAAiB,EACjB,OAAgB;QAEhB,MAAM,OAAO,GAAa,EAAE,CAAC;QAE7B,IAAI,OAAO,KAAK,WAAW,IAAI,QAAQ,CAAC,SAAS,EAAE,CAAC;YAClD,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QACnC,CAAC;QACD,IAAI,OAAO,KAAK,QAAQ,IAAI,QAAQ,CAAC,SAAS,EAAE,CAAC;YAC/C,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QACnC,CAAC;QACD,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC;YACxB,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QACpC,CAAC;QAED,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC/B,MAAM,CAAC,KAAK,CACV,kCAAkC,QAAQ,CAAC,IAAI,0BAA0B,MAAM,iBAAiB,SAAS,GAAG,CAC7G,CAAC;gBACF,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;YACvD,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,KAAK,CACV,0CAA0C,MAAM,sBAAsB,QAAQ,CAAC,IAAI,IAAI,CACxF,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAEO,YAAY,CAAC,QAAwB,EAAE,YAAoB;QACjE,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACtD,KAAK,IAAI,CAAC,GAAG,YAAY,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC9D,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC3C,OAAO,CAAC,CAAC;YACX,CAAC;QACH,CAAC;QACD,OAAO,CAAC,CAAC,CAAC;IACZ,CAAC;IAEO,aAAa,CAAC,QAAwB,EAAE,QAAgB;QAC9D,OAAO,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;IACpE,CAAC;IAEO,WAAW,CAAC,YAAoB,EAAE,QAAgB;QACxD,OAAO,YAAY,YAAY,IAAI,QAAQ,EAAE,CAAC;IAChD,CAAC;IAEO,QAAQ,CAAC,SAAiB;QAChC,OAAO,kBAAkB,SAAS,EAAE,CAAC;IACvC,CAAC;IAEO,KAAK,CAAC,SAAS,CACrB,SAAiB,EACjB,KAAoB;QAEpB,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CACvB,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EACxB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EACrB,KAAK,CACN,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,QAAQ,CAAC,SAAiB;QACtC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;QAChE,IAAI,CAAC,GAAG;YAAE,OAAO,IAAI,CAAC;QACtB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAkB,CAAC;IAC1C,CAAC;CACF"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@synkro/core",
|
|
3
|
-
"version": "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",
|