@memberjunction/core-actions 2.54.0 → 2.56.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/custom/ai/execute-ai-prompt.action.d.ts +94 -0
- package/dist/custom/ai/execute-ai-prompt.action.d.ts.map +1 -0
- package/dist/custom/ai/execute-ai-prompt.action.js +274 -0
- package/dist/custom/ai/execute-ai-prompt.action.js.map +1 -0
- package/dist/custom/communication/slack-webhook.action.d.ts +101 -0
- package/dist/custom/communication/slack-webhook.action.d.ts.map +1 -0
- package/dist/custom/communication/slack-webhook.action.js +269 -0
- package/dist/custom/communication/slack-webhook.action.js.map +1 -0
- package/dist/custom/communication/teams-webhook.action.d.ts +96 -0
- package/dist/custom/communication/teams-webhook.action.d.ts.map +1 -0
- package/dist/custom/communication/teams-webhook.action.js +275 -0
- package/dist/custom/communication/teams-webhook.action.js.map +1 -0
- package/dist/custom/data/aggregate-data.action.d.ts +91 -0
- package/dist/custom/data/aggregate-data.action.d.ts.map +1 -0
- package/dist/custom/data/aggregate-data.action.js +333 -0
- package/dist/custom/data/aggregate-data.action.js.map +1 -0
- package/dist/custom/data/csv-parser.action.d.ts +68 -0
- package/dist/custom/data/csv-parser.action.d.ts.map +1 -0
- package/dist/custom/data/csv-parser.action.js +184 -0
- package/dist/custom/data/csv-parser.action.js.map +1 -0
- package/dist/custom/data/data-mapper.action.d.ts +89 -0
- package/dist/custom/data/data-mapper.action.d.ts.map +1 -0
- package/dist/custom/data/data-mapper.action.js +325 -0
- package/dist/custom/data/data-mapper.action.js.map +1 -0
- package/dist/custom/data/json-transform.action.d.ts +57 -0
- package/dist/custom/data/json-transform.action.d.ts.map +1 -0
- package/dist/custom/data/json-transform.action.js +205 -0
- package/dist/custom/data/json-transform.action.js.map +1 -0
- package/dist/custom/data/xml-parser.action.d.ts +85 -0
- package/dist/custom/data/xml-parser.action.d.ts.map +1 -0
- package/dist/custom/data/xml-parser.action.js +326 -0
- package/dist/custom/data/xml-parser.action.js.map +1 -0
- package/dist/custom/files/excel-reader.action.d.ts +86 -0
- package/dist/custom/files/excel-reader.action.d.ts.map +1 -0
- package/dist/custom/files/excel-reader.action.js +348 -0
- package/dist/custom/files/excel-reader.action.js.map +1 -0
- package/dist/custom/files/excel-writer.action.d.ts +79 -0
- package/dist/custom/files/excel-writer.action.d.ts.map +1 -0
- package/dist/custom/files/excel-writer.action.js +325 -0
- package/dist/custom/files/excel-writer.action.js.map +1 -0
- package/dist/custom/files/file-compress.action.d.ts +90 -0
- package/dist/custom/files/file-compress.action.d.ts.map +1 -0
- package/dist/custom/files/file-compress.action.js +346 -0
- package/dist/custom/files/file-compress.action.js.map +1 -0
- package/dist/custom/files/pdf-extractor.action.d.ts +86 -0
- package/dist/custom/files/pdf-extractor.action.d.ts.map +1 -0
- package/dist/custom/files/pdf-extractor.action.js +247 -0
- package/dist/custom/files/pdf-extractor.action.js.map +1 -0
- package/dist/custom/files/pdf-generator.action.d.ts +70 -0
- package/dist/custom/files/pdf-generator.action.d.ts.map +1 -0
- package/dist/custom/files/pdf-generator.action.js +286 -0
- package/dist/custom/files/pdf-generator.action.js.map +1 -0
- package/dist/custom/integration/api-rate-limiter.action.d.ts +88 -0
- package/dist/custom/integration/api-rate-limiter.action.d.ts.map +1 -0
- package/dist/custom/integration/api-rate-limiter.action.js +363 -0
- package/dist/custom/integration/api-rate-limiter.action.js.map +1 -0
- package/dist/custom/integration/graphql-query.action.d.ts +92 -0
- package/dist/custom/integration/graphql-query.action.d.ts.map +1 -0
- package/dist/custom/integration/graphql-query.action.js +251 -0
- package/dist/custom/integration/graphql-query.action.js.map +1 -0
- package/dist/custom/integration/http-request.action.d.ts +96 -0
- package/dist/custom/integration/http-request.action.d.ts.map +1 -0
- package/dist/custom/integration/http-request.action.js +316 -0
- package/dist/custom/integration/http-request.action.js.map +1 -0
- package/dist/custom/integration/oauth-flow.action.d.ts +130 -0
- package/dist/custom/integration/oauth-flow.action.d.ts.map +1 -0
- package/dist/custom/integration/oauth-flow.action.js +624 -0
- package/dist/custom/integration/oauth-flow.action.js.map +1 -0
- package/dist/custom/security/password-strength.action.d.ts +129 -0
- package/dist/custom/security/password-strength.action.d.ts.map +1 -0
- package/dist/custom/security/password-strength.action.js +463 -0
- package/dist/custom/security/password-strength.action.js.map +1 -0
- package/dist/custom/utilities/base-file-handler.d.ts +54 -0
- package/dist/custom/utilities/base-file-handler.d.ts.map +1 -0
- package/dist/custom/utilities/base-file-handler.js +167 -0
- package/dist/custom/utilities/base-file-handler.js.map +1 -0
- package/dist/custom/utilities/index.d.ts +3 -0
- package/dist/custom/utilities/index.d.ts.map +1 -0
- package/dist/custom/utilities/index.js +19 -0
- package/dist/custom/utilities/index.js.map +1 -0
- package/dist/custom/utilities/json-param-helper.d.ts +33 -0
- package/dist/custom/utilities/json-param-helper.d.ts.map +1 -0
- package/dist/custom/utilities/json-param-helper.js +66 -0
- package/dist/custom/utilities/json-param-helper.js.map +1 -0
- package/dist/custom/web/duckduckgo-rate-limiter.d.ts +85 -0
- package/dist/custom/web/duckduckgo-rate-limiter.d.ts.map +1 -0
- package/dist/custom/web/duckduckgo-rate-limiter.js +257 -0
- package/dist/custom/web/duckduckgo-rate-limiter.js.map +1 -0
- package/dist/custom/web/web-search.action.d.ts +1 -0
- package/dist/custom/web/web-search.action.d.ts.map +1 -1
- package/dist/custom/web/web-search.action.js +48 -20
- package/dist/custom/web/web-search.action.js.map +1 -1
- package/dist/custom/workflow/conditional.action.d.ts +94 -0
- package/dist/custom/workflow/conditional.action.d.ts.map +1 -0
- package/dist/custom/workflow/conditional.action.js +274 -0
- package/dist/custom/workflow/conditional.action.js.map +1 -0
- package/dist/custom/workflow/delay.action.d.ts +76 -0
- package/dist/custom/workflow/delay.action.d.ts.map +1 -0
- package/dist/custom/workflow/delay.action.js +187 -0
- package/dist/custom/workflow/delay.action.js.map +1 -0
- package/dist/custom/workflow/loop.action.d.ts +112 -0
- package/dist/custom/workflow/loop.action.d.ts.map +1 -0
- package/dist/custom/workflow/loop.action.js +380 -0
- package/dist/custom/workflow/loop.action.js.map +1 -0
- package/dist/custom/workflow/parallel-execute.action.d.ts +105 -0
- package/dist/custom/workflow/parallel-execute.action.d.ts.map +1 -0
- package/dist/custom/workflow/parallel-execute.action.js +457 -0
- package/dist/custom/workflow/parallel-execute.action.js.map +1 -0
- package/dist/custom/workflow/retry.action.d.ts +90 -0
- package/dist/custom/workflow/retry.action.d.ts.map +1 -0
- package/dist/custom/workflow/retry.action.js +378 -0
- package/dist/custom/workflow/retry.action.js.map +1 -0
- package/dist/index.d.ts +23 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +75 -0
- package/dist/index.js.map +1 -1
- package/package.json +25 -10
- package/readme.md +11270 -101
|
@@ -0,0 +1,457 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
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;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.LoadParallelExecuteAction = exports.ParallelExecuteAction = void 0;
|
|
10
|
+
const global_1 = require("@memberjunction/global");
|
|
11
|
+
const actions_1 = require("@memberjunction/actions");
|
|
12
|
+
const actions_2 = require("@memberjunction/actions");
|
|
13
|
+
const json_param_helper_1 = require("../utilities/json-param-helper");
|
|
14
|
+
/**
|
|
15
|
+
* Action that executes multiple actions in parallel
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```typescript
|
|
19
|
+
* // Execute multiple actions in parallel
|
|
20
|
+
* await runAction({
|
|
21
|
+
* ActionName: 'Parallel Execute',
|
|
22
|
+
* Params: [{
|
|
23
|
+
* Name: 'Actions',
|
|
24
|
+
* Value: [
|
|
25
|
+
* {
|
|
26
|
+
* ActionName: 'Web Search',
|
|
27
|
+
* Params: { Query: 'latest news' }
|
|
28
|
+
* },
|
|
29
|
+
* {
|
|
30
|
+
* ActionName: 'Get Weather',
|
|
31
|
+
* Params: { Location: 'New York' }
|
|
32
|
+
* },
|
|
33
|
+
* {
|
|
34
|
+
* ActionName: 'Get Stock Price',
|
|
35
|
+
* Params: { Symbol: 'AAPL' }
|
|
36
|
+
* }
|
|
37
|
+
* ]
|
|
38
|
+
* }]
|
|
39
|
+
* });
|
|
40
|
+
*
|
|
41
|
+
* // Wait for first result only
|
|
42
|
+
* await runAction({
|
|
43
|
+
* ActionName: 'Parallel Execute',
|
|
44
|
+
* Params: [{
|
|
45
|
+
* Name: 'Actions',
|
|
46
|
+
* Value: [api1Action, api2Action, api3Action]
|
|
47
|
+
* }, {
|
|
48
|
+
* Name: 'WaitForAll',
|
|
49
|
+
* Value: false
|
|
50
|
+
* }]
|
|
51
|
+
* });
|
|
52
|
+
*
|
|
53
|
+
* // With timeout and error handling
|
|
54
|
+
* await runAction({
|
|
55
|
+
* ActionName: 'Parallel Execute',
|
|
56
|
+
* Params: [{
|
|
57
|
+
* Name: 'Actions',
|
|
58
|
+
* Value: actions
|
|
59
|
+
* }, {
|
|
60
|
+
* Name: 'ContinueOnError',
|
|
61
|
+
* Value: true
|
|
62
|
+
* }, {
|
|
63
|
+
* Name: 'Timeout',
|
|
64
|
+
* Value: 10000
|
|
65
|
+
* }, {
|
|
66
|
+
* Name: 'MaxConcurrent',
|
|
67
|
+
* Value: 5
|
|
68
|
+
* }]
|
|
69
|
+
* });
|
|
70
|
+
* ```
|
|
71
|
+
*/
|
|
72
|
+
let ParallelExecuteAction = class ParallelExecuteAction extends actions_1.BaseAction {
|
|
73
|
+
/**
|
|
74
|
+
* Executes multiple actions in parallel
|
|
75
|
+
*
|
|
76
|
+
* @param params - The action parameters containing:
|
|
77
|
+
* - Actions: Array of action configurations to execute (required)
|
|
78
|
+
* - WaitForAll: Boolean - wait for all vs first (default: true)
|
|
79
|
+
* - ContinueOnError: Boolean - continue if actions fail (default: false)
|
|
80
|
+
* - MaxConcurrent: Max parallel executions (default: unlimited)
|
|
81
|
+
* - Timeout: Overall timeout in milliseconds (optional)
|
|
82
|
+
* - IncludeContext: Additional context to pass to all actions (optional)
|
|
83
|
+
*
|
|
84
|
+
* @returns Array of results or first result based on WaitForAll
|
|
85
|
+
*/
|
|
86
|
+
async InternalRunAction(params) {
|
|
87
|
+
try {
|
|
88
|
+
const actions = json_param_helper_1.JSONParamHelper.getJSONParam(params, 'actions');
|
|
89
|
+
const waitForAll = this.getBooleanParam(params, 'waitforall', true);
|
|
90
|
+
const continueOnError = this.getBooleanParam(params, 'continueonerror', false);
|
|
91
|
+
const maxConcurrent = this.getNumericParam(params, 'maxconcurrent', 0); // 0 = unlimited
|
|
92
|
+
const timeout = this.getNumericParam(params, 'timeout', 0); // 0 = no timeout
|
|
93
|
+
const includeContext = json_param_helper_1.JSONParamHelper.getJSONParam(params, 'includecontext') || {};
|
|
94
|
+
// Validate actions
|
|
95
|
+
if (!actions || !Array.isArray(actions) || actions.length === 0) {
|
|
96
|
+
return {
|
|
97
|
+
Success: false,
|
|
98
|
+
Message: "Actions parameter must be a non-empty array",
|
|
99
|
+
ResultCode: "INVALID_ACTIONS"
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
// Validate action configurations
|
|
103
|
+
for (let i = 0; i < actions.length; i++) {
|
|
104
|
+
if (!actions[i] || !actions[i].ActionName) {
|
|
105
|
+
return {
|
|
106
|
+
Success: false,
|
|
107
|
+
Message: `Action at index ${i} must have ActionName`,
|
|
108
|
+
ResultCode: "INVALID_ACTION_CONFIG"
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
// Prepare actions with context
|
|
113
|
+
const preparedActions = actions.map(action => this.prepareActionConfig(action, includeContext));
|
|
114
|
+
// Execute based on mode
|
|
115
|
+
if (waitForAll) {
|
|
116
|
+
return await this.executeAllActions(preparedActions, continueOnError, maxConcurrent, timeout, params.ContextUser, params);
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
return await this.executeFirstAction(preparedActions, maxConcurrent, timeout, params.ContextUser, params);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
catch (error) {
|
|
123
|
+
return {
|
|
124
|
+
Success: false,
|
|
125
|
+
Message: `Parallel execute failed: ${error instanceof Error ? error.message : String(error)}`,
|
|
126
|
+
ResultCode: "PARALLEL_FAILED"
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Execute all actions and wait for completion
|
|
132
|
+
*/
|
|
133
|
+
async executeAllActions(actions, continueOnError, maxConcurrent, timeout, contextUser, params) {
|
|
134
|
+
const engine = new actions_2.ActionEngineServer();
|
|
135
|
+
const results = [];
|
|
136
|
+
const startTime = Date.now();
|
|
137
|
+
let successCount = 0;
|
|
138
|
+
let errorCount = 0;
|
|
139
|
+
// Create execution function
|
|
140
|
+
const executeAction = async (action, index) => {
|
|
141
|
+
try {
|
|
142
|
+
// Check timeout
|
|
143
|
+
if (timeout > 0 && Date.now() - startTime > timeout) {
|
|
144
|
+
throw new Error('Timeout exceeded');
|
|
145
|
+
}
|
|
146
|
+
const result = await engine.RunAction(action);
|
|
147
|
+
results[index] = {
|
|
148
|
+
actionName: action.ActionName,
|
|
149
|
+
success: result.Success,
|
|
150
|
+
result: result,
|
|
151
|
+
duration: Date.now() - startTime
|
|
152
|
+
};
|
|
153
|
+
if (result.Success) {
|
|
154
|
+
successCount++;
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
errorCount++;
|
|
158
|
+
}
|
|
159
|
+
return result;
|
|
160
|
+
}
|
|
161
|
+
catch (error) {
|
|
162
|
+
errorCount++;
|
|
163
|
+
const errorResult = {
|
|
164
|
+
actionName: action.ActionName,
|
|
165
|
+
success: false,
|
|
166
|
+
error: error instanceof Error ? error.message : String(error),
|
|
167
|
+
duration: Date.now() - startTime
|
|
168
|
+
};
|
|
169
|
+
results[index] = errorResult;
|
|
170
|
+
if (!continueOnError) {
|
|
171
|
+
throw error;
|
|
172
|
+
}
|
|
173
|
+
return errorResult;
|
|
174
|
+
}
|
|
175
|
+
};
|
|
176
|
+
// Execute with or without concurrency limit
|
|
177
|
+
if (maxConcurrent > 0 && maxConcurrent < actions.length) {
|
|
178
|
+
// Execute with concurrency limit
|
|
179
|
+
for (let i = 0; i < actions.length; i += maxConcurrent) {
|
|
180
|
+
const batch = actions.slice(i, i + maxConcurrent);
|
|
181
|
+
const batchPromises = batch.map((action, batchIndex) => executeAction(action, i + batchIndex));
|
|
182
|
+
try {
|
|
183
|
+
await Promise.all(batchPromises);
|
|
184
|
+
}
|
|
185
|
+
catch (error) {
|
|
186
|
+
if (!continueOnError) {
|
|
187
|
+
break;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
else {
|
|
193
|
+
// Execute all at once
|
|
194
|
+
const promises = actions.map((action, index) => executeAction(action, index));
|
|
195
|
+
if (continueOnError) {
|
|
196
|
+
await Promise.allSettled(promises);
|
|
197
|
+
}
|
|
198
|
+
else {
|
|
199
|
+
await Promise.all(promises);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
// Add output parameters
|
|
203
|
+
params.Params.push({
|
|
204
|
+
Name: 'Results',
|
|
205
|
+
Type: 'Output',
|
|
206
|
+
Value: results
|
|
207
|
+
});
|
|
208
|
+
params.Params.push({
|
|
209
|
+
Name: 'SuccessCount',
|
|
210
|
+
Type: 'Output',
|
|
211
|
+
Value: successCount
|
|
212
|
+
});
|
|
213
|
+
params.Params.push({
|
|
214
|
+
Name: 'ErrorCount',
|
|
215
|
+
Type: 'Output',
|
|
216
|
+
Value: errorCount
|
|
217
|
+
});
|
|
218
|
+
params.Params.push({
|
|
219
|
+
Name: 'TotalDuration',
|
|
220
|
+
Type: 'Output',
|
|
221
|
+
Value: Date.now() - startTime
|
|
222
|
+
});
|
|
223
|
+
// Determine overall success
|
|
224
|
+
const allSuccessful = errorCount === 0;
|
|
225
|
+
const someSuccessful = successCount > 0;
|
|
226
|
+
return {
|
|
227
|
+
Success: continueOnError ? someSuccessful : allSuccessful,
|
|
228
|
+
ResultCode: allSuccessful ? "ALL_SUCCESS" : (someSuccessful ? "PARTIAL_SUCCESS" : "ALL_FAILED"),
|
|
229
|
+
Message: JSON.stringify({
|
|
230
|
+
message: `Parallel execution completed: ${successCount} successful, ${errorCount} failed`,
|
|
231
|
+
totalActions: actions.length,
|
|
232
|
+
successCount: successCount,
|
|
233
|
+
errorCount: errorCount,
|
|
234
|
+
totalDuration: Date.now() - startTime,
|
|
235
|
+
results: results
|
|
236
|
+
}, null, 2)
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Execute actions and return first result
|
|
241
|
+
*/
|
|
242
|
+
async executeFirstAction(actions, maxConcurrent, timeout, contextUser, params) {
|
|
243
|
+
const engine = new actions_2.ActionEngineServer();
|
|
244
|
+
const startTime = Date.now();
|
|
245
|
+
return new Promise((resolve) => {
|
|
246
|
+
let resolved = false;
|
|
247
|
+
const results = [];
|
|
248
|
+
let completedCount = 0;
|
|
249
|
+
// Create execution function
|
|
250
|
+
const executeAction = async (action, index) => {
|
|
251
|
+
try {
|
|
252
|
+
// Check if already resolved
|
|
253
|
+
if (resolved)
|
|
254
|
+
return;
|
|
255
|
+
// Check timeout
|
|
256
|
+
if (timeout > 0 && Date.now() - startTime > timeout) {
|
|
257
|
+
throw new Error('Timeout exceeded');
|
|
258
|
+
}
|
|
259
|
+
const result = await engine.RunAction(action);
|
|
260
|
+
if (!resolved) {
|
|
261
|
+
if (result.Success) {
|
|
262
|
+
resolved = true;
|
|
263
|
+
// Add output parameters
|
|
264
|
+
params.Params.push({
|
|
265
|
+
Name: 'FirstResult',
|
|
266
|
+
Type: 'Output',
|
|
267
|
+
Value: result
|
|
268
|
+
});
|
|
269
|
+
params.Params.push({
|
|
270
|
+
Name: 'FirstActionName',
|
|
271
|
+
Type: 'Output',
|
|
272
|
+
Value: action.ActionName
|
|
273
|
+
});
|
|
274
|
+
params.Params.push({
|
|
275
|
+
Name: 'FirstActionIndex',
|
|
276
|
+
Type: 'Output',
|
|
277
|
+
Value: index
|
|
278
|
+
});
|
|
279
|
+
params.Params.push({
|
|
280
|
+
Name: 'Duration',
|
|
281
|
+
Type: 'Output',
|
|
282
|
+
Value: Date.now() - startTime
|
|
283
|
+
});
|
|
284
|
+
resolve({
|
|
285
|
+
Success: true,
|
|
286
|
+
ResultCode: "FIRST_SUCCESS",
|
|
287
|
+
Message: JSON.stringify({
|
|
288
|
+
message: "First successful action completed",
|
|
289
|
+
actionName: action.ActionName,
|
|
290
|
+
actionIndex: index,
|
|
291
|
+
duration: Date.now() - startTime,
|
|
292
|
+
result: result
|
|
293
|
+
}, null, 2)
|
|
294
|
+
});
|
|
295
|
+
}
|
|
296
|
+
else {
|
|
297
|
+
results[index] = {
|
|
298
|
+
actionName: action.ActionName,
|
|
299
|
+
success: false,
|
|
300
|
+
error: result.Message
|
|
301
|
+
};
|
|
302
|
+
completedCount++;
|
|
303
|
+
// Check if all failed
|
|
304
|
+
if (completedCount === actions.length) {
|
|
305
|
+
params.Params.push({
|
|
306
|
+
Name: 'AllResults',
|
|
307
|
+
Type: 'Output',
|
|
308
|
+
Value: results
|
|
309
|
+
});
|
|
310
|
+
resolve({
|
|
311
|
+
Success: false,
|
|
312
|
+
ResultCode: "ALL_FAILED",
|
|
313
|
+
Message: JSON.stringify({
|
|
314
|
+
message: "All actions failed",
|
|
315
|
+
results: results,
|
|
316
|
+
duration: Date.now() - startTime
|
|
317
|
+
}, null, 2)
|
|
318
|
+
});
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
catch (error) {
|
|
324
|
+
if (!resolved) {
|
|
325
|
+
results[index] = {
|
|
326
|
+
actionName: action.ActionName,
|
|
327
|
+
success: false,
|
|
328
|
+
error: error instanceof Error ? error.message : String(error)
|
|
329
|
+
};
|
|
330
|
+
completedCount++;
|
|
331
|
+
// Check if all failed
|
|
332
|
+
if (completedCount === actions.length) {
|
|
333
|
+
params.Params.push({
|
|
334
|
+
Name: 'AllResults',
|
|
335
|
+
Type: 'Output',
|
|
336
|
+
Value: results
|
|
337
|
+
});
|
|
338
|
+
resolve({
|
|
339
|
+
Success: false,
|
|
340
|
+
ResultCode: "ALL_FAILED",
|
|
341
|
+
Message: JSON.stringify({
|
|
342
|
+
message: "All actions failed",
|
|
343
|
+
results: results,
|
|
344
|
+
duration: Date.now() - startTime
|
|
345
|
+
}, null, 2)
|
|
346
|
+
});
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
};
|
|
351
|
+
// Execute with or without concurrency limit
|
|
352
|
+
if (maxConcurrent > 0 && maxConcurrent < actions.length) {
|
|
353
|
+
// Execute with concurrency limit
|
|
354
|
+
let currentIndex = 0;
|
|
355
|
+
const executeNext = () => {
|
|
356
|
+
if (currentIndex < actions.length && !resolved) {
|
|
357
|
+
const action = actions[currentIndex];
|
|
358
|
+
const index = currentIndex;
|
|
359
|
+
currentIndex++;
|
|
360
|
+
executeAction(action, index).then(() => executeNext());
|
|
361
|
+
}
|
|
362
|
+
};
|
|
363
|
+
// Start initial batch
|
|
364
|
+
for (let i = 0; i < Math.min(maxConcurrent, actions.length); i++) {
|
|
365
|
+
executeNext();
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
else {
|
|
369
|
+
// Execute all at once
|
|
370
|
+
actions.forEach((action, index) => executeAction(action, index));
|
|
371
|
+
}
|
|
372
|
+
// Handle timeout
|
|
373
|
+
if (timeout > 0) {
|
|
374
|
+
setTimeout(() => {
|
|
375
|
+
if (!resolved) {
|
|
376
|
+
resolved = true;
|
|
377
|
+
resolve({
|
|
378
|
+
Success: false,
|
|
379
|
+
ResultCode: "TIMEOUT",
|
|
380
|
+
Message: `Parallel execution timed out after ${timeout}ms`
|
|
381
|
+
});
|
|
382
|
+
}
|
|
383
|
+
}, timeout);
|
|
384
|
+
}
|
|
385
|
+
});
|
|
386
|
+
}
|
|
387
|
+
/**
|
|
388
|
+
* Prepare action configuration with context
|
|
389
|
+
*/
|
|
390
|
+
prepareActionConfig(actionConfig, context) {
|
|
391
|
+
if (!context || Object.keys(context).length === 0) {
|
|
392
|
+
return actionConfig;
|
|
393
|
+
}
|
|
394
|
+
// Deep clone the config
|
|
395
|
+
const preparedConfig = JSON.parse(JSON.stringify(actionConfig));
|
|
396
|
+
// Merge context into params
|
|
397
|
+
if (!preparedConfig.Params) {
|
|
398
|
+
preparedConfig.Params = {};
|
|
399
|
+
}
|
|
400
|
+
// If Params is an array, convert to object
|
|
401
|
+
if (Array.isArray(preparedConfig.Params)) {
|
|
402
|
+
const paramsObj = {};
|
|
403
|
+
preparedConfig.Params.forEach((param) => {
|
|
404
|
+
if (param.Name) {
|
|
405
|
+
paramsObj[param.Name] = param.Value;
|
|
406
|
+
}
|
|
407
|
+
});
|
|
408
|
+
preparedConfig.Params = paramsObj;
|
|
409
|
+
}
|
|
410
|
+
// Merge context (existing params take precedence)
|
|
411
|
+
preparedConfig.Params = { ...context, ...preparedConfig.Params };
|
|
412
|
+
return preparedConfig;
|
|
413
|
+
}
|
|
414
|
+
/**
|
|
415
|
+
* Get numeric parameter with default
|
|
416
|
+
*/
|
|
417
|
+
getNumericParam(params, name, defaultValue) {
|
|
418
|
+
const value = this.getParamValue(params, name);
|
|
419
|
+
if (value === undefined || value === null)
|
|
420
|
+
return defaultValue;
|
|
421
|
+
const num = Number(value);
|
|
422
|
+
return isNaN(num) ? defaultValue : num;
|
|
423
|
+
}
|
|
424
|
+
/**
|
|
425
|
+
* Get boolean parameter with default
|
|
426
|
+
*/
|
|
427
|
+
getBooleanParam(params, name, defaultValue) {
|
|
428
|
+
const value = this.getParamValue(params, name);
|
|
429
|
+
if (value === undefined || value === null)
|
|
430
|
+
return defaultValue;
|
|
431
|
+
if (typeof value === 'boolean')
|
|
432
|
+
return value;
|
|
433
|
+
if (typeof value === 'string') {
|
|
434
|
+
return value.toLowerCase() === 'true';
|
|
435
|
+
}
|
|
436
|
+
return defaultValue;
|
|
437
|
+
}
|
|
438
|
+
/**
|
|
439
|
+
* Get parameter value by name (case-insensitive)
|
|
440
|
+
*/
|
|
441
|
+
getParamValue(params, name) {
|
|
442
|
+
const param = params.Params.find(p => p.Name.toLowerCase() === name.toLowerCase());
|
|
443
|
+
return param?.Value;
|
|
444
|
+
}
|
|
445
|
+
};
|
|
446
|
+
exports.ParallelExecuteAction = ParallelExecuteAction;
|
|
447
|
+
exports.ParallelExecuteAction = ParallelExecuteAction = __decorate([
|
|
448
|
+
(0, global_1.RegisterClass)(actions_1.BaseAction, "Parallel Execute")
|
|
449
|
+
], ParallelExecuteAction);
|
|
450
|
+
/**
|
|
451
|
+
* Loader function to ensure the ParallelExecuteAction class is included in the bundle
|
|
452
|
+
*/
|
|
453
|
+
function LoadParallelExecuteAction() {
|
|
454
|
+
// Stub function to prevent tree shaking
|
|
455
|
+
}
|
|
456
|
+
exports.LoadParallelExecuteAction = LoadParallelExecuteAction;
|
|
457
|
+
//# sourceMappingURL=parallel-execute.action.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parallel-execute.action.js","sourceRoot":"","sources":["../../../src/custom/workflow/parallel-execute.action.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { ActionResultSimple, RunActionParams } from "@memberjunction/actions-base";
|
|
2
|
+
import { BaseAction } from "@memberjunction/actions";
|
|
3
|
+
/**
|
|
4
|
+
* Action that retries failed actions with exponential backoff
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```typescript
|
|
8
|
+
* // Basic retry with defaults
|
|
9
|
+
* await runAction({
|
|
10
|
+
* ActionName: 'Retry',
|
|
11
|
+
* Params: [{
|
|
12
|
+
* Name: 'Action',
|
|
13
|
+
* Value: {
|
|
14
|
+
* ActionName: 'HTTP Request',
|
|
15
|
+
* Params: { URL: 'https://api.example.com/data' }
|
|
16
|
+
* }
|
|
17
|
+
* }]
|
|
18
|
+
* });
|
|
19
|
+
*
|
|
20
|
+
* // Advanced retry with custom configuration
|
|
21
|
+
* await runAction({
|
|
22
|
+
* ActionName: 'Retry',
|
|
23
|
+
* Params: [{
|
|
24
|
+
* Name: 'Action',
|
|
25
|
+
* Value: {
|
|
26
|
+
* ActionName: 'Database Query',
|
|
27
|
+
* Params: { Query: 'SELECT * FROM orders' }
|
|
28
|
+
* }
|
|
29
|
+
* }, {
|
|
30
|
+
* Name: 'MaxRetries',
|
|
31
|
+
* Value: 5
|
|
32
|
+
* }, {
|
|
33
|
+
* Name: 'RetryDelay',
|
|
34
|
+
* Value: 2000
|
|
35
|
+
* }, {
|
|
36
|
+
* Name: 'BackoffMultiplier',
|
|
37
|
+
* Value: 2
|
|
38
|
+
* }, {
|
|
39
|
+
* Name: 'RetryOn',
|
|
40
|
+
* Value: ['TIMEOUT', 'CONNECTION_ERROR']
|
|
41
|
+
* }, {
|
|
42
|
+
* Name: 'GiveUpOn',
|
|
43
|
+
* Value: ['INVALID_CREDENTIALS', 'NOT_FOUND']
|
|
44
|
+
* }]
|
|
45
|
+
* });
|
|
46
|
+
* ```
|
|
47
|
+
*/
|
|
48
|
+
export declare class RetryAction extends BaseAction {
|
|
49
|
+
/**
|
|
50
|
+
* Retries failed actions with exponential backoff
|
|
51
|
+
*
|
|
52
|
+
* @param params - The action parameters containing:
|
|
53
|
+
* - Action: Action configuration to retry (required)
|
|
54
|
+
* - MaxRetries: Maximum number of retry attempts (default: 3)
|
|
55
|
+
* - RetryDelay: Initial delay in milliseconds (default: 1000)
|
|
56
|
+
* - BackoffMultiplier: Multiplier for exponential backoff (default: 2)
|
|
57
|
+
* - MaxDelay: Maximum delay between retries in ms (default: 30000)
|
|
58
|
+
* - UseJitter: Add random jitter to delays (default: true)
|
|
59
|
+
* - RetryOn: Array of error codes to retry on (optional - retries all by default)
|
|
60
|
+
* - GiveUpOn: Array of error codes to not retry (optional)
|
|
61
|
+
*
|
|
62
|
+
* @returns Result of the successful action or final failure
|
|
63
|
+
*/
|
|
64
|
+
protected InternalRunAction(params: RunActionParams): Promise<ActionResultSimple>;
|
|
65
|
+
/**
|
|
66
|
+
* Check if error should be retried
|
|
67
|
+
*/
|
|
68
|
+
private shouldRetry;
|
|
69
|
+
/**
|
|
70
|
+
* Delay with optional jitter
|
|
71
|
+
*/
|
|
72
|
+
private delay;
|
|
73
|
+
/**
|
|
74
|
+
* Get numeric parameter with default
|
|
75
|
+
*/
|
|
76
|
+
private getNumericParam;
|
|
77
|
+
/**
|
|
78
|
+
* Get boolean parameter with default
|
|
79
|
+
*/
|
|
80
|
+
private getBooleanParam;
|
|
81
|
+
/**
|
|
82
|
+
* Get parameter value by name (case-insensitive)
|
|
83
|
+
*/
|
|
84
|
+
private getParamValue;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Loader function to ensure the RetryAction class is included in the bundle
|
|
88
|
+
*/
|
|
89
|
+
export declare function LoadRetryAction(): void;
|
|
90
|
+
//# sourceMappingURL=retry.action.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry.action.d.ts","sourceRoot":"","sources":["../../../src/custom/workflow/retry.action.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAEnF,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAGrD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AACH,qBACa,WAAY,SAAQ,UAAU;IAEvC;;;;;;;;;;;;;;OAcG;cACa,iBAAiB,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAyPvF;;OAEG;IACH,OAAO,CAAC,WAAW;IAsCnB;;OAEG;IACH,OAAO,CAAC,KAAK;IAQb;;OAEG;IACH,OAAO,CAAC,eAAe;IAOvB;;OAEG;IACH,OAAO,CAAC,eAAe;IAUvB;;OAEG;IACH,OAAO,CAAC,aAAa;CAIxB;AAED;;GAEG;AACH,wBAAgB,eAAe,SAE9B"}
|