callman-core 1.3.0 → 1.5.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 (139) hide show
  1. package/dist/index.d.ts +1 -1
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +1 -1
  4. package/dist/index.js.map +1 -1
  5. package/dist/scenario-runner/adapters/connection-config.d.ts +34 -0
  6. package/dist/scenario-runner/adapters/connection-config.d.ts.map +1 -0
  7. package/dist/scenario-runner/adapters/connection-config.js +6 -0
  8. package/dist/scenario-runner/adapters/connection-config.js.map +1 -0
  9. package/dist/scenario-runner/adapters/db-executor.d.ts +4 -0
  10. package/dist/scenario-runner/adapters/db-executor.d.ts.map +1 -0
  11. package/dist/scenario-runner/adapters/db-executor.js +42 -0
  12. package/dist/scenario-runner/adapters/db-executor.js.map +1 -0
  13. package/dist/scenario-runner/adapters/helpers/abort.d.ts +4 -0
  14. package/dist/scenario-runner/adapters/helpers/abort.d.ts.map +1 -0
  15. package/dist/scenario-runner/adapters/helpers/abort.js +47 -0
  16. package/dist/scenario-runner/adapters/helpers/abort.js.map +1 -0
  17. package/dist/scenario-runner/adapters/helpers/failure-messages.d.ts +29 -0
  18. package/dist/scenario-runner/adapters/helpers/failure-messages.d.ts.map +1 -0
  19. package/dist/scenario-runner/adapters/helpers/failure-messages.js +64 -0
  20. package/dist/scenario-runner/adapters/helpers/failure-messages.js.map +1 -0
  21. package/dist/scenario-runner/adapters/helpers/mutations.d.ts +7 -0
  22. package/dist/scenario-runner/adapters/helpers/mutations.d.ts.map +1 -0
  23. package/dist/scenario-runner/adapters/helpers/mutations.js +28 -0
  24. package/dist/scenario-runner/adapters/helpers/mutations.js.map +1 -0
  25. package/dist/scenario-runner/adapters/helpers/request-helpers.d.ts +31 -0
  26. package/dist/scenario-runner/adapters/helpers/request-helpers.d.ts.map +1 -0
  27. package/dist/scenario-runner/adapters/helpers/request-helpers.js +247 -0
  28. package/dist/scenario-runner/adapters/helpers/request-helpers.js.map +1 -0
  29. package/dist/scenario-runner/adapters/helpers/response-shapes.d.ts +3 -0
  30. package/dist/scenario-runner/adapters/helpers/response-shapes.d.ts.map +1 -0
  31. package/dist/scenario-runner/adapters/helpers/response-shapes.js +32 -0
  32. package/dist/scenario-runner/adapters/helpers/response-shapes.js.map +1 -0
  33. package/dist/scenario-runner/adapters/helpers/templates.d.ts +2 -0
  34. package/dist/scenario-runner/adapters/helpers/templates.d.ts.map +1 -0
  35. package/dist/scenario-runner/adapters/helpers/templates.js +30 -0
  36. package/dist/scenario-runner/adapters/helpers/templates.js.map +1 -0
  37. package/dist/scenario-runner/adapters/index.d.ts +12 -0
  38. package/dist/scenario-runner/adapters/index.d.ts.map +1 -0
  39. package/dist/scenario-runner/adapters/index.js +30 -0
  40. package/dist/scenario-runner/adapters/index.js.map +1 -0
  41. package/dist/scenario-runner/adapters/kafka-executor.d.ts +4 -0
  42. package/dist/scenario-runner/adapters/kafka-executor.d.ts.map +1 -0
  43. package/dist/scenario-runner/adapters/kafka-executor.js +35 -0
  44. package/dist/scenario-runner/adapters/kafka-executor.js.map +1 -0
  45. package/dist/scenario-runner/adapters/notification-executor.d.ts +4 -0
  46. package/dist/scenario-runner/adapters/notification-executor.d.ts.map +1 -0
  47. package/dist/scenario-runner/adapters/notification-executor.js +67 -0
  48. package/dist/scenario-runner/adapters/notification-executor.js.map +1 -0
  49. package/dist/scenario-runner/adapters/redis-executor.d.ts +4 -0
  50. package/dist/scenario-runner/adapters/redis-executor.d.ts.map +1 -0
  51. package/dist/scenario-runner/adapters/redis-executor.js +78 -0
  52. package/dist/scenario-runner/adapters/redis-executor.js.map +1 -0
  53. package/dist/scenario-runner/adapters/request-executor.d.ts +4 -0
  54. package/dist/scenario-runner/adapters/request-executor.d.ts.map +1 -0
  55. package/dist/scenario-runner/adapters/request-executor.js +262 -0
  56. package/dist/scenario-runner/adapters/request-executor.js.map +1 -0
  57. package/dist/scenario-runner/adapters/script-executor.d.ts +4 -0
  58. package/dist/scenario-runner/adapters/script-executor.d.ts.map +1 -0
  59. package/dist/scenario-runner/adapters/script-executor.js +113 -0
  60. package/dist/scenario-runner/adapters/script-executor.js.map +1 -0
  61. package/dist/scenario-runner/adapters/types.d.ts +82 -0
  62. package/dist/scenario-runner/adapters/types.d.ts.map +1 -0
  63. package/dist/scenario-runner/adapters/types.js +9 -0
  64. package/dist/scenario-runner/adapters/types.js.map +1 -0
  65. package/dist/scenario-runner/index.d.ts +1 -0
  66. package/dist/scenario-runner/index.d.ts.map +1 -1
  67. package/dist/scenario-runner/index.js +1 -0
  68. package/dist/scenario-runner/index.js.map +1 -1
  69. package/dist/templating/counter-store.d.ts +7 -0
  70. package/dist/templating/counter-store.d.ts.map +1 -0
  71. package/dist/templating/counter-store.js +64 -0
  72. package/dist/templating/counter-store.js.map +1 -0
  73. package/dist/templating/generator-metadata.d.ts +5 -0
  74. package/dist/templating/generator-metadata.d.ts.map +1 -0
  75. package/dist/templating/generator-metadata.js +102 -0
  76. package/dist/templating/generator-metadata.js.map +1 -0
  77. package/dist/templating/index.d.ts +6 -0
  78. package/dist/templating/index.d.ts.map +1 -0
  79. package/dist/templating/index.js +11 -0
  80. package/dist/templating/index.js.map +1 -0
  81. package/dist/templating/random-generators.d.ts +10 -0
  82. package/dist/templating/random-generators.d.ts.map +1 -0
  83. package/dist/templating/random-generators.js +16 -0
  84. package/dist/templating/random-generators.js.map +1 -0
  85. package/dist/templating/template-engine.d.ts +14 -0
  86. package/dist/templating/template-engine.d.ts.map +1 -0
  87. package/dist/templating/template-engine.js +148 -0
  88. package/dist/templating/template-engine.js.map +1 -0
  89. package/dist/templating/types.d.ts +22 -0
  90. package/dist/templating/types.d.ts.map +1 -0
  91. package/dist/templating/types.js +10 -0
  92. package/dist/templating/types.js.map +1 -0
  93. package/dist-cjs/index.js +2 -4
  94. package/dist-cjs/index.js.map +1 -1
  95. package/dist-cjs/scenario-runner/adapters/connection-config.js +7 -0
  96. package/dist-cjs/scenario-runner/adapters/connection-config.js.map +1 -0
  97. package/dist-cjs/scenario-runner/adapters/db-executor.js +46 -0
  98. package/dist-cjs/scenario-runner/adapters/db-executor.js.map +1 -0
  99. package/dist-cjs/scenario-runner/adapters/helpers/abort.js +52 -0
  100. package/dist-cjs/scenario-runner/adapters/helpers/abort.js.map +1 -0
  101. package/dist-cjs/scenario-runner/adapters/helpers/failure-messages.js +69 -0
  102. package/dist-cjs/scenario-runner/adapters/helpers/failure-messages.js.map +1 -0
  103. package/dist-cjs/scenario-runner/adapters/helpers/mutations.js +32 -0
  104. package/dist-cjs/scenario-runner/adapters/helpers/mutations.js.map +1 -0
  105. package/dist-cjs/scenario-runner/adapters/helpers/request-helpers.js +263 -0
  106. package/dist-cjs/scenario-runner/adapters/helpers/request-helpers.js.map +1 -0
  107. package/dist-cjs/scenario-runner/adapters/helpers/response-shapes.js +36 -0
  108. package/dist-cjs/scenario-runner/adapters/helpers/response-shapes.js.map +1 -0
  109. package/dist-cjs/scenario-runner/adapters/helpers/templates.js +34 -0
  110. package/dist-cjs/scenario-runner/adapters/helpers/templates.js.map +1 -0
  111. package/dist-cjs/scenario-runner/adapters/index.js +40 -0
  112. package/dist-cjs/scenario-runner/adapters/index.js.map +1 -0
  113. package/dist-cjs/scenario-runner/adapters/kafka-executor.js +39 -0
  114. package/dist-cjs/scenario-runner/adapters/kafka-executor.js.map +1 -0
  115. package/dist-cjs/scenario-runner/adapters/notification-executor.js +71 -0
  116. package/dist-cjs/scenario-runner/adapters/notification-executor.js.map +1 -0
  117. package/dist-cjs/scenario-runner/adapters/redis-executor.js +82 -0
  118. package/dist-cjs/scenario-runner/adapters/redis-executor.js.map +1 -0
  119. package/dist-cjs/scenario-runner/adapters/request-executor.js +266 -0
  120. package/dist-cjs/scenario-runner/adapters/request-executor.js.map +1 -0
  121. package/dist-cjs/scenario-runner/adapters/script-executor.js +117 -0
  122. package/dist-cjs/scenario-runner/adapters/script-executor.js.map +1 -0
  123. package/dist-cjs/scenario-runner/adapters/types.js +10 -0
  124. package/dist-cjs/scenario-runner/adapters/types.js.map +1 -0
  125. package/dist-cjs/scenario-runner/index.js +1 -0
  126. package/dist-cjs/scenario-runner/index.js.map +1 -1
  127. package/dist-cjs/templating/counter-store.js +72 -0
  128. package/dist-cjs/templating/counter-store.js.map +1 -0
  129. package/dist-cjs/templating/generator-metadata.js +105 -0
  130. package/dist-cjs/templating/generator-metadata.js.map +1 -0
  131. package/dist-cjs/templating/index.js +35 -0
  132. package/dist-cjs/templating/index.js.map +1 -0
  133. package/dist-cjs/templating/random-generators.js +28 -0
  134. package/dist-cjs/templating/random-generators.js.map +1 -0
  135. package/dist-cjs/templating/template-engine.js +155 -0
  136. package/dist-cjs/templating/template-engine.js.map +1 -0
  137. package/dist-cjs/templating/types.js +11 -0
  138. package/dist-cjs/templating/types.js.map +1 -0
  139. package/package.json +1 -1
