Skip to content

Commit bf49de8

Browse files
Merge pull request #400 from Nick-1234531/DOT-6676
changes for Retry to fetch resources and accessToken fix for SSE connection
2 parents 779d311 + 2942e85 commit bf49de8

File tree

5 files changed

+52
-3
lines changed

5 files changed

+52
-3
lines changed

src/lib/processSnapshot.ts

Lines changed: 46 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,9 @@ const globalCache = new NodeCache({ stdTTL: 3600, checkperiod: 600 });
99
const MAX_RESOURCE_SIZE = 15 * (1024 ** 2); // 15MB
1010
var ALLOWED_RESOURCES = ['document', 'stylesheet', 'image', 'media', 'font', 'other'];
1111
const ALLOWED_STATUSES = [200, 201];
12-
const REQUEST_TIMEOUT = 1800000;
12+
const REQUEST_TIMEOUT = 180000;
1313
const MIN_VIEWPORT_HEIGHT = 1080;
14+
const MAX_WAIT_FOR_REQUEST_CALL = 30000;
1415

1516
const normalizeSameSite = (value) => {
1617
if (!value) return 'Lax';
@@ -312,6 +313,8 @@ export default async function processSnapshot(snapshot: Snapshot, ctx: Context):
312313
}
313314
}
314315

316+
const pendingRequests = new Set<string>();
317+
315318
// Use route to intercept network requests and discover resources
316319
await page.route('**/*', async (route, request) => {
317320
const requestUrl = request.url()
@@ -370,8 +373,14 @@ export default async function processSnapshot(snapshot: Snapshot, ctx: Context):
370373
body = globalCache.get(requestUrl).body;
371374
} else {
372375
ctx.log.debug(`Resource not found in cache or global cache ${requestUrl} fetching from server`);
376+
if(ctx.build.checkPendingRequests){
377+
pendingRequests.add(requestUrl);
378+
}
373379
response = await page.request.fetch(request, requestOptions);
374380
body = await response.body();
381+
if(ctx.build.checkPendingRequests){
382+
pendingRequests.delete(requestUrl);
383+
}
375384
}
376385

377386
// handle response
@@ -399,15 +408,26 @@ export default async function processSnapshot(snapshot: Snapshot, ctx: Context):
399408

400409
let responseOfRetry, bodyOfRetry
401410
ctx.log.debug(`Resource had a disallowed status ${requestUrl} fetching from server again`);
411+
if(ctx.build.checkPendingRequests){
412+
pendingRequests.add(requestUrl);
413+
}
402414
responseOfRetry = await page.request.fetch(request, requestOptions);
403415
bodyOfRetry = await responseOfRetry.body();
404-
416+
if(ctx.build.checkPendingRequests){
417+
pendingRequests.delete(requestUrl);
418+
}
405419
if (responseOfRetry && responseOfRetry.status() && ALLOWED_STATUSES.includes(responseOfRetry.status())) {
406420
ctx.log.debug(`Handling request after retry ${requestUrl}\n - content-type ${responseOfRetry.headers()['content-type']}`);
407421
cache[requestUrl] = {
408422
body: bodyOfRetry.toString('base64'),
409423
type: responseOfRetry.headers()['content-type']
410424
}
425+
if (ctx.config.useGlobalCache) {
426+
globalCache.set(requestUrl, {
427+
body: bodyOfRetry.toString('base64'),
428+
type: responseOfRetry.headers()['content-type']
429+
});
430+
}
411431
route.fulfill({
412432
status: responseOfRetry.status(),
413433
headers: responseOfRetry.headers(),
@@ -458,6 +478,7 @@ export default async function processSnapshot(snapshot: Snapshot, ctx: Context):
458478
}
459479
}
460480

481+
461482
// Continue the request with the fetched response
462483
route.fulfill({
463484
status: response.status(),
@@ -663,6 +684,7 @@ export default async function processSnapshot(snapshot: Snapshot, ctx: Context):
663684
} catch (error) {
664685
ctx.log.debug(`Network idle failed due to ${error}`);
665686
}
687+
666688

667689

668690
if (ctx.config.allowedAssets && ctx.config.allowedAssets.length) {
@@ -852,6 +874,28 @@ export default async function processSnapshot(snapshot: Snapshot, ctx: Context):
852874
ctx.log.debug(`Processed options: ${JSON.stringify(processedOptions)}`);
853875
}
854876

877+
// Wait for pending requests to complete
878+
const checkPending = async () => {
879+
let startTime = Date.now();
880+
ctx.log.debug(`${pendingRequests.size} Pending requests before wait for ${snapshot.name}: ${Array.from(pendingRequests)}`);
881+
while (pendingRequests.size > 0) {
882+
const elapsedTime = Date.now() - startTime;
883+
if (elapsedTime >= MAX_WAIT_FOR_REQUEST_CALL) {
884+
ctx.log.debug(`Timeout reached (${MAX_WAIT_FOR_REQUEST_CALL/1000}s). Stopping wait for pending requests.`);
885+
ctx.log.debug(`${pendingRequests.size} Pending requests after wait for ${snapshot.name}: ${Array.from(pendingRequests)}`);
886+
break;
887+
}
888+
await new Promise(resolve => setTimeout(resolve, 1000));
889+
}
890+
if(pendingRequests.size === 0) {
891+
ctx.log.debug(`No pending requests for ${snapshot.name}.`);
892+
}
893+
};
894+
895+
if (ctx.build.checkPendingRequests) {
896+
await checkPending();
897+
}
898+
855899

856900
let hasBrowserErrors = false;
857901
for (let browser in discoveryErrors.browsers) {

src/lib/utils.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -758,12 +758,14 @@ export async function listenToSmartUISSE(
758758
const abortController = new AbortController();
759759

760760
try {
761+
const cookieKey = baseURL === 'https://server-events.lambdatest.com' ? 'accessToken' : 'stageAccessToken';
762+
761763
const response = await fetch(url, {
762764
method: 'GET',
763765
headers: {
764766
'Accept': 'text/event-stream',
765767
'Cache-Control': 'no-cache',
766-
'Cookie': `stageAccessToken=Basic ${accessToken}`
768+
'Cookie': `${cookieKey}=Basic ${accessToken}`
767769
},
768770
signal: abortController.signal
769771
});

src/tasks/createBuild.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ export default (ctx: Context): ListrTask<Context, ListrRendererFactory, ListrRen
1818
url: resp.data.buildURL,
1919
baseline: resp.data.baseline,
2020
useKafkaFlow: resp.data.useKafkaFlow || false,
21+
checkPendingRequests: resp.data.checkPendingRequests || false,
2122
}
2223
process.env.SMARTUI_BUILD_ID = resp.data.buildId;
2324
process.env.SMARTUI_BUILD_NAME = resp.data.buildName;

src/tasks/createBuildExec.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ export default (ctx: Context): ListrTask<Context, ListrRendererFactory, ListrRen
2020
url: resp.data.buildURL,
2121
baseline: resp.data.baseline,
2222
useKafkaFlow: resp.data.useKafkaFlow || false,
23+
checkPendingRequests: resp.data.checkPendingRequests || false,
2324
}
2425
process.env.SMARTUI_BUILD_ID = resp.data.buildId;
2526
process.env.SMARTUI_BUILD_NAME = resp.data.buildName;

src/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,7 @@ export interface Build {
201201
useKafkaFlow: boolean;
202202
hasDiscoveryError: boolean;
203203
projectId?: string;
204+
checkPendingRequests: boolean;
204205
}
205206

206207
export interface WebConfig {

0 commit comments

Comments
 (0)