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.
- package/LICENSE +22 -0
- package/README.md +396 -0
- package/dist/adapter/index.d.ts +2 -0
- package/dist/adapter/index.d.ts.map +1 -0
- package/dist/adapter/index.js +2 -0
- package/dist/adapter/index.js.map +1 -0
- package/dist/adapter/lambda.adapater.d.ts +4 -0
- package/dist/adapter/lambda.adapater.d.ts.map +1 -0
- package/dist/adapter/lambda.adapater.js +63 -0
- package/dist/adapter/lambda.adapater.js.map +1 -0
- package/dist/event-bus/index.d.ts +3 -0
- package/dist/event-bus/index.d.ts.map +1 -0
- package/dist/event-bus/index.js +3 -0
- package/dist/event-bus/index.js.map +1 -0
- package/dist/event-bus/sqs/sqs.emitter.d.ts +6 -0
- package/dist/event-bus/sqs/sqs.emitter.d.ts.map +1 -0
- package/dist/event-bus/sqs/sqs.emitter.js +4 -0
- package/dist/event-bus/sqs/sqs.emitter.js.map +1 -0
- package/dist/event-bus/types/broker-publisher.interface.d.ts +5 -0
- package/dist/event-bus/types/broker-publisher.interface.d.ts.map +1 -0
- package/dist/event-bus/types/broker-publisher.interface.js +2 -0
- package/dist/event-bus/types/broker-publisher.interface.js.map +1 -0
- package/dist/event-bus/types/index.d.ts +3 -0
- package/dist/event-bus/types/index.d.ts.map +1 -0
- package/dist/event-bus/types/index.js +3 -0
- package/dist/event-bus/types/index.js.map +1 -0
- package/dist/event-bus/types/workflow-event.interface.d.ts +7 -0
- package/dist/event-bus/types/workflow-event.interface.d.ts.map +1 -0
- package/dist/event-bus/types/workflow-event.interface.js +2 -0
- package/dist/event-bus/types/workflow-event.interface.js.map +1 -0
- package/dist/exception/index.d.ts +2 -0
- package/dist/exception/index.d.ts.map +1 -0
- package/dist/exception/index.js +2 -0
- package/dist/exception/index.js.map +1 -0
- package/dist/exception/unretriable.exception.d.ts +4 -0
- package/dist/exception/unretriable.exception.d.ts.map +1 -0
- package/dist/exception/unretriable.exception.js +7 -0
- package/dist/exception/unretriable.exception.js.map +1 -0
- package/dist/workflow/decorators/default.decorator.d.ts +3 -0
- package/dist/workflow/decorators/default.decorator.d.ts.map +1 -0
- package/dist/workflow/decorators/default.decorator.js +9 -0
- package/dist/workflow/decorators/default.decorator.js.map +1 -0
- package/dist/workflow/decorators/event.decorator.d.ts +5 -0
- package/dist/workflow/decorators/event.decorator.d.ts.map +1 -0
- package/dist/workflow/decorators/event.decorator.js +20 -0
- package/dist/workflow/decorators/event.decorator.js.map +1 -0
- package/dist/workflow/decorators/index.d.ts +6 -0
- package/dist/workflow/decorators/index.d.ts.map +1 -0
- package/dist/workflow/decorators/index.js +6 -0
- package/dist/workflow/decorators/index.js.map +1 -0
- package/dist/workflow/decorators/params.decorator.d.ts +3 -0
- package/dist/workflow/decorators/params.decorator.d.ts.map +1 -0
- package/dist/workflow/decorators/params.decorator.js +19 -0
- package/dist/workflow/decorators/params.decorator.js.map +1 -0
- package/dist/workflow/decorators/with-retry.decorator.d.ts +4 -0
- package/dist/workflow/decorators/with-retry.decorator.d.ts.map +1 -0
- package/dist/workflow/decorators/with-retry.decorator.js +9 -0
- package/dist/workflow/decorators/with-retry.decorator.js.map +1 -0
- package/dist/workflow/decorators/workflow.decorator.d.ts +6 -0
- package/dist/workflow/decorators/workflow.decorator.d.ts.map +1 -0
- package/dist/workflow/decorators/workflow.decorator.js +8 -0
- package/dist/workflow/decorators/workflow.decorator.js.map +1 -0
- package/dist/workflow/index.d.ts +7 -0
- package/dist/workflow/index.d.ts.map +1 -0
- package/dist/workflow/index.js +7 -0
- package/dist/workflow/index.js.map +1 -0
- package/dist/workflow/providers/index.d.ts +4 -0
- package/dist/workflow/providers/index.d.ts.map +1 -0
- package/dist/workflow/providers/index.js +4 -0
- package/dist/workflow/providers/index.js.map +1 -0
- package/dist/workflow/providers/ochestrator.service.d.ts +32 -0
- package/dist/workflow/providers/ochestrator.service.d.ts.map +1 -0
- package/dist/workflow/providers/ochestrator.service.js +183 -0
- package/dist/workflow/providers/ochestrator.service.js.map +1 -0
- package/dist/workflow/providers/router.factory.d.ts +7 -0
- package/dist/workflow/providers/router.factory.d.ts.map +1 -0
- package/dist/workflow/providers/router.factory.js +18 -0
- package/dist/workflow/providers/router.factory.js.map +1 -0
- package/dist/workflow/providers/router.service.d.ts +16 -0
- package/dist/workflow/providers/router.service.d.ts.map +1 -0
- package/dist/workflow/providers/router.service.js +79 -0
- package/dist/workflow/providers/router.service.js.map +1 -0
- package/dist/workflow/providers/saga.service.d.ts +34 -0
- package/dist/workflow/providers/saga.service.d.ts.map +1 -0
- package/dist/workflow/providers/saga.service.js +159 -0
- package/dist/workflow/providers/saga.service.js.map +1 -0
- package/dist/workflow/types/entity.interface.d.ts +33 -0
- package/dist/workflow/types/entity.interface.d.ts.map +1 -0
- package/dist/workflow/types/entity.interface.js +2 -0
- package/dist/workflow/types/entity.interface.js.map +1 -0
- package/dist/workflow/types/index.d.ts +7 -0
- package/dist/workflow/types/index.d.ts.map +1 -0
- package/dist/workflow/types/index.js +9 -0
- package/dist/workflow/types/index.js.map +1 -0
- package/dist/workflow/types/retry.interface.d.ts +24 -0
- package/dist/workflow/types/retry.interface.d.ts.map +1 -0
- package/dist/workflow/types/retry.interface.js +10 -0
- package/dist/workflow/types/retry.interface.js.map +1 -0
- package/dist/workflow/types/saga.interface.d.ts +144 -0
- package/dist/workflow/types/saga.interface.d.ts.map +1 -0
- package/dist/workflow/types/saga.interface.js +24 -0
- package/dist/workflow/types/saga.interface.js.map +1 -0
- package/dist/workflow/types/shared.type.d.ts +5 -0
- package/dist/workflow/types/shared.type.d.ts.map +1 -0
- package/dist/workflow/types/shared.type.js +2 -0
- package/dist/workflow/types/shared.type.js.map +1 -0
- package/dist/workflow/types/transition-event.interface.d.ts +16 -0
- package/dist/workflow/types/transition-event.interface.d.ts.map +1 -0
- package/dist/workflow/types/transition-event.interface.js +2 -0
- package/dist/workflow/types/transition-event.interface.js.map +1 -0
- package/dist/workflow/types/workflow-definition.interface.d.ts +60 -0
- package/dist/workflow/types/workflow-definition.interface.d.ts.map +1 -0
- package/dist/workflow/types/workflow-definition.interface.js +2 -0
- package/dist/workflow/types/workflow-definition.interface.js.map +1 -0
- package/dist/workflow/utils/index.d.ts +2 -0
- package/dist/workflow/utils/index.d.ts.map +1 -0
- package/dist/workflow/utils/index.js +2 -0
- package/dist/workflow/utils/index.js.map +1 -0
- package/dist/workflow/utils/retry-backoff.d.ts +35 -0
- package/dist/workflow/utils/retry-backoff.d.ts.map +1 -0
- package/dist/workflow/utils/retry-backoff.js +68 -0
- package/dist/workflow/utils/retry-backoff.js.map +1 -0
- package/dist/workflow/workflow.module.d.ts +13 -0
- package/dist/workflow/workflow.module.d.ts.map +1 -0
- package/dist/workflow/workflow.module.js +27 -0
- package/dist/workflow/workflow.module.js.map +1 -0
- 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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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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"}
|