1import { chromium } from 'playwright' 6const healthgqlMemoH = new Map<string, {result: boolean | string, atMs: number}>() 9 var __healthallBatchCtx: {getStore: () => unknown} | undefined 12const isInBatchMode = () => { 14 const healthallMod = globalThis.__healthallBatchCtx 15 return healthallMod?.getStore() !== undefined 21const getMemoizedResult = (cacheKey: string): boolean | string | undefined => { 22 if (!isInBatchMode()) return undefined 23 const cached = healthgqlMemoH.get(cacheKey) 24 if (!cached) return undefined 25 if (Date.now() - cached.atMs > 60 * 1000) { 26 healthgqlMemoH.delete(cacheKey) 32const setMemoizedResult = (cacheKey: string, result: boolean | string) => { 33 if (!isInBatchMode()) return 34 healthgqlMemoH.set(cacheKey, { result, atMs: Date.now() }) 37const playwrightTimeoutMs = 30000 39export const doesMakeReqToGql = async (url: string, opts: {needleString?: string, expectNoErrors?: boolean, diagnostics?: Record<string, unknown>} = {}) => { 40 const { needleString, expectNoErrors = true, diagnostics } = opts 41 const cacheKey = `${url}|${needleString}|${expectNoErrors}` 42 const memoized = getMemoizedResult(cacheKey) 43 if (memoized !== undefined) { 48 let didMakeGqlRequest: boolean | string = false 49 let gqlRespHadError = false 50 let gqlRespErrSnip = '' 51 let gqlRequestSent = false 54 const browser = await chromium.launch() 57 const context = await browser.newContext() 58 const page = await context.newPage() 60 const pendingResponses: Promise<void>[] = [] 61 page.on('response', (response) => { 62 const responseUrl = response.url() 63 if (responseUrl.includes(apiGqlPath)) { 65 const handleResponse = async () => { 67 const gqlResponseBody = await response.text() 68 if (gqlResponseBody.includes('"errors"')) { 69 const isApqProtocol = gqlResponseBody.includes('PERSISTED_QUERY_NOT_FOUND') 70 || gqlResponseBody.includes('PERSISTED_QUERY_NOT_SUPPORTED') 72 gqlRespHadError = true 73 gqlRespErrSnip = gqlResponseBody.slice(0, 300) 77 if (gqlResponseBody.includes(needleString)) { 78 didMakeGqlRequest = needleString 81 didMakeGqlRequest = true 83 } catch (_ignoreRespReadErr) {} 85 pendingResponses.push(handleResponse()) 90 await page.goto(url, { timeout: playwrightTimeoutMs }) 91 await page.waitForLoadState('networkidle', { timeout: playwrightTimeoutMs }) 92 } catch (_ignoreNavErr) { 96 await Promise.all(pendingResponses) 99 const result = (expectNoErrors && gqlRespHadError) ? false : didMakeGqlRequest 100 if (diagnostics) Object.assign(diagnostics, {timedOut, gqlRequestSent, gqlRespHadError, gqlRespErrSnip}) 101 setMemoizedResult(cacheKey, result) 107 await browser.close()