@@ -0,0 +1,247 @@
1
+ // Helpers shared by the request executor: response shape coercion,
2
+ // auth header injection, body resolution, header utilities, JSON parsing,
3
+ // failure normalization. All lifted from
4
+ // p_man_backend/src/modules/scenario-runner/adapters/runtime-adapters.ts
5
+ // (lines 113-413) and reworked to be Node-agnostic — `Buffer` calls
6
+ // rewritten using `TextEncoder` and a pure base64 encoder so the helpers
7
+ // run in the browser/renderer too.
8
+ const BASE64_CHARS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
9
+ const encodeBase64 = (bytes) => {
10
+ let output = "";
11
+ const length = bytes.length;
12
+ for (let index = 0; index < length; index += 3) {
13
+ const b0 = bytes[index];
14
+ const b1 = index + 1 < length ? bytes[index + 1] : 0;
15
+ const b2 = index + 2 < length ? bytes[index + 2] : 0;
16
+ const triplet = (b0 << 16) | (b1 << 8) | b2;
17
+ output += BASE64_CHARS[(triplet >> 18) & 0x3f];
18
+ output += BASE64_CHARS[(triplet >> 12) & 0x3f];
19
+ output += index + 1 < length ? BASE64_CHARS[(triplet >> 6) & 0x3f] : "=";
20
+ output += index + 2 < length ? BASE64_CHARS[triplet & 0x3f] : "=";
21
+ }
22
+ return output;
23
+ };
24
+ const utf8Encode = (input) => new TextEncoder().encode(input);
25
+ const utf8ByteLength = (input) => utf8Encode(input).length;
26
+ export const isJsonLike = (value) => {
27
+ const trimmed = value.trim();
28
+ return trimmed.startsWith("{") || trimmed.startsWith("[");
29
+ };
30
+ export const safeJsonParse = (value) => {
31
+ try {
32
+ return JSON.parse(value);
33
+ }
34
+ catch {
35
+ return null;
36
+ }
37
+ };
38
+ export const normalizeHeaderPairs = (headers) => Object.entries(headers).map(([key, value]) => ({ key, value }));
39
+ export const findHeader = (headers, name) => {
40
+ const normalizedName = name.toLowerCase();
41
+ return (Object.entries(headers).find(([key]) => key.toLowerCase() === normalizedName)?.[1] ?? "");
42
+ };
43
+ export const normalizeCookies = (headers) => {
44
+ const cookieHeader = findHeader(headers, "set-cookie");
45
+ if (!cookieHeader.trim()) {
46
+ return [];
47
+ }
48
+ return cookieHeader
49
+ .split(/\s*,\s*(?=[^;,]+?=)/)
50
+ .map((entry) => entry.trim())
51
+ .filter(Boolean);
52
+ };
53
+ export const normalizeResponseValue = (value) => {
54
+ if (typeof value === "string") {
55
+ return value;
56
+ }
57
+ if (value === null || value === undefined) {
58
+ return "";
59
+ }
60
+ try {
61
+ return JSON.stringify(value, null, 2);
62
+ }
63
+ catch {
64
+ return String(value);
65
+ }
66
+ };
67
+ // Apply pre-script auth (bearer / basic / apikey) to the mutable request
68
+ // state. `resolveValue` is supplied by the caller — typically a thin
69
+ // wrapper around `resolveScenarioTemplateString` so auth values can use
70
+ // `{{var}}` substitution.
71
+ export const applyAuthToRequest = (request, auth, resolveValue) => {
72
+ if (!auth || auth.type === "none") {
73
+ return;
74
+ }
75
+ if (auth.type === "bearer") {
76
+ request.headers.push({
77
+ key: "Authorization",
78
+ value: `Bearer ${resolveValue(auth.bearerToken)}`,
79
+ enabled: true,
80
+ });
81
+ return;
82
+ }
83
+ if (auth.type === "basic") {
84
+ const username = resolveValue(auth.basicUsername);
85
+ const password = resolveValue(auth.basicPassword);
86
+ request.headers.push({
87
+ key: "Authorization",
88
+ value: `Basic ${encodeBase64(utf8Encode(`${username}:${password}`))}`,
89
+ enabled: true,
90
+ });
91
+ return;
92
+ }
93
+ if (auth.type === "apikey") {
94
+ const key = resolveValue(auth.apiKeyKey);
95
+ if (!key.trim()) {
96
+ return;
97
+ }
98
+ const value = resolveValue(auth.apiKeyValue);
99
+ const target = auth.apiKeyLocation === "query" ? request.query : request.headers;
100
+ target.push({ key, value, enabled: true });
101
+ }
102
+ };
103
+ export const resolveRequestBody = (request, helpers, templateValues) => {
104
+ if (request.body.mode === "none") {
105
+ return undefined;
106
+ }
107
+ if (request.body.mode === "raw") {
108
+ const raw = request.body.raw ?? "";
109
+ if (!raw.trim()) {
110
+ return "";
111
+ }
112
+ if (isJsonLike(raw)) {
113
+ const validationCandidate = helpers.replaceScenarioTemplateTokensForJsonValidation(raw);
114
+ if (safeJsonParse(validationCandidate) !== null) {
115
+ const resolvedJson = helpers.resolveScenarioJsonTemplateString(raw, templateValues);
116
+ const parsedJson = safeJsonParse(resolvedJson);
117
+ if (parsedJson !== null) {
118
+ return parsedJson;
119
+ }
120
+ }
121
+ }
122
+ return helpers.resolveScenarioTemplateString(raw, templateValues);
123
+ }
124
+ return Object.fromEntries(request.body.formEntries
125
+ .filter((entry) => entry.enabled !== false && entry.key.trim())
126
+ .map((entry) => [
127
+ helpers.resolveScenarioTemplateString(entry.key, templateValues),
128
+ helpers.resolveScenarioTemplateString(entry.value, templateValues),
129
+ ]));
130
+ };
131
+ // Build the script-shaped request state from a node config (initial state
132
+ // for pre-request scripts and ongoing mutation tracking).
133
+ export const createRequestStateFromNode = (node) => ({
134
+ method: node.data.config.method,
135
+ url: node.data.config.url,
136
+ headers: (node.data.config.headers ?? []).map((entry) => ({
137
+ key: entry.key,
138
+ value: entry.value,
139
+ enabled: entry.enabled ?? true,
140
+ })),
141
+ query: (node.data.config.query ?? []).map((entry) => ({
142
+ key: entry.key,
143
+ value: entry.value,
144
+ enabled: entry.enabled ?? true,
145
+ })),
146
+ body: {
147
+ mode: node.data.config.body.mode,
148
+ raw: node.data.config.body.raw,
149
+ formEntries: (node.data.config.body.formEntries ?? []).map((entry) => ({
150
+ key: entry.key,
151
+ value: entry.value,
152
+ enabled: entry.enabled ?? true,
153
+ })),
154
+ },
155
+ });
156
+ // Final normalization step before the HTTP call: apply auth, resolve all
157
+ // templates, drop disabled entries. Returns a plain executable shape
158
+ // (records, not key/value pair arrays) suitable for direct driver use.
159
+ export const normalizeRequestForExecution = (request, auth, helpers, templateValues) => {
160
+ const mutableRequest = {
161
+ method: request.method,
162
+ url: request.url,
163
+ headers: request.headers.map((entry) => ({ ...entry })),
164
+ query: request.query.map((entry) => ({ ...entry })),
165
+ body: {
166
+ mode: request.body.mode,
167
+ raw: request.body.raw,
168
+ formEntries: request.body.formEntries.map((entry) => ({ ...entry })),
169
+ },
170
+ };
171
+ applyAuthToRequest(mutableRequest, auth, (value) => helpers.resolveScenarioTemplateString(value, templateValues));
172
+ const headers = Object.fromEntries(mutableRequest.headers
173
+ .filter((entry) => entry.enabled !== false && entry.key.trim())
174
+ .map((entry) => [
175
+ helpers.resolveScenarioTemplateString(entry.key, templateValues),
176
+ helpers.resolveScenarioTemplateString(entry.value, templateValues),
177
+ ]));
178
+ const query = Object.fromEntries(mutableRequest.query
179
+ .filter((entry) => entry.enabled !== false && entry.key.trim())
180
+ .map((entry) => [
181
+ helpers.resolveScenarioTemplateString(entry.key, templateValues),
182
+ helpers.resolveScenarioTemplateString(entry.value, templateValues),
183
+ ]));
184
+ return {
185
+ method: helpers
186
+ .resolveScenarioTemplateString(mutableRequest.method, templateValues)
187
+ .trim()
188
+ .toUpperCase(),
189
+ url: helpers.resolveScenarioTemplateString(mutableRequest.url, templateValues),
190
+ headers,
191
+ query,
192
+ body: resolveRequestBody(mutableRequest, helpers, templateValues),
193
+ };
194
+ };
195
+ export const normalizeExecuteRequestFailure = (error) => ({
196
+ status: 0,
197
+ data: {
198
+ error: error instanceof Error ? error.message : String(error),
199
+ },
200
+ headers: {},
201
+ duration: 0,
202
+ });
203
+ export const toRequestResponse = (executionResult) => {
204
+ const bodyJson = executionResult.data && typeof executionResult.data === "object"
205
+ ? executionResult.data
206
+ : typeof executionResult.data === "string"
207
+ ? safeJsonParse(executionResult.data)
208
+ : null;
209
+ const bodyText = normalizeResponseValue(executionResult.data);
210
+ const cookies = normalizeCookies(executionResult.headers);
211
+ const contentType = findHeader(executionResult.headers, "content-type");
212
+ return {
213
+ ok: executionResult.status >= 200 && executionResult.status < 400,
214
+ status: executionResult.status,
215
+ statusText: executionResult.status === 0 ? "Request Error" : "",
216
+ durationMs: executionResult.duration,
217
+ sizeBytes: utf8ByteLength(bodyText),
218
+ headers: normalizeHeaderPairs(executionResult.headers),
219
+ cookies,
220
+ contentType,
221
+ bodyText,
222
+ bodyJson,
223
+ kafkaResult: null,
224
+ redisResult: null,
225
+ cancelled: false,
226
+ errorMessage: executionResult.status === 0 &&
227
+ executionResult.data &&
228
+ typeof executionResult.data === "object" &&
229
+ "error" in executionResult.data
230
+ ? String(executionResult.data.error ?? "Request failed")
231
+ : undefined,
232
+ };
233
+ };
234
+ export const toRequestScriptResponse = (response) => ({
235
+ ok: response.ok,
236
+ status: response.status,
237
+ statusText: response.statusText,
238
+ headers: Object.fromEntries(response.headers.map((entry) => [entry.key, entry.value])),
239
+ body: response.bodyJson ?? response.bodyText,
240
+ jsonBody: response.bodyJson,
241
+ rawBody: response.bodyText,
242
+ contentType: response.contentType,
243
+ durationMs: response.durationMs,
244
+ sizeBytes: response.sizeBytes,
245
+ cookies: [...response.cookies],
246
+ });
247
+ //# 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,3 @@
1
+ import type { ScenarioRequestResponse } from "../../types.js";
2
+ export declare const buildResponseRoot: (response: ScenarioRequestResponse) => Record<string, unknown>;
3
+ //# sourceMappingURL=response-shapes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response-shapes.d.ts","sourceRoot":"","sources":["../../../../src/scenario-runner/adapters/helpers/response-shapes.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AAK9D,eAAO,MAAM,iBAAiB,GAAI,UAAU,uBAAuB,KAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAmB3F,CAAC"}
@@ -0,0 +1,32 @@
1
+ // Build the response template root object used by downstream nodes
2
+ // (template substitution, condition evaluation). Lifted from
3
+ // p_man_backend's `buildResponseRoot` (line 167). The shape preserves
4
+ // what the existing scenario template engine expects:
5
+ // - top-level fields from JSON body (spread)
6
+ // - `data` resolved from body.data when present, else parsed body
7
+ // - `body`, `rawBody`, `text` for body access variants
8
+ // - `status`, `statusText`, `headers` (record form), `cookies`,
9
+ // `durationMs`
10
+ //
11
+ // Pure transformation — used by both the request executor and any node
12
+ // that needs to expose a request response to subsequent nodes.
13
+ const isPlainObject = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
14
+ export const buildResponseRoot = (response) => {
15
+ const responsePayload = response.bodyJson ?? response.bodyText;
16
+ const responseData = isPlainObject(response.bodyJson) && "data" in response.bodyJson
17
+ ? response.bodyJson.data
18
+ : responsePayload;
19
+ return {
20
+ ...(isPlainObject(response.bodyJson) ? response.bodyJson : {}),
21
+ data: responseData,
22
+ body: responsePayload,
23
+ rawBody: response.bodyText,
24
+ text: response.bodyText,
25
+ status: response.status,
26
+ statusText: response.statusText,
27
+ headers: Object.fromEntries(response.headers.map((entry) => [entry.key, entry.value])),
28
+ cookies: Object.fromEntries(response.cookies.map((value) => ["set-cookie", value])),
29
+ durationMs: response.durationMs,
30
+ };
31
+ };
32
+ //# 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;AAEvE,MAAM,CAAC,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"}
@@ -0,0 +1,2 @@
1
+ export declare const resolveScenarioScriptTemplatesDeep: (value: unknown, templateValues: Record<string, string>, resolveValue: (input: string, values: Record<string, string>) => string, seen?: WeakSet<object>) => unknown;
2
+ //# sourceMappingURL=templates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../../../src/scenario-runner/adapters/helpers/templates.ts"],"names":[],"mappings":"AAaA,eAAO,MAAM,kCAAkC,GAC7C,OAAO,OAAO,EACd,gBAAgB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACtC,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,MAAM,EACvE,OAAM,OAAO,CAAC,MAAM,CAAyB,KAC5C,OAsBF,CAAC"}
@@ -0,0 +1,30 @@
1
+ // Deep template resolver for scenario script return values, mutation
2
+ // values, and any nested unknown payload that may carry `{{token}}`
3
+ // strings. Lifted from backend's `resolveScenarioScriptTemplatesDeep`
4
+ // (runtime-adapters.ts:1154).
5
+ //
6
+ // Pure recursion with cycle detection via WeakSet so caller-supplied
7
+ // objects cannot trigger infinite loops. The caller passes the actual
8
+ // resolver (typically `resolveScenarioTemplateString` from
9
+ // `templateResolver.ts`) so this helper stays runtime-agnostic.
10
+ const isObject = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
11
+ export const resolveScenarioScriptTemplatesDeep = (value, templateValues, resolveValue, seen = new WeakSet()) => {
12
+ if (typeof value === "string") {
13
+ return resolveValue(value, templateValues);
14
+ }
15
+ if (Array.isArray(value)) {
16
+ return value.map((entry) => resolveScenarioScriptTemplatesDeep(entry, templateValues, resolveValue, seen));
17
+ }
18
+ if (!isObject(value)) {
19
+ return value;
20
+ }
21
+ if (seen.has(value)) {
22
+ return value;
23
+ }
24
+ seen.add(value);
25
+ return Object.fromEntries(Object.entries(value).map(([key, entryValue]) => [
26
+ key,
27
+ resolveScenarioScriptTemplatesDeep(entryValue, templateValues, resolveValue, seen),
28
+ ]));
29
+ };
30
+ //# 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;AAEvE,MAAM,CAAC,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,kCAAkC,CAAC,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,kCAAkC,CAAC,UAAU,EAAE,cAAc,EAAE,YAAY,EAAE,IAAI,CAAC;KACnF,CAAC,CACH,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { ScenarioRuntimeAdapters } from "../types.js";
2
+ import type { ScenarioRuntimeAdapterFactoryOptions } from "./types.js";
3
+ export declare const buildScenarioRuntimeAdapters: (options: ScenarioRuntimeAdapterFactoryOptions) => ScenarioRuntimeAdapters;
4
+ export { buildDbExecutor } from "./db-executor.js";
5
+ export { buildKafkaExecutor } from "./kafka-executor.js";
6
+ export { buildNotificationExecutor } from "./notification-executor.js";
7
+ export { buildRedisExecutor } from "./redis-executor.js";
8
+ export { buildRequestExecutor } from "./request-executor.js";
9
+ export { buildScriptExecutor } from "./script-executor.js";
10
+ export type { DatabaseExecuteInput, DatabaseExecuteResult, HttpExecuteInput, HttpExecuteResult, KafkaCaptureInput, KafkaCaptureOutcome, RedisCommandOutcome, RedisExecuteInput, RedisExecuteResult, ScenarioConnectionProvider, ScenarioConnectionRuntime, ScenarioConnectionType, ScenarioRuntimeAdapterDrivers, ScenarioRuntimeAdapterFactoryOptions, } from "./types.js";
11
+ export type { ConnectionRuntimeConfig, DatabaseConnectionConfig, DatabaseConnectionMode, KafkaConnectionConfig, NotificationConnectionConfig, RedisConnectionConfig, } from "./connection-config.js";
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/scenario-runner/adapters/index.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAS3D,OAAO,KAAK,EAAE,oCAAoC,EAAE,MAAM,YAAY,CAAC;AAEvE,eAAO,MAAM,4BAA4B,GACvC,SAAS,oCAAoC,KAC5C,uBAQD,CAAC;AAGH,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAE3D,YAAY,EACV,oBAAoB,EACpB,qBAAqB,EACrB,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EACjB,mBAAmB,EACnB,mBAAmB,EACnB,iBAAiB,EACjB,kBAAkB,EAClB,0BAA0B,EAC1B,yBAAyB,EACzB,sBAAsB,EACtB,6BAA6B,EAC7B,oCAAoC,GACrC,MAAM,YAAY,CAAC;AAEpB,YAAY,EACV,uBAAuB,EACvB,wBAAwB,EACxB,sBAAsB,EACtB,qBAAqB,EACrB,4BAA4B,EAC5B,qBAAqB,GACtB,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,30 @@
1
+ // Public surface for scenario runtime adapter orchestration.
2
+ //
3
+ // `buildScenarioRuntimeAdapters(options)` returns a fully wired
4
+ // `ScenarioRuntimeAdapters` instance suitable for passing to
5
+ // `runScenario(...)`. Hosts (backend / electron / future CLI) supply
6
+ // driver callbacks via `options.drivers` for the I/O-heavy executors
7
+ // (HTTP, DB, Redis, Kafka). Script + notification executors default to
8
+ // canonical core implementations but can be overridden.
9
+ import { buildDbExecutor } from "./db-executor.js";
10
+ import { buildKafkaExecutor } from "./kafka-executor.js";
11
+ import { buildNotificationExecutor } from "./notification-executor.js";
12
+ import { buildRedisExecutor } from "./redis-executor.js";
13
+ import { buildRequestExecutor } from "./request-executor.js";
14
+ import { buildScriptExecutor } from "./script-executor.js";
15
+ export const buildScenarioRuntimeAdapters = (options) => ({
16
+ requestExecutor: buildRequestExecutor(options),
17
+ dbExecutor: buildDbExecutor(options),
18
+ redisExecutor: buildRedisExecutor(options),
19
+ kafkaExecutor: buildKafkaExecutor(options),
20
+ scriptExecutor: options.scriptExecutor ?? buildScriptExecutor(options),
21
+ notificationExecutor: options.notificationExecutor ?? buildNotificationExecutor(options),
22
+ });
23
+ // Re-exports so callers don't have to import from sibling files.
24
+ export { buildDbExecutor } from "./db-executor.js";
25
+ export { buildKafkaExecutor } from "./kafka-executor.js";
26
+ export { buildNotificationExecutor } from "./notification-executor.js";
27
+ export { buildRedisExecutor } from "./redis-executor.js";
28
+ export { buildRequestExecutor } from "./request-executor.js";
29
+ export { buildScriptExecutor } from "./script-executor.js";
30
+ //# 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,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAI3D,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAC1C,OAA6C,EACpB,EAAE,CAAC,CAAC;IAC7B,eAAe,EAAE,oBAAoB,CAAC,OAAO,CAAC;IAC9C,UAAU,EAAE,eAAe,CAAC,OAAO,CAAC;IACpC,aAAa,EAAE,kBAAkB,CAAC,OAAO,CAAC;IAC1C,aAAa,EAAE,kBAAkB,CAAC,OAAO,CAAC;IAC1C,cAAc,EAAE,OAAO,CAAC,cAAc,IAAI,mBAAmB,CAAC,OAAO,CAAC;IACtE,oBAAoB,EAClB,OAAO,CAAC,oBAAoB,IAAI,yBAAyB,CAAC,OAAO,CAAC;CACrE,CAAC,CAAC;AAEH,iEAAiE;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { ScenarioKafkaExecutionInput, ScenarioKafkaExecutionResult } from "../types.js";
2
+ import type { ScenarioRuntimeAdapterFactoryOptions } from "./types.js";
3
+ export declare const buildKafkaExecutor: (options: ScenarioRuntimeAdapterFactoryOptions) => (input: ScenarioKafkaExecutionInput) => Promise<ScenarioKafkaExecutionResult>;
4
+ //# sourceMappingURL=kafka-executor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kafka-executor.d.ts","sourceRoot":"","sources":["../../../src/scenario-runner/adapters/kafka-executor.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAEV,2BAA2B,EAC3B,4BAA4B,EAC7B,MAAM,aAAa,CAAC;AAErB,OAAO,KAAK,EAAE,oCAAoC,EAAE,MAAM,YAAY,CAAC;AAOvE,eAAO,MAAM,kBAAkB,GAC7B,SAAS,oCAAoC,MAEtC,OAAO,2BAA2B,KAAG,OAAO,CAAC,4BAA4B,CA2B/E,CAAC"}
@@ -0,0 +1,35 @@
1
+ // Canonical Kafka executor — orchestrates a standalone Kafka scenario node.
2
+ // (Request-prefetch Kafka capture is handled inside request-executor.ts
3
+ // where it is composed with the HTTP call.)
4
+ //
5
+ // The actual Kafka consumer + matcher logic lives in the host-supplied
6
+ // `kafkaExecutor` driver (kafkajs or equivalent). We resolve the
7
+ // connection, validate the topic, and delegate.
8
+ const KAFKA_DEFAULT_CAPTURE_TIMEOUT_MS = 5000;
9
+ const buildKafkaCaptureTimeoutMs = (nodeTimeoutMs) => Math.min(nodeTimeoutMs, KAFKA_DEFAULT_CAPTURE_TIMEOUT_MS);
10
+ export const buildKafkaExecutor = (options) => async (input) => {
11
+ const topic = input.resolvedTopic.trim();
12
+ const timeoutMs = buildKafkaCaptureTimeoutMs(options.nodeTimeoutMs);
13
+ if (!topic) {
14
+ const captureResult = {
15
+ topic: "",
16
+ durationMs: 0,
17
+ timeoutMs,
18
+ messages: [],
19
+ timeline: [],
20
+ isListening: false,
21
+ timedOut: false,
22
+ errorMessage: "Kafka topic is required",
23
+ };
24
+ return { captureResult };
25
+ }
26
+ const connection = await options.resolveConnection(input.node.data.config.connectionId);
27
+ const outcome = await options.drivers.kafkaExecutor({
28
+ connection,
29
+ topic,
30
+ matcher: input.matcher,
31
+ timeoutMs,
32
+ });
33
+ return { captureResult: outcome.capture };
34
+ };
35
+ //# 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;AAE5D,MAAM,CAAC,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"}
@@ -0,0 +1,4 @@
1
+ import type { ScenarioNotificationExecutionInput, ScenarioNotificationExecutionResult } from "../types.js";
2
+ import type { ScenarioRuntimeAdapterFactoryOptions } from "./types.js";
3
+ export declare const buildNotificationExecutor: (options: ScenarioRuntimeAdapterFactoryOptions) => (input: ScenarioNotificationExecutionInput) => Promise<ScenarioNotificationExecutionResult>;
4
+ //# sourceMappingURL=notification-executor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notification-executor.d.ts","sourceRoot":"","sources":["../../../src/scenario-runner/adapters/notification-executor.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EACV,kCAAkC,EAClC,mCAAmC,EACpC,MAAM,aAAa,CAAC;AAGrB,OAAO,KAAK,EAAE,oCAAoC,EAAE,MAAM,YAAY,CAAC;AA6DvE,eAAO,MAAM,yBAAyB,GACpC,SAAS,oCAAoC,MAG3C,OAAO,kCAAkC,KACxC,OAAO,CAAC,mCAAmC,CA6B7C,CAAC"}
@@ -0,0 +1,67 @@
1
+ // Canonical notification executor — orchestrates a single Notification
2
+ // scenario node. Resolves the connection, posts the rendered delivery
3
+ // request to the Slack webhook URL via native `fetch`, wraps the result.
4
+ //
5
+ // Slack is the only provider supported today. Adding more providers
6
+ // (email, Discord, etc.) goes in this file as additional dispatchers
7
+ // keyed off `connection.provider`.
8
+ import { withAbortAndTimeout } from "./helpers/abort.js";
9
+ const NOTIFICATION_HARD_TIMEOUT_MS = 10_000;
10
+ const isNotificationConfig = (config) => typeof config === "object" &&
11
+ config !== null &&
12
+ "webhookUrl" in config &&
13
+ typeof config.webhookUrl === "string";
14
+ const sendSlackWebhook = async (config, request, timeoutMs) => {
15
+ const response = await new Promise((resolve, reject) => {
16
+ const timer = setTimeout(() => {
17
+ reject(new Error(`Notification request timed out after ${timeoutMs}ms`));
18
+ }, timeoutMs);
19
+ fetch(config.webhookUrl, {
20
+ method: "POST",
21
+ headers: request.headers,
22
+ body: JSON.stringify(request.body),
23
+ }).then((value) => {
24
+ clearTimeout(timer);
25
+ resolve(value);
26
+ }, (error) => {
27
+ clearTimeout(timer);
28
+ reject(error);
29
+ });
30
+ });
31
+ const bodyText = await response.text();
32
+ return {
33
+ delivered: response.ok,
34
+ responseMeta: {
35
+ status: response.status,
36
+ statusText: response.statusText || null,
37
+ bodyText: bodyText || null,
38
+ },
39
+ failureMessage: response.ok
40
+ ? null
41
+ : bodyText || `Slack webhook rejected the message with status ${response.status}`,
42
+ };
43
+ };
44
+ export const buildNotificationExecutor = (options) => async (input) => {
45
+ const connection = await options.resolveConnection(input.node.data.config.connectionId);
46
+ if (!isNotificationConfig(connection.config)) {
47
+ throw new Error("Notification connection is missing webhookUrl");
48
+ }
49
+ const config = connection.config;
50
+ const timeoutMs = Math.min(options.nodeTimeoutMs, NOTIFICATION_HARD_TIMEOUT_MS);
51
+ const deliveryResult = await withAbortAndTimeout(sendSlackWebhook(config, input.deliveryRequest, timeoutMs), timeoutMs, `Notification node ${input.stepId}`, input.signal);
52
+ const outputData = {
53
+ delivered: deliveryResult.delivered,
54
+ provider: input.deliveryRequest.provider,
55
+ severity: input.deliveryRequest.severity,
56
+ channel: input.deliveryRequest.channel ?? config.defaultChannel ?? null,
57
+ messagePreview: input.deliveryRequest.messagePreview,
58
+ responseMeta: deliveryResult.responseMeta,
59
+ };
60
+ return {
61
+ ...outputData,
62
+ responseMeta: deliveryResult.responseMeta,
63
+ outputData,
64
+ failureMessage: deliveryResult.failureMessage,
65
+ };
66
+ };
67
+ //# 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,4 @@
1
+ import type { ScenarioRedisExecutionInput, ScenarioRedisExecutionResult } from "../types.js";
2
+ import type { ScenarioRuntimeAdapterFactoryOptions } from "./types.js";
3
+ export declare const buildRedisExecutor: (options: ScenarioRuntimeAdapterFactoryOptions) => (input: ScenarioRedisExecutionInput) => Promise<ScenarioRedisExecutionResult>;
4
+ //# sourceMappingURL=redis-executor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redis-executor.d.ts","sourceRoot":"","sources":["../../../src/scenario-runner/adapters/redis-executor.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAEV,2BAA2B,EAC3B,4BAA4B,EAC7B,MAAM,aAAa,CAAC;AAGrB,OAAO,KAAK,EAAE,oCAAoC,EAAE,MAAM,YAAY,CAAC;AAmBvE,eAAO,MAAM,kBAAkB,GAC7B,SAAS,oCAAoC,MAEtC,OAAO,2BAA2B,KAAG,OAAO,CAAC,4BAA4B,CA0D/E,CAAC"}
@@ -0,0 +1,78 @@
1
+ // Canonical Redis executor — orchestrates a single Redis scenario node.
2
+ // Loops the resolved command list through the host-supplied
3
+ // `redisExecutor` driver, aggregates per-command outcomes, and unwraps
4
+ // to a single scalar result when the node has only one command.
5
+ //
6
+ // Host driver responsibilities:
7
+ // - establish the Redis client (host owns ioredis or equivalent)
8
+ // - run each command, capture timing + raw result
9
+ // - propagate connection-level errors as throws
10
+ // - close the client when done
11
+ import { withAbortAndTimeout } from "./helpers/abort.js";
12
+ const stringifyRedisValue = (value) => {
13
+ if (value === null || value === undefined) {
14
+ return "";
15
+ }
16
+ if (typeof value === "string") {
17
+ return value;
18
+ }
19
+ if (typeof value === "number" || typeof value === "boolean") {
20
+ return String(value);
21
+ }
22
+ try {
23
+ return JSON.stringify(value);
24
+ }
25
+ catch {
26
+ return String(value);
27
+ }
28
+ };
29
+ export const buildRedisExecutor = (options) => async (input) => {
30
+ if (!input.resolvedCommands.length) {
31
+ return {
32
+ commandResults: [],
33
+ redisResult: null,
34
+ outputData: null,
35
+ failureMessage: "Redis node has no executable commands.",
36
+ };
37
+ }
38
+ const connection = await options.resolveConnection(input.node.data.config.connectionId);
39
+ const commandResults = [];
40
+ try {
41
+ const driverResults = await withAbortAndTimeout(options.drivers.redisExecutor({
42
+ connection,
43
+ resolvedCommands: input.resolvedCommands,
44
+ }), options.nodeTimeoutMs, `Redis node ${input.stepId}`, input.signal);
45
+ for (const outcome of driverResults) {
46
+ commandResults.push({
47
+ success: true,
48
+ result: outcome.result,
49
+ resultText: stringifyRedisValue(outcome.result),
50
+ });
51
+ }
52
+ const redisResult = commandResults.length === 1
53
+ ? commandResults[0]?.result ?? null
54
+ : commandResults.map((entry) => entry.result);
55
+ return {
56
+ commandResults,
57
+ redisResult,
58
+ outputData: redisResult,
59
+ failureMessage: null,
60
+ };
61
+ }
62
+ catch (error) {
63
+ const message = error instanceof Error ? error.message : String(error);
64
+ commandResults.push({
65
+ success: false,
66
+ result: null,
67
+ resultText: "",
68
+ error: message,
69
+ });
70
+ return {
71
+ commandResults,
72
+ redisResult: null,
73
+ outputData: { commands: commandResults },
74
+ failureMessage: message || "Redis command failed.",
75
+ };
76
+ }
77
+ };
78
+ //# sourceMappingURL=redis-executor.js.map