@acmekit/orchestration 2.13.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 (74) hide show
  1. package/dist/index.d.ts +4 -0
  2. package/dist/index.d.ts.map +1 -0
  3. package/dist/index.js +20 -0
  4. package/dist/index.js.map +1 -0
  5. package/dist/joiner/helpers.d.ts +3 -0
  6. package/dist/joiner/helpers.d.ts.map +1 -0
  7. package/dist/joiner/helpers.js +69 -0
  8. package/dist/joiner/helpers.js.map +1 -0
  9. package/dist/joiner/index.d.ts +3 -0
  10. package/dist/joiner/index.d.ts.map +1 -0
  11. package/dist/joiner/index.js +19 -0
  12. package/dist/joiner/index.js.map +1 -0
  13. package/dist/joiner/remote-joiner.d.ts +43 -0
  14. package/dist/joiner/remote-joiner.d.ts.map +1 -0
  15. package/dist/joiner/remote-joiner.js +1279 -0
  16. package/dist/joiner/remote-joiner.js.map +1 -0
  17. package/dist/transaction/datastore/abstract-storage.d.ts +44 -0
  18. package/dist/transaction/datastore/abstract-storage.d.ts.map +1 -0
  19. package/dist/transaction/datastore/abstract-storage.js +52 -0
  20. package/dist/transaction/datastore/abstract-storage.js.map +1 -0
  21. package/dist/transaction/datastore/base-in-memory-storage.d.ts +12 -0
  22. package/dist/transaction/datastore/base-in-memory-storage.d.ts.map +1 -0
  23. package/dist/transaction/datastore/base-in-memory-storage.js +35 -0
  24. package/dist/transaction/datastore/base-in-memory-storage.js.map +1 -0
  25. package/dist/transaction/distributed-transaction.d.ts +116 -0
  26. package/dist/transaction/distributed-transaction.d.ts.map +1 -0
  27. package/dist/transaction/distributed-transaction.js +488 -0
  28. package/dist/transaction/distributed-transaction.js.map +1 -0
  29. package/dist/transaction/errors.d.ts +41 -0
  30. package/dist/transaction/errors.d.ts.map +1 -0
  31. package/dist/transaction/errors.js +117 -0
  32. package/dist/transaction/errors.js.map +1 -0
  33. package/dist/transaction/index.d.ts +8 -0
  34. package/dist/transaction/index.d.ts.map +1 -0
  35. package/dist/transaction/index.js +24 -0
  36. package/dist/transaction/index.js.map +1 -0
  37. package/dist/transaction/orchestrator-builder.d.ts +36 -0
  38. package/dist/transaction/orchestrator-builder.d.ts.map +1 -0
  39. package/dist/transaction/orchestrator-builder.js +300 -0
  40. package/dist/transaction/orchestrator-builder.js.map +1 -0
  41. package/dist/transaction/transaction-orchestrator.d.ts +207 -0
  42. package/dist/transaction/transaction-orchestrator.d.ts.map +1 -0
  43. package/dist/transaction/transaction-orchestrator.js +1292 -0
  44. package/dist/transaction/transaction-orchestrator.js.map +1 -0
  45. package/dist/transaction/transaction-step.d.ts +69 -0
  46. package/dist/transaction/transaction-step.d.ts.map +1 -0
  47. package/dist/transaction/transaction-step.js +153 -0
  48. package/dist/transaction/transaction-step.js.map +1 -0
  49. package/dist/transaction/types.d.ts +264 -0
  50. package/dist/transaction/types.d.ts.map +1 -0
  51. package/dist/transaction/types.js +23 -0
  52. package/dist/transaction/types.js.map +1 -0
  53. package/dist/tsconfig.tsbuildinfo +1 -0
  54. package/dist/workflow/global-workflow.d.ts +14 -0
  55. package/dist/workflow/global-workflow.d.ts.map +1 -0
  56. package/dist/workflow/global-workflow.js +105 -0
  57. package/dist/workflow/global-workflow.js.map +1 -0
  58. package/dist/workflow/index.d.ts +5 -0
  59. package/dist/workflow/index.d.ts.map +1 -0
  60. package/dist/workflow/index.js +21 -0
  61. package/dist/workflow/index.js.map +1 -0
  62. package/dist/workflow/local-workflow.d.ts +47 -0
  63. package/dist/workflow/local-workflow.d.ts.map +1 -0
  64. package/dist/workflow/local-workflow.js +390 -0
  65. package/dist/workflow/local-workflow.js.map +1 -0
  66. package/dist/workflow/scheduler.d.ts +12 -0
  67. package/dist/workflow/scheduler.d.ts.map +1 -0
  68. package/dist/workflow/scheduler.js +35 -0
  69. package/dist/workflow/scheduler.js.map +1 -0
  70. package/dist/workflow/workflow-manager.d.ts +38 -0
  71. package/dist/workflow/workflow-manager.d.ts.map +1 -0
  72. package/dist/workflow/workflow-manager.js +124 -0
  73. package/dist/workflow/workflow-manager.js.map +1 -0
  74. package/package.json +41 -0
