@decaf-ts/core 0.26.1 → 0.26.3

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 (50) hide show
  1. package/README.md +1 -1
  2. package/dist/core.cjs +1 -1
  3. package/dist/core.cjs.map +1 -1
  4. package/dist/core.js +1 -1
  5. package/dist/core.js.map +1 -1
  6. package/lib/cjs/index.cjs +3 -3
  7. package/lib/cjs/tasks/TaskContext.cjs +9 -2
  8. package/lib/cjs/tasks/TaskContext.cjs.map +1 -1
  9. package/lib/cjs/tasks/TaskEngine.cjs +76 -30
  10. package/lib/cjs/tasks/TaskEngine.cjs.map +1 -1
  11. package/lib/cjs/tasks/builder.cjs +8 -0
  12. package/lib/cjs/tasks/builder.cjs.map +1 -1
  13. package/lib/cjs/tasks/logging.cjs +12 -3
  14. package/lib/cjs/tasks/logging.cjs.map +1 -1
  15. package/lib/cjs/tasks/models/TaskStepResultModel.cjs +6 -0
  16. package/lib/cjs/tasks/models/TaskStepResultModel.cjs.map +1 -1
  17. package/lib/cjs/tasks/models/TaskStepSpecModel.cjs +14 -0
  18. package/lib/cjs/tasks/models/TaskStepSpecModel.cjs.map +1 -1
  19. package/lib/cjs/utils/throttling.cjs +103 -78
  20. package/lib/cjs/utils/throttling.cjs.map +1 -1
  21. package/lib/esm/index.js +3 -3
  22. package/lib/esm/tasks/TaskContext.js +9 -2
  23. package/lib/esm/tasks/TaskContext.js.map +1 -1
  24. package/lib/esm/tasks/TaskEngine.js +76 -30
  25. package/lib/esm/tasks/TaskEngine.js.map +1 -1
  26. package/lib/esm/tasks/builder.js +8 -0
  27. package/lib/esm/tasks/builder.js.map +1 -1
  28. package/lib/esm/tasks/logging.js +12 -3
  29. package/lib/esm/tasks/logging.js.map +1 -1
  30. package/lib/esm/tasks/models/TaskStepResultModel.js +7 -1
  31. package/lib/esm/tasks/models/TaskStepResultModel.js.map +1 -1
  32. package/lib/esm/tasks/models/TaskStepSpecModel.js +15 -1
  33. package/lib/esm/tasks/models/TaskStepSpecModel.js.map +1 -1
  34. package/lib/esm/utils/throttling.js +101 -78
  35. package/lib/esm/utils/throttling.js.map +1 -1
  36. package/lib/types/index.d.cts +3 -3
  37. package/lib/types/index.d.mts +3 -3
  38. package/lib/types/tasks/TaskContext.d.cts +2 -1
  39. package/lib/types/tasks/TaskContext.d.mts +2 -1
  40. package/lib/types/tasks/builder.d.cts +2 -0
  41. package/lib/types/tasks/builder.d.mts +2 -0
  42. package/lib/types/tasks/models/TaskStepResultModel.d.cts +1 -0
  43. package/lib/types/tasks/models/TaskStepResultModel.d.mts +1 -0
  44. package/lib/types/tasks/models/TaskStepSpecModel.d.cts +3 -0
  45. package/lib/types/tasks/models/TaskStepSpecModel.d.mts +3 -0
  46. package/lib/types/tasks/types.d.cts +2 -1
  47. package/lib/types/tasks/types.d.mts +2 -1
  48. package/lib/types/utils/throttling.d.cts +13 -8
  49. package/lib/types/utils/throttling.d.mts +13 -8
  50. package/package.json +1 -1
@@ -1,57 +1,107 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ThrottleMode = void 0;
4
+ exports.splitByCount = splitByCount;
5
+ exports.splitBySize = splitBySize;
3
6
  exports.throttle = throttle;
4
7
  const decoration_1 = require("@decaf-ts/decoration");
5
8
  const index_js_1 = require("./../persistence/index.cjs");
6
9
  const db_decorators_1 = require("@decaf-ts/db-decorators");
