function sleep(ms) { return new Promise((resolve) => setTimeout(resolve, ms)) } function logBrowserCookies({ domain, cookieName, cookies }) { console.log( `[cookie] Browser cookies before return for ${domain} (${cookieName}): ${JSON.stringify(cookies)}` ) } function buildCookieResponse({ cookieName, matchedCookie, userAgent, elapsedTime, cookies, includeCookies }) { const result = { cookie_name: matchedCookie?.name ?? cookieName, cookie_value: matchedCookie?.value ?? null, user_agent: userAgent, elapsed_time: elapsedTime, } if (matchedCookie) { result.cookie_domain = matchedCookie.domain result.cookie_path = matchedCookie.path result.http_only = matchedCookie.httpOnly result.secure = matchedCookie.secure } if (includeCookies) { result.cookies = cookies } return result } async function waitForCookie({ domain, proxy, cookieName, includeCookies }, page) { if (!domain) throw new Error("Missing domain parameter") if (!cookieName) throw new Error("Missing cookieName parameter") const timeout = global.timeOut || 60000 const pollInterval = 250 const startTime = Date.now() if (proxy?.username && proxy?.password) { await page.authenticate({ username: proxy.username, password: proxy.password, }) } await page.goto(domain, { waitUntil: "domcontentloaded" }) const userAgent = await page.evaluate(() => navigator.userAgent) while (Date.now() - startTime < timeout) { const cookies = await page.cookies() const match = cookies.find((cookie) => cookie.name === cookieName) if (match) { logBrowserCookies({ domain, cookieName, cookies }) return buildCookieResponse({ cookieName, matchedCookie: match, userAgent, elapsedTime: (Date.now() - startTime) / 1000, cookies, includeCookies, }) } await sleep(pollInterval) } const cookies = await page.cookies() logBrowserCookies({ domain, cookieName, cookies }) return buildCookieResponse({ cookieName, userAgent, elapsedTime: (Date.now() - startTime) / 1000, cookies, includeCookies, }) } module.exports = waitForCookie