@grabbit-labs/dynafetch 0.1.3 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../dynafetch-core/src/index.ts", "../../../src/phantom/execute.ts", "../../../src/phantom/transform.ts", "../../dynafetch-core/src/net/worker-client.ts", "../../../src/phantom/phantom-proxy.ts", "../../../src/phantom/headers.ts", "../../../src/phantom/matcher.ts", "../../../src/phantom/script-policy.ts", "../../../src/phantom/harvest.ts", "../../../src/phantom/errors.ts", "../../../src/phantom/module-prefetch.ts", "../../dynafetch-core/src/detect.ts", "../../dynafetch-core/src/planner.ts"],
4
+ "sourcesContent": ["import * as net from \"node:net\";\nimport { Executor } from \"../../../src/phantom/execute.ts\";\nimport { Harvester } from \"../../../src/phantom/harvest.ts\";\nimport type { ExecutionError } from \"../../../src/phantom/types.ts\";\nimport { detectFramework } from \"./detect\";\nimport { dynafetchNetBatchFetch, dynafetchNetFetch, dynafetchNetHealth, withDynafetchSession } from \"./net/worker-client\";\nimport { planDynafetch } from \"./planner\";\nimport type { DynafetchOptions, DynafetchPlan, DynafetchProxyConfig, DynafetchProxyScope, DynafetchResult } from \"./types\";\n\nexport type {\n DynafetchFramework,\n DynafetchOptions,\n DynafetchPlan,\n DynafetchProxyConfig,\n DynafetchProxyScope,\n DynafetchResult,\n DynafetchStrategy,\n} from \"./types\";\n\nexport {\n detectFramework,\n dynafetchNetBatchFetch,\n dynafetchNetFetch,\n dynafetchNetHealth,\n planDynafetch,\n withDynafetchSession,\n};\n\nclass DynafetchInputError extends Error {\n status: number;\n\n constructor(message: string, status = 400) {\n super(message);\n this.name = \"DynafetchInputError\";\n this.status = status;\n }\n}\n\nfunction isPrivateOrLocalHost(hostname: string): boolean {\n const h = hostname.toLowerCase();\n if (h === \"localhost\" || h.endsWith(\".localhost\") || h === \"0.0.0.0\") return true;\n if (h === \"metadata.google.internal\") return true;\n\n const ipVer = net.isIP(h);\n if (!ipVer) return false;\n\n if (ipVer === 4) {\n const [a, b] = h.split(\".\").map((x) => Number(x));\n if (a === 10) return true;\n if (a === 127) return true;\n if (a === 0) return true;\n if (a === 169 && b === 254) return true;\n if (a === 172 && b >= 16 && b <= 31) return true;\n if (a === 192 && b === 168) return true;\n return false;\n }\n\n if (h === \"::1\") return true;\n if (h.startsWith(\"fe80:\")) return true;\n if (h.startsWith(\"fc\") || h.startsWith(\"fd\")) return true;\n return false;\n}\n\nexport type NormalizedProxy = {\n url: string;\n scopes: Set<DynafetchProxyScope>;\n};\n\nfunction normalizeProxy(input?: DynafetchProxyConfig): NormalizedProxy | undefined {\n if (!input) return undefined;\n if (typeof input === \"string\") {\n const url = input.trim();\n if (!url) return undefined;\n return { url, scopes: new Set([\"page\", \"api\", \"assets\"]) };\n }\n const url = input.url?.trim();\n if (!url) return undefined;\n const scopes = input.only?.length\n ? new Set<DynafetchProxyScope>(input.only)\n : new Set<DynafetchProxyScope>([\"page\", \"api\", \"assets\"]);\n return { url, scopes };\n}\n\nfunction normalizeCookies(input: DynafetchOptions[\"cookies\"]): string[] {\n if (!input) return [];\n if (typeof input === \"string\") {\n return input\n .split(\";\")\n .map((part) => part.trim())\n .filter(Boolean);\n }\n if (Array.isArray(input)) {\n return input.map((value) => value.trim()).filter(Boolean);\n }\n return Object.entries(input).map(([key, value]) => `${key}=${value}`);\n}\n\nfunction normalizeOptions(input: string | DynafetchOptions): DynafetchOptions {\n const options = typeof input === \"string\" ? { url: input } : input;\n if (!options?.url) {\n throw new DynafetchInputError(\"URL is required\");\n }\n\n let parsedUrl: URL;\n try {\n parsedUrl = new URL(options.url);\n } catch {\n throw new DynafetchInputError(\"Invalid URL\");\n }\n\n if (parsedUrl.protocol !== \"http:\" && parsedUrl.protocol !== \"https:\") {\n throw new DynafetchInputError(\"Only http(s) URLs are allowed\");\n }\n if (isPrivateOrLocalHost(parsedUrl.hostname)) {\n throw new DynafetchInputError(\"Refusing to fetch local/private addresses\");\n }\n\n return {\n ...options,\n url: parsedUrl.toString(),\n allowJsdomFallback: options.allowJsdomFallback !== false,\n browserProfile: options.browserProfile?.trim() || \"chrome_146\",\n prefetchExternalScripts: options.prefetchExternalScripts !== false,\n prefetchModulePreloads: options.prefetchModulePreloads !== false,\n thirdPartyPolicy: options.thirdPartyPolicy ?? \"skip-noncritical\",\n };\n}\n\nfunction toWarnings(plan: DynafetchPlan, errors: ExecutionError[] | undefined, options: DynafetchOptions): string[] {\n const warnings = [plan.reason];\n\n if (plan.strategy === \"jsdom-fallback\" || plan.strategy === \"framework-probe\") {\n warnings.push(\"runtime execution used the legacy JSDOM-based renderer while lightweight adapters are still being built\");\n }\n if (options.maxSubrequests) {\n warnings.push(`maxSubrequests is advisory in the current implementation (${options.maxSubrequests})`);\n }\n if (options.thirdPartyPolicy === \"skip-noncritical\") {\n warnings.push(\"non-critical third-party scripts are skipped on the critical render path\");\n }\n if (errors?.length) {\n for (const error of errors.slice(0, 3)) {\n warnings.push(`${error.source}: ${error.message}`);\n }\n }\n return warnings;\n}\n\nfunction computeConfidence(params: {\n plan: DynafetchPlan;\n initialStateCount: number;\n executionErrors: number;\n htmlLength: number;\n}): number {\n let confidence = params.plan.strategy === \"static-html\" ? 0.92 : 0.68;\n\n if (params.plan.framework !== \"generic-spa\" && params.plan.framework !== \"static\") {\n confidence += 0.08;\n }\n if (params.initialStateCount > 0) {\n confidence += 0.06;\n }\n if (params.plan.strategy === \"jsdom-fallback\") {\n confidence -= 0.08;\n }\n if (params.htmlLength < 256) {\n confidence -= 0.1;\n }\n\n confidence -= Math.min(0.28, params.executionErrors * 0.07);\n return Math.max(0.05, Math.min(0.98, Number(confidence.toFixed(2))));\n}\n\n/**\n * Fetch a URL with full browser emulation \u2014 Chrome TLS fingerprinting,\n * JavaScript execution, and network interception \u2014 then return the\n * rendered HTML and metadata.\n *\n * Uses Chrome 146 headers by default. Any headers you provide are merged\n * on top \u2014 your values override the defaults, everything else stays.\n *\n * @example\n * ```ts\n * // Minimal \u2014 just a URL\n * const page = await dynafetch(\"https://example.com\");\n *\n * // With custom headers, cookies, and proxy\n * const page = await dynafetch({\n * url: \"https://example.com\",\n * headers: { \"Accept-Language\": \"fr-FR\" },\n * cookies: { session: \"abc123\" },\n * proxy: \"http://user:pass@ip:port\",\n * });\n *\n * // Smart proxy \u2014 only proxy the HTML page and API calls\n * const page = await dynafetch({\n * url: \"https://example.com\",\n * proxy: { url: \"http://user:pass@ip:port\", only: [\"page\", \"api\"] },\n * });\n *\n * // Tune quiescence \u2014 how long to wait for the page to settle\n * const page = await dynafetch({\n * url: \"https://example.com\",\n * maxWaitMs: 3000, // wait up to 3s for async requests to finish\n * idleWaitMs: 150, // 150ms of silence = page is settled\n * });\n * ```\n *\n * **Options at a glance:**\n *\n * | Option | Default | Description |\n * |---|---|---|\n * | `headers` | Chrome 146 | Merged on top of defaults \u2014 yours override on conflict |\n * | `cookies` | none | String, array, or `Record<string, string>` |\n * | `proxy` | none | `\"http://user:pass@ip:port\"` or `{ url, only: [\"page\",\"api\",\"assets\"] }` |\n * | `minWaitMs` | `75` | Min ms before checking if page is idle |\n * | `idleWaitMs` | `100` | Ms of zero pending requests = settled |\n * | `maxWaitMs` | `2000` | Hard cap on wait time regardless of activity |\n * | `moduleWaitMs` | `6000` | Max ms for ES module bundling (esbuild) |\n * | `timeoutMs` | none | Overall timeout for the entire operation |\n * | `thirdPartyPolicy` | `\"skip-noncritical\"` | Skip analytics/ads/chat scripts |\n *\n * **Proxy scopes** \u2014 when using `{ url, only }`:\n * - `\"page\"` \u2014 initial HTML document fetch\n * - `\"api\"` \u2014 fetch() and XHR calls from page scripts\n * - `\"assets\"` \u2014 JS scripts, ES modules, static resources\n *\n * **Speed presets:**\n * - Fast: `{ maxWaitMs: 1000, idleWaitMs: 50 }`\n * - Thorough: `{ maxWaitMs: 5000, idleWaitMs: 200 }`\n */\nexport async function dynafetch(input: string | DynafetchOptions): Promise<DynafetchResult> {\n const options = normalizeOptions(input);\n const timeoutSeconds = options.timeoutMs ? Math.max(1, Math.ceil(options.timeoutMs / 1000)) : undefined;\n const initialCookies = normalizeCookies(options.cookies);\n const proxy = normalizeProxy(options.proxy);\n\n return await withDynafetchSession(\n {\n browserProfile: options.browserProfile,\n timeoutSeconds,\n proxy: proxy?.url,\n },\n async () => {\n const totalStart = Date.now();\n const harvestStart = Date.now();\n const harvester = new Harvester(options.url, {\n prefetchExternalScripts: options.prefetchExternalScripts,\n prefetchModulePreloads: options.prefetchModulePreloads,\n requestHeaders: options.headers,\n initialCookies,\n thirdPartyPolicy: options.thirdPartyPolicy,\n proxy,\n });\n const harvest = await harvester.harvest();\n const harvestMs = Date.now() - harvestStart;\n\n const framework = detectFramework(harvest);\n const plan = planDynafetch(framework, harvest, options.allowJsdomFallback !== false);\n\n let html = harvest.html;\n let requestCount = harvest.logs.length;\n let executionErrors: ExecutionError[] | undefined;\n let executeMs = 0;\n let quiescenceMs = 0;\n let scriptsTransformed = 0;\n\n if (plan.strategy !== \"static-html\") {\n const executeStart = Date.now();\n const executor = new Executor(harvest, {\n thirdPartyPolicy: options.thirdPartyPolicy,\n quiescence: {\n minWaitMs: options.minWaitMs,\n idleWaitMs: options.idleWaitMs,\n maxWaitMs: options.maxWaitMs,\n },\n moduleWaitMs: options.moduleWaitMs,\n proxy,\n });\n const execution = await executor.execute();\n executeMs = Date.now() - executeStart;\n html = execution.renderedHtml ?? harvest.html;\n requestCount = execution.logs.length;\n executionErrors = execution.errors;\n quiescenceMs = execution.timings?.quiescence_ms ?? 0;\n scriptsTransformed = execution.timings?.scripts_transformed_count ?? 0;\n }\n\n const totalMs = Date.now() - totalStart;\n const warnings = toWarnings(plan, executionErrors, options);\n const confidence = computeConfidence({\n plan,\n initialStateCount: Object.keys(harvest.initialState).length,\n executionErrors: executionErrors?.length ?? 0,\n htmlLength: html.length,\n });\n\n return {\n url: options.url,\n finalUrl: harvest.url,\n status: harvest.status,\n html,\n framework,\n strategy: plan.strategy,\n confidence,\n warnings,\n timings: {\n total: totalMs,\n harvest: harvestMs,\n execute: executeMs,\n quiescence: quiescenceMs,\n scriptsTransformed,\n },\n requestCount,\n };\n },\n );\n}\n\nexport { DynafetchInputError };\n", "import { JSDOM, VirtualConsole, CookieJar } from 'jsdom';\nimport WebSocket from 'ws';\nimport * as nodeCrypto from 'crypto';\nimport type { HarvestResult, ExecutionResult, NetworkLogEntry, ScriptAsset } from './types.ts';\nimport { Transformer } from './transform.ts';\nimport { phantomFetch } from './phantom-proxy.ts';\nimport type { ProxyRequest, ProxyResponse } from './phantom-proxy.ts';\nimport { chromeDocumentHeaders, chromeSubresourceHeaders } from './headers.ts';\nimport { compileMatcher, type CompiledMatcher } from './matcher.ts';\nimport { shouldSkipDynamicScriptUrl, shouldSkipScriptAsset, type ThirdPartyPolicy } from './script-policy.ts';\n\nexport interface QuiescenceOptions {\n minWaitMs?: number;\n idleWaitMs?: number;\n maxWaitMs?: number;\n}\n\ninterface NormalizedProxy {\n url: string;\n scopes: Set<string>;\n}\n\nexport interface ExecutorOptions {\n targetValue?: string | number | null;\n matcherRegex?: boolean;\n findAll?: boolean; // false = early exit on first match (default, faster)\n fuzzyMatch?: boolean; // true = case-insensitive matching (default)\n quiescence?: QuiescenceOptions;\n moduleWaitMs?: number;\n thirdPartyPolicy?: ThirdPartyPolicy;\n proxy?: NormalizedProxy;\n}\n\ntype ExecutionError = {\n source: 'error' | 'unhandledrejection' | 'uncaughtException' | 'unhandledRejection';\n message: string;\n stack?: string;\n};\n\nexport class Executor {\n private harvestData: HarvestResult;\n private transformer: Transformer;\n private logs: NetworkLogEntry[] = [];\n private targetValue: string | number | null = null;\n private matcherRegex: boolean = false;\n private compiledMatcher: CompiledMatcher | null = null;\n private scriptCache: Map<string, string> = new Map();\n private initialComponentName: string | null = null;\n private pendingRequests: number = 0;\n private pendingRequestNextId: number = 1;\n private pendingRequestMap = new Map<number, { url?: string; kind?: string; startedAt: number }>();\n private pendingTasks: number = 0;\n private pendingTaskNextId: number = 1;\n private pendingTaskTimers = new Map<number, NodeJS.Timeout>();\n private quiescenceResolver: (() => void) | null = null;\n private quiescenceTimer: NodeJS.Timeout | null = null;\n private quiescenceMaxTimer: NodeJS.Timeout | null = null;\n private quiescenceMinTimer: NodeJS.Timeout | null = null;\n private minifyBundle: boolean = false;\n\n // Module-script support (JSDOM does not execute <script type=\"module\">).\n private handledModuleScriptUrls = new Set<string>();\n // JSDOM won't fetch/execute external scripts unless resources are enabled. We instead\n // intercept dynamic <script src=\"...\"> insertions and fetch+eval them ourselves.\n private handledClassicScriptUrls = new Set<string>();\n private moduleBundleCache = new Map<string, string>(); // entryUrl -> transformed bundled JS\n private moduleResolveCache = new Map<string, { contents: string; loader: \"js\" | \"ts\" }>(); // url -> source\n private moduleInFlight = new Map<string, Promise<void>>(); // entryUrl -> promise\n private windowClosed: boolean = false;\n\n // Simple telemetry counters (useful for debugging).\n private telemetry_stubbed = 0;\n private telemetry_proxy = 0;\n private moduleWaitMs: number = 1500;\n private quiescenceOptions: Required<QuiescenceOptions> = {\n minWaitMs: 200,\n idleWaitMs: 250,\n maxWaitMs: 5000,\n };\n\n private timings = {\n transform_ms_total: 0,\n scripts_transformed_count: 0,\n quiescence_ms: 0,\n };\n\n private executionErrors: ExecutionError[] = [];\n private thirdPartyPolicy: ThirdPartyPolicy = 'skip-noncritical';\n private proxy?: NormalizedProxy;\n\n // Early exit tracking\n private findAll: boolean = false;\n private fuzzyMatch: boolean = true;\n private earlyMatches: NetworkLogEntry[] = [];\n private matchFound: boolean = false;\n \n constructor(harvestData: HarvestResult, options: ExecutorOptions | string | number | null = null) {\n this.harvestData = harvestData;\n this.transformer = new Transformer();\n \n // Support legacy signature: new Executor(data, targetValue)\n if (options === null || typeof options === 'string' || typeof options === 'number') {\n this.targetValue = options;\n } else {\n this.targetValue = options.targetValue ?? null;\n this.matcherRegex = options.matcherRegex === true;\n this.findAll = options.findAll ?? false;\n this.fuzzyMatch = options.fuzzyMatch ?? true;\n this.thirdPartyPolicy = options.thirdPartyPolicy ?? 'skip-noncritical';\n this.proxy = options.proxy;\n this.applyDefaults(options.quiescence, options.moduleWaitMs);\n }\n \n if (this.targetValue !== null && this.targetValue !== undefined) {\n const rawMatcher = String(this.targetValue);\n if (rawMatcher.length > 0) {\n this.compiledMatcher = compileMatcher({\n matcher: rawMatcher,\n matcherRegex: this.matcherRegex,\n fuzzyMatch: this.fuzzyMatch,\n });\n }\n }\n \n this.logs = [...harvestData.logs];\n this.initialComponentName = this.findInitialComponentName(harvestData.initialState);\n \n // Seed script cache with harvested external scripts\n this.harvestData.scripts.forEach(s => {\n if (s.url) {\n this.scriptCache.set(s.url, s.content);\n }\n });\n this.harvestData.modulePreloads?.forEach((asset) => {\n this.scriptCache.set(asset.url, asset.content);\n this.moduleResolveCache.set(asset.url, {\n contents: this.rewriteImportMeta(asset.content, asset.url),\n loader: asset.url.endsWith('.ts') || asset.url.endsWith('.tsx') ? 'ts' : 'js',\n });\n });\n // Merge the pre-warmed module graph from harvest into scriptCache\n this.harvestData.moduleGraphCache?.forEach((content, url) => {\n if (!this.scriptCache.has(url)) {\n this.scriptCache.set(url, content);\n }\n });\n }\n\n private clampMs(v: number, min: number, max: number): number {\n if (!Number.isFinite(v)) return min;\n return Math.max(min, Math.min(max, Math.trunc(v)));\n }\n\n private applyDefaults(quiescence?: QuiescenceOptions, moduleWaitMsOverride?: number) {\n const hardMaxCap = this.clampMs(Number(process.env.PHANTOM_QUIESCENCE_MAX_CAP_MS ?? 8000), 500, 60_000);\n\n const minWaitMs = this.clampMs(quiescence?.minWaitMs ?? 75, 0, 10_000);\n const idleWaitMs = this.clampMs(quiescence?.idleWaitMs ?? 100, 0, 10_000);\n const maxWaitMs = this.clampMs(quiescence?.maxWaitMs ?? 2000, 0, hardMaxCap);\n\n const hardModuleCap = this.clampMs(Number(process.env.PHANTOM_MODULE_WAIT_MAX_CAP_MS ?? 30000), 1000, 120_000);\n this.moduleWaitMs = this.clampMs(Number(process.env.PHANTOM_MODULE_WAIT_MS ?? moduleWaitMsOverride ?? 6000), 1000, hardModuleCap);\n this.quiescenceOptions = { minWaitMs, idleWaitMs, maxWaitMs };\n }\n\n public logRequest(entry: NetworkLogEntry) {\n this.logs.push(entry);\n this.checkForMatch(entry);\n }\n \n private checkForMatch(entry: NetworkLogEntry): void {\n if (!this.compiledMatcher || (this.matchFound && !this.findAll)) return;\n\n const urlToCheck = entry.url ?? '';\n const bodyToCheck = typeof entry.responseBody === 'string' ? entry.responseBody : '';\n\n if (this.compiledMatcher.test(urlToCheck) || this.compiledMatcher.test(bodyToCheck)) {\n this.earlyMatches.push(entry);\n if (!this.findAll) {\n this.matchFound = true;\n this.triggerEarlyExit();\n }\n }\n }\n \n private triggerEarlyExit(): void {\n if (this.quiescenceResolver) {\n if (this.quiescenceTimer) {\n clearTimeout(this.quiescenceTimer);\n this.quiescenceTimer = null;\n }\n if (this.quiescenceMaxTimer) {\n clearTimeout(this.quiescenceMaxTimer);\n this.quiescenceMaxTimer = null;\n }\n if (this.quiescenceMinTimer) {\n clearTimeout(this.quiescenceMinTimer);\n this.quiescenceMinTimer = null;\n }\n this.quiescenceResolver();\n this.quiescenceResolver = null;\n }\n }\n\n private trackRequestStart(url?: string, kind?: string): number {\n const id = this.pendingRequestNextId++;\n this.pendingRequests++;\n this.pendingRequestMap.set(id, { url, kind, startedAt: Date.now() });\n if (this.quiescenceTimer) {\n clearTimeout(this.quiescenceTimer);\n this.quiescenceTimer = null;\n }\n return id;\n }\n\n private trackRequestEnd(id?: number) {\n this.pendingRequests = Math.max(0, this.pendingRequests - 1);\n if (typeof id === 'number') this.pendingRequestMap.delete(id);\n if ((this.pendingRequests + this.pendingTasks) === 0 && this.quiescenceResolver) {\n // Wait for an idle window before resolving\n this.quiescenceTimer = setTimeout(() => {\n if ((this.pendingRequests + this.pendingTasks) === 0 && this.quiescenceResolver) {\n this.quiescenceResolver();\n this.quiescenceResolver = null;\n }\n }, this.quiescenceOptions.idleWaitMs);\n }\n }\n\n private trackTaskStart(kind?: string, url?: string, maxBlockMs?: number): number {\n const id = this.pendingTaskNextId++;\n this.pendingTasks++;\n if (this.quiescenceTimer) {\n clearTimeout(this.quiescenceTimer);\n this.quiescenceTimer = null;\n }\n\n const ms = this.clampMs(Number(maxBlockMs ?? 0), 0, 60_000);\n if (ms > 0) {\n const t = setTimeout(() => this.trackTaskEnd(id), ms);\n this.pendingTaskTimers.set(id, t);\n }\n\n return id;\n }\n\n private trackTaskEnd(id: number) {\n const t = this.pendingTaskTimers.get(id);\n if (t) {\n clearTimeout(t);\n this.pendingTaskTimers.delete(id);\n }\n if (this.pendingTasks > 0) this.pendingTasks--;\n if ((this.pendingRequests + this.pendingTasks) === 0 && this.quiescenceResolver) {\n this.quiescenceTimer = setTimeout(() => {\n if ((this.pendingRequests + this.pendingTasks) === 0 && this.quiescenceResolver) {\n this.quiescenceResolver();\n this.quiescenceResolver = null;\n }\n }, this.quiescenceOptions.idleWaitMs);\n }\n }\n\n private waitForQuiescence(): Promise<void> {\n const { maxWaitMs, minWaitMs, idleWaitMs } = this.quiescenceOptions;\n return new Promise((resolve) => {\n const finish = () => {\n if (!this.quiescenceResolver) return;\n if (this.quiescenceTimer) clearTimeout(this.quiescenceTimer);\n if (this.quiescenceMaxTimer) clearTimeout(this.quiescenceMaxTimer);\n if (this.quiescenceMinTimer) clearTimeout(this.quiescenceMinTimer);\n this.quiescenceTimer = null;\n this.quiescenceMaxTimer = null;\n this.quiescenceMinTimer = null;\n this.quiescenceResolver = null;\n resolve();\n };\n\n this.quiescenceResolver = finish;\n\n // Check if we already found a match and should exit early\n if (this.matchFound && !this.findAll) {\n this.triggerEarlyExit();\n return;\n }\n\n this.quiescenceMinTimer = setTimeout(() => {\n if (!this.quiescenceResolver) return;\n if ((this.pendingRequests + this.pendingTasks) === 0) {\n this.quiescenceTimer = setTimeout(() => {\n if (this.quiescenceResolver) this.quiescenceResolver();\n }, idleWaitMs);\n }\n }, minWaitMs);\n\n this.quiescenceMaxTimer = setTimeout(() => {\n if (this.quiescenceResolver) this.quiescenceResolver();\n }, maxWaitMs);\n });\n }\n\n private async waitForModuleWork(timeoutMs: number): Promise<void> {\n const pending = Array.from(this.moduleInFlight.values());\n if (!pending.length) return;\n\n const timeout = this.clampMs(timeoutMs, 0, 60_000);\n if (timeout === 0) return;\n\n const all = Promise.allSettled(pending).then(() => {});\n await Promise.race([\n all,\n new Promise<void>((r) => setTimeout(r, timeout)),\n ]);\n }\n\n private proxyUrlForScope(scope: 'page' | 'api' | 'assets'): string | undefined {\n if (!this.proxy) return undefined;\n return this.proxy.scopes.has(scope) ? this.proxy.url : undefined;\n }\n\n private async fetchViaProxy(url: string, method: string, headers: Record<string, string>, body: string, proxyScope: 'api' | 'assets' = 'api'): Promise<ProxyResponse> {\n try {\n this.telemetry_proxy++;\n const payload: ProxyRequest = { method, url, headers, headerOrder: Object.keys(headers), body, proxy: this.proxyUrlForScope(proxyScope) };\n return await phantomFetch(payload) as ProxyResponse;\n } catch (e: any) {\n return { status: 0, body: e.message, headers: {}, error: e.message };\n }\n }\n\n private rewriteImportMeta(source: string, moduleUrl: string): string {\n const importMetaLiteral = `({ url: ${JSON.stringify(moduleUrl)}, env: { MODE: \"production\", PROD: true, DEV: false, SSR: false, BASE_URL: \"/\" }, hot: undefined })`;\n\n return source\n .replace(/\\bimport\\.meta\\.url\\b/g, JSON.stringify(moduleUrl))\n .replace(/\\bimport\\.meta\\.env\\.MODE\\b/g, `\"production\"`)\n .replace(/\\bimport\\.meta\\.env\\.PROD\\b/g, 'true')\n .replace(/\\bimport\\.meta\\.env\\.DEV\\b/g, 'false')\n .replace(/\\bimport\\.meta\\.env\\.SSR\\b/g, 'false')\n .replace(/\\bimport\\.meta\\.env\\.BASE_URL\\b/g, `\"/\"`)\n .replace(/\\bimport\\.meta\\.env\\b/g, `${importMetaLiteral}.env`)\n .replace(/\\bimport\\.meta\\b/g, importMetaLiteral);\n }\n\n private findInitialComponentName(initialState: Record<string, any>): string | null {\n for (const value of Object.values(initialState || {})) {\n if (value && typeof value === 'object' && typeof value.component === 'string') {\n return value.component;\n }\n }\n return null;\n }\n\n private findMatchingBraceIndex(source: string, startIndex: number): number {\n let depth = 0;\n let quote: '\"' | \"'\" | '`' | null = null;\n let escaped = false;\n\n for (let i = startIndex; i < source.length; i++) {\n const ch = source[i];\n if (quote) {\n if (escaped) {\n escaped = false;\n continue;\n }\n if (ch === '\\\\') {\n escaped = true;\n continue;\n }\n if (ch === quote) quote = null;\n continue;\n }\n\n if (ch === '\"' || ch === \"'\" || ch === '`') {\n quote = ch as '\"' | \"'\" | '`';\n continue;\n }\n if (ch === '{') {\n depth++;\n continue;\n }\n if (ch === '}') {\n depth--;\n if (depth === 0) return i;\n }\n }\n\n return -1;\n }\n\n private extractObjectProperty(source: string, objectStart: number, objectEnd: number, key: string): string | null {\n const needle = `\"${key}\"`;\n const keyIndex = source.indexOf(needle, objectStart);\n if (keyIndex === -1 || keyIndex > objectEnd) return null;\n\n let colonIndex = keyIndex + needle.length;\n while (colonIndex < objectEnd && source[colonIndex] !== ':') colonIndex++;\n if (colonIndex >= objectEnd) return null;\n\n let i = colonIndex + 1;\n let parenDepth = 0;\n let bracketDepth = 0;\n let braceDepth = 0;\n let quote: '\"' | \"'\" | '`' | null = null;\n let escaped = false;\n\n for (; i < objectEnd; i++) {\n const ch = source[i];\n if (quote) {\n if (escaped) {\n escaped = false;\n continue;\n }\n if (ch === '\\\\') {\n escaped = true;\n continue;\n }\n if (ch === quote) quote = null;\n continue;\n }\n\n if (ch === '\"' || ch === \"'\" || ch === '`') {\n quote = ch as '\"' | \"'\" | '`';\n continue;\n }\n if (ch === '(') parenDepth++;\n else if (ch === ')') parenDepth--;\n else if (ch === '[') bracketDepth++;\n else if (ch === ']') bracketDepth--;\n else if (ch === '{') braceDepth++;\n else if (ch === '}') braceDepth--;\n else if (ch === ',' && parenDepth === 0 && bracketDepth === 0 && braceDepth === 0) {\n return source.slice(keyIndex, i).trim();\n }\n }\n\n return source.slice(keyIndex, objectEnd).trim();\n }\n\n private pruneComponentRegistrySource(source: string): string | null {\n if (!this.initialComponentName) return null;\n if (!source.includes(this.initialComponentName)) return null;\n\n const constMatch = source.match(/const\\s+([A-Za-z_$][\\w$]*)\\s*=\\s*\\{/);\n if (!constMatch || constMatch.index == null) return null;\n const registryVar = constMatch[1];\n const objectStart = source.indexOf('{', constMatch.index);\n const objectEnd = this.findMatchingBraceIndex(source, objectStart);\n if (objectStart === -1 || objectEnd === -1) return null;\n\n const propertySource = this.extractObjectProperty(source, objectStart, objectEnd, this.initialComponentName);\n if (!propertySource) return null;\n\n const exportRegex = new RegExp(`export\\\\{\\\\s*${registryVar}\\\\s+as\\\\s+([A-Za-z_$][\\\\w$]*)\\\\s*\\\\}`);\n const exportMatch = source.match(exportRegex);\n if (!exportMatch || exportMatch.index == null) return null;\n\n const prefix = source.slice(0, constMatch.index);\n const suffix = source.slice(exportMatch.index);\n return `${prefix}const ${registryVar}={${propertySource}};${suffix}`;\n }\n\n private async handleModuleScript(\n entryUrl: string,\n window: any,\n options: { inlineSource?: string; cacheKey?: string } = {},\n ): Promise<void> {\n const cacheKey = options.cacheKey ?? entryUrl;\n const existing = this.moduleInFlight.get(cacheKey);\n if (existing) return existing;\n\n\t const p = (async () => {\n\t const taskId = this.trackTaskStart('module_bundle', cacheKey, this.moduleWaitMs);\n\t try {\n\t if (process.env.PHANTOM_DEBUG_MODULES === '1') {\n\t console.log('[Executor] Bundling module entry:', cacheKey);\n\t }\n const cached = this.moduleBundleCache.get(cacheKey);\n if (cached) {\n if (!this.windowClosed) window.eval(cached);\n return;\n }\n\n const esbuildMod: any = await import('esbuild');\n const buildFn = esbuildMod?.build || esbuildMod?.default?.build;\n if (typeof buildFn !== 'function') {\n throw new Error('esbuild.build not available (esbuild import failed)');\n }\n\n const entry = new URL(entryUrl);\n const entryOrigin = entry.origin;\n\n const stripQueryHash = (u: string) => {\n try {\n const uu = new URL(u);\n return uu.pathname.toLowerCase();\n } catch {\n // Best-effort for odd inputs.\n return String(u).split('?')[0].split('#')[0].toLowerCase();\n }\n };\n\n const isStubAsset = (u: string) => {\n const p = stripQueryHash(u);\n return (\n p.endsWith('.css') ||\n p.endsWith('.png') ||\n p.endsWith('.jpg') ||\n p.endsWith('.jpeg') ||\n p.endsWith('.gif') ||\n p.endsWith('.webp') ||\n p.endsWith('.avif') ||\n p.endsWith('.svg') ||\n p.endsWith('.ico') ||\n p.endsWith('.woff') ||\n p.endsWith('.woff2') ||\n p.endsWith('.ttf') ||\n p.endsWith('.otf') ||\n p.endsWith('.eot') ||\n p.endsWith('.mp3') ||\n p.endsWith('.mp4') ||\n p.endsWith('.webm') ||\n p.endsWith('.mov') ||\n p.endsWith('.wasm')\n );\n };\n\n const getLoader = (u: string): \"js\" | \"ts\" => {\n const p = stripQueryHash(u);\n if (p.endsWith('.ts') || p.endsWith('.tsx')) return \"ts\";\n return \"js\";\n };\n\n const httpPlugin = {\n name: 'phantom-http-url',\n setup: (build: any) => {\n build.onResolve({ filter: /.*/ }, (args: any) => {\n const path = String(args.path || '');\n const importer = String(args.importer || '');\n\n // Ignore non-HTTP schemes (data:, blob:, etc); let esbuild handle or error.\n if (path.startsWith('data:') || path.startsWith('blob:') || path.startsWith('file:')) {\n return { path, external: true };\n }\n\n if (path.startsWith('http://') || path.startsWith('https://')) {\n return { path, namespace: 'http-url' };\n }\n\n const base = (() => {\n try {\n if (importer.startsWith('http://') || importer.startsWith('https://')) return importer;\n } catch {}\n return entryUrl;\n })();\n\n try {\n if (path.startsWith('/')) {\n const origin = (() => {\n try { return new URL(base).origin; } catch { return entryOrigin; }\n })();\n return { path: new URL(path, origin).toString(), namespace: 'http-url' };\n }\n return { path: new URL(path, base).toString(), namespace: 'http-url' };\n } catch {\n // If URL construction fails, let esbuild try its normal resolver.\n return null;\n }\n });\n\n build.onLoad({ filter: /.*/, namespace: 'http-url' }, async (args: any) => {\n const url = String(args.path || '');\n\n if (isStubAsset(url)) {\n this.telemetry_stubbed++;\n return { contents: 'export default \"\";\\n', loader: 'js' };\n }\n\n const cached = this.moduleResolveCache.get(url);\n if (cached) return cached;\n const prefetched = this.scriptCache.get(url);\n if (prefetched != null) {\n const pruned = /component_registry/i.test(url) ? this.pruneComponentRegistrySource(prefetched) : null;\n const entry = { contents: this.rewriteImportMeta(pruned ?? prefetched, url), loader: getLoader(url) };\n this.moduleResolveCache.set(url, entry);\n return entry;\n }\n\n const { headers: subHeaders } = chromeSubresourceHeaders(this.harvestData.url);\n\n // Align with our proxy TLS profile UA, and set a reasonable dest hint.\n subHeaders[\"sec-fetch-dest\"] = \"script\";\n subHeaders[\"sec-fetch-mode\"] = \"cors\";\n try {\n const pageOrigin = new URL(this.harvestData.url).origin;\n const reqOrigin = new URL(url).origin;\n subHeaders[\"sec-fetch-site\"] = reqOrigin === pageOrigin ? \"same-origin\" : \"cross-site\";\n } catch {\n subHeaders[\"sec-fetch-site\"] = \"cross-site\";\n }\n\n const resp = await this.fetchViaProxy(url, 'GET', subHeaders, '', 'assets');\n if (resp.error || resp.status >= 400) {\n throw new Error(resp.error || `Module fetch failed: ${resp.status} ${url}`);\n }\n\n const body = resp.body ?? '';\n const pruned = /component_registry/i.test(url) ? this.pruneComponentRegistrySource(body) : null;\n const entry = { contents: this.rewriteImportMeta(pruned ?? body, url), loader: getLoader(url) };\n this.moduleResolveCache.set(url, entry);\n return entry;\n });\n }\n };\n\n const result = await buildFn({\n bundle: true,\n write: false,\n format: 'iife',\n platform: 'browser',\n target: 'es2020',\n sourcemap: false,\n minify: this.minifyBundle,\n stdin: {\n contents: options.inlineSource\n ? this.rewriteImportMeta(options.inlineSource, entryUrl)\n : `import ${JSON.stringify(entryUrl)};\\n`,\n sourcefile: entryUrl,\n },\n plugins: [httpPlugin],\n });\n\n const outputText = result?.outputFiles?.[0]?.text;\n if (!outputText) throw new Error('esbuild produced no output');\n\n const bundleIdHash = nodeCrypto.createHash('sha256').update(cacheKey).digest('hex').slice(0, 10);\n const transformed = this.transformer.transform(outputText, `module_bundle_${bundleIdHash}`);\n this.moduleBundleCache.set(cacheKey, transformed);\n\n if (!this.windowClosed) window.eval(transformed);\n if (process.env.PHANTOM_DEBUG_MODULES === '1') {\n console.log('[Executor] Module bundle eval complete:', cacheKey);\n }\n\t } catch (e) {\n\t this.recordExecutionError(e, 'unhandledRejection');\n\t } finally {\n\t this.trackTaskEnd(taskId);\n\t this.moduleInFlight.delete(cacheKey);\n\t }\n\t })();\n\n this.moduleInFlight.set(cacheKey, p);\n return p;\n }\n\n private recordExecutionError(err: unknown, source: ExecutionError['source']) {\n const e = err instanceof Error ? err : new Error(String(err));\n this.executionErrors.push({ source, message: e.message, stack: e.stack });\n }\n\n private looksLikeESModule(code: string): boolean {\n return (\n /(^|[^\\w$.])import(?:\\s+[\\w*{]|\\s*[\"']|\\()/m.test(code) ||\n /(^|[^\\w$.])export\\s+(?:\\{|\\*|default|const|function|class|let|var)\\b/m.test(code) ||\n /\\bimport\\.meta\\b/.test(code)\n );\n }\n\n private installWebPlatformShims(window: any) {\n const that = this;\n\n // Ensure common \"global object\" names resolve to the JSDOM window.\n try { window.globalThis = window; } catch {}\n try { window.self = window; } catch {}\n\n // Base64 helpers are widely used.\n if (!window.atob) {\n window.atob = (s: string) => Buffer.from(String(s), 'base64').toString('binary');\n }\n if (!window.btoa) {\n window.btoa = (s: string) => Buffer.from(String(s), 'binary').toString('base64');\n }\n\n // Route fetch through __phantom.fetch so we can capture requests without AST rewrites.\n if (window.__phantom?.fetch) {\n window.fetch = function fetchShim(input: any, init?: any) {\n return window.__phantom.fetch(input, init);\n };\n }\n\n // Prefer Node's built-in fetch primitives (Undici) when available.\n const g: any = globalThis as any;\n if (!window.Headers && g.Headers) window.Headers = g.Headers;\n if (!window.Request && g.Request) window.Request = g.Request;\n if (!window.Response && g.Response) window.Response = g.Response;\n if (!window.AbortController && g.AbortController) window.AbortController = g.AbortController;\n if (!window.AbortSignal && g.AbortSignal) window.AbortSignal = g.AbortSignal;\n if (!window.TextEncoder && g.TextEncoder) window.TextEncoder = g.TextEncoder;\n if (!window.TextDecoder && g.TextDecoder) window.TextDecoder = g.TextDecoder;\n if (!window.structuredClone && g.structuredClone) window.structuredClone = g.structuredClone.bind(g);\n\n const makeStorage = () => {\n const store = new Map<string, string>();\n return {\n get length() {\n return store.size;\n },\n clear() {\n store.clear();\n },\n getItem(key: string) {\n return store.has(String(key)) ? store.get(String(key)) ?? null : null;\n },\n key(index: number) {\n return Array.from(store.keys())[index] ?? null;\n },\n removeItem(key: string) {\n store.delete(String(key));\n },\n setItem(key: string, value: string) {\n store.set(String(key), String(value));\n },\n };\n };\n\n try {\n if (!window.localStorage) window.localStorage = makeStorage();\n } catch {\n window.localStorage = makeStorage();\n }\n try {\n if (!window.sessionStorage) window.sessionStorage = makeStorage();\n } catch {\n window.sessionStorage = makeStorage();\n }\n\n if (!window.StorageEvent) {\n window.StorageEvent = class StorageEvent extends window.Event {\n key: string | null;\n oldValue: string | null;\n newValue: string | null;\n storageArea: any;\n url: string;\n\n constructor(type: string, init: any = {}) {\n super(type, init);\n this.key = init.key ?? null;\n this.oldValue = init.oldValue ?? null;\n this.newValue = init.newValue ?? null;\n this.storageArea = init.storageArea ?? null;\n this.url = init.url ?? window.location.href;\n }\n } as any;\n }\n\n // crypto.getRandomValues for UUIDs/nonces.\n if (!window.crypto) window.crypto = {};\n if (!window.crypto.getRandomValues) {\n if (g.crypto && typeof g.crypto.getRandomValues === 'function') {\n window.crypto.getRandomValues = g.crypto.getRandomValues.bind(g.crypto);\n } else {\n window.crypto.getRandomValues = (arr: Uint8Array) => {\n const buf = nodeCrypto.randomBytes(arr.length);\n arr.set(buf);\n return arr;\n };\n }\n }\n\n // MessageChannel is used by React schedulers, streaming components, etc.\n // Node.js provides it globally since v15; expose it on window for scripts that expect it.\n {\n const _g: any = globalThis as any;\n if (!window.MessageChannel && _g.MessageChannel) window.MessageChannel = _g.MessageChannel;\n if (!window.MessagePort && _g.MessagePort) window.MessagePort = _g.MessagePort;\n }\n\n if (!window.requestIdleCallback) {\n window.requestIdleCallback = (cb: any) => window.setTimeout(() => cb({\n didTimeout: false,\n timeRemaining: () => 50,\n }), 1);\n }\n if (!window.cancelIdleCallback) {\n window.cancelIdleCallback = (id: any) => window.clearTimeout(id);\n }\n\n if (!window.ResizeObserver) {\n window.ResizeObserver = class ResizeObserver {\n private callback: any;\n constructor(callback: any) {\n this.callback = callback;\n }\n observe(target: any) {\n try {\n window.setTimeout(() => {\n const rect = typeof target?.getBoundingClientRect === 'function'\n ? target.getBoundingClientRect()\n : { width: window.innerWidth, height: window.innerHeight, top: 0, left: 0, right: window.innerWidth, bottom: window.innerHeight };\n this.callback?.([{ target, contentRect: rect, borderBoxSize: [], contentBoxSize: [] }], this);\n }, 0);\n } catch {}\n }\n unobserve() {}\n disconnect() {}\n } as any;\n }\n\n try {\n Object.defineProperty(window.navigator, 'language', { value: 'en-US', configurable: true });\n Object.defineProperty(window.navigator, 'languages', { value: ['en-US', 'en'], configurable: true });\n Object.defineProperty(window.navigator, 'platform', { value: 'MacIntel', configurable: true });\n Object.defineProperty(window.navigator, 'onLine', { value: true, configurable: true });\n Object.defineProperty(window.navigator, 'webdriver', { value: false, configurable: true });\n Object.defineProperty(window.navigator, 'hardwareConcurrency', { value: 8, configurable: true });\n Object.defineProperty(window.navigator, 'deviceMemory', { value: 8, configurable: true });\n } catch {}\n\n try {\n Object.defineProperty(window, 'innerWidth', { value: 1440, configurable: true });\n Object.defineProperty(window, 'innerHeight', { value: 900, configurable: true });\n Object.defineProperty(window, 'devicePixelRatio', { value: 2, configurable: true });\n Object.defineProperty(window, 'scrollX', { value: 0, writable: true, configurable: true });\n Object.defineProperty(window, 'scrollY', { value: 0, writable: true, configurable: true });\n } catch {}\n if (!window.screen) {\n window.screen = {\n width: 1440,\n height: 900,\n availWidth: 1440,\n availHeight: 900,\n };\n }\n if (!window.visualViewport) {\n window.visualViewport = {\n width: window.innerWidth,\n height: window.innerHeight,\n scale: 1,\n offsetLeft: 0,\n offsetTop: 0,\n pageLeft: 0,\n pageTop: 0,\n addEventListener() {},\n removeEventListener() {},\n };\n }\n if (!window.scrollTo) {\n window.scrollTo = (x: number, y: number) => {\n window.scrollX = typeof x === 'number' ? x : window.scrollX;\n window.scrollY = typeof y === 'number' ? y : window.scrollY;\n };\n }\n if (!window.scrollBy) {\n window.scrollBy = (x: number, y: number) => {\n window.scrollTo((window.scrollX || 0) + (Number(x) || 0), (window.scrollY || 0) + (Number(y) || 0));\n };\n }\n\n try {\n Object.defineProperty(window.document, 'visibilityState', { value: 'visible', configurable: true });\n Object.defineProperty(window.document, 'hidden', { value: false, configurable: true });\n } catch {}\n if (!window.document.hasFocus) {\n window.document.hasFocus = () => true;\n }\n if (!window.focus) {\n window.focus = () => {\n try { window.dispatchEvent(new window.Event('focus')); } catch {}\n };\n }\n if (!window.blur) {\n window.blur = () => {\n try { window.dispatchEvent(new window.Event('blur')); } catch {}\n };\n }\n\n // Wrap timers/microtasks so async exceptions don't crash the Node process.\n const wrapCb = (cb: any) => {\n if (typeof cb !== 'function') return cb;\n return function wrappedCallback(this: any, ...args: any[]) {\n try {\n return cb.apply(this, args);\n } catch (e) {\n that.recordExecutionError(e, 'uncaughtException');\n }\n };\n };\n const _setTimeout = window.setTimeout?.bind(window);\n const _setInterval = window.setInterval?.bind(window);\n if (_setTimeout) window.setTimeout = (cb: any, ms?: any, ...rest: any[]) => _setTimeout(wrapCb(cb), ms, ...rest);\n if (_setInterval) window.setInterval = (cb: any, ms?: any, ...rest: any[]) => _setInterval(wrapCb(cb), ms, ...rest);\n if (window.queueMicrotask) {\n const _q = window.queueMicrotask.bind(window);\n window.queueMicrotask = (cb: any) => _q(wrapCb(cb));\n }\n\n // Capture window-level errors for debugging and to avoid hard crashes.\n if (window.addEventListener) {\n window.addEventListener('error', (ev: any) => {\n that.recordExecutionError(ev?.error || ev?.message || ev, 'error');\n if (typeof ev?.preventDefault === 'function') ev.preventDefault();\n });\n window.addEventListener('unhandledrejection', (ev: any) => {\n that.recordExecutionError(ev?.reason || ev, 'unhandledrejection');\n if (typeof ev?.preventDefault === 'function') ev.preventDefault();\n });\n }\n\n // Track whether DOMContentLoaded has already been dispatched. Only replay\n // for listeners registered AFTER the dispatch \u2014 avoids double-firing during\n // the transition from 'loading' \u2192 'interactive' where the explicit dispatch\n // at line ~1612 would also reach the same listener.\n let domContentLoadedDispatched = false;\n (window as any).__phantom_markDCLDispatched = () => { domContentLoadedDispatched = true; };\n\n if (window.document?.addEventListener) {\n const origDocAddEventListener = window.document.addEventListener.bind(window.document);\n window.document.addEventListener = function(type: string, listener: any, options?: any) {\n const result = origDocAddEventListener(type, listener, options);\n if (type === 'DOMContentLoaded' && domContentLoadedDispatched) {\n window.setTimeout(() => {\n try {\n if (typeof listener === 'function') {\n listener.call(window.document, new window.Event('DOMContentLoaded'));\n } else if (listener && typeof listener.handleEvent === 'function') {\n listener.handleEvent.call(listener, new window.Event('DOMContentLoaded'));\n }\n } catch (e) {\n that.recordExecutionError(e, 'error');\n }\n }, 0);\n }\n return result;\n };\n }\n\n // Canvas is not implemented by default in JSDOM. Many bundles (eg Lottie) assume a 2D context exists.\n // Provide a permissive mock context so animation/rendering code doesn't hard-crash execution.\n const makeCtx = () => {\n const noop = () => {};\n const base: any = {\n canvas: null,\n // Common methods used by renderers\n save: noop,\n restore: noop,\n beginPath: noop,\n closePath: noop,\n clip: noop,\n moveTo: noop,\n lineTo: noop,\n bezierCurveTo: noop,\n quadraticCurveTo: noop,\n rect: noop,\n arc: noop,\n fill: noop,\n stroke: noop,\n clearRect: noop,\n fillRect: noop,\n strokeRect: noop,\n drawImage: noop,\n translate: noop,\n rotate: noop,\n scale: noop,\n transform: noop,\n setTransform: noop,\n resetTransform: noop,\n measureText: (text: string) => ({ width: (String(text).length || 0) * 8 }),\n createLinearGradient: () => ({ addColorStop: noop }),\n createRadialGradient: () => ({ addColorStop: noop }),\n createPattern: () => ({}),\n getImageData: () => ({ data: new Uint8ClampedArray(0) }),\n putImageData: noop,\n };\n return new Proxy(base, {\n get(target, prop) {\n if (prop in target) return (target as any)[prop];\n // Return no-op functions for unknown methods.\n return noop;\n },\n set(target, prop, value) {\n (target as any)[prop] = value;\n return true;\n },\n });\n };\n\n if (window.HTMLCanvasElement && window.HTMLCanvasElement.prototype) {\n const proto = window.HTMLCanvasElement.prototype;\n const origGetContext = proto.getContext;\n proto.getContext = function(this: any, type: string, ...args: any[]) {\n try {\n const ctx = origGetContext ? origGetContext.call(this, type, ...args) : null;\n if (ctx) return ctx;\n } catch {}\n const mock = makeCtx();\n mock.canvas = this;\n return mock;\n };\n }\n }\n\n async execute(): Promise<ExecutionResult> {\n const onNodeUncaught = (err: unknown) => this.recordExecutionError(err, 'uncaughtException');\n const onNodeUnhandled = (reason: unknown) => this.recordExecutionError(reason, 'unhandledRejection');\n process.on('uncaughtException', onNodeUncaught);\n process.on('unhandledRejection', onNodeUnhandled);\n\n try {\n const virtualConsole = new VirtualConsole();\n virtualConsole.on(\"log\", (...args) => console.log(\"[JSDOM Log]\", ...args));\n virtualConsole.on(\"error\", (...args) => console.error(\"[JSDOM Error]\", ...args));\n virtualConsole.on(\"warn\", (...args) => console.warn(\"[JSDOM Warn]\", ...args));\n\n const cookieJar = new CookieJar();\n this.harvestData.cookies.forEach(c => {\n try { cookieJar.setCookieSync(c, this.harvestData.url); } catch (e) {}\n });\n\n\t // Keep aligned with the active dynafetch-net TLS fingerprint and browser headers.\n\t const DEFAULT_UA = chromeDocumentHeaders().headers[\"user-agent\"];\n\n\t const htmlWithDataOnly = this.stripExecutableScripts(this.harvestData.html);\n\n\t const dom = new JSDOM(htmlWithDataOnly, {\n\t url: this.harvestData.url,\n\t referrer: \"https://www.google.com/\",\n\t runScripts: \"dangerously\",\n\t cookieJar,\n\t virtualConsole,\n\t beforeParse: (window) => {\n\t // Make the UA deterministic and consistent with our proxy fingerprint.\n\t try {\n\t Object.defineProperty(window.navigator, \"userAgent\", {\n\t value: DEFAULT_UA,\n\t configurable: true,\n\t });\n\t } catch {}\n\n\t // Polyfills for missing browser APIs\n\t // IntersectionObserver: immediately report all observed elements as visible\n\t // so lazy-loaded modules (chart, sparkline, etc.) get triggered.\n\t window.IntersectionObserver = class IntersectionObserver {\n\t _callback: any;\n\t constructor(callback: any) { this._callback = callback; }\n\t observe(target: any) {\n\t try {\n\t // Fire callback async so the caller finishes setup first\n\t Promise.resolve().then(() => {\n\t this._callback?.([{ target, isIntersecting: true, intersectionRatio: 1 }], this);\n\t });\n\t } catch {}\n\t }\n unobserve() {}\n disconnect() {}\n takeRecords() { return []; }\n };\n\n\t window.matchMedia = window.matchMedia || function(query) {\n\t return {\n matches: false,\n media: query,\n onchange: null,\n addListener: function() {},\n removeListener: function() {},\n addEventListener: function() {},\n removeEventListener: function() {},\n dispatchEvent: function() { return false; }\n };\n };\n \n // Extend performance with mark/measure if missing\n if (!window.performance) {\n (window as any).performance = {};\n }\n \n if (!window.performance.mark) {\n (window.performance as any).mark = (name: string) => {\n return { \n name, \n entryType: 'mark', \n startTime: Date.now(), \n duration: 0, \n toJSON: () => {} \n };\n };\n }\n \n if (!window.performance.measure) {\n (window.performance as any).measure = (name: string, startMark: string, endMark: string) => {\n return { \n name, \n entryType: 'measure', \n startTime: Date.now(), \n duration: 0, \n toJSON: () => {} \n };\n };\n }\n \n if (!window.performance.clearMarks) {\n (window.performance as any).clearMarks = () => {};\n }\n\n\t if (!window.performance.clearMeasures) {\n\t (window.performance as any).clearMeasures = () => {};\n\t }\n\n if (!window.performance.getEntriesByName) {\n (window.performance as any).getEntriesByName = () => [];\n }\n\n\t if (!window.performance.getEntriesByType) {\n\t (window.performance as any).getEntriesByType = () => [];\n\t }\n\n\t // Some app code passes root-relative paths to URL(). Browsers require a base;\n\t // default to the current document URL to avoid hard runtime failures in JSDOM.\n\t if (window.URL) {\n\t const NativeURL = window.URL;\n\t const URLShim: any = function(input: any, base?: any) {\n\t if (base === undefined && typeof input === 'string' && /^[/?#]/.test(input)) {\n\t return new (NativeURL as any)(input, window.location.href);\n\t }\n\t return new (NativeURL as any)(input, base);\n\t };\n\t try { Object.setPrototypeOf(URLShim, NativeURL); } catch {}\n\t URLShim.prototype = NativeURL.prototype;\n\t (window as any).URL = URLShim;\n\t }\n\n if (!window.requestAnimationFrame) {\n window.requestAnimationFrame = (callback) => window.setTimeout(callback, 0);\n }\n\n if (!window.cancelAnimationFrame) {\n window.cancelAnimationFrame = (id) => window.clearTimeout(id);\n }\n\n if (!window.process) {\n (window as any).process = {\n env: { NODE_ENV: 'production' },\n version: '',\n nextTick: (cb: any) => window.setTimeout(cb, 0),\n browser: true\n };\n }\n\n\t this.injectPhantom(window);\n\t this.installWebPlatformShims(window);\n\n\t // Hook runtime insertion of <script type=\"module\" src=\"...\"> so we can bundle+eval it.\n // Guard against double-wrapping in case beforeParse runs more than once.\n const HOOK_FLAG = '__phantomModuleScriptHookInstalled';\n if (!(window as any)[HOOK_FLAG]) {\n (window as any)[HOOK_FLAG] = true;\n\t const that = this;\n\t const NodeProto = (window as any).Node?.prototype;\n const syntheticLoadedLinks = new WeakSet<any>();\n\t if (NodeProto) {\n\t const origAppendChild = NodeProto.appendChild;\n\t const origInsertBefore = NodeProto.insertBefore;\n\n\t const maybeHandle = (node: any) => {\n\t try {\n\t if (!node) return;\n const synthesizeStylesheetLoad = (el: any) => {\n const tag = String(el?.tagName || '').toLowerCase();\n if (tag !== 'link') return;\n const rel = String(el.rel || el.getAttribute?.('rel') || '').toLowerCase();\n if (rel !== 'stylesheet') return;\n if (syntheticLoadedLinks.has(el)) return;\n syntheticLoadedLinks.add(el);\n\n window.setTimeout(() => {\n try {\n const ev = new window.Event('load');\n if (typeof el.onload === 'function') el.onload(ev);\n if (typeof el.dispatchEvent === 'function') el.dispatchEvent(ev);\n } catch {}\n }, 0);\n };\n\n\t const handleOne = (el: any) => {\n\t const tag = String(el?.tagName || '').toLowerCase();\n if (tag === 'link') {\n synthesizeStylesheetLoad(el);\n return;\n }\n\t if (tag !== 'script') return;\n\n\t const t = String((el.type || el.getAttribute?.('type') || '')).toLowerCase();\n\t const src = String(el.src || el.getAttribute?.('src') || '');\n\t if (!src) return;\n\n\t const abs = new URL(src, window.location.href).toString();\n if (shouldSkipDynamicScriptUrl(abs, that.harvestData.url, that.thirdPartyPolicy)) {\n return;\n }\n\n\t if (t === 'module') {\n\t if (that.handledModuleScriptUrls.has(abs)) return;\n\t that.handledModuleScriptUrls.add(abs);\n\t if (process.env.PHANTOM_DEBUG_MODULES === '1') {\n\t console.log('[Executor] Detected module script:', abs);\n\t }\n\t void that.handleModuleScript(abs, window);\n\t return;\n\t }\n\n\t // Classic scripts: fetch+eval via proxy so we can keep logging and avoid jsdom resource loading.\n\t if (that.handledClassicScriptUrls.has(abs)) return;\n\t that.handledClassicScriptUrls.add(abs);\n\t const pendingId = that.trackRequestStart(abs, 'resource_load');\n\t const start = Date.now();\n\t const logEntry: NetworkLogEntry = {\n\t type: 'resource_load',\n\t url: abs,\n\t timestamp: start,\n\t initiator: 'Dynamic Script Loader',\n\t };\n\t that.logRequest(logEntry);\n\n\t const runClassic = async () => {\n\t try {\n\t // Cache hits avoid extra network and keep behavior stable.\n\t let code = that.scriptCache.get(abs);\n\t let headers: Record<string, string> = {};\n\t let status = 200;\n\t if (code == null) {\n\t const { headers: subHeaders } = chromeSubresourceHeaders(that.harvestData.url);\n\t subHeaders[\"user-agent\"] = DEFAULT_UA;\n\t subHeaders[\"referer\"] = window.location.href;\n\t const proxyResp = await that.fetchViaProxy(abs, 'GET', subHeaders, '', 'assets');\n\t status = proxyResp.status;\n\t headers = proxyResp.headers || {};\n\t code = proxyResp.status < 400 ? proxyResp.body : '';\n\t that.scriptCache.set(abs, code);\n\t }\n\n\t logEntry.status = status;\n\t logEntry.responseHeaders = headers;\n\t logEntry.responseBody = code;\n\t that.checkForMatch(logEntry);\n\n\t if (status >= 400) return;\n if (code && that.looksLikeESModule(code)) {\n that.handledModuleScriptUrls.add(abs);\n await that.handleModuleScript(abs, window, { cacheKey: abs });\n return;\n }\n\n\t const t0 = Date.now();\n\t const transformed = that.transformer.transform(code, `dynamic_script_${nodeCrypto.createHash('sha256').update(abs).digest('hex').slice(0, 10)}`);\n\t that.timings.transform_ms_total += (Date.now() - t0);\n\t that.timings.scripts_transformed_count++;\n\t if (!that.windowClosed) window.eval(transformed);\n\t } catch (e) {\n\t that.recordExecutionError(e, 'error');\n\t } finally {\n\t that.trackRequestEnd(pendingId);\n\t }\n\t };\n\n\t void runClassic();\n\t };\n\n\t handleOne(node);\n\t if (typeof node.querySelectorAll === 'function') {\n\t const scripts = node.querySelectorAll('script[src]');\n\t for (const s of scripts) handleOne(s);\n const stylesheets = node.querySelectorAll('link[rel=\"stylesheet\"]');\n for (const link of stylesheets) handleOne(link);\n\t }\n\t } catch {}\n\t };\n\n if (typeof origAppendChild === 'function') {\n NodeProto.appendChild = function(this: any, child: any) {\n maybeHandle(child);\n const ret = origAppendChild.call(this, child);\n return ret;\n };\n }\n\n if (typeof origInsertBefore === 'function') {\n NodeProto.insertBefore = function(this: any, newNode: any, refNode: any) {\n maybeHandle(newNode);\n const ret = origInsertBefore.call(this, newNode, refNode);\n return ret;\n };\n }\n\n // Fallback: observe DOM mutations so we also catch insertAdjacentHTML/innerHTML-driven insertions.\n if (typeof (window as any).MutationObserver === 'function' && window.document) {\n try {\n const obs = new (window as any).MutationObserver((mutations: any[]) => {\n try {\n for (const m of mutations) {\n const added = m?.addedNodes;\n if (!added) continue;\n for (const n of Array.from(added)) maybeHandle(n);\n }\n } catch {}\n });\n obs.observe(window.document, { childList: true, subtree: true });\n } catch {}\n }\n }\n }\n }\n });\n\n const { window } = dom;\n let readyStateValue: 'loading' | 'interactive' | 'complete' = 'loading';\n try {\n Object.defineProperty(window.document, 'readyState', {\n configurable: true,\n get() {\n return readyStateValue;\n },\n });\n } catch {}\n const inertScriptPlaceholders = Array.from(\n window.document.querySelectorAll('script[type=\"application/x-phantom-script\"]'),\n );\n const placeholderById = new Map<string, any>();\n const orderedScripts = [...this.harvestData.scripts].sort((a, b) => a.order - b.order);\n orderedScripts.forEach((script, index) => {\n placeholderById.set(script.id, inertScriptPlaceholders[index] ?? null);\n });\n\n const syncScripts = this.harvestData.scripts.filter(s => s.execution === 'sync');\n const deferScripts = this.harvestData.scripts.filter(s => s.execution === 'defer');\n const asyncScripts = this.harvestData.scripts.filter(s => s.execution === 'async');\n const currentScriptState: { value: any | null } = { value: null };\n try {\n Object.defineProperty(window.document, 'currentScript', {\n configurable: true,\n get() {\n return currentScriptState.value;\n },\n });\n } catch {}\n\n const shouldSkipScript = (script: ScriptAsset): boolean => {\n return shouldSkipScriptAsset(script, this.harvestData.url, this.thirdPartyPolicy);\n };\n\n const executeScript = async (script: ScriptAsset) => {\n if (shouldSkipScript(script)) return;\n if (script.type === 'external' && script.url) {\n if (script.scriptKind === 'module' && this.handledModuleScriptUrls.has(script.url)) return;\n if (script.scriptKind === 'classic' && this.handledClassicScriptUrls.has(script.url)) return;\n }\n\n const prevCurrentScript = currentScriptState.value;\n const scriptEl = placeholderById.get(script.id) || window.document.createElement('script');\n if (script.url) scriptEl.src = script.url;\n if (script.scriptKind === 'module') scriptEl.type = 'module';\n if (script.execution === 'async') scriptEl.async = true;\n if (script.execution === 'defer') scriptEl.defer = true;\n currentScriptState.value = scriptEl;\n\n if (script.scriptKind === 'module') {\n try {\n if (script.type === 'external' && script.url) {\n this.handledModuleScriptUrls.add(script.url);\n await this.handleModuleScript(script.url, window);\n } else {\n const inlineEntryUrl = new URL(`./__dynafetch_inline_module__/${script.id}.mjs`, this.harvestData.url).toString();\n await this.handleModuleScript(inlineEntryUrl, window, {\n inlineSource: script.content,\n cacheKey: `inline:${script.id}`,\n });\n }\n } catch (e) {\n console.warn(`[Executor] Module script ${script.id} failed:`, e);\n } finally {\n currentScriptState.value = prevCurrentScript;\n }\n return;\n }\n\n if (script.type === 'external' && script.url) {\n this.handledClassicScriptUrls.add(script.url);\n }\n\n const t0 = Date.now();\n const code = this.transformer.transform(script.content, script.id);\n this.timings.transform_ms_total += (Date.now() - t0);\n this.timings.scripts_transformed_count++;\n\n try {\n window.eval(code);\n } catch (e) {\n console.warn(`[Executor] Script ${script.id} failed:`, e);\n } finally {\n currentScriptState.value = prevCurrentScript;\n }\n };\n\n // Execute scripts sequentially (maintaining execution order)\n for (const s of syncScripts) {\n await executeScript(s);\n if (this.matchFound && !this.findAll) break;\n }\n\n // Run defer scripts \u2014 allow module work to proceed in parallel.\n {\n const deferWork = (async () => {\n for (const s of deferScripts) {\n await executeScript(s);\n if (this.matchFound && !this.findAll) break;\n }\n })();\n\n // Wait for both defer scripts and any pending module bundles concurrently.\n await Promise.all([deferWork, this.waitForModuleWork(this.moduleWaitMs)]);\n }\n\n readyStateValue = 'interactive';\n window.document.dispatchEvent(new window.Event('readystatechange'));\n window.document.dispatchEvent(new window.Event('DOMContentLoaded'));\n if (typeof (window as any).__phantom_markDCLDispatched === 'function') {\n (window as any).__phantom_markDCLDispatched();\n }\n window.document.dispatchEvent(new window.Event('visibilitychange'));\n\n // Fire all async scripts concurrently \u2014 mirrors real browser behavior.\n if (asyncScripts.length > 0) {\n await Promise.all(asyncScripts.map(s => executeScript(s).catch(() => {})));\n }\n\n // Only wait for module work if new modules were triggered by async scripts / events.\n if (this.moduleInFlight.size > 0) {\n await this.waitForModuleWork(this.moduleWaitMs);\n }\n\n readyStateValue = 'complete';\n window.document.dispatchEvent(new window.Event('readystatechange'));\n\t window.dispatchEvent(new window.Event('load'));\n window.dispatchEvent(new window.Event('pageshow'));\n window.dispatchEvent(new window.Event('focus'));\n\n // Drain any module work spawned by load/pageshow handlers.\n if (this.moduleInFlight.size > 0) {\n await this.waitForModuleWork(this.moduleWaitMs);\n }\n\n\t console.log('[Executor] Waiting for network quiescence...');\n\t const quiescenceStart = Date.now();\n\t try {\n\t await this.waitForQuiescence();\n\t } catch (e) {\n console.warn('[Executor] Quiescence wait failed:', e);\n }\n this.timings.quiescence_ms = Date.now() - quiescenceStart;\n const reason = this.matchFound && !this.findAll ? '(early exit on match)' : '';\n\t console.log(`[Executor] Quiescence reached in ${Date.now() - quiescenceStart}ms ${reason}`);\n\n const renderedHtml = this.serializeDocument(window);\n\n\t // Mark execution complete so any late dynamic loaders skip eval work.\n\t this.windowClosed = true;\n\t try { window.close(); } catch {}\n\n const result: ExecutionResult = {\n logs: this.logs,\n matchedRequests: this.earlyMatches,\n renderedHtml,\n timings: { ...this.timings },\n errors: this.executionErrors.length ? this.executionErrors : undefined,\n };\n\n // Give any just-scheduled microtasks/timers a brief window to run while our process-level\n // error handlers are still installed, so they get recorded instead of crashing the process.\n // Keep process-level handlers attached briefly to absorb late promise callbacks\n // that some third-party scripts schedule during teardown.\n const shutdownGraceMs = this.clampMs(Number(process.env.PHANTOM_SHUTDOWN_GRACE_MS ?? 50), 10, 5_000);\n await new Promise((r) => setTimeout(r, shutdownGraceMs));\n\n return result;\n\n } finally {\n process.off('uncaughtException', onNodeUncaught);\n process.off('unhandledRejection', onNodeUnhandled);\n }\n }\n\n private serializeDocument(window: any): string {\n try {\n const doctype = window.document?.doctype;\n const serializedDoctype = doctype\n ? `<!DOCTYPE ${doctype.name}${doctype.publicId ? ` PUBLIC \"${doctype.publicId}\"` : ''}${doctype.systemId ? ` \"${doctype.systemId}\"` : ''}>`\n : '';\n const html = window.document?.documentElement?.outerHTML ?? '';\n return `${serializedDoctype}${html}`;\n } catch {\n return this.harvestData.html;\n }\n }\n\n private stripExecutableScripts(html: string): string {\n return html.replace(/<script\\b([^>]*)>([\\s\\S]*?)<\\/script>/gim, (match, attrs, content) => {\n const isDataScript = attrs.includes('type=\"application/json\"') || \n attrs.includes(\"type='application/json'\") ||\n attrs.includes('type=\"application/ld+json\"') ||\n attrs.includes('id=\"__ACGH_DATA__\"'); \n\n if (isDataScript) return match;\n const inertAttrs = attrs.replace(/\\btype\\s*=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s>]+)/i, '').trim();\n return `<script type=\"application/x-phantom-script\"${inertAttrs ? ` ${inertAttrs}` : ''}></script>`;\n });\n }\n\n private injectPhantom(window: any) {\n const that = this;\n\n const headersToObject = (h: any): Record<string, string> => {\n if (!h) return {};\n if (typeof h.forEach === 'function') {\n const out: Record<string, string> = {};\n try {\n h.forEach((v: any, k: any) => { out[String(k)] = String(v); });\n return out;\n } catch {}\n }\n if (typeof h.entries === 'function') {\n const out: Record<string, string> = {};\n try {\n for (const [k, v] of h.entries()) out[String(k)] = String(v);\n return out;\n } catch {}\n }\n if (typeof h === 'object') {\n const out: Record<string, string> = {};\n for (const [k, v] of Object.entries(h)) {\n if (v === undefined || v === null) continue;\n out[String(k)] = Array.isArray(v) ? String(v[0]) : String(v);\n }\n return out;\n }\n return {};\n };\n\n const normalizeFetchInput = async (input: any, opts: any) => {\n let url = input;\n let method = opts?.method || 'GET';\n let headers = headersToObject(opts?.headers);\n let body = opts?.body;\n\n const isRequestLike =\n input && typeof input === 'object' &&\n (typeof input.url === 'string' || typeof input.href === 'string') &&\n (typeof input.method === 'string' || typeof input.headers === 'object' || typeof input.headers?.forEach === 'function');\n\n if (isRequestLike) {\n url = input.url || input.href;\n method = opts?.method || input.method || method;\n headers = { ...headersToObject(input.headers), ...headers };\n if (body === undefined) {\n try {\n if (typeof input.text === 'function') body = await input.text();\n } catch {}\n }\n }\n\n const fullUrl = new URL(String(url), window.location.href).toString();\n return { url: fullUrl, method, headers, body };\n };\n\n const toSafeResponseHeaders = (rawHeaders: Record<string, string> | undefined) => {\n const H = window.Headers || (global as any).Headers;\n if (typeof H !== 'function') return rawHeaders ?? {};\n\n const safe = new H();\n if (!rawHeaders) return safe;\n\n for (const [k, v] of Object.entries(rawHeaders)) {\n if (v == null) continue;\n // Some proxy/backends fold long headers across lines. Undici rejects raw CR/LF in values.\n const value = String(v).replace(/[\\r\\n]+/g, ', ').trim();\n if (!value) continue;\n try {\n safe.set(k, value);\n } catch {\n // Ignore invalid header names/values to keep execution moving.\n }\n }\n\n return safe;\n };\n \n window.__phantom = {\n fetch: async (input: any, opts: any = {}) => {\n const norm = await normalizeFetchInput(input, opts);\n const start = Date.now();\n const headers = {\n 'User-Agent': window.navigator.userAgent,\n 'Cookie': window.document.cookie,\n 'Referer': window.location.href,\n ...norm.headers,\n };\n\n const logEntry: NetworkLogEntry = {\n type: 'fetch',\n method: norm.method || 'GET',\n url: norm.url,\n requestHeaders: headers,\n requestBody: norm.body,\n timestamp: start\n };\n this.logRequest(logEntry);\n \n const pendingId = that.trackRequestStart(norm.url, 'fetch');\n try {\n const bodyStr = norm.body == null ? '' : (typeof norm.body === 'string' ? norm.body : String(norm.body));\n const proxyResp = await that.fetchViaProxy(norm.url, norm.method || 'GET', headers, bodyStr);\n if (proxyResp.error) throw new Error(proxyResp.error);\n\n logEntry.status = proxyResp.status;\n logEntry.responseBody = proxyResp.body;\n logEntry.responseHeaders = proxyResp.headers;\n this.checkForMatch(logEntry);\n \n return new (window.Response || (global as any).Response)(proxyResp.body, {\n status: proxyResp.status,\n headers: toSafeResponseHeaders(proxyResp.headers)\n });\n } catch (e: any) {\n logEntry.status = 0;\n logEntry.responseBody = e.message;\n this.checkForMatch(logEntry);\n throw e;\n } finally {\n that.trackRequestEnd(pendingId);\n }\n },\n\n WebSocket: class extends WebSocket {\n constructor(url: string, protocols?: string | string[]) {\n super(url, protocols);\n that.logRequest({ type: 'websocket', url: url, timestamp: Date.now() });\n }\n },\n\n EventSource: class {\n url: string;\n readyState: number = 0; // 0=CONNECTING, 1=OPEN, 2=CLOSED\n onopen: ((ev?: any) => void) | null = null;\n onmessage: ((ev?: any) => void) | null = null;\n onerror: ((ev?: any) => void) | null = null;\n private listeners: Map<string, Set<(ev: any) => void>> = new Map();\n\n constructor(url: string) {\n this.url = new URL(String(url), window.location.href).toString();\n that.logRequest({ type: 'eventsource', url: this.url, timestamp: Date.now() });\n this.readyState = 1;\n window.setTimeout(() => {\n try {\n this.onopen?.({ type: 'open' });\n this.listeners.get('open')?.forEach(fn => fn({ type: 'open' }));\n } catch (e) {\n that.recordExecutionError(e, 'error');\n }\n }, 0);\n }\n\n addEventListener(type: string, cb: (ev: any) => void) {\n if (!this.listeners.has(type)) this.listeners.set(type, new Set());\n this.listeners.get(type)!.add(cb);\n }\n\n removeEventListener(type: string, cb: (ev: any) => void) {\n this.listeners.get(type)?.delete(cb);\n }\n\n close() {\n this.readyState = 2;\n }\n },\n \n dynamicImport: async (url: string) => {\n const fullUrl = new URL(url, window.location.href).toString();\n const start = Date.now();\n const logEntry: NetworkLogEntry = { \n type: 'dynamic_import', \n url: fullUrl, \n timestamp: start,\n initiator: 'dynamicImport'\n };\n this.logRequest(logEntry);\n\n const pendingId = that.trackRequestStart(fullUrl, 'dynamic_import');\n try {\n let code = that.scriptCache.get(fullUrl);\n let responseHeaders: Record<string, string> | undefined;\n let status = 200;\n\n if (code == null) {\n const proxyResp = await that.fetchViaProxy(fullUrl, 'GET', {\n 'User-Agent': window.navigator.userAgent,\n 'Cookie': window.document.cookie,\n 'Referer': window.location.href\n }, '', 'assets');\n responseHeaders = proxyResp.headers;\n status = proxyResp.status;\n\n if (proxyResp.error || proxyResp.status >= 400) {\n logEntry.status = status;\n logEntry.responseHeaders = responseHeaders;\n logEntry.responseBody = null;\n this.checkForMatch(logEntry);\n throw new Error(proxyResp.error || `Status ${proxyResp.status}`);\n }\n\n code = proxyResp.body;\n that.scriptCache.set(fullUrl, code);\n }\n\n logEntry.status = status;\n logEntry.responseHeaders = responseHeaders;\n logEntry.responseBody = code;\n this.checkForMatch(logEntry);\n\n that.handledModuleScriptUrls.add(fullUrl);\n await that.handleModuleScript(fullUrl, window, {\n cacheKey: `dynamic:${fullUrl}`,\n });\n return {};\n } finally {\n that.trackRequestEnd(pendingId);\n }\n },\n\n XMLHttpRequest: class {\n readyState: number = 0;\n status: number = 0;\n statusText: string = '';\n responseText: string = '';\n response: any = null;\n responseType: '' | 'text' | 'json' = '';\n responseURL: string = '';\n timeout: number = 0;\n withCredentials: boolean = false;\n onreadystatechange: ((ev?: any) => void) | null = null;\n onload: ((ev?: any) => void) | null = null;\n onloadend: ((ev?: any) => void) | null = null;\n onerror: ((ev?: any) => void) | null = null;\n onprogress: ((ev?: any) => void) | null = null;\n onabort: ((ev?: any) => void) | null = null;\n ontimeout: ((ev?: any) => void) | null = null;\n\n private method: string = 'GET';\n private url: string = '';\n private asyncFlag: boolean = true;\n private requestHeaders: Record<string, string> = {};\n private responseHeaders: Record<string, string> = {};\n private aborted: boolean = false;\n\n open(method: string, url: string, async: boolean = true) {\n this.method = String(method || 'GET').toUpperCase();\n this.url = new URL(String(url), window.location.href).toString();\n this.asyncFlag = async !== false;\n this.aborted = false;\n if (process.env.PHANTOM_DEBUG_XHR === '1') {\n console.log('[XHR open]', this.method, this.url);\n }\n this.readyState = 1;\n this.responseURL = this.url;\n this.onreadystatechange?.({ type: 'readystatechange' });\n }\n\n setRequestHeader(k: string, v: string) {\n this.requestHeaders[String(k)] = String(v);\n }\n\n addEventListener(type: string, cb: any) {\n // Minimal compatibility: map common events to handler props if present.\n if (type === 'load') this.onload = cb;\n if (type === 'error') this.onerror = cb;\n if (type === 'readystatechange') this.onreadystatechange = cb;\n if (type === 'progress') this.onprogress = cb;\n if (type === 'loadend') this.onloadend = cb;\n if (type === 'abort') this.onabort = cb;\n if (type === 'timeout') this.ontimeout = cb;\n }\n\n getAllResponseHeaders() {\n return Object.entries(this.responseHeaders)\n .map(([k, v]) => `${k}: ${v}\\r\\n`)\n .join('');\n }\n\n getResponseHeader(name: string) {\n const n = String(name || '').toLowerCase();\n for (const [k, v] of Object.entries(this.responseHeaders)) {\n if (k.toLowerCase() === n) return v;\n }\n return null;\n }\n\n abort() {\n this.aborted = true;\n this.readyState = 0;\n this.onabort?.({ type: 'abort' });\n this.onloadend?.({ type: 'loadend' });\n }\n\n async send(body?: any) {\n const start = Date.now();\n const headers = {\n 'User-Agent': window.navigator.userAgent,\n 'Cookie': window.document.cookie,\n 'Referer': window.location.href,\n ...this.requestHeaders,\n };\n\n const logEntry: NetworkLogEntry = {\n type: 'xhr',\n method: this.method,\n url: this.url,\n requestHeaders: headers,\n requestBody: body == null ? null : (typeof body === 'string' ? body : String(body)),\n timestamp: start,\n };\n that.logRequest(logEntry);\n if (process.env.PHANTOM_DEBUG_XHR === '1') {\n console.log('[XHR send]', this.method, this.url, {\n hasBody: body != null,\n headers,\n });\n }\n\n\t const doWork = async () => {\n\t const pendingId = that.trackRequestStart(this.url, 'xhr');\n\t try {\n if (this.aborted) return;\n const proxyResp = await that.fetchViaProxy(this.url, this.method, headers, (logEntry.requestBody as any) || '');\n if (proxyResp.error) throw new Error(proxyResp.error);\n\n this.responseHeaders = proxyResp.headers || {};\n this.status = proxyResp.status;\n this.statusText = proxyResp.status >= 200 && proxyResp.status < 300 ? 'OK' : '';\n this.readyState = 2;\n this.onreadystatechange?.({ type: 'readystatechange' });\n this.responseText = proxyResp.body ?? '';\n this.readyState = 3;\n this.onprogress?.({ type: 'progress', loaded: this.responseText.length, total: this.responseText.length, lengthComputable: true });\n this.onreadystatechange?.({ type: 'readystatechange' });\n this.readyState = 4;\n this.response = this.responseType === 'json'\n ? (() => { try { return JSON.parse(this.responseText); } catch { return null; } })()\n : this.responseText;\n\n logEntry.status = proxyResp.status;\n logEntry.responseHeaders = proxyResp.headers;\n logEntry.responseBody = proxyResp.body;\n that.checkForMatch(logEntry);\n\n this.onreadystatechange?.({ type: 'readystatechange' });\n this.onload?.({ type: 'load' });\n this.onloadend?.({ type: 'loadend' });\n } catch (e: any) {\n this.readyState = 4;\n this.status = 0;\n logEntry.status = 0;\n logEntry.responseBody = e?.message || String(e);\n that.checkForMatch(logEntry);\n this.onreadystatechange?.({ type: 'readystatechange' });\n this.onerror?.({ type: 'error', error: e });\n this.onloadend?.({ type: 'loadend' });\n\t } finally {\n\t that.trackRequestEnd(pendingId);\n\t }\n\t };\n\n if (this.asyncFlag) {\n window.setTimeout(() => { void doWork(); }, 0);\n } else {\n await doWork();\n }\n }\n }\n };\n\n // Also expose on window for code paths that reference these directly (not via AST rewrite).\n window.XMLHttpRequest = window.__phantom.XMLHttpRequest;\n window.EventSource = window.__phantom.EventSource;\n window.WebSocket = window.__phantom.WebSocket;\n }\n}\n", "import { parse } from '@babel/parser';\nimport traverse from '@babel/traverse';\nimport generate from '@babel/generator';\nimport * as t from '@babel/types';\nimport * as crypto from 'crypto';\nimport * as fs from 'fs';\nimport * as path from 'path';\n\nconst CACHE_DIR = path.join(process.cwd(), '.next/cache/phantom');\ntry {\n if (!fs.existsSync(CACHE_DIR)) fs.mkdirSync(CACHE_DIR, { recursive: true });\n} catch {\n // Best-effort; cache writes are optional.\n}\n\nconst memCache = new Map<string, string>();\nlet fsCacheEnabled = true;\n\nexport class Transformer {\n transform(code: string, scriptId: string): string {\n const hash = crypto.createHash('sha256').update(code).digest('hex');\n const cachePath = path.join(CACHE_DIR, `${hash}.js`);\n\n const memHit = memCache.get(hash);\n if (memHit) return memHit;\n \n if (fsCacheEnabled) {\n try {\n if (fs.existsSync(cachePath)) {\n const diskHit = fs.readFileSync(cachePath, 'utf-8');\n memCache.set(hash, diskHit);\n return diskHit;\n }\n } catch {\n // If the FS cache is flaky/slow, just disable it for this process.\n fsCacheEnabled = false;\n }\n }\n\n // Performance: request interception now happens via runtime shims in execute.ts.\n // Optional AST import() rewrite can be enabled if a target site depends on it.\n const needsRewrite =\n process.env.PHANTOM_ENABLE_AST_IMPORT_REWRITE === '1' &&\n code.includes('import(');\n\n if (!needsRewrite) {\n const passthrough = `try { ${code}\\n } catch(e) { console.warn('Script ${scriptId} runtime error:', e); }`;\n memCache.set(hash, passthrough);\n if (fsCacheEnabled) {\n try {\n fs.writeFileSync(cachePath, passthrough);\n } catch {\n fsCacheEnabled = false;\n }\n }\n return passthrough;\n }\n\n let ast;\n try {\n ast = parse(code, {\n sourceType: 'unambiguous',\n plugins: ['typescript', 'jsx']\n });\n } catch (e) {\n const fallback = `try { ${code} } catch(e) { console.error('Script ${scriptId} failed:', e); }`;\n memCache.set(hash, fallback);\n if (fsCacheEnabled) {\n try {\n fs.writeFileSync(cachePath, fallback);\n } catch {\n fsCacheEnabled = false;\n }\n }\n return fallback;\n }\n\n traverse(ast, {\n CallExpression(path) {\n if (path.node.callee.type === 'Import') {\n path.replaceWith(\n t.callExpression(\n t.memberExpression(\n t.identifier('__phantom'),\n t.identifier('dynamicImport')\n ),\n path.node.arguments\n )\n );\n }\n }\n });\n\n const output = generate(ast, { compact: true, minified: true }, code);\n \n const result = `try { \n ${output.code} \n } catch(e) { \n console.warn('Script ${scriptId} runtime error:', e); \n }`;\n \n memCache.set(hash, result);\n if (fsCacheEnabled) {\n try {\n fs.writeFileSync(cachePath, result);\n } catch {\n fsCacheEnabled = false;\n }\n }\n return result;\n }\n}\n", "import { AsyncLocalStorage } from \"node:async_hooks\";\nimport { spawn, type ChildProcessWithoutNullStreams } from \"node:child_process\";\nimport { randomUUID } from \"node:crypto\";\nimport path from \"node:path\";\nimport readline from \"node:readline\";\n\nexport type DynafetchNetRequest = {\n method: string;\n url: string;\n headers: Record<string, string>;\n headerOrder?: string[];\n body: string;\n proxy?: string;\n};\n\nexport type DynafetchNetResponse = {\n status: number;\n body: string;\n headers: Record<string, string>;\n finalUrl?: string;\n error?: string;\n retried?: boolean;\n};\n\ntype RpcEnvelope = {\n id: string;\n result?: unknown;\n error?: {\n code?: string;\n message?: string;\n };\n};\n\ntype PendingRequest = {\n resolve: (value: unknown) => void;\n reject: (error: Error) => void;\n};\n\ntype WorkerSessionOptions = {\n browserProfile?: string;\n timeoutSeconds?: number;\n proxy?: string;\n};\n\ntype WorkerTransportState = {\n child: ChildProcessWithoutNullStreams;\n pending: Map<string, PendingRequest>;\n};\n\nconst sessionStore = new AsyncLocalStorage<{ sessionId: string }>();\n\nlet transportPromise: Promise<WorkerTransportState> | null = null;\n\nfunction findPrecompiledBinary(): string | null {\n const platform = process.platform; // \"darwin\", \"linux\", \"win32\"\n const arch = process.arch === \"x64\" ? \"x64\" : \"arm64\";\n const ext = platform === \"win32\" ? \".exe\" : \"\";\n const name = `dynafetch-net-${platform}-${arch}${ext}`;\n\n // Look relative to this file. After bundling into dist/index.js, binaries\n // are at ../bin/. In development, they're in packages/dynafetch-net/bin/.\n const candidates = [\n path.resolve(__dirname, \"../bin\", name), // installed: dist/../bin\n path.resolve(__dirname, \"../../../dynafetch-net/bin\", name), // dev: dynafetch-core/src/net -> dynafetch-net/bin\n path.resolve(__dirname, \"../../../../packages/dynafetch-net/bin\", name), // dev: alt layout\n path.resolve(process.cwd(), \"packages/dynafetch-net/bin\", name), // dev: from workspace root\n ];\n\n for (const candidate of candidates) {\n try {\n const fs = require(\"fs\") as typeof import(\"fs\");\n fs.accessSync(candidate, fs.constants.X_OK);\n return candidate;\n } catch {}\n }\n return null;\n}\n\nfunction createWorkerCommand():\n | { command: string; args: string[]; cwd?: string }\n | { command: string; args: string[]; cwd: string } {\n const explicitBin = process.env.DYNAFETCH_NET_BIN?.trim();\n if (explicitBin) {\n return { command: explicitBin, args: [] };\n }\n\n const precompiled = findPrecompiledBinary();\n if (precompiled) {\n return { command: precompiled, args: [] };\n }\n\n // Fallback: try `go run` for development\n return {\n command: \"go\",\n args: [\"run\", \".\"],\n cwd: path.resolve(process.cwd(), \"packages/dynafetch-net\"),\n };\n}\n\nfunction createWorkerTransport(): Promise<WorkerTransportState> {\n const { command, args, cwd } = createWorkerCommand();\n const child = spawn(command, args, {\n cwd,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n env: process.env,\n });\n\n const pending = new Map<string, PendingRequest>();\n const rl = readline.createInterface({ input: child.stdout });\n\n rl.on(\"line\", (line) => {\n const trimmed = line.trim();\n if (!trimmed) return;\n\n let payload: RpcEnvelope;\n try {\n payload = JSON.parse(trimmed) as RpcEnvelope;\n } catch (error) {\n for (const entry of pending.values()) {\n entry.reject(new Error(`Invalid dynafetch-net response: ${String(error)}`));\n }\n pending.clear();\n return;\n }\n\n const request = pending.get(payload.id);\n if (!request) return;\n pending.delete(payload.id);\n\n if (payload.error) {\n request.reject(new Error(payload.error.message || payload.error.code || \"dynafetch-net request failed\"));\n return;\n }\n\n request.resolve(payload.result);\n });\n\n child.stderr.on(\"data\", (chunk) => {\n const message = chunk.toString().trim();\n if (message) {\n console.warn(`[dynafetch-net] ${message}`);\n }\n });\n\n const onExit = (code: number | null, signal: NodeJS.Signals | null) => {\n const reason = `dynafetch-net exited (code=${code ?? \"null\"}, signal=${signal ?? \"null\"})`;\n for (const entry of pending.values()) {\n entry.reject(new Error(reason));\n }\n pending.clear();\n transportPromise = null;\n };\n\n child.once(\"error\", (error) => {\n for (const entry of pending.values()) {\n entry.reject(error);\n }\n pending.clear();\n transportPromise = null;\n });\n child.once(\"exit\", onExit);\n\n return Promise.resolve({ child, pending });\n}\n\nasync function getWorkerTransport(): Promise<WorkerTransportState> {\n if (!transportPromise) {\n transportPromise = createWorkerTransport();\n }\n return transportPromise;\n}\n\nasync function callWorker<T>(method: string, params: unknown): Promise<T> {\n const transport = await getWorkerTransport();\n const id = randomUUID();\n const payload = JSON.stringify({ id, method, params });\n\n return await new Promise<T>((resolve, reject) => {\n transport.pending.set(id, { resolve: resolve as (value: unknown) => void, reject });\n transport.child.stdin.write(`${payload}\\n`, (error) => {\n if (!error) return;\n transport.pending.delete(id);\n reject(error);\n });\n });\n}\n\nexport async function withDynafetchSession<T>(\n options: WorkerSessionOptions,\n run: () => Promise<T>,\n): Promise<T> {\n const session = await callWorker<{ sessionId: string }>(\"openSession\", options);\n\n try {\n return await sessionStore.run({ sessionId: session.sessionId }, run);\n } finally {\n await callWorker(\"closeSession\", { sessionId: session.sessionId }).catch(() => {});\n }\n}\n\nexport async function dynafetchNetHealth(): Promise<{ ok: boolean; service: string }> {\n return await callWorker(\"health\", {});\n}\n\nexport async function dynafetchNetFetch(\n request: DynafetchNetRequest,\n options: WorkerSessionOptions & {\n followRedirect?: boolean;\n maxRedirects?: number;\n } = {},\n): Promise<DynafetchNetResponse> {\n const session = sessionStore.getStore();\n\n return await callWorker<DynafetchNetResponse>(\"fetch\", {\n sessionId: session?.sessionId,\n request,\n followRedirect: options.followRedirect,\n maxRedirects: options.maxRedirects,\n browserProfile: options.browserProfile,\n timeoutSeconds: options.timeoutSeconds,\n proxy: options.proxy,\n });\n}\n\nexport async function dynafetchNetBatchFetch(\n requests: DynafetchNetRequest[],\n options: WorkerSessionOptions & {\n followRedirect?: boolean;\n maxRedirects?: number;\n } = {},\n): Promise<DynafetchNetResponse[]> {\n const session = sessionStore.getStore();\n\n return await callWorker<DynafetchNetResponse[]>(\"batchFetch\", {\n sessionId: session?.sessionId,\n requests,\n followRedirect: options.followRedirect,\n maxRedirects: options.maxRedirects,\n browserProfile: options.browserProfile,\n timeoutSeconds: options.timeoutSeconds,\n proxy: options.proxy,\n });\n}\n", "import { dynafetchNetFetch, dynafetchNetBatchFetch } from \"../../packages/dynafetch-core/src/net/worker-client.ts\";\n\nexport interface ProxyRequest {\n method: string;\n url: string;\n headers: Record<string, string>;\n headerOrder?: string[];\n body: string;\n proxy?: string;\n}\n\nexport interface ProxyResponse {\n status: number;\n body: string;\n headers: Record<string, string>;\n finalUrl?: string;\n error?: string;\n}\n\nexport function getGoProxyUrl(): string {\n if (process.env.PHANTOM_DISABLE_PROXY === '1') return '';\n return process.env.DYNAFETCH_NET_BIN || 'stdio://dynafetch-net';\n}\n\nfunction headersToRecord(h: Headers): Record<string, string> {\n const out: Record<string, string> = {};\n h.forEach((v, k) => {\n out[k] = v;\n });\n // Undici supports multi Set-Cookie via getSetCookie().\n const anyH = h as any;\n if (typeof anyH.getSetCookie === 'function') {\n const sc = anyH.getSetCookie();\n if (Array.isArray(sc) && sc.length) out['set-cookie'] = sc.join('\\n');\n }\n return out;\n}\n\n/**\n * Fetches either via the Go proxy (when configured) or directly from the target URL.\n * We keep redirect handling \"manual\" so the caller can follow redirects consistently.\n */\nasync function directFetch(payload: ProxyRequest): Promise<ProxyResponse> {\n const init: RequestInit = {\n method: payload.method,\n headers: payload.headers,\n redirect: 'manual',\n };\n if (payload.body) init.body = payload.body;\n\n const resp = await fetch(payload.url, init);\n const body = await resp.text().catch(() => '');\n return { status: resp.status, body, headers: headersToRecord(resp.headers) };\n}\n\nasync function dynafetchWorkerFetch(payload: ProxyRequest): Promise<ProxyResponse> {\n const response = await dynafetchNetFetch(payload, {\n followRedirect: false,\n });\n\n return {\n status: response.status,\n body: response.body,\n headers: response.headers,\n finalUrl: response.finalUrl,\n error: response.error,\n };\n}\n\nexport async function phantomFetch(payload: ProxyRequest): Promise<ProxyResponse> {\n if (process.env.PHANTOM_DISABLE_PROXY === '1' || process.env.DYNAFETCH_DISABLE_NET === '1') {\n return directFetch(payload);\n }\n\n try {\n return await dynafetchWorkerFetch(payload);\n } catch (error) {\n if (process.env.DYNAFETCH_DISABLE_DIRECT_FALLBACK === '1') {\n throw error;\n }\n return await directFetch(payload);\n }\n}\n\n/**\n * Batch-fetch multiple requests in a single Go RPC call.\n * Falls back to parallel individual fetches if the proxy is disabled.\n */\nexport async function phantomBatchFetch(payloads: ProxyRequest[]): Promise<ProxyResponse[]> {\n if (payloads.length === 0) return [];\n\n if (process.env.PHANTOM_DISABLE_PROXY === '1' || process.env.DYNAFETCH_DISABLE_NET === '1') {\n return Promise.all(payloads.map(p => directFetch(p)));\n }\n\n try {\n const responses = await dynafetchNetBatchFetch(\n payloads,\n { followRedirect: false },\n );\n return responses.map(r => ({\n status: r.status,\n body: r.body,\n headers: r.headers,\n finalUrl: r.finalUrl,\n error: r.error,\n }));\n } catch (error) {\n if (process.env.DYNAFETCH_DISABLE_DIRECT_FALLBACK === '1') {\n throw error;\n }\n return Promise.all(payloads.map(p => directFetch(p)));\n }\n}\n", "export type HeaderOrder = string[];\n\nconst CHROME_146_USER_AGENT =\n \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36\";\n\nconst CHROME_146_SEC_CH_UA =\n \"\\\"Chromium\\\";v=\\\"146\\\", \\\"Not-A.Brand\\\";v=\\\"24\\\", \\\"Google Chrome\\\";v=\\\"146\\\"\";\n\n// Chrome-like request headers tuned for HTML document navigation.\n// Keep this in sync with the active Go TLS profile and browser signature.\nexport function chromeDocumentHeaders(): { headers: Record<string, string>; order: HeaderOrder } {\n const headers: Record<string, string> = {\n accept:\n \"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7\",\n \"accept-language\": \"en-US,en;q=0.9\",\n \"cache-control\": \"max-age=0\",\n priority: \"u=0, i\",\n \"sec-ch-ua\": CHROME_146_SEC_CH_UA,\n \"sec-ch-ua-mobile\": \"?0\",\n \"sec-ch-ua-platform\": \"\\\"macOS\\\"\",\n \"sec-fetch-dest\": \"document\",\n \"sec-fetch-mode\": \"navigate\",\n \"sec-fetch-site\": \"none\",\n \"sec-fetch-user\": \"?1\",\n \"upgrade-insecure-requests\": \"1\",\n \"user-agent\": CHROME_146_USER_AGENT,\n };\n\n const order: HeaderOrder = [\n \"accept\",\n \"accept-language\",\n \"cache-control\",\n \"priority\",\n \"sec-ch-ua\",\n \"sec-ch-ua-mobile\",\n \"sec-ch-ua-platform\",\n \"sec-fetch-dest\",\n \"sec-fetch-mode\",\n \"sec-fetch-site\",\n \"sec-fetch-user\",\n \"upgrade-insecure-requests\",\n \"user-agent\",\n ];\n\n return { headers, order };\n}\n\nexport function chromeSubresourceHeaders(referer: string): { headers: Record<string, string>; order: HeaderOrder } {\n const headers: Record<string, string> = {\n accept: \"*/*\",\n \"accept-language\": \"en-US,en;q=0.9\",\n \"sec-ch-ua\": CHROME_146_SEC_CH_UA,\n \"sec-ch-ua-mobile\": \"?0\",\n \"sec-ch-ua-platform\": \"\\\"macOS\\\"\",\n referer,\n \"user-agent\": CHROME_146_USER_AGENT,\n };\n const order: HeaderOrder = [\n \"accept\",\n \"accept-language\",\n \"sec-ch-ua\",\n \"sec-ch-ua-mobile\",\n \"sec-ch-ua-platform\",\n \"referer\",\n \"user-agent\",\n ];\n return { headers, order };\n}\n", "export type CompileMatcherInput = {\n matcher: string;\n matcherRegex?: boolean;\n fuzzyMatch?: boolean;\n};\n\nexport type MatchLocation = {\n index: number;\n length: number;\n};\n\nexport type CompiledMatcher = {\n kind: 'plain' | 'regex';\n raw: string;\n test: (value: string) => boolean;\n find: (value: string) => MatchLocation | null;\n};\n\nconst VALID_REGEX_FLAGS = new Set(['d', 'g', 'i', 'm', 's', 'u', 'v', 'y']);\n\nfunction hasOnlyValidFlags(flags: string): boolean {\n for (const ch of flags) {\n if (!VALID_REGEX_FLAGS.has(ch)) return false;\n }\n return true;\n}\n\nfunction dedupeFlags(flags: string): string {\n const seen = new Set<string>();\n let out = '';\n for (const ch of flags) {\n if (!seen.has(ch)) {\n seen.add(ch);\n out += ch;\n }\n }\n return out;\n}\n\nfunction parseRegexLiteral(input: string): { source: string; flags: string } | null {\n if (!input.startsWith('/')) return null;\n let lastSlash = -1;\n for (let i = input.length - 1; i > 0; i--) {\n if (input[i] !== '/') continue;\n let slashEscapes = 0;\n for (let j = i - 1; j >= 0 && input[j] === '\\\\'; j--) slashEscapes++;\n if (slashEscapes % 2 === 0) {\n lastSlash = i;\n break;\n }\n }\n if (lastSlash <= 0) return null;\n return {\n source: input.slice(1, lastSlash),\n flags: input.slice(lastSlash + 1),\n };\n}\n\nexport function compileMatcher(input: CompileMatcherInput): CompiledMatcher {\n const matcher = String(input.matcher ?? '');\n const fuzzyMatch = input.fuzzyMatch !== false;\n const matcherRegex = input.matcherRegex === true;\n\n if (!matcherRegex) {\n const needle = fuzzyMatch ? matcher.toLowerCase() : matcher;\n return {\n kind: 'plain',\n raw: matcher,\n test: (value: string) => {\n const hay = fuzzyMatch ? value.toLowerCase() : value;\n return hay.includes(needle);\n },\n find: (value: string) => {\n const hay = fuzzyMatch ? value.toLowerCase() : value;\n const idx = hay.indexOf(needle);\n if (idx < 0) return null;\n return { index: idx, length: Math.max(needle.length, 1) };\n },\n };\n }\n\n const parsed = parseRegexLiteral(matcher);\n const source = parsed ? parsed.source : matcher;\n let flags = parsed ? parsed.flags : '';\n if (!source) {\n throw new Error('Regex matcher cannot be empty.');\n }\n if (!hasOnlyValidFlags(flags)) {\n throw new Error(`Invalid regex flags \"${flags}\".`);\n }\n flags = dedupeFlags(flags);\n if (fuzzyMatch && !flags.includes('i')) flags += 'i';\n\n // Stateful flags make repeated test/exec calls brittle; remove them.\n const stableFlags = flags.replace(/[gy]/g, '');\n const regex = new RegExp(source, stableFlags);\n\n return {\n kind: 'regex',\n raw: matcher,\n test: (value: string) => regex.test(value),\n find: (value: string) => {\n const m = regex.exec(value);\n if (!m || typeof m.index !== 'number') return null;\n const len = typeof m[0] === 'string' ? m[0].length : 0;\n return { index: m.index, length: Math.max(len, 1) };\n },\n };\n}\n\n", "import type { ScriptAsset } from './types.ts';\n\nexport type ThirdPartyPolicy = 'execute-all' | 'skip-noncritical';\n\nexport type ScriptCategory =\n | 'application'\n | 'telemetry'\n | 'ads'\n | 'chat'\n | 'widget'\n | 'bot-defense'\n | 'unknown';\n\nconst TELEMETRY_URL_PATTERNS = [\n /google-analytics\\.com/i,\n /googletagmanager\\.com/i,\n /googleadservices\\.com/i,\n /doubleclick\\.net/i,\n /googleads\\.g\\.doubleclick\\.net/i,\n /posthog/i,\n /segment\\./i,\n /segmentcdn/i,\n /analytics/i,\n /mixpanel/i,\n /amplitude/i,\n /fullstory/i,\n /hotjar/i,\n /clarity\\.ms/i,\n /newrelic/i,\n /datadog/i,\n /bugsnag/i,\n /sentry/i,\n /logrocket/i,\n /heap/i,\n /rudderstack/i,\n /gtag\\/js/i,\n];\n\nconst AD_URL_PATTERNS = [\n /doubleclick/i,\n /adservice/i,\n /adsystem/i,\n /adnxs/i,\n /taboola/i,\n /outbrain/i,\n /criteo/i,\n /ads-twitter\\.com/i,\n /connect\\.facebook\\.net.*fbevents/i,\n];\n\nconst CHAT_URL_PATTERNS = [\n /intercom/i,\n /drift/i,\n /crisp\\.chat/i,\n /zendesk/i,\n /olark/i,\n /livechat/i,\n /tawk\\.to/i,\n];\n\nconst WIDGET_URL_PATTERNS = [\n /maps\\.googleapis\\.com\\/maps\\/api\\/js/i,\n /maps-api-v3/i,\n /recaptcha/i,\n /hcaptcha/i,\n /player\\.vimeo/i,\n /youtube\\.com\\/iframe_api/i,\n /static\\.zdassets\\.com/i,\n];\n\nconst BOT_DEFENSE_PATTERNS = [\n /perimeterx/i,\n /kasada/i,\n /kpsdk/i,\n /datadome/i,\n /px-cdn/i,\n];\n\nconst TELEMETRY_INLINE_PATTERNS = [\n /GoogleAnalyticsObject/i,\n /\\bgtag\\s*\\(/i,\n /\\bga\\s*\\(\\s*['\"]create['\"]/i,\n /\\bposthog\\b/i,\n /\\bmixpanel\\b/i,\n /\\bclarity\\s*\\(/i,\n /\\bfbq\\s*\\(/i,\n /\\bhj\\s*\\(/i,\n /\\bnewrelic\\b/i,\n /\\bdatadog\\b/i,\n /\\bSentry\\b/i,\n /\\bLogRocket\\b/i,\n];\n\nfunction hostnameOf(url: string): string {\n try {\n return new URL(url).hostname.toLowerCase();\n } catch {\n return '';\n }\n}\n\nfunction siteKey(hostname: string): string {\n const parts = hostname.split('.').filter(Boolean);\n if (parts.length <= 2) return hostname;\n return parts.slice(-2).join('.');\n}\n\nexport function isLikelySameSite(candidateUrl: string, pageUrl: string): boolean {\n try {\n const candidate = new URL(candidateUrl);\n const page = new URL(pageUrl);\n if (candidate.origin === page.origin) return true;\n return siteKey(candidate.hostname.toLowerCase()) === siteKey(page.hostname.toLowerCase());\n } catch {\n return false;\n }\n}\n\nfunction matchesAny(input: string, patterns: RegExp[]): boolean {\n return patterns.some((pattern) => pattern.test(input));\n}\n\nexport function classifyScriptAsset(script: Pick<ScriptAsset, 'url' | 'content' | 'scriptKind' | 'type'>, pageUrl: string): ScriptCategory {\n const url = script.url || '';\n const content = script.content || '';\n\n if (url && matchesAny(url, BOT_DEFENSE_PATTERNS)) return 'bot-defense';\n if (!url && matchesAny(content, BOT_DEFENSE_PATTERNS)) return 'bot-defense';\n\n if (url) {\n if (matchesAny(url, TELEMETRY_URL_PATTERNS)) return 'telemetry';\n if (matchesAny(url, AD_URL_PATTERNS)) return 'ads';\n if (matchesAny(url, CHAT_URL_PATTERNS)) return 'chat';\n if (matchesAny(url, WIDGET_URL_PATTERNS)) return 'widget';\n if (isLikelySameSite(url, pageUrl)) return 'application';\n if (script.scriptKind === 'module') return 'application';\n return 'unknown';\n }\n\n if (matchesAny(content, TELEMETRY_INLINE_PATTERNS)) return 'telemetry';\n return 'application';\n}\n\nexport function shouldSkipScriptCategory(category: ScriptCategory, policy: ThirdPartyPolicy): boolean {\n if (category === 'bot-defense') return true;\n if (policy === 'execute-all') return false;\n return category === 'telemetry' || category === 'ads' || category === 'chat' || category === 'widget';\n}\n\nexport function shouldSkipScriptAsset(\n script: Pick<ScriptAsset, 'url' | 'content' | 'scriptKind' | 'type'>,\n pageUrl: string,\n policy: ThirdPartyPolicy,\n): boolean {\n return shouldSkipScriptCategory(classifyScriptAsset(script, pageUrl), policy);\n}\n\nexport function shouldSkipDynamicScriptUrl(url: string, pageUrl: string, policy: ThirdPartyPolicy): boolean {\n return shouldSkipScriptAsset({ url, content: '', scriptKind: 'classic', type: 'external' }, pageUrl, policy);\n}\n", "import * as cheerio from 'cheerio';\nimport type { HarvestResult, ScriptAsset, NetworkLogEntry } from './types.ts';\nimport { phantomFetch, phantomBatchFetch } from './phantom-proxy.ts';\nimport type { ProxyRequest, ProxyResponse } from './phantom-proxy.ts';\nimport { chromeDocumentHeaders } from './headers.ts';\nimport { BlockedByBotProtectionError } from './errors.ts';\nimport { classifyScriptAsset, shouldSkipScriptAsset, type ThirdPartyPolicy } from './script-policy.ts';\nimport { prefetchModuleGraph } from './module-prefetch.ts';\n\nconst { headers: DEFAULT_HEADERS, order: DEFAULT_HEADER_ORDER } = chromeDocumentHeaders();\n\nexport interface NormalizedProxy {\n url: string;\n scopes: Set<string>;\n}\n\nexport interface HarvesterOptions {\n prefetchExternalScripts?: boolean;\n prefetchModulePreloads?: boolean;\n externalScriptConcurrency?: number;\n requestHeaders?: Record<string, string>;\n initialCookies?: string[];\n thirdPartyPolicy?: ThirdPartyPolicy;\n proxy?: NormalizedProxy;\n}\n\nasync function runWithLimit<T>(tasks: Array<() => Promise<T>>, limit: number): Promise<T[]> {\n const results: T[] = new Array(tasks.length);\n let next = 0;\n\n const workers = new Array(Math.max(1, limit)).fill(null).map(async () => {\n while (true) {\n const i = next++;\n if (i >= tasks.length) break;\n results[i] = await tasks[i]();\n }\n });\n\n await Promise.all(workers);\n return results;\n}\n\nexport class Harvester {\n private targetUrl: string;\n private cookies: string[] = [];\n private logs: NetworkLogEntry[] = [];\n private prefetchExternalScripts: boolean = true;\n private externalScriptConcurrency: number = 8;\n private requestHeaders: Record<string, string> = {};\n private thirdPartyPolicy: ThirdPartyPolicy = 'skip-noncritical';\n private prefetchModulePreloads: boolean = true;\n private proxy?: NormalizedProxy;\n\n constructor(url: string, opts: HarvesterOptions = {}) {\n this.targetUrl = url;\n this.prefetchExternalScripts = opts.prefetchExternalScripts !== false;\n this.externalScriptConcurrency = opts.externalScriptConcurrency ?? 8;\n this.requestHeaders = opts.requestHeaders ?? {};\n this.cookies = [...(opts.initialCookies ?? [])];\n this.thirdPartyPolicy = opts.thirdPartyPolicy ?? 'skip-noncritical';\n this.prefetchModulePreloads = opts.prefetchModulePreloads !== false;\n this.proxy = opts.proxy;\n }\n\n private proxyUrlForScope(scope: 'page' | 'api' | 'assets'): string | undefined {\n if (!this.proxy) return undefined;\n return this.proxy.scopes.has(scope) ? this.proxy.url : undefined;\n }\n\n private buildCookieHeader(): string {\n const pairs: string[] = [];\n for (const raw of this.cookies) {\n // Each Set-Cookie may contain multiple newline-separated values\n for (const single of raw.split('\\n')) {\n const nameVal = single.split(';')[0]?.trim();\n if (nameVal && nameVal.includes('=')) pairs.push(nameVal);\n }\n }\n return pairs.join('; ');\n }\n\n private async fetchViaProxy(\n url: string,\n headers: Record<string, string> = {},\n followRedirects: boolean = false,\n maxRedirects: number = 5,\n method: string = 'GET',\n body: string = '',\n proxyScope: 'page' | 'api' | 'assets' = 'page',\n ): Promise<{ status: number; body: string; headers: Record<string, string>; finalUrl: string }> {\n let currentUrl = url;\n let redirectCount = 0;\n let currentMethod = method;\n let currentBody = body;\n\n while (true) {\n try {\n // Inject accumulated cookies into request headers\n const cookieHeader = this.buildCookieHeader();\n const reqHeaders = { ...headers };\n if (cookieHeader) {\n reqHeaders['Cookie'] = cookieHeader;\n }\n\n const payload: ProxyRequest = {\n method: currentMethod,\n url: currentUrl,\n headers: reqHeaders,\n headerOrder: DEFAULT_HEADER_ORDER,\n body: currentBody,\n proxy: this.proxyUrlForScope(proxyScope),\n };\n\n const data = await phantomFetch(payload) as ProxyResponse;\n if (data.error) throw new Error(`Proxy Error: ${data.error}`);\n\n // Collect cookies from every response\n const setCookie = data.headers['Set-Cookie'] || data.headers['set-cookie'];\n if (setCookie) this.cookies.push(setCookie);\n\n if (followRedirects && data.status >= 300 && data.status < 400 && redirectCount < maxRedirects) {\n const location = data.headers['Location'] || data.headers['location'];\n if (location) {\n currentUrl = new URL(location, currentUrl).toString();\n console.log(`[Harvest] Following redirect to: ${currentUrl}`);\n redirectCount++;\n // Per HTTP spec: 302/303 redirects reset method to GET\n if (data.status === 302 || data.status === 303) {\n currentMethod = 'GET';\n currentBody = '';\n }\n continue;\n }\n }\n\n return { ...data, finalUrl: currentUrl };\n } catch (e) {\n console.error(`[Harvester] Proxy request failed for ${currentUrl}:`, e);\n throw e;\n }\n }\n }\n\n private isConsentWall(url: string, html: string): boolean {\n // High-confidence: URL is on a known consent domain\n const consentDomains = ['consent.yahoo.com', 'guce.yahoo.com', 'consent.google.com', 'consent.youtube.com'];\n try {\n const hostname = new URL(url).hostname;\n if (consentDomains.some(d => hostname.includes(d))) return true;\n } catch {}\n // HTML heuristic: require a dedicated consent form (class or hidden sessionId/csrfToken),\n // not just any page that mentions consent in a cookie banner\n const $ = cheerio.load(html);\n const hasConsentForm = $('form.consent-form').length > 0\n || $('form').filter((_, el) => {\n const $f = $(el);\n return $f.find('input[name=\"csrfToken\"]').length > 0\n && $f.find('input[name=\"sessionId\"]').length > 0;\n }).length > 0;\n return hasConsentForm;\n }\n\n private parseConsentForm(html: string, baseUrl: string): { action: string; fields: Record<string, string> } | null {\n try {\n const $ = cheerio.load(html);\n // Find the form \u2014 prefer one with an agree/accept button\n let $form = $('form').filter((_, el) => {\n const text = $(el).text().toLowerCase();\n return text.includes('agree') || text.includes('accept') || text.includes('consent');\n }).first();\n if (!$form.length) $form = $('form').first();\n if (!$form.length) return null;\n\n const action = $form.attr('action');\n // Empty action means POST to the current page URL\n const absoluteAction = (action === undefined || action === null)\n ? null\n : (action === '' ? baseUrl : new URL(action, baseUrl).toString());\n if (!absoluteAction) return null;\n\n const fields: Record<string, string> = {};\n $form.find('input[type=\"hidden\"]').each((_, el) => {\n const name = $(el).attr('name');\n const value = $(el).attr('value') ?? '';\n if (name) fields[name] = value;\n });\n\n // Add an agree field \u2014 different consent walls use different names\n const agreeBtn = $form.find('button[name], input[type=\"submit\"][name]').filter((_, el) => {\n const text = ($(el).text() + ' ' + ($(el).attr('value') ?? '')).toLowerCase();\n return text.includes('agree') || text.includes('accept') || text.includes('consent');\n }).first();\n if (agreeBtn.length) {\n const name = agreeBtn.attr('name');\n const value = agreeBtn.attr('value') ?? 'agree';\n if (name) fields[name] = value;\n } else {\n fields['agree'] = 'agree';\n }\n\n return { action: absoluteAction, fields };\n } catch {\n return null;\n }\n }\n\n private looksBlocked(status: number, body: string): boolean {\n if (status !== 403 && status !== 429 && status !== 503 && status !== 999) return false;\n const b = (body || '').toLowerCase();\n if (status === 999) return true;\n return (\n b.includes('just a moment') ||\n b.includes('challenge-platform') ||\n b.includes('__cf_chl') ||\n b.includes('cf-browser-verification') ||\n b.includes('enable javascript and cookies to continue') ||\n b.includes('security verification') ||\n b.includes('captcha') ||\n b.includes('trkcode=') ||\n b.includes('trkinfo=')\n );\n }\n\n async harvest(): Promise<HarvestResult> {\n console.log(`[Harvest] Fetching ${this.targetUrl} via TLS Proxy...`);\n let response = await this.fetchViaProxy(this.targetUrl, { ...DEFAULT_HEADERS, ...this.requestHeaders }, true);\n\n if (response.status >= 400) {\n console.log(`[Harvest] Response Body on Error:`, response.body.substring(0, 500));\n if (this.looksBlocked(response.status, response.body || '')) {\n throw new BlockedByBotProtectionError(\n this.targetUrl,\n `Site is blocked by bot protection (HTTP ${response.status}) and cannot be fetched from this environment: ${this.targetUrl}`,\n );\n }\n throw new Error(`Failed to fetch ${this.targetUrl}: ${response.status}`);\n }\n\n let finalUrl = response.finalUrl;\n let html = response.body;\n\n // --- Consent wall bypass ---\n if (this.isConsentWall(finalUrl, html)) {\n console.log(`[Harvest] Consent wall detected at ${finalUrl}, attempting bypass...`);\n const form = this.parseConsentForm(html, finalUrl);\n if (form) {\n try {\n const formBody = new URLSearchParams(form.fields).toString();\n const postHeaders = {\n ...DEFAULT_HEADERS,\n ...this.requestHeaders,\n 'Content-Type': 'application/x-www-form-urlencoded',\n 'Referer': finalUrl,\n 'Origin': new URL(finalUrl).origin,\n };\n const consentResp = await this.fetchViaProxy(form.action, postHeaders, true, 10, 'POST', formBody);\n if (consentResp.status < 400) {\n console.log(`[Harvest] Consent POST succeeded (${consentResp.status}), final URL: ${consentResp.finalUrl}`);\n // The POST redirect chain often lands directly on the real page \u2014 use it if so\n if (!this.isConsentWall(consentResp.finalUrl, consentResp.body)) {\n response = consentResp;\n finalUrl = consentResp.finalUrl;\n html = consentResp.body;\n console.log(`[Harvest] Consent bypass successful (from redirect), got real page at ${finalUrl}`);\n } else {\n // Redirect didn't land on the real page \u2014 re-fetch the original URL with consent cookies\n console.log(`[Harvest] Consent redirect still on consent page, re-fetching original URL...`);\n const retryResp = await this.fetchViaProxy(this.targetUrl, { ...DEFAULT_HEADERS, ...this.requestHeaders }, true);\n if (retryResp.status < 400 && !this.isConsentWall(retryResp.finalUrl, retryResp.body)) {\n response = retryResp;\n finalUrl = retryResp.finalUrl;\n html = retryResp.body;\n console.log(`[Harvest] Consent bypass successful (re-fetch), got real page at ${finalUrl}`);\n } else {\n console.warn(`[Harvest] Re-fetch after consent still returned consent wall, proceeding with original`);\n }\n }\n } else {\n console.warn(`[Harvest] Consent POST returned ${consentResp.status}, proceeding with consent page`);\n }\n } catch (e) {\n console.warn(`[Harvest] Consent bypass failed, proceeding with consent page:`, e);\n }\n } else {\n console.warn(`[Harvest] Could not parse consent form, proceeding with consent page`);\n }\n }\n\n const $ = cheerio.load(html);\n const scriptAssets: ScriptAsset[] = [];\n const modulePreloads: Array<{ url: string; content: string }> = [];\n const scriptTags = $('script');\n let skippedScriptCount = 0;\n \n // Collect metadata for batch-fetching external scripts\n const fetchTasks: Array<() => Promise<void>> = [];\n const batchScriptMeta: Array<{\n absoluteUrl: string;\n id: string;\n scriptKind: ScriptAsset['scriptKind'];\n category: ScriptAsset['category'];\n order: number;\n execution: ScriptAsset['execution'];\n headers: Record<string, string>;\n }> = [];\n let scriptCounter = 0;\n const seenModulePreloads = new Set<string>();\n\n for (let i = 0; i < scriptTags.length; i++) {\n const el = scriptTags[i];\n const $el = $(el);\n const src = $el.attr('src');\n const content = $el.html();\n const type = ($el.attr('type') || '').trim().toLowerCase();\n const isDefer = $el.attr('defer') !== undefined;\n const isAsync = $el.attr('async') !== undefined;\n const scriptKind: ScriptAsset['scriptKind'] = type === 'module' ? 'module' : 'classic';\n \n let execution: 'sync' | 'defer' | 'async' = 'sync';\n if (scriptKind === 'module') {\n execution = isAsync ? 'async' : 'defer';\n } else {\n if (isDefer) execution = 'defer';\n if (isAsync) execution = 'async';\n }\n\n if (type && type !== 'text/javascript' && type !== 'application/javascript' && type !== 'module' && !type.includes('json')) continue;\n if (type && (type === 'application/json' || type === 'application/ld+json')) continue;\n\n const order = i;\n const id = `script_${scriptCounter++}`;\n\n if (src) {\n const absoluteUrl = new URL(src, this.targetUrl).toString();\n const category = classifyScriptAsset({ url: absoluteUrl, content: content ?? '', scriptKind, type: 'external' }, this.targetUrl);\n if (shouldSkipScriptAsset({ url: absoluteUrl, content: content ?? '', scriptKind, type: 'external' }, this.targetUrl, this.thirdPartyPolicy)) {\n skippedScriptCount++;\n continue;\n }\n if (!this.prefetchExternalScripts) continue;\n\n // Collect metadata for batch fetch\n const pageOrigin = new URL(this.targetUrl).origin;\n const scriptOrigin = new URL(absoluteUrl).origin;\n batchScriptMeta.push({\n absoluteUrl,\n id,\n scriptKind,\n category,\n order,\n execution,\n headers: {\n ...DEFAULT_HEADERS,\n ...this.requestHeaders,\n 'Referer': this.targetUrl,\n 'Sec-Fetch-Dest': 'script',\n 'Sec-Fetch-Mode': scriptKind === 'module' ? 'cors' : 'no-cors',\n 'Sec-Fetch-Site': scriptOrigin === pageOrigin ? 'same-origin' : 'cross-site',\n },\n });\n } else if (content && content.trim().length > 0) {\n const category = classifyScriptAsset({ url: undefined, content, scriptKind, type: 'inline' }, this.targetUrl);\n if (shouldSkipScriptAsset({ url: undefined, content, scriptKind, type: 'inline' }, this.targetUrl, this.thirdPartyPolicy)) {\n skippedScriptCount++;\n continue;\n }\n scriptAssets.push({ id, type: 'inline', scriptKind, category, content, order, execution });\n }\n }\n\n // Collect modulepreload URLs for batch fetching\n const modulePreloadUrls: string[] = [];\n if (this.prefetchModulePreloads) {\n $('link[rel=\"modulepreload\"][href]').each((_, el) => {\n const href = $(el).attr('href');\n if (!href) return;\n const absoluteUrl = new URL(href, this.targetUrl).toString();\n if (seenModulePreloads.has(absoluteUrl)) return;\n seenModulePreloads.add(absoluteUrl);\n modulePreloadUrls.push(absoluteUrl);\n });\n }\n\n // Build combined batch: external scripts + modulepreloads in one RPC call.\n const pageOriginForPreloads = new URL(this.targetUrl).origin;\n const assetsProxyForPreloads = this.proxyUrlForScope('assets');\n const preloadPayloads = modulePreloadUrls.map(url => {\n const preloadOrigin = new URL(url).origin;\n return {\n method: 'GET',\n url,\n headers: {\n ...DEFAULT_HEADERS,\n ...this.requestHeaders,\n 'Referer': this.targetUrl,\n 'Sec-Fetch-Dest': 'script',\n 'Sec-Fetch-Mode': 'cors',\n 'Sec-Fetch-Site': preloadOrigin === pageOriginForPreloads ? 'same-origin' : 'cross-site',\n },\n headerOrder: DEFAULT_HEADER_ORDER,\n body: '',\n proxy: assetsProxyForPreloads,\n };\n });\n\n const assetsProxy = this.proxyUrlForScope('assets');\n const scriptPayloads = batchScriptMeta.map(m => ({\n method: 'GET',\n url: m.absoluteUrl,\n headers: m.headers,\n headerOrder: DEFAULT_HEADER_ORDER,\n body: '',\n proxy: assetsProxy,\n }));\n\n const allPayloads = [...scriptPayloads, ...preloadPayloads];\n if (allPayloads.length > 0) {\n console.log(`[Harvest] Batch-fetching ${scriptPayloads.length} scripts + ${preloadPayloads.length} modulepreloads...`);\n const allResponses = await phantomBatchFetch(allPayloads);\n\n // Process script responses\n for (let i = 0; i < batchScriptMeta.length; i++) {\n const meta = batchScriptMeta[i];\n const resp = allResponses[i];\n const logEntry: NetworkLogEntry = {\n type: 'resource_load',\n url: meta.absoluteUrl,\n timestamp: Date.now(),\n initiator: 'Harvester',\n status: resp.status,\n responseHeaders: resp.headers,\n responseBody: resp.status < 400 ? resp.body : null,\n };\n this.logs.push(logEntry);\n\n if (resp.status < 400) {\n scriptAssets.push({\n id: meta.id,\n type: 'external',\n scriptKind: meta.scriptKind,\n category: meta.category,\n url: meta.absoluteUrl,\n content: resp.body,\n order: meta.order,\n execution: meta.execution,\n });\n } else {\n console.warn(`[Harvest] Failed to fetch script ${meta.absoluteUrl}: status ${resp.status}`);\n }\n }\n\n // Process modulepreload responses\n for (let i = 0; i < modulePreloadUrls.length; i++) {\n const url = modulePreloadUrls[i];\n const resp = allResponses[batchScriptMeta.length + i];\n const logEntry: NetworkLogEntry = {\n type: 'resource_load',\n url,\n timestamp: Date.now(),\n initiator: 'Harvester.modulepreload',\n status: resp.status,\n responseHeaders: resp.headers,\n responseBody: resp.status < 400 ? resp.body : null,\n };\n this.logs.push(logEntry);\n\n if (resp.status < 400) {\n modulePreloads.push({ url, content: resp.body });\n }\n }\n }\n\n // Sort by order to ensure original execution sequence\n scriptAssets.sort((a, b) => a.order - b.order);\n\n const initialState: Record<string, any> = {};\n const statePatterns = [\n /window\\.__INITIAL_STATE__\\s*=\\s*({.+?});/,\n /window\\.__NEXT_DATA__\\s*=\\s*({.+?});/,\n /window\\.__NUXT__\\s*=\\s*({.+?});/,\n /window\\.__APP_DATA__\\s*=\\s*({.+?});/\n ];\n\n for (const pattern of statePatterns) {\n const match = html.match(pattern);\n if (match && match[1]) {\n try {\n initialState[pattern.toString()] = JSON.parse(match[1]);\n } catch (e) {}\n }\n }\n\n $('script[type=\"application/json\"]').each((_, el) => {\n const id = $(el).attr('id');\n const content = $(el).html();\n if (id && content) {\n try { initialState[id] = JSON.parse(content); } catch (e) {}\n }\n });\n\n $('[data-page], [data-props], [data-state]').each((index, el) => {\n const attrs = ['data-page', 'data-props', 'data-state'] as const;\n for (const attr of attrs) {\n const raw = $(el).attr(attr);\n if (!raw) continue;\n try {\n initialState[`attr:${attr}:${index}`] = JSON.parse(raw);\n } catch {}\n }\n });\n\n // Pre-warm the entire module dependency graph during harvest.\n // Seeds from external scripts + modulepreloads, then recursively fetches\n // all transitive imports in batches. This eliminates the serial waterfall\n // during esbuild bundling in the execute phase.\n const moduleGraphCache = new Map<string, string>();\n // Seed cache with everything we already fetched\n for (const s of scriptAssets) {\n if (s.url) moduleGraphCache.set(s.url, s.content);\n }\n for (const mp of modulePreloads) {\n moduleGraphCache.set(mp.url, mp.content);\n }\n\n const moduleEntryUrls = scriptAssets\n .filter(s => s.scriptKind === 'module' && s.url)\n .map(s => s.url!);\n\n if (moduleEntryUrls.length > 0 || modulePreloads.length > 0) {\n const rootUrls = [...moduleEntryUrls, ...modulePreloads.map(mp => mp.url)];\n await prefetchModuleGraph(rootUrls, moduleGraphCache, finalUrl, {\n proxyUrl: this.proxyUrlForScope('assets'),\n });\n }\n\n return {\n url: finalUrl,\n status: response.status,\n html,\n scripts: scriptAssets,\n modulePreloads,\n skippedScriptCount,\n initialState,\n cookies: this.cookies,\n headers: response.headers,\n logs: this.logs,\n moduleGraphCache,\n };\n }\n}\n", "export class BlockedByBotProtectionError extends Error {\n readonly kind = \"blocked\" as const\n readonly url: string\n\n constructor(url: string, message?: string) {\n super(message || `Blocked by bot protection while fetching: ${url}`)\n this.url = url\n this.name = \"BlockedByBotProtectionError\"\n }\n}\n\n", "import { phantomBatchFetch } from './phantom-proxy.ts';\nimport { chromeSubresourceHeaders } from './headers.ts';\n\nconst STUB_EXTENSIONS = new Set([\n '.css', '.png', '.jpg', '.jpeg', '.gif', '.webp', '.avif', '.svg',\n '.ico', '.woff', '.woff2', '.ttf', '.otf', '.eot', '.mp3', '.mp4',\n '.webm', '.mov', '.wasm',\n]);\n\nfunction isStubAsset(url: string): boolean {\n try {\n const p = new URL(url).pathname.toLowerCase();\n const ext = p.slice(p.lastIndexOf('.'));\n return STUB_EXTENSIONS.has(ext);\n } catch {\n const p = url.split('?')[0].split('#')[0].toLowerCase();\n const ext = p.slice(p.lastIndexOf('.'));\n return STUB_EXTENSIONS.has(ext);\n }\n}\n\nfunction scanImports(code: string, baseUrl: string, originFallback: string): string[] {\n const deps: string[] = [];\n const importRe = /(?:import|export)\\s*.*?from\\s*['\"]([^'\"]+)['\"]|import\\s*\\(\\s*['\"]([^'\"]+)['\"]\\s*\\)/g;\n let m: RegExpExecArray | null;\n while ((m = importRe.exec(code)) !== null) {\n const specifier = m[1] || m[2];\n if (!specifier) continue;\n let resolved: string;\n try {\n if (specifier.startsWith('http://') || specifier.startsWith('https://')) {\n resolved = specifier;\n } else if (specifier.startsWith('/')) {\n resolved = new URL(specifier, originFallback).toString();\n } else {\n resolved = new URL(specifier, baseUrl).toString();\n }\n } catch { continue; }\n if (!isStubAsset(resolved)) {\n deps.push(resolved);\n }\n }\n return deps;\n}\n\n/**\n * Recursively discovers and batch-fetches the entire module dependency graph\n * starting from the given root URLs. Populates the `cache` map with url\u2192source.\n * Returns the number of modules fetched.\n */\nexport async function prefetchModuleGraph(\n rootUrls: string[],\n cache: Map<string, string>,\n pageUrl: string,\n opts?: { maxRounds?: number; proxyUrl?: string },\n): Promise<number> {\n const maxRounds = opts?.maxRounds ?? 8;\n const { headers: subHeaders } = chromeSubresourceHeaders(pageUrl);\n subHeaders[\"sec-fetch-dest\"] = \"script\";\n subHeaders[\"sec-fetch-mode\"] = \"cors\";\n subHeaders[\"sec-fetch-site\"] = \"same-origin\";\n\n let origin: string;\n try { origin = new URL(pageUrl).origin; } catch { origin = pageUrl; }\n\n const seen = new Set<string>();\n let toFetch: string[] = [];\n let totalFetched = 0;\n\n // Seed pass: scan all cached sources to discover uncached deps\n const toScan = [...rootUrls];\n while (toScan.length > 0) {\n const url = toScan.pop()!;\n if (seen.has(url)) continue;\n seen.add(url);\n const code = cache.get(url);\n if (!code) {\n toFetch.push(url);\n continue;\n }\n const deps = scanImports(code, url, origin);\n for (const d of deps) {\n if (!seen.has(d)) toScan.push(d);\n }\n }\n\n // Iteratively batch-fetch unknowns and scan their imports\n for (let round = 0; round < maxRounds && toFetch.length > 0; round++) {\n if (process.env.PHANTOM_DEBUG_MODULES === '1') {\n console.log(`[prefetch] Round ${round}: ${toFetch.length} modules`);\n }\n\n const payloads = toFetch.map(u => ({\n method: 'GET',\n url: u,\n headers: { ...subHeaders },\n headerOrder: Object.keys(subHeaders),\n body: '',\n proxy: opts?.proxyUrl,\n }));\n\n const responses = await phantomBatchFetch(payloads);\n const newToScan: string[] = [];\n\n for (let i = 0; i < toFetch.length; i++) {\n const u = toFetch[i];\n const r = responses[i];\n if (r.status < 400 && r.body) {\n cache.set(u, r.body);\n totalFetched++;\n newToScan.push(u);\n }\n }\n\n toFetch = [];\n for (const url of newToScan) {\n const code = cache.get(url);\n if (!code) continue;\n const deps = scanImports(code, url, origin);\n for (const d of deps) {\n if (!seen.has(d)) {\n seen.add(d);\n if (cache.has(d)) {\n newToScan.push(d);\n } else {\n toFetch.push(d);\n }\n }\n }\n }\n }\n\n return totalFetched;\n}\n", "import type { HarvestResult } from \"../../../src/phantom/types.ts\";\nimport type { DynafetchFramework } from \"./types\";\n\nfunction hasScriptUrl(harvest: HarvestResult, pattern: RegExp): boolean {\n return harvest.scripts.some((script) => Boolean(script.url && pattern.test(script.url)));\n}\n\nexport function detectFramework(harvest: HarvestResult): DynafetchFramework {\n const html = harvest.html;\n const lower = html.toLowerCase();\n\n if (\n \"__NEXT_DATA__\" in harvest.initialState ||\n lower.includes(\"__next_data__\") ||\n lower.includes(\"/_next/\") ||\n hasScriptUrl(harvest, /\\/_next\\//i)\n ) {\n return \"nextjs\";\n }\n\n if (\n \"__NUXT__\" in harvest.initialState ||\n lower.includes(\"__nuxt\") ||\n hasScriptUrl(harvest, /\\/_nuxt\\//i)\n ) {\n return \"nuxt\";\n }\n\n if (\n lower.includes(\"window.__remixcontext\") ||\n lower.includes(\"remix-context\") ||\n hasScriptUrl(harvest, /\\/build\\/.*entry\\.client/i)\n ) {\n return \"remix\";\n }\n\n if (\n lower.includes(\"data-page=\") ||\n hasScriptUrl(harvest, /inertia-[^/]+\\.js/i) ||\n hasScriptUrl(harvest, /\\/vite\\/assets\\//i)\n ) {\n return \"inertia\";\n }\n\n if (\n lower.includes(\"astro-island\") ||\n lower.includes(\"__astro\") ||\n hasScriptUrl(harvest, /\\/_astro\\//i)\n ) {\n return \"astro\";\n }\n\n if (\n lower.includes(\"__sveltekit\") ||\n hasScriptUrl(harvest, /\\/_app\\/immutable\\//i)\n ) {\n return \"sveltekit\";\n }\n\n if (lower.includes(\"hx-get=\") || lower.includes(\"hx-post=\") || lower.includes(\"hx-trigger=\")) {\n return \"htmx\";\n }\n\n if (harvest.scripts.length > 0) {\n return \"generic-spa\";\n }\n\n return \"static\";\n}\n", "import type { HarvestResult } from \"../../../src/phantom/types.ts\";\nimport type { DynafetchFramework, DynafetchPlan } from \"./types\";\n\nexport function planDynafetch(\n framework: DynafetchFramework,\n harvest: HarvestResult,\n allowJsdomFallback: boolean,\n): DynafetchPlan {\n if (framework === \"static\" && harvest.scripts.length === 0) {\n return {\n framework,\n strategy: \"static-html\",\n reason: \"document has no executable scripts; return the fetched HTML directly\",\n };\n }\n\n if (!allowJsdomFallback) {\n return {\n framework,\n strategy: \"static-html\",\n reason: \"dynamic execution disabled; return the fetched HTML without script execution\",\n };\n }\n\n if (framework !== \"generic-spa\" && framework !== \"static\") {\n return {\n framework,\n strategy: \"framework-probe\",\n reason: \"known framework markers detected; run the lightweight runtime under framework-aware labeling\",\n };\n }\n\n return {\n framework,\n strategy: \"jsdom-fallback\",\n reason: \"generic client-rendered page requires runtime execution to recover dynamic HTML\",\n };\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["path", "path", "fs", "t", "isStubAsset", "p", "path", "cached", "pruned", "entry", "window", "url"]
7
+ }
package/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "@grabbit-labs/dynafetch",
3
- "version": "0.1.3",
3
+ "version": "0.2.0",
4
4
  "description": "Fetch any website like a real browser. Chrome TLS fingerprinting, JS execution, and request interception in one function call.",
5
5
  "type": "module",
6
- "main": "./src/index.ts",
7
- "types": "./src/index.ts",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
8
  "keywords": [
9
9
  "fetch",
10
10
  "scraper",
@@ -17,6 +17,26 @@
17
17
  "spa",
18
18
  "headless"
19
19
  ],
20
+ "files": [
21
+ "dist",
22
+ "bin",
23
+ "README.md"
24
+ ],
25
+ "scripts": {
26
+ "build": "node build.mjs",
27
+ "prepublishOnly": "node build.mjs"
28
+ },
29
+ "dependencies": {
30
+ "cheerio": "^1.2.0",
31
+ "jsdom": "27.0.0",
32
+ "esbuild": "^0.25.0",
33
+ "ws": "^8.19.0",
34
+ "@babel/core": "^7.29.0",
35
+ "@babel/parser": "^7.29.0",
36
+ "@babel/traverse": "^7.29.0",
37
+ "@babel/generator": "^7.29.1",
38
+ "@babel/types": "^7.29.0"
39
+ },
20
40
  "license": "MIT",
21
41
  "repository": {
22
42
  "type": "git",
package/src/index.ts DELETED
@@ -1 +0,0 @@
1
- export * from "../../dynafetch-core/src/index.ts";