nestjs-serverless-workflow 0.0.1

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.
Files changed (127) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +396 -0
  3. package/dist/adapter/index.d.ts +2 -0
  4. package/dist/adapter/index.d.ts.map +1 -0
  5. package/dist/adapter/index.js +2 -0
  6. package/dist/adapter/index.js.map +1 -0
  7. package/dist/adapter/lambda.adapater.d.ts +4 -0
  8. package/dist/adapter/lambda.adapater.d.ts.map +1 -0
  9. package/dist/adapter/lambda.adapater.js +63 -0
  10. package/dist/adapter/lambda.adapater.js.map +1 -0
  11. package/dist/event-bus/index.d.ts +3 -0
  12. package/dist/event-bus/index.d.ts.map +1 -0
  13. package/dist/event-bus/index.js +3 -0
  14. package/dist/event-bus/index.js.map +1 -0
  15. package/dist/event-bus/sqs/sqs.emitter.d.ts +6 -0
  16. package/dist/event-bus/sqs/sqs.emitter.d.ts.map +1 -0
  17. package/dist/event-bus/sqs/sqs.emitter.js +4 -0
  18. package/dist/event-bus/sqs/sqs.emitter.js.map +1 -0
  19. package/dist/event-bus/types/broker-publisher.interface.d.ts +5 -0
  20. package/dist/event-bus/types/broker-publisher.interface.d.ts.map +1 -0
  21. package/dist/event-bus/types/broker-publisher.interface.js +2 -0
  22. package/dist/event-bus/types/broker-publisher.interface.js.map +1 -0
  23. package/dist/event-bus/types/index.d.ts +3 -0
  24. package/dist/event-bus/types/index.d.ts.map +1 -0
  25. package/dist/event-bus/types/index.js +3 -0
  26. package/dist/event-bus/types/index.js.map +1 -0
  27. package/dist/event-bus/types/workflow-event.interface.d.ts +7 -0
  28. package/dist/event-bus/types/workflow-event.interface.d.ts.map +1 -0
  29. package/dist/event-bus/types/workflow-event.interface.js +2 -0
  30. package/dist/event-bus/types/workflow-event.interface.js.map +1 -0
  31. package/dist/exception/index.d.ts +2 -0
  32. package/dist/exception/index.d.ts.map +1 -0
  33. package/dist/exception/index.js +2 -0
  34. package/dist/exception/index.js.map +1 -0
  35. package/dist/exception/unretriable.exception.d.ts +4 -0
  36. package/dist/exception/unretriable.exception.d.ts.map +1 -0
  37. package/dist/exception/unretriable.exception.js +7 -0
  38. package/dist/exception/unretriable.exception.js.map +1 -0
  39. package/dist/workflow/decorators/default.decorator.d.ts +3 -0
  40. package/dist/workflow/decorators/default.decorator.d.ts.map +1 -0
  41. package/dist/workflow/decorators/default.decorator.js +9 -0
  42. package/dist/workflow/decorators/default.decorator.js.map +1 -0
  43. package/dist/workflow/decorators/event.decorator.d.ts +5 -0
  44. package/dist/workflow/decorators/event.decorator.d.ts.map +1 -0
  45. package/dist/workflow/decorators/event.decorator.js +20 -0
  46. package/dist/workflow/decorators/event.decorator.js.map +1 -0
  47. package/dist/workflow/decorators/index.d.ts +6 -0
  48. package/dist/workflow/decorators/index.d.ts.map +1 -0
  49. package/dist/workflow/decorators/index.js +6 -0
  50. package/dist/workflow/decorators/index.js.map +1 -0
  51. package/dist/workflow/decorators/params.decorator.d.ts +3 -0
  52. package/dist/workflow/decorators/params.decorator.d.ts.map +1 -0
  53. package/dist/workflow/decorators/params.decorator.js +19 -0
  54. package/dist/workflow/decorators/params.decorator.js.map +1 -0
  55. package/dist/workflow/decorators/with-retry.decorator.d.ts +4 -0
  56. package/dist/workflow/decorators/with-retry.decorator.d.ts.map +1 -0
  57. package/dist/workflow/decorators/with-retry.decorator.js +9 -0
  58. package/dist/workflow/decorators/with-retry.decorator.js.map +1 -0
  59. package/dist/workflow/decorators/workflow.decorator.d.ts +6 -0
  60. package/dist/workflow/decorators/workflow.decorator.d.ts.map +1 -0
  61. package/dist/workflow/decorators/workflow.decorator.js +8 -0
  62. package/dist/workflow/decorators/workflow.decorator.js.map +1 -0
  63. package/dist/workflow/index.d.ts +7 -0
  64. package/dist/workflow/index.d.ts.map +1 -0
  65. package/dist/workflow/index.js +7 -0
  66. package/dist/workflow/index.js.map +1 -0
  67. package/dist/workflow/providers/index.d.ts +4 -0
  68. package/dist/workflow/providers/index.d.ts.map +1 -0
  69. package/dist/workflow/providers/index.js +4 -0
  70. package/dist/workflow/providers/index.js.map +1 -0
  71. package/dist/workflow/providers/ochestrator.service.d.ts +32 -0
  72. package/dist/workflow/providers/ochestrator.service.d.ts.map +1 -0
  73. package/dist/workflow/providers/ochestrator.service.js +183 -0
  74. package/dist/workflow/providers/ochestrator.service.js.map +1 -0
  75. package/dist/workflow/providers/router.factory.d.ts +7 -0
  76. package/dist/workflow/providers/router.factory.d.ts.map +1 -0
  77. package/dist/workflow/providers/router.factory.js +18 -0
  78. package/dist/workflow/providers/router.factory.js.map +1 -0
  79. package/dist/workflow/providers/router.service.d.ts +16 -0
  80. package/dist/workflow/providers/router.service.d.ts.map +1 -0
  81. package/dist/workflow/providers/router.service.js +79 -0
  82. package/dist/workflow/providers/router.service.js.map +1 -0
  83. package/dist/workflow/providers/saga.service.d.ts +34 -0
  84. package/dist/workflow/providers/saga.service.d.ts.map +1 -0
  85. package/dist/workflow/providers/saga.service.js +159 -0
  86. package/dist/workflow/providers/saga.service.js.map +1 -0
  87. package/dist/workflow/types/entity.interface.d.ts +33 -0
  88. package/dist/workflow/types/entity.interface.d.ts.map +1 -0
  89. package/dist/workflow/types/entity.interface.js +2 -0
  90. package/dist/workflow/types/entity.interface.js.map +1 -0
  91. package/dist/workflow/types/index.d.ts +7 -0
  92. package/dist/workflow/types/index.d.ts.map +1 -0
  93. package/dist/workflow/types/index.js +9 -0
  94. package/dist/workflow/types/index.js.map +1 -0
  95. package/dist/workflow/types/retry.interface.d.ts +24 -0
  96. package/dist/workflow/types/retry.interface.d.ts.map +1 -0
  97. package/dist/workflow/types/retry.interface.js +10 -0
  98. package/dist/workflow/types/retry.interface.js.map +1 -0
  99. package/dist/workflow/types/saga.interface.d.ts +144 -0
  100. package/dist/workflow/types/saga.interface.d.ts.map +1 -0
  101. package/dist/workflow/types/saga.interface.js +24 -0
  102. package/dist/workflow/types/saga.interface.js.map +1 -0
  103. package/dist/workflow/types/shared.type.d.ts +5 -0
  104. package/dist/workflow/types/shared.type.d.ts.map +1 -0
  105. package/dist/workflow/types/shared.type.js +2 -0
  106. package/dist/workflow/types/shared.type.js.map +1 -0
  107. package/dist/workflow/types/transition-event.interface.d.ts +16 -0
  108. package/dist/workflow/types/transition-event.interface.d.ts.map +1 -0
  109. package/dist/workflow/types/transition-event.interface.js +2 -0
  110. package/dist/workflow/types/transition-event.interface.js.map +1 -0
  111. package/dist/workflow/types/workflow-definition.interface.d.ts +60 -0
  112. package/dist/workflow/types/workflow-definition.interface.d.ts.map +1 -0
  113. package/dist/workflow/types/workflow-definition.interface.js +2 -0
  114. package/dist/workflow/types/workflow-definition.interface.js.map +1 -0
  115. package/dist/workflow/utils/index.d.ts +2 -0
  116. package/dist/workflow/utils/index.d.ts.map +1 -0
  117. package/dist/workflow/utils/index.js +2 -0
  118. package/dist/workflow/utils/index.js.map +1 -0
  119. package/dist/workflow/utils/retry-backoff.d.ts +35 -0
  120. package/dist/workflow/utils/retry-backoff.d.ts.map +1 -0
  121. package/dist/workflow/utils/retry-backoff.js +68 -0
  122. package/dist/workflow/utils/retry-backoff.js.map +1 -0
  123. package/dist/workflow/workflow.module.d.ts +13 -0
  124. package/dist/workflow/workflow.module.d.ts.map +1 -0
  125. package/dist/workflow/workflow.module.js +27 -0
  126. package/dist/workflow/workflow.module.js.map +1 -0
  127. package/package.json +154 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"default.decorator.d.ts","sourceRoot":"","sources":["../../../src/workflow/decorators/default.decorator.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,sBAAsB,qBAAqB,CAAC;AAEzD,eAAO,MAAM,SAAS,GAAI,QAAQ,GAAG,EAAE,cAAc,MAAM,EAAE,YAAY,kBAAkB,uBAM1F,CAAC"}
