callman-core 1.2.0 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (102) hide show
  1. package/dist/scenario-runner/adapters/connection-config.d.ts +34 -0
  2. package/dist/scenario-runner/adapters/connection-config.d.ts.map +1 -0
  3. package/dist/scenario-runner/adapters/connection-config.js +6 -0
  4. package/dist/scenario-runner/adapters/connection-config.js.map +1 -0
  5. package/dist/scenario-runner/adapters/db-executor.d.ts +4 -0
  6. package/dist/scenario-runner/adapters/db-executor.d.ts.map +1 -0
  7. package/dist/scenario-runner/adapters/db-executor.js +42 -0
  8. package/dist/scenario-runner/adapters/db-executor.js.map +1 -0
  9. package/dist/scenario-runner/adapters/helpers/abort.d.ts +4 -0
  10. package/dist/scenario-runner/adapters/helpers/abort.d.ts.map +1 -0
  11. package/dist/scenario-runner/adapters/helpers/abort.js +47 -0
  12. package/dist/scenario-runner/adapters/helpers/abort.js.map +1 -0
  13. package/dist/scenario-runner/adapters/helpers/failure-messages.d.ts +29 -0
  14. package/dist/scenario-runner/adapters/helpers/failure-messages.d.ts.map +1 -0
  15. package/dist/scenario-runner/adapters/helpers/failure-messages.js +64 -0
  16. package/dist/scenario-runner/adapters/helpers/failure-messages.js.map +1 -0
  17. package/dist/scenario-runner/adapters/helpers/mutations.d.ts +7 -0
  18. package/dist/scenario-runner/adapters/helpers/mutations.d.ts.map +1 -0
  19. package/dist/scenario-runner/adapters/helpers/mutations.js +28 -0
  20. package/dist/scenario-runner/adapters/helpers/mutations.js.map +1 -0
  21. package/dist/scenario-runner/adapters/helpers/request-helpers.d.ts +31 -0
  22. package/dist/scenario-runner/adapters/helpers/request-helpers.d.ts.map +1 -0
  23. package/dist/scenario-runner/adapters/helpers/request-helpers.js +247 -0
  24. package/dist/scenario-runner/adapters/helpers/request-helpers.js.map +1 -0
  25. package/dist/scenario-runner/adapters/helpers/response-shapes.d.ts +3 -0
  26. package/dist/scenario-runner/adapters/helpers/response-shapes.d.ts.map +1 -0
  27. package/dist/scenario-runner/adapters/helpers/response-shapes.js +32 -0
  28. package/dist/scenario-runner/adapters/helpers/response-shapes.js.map +1 -0
  29. package/dist/scenario-runner/adapters/helpers/templates.d.ts +2 -0
  30. package/dist/scenario-runner/adapters/helpers/templates.d.ts.map +1 -0
  31. package/dist/scenario-runner/adapters/helpers/templates.js +30 -0
  32. package/dist/scenario-runner/adapters/helpers/templates.js.map +1 -0
  33. package/dist/scenario-runner/adapters/index.d.ts +12 -0
  34. package/dist/scenario-runner/adapters/index.d.ts.map +1 -0
  35. package/dist/scenario-runner/adapters/index.js +30 -0
  36. package/dist/scenario-runner/adapters/index.js.map +1 -0
  37. package/dist/scenario-runner/adapters/kafka-executor.d.ts +4 -0
  38. package/dist/scenario-runner/adapters/kafka-executor.d.ts.map +1 -0
  39. package/dist/scenario-runner/adapters/kafka-executor.js +35 -0
  40. package/dist/scenario-runner/adapters/kafka-executor.js.map +1 -0
  41. package/dist/scenario-runner/adapters/notification-executor.d.ts +4 -0
  42. package/dist/scenario-runner/adapters/notification-executor.d.ts.map +1 -0
  43. package/dist/scenario-runner/adapters/notification-executor.js +67 -0
  44. package/dist/scenario-runner/adapters/notification-executor.js.map +1 -0
  45. package/dist/scenario-runner/adapters/redis-executor.d.ts +4 -0
  46. package/dist/scenario-runner/adapters/redis-executor.d.ts.map +1 -0
  47. package/dist/scenario-runner/adapters/redis-executor.js +78 -0
  48. package/dist/scenario-runner/adapters/redis-executor.js.map +1 -0
  49. package/dist/scenario-runner/adapters/request-executor.d.ts +4 -0
  50. package/dist/scenario-runner/adapters/request-executor.d.ts.map +1 -0
  51. package/dist/scenario-runner/adapters/request-executor.js +262 -0
  52. package/dist/scenario-runner/adapters/request-executor.js.map +1 -0
  53. package/dist/scenario-runner/adapters/script-executor.d.ts +4 -0
  54. package/dist/scenario-runner/adapters/script-executor.d.ts.map +1 -0
  55. package/dist/scenario-runner/adapters/script-executor.js +113 -0
  56. package/dist/scenario-runner/adapters/script-executor.js.map +1 -0
  57. package/dist/scenario-runner/adapters/types.d.ts +82 -0
  58. package/dist/scenario-runner/adapters/types.d.ts.map +1 -0
  59. package/dist/scenario-runner/adapters/types.js +9 -0
  60. package/dist/scenario-runner/adapters/types.js.map +1 -0
  61. package/dist/scenario-runner/condition.d.ts.map +1 -1
  62. package/dist/scenario-runner/condition.js +87 -78
  63. package/dist/scenario-runner/condition.js.map +1 -1
  64. package/dist/scenario-runner/index.d.ts +2 -1
  65. package/dist/scenario-runner/index.d.ts.map +1 -1
  66. package/dist/scenario-runner/index.js +7 -1
  67. package/dist/scenario-runner/index.js.map +1 -1
  68. package/dist-cjs/scenario-runner/adapters/connection-config.js +7 -0
  69. package/dist-cjs/scenario-runner/adapters/connection-config.js.map +1 -0
  70. package/dist-cjs/scenario-runner/adapters/db-executor.js +46 -0
  71. package/dist-cjs/scenario-runner/adapters/db-executor.js.map +1 -0
  72. package/dist-cjs/scenario-runner/adapters/helpers/abort.js +52 -0
  73. package/dist-cjs/scenario-runner/adapters/helpers/abort.js.map +1 -0
  74. package/dist-cjs/scenario-runner/adapters/helpers/failure-messages.js +69 -0
  75. package/dist-cjs/scenario-runner/adapters/helpers/failure-messages.js.map +1 -0
  76. package/dist-cjs/scenario-runner/adapters/helpers/mutations.js +32 -0
  77. package/dist-cjs/scenario-runner/adapters/helpers/mutations.js.map +1 -0
  78. package/dist-cjs/scenario-runner/adapters/helpers/request-helpers.js +263 -0
  79. package/dist-cjs/scenario-runner/adapters/helpers/request-helpers.js.map +1 -0
  80. package/dist-cjs/scenario-runner/adapters/helpers/response-shapes.js +36 -0
  81. package/dist-cjs/scenario-runner/adapters/helpers/response-shapes.js.map +1 -0
  82. package/dist-cjs/scenario-runner/adapters/helpers/templates.js +34 -0
  83. package/dist-cjs/scenario-runner/adapters/helpers/templates.js.map +1 -0
  84. package/dist-cjs/scenario-runner/adapters/index.js +40 -0
  85. package/dist-cjs/scenario-runner/adapters/index.js.map +1 -0
  86. package/dist-cjs/scenario-runner/adapters/kafka-executor.js +39 -0
  87. package/dist-cjs/scenario-runner/adapters/kafka-executor.js.map +1 -0
  88. package/dist-cjs/scenario-runner/adapters/notification-executor.js +71 -0
  89. package/dist-cjs/scenario-runner/adapters/notification-executor.js.map +1 -0
  90. package/dist-cjs/scenario-runner/adapters/redis-executor.js +82 -0
  91. package/dist-cjs/scenario-runner/adapters/redis-executor.js.map +1 -0
  92. package/dist-cjs/scenario-runner/adapters/request-executor.js +266 -0
  93. package/dist-cjs/scenario-runner/adapters/request-executor.js.map +1 -0
  94. package/dist-cjs/scenario-runner/adapters/script-executor.js +117 -0
  95. package/dist-cjs/scenario-runner/adapters/script-executor.js.map +1 -0
  96. package/dist-cjs/scenario-runner/adapters/types.js +10 -0
  97. package/dist-cjs/scenario-runner/adapters/types.js.map +1 -0
  98. package/dist-cjs/scenario-runner/condition.js +87 -78
  99. package/dist-cjs/scenario-runner/condition.js.map +1 -1
  100. package/dist-cjs/scenario-runner/index.js +8 -5
  101. package/dist-cjs/scenario-runner/index.js.map +1 -1
  102. package/package.json +1 -1
