( page: Page, budgetMs: number, netSet: Set<string>, )
| 349 | */ |
| 350 | // fallow-ignore-next-line complexity |
| 351 | async function sampleVideoDom( |
| 352 | page: Page, |
| 353 | budgetMs: number, |
| 354 | netSet: Set<string>, |
| 355 | ): Promise<VideoDescriptor[]> { |
| 356 | const seen = new Map<string, VideoDescriptor>(); |
| 357 | const start = Date.now(); |
| 358 | let stale = 0; |
| 359 | while (Date.now() - start < budgetMs && stale < 3) { |
| 360 | let grew = false; |
| 361 | const netBefore = netSet.size; |
| 362 | for (const d of await scanVideoDom(page)) { |
| 363 | if (!seen.has(d.src)) { |
| 364 | seen.set(d.src, d); |
| 365 | grew = true; |
| 366 | } |
| 367 | } |
| 368 | if (netSet.size > netBefore) grew = true; |
| 369 | stale = grew ? 0 : stale + 1; |
| 370 | await new Promise((r) => setTimeout(r, 2000)); |
| 371 | } |
| 372 | return [...seen.values()]; |
| 373 | } |
| 374 | |
| 375 | /** |
| 376 | * Capture video element manifest — screenshot each <video> element, extract |
no test coverage detected