@synkro/core 0.16.0 → 0.17.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 +39 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/synkro.d.ts.map +1 -1
- package/dist/synkro.js +10 -1
- package/dist/synkro.js.map +1 -1
- package/dist/transport/__tests__/transport-contract.d.ts +3 -0
- package/dist/transport/__tests__/transport-contract.d.ts.map +1 -0
- package/dist/transport/__tests__/transport-contract.js +187 -0
- package/dist/transport/__tests__/transport-contract.js.map +1 -0
- package/dist/versioning.d.ts +8 -0
- package/dist/versioning.d.ts.map +1 -0
- package/dist/versioning.js +12 -0
- package/dist/versioning.js.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -17,6 +17,7 @@ Lightweight workflow and state machine orchestrator. Define event-driven workflo
|
|
|
17
17
|
- **Workflow Cancellation** — Cancel running workflows programmatically
|
|
18
18
|
- **Handler Unsubscribe** — Remove event handlers at runtime with `off()`
|
|
19
19
|
- **Typed Payloads** — Generic `HandlerCtx<T>` for compile-time payload safety
|
|
20
|
+
- **Event Versioning** — Versioned event types with automatic base-event fanout
|
|
20
21
|
- **Simple API** — Single `Synkro` class with minimal configuration
|
|
21
22
|
- **TypeScript** — Full type support out of the box
|
|
22
23
|
|
|
@@ -274,6 +275,40 @@ schemas: {
|
|
|
274
275
|
}
|
|
275
276
|
```
|
|
276
277
|
|
|
278
|
+
### Event Versioning
|
|
279
|
+
|
|
280
|
+
Versioned event types follow the `base:event:vN` convention. When a versioned event is published, it is automatically delivered to both the versioned channel and the base channel:
|
|
281
|
+
|
|
282
|
+
```ts
|
|
283
|
+
// Handler on the base event receives ALL versions (catch-all)
|
|
284
|
+
synkro.on("user:created", async (ctx) => {
|
|
285
|
+
console.log("Any version:", ctx.payload);
|
|
286
|
+
});
|
|
287
|
+
|
|
288
|
+
// Handler on a specific version receives only that version
|
|
289
|
+
synkro.on("user:created:v2", async (ctx) => {
|
|
290
|
+
console.log("V2 only:", ctx.payload);
|
|
291
|
+
});
|
|
292
|
+
|
|
293
|
+
// Publishing a versioned event delivers to both handlers above
|
|
294
|
+
await synkro.publish("user:created:v2", { name: "Alice", role: "admin" });
|
|
295
|
+
|
|
296
|
+
// Publishing an unversioned event delivers only to the base handler
|
|
297
|
+
await synkro.publish("user:created", { name: "Bob" });
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
Utility exports for working with versioned event types:
|
|
301
|
+
|
|
302
|
+
```ts
|
|
303
|
+
import { parseEventType, isVersionedEvent } from "@synkro/core";
|
|
304
|
+
|
|
305
|
+
parseEventType("user:created:v2");
|
|
306
|
+
// { base: "user:created", version: 2, raw: "user:created:v2" }
|
|
307
|
+
|
|
308
|
+
isVersionedEvent("user:created:v2"); // true
|
|
309
|
+
isVersionedEvent("user:created"); // false
|
|
310
|
+
```
|
|
311
|
+
|
|
277
312
|
## API
|
|
278
313
|
|
|
279
314
|
### `Synkro.start(options): Promise<Synkro>`
|
|
@@ -306,7 +341,7 @@ synkro.on("StockUpdate", async (ctx) => {
|
|
|
306
341
|
|
|
307
342
|
### `synkro.publish(event, payload?, requestId?): Promise<string>`
|
|
308
343
|
|
|
309
|
-
Publishes an event or starts a workflow. Returns a `requestId` for correlation. A UUID is generated by default, but you can provide your own ID.
|
|
344
|
+
Publishes an event or starts a workflow. Returns a `requestId` for correlation. A UUID is generated by default, but you can provide your own ID. When the event type is versioned (e.g., `user:created:v2`), the event is also delivered to the base channel (`user:created`).
|
|
310
345
|
|
|
311
346
|
```ts
|
|
312
347
|
// Auto-generated UUID
|
|
@@ -314,6 +349,9 @@ const id = await synkro.publish("UserSignedUp", { email: "user@example.com" });
|
|
|
314
349
|
|
|
315
350
|
// Custom request ID
|
|
316
351
|
const id = await synkro.publish("UserSignedUp", { email: "user@example.com" }, "my-custom-id");
|
|
352
|
+
|
|
353
|
+
// Versioned event — delivers to both "user:created:v2" and "user:created" channels
|
|
354
|
+
const id = await synkro.publish("user:created:v2", { name: "Alice" });
|
|
317
355
|
```
|
|
318
356
|
|
|
319
357
|
### `ctx.publish(event, payload?, requestId?): Promise<string>`
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
export { Synkro } from "./synkro.js";
|
|
2
2
|
export { Logger } from "./logger.js";
|
|
3
3
|
export { OnEvent, OnWorkflowStep, executeHandler } from "./handlers/index.js";
|
|
4
|
+
export { parseEventType, isVersionedEvent } from "./versioning.js";
|
|
5
|
+
export type { ParsedEventType } from "./versioning.js";
|
|
4
6
|
export type { ExecuteHandlerOptions, ExecuteHandlerResult } from "./handlers/index.js";
|
|
5
7
|
export type { TransportManager } from "./transport/index.js";
|
|
6
8
|
export type { DeadLetterItem, EventFilter, EventInfo, EventMetrics, LogFormat, HandlerCtx, HandlerFunction, PublishFunction, RetentionConfig, RetryBackoffStrategy, RetryConfig, SchemaValidator, SynkroEvent, SynkroIntrospection, SynkroOptions, SynkroWorkflow, SynkroWorkflowStep, WorkflowInfo, WorkflowStepInfo, } from "./types.js";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC9E,YAAY,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AACvF,YAAY,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,YAAY,EACV,cAAc,EACd,WAAW,EACX,SAAS,EACT,YAAY,EACZ,SAAS,EACT,UAAU,EACV,eAAe,EACf,eAAe,EACf,eAAe,EACf,oBAAoB,EACpB,WAAW,EACX,eAAe,EACf,WAAW,EACX,mBAAmB,EACnB,aAAa,EACb,cAAc,EACd,kBAAkB,EAClB,YAAY,EACZ,gBAAgB,GACjB,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC9E,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnE,YAAY,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACvD,YAAY,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AACvF,YAAY,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,YAAY,EACV,cAAc,EACd,WAAW,EACX,SAAS,EACT,YAAY,EACZ,SAAS,EACT,UAAU,EACV,eAAe,EACf,eAAe,EACf,eAAe,EACf,oBAAoB,EACpB,WAAW,EACX,eAAe,EACf,WAAW,EACX,mBAAmB,EACnB,aAAa,EACb,cAAc,EACd,kBAAkB,EAClB,YAAY,EACZ,gBAAgB,GACjB,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC"}
|
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC9E,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC"}
|
package/dist/synkro.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"synkro.d.ts","sourceRoot":"","sources":["../src/synkro.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"synkro.d.ts","sourceRoot":"","sources":["../src/synkro.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EACV,cAAc,EACd,WAAW,EACX,YAAY,EACZ,eAAe,EAGf,WAAW,EACX,eAAe,EACf,mBAAmB,EACnB,aAAa,EAEd,MAAM,YAAY,CAAC;AAEpB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AAKtE,qBAAa,MAAM;IACjB,OAAO,CAAC,SAAS,CAAmB;IACpC,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,gBAAgB,CAAmB;IAC3C,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IAEtC,OAAO;WASM,KAAK,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC;IAsD3D,QAAQ,CAAC,GAAG,SAAS,EAAE,MAAM,EAAE,GAAG,IAAI;IAYtC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,EAAE,KAAK,CAAC,EAAE,WAAW,EAAE,MAAM,CAAC,EAAE,eAAe,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,IAAI;IAI1H,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,IAAI;IAIjD,OAAO,CACX,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,OAAO,EACjB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,CAAC;IA2BZ,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAIxF,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAIzE,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAIzD,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAM9F,oBAAoB,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC;IAI3D,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI5D,UAAU,IAAI,mBAAmB;IAO3B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAoB3B,OAAO,CAAC,qBAAqB;CA4B9B"}
|
package/dist/synkro.js
CHANGED
|
@@ -3,6 +3,7 @@ import { HandlerRegistry, discoverEventHandlers, discoverWorkflowStepHandlers, }
|
|
|
3
3
|
import { InMemoryManager, RedisManager } from "./transport/index.js";
|
|
4
4
|
import { Logger, setDebug } from "./logger.js";
|
|
5
5
|
import { WorkflowRegistry } from "./workflows/index.js";
|
|
6
|
+
import { parseEventType } from "./versioning.js";
|
|
6
7
|
const DEFAULT_DRAIN_TIMEOUT = 5000;
|
|
7
8
|
const DRAIN_POLL_INTERVAL = 50;
|
|
8
9
|
export class Synkro {
|
|
@@ -90,7 +91,15 @@ export class Synkro {
|
|
|
90
91
|
await this.workflowRegistry.startWorkflow(event, requestId, payload);
|
|
91
92
|
return requestId;
|
|
92
93
|
}
|
|
93
|
-
|
|
94
|
+
const message = JSON.stringify({ requestId, payload });
|
|
95
|
+
await this.transport.publishMessage(event, message);
|
|
96
|
+
// Version fanout: if event is versioned (e.g. "user:created:v2"),
|
|
97
|
+
// also publish to the base channel so catch-all handlers receive it.
|
|
98
|
+
const parsed = parseEventType(event);
|
|
99
|
+
if (parsed.version !== null) {
|
|
100
|
+
const baseMessage = JSON.stringify({ requestId, payload, _version: parsed.version });
|
|
101
|
+
await this.transport.publishMessage(parsed.base, baseMessage);
|
|
102
|
+
}
|
|
94
103
|
return requestId;
|
|
95
104
|
}
|
|
96
105
|
async getWorkflowState(requestId, workflowName) {
|
package/dist/synkro.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"synkro.js","sourceRoot":"","sources":["../src/synkro.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EACL,eAAe,EACf,qBAAqB,EACrB,4BAA4B,GAC7B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"synkro.js","sourceRoot":"","sources":["../src/synkro.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport-contract.d.ts","sourceRoot":"","sources":["../../../src/transport/__tests__/transport-contract.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAExD,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC,GAC1D,IAAI,CAwON"}
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
|
|
2
|
+
export function transportContractTests(name, factory) {
|
|
3
|
+
describe(`TransportManager contract: ${name}`, () => {
|
|
4
|
+
let transport;
|
|
5
|
+
beforeEach(async () => {
|
|
6
|
+
vi.useFakeTimers();
|
|
7
|
+
transport = await factory();
|
|
8
|
+
});
|
|
9
|
+
afterEach(async () => {
|
|
10
|
+
await transport.disconnect();
|
|
11
|
+
vi.useRealTimers();
|
|
12
|
+
});
|
|
13
|
+
// ───────────────────────────── Pub/Sub ─────────────────────────────
|
|
14
|
+
describe("publishMessage / subscribeToChannel", () => {
|
|
15
|
+
it("should deliver a published message to a subscriber", async () => {
|
|
16
|
+
const received = [];
|
|
17
|
+
transport.subscribeToChannel("ch1", (msg) => received.push(msg));
|
|
18
|
+
await transport.publishMessage("ch1", "hello");
|
|
19
|
+
await vi.advanceTimersByTimeAsync(0);
|
|
20
|
+
expect(received).toEqual(["hello"]);
|
|
21
|
+
});
|
|
22
|
+
it("should deliver to multiple subscribers on the same channel", async () => {
|
|
23
|
+
const a = [];
|
|
24
|
+
const b = [];
|
|
25
|
+
transport.subscribeToChannel("ch2", (msg) => a.push(msg));
|
|
26
|
+
transport.subscribeToChannel("ch2", (msg) => b.push(msg));
|
|
27
|
+
await transport.publishMessage("ch2", "ping");
|
|
28
|
+
await vi.advanceTimersByTimeAsync(0);
|
|
29
|
+
expect(a).toEqual(["ping"]);
|
|
30
|
+
expect(b).toEqual(["ping"]);
|
|
31
|
+
});
|
|
32
|
+
it("should not deliver to subscribers on a different channel", async () => {
|
|
33
|
+
const received = [];
|
|
34
|
+
transport.subscribeToChannel("ch-a", (msg) => received.push(msg));
|
|
35
|
+
await transport.publishMessage("ch-b", "nope");
|
|
36
|
+
await vi.advanceTimersByTimeAsync(0);
|
|
37
|
+
expect(received).toEqual([]);
|
|
38
|
+
});
|
|
39
|
+
it("should not deliver after publish when no subscribers exist", async () => {
|
|
40
|
+
// Should not throw
|
|
41
|
+
await transport.publishMessage("no-sub", "orphan");
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
// ───────────────────────────── Unsubscribe ─────────────────────────────
|
|
45
|
+
describe("unsubscribeFromChannel", () => {
|
|
46
|
+
it("should stop delivering messages after unsubscribe", async () => {
|
|
47
|
+
const received = [];
|
|
48
|
+
transport.subscribeToChannel("ch-unsub", (msg) => received.push(msg));
|
|
49
|
+
await transport.publishMessage("ch-unsub", "before");
|
|
50
|
+
await vi.advanceTimersByTimeAsync(0);
|
|
51
|
+
expect(received).toEqual(["before"]);
|
|
52
|
+
transport.unsubscribeFromChannel("ch-unsub");
|
|
53
|
+
await transport.publishMessage("ch-unsub", "after");
|
|
54
|
+
await vi.advanceTimersByTimeAsync(0);
|
|
55
|
+
expect(received).toEqual(["before"]);
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
// ───────────────────────────── Cache: basic ─────────────────────────────
|
|
59
|
+
describe("cache operations", () => {
|
|
60
|
+
it("should return null for a missing key", async () => {
|
|
61
|
+
expect(await transport.getCache("missing")).toBeNull();
|
|
62
|
+
});
|
|
63
|
+
it("should set and get a value", async () => {
|
|
64
|
+
await transport.setCache("k1", "v1");
|
|
65
|
+
expect(await transport.getCache("k1")).toBe("v1");
|
|
66
|
+
});
|
|
67
|
+
it("should overwrite an existing value", async () => {
|
|
68
|
+
await transport.setCache("k1", "old");
|
|
69
|
+
await transport.setCache("k1", "new");
|
|
70
|
+
expect(await transport.getCache("k1")).toBe("new");
|
|
71
|
+
});
|
|
72
|
+
it("should delete a cached value", async () => {
|
|
73
|
+
await transport.setCache("k1", "v1");
|
|
74
|
+
await transport.deleteCache("k1");
|
|
75
|
+
expect(await transport.getCache("k1")).toBeNull();
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
// ───────────────────────────── Cache: setCacheIfNotExists ─────────────────────────────
|
|
79
|
+
describe("setCacheIfNotExists", () => {
|
|
80
|
+
it("should return true and set value when key is missing", async () => {
|
|
81
|
+
const result = await transport.setCacheIfNotExists("nx", "first");
|
|
82
|
+
expect(result).toBe(true);
|
|
83
|
+
expect(await transport.getCache("nx")).toBe("first");
|
|
84
|
+
});
|
|
85
|
+
it("should return false and preserve value when key exists", async () => {
|
|
86
|
+
await transport.setCacheIfNotExists("nx2", "first");
|
|
87
|
+
const result = await transport.setCacheIfNotExists("nx2", "second");
|
|
88
|
+
expect(result).toBe(false);
|
|
89
|
+
expect(await transport.getCache("nx2")).toBe("first");
|
|
90
|
+
});
|
|
91
|
+
});
|
|
92
|
+
// ───────────────────────────── Cache: TTL ─────────────────────────────
|
|
93
|
+
describe("cache TTL", () => {
|
|
94
|
+
it("should return value before TTL expires", async () => {
|
|
95
|
+
await transport.setCache("ttl-key", "alive", 10);
|
|
96
|
+
await vi.advanceTimersByTimeAsync(5000);
|
|
97
|
+
expect(await transport.getCache("ttl-key")).toBe("alive");
|
|
98
|
+
});
|
|
99
|
+
it("should return null after TTL expires", async () => {
|
|
100
|
+
await transport.setCache("ttl-key", "ephemeral", 2);
|
|
101
|
+
await vi.advanceTimersByTimeAsync(2000);
|
|
102
|
+
expect(await transport.getCache("ttl-key")).toBeNull();
|
|
103
|
+
});
|
|
104
|
+
it("should expire setCacheIfNotExists keys after TTL", async () => {
|
|
105
|
+
await transport.setCacheIfNotExists("nx-ttl", "val", 1);
|
|
106
|
+
await vi.advanceTimersByTimeAsync(1000);
|
|
107
|
+
expect(await transport.getCache("nx-ttl")).toBeNull();
|
|
108
|
+
// Should be settable again after expiry
|
|
109
|
+
const result = await transport.setCacheIfNotExists("nx-ttl", "new");
|
|
110
|
+
expect(result).toBe(true);
|
|
111
|
+
});
|
|
112
|
+
});
|
|
113
|
+
// ───────────────────────────── Increment ─────────────────────────────
|
|
114
|
+
describe("incrementCache", () => {
|
|
115
|
+
it("should return 1 when incrementing a missing key", async () => {
|
|
116
|
+
expect(await transport.incrementCache("counter")).toBe(1);
|
|
117
|
+
});
|
|
118
|
+
it("should increment on subsequent calls", async () => {
|
|
119
|
+
await transport.incrementCache("counter2");
|
|
120
|
+
await transport.incrementCache("counter2");
|
|
121
|
+
expect(await transport.incrementCache("counter2")).toBe(3);
|
|
122
|
+
});
|
|
123
|
+
it("should apply TTL when provided", async () => {
|
|
124
|
+
await transport.incrementCache("counter-ttl", 2);
|
|
125
|
+
await vi.advanceTimersByTimeAsync(2000);
|
|
126
|
+
expect(await transport.getCache("counter-ttl")).toBeNull();
|
|
127
|
+
});
|
|
128
|
+
});
|
|
129
|
+
// ───────────────────────────── Lists ─────────────────────────────
|
|
130
|
+
describe("list operations", () => {
|
|
131
|
+
it("should return empty array for missing list", async () => {
|
|
132
|
+
expect(await transport.getListRange("no-list", 0, -1)).toEqual([]);
|
|
133
|
+
});
|
|
134
|
+
it("should push and retrieve items in order", async () => {
|
|
135
|
+
await transport.pushToList("list1", "a");
|
|
136
|
+
await transport.pushToList("list1", "b");
|
|
137
|
+
await transport.pushToList("list1", "c");
|
|
138
|
+
expect(await transport.getListRange("list1", 0, -1)).toEqual(["a", "b", "c"]);
|
|
139
|
+
});
|
|
140
|
+
it("should support positive range indices", async () => {
|
|
141
|
+
await transport.pushToList("list2", "a");
|
|
142
|
+
await transport.pushToList("list2", "b");
|
|
143
|
+
await transport.pushToList("list2", "c");
|
|
144
|
+
expect(await transport.getListRange("list2", 0, 1)).toEqual(["a", "b"]);
|
|
145
|
+
});
|
|
146
|
+
it("should support negative stop index", async () => {
|
|
147
|
+
await transport.pushToList("list3", "a");
|
|
148
|
+
await transport.pushToList("list3", "b");
|
|
149
|
+
await transport.pushToList("list3", "c");
|
|
150
|
+
// 0 to -2 means first two elements (all except last)
|
|
151
|
+
expect(await transport.getListRange("list3", 0, -2)).toEqual(["a", "b"]);
|
|
152
|
+
});
|
|
153
|
+
});
|
|
154
|
+
// ───────────────────────────── deleteKey ─────────────────────────────
|
|
155
|
+
describe("deleteKey", () => {
|
|
156
|
+
it("should remove a list", async () => {
|
|
157
|
+
await transport.pushToList("del-list", "x");
|
|
158
|
+
await transport.deleteKey("del-list");
|
|
159
|
+
expect(await transport.getListRange("del-list", 0, -1)).toEqual([]);
|
|
160
|
+
});
|
|
161
|
+
it("should remove a cache entry", async () => {
|
|
162
|
+
await transport.setCache("del-cache", "x");
|
|
163
|
+
await transport.deleteKey("del-cache");
|
|
164
|
+
expect(await transport.getCache("del-cache")).toBeNull();
|
|
165
|
+
});
|
|
166
|
+
});
|
|
167
|
+
// ───────────────────────────── disconnect ─────────────────────────────
|
|
168
|
+
describe("disconnect", () => {
|
|
169
|
+
it("should clear all state after disconnect", async () => {
|
|
170
|
+
await transport.setCache("dc-key", "val");
|
|
171
|
+
await transport.pushToList("dc-list", "item");
|
|
172
|
+
transport.subscribeToChannel("dc-ch", () => { });
|
|
173
|
+
await transport.disconnect();
|
|
174
|
+
expect(await transport.getCache("dc-key")).toBeNull();
|
|
175
|
+
expect(await transport.getListRange("dc-list", 0, -1)).toEqual([]);
|
|
176
|
+
// Publish should not throw after disconnect
|
|
177
|
+
const received = [];
|
|
178
|
+
transport.subscribeToChannel("dc-ch", (msg) => received.push(msg));
|
|
179
|
+
await transport.publishMessage("dc-ch", "post-dc");
|
|
180
|
+
await vi.advanceTimersByTimeAsync(0);
|
|
181
|
+
// After disconnect + re-subscribe, should work fresh
|
|
182
|
+
expect(received).toEqual(["post-dc"]);
|
|
183
|
+
});
|
|
184
|
+
});
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
//# sourceMappingURL=transport-contract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport-contract.js","sourceRoot":"","sources":["../../../src/transport/__tests__/transport-contract.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export type ParsedEventType = {
|
|
2
|
+
base: string;
|
|
3
|
+
version: number | null;
|
|
4
|
+
raw: string;
|
|
5
|
+
};
|
|
6
|
+
export declare function parseEventType(eventType: string): ParsedEventType;
|
|
7
|
+
export declare function isVersionedEvent(eventType: string): boolean;
|
|
8
|
+
//# sourceMappingURL=versioning.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"versioning.d.ts","sourceRoot":"","sources":["../src/versioning.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,GAAG,EAAE,MAAM,CAAC;CACb,CAAC;AAIF,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,eAAe,CAMjE;AAED,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAE3D"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
const VERSION_PATTERN = /^(.+):v(\d+)$/;
|
|
2
|
+
export function parseEventType(eventType) {
|
|
3
|
+
const match = eventType.match(VERSION_PATTERN);
|
|
4
|
+
if (match) {
|
|
5
|
+
return { base: match[1], version: parseInt(match[2], 10), raw: eventType };
|
|
6
|
+
}
|
|
7
|
+
return { base: eventType, version: null, raw: eventType };
|
|
8
|
+
}
|
|
9
|
+
export function isVersionedEvent(eventType) {
|
|
10
|
+
return VERSION_PATTERN.test(eventType);
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=versioning.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"versioning.js","sourceRoot":"","sources":["../src/versioning.ts"],"names":[],"mappings":"AAMA,MAAM,eAAe,GAAG,eAAe,CAAC;AAExC,MAAM,UAAU,cAAc,CAAC,SAAiB;IAC9C,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;IAC/C,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAE,EAAE,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC;IAC/E,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC;AAC5D,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,SAAiB;IAChD,OAAO,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AACzC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@synkro/core",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.17.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",
|