@@ -0,0 +1,9 @@
1
+ export const WORKFLOW_DEFAULT_EVENT = 'workflow.default';
2
+ export const OnDefault = (target, _propertyKey, descriptor) => {
3
+ let existingFallback = Reflect.getMetadata(WORKFLOW_DEFAULT_EVENT, target.constructor);
4
+ if (!existingFallback) {
5
+ Reflect.defineMetadata(WORKFLOW_DEFAULT_EVENT, descriptor.value, target.constructor);
6
+ }
7
+ return descriptor;
8
+ };
9
+ //# sourceMappingURL=default.decorator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"default.decorator.js","sourceRoot":"","sources":["../../../src/workflow/decorators/default.decorator.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,sBAAsB,GAAG,kBAAkB,CAAC;AAEzD,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,MAAW,EAAE,YAAoB,EAAE,UAA8B,EAAE,EAAE;IAC7F,IAAI,gBAAgB,GAAG,OAAO,CAAC,WAAW,CAAC,sBAAsB,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;IACvF,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACtB,OAAO,CAAC,cAAc,CAAC,sBAAsB,EAAE,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;IACvF,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { ISagaConfig } from '@/workflow';
2
+ export declare const WORKFLOW_HANDLER_KEY = "workflow:metadata";
3
+ export declare const OnEvent: (event: string) => (target: any, propertyKey: string, descriptor: PropertyDescriptor) => PropertyDescriptor;
4
+ export declare const OnCompensation: (event: string, config: ISagaConfig) => (target: any, propertyKey: string, descriptor: PropertyDescriptor) => PropertyDescriptor;
5
+ //# sourceMappingURL=event.decorator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event.decorator.d.ts","sourceRoot":"","sources":["../../../src/workflow/decorators/event.decorator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAoB,MAAM,YAAY,CAAC;AAEhE,eAAO,MAAM,oBAAoB,sBAAsB,CAAC;AAExD,eAAO,MAAM,OAAO,GAAI,OAAO,MAAM,MAAM,QAAQ,GAAG,EAAE,aAAa,MAAM,EAAE,YAAY,kBAAkB,uBAW1G,CAAC;AAEF,eAAO,MAAM,cAAc,GACxB,OAAO,MAAM,EAAE,QAAQ,WAAW,MAAM,QAAQ,GAAG,EAAE,aAAa,MAAM,EAAE,YAAY,kBAAkB,uBAWxG,CAAC"}
@@ -0,0 +1,20 @@
1
+ export const WORKFLOW_HANDLER_KEY = 'workflow:metadata';
2
+ export const OnEvent = (event) => (target, propertyKey, descriptor) => {
3
+ let workflowHandlers = Reflect.getMetadata(WORKFLOW_HANDLER_KEY, target.constructor);
4
+ if (!workflowHandlers) {
5
+ workflowHandlers = [];
6
+ Reflect.defineMetadata(WORKFLOW_HANDLER_KEY, workflowHandlers, target.constructor);
7
+ }
8
+ workflowHandlers.push({ event, handler: descriptor.value, name: propertyKey });
9
+ return descriptor;
10
+ };
11
+ export const OnCompensation = (event, config) => (target, propertyKey, descriptor) => {
12
+ let workflowHandlers = Reflect.getMetadata(WORKFLOW_HANDLER_KEY, target.constructor);
13
+ if (!workflowHandlers) {
14
+ workflowHandlers = [];
15
+ Reflect.defineMetadata(WORKFLOW_HANDLER_KEY, workflowHandlers, target.constructor);
16
+ }
17
+ workflowHandlers.push({ event, handler: descriptor.value, name: propertyKey, sagaConfig: config });
18
+ return descriptor;
19
+ };
20
+ //# sourceMappingURL=event.decorator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event.decorator.js","sourceRoot":"","sources":["../../../src/workflow/decorators/event.decorator.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,oBAAoB,GAAG,mBAAmB,CAAC;AAExD,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,KAAa,EAAE,EAAE,CAAC,CAAC,MAAW,EAAE,WAAmB,EAAE,UAA8B,EAAE,EAAE;IAC7G,IAAI,gBAAgB,GAAuB,OAAO,CAAC,WAAW,CAAC,oBAAoB,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;IAEzG,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACtB,gBAAgB,GAAG,EAAE,CAAC;QACtB,OAAO,CAAC,cAAc,CAAC,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;IACrF,CAAC;IAED,gBAAgB,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,CAAC,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;IAE/E,OAAO,UAAU,CAAC;AACpB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GACzB,CAAC,KAAa,EAAE,MAAmB,EAAE,EAAE,CAAC,CAAC,MAAW,EAAE,WAAmB,EAAE,UAA8B,EAAE,EAAE;IAC3G,IAAI,gBAAgB,GAAuB,OAAO,CAAC,WAAW,CAAC,oBAAoB,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;IAEzG,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACtB,gBAAgB,GAAG,EAAE,CAAC;QACtB,OAAO,CAAC,cAAc,CAAC,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;IACrF,CAAC;IAED,gBAAgB,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,CAAC,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC;IAEnG,OAAO,UAAU,CAAC;AACpB,CAAC,CAAC"}
@@ -0,0 +1,6 @@
1
+ export * from './default.decorator';
2
+ export * from './event.decorator';
3
+ export * from './params.decorator';
4
+ export * from './with-retry.decorator';
5
+ export * from './workflow.decorator';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/workflow/decorators/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC"}
@@ -0,0 +1,6 @@
1
+ export * from './default.decorator';
2
+ export * from './event.decorator';
3
+ export * from './params.decorator';
4
+ export * from './with-retry.decorator';
5
+ export * from './workflow.decorator';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/workflow/decorators/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare function Entity(): ParameterDecorator;
2
+ export declare function Payload<P>(dto?: P): ParameterDecorator;
3
+ //# sourceMappingURL=params.decorator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"params.decorator.d.ts","sourceRoot":"","sources":["../../../src/workflow/decorators/params.decorator.ts"],"names":[],"mappings":"AAAA,wBAAgB,MAAM,IAAI,kBAAkB,CAO3C;AAED,wBAAgB,OAAO,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,GAAG,kBAAkB,CAOtD"}
@@ -0,0 +1,19 @@
1
+ export function Entity() {
2
+ return (target, propertyKey, parameterIndex) => {
3
+ if (!propertyKey || parameterIndex === undefined)
4
+ throw new Error('Entity decorator can only be used on method parameters');
5
+ const existing = Reflect.getOwnMetadata('workflow:params', target, propertyKey) || [];
6
+ existing.push({ index: parameterIndex, type: 'entity' });
7
+ Reflect.defineMetadata('workflow:params', existing, target, propertyKey);
8
+ };
9
+ }
10
+ export function Payload(dto) {
11
+ return (target, propertyKey, parameterIndex) => {
12
+ if (!propertyKey || parameterIndex === undefined)
13
+ throw new Error('Payload decorator can only be used on method parameters');
14
+ const existing = Reflect.getOwnMetadata('workflow:params', target, propertyKey) || [];
15
+ existing.push({ index: parameterIndex, type: 'payload', dto });
16
+ Reflect.defineMetadata('workflow:params', existing, target, propertyKey);
17
+ };
18
+ }
19
+ //# sourceMappingURL=params.decorator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"params.decorator.js","sourceRoot":"","sources":["../../../src/workflow/decorators/params.decorator.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,MAAM;IACpB,OAAO,CAAC,MAAc,EAAE,WAA6B,EAAE,cAAuB,EAAE,EAAE;QAChF,IAAI,CAAC,WAAW,IAAI,cAAc,KAAK,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;QAC5H,MAAM,QAAQ,GAAe,OAAO,CAAC,cAAc,CAAC,iBAAiB,EAAE,MAAM,EAAE,WAAW,CAAC,IAAI,EAAE,CAAC;QAClG,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;QACzD,OAAO,CAAC,cAAc,CAAC,iBAAiB,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;IAC3E,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,OAAO,CAAI,GAAO;IAChC,OAAO,CAAC,MAAc,EAAE,WAA6B,EAAE,cAAuB,EAAE,EAAE;QAChF,IAAI,CAAC,WAAW,IAAI,cAAc,KAAK,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;QAC7H,MAAM,QAAQ,GAAe,OAAO,CAAC,cAAc,CAAC,iBAAiB,EAAE,MAAM,EAAE,WAAW,CAAC,IAAI,EAAE,CAAC;QAClG,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;QAC/D,OAAO,CAAC,cAAc,CAAC,iBAAiB,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;IAC3E,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { type IBackoffRetryConfig } from '../types';
2
+ export declare const getRetryKey: (propertyKey: string) => string;
3
+ export declare function WithRetry(config: IBackoffRetryConfig): (_target: any, propertyKey: string, descriptor: PropertyDescriptor) => PropertyDescriptor;
4
+ //# sourceMappingURL=with-retry.decorator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"with-retry.decorator.d.ts","sourceRoot":"","sources":["../../../src/workflow/decorators/with-retry.decorator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAIpD,eAAO,MAAM,WAAW,GAAI,aAAa,MAAM,WAAuC,CAAC;AAEvF,wBAAgB,SAAS,CAAC,MAAM,EAAE,mBAAmB,IAC3C,SAAS,GAAG,EAAE,aAAa,MAAM,EAAE,YAAY,kBAAkB,wBAI1E"}
@@ -0,0 +1,9 @@
1
+ const WITH_RETRY_KEY = 'workflow:retry';
2
+ export const getRetryKey = (propertyKey) => `${WITH_RETRY_KEY}:${propertyKey}`;
3
+ export function WithRetry(config) {
4
+ return (_target, propertyKey, descriptor) => {
5
+ Reflect.defineMetadata(getRetryKey(propertyKey), config, descriptor.value);
6
+ return descriptor;
7
+ };
8
+ }
9
+ //# sourceMappingURL=with-retry.decorator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"with-retry.decorator.js","sourceRoot":"","sources":["../../../src/workflow/decorators/with-retry.decorator.ts"],"names":[],"mappings":"AAEA,MAAM,cAAc,GAAG,gBAAgB,CAAC;AAExC,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,WAAmB,EAAE,EAAE,CAAC,GAAG,cAAc,IAAI,WAAW,EAAE,CAAC;AAEvF,MAAM,UAAU,SAAS,CAAC,MAA2B;IACnD,OAAO,CAAC,OAAY,EAAE,WAAmB,EAAE,UAA8B,EAAE,EAAE;QAC3E,OAAO,CAAC,cAAc,CAAC,WAAW,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC;QAC3E,OAAO,UAAU,CAAC;IACpB,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { type IWorkflowDefinition } from '@/workflow';
2
+ export declare const WORKFLOW_DEFINITION_KEY = "workflow:definition";
3
+ export declare function Workflow<T, Event, State>(definition: IWorkflowDefinition<T, Event, State>): <T_1 extends {
4
+ new (...args: any[]): {};
5
+ }>(instance: T_1) => T_1;
6
+ //# sourceMappingURL=workflow.decorator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow.decorator.d.ts","sourceRoot":"","sources":["../../../src/workflow/decorators/workflow.decorator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEtD,eAAO,MAAM,uBAAuB,wBAAwB,CAAC;AAE7D,wBAAgB,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,mBAAmB,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,IACvE,GAAC,SAAS;IAAE,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,CAAA;CAAE,EAAE,UAAU,GAAC,SAKrE"}
@@ -0,0 +1,8 @@
1
+ export const WORKFLOW_DEFINITION_KEY = 'workflow:definition';
2
+ export function Workflow(definition) {
3
+ return function (instance) {
4
+ Reflect.defineMetadata(WORKFLOW_DEFINITION_KEY, definition, instance);
5
+ return instance;
6
+ };
7
+ }
8
+ //# sourceMappingURL=workflow.decorator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow.decorator.js","sourceRoot":"","sources":["../../../src/workflow/decorators/workflow.decorator.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,uBAAuB,GAAG,qBAAqB,CAAC;AAE7D,MAAM,UAAU,QAAQ,CAAkB,UAAgD;IACxF,OAAO,UAAkD,QAAW;QAClE,OAAO,CAAC,cAAc,CAAC,uBAAuB,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;QAEtE,OAAO,QAAQ,CAAC;IAClB,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,7 @@
1
+ export * from './decorators';
2
+ export * from './providers';
3
+ export * from './providers/router.factory';
4
+ export * from './types';
5
+ export * from './utils';
6
+ export * from './workflow.module';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/workflow/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,4BAA4B,CAAC;AAC3C,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC;AACxB,cAAc,mBAAmB,CAAC"}
@@ -0,0 +1,7 @@
1
+ export * from './decorators';
2
+ export * from './providers';
3
+ export * from './providers/router.factory';
4
+ export * from './types';
5
+ export * from './utils';
6
+ export * from './workflow.module';
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/workflow/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,4BAA4B,CAAC;AAC3C,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC;AACxB,cAAc,mBAAmB,CAAC"}
@@ -0,0 +1,4 @@
1
+ export * from './ochestrator.service';
2
+ export * from './router.factory';
3
+ export * from './router.service';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/workflow/providers/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC;AACtC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC"}
@@ -0,0 +1,4 @@
1
+ export * from './ochestrator.service';
2
+ export * from './router.factory';
3
+ export * from './router.service';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/workflow/providers/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC;AACtC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC"}
@@ -0,0 +1,32 @@
1
+ import type { IWorkflowEvent } from '@/event-bus';
2
+ import { DiscoveryService, ModuleRef } from '@nestjs/core';
3
+ import { StateRouterHelperFactory } from './router.factory';
4
+ /**
5
+ * TODO:
6
+ * 1. SAGA: SAGA transaction will update history storage each transition, history service is implemented from `ISagaHistoryStore`
7
+ * +) If reverese order, execute compensations in reverse order
8
+ * +) If in-order, execute compensations in order
9
+ * +) If parallel, execute compensations in parallel
10
+ * 2. Replay workflow:
11
+ * +) If compensation in-progress, execute compensation first
12
+ * +) If compensation completed, start from start state
13
+ * +) If no compensation and transaction is failed, start from last failed state
14
+ * +) If no compensation and transaction is completed, throw error
15
+ * 3. Checkpointing for long-running tasks (Serverless)
16
+ * +) Handle serverless function timeout, store current entity state to checkpoint broker via `BrokerPublisher`
17
+ * +) BrokerPublisher.publish will implement delay queue via time calculated from RetryService.execute()
18
+ * 4. Retry Service: Retry in state handler level via `IRetryHandler`
19
+ * +) If CompensationHandler
20
+ * 5. Timeout handling: listen for timeout event emitted by Runtime Adapter (DEV DONE - TESTING)
21
+ */
22
+ export declare class OrchestratorService {
23
+ private readonly discoveryService;
24
+ private readonly routerHelperFactory;
25
+ private readonly moduleRef;
26
+ private routes;
27
+ private readonly logger;
28
+ constructor(discoveryService: DiscoveryService, routerHelperFactory: StateRouterHelperFactory, moduleRef: ModuleRef);
29
+ onModuleInit(): void;
30
+ transit(params: IWorkflowEvent): Promise<void>;
31
+ }
32
+ //# sourceMappingURL=ochestrator.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ochestrator.service.d.ts","sourceRoot":"","sources":["../../../src/workflow/providers/ochestrator.service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAoB,cAAc,EAAE,MAAM,aAAa,CAAC;AAgBpE,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAE5D;;;;;;;;;;;;;;;;;GAiBG;AACH,qBACa,mBAAmB;IAK5B,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IACjC,OAAO,CAAC,QAAQ,CAAC,mBAAmB;IACpC,OAAO,CAAC,QAAQ,CAAC,SAAS;IAN5B,OAAO,CAAC,MAAM,CAA6E;IAC3F,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAwC;gBAG5C,gBAAgB,EAAE,gBAAgB,EAClC,mBAAmB,EAAE,wBAAwB,EAC7C,SAAS,EAAE,SAAS;IAGvC,YAAY;IAuDN,OAAO,CAAC,MAAM,EAAE,cAAc;CA+GrC"}
@@ -0,0 +1,183 @@
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
+ var OrchestratorService_1;
11
+ import { UnretriableException } from '@/exception/unretriable.exception';
12
+ import { getRetryKey, WORKFLOW_DEFAULT_EVENT, WORKFLOW_DEFINITION_KEY, WORKFLOW_HANDLER_KEY } from '@/workflow';
13
+ import { BadRequestException, Injectable, Logger } from '@nestjs/common';
14
+ import { DiscoveryService, ModuleRef } from '@nestjs/core';
15
+ import { StateRouterHelperFactory } from './router.factory';
16
+ /**
17
+ * TODO:
18
+ * 1. SAGA: SAGA transaction will update history storage each transition, history service is implemented from `ISagaHistoryStore`
19
+ * +) If reverese order, execute compensations in reverse order
20
+ * +) If in-order, execute compensations in order
21
+ * +) If parallel, execute compensations in parallel
22
+ * 2. Replay workflow:
23
+ * +) If compensation in-progress, execute compensation first
24
+ * +) If compensation completed, start from start state
25
+ * +) If no compensation and transaction is failed, start from last failed state
26
+ * +) If no compensation and transaction is completed, throw error
27
+ * 3. Checkpointing for long-running tasks (Serverless)
28
+ * +) Handle serverless function timeout, store current entity state to checkpoint broker via `BrokerPublisher`
29
+ * +) BrokerPublisher.publish will implement delay queue via time calculated from RetryService.execute()
30
+ * 4. Retry Service: Retry in state handler level via `IRetryHandler`
31
+ * +) If CompensationHandler
32
+ * 5. Timeout handling: listen for timeout event emitted by Runtime Adapter (DEV DONE - TESTING)
33
+ */
34
+ let OrchestratorService = OrchestratorService_1 = class OrchestratorService {
35
+ constructor(discoveryService, routerHelperFactory, moduleRef) {
36
+ this.discoveryService = discoveryService;
37
+ this.routerHelperFactory = routerHelperFactory;
38
+ this.moduleRef = moduleRef;
39
+ this.routes = new Map();
40
+ this.logger = new Logger(OrchestratorService_1.name);
41
+ }
42
+ onModuleInit() {
43
+ const providers = this.discoveryService.getProviders();
44
+ for (const provider of providers) {
45
+ const { instance } = provider;
46
+ if (!instance || !instance.constructor)
47
+ continue;
48
+ const [workflowDefinition, handlerStore, defaultHandler] = [
49
+ Reflect.getMetadata(WORKFLOW_DEFINITION_KEY, instance.constructor),
50
+ Reflect.getMetadata(WORKFLOW_HANDLER_KEY, instance.constructor),
51
+ Reflect.getMetadata(WORKFLOW_DEFAULT_EVENT, instance.constructor),
52
+ [],
53
+ ];
54
+ if (!handlerStore || handlerStore.length === 0 || !workflowDefinition) {
55
+ this.logger.warn(`No handlers found for workflow: ${workflowDefinition.name}`);
56
+ continue;
57
+ }
58
+ const brokerPublisher = this.moduleRef.get(workflowDefinition.brokerPublisher, {
59
+ strict: true,
60
+ });
61
+ const entityService = this.moduleRef.get(workflowDefinition.entityService, { strict: true });
62
+ const historyService = workflowDefinition.saga
63
+ ? this.moduleRef.get(workflowDefinition.saga.historyService, {
64
+ strict: true,
65
+ })
66
+ : undefined;
67
+ for (const handler of handlerStore) {
68
+ if (this.routes.has(handler.event)) {
69
+ throw new Error(`Duplicate workflow event handler detected for event: ${handler.event} in workflow: ${workflowDefinition.name}`);
70
+ }
71
+ const retryConfig = this.moduleRef.get(getRetryKey(handler.name));
72
+ this.routes.set(handler.event, {
73
+ handler: handler.handler,
74
+ definition: workflowDefinition,
75
+ instance,
76
+ handlerName: handler.name,
77
+ retryConfig,
78
+ defaultHandler,
79
+ entityService,
80
+ brokerPublisher,
81
+ historyService,
82
+ });
83
+ }
84
+ }
85
+ this.logger.log(`StateRouter initialized with ${this.routes.size} routes: `, Array.from(this.routes.keys()));
86
+ }
87
+ async transit(params) {
88
+ const { urn, payload, attempt, topic: event } = params;
89
+ const route = this.routes.get(event);
90
+ if (!route)
91
+ throw new BadRequestException(`No workflow found for event: ${event}`);
92
+ const { definition, instance, defaultHandler, entityService } = route;
93
+ if (!definition) {
94
+ const className = instance.name;
95
+ throw new BadRequestException(`Workflow definition metadata is missing for controller class "${className}". Ensure @Workflow(...) is applied to the class and that decorators are not reordered.`);
96
+ }
97
+ const logger = new Logger(`Router::${definition.name}`);
98
+ const routerHelper = this.routerHelperFactory.create(event, entityService, definition, logger);
99
+ logger.log(`Method ${route.handlerName} is being called with arguments:`, params);
100
+ // ========================= BEGIN routing logic =========================
101
+ let entity = await routerHelper.loadAndValidateEntity(urn);
102
+ const entityStatus = entityService.status(entity);
103
+ let transition = routerHelper.findValidTransition(entity, payload);
104
+ let stepPayload = payload;
105
+ if (!transition) {
106
+ if (defaultHandler) {
107
+ logger.log(`Falling back to the default transition`, urn);
108
+ await defaultHandler(entity, event, payload);
109
+ }
110
+ throw new BadRequestException(`No matched transition for event: ${event}, status: ${entityStatus}. Please verify your workflow definition!`);
111
+ }
112
+ try {
113
+ while (!!transition) {
114
+ logger.log('======= WORKFLOW STEP STARTED =======');
115
+ if (routerHelper.isInIdleStatus(entity)) {
116
+ if (!transition.conditions) {
117
+ throw new BadRequestException(`Idle state ${entityStatus} transitions must provide conditions for further navigation, please check for workflow definition and try again!`);
118
+ }
119
+ if (transition.conditions.some((condition) => !condition)) {
120
+ logger.log(`Element ${urn} is idle from ${transition.from} to ${transition.to} status. Waiting for external event...`);
121
+ break;
122
+ }
123
+ }
124
+ const currentEntityStatus = entityService.status(entity);
125
+ logger.log(`Executing transition from ${currentEntityStatus} to ${transition.to} (${urn})`);
126
+ // Store entity state before transition (for SAGA)
127
+ const beforeState = { ...entity };
128
+ // Get the correct handler for the current transition event
129
+ const currentEvent = Array.isArray(transition.event) ? transition.event[0] : transition.event;
130
+ const currentRoute = this.routes.get(currentEvent);
131
+ if (!currentRoute) {
132
+ throw new BadRequestException(`No handler found for event: ${currentEvent}`);
133
+ }
134
+ const { handlerName, handler, retryConfig } = currentRoute;
135
+ const args = routerHelper.buildParamDecorators(entity, stepPayload, instance, handlerName);
136
+ try {
137
+ stepPayload = await handler.apply(instance, args);
138
+ }
139
+ catch (e) {
140
+ if (!retryConfig)
141
+ throw e;
142
+ const { maxAttempts } = retryConfig;
143
+ if (e instanceof BadRequestException || e instanceof UnretriableException || attempt >= maxAttempts) {
144
+ logger.error('Unretriable exception found!');
145
+ return;
146
+ }
147
+ // TODO: add more payload: original method, payload, entity, retryConfigs
148
+ await this.moduleRef.get(retryConfig.handler).execute();
149
+ }
150
+ // Update entity status
151
+ entity = await entityService.update(entity, transition.to);
152
+ logger.log(`Element transitioned from ${currentEntityStatus} to ${transition.to} (${urn})`);
153
+ const updatedStatus = entityService.status(entity);
154
+ const definedFinalStates = definition.states.finals;
155
+ if (definedFinalStates.includes(updatedStatus)) {
156
+ logger.log(`Element ${urn} reached final state: ${updatedStatus}`);
157
+ break;
158
+ }
159
+ // NOTE: Get next event for automatic transitions
160
+ transition = routerHelper.findValidTransition(entity, stepPayload, {
161
+ skipEventCheck: true,
162
+ });
163
+ if (!transition) {
164
+ logger.warn(`There's no valid next transition from ${updatedStatus} or the condition is not met. (${urn})`);
165
+ }
166
+ logger.log(`Next event: ${transition?.event ?? 'none'} Next status: ${updatedStatus} (${urn})`);
167
+ }
168
+ }
169
+ catch (e) {
170
+ await entityService.update(entity, definition.states.failed);
171
+ logger.error(`Transition failed. Setting status to failed (${e.message})`, urn);
172
+ throw e;
173
+ }
174
+ }
175
+ };
176
+ OrchestratorService = OrchestratorService_1 = __decorate([
177
+ Injectable(),
178
+ __metadata("design:paramtypes", [DiscoveryService,
179
+ StateRouterHelperFactory,
180
+ ModuleRef])
181
+ ], OrchestratorService);
182
+ export { OrchestratorService };
183
+ //# sourceMappingURL=ochestrator.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ochestrator.service.js","sourceRoot":"","sources":["../../../src/workflow/providers/ochestrator.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { Logger } from '@nestjs/common';
2
+ import { RouterService } from './router.service';
3
+ import type { IWorkflowEntity, IWorkflowDefinition } from '../types';
4
+ export declare class StateRouterHelperFactory {
5
+ create<T, Event, State>(event: Event, entityService: IWorkflowEntity, workflowDefinition: IWorkflowDefinition<T, Event, State>, logger: Logger): RouterService<T, Event, State>;
6
+ }
7
+ //# sourceMappingURL=router.factory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.factory.d.ts","sourceRoot":"","sources":["../../../src/workflow/providers/router.factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,KAAK,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAErE,qBACa,wBAAwB;IACnC,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EACpB,KAAK,EAAE,KAAK,EACZ,aAAa,EAAE,eAAe,EAC9B,kBAAkB,EAAE,mBAAmB,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,EACxD,MAAM,EAAE,MAAM,GACb,aAAa,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC;CAGlC"}
@@ -0,0 +1,18 @@
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
+ import { Injectable } from '@nestjs/common';
8
+ import { RouterService } from './router.service';
9
+ let StateRouterHelperFactory = class StateRouterHelperFactory {
10
+ create(event, entityService, workflowDefinition, logger) {
11
+ return new RouterService(event, entityService, workflowDefinition, logger);
12
+ }
13
+ };
14
+ StateRouterHelperFactory = __decorate([
15
+ Injectable()
16
+ ], StateRouterHelperFactory);
17
+ export { StateRouterHelperFactory };
18
+ //# sourceMappingURL=router.factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.factory.js","sourceRoot":"","sources":["../../../src/workflow/providers/router.factory.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,UAAU,EAAU,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAI1C,IAAM,wBAAwB,GAA9B,MAAM,wBAAwB;IACnC,MAAM,CACJ,KAAY,EACZ,aAA8B,EAC9B,kBAAwD,EACxD,MAAc;QAEd,OAAO,IAAI,aAAa,CAAC,KAAK,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,CAAC,CAAC;IAC7E,CAAC;CACF,CAAA;AATY,wBAAwB;IADpC,UAAU,EAAE;GACA,wBAAwB,CASpC"}
@@ -0,0 +1,16 @@
1
+ import { Logger } from '@nestjs/common';
2
+ import type { IWorkflowEntity, ITransitionEvent, IWorkflowDefinition } from '../types';
3
+ export declare class RouterService<T, Event, State> {
4
+ private readonly event;
5
+ private readonly entityService;
6
+ private readonly workflowDefinition;
7
+ private readonly logger;
8
+ constructor(event: Event, entityService: IWorkflowEntity, workflowDefinition: IWorkflowDefinition<T, Event, State>, logger: Logger);
9
+ loadAndValidateEntity(urn: string | number): Promise<T>;
10
+ findValidTransition<P>(entity: T, payload: P, options?: {
11
+ skipEventCheck?: boolean;
12
+ }): ITransitionEvent<T, Event, State, P> | null;
13
+ isInIdleStatus(entity: T): boolean;
14
+ buildParamDecorators(entity: T, payload: any, target: any, propertyKey: string | symbol): any[];
15
+ }
16
+ //# sourceMappingURL=router.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.service.d.ts","sourceRoot":"","sources":["../../../src/workflow/providers/router.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAEvF,qBAAa,aAAa,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK;IAEtC,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,kBAAkB;IACnC,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAHN,KAAK,EAAE,KAAK,EACZ,aAAa,EAAE,eAAe,EAC9B,kBAAkB,EAAE,mBAAmB,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,EACxD,MAAM,EAAE,MAAM;IAG3B,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;IAiB7D,mBAAmB,CAAC,CAAC,EACnB,MAAM,EAAE,CAAC,EACT,OAAO,EAAE,CAAC,EACV,OAAO,CAAC,EAAE;QAAE,cAAc,CAAC,EAAE,OAAO,CAAA;KAAE,GACrC,gBAAgB,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,GAAG,IAAI;IAgC9C,cAAc,CAAC,MAAM,EAAE,CAAC,GAAG,OAAO;IASlC,oBAAoB,CAAC,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM;CAoBxF"}
@@ -0,0 +1,79 @@
1
+ import { BadRequestException } from '@nestjs/common';
2
+ export class RouterService {
3
+ constructor(event, entityService, workflowDefinition, logger) {
4
+ this.event = event;
5
+ this.entityService = entityService;
6
+ this.workflowDefinition = workflowDefinition;
7
+ this.logger = logger;
8
+ }
9
+ async loadAndValidateEntity(urn) {
10
+ const entity = await this.entityService.load(urn);
11
+ if (!entity) {
12
+ this.logger.error(`Element not found`, urn);
13
+ throw new BadRequestException(`Entity not found`, String(urn));
14
+ }
15
+ const entityStatus = this.entityService.status(entity);
16
+ const definedFinalStates = this.workflowDefinition.states.finals;
17
+ if (definedFinalStates.includes(entityStatus)) {
18
+ this.logger.warn(`Entity: ${urn} is in a final status. Accepting transitions due to a retry mechanism.`, urn);
19
+ }
20
+ return entity;
21
+ }
22
+ findValidTransition(entity, payload, options) {
23
+ const currentStatus = this.entityService.status(entity);
24
+ const possibleNextTransitionSet = new Set();
25
+ const possibleTransitions = this.workflowDefinition.transitions
26
+ // Find transition event that matches the current event and state
27
+ .filter((transition) => {
28
+ const events = Array.isArray(transition.event) ? transition.event : [transition.event];
29
+ const states = (Array.isArray(transition.from) ? transition.from : [transition.from]);
30
+ return (options?.skipEventCheck ? true : events.includes(this.event)) && states.includes(currentStatus);
31
+ })
32
+ // Condition checking
33
+ .filter(({ conditions, to }) => {
34
+ if (conditions && conditions.some((condition) => !condition(entity, payload)))
35
+ return false;
36
+ possibleNextTransitionSet.add(to);
37
+ return true;
38
+ });
39
+ if (possibleTransitions.length === 0)
40
+ return null;
41
+ const possibleNextTransitions = Array.from(possibleNextTransitionSet);
42
+ if (possibleNextTransitions.length > 1) {
43
+ throw new BadRequestException(`Multiple "to" transition states is not allowed, please verify Workflow Definition at @Workflow decorator: [${possibleNextTransitions.join(', ')}]`);
44
+ }
45
+ // Since event and "to" transition state will be similar
46
+ return possibleTransitions[0];
47
+ }
48
+ isInIdleStatus(entity) {
49
+ const status = this.entityService.status(entity);
50
+ if (!status) {
51
+ throw new Error('Entity status is not defined. Unable to determine if the entity is idle or not.');
52
+ }
53
+ const definedIdleStatuses = this.workflowDefinition.states.idles;
54
+ return definedIdleStatuses.includes(status);
55
+ }
56
+ buildParamDecorators(entity, payload, target, propertyKey) {
57
+ // Metadata is stored on the prototype when decorators are applied
58
+ const prototype = target.constructor?.prototype || target;
59
+ const paramsMeta = Reflect.getOwnMetadata('workflow:params', prototype, propertyKey) || [];
60
+ let args = [];
61
+ if (paramsMeta && paramsMeta.length > 0) {
62
+ // populate args according to metadata indices
63
+ for (const meta of paramsMeta) {
64
+ if (meta.type === 'entity')
65
+ args[meta.index] = entity;
66
+ else if (meta.type === 'payload')
67
+ args[meta.index] = payload;
68
+ else
69
+ args[meta.index] = undefined;
70
+ }
71
+ }
72
+ else {
73
+ // legacy: single object param { entity, payload }
74
+ args = [{ entity, payload }];
75
+ }
76
+ return args;
77
+ }
78
+ }
79
+ //# sourceMappingURL=router.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.service.js","sourceRoot":"","sources":["../../../src/workflow/providers/router.service.ts"],"names":[],"mappings":"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"}