@@ -0,0 +1,263 @@
1
+ "use strict";
2
+ // Helpers shared by the request executor: response shape coercion,
3
+ // auth header injection, body resolution, header utilities, JSON parsing,
4
+ // failure normalization. All lifted from
5
+ // p_man_backend/src/modules/scenario-runner/adapters/runtime-adapters.ts
6
+ // (lines 113-413) and reworked to be Node-agnostic — `Buffer` calls
7
+ // rewritten using `TextEncoder` and a pure base64 encoder so the helpers
8
+ // run in the browser/renderer too.
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.toRequestScriptResponse = exports.toRequestResponse = exports.normalizeExecuteRequestFailure = exports.normalizeRequestForExecution = exports.createRequestStateFromNode = exports.resolveRequestBody = exports.applyAuthToRequest = exports.normalizeResponseValue = exports.normalizeCookies = exports.findHeader = exports.normalizeHeaderPairs = exports.safeJsonParse = exports.isJsonLike = void 0;
11
+ const BASE64_CHARS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
12
+ const encodeBase64 = (bytes) => {
13
+ let output = "";
14
+ const length = bytes.length;
15
+ for (let index = 0; index < length; index += 3) {
16
+ const b0 = bytes[index];
17
+ const b1 = index + 1 < length ? bytes[index + 1] : 0;
18
+ const b2 = index + 2 < length ? bytes[index + 2] : 0;
19
+ const triplet = (b0 << 16) | (b1 << 8) | b2;
20
+ output += BASE64_CHARS[(triplet >> 18) & 0x3f];
21
+ output += BASE64_CHARS[(triplet >> 12) & 0x3f];
22
+ output += index + 1 < length ? BASE64_CHARS[(triplet >> 6) & 0x3f] : "=";
23
+ output += index + 2 < length ? BASE64_CHARS[triplet & 0x3f] : "=";
24
+ }
25
+ return output;
26
+ };
27
+ const utf8Encode = (input) => new TextEncoder().encode(input);
28
+ const utf8ByteLength = (input) => utf8Encode(input).length;
29
+ const isJsonLike = (value) => {
30
+ const trimmed = value.trim();
31
+ return trimmed.startsWith("{") || trimmed.startsWith("[");
32
+ };
33
+ exports.isJsonLike = isJsonLike;
34
+ const safeJsonParse = (value) => {
35
+ try {
36
+ return JSON.parse(value);
37
+ }
38
+ catch {
39
+ return null;
40
+ }
41
+ };
42
+ exports.safeJsonParse = safeJsonParse;
43
+ const normalizeHeaderPairs = (headers) => Object.entries(headers).map(([key, value]) => ({ key, value }));
44
+ exports.normalizeHeaderPairs = normalizeHeaderPairs;
45
+ const findHeader = (headers, name) => {
46
+ const normalizedName = name.toLowerCase();
47
+ return (Object.entries(headers).find(([key]) => key.toLowerCase() === normalizedName)?.[1] ?? "");
48
+ };
49
+ exports.findHeader = findHeader;
50
+ const normalizeCookies = (headers) => {
51
+ const cookieHeader = (0, exports.findHeader)(headers, "set-cookie");
52
+ if (!cookieHeader.trim()) {
53
+ return [];
54
+ }
55
+ return cookieHeader
56
+ .split(/\s*,\s*(?=[^;,]+?=)/)
57
+ .map((entry) => entry.trim())
58
+ .filter(Boolean);
59
+ };
60
+ exports.normalizeCookies = normalizeCookies;
61
+ const normalizeResponseValue = (value) => {
62
+ if (typeof value === "string") {
63
+ return value;
64
+ }
65
+ if (value === null || value === undefined) {
66
+ return "";
67
+ }
68
+ try {
69
+ return JSON.stringify(value, null, 2);
70
+ }
71
+ catch {
72
+ return String(value);
73
+ }
74
+ };
75
+ exports.normalizeResponseValue = normalizeResponseValue;
76
+ // Apply pre-script auth (bearer / basic / apikey) to the mutable request
77
+ // state. `resolveValue` is supplied by the caller — typically a thin
78
+ // wrapper around `resolveScenarioTemplateString` so auth values can use
79
+ // `{{var}}` substitution.
80
+ const applyAuthToRequest = (request, auth, resolveValue) => {
81
+ if (!auth || auth.type === "none") {
82
+ return;
83
+ }
84
+ if (auth.type === "bearer") {
85
+ request.headers.push({
86
+ key: "Authorization",
87
+ value: `Bearer ${resolveValue(auth.bearerToken)}`,
88
+ enabled: true,
89
+ });
90
+ return;
91
+ }
92
+ if (auth.type === "basic") {
93
+ const username = resolveValue(auth.basicUsername);
94
+ const password = resolveValue(auth.basicPassword);
95
+ request.headers.push({
96
+ key: "Authorization",
97
+ value: `Basic ${encodeBase64(utf8Encode(`${username}:${password}`))}`,
98
+ enabled: true,
99
+ });
100
+ return;
101
+ }
102
+ if (auth.type === "apikey") {
103
+ const key = resolveValue(auth.apiKeyKey);
104
+ if (!key.trim()) {
105
+ return;
106
+ }
107
+ const value = resolveValue(auth.apiKeyValue);
108
+ const target = auth.apiKeyLocation === "query" ? request.query : request.headers;
109
+ target.push({ key, value, enabled: true });
110
+ }
111
+ };
112
+ exports.applyAuthToRequest = applyAuthToRequest;
113
+ const resolveRequestBody = (request, helpers, templateValues) => {
114
+ if (request.body.mode === "none") {
115
+ return undefined;
116
+ }
117
+ if (request.body.mode === "raw") {
118
+ const raw = request.body.raw ?? "";
119
+ if (!raw.trim()) {
120
+ return "";
121
+ }
122
+ if ((0, exports.isJsonLike)(raw)) {
123
+ const validationCandidate = helpers.replaceScenarioTemplateTokensForJsonValidation(raw);
124
+ if ((0, exports.safeJsonParse)(validationCandidate) !== null) {
125
+ const resolvedJson = helpers.resolveScenarioJsonTemplateString(raw, templateValues);
126
+ const parsedJson = (0, exports.safeJsonParse)(resolvedJson);
127
+ if (parsedJson !== null) {
128
+ return parsedJson;
129
+ }
130
+ }
131
+ }
132
+ return helpers.resolveScenarioTemplateString(raw, templateValues);
133
+ }
134
+ return Object.fromEntries(request.body.formEntries
135
+ .filter((entry) => entry.enabled !== false && entry.key.trim())
136
+ .map((entry) => [
137
+ helpers.resolveScenarioTemplateString(entry.key, templateValues),
138
+ helpers.resolveScenarioTemplateString(entry.value, templateValues),
139
+ ]));
140
+ };
141
+ exports.resolveRequestBody = resolveRequestBody;
142
+ // Build the script-shaped request state from a node config (initial state
143
+ // for pre-request scripts and ongoing mutation tracking).
144
+ const createRequestStateFromNode = (node) => ({
145
+ method: node.data.config.method,
146
+ url: node.data.config.url,
147
+ headers: (node.data.config.headers ?? []).map((entry) => ({
148
+ key: entry.key,
149
+ value: entry.value,
150
+ enabled: entry.enabled ?? true,
151
+ })),
152
+ query: (node.data.config.query ?? []).map((entry) => ({
153
+ key: entry.key,
154
+ value: entry.value,
155
+ enabled: entry.enabled ?? true,
156
+ })),
157
+ body: {
158
+ mode: node.data.config.body.mode,
159
+ raw: node.data.config.body.raw,
160
+ formEntries: (node.data.config.body.formEntries ?? []).map((entry) => ({
161
+ key: entry.key,
162
+ value: entry.value,
163
+ enabled: entry.enabled ?? true,
164
+ })),
165
+ },
166
+ });
167
+ exports.createRequestStateFromNode = createRequestStateFromNode;
168
+ // Final normalization step before the HTTP call: apply auth, resolve all
169
+ // templates, drop disabled entries. Returns a plain executable shape
170
+ // (records, not key/value pair arrays) suitable for direct driver use.
171
+ const normalizeRequestForExecution = (request, auth, helpers, templateValues) => {
172
+ const mutableRequest = {
173
+ method: request.method,
174
+ url: request.url,
175
+ headers: request.headers.map((entry) => ({ ...entry })),
176
+ query: request.query.map((entry) => ({ ...entry })),
177
+ body: {
178
+ mode: request.body.mode,
179
+ raw: request.body.raw,
180
+ formEntries: request.body.formEntries.map((entry) => ({ ...entry })),
181
+ },
182
+ };
183
+ (0, exports.applyAuthToRequest)(mutableRequest, auth, (value) => helpers.resolveScenarioTemplateString(value, templateValues));
184
+ const headers = Object.fromEntries(mutableRequest.headers
185
+ .filter((entry) => entry.enabled !== false && entry.key.trim())
186
+ .map((entry) => [
187
+ helpers.resolveScenarioTemplateString(entry.key, templateValues),
188
+ helpers.resolveScenarioTemplateString(entry.value, templateValues),
189
+ ]));
190
+ const query = Object.fromEntries(mutableRequest.query
191
+ .filter((entry) => entry.enabled !== false && entry.key.trim())
192
+ .map((entry) => [
193
+ helpers.resolveScenarioTemplateString(entry.key, templateValues),
194
+ helpers.resolveScenarioTemplateString(entry.value, templateValues),
195
+ ]));
196
+ return {
197
+ method: helpers
198
+ .resolveScenarioTemplateString(mutableRequest.method, templateValues)
199
+ .trim()
200
+ .toUpperCase(),
201
+ url: helpers.resolveScenarioTemplateString(mutableRequest.url, templateValues),
202
+ headers,
203
+ query,
204
+ body: (0, exports.resolveRequestBody)(mutableRequest, helpers, templateValues),
205
+ };
206
+ };
207
+ exports.normalizeRequestForExecution = normalizeRequestForExecution;
208
+ const normalizeExecuteRequestFailure = (error) => ({
209
+ status: 0,
210
+ data: {
211
+ error: error instanceof Error ? error.message : String(error),
212
+ },
213
+ headers: {},
214
+ duration: 0,
215
+ });
216
+ exports.normalizeExecuteRequestFailure = normalizeExecuteRequestFailure;
217
+ const toRequestResponse = (executionResult) => {
218
+ const bodyJson = executionResult.data && typeof executionResult.data === "object"
219
+ ? executionResult.data
220
+ : typeof executionResult.data === "string"
221
+ ? (0, exports.safeJsonParse)(executionResult.data)
222
+ : null;
223
+ const bodyText = (0, exports.normalizeResponseValue)(executionResult.data);
224
+ const cookies = (0, exports.normalizeCookies)(executionResult.headers);
225
+ const contentType = (0, exports.findHeader)(executionResult.headers, "content-type");
226
+ return {
227
+ ok: executionResult.status >= 200 && executionResult.status < 400,
228
+ status: executionResult.status,
229
+ statusText: executionResult.status === 0 ? "Request Error" : "",
230
+ durationMs: executionResult.duration,
231
+ sizeBytes: utf8ByteLength(bodyText),
232
+ headers: (0, exports.normalizeHeaderPairs)(executionResult.headers),
233
+ cookies,
234
+ contentType,
235
+ bodyText,
236
+ bodyJson,
237
+ kafkaResult: null,
238
+ redisResult: null,
239
+ cancelled: false,
240
+ errorMessage: executionResult.status === 0 &&
241
+ executionResult.data &&
242
+ typeof executionResult.data === "object" &&
243
+ "error" in executionResult.data
244
+ ? String(executionResult.data.error ?? "Request failed")
245
+ : undefined,
246
+ };
247
+ };
248
+ exports.toRequestResponse = toRequestResponse;
249
+ const toRequestScriptResponse = (response) => ({
250
+ ok: response.ok,
251
+ status: response.status,
252
+ statusText: response.statusText,
253
+ headers: Object.fromEntries(response.headers.map((entry) => [entry.key, entry.value])),
254
+ body: response.bodyJson ?? response.bodyText,
255
+ jsonBody: response.bodyJson,
256
+ rawBody: response.bodyText,
257
+ contentType: response.contentType,
258
+ durationMs: response.durationMs,
259
+ sizeBytes: response.sizeBytes,
260
+ cookies: [...response.cookies],
261
+ });
262
+ exports.toRequestScriptResponse = toRequestScriptResponse;
263
+ //# sourceMappingURL=request-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request-helpers.js","sourceRoot":"","sources":["../../../../src/scenario-runner/adapters/helpers/request-helpers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ // Build the response template root object used by downstream nodes
3
+ // (template substitution, condition evaluation). Lifted from
4
+ // p_man_backend's `buildResponseRoot` (line 167). The shape preserves
5
+ // what the existing scenario template engine expects:
6
+ // - top-level fields from JSON body (spread)
7
+ // - `data` resolved from body.data when present, else parsed body
8
+ // - `body`, `rawBody`, `text` for body access variants
9
+ // - `status`, `statusText`, `headers` (record form), `cookies`,
10
+ // `durationMs`
11
+ //
12
+ // Pure transformation — used by both the request executor and any node
13
+ // that needs to expose a request response to subsequent nodes.
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.buildResponseRoot = void 0;
16
+ const isPlainObject = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
17
+ const buildResponseRoot = (response) => {
18
+ const responsePayload = response.bodyJson ?? response.bodyText;
19
+ const responseData = isPlainObject(response.bodyJson) && "data" in response.bodyJson
20
+ ? response.bodyJson.data
21
+ : responsePayload;
22
+ return {
23
+ ...(isPlainObject(response.bodyJson) ? response.bodyJson : {}),
24
+ data: responseData,
25
+ body: responsePayload,
26
+ rawBody: response.bodyText,
27
+ text: response.bodyText,
28
+ status: response.status,
29
+ statusText: response.statusText,
30
+ headers: Object.fromEntries(response.headers.map((entry) => [entry.key, entry.value])),
31
+ cookies: Object.fromEntries(response.cookies.map((value) => ["set-cookie", value])),
32
+ durationMs: response.durationMs,
33
+ };
34
+ };
35
+ exports.buildResponseRoot = buildResponseRoot;
36
+ //# sourceMappingURL=response-shapes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response-shapes.js","sourceRoot":"","sources":["../../../../src/scenario-runner/adapters/helpers/response-shapes.ts"],"names":[],"mappings":";AAAA,mEAAmE;AACnE,6DAA6D;AAC7D,sEAAsE;AACtE,sDAAsD;AACtD,+CAA+C;AAC/C,oEAAoE;AACpE,yDAAyD;AACzD,kEAAkE;AAClE,mBAAmB;AACnB,EAAE;AACF,uEAAuE;AACvE,+DAA+D;;;AAI/D,MAAM,aAAa,GAAG,CAAC,KAAc,EAAoC,EAAE,CACzE,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAEhE,MAAM,iBAAiB,GAAG,CAAC,QAAiC,EAA2B,EAAE;IAC9F,MAAM,eAAe,GAAG,QAAQ,CAAC,QAAQ,IAAI,QAAQ,CAAC,QAAQ,CAAC;IAC/D,MAAM,YAAY,GAChB,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,MAAM,IAAI,QAAQ,CAAC,QAAQ;QAC7D,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI;QACxB,CAAC,CAAC,eAAe,CAAC;IAEtB,OAAO;QACL,GAAG,CAAC,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9D,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,eAAe;QACrB,OAAO,EAAE,QAAQ,CAAC,QAAQ;QAC1B,IAAI,EAAE,QAAQ,CAAC,QAAQ;QACvB,MAAM,EAAE,QAAQ,CAAC,MAAM;QACvB,UAAU,EAAE,QAAQ,CAAC,UAAU;QAC/B,OAAO,EAAE,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;QACtF,OAAO,EAAE,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC,CAAC;QACnF,UAAU,EAAE,QAAQ,CAAC,UAAU;KAChC,CAAC;AACJ,CAAC,CAAC;AAnBW,QAAA,iBAAiB,qBAmB5B"}
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ // Deep template resolver for scenario script return values, mutation
3
+ // values, and any nested unknown payload that may carry `{{token}}`
4
+ // strings. Lifted from backend's `resolveScenarioScriptTemplatesDeep`
5
+ // (runtime-adapters.ts:1154).
6
+ //
7
+ // Pure recursion with cycle detection via WeakSet so caller-supplied
8
+ // objects cannot trigger infinite loops. The caller passes the actual
9
+ // resolver (typically `resolveScenarioTemplateString` from
10
+ // `templateResolver.ts`) so this helper stays runtime-agnostic.
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.resolveScenarioScriptTemplatesDeep = void 0;
13
+ const isObject = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
14
+ const resolveScenarioScriptTemplatesDeep = (value, templateValues, resolveValue, seen = new WeakSet()) => {
15
+ if (typeof value === "string") {
16
+ return resolveValue(value, templateValues);
17
+ }
18
+ if (Array.isArray(value)) {
19
+ return value.map((entry) => (0, exports.resolveScenarioScriptTemplatesDeep)(entry, templateValues, resolveValue, seen));
20
+ }
21
+ if (!isObject(value)) {
22
+ return value;
23
+ }
24
+ if (seen.has(value)) {
25
+ return value;
26
+ }
27
+ seen.add(value);
28
+ return Object.fromEntries(Object.entries(value).map(([key, entryValue]) => [
29
+ key,
30
+ (0, exports.resolveScenarioScriptTemplatesDeep)(entryValue, templateValues, resolveValue, seen),
31
+ ]));
32
+ };
33
+ exports.resolveScenarioScriptTemplatesDeep = resolveScenarioScriptTemplatesDeep;
34
+ //# sourceMappingURL=templates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates.js","sourceRoot":"","sources":["../../../../src/scenario-runner/adapters/helpers/templates.ts"],"names":[],"mappings":";AAAA,qEAAqE;AACrE,oEAAoE;AACpE,sEAAsE;AACtE,8BAA8B;AAC9B,EAAE;AACF,qEAAqE;AACrE,sEAAsE;AACtE,2DAA2D;AAC3D,gEAAgE;;;AAEhE,MAAM,QAAQ,GAAG,CAAC,KAAc,EAAoC,EAAE,CACpE,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAEhE,MAAM,kCAAkC,GAAG,CAChD,KAAc,EACd,cAAsC,EACtC,YAAuE,EACvE,OAAwB,IAAI,OAAO,EAAU,EACpC,EAAE;IACX,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,YAAY,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC;IAC7C,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACzB,IAAA,0CAAkC,EAAC,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,IAAI,CAAC,CAC9E,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACrB,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QACpB,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAChB,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,UAAU,CAAC,EAAE,EAAE,CAAC;QAC/C,GAAG;QACH,IAAA,0CAAkC,EAAC,UAAU,EAAE,cAAc,EAAE,YAAY,EAAE,IAAI,CAAC;KACnF,CAAC,CACH,CAAC;AACJ,CAAC,CAAC;AA3BW,QAAA,kCAAkC,sCA2B7C"}
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ // Public surface for scenario runtime adapter orchestration.
3
+ //
4
+ // `buildScenarioRuntimeAdapters(options)` returns a fully wired
5
+ // `ScenarioRuntimeAdapters` instance suitable for passing to
6
+ // `runScenario(...)`. Hosts (backend / electron / future CLI) supply
7
+ // driver callbacks via `options.drivers` for the I/O-heavy executors
8
+ // (HTTP, DB, Redis, Kafka). Script + notification executors default to
9
+ // canonical core implementations but can be overridden.
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.buildScriptExecutor = exports.buildRequestExecutor = exports.buildRedisExecutor = exports.buildNotificationExecutor = exports.buildKafkaExecutor = exports.buildDbExecutor = exports.buildScenarioRuntimeAdapters = void 0;
12
+ const db_executor_js_1 = require("./db-executor.js");
13
+ const kafka_executor_js_1 = require("./kafka-executor.js");
14
+ const notification_executor_js_1 = require("./notification-executor.js");
15
+ const redis_executor_js_1 = require("./redis-executor.js");
16
+ const request_executor_js_1 = require("./request-executor.js");
17
+ const script_executor_js_1 = require("./script-executor.js");
18
+ const buildScenarioRuntimeAdapters = (options) => ({
19
+ requestExecutor: (0, request_executor_js_1.buildRequestExecutor)(options),
20
+ dbExecutor: (0, db_executor_js_1.buildDbExecutor)(options),
21
+ redisExecutor: (0, redis_executor_js_1.buildRedisExecutor)(options),
22
+ kafkaExecutor: (0, kafka_executor_js_1.buildKafkaExecutor)(options),
23
+ scriptExecutor: options.scriptExecutor ?? (0, script_executor_js_1.buildScriptExecutor)(options),
24
+ notificationExecutor: options.notificationExecutor ?? (0, notification_executor_js_1.buildNotificationExecutor)(options),
25
+ });
26
+ exports.buildScenarioRuntimeAdapters = buildScenarioRuntimeAdapters;
27
+ // Re-exports so callers don't have to import from sibling files.
28
+ var db_executor_js_2 = require("./db-executor.js");
29
+ Object.defineProperty(exports, "buildDbExecutor", { enumerable: true, get: function () { return db_executor_js_2.buildDbExecutor; } });
30
+ var kafka_executor_js_2 = require("./kafka-executor.js");
31
+ Object.defineProperty(exports, "buildKafkaExecutor", { enumerable: true, get: function () { return kafka_executor_js_2.buildKafkaExecutor; } });
32
+ var notification_executor_js_2 = require("./notification-executor.js");
33
+ Object.defineProperty(exports, "buildNotificationExecutor", { enumerable: true, get: function () { return notification_executor_js_2.buildNotificationExecutor; } });
34
+ var redis_executor_js_2 = require("./redis-executor.js");
35
+ Object.defineProperty(exports, "buildRedisExecutor", { enumerable: true, get: function () { return redis_executor_js_2.buildRedisExecutor; } });
36
+ var request_executor_js_2 = require("./request-executor.js");
37
+ Object.defineProperty(exports, "buildRequestExecutor", { enumerable: true, get: function () { return request_executor_js_2.buildRequestExecutor; } });
38
+ var script_executor_js_2 = require("./script-executor.js");
39
+ Object.defineProperty(exports, "buildScriptExecutor", { enumerable: true, get: function () { return script_executor_js_2.buildScriptExecutor; } });
40
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/scenario-runner/adapters/index.ts"],"names":[],"mappings":";AAAA,6DAA6D;AAC7D,EAAE;AACF,gEAAgE;AAChE,6DAA6D;AAC7D,qEAAqE;AACrE,qEAAqE;AACrE,uEAAuE;AACvE,wDAAwD;;;AAIxD,qDAAmD;AACnD,2DAAyD;AACzD,yEAAuE;AACvE,2DAAyD;AACzD,+DAA6D;AAC7D,6DAA2D;AAIpD,MAAM,4BAA4B,GAAG,CAC1C,OAA6C,EACpB,EAAE,CAAC,CAAC;IAC7B,eAAe,EAAE,IAAA,0CAAoB,EAAC,OAAO,CAAC;IAC9C,UAAU,EAAE,IAAA,gCAAe,EAAC,OAAO,CAAC;IACpC,aAAa,EAAE,IAAA,sCAAkB,EAAC,OAAO,CAAC;IAC1C,aAAa,EAAE,IAAA,sCAAkB,EAAC,OAAO,CAAC;IAC1C,cAAc,EAAE,OAAO,CAAC,cAAc,IAAI,IAAA,wCAAmB,EAAC,OAAO,CAAC;IACtE,oBAAoB,EAClB,OAAO,CAAC,oBAAoB,IAAI,IAAA,oDAAyB,EAAC,OAAO,CAAC;CACrE,CAAC,CAAC;AAVU,QAAA,4BAA4B,gCAUtC;AAEH,iEAAiE;AACjE,mDAAmD;AAA1C,iHAAA,eAAe,OAAA;AACxB,yDAAyD;AAAhD,uHAAA,kBAAkB,OAAA;AAC3B,uEAAuE;AAA9D,qIAAA,yBAAyB,OAAA;AAClC,yDAAyD;AAAhD,uHAAA,kBAAkB,OAAA;AAC3B,6DAA6D;AAApD,2HAAA,oBAAoB,OAAA;AAC7B,2DAA2D;AAAlD,yHAAA,mBAAmB,OAAA"}
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ // Canonical Kafka executor — orchestrates a standalone Kafka scenario node.
3
+ // (Request-prefetch Kafka capture is handled inside request-executor.ts
4
+ // where it is composed with the HTTP call.)
5
+ //
6
+ // The actual Kafka consumer + matcher logic lives in the host-supplied
7
+ // `kafkaExecutor` driver (kafkajs or equivalent). We resolve the
8
+ // connection, validate the topic, and delegate.
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.buildKafkaExecutor = void 0;
11
+ const KAFKA_DEFAULT_CAPTURE_TIMEOUT_MS = 5000;
12
+ const buildKafkaCaptureTimeoutMs = (nodeTimeoutMs) => Math.min(nodeTimeoutMs, KAFKA_DEFAULT_CAPTURE_TIMEOUT_MS);
13
+ const buildKafkaExecutor = (options) => async (input) => {
14
+ const topic = input.resolvedTopic.trim();
15
+ const timeoutMs = buildKafkaCaptureTimeoutMs(options.nodeTimeoutMs);
16
+ if (!topic) {
17
+ const captureResult = {
18
+ topic: "",
19
+ durationMs: 0,
20
+ timeoutMs,
21
+ messages: [],
22
+ timeline: [],
23
+ isListening: false,
24
+ timedOut: false,
25
+ errorMessage: "Kafka topic is required",
26
+ };
27
+ return { captureResult };
28
+ }
29
+ const connection = await options.resolveConnection(input.node.data.config.connectionId);
30
+ const outcome = await options.drivers.kafkaExecutor({
31
+ connection,
32
+ topic,
33
+ matcher: input.matcher,
34
+ timeoutMs,
35
+ });
36
+ return { captureResult: outcome.capture };
37
+ };
38
+ exports.buildKafkaExecutor = buildKafkaExecutor;
39
+ //# sourceMappingURL=kafka-executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kafka-executor.js","sourceRoot":"","sources":["../../../src/scenario-runner/adapters/kafka-executor.ts"],"names":[],"mappings":";AAAA,4EAA4E;AAC5E,wEAAwE;AACxE,4CAA4C;AAC5C,EAAE;AACF,uEAAuE;AACvE,iEAAiE;AACjE,gDAAgD;;;AAUhD,MAAM,gCAAgC,GAAG,IAAI,CAAC;AAE9C,MAAM,0BAA0B,GAAG,CAAC,aAAqB,EAAU,EAAE,CACnE,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,gCAAgC,CAAC,CAAC;AAErD,MAAM,kBAAkB,GAAG,CAChC,OAA6C,EAC7C,EAAE,CACF,KAAK,EAAE,KAAkC,EAAyC,EAAE;IAClF,MAAM,KAAK,GAAG,KAAK,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;IACzC,MAAM,SAAS,GAAG,0BAA0B,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IAEpE,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,aAAa,GAA+B;YAChD,KAAK,EAAE,EAAE;YACT,UAAU,EAAE,CAAC;YACb,SAAS;YACT,QAAQ,EAAE,EAAE;YACZ,QAAQ,EAAE,EAAE;YACZ,WAAW,EAAE,KAAK;YAClB,QAAQ,EAAE,KAAK;YACf,YAAY,EAAE,yBAAyB;SACxC,CAAC;QACF,OAAO,EAAE,aAAa,EAAE,CAAC;IAC3B,CAAC;IAED,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,iBAAiB,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IACxF,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC;QAClD,UAAU;QACV,KAAK;QACL,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,SAAS;KACV,CAAC,CAAC;IAEH,OAAO,EAAE,aAAa,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC;AAC5C,CAAC,CAAC;AA9BS,QAAA,kBAAkB,sBA8B3B"}
@@ -0,0 +1,71 @@
1
+ "use strict";
2
+ // Canonical notification executor — orchestrates a single Notification
3
+ // scenario node. Resolves the connection, posts the rendered delivery
4
+ // request to the Slack webhook URL via native `fetch`, wraps the result.
5
+ //
6
+ // Slack is the only provider supported today. Adding more providers
7
+ // (email, Discord, etc.) goes in this file as additional dispatchers
8
+ // keyed off `connection.provider`.
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.buildNotificationExecutor = void 0;
11
+ const abort_js_1 = require("./helpers/abort.js");
12
+ const NOTIFICATION_HARD_TIMEOUT_MS = 10_000;
13
+ const isNotificationConfig = (config) => typeof config === "object" &&
14
+ config !== null &&
15
+ "webhookUrl" in config &&
16
+ typeof config.webhookUrl === "string";
17
+ const sendSlackWebhook = async (config, request, timeoutMs) => {
18
+ const response = await new Promise((resolve, reject) => {
19
+ const timer = setTimeout(() => {
20
+ reject(new Error(`Notification request timed out after ${timeoutMs}ms`));
21
+ }, timeoutMs);
22
+ fetch(config.webhookUrl, {
23
+ method: "POST",
24
+ headers: request.headers,
25
+ body: JSON.stringify(request.body),
26
+ }).then((value) => {
27
+ clearTimeout(timer);
28
+ resolve(value);
29
+ }, (error) => {
30
+ clearTimeout(timer);
31
+ reject(error);
32
+ });
33
+ });
34
+ const bodyText = await response.text();
35
+ return {
36
+ delivered: response.ok,
37
+ responseMeta: {
38
+ status: response.status,
39
+ statusText: response.statusText || null,
40
+ bodyText: bodyText || null,
41
+ },
42
+ failureMessage: response.ok
43
+ ? null
44
+ : bodyText || `Slack webhook rejected the message with status ${response.status}`,
45
+ };
46
+ };
47
+ const buildNotificationExecutor = (options) => async (input) => {
48
+ const connection = await options.resolveConnection(input.node.data.config.connectionId);
49
+ if (!isNotificationConfig(connection.config)) {
50
+ throw new Error("Notification connection is missing webhookUrl");
51
+ }
52
+ const config = connection.config;
53
+ const timeoutMs = Math.min(options.nodeTimeoutMs, NOTIFICATION_HARD_TIMEOUT_MS);
54
+ const deliveryResult = await (0, abort_js_1.withAbortAndTimeout)(sendSlackWebhook(config, input.deliveryRequest, timeoutMs), timeoutMs, `Notification node ${input.stepId}`, input.signal);
55
+ const outputData = {
56
+ delivered: deliveryResult.delivered,
57
+ provider: input.deliveryRequest.provider,
58
+ severity: input.deliveryRequest.severity,
59
+ channel: input.deliveryRequest.channel ?? config.defaultChannel ?? null,
60
+ messagePreview: input.deliveryRequest.messagePreview,
61
+ responseMeta: deliveryResult.responseMeta,
62
+ };
63
+ return {
64
+ ...outputData,
65
+ responseMeta: deliveryResult.responseMeta,
66
+ outputData,
67
+ failureMessage: deliveryResult.failureMessage,
68
+ };
69
+ };
70
+ exports.buildNotificationExecutor = buildNotificationExecutor;
71
+ //# sourceMappingURL=notification-executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notification-executor.js","sourceRoot":"","sources":["../../../src/scenario-runner/adapters/notification-executor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,82 @@
1
+ "use strict";
2
+ // Canonical Redis executor — orchestrates a single Redis scenario node.
3
+ // Loops the resolved command list through the host-supplied
4
+ // `redisExecutor` driver, aggregates per-command outcomes, and unwraps
5
+ // to a single scalar result when the node has only one command.
6
+ //
7
+ // Host driver responsibilities:
8
+ // - establish the Redis client (host owns ioredis or equivalent)
9
+ // - run each command, capture timing + raw result
10
+ // - propagate connection-level errors as throws
11
+ // - close the client when done
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.buildRedisExecutor = void 0;
14
+ const abort_js_1 = require("./helpers/abort.js");
15
+ const stringifyRedisValue = (value) => {
16
+ if (value === null || value === undefined) {
17
+ return "";
18
+ }
19
+ if (typeof value === "string") {
20
+ return value;
21
+ }
22
+ if (typeof value === "number" || typeof value === "boolean") {
23
+ return String(value);
24
+ }
25
+ try {
26
+ return JSON.stringify(value);
27
+ }
28
+ catch {
29
+ return String(value);
30
+ }
31
+ };
32
+ const buildRedisExecutor = (options) => async (input) => {
33
+ if (!input.resolvedCommands.length) {
34
+ return {
35
+ commandResults: [],
36
+ redisResult: null,
37
+ outputData: null,
38
+ failureMessage: "Redis node has no executable commands.",
39
+ };
40
+ }
41
+ const connection = await options.resolveConnection(input.node.data.config.connectionId);
42
+ const commandResults = [];
43
+ try {
44
+ const driverResults = await (0, abort_js_1.withAbortAndTimeout)(options.drivers.redisExecutor({
45
+ connection,
46
+ resolvedCommands: input.resolvedCommands,
47
+ }), options.nodeTimeoutMs, `Redis node ${input.stepId}`, input.signal);
48
+ for (const outcome of driverResults) {
49
+ commandResults.push({
50
+ success: true,
51
+ result: outcome.result,
52
+ resultText: stringifyRedisValue(outcome.result),
53
+ });
54
+ }
55
+ const redisResult = commandResults.length === 1
56
+ ? commandResults[0]?.result ?? null
57
+ : commandResults.map((entry) => entry.result);
58
+ return {
59
+ commandResults,
60
+ redisResult,
61
+ outputData: redisResult,
62
+ failureMessage: null,
63
+ };
64
+ }
65
+ catch (error) {
66
+ const message = error instanceof Error ? error.message : String(error);
67
+ commandResults.push({
68
+ success: false,
69
+ result: null,
70
+ resultText: "",
71
+ error: message,
72
+ });
73
+ return {
74
+ commandResults,
75
+ redisResult: null,
76
+ outputData: { commands: commandResults },
77
+ failureMessage: message || "Redis command failed.",
78
+ };
79
+ }
80
+ };
81
+ exports.buildRedisExecutor = buildRedisExecutor;
82
+ //# sourceMappingURL=redis-executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redis-executor.js","sourceRoot":"","sources":["../../../src/scenario-runner/adapters/redis-executor.ts"],"names":[],"mappings":"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"}