{"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../../src/core/web-research/browser.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,eAAe;IAC/B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CAChE;AAED,qBAAa,yBAA0B,YAAW,eAAe;IAI/D,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,SAAS;IAJ3B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAE5B,YACkB,cAAc,EAAE,MAAM,GAAG,SAAS,EAClC,SAAS,EAAE,MAAM,EAGlC;IAEK,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAwCpE;CACD","sourcesContent":["import { chromium } from \"playwright-core\";\nimport { WebResearchError } from \"./types.js\";\n\nexport interface BrowserRenderer {\n\treadonly available: boolean;\n\trenderHtml(html: string, signal?: AbortSignal): Promise<string>;\n}\n\nexport class PlaywrightBrowserRenderer implements BrowserRenderer {\n\treadonly available: boolean;\n\n\tconstructor(\n\t\tprivate readonly executablePath: string | undefined,\n\t\tprivate readonly timeoutMs: number,\n\t) {\n\t\tthis.available = executablePath !== undefined;\n\t}\n\n\tasync renderHtml(html: string, signal?: AbortSignal): Promise<string> {\n\t\tif (!this.executablePath) {\n\t\t\tthrow new WebResearchError(\n\t\t\t\t\"BROWSER_UNAVAILABLE\",\n\t\t\t\t\"Rendered extraction requires JENSEN_PLAYWRIGHT_EXECUTABLE_PATH\",\n\t\t\t);\n\t\t}\n\t\tif (signal?.aborted) throw new WebResearchError(\"ABORTED\", \"Rendered extraction was aborted\");\n\t\tconst browser = await chromium.launch({\n\t\t\texecutablePath: this.executablePath,\n\t\t\theadless: true,\n\t\t\targs: [\"--disable-dev-shm-usage\", \"--disable-extensions\", \"--disable-background-networking\"],\n\t\t});\n\t\ttry {\n\t\t\tconst context = await browser.newContext({\n\t\t\t\tacceptDownloads: false,\n\t\t\t\tjavaScriptEnabled: true,\n\t\t\t\tserviceWorkers: \"block\",\n\t\t\t});\n\t\t\ttry {\n\t\t\t\tconst page = await context.newPage();\n\t\t\t\tpage.setDefaultTimeout(this.timeoutMs);\n\t\t\t\tpage.on(\"dialog\", (dialog) => void dialog.dismiss());\n\t\t\t\tawait page.route(\"**/*\", (route) => void route.abort(\"blockedbyclient\"));\n\t\t\t\tconst abort = () => void page.close().catch(() => undefined);\n\t\t\t\tsignal?.addEventListener(\"abort\", abort, { once: true });\n\t\t\t\ttry {\n\t\t\t\t\tawait page.setContent(html, { waitUntil: \"domcontentloaded\", timeout: this.timeoutMs });\n\t\t\t\t\tawait page.waitForTimeout(50);\n\t\t\t\t\tif (signal?.aborted) throw new WebResearchError(\"ABORTED\", \"Rendered extraction was aborted\");\n\t\t\t\t\treturn await page.content();\n\t\t\t\t} finally {\n\t\t\t\t\tsignal?.removeEventListener(\"abort\", abort);\n\t\t\t\t}\n\t\t\t} finally {\n\t\t\t\tawait context.close();\n\t\t\t}\n\t\t} finally {\n\t\t\tawait browser.close();\n\t\t}\n\t}\n}\n"]}