@izara_project/izara-core-library-asynchronous-flow 1.0.33 → 1.0.34
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/package.json +1 -1
- package/src/asyncFlowSharedLib.js +63 -16
- package/src/awaitingMultipleSteps.js +229 -72
- package/src/awaitingStep.js +83 -9
package/package.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"author": "Sven Mason <thebarbariansven@gmail.com>",
|
|
4
4
|
"license": "AGPL-3.0-or-later",
|
|
5
5
|
"homepage": "https://bitbucket.org/izara-core-libraries/izara-core-library-asynchronous-flow#readme",
|
|
6
|
-
"version": "1.0.
|
|
6
|
+
"version": "1.0.34",
|
|
7
7
|
"description": "Shared asynchronous flow logic",
|
|
8
8
|
"type": "module",
|
|
9
9
|
"main": "index.js",
|
|
@@ -105,6 +105,10 @@ export function createParentFlowId(prefix = '') {
|
|
|
105
105
|
* @throws {NoRetryError} If the stripped value equals the prefix (invalid)
|
|
106
106
|
*/
|
|
107
107
|
export function explodePendingStepId(pendingStepId, prefix = '') {
|
|
108
|
+
if (!pendingStepId) {
|
|
109
|
+
throw NoRetryError('pendingStepId is required');
|
|
110
|
+
}
|
|
111
|
+
|
|
108
112
|
if (prefix === '') {
|
|
109
113
|
return pendingStepId;
|
|
110
114
|
} else {
|
|
@@ -178,6 +182,22 @@ export async function checkUniqueRequestProcessing(
|
|
|
178
182
|
overwriteUniqueRequestId = null,
|
|
179
183
|
uniqueRequestIdFieldName = 'UniqueRequestId' // if set will check/add this fieldname with _izContext.uniqueRequestId value
|
|
180
184
|
) {
|
|
185
|
+
_izContext.logger.debug(
|
|
186
|
+
'[Lib:AsyncFlow:checkUniqueRequestProcessing] Input: ',
|
|
187
|
+
{
|
|
188
|
+
_izContext,
|
|
189
|
+
tableName,
|
|
190
|
+
primaryKey,
|
|
191
|
+
prefix,
|
|
192
|
+
overwriteUniqueRequestId,
|
|
193
|
+
uniqueRequestIdFieldName
|
|
194
|
+
}
|
|
195
|
+
);
|
|
196
|
+
|
|
197
|
+
if (!tableName || !primaryKey) {
|
|
198
|
+
throw NoRetryError('tableName and primaryKey are required');
|
|
199
|
+
}
|
|
200
|
+
|
|
181
201
|
try {
|
|
182
202
|
_izContext.logger.debug(
|
|
183
203
|
'current uniqueRequestId:',
|
|
@@ -298,6 +318,20 @@ export async function checkTimeCacheComplete(
|
|
|
298
318
|
timeCacheComplete,
|
|
299
319
|
prefix
|
|
300
320
|
) {
|
|
321
|
+
_izContext.logger.debug('[Lib:AsyncFlow:checkTimeCacheComplete] Input: ', {
|
|
322
|
+
_izContext,
|
|
323
|
+
fullMainTableName,
|
|
324
|
+
keyValues,
|
|
325
|
+
timeCacheComplete,
|
|
326
|
+
prefix
|
|
327
|
+
});
|
|
328
|
+
|
|
329
|
+
if (!fullMainTableName || !keyValues || !timeCacheComplete || !prefix) {
|
|
330
|
+
throw NoRetryError(
|
|
331
|
+
'fullMainTableName, keyValues, timeCacheComplete and prefix are required'
|
|
332
|
+
);
|
|
333
|
+
}
|
|
334
|
+
|
|
301
335
|
let [returnValue, newTimeCacheComplete, uniqueRequestId] =
|
|
302
336
|
await checkAndGetTimeCacheComplete(
|
|
303
337
|
_izContext,
|
|
@@ -329,16 +363,19 @@ export async function checkAndGetTimeCacheComplete(
|
|
|
329
363
|
timeCacheComplete,
|
|
330
364
|
prefix
|
|
331
365
|
) {
|
|
332
|
-
_izContext.logger.debug(
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
366
|
+
_izContext.logger.debug(
|
|
367
|
+
'[Lib:AsyncFlow:checkAndGetTimeCacheComplete] Input: ',
|
|
368
|
+
{
|
|
369
|
+
fullMainTableName: fullMainTableName,
|
|
370
|
+
keyValues: keyValues,
|
|
371
|
+
timeCacheComplete: timeCacheComplete,
|
|
372
|
+
prefix: prefix
|
|
373
|
+
}
|
|
374
|
+
);
|
|
338
375
|
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
376
|
+
const uniqueRequestIdFieldName = createFieldNameUniqueRequestId('cache');
|
|
377
|
+
const cacheCompleteFieldName = createFieldNameCacheComplete(prefix);
|
|
378
|
+
const statusFieldName = createFieldNameStatus(prefix);
|
|
342
379
|
|
|
343
380
|
let getTimeCacheComplete = await dynamodbSharedLib.getItem(
|
|
344
381
|
_izContext,
|
|
@@ -436,6 +473,12 @@ export function validateStartKeyParam(
|
|
|
436
473
|
partitionKeyFieldName,
|
|
437
474
|
sortKeyFieldName
|
|
438
475
|
) {
|
|
476
|
+
_izContext.logger.debug('[Lib:AsyncFlow:validateStartKeyParam] Input: ', {
|
|
477
|
+
startKey,
|
|
478
|
+
partitionKeyFieldName,
|
|
479
|
+
sortKeyFieldName
|
|
480
|
+
});
|
|
481
|
+
|
|
439
482
|
const stringNotEmptyRegex = /^[A-Za-z0-9_-]+$/;
|
|
440
483
|
|
|
441
484
|
if (
|
|
@@ -482,12 +525,16 @@ export async function validateMultipleInvocations(
|
|
|
482
525
|
numberInvocation,
|
|
483
526
|
queueName
|
|
484
527
|
) {
|
|
485
|
-
_izContext.logger.debug(
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
528
|
+
_izContext.logger.debug(
|
|
529
|
+
'[Lib:AsyncFlow:validateMultipleInvocations] Input: ',
|
|
530
|
+
{
|
|
531
|
+
messageProperty: messageProperty,
|
|
532
|
+
passOnStartKey: passOnStartKey,
|
|
533
|
+
numberInvocation: numberInvocation,
|
|
534
|
+
queueName: queueName
|
|
535
|
+
}
|
|
536
|
+
);
|
|
537
|
+
|
|
491
538
|
try {
|
|
492
539
|
const maxProcessInvocationCountImport = 20;
|
|
493
540
|
if (numberInvocation >= maxProcessInvocationCountImport) {
|
|
@@ -504,7 +551,7 @@ export async function validateMultipleInvocations(
|
|
|
504
551
|
}
|
|
505
552
|
messageProperty['numberInvocation'] = numberInvocation;
|
|
506
553
|
|
|
507
|
-
|
|
554
|
+
const messageReInvokeFunction = {
|
|
508
555
|
MessageBody: JSON.stringify(messageProperty),
|
|
509
556
|
QueueUrl: await sqsSharedLib.sqsQueueUrl(_izContext, queueName)
|
|
510
557
|
};
|
|
@@ -43,16 +43,17 @@ export async function createAwaitingMultipleStepsWithAdditionalAttributes(
|
|
|
43
43
|
pendingStepId
|
|
44
44
|
) {
|
|
45
45
|
_izContext.logger.debug(
|
|
46
|
-
'Lib:createAwaitingMultipleStepsWithAdditionalAttributes',
|
|
46
|
+
'[Lib:AsyncFlow:createAwaitingMultipleStepsWithAdditionalAttributes] Input: ',
|
|
47
47
|
{
|
|
48
|
-
records
|
|
49
|
-
pendingStepId
|
|
48
|
+
records,
|
|
49
|
+
pendingStepId
|
|
50
50
|
}
|
|
51
51
|
);
|
|
52
|
-
let promiseArray = [];
|
|
53
52
|
|
|
54
|
-
|
|
55
|
-
|
|
53
|
+
const promiseArray = [];
|
|
54
|
+
|
|
55
|
+
for (const record of records) {
|
|
56
|
+
const attributesWhenCreate = {
|
|
56
57
|
awaitingStepId: record.awaitingStepId,
|
|
57
58
|
pendingStepId: pendingStepId,
|
|
58
59
|
timestamp: Date.now(),
|
|
@@ -101,10 +102,13 @@ export async function initAwaitingStepsWithAttrs(
|
|
|
101
102
|
records,
|
|
102
103
|
pendingStepId
|
|
103
104
|
) {
|
|
104
|
-
_izContext.logger.debug(
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
105
|
+
_izContext.logger.debug(
|
|
106
|
+
'[Lib:AsyncFlow:initAwaitingStepsWithAttrs] Input: ',
|
|
107
|
+
{
|
|
108
|
+
records,
|
|
109
|
+
pendingStepId
|
|
110
|
+
}
|
|
111
|
+
);
|
|
108
112
|
|
|
109
113
|
const timestamp = Date.now();
|
|
110
114
|
const promiseArray = [];
|
|
@@ -155,22 +159,26 @@ export async function createAwaitingMultipleSteps(
|
|
|
155
159
|
records, // array of awaitingStepIds
|
|
156
160
|
pendingStepId
|
|
157
161
|
) {
|
|
158
|
-
_izContext.logger.debug(
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
+
_izContext.logger.debug(
|
|
163
|
+
'[Lib:AsyncFlow:createAwaitingMultipleSteps] Input: ',
|
|
164
|
+
{
|
|
165
|
+
records: records,
|
|
166
|
+
pendingStepId: pendingStepId
|
|
167
|
+
}
|
|
168
|
+
);
|
|
162
169
|
|
|
163
|
-
|
|
170
|
+
const promiseArray = [];
|
|
164
171
|
|
|
165
|
-
for (
|
|
166
|
-
|
|
172
|
+
for (const record of records) {
|
|
173
|
+
const attributesWhenCreate = {
|
|
167
174
|
awaitingStepId: record,
|
|
168
175
|
pendingStepId: pendingStepId,
|
|
169
176
|
timestamp: Date.now()
|
|
170
177
|
};
|
|
171
|
-
_izContext.logger.debug(
|
|
172
|
-
|
|
173
|
-
|
|
178
|
+
_izContext.logger.debug(
|
|
179
|
+
'[Lib:AsyncFlow:createAwaitingMultipleSteps] attributesWhenCreate: ',
|
|
180
|
+
attributesWhenCreate
|
|
181
|
+
);
|
|
174
182
|
promiseArray.push(
|
|
175
183
|
dynamodbSharedLib.putItem(
|
|
176
184
|
_izContext,
|
|
@@ -179,9 +187,13 @@ export async function createAwaitingMultipleSteps(
|
|
|
179
187
|
)
|
|
180
188
|
);
|
|
181
189
|
|
|
182
|
-
_izContext.logger.debug(
|
|
183
|
-
|
|
184
|
-
|
|
190
|
+
_izContext.logger.debug(
|
|
191
|
+
'[Lib:AsyncFlow:createAwaitingMultipleSteps] putItem:AwaitingMultipleStepByPending',
|
|
192
|
+
{
|
|
193
|
+
awaitingStepId: attributesWhenCreate.awaitingStepId
|
|
194
|
+
}
|
|
195
|
+
);
|
|
196
|
+
|
|
185
197
|
promiseArray.push(
|
|
186
198
|
dynamodbSharedLib.putItem(
|
|
187
199
|
_izContext,
|
|
@@ -193,6 +205,7 @@ export async function createAwaitingMultipleSteps(
|
|
|
193
205
|
)
|
|
194
206
|
);
|
|
195
207
|
}
|
|
208
|
+
|
|
196
209
|
await Promise.all(promiseArray);
|
|
197
210
|
}
|
|
198
211
|
|
|
@@ -229,6 +242,11 @@ export async function createNewAwaitingMultipleStep(
|
|
|
229
242
|
errorsFound: []
|
|
230
243
|
};
|
|
231
244
|
|
|
245
|
+
_izContext.logger.debug(
|
|
246
|
+
'[Lib:AsyncFlow:createNewAwaitingMultipleStep] attributesWhenCreate: ',
|
|
247
|
+
attributesWhenCreate
|
|
248
|
+
);
|
|
249
|
+
|
|
232
250
|
await dynamodbSharedLib.putItem(
|
|
233
251
|
_izContext,
|
|
234
252
|
dynamodbSharedLib.tableName(_izContext, 'AwaitingMultipleSteps'),
|
|
@@ -246,6 +264,11 @@ export async function createNewAwaitingMultipleStep(
|
|
|
246
264
|
attributesForPending
|
|
247
265
|
);
|
|
248
266
|
|
|
267
|
+
_izContext.logger.debug(
|
|
268
|
+
'[Lib:AsyncFlow:createNewAwaitingMultipleStep] Returning: ',
|
|
269
|
+
parentFlowId
|
|
270
|
+
);
|
|
271
|
+
|
|
249
272
|
return parentFlowId;
|
|
250
273
|
}
|
|
251
274
|
|
|
@@ -260,9 +283,23 @@ export async function findPendingStepIdsAwaitingMultipleSteps(
|
|
|
260
283
|
_izContext,
|
|
261
284
|
awaitingStepId
|
|
262
285
|
) {
|
|
263
|
-
|
|
286
|
+
_izContext.logger.debug(
|
|
287
|
+
'[Lib:findPendingStepIdsAwaitingMultipleSteps] Input parameters',
|
|
288
|
+
{
|
|
289
|
+
awaitingStepId: awaitingStepId
|
|
290
|
+
}
|
|
291
|
+
);
|
|
292
|
+
|
|
293
|
+
if (!awaitingStepId) {
|
|
294
|
+
_izContext.logger.error(
|
|
295
|
+
'[Lib:findPendingStepIdsAwaitingMultipleSteps] awaitingStepId is required'
|
|
296
|
+
);
|
|
297
|
+
throw new NoRetryError('awaitingStepId is required');
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
const pendingStepIds = [];
|
|
264
301
|
|
|
265
|
-
|
|
302
|
+
const listPendingStepIds = await dynamodbSharedLib.query(
|
|
266
303
|
_izContext,
|
|
267
304
|
dynamodbSharedLib.tableName(_izContext, 'AwaitingMultipleSteps'),
|
|
268
305
|
{
|
|
@@ -270,10 +307,15 @@ export async function findPendingStepIdsAwaitingMultipleSteps(
|
|
|
270
307
|
}
|
|
271
308
|
);
|
|
272
309
|
|
|
273
|
-
for (
|
|
274
|
-
pendingStepIds.push(
|
|
310
|
+
for (const item of listPendingStepIds.Items) {
|
|
311
|
+
pendingStepIds.push(item.pendingStepId);
|
|
275
312
|
}
|
|
276
313
|
|
|
314
|
+
_izContext.logger.debug(
|
|
315
|
+
'[Lib:findPendingStepIdsAwaitingMultipleSteps] Pending step IDs',
|
|
316
|
+
pendingStepIds
|
|
317
|
+
);
|
|
318
|
+
|
|
277
319
|
return pendingStepIds;
|
|
278
320
|
}
|
|
279
321
|
|
|
@@ -288,14 +330,33 @@ export async function findPendingStepsAwaitingMultipleSteps(
|
|
|
288
330
|
_izContext,
|
|
289
331
|
awaitingStepId
|
|
290
332
|
) {
|
|
291
|
-
|
|
333
|
+
_izContext.logger.debug(
|
|
334
|
+
'[Lib:findPendingStepsAwaitingMultipleSteps] Input parameters',
|
|
335
|
+
{
|
|
336
|
+
awaitingStepId: awaitingStepId
|
|
337
|
+
}
|
|
338
|
+
);
|
|
339
|
+
|
|
340
|
+
if (!awaitingStepId) {
|
|
341
|
+
_izContext.logger.error(
|
|
342
|
+
'[Lib:findPendingStepsAwaitingMultipleSteps] awaitingStepId is required'
|
|
343
|
+
);
|
|
344
|
+
throw new NoRetryError('awaitingStepId is required');
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
const listPendingSteps = await dynamodbSharedLib.query(
|
|
292
348
|
_izContext,
|
|
293
349
|
dynamodbSharedLib.tableName(_izContext, 'AwaitingMultipleSteps'),
|
|
294
350
|
{
|
|
295
351
|
awaitingStepId: awaitingStepId
|
|
296
352
|
}
|
|
297
353
|
);
|
|
298
|
-
|
|
354
|
+
|
|
355
|
+
_izContext.logger.debug(
|
|
356
|
+
'[Lib:findPendingStepsAwaitingMultipleSteps] Record of awaitingStepId',
|
|
357
|
+
listPendingSteps
|
|
358
|
+
);
|
|
359
|
+
|
|
299
360
|
return listPendingSteps.Items;
|
|
300
361
|
}
|
|
301
362
|
|
|
@@ -311,18 +372,40 @@ export async function findPendingStepAwaitingMultipleSteps(
|
|
|
311
372
|
_izContext,
|
|
312
373
|
awaitingStepId
|
|
313
374
|
) {
|
|
314
|
-
|
|
375
|
+
_izContext.logger.debug(
|
|
376
|
+
'[Lib:findPendingStepAwaitingMultipleSteps] Input parameters',
|
|
377
|
+
{
|
|
378
|
+
awaitingStepId: awaitingStepId
|
|
379
|
+
}
|
|
380
|
+
);
|
|
381
|
+
|
|
382
|
+
if (!awaitingStepId) {
|
|
383
|
+
_izContext.logger.error(
|
|
384
|
+
'[Lib:findPendingStepAwaitingMultipleSteps] awaitingStepId is required'
|
|
385
|
+
);
|
|
386
|
+
throw new NoRetryError('awaitingStepId is required');
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
const listPendingSteps = await dynamodbSharedLib.query(
|
|
315
390
|
_izContext,
|
|
316
391
|
dynamodbSharedLib.tableName(_izContext, 'AwaitingMultipleSteps'),
|
|
317
392
|
{
|
|
318
393
|
awaitingStepId: awaitingStepId
|
|
319
394
|
}
|
|
320
395
|
);
|
|
321
|
-
|
|
396
|
+
|
|
397
|
+
_izContext.logger.debug(
|
|
398
|
+
'[Lib:findPendingStepAwaitingMultipleSteps] Record of awaitingStepId',
|
|
399
|
+
listPendingSteps
|
|
400
|
+
);
|
|
322
401
|
|
|
323
402
|
if (listPendingSteps.Items.length !== 1) {
|
|
403
|
+
_izContext.logger.error(
|
|
404
|
+
'[Lib:findPendingStepAwaitingMultipleSteps] listPendingSteps not equals 1'
|
|
405
|
+
);
|
|
324
406
|
throw new NoRetryError('listPendingSteps not equals 1');
|
|
325
407
|
}
|
|
408
|
+
|
|
326
409
|
return listPendingSteps.Items[0];
|
|
327
410
|
}
|
|
328
411
|
|
|
@@ -343,7 +426,21 @@ export async function findAwaitingMultipleStepByPending(
|
|
|
343
426
|
_izContext,
|
|
344
427
|
pendingStepId
|
|
345
428
|
) {
|
|
346
|
-
|
|
429
|
+
_izContext.logger.debug(
|
|
430
|
+
'[Lib:findAwaitingMultipleStepByPending] Input parameters',
|
|
431
|
+
{
|
|
432
|
+
pendingStepId: pendingStepId
|
|
433
|
+
}
|
|
434
|
+
);
|
|
435
|
+
|
|
436
|
+
if (!pendingStepId) {
|
|
437
|
+
_izContext.logger.error(
|
|
438
|
+
'[Lib:findAwaitingMultipleStepByPending] pendingStepId is required'
|
|
439
|
+
);
|
|
440
|
+
throw new NoRetryError('pendingStepId is required');
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
const listAwaitingSteps = await dynamodbSharedLib.query(
|
|
347
444
|
_izContext,
|
|
348
445
|
dynamodbSharedLib.tableName(_izContext, 'AwaitingMultipleStepByPending'),
|
|
349
446
|
{
|
|
@@ -351,9 +448,10 @@ export async function findAwaitingMultipleStepByPending(
|
|
|
351
448
|
}
|
|
352
449
|
);
|
|
353
450
|
_izContext.logger.debug(
|
|
354
|
-
'Record of AwaitingMultipleStepByPending',
|
|
451
|
+
'[Lib:findAwaitingMultipleStepByPending] Record of AwaitingMultipleStepByPending',
|
|
355
452
|
listAwaitingSteps
|
|
356
453
|
);
|
|
454
|
+
|
|
357
455
|
return listAwaitingSteps.Items;
|
|
358
456
|
}
|
|
359
457
|
|
|
@@ -364,11 +462,14 @@ export async function checkAllAwaitingStepsFinishedShared(
|
|
|
364
462
|
errorsFound = [],
|
|
365
463
|
additionalAttributes = {}
|
|
366
464
|
) {
|
|
367
|
-
_izContext.logger.debug(
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
465
|
+
_izContext.logger.debug(
|
|
466
|
+
'[Lib:checkAllAwaitingStepsFinishedShared] Input parameters',
|
|
467
|
+
{
|
|
468
|
+
pendingStepId: pendingStepId,
|
|
469
|
+
currentAwaitingStepId: currentAwaitingStepId,
|
|
470
|
+
errorsFound: errorsFound
|
|
471
|
+
}
|
|
472
|
+
);
|
|
372
473
|
|
|
373
474
|
if (currentAwaitingStepId) {
|
|
374
475
|
await dynamodbSharedLib.updateItem(
|
|
@@ -404,6 +505,15 @@ export async function checkAllAwaitingStepsFinished(
|
|
|
404
505
|
errorsFound = [],
|
|
405
506
|
additionalAttributes = {}
|
|
406
507
|
) {
|
|
508
|
+
_izContext.logger.debug(
|
|
509
|
+
'[Lib:checkAllAwaitingStepsFinished] Input parameters',
|
|
510
|
+
{
|
|
511
|
+
pendingStepId: pendingStepId,
|
|
512
|
+
currentAwaitingStepId: currentAwaitingStepId,
|
|
513
|
+
errorsFound: errorsFound
|
|
514
|
+
}
|
|
515
|
+
);
|
|
516
|
+
|
|
407
517
|
await checkAllAwaitingStepsFinishedShared(
|
|
408
518
|
_izContext,
|
|
409
519
|
pendingStepId,
|
|
@@ -424,6 +534,9 @@ export async function checkAllAwaitingStepsFinished(
|
|
|
424
534
|
if (!item.complete) return false;
|
|
425
535
|
}
|
|
426
536
|
|
|
537
|
+
_izContext.logger.debug(
|
|
538
|
+
'[Lib:checkAllAwaitingStepsFinished] All steps are complete'
|
|
539
|
+
);
|
|
427
540
|
return true;
|
|
428
541
|
}
|
|
429
542
|
|
|
@@ -451,12 +564,21 @@ export async function checkAllAwaitingStepsFinishedWithReturnParams(
|
|
|
451
564
|
errorsFound = [],
|
|
452
565
|
additionalAttributes = {}
|
|
453
566
|
) {
|
|
454
|
-
_izContext.logger.debug(
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
567
|
+
_izContext.logger.debug(
|
|
568
|
+
'[Lib:checkAllAwaitingStepsFinishedWithReturnParams] Input parameters',
|
|
569
|
+
{
|
|
570
|
+
pendingStepId,
|
|
571
|
+
currentAwaitingStepId,
|
|
572
|
+
errorsFound,
|
|
573
|
+
additionalAttributes
|
|
574
|
+
}
|
|
575
|
+
);
|
|
576
|
+
|
|
577
|
+
if (!pendingStepId || !currentAwaitingStepId) {
|
|
578
|
+
throw NoRetryError(
|
|
579
|
+
'[Lib:checkAllAwaitingStepsFinishedWithReturnParams] pendingStepId or currentAwaitingStepId is required'
|
|
580
|
+
);
|
|
581
|
+
}
|
|
460
582
|
|
|
461
583
|
await checkAllAwaitingStepsFinishedShared(
|
|
462
584
|
_izContext,
|
|
@@ -473,7 +595,10 @@ export async function checkAllAwaitingStepsFinishedWithReturnParams(
|
|
|
473
595
|
{ limit: 50 }
|
|
474
596
|
);
|
|
475
597
|
|
|
476
|
-
_izContext.logger.debug(
|
|
598
|
+
_izContext.logger.debug(
|
|
599
|
+
'[Lib:checkAllAwaitingStepsFinishedWithReturnParams] awaitingStepItems:::',
|
|
600
|
+
awaitingStepItems
|
|
601
|
+
);
|
|
477
602
|
|
|
478
603
|
// Pass 1: check completeness of all other steps before collecting any data
|
|
479
604
|
for (const item of awaitingStepItems.Items) {
|
|
@@ -487,6 +612,10 @@ export async function checkAllAwaitingStepsFinishedWithReturnParams(
|
|
|
487
612
|
}
|
|
488
613
|
}
|
|
489
614
|
|
|
615
|
+
_izContext.logger.debug(
|
|
616
|
+
'[Lib:checkAllAwaitingStepsFinishedWithReturnParams] Pass 1: all steps are complete'
|
|
617
|
+
);
|
|
618
|
+
|
|
490
619
|
// Pass 2: all steps are complete — collect errors and attributes
|
|
491
620
|
const collectedAttributes = {};
|
|
492
621
|
const collectedErrors = [];
|
|
@@ -505,6 +634,10 @@ export async function checkAllAwaitingStepsFinishedWithReturnParams(
|
|
|
505
634
|
}
|
|
506
635
|
}
|
|
507
636
|
|
|
637
|
+
_izContext.logger.debug(
|
|
638
|
+
'[Lib:checkAllAwaitingStepsFinishedWithReturnParams] Pass 2: all steps are complete — collect errors and attributes'
|
|
639
|
+
);
|
|
640
|
+
|
|
508
641
|
return {
|
|
509
642
|
isComplete: true,
|
|
510
643
|
collectedAttributes,
|
|
@@ -521,17 +654,28 @@ export async function checkAllAwaitingStepsFinishedWithReturnParams(
|
|
|
521
654
|
* @returns {Promise<boolean>} true if delete flow processed
|
|
522
655
|
*/
|
|
523
656
|
export async function clearAllAwaitingSteps(_izContext, pendingStepId) {
|
|
657
|
+
_izContext.logger.debug('[Lib:clearAllAwaitingSteps] Input parameters', {
|
|
658
|
+
pendingStepId: pendingStepId
|
|
659
|
+
});
|
|
660
|
+
|
|
661
|
+
if (!pendingStepId) {
|
|
662
|
+
throw NoRetryError('[Lib:clearAllAwaitingSteps] pendingStepId is required');
|
|
663
|
+
}
|
|
664
|
+
|
|
524
665
|
// ----- query items from GSI table
|
|
525
|
-
|
|
666
|
+
const listPendingStepIds = await dynamodbSharedLib.query(
|
|
526
667
|
_izContext,
|
|
527
668
|
dynamodbSharedLib.tableName(_izContext, 'AwaitingMultipleStepByPending'),
|
|
528
669
|
{
|
|
529
670
|
pendingStepId: pendingStepId
|
|
530
671
|
}
|
|
531
672
|
);
|
|
532
|
-
_izContext.logger.debug(
|
|
673
|
+
_izContext.logger.debug(
|
|
674
|
+
'[Lib:clearAllAwaitingSteps] listPendingStepIds',
|
|
675
|
+
listPendingStepIds
|
|
676
|
+
);
|
|
533
677
|
|
|
534
|
-
|
|
678
|
+
const promiseArray = [];
|
|
535
679
|
|
|
536
680
|
for (let idx = 0; idx < listPendingStepIds.Items.length; idx++) {
|
|
537
681
|
_izContext.logger.debug(`delete item in dynamodb AwaitingMultipleSteps`);
|
|
@@ -547,7 +691,7 @@ export async function clearAllAwaitingSteps(_izContext, pendingStepId) {
|
|
|
547
691
|
);
|
|
548
692
|
|
|
549
693
|
_izContext.logger.debug(
|
|
550
|
-
|
|
694
|
+
'[Lib:clearAllAwaitingSteps] delete item in dynamodb AwaitingMultipleStepByPending'
|
|
551
695
|
);
|
|
552
696
|
promiseArray.push(
|
|
553
697
|
dynamodbSharedLib.deleteItem(
|
|
@@ -585,19 +729,26 @@ export async function removeAwaitingMultipleStep(
|
|
|
585
729
|
pendingStepId,
|
|
586
730
|
errorsFound = []
|
|
587
731
|
) {
|
|
588
|
-
_izContext.logger.debug('Lib:removeAwaitingMultipleStep', {
|
|
732
|
+
_izContext.logger.debug('[Lib:removeAwaitingMultipleStep] Input parameters', {
|
|
589
733
|
awaitingStepId: awaitingStepId,
|
|
590
|
-
pendingStepId: pendingStepId
|
|
734
|
+
pendingStepId: pendingStepId,
|
|
735
|
+
errorsFound: errorsFound
|
|
591
736
|
});
|
|
592
737
|
|
|
593
|
-
|
|
738
|
+
if (!awaitingStepId || !pendingStepId) {
|
|
739
|
+
throw NoRetryError(
|
|
740
|
+
'[Lib:removeAwaitingMultipleStep] awaitingStepId or pendingStepId is required'
|
|
741
|
+
);
|
|
742
|
+
}
|
|
594
743
|
|
|
595
|
-
|
|
744
|
+
const promiseArray = [];
|
|
745
|
+
|
|
746
|
+
const keyValues = {
|
|
596
747
|
awaitingStepId: awaitingStepId,
|
|
597
748
|
pendingStepId: pendingStepId
|
|
598
749
|
};
|
|
599
750
|
|
|
600
|
-
|
|
751
|
+
const keyValuesForByPending = {
|
|
601
752
|
pendingStepId: pendingStepId,
|
|
602
753
|
awaitingStepId: awaitingStepId
|
|
603
754
|
};
|
|
@@ -607,7 +758,11 @@ export async function removeAwaitingMultipleStep(
|
|
|
607
758
|
});
|
|
608
759
|
|
|
609
760
|
_izContext.logger.debug(
|
|
610
|
-
|
|
761
|
+
'[Lib:removeAwaitingMultipleStep] delete item in dynamodb AwaitingMultipleSteps',
|
|
762
|
+
{
|
|
763
|
+
awaitingStepId: keyValues.awaitingStepId,
|
|
764
|
+
pendingStepId: keyValues.pendingStepId
|
|
765
|
+
}
|
|
611
766
|
);
|
|
612
767
|
promiseArray.push(
|
|
613
768
|
dynamodbSharedLib.deleteItem(
|
|
@@ -643,30 +798,28 @@ export async function createAwaitingMultipleStepsWithAdditionalAttributesAndPubl
|
|
|
643
798
|
additionalAttributes = {},
|
|
644
799
|
pendingStepId
|
|
645
800
|
) {
|
|
801
|
+
_izContext.logger.debug(
|
|
802
|
+
'[Lib:asyncFlow:createAwaitingMultipleStepsWithAdditionalAttributesAndPublish] Input parameters',
|
|
803
|
+
{
|
|
804
|
+
messages,
|
|
805
|
+
prefix,
|
|
806
|
+
flowType,
|
|
807
|
+
additionalAttributes,
|
|
808
|
+
pendingStepId
|
|
809
|
+
}
|
|
810
|
+
);
|
|
811
|
+
|
|
646
812
|
if (!Array.isArray(messages)) {
|
|
647
|
-
throw
|
|
813
|
+
throw NoRetryError('messages must be an array');
|
|
648
814
|
}
|
|
649
815
|
|
|
650
816
|
const flowTag = flowType.flowTag;
|
|
651
817
|
const serviceTag = flowType.serviceTag;
|
|
652
818
|
|
|
653
|
-
_izContext.logger.debug(
|
|
654
|
-
'[lib:asyncFlow:createAwaitingMultipleStepsWithAdditionalAttributesAndPublish] flowType',
|
|
655
|
-
{
|
|
656
|
-
flowTag,
|
|
657
|
-
serviceTag
|
|
658
|
-
}
|
|
659
|
-
);
|
|
660
|
-
|
|
661
819
|
if (flowTag === undefined || serviceTag === undefined) {
|
|
662
|
-
throw
|
|
820
|
+
throw NoRetryError('flowType must have both flowTag and serviceTag');
|
|
663
821
|
}
|
|
664
822
|
|
|
665
|
-
_izContext.logger.debug(
|
|
666
|
-
'Lib:asyncFlow:createAwaitingMultipleStepsWithAdditionalAttributesAndPublish',
|
|
667
|
-
{ count: messages.length, pendingStepId, flowType }
|
|
668
|
-
);
|
|
669
|
-
|
|
670
823
|
const topicArn = snsSharedLib.snsTopicArnByFlowSchema(
|
|
671
824
|
_izContext,
|
|
672
825
|
flowType.flowTag,
|
|
@@ -674,8 +827,8 @@ export async function createAwaitingMultipleStepsWithAdditionalAttributesAndPubl
|
|
|
674
827
|
);
|
|
675
828
|
|
|
676
829
|
_izContext.logger.debug(
|
|
677
|
-
'Lib:asyncFlow:createAwaitingMultipleStepsWithAdditionalAttributesAndPublish',
|
|
678
|
-
|
|
830
|
+
'[Lib:asyncFlow:createAwaitingMultipleStepsWithAdditionalAttributesAndPublish] Topic Arn',
|
|
831
|
+
topicArn
|
|
679
832
|
);
|
|
680
833
|
|
|
681
834
|
const messagesWithParentId = await Promise.all(
|
|
@@ -702,4 +855,8 @@ export async function createAwaitingMultipleStepsWithAdditionalAttributesAndPubl
|
|
|
702
855
|
})
|
|
703
856
|
)
|
|
704
857
|
);
|
|
858
|
+
|
|
859
|
+
_izContext.logger.debug(
|
|
860
|
+
'[Lib:asyncFlow:createAwaitingMultipleStepsWithAdditionalAttributesAndPublish] Exit point'
|
|
861
|
+
);
|
|
705
862
|
}
|
package/src/awaitingStep.js
CHANGED
|
@@ -41,24 +41,25 @@ export async function createAwaitingStep(
|
|
|
41
41
|
additionalAttributes = {}, // save in top level
|
|
42
42
|
callingFlowConfig = {} // optional
|
|
43
43
|
) {
|
|
44
|
-
_izContext.logger.debug('Lib
|
|
44
|
+
_izContext.logger.debug('[Lib:AsyncFlow:createAwaitingStep] Input: ', {
|
|
45
45
|
awaitingStepId,
|
|
46
46
|
pendingStepId,
|
|
47
47
|
additionalAttributes,
|
|
48
48
|
callingFlowConfig
|
|
49
49
|
});
|
|
50
50
|
|
|
51
|
-
|
|
51
|
+
const attributesWhenCreate = {
|
|
52
52
|
awaitingStepId: awaitingStepId,
|
|
53
53
|
pendingStepId: pendingStepId,
|
|
54
54
|
timestamp: Date.now(),
|
|
55
55
|
uniqueRequestId: _izContext.uniqueRequestId
|
|
56
56
|
};
|
|
57
57
|
// loop if not empty
|
|
58
|
-
for (
|
|
58
|
+
for (const additionalAttribute in additionalAttributes) {
|
|
59
59
|
attributesWhenCreate[additionalAttribute] =
|
|
60
60
|
additionalAttributes[additionalAttribute]; // each additionalAttributes
|
|
61
61
|
}
|
|
62
|
+
|
|
62
63
|
if (Object.keys(callingFlowConfig).length > 0) {
|
|
63
64
|
Object.assign(attributesWhenCreate, { callingFlowConfig });
|
|
64
65
|
}
|
|
@@ -81,9 +82,20 @@ export async function findPendingStepIdsAwaitingStep(
|
|
|
81
82
|
_izContext,
|
|
82
83
|
awaitingStepId
|
|
83
84
|
) {
|
|
84
|
-
|
|
85
|
+
_izContext.logger.debug(
|
|
86
|
+
'[Lib:AsyncFlow:findPendingStepIdsAwaitingStep] Input: ',
|
|
87
|
+
{
|
|
88
|
+
awaitingStepId
|
|
89
|
+
}
|
|
90
|
+
);
|
|
91
|
+
|
|
92
|
+
if (!awaitingStepId) {
|
|
93
|
+
throw NoRetryError('awaitingStepId is required');
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
const pendingStepIds = [];
|
|
85
97
|
|
|
86
|
-
|
|
98
|
+
const listPendingStepIds = await dynamodbSharedLib.query(
|
|
87
99
|
_izContext,
|
|
88
100
|
dynamodbSharedLib.tableName(_izContext, 'AwaitingStep'),
|
|
89
101
|
{
|
|
@@ -106,7 +118,18 @@ export async function findPendingStepIdsAwaitingStep(
|
|
|
106
118
|
* @returns {Promise<AwaitingStepItem[]>}
|
|
107
119
|
*/
|
|
108
120
|
export async function findPendingStepsAwaitingStep(_izContext, awaitingStepId) {
|
|
109
|
-
|
|
121
|
+
_izContext.logger.debug(
|
|
122
|
+
'[Lib:AsyncFlow:findPendingStepsAwaitingStep] Input: ',
|
|
123
|
+
{
|
|
124
|
+
awaitingStepId
|
|
125
|
+
}
|
|
126
|
+
);
|
|
127
|
+
|
|
128
|
+
if (!awaitingStepId) {
|
|
129
|
+
throw NoRetryError('awaitingStepId is required');
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
const listPendingSteps = await dynamodbSharedLib.query(
|
|
110
133
|
_izContext,
|
|
111
134
|
dynamodbSharedLib.tableName(_izContext, 'AwaitingStep'),
|
|
112
135
|
{
|
|
@@ -126,17 +149,32 @@ export async function findPendingStepsAwaitingStep(_izContext, awaitingStepId) {
|
|
|
126
149
|
* @throws {NoRetryError} if there is not exactly one item
|
|
127
150
|
*/
|
|
128
151
|
export async function findPendingStepAwaitingStep(_izContext, awaitingStepId) {
|
|
129
|
-
|
|
152
|
+
_izContext.logger.debug(
|
|
153
|
+
'[Lib:AsyncFlow:findPendingStepAwaitingStep] Input: ',
|
|
154
|
+
{
|
|
155
|
+
awaitingStepId
|
|
156
|
+
}
|
|
157
|
+
);
|
|
158
|
+
|
|
159
|
+
if (!awaitingStepId) {
|
|
160
|
+
throw NoRetryError('awaitingStepId is required');
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
const listPendingSteps = await dynamodbSharedLib.query(
|
|
130
164
|
_izContext,
|
|
131
165
|
dynamodbSharedLib.tableName(_izContext, 'AwaitingStep'),
|
|
132
166
|
{
|
|
133
167
|
awaitingStepId: awaitingStepId
|
|
134
168
|
}
|
|
135
169
|
);
|
|
136
|
-
|
|
170
|
+
|
|
171
|
+
_izContext.logger.debug(
|
|
172
|
+
'[Lib:AsyncFlow:findPendingStepAwaitingStep] Found records: ',
|
|
173
|
+
listPendingSteps
|
|
174
|
+
);
|
|
137
175
|
|
|
138
176
|
if (listPendingSteps.Items.length !== 1) {
|
|
139
|
-
throw
|
|
177
|
+
throw NoRetryError('listPendingSteps not equals 1');
|
|
140
178
|
}
|
|
141
179
|
return listPendingSteps.Items[0];
|
|
142
180
|
}
|
|
@@ -154,6 +192,17 @@ export async function findPendingStepAwaitingStepWithCallingFlow(
|
|
|
154
192
|
_izContext,
|
|
155
193
|
awaitingStepId
|
|
156
194
|
) {
|
|
195
|
+
_izContext.logger.debug(
|
|
196
|
+
'[Lib:AsyncFlow:findPendingStepAwaitingStepWithCallingFlow] Input: ',
|
|
197
|
+
{
|
|
198
|
+
awaitingStepId
|
|
199
|
+
}
|
|
200
|
+
);
|
|
201
|
+
|
|
202
|
+
if (!awaitingStepId) {
|
|
203
|
+
throw NoRetryError('awaitingStepId is required');
|
|
204
|
+
}
|
|
205
|
+
|
|
157
206
|
let callingFlowConfig = null;
|
|
158
207
|
let awaitingStep = await findPendingStepAwaitingStep(
|
|
159
208
|
_izContext,
|
|
@@ -184,6 +233,15 @@ export async function removeAwaitingStep(
|
|
|
184
233
|
awaitingStepId,
|
|
185
234
|
pendingStepId
|
|
186
235
|
) {
|
|
236
|
+
_izContext.logger.debug('[Lib:AsyncFlow:removeAwaitingStep] Input: ', {
|
|
237
|
+
awaitingStepId,
|
|
238
|
+
pendingStepId
|
|
239
|
+
});
|
|
240
|
+
|
|
241
|
+
if (!awaitingStepId || !pendingStepId) {
|
|
242
|
+
throw NoRetryError('awaitingStepId and pendingStepId are required');
|
|
243
|
+
}
|
|
244
|
+
|
|
187
245
|
await dynamodbSharedLib.deleteItem(
|
|
188
246
|
_izContext,
|
|
189
247
|
dynamodbSharedLib.tableName(_izContext, 'AwaitingStep'),
|
|
@@ -213,6 +271,22 @@ export async function removeAwaitingStepWithCheckUniqueRequestId(
|
|
|
213
271
|
checkUniqueRequestId,
|
|
214
272
|
prefix = ''
|
|
215
273
|
) {
|
|
274
|
+
_izContext.logger.debug(
|
|
275
|
+
'[Lib:AsyncFlow:removeAwaitingStepWithCheckUniqueRequestId] Input: ',
|
|
276
|
+
{
|
|
277
|
+
awaitingStepId,
|
|
278
|
+
pendingStepId,
|
|
279
|
+
checkUniqueRequestId,
|
|
280
|
+
prefix
|
|
281
|
+
}
|
|
282
|
+
);
|
|
283
|
+
|
|
284
|
+
if (!awaitingStepId || !pendingStepId || !checkUniqueRequestId) {
|
|
285
|
+
throw NoRetryError(
|
|
286
|
+
'awaitingStepId, pendingStepId and checkUniqueRequestId are required'
|
|
287
|
+
);
|
|
288
|
+
}
|
|
289
|
+
|
|
216
290
|
// if logicalElements add queryElements.logicalElements
|
|
217
291
|
// set condition uniqueRequestId match with exists
|
|
218
292
|
const queryElementsCondition = {
|