@synkro/nestjs 0.1.2 → 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/LICENSE ADDED
@@ -0,0 +1,15 @@
1
+ ISC License
2
+
3
+ Copyright (c) 2026 buemura
4
+
5
+ Permission to use, copy, modify, and/or distribute this software for any
6
+ purpose with or without fee is hereby granted, provided that the above
7
+ copyright notice and this permission notice appear in all copies.
8
+
9
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10
+ WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11
+ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12
+ ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13
+ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14
+ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15
+ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
package/README.md CHANGED
@@ -34,7 +34,7 @@ SynkroModule.forRootAsync({
34
34
  inject: [ConfigService],
35
35
  useFactory: (config: ConfigService) => ({
36
36
  transport: "redis",
37
- redisUrl: config.get("REDIS_URL"),
37
+ connectionUrl: config.get("REDIS_URL"),
38
38
  }),
39
39
  });
40
40
  ```
@@ -0,0 +1,2 @@
1
+ import "reflect-metadata";
2
+ //# sourceMappingURL=on-event.decorator.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"on-event.decorator.test.d.ts","sourceRoot":"","sources":["../../src/decorators/on-event.decorator.test.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC"}
@@ -0,0 +1,70 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import "reflect-metadata";
11
+ import { describe, it, expect } from "vitest";
12
+ import { OnEvent } from "./on-event.decorator.js";
13
+ import { ON_EVENT_METADATA } from "../synkro.constants.js";
14
+ describe("@OnEvent", () => {
15
+ it("should set metadata with event type", () => {
16
+ class TestHandler {
17
+ handle() { }
18
+ }
19
+ __decorate([
20
+ OnEvent("UserCreated"),
21
+ __metadata("design:type", Function),
22
+ __metadata("design:paramtypes", []),
23
+ __metadata("design:returntype", void 0)
24
+ ], TestHandler.prototype, "handle", null);
25
+ const metadata = Reflect.getMetadata(ON_EVENT_METADATA, TestHandler.prototype.handle);
26
+ expect(metadata).toEqual({
27
+ eventType: "UserCreated",
28
+ retry: undefined,
29
+ });
30
+ });
31
+ it("should set metadata with event type and retry config", () => {
32
+ class TestHandler {
33
+ handle() { }
34
+ }
35
+ __decorate([
36
+ OnEvent("OrderPlaced", { maxRetries: 3 }),
37
+ __metadata("design:type", Function),
38
+ __metadata("design:paramtypes", []),
39
+ __metadata("design:returntype", void 0)
40
+ ], TestHandler.prototype, "handle", null);
41
+ const metadata = Reflect.getMetadata(ON_EVENT_METADATA, TestHandler.prototype.handle);
42
+ expect(metadata).toEqual({
43
+ eventType: "OrderPlaced",
44
+ retry: { maxRetries: 3 },
45
+ });
46
+ });
47
+ it("should support multiple decorated methods on the same class", () => {
48
+ class TestHandler {
49
+ handleA() { }
50
+ handleB() { }
51
+ }
52
+ __decorate([
53
+ OnEvent("EventA"),
54
+ __metadata("design:type", Function),
55
+ __metadata("design:paramtypes", []),
56
+ __metadata("design:returntype", void 0)
57
+ ], TestHandler.prototype, "handleA", null);
58
+ __decorate([
59
+ OnEvent("EventB", { maxRetries: 1 }),
60
+ __metadata("design:type", Function),
61
+ __metadata("design:paramtypes", []),
62
+ __metadata("design:returntype", void 0)
63
+ ], TestHandler.prototype, "handleB", null);
64
+ const metadataA = Reflect.getMetadata(ON_EVENT_METADATA, TestHandler.prototype.handleA);
65
+ const metadataB = Reflect.getMetadata(ON_EVENT_METADATA, TestHandler.prototype.handleB);
66
+ expect(metadataA).toEqual({ eventType: "EventA", retry: undefined });
67
+ expect(metadataB).toEqual({ eventType: "EventB", retry: { maxRetries: 1 } });
68
+ });
69
+ });
70
+ //# sourceMappingURL=on-event.decorator.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"on-event.decorator.test.js","sourceRoot":"","sources":["../../src/decorators/on-event.decorator.test.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAE3D,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;IACxB,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,WAAW;YAEf,MAAM,KAAI,CAAC;SACZ;QADC;YADC,OAAO,CAAC,aAAa,CAAC;;;;iDACZ;QAGb,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,CAClC,iBAAiB,EACjB,WAAW,CAAC,SAAS,CAAC,MAAM,CAC7B,CAAC;QACF,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC;YACvB,SAAS,EAAE,aAAa;YACxB,KAAK,EAAE,SAAS;SACjB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,MAAM,WAAW;YAEf,MAAM,KAAI,CAAC;SACZ;QADC;YADC,OAAO,CAAC,aAAa,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC;;;;iDAC/B;QAGb,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,CAClC,iBAAiB,EACjB,WAAW,CAAC,SAAS,CAAC,MAAM,CAC7B,CAAC;QACF,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC;YACvB,SAAS,EAAE,aAAa;YACxB,KAAK,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE;SACzB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;QACrE,MAAM,WAAW;YAEf,OAAO,KAAI,CAAC;YAGZ,OAAO,KAAI,CAAC;SACb;QAJC;YADC,OAAO,CAAC,QAAQ,CAAC;;;;kDACN;QAGZ;YADC,OAAO,CAAC,QAAQ,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC;;;;kDACzB;QAGd,MAAM,SAAS,GAAG,OAAO,CAAC,WAAW,CACnC,iBAAiB,EACjB,WAAW,CAAC,SAAS,CAAC,OAAO,CAC9B,CAAC;QACF,MAAM,SAAS,GAAG,OAAO,CAAC,WAAW,CACnC,iBAAiB,EACjB,WAAW,CAAC,SAAS,CAAC,OAAO,CAC9B,CAAC;QAEF,MAAM,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QACrE,MAAM,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;IAC/E,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ import "reflect-metadata";
2
+ //# sourceMappingURL=on-workflow-step.decorator.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"on-workflow-step.decorator.test.d.ts","sourceRoot":"","sources":["../../src/decorators/on-workflow-step.decorator.test.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC"}
@@ -0,0 +1,76 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import "reflect-metadata";
11
+ import { describe, it, expect } from "vitest";
12
+ import { OnWorkflowStep } from "./on-workflow-step.decorator.js";
13
+ import { ON_WORKFLOW_STEP_METADATA } from "../synkro.constants.js";
14
+ describe("@OnWorkflowStep", () => {
15
+ it("should set metadata with workflow name and step type", () => {
16
+ class TestHandler {
17
+ handle() { }
18
+ }
19
+ __decorate([
20
+ OnWorkflowStep("ProcessOrder", "ValidateStock"),
21
+ __metadata("design:type", Function),
22
+ __metadata("design:paramtypes", []),
23
+ __metadata("design:returntype", void 0)
24
+ ], TestHandler.prototype, "handle", null);
25
+ const metadata = Reflect.getMetadata(ON_WORKFLOW_STEP_METADATA, TestHandler.prototype.handle);
26
+ expect(metadata).toEqual({
27
+ workflowName: "ProcessOrder",
28
+ stepType: "ValidateStock",
29
+ });
30
+ });
31
+ it("should support multiple decorated methods on the same class", () => {
32
+ class TestHandler {
33
+ handleA() { }
34
+ handleB() { }
35
+ }
36
+ __decorate([
37
+ OnWorkflowStep("ProcessOrder", "StepA"),
38
+ __metadata("design:type", Function),
39
+ __metadata("design:paramtypes", []),
40
+ __metadata("design:returntype", void 0)
41
+ ], TestHandler.prototype, "handleA", null);
42
+ __decorate([
43
+ OnWorkflowStep("ProcessOrder", "StepB"),
44
+ __metadata("design:type", Function),
45
+ __metadata("design:paramtypes", []),
46
+ __metadata("design:returntype", void 0)
47
+ ], TestHandler.prototype, "handleB", null);
48
+ const metadataA = Reflect.getMetadata(ON_WORKFLOW_STEP_METADATA, TestHandler.prototype.handleA);
49
+ const metadataB = Reflect.getMetadata(ON_WORKFLOW_STEP_METADATA, TestHandler.prototype.handleB);
50
+ expect(metadataA).toEqual({ workflowName: "ProcessOrder", stepType: "StepA" });
51
+ expect(metadataB).toEqual({ workflowName: "ProcessOrder", stepType: "StepB" });
52
+ });
53
+ it("should support different workflow names", () => {
54
+ class TestHandler {
55
+ handleA() { }
56
+ handleB() { }
57
+ }
58
+ __decorate([
59
+ OnWorkflowStep("WorkflowA", "Step1"),
60
+ __metadata("design:type", Function),
61
+ __metadata("design:paramtypes", []),
62
+ __metadata("design:returntype", void 0)
63
+ ], TestHandler.prototype, "handleA", null);
64
+ __decorate([
65
+ OnWorkflowStep("WorkflowB", "Step1"),
66
+ __metadata("design:type", Function),
67
+ __metadata("design:paramtypes", []),
68
+ __metadata("design:returntype", void 0)
69
+ ], TestHandler.prototype, "handleB", null);
70
+ const metadataA = Reflect.getMetadata(ON_WORKFLOW_STEP_METADATA, TestHandler.prototype.handleA);
71
+ const metadataB = Reflect.getMetadata(ON_WORKFLOW_STEP_METADATA, TestHandler.prototype.handleB);
72
+ expect(metadataA).toEqual({ workflowName: "WorkflowA", stepType: "Step1" });
73
+ expect(metadataB).toEqual({ workflowName: "WorkflowB", stepType: "Step1" });
74
+ });
75
+ });
76
+ //# sourceMappingURL=on-workflow-step.decorator.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"on-workflow-step.decorator.test.js","sourceRoot":"","sources":["../../src/decorators/on-workflow-step.decorator.test.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACjE,OAAO,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AAEnE,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,MAAM,WAAW;YAEf,MAAM,KAAI,CAAC;SACZ;QADC;YADC,cAAc,CAAC,cAAc,EAAE,eAAe,CAAC;;;;iDACrC;QAGb,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,CAClC,yBAAyB,EACzB,WAAW,CAAC,SAAS,CAAC,MAAM,CAC7B,CAAC;QACF,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC;YACvB,YAAY,EAAE,cAAc;YAC5B,QAAQ,EAAE,eAAe;SAC1B,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;QACrE,MAAM,WAAW;YAEf,OAAO,KAAI,CAAC;YAGZ,OAAO,KAAI,CAAC;SACb;QAJC;YADC,cAAc,CAAC,cAAc,EAAE,OAAO,CAAC;;;;kDAC5B;QAGZ;YADC,cAAc,CAAC,cAAc,EAAE,OAAO,CAAC;;;;kDAC5B;QAGd,MAAM,SAAS,GAAG,OAAO,CAAC,WAAW,CACnC,yBAAyB,EACzB,WAAW,CAAC,SAAS,CAAC,OAAO,CAC9B,CAAC;QACF,MAAM,SAAS,GAAG,OAAO,CAAC,WAAW,CACnC,yBAAyB,EACzB,WAAW,CAAC,SAAS,CAAC,OAAO,CAC9B,CAAC;QAEF,MAAM,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,EAAE,YAAY,EAAE,cAAc,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;QAC/E,MAAM,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,EAAE,YAAY,EAAE,cAAc,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;IACjF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,WAAW;YAEf,OAAO,KAAI,CAAC;YAGZ,OAAO,KAAI,CAAC;SACb;QAJC;YADC,cAAc,CAAC,WAAW,EAAE,OAAO,CAAC;;;;kDACzB;QAGZ;YADC,cAAc,CAAC,WAAW,EAAE,OAAO,CAAC;;;;kDACzB;QAGd,MAAM,SAAS,GAAG,OAAO,CAAC,WAAW,CACnC,yBAAyB,EACzB,WAAW,CAAC,SAAS,CAAC,OAAO,CAC9B,CAAC;QACF,MAAM,SAAS,GAAG,OAAO,CAAC,WAAW,CACnC,yBAAyB,EACzB,WAAW,CAAC,SAAS,CAAC,OAAO,CAC9B,CAAC;QAEF,MAAM,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;QAC5E,MAAM,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;IAC9E,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ import "reflect-metadata";
2
+ //# sourceMappingURL=synkro.explorer.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"synkro.explorer.test.d.ts","sourceRoot":"","sources":["../src/synkro.explorer.test.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC"}
@@ -0,0 +1,166 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import "reflect-metadata";
11
+ import { describe, it, expect } from "vitest";
12
+ import { Test } from "@nestjs/testing";
13
+ import { Injectable } from "@nestjs/common";
14
+ import { DiscoveryModule } from "@nestjs/core";
15
+ import { SynkroExplorer } from "./synkro.explorer.js";
16
+ import { OnEvent } from "./decorators/on-event.decorator.js";
17
+ import { OnWorkflowStep } from "./decorators/on-workflow-step.decorator.js";
18
+ let TestEventHandler = class TestEventHandler {
19
+ async handleUserCreated(ctx) {
20
+ return ctx.payload;
21
+ }
22
+ async handleOrderPlaced(ctx) {
23
+ return ctx.payload;
24
+ }
25
+ };
26
+ __decorate([
27
+ OnEvent("UserCreated", { maxRetries: 2 }),
28
+ __metadata("design:type", Function),
29
+ __metadata("design:paramtypes", [Object]),
30
+ __metadata("design:returntype", Promise)
31
+ ], TestEventHandler.prototype, "handleUserCreated", null);
32
+ __decorate([
33
+ OnEvent("OrderPlaced"),
34
+ __metadata("design:type", Function),
35
+ __metadata("design:paramtypes", [Object]),
36
+ __metadata("design:returntype", Promise)
37
+ ], TestEventHandler.prototype, "handleOrderPlaced", null);
38
+ TestEventHandler = __decorate([
39
+ Injectable()
40
+ ], TestEventHandler);
41
+ let TestWorkflowHandler = class TestWorkflowHandler {
42
+ async handleValidateStock(ctx) {
43
+ return ctx.payload;
44
+ }
45
+ async handleProcessPayment(ctx) {
46
+ return ctx.payload;
47
+ }
48
+ async handleShip(ctx) {
49
+ return ctx.payload;
50
+ }
51
+ };
52
+ __decorate([
53
+ OnWorkflowStep("ProcessOrder", "ValidateStock"),
54
+ __metadata("design:type", Function),
55
+ __metadata("design:paramtypes", [Object]),
56
+ __metadata("design:returntype", Promise)
57
+ ], TestWorkflowHandler.prototype, "handleValidateStock", null);
58
+ __decorate([
59
+ OnWorkflowStep("ProcessOrder", "ProcessPayment"),
60
+ __metadata("design:type", Function),
61
+ __metadata("design:paramtypes", [Object]),
62
+ __metadata("design:returntype", Promise)
63
+ ], TestWorkflowHandler.prototype, "handleProcessPayment", null);
64
+ __decorate([
65
+ OnWorkflowStep("StartShipment", "Ship"),
66
+ __metadata("design:type", Function),
67
+ __metadata("design:paramtypes", [Object]),
68
+ __metadata("design:returntype", Promise)
69
+ ], TestWorkflowHandler.prototype, "handleShip", null);
70
+ TestWorkflowHandler = __decorate([
71
+ Injectable()
72
+ ], TestWorkflowHandler);
73
+ let PlainService = class PlainService {
74
+ doSomething() {
75
+ return "no decorators here";
76
+ }
77
+ };
78
+ PlainService = __decorate([
79
+ Injectable()
80
+ ], PlainService);
81
+ describe("SynkroExplorer", () => {
82
+ async function createExplorer(providers) {
83
+ const module = await Test.createTestingModule({
84
+ imports: [DiscoveryModule],
85
+ providers: [SynkroExplorer, ...providers],
86
+ }).compile();
87
+ await module.init();
88
+ return module.get(SynkroExplorer);
89
+ }
90
+ describe("exploreEventHandlers", () => {
91
+ it("should discover @OnEvent decorated methods", async () => {
92
+ const explorer = await createExplorer([TestEventHandler]);
93
+ const handlers = explorer.exploreEventHandlers();
94
+ expect(handlers).toHaveLength(2);
95
+ expect(handlers).toEqual(expect.arrayContaining([
96
+ expect.objectContaining({
97
+ eventType: "UserCreated",
98
+ retry: { maxRetries: 2 },
99
+ }),
100
+ expect.objectContaining({
101
+ eventType: "OrderPlaced",
102
+ retry: undefined,
103
+ }),
104
+ ]));
105
+ });
106
+ it("should return bound handler functions", async () => {
107
+ const explorer = await createExplorer([TestEventHandler]);
108
+ const handlers = explorer.exploreEventHandlers();
109
+ for (const handler of handlers) {
110
+ expect(typeof handler.handler).toBe("function");
111
+ }
112
+ });
113
+ it("should return empty array when no handlers are registered", async () => {
114
+ const explorer = await createExplorer([PlainService]);
115
+ const handlers = explorer.exploreEventHandlers();
116
+ expect(handlers).toHaveLength(0);
117
+ });
118
+ });
119
+ describe("exploreWorkflowStepHandlers", () => {
120
+ it("should discover @OnWorkflowStep decorated methods", async () => {
121
+ const explorer = await createExplorer([TestWorkflowHandler]);
122
+ const handlers = explorer.exploreWorkflowStepHandlers();
123
+ expect(handlers).toHaveLength(3);
124
+ expect(handlers).toEqual(expect.arrayContaining([
125
+ expect.objectContaining({
126
+ workflowName: "ProcessOrder",
127
+ stepType: "ValidateStock",
128
+ }),
129
+ expect.objectContaining({
130
+ workflowName: "ProcessOrder",
131
+ stepType: "ProcessPayment",
132
+ }),
133
+ expect.objectContaining({
134
+ workflowName: "StartShipment",
135
+ stepType: "Ship",
136
+ }),
137
+ ]));
138
+ });
139
+ it("should return bound handler functions", async () => {
140
+ const explorer = await createExplorer([TestWorkflowHandler]);
141
+ const handlers = explorer.exploreWorkflowStepHandlers();
142
+ for (const handler of handlers) {
143
+ expect(typeof handler.handler).toBe("function");
144
+ }
145
+ });
146
+ it("should return empty array when no handlers are registered", async () => {
147
+ const explorer = await createExplorer([PlainService]);
148
+ const handlers = explorer.exploreWorkflowStepHandlers();
149
+ expect(handlers).toHaveLength(0);
150
+ });
151
+ });
152
+ describe("mixed providers", () => {
153
+ it("should discover handlers from multiple providers", async () => {
154
+ const explorer = await createExplorer([
155
+ TestEventHandler,
156
+ TestWorkflowHandler,
157
+ PlainService,
158
+ ]);
159
+ const eventHandlers = explorer.exploreEventHandlers();
160
+ const workflowHandlers = explorer.exploreWorkflowStepHandlers();
161
+ expect(eventHandlers).toHaveLength(2);
162
+ expect(workflowHandlers).toHaveLength(3);
163
+ });
164
+ });
165
+ });
166
+ //# sourceMappingURL=synkro.explorer.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"synkro.explorer.test.js","sourceRoot":"","sources":["../src/synkro.explorer.test.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import type { SynkroWorkflow } from "@synkro/core";
2
2
  export interface SynkroModuleOptions {
3
3
  transport: "redis" | "in-memory";
4
- redisUrl?: string;
4
+ connectionUrl?: string;
5
5
  debug?: boolean;
6
6
  workflows?: SynkroWorkflow[];
7
7
  }
@@ -1 +1 @@
1
- {"version":3,"file":"synkro.interfaces.d.ts","sourceRoot":"","sources":["../src/synkro.interfaces.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAEnD,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,OAAO,GAAG,WAAW,CAAC;IACjC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,cAAc,EAAE,CAAC;CAC9B;AAED,MAAM,WAAW,wBAAwB;IACvC,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC;IAChB,UAAU,EAAE,CACV,GAAG,IAAI,EAAE,GAAG,EAAE,KACX,OAAO,CAAC,mBAAmB,CAAC,GAAG,mBAAmB,CAAC;IACxD,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC;CAChB"}
1
+ {"version":3,"file":"synkro.interfaces.d.ts","sourceRoot":"","sources":["../src/synkro.interfaces.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAEnD,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,OAAO,GAAG,WAAW,CAAC;IACjC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,cAAc,EAAE,CAAC;CAC9B;AAED,MAAM,WAAW,wBAAwB;IACvC,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC;IAChB,UAAU,EAAE,CACV,GAAG,IAAI,EAAE,GAAG,EAAE,KACX,OAAO,CAAC,mBAAmB,CAAC,GAAG,mBAAmB,CAAC;IACxD,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC;CAChB"}
@@ -1,4 +1,4 @@
1
- import { DynamicModule } from "@nestjs/common";
1
+ import { type DynamicModule } from "@nestjs/common";
2
2
  import type { SynkroModuleAsyncOptions, SynkroModuleOptions } from "./synkro.interfaces.js";
3
3
  export declare class SynkroModule {
4
4
  static forRoot(options: SynkroModuleOptions): DynamicModule;
@@ -1 +1 @@
1
- {"version":3,"file":"synkro.module.d.ts","sourceRoot":"","sources":["../src/synkro.module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAU,MAAM,gBAAgB,CAAC;AAMvD,OAAO,KAAK,EACV,wBAAwB,EACxB,mBAAmB,EACpB,MAAM,wBAAwB,CAAC;AAEhC,qBACa,YAAY;IACvB,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,mBAAmB,GAAG,aAAa;IAiB3D,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,wBAAwB,GAAG,aAAa;CAiBtE"}
1
+ {"version":3,"file":"synkro.module.d.ts","sourceRoot":"","sources":["../src/synkro.module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAAU,MAAM,gBAAgB,CAAC;AAM5D,OAAO,KAAK,EACV,wBAAwB,EACxB,mBAAmB,EACpB,MAAM,wBAAwB,CAAC;AAEhC,qBACa,YAAY;IACvB,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,mBAAmB,GAAG,aAAa;IAiB3D,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,wBAAwB,GAAG,aAAa;CAiBtE"}
@@ -1 +1 @@
1
- {"version":3,"file":"synkro.module.js","sourceRoot":"","sources":["../src/synkro.module.ts"],"names":[],"mappings":";;;;;;;AAAA,OAAO,EAAiB,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAO7C,IAAM,YAAY,oBAAlB,MAAM,YAAY;IACvB,MAAM,CAAC,OAAO,CAAC,OAA4B;QACzC,OAAO;YACL,MAAM,EAAE,cAAY;YACpB,OAAO,EAAE,CAAC,eAAe,CAAC;YAC1B,SAAS,EAAE;gBACT;oBACE,OAAO,EAAE,qBAAqB;oBAC9B,QAAQ,EAAE,OAAO;iBAClB;gBACD,cAAc;gBACd,aAAa;aACd;YACD,OAAO,EAAE,CAAC,aAAa,CAAC;YACxB,MAAM,EAAE,IAAI;SACb,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,YAAY,CAAC,OAAiC;QACnD,OAAO;YACL,MAAM,EAAE,cAAY;YACpB,OAAO,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,eAAe,CAAC;YACtD,SAAS,EAAE;gBACT;oBACE,OAAO,EAAE,qBAAqB;oBAC9B,UAAU,EAAE,OAAO,CAAC,UAAU;oBAC9B,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,EAAE;iBAC7B;gBACD,cAAc;gBACd,aAAa;aACd;YACD,OAAO,EAAE,CAAC,aAAa,CAAC;YACxB,MAAM,EAAE,IAAI;SACb,CAAC;IACJ,CAAC;CACF,CAAA;AAnCY,YAAY;IADxB,MAAM,CAAC,EAAE,CAAC;GACE,YAAY,CAmCxB"}
1
+ {"version":3,"file":"synkro.module.js","sourceRoot":"","sources":["../src/synkro.module.ts"],"names":[],"mappings":";;;;;;;AAAA,OAAO,EAAsB,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAO7C,IAAM,YAAY,oBAAlB,MAAM,YAAY;IACvB,MAAM,CAAC,OAAO,CAAC,OAA4B;QACzC,OAAO;YACL,MAAM,EAAE,cAAY;YACpB,OAAO,EAAE,CAAC,eAAe,CAAC;YAC1B,SAAS,EAAE;gBACT;oBACE,OAAO,EAAE,qBAAqB;oBAC9B,QAAQ,EAAE,OAAO;iBAClB;gBACD,cAAc;gBACd,aAAa;aACd;YACD,OAAO,EAAE,CAAC,aAAa,CAAC;YACxB,MAAM,EAAE,IAAI;SACb,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,YAAY,CAAC,OAAiC;QACnD,OAAO;YACL,MAAM,EAAE,cAAY;YACpB,OAAO,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,eAAe,CAAC;YACtD,SAAS,EAAE;gBACT;oBACE,OAAO,EAAE,qBAAqB;oBAC9B,UAAU,EAAE,OAAO,CAAC,UAAU;oBAC9B,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,EAAE;iBAC7B;gBACD,cAAc;gBACd,aAAa;aACd;YACD,OAAO,EAAE,CAAC,aAAa,CAAC;YACxB,MAAM,EAAE,IAAI;SACb,CAAC;IACJ,CAAC;CACF,CAAA;AAnCY,YAAY;IADxB,MAAM,CAAC,EAAE,CAAC;GACE,YAAY,CAmCxB"}
@@ -0,0 +1,2 @@
1
+ import "reflect-metadata";
2
+ //# sourceMappingURL=synkro.module.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"synkro.module.test.d.ts","sourceRoot":"","sources":["../src/synkro.module.test.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC"}
@@ -0,0 +1,189 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import "reflect-metadata";
11
+ import { describe, it, expect, vi } from "vitest";
12
+ import { Test } from "@nestjs/testing";
13
+ import { Injectable } from "@nestjs/common";
14
+ import { SynkroModule } from "./synkro.module.js";
15
+ import { SynkroService } from "./synkro.service.js";
16
+ import { OnEvent } from "./decorators/on-event.decorator.js";
17
+ import { OnWorkflowStep } from "./decorators/on-workflow-step.decorator.js";
18
+ let TestEventHandler = class TestEventHandler {
19
+ handleFn = vi.fn();
20
+ async handle(ctx) {
21
+ this.handleFn(ctx);
22
+ }
23
+ };
24
+ __decorate([
25
+ OnEvent("TestEvent", { maxRetries: 1 }),
26
+ __metadata("design:type", Function),
27
+ __metadata("design:paramtypes", [Object]),
28
+ __metadata("design:returntype", Promise)
29
+ ], TestEventHandler.prototype, "handle", null);
30
+ TestEventHandler = __decorate([
31
+ Injectable()
32
+ ], TestEventHandler);
33
+ const noop = async () => { };
34
+ let TestWorkflowHandler = class TestWorkflowHandler {
35
+ stockFn = vi.fn();
36
+ paymentFn = vi.fn();
37
+ async handleStockCheck(ctx) {
38
+ this.stockFn(ctx);
39
+ }
40
+ async handlePayment(ctx) {
41
+ this.paymentFn(ctx);
42
+ }
43
+ };
44
+ __decorate([
45
+ OnWorkflowStep("TestWorkflow", "StockCheck"),
46
+ __metadata("design:type", Function),
47
+ __metadata("design:paramtypes", [Object]),
48
+ __metadata("design:returntype", Promise)
49
+ ], TestWorkflowHandler.prototype, "handleStockCheck", null);
50
+ __decorate([
51
+ OnWorkflowStep("TestWorkflow", "Payment"),
52
+ __metadata("design:type", Function),
53
+ __metadata("design:paramtypes", [Object]),
54
+ __metadata("design:returntype", Promise)
55
+ ], TestWorkflowHandler.prototype, "handlePayment", null);
56
+ TestWorkflowHandler = __decorate([
57
+ Injectable()
58
+ ], TestWorkflowHandler);
59
+ describe("SynkroModule", () => {
60
+ describe("forRoot", () => {
61
+ it("should provide SynkroService", async () => {
62
+ const module = await Test.createTestingModule({
63
+ imports: [
64
+ SynkroModule.forRoot({
65
+ transport: "in-memory",
66
+ }),
67
+ ],
68
+ }).compile();
69
+ await module.init();
70
+ const service = module.get(SynkroService);
71
+ expect(service).toBeDefined();
72
+ expect(service).toBeInstanceOf(SynkroService);
73
+ await module.close();
74
+ });
75
+ it("should expose publish method", async () => {
76
+ const module = await Test.createTestingModule({
77
+ imports: [
78
+ SynkroModule.forRoot({
79
+ transport: "in-memory",
80
+ }),
81
+ ],
82
+ }).compile();
83
+ await module.init();
84
+ const service = module.get(SynkroService);
85
+ expect(typeof service.publish).toBe("function");
86
+ await module.close();
87
+ });
88
+ it("should expose on method", async () => {
89
+ const module = await Test.createTestingModule({
90
+ imports: [
91
+ SynkroModule.forRoot({
92
+ transport: "in-memory",
93
+ }),
94
+ ],
95
+ }).compile();
96
+ await module.init();
97
+ const service = module.get(SynkroService);
98
+ expect(typeof service.on).toBe("function");
99
+ await module.close();
100
+ });
101
+ });
102
+ describe("forRootAsync", () => {
103
+ it("should provide SynkroService with async config", async () => {
104
+ const module = await Test.createTestingModule({
105
+ imports: [
106
+ SynkroModule.forRootAsync({
107
+ useFactory: () => ({
108
+ transport: "in-memory",
109
+ }),
110
+ }),
111
+ ],
112
+ }).compile();
113
+ await module.init();
114
+ const service = module.get(SynkroService);
115
+ expect(service).toBeDefined();
116
+ expect(service).toBeInstanceOf(SynkroService);
117
+ await module.close();
118
+ });
119
+ });
120
+ describe("event handler discovery", () => {
121
+ it("should discover and register @OnEvent handlers", async () => {
122
+ const module = await Test.createTestingModule({
123
+ imports: [
124
+ SynkroModule.forRoot({
125
+ transport: "in-memory",
126
+ }),
127
+ ],
128
+ providers: [TestEventHandler],
129
+ }).compile();
130
+ await module.init();
131
+ const service = module.get(SynkroService);
132
+ // Publishing should invoke the discovered handler
133
+ await service.publish("TestEvent", { data: "hello" });
134
+ // Allow microtask queue to flush (in-memory transport uses queueMicrotask)
135
+ await new Promise((resolve) => setTimeout(resolve, 50));
136
+ const handler = module.get(TestEventHandler);
137
+ expect(handler.handleFn).toHaveBeenCalledTimes(1);
138
+ expect(handler.handleFn).toHaveBeenCalledWith(expect.objectContaining({
139
+ payload: { data: "hello" },
140
+ }));
141
+ await module.close();
142
+ });
143
+ });
144
+ describe("workflow step handler discovery", () => {
145
+ it("should discover and patch @OnWorkflowStep handlers into workflows", async () => {
146
+ const module = await Test.createTestingModule({
147
+ imports: [
148
+ SynkroModule.forRoot({
149
+ transport: "in-memory",
150
+ workflows: [
151
+ {
152
+ name: "TestWorkflow",
153
+ steps: [
154
+ { type: "StockCheck", handler: noop },
155
+ { type: "Payment", handler: noop },
156
+ ],
157
+ },
158
+ ],
159
+ }),
160
+ ],
161
+ providers: [TestWorkflowHandler],
162
+ }).compile();
163
+ await module.init();
164
+ const service = module.get(SynkroService);
165
+ await service.publish("TestWorkflow", { orderId: "123" });
166
+ // Allow workflow steps to complete
167
+ await new Promise((resolve) => setTimeout(resolve, 200));
168
+ const handler = module.get(TestWorkflowHandler);
169
+ expect(handler.stockFn).toHaveBeenCalledTimes(1);
170
+ expect(handler.paymentFn).toHaveBeenCalledTimes(1);
171
+ await module.close();
172
+ });
173
+ });
174
+ describe("lifecycle", () => {
175
+ it("should stop synkro on module destroy", async () => {
176
+ const module = await Test.createTestingModule({
177
+ imports: [
178
+ SynkroModule.forRoot({
179
+ transport: "in-memory",
180
+ }),
181
+ ],
182
+ }).compile();
183
+ await module.init();
184
+ // Should not throw
185
+ await module.close();
186
+ });
187
+ });
188
+ });
189
+ //# sourceMappingURL=synkro.module.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"synkro.module.test.js","sourceRoot":"","sources":["../src/synkro.module.test.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAClD,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAG5C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,oCAAoC,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,4CAA4C,CAAC;AAG5E,IAAM,gBAAgB,GAAtB,MAAM,gBAAgB;IACpB,QAAQ,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;IAGb,AAAN,KAAK,CAAC,MAAM,CAAC,GAAe;QAC1B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IACrB,CAAC;CACF,CAAA;AAHO;IADL,OAAO,CAAC,WAAW,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC;;;;8CAGvC;AANG,gBAAgB;IADrB,UAAU,EAAE;GACP,gBAAgB,CAOrB;AAED,MAAM,IAAI,GAAG,KAAK,IAAI,EAAE,GAAE,CAAC,CAAC;AAG5B,IAAM,mBAAmB,GAAzB,MAAM,mBAAmB;IACvB,OAAO,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;IAClB,SAAS,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;IAGd,AAAN,KAAK,CAAC,gBAAgB,CAAC,GAAe;QACpC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACpB,CAAC;IAGK,AAAN,KAAK,CAAC,aAAa,CAAC,GAAe;QACjC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IACtB,CAAC;CACF,CAAA;AARO;IADL,cAAc,CAAC,cAAc,EAAE,YAAY,CAAC;;;;2DAG5C;AAGK;IADL,cAAc,CAAC,cAAc,EAAE,SAAS,CAAC;;;;wDAGzC;AAZG,mBAAmB;IADxB,UAAU,EAAE;GACP,mBAAmB,CAaxB;AAED,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE;QACvB,EAAE,CAAC,8BAA8B,EAAE,KAAK,IAAI,EAAE;YAC5C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC;gBAC5C,OAAO,EAAE;oBACP,YAAY,CAAC,OAAO,CAAC;wBACnB,SAAS,EAAE,WAAW;qBACvB,CAAC;iBACH;aACF,CAAC,CAAC,OAAO,EAAE,CAAC;YAEb,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;YACpB,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;YAC1C,MAAM,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;YAC9B,MAAM,CAAC,OAAO,CAAC,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;YAE9C,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACvB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8BAA8B,EAAE,KAAK,IAAI,EAAE;YAC5C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC;gBAC5C,OAAO,EAAE;oBACP,YAAY,CAAC,OAAO,CAAC;wBACnB,SAAS,EAAE,WAAW;qBACvB,CAAC;iBACH;aACF,CAAC,CAAC,OAAO,EAAE,CAAC;YAEb,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;YACpB,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;YAC1C,MAAM,CAAC,OAAO,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAEhD,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACvB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yBAAyB,EAAE,KAAK,IAAI,EAAE;YACvC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC;gBAC5C,OAAO,EAAE;oBACP,YAAY,CAAC,OAAO,CAAC;wBACnB,SAAS,EAAE,WAAW;qBACvB,CAAC;iBACH;aACF,CAAC,CAAC,OAAO,EAAE,CAAC;YAEb,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;YACpB,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;YAC1C,MAAM,CAAC,OAAO,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAE3C,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACvB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;QAC5B,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;YAC9D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC;gBAC5C,OAAO,EAAE;oBACP,YAAY,CAAC,YAAY,CAAC;wBACxB,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;4BACjB,SAAS,EAAE,WAAoB;yBAChC,CAAC;qBACH,CAAC;iBACH;aACF,CAAC,CAAC,OAAO,EAAE,CAAC;YAEb,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;YACpB,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;YAC1C,MAAM,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;YAC9B,MAAM,CAAC,OAAO,CAAC,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;YAE9C,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACvB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACvC,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;YAC9D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC;gBAC5C,OAAO,EAAE;oBACP,YAAY,CAAC,OAAO,CAAC;wBACnB,SAAS,EAAE,WAAW;qBACvB,CAAC;iBACH;gBACD,SAAS,EAAE,CAAC,gBAAgB,CAAC;aAC9B,CAAC,CAAC,OAAO,EAAE,CAAC;YAEb,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;YACpB,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;YAE1C,kDAAkD;YAClD,MAAM,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;YAEtD,2EAA2E;YAC3E,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;YAExD,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;YAC7C,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;YAClD,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,oBAAoB,CAC3C,MAAM,CAAC,gBAAgB,CAAC;gBACtB,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE;aAC3B,CAAC,CACH,CAAC;YAEF,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACvB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,iCAAiC,EAAE,GAAG,EAAE;QAC/C,EAAE,CAAC,mEAAmE,EAAE,KAAK,IAAI,EAAE;YACjF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC;gBAC5C,OAAO,EAAE;oBACP,YAAY,CAAC,OAAO,CAAC;wBACnB,SAAS,EAAE,WAAW;wBACtB,SAAS,EAAE;4BACT;gCACE,IAAI,EAAE,cAAc;gCACpB,KAAK,EAAE;oCACL,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,IAAI,EAAE;oCACrC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE;iCACnC;6BACF;yBACF;qBACF,CAAC;iBACH;gBACD,SAAS,EAAE,CAAC,mBAAmB,CAAC;aACjC,CAAC,CAAC,OAAO,EAAE,CAAC;YAEb,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;YACpB,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;YAE1C,MAAM,OAAO,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;YAE1D,mCAAmC;YACnC,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;YAEzD,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;YAChD,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;YACjD,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;YAEnD,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACvB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;QACzB,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;YACpD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC;gBAC5C,OAAO,EAAE;oBACP,YAAY,CAAC,OAAO,CAAC;wBACnB,SAAS,EAAE,WAAW;qBACvB,CAAC;iBACH;aACF,CAAC,CAAC,OAAO,EAAE,CAAC;YAEb,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;YACpB,mBAAmB;YACnB,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACvB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,4 +1,4 @@
1
- import { OnModuleDestroy, OnModuleInit } from "@nestjs/common";
1
+ import { type OnModuleDestroy, type OnModuleInit } from "@nestjs/common";
2
2
  import type { HandlerFunction, RetryConfig } from "@synkro/core";
3
3
  import { SynkroExplorer } from "./synkro.explorer.js";
4
4
  import type { SynkroModuleOptions } from "./synkro.interfaces.js";
@@ -1 +1 @@
1
- {"version":3,"file":"synkro.service.d.ts","sourceRoot":"","sources":["../src/synkro.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,eAAe,EACf,YAAY,EACb,MAAM,gBAAgB,CAAC;AAExB,OAAO,KAAK,EACV,eAAe,EACf,WAAW,EAEZ,MAAM,cAAc,CAAC;AAGtB,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAElE,qBACa,aAAc,YAAW,YAAY,EAAE,eAAe;IAK/D,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAL3B,OAAO,CAAC,MAAM,CAAU;gBAIL,OAAO,EAAE,mBAAmB,EAC5B,QAAQ,EAAE,cAAc;IAGrC,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAkC7B,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IAIhC,OAAO,CACX,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,OAAO,EACjB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,CAAC;IAIlB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,EAAE,KAAK,CAAC,EAAE,WAAW,GAAG,IAAI;CAG3E"}
1
+ {"version":3,"file":"synkro.service.d.ts","sourceRoot":"","sources":["../src/synkro.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,eAAe,EACpB,KAAK,YAAY,EAClB,MAAM,gBAAgB,CAAC;AAExB,OAAO,KAAK,EACV,eAAe,EACf,WAAW,EAEZ,MAAM,cAAc,CAAC;AAGtB,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAElE,qBACa,aAAc,YAAW,YAAY,EAAE,eAAe;IAK/D,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAL3B,OAAO,CAAC,MAAM,CAAU;gBAIL,OAAO,EAAE,mBAAmB,EAC5B,QAAQ,EAAE,cAAc;IAGrC,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAmC7B,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IAIhC,OAAO,CACX,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,OAAO,EACjB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,CAAC;IAIlB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,EAAE,KAAK,CAAC,EAAE,WAAW,GAAG,IAAI;CAG3E"}
@@ -23,9 +23,10 @@ let SynkroService = class SynkroService {
23
23
  this.explorer = explorer;
24
24
  }
25
25
  async onModuleInit() {
26
- const workflows = this.options.workflows
27
- ? structuredClone(this.options.workflows)
28
- : [];
26
+ const workflows = (this.options.workflows ?? []).map((w) => ({
27
+ ...w,
28
+ steps: w.steps.map((s) => ({ ...s })),
29
+ }));
29
30
  // Patch decorated handler functions into workflow step definitions
30
31
  const stepHandlers = this.explorer.exploreWorkflowStepHandlers();
31
32
  for (const workflow of workflows) {
@@ -38,7 +39,7 @@ let SynkroService = class SynkroService {
38
39
  }
39
40
  const synkroOptions = {
40
41
  transport: this.options.transport,
41
- redisUrl: this.options.redisUrl,
42
+ connectionUrl: this.options.connectionUrl,
42
43
  debug: this.options.debug,
43
44
  workflows,
44
45
  };
@@ -1 +1 @@
1
- {"version":3,"file":"synkro.service.js","sourceRoot":"","sources":["../src/synkro.service.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,OAAO,EACL,MAAM,EACN,UAAU,GAGX,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAOtC,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAI/C,IAAM,aAAa,GAAnB,MAAM,aAAa;IAKL;IACA;IALX,MAAM,CAAU;IAExB,YAEmB,OAA4B,EAC5B,QAAwB;QADxB,YAAO,GAAP,OAAO,CAAqB;QAC5B,aAAQ,GAAR,QAAQ,CAAgB;IACxC,CAAC;IAEJ,KAAK,CAAC,YAAY;QAChB,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS;YACtC,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;YACzC,CAAC,CAAC,EAAE,CAAC;QAEP,mEAAmE;QACnE,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,2BAA2B,EAAE,CAAC;QACjE,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;gBAClC,MAAM,UAAU,GAAG,YAAY,CAAC,IAAI,CAClC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,KAAK,QAAQ,CAAC,IAAI,IAAI,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC,IAAI,CACpE,CAAC;gBACF,IAAI,UAAU,EAAE,CAAC;oBACf,IAAI,CAAC,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC;gBACpC,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,aAAa,GAAkB;YACnC,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS;YACjC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ;YAC/B,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK;YACzB,SAAS;SACV,CAAC;QAEF,IAAI,CAAC,MAAM,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QAEhD,qCAAqC;QACrC,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,CAAC,oBAAoB,EAAE,CAAC;QAC3D,KAAK,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,aAAa,EAAE,CAAC;YAC1D,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;IAED,KAAK,CAAC,eAAe;QACnB,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,OAAO,CACX,KAAa,EACb,OAAiB,EACjB,SAAkB;QAElB,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;IACxD,CAAC;IAED,EAAE,CAAC,SAAiB,EAAE,OAAwB,EAAE,KAAmB;QACjE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;IAC5C,CAAC;CACF,CAAA;AA1DY,aAAa;IADzB,UAAU,EAAE;IAKR,WAAA,MAAM,CAAC,qBAAqB,CAAC,CAAA;6CAEH,cAAc;GANhC,aAAa,CA0DzB"}
1
+ {"version":3,"file":"synkro.service.js","sourceRoot":"","sources":["../src/synkro.service.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,OAAO,EACL,MAAM,EACN,UAAU,GAGX,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAOtC,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAI/C,IAAM,aAAa,GAAnB,MAAM,aAAa;IAKL;IACA;IALX,MAAM,CAAU;IAExB,YAEmB,OAA4B,EAC5B,QAAwB;QADxB,YAAO,GAAP,OAAO,CAAqB;QAC5B,aAAQ,GAAR,QAAQ,CAAgB;IACxC,CAAC;IAEJ,KAAK,CAAC,YAAY;QAChB,MAAM,SAAS,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC3D,GAAG,CAAC;YACJ,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;SACtC,CAAC,CAAC,CAAC;QAEJ,mEAAmE;QACnE,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,2BAA2B,EAAE,CAAC;QACjE,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;gBAClC,MAAM,UAAU,GAAG,YAAY,CAAC,IAAI,CAClC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,KAAK,QAAQ,CAAC,IAAI,IAAI,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC,IAAI,CACpE,CAAC;gBACF,IAAI,UAAU,EAAE,CAAC;oBACf,IAAI,CAAC,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC;gBACpC,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,aAAa,GAAkB;YACnC,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS;YACjC,aAAa,EAAE,IAAI,CAAC,OAAO,CAAC,aAAa;YACzC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK;YACzB,SAAS;SACV,CAAC;QAEF,IAAI,CAAC,MAAM,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QAEhD,qCAAqC;QACrC,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,CAAC,oBAAoB,EAAE,CAAC;QAC3D,KAAK,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,aAAa,EAAE,CAAC;YAC1D,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;IAED,KAAK,CAAC,eAAe;QACnB,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,OAAO,CACX,KAAa,EACb,OAAiB,EACjB,SAAkB;QAElB,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;IACxD,CAAC;IAED,EAAE,CAAC,SAAiB,EAAE,OAAwB,EAAE,KAAmB;QACjE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;IAC5C,CAAC;CACF,CAAA;AA3DY,aAAa;IADzB,UAAU,EAAE;IAKR,WAAA,MAAM,CAAC,qBAAqB,CAAC,CAAA;6CAEH,cAAc;GANhC,aAAa,CA2DzB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@synkro/nestjs",
3
- "version": "0.1.2",
3
+ "version": "0.3.0",
4
4
  "description": "NestJS integration module for @synkro/core",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -15,10 +15,13 @@
15
15
  "dist"
16
16
  ],
17
17
  "type": "module",
18
- "scripts": {
19
- "build": "tsc",
20
- "type-check": "tsc --noEmit"
21
- },
18
+ "keywords": [
19
+ "workflow",
20
+ "state-machine",
21
+ "orchestrator",
22
+ "event-driven",
23
+ "redis"
24
+ ],
22
25
  "author": "buemura",
23
26
  "license": "ISC",
24
27
  "repository": {
@@ -29,15 +32,26 @@
29
32
  "peerDependencies": {
30
33
  "@nestjs/common": "^10.0.0 || ^11.0.0",
31
34
  "@nestjs/core": "^10.0.0 || ^11.0.0",
32
- "@synkro/core": "^0.5.0",
35
+ "@synkro/core": "^0.6.0",
33
36
  "reflect-metadata": "^0.1.13 || ^0.2.0"
34
37
  },
35
38
  "devDependencies": {
36
39
  "@nestjs/common": "^11.0.0",
37
40
  "@nestjs/core": "^11.0.0",
38
- "@synkro/core": "file:../core",
41
+ "@nestjs/testing": "^11.1.15",
42
+ "@swc/core": "^1.15.18",
43
+ "ioredis": "^5.10.0",
39
44
  "reflect-metadata": "^0.2.0",
40
45
  "rxjs": "^7.8.0",
41
- "typescript": "^5.7.0"
46
+ "typescript": "^5.7.0",
47
+ "unplugin-swc": "^1.5.9",
48
+ "vitest": "^4.0.18",
49
+ "@synkro/core": "0.6.0"
50
+ },
51
+ "scripts": {
52
+ "build": "tsc",
53
+ "type-check": "tsc --noEmit",
54
+ "test": "vitest run",
55
+ "test:watch": "vitest"
42
56
  }
43
- }
57
+ }