@emmvish/stable-request 1.8.1 → 2.0.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.
Files changed (87) hide show
  1. package/README.md +72 -0
  2. package/dist/core/index.d.ts +2 -0
  3. package/dist/core/index.d.ts.map +1 -1
  4. package/dist/core/index.js +2 -0
  5. package/dist/core/index.js.map +1 -1
  6. package/dist/core/stable-api-gateway.d.ts +3 -2
  7. package/dist/core/stable-api-gateway.d.ts.map +1 -1
  8. package/dist/core/stable-api-gateway.js +34 -13
  9. package/dist/core/stable-api-gateway.js.map +1 -1
  10. package/dist/core/stable-function.d.ts +3 -0
  11. package/dist/core/stable-function.d.ts.map +1 -0
  12. package/dist/core/stable-function.js +280 -0
  13. package/dist/core/stable-function.js.map +1 -0
  14. package/dist/core/stable-request.d.ts.map +1 -1
  15. package/dist/core/stable-request.js +3 -3
  16. package/dist/core/stable-request.js.map +1 -1
  17. package/dist/core/stable-workflow-graph.d.ts +3 -0
  18. package/dist/core/stable-workflow-graph.d.ts.map +1 -0
  19. package/dist/core/stable-workflow-graph.js +5 -0
  20. package/dist/core/stable-workflow-graph.js.map +1 -0
  21. package/dist/core/stable-workflow.d.ts.map +1 -1
  22. package/dist/core/stable-workflow.js +20 -19
  23. package/dist/core/stable-workflow.js.map +1 -1
  24. package/dist/enums/index.d.ts +17 -0
  25. package/dist/enums/index.d.ts.map +1 -1
  26. package/dist/enums/index.js +20 -0
  27. package/dist/enums/index.js.map +1 -1
  28. package/dist/index.d.ts +4 -4
  29. package/dist/index.d.ts.map +1 -1
  30. package/dist/index.js +3 -3
  31. package/dist/index.js.map +1 -1
  32. package/dist/types/index.d.ts +220 -2
  33. package/dist/types/index.d.ts.map +1 -1
  34. package/dist/utilities/circuit-breaker.js +1 -1
  35. package/dist/utilities/circuit-breaker.js.map +1 -1
  36. package/dist/utilities/execute-concurrently.d.ts +2 -2
  37. package/dist/utilities/execute-concurrently.d.ts.map +1 -1
  38. package/dist/utilities/execute-concurrently.js +39 -62
  39. package/dist/utilities/execute-concurrently.js.map +1 -1
  40. package/dist/utilities/execute-gateway-item.d.ts +6 -0
  41. package/dist/utilities/execute-gateway-item.d.ts.map +1 -0
  42. package/dist/utilities/execute-gateway-item.js +117 -0
  43. package/dist/utilities/execute-gateway-item.js.map +1 -0
  44. package/dist/utilities/execute-non-linear-workflow.js +3 -3
  45. package/dist/utilities/execute-non-linear-workflow.js.map +1 -1
  46. package/dist/utilities/execute-phase.d.ts.map +1 -1
  47. package/dist/utilities/execute-phase.js +15 -1
  48. package/dist/utilities/execute-phase.js.map +1 -1
  49. package/dist/utilities/execute-sequentially.d.ts +2 -2
  50. package/dist/utilities/execute-sequentially.d.ts.map +1 -1
  51. package/dist/utilities/execute-sequentially.js +27 -42
  52. package/dist/utilities/execute-sequentially.js.map +1 -1
  53. package/dist/utilities/execute-workflow-graph.d.ts +3 -0
  54. package/dist/utilities/execute-workflow-graph.d.ts.map +1 -0
  55. package/dist/utilities/execute-workflow-graph.js +326 -0
  56. package/dist/utilities/execute-workflow-graph.js.map +1 -0
  57. package/dist/utilities/fn-exec.d.ts +3 -0
  58. package/dist/utilities/fn-exec.d.ts.map +1 -0
  59. package/dist/utilities/fn-exec.js +66 -0
  60. package/dist/utilities/fn-exec.js.map +1 -0
  61. package/dist/utilities/function-cache-manager.d.ts +30 -0
  62. package/dist/utilities/function-cache-manager.d.ts.map +1 -0
  63. package/dist/utilities/function-cache-manager.js +106 -0
  64. package/dist/utilities/function-cache-manager.js.map +1 -0
  65. package/dist/utilities/index.d.ts +7 -0
  66. package/dist/utilities/index.d.ts.map +1 -1
  67. package/dist/utilities/index.js +7 -0
  68. package/dist/utilities/index.js.map +1 -1
  69. package/dist/utilities/metrics-aggregator.d.ts +4 -0
  70. package/dist/utilities/metrics-aggregator.d.ts.map +1 -1
  71. package/dist/utilities/metrics-aggregator.js +29 -0
  72. package/dist/utilities/metrics-aggregator.js.map +1 -1
  73. package/dist/utilities/prepare-api-function-options.d.ts +3 -0
  74. package/dist/utilities/prepare-api-function-options.d.ts.map +1 -0
  75. package/dist/utilities/prepare-api-function-options.js +50 -0
  76. package/dist/utilities/prepare-api-function-options.js.map +1 -0
  77. package/dist/utilities/req-fn.js +2 -2
  78. package/dist/utilities/req-fn.js.map +1 -1
  79. package/dist/utilities/validate-workflow-graph.d.ts +7 -0
  80. package/dist/utilities/validate-workflow-graph.d.ts.map +1 -0
  81. package/dist/utilities/validate-workflow-graph.js +235 -0
  82. package/dist/utilities/validate-workflow-graph.js.map +1 -0
  83. package/dist/utilities/workflow-graph-builder.d.ts +37 -0
  84. package/dist/utilities/workflow-graph-builder.d.ts.map +1 -0
  85. package/dist/utilities/workflow-graph-builder.js +225 -0
  86. package/dist/utilities/workflow-graph-builder.js.map +1 -0
  87. package/package.json +1 -1