7
- function throttle(cfg = { count: 1 }, argIndex = 0) {
8
- return function throttle(target, propertyKey, descriptor) {
10
+ (function (ThrottleMode) {
11
+ ThrottleMode["BY_COUNT"] = "count";
12
+ ThrottleMode["BY_SIZE"] = "size";
13
+ })(exports.ThrottleMode || (exports.ThrottleMode = {}));
14
+ function splitByCount(count) {
15
+ if (count <= 0)
16
+ throw new db_decorators_1.InternalError("splitByCount: count must be greater than zero");
17
+ return (items) => {
18
+ const chunks = [];
19
+ for (let i = 0; i < items.length; i += count)
20
+ chunks.push(items.slice(i, i + count));
21
+ return chunks;
22
+ };
23
+ }
24
+ function splitBySize(maxBytes) {
25
+ if (maxBytes <= 0)
26
+ throw new db_decorators_1.InternalError("splitBySize: maxBytes must be greater than zero");
27
+ return (items) => {
28
+ const chunks = [];
29
+ let current = [];
30
+ let size = 0;
31
+ for (const item of items) {
32
+ const itemSize = safeByteLength(item);
33
+ if (current.length > 0 && size + itemSize > maxBytes) {
34
+ chunks.push(current);
35
+ current = [item];
36
+ size = itemSize;
37
+ }
38
+ else {
39
+ current.push(item);
40
+ size += itemSize;
41
+ }
42
+ }
43
+ if (current.length > 0)
44
+ chunks.push(current);
45
+ return chunks;
46
+ };
47
+ }
48
+ function throttle(value, modeOrOptions, maybeOptions) {
49
+ let splitter;
50
+ let options;
51
+ if (typeof value === "function") {
52
+ splitter = value;
53
+ options = modeOrOptions ?? {};
54
+ }
55
+ else {
56
+ const mode = typeof modeOrOptions === "string"
57
+ ? modeOrOptions
58
+ : exports.ThrottleMode.BY_COUNT;
59
+ options =
60
+ (typeof modeOrOptions === "object" && !Array.isArray(modeOrOptions)
61
+ ? modeOrOptions
62
+ : maybeOptions) ?? {};
63
+ splitter =
64
+ mode === exports.ThrottleMode.BY_SIZE ? splitBySize(value) : splitByCount(value);
65
+ }
66
+ const { delayMs, argIndex = 0 } = options;
67
+ return function throttleDecorator(target, propertyKey, descriptor) {
9
68
  function throttleDec(target, propertyKey, descriptor) {
10
69
  descriptor.value = new Proxy(descriptor.value, {
11
- async apply(target, thisArg, args) {
70
+ async apply(originalFn, thisArg, args) {
12
71
  const invocationArgs = args;
13
- const effectiveCfg = (() => {
14
- try {
15
- return typeof cfg === "function"
16
- ? cfg(...invocationArgs)
17
- : cfg;
18
- }
19
- catch (e) {
20
- throw new db_decorators_1.InternalError(`Failed to obtain throttling configuration from handler: ${e}`);
21
- }
22
- })();
23
- const { log, ctx } = (await thisArg["logCtx"](args, index_js_1.PersistenceKeys.THROTTLE, true)).for(throttle);
72
+ const { log, ctx } = (await thisArg["logCtx"](args, originalFn.name, true)).for(throttle);
24
73
  const normalizedIndices = normalizeArgIndex(argIndex);
25
- if (!normalizedIndices.length) {
26
- throw new db_decorators_1.InternalError("@throttling() expects at least one argument index to throttle");
27
- }
74
+ if (!normalizedIndices.length)
75
+ throw new db_decorators_1.InternalError("@throttle() expects at least one argument index to throttle");
28
76
  normalizedIndices.forEach((index) => {
29
77
  if (index >= invocationArgs.length)
30
- throw new db_decorators_1.InternalError(`@throttling() requires argument index ${index} but only ${invocationArgs.length} provided`);
78
+ throw new db_decorators_1.InternalError(`@throttle() requires argument index ${index} but only ${invocationArgs.length} provided`);
31
79
  if (!Array.isArray(invocationArgs[index]))
32
- throw new db_decorators_1.InternalError(`@throttling() expects argument at index ${index} to be an array`);
80
+ throw new db_decorators_1.InternalError(`@throttle() expects argument at index ${index} to be an array`);
33
81
  });
34
82
  const arrays = normalizedIndices.map((idx) => invocationArgs[idx]);
35
83
  const total = arrays[0].length;
36
- if (!arrays.every((arr) => arr.length === total)) {
37
- throw new db_decorators_1.InternalError("@throttling() requires all targeted arguments to have the same length");
38
- }
39
- if (total === 0) {
40
- return target.apply(thisArg, invocationArgs);
41
- }
42
- const chunkBounds = buildChunkBounds(total, arrays, effectiveCfg);
43
- const chunkArgsList = chunkBounds.map(({ start, end }) => invocationArgs.map((arg, idx) => {
44
- const targetIdx = normalizedIndices.indexOf(idx);
45
- if (targetIdx === -1)
46
- return arg;
47
- return arrays[targetIdx].slice(start, end);
48
- }));
49
- const breakOnSingleFailure = ctx.get("breakOnSingleFailureInBulk") ?? true;
84
+ if (!arrays.every((arr) => arr.length === total))
85
+ throw new db_decorators_1.InternalError("@throttle() requires all targeted arguments to have the same length");
86
+ if (total === 0)
87
+ return originalFn.apply(thisArg, invocationArgs);
88
+ const primaryChunks = splitter(arrays[0]);
89
+ const chunkArgsList = buildChunkArgsList(primaryChunks, arrays, normalizedIndices, invocationArgs);
90
+ const breakOnSingleFailure = options.breakOnSingleFailure ??
91
+ (() => {
92
+ try {
93
+ return ctx.get("breakOnSingleFailureInBulk");
94
+ }
95
+ catch {
96
+ return undefined;
97
+ }
98
+ })() ??
99
+ true;
50
100
  const collectedResults = [];
51
101
  const errors = [];
52
102
  for (const chunkArgs of chunkArgsList) {
53
103
  try {
54
- const chunkResult = await target.apply(thisArg, chunkArgs);
104
+ const chunkResult = await originalFn.apply(thisArg, chunkArgs);
55
105
  mergeResult(chunkResult, collectedResults);
56
106
  }
57
107
  catch (error) {
@@ -59,9 +109,8 @@ function throttle(cfg = { count: 1 }, argIndex = 0) {
59
109
  throw error;
60
110
  errors.push(error);
61
111
  }
62
- if (effectiveCfg.delayMs) {
63
- await new Promise((resolve) => setTimeout(resolve, effectiveCfg.delayMs));
64
- }
112
+ if (delayMs)
113
+ await new Promise((resolve) => setTimeout(resolve, delayMs));
65
114
  }
66
115
  if (errors.length) {
67
116
  log.warn(`${String(propertyKey)} throttled execution continued with ${errors.length} failure(s)`);
@@ -73,56 +122,32 @@ function throttle(cfg = { count: 1 }, argIndex = 0) {
73
122
  },
74
123
  });
75
124
  }
76
- return (0, decoration_1.apply)((0, decoration_1.methodMetadata)(decoration_1.Metadata.key(index_js_1.PersistenceKeys.THROTTLE, propertyKey), cfg), throttleDec)(target, propertyKey, descriptor);
125
+ return (0, decoration_1.apply)((0, decoration_1.methodMetadata)(decoration_1.Metadata.key(index_js_1.PersistenceKeys.THROTTLE, propertyKey), options), throttleDec)(target, propertyKey, descriptor);
77
126
  };
78
127
  }
79
128
  function normalizeArgIndex(argIndex) {
80
129
  const entries = (Array.isArray(argIndex) ? argIndex : [argIndex]).map((idx) => {
81
130
  if (!Number.isFinite(idx) || idx < 0)
82
- throw new db_decorators_1.InternalError("@throttling() argument indexes must be non-negative integers");
131
+ throw new db_decorators_1.InternalError("@throttle() argument indexes must be non-negative integers");
83
132
  return idx;
84
133
  });
85
134
  return Array.from(new Set(entries)).sort((a, b) => a - b);
86
135
  }
87
- function buildChunkBounds(total, arrays, cfg) {
88
- if ("count" in cfg) {
89
- if (cfg.count <= 0)
90
- throw new db_decorators_1.InternalError("@throttling() configuration 'count' must be greater than zero");
91
- const spans = [];
92
- for (let start = 0; start < total; start += cfg.count) {
93
- spans.push({
94
- start,
95
- end: Math.min(total, start + cfg.count),
96
- });
97
- }
98
- return spans;
99
- }
100
- if ("bufferSize" in cfg) {
101
- if (cfg.bufferSize <= 0)
102
- throw new db_decorators_1.InternalError("@throttling() configuration 'bufferSize' must be greater than zero");
103
- const spans = [];
104
- let start = 0;
105
- let size = 0;
106
- for (let idx = 0; idx < total; idx++) {
107
- const entrySize = estimateEntrySize(arrays, idx);
108
- if (size > 0 && size + entrySize > cfg.bufferSize) {
109
- spans.push({ start, end: idx });
110
- start = idx;
111
- size = entrySize;
112
- }
113
- else {
114
- size += entrySize;
115
- }
116
- }
117
- if (start < total || !spans.length) {
118
- spans.push({ start, end: total });
119
- }
120
- return spans;
121
- }
122
- return [{ start: 0, end: total }];
123
- }
124
- function estimateEntrySize(arrays, index) {
125
- return arrays.reduce((acc, array) => acc + safeByteLength(array[index]), 0);
136
+ function buildChunkArgsList(primaryChunks, arrays, normalizedIndices, invocationArgs) {
137
+ let offset = 0;
138
+ return primaryChunks.map((chunk) => {
139
+ const chunkLen = chunk.length;
140
+ const args = invocationArgs.map((arg, idx) => {
141
+ const targetIdx = normalizedIndices.indexOf(idx);
142
+ if (targetIdx === -1)
143
+ return arg;
144
+ return targetIdx === 0
145
+ ? chunk
146
+ : arrays[targetIdx].slice(offset, offset + chunkLen);
147
+ });
148
+ offset += chunkLen;
149
+ return args;
150
+ });
126
151
  }
127
152
  function safeByteLength(value) {
128
153
  if (value === null || typeof value === "undefined")
@@ -1 +1 @@
1
- {"version":3,"file":"throttling.js","sourceRoot":"","sources":["throttling.js"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"throttling.js","sourceRoot":"","sources":["throttling.js"],"names":[],"mappings":";;;AAQA,oCASC;AACD,kCAuBC;AACD,4BA+EC;AAzHD,qDAAuE;AACvE,wDAA4D;AAC5D,2DAAwD;AAExD,CAAC,UAAU,YAAY;IACnB,YAAY,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC;IACnC,YAAY,CAAC,SAAS,CAAC,GAAG,MAAM,CAAC;AACrC,CAAC,CAAC,CAAC,oBAAY,IAAI,CAAC,oBAAY,GAAG,EAAE,CAAC,CAAC,CAAC;AACxC,SAAgB,YAAY,CAAC,KAAK;IAC9B,IAAI,KAAK,IAAI,CAAC;QACV,MAAM,IAAI,6BAAa,CAAC,+CAA+C,CAAC,CAAC;IAC7E,OAAO,CAAC,KAAK,EAAE,EAAE;QACb,MAAM,MAAM,GAAG,EAAE,CAAC;QAClB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,KAAK;YACxC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;QAC3C,OAAO,MAAM,CAAC;IAClB,CAAC,CAAC;AACN,CAAC;AACD,SAAgB,WAAW,CAAC,QAAQ;IAChC,IAAI,QAAQ,IAAI,CAAC;QACb,MAAM,IAAI,6BAAa,CAAC,iDAAiD,CAAC,CAAC;IAC/E,OAAO,CAAC,KAAK,EAAE,EAAE;QACb,MAAM,MAAM,GAAG,EAAE,CAAC;QAClB,IAAI,OAAO,GAAG,EAAE,CAAC;QACjB,IAAI,IAAI,GAAG,CAAC,CAAC;QACb,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACvB,MAAM,QAAQ,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;YACtC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,GAAG,QAAQ,GAAG,QAAQ,EAAE,CAAC;gBACnD,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACrB,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC;gBACjB,IAAI,GAAG,QAAQ,CAAC;YACpB,CAAC;iBACI,CAAC;gBACF,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACnB,IAAI,IAAI,QAAQ,CAAC;YACrB,CAAC;QACL,CAAC;QACD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;YAClB,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACzB,OAAO,MAAM,CAAC;IAClB,CAAC,CAAC;AACN,CAAC;AACD,SAAgB,QAAQ,CAAC,KAAK,EAAE,aAAa,EAAE,YAAY;IACvD,IAAI,QAAQ,CAAC;IACb,IAAI,OAAO,CAAC;IACZ,IAAI,OAAO,KAAK,KAAK,UAAU,EAAE,CAAC;QAC9B,QAAQ,GAAG,KAAK,CAAC;QACjB,OAAO,GAAG,aAAa,IAAI,EAAE,CAAC;IAClC,CAAC;SACI,CAAC;QACF,MAAM,IAAI,GAAG,OAAO,aAAa,KAAK,QAAQ;YAC1C,CAAC,CAAC,aAAa;YACf,CAAC,CAAC,oBAAY,CAAC,QAAQ,CAAC;QAC5B,OAAO;YACH,CAAC,OAAO,aAAa,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC;gBAC/D,CAAC,CAAC,aAAa;gBACf,CAAC,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;QAC9B,QAAQ;YACJ,IAAI,KAAK,oBAAY,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IACjF,CAAC;IACD,MAAM,EAAE,OAAO,EAAE,QAAQ,GAAG,CAAC,EAAE,GAAG,OAAO,CAAC;IAC1C,OAAO,SAAS,iBAAiB,CAAC,MAAM,EAAE,WAAW,EAAE,UAAU;QAC7D,SAAS,WAAW,CAAC,MAAM,EAAE,WAAW,EAAE,UAAU;YAChD,UAAU,CAAC,KAAK,GAAG,IAAI,KAAK,CAAC,UAAU,CAAC,KAAK,EAAE;gBAC3C,KAAK,CAAC,KAAK,CAAC,UAAU,EAAE,OAAO,EAAE,IAAI;oBACjC,MAAM,cAAc,GAAG,IAAI,CAAC;oBAC5B,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,MAAM,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;oBAC1F,MAAM,iBAAiB,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;oBACtD,IAAI,CAAC,iBAAiB,CAAC,MAAM;wBACzB,MAAM,IAAI,6BAAa,CAAC,6DAA6D,CAAC,CAAC;oBAC3F,iBAAiB,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;wBAChC,IAAI,KAAK,IAAI,cAAc,CAAC,MAAM;4BAC9B,MAAM,IAAI,6BAAa,CAAC,uCAAuC,KAAK,aAAa,cAAc,CAAC,MAAM,WAAW,CAAC,CAAC;wBACvH,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;4BACrC,MAAM,IAAI,6BAAa,CAAC,yCAAyC,KAAK,iBAAiB,CAAC,CAAC;oBACjG,CAAC,CAAC,CAAC;oBACH,MAAM,MAAM,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC;oBACnE,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;oBAC/B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,KAAK,KAAK,CAAC;wBAC5C,MAAM,IAAI,6BAAa,CAAC,qEAAqE,CAAC,CAAC;oBACnG,IAAI,KAAK,KAAK,CAAC;wBACX,OAAO,UAAU,CAAC,KAAK,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;oBACrD,MAAM,aAAa,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;oBAC1C,MAAM,aAAa,GAAG,kBAAkB,CAAC,aAAa,EAAE,MAAM,EAAE,iBAAiB,EAAE,cAAc,CAAC,CAAC;oBACnG,MAAM,oBAAoB,GAAG,OAAO,CAAC,oBAAoB;wBACrD,CAAC,GAAG,EAAE;4BACF,IAAI,CAAC;gCACD,OAAO,GAAG,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;4BACjD,CAAC;4BACD,MAAM,CAAC;gCACH,OAAO,SAAS,CAAC;4BACrB,CAAC;wBACL,CAAC,CAAC,EAAE;wBACJ,IAAI,CAAC;oBACT,MAAM,gBAAgB,GAAG,EAAE,CAAC;oBAC5B,MAAM,MAAM,GAAG,EAAE,CAAC;oBAClB,KAAK,MAAM,SAAS,IAAI,aAAa,EAAE,CAAC;wBACpC,IAAI,CAAC;4BACD,MAAM,WAAW,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;4BAC/D,WAAW,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC;wBAC/C,CAAC;wBACD,OAAO,KAAK,EAAE,CAAC;4BACX,IAAI,oBAAoB;gCACpB,MAAM,KAAK,CAAC;4BAChB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;wBACvB,CAAC;wBACD,IAAI,OAAO;4BACP,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;oBACrE,CAAC;oBACD,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;wBAChB,GAAG,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,WAAW,CAAC,uCAAuC,MAAM,CAAC,MAAM,aAAa,CAAC,CAAC;wBAClG,MAAM,SAAS,GAAG,IAAI,cAAc,CAAC,MAAM,EAAE,aAAa,MAAM,CAAC,WAAW,CAAC,eAAe,MAAM,CAAC,MAAM,WAAW,CAAC,CAAC;wBACtH,SAAS,CAAC,OAAO,GAAG,gBAAgB,CAAC;wBACrC,MAAM,SAAS,CAAC;oBACpB,CAAC;oBACD,OAAO,gBAAgB,CAAC;gBAC5B,CAAC;aACJ,CAAC,CAAC;QACP,CAAC;QACD,OAAO,IAAA,kBAAK,EAAC,IAAA,2BAAc,EAAC,qBAAQ,CAAC,GAAG,CAAC,0BAAe,CAAC,QAAQ,EAAE,WAAW,CAAC,EAAE,OAAO,CAAC,EAAE,WAAW,CAAC,CAAC,MAAM,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;IAC7I,CAAC,CAAC;AACN,CAAC;AACD,SAAS,iBAAiB,CAAC,QAAQ;IAC/B,MAAM,OAAO,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QAC1E,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC;YAChC,MAAM,IAAI,6BAAa,CAAC,4DAA4D,CAAC,CAAC;QAC1F,OAAO,GAAG,CAAC;IACf,CAAC,CAAC,CAAC;IACH,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAC9D,CAAC;AACD,SAAS,kBAAkB,CAAC,aAAa,EAAE,MAAM,EAAE,iBAAiB,EAAE,cAAc;IAChF,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,OAAO,aAAa,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QAC/B,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC;QAC9B,MAAM,IAAI,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YACzC,MAAM,SAAS,GAAG,iBAAiB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACjD,IAAI,SAAS,KAAK,CAAC,CAAC;gBAChB,OAAO,GAAG,CAAC;YACf,OAAO,SAAS,KAAK,CAAC;gBAClB,CAAC,CAAC,KAAK;gBACP,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,CAAC,CAAC;QAC7D,CAAC,CAAC,CAAC;QACH,MAAM,IAAI,QAAQ,CAAC;QACnB,OAAO,IAAI,CAAC;IAChB,CAAC,CAAC,CAAC;AACP,CAAC;AACD,SAAS,cAAc,CAAC,KAAK;IACzB,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,WAAW;QAC9C,OAAO,CAAC,CAAC;IACb,IAAI,CAAC;QACD,OAAO,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;IACpD,CAAC;IACD,MAAM,CAAC;QACH,OAAO,CAAC,CAAC;IACb,CAAC;AACL,CAAC;AACD,SAAS,WAAW,CAAC,MAAM,EAAE,SAAS;IAClC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACxB,SAAS,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC;IAC9B,CAAC;SACI,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;QACrC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC3B,CAAC;AACL,CAAC;AACD,sCAAsC"}
package/lib/esm/index.js CHANGED
@@ -33,21 +33,21 @@ export * from "./persistence/index.js";
33
33
  * @const VERSION
34
34
  * @memberOf module:core
35
35
  */
36
- export const VERSION = "0.26.0";
36
+ export const VERSION = "0.26.2";
37
37
  /**
38
38
  * @description Represents the current commit hash of the module build.
39
39
  * @summary Stores the current git commit hash for the package. The build replaces
40
40
  * the placeholder with the actual commit hash at publish time.
41
41
  * @const COMMIT
42
42
  */
43
- export const COMMIT = "f4fed58";
43
+ export const COMMIT = "3e8a41d";
44
44
  /**
45
45
  * @description Represents the full version string of the module.
46
46
  * @summary Stores the semver version and commit hash for the package.
47
47
  * The build replaces the placeholder with the actual `<version>-<commit>` value at publish time.
48
48
  * @const FULL_VERSION
49
49
  */
50
- export const FULL_VERSION = "0.26.0-f4fed58";
50
+ export const FULL_VERSION = "0.26.2-3e8a41d";
51
51
  /**
52
52
  * @description Stores the current package version
53
53
  * @summary A constant representing the version of the core package
@@ -81,12 +81,19 @@ export class TaskContext extends Context {
81
81
  scheduleSteps(...steps) {
82
82
  const normalized = (steps ?? []).map((step) => step instanceof TaskStepSpecModel ? step : new TaskStepSpecModel(step));
83
83
  return {
84
- afterCurrent: async () => {
84
+ afterCurrent: async (ctx) => {
85
85
  const scheduler = this.getOrUndefined("scheduleCompositeSteps");
86
86
  if (!scheduler) {
87
87
  throw new InternalError("scheduleSteps().afterCurrent() is only available while running a composite task step");
88
88
  }
89
- await scheduler(normalized);
89
+ await scheduler(normalized, ctx);
90
+ },
91
+ atEnd: async (ctx) => {
92
+ const scheduler = this.getOrUndefined("scheduleCompositeStepsAtEnd");
93
+ if (!scheduler) {
94
+ throw new InternalError("scheduleSteps().atEnd() is only available while running a composite task step");
95
+ }
96
+ await scheduler(normalized, ctx);
90
97
  },
91
98
  };
92
99
  }
@@ -1 +1 @@
1
- {"version":3,"file":"TaskContext.js","sourceRoot":"","sources":["../../../src/tasks/TaskContext.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"TaskContext.js","sourceRoot":"","sources":["../../../src/tasks/TaskContext.ts"],"names":[],"mappings":"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"}
@@ -708,7 +708,8 @@ export class TaskEngine extends AbsContextual {
708
708
  totalSteps: steps.length,
709
709
  });
710
710
  const stepIndex = idx;
711
- context.cache.put("scheduleCompositeSteps", async (newSteps) => {
711
+ context.cache.put("scheduleCompositeSteps", async (newSteps, ctx) => {
712
+ const log = ctx.logger.for("scheduleSteps.afterCurrent");
712
713
  const normalizedNewSteps = this.normalizeSteps(newSteps);
713
714
  if (!normalizedNewSteps.length)
714
715
  return;
@@ -719,6 +720,31 @@ export class TaskEngine extends AbsContextual {
719
720
  const persisted = await this.tasks.update(task, context);
720
721
  Object.assign(task, persisted);
721
722
  steps = this.normalizeSteps(task.steps);
723
+ log.verbose(`Inserted ${normalizedNewSteps.length} steps at index ${insertionIndex}`);
724
+ const updateEvent = await this.persistEvent(context, task.id, TaskEventType.UPDATE, {
725
+ status: "update",
726
+ currentStep: stepIndex,
727
+ totalSteps: steps.length,
728
+ output: {
729
+ added: normalizedNewSteps.length,
730
+ insertionIndex,
731
+ },
732
+ });
733
+ this.bus.emit(updateEvent, context);
734
+ });
735
+ context.cache.put("scheduleCompositeStepsAtEnd", async (newSteps, ctx) => {
736
+ const log = ctx.logger.for("scheduleSteps.atEnd");
737
+ const normalizedNewSteps = this.normalizeSteps(newSteps);
738
+ if (!normalizedNewSteps.length)
739
+ return;
740
+ const currentSteps = this.normalizeSteps(task.steps);
741
+ const insertionIndex = currentSteps.length;
742
+ currentSteps.push(...normalizedNewSteps);
743
+ task.steps = currentSteps;
744
+ const persisted = await this.tasks.update(task, context);
745
+ Object.assign(task, persisted);
746
+ steps = this.normalizeSteps(task.steps);
747
+ log.verbose(`Appended ${normalizedNewSteps.length} steps at tail (index ${insertionIndex})`);
722
748
  const updateEvent = await this.persistEvent(context, task.id, TaskEventType.UPDATE, {
723
749
  status: "update",
724
750
  currentStep: stepIndex,
@@ -734,34 +760,53 @@ export class TaskEngine extends AbsContextual {
734
760
  LogLevel.info,
735
761
  `Composite step ${idx + 1}/${steps.length}: ${step.classification}`,
736
762
  ]);
737
- try {
738
- const out = await handler.run(step.input, context);
739
- // Ensure step-tagged logs are flushed before advancing the step pointer.
740
- await context.flush();
741
- const now = new Date();
742
- results[stepIndex] = new TaskStepResultModel({
743
- status: TaskStatus.SUCCEEDED,
744
- output: out,
745
- createdAt: now,
746
- updatedAt: now,
747
- });
748
- const cacheKey = `${task.id}:step:${stepIndex}`;
749
- cacheResult(step.classification, out);
750
- cacheResult(cacheKey, out);
751
- idx = stepIndex + 1;
752
- task.stepResults = results;
753
- task.currentStep = idx;
754
- const persisted = await this.tasks.update(task);
755
- Object.assign(task, persisted);
756
- await this.emitProgress(context, task.id, {
757
- currentStep: idx,
758
- totalSteps: steps.length,
759
- output: out,
760
- });
763
+ const stepMaxAttempts = step.maxAttempts ?? 1;
764
+ let stepAttempt = 0;
765
+ let lastStepErr;
766
+ while (stepAttempt < stepMaxAttempts) {
767
+ try {
768
+ const out = await handler.run(step.input, context);
769
+ // Ensure step-tagged logs are flushed before advancing the step pointer.
770
+ await context.flush();
771
+ const now = new Date();
772
+ results[stepIndex] = new TaskStepResultModel({
773
+ status: TaskStatus.SUCCEEDED,
774
+ output: out,
775
+ attempt: stepAttempt + 1,
776
+ createdAt: now,
777
+ updatedAt: now,
778
+ });
779
+ const cacheKey = `${task.id}:step:${stepIndex}`;
780
+ cacheResult(step.classification, out);
781
+ cacheResult(cacheKey, out);
782
+ idx = stepIndex + 1;
783
+ task.stepResults = results;
784
+ task.currentStep = idx;
785
+ const persisted = await this.tasks.update(task);
786
+ Object.assign(task, persisted);
787
+ await this.emitProgress(context, task.id, {
788
+ currentStep: idx,
789
+ totalSteps: steps.length,
790
+ output: out,
791
+ });
792
+ lastStepErr = undefined;
793
+ break;
794
+ }
795
+ catch (err) {
796
+ stepAttempt++;
797
+ lastStepErr = err;
798
+ if (stepAttempt < stepMaxAttempts) {
799
+ const stepBackoff = this.normalizeBackoff(step.backoff ?? task.backoff);
800
+ const delay = computeBackoffMs(stepAttempt, stepBackoff);
801
+ await context.pipe(LogLevel.warn, `Composite step ${idx} attempt ${stepAttempt}/${stepMaxAttempts} failed, retrying in ${delay}ms`, { classification: step.classification, attempt: stepAttempt, delay });
802
+ await sleep(delay);
803
+ await context.heartbeat();
804
+ }
805
+ }
761
806
  }
762
- catch (err) {
807
+ if (lastStepErr) {
763
808
  try {
764
- await handler.catch?.(step.input, err, context);
809
+ await handler.catch?.(step.input, lastStepErr, context);
765
810
  }
766
811
  catch (catchErr) {
767
812
  ctx.logger.warn("composite step catch() hook failed", {
@@ -771,17 +816,18 @@ export class TaskEngine extends AbsContextual {
771
816
  const now = new Date();
772
817
  results[idx] = new TaskStepResultModel({
773
818
  status: TaskStatus.FAILED,
774
- error: serializeError(err),
819
+ error: serializeError(lastStepErr),
820
+ attempt: stepAttempt,
775
821
  createdAt: now,
776
822
  updatedAt: now,
777
823
  });
778
824
  task.stepResults = results;
779
825
  task.currentStep = idx;
780
- task.error = serializeError(err);
826
+ task.error = serializeError(lastStepErr);
781
827
  // persist failure context before throwing (retry logic happens outside)
782
828
  const persisted = await this.tasks.update(task);
783
829
  Object.assign(task, persisted);
784
- throw err;
830
+ throw lastStepErr;
785
831
  }
786
832
  }
787
833
  return { stepResults: results };