@@ -0,0 +1,207 @@
1
+ import { DistributedTransactionType } from "./distributed-transaction";
2
+ import { TransactionStep, TransactionStepHandler } from "./transaction-step";
3
+ import { StepFeatures, TransactionFlow, TransactionModelOptions, TransactionOptions, TransactionStepsDefinition } from "./types";
4
+ import { Context } from "@acmekit/types";
5
+ import { EventEmitter } from "events";
6
+ /**
7
+ * @class TransactionOrchestrator is responsible for managing and executing distributed transactions.
8
+ * It is based on a single transaction definition, which is used to execute all the transaction steps
9
+ */
10
+ export declare class TransactionOrchestrator extends EventEmitter {
11
+ id: string;
12
+ private static ROOT_STEP;
13
+ static DEFAULT_TTL: number;
14
+ private invokeSteps;
15
+ private compensateSteps;
16
+ private definition;
17
+ private options?;
18
+ static DEFAULT_RETRIES: number;
19
+ private static workflowOptions;
20
+ static getWorkflowOptions(modelId: string): TransactionOptions;
21
+ /**
22
+ * Trace workflow transaction for instrumentation
23
+ */
24
+ static traceTransaction?: (transactionResume: (...args: any[]) => Promise<void>, metadata: {
25
+ model_id: string;
26
+ transaction_id: string;
27
+ flow_metadata: TransactionFlow["metadata"];
28
+ }) => Promise<any>;
29
+ /**
30
+ * Trace workflow steps for instrumentation
31
+ */
32
+ static traceStep?: (handler: (...args: any[]) => Promise<any>, metadata: {
33
+ action: string;
34
+ type: "invoke" | "compensate";
35
+ step_id: string;
36
+ step_uuid: string;
37
+ attempts: number;
38
+ failures: number;
39
+ async: boolean;
40
+ idempotency_key: string;
41
+ }) => Promise<any>;
42
+ constructor({ id, definition, options, isClone, }: {
43
+ id: string;
44
+ definition: TransactionStepsDefinition;
45
+ options?: TransactionModelOptions;
46
+ isClone?: boolean;
47
+ });
48
+ static isExpectedError(error: Error): boolean;
49
+ static clone(orchestrator: TransactionOrchestrator): TransactionOrchestrator;
50
+ private static SEPARATOR;
51
+ static getKeyName(...params: string[]): string;
52
+ private static getPreviousStep;
53
+ getOptions(): TransactionModelOptions;
54
+ private getInvokeSteps;
55
+ private getCompensationSteps;
56
+ private static countSiblings;
57
+ private canMoveForward;
58
+ private canMoveBackward;
59
+ private canContinue;
60
+ private hasExpired;
61
+ private checkTransactionTimeout;
62
+ private checkStepTimeout;
63
+ private checkAllSteps;
64
+ private computeCurrentTransactionState;
65
+ private flagStepsToRevert;
66
+ private static setStepSuccess;
67
+ private static retryStep;
68
+ private static skipStep;
69
+ private static setStepTimeout;
70
+ private static setStepFailure;
71
+ private executeNext;
72
+ /**
73
+ * Finalize the transaction when all steps are complete
74
+ */
75
+ private finalizeTransaction;
76
+ /**
77
+ * Prepare a step for execution by setting state and incrementing attempts
78
+ */
79
+ private prepareStepForExecution;
80
+ /**
81
+ * Create the payload for a step execution
82
+ */
83
+ private createStepPayload;
84
+ /**
85
+ * Prepare handler arguments for step execution
86
+ */
87
+ private prepareHandlerArgs;
88
+ /**
89
+ * Create the step execution promise with optional tracing
90
+ */
91
+ private createStepExecutionPromise;
92
+ /**
93
+ * Execute a synchronous step and handle its result
94
+ */
95
+ private executeSyncStep;
96
+ /**
97
+ * Execute an asynchronous step and handle its result
98
+ */
99
+ private executeAsyncStep;
100
+ /**
101
+ * Check if step or transaction has expired and handle timeouts
102
+ */
103
+ private handleStepExpiration;
104
+ /**
105
+ * Handle successful step completion
106
+ */
107
+ private handleStepSuccess;
108
+ /**
109
+ * Handle step failure
110
+ */
111
+ private handleStepFailure;
112
+ /**
113
+ * Start a new transaction or resume a transaction that has been previously started
114
+ * @param transaction - The transaction to resume
115
+ */
116
+ resume(transaction: DistributedTransactionType): Promise<void>;
117
+ /**
118
+ * Cancel and revert a transaction compensating all its executed steps. It can be an ongoing transaction or a completed one
119
+ * @param transaction - The transaction to be reverted
120
+ */
121
+ cancelTransaction(transaction: DistributedTransactionType, options?: {
122
+ preventExecuteNext?: boolean;
123
+ }): Promise<void>;
124
+ private parseFlowOptions;
125
+ private createTransactionFlow;
126
+ private static loadTransactionById;
127
+ static buildSteps(flow: TransactionStepsDefinition, existingSteps?: {
128
+ [key: string]: TransactionStep;
129
+ }): [{
130
+ [key: string]: TransactionStep;
131
+ }, StepFeatures];
132
+ /** Create a new transaction
133
+ * @param transactionId - unique identifier of the transaction
134
+ * @param handler - function to handle action of the transaction
135
+ * @param payload - payload to be passed to all the transaction steps
136
+ * @param flowMetadata - flow metadata which can include event group id for example
137
+ */
138
+ beginTransaction({ transactionId, handler, payload, flowMetadata, context, onLoad, }: {
139
+ transactionId: string;
140
+ handler: TransactionStepHandler;
141
+ payload?: unknown;
142
+ flowMetadata?: TransactionFlow["metadata"];
143
+ context?: Context;
144
+ onLoad?: (transaction: DistributedTransactionType) => Promise<void> | void;
145
+ }): Promise<DistributedTransactionType>;
146
+ /** Returns an existing transaction
147
+ * @param transactionId - unique identifier of the transaction
148
+ * @param handler - function to handle action of the transaction
149
+ */
150
+ retrieveExistingTransaction(transactionId: string, handler: TransactionStepHandler, options?: {
151
+ isCancelling?: boolean;
152
+ }): Promise<DistributedTransactionType>;
153
+ private static getStepByAction;
154
+ private static getTransactionAndStepFromIdempotencyKey;
155
+ /** Skip the execution of a specific transaction and step
156
+ * @param responseIdempotencyKey - The idempotency key for the step
157
+ * @param handler - The handler function to execute the step
158
+ * @param transaction - The current transaction. If not provided it will be loaded based on the responseIdempotencyKey
159
+ */
160
+ skipStep({ responseIdempotencyKey, handler, transaction, }: {
161
+ responseIdempotencyKey: string;
162
+ handler?: TransactionStepHandler;
163
+ transaction?: DistributedTransactionType;
164
+ }): Promise<DistributedTransactionType>;
165
+ /**
166
+ * Manually force a step to retry even if it is still in awaiting status
167
+ * @param responseIdempotencyKey - The idempotency key for the step
168
+ * @param handler - The handler function to execute the step
169
+ * @param transaction - The current transaction. If not provided it will be loaded based on the responseIdempotencyKey
170
+ */
171
+ retryStep({ responseIdempotencyKey, handler, transaction, onLoad, }: {
172
+ responseIdempotencyKey: string;
173
+ handler?: TransactionStepHandler;
174
+ transaction?: DistributedTransactionType;
175
+ onLoad?: (transaction: DistributedTransactionType) => Promise<void> | void;
176
+ }): Promise<DistributedTransactionType>;
177
+ /** Register a step success for a specific transaction and step
178
+ * @param responseIdempotencyKey - The idempotency key for the step
179
+ * @param handler - The handler function to execute the step
180
+ * @param transaction - The current transaction. If not provided it will be loaded based on the responseIdempotencyKey
181
+ * @param response - The response of the step
182
+ */
183
+ registerStepSuccess({ responseIdempotencyKey, handler, transaction, response, onLoad, }: {
184
+ responseIdempotencyKey: string;
185
+ handler?: TransactionStepHandler;
186
+ transaction?: DistributedTransactionType;
187
+ response?: unknown;
188
+ onLoad?: (transaction: DistributedTransactionType) => Promise<void> | void;
189
+ }): Promise<DistributedTransactionType>;
190
+ /**
191
+ * Register a step failure for a specific transaction and step
192
+ * @param responseIdempotencyKey - The idempotency key for the step
193
+ * @param error - The error that caused the failure
194
+ * @param handler - The handler function to execute the step
195
+ * @param transaction - The current transaction
196
+ * @param response - The response of the step
197
+ */
198
+ registerStepFailure({ responseIdempotencyKey, error, handler, transaction, onLoad, forcePermanentFailure, }: {
199
+ responseIdempotencyKey: string;
200
+ error?: Error | any;
201
+ handler?: TransactionStepHandler;
202
+ transaction?: DistributedTransactionType;
203
+ onLoad?: (transaction: DistributedTransactionType) => Promise<void> | void;
204
+ forcePermanentFailure?: boolean;
205
+ }): Promise<DistributedTransactionType>;
206
+ }
207
+ //# sourceMappingURL=transaction-orchestrator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transaction-orchestrator.d.ts","sourceRoot":"","sources":["../../src/transaction/transaction-orchestrator.ts"],"names":[],"mappings":"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"}