@@ -1,61 +1,46 @@
1
- import { stableRequest } from "../core/index.js";
2
- import { prepareApiRequestData } from "./prepare-api-request-data.js";
3
- import { prepareApiRequestOptions } from './prepare-api-request-options.js';
1
+ import { executeGatewayItem } from "./execute-gateway-item.js";
2
+ import { RequestOrFunction } from "../enums/index.js";
4
3
  import { CircuitBreaker, CircuitBreakerOpenError } from "./circuit-breaker.js";
5
- export async function executeSequentially(requests = [], requestExecutionOptions = {}) {
4
+ export async function executeSequentially(items = [], requestExecutionOptions = {}) {
6
5
  const responses = [];
7
6
  const circuitBreaker = requestExecutionOptions.circuitBreaker
8
7
  ? (requestExecutionOptions.circuitBreaker instanceof CircuitBreaker
9
8
  ? requestExecutionOptions.circuitBreaker
10
9
  : new CircuitBreaker(requestExecutionOptions.circuitBreaker))
11
10
  : null;
12
- for (let i = 0; i < requests.length; i++) {
13
- const req = requests[i];
14
- try {
15
- if (circuitBreaker && !circuitBreaker.getState().config.trackIndividualAttempts) {
16
- const canExecute = await circuitBreaker.canExecute();
17
- if (!canExecute) {
18
- throw new CircuitBreakerOpenError(`stable-request: Circuit breaker is ${circuitBreaker.getState().state}. Request blocked.`);
19
- }
20
- }
21
- const finalRequestOptions = {
22
- reqData: prepareApiRequestData(req, requestExecutionOptions),
23
- ...prepareApiRequestOptions(req, requestExecutionOptions),
24
- commonBuffer: requestExecutionOptions.sharedBuffer ?? req.requestOptions.commonBuffer,
25
- ...(circuitBreaker ? { circuitBreaker } : {}),
26
- executionContext: {
27
- ...requestExecutionOptions.executionContext,
28
- requestId: req.id
29
- }
11
+ // Convert to unified format if needed
12
+ const unifiedItems = items.map(item => {
13
+ if ('type' in item) {
14
+ return item;
15
+ }
16
+ else {
17
+ return {
18
+ type: RequestOrFunction.REQUEST,
19
+ request: item
30
20
  };
31
- const requestResult = await stableRequest(finalRequestOptions);
32
- if (circuitBreaker && !circuitBreaker.getState().config.trackIndividualAttempts) {
33
- circuitBreaker.recordSuccess();
21
+ }
22
+ });
23
+ for (let i = 0; i < unifiedItems.length; i++) {
24
+ const item = unifiedItems[i];
25
+ try {
26
+ const response = await executeGatewayItem(item, requestExecutionOptions, circuitBreaker);
27
+ responses.push(response);
28
+ if (!response.success && requestExecutionOptions.stopOnFirstError) {
29
+ break;
34
30
  }
35
- responses.push({
36
- requestId: req.id,
37
- ...(req.groupId && { groupId: req.groupId }),
38
- success: requestResult.success,
39
- ...(requestResult.data !== undefined && { data: requestResult.data }),
40
- ...(!requestResult.success && {
41
- error: requestResult.error || 'Request was unsuccessful, but the error was analyzed successfully!'
42
- })
43
- });
44
31
  }
45
32
  catch (error) {
46
- if (circuitBreaker &&
47
- !(error instanceof CircuitBreakerOpenError) &&
48
- !circuitBreaker.getState().config.trackIndividualAttempts) {
49
- circuitBreaker.recordFailure();
50
- }
33
+ const itemId = item.type === RequestOrFunction.REQUEST ? item.request.id : item.function.id;
34
+ const groupId = item.type === RequestOrFunction.REQUEST ? item.request.groupId : item.function.groupId;
51
35
  const isCircuitBreakerError = error instanceof CircuitBreakerOpenError;
52
36
  responses.push({
53
- requestId: req.id,
54
- ...(req.groupId && { groupId: req.groupId }),
37
+ requestId: itemId,
38
+ ...(groupId && { groupId }),
55
39
  success: false,
56
40
  error: isCircuitBreakerError
57
41
  ? `Circuit breaker open: ${error.message}`
58
- : (error?.message || 'An error occurred! Error description is unavailable.')
42
+ : (error?.message || 'An error occurred! Error description is unavailable.'),
43
+ type: item.type
59
44
  });
60
45
  if (requestExecutionOptions.stopOnFirstError) {
61
46
  break;
@@ -1 +1 @@
1
- {"version":3,"file":"execute-sequentially.js","sourceRoot":"","sources":["../../src/utilities/execute-sequentially.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAO5E,OAAO,EAAE,cAAc,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAE/E,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACrC,WAAqE,EAAE,EACvE,0BAAmG,EAAE;IAErG,MAAM,SAAS,GAA6C,EAAE,CAAC;IAE/D,MAAM,cAAc,GAAG,uBAAuB,CAAC,cAAc;QACzD,CAAC,CAAC,CAAC,uBAAuB,CAAC,cAAc,YAAY,cAAc;YAC/D,CAAC,CAAC,uBAAuB,CAAC,cAAc;YACxC,CAAC,CAAC,IAAI,cAAc,CAAC,uBAAuB,CAAC,cAAqB,CAAC,CAAC;QACxE,CAAC,CAAC,IAAI,CAAC;IAEX,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,MAAM,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QAExB,IAAI,CAAC;YACD,IAAI,cAAc,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC,uBAAuB,EAAE,CAAC;gBAC9E,MAAM,UAAU,GAAG,MAAM,cAAc,CAAC,UAAU,EAAE,CAAC;gBACrD,IAAI,CAAC,UAAU,EAAE,CAAC;oBACd,MAAM,IAAI,uBAAuB,CAC7B,sCAAsC,cAAc,CAAC,QAAQ,EAAE,CAAC,KAAK,oBAAoB,CAC5F,CAAC;gBACN,CAAC;YACL,CAAC;YAED,MAAM,mBAAmB,GAAG;gBACxB,OAAO,EAAE,qBAAqB,CAAoC,GAAG,EAAE,uBAAuB,CAAC;gBAC/F,GAAG,wBAAwB,CAAoC,GAAG,EAAE,uBAAuB,CAAC;gBAC5F,YAAY,EAAE,uBAAuB,CAAC,YAAY,IAAI,GAAG,CAAC,cAAc,CAAC,YAAY;gBACrF,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC7C,gBAAgB,EAAE;oBACd,GAAG,uBAAuB,CAAC,gBAAgB;oBAC3C,SAAS,EAAE,GAAG,CAAC,EAAE;iBACpB;aACJ,CAAC;YAEF,MAAM,aAAa,GAAG,MAAM,aAAa,CAAoC,mBAAmB,CAAC,CAAC;YAElG,IAAI,cAAc,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC,uBAAuB,EAAE,CAAC;gBAC9E,cAAc,CAAC,aAAa,EAAE,CAAC;YACnC,CAAC;YAED,SAAS,CAAC,IAAI,CAAC;gBACX,SAAS,EAAE,GAAG,CAAC,EAAE;gBACjB,GAAG,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC;gBAC5C,OAAO,EAAE,aAAa,CAAC,OAAO;gBAC9B,GAAG,CAAC,aAAa,CAAC,IAAI,KAAK,SAAS,IAAI,EAAE,IAAI,EAAE,aAAa,CAAC,IAAI,EAAE,CAAC;gBACrE,GAAG,CAAC,CAAC,aAAa,CAAC,OAAO,IAAI;oBAC1B,KAAK,EAAE,aAAa,CAAC,KAAK,IAAI,oEAAoE;iBACrG,CAAC;aACL,CAAC,CAAC;QAEP,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YAClB,IAAI,cAAc;gBACd,CAAC,CAAC,KAAK,YAAY,uBAAuB,CAAC;gBAC3C,CAAC,cAAc,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC,uBAAuB,EAAE,CAAC;gBAC5D,cAAc,CAAC,aAAa,EAAE,CAAC;YACnC,CAAC;YAED,MAAM,qBAAqB,GAAG,KAAK,YAAY,uBAAuB,CAAC;YAEvE,SAAS,CAAC,IAAI,CAAC;gBACX,SAAS,EAAE,GAAG,CAAC,EAAE;gBACjB,GAAG,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC;gBAC5C,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,qBAAqB;oBACxB,CAAC,CAAC,yBAAyB,KAAK,CAAC,OAAO,EAAE;oBAC1C,CAAC,CAAC,CAAC,KAAK,EAAE,OAAO,IAAI,sDAAsD,CAAC;aACnF,CAAC,CAAC;YAEH,IAAI,uBAAuB,CAAC,gBAAgB,EAAE,CAAC;gBAC3C,MAAM;YACV,CAAC;QACL,CAAC;IACL,CAAC;IAED,OAAO,SAAS,CAAC;AACrB,CAAC"}
1
+ {"version":3,"file":"execute-sequentially.js","sourceRoot":"","sources":["../../src/utilities/execute-sequentially.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAOtD,OAAO,EAAE,cAAc,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAE/E,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACrC,QAAsI,EAAE,EACxI,0BAAmG,EAAE;IAErG,MAAM,SAAS,GAA6C,EAAE,CAAC;IAE/D,MAAM,cAAc,GAAG,uBAAuB,CAAC,cAAc;QACzD,CAAC,CAAC,CAAC,uBAAuB,CAAC,cAAc,YAAY,cAAc;YAC/D,CAAC,CAAC,uBAAuB,CAAC,cAAc;YACxC,CAAC,CAAC,IAAI,cAAc,CAAC,uBAAuB,CAAC,cAAqB,CAAC,CAAC;QACxE,CAAC,CAAC,IAAI,CAAC;IAEX,sCAAsC;IACtC,MAAM,YAAY,GAAsE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;QACrG,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;YACjB,OAAO,IAAuE,CAAC;QACnF,CAAC;aAAM,CAAC;YACJ,OAAO;gBACH,IAAI,EAAE,iBAAiB,CAAC,OAAO;gBAC/B,OAAO,EAAE,IAA8D;aAC1E,CAAC;QACN,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3C,MAAM,IAAI,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;QAE7B,IAAI,CAAC;YACD,MAAM,QAAQ,GAAG,MAAM,kBAAkB,CAAC,IAAI,EAAE,uBAAuB,EAAE,cAAc,CAAC,CAAC;YACzF,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAEzB,IAAI,CAAC,QAAQ,CAAC,OAAO,IAAI,uBAAuB,CAAC,gBAAgB,EAAE,CAAC;gBAChE,MAAM;YACV,CAAC;QACL,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YAClB,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,KAAK,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC5F,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,KAAK,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;YACvG,MAAM,qBAAqB,GAAG,KAAK,YAAY,uBAAuB,CAAC;YAEvE,SAAS,CAAC,IAAI,CAAC;gBACX,SAAS,EAAE,MAAM;gBACjB,GAAG,CAAC,OAAO,IAAI,EAAE,OAAO,EAAE,CAAC;gBAC3B,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,qBAAqB;oBACxB,CAAC,CAAC,yBAAyB,KAAK,CAAC,OAAO,EAAE;oBAC1C,CAAC,CAAC,CAAC,KAAK,EAAE,OAAO,IAAI,sDAAsD,CAAC;gBAChF,IAAI,EAAE,IAAI,CAAC,IAAI;aAClB,CAAC,CAAC;YAEH,IAAI,uBAAuB,CAAC,gBAAgB,EAAE,CAAC;gBAC3C,MAAM;YACV,CAAC;QACL,CAAC;IACL,CAAC;IAED,OAAO,SAAS,CAAC;AACrB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { WorkflowGraph, WorkflowGraphOptions, STABLE_WORKFLOW_RESULT } from '../types/index.js';
2
+ export declare function executeWorkflowGraph<RequestDataType = any, ResponseDataType = any>(graph: WorkflowGraph<RequestDataType, ResponseDataType>, options: WorkflowGraphOptions<RequestDataType, ResponseDataType>): Promise<STABLE_WORKFLOW_RESULT<ResponseDataType>>;
3
+ //# sourceMappingURL=execute-workflow-graph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execute-workflow-graph.d.ts","sourceRoot":"","sources":["../../src/utilities/execute-workflow-graph.ts"],"names":[],"mappings":"AACA,OAAO,EACL,aAAa,EACb,oBAAoB,EACpB,sBAAsB,EAIvB,MAAM,mBAAmB,CAAC;AAS3B,wBAAsB,oBAAoB,CAAC,eAAe,GAAG,GAAG,EAAE,gBAAgB,GAAG,GAAG,EACtF,KAAK,EAAE,aAAa,CAAC,eAAe,EAAE,gBAAgB,CAAC,EACvD,OAAO,EAAE,oBAAoB,CAAC,eAAe,EAAE,gBAAgB,CAAC,GAC/D,OAAO,CAAC,sBAAsB,CAAC,gBAAgB,CAAC,CAAC,CAqZnD"}
@@ -0,0 +1,326 @@
1
+ import { WorkflowNodeTypes, WorkflowEdgeConditionTypes } from '../enums/index.js';
2
+ import { validateWorkflowGraph } from './validate-workflow-graph.js';
3
+ import { executePhase } from './execute-phase.js';
4
+ import { executeBranchWorkflow } from './execute-branch-workflow.js';
5
+ import { formatLogContext } from './format-log-context.js';
6
+ import { safelyStringify } from './safely-stringify.js';
7
+ import { MetricsAggregator } from './metrics-aggregator.js';
8
+ import { executeWithPersistence } from './execute-with-persistence.js';
9
+ export async function executeWorkflowGraph(graph, options) {
10
+ const startTime = Date.now();
11
+ const workflowId = options.workflowId || `workflow-graph-${Date.now()}`;
12
+ if (options.validateGraph !== false) {
13
+ const validation = validateWorkflowGraph(graph);
14
+ if (!validation.valid) {
15
+ throw new Error(`Invalid workflow graph:\n${validation.errors.join('\n')}`);
16
+ }
17
+ if (validation.warnings.length > 0 && options.logPhaseResults) {
18
+ console.warn(`${formatLogContext({ workflowId })}stable-request: Workflow graph warnings:\n${validation.errors.join('\n')}`);
19
+ }
20
+ }
21
+ const results = new Map();
22
+ const visited = new Set();
23
+ const executionHistory = [];
24
+ const phaseResults = [];
25
+ const sharedBuffer = options.sharedBuffer || {};
26
+ let totalRequests = 0;
27
+ let successfulRequests = 0;
28
+ let failedRequests = 0;
29
+ let terminatedEarly = false;
30
+ let terminationReason;
31
+ const areDependenciesSatisfied = (nodeId, waitForNodes) => {
32
+ return waitForNodes.every(depId => visited.has(depId));
33
+ };
34
+ const executeNode = async (nodeId) => {
35
+ if (visited.has(nodeId) || terminatedEarly) {
36
+ return;
37
+ }
38
+ const node = graph.nodes.get(nodeId);
39
+ if (!node) {
40
+ throw new Error(`${formatLogContext({ workflowId })}Node '${nodeId}' not found in graph`);
41
+ }
42
+ if (node.type === WorkflowNodeTypes.MERGE_POINT && node.waitForNodes) {
43
+ if (!areDependenciesSatisfied(nodeId, node.waitForNodes)) {
44
+ return;
45
+ }
46
+ visited.add(nodeId);
47
+ if (options.logPhaseResults) {
48
+ console.info(`${formatLogContext({ workflowId })}stable-request: Merge point '${nodeId}' synchronized (waited for: ${node.waitForNodes.join(', ')})`);
49
+ }
50
+ const edges = graph.edges.get(nodeId) || [];
51
+ for (const edge of edges) {
52
+ if (terminatedEarly)
53
+ break;
54
+ await executeNode(edge.to);
55
+ }
56
+ return;
57
+ }
58
+ switch (node.type) {
59
+ case WorkflowNodeTypes.PHASE:
60
+ await executePhaseNode(node, nodeId);
61
+ break;
62
+ case WorkflowNodeTypes.BRANCH:
63
+ await executeBranchNode(node, nodeId);
64
+ break;
65
+ case WorkflowNodeTypes.CONDITIONAL:
66
+ await executeConditionalNode(node, nodeId);
67
+ return;
68
+ case WorkflowNodeTypes.PARALLEL_GROUP:
69
+ await executeParallelGroupNode(node, nodeId);
70
+ break;
71
+ }
72
+ visited.add(nodeId);
73
+ if (terminatedEarly) {
74
+ return;
75
+ }
76
+ const edges = graph.edges.get(nodeId) || [];
77
+ for (const edge of edges) {
78
+ if (edge.condition) {
79
+ let shouldTraverse = false;
80
+ if (edge.condition.type === WorkflowEdgeConditionTypes.ALWAYS) {
81
+ shouldTraverse = true;
82
+ }
83
+ else if (edge.condition.type === WorkflowEdgeConditionTypes.SUCCESS) {
84
+ const result = results.get(nodeId);
85
+ shouldTraverse = result?.success === true;
86
+ }
87
+ else if (edge.condition.type === WorkflowEdgeConditionTypes.FAILURE) {
88
+ const result = results.get(nodeId);
89
+ shouldTraverse = result?.success === false;
90
+ }
91
+ else if (edge.condition.type === WorkflowEdgeConditionTypes.CUSTOM && edge.condition.evaluate) {
92
+ shouldTraverse = await edge.condition.evaluate({
93
+ results,
94
+ sharedBuffer,
95
+ executionHistory,
96
+ currentNodeId: nodeId
97
+ });
98
+ }
99
+ if (!shouldTraverse) {
100
+ continue;
101
+ }
102
+ }
103
+ if (terminatedEarly)
104
+ break;
105
+ await executeNode(edge.to);
106
+ }
107
+ };
108
+ const executePhaseNode = async (node, nodeId) => {
109
+ if (!node.phase) {
110
+ throw new Error(`${formatLogContext({ workflowId })}Phase node '${nodeId}' has no phase configuration`);
111
+ }
112
+ const phaseIndex = phaseResults.length;
113
+ const phaseId = node.phase.id || nodeId;
114
+ let executionNumber = 1;
115
+ let shouldReplay = false;
116
+ do {
117
+ try {
118
+ let phase = node.phase;
119
+ if (options.prePhaseExecutionHook) {
120
+ phase = await executeWithPersistence(options.prePhaseExecutionHook, {
121
+ phase,
122
+ phaseId,
123
+ phaseIndex,
124
+ workflowId,
125
+ sharedBuffer,
126
+ params: options.workflowHookParams?.prePhaseExecutionHookParams
127
+ }, options.statePersistence, { workflowId, phaseId }, sharedBuffer);
128
+ }
129
+ const phaseResult = await executePhase(phase, phaseIndex, workflowId, options, options.requestGroups || [], options.logPhaseResults || false, options.handlePhaseCompletion || (async () => { }), options.maxSerializableChars || 1000, options.workflowHookParams || {}, sharedBuffer, undefined, options.prePhaseExecutionHook);
130
+ results.set(nodeId, phaseResult);
131
+ phaseResults.push(phaseResult);
132
+ totalRequests += phaseResult.totalRequests;
133
+ successfulRequests += phaseResult.successfulRequests;
134
+ failedRequests += phaseResult.failedRequests;
135
+ const executionRecord = {
136
+ phaseId,
137
+ phaseIndex,
138
+ executionNumber,
139
+ timestamp: phaseResult.timestamp,
140
+ success: phaseResult.success,
141
+ executionTime: phaseResult.executionTime
142
+ };
143
+ shouldReplay = false;
144
+ if (node.phaseDecisionHook) {
145
+ const decision = await executeWithPersistence(node.phaseDecisionHook, {
146
+ workflowId,
147
+ phaseResult,
148
+ phaseId,
149
+ phaseIndex,
150
+ executionHistory,
151
+ sharedBuffer,
152
+ params: options.workflowHookParams?.handlePhaseDecisionParams
153
+ }, options.statePersistence, { workflowId, phaseId }, sharedBuffer);
154
+ executionRecord.decision = decision;
155
+ if (decision.action === 'replay') {
156
+ shouldReplay = true;
157
+ executionNumber++;
158
+ if (options.logPhaseResults) {
159
+ console.info(`${formatLogContext({ workflowId, phaseId })}stable-request: Phase decision - REPLAY (execution ${executionNumber})`);
160
+ }
161
+ }
162
+ else if (decision.action === 'terminate') {
163
+ terminatedEarly = true;
164
+ terminationReason = decision.reason || 'Phase decision hook requested termination';
165
+ if (options.logPhaseResults) {
166
+ console.info(`${formatLogContext({ workflowId, phaseId })}stable-request: Phase decision - TERMINATE: ${terminationReason}`);
167
+ }
168
+ }
169
+ }
170
+ executionHistory.push(executionRecord);
171
+ if (options.logPhaseResults) {
172
+ const logContext = formatLogContext({
173
+ workflowId,
174
+ phaseId
175
+ });
176
+ console.info(`${logContext}stable-request: Phase completed - Success: ${phaseResult.success}, Requests: ${phaseResult.totalRequests}`);
177
+ console.info(`${logContext}stable-request: ${safelyStringify(phaseResult, options.maxSerializableChars || 1000)}`);
178
+ }
179
+ if (options.handlePhaseCompletion) {
180
+ await executeWithPersistence(options.handlePhaseCompletion, {
181
+ phaseResult,
182
+ phaseId,
183
+ phaseIndex,
184
+ workflowId,
185
+ sharedBuffer,
186
+ params: options.workflowHookParams?.handlePhaseCompletionParams
187
+ }, options.statePersistence, { workflowId, phaseId }, sharedBuffer);
188
+ }
189
+ if (!phaseResult.success && options.stopOnFirstPhaseError) {
190
+ terminatedEarly = true;
191
+ terminationReason = `Phase '${phaseId}' failed`;
192
+ shouldReplay = false;
193
+ }
194
+ }
195
+ catch (error) {
196
+ const errorResult = {
197
+ workflowId,
198
+ phaseId,
199
+ phaseIndex,
200
+ success: false,
201
+ executionTime: Date.now() - startTime,
202
+ timestamp: new Date().toISOString(),
203
+ totalRequests: 0,
204
+ successfulRequests: 0,
205
+ failedRequests: 0,
206
+ responses: [],
207
+ error: error.message || 'Unknown error'
208
+ };
209
+ results.set(nodeId, errorResult);
210
+ phaseResults.push(errorResult);
211
+ terminatedEarly = true;
212
+ terminationReason = error.message || `${formatLogContext({ workflowId })}stable-request: Unknown error during execution`;
213
+ shouldReplay = false;
214
+ }
215
+ } while (shouldReplay && !terminatedEarly);
216
+ };
217
+ const executeBranchNode = async (node, nodeId) => {
218
+ if (!node.branch) {
219
+ throw new Error(`${formatLogContext({ workflowId })}Branch node '${nodeId}' has no branch configuration`);
220
+ }
221
+ const branchResult = await executeBranchWorkflow({
222
+ branches: [node.branch],
223
+ workflowId,
224
+ commonGatewayOptions: options,
225
+ requestGroups: options.requestGroups || [],
226
+ logPhaseResults: options.logPhaseResults || false,
227
+ handlePhaseCompletion: options.handlePhaseCompletion || (async () => { }),
228
+ handlePhaseError: options.handlePhaseError || (async () => { }),
229
+ handleBranchCompletion: options.handleBranchCompletion,
230
+ preBranchExecutionHook: options.preBranchExecutionHook,
231
+ prePhaseExecutionHook: options.prePhaseExecutionHook,
232
+ maxSerializableChars: options.maxSerializableChars || 1000,
233
+ workflowHookParams: options.workflowHookParams || {},
234
+ sharedBuffer,
235
+ stopOnFirstPhaseError: options.stopOnFirstPhaseError || false,
236
+ maxWorkflowIterations: options.maxWorkflowIterations || 1000
237
+ });
238
+ if (branchResult.branchResults.length > 0) {
239
+ const branch = branchResult.branchResults[0];
240
+ const branchPhaseResult = {
241
+ workflowId,
242
+ branchId: branch.branchId,
243
+ phaseId: `branch-${branch.branchId}`,
244
+ phaseIndex: phaseResults.length,
245
+ success: branch.success,
246
+ executionTime: branch.executionTime,
247
+ timestamp: new Date().toISOString(),
248
+ totalRequests: branchResult.totalRequests,
249
+ successfulRequests: branchResult.successfulRequests,
250
+ failedRequests: branchResult.failedRequests,
251
+ responses: []
252
+ };
253
+ results.set(nodeId, branchPhaseResult);
254
+ phaseResults.push(branchPhaseResult);
255
+ totalRequests += branchResult.totalRequests;
256
+ successfulRequests += branchResult.successfulRequests;
257
+ failedRequests += branchResult.failedRequests;
258
+ phaseResults.push(...branchResult.allPhaseResults);
259
+ }
260
+ };
261
+ const executeConditionalNode = async (node, nodeId) => {
262
+ if (!node.condition) {
263
+ throw new Error(`${formatLogContext({ workflowId })}Conditional node '${nodeId}' has no condition`);
264
+ }
265
+ visited.add(nodeId);
266
+ const nextNodeId = await executeWithPersistence(node.condition.evaluate, {
267
+ results,
268
+ sharedBuffer,
269
+ executionHistory,
270
+ currentNodeId: nodeId
271
+ }, options.statePersistence, { workflowId, phaseId: nodeId }, sharedBuffer);
272
+ if (options.logPhaseResults) {
273
+ console.info(`${formatLogContext({ workflowId, phaseId: nodeId })}stable-request: Conditional '${nodeId}' evaluated to: ${nextNodeId}`);
274
+ }
275
+ if (graph.nodes.has(nextNodeId)) {
276
+ await executeNode(nextNodeId);
277
+ }
278
+ else {
279
+ throw new Error(`${formatLogContext({ workflowId })}Conditional node '${nodeId}' evaluated to non-existent node '${nextNodeId}'`);
280
+ }
281
+ };
282
+ const executeParallelGroupNode = async (node, nodeId) => {
283
+ if (!node.parallelNodes || node.parallelNodes.length === 0) {
284
+ throw new Error(`${formatLogContext({ workflowId })}Parallel group node '${nodeId}' has no parallel nodes`);
285
+ }
286
+ if (options.logPhaseResults) {
287
+ console.info(`${formatLogContext({ workflowId })}stable-request: Starting parallel execution of: ${node.parallelNodes.join(', ')}`);
288
+ }
289
+ await Promise.all(node.parallelNodes.map(parallelNodeId => executeNode(parallelNodeId)));
290
+ if (options.logPhaseResults) {
291
+ console.info(`${formatLogContext({ workflowId })}stable-request: Parallel execution completed for: ${node.parallelNodes.join(', ')}`);
292
+ }
293
+ };
294
+ try {
295
+ await executeNode(graph.entryPoint);
296
+ }
297
+ catch (error) {
298
+ if (!terminatedEarly) {
299
+ terminatedEarly = true;
300
+ terminationReason = error.message || `${formatLogContext({ workflowId })}stable-request: Unknown error during execution`;
301
+ }
302
+ }
303
+ const executionTime = Date.now() - startTime;
304
+ const result = {
305
+ workflowId,
306
+ success: !terminatedEarly && failedRequests === 0,
307
+ executionTime,
308
+ timestamp: new Date().toISOString(),
309
+ totalPhases: phaseResults.length,
310
+ completedPhases: phaseResults.filter(p => p.success).length,
311
+ totalRequests,
312
+ successfulRequests,
313
+ failedRequests,
314
+ phases: phaseResults,
315
+ executionHistory,
316
+ terminatedEarly,
317
+ terminationReason
318
+ };
319
+ try {
320
+ result.metrics = MetricsAggregator.extractWorkflowMetrics(result);
321
+ }
322
+ catch (error) {
323
+ }
324
+ return result;
325
+ }
326
+ //# sourceMappingURL=execute-workflow-graph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execute-workflow-graph.js","sourceRoot":"","sources":["../../src/utilities/execute-workflow-graph.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { FnExecResponse, TRIAL_MODE_OPTIONS, FunctionCacheConfig, ExecutionContext } from '../types/index.js';
2
+ export declare function fnExec<TArgs extends any[] = any[], TReturn = any>(fn: (...args: TArgs) => TReturn | Promise<TReturn>, args: TArgs, returnResult?: boolean, maxSerializableChars?: number, trialMode?: TRIAL_MODE_OPTIONS, cacheConfig?: FunctionCacheConfig<TArgs, TReturn>, executionContext?: ExecutionContext): Promise<FnExecResponse<TReturn>>;
3
+ //# sourceMappingURL=fn-exec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fn-exec.d.ts","sourceRoot":"","sources":["../../src/utilities/fn-exec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAK9G,wBAAsB,MAAM,CAAC,KAAK,SAAS,GAAG,EAAE,GAAG,GAAG,EAAE,EAAE,OAAO,GAAG,GAAG,EACrE,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,EAClD,IAAI,EAAE,KAAK,EACX,YAAY,UAAQ,EACpB,oBAAoB,SAAO,EAC3B,SAAS,GAAE,kBAAuC,EAClD,WAAW,CAAC,EAAE,mBAAmB,CAAC,KAAK,EAAE,OAAO,CAAC,EACjD,gBAAgB,CAAC,EAAE,gBAAgB,GAClC,OAAO,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAsElC"}
@@ -0,0 +1,66 @@
1
+ import { safelyStringify } from './safely-stringify.js';
2
+ import { getGlobalFunctionCacheManager } from './function-cache-manager.js';
3
+ import { formatLogContext } from './format-log-context.js';
4
+ export async function fnExec(fn, args, returnResult = false, maxSerializableChars = 1000, trialMode = { enabled: false }, cacheConfig, executionContext) {
5
+ const startTime = Date.now();
6
+ let stopTime = 0;
7
+ const timestamp = new Date(startTime).toISOString();
8
+ let cacheManager = null;
9
+ if (cacheConfig?.enabled) {
10
+ cacheManager = getGlobalFunctionCacheManager(cacheConfig);
11
+ const cached = cacheManager.get(fn, args);
12
+ if (cached) {
13
+ return {
14
+ ok: true,
15
+ isRetryable: true,
16
+ data: returnResult ? cached.data : undefined,
17
+ timestamp: new Date(cached.timestamp).toISOString(),
18
+ executionTime: 0,
19
+ fromCache: true
20
+ };
21
+ }
22
+ }
23
+ try {
24
+ if (trialMode.enabled) {
25
+ const trialCondition = Math.random() <= (trialMode?.reqFailureProbability ?? 0);
26
+ if (trialCondition) {
27
+ console.error(`${formatLogContext(executionContext)}stable-request: Function execution failed in trial mode.\nFunction: ${fn.name || 'anonymous'}\nArgs:\n`, safelyStringify(args, maxSerializableChars));
28
+ throw new Error(`${formatLogContext(executionContext)}stable-request: Function execution failed in trial mode.`);
29
+ }
30
+ else {
31
+ stopTime = Date.now();
32
+ return {
33
+ ok: true,
34
+ isRetryable: true,
35
+ data: returnResult ? { trialMode } : undefined,
36
+ timestamp,
37
+ executionTime: stopTime - startTime
38
+ };
39
+ }
40
+ }
41
+ const result = await fn(...args);
42
+ stopTime = Date.now();
43
+ if (cacheManager) {
44
+ cacheManager.set(fn, args, result);
45
+ }
46
+ return {
47
+ ok: true,
48
+ isRetryable: true,
49
+ data: returnResult ? result : undefined,
50
+ timestamp,
51
+ executionTime: stopTime - startTime
52
+ };
53
+ }
54
+ catch (error) {
55
+ stopTime = Date.now();
56
+ const executionTime = stopTime - startTime;
57
+ return {
58
+ ok: false,
59
+ isRetryable: true,
60
+ error: `${formatLogContext(executionContext)}stable-request: ${error.message || String(error)}`,
61
+ timestamp,
62
+ executionTime
63
+ };
64
+ }
65
+ }
66
+ //# sourceMappingURL=fn-exec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fn-exec.js","sourceRoot":"","sources":["../../src/utilities/fn-exec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import { FunctionCacheConfig } from '../types/index.js';
2
+ export interface CachedFunctionResponse<T = any> {
3
+ data: T;
4
+ timestamp: number;
5
+ expiresAt: number;
6
+ }
7
+ export declare class FunctionCacheManager {
8
+ private cache;
9
+ private config;
10
+ private stats;
11
+ constructor(config: FunctionCacheConfig<any, any>);
12
+ private generateKey;
13
+ get<TArgs extends any[], TReturn>(fn: (...args: TArgs) => any, args: TArgs): CachedFunctionResponse<TReturn> | null;
14
+ set<TArgs extends any[], TReturn>(fn: (...args: TArgs) => any, args: TArgs, data: TReturn): void;
15
+ clear(): void;
16
+ getStats(): {
17
+ hits: number;
18
+ misses: number;
19
+ hitRate: number;
20
+ missRate: number;
21
+ sets: number;
22
+ evictions: number;
23
+ size: number;
24
+ maxSize: number;
25
+ averageGetTime: number;
26
+ averageSetTime: number;
27
+ };
28
+ }
29
+ export declare function getGlobalFunctionCacheManager(config?: FunctionCacheConfig<any, any>): FunctionCacheManager;
30
+ //# sourceMappingURL=function-cache-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"function-cache-manager.d.ts","sourceRoot":"","sources":["../../src/utilities/function-cache-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAGxD,MAAM,WAAW,sBAAsB,CAAC,CAAC,GAAG,GAAG;IAC7C,IAAI,EAAE,CAAC,CAAC;IACR,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,KAAK,CAAsC;IACnD,OAAO,CAAC,MAAM,CAAgC;IAC9C,OAAO,CAAC,KAAK,CAOX;gBAEU,MAAM,EAAE,mBAAmB,CAAC,GAAG,EAAE,GAAG,CAAC;IASjD,OAAO,CAAC,WAAW;IAWnB,GAAG,CAAC,KAAK,SAAS,GAAG,EAAE,EAAE,OAAO,EAC9B,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,KAAK,GAAG,EAC3B,IAAI,EAAE,KAAK,GACV,sBAAsB,CAAC,OAAO,CAAC,GAAG,IAAI;IA0BzC,GAAG,CAAC,KAAK,SAAS,GAAG,EAAE,EAAE,OAAO,EAC9B,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,KAAK,GAAG,EAC3B,IAAI,EAAE,KAAK,EACX,IAAI,EAAE,OAAO,GACZ,IAAI;IA4BP,KAAK,IAAI,IAAI;IAIb,QAAQ;;;;;;;;;;;;CAmBT;AAID,wBAAgB,6BAA6B,CAAC,MAAM,CAAC,EAAE,mBAAmB,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,oBAAoB,CAK1G"}