automation_model 1.0.767-dev → 1.0.767-stage
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/api.js +28 -11
- package/lib/api.js.map +1 -1
- package/lib/auto_page.js +66 -18
- package/lib/auto_page.js.map +1 -1
- package/lib/browser_manager.js +56 -32
- package/lib/browser_manager.js.map +1 -1
- package/lib/bruno.js.map +1 -1
- package/lib/check_performance.d.ts +1 -0
- package/lib/check_performance.js +57 -0
- package/lib/check_performance.js.map +1 -0
- package/lib/command_common.js +18 -1
- package/lib/command_common.js.map +1 -1
- package/lib/file_checker.js +136 -25
- package/lib/file_checker.js.map +1 -1
- package/lib/index.js +1 -0
- package/lib/index.js.map +1 -1
- package/lib/init_browser.d.ts +1 -2
- package/lib/init_browser.js +122 -126
- package/lib/init_browser.js.map +1 -1
- package/lib/locator_log.js.map +1 -1
- package/lib/network.d.ts +2 -0
- package/lib/network.js +398 -87
- package/lib/network.js.map +1 -1
- package/lib/route.d.ts +65 -15
- package/lib/route.js +539 -186
- package/lib/route.js.map +1 -1
- package/lib/scripts/axe.mini.js +23994 -1
- package/lib/snapshot_validation.js.map +1 -1
- package/lib/stable_browser.d.ts +11 -5
- package/lib/stable_browser.js +402 -81
- package/lib/stable_browser.js.map +1 -1
- package/lib/table_helper.js +14 -0
- package/lib/table_helper.js.map +1 -1
- package/lib/test_context.d.ts +1 -0
- package/lib/test_context.js +1 -0
- package/lib/test_context.js.map +1 -1
- package/lib/utils.d.ts +6 -2
- package/lib/utils.js +121 -14
- package/lib/utils.js.map +1 -1
- package/package.json +17 -10
package/lib/network.js
CHANGED
|
@@ -1,5 +1,62 @@
|
|
|
1
1
|
import path from "path";
|
|
2
2
|
import fs from "fs";
|
|
3
|
+
import { _stepNameToTemplate } from "./route.js";
|
|
4
|
+
import crypto from "crypto";
|
|
5
|
+
import { tmpdir } from "os";
|
|
6
|
+
import createDebug from "debug";
|
|
7
|
+
const debug = createDebug("automation_model:network");
|
|
8
|
+
class SaveQueue {
|
|
9
|
+
queue = [];
|
|
10
|
+
isProcessing = false;
|
|
11
|
+
maxRetries = 3;
|
|
12
|
+
async enqueueSave(current) {
|
|
13
|
+
this.queue.push({ current, retryCount: 0 });
|
|
14
|
+
if (!this.isProcessing) {
|
|
15
|
+
await this.processQueue();
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
async processQueue() {
|
|
19
|
+
this.isProcessing = true;
|
|
20
|
+
while (this.queue.length > 0) {
|
|
21
|
+
const item = this.queue.shift();
|
|
22
|
+
try {
|
|
23
|
+
await this.saveSafely(item.current);
|
|
24
|
+
}
|
|
25
|
+
catch (error) {
|
|
26
|
+
console.error(`Save failed for ${item.current ? "current" : "previous"} step:`, error);
|
|
27
|
+
// Retry logic
|
|
28
|
+
if (item.retryCount < this.maxRetries) {
|
|
29
|
+
item.retryCount++;
|
|
30
|
+
this.queue.unshift(item); // Put it back at the front
|
|
31
|
+
await new Promise((resolve) => setTimeout(resolve, 100 * item.retryCount)); // Exponential backoff
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
this.isProcessing = false;
|
|
36
|
+
}
|
|
37
|
+
async saveSafely(current) {
|
|
38
|
+
const stepHash = current ? executionState.currentStepHash : executionState.previousStepHash;
|
|
39
|
+
if (!stepHash)
|
|
40
|
+
return;
|
|
41
|
+
const file = path.join(detailedNetworkFolder, `${stepHash}.json`);
|
|
42
|
+
const entries = current
|
|
43
|
+
? Array.from(executionState.liveRequestsMap.values())
|
|
44
|
+
: Array.from(executionState.liveRequestsMapPrevious.values());
|
|
45
|
+
// Ensure all entries are JSON-serializable
|
|
46
|
+
const validEntries = entries.filter((entry) => {
|
|
47
|
+
try {
|
|
48
|
+
JSON.stringify(entry);
|
|
49
|
+
return true;
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
console.warn(`Skipping non-serializable entry: ${entry.requestId}`);
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
const jsonString = JSON.stringify(validEntries, null, 2);
|
|
57
|
+
await fs.promises.writeFile(file, jsonString, "utf8");
|
|
58
|
+
}
|
|
59
|
+
}
|
|
3
60
|
function _getNetworkFile(world = null, web = null, context = null) {
|
|
4
61
|
let networkFile = null;
|
|
5
62
|
if (world && world.reportFolder) {
|
|
@@ -43,17 +100,22 @@ function registerDownloadEvent(page, world, context) {
|
|
|
43
100
|
}
|
|
44
101
|
}
|
|
45
102
|
function registerNetworkEvents(world, web, context, page) {
|
|
103
|
+
// Map to hold request start times and IDs
|
|
46
104
|
const networkFile = _getNetworkFile(world, web, context);
|
|
47
105
|
function saveNetworkData() {
|
|
48
106
|
if (context && context.networkData) {
|
|
49
|
-
|
|
107
|
+
try {
|
|
108
|
+
fs.writeFileSync(networkFile, JSON.stringify(context.networkData, null, 2), "utf8");
|
|
109
|
+
}
|
|
110
|
+
catch (error) {
|
|
111
|
+
console.error("Error saving network data:", error);
|
|
112
|
+
}
|
|
50
113
|
}
|
|
51
114
|
}
|
|
52
115
|
if (!context) {
|
|
53
116
|
console.error("No context found to register network events");
|
|
54
117
|
return;
|
|
55
118
|
}
|
|
56
|
-
// Map to hold request start times and IDs
|
|
57
119
|
const requestTimes = new Map();
|
|
58
120
|
let requestIdCounter = 0;
|
|
59
121
|
if (page) {
|
|
@@ -62,115 +124,144 @@ function registerNetworkEvents(world, web, context, page) {
|
|
|
62
124
|
const networkData = context.networkData;
|
|
63
125
|
// Event listener for when a request is made
|
|
64
126
|
page.on("request", (request) => {
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
requestId,
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
page.on("response", async (response) => {
|
|
85
|
-
const request = response.request();
|
|
86
|
-
const requestId = request.requestId;
|
|
87
|
-
const receivedTime = Date.now();
|
|
88
|
-
// Find the corresponding data object
|
|
89
|
-
const data = networkData.find((item) => item.requestId === requestId);
|
|
90
|
-
if (data) {
|
|
91
|
-
data.status = response.status();
|
|
92
|
-
data.responseReceived = receivedTime;
|
|
127
|
+
try {
|
|
128
|
+
// console.log("Request started:", request.url());
|
|
129
|
+
const requestId = requestIdCounter++;
|
|
130
|
+
request.requestId = requestId; // Assign a unique ID to the request
|
|
131
|
+
handleRequest(request, context);
|
|
132
|
+
const startTime = Date.now();
|
|
133
|
+
requestTimes.set(requestId, startTime);
|
|
134
|
+
// Initialize data for this request
|
|
135
|
+
networkData.push({
|
|
136
|
+
requestId,
|
|
137
|
+
requestStart: startTime,
|
|
138
|
+
requestUrl: request.url(),
|
|
139
|
+
method: request.method(),
|
|
140
|
+
status: "Pending",
|
|
141
|
+
responseTime: null,
|
|
142
|
+
responseReceived: null,
|
|
143
|
+
responseEnd: null,
|
|
144
|
+
size: null,
|
|
145
|
+
});
|
|
93
146
|
saveNetworkData();
|
|
94
147
|
}
|
|
95
|
-
|
|
96
|
-
console.error("
|
|
148
|
+
catch (error) {
|
|
149
|
+
// console.error("Error handling request:", error);
|
|
97
150
|
}
|
|
98
151
|
});
|
|
99
|
-
// Event listener for when a
|
|
100
|
-
page.on("
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
try {
|
|
113
|
-
const body = await response.body();
|
|
114
|
-
data.size = body.length;
|
|
115
|
-
}
|
|
116
|
-
catch (e) {
|
|
117
|
-
data.size = 0;
|
|
152
|
+
// Event listener for when a response is received
|
|
153
|
+
page.on("response", async (response) => {
|
|
154
|
+
try {
|
|
155
|
+
const request = response.request();
|
|
156
|
+
const requestId = request.requestId;
|
|
157
|
+
const receivedTime = Date.now();
|
|
158
|
+
// await handleRequestFinishedOrFailed(request, false);
|
|
159
|
+
// Find the corresponding data object
|
|
160
|
+
const data = networkData.find((item) => item.requestId === requestId);
|
|
161
|
+
if (data) {
|
|
162
|
+
data.status = response.status();
|
|
163
|
+
data.responseReceived = receivedTime;
|
|
164
|
+
saveNetworkData();
|
|
118
165
|
}
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
domainLookupStart: 80.655,
|
|
122
|
-
domainLookupEnd: 80.668,
|
|
123
|
-
connectStart: 80.668,
|
|
124
|
-
secureConnectionStart: 106.688,
|
|
125
|
-
connectEnd: 129.69,
|
|
126
|
-
requestStart: 129.81,
|
|
127
|
-
responseStart: 187.006,
|
|
128
|
-
responseEnd: 188.209
|
|
129
|
-
*/
|
|
130
|
-
data.type = type;
|
|
131
|
-
data.domainLookupStart = timing.domainLookupStart;
|
|
132
|
-
data.domainLookupEnd = timing.domainLookupEnd;
|
|
133
|
-
data.connectStart = timing.connectStart;
|
|
134
|
-
data.secureConnectionStart = timing.secureConnectionStart;
|
|
135
|
-
data.connectEnd = timing.connectEnd;
|
|
136
|
-
data.requestStart = timing.requestStart;
|
|
137
|
-
data.responseStart = timing.responseStart;
|
|
138
|
-
data.responseEnd = timing.responseEnd;
|
|
139
|
-
saveNetworkData();
|
|
140
|
-
if (world && world.attach) {
|
|
141
|
-
world.attach(JSON.stringify(data), { mediaType: "application/json+network" });
|
|
166
|
+
else {
|
|
167
|
+
// console.error("No data found for request ID", requestId);
|
|
142
168
|
}
|
|
143
169
|
}
|
|
144
|
-
|
|
145
|
-
console.error("
|
|
170
|
+
catch (error) {
|
|
171
|
+
// console.error("Error handling response:", error);
|
|
146
172
|
}
|
|
147
173
|
});
|
|
148
|
-
// Event listener for when a request
|
|
149
|
-
page.on("
|
|
150
|
-
const requestId = request.requestId;
|
|
151
|
-
const endTime = Date.now();
|
|
152
|
-
const startTime = requestTimes.get(requestId);
|
|
174
|
+
// Event listener for when a request is finished
|
|
175
|
+
page.on("requestfinished", async (request) => {
|
|
153
176
|
try {
|
|
154
|
-
const
|
|
155
|
-
const
|
|
177
|
+
const requestId = request.requestId;
|
|
178
|
+
const endTime = Date.now();
|
|
179
|
+
const startTime = requestTimes.get(requestId);
|
|
180
|
+
await handleRequestFinishedOrFailed(request, false, context);
|
|
181
|
+
const response = await request.response();
|
|
182
|
+
const timing = request.timing();
|
|
156
183
|
// Find the corresponding data object
|
|
157
184
|
const data = networkData.find((item) => item.requestId === requestId);
|
|
158
185
|
if (data) {
|
|
159
186
|
data.responseEnd = endTime;
|
|
160
187
|
data.responseTime = endTime - startTime;
|
|
161
|
-
|
|
162
|
-
|
|
188
|
+
// Get response size
|
|
189
|
+
try {
|
|
190
|
+
let size = 0;
|
|
191
|
+
if (responseHasBody(response)) {
|
|
192
|
+
const buf = await response.body();
|
|
193
|
+
size = buf?.length ?? 0;
|
|
194
|
+
}
|
|
195
|
+
data.size = size;
|
|
196
|
+
}
|
|
197
|
+
catch {
|
|
198
|
+
data.size = 0;
|
|
199
|
+
}
|
|
200
|
+
const type = request.resourceType();
|
|
201
|
+
/*
|
|
202
|
+
domainLookupStart: 80.655,
|
|
203
|
+
domainLookupEnd: 80.668,
|
|
204
|
+
connectStart: 80.668,
|
|
205
|
+
secureConnectionStart: 106.688,
|
|
206
|
+
connectEnd: 129.69,
|
|
207
|
+
requestStart: 129.81,
|
|
208
|
+
responseStart: 187.006,
|
|
209
|
+
responseEnd: 188.209
|
|
210
|
+
*/
|
|
211
|
+
data.type = type;
|
|
212
|
+
data.domainLookupStart = timing.domainLookupStart;
|
|
213
|
+
data.domainLookupEnd = timing.domainLookupEnd;
|
|
214
|
+
data.connectStart = timing.connectStart;
|
|
215
|
+
data.secureConnectionStart = timing.secureConnectionStart;
|
|
216
|
+
data.connectEnd = timing.connectEnd;
|
|
217
|
+
data.requestStart = timing.requestStart;
|
|
218
|
+
data.responseStart = timing.responseStart;
|
|
219
|
+
data.responseEnd = timing.responseEnd;
|
|
163
220
|
saveNetworkData();
|
|
164
221
|
if (world && world.attach) {
|
|
165
222
|
world.attach(JSON.stringify(data), { mediaType: "application/json+network" });
|
|
166
223
|
}
|
|
167
224
|
}
|
|
168
225
|
else {
|
|
169
|
-
console.error("No data found for request ID", requestId);
|
|
226
|
+
// console.error("No data found for request ID", requestId);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
catch (error) {
|
|
230
|
+
// console.error("Error handling request finished:", error);
|
|
231
|
+
}
|
|
232
|
+
});
|
|
233
|
+
// Event listener for when a request fails
|
|
234
|
+
page.on("requestfailed", async (request) => {
|
|
235
|
+
try {
|
|
236
|
+
const requestId = request.requestId;
|
|
237
|
+
const endTime = Date.now();
|
|
238
|
+
const startTime = requestTimes.get(requestId);
|
|
239
|
+
await handleRequestFinishedOrFailed(request, true, context);
|
|
240
|
+
try {
|
|
241
|
+
const res = await request.response();
|
|
242
|
+
const statusCode = res ? res.status() : request.failure().errorText;
|
|
243
|
+
// Find the corresponding data object
|
|
244
|
+
const data = networkData.find((item) => item.requestId === requestId);
|
|
245
|
+
if (data) {
|
|
246
|
+
data.responseEnd = endTime;
|
|
247
|
+
data.responseTime = endTime - startTime;
|
|
248
|
+
data.status = statusCode;
|
|
249
|
+
data.size = 0;
|
|
250
|
+
saveNetworkData();
|
|
251
|
+
if (world && world.attach) {
|
|
252
|
+
world.attach(JSON.stringify(data), { mediaType: "application/json+network" });
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
else {
|
|
256
|
+
// console.error("No data found for request ID", requestId);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
catch (error) {
|
|
260
|
+
// ignore
|
|
170
261
|
}
|
|
171
262
|
}
|
|
172
263
|
catch (error) {
|
|
173
|
-
//
|
|
264
|
+
// console.error("Error handling request failed:", error);
|
|
174
265
|
}
|
|
175
266
|
});
|
|
176
267
|
}
|
|
@@ -179,5 +270,225 @@ function registerNetworkEvents(world, web, context, page) {
|
|
|
179
270
|
console.error("No page found to register network events");
|
|
180
271
|
}
|
|
181
272
|
}
|
|
273
|
+
async function appendEntryToStepFile(stepHash, entry) {
|
|
274
|
+
if (!stepHash)
|
|
275
|
+
return;
|
|
276
|
+
const debug = createDebug("network:appendEntryToStepFile");
|
|
277
|
+
const file = path.join(detailedNetworkFolder, `${stepHash}.json`);
|
|
278
|
+
debug("appending to step file:", file);
|
|
279
|
+
let data = [];
|
|
280
|
+
try {
|
|
281
|
+
/* read if it already exists */
|
|
282
|
+
const txt = await fs.promises.readFile(file, "utf8");
|
|
283
|
+
data = JSON.parse(txt);
|
|
284
|
+
}
|
|
285
|
+
catch {
|
|
286
|
+
/* ignore – file does not exist or cannot be parsed */
|
|
287
|
+
}
|
|
288
|
+
data.push(entry);
|
|
289
|
+
try {
|
|
290
|
+
debug("writing to step file:", file);
|
|
291
|
+
await fs.promises.writeFile(file, JSON.stringify(data, null, 2), "utf8");
|
|
292
|
+
}
|
|
293
|
+
catch (error) {
|
|
294
|
+
debug("Error writing to step file:", error);
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
const detailedNetworkFolder = path.join(tmpdir(), "blinq_network_events");
|
|
298
|
+
let outOfStep = true;
|
|
299
|
+
let timeoutId = null;
|
|
300
|
+
const executionState = {
|
|
301
|
+
currentStepHash: null,
|
|
302
|
+
previousStepHash: null,
|
|
303
|
+
liveRequestsMap: new Map(),
|
|
304
|
+
liveRequestsMapPrevious: new Map(),
|
|
305
|
+
};
|
|
306
|
+
const storeDetailedNetworkData = (context) => context && context.STORE_DETAILED_NETWORK_DATA === true;
|
|
307
|
+
export function networkBeforeStep(stepName, context) {
|
|
308
|
+
if (timeoutId) {
|
|
309
|
+
clearTimeout(timeoutId);
|
|
310
|
+
timeoutId = null;
|
|
311
|
+
}
|
|
312
|
+
outOfStep = false;
|
|
313
|
+
if (!storeDetailedNetworkData(context)) {
|
|
314
|
+
return;
|
|
315
|
+
}
|
|
316
|
+
// check if the folder exists, if not create it
|
|
317
|
+
if (!fs.existsSync(detailedNetworkFolder)) {
|
|
318
|
+
fs.mkdirSync(detailedNetworkFolder, { recursive: true });
|
|
319
|
+
}
|
|
320
|
+
// const stepHash = stepNameToHash(stepName);
|
|
321
|
+
let stepHash = "";
|
|
322
|
+
executionState.liveRequestsMapPrevious = executionState.liveRequestsMap;
|
|
323
|
+
executionState.liveRequestsMap = new Map();
|
|
324
|
+
stepHash = stepNameToHash(stepName);
|
|
325
|
+
executionState.previousStepHash = executionState.currentStepHash; // ➊ NEW
|
|
326
|
+
executionState.currentStepHash = stepHash;
|
|
327
|
+
// check if the file exists, if exists delete it
|
|
328
|
+
const networkFile = path.join(detailedNetworkFolder, `${stepHash}.json`);
|
|
329
|
+
try {
|
|
330
|
+
fs.rmSync(path.join(networkFile), { force: true });
|
|
331
|
+
}
|
|
332
|
+
catch (err) {
|
|
333
|
+
// Ignore error if file does not exist
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
const saveQueue = new SaveQueue();
|
|
337
|
+
async function saveMap(current) {
|
|
338
|
+
await saveQueue.enqueueSave(current);
|
|
339
|
+
}
|
|
340
|
+
export async function networkAfterStep(stepName, context) {
|
|
341
|
+
if (!storeDetailedNetworkData(context)) {
|
|
342
|
+
return;
|
|
343
|
+
}
|
|
344
|
+
//await new Promise((r) => setTimeout(r, 1000));
|
|
345
|
+
await saveMap(true);
|
|
346
|
+
/* reset for next step */
|
|
347
|
+
//executionState.previousStepHash = executionState.currentStepHash; // ➋ NEW
|
|
348
|
+
//executionState.liveRequestsMap.clear();
|
|
349
|
+
outOfStep = true;
|
|
350
|
+
// set a timer of 60 seconds to the outOfStep, after that it will be set to false so no network collection will happen
|
|
351
|
+
timeoutId = setTimeout(() => {
|
|
352
|
+
outOfStep = false;
|
|
353
|
+
context.STORE_DETAILED_NETWORK_DATA = false;
|
|
354
|
+
}, 60000);
|
|
355
|
+
}
|
|
356
|
+
function stepNameToHash(stepName) {
|
|
357
|
+
const templateName = _stepNameToTemplate(stepName);
|
|
358
|
+
// create hash from the template name
|
|
359
|
+
return crypto.createHash("sha256").update(templateName).digest("hex");
|
|
360
|
+
}
|
|
361
|
+
function handleRequest(request, context) {
|
|
362
|
+
const debug = createDebug("automation_model:network:handleRequest");
|
|
363
|
+
if (!storeDetailedNetworkData(context))
|
|
364
|
+
return;
|
|
365
|
+
const entry = {
|
|
366
|
+
requestId: request.requestId,
|
|
367
|
+
url: request.url(),
|
|
368
|
+
method: request.method(),
|
|
369
|
+
headers: request.headers(),
|
|
370
|
+
postData: request.postData(),
|
|
371
|
+
requestTimestamp: Date.now(),
|
|
372
|
+
stepHash: executionState.currentStepHash,
|
|
373
|
+
};
|
|
374
|
+
executionState.liveRequestsMap.set(request, entry);
|
|
375
|
+
debug("Request to", request.url(), "with", request.requestId, "added to current step map at", Date.now());
|
|
376
|
+
}
|
|
377
|
+
async function handleRequestFinishedOrFailed(request, failed, context) {
|
|
378
|
+
const debug = createDebug("automation_model:network:handleRequestFinishedOrFailed");
|
|
379
|
+
if (!storeDetailedNetworkData(context))
|
|
380
|
+
return;
|
|
381
|
+
const requestId = request.requestId;
|
|
382
|
+
debug("Request id in handleRequestFinishedOrFailed:", requestId, "at", Date.now());
|
|
383
|
+
// const response = await request.response(); // This may be null if the request failed
|
|
384
|
+
let entry = executionState.liveRequestsMap.get(request);
|
|
385
|
+
debug("Request entry found in current map:", entry?.requestId || false);
|
|
386
|
+
if (!entry) {
|
|
387
|
+
// check if the request is in the previous step's map
|
|
388
|
+
entry = executionState.liveRequestsMapPrevious.get(request);
|
|
389
|
+
debug("Request entry found in previous map:", entry?.requestId || false);
|
|
390
|
+
if (!entry) {
|
|
391
|
+
debug("No entry, creating fallback! for url:", request.url());
|
|
392
|
+
entry = {
|
|
393
|
+
requestId: request.requestId,
|
|
394
|
+
url: request.url(),
|
|
395
|
+
method: request.method?.() ?? "GET",
|
|
396
|
+
headers: request.headers?.() ?? {},
|
|
397
|
+
postData: request.postData?.() ?? undefined,
|
|
398
|
+
stepHash: executionState.previousStepHash ?? "unknown",
|
|
399
|
+
requestTimestamp: Date.now(),
|
|
400
|
+
};
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
// Remove the request from the live requests map
|
|
404
|
+
let respData;
|
|
405
|
+
// executionState.liveRequestsMap.delete(request);
|
|
406
|
+
if (failed) {
|
|
407
|
+
// Handle failed request
|
|
408
|
+
respData = {
|
|
409
|
+
status: null,
|
|
410
|
+
headers: {},
|
|
411
|
+
url: request.url(),
|
|
412
|
+
timestamp: Date.now(),
|
|
413
|
+
body: null,
|
|
414
|
+
contentType: null,
|
|
415
|
+
error: "Request failed",
|
|
416
|
+
};
|
|
417
|
+
}
|
|
418
|
+
else {
|
|
419
|
+
const response = await request.response();
|
|
420
|
+
const headers = response?.headers?.() || {};
|
|
421
|
+
let contentType = headers["content-type"] || null;
|
|
422
|
+
let body = null;
|
|
423
|
+
try {
|
|
424
|
+
if (responseHasBody(response)) {
|
|
425
|
+
if (contentType && contentType.includes("application/json")) {
|
|
426
|
+
body = JSON.parse(await response.text());
|
|
427
|
+
}
|
|
428
|
+
else if ((contentType && contentType.includes("text")) ||
|
|
429
|
+
(contentType && contentType.includes("application/csv"))) {
|
|
430
|
+
body = await response.text();
|
|
431
|
+
if (contentType.includes("application/csv"))
|
|
432
|
+
contentType = "text/csv";
|
|
433
|
+
}
|
|
434
|
+
else {
|
|
435
|
+
// If you want binary, you could read it here—but only when responseHasBody(response) is true
|
|
436
|
+
// const buffer = await response.body();
|
|
437
|
+
// body = buffer.toString("base64");
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
else {
|
|
441
|
+
// For redirects / no-body statuses, it's useful to keep redirect info
|
|
442
|
+
// e.g., include Location header if present
|
|
443
|
+
// body stays null
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
catch (err) {
|
|
447
|
+
console.error("Error reading response body:", err);
|
|
448
|
+
body = await response.text();
|
|
449
|
+
}
|
|
450
|
+
respData = {
|
|
451
|
+
status: response.status(),
|
|
452
|
+
headers,
|
|
453
|
+
url: response.url(),
|
|
454
|
+
timestamp: Date.now(),
|
|
455
|
+
body,
|
|
456
|
+
contentType,
|
|
457
|
+
};
|
|
458
|
+
}
|
|
459
|
+
if (executionState.liveRequestsMap.has(request)) {
|
|
460
|
+
/* “normal” path – keep it in the buffer */
|
|
461
|
+
entry.response = respData;
|
|
462
|
+
if (outOfStep && executionState.currentStepHash) {
|
|
463
|
+
await saveMap(true);
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
else {
|
|
467
|
+
if (executionState.liveRequestsMapPrevious.has(request)) {
|
|
468
|
+
entry.response = respData;
|
|
469
|
+
await saveMap(false);
|
|
470
|
+
}
|
|
471
|
+
else {
|
|
472
|
+
/* orphan response – append directly to the previous step file */
|
|
473
|
+
entry.response = respData;
|
|
474
|
+
await appendEntryToStepFile(entry.stepHash, entry); // ➍ NEW
|
|
475
|
+
}
|
|
476
|
+
}
|
|
477
|
+
entry.response = respData;
|
|
478
|
+
return;
|
|
479
|
+
}
|
|
480
|
+
function responseHasBody(response) {
|
|
481
|
+
if (!response)
|
|
482
|
+
return false;
|
|
483
|
+
const s = response.status?.() ?? 0;
|
|
484
|
+
// RFC 7231: 1xx, 204, 205, 304 have no body. Playwright: 3xx (redirect) body is unavailable.
|
|
485
|
+
if ((s >= 100 && s < 200) || s === 204 || s === 205 || s === 304 || (s >= 300 && s < 400))
|
|
486
|
+
return false;
|
|
487
|
+
// HEAD responses have no body by definition
|
|
488
|
+
const method = response.request?.().method?.() ?? "GET";
|
|
489
|
+
if (method === "HEAD")
|
|
490
|
+
return false;
|
|
491
|
+
return true;
|
|
492
|
+
}
|
|
182
493
|
export { registerNetworkEvents, registerDownloadEvent };
|
|
183
494
|
//# sourceMappingURL=network.js.map
|
package/lib/network.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"network.js","sourceRoot":"","sources":["../../src/network.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"network.js","sourceRoot":"","sources":["../../src/network.ts"],"names":[],"mappings":"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"}
|