@orkestrel/browser 0.0.13 → 0.0.14

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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["#transport","#pending","#subscriptions","#sessionSubscriptions","#timeout","#connected","#closing","#connecting","#closeRequested","#start","#nextId","#stop","#wired","#onMessage","#onClose","#onError","#active","#messageId","#dispatch","#frame","#frame","#budgetHandler","#handleBudget","#installed","#assert","#idle","#advancing","#budgetResolve","#frame","#active","#options","#stopJavaScript","#stopCSS","#client","#context","#pages","#options","#clearPage","#configurePage","#client","#sessionId","#emitter","#onBindingCalled","#handleBindingCalled","#onFrameNavigated","#handleFrameNavigated","#started","#destroyed","#stopping","#starting","#begin","#end","#actions","#shutdown","#destroy","#unsubscribe","#frame","#active","#frame","#writer","#completeHandler","#handleComplete","#active","#options","#completion","#wait","#tracing","#coverage","#performance","#frame","#category","#message","#default","#assert","#handling","#handled","#client","#context","#emitter","#id","#url","#name","#status","#received","#total","#path","#client","#session","#id","#assert","#disposed","#frame","#modifiers","#frame","#buttons","#point","#frame","#query","#resolve","#point","#boolean","#waitExpression","#string","#quad","#frame","#frame","#client","#session","#id","#parent","#name","#isolated","#selectors","#keyboard","#mouse","#touch","#url","#evaluate","#captureHTML","#sessionId","#context","#frame","#backend","#multiple","#assert","#handling","#handled","#network","#writer","#pending","#entries","#tasks","#requestHandler","#handleRequest","#responseHandler","#handleResponse","#failureHandler","#handleFailure","#finishHandler","#handleFinish","#replayHandler","#handleReplay","#recording","#options","#failure","#archive","#fallback","#track","#complete","#frame","#id","#request","#handled","#assert","#handling","#emitter","#id","#url","#closed","#frame","#emitter","#har","#routes","#sockets","#requestHandler","#handleRequest","#responseHandler","#handleResponse","#failureHandler","#handleFailure","#finishHandler","#handleFinish","#pausedHandler","#handlePause","#authHandler","#handleAuth","#socketHandler","#handleSocket","#socketReceiveHandler","#handleSocketReceive","#socketTransmitHandler","#handleSocketTransmit","#socketErrorHandler","#handleSocketError","#socketCloseHandler","#handleSocketClose","#destroyed","#started","#starting","#begin","#configure","#credentials","#fetch","#unsubscribe","#route","#authenticate","#subscribe","#page","#waits","#navigateHandler","#handleNavigate","#closeHandler","#handleClose","#timeout","#frame","#bindings","#scripts","#bindingHandler","#handleBinding","#assert","#subscribed","#destroyed","#call","#breadth","#depth","#owner","#candidates","#identity","#chain","#match","#owners","#roots","#client","#session","#id","#url","#category","#assert","#closed","#client","#targetId","#sessionId","#writer","#contextId","#opener","#emitter","#network","#navigationManager","#scripts","#accessibility","#diagnostics","#clock","#frameSessions","#frameIds","#downloads","#workers","#popups","#navigationResponseHandler","#handleNavigationResponse","#destroyHandler","#handleDestroy","#loadHandler","#handleLoad","#frameAttachedHandler","#handleFrameAttached","#frameNavigatedHandler","#handleFrameNavigated","#frameDetachedHandler","#handleFrameDetached","#dialogHandler","#handleDialog","#chooserHandler","#handleChooser","#consoleHandler","#handleConsole","#errorHandler","#handleError","#crashHandler","#handleCrash","#downloadHandler","#handleDownload","#downloadProgressHandler","#handleDownloadProgress","#attachedHandler","#handleAttached","#detachedHandler","#handleDetached","#closed","#navigation","#navigate","#reload","#history","#frame","#codegen","#codegenStart","#startCodegen","#closing","#destroy","#release","#close","#watchNavigation","#waitForLoadEvent","#clearNavigationWatch","#cancelLoad","#stopLoading","#completeNavigation","#navigateHistory","#responses","#sameDocument","#navigationResult","#releasing","#releaseResources","#resolveFrameSession","#enableFrameSession","#attachWorker","#detachChild","#attachPopup","#loadEvents","#resolveLoad","#loadResolve","#loadReject","#loadTimer","#rejectLoad","#clearLoad","#client","#context","#set","#cookies","#pages","#origin","#validate","#client","#id","#viewport","#writer","#downloads","#emitter","#cookies","#permissions","#storage","#emulation","#pages","#creating","#closed","#create","#syncing","#sync","#shutdown","#destroyResources","#closeResources","#attach","#closeTarget","#reattach","#openSession","#enableSession","#mainFrame","#configurePage","#applyViewport","#observe","#detachSession","#tryViewport","#settle","#finish","#adoptPopup"],"sources":["../../../src/core/constants.ts","../../../src/core/errors.ts","../../../src/core/helpers.ts","../../../src/core/CDPClient.ts","../../../src/core/BrowserAccessibility.ts","../../../src/core/BrowserClock.ts","../../../src/core/BrowserCoverage.ts","../../../src/core/BrowserCookieManager.ts","../../../src/core/BrowserEmulationManager.ts","../../../src/core/BrowserCodegen.ts","../../../src/core/BrowserPerformance.ts","../../../src/core/BrowserTracing.ts","../../../src/core/BrowserDiagnostics.ts","../../../src/core/BrowserDialog.ts","../../../src/core/BrowserDownload.ts","../../../src/core/BrowserHandle.ts","../../../src/core/BrowserKeyboard.ts","../../../src/core/BrowserMouse.ts","../../../src/core/BrowserLocator.ts","../../../src/core/BrowserSelectorManager.ts","../../../src/core/BrowserTouch.ts","../../../src/core/BrowserFrame.ts","../../../src/core/BrowserFileChooser.ts","../../../src/core/BrowserHARManager.ts","../../../src/core/BrowserRoute.ts","../../../src/core/BrowserWebSocket.ts","../../../src/core/BrowserNetworkManager.ts","../../../src/core/BrowserNavigationManager.ts","../../../src/core/BrowserScriptManager.ts","../../../src/core/BrowserSnapshot.ts","../../../src/core/BrowserWorker.ts","../../../src/core/BrowserPage.ts","../../../src/core/BrowserPermissionManager.ts","../../../src/core/BrowserStorageManager.ts","../../../src/core/BrowserContext.ts","../../../src/core/factories.ts"],"sourcesContent":["import type { BrowserMouseButton } from './types.js'\n\n// === Base64\n//\n// The lookup table is written out rather than computed from BASE64_CHARS at module scope:\n// constants.ts holds data, and a module-scope callback here is a placement violation the fleet\n// policy sweep rejects. Entry n of the table is BASE64_CHARS[n], and the whole-alphabet\n// round-trip in tests/src/core/helpers.test.ts fails on any single-entry disagreement.\n\n/** Base64 alphabet, index-ordered, used to build {@link BASE64_LOOKUP}. */\nexport const BASE64_CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\n\n/** Base64 character to 6-bit value lookup table, derived from {@link BASE64_CHARS}. */\nexport const BASE64_LOOKUP: Readonly<Record<string, number>> = Object.freeze({\n\tA: 0,\n\tB: 1,\n\tC: 2,\n\tD: 3,\n\tE: 4,\n\tF: 5,\n\tG: 6,\n\tH: 7,\n\tI: 8,\n\tJ: 9,\n\tK: 10,\n\tL: 11,\n\tM: 12,\n\tN: 13,\n\tO: 14,\n\tP: 15,\n\tQ: 16,\n\tR: 17,\n\tS: 18,\n\tT: 19,\n\tU: 20,\n\tV: 21,\n\tW: 22,\n\tX: 23,\n\tY: 24,\n\tZ: 25,\n\ta: 26,\n\tb: 27,\n\tc: 28,\n\td: 29,\n\te: 30,\n\tf: 31,\n\tg: 32,\n\th: 33,\n\ti: 34,\n\tj: 35,\n\tk: 36,\n\tl: 37,\n\tm: 38,\n\tn: 39,\n\to: 40,\n\tp: 41,\n\tq: 42,\n\tr: 43,\n\ts: 44,\n\tt: 45,\n\tu: 46,\n\tv: 47,\n\tw: 48,\n\tx: 49,\n\ty: 50,\n\tz: 51,\n\t'0': 52,\n\t'1': 53,\n\t'2': 54,\n\t'3': 55,\n\t'4': 56,\n\t'5': 57,\n\t'6': 58,\n\t'7': 59,\n\t'8': 60,\n\t'9': 61,\n\t'+': 62,\n\t'/': 63,\n})\n\n// === Browser\n\n/** Default timeout in milliseconds for browser connection, requests, and navigation. */\nexport const BROWSER_DEFAULT_TIMEOUT_MS = 30_000\n\n/**\n * Maximum serialized-character length for an `evaluate()`/`content()` result,\n * enforced IN-PAGE before the result is returned to CDP.\n *\n * @remarks\n * This counts UTF-16 STRING LENGTH (`String#length`), not transport BYTES —\n * the actual CDP frame is UTF-8 encoded (up to 3 bytes/char for common\n * multibyte content) and carries additional JSON/CDP framing overhead on top\n * of the raw content. A `Runtime.evaluate` result above this size, once\n * framed as a CDP JSON response, overflows the native WebSocket inbound frame\n * limit and closes the whole CDP connection — a page-level failure with no\n * clean error. The limit is set well under the observed ~3-4MB transport\n * ceiling (rather than at it) to leave headroom for the length-vs-bytes gap\n * and framing overhead. The cap is enforced by stringifying the candidate\n * result in-page and throwing a recognizable sentinel error (see\n * {@link BROWSER_RESULT_LIMIT_SENTINEL_PREFIX}) before the oversized frame is\n * ever produced, so the caller gets a coded error instead of a dropped\n * connection.\n */\nexport const BROWSER_RESULT_LIMIT = 2_500_000\n\n/**\n * Distinctive prefix for the in-page result-limit sentinel error, immediately\n * followed by the serialized length.\n *\n * @remarks\n * Deliberately unlikely to appear in a page's own thrown error text (unlike\n * a plain `BROWSER_RESULT_LIMIT: ` label), so {@link BROWSER_RESULT_LIMIT_PATTERN}\n * can distinguish the guard's own throw from a page error that merely\n * mentions similar text.\n */\nexport const BROWSER_RESULT_LIMIT_SENTINEL_PREFIX = '[[ORKESTREL_BROWSER_RESULT_LIMIT]]'\n\n/**\n * Matches the in-page result-limit sentinel error message, anchored\n * immediately after the `Error: ` (optionally `Uncaught Error: `) prefix that\n * Chromium prepends to a thrown error's description — so the guard's own\n * throw is recognized only at the message START, not wherever the substring\n * happens to occur.\n */\nexport const BROWSER_RESULT_LIMIT_PATTERN = new RegExp(\n\t`^(?:Uncaught )?Error: \\\\[\\\\[ORKESTREL_BROWSER_RESULT_LIMIT\\\\]\\\\](\\\\d+)`,\n)\n\n/** Poll interval in milliseconds while waiting for a selector to appear. */\nexport const BROWSER_WAIT_POLL_INTERVAL_MS = 100\n\n/** Default maximum node count accepted from a decoded CDP DOM snapshot. */\nexport const BROWSER_SNAPSHOT_NODE_LIMIT = 100_000\n\n/** Isolated-world name used for iframe evaluation. */\nexport const BROWSER_FRAME_WORLD_NAME = '__orkestrelBrowserFrame'\n\n/** Attribute used by the semantic test-id selector. */\nexport const BROWSER_TEST_ID_ATTRIBUTE = 'data-testid'\n\n/** Number of animation frames whose element bounds must agree before trusted input. */\nexport const BROWSER_STABLE_FRAME_COUNT = 2\n\n/** CDP Input modifier bit values keyed by canonical key name. */\nexport const BROWSER_KEY_MODIFIERS: Readonly<Record<string, number>> = Object.freeze({\n\tAlt: 1,\n\tControl: 2,\n\tMeta: 4,\n\tShift: 8,\n})\n\n/** CDP Input pressed-button bit values keyed by public mouse button. */\nexport const BROWSER_MOUSE_BUTTON_MASKS: Readonly<Record<BrowserMouseButton, number>> =\n\tObject.freeze({\n\t\tleft: 1,\n\t\tright: 2,\n\t\tmiddle: 4,\n\t\tback: 8,\n\t\tforward: 16,\n\t})\n\n/** Tool identity embedded in HAR 1.2 documents. */\nexport const BROWSER_HAR_CREATOR = Object.freeze({\n\tname: '@orkestrel/browser',\n\tversion: '0.0.11',\n})\n\n/** Attribute used to tag temporary screenshot styles and masks. */\nexport const BROWSER_SCREENSHOT_ATTRIBUTE = 'data-orkestrel-screenshot'\n\n/**\n * Bound (in milliseconds) on the best-effort `Page.stopLoading` call issued\n * after a failed `navigate()`.\n *\n * @remarks\n * A wedged renderer can make the underlying CDP call hang for the full\n * per-call timeout; capping it to a small fixed bound keeps a navigate\n * failure's total latency close to the original timeout instead of doubling\n * it. Best-effort only — never masks the original navigate error.\n */\nexport const BROWSER_STOP_LOADING_TIMEOUT_MS = 1_000\n\n/** Default viewport width in pixels. */\nexport const BROWSER_DEFAULT_VIEWPORT_WIDTH = 1280\n\n/** Default viewport height in pixels. */\nexport const BROWSER_DEFAULT_VIEWPORT_HEIGHT = 720\n\n// === Browser codegen\n\n/** Name of the CDP runtime binding the codegen recorder script calls into. */\nexport const BROWSER_CODEGEN_BINDING_NAME = '__orkestrelBrowserCodegen'\n\n/**\n * In-page recorder script injected via `Page.addScriptToEvaluateOnNewDocument`\n * and `Runtime.evaluate`.\n *\n * @remarks\n * Attaches capturing-phase listeners for `click`, `input` (fill), and\n * `change` (select) on `document`, builds a stable CSS selector for the\n * target element, and forwards each action to the CDP binding\n * ({@link BROWSER_CODEGEN_BINDING_NAME}) as a JSON string payload. Guarded to\n * install exactly once per document (`window[name]` sentinel) so repeated\n * injection on every new document is idempotent.\n */\nexport const BROWSER_CODEGEN_SOURCE = `(() => {\n\tconst bindingName = ${JSON.stringify(BROWSER_CODEGEN_BINDING_NAME)}\n\tif (window[bindingName + '__installed']) return\n\twindow[bindingName + '__installed'] = true\n\n\tconst selectorFor = (el) => {\n\t\tif (el.id) return '#' + CSS.escape(el.id)\n\t\tconst parts = []\n\t\tlet node = el\n\t\twhile (node && node.nodeType === 1 && parts.length < 8) {\n\t\t\tlet part = node.tagName.toLowerCase()\n\t\t\tif (node.classList && node.classList.length > 0) {\n\t\t\t\tpart += '.' + Array.from(node.classList).map((cls) => CSS.escape(cls)).join('.')\n\t\t\t}\n\t\t\tconst parent = node.parentElement\n\t\t\tif (parent) {\n\t\t\t\tconst siblings = Array.from(parent.children).filter((c) => c.tagName === node.tagName)\n\t\t\t\tif (siblings.length > 1) {\n\t\t\t\t\tpart += ':nth-of-type(' + (siblings.indexOf(node) + 1) + ')'\n\t\t\t\t}\n\t\t\t}\n\t\t\tparts.unshift(part)\n\t\t\tnode = parent\n\t\t}\n\t\treturn parts.join(' > ')\n\t}\n\n\tconst send = (payload) => {\n\t\tif (typeof window[bindingName] === 'function') {\n\t\t\twindow[bindingName](JSON.stringify(payload))\n\t\t}\n\t}\n\n\tdocument.addEventListener(\n\t\t'click',\n\t\t(event) => {\n\t\t\tconst target = event.target\n\t\t\tif (!target || target.nodeType !== 1) return\n\t\t\tsend({ action: 'click', selector: selectorFor(target) })\n\t\t},\n\t\ttrue,\n\t)\n\n\tconst fillableTypes = new Set([\n\t\t'text',\n\t\t'search',\n\t\t'url',\n\t\t'tel',\n\t\t'email',\n\t\t'password',\n\t\t'number',\n\t])\n\n\tdocument.addEventListener(\n\t\t'input',\n\t\t(event) => {\n\t\t\tconst target = event.target\n\t\t\tif (!target || target.nodeType !== 1) return\n\n\t\t\tif (target.isContentEditable) {\n\t\t\t\tsend({ action: 'fill', selector: selectorFor(target), value: target.textContent || '' })\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif (typeof target.value !== 'string') return\n\t\t\tconst tag = target.tagName\n\t\t\tif (tag === 'TEXTAREA') {\n\t\t\t\tsend({ action: 'fill', selector: selectorFor(target), value: target.value })\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (tag === 'INPUT' && fillableTypes.has((target.type || 'text').toLowerCase())) {\n\t\t\t\tsend({ action: 'fill', selector: selectorFor(target), value: target.value })\n\t\t\t}\n\t\t},\n\t\ttrue,\n\t)\n\n\tdocument.addEventListener(\n\t\t'change',\n\t\t(event) => {\n\t\t\tconst target = event.target\n\t\t\tif (!target || target.tagName !== 'SELECT') return\n\t\t\tconst values = Array.from(target.selectedOptions || []).map((option) => option.value)\n\t\t\tsend({ action: 'select', selector: selectorFor(target), values })\n\t\t},\n\t\ttrue,\n\t)\n})()`\n","import { isInstance } from '@orkestrel/contract'\n\n// === Browser errors\n\n/**\n * Base error for all browser automation operations.\n *\n * @remarks\n * Carries a machine-readable `code` and optional `context` (AGENTS §12) so\n * callers can branch in a `catch` without parsing message strings.\n */\nexport class BrowserError extends Error {\n\treadonly code: string\n\treadonly context: Readonly<Record<string, unknown>> | undefined\n\n\tconstructor(\n\t\tmessage: string,\n\t\tcode = 'BROWSER_ERROR',\n\t\tcontext?: Readonly<Record<string, unknown>>,\n\t) {\n\t\tsuper(message)\n\t\tthis.name = 'BrowserError'\n\t\tthis.code = code\n\t\tthis.context = context\n\t}\n}\n\n/**\n * A selector-based lookup or wait timed out without the element appearing.\n */\nexport class BrowserSelectorError extends BrowserError {\n\tconstructor(message: string, context?: Readonly<Record<string, unknown>>) {\n\t\tsuper(message, 'BROWSER_SELECTOR_ERROR', context)\n\t\tthis.name = 'BrowserSelectorError'\n\t}\n}\n\n/**\n * A CDP request received an error response from the remote endpoint.\n *\n * @remarks\n * Carries the originating `method` plus the CDP error's own `code`,\n * `message`, and `data` (when present) in `context`, so callers can branch\n * on the protocol-level error instead of parsing the message string.\n */\nexport class CDPError extends BrowserError {\n\tconstructor(message: string, context?: Readonly<Record<string, unknown>>) {\n\t\tsuper(message, 'BROWSER_CDP_ERROR', context)\n\t\tthis.name = 'CDPError'\n\t}\n}\n\n/**\n * A CDP request could not be sent or completed because the client was not in\n * a connectable state (not connected, closed while connecting, or the\n * connection dropped mid-request).\n */\nexport class CDPConnectionError extends BrowserError {\n\tconstructor(message: string, context?: Readonly<Record<string, unknown>>) {\n\t\tsuper(message, 'BROWSER_CDP_CONNECTION_ERROR', context)\n\t\tthis.name = 'CDPConnectionError'\n\t}\n}\n\n/**\n * A pending CDP request was not answered within its timeout window.\n */\nexport class CDPTimeoutError extends BrowserError {\n\tconstructor(message: string, context?: Readonly<Record<string, unknown>>) {\n\t\tsuper(message, 'BROWSER_CDP_TIMEOUT_ERROR', context)\n\t\tthis.name = 'CDPTimeoutError'\n\t}\n}\n\n/**\n * An `evaluate()`/`content()` result exceeded {@link BROWSER_RESULT_LIMIT}\n * and was rejected in-page before it could overflow the CDP transport frame.\n */\nexport class BrowserResultLimitError extends BrowserError {\n\tconstructor(message: string, context?: Readonly<Record<string, unknown>>) {\n\t\tsuper(message, 'BROWSER_RESULT_LIMIT_ERROR', context)\n\t\tthis.name = 'BrowserResultLimitError'\n\t}\n}\n\n// === Browser type guards\n\n/**\n * Narrow an unknown value to BrowserError.\n *\n * @param value - Value to check\n * @returns True when value is a BrowserError instance\n */\nexport function isBrowserError(value: unknown): value is BrowserError {\n\treturn isInstance(value, BrowserError)\n}\n\n/**\n * Narrow an unknown value to BrowserSelectorError.\n *\n * @param value - Value to check\n * @returns True when value is a BrowserSelectorError instance\n */\nexport function isBrowserSelectorError(value: unknown): value is BrowserSelectorError {\n\treturn isInstance(value, BrowserSelectorError)\n}\n\n/**\n * Narrow an unknown value to CDPError.\n *\n * @param value - Value to check\n * @returns True when value is a CDPError instance\n */\nexport function isCDPError(value: unknown): value is CDPError {\n\treturn isInstance(value, CDPError)\n}\n\n/**\n * Narrow an unknown value to CDPConnectionError.\n *\n * @param value - Value to check\n * @returns True when value is a CDPConnectionError instance\n */\nexport function isCDPConnectionError(value: unknown): value is CDPConnectionError {\n\treturn isInstance(value, CDPConnectionError)\n}\n\n/**\n * Narrow an unknown value to CDPTimeoutError.\n *\n * @param value - Value to check\n * @returns True when value is a CDPTimeoutError instance\n */\nexport function isCDPTimeoutError(value: unknown): value is CDPTimeoutError {\n\treturn isInstance(value, CDPTimeoutError)\n}\n\n/**\n * Narrow an unknown value to BrowserResultLimitError.\n *\n * @param value - Value to check\n * @returns True when value is a BrowserResultLimitError instance\n */\nexport function isBrowserResultLimitError(value: unknown): value is BrowserResultLimitError {\n\treturn isInstance(value, BrowserResultLimitError)\n}\n","import type {\n\tBrowserCodegenAction,\n\tBrowserCodegenScriptOptions,\n\tBrowserBindingCall,\n\tBrowserChord,\n\tBrowserCookie,\n\tBrowserCookieInput,\n\tBrowserCookiePartition,\n\tBrowserConsoleMessage,\n\tBrowserContextOptions,\n\tBrowserCoverageRange,\n\tBrowserDocument,\n\tBrowserDownloadProgress,\n\tBrowserDownloadStart,\n\tBrowserEmulationOptions,\n\tBrowserFrameInfo,\n\tBrowserFunctionCoverage,\n\tBrowserHAR,\n\tBrowserHAREntry,\n\tBrowserHARPending,\n\tBrowserHARValue,\n\tBrowserLayout,\n\tBrowserMetric,\n\tBrowserActionabilityOptions,\n\tBrowserActionOptions,\n\tBrowserAccessibilityOptions,\n\tBrowserAccessibilitySnapshot,\n\tBrowserAXNode,\n\tBrowserKey,\n\tBrowserNode,\n\tBrowserNodePredicate,\n\tBrowserNodeQuery,\n\tBrowserPageError,\n\tBrowserProfile,\n\tBrowserProfileFrame,\n\tBrowserProfileNode,\n\tBrowserMouseButton,\n\tBrowserPoint,\n\tBrowserPDFOptions,\n\tBrowserMedia,\n\tBrowserRequest,\n\tBrowserRequestFailure,\n\tBrowserResponse,\n\tBrowserRouteQuery,\n\tBrowserSecurity,\n\tBrowserQuad,\n\tBrowserQuery,\n\tBrowserRect,\n\tBrowserSnapshotInput,\n\tBrowserScriptCoverage,\n\tBrowserScreenshotOptions,\n\tBrowserStorageEntry,\n\tBrowserStorageOrigin,\n\tBrowserStreamChunk,\n\tBrowserStackFrame,\n\tBrowserStyleCoverage,\n\tBrowserTiming,\n\tBrowserTimingRange,\n\tBrowserViewport,\n\tBrowserWebSocketFrame,\n} from './types.js'\nimport {\n\tattempt,\n\tisArray,\n\tisBoolean,\n\tisFiniteNumber,\n\tisFunction,\n\tisInteger,\n\tisRecord,\n\tisString,\n\tparseArray,\n\tparseEnum,\n\tparseJSON,\n} from '@orkestrel/contract'\nimport {\n\tBASE64_CHARS,\n\tBASE64_LOOKUP,\n\tBROWSER_RESULT_LIMIT,\n\tBROWSER_RESULT_LIMIT_PATTERN,\n\tBROWSER_RESULT_LIMIT_SENTINEL_PREFIX,\n\tBROWSER_SCREENSHOT_ATTRIBUTE,\n\tBROWSER_SNAPSHOT_NODE_LIMIT,\n\tBROWSER_STABLE_FRAME_COUNT,\n\tBROWSER_TEST_ID_ATTRIBUTE,\n\tBROWSER_KEY_MODIFIERS,\n\tBROWSER_MOUSE_BUTTON_MASKS,\n\tBROWSER_WAIT_POLL_INTERVAL_MS,\n} from './constants.js'\nimport { BrowserError, BrowserResultLimitError } from './errors.js'\n\n/**\n * Decode a base64-encoded string into raw bytes.\n *\n * @remarks\n * Pure JS implementation — no `Buffer`, no `atob` (DOM-only) — so it runs\n * identically in Node and browser environments. Whitespace and `=` padding\n * are ignored; invalid characters are skipped.\n *\n * @param text - Base64-encoded input string\n * @returns Decoded bytes\n *\n * @example\n * ```ts\n * decodeBase64('aGVsbG8=') // Uint8Array [104, 101, 108, 108, 111]\n * ```\n */\nexport function decodeBase64(text: string): Uint8Array {\n\tconst clean = text.replace(/[^A-Za-z0-9+/]/g, '')\n\tconst bytes: number[] = []\n\n\tlet buffer = 0\n\tlet bits = 0\n\n\tfor (const char of clean) {\n\t\tconst value = BASE64_LOOKUP[char]\n\t\tif (value === undefined) continue\n\n\t\tbuffer = (buffer << 6) | value\n\t\tbits += 6\n\n\t\tif (bits >= 8) {\n\t\t\tbits -= 8\n\t\t\tbytes.push((buffer >> bits) & 0xff)\n\t\t}\n\t}\n\n\treturn new Uint8Array(bytes)\n}\n\n/**\n * Encode raw bytes as base64 without relying on Node or DOM globals.\n *\n * @param bytes - Raw input bytes\n * @returns Base64 text\n */\nexport function encodeBase64(bytes: Uint8Array): string {\n\tlet result = ''\n\tfor (let index = 0; index < bytes.length; index += 3) {\n\t\tconst first = bytes[index]\n\t\tconst second = bytes[index + 1]\n\t\tconst third = bytes[index + 2]\n\t\tif (first === undefined) break\n\t\tconst value = (first << 16) | ((second ?? 0) << 8) | (third ?? 0)\n\t\tresult += BASE64_CHARS[(value >> 18) & 63] ?? ''\n\t\tresult += BASE64_CHARS[(value >> 12) & 63] ?? ''\n\t\tresult += second === undefined ? '=' : (BASE64_CHARS[(value >> 6) & 63] ?? '')\n\t\tresult += third === undefined ? '=' : (BASE64_CHARS[value & 63] ?? '')\n\t}\n\treturn result\n}\n\n/** Encode UTF-8 text as bytes. */\nexport function textToBytes(value: string): Uint8Array {\n\treturn new TextEncoder().encode(value)\n}\n\n/** Decode UTF-8 bytes as text. */\nexport function bytesToText(value: Uint8Array): string {\n\treturn new TextDecoder().decode(value)\n}\n\n/**\n * Convert a header record to Fetch-domain name/value entries.\n *\n * @param headers - Header record\n * @returns Protocol header entries\n */\nexport function browserHeadersToProtocol(\n\theaders: Readonly<Record<string, string>>,\n): ReadonlyArray<Readonly<Record<string, string>>> {\n\treturn Object.entries(headers).map(([name, value]) => ({ name, value }))\n}\n\n/**\n * Decode a Chromium Headers object into string values.\n *\n * @param value - Unknown headers\n * @returns Frozen-compatible header record\n */\nexport function readBrowserHeaders(value: unknown): Readonly<Record<string, string>> {\n\tif (!isRecord(value)) return {}\n\tconst headers: Record<string, string> = {}\n\tfor (const [name, entry] of Object.entries(value)) {\n\t\tif (isString(entry) || isFiniteNumber(entry)) headers[name] = String(entry)\n\t}\n\treturn headers\n}\n\n/**\n * Decode one `Network.requestWillBeSent` or `Fetch.requestPaused` event.\n *\n * @param value - Unknown event parameters\n * @returns Request or undefined\n */\nexport function readBrowserRequest(value: unknown): BrowserRequest | undefined {\n\tif (!isRecord(value) || !isString(value['requestId']) || !isRecord(value['request'])) {\n\t\treturn undefined\n\t}\n\tconst request = value['request']\n\tif (!isString(request['url']) || !isString(request['method'])) {\n\t\treturn undefined\n\t}\n\tconst timestamp = isFiniteNumber(value['timestamp']) ? value['timestamp'] : undefined\n\tconst walltime = isFiniteNumber(value['wallTime']) ? value['wallTime'] : undefined\n\treturn {\n\t\tid: value['requestId'],\n\t\tloader: isString(value['loaderId']) ? value['loaderId'] : undefined,\n\t\tframe: isString(value['frameId']) ? value['frameId'] : undefined,\n\t\turl: request['url'],\n\t\tmethod: request['method'],\n\t\theaders: readBrowserHeaders(request['headers']),\n\t\tpost: isString(request['postData']) ? request['postData'] : undefined,\n\t\tresource: isString(value['type'])\n\t\t\t? value['type']\n\t\t\t: isString(value['resourceType'])\n\t\t\t\t? value['resourceType']\n\t\t\t\t: undefined,\n\t\ttimestamp,\n\t\twalltime,\n\t\tredirect: readBrowserResponseRecord(\n\t\t\tvalue['redirectResponse'],\n\t\t\tvalue['requestId'],\n\t\t\tisString(value['loaderId']) ? value['loaderId'] : '',\n\t\t\tisString(value['frameId']) ? value['frameId'] : undefined,\n\t\t\ttimestamp ?? 0,\n\t\t),\n\t}\n}\n\n/**\n * Decode one `Network.responseReceived` event.\n *\n * @param value - Unknown event parameters\n * @returns Response or undefined\n */\nexport function readBrowserResponse(value: unknown): BrowserResponse | undefined {\n\tif (\n\t\t!isRecord(value) ||\n\t\t!isString(value['requestId']) ||\n\t\t!isString(value['loaderId']) ||\n\t\t!isFiniteNumber(value['timestamp'])\n\t) {\n\t\treturn undefined\n\t}\n\treturn readBrowserResponseRecord(\n\t\tvalue['response'],\n\t\tvalue['requestId'],\n\t\tvalue['loaderId'],\n\t\tisString(value['frameId']) ? value['frameId'] : undefined,\n\t\tvalue['timestamp'],\n\t)\n}\n\n/**\n * Decode one Chromium response object with its event identity.\n *\n * @param value - Unknown response object\n * @param id - Request id\n * @param loader - Loader id\n * @param frame - Optional frame id\n * @param timestamp - Monotonic event timestamp\n * @returns Response or undefined\n */\nexport function readBrowserResponseRecord(\n\tvalue: unknown,\n\tid: string,\n\tloader: string,\n\tframe: string | undefined,\n\ttimestamp: number,\n): BrowserResponse | undefined {\n\tif (\n\t\t!isRecord(value) ||\n\t\t!isString(value['url']) ||\n\t\t!isFiniteNumber(value['status']) ||\n\t\t!isString(value['statusText']) ||\n\t\t!isString(value['mimeType']) ||\n\t\t!isString(value['protocol']) ||\n\t\t!isFiniteNumber(timestamp)\n\t) {\n\t\treturn undefined\n\t}\n\treturn {\n\t\tid,\n\t\tloader,\n\t\tframe,\n\t\turl: value['url'],\n\t\tstatus: value['status'],\n\t\tphrase: value['statusText'],\n\t\theaders: readBrowserHeaders(value['headers']),\n\t\tmime: value['mimeType'],\n\t\tprotocol: value['protocol'],\n\t\taddress: isString(value['remoteIPAddress']) ? value['remoteIPAddress'] : undefined,\n\t\tport: isFiniteNumber(value['remotePort']) ? value['remotePort'] : undefined,\n\t\tcached: value['fromDiskCache'] === true || value['fromPrefetchCache'] === true,\n\t\tworker: value['fromServiceWorker'] === true,\n\t\ttimestamp,\n\t\ttiming: readBrowserTiming(value['timing']),\n\t\tsecurity: readBrowserSecurity(value['securityDetails']),\n\t}\n}\n\n/**\n * Decode Chromium response timing.\n *\n * @param value - Unknown timing object\n * @returns Timing or undefined\n */\nexport function readBrowserTiming(value: unknown): BrowserTiming | undefined {\n\tif (!isRecord(value) || !isFiniteNumber(value['requestTime']) || value['requestTime'] < 0) {\n\t\treturn undefined\n\t}\n\tconst receive = value['receiveHeadersEnd']\n\treturn {\n\t\trequest: value['requestTime'],\n\t\tproxy: readBrowserTimingRange(value, 'proxyStart', 'proxyEnd'),\n\t\tdns: readBrowserTimingRange(value, 'dnsStart', 'dnsEnd'),\n\t\tconnect: readBrowserTimingRange(value, 'connectStart', 'connectEnd'),\n\t\tssl: readBrowserTimingRange(value, 'sslStart', 'sslEnd'),\n\t\tsend: readBrowserTimingRange(value, 'sendStart', 'sendEnd'),\n\t\treceive: isFiniteNumber(receive) && receive >= 0 ? receive : undefined,\n\t}\n}\n\n/**\n * Decode one start/end pair from Chromium network timing data.\n *\n * @param value - Unknown timing object\n * @param start - Start field\n * @param end - End field\n * @returns Timing range or undefined\n */\nexport function readBrowserTimingRange(\n\tvalue: unknown,\n\tstart: string,\n\tend: string,\n): BrowserTimingRange | undefined {\n\tif (!isRecord(value)) return undefined\n\tconst startValue = value[start]\n\tconst endValue = value[end]\n\tif (\n\t\t!isFiniteNumber(startValue) ||\n\t\tstartValue < 0 ||\n\t\t!isFiniteNumber(endValue) ||\n\t\tendValue < startValue\n\t) {\n\t\treturn undefined\n\t}\n\treturn { start: startValue, end: endValue }\n}\n\n/**\n * Build a standards-shaped HAR 1.2 entry from one observed exchange.\n *\n * @param pending - Request and optional response captured by the recorder\n * @param duration - Whole exchange duration in milliseconds\n * @param body - Optional decoded response body\n * @param error - Optional request failure description\n * @returns HAR 1.2 entry\n */\nexport function createBrowserHAREntry(\n\tpending: BrowserHARPending,\n\tduration: number,\n\tbody?: Uint8Array,\n\terror?: string,\n): BrowserHAREntry {\n\tconst response = pending.response\n\tconst requestHeaders: BrowserHARValue[] = Object.entries(pending.request.headers).map(\n\t\t([name, value]) => ({ name, value }),\n\t)\n\tconst responseHeaders: BrowserHARValue[] =\n\t\tresponse === undefined\n\t\t\t? []\n\t\t\t: Object.entries(response.headers).map(([name, value]) => ({ name, value }))\n\tconst query: BrowserHARValue[] = []\n\tif (URL.canParse(pending.request.url)) {\n\t\tfor (const [name, value] of new URL(pending.request.url).searchParams) {\n\t\t\tquery.push({ name, value })\n\t\t}\n\t}\n\tconst post = pending.request.post\n\tconst requestMime =\n\t\tObject.entries(pending.request.headers).find(\n\t\t\t([name]) => name.toLowerCase() === 'content-type',\n\t\t)?.[1] ?? 'application/octet-stream'\n\tconst redirect =\n\t\tresponse === undefined\n\t\t\t? ''\n\t\t\t: (Object.entries(response.headers).find(\n\t\t\t\t\t([name]) => name.toLowerCase() === 'location',\n\t\t\t\t)?.[1] ?? '')\n\tconst timing = response?.timing\n\tconst dns = timing?.dns === undefined ? -1 : Math.max(0, timing.dns.end - timing.dns.start)\n\tconst connect =\n\t\ttiming?.connect === undefined ? -1 : Math.max(0, timing.connect.end - timing.connect.start)\n\tconst send = timing?.send === undefined ? 0 : Math.max(0, timing.send.end - timing.send.start)\n\tconst wait =\n\t\ttiming?.receive === undefined\n\t\t\t? Math.max(0, duration)\n\t\t\t: Math.max(0, timing.receive - (timing.send?.end ?? 0))\n\tconst ssl = timing?.ssl === undefined ? -1 : Math.max(0, timing.ssl.end - timing.ssl.start)\n\tconst text = body === undefined ? undefined : encodeBase64(body)\n\tconst size = body?.byteLength ?? (response === undefined ? 0 : -1)\n\n\treturn {\n\t\tstartedDateTime: new Date(pending.started).toISOString(),\n\t\ttime: Math.max(0, duration),\n\t\trequest: {\n\t\t\tmethod: pending.request.method,\n\t\t\turl: pending.request.url,\n\t\t\thttpVersion: response?.protocol ?? 'HTTP/0.0',\n\t\t\tcookies: [],\n\t\t\theaders: requestHeaders,\n\t\t\tqueryString: query,\n\t\t\t...(post !== undefined\n\t\t\t\t? {\n\t\t\t\t\t\tpostData: {\n\t\t\t\t\t\t\tmimeType: requestMime,\n\t\t\t\t\t\t\ttext: post,\n\t\t\t\t\t\t},\n\t\t\t\t\t}\n\t\t\t\t: {}),\n\t\t\theadersSize: -1,\n\t\t\tbodySize: post === undefined ? 0 : textToBytes(post).byteLength,\n\t\t},\n\t\tresponse: {\n\t\t\tstatus: response?.status ?? 0,\n\t\t\tstatusText: response?.phrase ?? error ?? 'Request failed',\n\t\t\thttpVersion: response?.protocol ?? 'HTTP/0.0',\n\t\t\tcookies: [],\n\t\t\theaders: responseHeaders,\n\t\t\tcontent: {\n\t\t\t\tsize,\n\t\t\t\tmimeType: response?.mime ?? 'application/octet-stream',\n\t\t\t\t...(text !== undefined ? { text, encoding: 'base64' } : {}),\n\t\t\t},\n\t\t\tredirectURL: redirect,\n\t\t\theadersSize: -1,\n\t\t\tbodySize: size,\n\t\t},\n\t\tcache: {},\n\t\ttimings: {\n\t\t\tblocked: -1,\n\t\t\tdns,\n\t\t\tconnect,\n\t\t\tsend,\n\t\t\twait,\n\t\t\treceive: Math.max(0, duration - wait - send),\n\t\t\tssl,\n\t\t},\n\t}\n}\n\n/**\n * Convert HAR name/value headers into a Fetch-domain header record.\n *\n * @param headers - HAR header entries\n * @returns Header record with later duplicate names replacing earlier values\n */\nexport function browserHARHeadersToRecord(\n\theaders: readonly BrowserHARValue[],\n): Readonly<Record<string, string>> {\n\tconst result: Record<string, string> = {}\n\tfor (const header of headers) {\n\t\tObject.defineProperty(result, header.name, {\n\t\t\tvalue: header.value,\n\t\t\tenumerable: true,\n\t\t\tconfigurable: true,\n\t\t\twritable: true,\n\t\t})\n\t}\n\treturn result\n}\n\n/**\n * Validate the HAR 1.2 fields required for deterministic replay.\n *\n * @param value - Candidate archive\n */\nexport function validateBrowserHAR(value: unknown): asserts value is BrowserHAR {\n\tif (\n\t\t!isRecord(value) ||\n\t\t!isRecord(value['log']) ||\n\t\tvalue['log']['version'] !== '1.2' ||\n\t\t!isRecord(value['log']['creator']) ||\n\t\t!isString(value['log']['creator']['name']) ||\n\t\t!isString(value['log']['creator']['version']) ||\n\t\t!isArray(value['log']['entries'])\n\t) {\n\t\tthrow new BrowserError('Browser HAR document is malformed')\n\t}\n\tfor (const [index, entry] of value['log']['entries'].entries()) {\n\t\tif (\n\t\t\t!isRecord(entry) ||\n\t\t\t!isString(entry['startedDateTime']) ||\n\t\t\t!isFiniteNumber(Date.parse(entry['startedDateTime'])) ||\n\t\t\t!isFiniteNumber(entry['time']) ||\n\t\t\tentry['time'] < 0 ||\n\t\t\t!isRecord(entry['request']) ||\n\t\t\t!isString(entry['request']['url']) ||\n\t\t\t!URL.canParse(entry['request']['url']) ||\n\t\t\t!isString(entry['request']['method']) ||\n\t\t\t!isString(entry['request']['httpVersion']) ||\n\t\t\t!isArray(entry['request']['cookies']) ||\n\t\t\t!isArray(entry['request']['headers']) ||\n\t\t\t!isArray(entry['request']['queryString']) ||\n\t\t\t!isInteger(entry['request']['headersSize']) ||\n\t\t\tentry['request']['headersSize'] < -1 ||\n\t\t\t!isInteger(entry['request']['bodySize']) ||\n\t\t\tentry['request']['bodySize'] < -1 ||\n\t\t\t!isRecord(entry['response']) ||\n\t\t\t!isInteger(entry['response']['status']) ||\n\t\t\tentry['response']['status'] < 0 ||\n\t\t\tentry['response']['status'] > 999 ||\n\t\t\t!isString(entry['response']['statusText']) ||\n\t\t\t!isString(entry['response']['httpVersion']) ||\n\t\t\t!isArray(entry['response']['cookies']) ||\n\t\t\t!isArray(entry['response']['headers']) ||\n\t\t\t!isRecord(entry['response']['content']) ||\n\t\t\t!isString(entry['response']['redirectURL']) ||\n\t\t\t!isInteger(entry['response']['headersSize']) ||\n\t\t\tentry['response']['headersSize'] < -1 ||\n\t\t\t!isInteger(entry['response']['bodySize']) ||\n\t\t\tentry['response']['bodySize'] < -1 ||\n\t\t\t!isRecord(entry['cache']) ||\n\t\t\t!isRecord(entry['timings'])\n\t\t) {\n\t\t\tthrow new BrowserError('Browser HAR entry is malformed', undefined, { index })\n\t\t}\n\t\tfor (const [cookieIndex, cookie] of entry['request']['cookies'].entries()) {\n\t\t\tif (\n\t\t\t\t!isRecord(cookie) ||\n\t\t\t\t!isString(cookie['name']) ||\n\t\t\t\t!isString(cookie['value']) ||\n\t\t\t\t(cookie['path'] !== undefined && !isString(cookie['path'])) ||\n\t\t\t\t(cookie['domain'] !== undefined && !isString(cookie['domain'])) ||\n\t\t\t\t(cookie['expires'] !== undefined && !isString(cookie['expires'])) ||\n\t\t\t\t(cookie['httpOnly'] !== undefined && !isBoolean(cookie['httpOnly'])) ||\n\t\t\t\t(cookie['secure'] !== undefined && !isBoolean(cookie['secure']))\n\t\t\t) {\n\t\t\t\tthrow new BrowserError('Browser HAR request cookie is malformed', undefined, {\n\t\t\t\t\tindex,\n\t\t\t\t\tcookie: cookieIndex,\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t\tfor (const [headerIndex, header] of entry['request']['headers'].entries()) {\n\t\t\tif (!isRecord(header) || !isString(header['name']) || !isString(header['value'])) {\n\t\t\t\tthrow new BrowserError('Browser HAR request header is malformed', undefined, {\n\t\t\t\t\tindex,\n\t\t\t\t\theader: headerIndex,\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t\tfor (const [queryIndex, query] of entry['request']['queryString'].entries()) {\n\t\t\tif (!isRecord(query) || !isString(query['name']) || !isString(query['value'])) {\n\t\t\t\tthrow new BrowserError('Browser HAR query value is malformed', undefined, {\n\t\t\t\t\tindex,\n\t\t\t\t\tquery: queryIndex,\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t\tconst post = entry['request']['postData']\n\t\tif (\n\t\t\tpost !== undefined &&\n\t\t\t(!isRecord(post) || !isString(post['mimeType']) || !isString(post['text']))\n\t\t) {\n\t\t\tthrow new BrowserError('Browser HAR request body is malformed', undefined, { index })\n\t\t}\n\t\tfor (const [cookieIndex, cookie] of entry['response']['cookies'].entries()) {\n\t\t\tif (\n\t\t\t\t!isRecord(cookie) ||\n\t\t\t\t!isString(cookie['name']) ||\n\t\t\t\t!isString(cookie['value']) ||\n\t\t\t\t(cookie['path'] !== undefined && !isString(cookie['path'])) ||\n\t\t\t\t(cookie['domain'] !== undefined && !isString(cookie['domain'])) ||\n\t\t\t\t(cookie['expires'] !== undefined && !isString(cookie['expires'])) ||\n\t\t\t\t(cookie['httpOnly'] !== undefined && !isBoolean(cookie['httpOnly'])) ||\n\t\t\t\t(cookie['secure'] !== undefined && !isBoolean(cookie['secure']))\n\t\t\t) {\n\t\t\t\tthrow new BrowserError('Browser HAR response cookie is malformed', undefined, {\n\t\t\t\t\tindex,\n\t\t\t\t\tcookie: cookieIndex,\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t\tfor (const [headerIndex, header] of entry['response']['headers'].entries()) {\n\t\t\tif (!isRecord(header) || !isString(header['name']) || !isString(header['value'])) {\n\t\t\t\tthrow new BrowserError('Browser HAR response header is malformed', undefined, {\n\t\t\t\t\tindex,\n\t\t\t\t\theader: headerIndex,\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t\tconst text = entry['response']['content']['text']\n\t\tconst encoding = entry['response']['content']['encoding']\n\t\tif (\n\t\t\t!isInteger(entry['response']['content']['size']) ||\n\t\t\tentry['response']['content']['size'] < -1 ||\n\t\t\t!isString(entry['response']['content']['mimeType']) ||\n\t\t\t(text !== undefined && !isString(text)) ||\n\t\t\t(encoding !== undefined && encoding !== 'base64') ||\n\t\t\t(encoding === 'base64' &&\n\t\t\t\t(text === undefined ||\n\t\t\t\t\t!/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(text)))\n\t\t) {\n\t\t\tthrow new BrowserError('Browser HAR response content is malformed', undefined, { index })\n\t\t}\n\t\tfor (const name of ['blocked', 'dns', 'connect', 'send', 'wait', 'receive', 'ssl']) {\n\t\t\tconst timing = entry['timings'][name]\n\t\t\tif (!isFiniteNumber(timing) || timing < -1) {\n\t\t\t\tthrow new BrowserError('Browser HAR timing is malformed', undefined, {\n\t\t\t\t\tindex,\n\t\t\t\t\ttiming: name,\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t}\n}\n\n/**\n * Decode Chromium TLS security details.\n *\n * @param value - Unknown security details\n * @returns Security metadata or undefined\n */\nexport function readBrowserSecurity(value: unknown): BrowserSecurity | undefined {\n\tif (\n\t\t!isRecord(value) ||\n\t\t!isString(value['protocol']) ||\n\t\t!isString(value['issuer']) ||\n\t\t!isFiniteNumber(value['validFrom']) ||\n\t\t!isFiniteNumber(value['validTo']) ||\n\t\tvalue['validTo'] < value['validFrom']\n\t) {\n\t\treturn undefined\n\t}\n\treturn {\n\t\tprotocol: value['protocol'],\n\t\tissuer: value['issuer'],\n\t\tfrom: value['validFrom'],\n\t\tto: value['validTo'],\n\t}\n}\n\n/**\n * Decode one `Network.loadingFailed` event.\n *\n * @param value - Unknown event parameters\n * @returns Failure or undefined\n */\nexport function readBrowserRequestFailure(value: unknown): BrowserRequestFailure | undefined {\n\tif (!isRecord(value) || !isString(value['requestId']) || !isString(value['errorText'])) {\n\t\treturn undefined\n\t}\n\treturn {\n\t\tid: value['requestId'],\n\t\terror: value['errorText'],\n\t\tcancelled: value['canceled'] === true,\n\t\tblocked: isString(value['blockedReason']) ? value['blockedReason'] : undefined,\n\t}\n}\n\n/**\n * Decode one WebSocket frame event.\n *\n * @param value - Unknown event parameters\n * @returns Frame or undefined\n */\nexport function readBrowserWebSocketFrame(value: unknown): BrowserWebSocketFrame | undefined {\n\tif (!isRecord(value) || !isRecord(value['response']) || !isFiniteNumber(value['timestamp'])) {\n\t\treturn undefined\n\t}\n\tconst frame = value['response']\n\tif (!isInteger(frame['opcode']) || frame['opcode'] < 0 || !isString(frame['payloadData'])) {\n\t\treturn undefined\n\t}\n\treturn {\n\t\topcode: frame['opcode'],\n\t\tdata: frame['payloadData'],\n\t\tmasked: frame['mask'] === true,\n\t\ttimestamp: value['timestamp'],\n\t}\n}\n\n/**\n * Match a request against route criteria.\n *\n * @param request - Observed request\n * @param query - Match criteria\n * @returns Whether every supplied criterion matches\n */\nexport function matchesBrowserRoute(request: BrowserRequest, query: BrowserRouteQuery): boolean {\n\tif (query.method !== undefined && request.method !== query.method) return false\n\tif (query.resource !== undefined && request.resource !== query.resource) return false\n\tif (query.url === undefined) return true\n\treturn matchesBrowserURL(request.url, query.url)\n}\n\n/**\n * Match a URL using Chromium-style `*` and `**` glob segments.\n *\n * @param url - Candidate URL\n * @param pattern - Glob pattern\n * @returns Whether the whole URL matches\n */\nexport function matchesBrowserURL(url: string, pattern: string): boolean {\n\tconst source = pattern\n\t\t.replace(/[.+?^${}()|[\\]\\\\]/g, '\\\\$&')\n\t\t.replace(/\\*\\*/g, '[[DOUBLE_STAR]]')\n\t\t.replace(/\\*/g, '[^/]*')\n\t\t.replace(/\\[\\[DOUBLE_STAR\\]\\]/g, '.*')\n\treturn new RegExp(`^${source}$`).test(url)\n}\n\n/**\n * Compile an auto-retrying in-page predicate wait.\n *\n * @param expression - Value or function expression\n * @param timeout - Maximum wait in milliseconds\n * @returns Promise expression resolving to the first truthy value or false\n */\nexport function compileFunctionWaitExpression(expression: string, timeout: number): string {\n\treturn `new Promise((resolve, reject) => {\n\tconst deadline = performance.now() + ${timeout}\n\tconst predicate = (${expression})\n\tconst check = async () => {\n\t\ttry {\n\t\t\tconst value = typeof predicate === 'function' ? await predicate() : await predicate\n\t\t\tif (value) {\n\t\t\t\tresolve(value)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (performance.now() >= deadline) {\n\t\t\t\tresolve(false)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tsetTimeout(check, ${BROWSER_WAIT_POLL_INTERVAL_MS})\n\t\t} catch (error) {\n\t\t\treject(error)\n\t\t}\n\t}\n\tvoid check()\n})`\n}\n\n/**\n * Decode one Runtime binding invocation.\n *\n * @param value - Unknown `Runtime.bindingCalled` parameters\n * @returns Valid call or undefined\n */\nexport function readBrowserBindingCall(value: unknown): BrowserBindingCall | undefined {\n\tif (\n\t\t!isRecord(value) ||\n\t\t!isString(value['name']) ||\n\t\t!isString(value['payload']) ||\n\t\t!isInteger(value['executionContextId'])\n\t) {\n\t\treturn undefined\n\t}\n\tconst payload = parseJSON(value['payload'])\n\tif (\n\t\t!isRecord(payload) ||\n\t\t!isString(payload['id']) ||\n\t\t!isString(payload['name']) ||\n\t\t!isArray(payload['args']) ||\n\t\tpayload['name'] !== value['name']\n\t) {\n\t\treturn undefined\n\t}\n\treturn {\n\t\tid: payload['id'],\n\t\tname: payload['name'],\n\t\targs: payload['args'],\n\t\tcontext: value['executionContextId'],\n\t}\n}\n\n/**\n * Compile the page-side promise facade for one Runtime binding.\n *\n * @param name - Binding identifier\n * @returns Self-installing script source\n */\nexport function compileBrowserBindingSource(name: string): string {\n\tconst binding = JSON.stringify(name)\n\tconst state = JSON.stringify(`__orkestrelBinding_${name}`)\n\treturn `(() => {\n\tconst name = ${binding}\n\tconst key = ${state}\n\tif (globalThis[key]) return\n\tconst send = globalThis[name]\n\tif (typeof send !== 'function') throw new Error('Browser binding transport is unavailable')\n\tconst pending = new Map()\n\tlet sequence = 0\n\tglobalThis[key] = {\n\t\tresolve(id, success, value) {\n\t\t\tconst entry = pending.get(id)\n\t\t\tif (!entry) return\n\t\t\tpending.delete(id)\n\t\t\tif (success) entry.resolve(value)\n\t\t\telse entry.reject(new Error(String(value)))\n\t\t},\n\t}\n\tglobalThis[name] = (...args) => new Promise((resolve, reject) => {\n\t\tsequence += 1\n\t\tconst id = String(sequence)\n\t\tpending.set(id, { resolve, reject })\n\t\tsend(JSON.stringify({ id, name, args }))\n\t})\n})()`\n}\n\n/**\n * Compile delivery of a host binding result to one execution context.\n *\n * @param name - Binding identifier\n * @param id - Call identifier\n * @param success - Resolve rather than reject\n * @param value - Serializable result or error\n * @returns Runtime expression\n */\nexport function compileBrowserBindingResult(\n\tname: string,\n\tid: string,\n\tsuccess: boolean,\n\tvalue: unknown,\n): string {\n\treturn `globalThis[${JSON.stringify(`__orkestrelBinding_${name}`)}]?.resolve(${JSON.stringify(id)}, ${JSON.stringify(success)}, ${JSON.stringify(value)})`\n}\n\n/**\n * Compile current-document cleanup for one page-side host binding facade.\n *\n * @param name - Binding identifier\n * @returns Runtime cleanup expression\n */\nexport function compileBrowserBindingCleanup(name: string): string {\n\treturn `(() => {\n\tdelete globalThis[${JSON.stringify(name)}]\n\tdelete globalThis[${JSON.stringify(`__orkestrelBinding_${name}`)}]\n\treturn true\n})()`\n}\n\n/**\n * Decode `Page.addScriptToEvaluateOnNewDocument` result.\n *\n * @param value - Unknown protocol result\n * @returns Script identifier\n */\nexport function readBrowserScriptIdentifier(value: unknown): string {\n\tif (!isRecord(value) || !isString(value['identifier'])) {\n\t\tthrow new BrowserError('Browser init script identifier is malformed')\n\t}\n\treturn value['identifier']\n}\n\n/**\n * Validate viewport input coordinates.\n *\n * @param point - Candidate point\n */\nexport function validateBrowserPoint(point: BrowserPoint): void {\n\tif (!isFiniteNumber(point.x) || !isFiniteNumber(point.y)) {\n\t\tthrow new BrowserError('Browser input coordinates must be finite', undefined, { point })\n\t}\n}\n\n/**\n * Validate shared trusted-input options.\n *\n * @param options - Candidate action options\n */\nexport function validateBrowserActionOptions(options?: BrowserActionOptions): void {\n\tif (options?.delay !== undefined && (!isFiniteNumber(options.delay) || options.delay < 0)) {\n\t\tthrow new BrowserError('Browser input delay must be non-negative and finite', undefined, {\n\t\t\tdelay: options.delay,\n\t\t})\n\t}\n\tif (options?.count !== undefined && (!isInteger(options.count) || options.count <= 0)) {\n\t\tthrow new BrowserError('Browser click count must be a positive integer', undefined, {\n\t\t\tcount: options.count,\n\t\t})\n\t}\n\tif (options?.steps !== undefined && (!isInteger(options.steps) || options.steps <= 0)) {\n\t\tthrow new BrowserError('Browser drag steps must be a positive integer', undefined, {\n\t\t\tsteps: options.steps,\n\t\t})\n\t}\n\tif (options?.position !== undefined) validateBrowserPoint(options.position)\n}\n\n/**\n * Validate a public browser timeout before protocol work begins.\n *\n * @param timeout - Timeout in milliseconds\n */\nexport function validateBrowserTimeout(timeout: number): void {\n\tif (!isFiniteNumber(timeout) || timeout < 0) {\n\t\tthrow new BrowserError('Browser timeout must be a non-negative finite number', undefined, {\n\t\t\ttimeout,\n\t\t})\n\t}\n}\n\n/**\n * Validate Chromium viewport metrics.\n *\n * @param viewport - Public viewport configuration\n */\nexport function validateBrowserViewport(viewport: BrowserViewport): void {\n\tif (\n\t\t!isInteger(viewport.width) ||\n\t\tviewport.width <= 0 ||\n\t\t!isInteger(viewport.height) ||\n\t\tviewport.height <= 0\n\t) {\n\t\tthrow new BrowserError('Browser viewport dimensions must be positive integers', undefined, {\n\t\t\tviewport,\n\t\t})\n\t}\n\tif (viewport.scale !== undefined && (!isFiniteNumber(viewport.scale) || viewport.scale <= 0)) {\n\t\tthrow new BrowserError('Browser viewport scale must be positive and finite', undefined, {\n\t\t\tscale: viewport.scale,\n\t\t})\n\t}\n}\n\n/**\n * Validate context emulation boundaries before partial application.\n *\n * @param options - Public emulation configuration\n */\nexport function validateBrowserEmulationOptions(options: BrowserEmulationOptions): void {\n\tif (options.viewport !== undefined) validateBrowserViewport(options.viewport)\n\tif (options.user !== undefined && options.user.value.length === 0) {\n\t\tthrow new BrowserError('Browser user agent cannot be empty')\n\t}\n\tif (options.locale !== undefined && options.locale.length === 0) {\n\t\tthrow new BrowserError('Browser locale cannot be empty')\n\t}\n\tif (options.timezone !== undefined && options.timezone.length === 0) {\n\t\tthrow new BrowserError('Browser timezone cannot be empty')\n\t}\n\tif (options.geolocation !== undefined) {\n\t\tconst location = options.geolocation\n\t\tif (\n\t\t\t!isFiniteNumber(location.latitude) ||\n\t\t\tlocation.latitude < -90 ||\n\t\t\tlocation.latitude > 90 ||\n\t\t\t!isFiniteNumber(location.longitude) ||\n\t\t\tlocation.longitude < -180 ||\n\t\t\tlocation.longitude > 180 ||\n\t\t\t(location.accuracy !== undefined &&\n\t\t\t\t(!isFiniteNumber(location.accuracy) || location.accuracy < 0))\n\t\t) {\n\t\t\tthrow new BrowserError('Browser geolocation is outside valid coordinate bounds', undefined, {\n\t\t\t\tlocation,\n\t\t\t})\n\t\t}\n\t}\n\tfor (const name of Object.keys(options.headers ?? {})) {\n\t\tif (name.length === 0) throw new BrowserError('Browser header name cannot be empty')\n\t}\n}\n\n/**\n * Validate isolated-context options before creating remote state.\n *\n * @param options - Public context configuration\n */\nexport function validateBrowserContextOptions(options?: BrowserContextOptions): void {\n\tif (options === undefined) return\n\tif (options.emulation !== undefined) validateBrowserEmulationOptions(options.emulation)\n\tif (options.proxy !== undefined) {\n\t\tif (options.proxy.server.length === 0) {\n\t\t\tthrow new BrowserError('Browser proxy server cannot be empty')\n\t\t}\n\t\tif (options.proxy.bypass?.some((entry) => entry.length === 0) === true) {\n\t\t\tthrow new BrowserError('Browser proxy bypass entries cannot be empty')\n\t\t}\n\t}\n\tfor (const origin of options.origins ?? []) {\n\t\tconst result = attempt(() => new URL(origin))\n\t\tif (!result.success) {\n\t\t\tthrow new BrowserError('Browser context origin must be valid', undefined, { origin })\n\t\t}\n\t\tconst url = result.value\n\t\tif (\n\t\t\t(url.protocol !== 'http:' && url.protocol !== 'https:') ||\n\t\t\turl.origin !== origin.replace(/\\/$/, '')\n\t\t) {\n\t\t\tthrow new BrowserError(\n\t\t\t\t'Browser context origin must be an absolute HTTP(S) origin',\n\t\t\t\tundefined,\n\t\t\t\t{\n\t\t\t\t\torigin,\n\t\t\t\t},\n\t\t\t)\n\t\t}\n\t}\n\tif (options.downloads !== undefined && options.downloads.path.length === 0) {\n\t\tthrow new BrowserError('Browser download path cannot be empty')\n\t}\n}\n\n/**\n * Validate Accessibility-domain snapshot bounds.\n *\n * @param options - Public accessibility snapshot options\n */\nexport function validateBrowserAccessibilityOptions(options?: BrowserAccessibilityOptions): void {\n\tif (options?.root !== undefined && (!isInteger(options.root) || options.root <= 0)) {\n\t\tthrow new BrowserError('Browser accessibility root must be a positive integer', undefined, {\n\t\t\troot: options.root,\n\t\t})\n\t}\n\tif (options?.depth !== undefined && (!isInteger(options.depth) || options.depth < 0)) {\n\t\tthrow new BrowserError(\n\t\t\t'Browser accessibility depth must be a non-negative integer',\n\t\t\tundefined,\n\t\t\t{ depth: options.depth },\n\t\t)\n\t}\n}\n\n/**\n * Validate and compile Page.printToPDF parameters.\n *\n * @param options - Public PDF options\n * @returns Protocol parameter record\n */\nexport function browserPDFToParams(options?: BrowserPDFOptions): Readonly<Record<string, unknown>> {\n\tconst params: Record<string, unknown> = {\n\t\tlandscape: options?.landscape ?? false,\n\t\tprintBackground: options?.background ?? false,\n\t\tdisplayHeaderFooter: options?.header !== undefined || options?.footer !== undefined,\n\t\tgenerateTaggedPDF: options?.tagged ?? false,\n\t\tgenerateDocumentOutline: options?.outline ?? false,\n\t}\n\tif (options?.scale !== undefined) {\n\t\tvalidateBrowserRange(options.scale, 'PDF scale', 0.1, 2)\n\t\tparams['scale'] = options.scale\n\t}\n\tif (options?.width !== undefined) {\n\t\tvalidateBrowserRange(options.width, 'PDF width', 0, Number.MAX_VALUE, false)\n\t\tparams['paperWidth'] = options.width\n\t}\n\tif (options?.height !== undefined) {\n\t\tvalidateBrowserRange(options.height, 'PDF height', 0, Number.MAX_VALUE, false)\n\t\tparams['paperHeight'] = options.height\n\t}\n\tif (options?.ranges !== undefined) params['pageRanges'] = options.ranges\n\tif (options?.header !== undefined) params['headerTemplate'] = options.header\n\tif (options?.footer !== undefined) params['footerTemplate'] = options.footer\n\tfor (const [name, value] of Object.entries(options?.margin ?? {})) {\n\t\tif (!isFiniteNumber(value)) continue\n\t\tvalidateBrowserRange(value, `PDF ${name} margin`, 0, Number.MAX_VALUE)\n\t\tparams[`margin${name[0]?.toUpperCase()}${name.slice(1)}`] = value\n\t}\n\treturn params\n}\n\n/**\n * Validate and compile basic Page.captureScreenshot parameters.\n *\n * @param options - Public screenshot options\n * @returns Protocol parameter record\n */\nexport function browserScreenshotToParams(\n\toptions?: BrowserScreenshotOptions,\n): Readonly<Record<string, unknown>> {\n\tconst format = options?.type ?? 'png'\n\tif (options?.quality !== undefined) {\n\t\tif (format !== 'jpeg') {\n\t\t\tthrow new BrowserError('Browser screenshot quality is only valid for JPEG')\n\t\t}\n\t\tif (!isInteger(options.quality) || options.quality < 0 || options.quality > 100) {\n\t\t\tthrow new BrowserError('Browser screenshot quality must be an integer from 0 to 100')\n\t\t}\n\t}\n\tif (options?.full === true && options.clip !== undefined) {\n\t\tthrow new BrowserError('Browser screenshot cannot combine full-page and clip capture')\n\t}\n\tconst params: Record<string, unknown> = {\n\t\tformat,\n\t\tfromSurface: true,\n\t}\n\tif (options?.quality !== undefined) params['quality'] = options.quality\n\tif (options?.clip !== undefined) {\n\t\tconst [x, y, width, height] = options.clip\n\t\tvalidateBrowserRange(x, 'Screenshot clip x', -Number.MAX_VALUE, Number.MAX_VALUE)\n\t\tvalidateBrowserRange(y, 'Screenshot clip y', -Number.MAX_VALUE, Number.MAX_VALUE)\n\t\tvalidateBrowserRange(width, 'Screenshot clip width', 0, Number.MAX_VALUE, false)\n\t\tvalidateBrowserRange(height, 'Screenshot clip height', 0, Number.MAX_VALUE, false)\n\t\tparams['clip'] = { x, y, width, height, scale: 1 }\n\t\tparams['captureBeyondViewport'] = true\n\t}\n\treturn params\n}\n\n/**\n * Compile temporary animation, caret, and mask setup for a screenshot.\n *\n * @param options - Screenshot controls\n * @returns Setup expression or undefined when no preparation is required\n */\nexport function compileScreenshotPreparationExpression(\n\toptions?: BrowserScreenshotOptions,\n): string | undefined {\n\tconst masks = options?.mask ?? []\n\tif (options?.animations !== false && options?.caret !== false && masks.length === 0) {\n\t\treturn undefined\n\t}\n\tconst queries = masks.map((locator) => compileLocatorListExpression(locator.query))\n\treturn `(() => {\n\tconst attribute = ${JSON.stringify(BROWSER_SCREENSHOT_ATTRIBUTE)}\n\tconst sequence = (globalThis.__orkestrelScreenshotSequence ?? 0) + 1\n\tglobalThis.__orkestrelScreenshotSequence = sequence\n\tconst token = String(sequence)\n\tif (${JSON.stringify(options?.animations === false || options?.caret === false)}) {\n\t\tconst style = document.createElement('style')\n\t\tstyle.setAttribute(attribute, token)\n\t\tstyle.textContent = ${JSON.stringify(\n\t\t\t`${options?.animations === false ? '*,*::before,*::after{animation:none!important;transition:none!important;scroll-behavior:auto!important}' : ''}${options?.caret === false ? '*{caret-color:transparent!important}' : ''}`,\n\t\t)}\n\t\tdocument.documentElement.appendChild(style)\n\t}\n\tconst groups = [${queries.join(',')}]\n\tfor (const group of groups) {\n\t\tfor (const element of group) {\n\t\t\tconst rect = element.getBoundingClientRect()\n\t\t\tconst mask = document.createElement('div')\n\t\t\tmask.setAttribute(attribute, token)\n\t\t\tmask.style.cssText = 'position:fixed;pointer-events:none;z-index:2147483647;' +\n\t\t\t\t'left:' + rect.left + 'px;top:' + rect.top + 'px;width:' + rect.width + 'px;height:' + rect.height + 'px;' +\n\t\t\t\t'background:' + ${JSON.stringify(options?.color ?? '#ff00ff')}\n\t\t\tdocument.documentElement.appendChild(mask)\n\t\t}\n\t}\n\treturn token\n})()`\n}\n\n/**\n * Compile cleanup for temporary screenshot styles and masks.\n *\n * @param token - Preparation token\n * @returns Cleanup expression\n */\nexport function compileScreenshotCleanupExpression(token: string): string {\n\treturn `(() => {\n\tconst attribute = ${JSON.stringify(BROWSER_SCREENSHOT_ATTRIBUTE)}\n\tfor (const element of document.querySelectorAll('[' + attribute + ']')) {\n\t\tif (element.getAttribute(attribute) === ${JSON.stringify(token)}) element.remove()\n\t}\n\treturn true\n})()`\n}\n\n/**\n * Validate a finite numeric range.\n *\n * @param value - Candidate number\n * @param field - Diagnostic field\n * @param minimum - Inclusive lower bound\n * @param maximum - Inclusive upper bound\n * @param inclusive - Whether the lower bound is inclusive\n */\nexport function validateBrowserRange(\n\tvalue: number,\n\tfield: string,\n\tminimum: number,\n\tmaximum: number,\n\tinclusive = true,\n): void {\n\tif (\n\t\t!isFiniteNumber(value) ||\n\t\t(inclusive ? value < minimum : value <= minimum) ||\n\t\tvalue > maximum\n\t) {\n\t\tthrow new BrowserError(`${field} is outside its valid range`, undefined, {\n\t\t\tvalue,\n\t\t\tminimum,\n\t\t\tmaximum,\n\t\t\tinclusive,\n\t\t})\n\t}\n}\n\n/**\n * Decode Accessibility-domain nodes into a flat serializable tree.\n *\n * @param value - Unknown full or partial AX-tree result\n * @returns Valid accessibility snapshot\n */\nexport function readBrowserAccessibility(value: unknown): BrowserAccessibilitySnapshot {\n\tif (!isRecord(value) || !isArray(value['nodes'])) {\n\t\tthrow new BrowserError('Browser accessibility tree is malformed')\n\t}\n\tconst nodes: BrowserAXNode[] = []\n\tfor (const [index, candidate] of value['nodes'].entries()) {\n\t\tif (!isRecord(candidate) || !isString(candidate['nodeId'])) {\n\t\t\tthrow new BrowserError('Browser accessibility node is malformed', undefined, { index })\n\t\t}\n\t\tconst children = isArray(candidate['childIds']) ? candidate['childIds'].filter(isString) : []\n\t\tconst properties: Record<string, unknown> = {}\n\t\tif (isArray(candidate['properties'])) {\n\t\t\tfor (const property of candidate['properties']) {\n\t\t\t\tif (!isRecord(property) || !isString(property['name'])) continue\n\t\t\t\tproperties[property['name']] = readBrowserAXValue(property['value'])\n\t\t\t}\n\t\t}\n\t\tnodes.push({\n\t\t\tid: candidate['nodeId'],\n\t\t\tparent: isString(candidate['parentId']) ? candidate['parentId'] : undefined,\n\t\t\tchildren,\n\t\t\tbackend: isInteger(candidate['backendDOMNodeId']) ? candidate['backendDOMNodeId'] : undefined,\n\t\t\tframe: isString(candidate['frameId']) ? candidate['frameId'] : undefined,\n\t\t\tignored: candidate['ignored'] === true,\n\t\t\trole: readBrowserAXString(candidate['role']),\n\t\t\tname: readBrowserAXString(candidate['name']),\n\t\t\tdescription: readBrowserAXString(candidate['description']),\n\t\t\tvalue: readBrowserAXValue(candidate['value']),\n\t\t\tproperties,\n\t\t})\n\t}\n\treturn {\n\t\troots: nodes.filter((node) => node.parent === undefined).map((node) => node.id),\n\t\tnodes,\n\t}\n}\n\n/**\n * Decode an Accessibility-domain AXValue.\n *\n * @param value - Unknown AX value\n * @returns Underlying value\n */\nexport function readBrowserAXValue(value: unknown): unknown {\n\treturn isRecord(value) && 'value' in value ? value['value'] : undefined\n}\n\n/**\n * Decode a string-valued Accessibility-domain AXValue.\n *\n * @param value - Unknown AX value\n * @returns String or undefined\n */\nexport function readBrowserAXString(value: unknown): string | undefined {\n\tconst decoded = readBrowserAXValue(value)\n\treturn isString(decoded) ? decoded : undefined\n}\n\n/**\n * Concatenate byte chunks without Node-specific buffers.\n *\n * @param chunks - Byte arrays in source order\n * @returns Combined bytes\n */\nexport function concatBytes(chunks: readonly Uint8Array[]): Uint8Array {\n\tconst count = chunks.reduce((total, chunk) => total + chunk.byteLength, 0)\n\tconst result = new Uint8Array(count)\n\tlet offset = 0\n\tfor (const chunk of chunks) {\n\t\tresult.set(chunk, offset)\n\t\toffset += chunk.byteLength\n\t}\n\treturn result\n}\n\n/**\n * Decode one `IO.read` response.\n *\n * @param value - Unknown protocol result\n * @returns Valid stream chunk\n */\nexport function readBrowserStreamChunk(value: unknown): BrowserStreamChunk {\n\tif (!isRecord(value) || !isString(value['data'])) {\n\t\tthrow new BrowserError('Browser IO stream chunk is malformed')\n\t}\n\treturn {\n\t\tbytes:\n\t\t\tvalue['base64Encoded'] === true ? decodeBase64(value['data']) : textToBytes(value['data']),\n\t\teof: value['eof'] === true,\n\t}\n}\n\n/**\n * Decode JavaScript precise coverage.\n *\n * @param value - Unknown `Profiler.takePreciseCoverage` result\n * @returns Script coverage\n */\nexport function readBrowserScriptCoverage(value: unknown): readonly BrowserScriptCoverage[] {\n\tif (!isRecord(value) || !isArray(value['result'])) {\n\t\tthrow new BrowserError('Browser JavaScript coverage is malformed')\n\t}\n\treturn value['result'].map((script, index) => {\n\t\tif (\n\t\t\t!isRecord(script) ||\n\t\t\t!isString(script['scriptId']) ||\n\t\t\t!isString(script['url']) ||\n\t\t\t!isArray(script['functions'])\n\t\t) {\n\t\t\tthrow new BrowserError('Browser script coverage entry is malformed', undefined, { index })\n\t\t}\n\t\tconst functions: BrowserFunctionCoverage[] = script['functions'].map((entry, functionIndex) => {\n\t\t\tif (!isRecord(entry) || !isString(entry['functionName']) || !isArray(entry['ranges'])) {\n\t\t\t\tthrow new BrowserError('Browser function coverage entry is malformed', undefined, {\n\t\t\t\t\tindex,\n\t\t\t\t\tfunction: functionIndex,\n\t\t\t\t})\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tname: entry['functionName'],\n\t\t\t\tranges: readBrowserCoverageRanges(entry['ranges'], index),\n\t\t\t\tblock: entry['isBlockCoverage'] === true,\n\t\t\t}\n\t\t})\n\t\treturn {\n\t\t\tid: script['scriptId'],\n\t\t\turl: script['url'],\n\t\t\tfunctions,\n\t\t}\n\t})\n}\n\n/**\n * Decode CSS rule usage.\n *\n * @param value - Unknown `CSS.stopRuleUsageTracking` result\n * @returns Stylesheet coverage\n */\nexport function readBrowserStyleCoverage(value: unknown): readonly BrowserStyleCoverage[] {\n\tif (!isRecord(value) || !isArray(value['ruleUsage'])) {\n\t\tthrow new BrowserError('Browser CSS coverage is malformed')\n\t}\n\tconst styles = new Map<string, BrowserCoverageRange[]>()\n\tfor (const [index, entry] of value['ruleUsage'].entries()) {\n\t\tif (\n\t\t\t!isRecord(entry) ||\n\t\t\t!isString(entry['styleSheetId']) ||\n\t\t\t!isInteger(entry['startOffset']) ||\n\t\t\tentry['startOffset'] < 0 ||\n\t\t\t!isInteger(entry['endOffset']) ||\n\t\t\tentry['endOffset'] < entry['startOffset']\n\t\t) {\n\t\t\tthrow new BrowserError('Browser CSS coverage entry is malformed', undefined, { index })\n\t\t}\n\t\tconst ranges = styles.get(entry['styleSheetId']) ?? []\n\t\tranges.push({\n\t\t\tstart: entry['startOffset'],\n\t\t\tend: entry['endOffset'],\n\t\t\tcount: entry['used'] === true ? 1 : 0,\n\t\t})\n\t\tstyles.set(entry['styleSheetId'], ranges)\n\t}\n\treturn [...styles].map(([id, ranges]) => ({ id, ranges }))\n}\n\n/**\n * Decode coverage ranges.\n *\n * @param value - Unknown ranges\n * @param script - Script index for diagnostics\n * @returns Valid ranges\n */\nexport function readBrowserCoverageRanges(\n\tvalue: unknown,\n\tscript: number,\n): readonly BrowserCoverageRange[] {\n\tif (!isArray(value)) {\n\t\tthrow new BrowserError('Browser coverage ranges are malformed', undefined, { script })\n\t}\n\treturn value.map((range, index) => {\n\t\tif (\n\t\t\t!isRecord(range) ||\n\t\t\t!isInteger(range['startOffset']) ||\n\t\t\trange['startOffset'] < 0 ||\n\t\t\t!isInteger(range['endOffset']) ||\n\t\t\trange['endOffset'] < range['startOffset'] ||\n\t\t\t!isInteger(range['count']) ||\n\t\t\trange['count'] < 0\n\t\t) {\n\t\t\tthrow new BrowserError('Browser coverage range is malformed', undefined, {\n\t\t\t\tscript,\n\t\t\t\tindex,\n\t\t\t})\n\t\t}\n\t\treturn {\n\t\t\tstart: range['startOffset'],\n\t\t\tend: range['endOffset'],\n\t\t\tcount: range['count'],\n\t\t}\n\t})\n}\n\n/**\n * Decode Performance-domain metrics.\n *\n * @param value - Unknown metrics result\n * @returns Valid metrics\n */\nexport function readBrowserMetrics(value: unknown): readonly BrowserMetric[] {\n\tif (!isRecord(value) || !isArray(value['metrics'])) {\n\t\tthrow new BrowserError('Browser performance metrics are malformed')\n\t}\n\treturn value['metrics'].map((metric, index) => {\n\t\tif (!isRecord(metric) || !isString(metric['name']) || !isFiniteNumber(metric['value'])) {\n\t\t\tthrow new BrowserError('Browser performance metric is malformed', undefined, { index })\n\t\t}\n\t\treturn { name: metric['name'], value: metric['value'] }\n\t})\n}\n\n/**\n * Decode one CPU profile.\n *\n * @param value - Unknown `Profiler.stop` result\n * @returns Valid profile\n */\nexport function readBrowserProfile(value: unknown): BrowserProfile {\n\tif (!isRecord(value) || !isRecord(value['profile'])) {\n\t\tthrow new BrowserError('Browser CPU profile is malformed')\n\t}\n\tconst profile = value['profile']\n\tif (\n\t\t!isFiniteNumber(profile['startTime']) ||\n\t\t!isFiniteNumber(profile['endTime']) ||\n\t\tprofile['endTime'] < profile['startTime'] ||\n\t\t!isArray(profile['nodes'])\n\t) {\n\t\tthrow new BrowserError('Browser CPU profile metadata is malformed')\n\t}\n\tconst nodes: BrowserProfileNode[] = profile['nodes'].map((node, index) => {\n\t\tif (\n\t\t\t!isRecord(node) ||\n\t\t\t!isInteger(node['id']) ||\n\t\t\tnode['id'] < 0 ||\n\t\t\t(node['hitCount'] !== undefined && (!isInteger(node['hitCount']) || node['hitCount'] < 0))\n\t\t) {\n\t\t\tthrow new BrowserError('Browser CPU profile node is malformed', undefined, { index })\n\t\t}\n\t\tconst children = node['children'] === undefined ? [] : parseArray(node['children'], isInteger)\n\t\tif (children === undefined || children.some((child) => child < 0)) {\n\t\t\tthrow new BrowserError('Browser CPU profile node is malformed', undefined, { index })\n\t\t}\n\t\treturn {\n\t\t\tid: node['id'],\n\t\t\tframe: readBrowserProfileFrame(node['callFrame'], index),\n\t\t\thit: isInteger(node['hitCount']) ? node['hitCount'] : undefined,\n\t\t\tchildren,\n\t\t}\n\t})\n\tconst samples = profile['samples'] === undefined ? [] : parseArray(profile['samples'], isInteger)\n\tif (samples === undefined || samples.some((sample) => sample < 0)) {\n\t\tthrow new BrowserError('Browser CPU profile samples are malformed')\n\t}\n\tconst deltas =\n\t\tprofile['timeDeltas'] === undefined ? [] : parseArray(profile['timeDeltas'], isFiniteNumber)\n\tif (deltas === undefined || deltas.some((delta) => delta < 0)) {\n\t\tthrow new BrowserError('Browser CPU profile deltas are malformed')\n\t}\n\treturn {\n\t\tstart: profile['startTime'],\n\t\tend: profile['endTime'],\n\t\tnodes,\n\t\tsamples,\n\t\tdeltas,\n\t}\n}\n\n/**\n * Decode a CPU profile call frame.\n *\n * @param value - Unknown call frame\n * @param node - Node index for diagnostics\n * @returns Valid call frame\n */\nexport function readBrowserProfileFrame(value: unknown, node: number): BrowserProfileFrame {\n\tif (\n\t\t!isRecord(value) ||\n\t\t!isString(value['functionName']) ||\n\t\t!isString(value['scriptId']) ||\n\t\t!isString(value['url']) ||\n\t\t!isInteger(value['lineNumber']) ||\n\t\t!isInteger(value['columnNumber'])\n\t) {\n\t\tthrow new BrowserError('Browser CPU profile call frame is malformed', undefined, { node })\n\t}\n\treturn {\n\t\tfunction: value['functionName'],\n\t\tscript: value['scriptId'],\n\t\turl: value['url'],\n\t\tline: value['lineNumber'],\n\t\tcolumn: value['columnNumber'],\n\t}\n}\n\n/**\n * Convert a typed cookie input into Chromium protocol fields.\n *\n * @param cookie - Validated public cookie input\n * @returns Protocol cookie record\n */\nexport function cookieToProtocol(cookie: BrowserCookieInput): Readonly<Record<string, unknown>> {\n\tif (cookie.name.length === 0) throw new BrowserError('Browser cookie name cannot be empty')\n\tif (cookie.url === undefined && (cookie.domain === undefined || cookie.path === undefined)) {\n\t\tthrow new BrowserError('Browser cookie requires either url or domain with path', undefined, {\n\t\t\tname: cookie.name,\n\t\t})\n\t}\n\tif (cookie.url !== undefined && !URL.canParse(cookie.url)) {\n\t\tthrow new BrowserError('Browser cookie URL must be valid', undefined, {\n\t\t\tname: cookie.name,\n\t\t\turl: cookie.url,\n\t\t})\n\t}\n\tif (cookie.expires !== undefined && !isFiniteNumber(cookie.expires)) {\n\t\tthrow new BrowserError('Browser cookie expiry must be finite', undefined, {\n\t\t\tname: cookie.name,\n\t\t\texpires: cookie.expires,\n\t\t})\n\t}\n\tconst result: Record<string, unknown> = {\n\t\tname: cookie.name,\n\t\tvalue: cookie.value,\n\t}\n\tif (cookie.url !== undefined) result['url'] = cookie.url\n\tif (cookie.domain !== undefined) result['domain'] = cookie.domain\n\tif (cookie.path !== undefined) result['path'] = cookie.path\n\tif (cookie.expires !== undefined) result['expires'] = cookie.expires\n\tif (cookie.http !== undefined) result['httpOnly'] = cookie.http\n\tif (cookie.secure !== undefined) result['secure'] = cookie.secure\n\tif (cookie.site !== undefined) result['sameSite'] = cookie.site\n\tif (cookie.priority !== undefined) result['priority'] = cookie.priority\n\tif (cookie.partition !== undefined) {\n\t\tresult['partitionKey'] = {\n\t\t\ttopLevelSite: cookie.partition.site,\n\t\t\thasCrossSiteAncestor: cookie.partition.ancestor ?? false,\n\t\t}\n\t}\n\treturn result\n}\n\n/**\n * Decode cookies returned by `Storage.getCookies`.\n *\n * @param value - Unknown protocol result\n * @returns Valid cookies\n */\nexport function readBrowserCookies(value: unknown): readonly BrowserCookie[] {\n\tif (!isRecord(value) || !isArray(value['cookies'])) {\n\t\tthrow new BrowserError('Browser cookie result is malformed')\n\t}\n\treturn value['cookies'].map((candidate, index) => readBrowserCookie(candidate, index))\n}\n\n/**\n * Decode one Chromium cookie.\n *\n * @param value - Unknown cookie record\n * @param index - Source array position for diagnostics\n * @returns Valid cookie\n */\nexport function readBrowserCookie(value: unknown, index: number): BrowserCookie {\n\tif (\n\t\t!isRecord(value) ||\n\t\t!isString(value['name']) ||\n\t\t!isString(value['value']) ||\n\t\t!isString(value['domain']) ||\n\t\t!isString(value['path']) ||\n\t\t!isFiniteNumber(value['expires']) ||\n\t\t!isBoolean(value['httpOnly']) ||\n\t\t!isBoolean(value['secure'])\n\t) {\n\t\tthrow new BrowserError('Browser cookie is malformed', undefined, { index })\n\t}\n\tconst sameSite = parseEnum(value['sameSite'], ['Strict', 'Lax', 'None'])\n\tif (value['sameSite'] !== undefined && sameSite === undefined) {\n\t\tthrow new BrowserError('Browser cookie same-site policy is malformed', undefined, { index })\n\t}\n\treturn {\n\t\tname: value['name'],\n\t\tvalue: value['value'],\n\t\tdomain: value['domain'],\n\t\tpath: value['path'],\n\t\texpires: value['expires'],\n\t\thttp: value['httpOnly'],\n\t\tsecure: value['secure'],\n\t\tsite: sameSite,\n\t\tpartition: readBrowserCookiePartition(value['partitionKey']),\n\t}\n}\n\n/**\n * Match a decoded cookie against one request URL.\n *\n * @param cookie - Decoded context cookie\n * @param value - Candidate absolute URL\n * @returns Whether domain, path, and secure constraints match\n */\nexport function matchesBrowserCookieURL(cookie: BrowserCookie, value: string): boolean {\n\tconst result = attempt(() => new URL(value))\n\tif (!result.success) {\n\t\tthrow new BrowserError('Browser cookie URL must be valid', undefined, { url: value })\n\t}\n\tconst url = result.value\n\tconst domain = cookie.domain.startsWith('.') ? cookie.domain.slice(1) : cookie.domain\n\tconst domainMatches = url.hostname === domain || url.hostname.endsWith(`.${domain}`)\n\tconst pathMatches =\n\t\turl.pathname === cookie.path ||\n\t\t(url.pathname.startsWith(cookie.path) &&\n\t\t\t(cookie.path.endsWith('/') || url.pathname[cookie.path.length] === '/'))\n\tconst secureMatches = !cookie.secure || url.protocol === 'https:' || url.protocol === 'wss:'\n\treturn domainMatches && pathMatches && secureMatches\n}\n\n/**\n * Decode an optional Chromium cookie partition key.\n *\n * @param value - Unknown partition value\n * @returns Partition key or undefined\n */\nexport function readBrowserCookiePartition(value: unknown): BrowserCookiePartition | undefined {\n\tif (!isRecord(value) || !isString(value['topLevelSite'])) return undefined\n\treturn {\n\t\tsite: value['topLevelSite'],\n\t\t...(isBoolean(value['hasCrossSiteAncestor'])\n\t\t\t? { ancestor: value['hasCrossSiteAncestor'] }\n\t\t\t: {}),\n\t}\n}\n\n/**\n * Compile an expression that serializes local and session storage.\n *\n * @returns In-page storage expression\n */\nexport function compileStorageReadExpression(): string {\n\treturn `({\n\tlocal: Array.from({ length: localStorage.length }, (_, index) => {\n\t\tconst name = localStorage.key(index)\n\t\treturn { name, value: name === null ? '' : localStorage.getItem(name) ?? '' }\n\t}),\n\tsession: Array.from({ length: sessionStorage.length }, (_, index) => {\n\t\tconst name = sessionStorage.key(index)\n\t\treturn { name, value: name === null ? '' : sessionStorage.getItem(name) ?? '' }\n\t}),\n})`\n}\n\n/**\n * Compile an expression that restores one origin's web storage.\n *\n * @param origin - Storage values to restore\n * @returns In-page restore expression\n */\nexport function compileStorageRestoreExpression(origin: BrowserStorageOrigin): string {\n\treturn `(() => {\n\tconst state = ${JSON.stringify({ local: origin.local, session: origin.session })}\n\tlocalStorage.clear()\n\tsessionStorage.clear()\n\tfor (const entry of state.local) localStorage.setItem(entry.name, entry.value)\n\tfor (const entry of state.session) sessionStorage.setItem(entry.name, entry.value)\n\treturn true\n})()`\n}\n\n/**\n * Compile an expression that clears local and session storage.\n *\n * @returns In-page clear expression\n */\nexport function compileStorageClearExpression(): string {\n\treturn `(() => {\n\tlocalStorage.clear()\n\tsessionStorage.clear()\n\treturn true\n})()`\n}\n\n/**\n * Decode one in-page web-storage snapshot.\n *\n * @param value - Unknown evaluation result\n * @param origin - Origin represented by the result\n * @returns Valid origin storage\n */\nexport function readBrowserStorageOrigin(value: unknown, origin: string): BrowserStorageOrigin {\n\tif (!isRecord(value))\n\t\tthrow new BrowserError('Browser storage result is malformed', undefined, { origin })\n\treturn {\n\t\torigin,\n\t\tlocal: readBrowserStorageEntries(value['local'], origin, 'local'),\n\t\tsession: readBrowserStorageEntries(value['session'], origin, 'session'),\n\t}\n}\n\n/**\n * Decode a list of web-storage entries.\n *\n * @param value - Unknown entry list\n * @param origin - Origin used for diagnostics\n * @param storage - Storage family used for diagnostics\n * @returns Valid key/value entries\n */\nexport function readBrowserStorageEntries(\n\tvalue: unknown,\n\torigin: string,\n\tstorage: 'local' | 'session',\n): readonly BrowserStorageEntry[] {\n\tif (!isArray(value)) {\n\t\tthrow new BrowserError('Browser storage entries are malformed', undefined, { origin, storage })\n\t}\n\treturn value.map((entry, index) => {\n\t\tif (!isRecord(entry) || !isString(entry['name']) || !isString(entry['value'])) {\n\t\t\tthrow new BrowserError('Browser storage entry is malformed', undefined, {\n\t\t\t\torigin,\n\t\t\t\tstorage,\n\t\t\t\tindex,\n\t\t\t})\n\t\t}\n\t\treturn { name: entry['name'], value: entry['value'] }\n\t})\n}\n\n/**\n * Convert typed media preferences to Chromium emulated media features.\n *\n * @param media - Public media configuration\n * @returns Protocol feature records\n */\nexport function mediaToFeatures(\n\tmedia: BrowserMedia,\n): ReadonlyArray<Readonly<Record<string, string>>> {\n\tconst features: Array<Readonly<Record<string, string>>> = []\n\tif (media.color !== undefined) features.push({ name: 'prefers-color-scheme', value: media.color })\n\tif (media.contrast !== undefined) {\n\t\tfeatures.push({ name: 'prefers-contrast', value: media.contrast })\n\t}\n\tif (media.motion !== undefined) {\n\t\tfeatures.push({ name: 'prefers-reduced-motion', value: media.motion })\n\t}\n\tif (media.colors !== undefined) {\n\t\tfeatures.push({ name: 'forced-colors', value: media.colors })\n\t}\n\treturn features\n}\n\n/**\n * Decode a Chromium runtime stack trace.\n *\n * @param value - Unknown stack trace or call-frame list\n * @returns Valid stack frames\n */\nexport function readBrowserStack(value: unknown): readonly BrowserStackFrame[] {\n\tconst frames = isRecord(value) ? value['callFrames'] : value\n\tif (!isArray(frames)) return []\n\tconst stack: BrowserStackFrame[] = []\n\tfor (const frame of frames) {\n\t\tif (\n\t\t\t!isRecord(frame) ||\n\t\t\t!isString(frame['url']) ||\n\t\t\t!isString(frame['functionName']) ||\n\t\t\t!isInteger(frame['lineNumber']) ||\n\t\t\t!isInteger(frame['columnNumber'])\n\t\t) {\n\t\t\tcontinue\n\t\t}\n\t\tstack.push({\n\t\t\turl: frame['url'],\n\t\t\tfunction: frame['functionName'],\n\t\t\tline: frame['lineNumber'],\n\t\t\tcolumn: frame['columnNumber'],\n\t\t})\n\t}\n\treturn stack\n}\n\n/**\n * Decode one `Runtime.consoleAPICalled` event.\n *\n * @param value - Unknown event parameters\n * @returns Console message or undefined\n */\nexport function readBrowserConsoleMessage(value: unknown): BrowserConsoleMessage | undefined {\n\tif (\n\t\t!isRecord(value) ||\n\t\t!isString(value['type']) ||\n\t\t!isFiniteNumber(value['timestamp']) ||\n\t\t!isArray(value['args'])\n\t) {\n\t\treturn undefined\n\t}\n\tconst values = value['args'].map(readBrowserRemoteValue)\n\treturn {\n\t\tlevel: value['type'],\n\t\ttext: values\n\t\t\t.map((entry) => {\n\t\t\t\tif (isString(entry)) return entry\n\t\t\t\tconst serialized = attempt<unknown>(() => JSON.stringify(entry))\n\t\t\t\treturn serialized.success && isString(serialized.value) ? serialized.value : String(entry)\n\t\t\t})\n\t\t\t.join(' '),\n\t\tvalues,\n\t\ttimestamp: value['timestamp'],\n\t\tstack: readBrowserStack(value['stackTrace']),\n\t}\n}\n\n/**\n * Decode a Runtime remote object's printable value.\n *\n * @param value - Unknown remote object\n * @returns By-value data or a description\n */\nexport function readBrowserRemoteValue(value: unknown): unknown {\n\tif (!isRecord(value)) return undefined\n\tif ('value' in value) return value['value']\n\tif (isString(value['unserializableValue'])) return value['unserializableValue']\n\tif (isString(value['description'])) return value['description']\n\treturn undefined\n}\n\n/**\n * Decode one `Runtime.exceptionThrown` event.\n *\n * @param value - Unknown event parameters\n * @returns Page error or undefined\n */\nexport function readBrowserPageError(value: unknown): BrowserPageError | undefined {\n\tif (!isRecord(value) || !isRecord(value['exceptionDetails'])) return undefined\n\tconst details = value['exceptionDetails']\n\tconst timestamp = isFiniteNumber(value['timestamp']) ? value['timestamp'] : Date.now()\n\tconst exception = readBrowserRemoteValue(details['exception'])\n\tconst message = isString(exception)\n\t\t? exception\n\t\t: isString(details['text'])\n\t\t\t? details['text']\n\t\t\t: 'Uncaught page exception'\n\treturn {\n\t\tmessage,\n\t\tstack: readBrowserStack(details['stackTrace']),\n\t\ttimestamp,\n\t}\n}\n\n/**\n * Decode one `Browser.downloadWillBegin` event.\n *\n * @param value - Unknown event parameters\n * @returns Download start or undefined\n */\nexport function readBrowserDownloadStart(value: unknown): BrowserDownloadStart | undefined {\n\tif (\n\t\t!isRecord(value) ||\n\t\t!isString(value['guid']) ||\n\t\t!isString(value['url']) ||\n\t\t!isString(value['suggestedFilename']) ||\n\t\t!isString(value['frameId'])\n\t) {\n\t\treturn undefined\n\t}\n\treturn {\n\t\tid: value['guid'],\n\t\turl: value['url'],\n\t\tname: value['suggestedFilename'],\n\t\tframe: value['frameId'],\n\t}\n}\n\n/**\n * Decode one `Browser.downloadProgress` event.\n *\n * @param value - Unknown event parameters\n * @returns Download id and progress, or undefined\n */\nexport function readBrowserDownloadProgress(\n\tvalue: unknown,\n): readonly [id: string, progress: BrowserDownloadProgress] | undefined {\n\tif (\n\t\t!isRecord(value) ||\n\t\t!isString(value['guid']) ||\n\t\t!isFiniteNumber(value['receivedBytes']) ||\n\t\tvalue['receivedBytes'] < 0 ||\n\t\t!isFiniteNumber(value['totalBytes']) ||\n\t\tvalue['totalBytes'] < 0\n\t) {\n\t\treturn undefined\n\t}\n\tconst state = parseEnum(value['state'], ['completed', 'canceled', 'inProgress'])\n\tconst status =\n\t\tstate === 'completed'\n\t\t\t? 'complete'\n\t\t\t: state === 'canceled'\n\t\t\t\t? 'cancelled'\n\t\t\t\t: state === 'inProgress'\n\t\t\t\t\t? 'pending'\n\t\t\t\t\t: undefined\n\tif (status === undefined) return undefined\n\treturn [\n\t\tvalue['guid'],\n\t\t{\n\t\t\tstatus,\n\t\t\treceived: value['receivedBytes'],\n\t\t\ttotal: value['totalBytes'],\n\t\t\t...(isString(value['filePath']) ? { path: value['filePath'] } : {}),\n\t\t},\n\t]\n}\n\n/**\n * Wrap a `Runtime.evaluate` expression so the IN-PAGE code stringifies its\n * own result and throws a recognizable error before an oversized result\n * would overflow the CDP transport frame.\n *\n * @remarks\n * A result whose `JSON.stringify` length exceeds `limit` throws\n * `Error('BROWSER_RESULT_LIMIT: <length>')` inside the page instead of being\n * returned — the caller maps that sentinel to a coded\n * {@link BrowserResultLimitError}. A non-serializable result (`undefined`,\n * a function, a symbol) makes `JSON.stringify` return `undefined`, so the\n * length check is skipped and today's undefined-passthrough behavior is\n * unchanged.\n *\n * The expression is placed on its own line inside the wrapper (rather than\n * inline with the guard code) so a trailing `//` line comment in the\n * expression cannot swallow the closing guard syntax that follows it.\n *\n * @param expression - The candidate JavaScript expression to evaluate\n * @param limit - Maximum serialized-character length (see {@link BROWSER_RESULT_LIMIT})\n * @returns The wrapped, guarded expression\n */\nexport function guardEvaluateExpression(expression: string, limit: number): string {\n\treturn `(() => { const r = (\n${expression}\n); const s = JSON.stringify(r); if (typeof s === 'string' && s.length > ${limit}) throw new Error(${JSON.stringify(BROWSER_RESULT_LIMIT_SENTINEL_PREFIX)} + s.length); return r })()`\n}\n\n/**\n * Decode one CDP `Runtime.evaluate` result.\n *\n * @param value - Unknown CDP result\n * @returns The returned by-value payload, or undefined\n */\nexport function readEvaluationResult(value: unknown): unknown {\n\tif (!isRecord(value)) return undefined\n\n\tif (isRecord(value['exceptionDetails'])) {\n\t\tconst details = value['exceptionDetails']\n\t\tif (isRecord(details['exception']) && isString(details['exception']['description'])) {\n\t\t\tconst description = details['exception']['description']\n\t\t\tconst limitMatch = BROWSER_RESULT_LIMIT_PATTERN.exec(description)\n\t\t\tif (limitMatch !== null) {\n\t\t\t\tthrow new BrowserResultLimitError('Evaluation result exceeds BROWSER_RESULT_LIMIT', {\n\t\t\t\t\tlength: Number(limitMatch[1]),\n\t\t\t\t\tlimit: BROWSER_RESULT_LIMIT,\n\t\t\t\t})\n\t\t\t}\n\t\t\tthrow new BrowserError(description)\n\t\t}\n\t\tthrow new BrowserError('JavaScript evaluation failed')\n\t}\n\n\tconst remoteObject = value['result']\n\tif (!isRecord(remoteObject)) return undefined\n\treturn 'value' in remoteObject ? remoteObject['value'] : undefined\n}\n\n/**\n * Require an evaluated browser value to be a string.\n *\n * @param value - Candidate evaluated value\n * @param field - Human-readable field name used in the error\n * @returns The narrowed string\n */\nexport function requireBrowserString(value: unknown, field: string): string {\n\tif (isString(value)) return value\n\tthrow new BrowserError(`${field} failed: no string value returned`)\n}\n\n/**\n * Normalize a raw list of recorded codegen actions.\n *\n * @remarks\n * Collapses consecutive `fill` actions on the same selector into the latest\n * value (a text input fires one `input` event per keystroke) so the\n * compiled script reflects the final typed value rather than every\n * intermediate keystroke.\n *\n * @param actions - Raw recorded actions, in capture order\n * @returns Normalized actions, in the same order\n */\nexport function normalizeCodegenActions(\n\tactions: readonly BrowserCodegenAction[],\n): readonly BrowserCodegenAction[] {\n\tconst result: BrowserCodegenAction[] = []\n\n\tfor (const action of actions) {\n\t\tconst previous = result[result.length - 1]\n\t\tif (\n\t\t\tprevious !== undefined &&\n\t\t\tprevious.action === 'fill' &&\n\t\t\taction.action === 'fill' &&\n\t\t\tprevious.selector === action.selector\n\t\t) {\n\t\t\tresult[result.length - 1] = action\n\t\t\tcontinue\n\t\t}\n\t\tresult.push(action)\n\t}\n\n\treturn result\n}\n\n/**\n * Parse a codegen binding payload into a typed action.\n *\n * @remarks\n * The in-page recorder script calls the CDP binding with a JSON string\n * payload shaped like a {@link BrowserCodegenAction}. Returns `undefined`\n * when the payload is not valid JSON or does not match a known action shape.\n *\n * @param payload - Raw binding call payload (the CDP `payload` param)\n * @returns The parsed action, or `undefined` when the payload is malformed\n */\nexport function parseCodegenActionPayload(payload: unknown): BrowserCodegenAction | undefined {\n\tif (!isString(payload)) return undefined\n\tconst parsed = parseJSON(payload)\n\tif (!isRecord(parsed)) return undefined\n\n\tconst action = parseEnum(parsed['action'], ['click', 'fill', 'select'])\n\tconst selector = parsed['selector']\n\n\tif (action === 'click' && isString(selector)) {\n\t\treturn { action: 'click', selector }\n\t}\n\n\tif (action === 'fill' && isString(selector) && isString(parsed['value'])) {\n\t\treturn { action: 'fill', selector, value: parsed['value'] }\n\t}\n\n\tif (action === 'select' && isString(selector)) {\n\t\tconst values = parseArray(parsed['values'], isString)\n\t\tif (values !== undefined) return { action: 'select', selector, values }\n\t}\n\n\treturn undefined\n}\n\n/**\n * Derive a `navigate` codegen action from a `Page.frameNavigated` CDP event.\n *\n * @remarks\n * Only the top-level (main) frame's navigation is recorded — a frame\n * carrying a `parentId` is a sub-frame and is ignored.\n *\n * @param params - The CDP `Page.frameNavigated` event params\n * @returns A `navigate` action, or `undefined` when the event is not a\n * top-level navigation with a resolvable URL\n */\nexport function readCodegenNavigateAction(\n\tparams: Readonly<Record<string, unknown>>,\n): BrowserCodegenAction | undefined {\n\tconst frame = params['frame']\n\tif (!isRecord(frame)) return undefined\n\tif ('parentId' in frame) return undefined\n\tif (!isString(frame['url'])) return undefined\n\n\treturn { action: 'navigate', url: frame['url'] }\n}\n\n/**\n * Compile recorded codegen actions into a replayable script.\n *\n * @remarks\n * Emits one statement per action against a `page` object shaped like\n * {@link BrowserPageInterface} (`page.navigate(...)`, `page.click(...)`, …).\n * Both target languages emit an `async function run(page)` body whose\n * statements are `await`-ed; `language` only toggles whether the `page`\n * parameter carries a TypeScript type annotation (default `'javascript'`).\n *\n * @param actions - Normalized actions to compile\n * @param options - Compilation options (target language)\n * @returns The compiled script source\n */\nexport function compileCodegenScript(\n\tactions: readonly BrowserCodegenAction[],\n\toptions?: BrowserCodegenScriptOptions,\n): string {\n\tconst language = options?.language ?? 'javascript'\n\n\tconst lines = actions.map((action) => {\n\t\tswitch (action.action) {\n\t\t\tcase 'navigate':\n\t\t\t\treturn `await page.navigate(${JSON.stringify(action.url)})`\n\t\t\tcase 'click':\n\t\t\t\treturn `await page.click(${JSON.stringify(action.selector)})`\n\t\t\tcase 'fill':\n\t\t\t\treturn `await page.fill(${JSON.stringify(action.selector)}, ${JSON.stringify(action.value)})`\n\t\t\tcase 'select':\n\t\t\t\treturn `await page.select(${JSON.stringify(action.selector)}, ${JSON.stringify(action.values)})`\n\t\t}\n\t})\n\n\tif (language === 'typescript') {\n\t\treturn [\n\t\t\t`async function run(page: import('@orkestrel/browser').BrowserPageInterface): Promise<void> {`,\n\t\t\t...lines.map((line) => `\\t${line}`),\n\t\t\t`}`,\n\t\t].join('\\n')\n\t}\n\n\treturn [`async function run(page) {`, ...lines.map((line) => `\\t${line}`), `}`].join('\\n')\n}\n\n/**\n * Decode a flattened CDP `Page.getFrameTree` result.\n *\n * @param value - Unknown CDP result\n * @returns Frame metadata in depth-first, main-frame-first order\n */\nexport function readBrowserFrames(value: unknown): readonly BrowserFrameInfo[] {\n\tif (!isRecord(value) || !isRecord(value['frameTree'])) return []\n\n\tconst frames: BrowserFrameInfo[] = []\n\tconst stack: Array<Readonly<Record<string, unknown>>> = [value['frameTree']]\n\n\twhile (stack.length > 0) {\n\t\tconst node = stack.pop()\n\t\tif (node === undefined) break\n\t\tconst frame = node['frame']\n\n\t\tif (isRecord(frame) && isString(frame['id']) && isString(frame['url'])) {\n\t\t\tframes.push({\n\t\t\t\tid: frame['id'],\n\t\t\t\tparent: isString(frame['parentId']) ? frame['parentId'] : undefined,\n\t\t\t\tname: isString(frame['name']) && frame['name'] !== '' ? frame['name'] : undefined,\n\t\t\t\turl: frame['url'],\n\t\t\t})\n\t\t}\n\n\t\tconst children = node['childFrames']\n\t\tif (!isArray(children)) continue\n\t\tfor (let index = children.length - 1; index >= 0; index -= 1) {\n\t\t\tconst child = children[index]\n\t\t\tif (isRecord(child)) stack.push(child)\n\t\t}\n\t}\n\n\treturn frames\n}\n\n/**\n * Compile a deep, shadow-aware locator query returning every match.\n *\n * @param query - Serializable locator query\n * @returns Runtime expression returning an element array\n */\nexport function compileLocatorListExpression(query: BrowserQuery): string {\n\treturn `(() => {\n\tconst query = ${JSON.stringify(query)}\n\tconst normalize = (value) => String(value ?? '').replace(/\\\\s+/g, ' ').trim()\n\tconst matchesText = (actual, expected, exact) => exact ? normalize(actual) === normalize(expected) : normalize(actual).includes(normalize(expected))\n\tconst elements = (root) => {\n\t\tconst found = []\n\t\tconst stack = []\n\t\tif (root instanceof Document || root instanceof ShadowRoot) {\n\t\t\tfor (let index = root.children.length - 1; index >= 0; index -= 1) stack.push(root.children[index])\n\t\t} else {\n\t\t\tfor (let index = root.children.length - 1; index >= 0; index -= 1) stack.push(root.children[index])\n\t\t}\n\t\twhile (stack.length > 0) {\n\t\t\tconst element = stack.pop()\n\t\t\tif (!(element instanceof Element)) continue\n\t\t\tfound.push(element)\n\t\t\tif (element.shadowRoot) {\n\t\t\t\tfor (let index = element.shadowRoot.children.length - 1; index >= 0; index -= 1) stack.push(element.shadowRoot.children[index])\n\t\t\t}\n\t\t\tfor (let index = element.children.length - 1; index >= 0; index -= 1) stack.push(element.children[index])\n\t\t}\n\t\treturn found\n\t}\n\tconst roleOf = (element) => {\n\t\tconst explicit = element.getAttribute('role')\n\t\tif (explicit) return explicit.split(/\\\\s+/)[0]\n\t\tconst tag = element.tagName.toLowerCase()\n\t\tif (tag === 'a' && element.hasAttribute('href')) return 'link'\n\t\tif (tag === 'button') return 'button'\n\t\tif (tag === 'textarea') return 'textbox'\n\t\tif (tag === 'select') return element.multiple ? 'listbox' : 'combobox'\n\t\tif (tag === 'option') return 'option'\n\t\tif (tag === 'img') return 'img'\n\t\tif (tag === 'nav') return 'navigation'\n\t\tif (tag === 'main') return 'main'\n\t\tif (tag === 'header') return 'banner'\n\t\tif (tag === 'footer') return 'contentinfo'\n\t\tif (tag === 'aside') return 'complementary'\n\t\tif (tag === 'article') return 'article'\n\t\tif (tag === 'form') return 'form'\n\t\tif (tag === 'table') return 'table'\n\t\tif (tag === 'tr') return 'row'\n\t\tif (tag === 'th') return 'columnheader'\n\t\tif (tag === 'td') return 'cell'\n\t\tif (tag === 'ul' || tag === 'ol') return 'list'\n\t\tif (tag === 'li') return 'listitem'\n\t\tif (/^h[1-6]$/.test(tag)) return 'heading'\n\t\tif (tag === 'input') {\n\t\t\tconst type = (element.getAttribute('type') || 'text').toLowerCase()\n\t\t\tif (type === 'checkbox') return 'checkbox'\n\t\t\tif (type === 'radio') return 'radio'\n\t\t\tif (type === 'range') return 'slider'\n\t\t\tif (type === 'number') return 'spinbutton'\n\t\t\tif (type === 'button' || type === 'submit' || type === 'reset') return 'button'\n\t\t\tif (type !== 'hidden') return 'textbox'\n\t\t}\n\t\treturn undefined\n\t}\n\tconst labelOf = (element) => {\n\t\tconst labelled = element.getAttribute('aria-labelledby')\n\t\tif (labelled) {\n\t\t\tconst text = labelled.split(/\\\\s+/).map((id) => element.ownerDocument.getElementById(id)?.textContent || '').join(' ')\n\t\t\tif (normalize(text)) return normalize(text)\n\t\t}\n\t\tif (element.hasAttribute('aria-label')) return normalize(element.getAttribute('aria-label'))\n\t\tif ('labels' in element && element.labels && element.labels.length > 0) {\n\t\t\tconst text = Array.from(element.labels, (label) => label.textContent || '').join(' ')\n\t\t\treturn normalize(text)\n\t\t}\n\t\treturn undefined\n\t}\n\tconst nameOf = (element) => {\n\t\tconst label = labelOf(element)\n\t\tif (label !== undefined) return label\n\t\tconst alt = element.getAttribute('alt')\n\t\tif (alt) return normalize(alt)\n\t\tconst title = element.getAttribute('title')\n\t\tif (title) return normalize(title)\n\t\tif (element instanceof HTMLInputElement && ['button', 'submit', 'reset'].includes(element.type)) return normalize(element.value)\n\t\treturn normalize(element.textContent)\n\t}\n\tconst visible = (element) => {\n\t\tconst style = getComputedStyle(element)\n\t\tconst rect = element.getBoundingClientRect()\n\t\treturn style.display !== 'none' && style.visibility !== 'hidden' && style.visibility !== 'collapse' && rect.width > 0 && rect.height > 0\n\t}\n\tconst resolve = (candidate) => {\n\t\tconst roots = candidate.parent ? resolve(candidate.parent) : [document]\n\t\tlet found = []\n\t\tfor (const root of roots) {\n\t\t\tconst candidates = elements(root)\n\t\t\tswitch (candidate.selector) {\n\t\t\t\tcase 'css':\n\t\t\t\t\tfound.push(...candidates.filter((element) => element.matches(candidate.value)))\n\t\t\t\t\tbreak\n\t\t\t\tcase 'role':\n\t\t\t\t\tfound.push(...candidates.filter((element) => roleOf(element) === candidate.value && (candidate.name === undefined || matchesText(nameOf(element), candidate.name, candidate.exact === true))))\n\t\t\t\t\tbreak\n\t\t\t\tcase 'text':\n\t\t\t\t\tfound.push(...candidates.filter((element) => matchesText(element.textContent, candidate.value, candidate.exact === true) && !Array.from(element.children).some((child) => matchesText(child.textContent, candidate.value, candidate.exact === true))))\n\t\t\t\t\tbreak\n\t\t\t\tcase 'label':\n\t\t\t\t\tfound.push(...candidates.filter((element) => {\n\t\t\t\t\t\tconst label = labelOf(element)\n\t\t\t\t\t\treturn label !== undefined && matchesText(label, candidate.value, candidate.exact === true)\n\t\t\t\t\t}))\n\t\t\t\t\tbreak\n\t\t\t\tcase 'placeholder':\n\t\t\t\t\tfound.push(...candidates.filter((element) => matchesText(element.getAttribute('placeholder'), candidate.value, candidate.exact === true)))\n\t\t\t\t\tbreak\n\t\t\t\tcase 'test':\n\t\t\t\t\tfound.push(...candidates.filter((element) => element.getAttribute(${JSON.stringify(BROWSER_TEST_ID_ATTRIBUTE)}) === candidate.value))\n\t\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\tfound = found.filter((element, index) => found.indexOf(element) === index)\n\t\tif (candidate.filter?.text !== undefined) found = found.filter((element) => matchesText(element.textContent, candidate.filter.text, candidate.filter.exact === true))\n\t\tif (candidate.filter?.visible !== undefined) found = found.filter((element) => visible(element) === candidate.filter.visible)\n\t\tif (candidate.index !== undefined) {\n\t\t\tconst index = candidate.index < 0 ? found.length + candidate.index : candidate.index\n\t\t\treturn found[index] ? [found[index]] : []\n\t\t}\n\t\treturn found\n\t}\n\treturn resolve(query)\n})()`\n}\n\n/**\n * Compile a deep locator query returning its first match.\n *\n * @param query - Serializable locator query\n * @returns Runtime expression returning one element or undefined\n */\nexport function compileLocatorExpression(query: BrowserQuery): string {\n\treturn `(${compileLocatorListExpression(query)})[0]`\n}\n\n/**\n * Compile an attached-state locator wait.\n */\nexport function compileAttachedLocatorWaitExpression(\n\tquery: BrowserQuery,\n\tstrict: boolean,\n\ttimeout: number,\n): string {\n\treturn `new Promise((resolve, reject) => {\n\tconst deadline = performance.now() + ${timeout}\n\tconst check = () => {\n\t\tconst matches = ${compileLocatorListExpression(query)}\n\t\tif (${JSON.stringify(strict)} && matches.length > 1) {\n\t\t\treject(new Error('Strict locator matched ' + matches.length + ' elements'))\n\t\t\treturn true\n\t\t}\n\t\tif (matches.length > 0) {\n\t\t\tresolve(true)\n\t\t\treturn true\n\t\t}\n\t\tif (performance.now() >= deadline) {\n\t\t\tresolve(false)\n\t\t\treturn true\n\t\t}\n\t\treturn false\n\t}\n\tif (check()) return\n\tconst timer = setInterval(() => {\n\t\tif (!check()) return\n\t\tclearInterval(timer)\n\t}, 50)\n})`\n}\n\n/**\n * Compile a detached-state locator wait.\n */\nexport function compileDetachedLocatorWaitExpression(\n\tquery: BrowserQuery,\n\tstrict: boolean,\n\ttimeout: number,\n): string {\n\treturn `new Promise((resolve, reject) => {\n\tconst deadline = performance.now() + ${timeout}\n\tconst check = () => {\n\t\tconst matches = ${compileLocatorListExpression(query)}\n\t\tif (${JSON.stringify(strict)} && matches.length > 1) {\n\t\t\treject(new Error('Strict locator matched ' + matches.length + ' elements'))\n\t\t\treturn true\n\t\t}\n\t\tif (matches.length === 0) {\n\t\t\tresolve(true)\n\t\t\treturn true\n\t\t}\n\t\tif (performance.now() >= deadline) {\n\t\t\tresolve(false)\n\t\t\treturn true\n\t\t}\n\t\treturn false\n\t}\n\tif (check()) return\n\tconst timer = setInterval(() => {\n\t\tif (!check()) return\n\t\tclearInterval(timer)\n\t}, 50)\n})`\n}\n\n/**\n * Compile a visible-state locator wait.\n */\nexport function compileVisibleLocatorWaitExpression(\n\tquery: BrowserQuery,\n\tstrict: boolean,\n\ttimeout: number,\n): string {\n\treturn `new Promise((resolve, reject) => {\n\tconst deadline = performance.now() + ${timeout}\n\tconst visible = (element) => {\n\t\tconst style = getComputedStyle(element)\n\t\tconst rect = element.getBoundingClientRect()\n\t\treturn style.display !== 'none' && style.visibility !== 'hidden' && style.visibility !== 'collapse' && rect.width > 0 && rect.height > 0\n\t}\n\tconst check = () => {\n\t\tconst matches = ${compileLocatorListExpression(query)}\n\t\tif (${JSON.stringify(strict)} && matches.length > 1) {\n\t\t\treject(new Error('Strict locator matched ' + matches.length + ' elements'))\n\t\t\treturn true\n\t\t}\n\t\tif (matches.length > 0 && visible(matches[0])) {\n\t\t\tresolve(true)\n\t\t\treturn true\n\t\t}\n\t\tif (performance.now() >= deadline) {\n\t\t\tresolve(false)\n\t\t\treturn true\n\t\t}\n\t\treturn false\n\t}\n\tif (check()) return\n\tconst timer = setInterval(() => {\n\t\tif (!check()) return\n\t\tclearInterval(timer)\n\t}, 50)\n})`\n}\n\n/**\n * Compile a hidden-state locator wait.\n */\nexport function compileHiddenLocatorWaitExpression(\n\tquery: BrowserQuery,\n\tstrict: boolean,\n\ttimeout: number,\n): string {\n\treturn `new Promise((resolve, reject) => {\n\tconst deadline = performance.now() + ${timeout}\n\tconst visible = (element) => {\n\t\tconst style = getComputedStyle(element)\n\t\tconst rect = element.getBoundingClientRect()\n\t\treturn style.display !== 'none' && style.visibility !== 'hidden' && style.visibility !== 'collapse' && rect.width > 0 && rect.height > 0\n\t}\n\tconst check = () => {\n\t\tconst matches = ${compileLocatorListExpression(query)}\n\t\tif (${JSON.stringify(strict)} && matches.length > 1) {\n\t\t\treject(new Error('Strict locator matched ' + matches.length + ' elements'))\n\t\t\treturn true\n\t\t}\n\t\tif (matches.length === 0 || matches.every((element) => !visible(element))) {\n\t\t\tresolve(true)\n\t\t\treturn true\n\t\t}\n\t\tif (performance.now() >= deadline) {\n\t\t\tresolve(false)\n\t\t\treturn true\n\t\t}\n\t\treturn false\n\t}\n\tif (check()) return\n\tconst timer = setInterval(() => {\n\t\tif (!check()) return\n\t\tclearInterval(timer)\n\t}, 50)\n})`\n}\n\n/**\n * Compile the element-side actionability pass used before trusted input.\n *\n * @param options - Checks required for the action\n * @returns Async `Runtime.callFunctionOn` function declaration\n */\nexport function compileActionabilityFunction(options: BrowserActionabilityOptions): string {\n\treturn `async function() {\n\tif (!(this instanceof Element) || !this.isConnected) throw new Error('Element is detached')\n\tthis.scrollIntoView({ block: 'center', inline: 'center', behavior: 'instant' })\n\tconst visible = () => {\n\t\tconst style = getComputedStyle(this)\n\t\tconst rect = this.getBoundingClientRect()\n\t\treturn style.display !== 'none' && style.visibility !== 'hidden' && style.visibility !== 'collapse' && rect.width > 0 && rect.height > 0\n\t}\n\tif (${JSON.stringify(options.visible === true)} && !visible()) throw new Error('Element is not visible')\n\tif (${JSON.stringify(options.enabled === true)} && this.matches(':disabled')) throw new Error('Element is disabled')\n\tif (${JSON.stringify(options.editable === true)} && (this.matches('[readonly]') || (!this.isContentEditable && !('value' in this)))) throw new Error('Element is not editable')\n\tlet previous\n\tfor (let index = 0; index < ${BROWSER_STABLE_FRAME_COUNT}; index += 1) {\n\t\tawait new Promise((resolve) => requestAnimationFrame(resolve))\n\t\tconst rect = this.getBoundingClientRect()\n\t\tconst current = [rect.x, rect.y, rect.width, rect.height]\n\t\tif (${JSON.stringify(options.stable === true)} && previous && current.some((value, part) => value !== previous[part])) {\n\t\t\tindex = 0\n\t\t}\n\t\tprevious = current\n\t}\n\tif (${JSON.stringify(options.events === true)}) {\n\t\tconst rect = this.getBoundingClientRect()\n\t\tconst position = ${JSON.stringify(options.position)}\n\t\tconst x = rect.x + (position?.x ?? rect.width / 2)\n\t\tconst y = rect.y + (position?.y ?? rect.height / 2)\n\t\tconst target = this.ownerDocument.elementFromPoint(x, y)\n\t\tif (target !== this && !this.contains(target)) throw new Error('Element does not receive pointer events')\n\t}\n\treturn true\n}`\n}\n\n/**\n * Decode the first `DOM.getContentQuads` quad and its center.\n *\n * @param value - Unknown CDP result\n * @returns Decoded quad\n */\nexport function readBrowserQuad(value: unknown): BrowserQuad {\n\tif (!isRecord(value) || !isArray(value['quads'])) {\n\t\tthrow new BrowserError('Element has no content quad')\n\t}\n\tconst points = readNumberArray(value['quads'][0])\n\tif (points === undefined || points.length !== 8) {\n\t\tthrow new BrowserError('Element has a malformed content quad')\n\t}\n\tconst x1 = points[0]\n\tconst y1 = points[1]\n\tconst x2 = points[2]\n\tconst y2 = points[3]\n\tconst x3 = points[4]\n\tconst y3 = points[5]\n\tconst x4 = points[6]\n\tconst y4 = points[7]\n\tif (\n\t\tx1 === undefined ||\n\t\ty1 === undefined ||\n\t\tx2 === undefined ||\n\t\ty2 === undefined ||\n\t\tx3 === undefined ||\n\t\ty3 === undefined ||\n\t\tx4 === undefined ||\n\t\ty4 === undefined\n\t) {\n\t\tthrow new BrowserError('Element has a malformed content quad')\n\t}\n\treturn {\n\t\tpoints: [x1, y1, x2, y2, x3, y3, x4, y4],\n\t\tcenter: {\n\t\t\tx: (x1 + x2 + x3 + x4) / 4,\n\t\t\ty: (y1 + y2 + y3 + y4) / 4,\n\t\t},\n\t}\n}\n\n/**\n * Parse a keyboard chord such as `Control+Shift+P`.\n *\n * @param value - Chord source\n * @returns Canonical modifiers and terminal key\n */\nexport function parseBrowserChord(value: string): BrowserChord {\n\tconst parts = value.split('+').filter((part) => part.length > 0)\n\tconst key = parts.pop()\n\tif (key === undefined) throw new BrowserError('Browser key chord is empty')\n\tconst modifiers = parts.map((modifier) => {\n\t\tswitch (modifier) {\n\t\t\tcase 'Ctrl':\n\t\t\t\treturn 'Control'\n\t\t\tcase 'Cmd':\n\t\t\tcase 'Command':\n\t\t\t\treturn 'Meta'\n\t\t\tdefault:\n\t\t\t\treturn modifier\n\t\t}\n\t})\n\tfor (const modifier of modifiers) {\n\t\tif (BROWSER_KEY_MODIFIERS[modifier] === undefined) {\n\t\t\tthrow new BrowserError(`Unsupported browser key modifier: ${modifier}`)\n\t\t}\n\t}\n\treturn { modifiers, key }\n}\n\n/**\n * Compute the CDP Input modifier bitmask.\n *\n * @param modifiers - Canonical modifier names\n * @returns Combined CDP modifier mask\n */\nexport function computeBrowserModifiers(modifiers: readonly string[]): number {\n\tlet mask = 0\n\tfor (const modifier of modifiers) mask |= BROWSER_KEY_MODIFIERS[modifier] ?? 0\n\treturn mask\n}\n\n/**\n * Compute the CDP Input pressed-button bitmask.\n *\n * @param buttons - Currently pressed public mouse buttons\n * @returns Combined CDP pressed-button mask\n */\nexport function computeBrowserButtons(buttons: readonly BrowserMouseButton[]): number {\n\tlet mask = 0\n\tfor (const button of buttons) mask |= BROWSER_MOUSE_BUTTON_MASKS[button]\n\treturn mask\n}\n\n/**\n * Normalize one key to CDP keyboard event data.\n *\n * @param value - Key value or canonical key name\n * @returns Normalized key data\n */\nexport function keyToBrowserInput(value: string): BrowserKey {\n\tconst named: Readonly<Record<string, BrowserKey>> = {\n\t\tBackspace: { key: 'Backspace', code: 'Backspace', text: undefined, number: 8 },\n\t\tTab: { key: 'Tab', code: 'Tab', text: '\\t', number: 9 },\n\t\tEnter: { key: 'Enter', code: 'Enter', text: '\\r', number: 13 },\n\t\tShift: { key: 'Shift', code: 'ShiftLeft', text: undefined, number: 16 },\n\t\tControl: { key: 'Control', code: 'ControlLeft', text: undefined, number: 17 },\n\t\tAlt: { key: 'Alt', code: 'AltLeft', text: undefined, number: 18 },\n\t\tEscape: { key: 'Escape', code: 'Escape', text: undefined, number: 27 },\n\t\tSpace: { key: ' ', code: 'Space', text: ' ', number: 32 },\n\t\tPageUp: { key: 'PageUp', code: 'PageUp', text: undefined, number: 33 },\n\t\tPageDown: { key: 'PageDown', code: 'PageDown', text: undefined, number: 34 },\n\t\tEnd: { key: 'End', code: 'End', text: undefined, number: 35 },\n\t\tHome: { key: 'Home', code: 'Home', text: undefined, number: 36 },\n\t\tArrowLeft: { key: 'ArrowLeft', code: 'ArrowLeft', text: undefined, number: 37 },\n\t\tArrowUp: { key: 'ArrowUp', code: 'ArrowUp', text: undefined, number: 38 },\n\t\tArrowRight: { key: 'ArrowRight', code: 'ArrowRight', text: undefined, number: 39 },\n\t\tArrowDown: { key: 'ArrowDown', code: 'ArrowDown', text: undefined, number: 40 },\n\t\tDelete: { key: 'Delete', code: 'Delete', text: undefined, number: 46 },\n\t\tMeta: { key: 'Meta', code: 'MetaLeft', text: undefined, number: 91 },\n\t}\n\tconst matched = named[value]\n\tif (matched !== undefined) return matched\n\tif ([...value].length !== 1) throw new BrowserError(`Unsupported browser key: ${value}`)\n\tconst character = [...value][0]\n\tif (character === undefined) throw new BrowserError('Browser key is empty')\n\tconst upper = character.toUpperCase()\n\tconst letter = /^[A-Z]$/.test(upper)\n\tconst digit = /^[0-9]$/.test(character)\n\treturn {\n\t\tkey: character,\n\t\tcode: letter ? `Key${upper}` : digit ? `Digit${character}` : '',\n\t\ttext: character,\n\t\tnumber: upper.charCodeAt(0),\n\t}\n}\n\n/**\n * Compile an in-page wait for an attached selector.\n *\n * @param selector - CSS selector\n * @param strict - Whether more than one match is an error\n * @param timeout - Maximum wait in milliseconds\n * @returns Runtime expression resolving to whether the state was reached\n */\nexport function compileAttachedWaitExpression(\n\tselector: string,\n\tstrict: boolean,\n\ttimeout: number,\n): string {\n\treturn `new Promise((resolve, reject) => {\n\tconst selector = ${JSON.stringify(selector)}\n\tconst strict = ${JSON.stringify(strict)}\n\tconst check = () => {\n\t\tconst matches = document.querySelectorAll(selector)\n\t\tif (strict && matches.length > 1) {\n\t\t\treject(new Error('Strict selector matched ' + matches.length + ' elements: ' + selector))\n\t\t\treturn true\n\t\t}\n\t\tif (matches.length > 0) {\n\t\t\tresolve(true)\n\t\t\treturn true\n\t\t}\n\t\treturn false\n\t}\n\tif (check()) return\n\tconst observer = new MutationObserver(() => {\n\t\tif (!check()) return\n\t\tobserver.disconnect()\n\t\tclearTimeout(timer)\n\t})\n\tconst timer = setTimeout(() => {\n\t\tobserver.disconnect()\n\t\tresolve(false)\n\t}, ${timeout})\n\tobserver.observe(document, { childList: true, subtree: true, attributes: true })\n})`\n}\n\n/**\n * Compile an in-page wait for a detached selector.\n *\n * @param selector - CSS selector\n * @param strict - Whether more than one match is an error\n * @param timeout - Maximum wait in milliseconds\n * @returns Runtime expression resolving to whether the state was reached\n */\nexport function compileDetachedWaitExpression(\n\tselector: string,\n\tstrict: boolean,\n\ttimeout: number,\n): string {\n\treturn `new Promise((resolve, reject) => {\n\tconst selector = ${JSON.stringify(selector)}\n\tconst strict = ${JSON.stringify(strict)}\n\tconst check = () => {\n\t\tconst matches = document.querySelectorAll(selector)\n\t\tif (strict && matches.length > 1) {\n\t\t\treject(new Error('Strict selector matched ' + matches.length + ' elements: ' + selector))\n\t\t\treturn true\n\t\t}\n\t\tif (matches.length === 0) {\n\t\t\tresolve(true)\n\t\t\treturn true\n\t\t}\n\t\treturn false\n\t}\n\tif (check()) return\n\tconst observer = new MutationObserver(() => {\n\t\tif (!check()) return\n\t\tobserver.disconnect()\n\t\tclearTimeout(timer)\n\t})\n\tconst timer = setTimeout(() => {\n\t\tobserver.disconnect()\n\t\tresolve(false)\n\t}, ${timeout})\n\tobserver.observe(document, { childList: true, subtree: true, attributes: true })\n})`\n}\n\n/**\n * Compile an in-page wait for a visible selector.\n *\n * @param selector - CSS selector\n * @param strict - Whether more than one match is an error\n * @param timeout - Maximum wait in milliseconds\n * @returns Runtime expression resolving to whether the state was reached\n */\nexport function compileVisibleWaitExpression(\n\tselector: string,\n\tstrict: boolean,\n\ttimeout: number,\n): string {\n\treturn `new Promise((resolve, reject) => {\n\tconst selector = ${JSON.stringify(selector)}\n\tconst strict = ${JSON.stringify(strict)}\n\tconst visible = (element) => {\n\t\tconst style = getComputedStyle(element)\n\t\tconst rect = element.getBoundingClientRect()\n\t\treturn style.display !== 'none' && style.visibility !== 'hidden' && style.visibility !== 'collapse' && rect.width > 0 && rect.height > 0\n\t}\n\tconst check = () => {\n\t\tconst matches = document.querySelectorAll(selector)\n\t\tif (strict && matches.length > 1) {\n\t\t\treject(new Error('Strict selector matched ' + matches.length + ' elements: ' + selector))\n\t\t\treturn true\n\t\t}\n\t\tif (matches.length > 0 && visible(matches[0])) {\n\t\t\tresolve(true)\n\t\t\treturn true\n\t\t}\n\t\treturn false\n\t}\n\tif (check()) return\n\tconst observer = new MutationObserver(() => {\n\t\tif (!check()) return\n\t\tobserver.disconnect()\n\t\tclearTimeout(timer)\n\t})\n\tconst timer = setTimeout(() => {\n\t\tobserver.disconnect()\n\t\tresolve(false)\n\t}, ${timeout})\n\tobserver.observe(document, { childList: true, subtree: true, attributes: true })\n})`\n}\n\n/**\n * Compile an in-page wait for a hidden selector.\n *\n * @param selector - CSS selector\n * @param strict - Whether more than one match is an error\n * @param timeout - Maximum wait in milliseconds\n * @returns Runtime expression resolving to whether the state was reached\n */\nexport function compileHiddenWaitExpression(\n\tselector: string,\n\tstrict: boolean,\n\ttimeout: number,\n): string {\n\treturn `new Promise((resolve, reject) => {\n\tconst selector = ${JSON.stringify(selector)}\n\tconst strict = ${JSON.stringify(strict)}\n\tconst visible = (element) => {\n\t\tconst style = getComputedStyle(element)\n\t\tconst rect = element.getBoundingClientRect()\n\t\treturn style.display !== 'none' && style.visibility !== 'hidden' && style.visibility !== 'collapse' && rect.width > 0 && rect.height > 0\n\t}\n\tconst check = () => {\n\t\tconst matches = document.querySelectorAll(selector)\n\t\tif (strict && matches.length > 1) {\n\t\t\treject(new Error('Strict selector matched ' + matches.length + ' elements: ' + selector))\n\t\t\treturn true\n\t\t}\n\t\tif (matches.length === 0 || Array.from(matches).every((element) => !visible(element))) {\n\t\t\tresolve(true)\n\t\t\treturn true\n\t\t}\n\t\treturn false\n\t}\n\tif (check()) return\n\tconst observer = new MutationObserver(() => {\n\t\tif (!check()) return\n\t\tobserver.disconnect()\n\t\tclearTimeout(timer)\n\t})\n\tconst timer = setTimeout(() => {\n\t\tobserver.disconnect()\n\t\tresolve(false)\n\t}, ${timeout})\n\tobserver.observe(document, { childList: true, subtree: true, attributes: true })\n})`\n}\n\n/**\n * Compile a strict, visibility-checked click expression.\n *\n * @param selector - CSS selector\n * @param strict - Whether more than one match is an error\n * @returns Runtime expression\n */\nexport function compileClickExpression(selector: string, strict: boolean): string {\n\treturn `(() => {\n\tconst selector = ${JSON.stringify(selector)}\n\tconst matches = document.querySelectorAll(selector)\n\tif (${JSON.stringify(strict)} && matches.length !== 1) throw new Error('Strict selector matched ' + matches.length + ' elements: ' + selector)\n\tconst el = matches[0]\n\tif (!el) throw new Error('Element not found: ' + selector)\n\tconst style = getComputedStyle(el)\n\tconst rect = el.getBoundingClientRect()\n\tif (style.display === 'none' || style.visibility === 'hidden' || style.visibility === 'collapse' || rect.width <= 0 || rect.height <= 0) throw new Error('Element is not visible: ' + selector)\n\tif (el.matches(':disabled')) throw new Error('Element is disabled: ' + selector)\n\tel.scrollIntoView({ block: 'center', inline: 'center' })\n\tel.click()\n})()`\n}\n\n/**\n * Compile a strict, editable fill expression.\n *\n * @param selector - CSS selector\n * @param value - Value to assign\n * @param strict - Whether more than one match is an error\n * @returns Runtime expression\n */\nexport function compileFillExpression(selector: string, value: string, strict: boolean): string {\n\treturn `(() => {\n\tconst selector = ${JSON.stringify(selector)}\n\tconst matches = document.querySelectorAll(selector)\n\tif (${JSON.stringify(strict)} && matches.length !== 1) throw new Error('Strict selector matched ' + matches.length + ' elements: ' + selector)\n\tconst el = matches[0]\n\tif (!el) throw new Error('Element not found: ' + selector)\n\tconst style = getComputedStyle(el)\n\tconst rect = el.getBoundingClientRect()\n\tif (style.display === 'none' || style.visibility === 'hidden' || style.visibility === 'collapse' || rect.width <= 0 || rect.height <= 0) throw new Error('Element is not visible: ' + selector)\n\tif (el.matches(':disabled') || el.matches('[readonly]')) throw new Error('Element is not editable: ' + selector)\n\tif (!el.isContentEditable && !('value' in el)) throw new Error('Element cannot be filled: ' + selector)\n\tel.focus()\n\tif (el.isContentEditable) {\n\t\tel.textContent = ${JSON.stringify(value)}\n\t} else {\n\t\tel.value = ${JSON.stringify(value)}\n\t}\n\tel.dispatchEvent(new InputEvent('input', { bubbles: true, inputType: 'insertText', data: ${JSON.stringify(value)} }))\n\tel.dispatchEvent(new Event('change', { bubbles: true }))\n})()`\n}\n\n/**\n * Compile a strict select expression.\n *\n * @param selector - CSS selector\n * @param values - Option values to select\n * @param strict - Whether more than one match is an error\n * @returns Runtime expression\n */\nexport function compileSelectExpression(\n\tselector: string,\n\tvalues: readonly string[],\n\tstrict: boolean,\n): string {\n\treturn `(() => {\n\tconst selector = ${JSON.stringify(selector)}\n\tconst matches = document.querySelectorAll(selector)\n\tif (${JSON.stringify(strict)} && matches.length !== 1) throw new Error('Strict selector matched ' + matches.length + ' elements: ' + selector)\n\tconst el = matches[0]\n\tif (!el) throw new Error('Element not found: ' + selector)\n\tif (!(el instanceof HTMLSelectElement)) throw new Error('Element is not a select: ' + selector)\n\tif (el.disabled) throw new Error('Element is disabled: ' + selector)\n\tconst values = ${JSON.stringify([...values])}\n\tif (!el.multiple && values.length > 1) throw new Error('Single select cannot accept multiple values: ' + selector)\n\tconst available = new Set(Array.from(el.options, (option) => option.value))\n\tconst missing = values.filter((value) => !available.has(value))\n\tif (missing.length > 0) throw new Error('Select options not found: ' + missing.join(', '))\n\tfor (const opt of el.options) opt.selected = values.includes(opt.value)\n\tel.dispatchEvent(new Event('input', { bubbles: true }))\n\tel.dispatchEvent(new Event('change', { bubbles: true }))\n})()`\n}\n\n/**\n * Read an unknown value as an all-number array.\n *\n * @param value - Candidate value\n * @returns The number array, or undefined\n */\nexport function readNumberArray(value: unknown): readonly number[] | undefined {\n\tif (!isArray(value) || !value.every(isFiniteNumber)) {\n\t\treturn undefined\n\t}\n\treturn value\n}\n\n/**\n * Resolve one index from a CDP snapshot string table.\n *\n * @param strings - Snapshot string table\n * @param index - Candidate string index\n * @returns The resolved string, or undefined\n */\nexport function readSnapshotString(strings: readonly string[], index: unknown): string | undefined {\n\tif (!isInteger(index)) return undefined\n\treturn strings[index]\n}\n\n/**\n * Decode CDP snapshot sparse string data.\n *\n * @param value - Sparse `{ index, value }` record\n * @param strings - Snapshot string table\n * @returns Node-index to string map\n */\nexport function decodeRareStringData(\n\tvalue: unknown,\n\tstrings: readonly string[],\n): ReadonlyMap<number, string> {\n\tconst decoded = new Map<number, string>()\n\tif (!isRecord(value)) return decoded\n\tconst indexes = readNumberArray(value['index'])\n\tconst values = readNumberArray(value['value'])\n\tif (indexes === undefined || values === undefined) return decoded\n\n\tfor (let index = 0; index < indexes.length; index += 1) {\n\t\tconst node = indexes[index]\n\t\tconst text = readSnapshotString(strings, values[index])\n\t\tif (node !== undefined && text !== undefined) decoded.set(node, text)\n\t}\n\treturn decoded\n}\n\n/**\n * Decode CDP snapshot sparse boolean data.\n *\n * @param value - Sparse `{ index }` record\n * @returns Set of node indexes whose value is true\n */\nexport function decodeRareBooleanData(value: unknown): ReadonlySet<number> {\n\tif (!isRecord(value)) return new Set()\n\treturn new Set(readNumberArray(value['index']) ?? [])\n}\n\n/**\n * Decode CDP snapshot sparse integer data.\n *\n * @param value - Sparse `{ index, value }` record\n * @returns Node-index to integer map\n */\nexport function decodeRareIntegerData(value: unknown): ReadonlyMap<number, number> {\n\tconst decoded = new Map<number, number>()\n\tif (!isRecord(value)) return decoded\n\tconst indexes = readNumberArray(value['index'])\n\tconst values = readNumberArray(value['value'])\n\tif (indexes === undefined || values === undefined) return decoded\n\n\tfor (let index = 0; index < indexes.length; index += 1) {\n\t\tconst node = indexes[index]\n\t\tconst integer = values[index]\n\t\tif (node !== undefined && integer !== undefined) decoded.set(node, integer)\n\t}\n\treturn decoded\n}\n\n/**\n * Decode a CDP snapshot rectangle.\n *\n * @param value - Candidate four-number array\n * @returns A rectangle, or undefined\n */\nexport function readBrowserRect(value: unknown): BrowserRect | undefined {\n\tconst numbers = readNumberArray(value)\n\tif (numbers === undefined || numbers.length !== 4) return undefined\n\tconst x = numbers[0]\n\tconst y = numbers[1]\n\tconst width = numbers[2]\n\tconst height = numbers[3]\n\tif (x === undefined || y === undefined || width === undefined || height === undefined) {\n\t\treturn undefined\n\t}\n\treturn [x, y, width, height]\n}\n\n/**\n * Decode flattened CDP node attributes.\n *\n * @param value - Candidate string-index array\n * @param strings - Snapshot string table\n * @returns Frozen attribute record\n */\nexport function decodeBrowserAttributes(\n\tvalue: unknown,\n\tstrings: readonly string[],\n): Readonly<Record<string, string>> {\n\tconst indexes = readNumberArray(value)\n\tconst attributes: Record<string, string> = {}\n\tif (indexes === undefined) return Object.freeze(attributes)\n\n\tfor (let index = 0; index < indexes.length; index += 2) {\n\t\tconst name = readSnapshotString(strings, indexes[index])\n\t\tconst attribute = readSnapshotString(strings, indexes[index + 1])\n\t\tif (name !== undefined && attribute !== undefined) attributes[name] = attribute\n\t}\n\treturn Object.freeze(attributes)\n}\n\n/**\n * Decode a CDP `DOMSnapshot.captureSnapshot` result.\n *\n * @param value - Unknown CDP result\n * @param styles - Requested computed-style names, in protocol order\n * @param limit - Maximum accepted node count\n * @returns A typed serializable browser snapshot\n */\nexport function decodeBrowserSnapshot(\n\tvalue: unknown,\n\tstyles: readonly string[] = [],\n\tlimit = BROWSER_SNAPSHOT_NODE_LIMIT,\n): BrowserSnapshotInput {\n\tif (!isInteger(limit) || limit < 0) {\n\t\tthrow new BrowserError('Browser snapshot limit must be a non-negative integer', undefined, {\n\t\t\tlimit,\n\t\t})\n\t}\n\tif (!isRecord(value) || !isArray(value['strings']) || !isArray(value['documents'])) {\n\t\tthrow new BrowserError('Malformed DOMSnapshot.captureSnapshot result')\n\t}\n\tif (!value['strings'].every(isString)) {\n\t\tthrow new BrowserError('Malformed DOMSnapshot string table')\n\t}\n\n\tconst strings: readonly string[] = value['strings']\n\tlet count = 0\n\tfor (const document of value['documents']) {\n\t\tif (!isRecord(document) || !isRecord(document['nodes'])) continue\n\t\tcount += readNumberArray(document['nodes']['nodeType'])?.length ?? 0\n\t}\n\tif (count > limit) {\n\t\tthrow new BrowserResultLimitError('DOM snapshot exceeds the configured node limit', {\n\t\t\tlength: count,\n\t\t\tlimit,\n\t\t})\n\t}\n\n\tconst documents: BrowserDocument[] = []\n\tfor (let documentIndex = 0; documentIndex < value['documents'].length; documentIndex += 1) {\n\t\tconst rawDocument = value['documents'][documentIndex]\n\t\tif (!isRecord(rawDocument) || !isRecord(rawDocument['nodes'])) {\n\t\t\tthrow new BrowserError('Malformed DOM snapshot document', undefined, {\n\t\t\t\tdocument: documentIndex,\n\t\t\t})\n\t\t}\n\n\t\tconst rawNodes = rawDocument['nodes']\n\t\tconst frame = readSnapshotString(strings, rawDocument['frameId'])\n\t\tconst url = readSnapshotString(strings, rawDocument['documentURL'])\n\t\tconst title =\n\t\t\trawDocument['title'] === -1 ? '' : readSnapshotString(strings, rawDocument['title'])\n\t\tif (frame === undefined || url === undefined || title === undefined) {\n\t\t\tthrow new BrowserError('Malformed DOM snapshot document metadata', undefined, {\n\t\t\t\tdocument: documentIndex,\n\t\t\t})\n\t\t}\n\t\tconst types = readNumberArray(rawNodes['nodeType'])\n\t\tconst names = readNumberArray(rawNodes['nodeName'])\n\t\tconst values = readNumberArray(rawNodes['nodeValue'])\n\t\tif (types === undefined || names === undefined || values === undefined) {\n\t\t\tthrow new BrowserError('Malformed DOM snapshot node table', undefined, {\n\t\t\t\tdocument: documentIndex,\n\t\t\t})\n\t\t}\n\n\t\tconst parents = readNumberArray(rawNodes['parentIndex']) ?? []\n\t\tconst ids = readNumberArray(rawNodes['backendNodeId']) ?? []\n\t\tconst rawAttributes = isArray(rawNodes['attributes']) ? rawNodes['attributes'] : []\n\t\tconst texts = decodeRareStringData(rawNodes['textValue'], strings)\n\t\tconst inputs = decodeRareStringData(rawNodes['inputValue'], strings)\n\t\tconst checked = decodeRareBooleanData(rawNodes['inputChecked'])\n\t\tconst selected = decodeRareBooleanData(rawNodes['optionSelected'])\n\t\tconst clickable = decodeRareBooleanData(rawNodes['isClickable'])\n\t\tconst shadows = decodeRareStringData(rawNodes['shadowRootType'], strings)\n\t\tconst contents = decodeRareIntegerData(rawNodes['contentDocumentIndex'])\n\t\tconst pseudos = decodeRareStringData(rawNodes['pseudoType'], strings)\n\t\tconst sources = decodeRareStringData(rawNodes['currentSourceURL'], strings)\n\t\tconst origins = decodeRareStringData(rawNodes['originURL'], strings)\n\t\tconst layouts = new Map<number, BrowserLayout>()\n\n\t\tif (isRecord(rawDocument['layout'])) {\n\t\t\tconst rawLayout = rawDocument['layout']\n\t\t\tconst nodeIndexes = readNumberArray(rawLayout['nodeIndex']) ?? []\n\t\t\tconst rawStyles = isArray(rawLayout['styles']) ? rawLayout['styles'] : []\n\t\t\tconst rawBounds = isArray(rawLayout['bounds']) ? rawLayout['bounds'] : []\n\t\t\tconst rawTexts = readNumberArray(rawLayout['text']) ?? []\n\t\t\tconst paints = readNumberArray(rawLayout['paintOrders']) ?? []\n\t\t\tconst rawOffsets = isArray(rawLayout['offsetRects']) ? rawLayout['offsetRects'] : []\n\t\t\tconst rawScrolls = isArray(rawLayout['scrollRects']) ? rawLayout['scrollRects'] : []\n\t\t\tconst rawClients = isArray(rawLayout['clientRects']) ? rawLayout['clientRects'] : []\n\n\t\t\tfor (let layoutIndex = 0; layoutIndex < nodeIndexes.length; layoutIndex += 1) {\n\t\t\t\tconst nodeIndex = nodeIndexes[layoutIndex]\n\t\t\t\tif (nodeIndex === undefined) continue\n\t\t\t\tconst styleIndexes = readNumberArray(rawStyles[layoutIndex]) ?? []\n\t\t\t\tconst computed: Record<string, string> = {}\n\t\t\t\tfor (let styleIndex = 0; styleIndex < styles.length; styleIndex += 1) {\n\t\t\t\t\tconst name = styles[styleIndex]\n\t\t\t\t\tconst style = readSnapshotString(strings, styleIndexes[styleIndex])\n\t\t\t\t\tif (name !== undefined && style !== undefined) computed[name] = style\n\t\t\t\t}\n\t\t\t\tlayouts.set(nodeIndex, {\n\t\t\t\t\tbounds: readBrowserRect(rawBounds[layoutIndex]),\n\t\t\t\t\tstyles: Object.freeze(computed),\n\t\t\t\t\ttext: readSnapshotString(strings, rawTexts[layoutIndex]),\n\t\t\t\t\tpaint: paints[layoutIndex],\n\t\t\t\t\toffset: readBrowserRect(rawOffsets[layoutIndex]),\n\t\t\t\t\tscroll: readBrowserRect(rawScrolls[layoutIndex]),\n\t\t\t\t\tclient: readBrowserRect(rawClients[layoutIndex]),\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\tconst nodes: BrowserNode[] = []\n\t\tfor (let nodeIndex = 0; nodeIndex < types.length; nodeIndex += 1) {\n\t\t\tconst type = types[nodeIndex]\n\t\t\tconst name = readSnapshotString(strings, names[nodeIndex])\n\t\t\tconst nodeValue =\n\t\t\t\tvalues[nodeIndex] === -1 ? '' : readSnapshotString(strings, values[nodeIndex])\n\t\t\tif (type === undefined || name === undefined || nodeValue === undefined) {\n\t\t\t\tthrow new BrowserError('Malformed DOM snapshot node', undefined, {\n\t\t\t\t\tdocument: documentIndex,\n\t\t\t\t\tindex: nodeIndex,\n\t\t\t\t})\n\t\t\t}\n\t\t\tconst parent = parents[nodeIndex]\n\t\t\tnodes.push({\n\t\t\t\tdocument: documentIndex,\n\t\t\t\tframe,\n\t\t\t\tindex: nodeIndex,\n\t\t\t\tid: ids[nodeIndex],\n\t\t\t\tparent: parent === undefined || parent < 0 ? undefined : parent,\n\t\t\t\ttype,\n\t\t\t\tname,\n\t\t\t\tvalue: nodeValue,\n\t\t\t\tattributes: decodeBrowserAttributes(rawAttributes[nodeIndex], strings),\n\t\t\t\ttext: texts.get(nodeIndex),\n\t\t\t\tinput: inputs.get(nodeIndex),\n\t\t\t\tchecked: checked.has(nodeIndex) ? true : undefined,\n\t\t\t\tselected: selected.has(nodeIndex) ? true : undefined,\n\t\t\t\tclickable: clickable.has(nodeIndex) ? true : undefined,\n\t\t\t\tshadow: shadows.get(nodeIndex),\n\t\t\t\tcontent: contents.get(nodeIndex),\n\t\t\t\tpseudo: pseudos.get(nodeIndex),\n\t\t\t\tsource: sources.get(nodeIndex),\n\t\t\t\torigin: origins.get(nodeIndex),\n\t\t\t\tlayout: layouts.get(nodeIndex),\n\t\t\t})\n\t\t}\n\n\t\tdocuments.push({\n\t\t\tindex: documentIndex,\n\t\t\tframe,\n\t\t\turl,\n\t\t\ttitle,\n\t\t\tnodes,\n\t\t\tscroll: [\n\t\t\t\tisFiniteNumber(rawDocument['scrollOffsetX']) ? rawDocument['scrollOffsetX'] : undefined,\n\t\t\t\tisFiniteNumber(rawDocument['scrollOffsetY']) ? rawDocument['scrollOffsetY'] : undefined,\n\t\t\t],\n\t\t\twidth: isFiniteNumber(rawDocument['contentWidth']) ? rawDocument['contentWidth'] : undefined,\n\t\t\theight: isFiniteNumber(rawDocument['contentHeight'])\n\t\t\t\t? rawDocument['contentHeight']\n\t\t\t\t: undefined,\n\t\t})\n\t}\n\n\treturn { documents, styles: [...styles] }\n}\n\n/**\n * Read one captured node attribute.\n *\n * @param node - Captured browser node\n * @param name - Attribute name\n * @returns Attribute value, or undefined\n */\nexport function attributeOfBrowserNode(node: BrowserNode, name: string): string | undefined {\n\treturn node.attributes[name]\n}\n\n/**\n * Test whether a browser-node matcher is a declarative query.\n *\n * @param value - Browser-node query or predicate\n * @returns Whether the matcher is a declarative query\n *\n * @example\n * ```ts\n * import { isBrowserNodeQuery } from '@src/core'\n *\n * isBrowserNodeQuery({ name: 'main' }) // true\n * isBrowserNodeQuery(() => true) // false\n * ```\n */\nexport function isBrowserNodeQuery(\n\tvalue: BrowserNodeQuery | BrowserNodePredicate,\n): value is BrowserNodeQuery {\n\treturn !isFunction(value)\n}\n\n/**\n * Test a captured node against a declarative query.\n *\n * @param node - Captured browser node\n * @param query - Fields every candidate must satisfy\n * @returns Whether the node matches\n */\nexport function matchesBrowserNode(node: BrowserNode, query: BrowserNodeQuery): boolean {\n\tif (query.name !== undefined && node.name.toLowerCase() !== query.name.toLowerCase()) return false\n\tif (\n\t\tquery.text !== undefined &&\n\t\t!node.value.includes(query.text) &&\n\t\tnode.text?.includes(query.text) !== true\n\t) {\n\t\treturn false\n\t}\n\tif (query.frame !== undefined && node.frame !== query.frame) return false\n\tif (query.clickable !== undefined && (node.clickable === true) !== query.clickable) return false\n\tif (query.visible !== undefined && isBrowserNodeVisible(node) !== query.visible) return false\n\tif (query.attributes !== undefined) {\n\t\tfor (const [name, value] of Object.entries(query.attributes)) {\n\t\t\tif (node.attributes[name] !== value) return false\n\t\t}\n\t}\n\treturn true\n}\n\n/**\n * Test whether a captured node has a non-empty rendered layout box.\n *\n * @param node - Captured browser node\n * @returns Whether the snapshot reports a visible layout box\n */\nexport function isBrowserNodeVisible(node: BrowserNode): boolean {\n\tconst bounds = node.layout?.bounds\n\treturn bounds !== undefined && bounds[2] > 0 && bounds[3] > 0\n}\n","import type {\n\tCDPClientInterface,\n\tCDPClientOptions,\n\tCDPHandler,\n\tCDPTransportInterface,\n} from './types.js'\nimport { BROWSER_DEFAULT_TIMEOUT_MS } from './constants.js'\nimport { CDPConnectionError, CDPError, CDPTimeoutError } from './errors.js'\nimport { isInteger, isRecord, isString, parseJSON } from '@orkestrel/contract'\n\n// === CDPClient\n\n/**\n * Lightweight Chrome DevTools Protocol client over a {@link CDPTransportInterface}.\n *\n * @remarks\n * Sends JSON-RPC messages over the injected transport and dispatches\n * responses and events. The transport owns the connection itself\n * (WebSocket, pipe, or any other duplex channel); this class owns only\n * the JSON-RPC framing and id/session correlation.\n *\n * Supports session-scoped event subscriptions: when a sessionId is\n * provided to subscribe/unsubscribe, the handler only fires for CDP\n * events carrying that sessionId. Global subscriptions (no sessionId)\n * continue to see ALL events for backwards compatibility.\n */\nexport class CDPClient implements CDPClientInterface {\n\treadonly #transport: CDPTransportInterface\n\t#messageId = 0\n\treadonly #pending: Map<\n\t\tnumber,\n\t\t{\n\t\t\tmethod: string\n\t\t\tresolve: (value: unknown) => void\n\t\t\treject: (reason: unknown) => void\n\t\t\ttimer: ReturnType<typeof setTimeout>\n\t\t}\n\t> = new Map()\n\treadonly #subscriptions: Map<string, Set<CDPHandler>> = new Map()\n\treadonly #sessionSubscriptions: Map<string, Map<string, Set<CDPHandler>>> = new Map()\n\t#connected = false\n\t#active = false\n\t#wired = false\n\treadonly #timeout: number\n\t#connecting: Promise<void> | undefined\n\t#closing: Promise<void> | undefined\n\t#closeRequested = false\n\n\tconstructor(options: CDPClientOptions) {\n\t\tthis.#transport = options.transport\n\t\tthis.#timeout = options.timeout ?? BROWSER_DEFAULT_TIMEOUT_MS\n\t}\n\n\tget connected(): boolean {\n\t\treturn this.#connected\n\t}\n\n\tasync connect(): Promise<void> {\n\t\tif (this.#closing !== undefined) await this.#closing\n\t\tif (this.#connected) return\n\t\tif (this.#connecting !== undefined) return this.#connecting\n\n\t\tthis.#closeRequested = false\n\t\tconst attempt = this.#start()\n\t\tthis.#connecting = attempt\n\t\ttry {\n\t\t\tawait attempt\n\t\t} finally {\n\t\t\tif (this.#connecting === attempt) this.#connecting = undefined\n\t\t}\n\t}\n\n\t/**\n\t * Close the transport and re-establish a fresh connection.\n\t *\n\t * @remarks\n\t * Client-level subscriptions (`subscribe`/`unsubscribe` registrations)\n\t * survive `close()` and remain active after the reconnect — only pending\n\t * in-flight requests are rejected. This lets a caller reconnect a dropped\n\t * transport without re-registering every handler.\n\t */\n\tasync reconnect(): Promise<void> {\n\t\tawait this.close()\n\t\tawait this.connect()\n\t}\n\n\tasync send(\n\t\tmethod: string,\n\t\tparams?: Readonly<Record<string, unknown>>,\n\t\tsessionId?: string,\n\t\ttimeout?: number,\n\t): Promise<unknown> {\n\t\tif (!this.#connected) {\n\t\t\tthrow new CDPConnectionError('CDP client is not connected', { method })\n\t\t}\n\n\t\tconst id = this.#nextId()\n\t\tconst message: Record<string, unknown> = { id, method }\n\n\t\tif (params !== undefined) {\n\t\t\tmessage['params'] = params\n\t\t}\n\t\tif (sessionId !== undefined) {\n\t\t\tmessage['sessionId'] = sessionId\n\t\t}\n\n\t\tconst serialized = JSON.stringify(message)\n\t\tconst effectiveTimeout = timeout ?? this.#timeout\n\n\t\treturn new Promise<unknown>((resolve, reject) => {\n\t\t\tconst timer = setTimeout(() => {\n\t\t\t\tthis.#pending.delete(id)\n\t\t\t\treject(\n\t\t\t\t\tnew CDPTimeoutError(`CDP request timed out: ${method}`, {\n\t\t\t\t\t\tmethod,\n\t\t\t\t\t\ttimeout: effectiveTimeout,\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t}, effectiveTimeout)\n\n\t\t\tthis.#pending.set(id, { method, resolve, reject, timer })\n\n\t\t\tthis.#transport.send(serialized).catch((thrown: unknown) => {\n\t\t\t\tthis.#pending.delete(id)\n\t\t\t\tclearTimeout(timer)\n\t\t\t\treject(thrown)\n\t\t\t})\n\t\t})\n\t}\n\n\tsubscribe(method: string, handler: CDPHandler, sessionId?: string): void {\n\t\tif (sessionId !== undefined) {\n\t\t\tlet sessionMap = this.#sessionSubscriptions.get(sessionId)\n\t\t\tif (sessionMap === undefined) {\n\t\t\t\tsessionMap = new Map()\n\t\t\t\tthis.#sessionSubscriptions.set(sessionId, sessionMap)\n\t\t\t}\n\t\t\tlet handlers = sessionMap.get(method)\n\t\t\tif (handlers === undefined) {\n\t\t\t\thandlers = new Set()\n\t\t\t\tsessionMap.set(method, handlers)\n\t\t\t}\n\t\t\thandlers.add(handler)\n\t\t} else {\n\t\t\tlet handlers = this.#subscriptions.get(method)\n\t\t\tif (handlers === undefined) {\n\t\t\t\thandlers = new Set()\n\t\t\t\tthis.#subscriptions.set(method, handlers)\n\t\t\t}\n\t\t\thandlers.add(handler)\n\t\t}\n\t}\n\n\tunsubscribe(method: string, handler: CDPHandler, sessionId?: string): void {\n\t\tif (sessionId !== undefined) {\n\t\t\tconst sessionMap = this.#sessionSubscriptions.get(sessionId)\n\t\t\tif (sessionMap !== undefined) {\n\t\t\t\tconst handlers = sessionMap.get(method)\n\t\t\t\tif (handlers !== undefined) {\n\t\t\t\t\thandlers.delete(handler)\n\t\t\t\t\tif (handlers.size === 0) {\n\t\t\t\t\t\tsessionMap.delete(method)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (sessionMap.size === 0) {\n\t\t\t\t\tthis.#sessionSubscriptions.delete(sessionId)\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tconst handlers = this.#subscriptions.get(method)\n\t\t\tif (handlers !== undefined) {\n\t\t\t\thandlers.delete(handler)\n\t\t\t\tif (handlers.size === 0) {\n\t\t\t\t\tthis.#subscriptions.delete(method)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Close the transport and reject all pending requests.\n\t *\n\t * @remarks\n\t * Subscriptions registered via `subscribe()` are client-level\n\t * registrations, not connection-level state — they survive `close()`\n\t * (and a subsequent `reconnect()`/`connect()`) and keep firing once the\n\t * transport is active again. Only pending requests are rejected here.\n\t * If `close()` is called while `connect()` is still awaiting\n\t * `transport.start()`, the in-flight connect is rejected and the\n\t * transport is closed deterministically once `start()` resolves.\n\t */\n\tasync close(): Promise<void> {\n\t\tconst active = this.#closing\n\t\tif (active !== undefined) {\n\t\t\tawait active\n\t\t\treturn\n\t\t}\n\n\t\tconst attempt = this.#stop()\n\t\tthis.#closing = attempt\n\t\ttry {\n\t\t\tawait attempt\n\t\t} finally {\n\t\t\tif (this.#closing === attempt) this.#closing = undefined\n\t\t}\n\t}\n\n\t// === Private helpers\n\n\tasync #start(): Promise<void> {\n\t\tif (!this.#wired) {\n\t\t\tthis.#transport.emitter.on('message', (data) => this.#onMessage(data))\n\t\t\tthis.#transport.emitter.on('close', () => this.#onClose())\n\t\t\tthis.#transport.emitter.on('error', (error) => this.#onError(error))\n\t\t\tthis.#wired = true\n\t\t}\n\n\t\tawait this.#transport.start()\n\t\tthis.#active = true\n\n\t\tif (this.#closeRequested) {\n\t\t\tthis.#closeRequested = false\n\t\t\ttry {\n\t\t\t\tawait this.#transport.close()\n\t\t\t} finally {\n\t\t\t\tthis.#active = false\n\t\t\t}\n\t\t\tthrow new CDPConnectionError('CDP client was closed while connecting', {\n\t\t\t\tmethod: 'connect',\n\t\t\t})\n\t\t}\n\n\t\tthis.#connected = true\n\t}\n\n\tasync #stop(): Promise<void> {\n\t\tif (this.#connecting !== undefined) {\n\t\t\tthis.#closeRequested = true\n\t\t\tawait this.#connecting.catch(() => undefined)\n\t\t\t// The in-flight attempt may have already flipped #connected to\n\t\t\t// true before observing #closeRequested (race between the\n\t\t\t// attempt's final steps and #closeRequested being set here).\n\t\t\t// Fall through to the normal connected-close path instead of\n\t\t\t// returning early, or the close would be silently lost.\n\t\t}\n\n\t\tif (!this.#connected && !this.#active) return\n\n\t\tthis.#connected = false\n\n\t\t// Reject all pending requests\n\t\tfor (const [id, entry] of this.#pending) {\n\t\t\tclearTimeout(entry.timer)\n\t\t\tentry.reject(new CDPConnectionError('CDP connection closed', { method: entry.method }))\n\t\t\tthis.#pending.delete(id)\n\t\t}\n\n\t\ttry {\n\t\t\tawait this.#transport.close()\n\t\t} finally {\n\t\t\tthis.#active = false\n\t\t}\n\t}\n\n\t#nextId(): number {\n\t\tthis.#messageId += 1\n\t\treturn this.#messageId\n\t}\n\n\t#onClose(): void {\n\t\tthis.#connected = false\n\t\tthis.#active = false\n\n\t\t// Reject all pending requests\n\t\tfor (const [id, entry] of this.#pending) {\n\t\t\tclearTimeout(entry.timer)\n\t\t\tentry.reject(new CDPConnectionError('CDP connection closed', { method: entry.method }))\n\t\t\tthis.#pending.delete(id)\n\t\t}\n\t}\n\n\t#onError(error: unknown): void {\n\t\tthis.#connected = false\n\t\tfor (const [id, entry] of this.#pending) {\n\t\t\tclearTimeout(entry.timer)\n\t\t\tentry.reject(\n\t\t\t\tnew CDPConnectionError(`CDP connection failed: ${String(error)}`, {\n\t\t\t\t\tmethod: entry.method,\n\t\t\t\t\terror,\n\t\t\t\t}),\n\t\t\t)\n\t\t\tthis.#pending.delete(id)\n\t\t}\n\t}\n\n\t#onMessage(data: string): void {\n\t\tconst parsed = parseJSON(data)\n\t\tif (!isRecord(parsed)) return\n\n\t\t// Response to a pending request\n\t\tif (isInteger(parsed['id'])) {\n\t\t\tconst id = parsed['id']\n\t\t\tconst entry = this.#pending.get(id)\n\t\t\tif (entry !== undefined) {\n\t\t\t\tthis.#pending.delete(id)\n\t\t\t\tclearTimeout(entry.timer)\n\n\t\t\t\tconst errorValue = parsed['error']\n\t\t\t\tif (isRecord(errorValue)) {\n\t\t\t\t\tconst message = isString(errorValue['message']) ? errorValue['message'] : 'CDP error'\n\t\t\t\t\tconst context: Record<string, unknown> = { method: entry.method }\n\t\t\t\t\tif ('code' in errorValue) context['code'] = errorValue['code']\n\t\t\t\t\tcontext['message'] = message\n\t\t\t\t\tif ('data' in errorValue) context['data'] = errorValue['data']\n\t\t\t\t\tentry.reject(new CDPError(message, context))\n\t\t\t\t} else {\n\t\t\t\t\tentry.resolve('result' in parsed ? parsed['result'] : undefined)\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn\n\t\t}\n\n\t\t// CDP event\n\t\tif (isString(parsed['method'])) {\n\t\t\tconst method = parsed['method']\n\t\t\tconst rawParams = parsed['params']\n\t\t\tconst params: Readonly<Record<string, unknown>> = isRecord(rawParams)\n\t\t\t\t? rawParams\n\t\t\t\t: Object.freeze({})\n\n\t\t\t// Fire global handlers (backwards compatible — see ALL events)\n\t\t\tconst globalHandlers = this.#subscriptions.get(method)\n\t\t\tif (globalHandlers !== undefined) {\n\t\t\t\tthis.#dispatch(globalHandlers, params)\n\t\t\t}\n\n\t\t\t// Fire session-scoped handlers\n\t\t\tconst eventSessionId = parsed['sessionId']\n\t\t\tif (isString(eventSessionId)) {\n\t\t\t\tconst sessionMap = this.#sessionSubscriptions.get(eventSessionId)\n\t\t\t\tif (sessionMap !== undefined) {\n\t\t\t\t\tconst sessionHandlers = sessionMap.get(method)\n\t\t\t\t\tif (sessionHandlers !== undefined) {\n\t\t\t\t\t\tthis.#dispatch(sessionHandlers, params)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t#dispatch(handlers: ReadonlySet<CDPHandler>, params: Readonly<Record<string, unknown>>): void {\n\t\tfor (const handler of [...handlers]) {\n\t\t\ttry {\n\t\t\t\thandler(params)\n\t\t\t} catch {\n\t\t\t\t// One observer must not prevent sibling observers from receiving the event.\n\t\t\t}\n\t\t}\n\t}\n}\n","import type {\n\tBrowserAccessibilityInterface,\n\tBrowserAccessibilityOptions,\n\tBrowserAccessibilitySnapshot,\n\tBrowserFrameInterface,\n} from './types.js'\nimport { readBrowserAccessibility, validateBrowserAccessibilityOptions } from './helpers.js'\n\n/**\n * Chromium Accessibility-domain snapshots for one page.\n */\nexport class BrowserAccessibility implements BrowserAccessibilityInterface {\n\treadonly #frame: BrowserFrameInterface\n\n\tconstructor(frame: BrowserFrameInterface) {\n\t\tthis.#frame = frame\n\t}\n\n\tasync snapshot(options?: BrowserAccessibilityOptions): Promise<BrowserAccessibilitySnapshot> {\n\t\tvalidateBrowserAccessibilityOptions(options)\n\t\tawait this.#frame.send('Accessibility.enable')\n\t\ttry {\n\t\t\tconst result =\n\t\t\t\toptions?.root === undefined\n\t\t\t\t\t? await this.#frame.send('Accessibility.getFullAXTree', {\n\t\t\t\t\t\t\tdepth: options?.depth,\n\t\t\t\t\t\t\tframeId: this.#frame.id,\n\t\t\t\t\t\t})\n\t\t\t\t\t: await this.#frame.send('Accessibility.getPartialAXTree', {\n\t\t\t\t\t\t\tbackendNodeId: options.root,\n\t\t\t\t\t\t\tfetchRelatives: true,\n\t\t\t\t\t\t})\n\t\t\treturn readBrowserAccessibility(result)\n\t\t} finally {\n\t\t\tawait this.#frame.send('Accessibility.disable').catch(() => undefined)\n\t\t}\n\t}\n}\n","import type { BrowserClockInterface, BrowserFrameInterface } from './types.js'\nimport { BROWSER_DEFAULT_TIMEOUT_MS } from './constants.js'\nimport { BrowserError } from './errors.js'\nimport { isFiniteNumber } from '@orkestrel/contract'\n\n/**\n * Chromium virtual-time budget controls for deterministic page timers.\n */\nexport class BrowserClock implements BrowserClockInterface {\n\treadonly #frame: BrowserFrameInterface\n\t#installed = false\n\t#advancing = false\n\t#budgetResolve: (() => void) | undefined\n\treadonly #budgetHandler = this.#handleBudget.bind(this)\n\n\tconstructor(frame: BrowserFrameInterface) {\n\t\tthis.#frame = frame\n\t}\n\n\tget installed(): boolean {\n\t\treturn this.#installed\n\t}\n\n\tasync install(time = Date.now()): Promise<void> {\n\t\tif (this.#installed) throw new BrowserError('Browser clock is already installed')\n\t\tif (!isFiniteNumber(time) || time < 0) {\n\t\t\tthrow new BrowserError('Browser clock time must be a non-negative finite epoch', undefined, {\n\t\t\t\ttime,\n\t\t\t})\n\t\t}\n\t\tawait this.#frame.send('Emulation.setVirtualTimePolicy', {\n\t\t\tpolicy: 'pause',\n\t\t\tinitialVirtualTime: time / 1000,\n\t\t})\n\t\tthis.#installed = true\n\t}\n\n\tasync pause(): Promise<void> {\n\t\tthis.#assert()\n\t\tthis.#idle()\n\t\tawait this.#frame.send('Emulation.setVirtualTimePolicy', { policy: 'pause' })\n\t}\n\n\tasync resume(): Promise<void> {\n\t\tthis.#assert()\n\t\tthis.#idle()\n\t\tawait this.#frame.send('Emulation.setVirtualTimePolicy', {\n\t\t\tpolicy: 'advance',\n\t\t\tmaxVirtualTimeTaskStarvationCount: 10_000,\n\t\t})\n\t}\n\n\tasync advance(ms: number): Promise<void> {\n\t\tthis.#assert()\n\t\tthis.#idle()\n\t\tif (!isFiniteNumber(ms) || ms < 0) {\n\t\t\tthrow new BrowserError('Browser clock advance must be non-negative and finite', undefined, {\n\t\t\t\tms,\n\t\t\t})\n\t\t}\n\t\tif (ms === 0) {\n\t\t\tawait this.pause()\n\t\t\treturn\n\t\t}\n\t\tconst deferred = Promise.withResolvers<void>()\n\t\tthis.#advancing = true\n\t\tthis.#budgetResolve = deferred.resolve\n\t\ttry {\n\t\t\tawait this.#frame.subscribe('Emulation.virtualTimeBudgetExpired', this.#budgetHandler)\n\t\t} catch (error) {\n\t\t\tthis.#budgetResolve = undefined\n\t\t\tthis.#advancing = false\n\t\t\tthrow error\n\t\t}\n\t\tconst timer = setTimeout(() => {\n\t\t\tdeferred.reject(new BrowserError('Browser virtual-time budget timed out'))\n\t\t}, BROWSER_DEFAULT_TIMEOUT_MS)\n\t\tlet failed = false\n\t\tlet failure: unknown\n\t\ttry {\n\t\t\tawait this.#frame.send('Emulation.setVirtualTimePolicy', {\n\t\t\t\tpolicy: 'advance',\n\t\t\t\tbudget: ms,\n\t\t\t\tmaxVirtualTimeTaskStarvationCount: 10_000,\n\t\t\t})\n\t\t\tawait deferred.promise\n\t\t} catch (error) {\n\t\t\tfailed = true\n\t\t\tfailure = error\n\t\t} finally {\n\t\t\tclearTimeout(timer)\n\t\t\tthis.#budgetResolve = undefined\n\t\t\ttry {\n\t\t\t\tawait this.#frame.unsubscribe('Emulation.virtualTimeBudgetExpired', this.#budgetHandler)\n\t\t\t} catch (error) {\n\t\t\t\tif (!failed) {\n\t\t\t\t\tfailed = true\n\t\t\t\t\tfailure = error\n\t\t\t\t}\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tawait this.#frame.send('Emulation.setVirtualTimePolicy', { policy: 'pause' })\n\t\t\t} catch (error) {\n\t\t\t\tif (!failed) {\n\t\t\t\t\tfailed = true\n\t\t\t\t\tfailure = error\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.#advancing = false\n\t\t}\n\t\tif (failed) throw failure\n\t}\n\n\tasync uninstall(): Promise<void> {\n\t\tif (!this.#installed) return\n\t\tthis.#idle()\n\t\tawait this.#frame.send('Emulation.setVirtualTimePolicy', {\n\t\t\tpolicy: 'advance',\n\t\t\tmaxVirtualTimeTaskStarvationCount: 10_000,\n\t\t})\n\t\tthis.#installed = false\n\t}\n\n\t#assert(): void {\n\t\tif (!this.#installed) throw new BrowserError('Browser clock is not installed')\n\t}\n\n\t#idle(): void {\n\t\tif (this.#advancing) throw new BrowserError('Browser clock advance is already active')\n\t}\n\n\t#handleBudget(): void {\n\t\tthis.#budgetResolve?.()\n\t}\n}\n","import type {\n\tBrowserCoverageInterface,\n\tBrowserCoverageOptions,\n\tBrowserCoverageResult,\n\tBrowserFrameInterface,\n} from './types.js'\nimport { readBrowserScriptCoverage, readBrowserStyleCoverage } from './helpers.js'\nimport { BrowserError } from './errors.js'\n\n/**\n * JavaScript precise coverage and CSS rule usage for one page target.\n */\nexport class BrowserCoverage implements BrowserCoverageInterface {\n\treadonly #frame: BrowserFrameInterface\n\t#active = false\n\t#options: BrowserCoverageOptions | undefined\n\n\tconstructor(frame: BrowserFrameInterface) {\n\t\tthis.#frame = frame\n\t}\n\n\tget active(): boolean {\n\t\treturn this.#active\n\t}\n\n\tasync start(options?: BrowserCoverageOptions): Promise<void> {\n\t\tif (this.#active) throw new BrowserError('Browser coverage is already active')\n\t\tconst javascript = options?.javascript ?? true\n\t\tconst css = options?.css ?? true\n\t\tif (!javascript && !css) {\n\t\t\tthrow new BrowserError('Browser coverage requires JavaScript, CSS, or both')\n\t\t}\n\t\tlet profiler = false\n\t\tlet precise = false\n\t\tlet dom = false\n\t\tlet styles = false\n\t\tlet rules = false\n\t\ttry {\n\t\t\tif (javascript) {\n\t\t\t\tawait this.#frame.send('Profiler.enable')\n\t\t\t\tprofiler = true\n\t\t\t\tawait this.#frame.send('Profiler.startPreciseCoverage', {\n\t\t\t\t\tcallCount: true,\n\t\t\t\t\tdetailed: options?.detailed ?? true,\n\t\t\t\t\tallowTriggeredUpdates: false,\n\t\t\t\t})\n\t\t\t\tprecise = true\n\t\t\t}\n\t\t\tif (css) {\n\t\t\t\tawait this.#frame.send('DOM.enable')\n\t\t\t\tdom = true\n\t\t\t\tawait this.#frame.send('CSS.enable')\n\t\t\t\tstyles = true\n\t\t\t\tawait this.#frame.send('CSS.startRuleUsageTracking')\n\t\t\t\trules = true\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tif (rules) {\n\t\t\t\tawait this.#frame.send('CSS.stopRuleUsageTracking').catch(() => undefined)\n\t\t\t}\n\t\t\tif (styles) await this.#frame.send('CSS.disable').catch(() => undefined)\n\t\t\tif (dom) await this.#frame.send('DOM.disable').catch(() => undefined)\n\t\t\tif (precise) {\n\t\t\t\tawait this.#frame.send('Profiler.stopPreciseCoverage').catch(() => undefined)\n\t\t\t}\n\t\t\tif (profiler) await this.#frame.send('Profiler.disable').catch(() => undefined)\n\t\t\tthrow error\n\t\t}\n\t\tthis.#options = options\n\t\tthis.#active = true\n\t}\n\n\tasync stop(): Promise<BrowserCoverageResult> {\n\t\tif (!this.#active) throw new BrowserError('Browser coverage is not active')\n\t\tthis.#active = false\n\t\tconst javascript = this.#options?.javascript ?? true\n\t\tconst css = this.#options?.css ?? true\n\t\tlet scripts: BrowserCoverageResult['scripts'] = []\n\t\tlet styles: BrowserCoverageResult['styles'] = []\n\t\tlet failed = false\n\t\tlet failure: unknown\n\t\tif (javascript) {\n\t\t\ttry {\n\t\t\t\tscripts = await this.#stopJavaScript()\n\t\t\t} catch (error) {\n\t\t\t\tfailed = true\n\t\t\t\tfailure = error\n\t\t\t}\n\t\t}\n\t\tif (css) {\n\t\t\ttry {\n\t\t\t\tstyles = await this.#stopCSS()\n\t\t\t} catch (error) {\n\t\t\t\tif (!failed) {\n\t\t\t\t\tfailed = true\n\t\t\t\t\tfailure = error\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tthis.#options = undefined\n\t\tif (failed) throw failure\n\t\treturn { scripts, styles }\n\t}\n\n\tasync destroy(): Promise<void> {\n\t\tif (!this.#active) return\n\t\tawait this.stop().catch(() => undefined)\n\t}\n\n\tasync #stopJavaScript(): Promise<BrowserCoverageResult['scripts']> {\n\t\tlet result: unknown\n\t\tlet failed = false\n\t\tlet failure: unknown\n\t\ttry {\n\t\t\tresult = await this.#frame.send('Profiler.takePreciseCoverage')\n\t\t} catch (error) {\n\t\t\tfailed = true\n\t\t\tfailure = error\n\t\t}\n\t\ttry {\n\t\t\tawait this.#frame.send('Profiler.stopPreciseCoverage')\n\t\t} catch (error) {\n\t\t\tif (!failed) {\n\t\t\t\tfailed = true\n\t\t\t\tfailure = error\n\t\t\t}\n\t\t}\n\t\ttry {\n\t\t\tawait this.#frame.send('Profiler.disable')\n\t\t} catch (error) {\n\t\t\tif (!failed) {\n\t\t\t\tfailed = true\n\t\t\t\tfailure = error\n\t\t\t}\n\t\t}\n\t\tif (failed) throw failure\n\t\treturn readBrowserScriptCoverage(result)\n\t}\n\n\tasync #stopCSS(): Promise<BrowserCoverageResult['styles']> {\n\t\tlet result: unknown\n\t\tlet failed = false\n\t\tlet failure: unknown\n\t\ttry {\n\t\t\tresult = await this.#frame.send('CSS.stopRuleUsageTracking')\n\t\t} catch (error) {\n\t\t\tfailed = true\n\t\t\tfailure = error\n\t\t}\n\t\ttry {\n\t\t\tawait this.#frame.send('CSS.disable')\n\t\t} catch (error) {\n\t\t\tif (!failed) {\n\t\t\t\tfailed = true\n\t\t\t\tfailure = error\n\t\t\t}\n\t\t}\n\t\ttry {\n\t\t\tawait this.#frame.send('DOM.disable')\n\t\t} catch (error) {\n\t\t\tif (!failed) {\n\t\t\t\tfailed = true\n\t\t\t\tfailure = error\n\t\t\t}\n\t\t}\n\t\tif (failed) throw failure\n\t\treturn readBrowserStyleCoverage(result)\n\t}\n}\n","import type {\n\tBrowserCookie,\n\tBrowserCookieFilter,\n\tBrowserCookieInput,\n\tBrowserCookieManagerInterface,\n\tCDPClientInterface,\n} from './types.js'\nimport { cookieToProtocol, matchesBrowserCookieURL, readBrowserCookies } from './helpers.js'\nimport { isRecord } from '@orkestrel/contract'\nimport { BrowserError } from './errors.js'\n\n/**\n * Cookie operations isolated to one browser context.\n */\nexport class BrowserCookieManager implements BrowserCookieManagerInterface {\n\treadonly #client: CDPClientInterface\n\treadonly #context: string | undefined\n\n\tconstructor(client: CDPClientInterface, context?: string) {\n\t\tthis.#client = client\n\t\tthis.#context = context\n\t}\n\n\tasync list(urls?: readonly string[]): Promise<readonly BrowserCookie[]> {\n\t\tconst params: Record<string, unknown> = {}\n\t\tif (this.#context !== undefined) params['browserContextId'] = this.#context\n\t\tconst result = await this.#client.send('Storage.getCookies', params)\n\t\tconst cookies = readBrowserCookies(result)\n\t\tif (urls === undefined || urls.length === 0) return cookies\n\n\t\treturn cookies.filter((cookie) => urls.some((value) => matchesBrowserCookieURL(cookie, value)))\n\t}\n\n\tasync set(cookies: readonly BrowserCookieInput[]): Promise<void> {\n\t\tif (cookies.length === 0) return\n\t\tconst params: Record<string, unknown> = {\n\t\t\tcookies: cookies.map(cookieToProtocol),\n\t\t}\n\t\tif (this.#context !== undefined) params['browserContextId'] = this.#context\n\t\tawait this.#client.send('Storage.setCookies', params)\n\t}\n\n\tasync clear(filter?: BrowserCookieFilter): Promise<void> {\n\t\tconst params: Record<string, unknown> = {}\n\t\tif (this.#context !== undefined) params['browserContextId'] = this.#context\n\t\tif (filter === undefined) {\n\t\t\tawait this.#client.send('Storage.clearCookies', params)\n\t\t\treturn\n\t\t}\n\n\t\tconst retained = (await this.list()).filter((cookie) => {\n\t\t\tif (filter.name !== undefined && cookie.name !== filter.name) return true\n\t\t\tif (filter.domain !== undefined && cookie.domain !== filter.domain) return true\n\t\t\tif (filter.path !== undefined && cookie.path !== filter.path) return true\n\t\t\treturn false\n\t\t})\n\t\tawait this.#client.send('Storage.clearCookies', params)\n\t\tif (retained.length === 0) return\n\t\tconst cookies = retained.map((cookie) =>\n\t\t\tcookieToProtocol({\n\t\t\t\tname: cookie.name,\n\t\t\t\tvalue: cookie.value,\n\t\t\t\tdomain: cookie.domain,\n\t\t\t\tpath: cookie.path,\n\t\t\t\texpires: cookie.expires,\n\t\t\t\thttp: cookie.http,\n\t\t\t\tsecure: cookie.secure,\n\t\t\t\t...(cookie.site !== undefined ? { site: cookie.site } : {}),\n\t\t\t\t...(cookie.partition !== undefined ? { partition: cookie.partition } : {}),\n\t\t\t}),\n\t\t)\n\t\tconst restore: Record<string, unknown> = { cookies }\n\t\tif (this.#context !== undefined) restore['browserContextId'] = this.#context\n\t\tconst result = await this.#client.send('Storage.setCookies', restore)\n\t\tif (result !== undefined && !isRecord(result)) {\n\t\t\tthrow new BrowserError('Browser cookie restore returned a malformed result')\n\t\t}\n\t}\n}\n","import type {\n\tBrowserEmulationManagerInterface,\n\tBrowserEmulationOptions,\n\tBrowserPageInterface,\n} from './types.js'\nimport { mediaToFeatures, validateBrowserEmulationOptions } from './helpers.js'\n\n/**\n * Rendering, identity, location, and network emulation for context pages.\n */\nexport class BrowserEmulationManager implements BrowserEmulationManagerInterface {\n\treadonly #pages: () => readonly BrowserPageInterface[]\n\t#options: BrowserEmulationOptions | undefined\n\n\tconstructor(pages: () => readonly BrowserPageInterface[], options?: BrowserEmulationOptions) {\n\t\tif (options !== undefined) validateBrowserEmulationOptions(options)\n\t\tthis.#pages = pages\n\t\tthis.#options = options\n\t}\n\n\tasync apply(options: BrowserEmulationOptions): Promise<void> {\n\t\tvalidateBrowserEmulationOptions(options)\n\t\tconst previous = this.#options\n\t\tconst changed: BrowserPageInterface[] = []\n\t\ttry {\n\t\t\tfor (const page of this.#pages()) {\n\t\t\t\tchanged.push(page)\n\t\t\t\tif (previous !== undefined) await this.#clearPage(page, previous)\n\t\t\t\tawait this.#configurePage(page, options)\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tfor (const page of changed.reverse()) {\n\t\t\t\tawait this.#clearPage(page, options).catch(() => undefined)\n\t\t\t\tif (previous !== undefined) {\n\t\t\t\t\tawait this.#configurePage(page, previous).catch(() => undefined)\n\t\t\t\t}\n\t\t\t}\n\t\t\tthrow error\n\t\t}\n\t\tthis.#options = options\n\t}\n\n\tasync clear(): Promise<void> {\n\t\tconst previous = this.#options\n\t\tif (previous === undefined) return\n\t\tconst changed: BrowserPageInterface[] = []\n\t\ttry {\n\t\t\tfor (const page of this.#pages()) {\n\t\t\t\tchanged.push(page)\n\t\t\t\tawait this.#clearPage(page, previous)\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tfor (const page of changed.reverse()) {\n\t\t\t\tawait this.#clearPage(page, previous).catch(() => undefined)\n\t\t\t\tawait this.#configurePage(page, previous).catch(() => undefined)\n\t\t\t}\n\t\t\tthrow error\n\t\t}\n\t\tthis.#options = undefined\n\t}\n\n\tasync attach(page: BrowserPageInterface): Promise<void> {\n\t\tconst options = this.#options\n\t\tif (options === undefined) return\n\t\ttry {\n\t\t\tawait this.#configurePage(page, options)\n\t\t} catch (error) {\n\t\t\tawait this.#clearPage(page, options).catch(() => undefined)\n\t\t\tthrow error\n\t\t}\n\t}\n\n\tasync #configurePage(\n\t\tpage: BrowserPageInterface,\n\t\toptions: BrowserEmulationOptions,\n\t): Promise<void> {\n\t\tif (options.viewport !== undefined) {\n\t\t\tawait page.send('Emulation.setDeviceMetricsOverride', {\n\t\t\t\twidth: options.viewport.width,\n\t\t\t\theight: options.viewport.height,\n\t\t\t\tdeviceScaleFactor: options.viewport.scale ?? 1,\n\t\t\t\tmobile: options.viewport.mobile ?? false,\n\t\t\t\tscreenOrientation:\n\t\t\t\t\toptions.viewport.landscape === undefined\n\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t: {\n\t\t\t\t\t\t\t\ttype: options.viewport.landscape ? 'landscapePrimary' : 'portraitPrimary',\n\t\t\t\t\t\t\t\tangle: options.viewport.landscape ? 90 : 0,\n\t\t\t\t\t\t\t},\n\t\t\t})\n\t\t\tawait page.send('Emulation.setTouchEmulationEnabled', {\n\t\t\t\tenabled: options.viewport.touch ?? false,\n\t\t\t})\n\t\t}\n\t\tif (options.user !== undefined) {\n\t\t\tawait page.send('Emulation.setUserAgentOverride', {\n\t\t\t\tuserAgent: options.user.value,\n\t\t\t\tacceptLanguage: options.user.language,\n\t\t\t\tplatform: options.user.platform,\n\t\t\t})\n\t\t}\n\t\tif (options.locale !== undefined) {\n\t\t\tawait page.send('Emulation.setLocaleOverride', { locale: options.locale })\n\t\t}\n\t\tif (options.timezone !== undefined) {\n\t\t\tawait page.send('Emulation.setTimezoneOverride', { timezoneId: options.timezone })\n\t\t}\n\t\tif (options.geolocation !== undefined) {\n\t\t\tawait page.send('Emulation.setGeolocationOverride', {\n\t\t\t\tlatitude: options.geolocation.latitude,\n\t\t\t\tlongitude: options.geolocation.longitude,\n\t\t\t\taccuracy: options.geolocation.accuracy,\n\t\t\t})\n\t\t}\n\t\tif (options.media !== undefined) {\n\t\t\tawait page.send('Emulation.setEmulatedMedia', {\n\t\t\t\tmedia: options.media.media ?? '',\n\t\t\t\tfeatures: mediaToFeatures(options.media),\n\t\t\t})\n\t\t}\n\t\tif (options.offline !== undefined) {\n\t\t\tawait page.send('Network.emulateNetworkConditions', {\n\t\t\t\toffline: options.offline,\n\t\t\t\tlatency: 0,\n\t\t\t\tdownloadThroughput: -1,\n\t\t\t\tuploadThroughput: -1,\n\t\t\t})\n\t\t}\n\t\tif (options.headers !== undefined) {\n\t\t\tawait page.send('Network.setExtraHTTPHeaders', { headers: options.headers })\n\t\t}\n\t\tif (options.credentials !== undefined) {\n\t\t\tawait page.network.credentials(options.credentials)\n\t\t}\n\t}\n\n\tasync #clearPage(page: BrowserPageInterface, options: BrowserEmulationOptions): Promise<void> {\n\t\tif (options.viewport !== undefined) {\n\t\t\tawait page.send('Emulation.clearDeviceMetricsOverride')\n\t\t\tawait page.send('Emulation.setTouchEmulationEnabled', { enabled: false })\n\t\t}\n\t\tif (options.user !== undefined) {\n\t\t\tawait page.send('Emulation.setUserAgentOverride', { userAgent: '' })\n\t\t}\n\t\tif (options.locale !== undefined) {\n\t\t\tawait page.send('Emulation.setLocaleOverride', { locale: '' })\n\t\t}\n\t\tif (options.timezone !== undefined) {\n\t\t\tawait page.send('Emulation.setTimezoneOverride', { timezoneId: '' })\n\t\t}\n\t\tif (options.geolocation !== undefined) {\n\t\t\tawait page.send('Emulation.clearGeolocationOverride')\n\t\t}\n\t\tif (options.media !== undefined) {\n\t\t\tawait page.send('Emulation.setEmulatedMedia', { media: '', features: [] })\n\t\t}\n\t\tif (options.offline !== undefined) {\n\t\t\tawait page.send('Network.emulateNetworkConditions', {\n\t\t\t\toffline: false,\n\t\t\t\tlatency: 0,\n\t\t\t\tdownloadThroughput: -1,\n\t\t\t\tuploadThroughput: -1,\n\t\t\t})\n\t\t}\n\t\tif (options.headers !== undefined) {\n\t\t\tawait page.send('Network.setExtraHTTPHeaders', { headers: {} })\n\t\t}\n\t\tif (options.credentials !== undefined) await page.network.credentials(undefined)\n\t}\n}\n","import type {\n\tBrowserCodegenAction,\n\tBrowserCodegenEventMap,\n\tBrowserCodegenInterface,\n\tBrowserCodegenOptions,\n\tBrowserCodegenScriptOptions,\n\tCDPClientInterface,\n} from './types.js'\nimport type { EmitterInterface } from '@orkestrel/emitter'\nimport { BROWSER_CODEGEN_BINDING_NAME, BROWSER_CODEGEN_SOURCE } from './constants.js'\nimport {\n\tcompileCodegenScript,\n\tnormalizeCodegenActions,\n\tparseCodegenActionPayload,\n\treadCodegenNavigateAction,\n} from './helpers.js'\nimport { Emitter } from '@orkestrel/emitter'\n\n// === BrowserCodegen\n\n/**\n * Records page navigation and form interactions and compiles replayable scripts.\n */\nexport class BrowserCodegen implements BrowserCodegenInterface {\n\treadonly #client: CDPClientInterface\n\treadonly #sessionId: string\n\t#actions: BrowserCodegenAction[] = []\n\t#started = false\n\t#destroyed = false\n\t#starting: Promise<void> | undefined\n\t#stopping: Promise<readonly BrowserCodegenAction[]> | undefined\n\t#shutdown: Promise<void> | undefined\n\treadonly #emitter: Emitter<BrowserCodegenEventMap>\n\treadonly #onBindingCalled = this.#handleBindingCalled.bind(this)\n\treadonly #onFrameNavigated = this.#handleFrameNavigated.bind(this)\n\n\tconstructor(client: CDPClientInterface, sessionId: string, options?: BrowserCodegenOptions) {\n\t\tthis.#client = client\n\t\tthis.#sessionId = sessionId\n\t\tthis.#emitter = new Emitter({\n\t\t\t...(options?.on !== undefined ? { on: options.on } : {}),\n\t\t\t...(options?.error !== undefined ? { error: options.error } : {}),\n\t\t})\n\t}\n\n\t// === Property accessors\n\n\tget emitter(): EmitterInterface<BrowserCodegenEventMap> {\n\t\treturn this.#emitter\n\t}\n\n\tget started(): boolean {\n\t\treturn this.#started\n\t}\n\n\t// === Public API\n\n\tasync start(): Promise<void> {\n\t\tif (this.#destroyed) return\n\t\tif (this.#stopping !== undefined) await this.#stopping\n\t\tif (this.#destroyed) return\n\t\tif (this.#started) return\n\t\tconst active = this.#starting\n\t\tif (active !== undefined) {\n\t\t\tawait active\n\t\t\treturn\n\t\t}\n\n\t\tconst attempt = this.#begin()\n\t\tthis.#starting = attempt\n\t\ttry {\n\t\t\tawait attempt\n\t\t} finally {\n\t\t\tif (this.#starting === attempt) this.#starting = undefined\n\t\t}\n\t}\n\n\tasync stop(): Promise<readonly BrowserCodegenAction[]> {\n\t\tawait this.#starting?.catch(() => undefined)\n\t\tif (!this.#started) return this.actions()\n\t\tconst active = this.#stopping\n\t\tif (active !== undefined) return await active\n\n\t\tconst attempt = this.#end()\n\t\tthis.#stopping = attempt\n\t\ttry {\n\t\t\treturn await attempt\n\t\t} finally {\n\t\t\tif (this.#stopping === attempt) this.#stopping = undefined\n\t\t}\n\t}\n\n\tactions(): readonly BrowserCodegenAction[] {\n\t\treturn normalizeCodegenActions(this.#actions)\n\t}\n\n\tscript(options?: BrowserCodegenScriptOptions): string {\n\t\treturn compileCodegenScript(this.actions(), options)\n\t}\n\n\tclear(): void {\n\t\tthis.#actions = []\n\t\tthis.#emitter.emit('clear')\n\t}\n\n\tdestroy(): Promise<void> {\n\t\tconst active = this.#shutdown\n\t\tif (active !== undefined) return active\n\t\tif (this.#destroyed) return Promise.resolve()\n\n\t\tthis.#destroyed = true\n\t\tconst shutdown = this.#destroy()\n\t\tthis.#shutdown = shutdown\n\t\treturn shutdown\n\t}\n\n\t// === Private helpers\n\n\tasync #begin(): Promise<void> {\n\t\tthis.#client.subscribe('Runtime.bindingCalled', this.#onBindingCalled, this.#sessionId)\n\t\tthis.#client.subscribe('Page.frameNavigated', this.#onFrameNavigated, this.#sessionId)\n\n\t\ttry {\n\t\t\tawait this.#client.send('Runtime.enable', undefined, this.#sessionId)\n\t\t\tawait this.#client.send(\n\t\t\t\t'Runtime.addBinding',\n\t\t\t\t{ name: BROWSER_CODEGEN_BINDING_NAME },\n\t\t\t\tthis.#sessionId,\n\t\t\t)\n\t\t\tawait this.#client.send(\n\t\t\t\t'Page.addScriptToEvaluateOnNewDocument',\n\t\t\t\t{ source: BROWSER_CODEGEN_SOURCE },\n\t\t\t\tthis.#sessionId,\n\t\t\t)\n\t\t\tawait this.#client.send(\n\t\t\t\t'Runtime.evaluate',\n\t\t\t\t{ expression: BROWSER_CODEGEN_SOURCE, awaitPromise: true },\n\t\t\t\tthis.#sessionId,\n\t\t\t)\n\t\t\tif (this.#destroyed) {\n\t\t\t\tthis.#unsubscribe()\n\t\t\t\treturn\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tthis.#unsubscribe()\n\t\t\tthrow error\n\t\t}\n\n\t\tthis.#started = true\n\t\tthis.#emitter.emit('start')\n\t}\n\n\tasync #end(): Promise<readonly BrowserCodegenAction[]> {\n\t\tthis.#unsubscribe()\n\t\tthis.#started = false\n\n\t\tconst snapshot = this.actions()\n\t\tthis.#emitter.emit('stop', snapshot)\n\t\treturn snapshot\n\t}\n\n\tasync #destroy(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.stop()\n\t\t} catch {\n\t\t\t// Swallow teardown errors — the underlying session may already be gone\n\t\t}\n\n\t\tthis.#actions = []\n\t\tthis.#emitter.destroy()\n\t}\n\n\t#handleBindingCalled(params: Readonly<Record<string, unknown>>): void {\n\t\tif (params['name'] !== BROWSER_CODEGEN_BINDING_NAME) return\n\n\t\tconst action = parseCodegenActionPayload(params['payload'])\n\t\tif (action === undefined) return\n\n\t\tthis.#actions.push(action)\n\t\tthis.#emitter.emit('action', action)\n\t}\n\n\t#handleFrameNavigated(params: Readonly<Record<string, unknown>>): void {\n\t\tconst action = readCodegenNavigateAction(params)\n\t\tif (action === undefined) return\n\n\t\tthis.#actions.push(action)\n\t\tthis.#emitter.emit('action', action)\n\t}\n\n\t#unsubscribe(): void {\n\t\tthis.#client.unsubscribe('Runtime.bindingCalled', this.#onBindingCalled, this.#sessionId)\n\t\tthis.#client.unsubscribe('Page.frameNavigated', this.#onFrameNavigated, this.#sessionId)\n\t}\n}\n","import type {\n\tBrowserFrameInterface,\n\tBrowserMetric,\n\tBrowserPerformanceInterface,\n\tBrowserProfile,\n} from './types.js'\nimport { readBrowserMetrics, readBrowserProfile } from './helpers.js'\nimport { BrowserError } from './errors.js'\nimport { isInteger } from '@orkestrel/contract'\n\n/**\n * Performance-domain metrics and sampled JavaScript CPU profiles.\n */\nexport class BrowserPerformance implements BrowserPerformanceInterface {\n\treadonly #frame: BrowserFrameInterface\n\t#active = false\n\n\tconstructor(frame: BrowserFrameInterface) {\n\t\tthis.#frame = frame\n\t}\n\n\tget active(): boolean {\n\t\treturn this.#active\n\t}\n\n\tasync metrics(): Promise<readonly BrowserMetric[]> {\n\t\tawait this.#frame.send('Performance.enable')\n\t\ttry {\n\t\t\treturn readBrowserMetrics(await this.#frame.send('Performance.getMetrics'))\n\t\t} finally {\n\t\t\tawait this.#frame.send('Performance.disable').catch(() => undefined)\n\t\t}\n\t}\n\n\tasync start(interval?: number): Promise<void> {\n\t\tif (this.#active) throw new BrowserError('Browser CPU profiling is already active')\n\t\tif (interval !== undefined) {\n\t\t\tif (!isInteger(interval) || interval <= 0) {\n\t\t\t\tthrow new BrowserError(\n\t\t\t\t\t'Browser CPU sampling interval must be a positive integer',\n\t\t\t\t\tundefined,\n\t\t\t\t\t{\n\t\t\t\t\t\tinterval,\n\t\t\t\t\t},\n\t\t\t\t)\n\t\t\t}\n\t\t\tawait this.#frame.send('Profiler.setSamplingInterval', { interval })\n\t\t}\n\t\tawait this.#frame.send('Profiler.enable')\n\t\ttry {\n\t\t\tawait this.#frame.send('Profiler.start')\n\t\t\tthis.#active = true\n\t\t} catch (error) {\n\t\t\tawait this.#frame.send('Profiler.disable').catch(() => undefined)\n\t\t\tthrow error\n\t\t}\n\t}\n\n\tasync stop(): Promise<BrowserProfile> {\n\t\tif (!this.#active) throw new BrowserError('Browser CPU profiling is not active')\n\t\tthis.#active = false\n\t\tlet result: unknown\n\t\ttry {\n\t\t\tresult = await this.#frame.send('Profiler.stop')\n\t\t} finally {\n\t\t\tawait this.#frame.send('Profiler.disable').catch(() => undefined)\n\t\t}\n\t\treturn readBrowserProfile(result)\n\t}\n\n\tasync destroy(): Promise<void> {\n\t\tif (!this.#active) return\n\t\tawait this.stop().catch(() => undefined)\n\t}\n}\n","import type {\n\tBrowserFrameInterface,\n\tBrowserTracingInterface,\n\tBrowserTracingOptions,\n\tBrowserTracingResult,\n\tScreenshotWriterInterface,\n} from './types.js'\nimport { BROWSER_DEFAULT_TIMEOUT_MS } from './constants.js'\nimport { concatBytes, readBrowserStreamChunk } from './helpers.js'\nimport { BrowserError } from './errors.js'\nimport { isString } from '@orkestrel/contract'\n\n/**\n * Chromium trace capture streamed through the IO domain.\n */\nexport class BrowserTracing implements BrowserTracingInterface {\n\treadonly #frame: BrowserFrameInterface\n\treadonly #writer: ScreenshotWriterInterface | undefined\n\t#active = false\n\t#options: BrowserTracingOptions | undefined\n\t#completion: PromiseWithResolvers<string> | undefined\n\treadonly #completeHandler = this.#handleComplete.bind(this)\n\n\tconstructor(frame: BrowserFrameInterface, writer?: ScreenshotWriterInterface) {\n\t\tthis.#frame = frame\n\t\tthis.#writer = writer\n\t}\n\n\tget active(): boolean {\n\t\treturn this.#active\n\t}\n\n\tasync start(options?: BrowserTracingOptions): Promise<void> {\n\t\tif (this.#active) throw new BrowserError('Browser tracing is already active')\n\t\tconst categories = [...(options?.categories ?? ['devtools.timeline', 'v8.execute'])]\n\t\tif (options?.screenshots === true) {\n\t\t\tcategories.push('disabled-by-default-devtools.screenshot')\n\t\t}\n\t\tif (options?.sampling === true) {\n\t\t\tcategories.push('disabled-by-default-v8.cpu_profiler')\n\t\t}\n\t\tthis.#options = options\n\t\tthis.#completion = Promise.withResolvers<string>()\n\t\ttry {\n\t\t\tawait this.#frame.subscribe('Tracing.tracingComplete', this.#completeHandler)\n\t\t\tawait this.#frame.send('Tracing.start', {\n\t\t\t\ttransferMode: 'ReturnAsStream',\n\t\t\t\ttraceConfig: {\n\t\t\t\t\tincludedCategories: categories,\n\t\t\t\t},\n\t\t\t})\n\t\t\tthis.#active = true\n\t\t} catch (error) {\n\t\t\tawait this.#frame\n\t\t\t\t.unsubscribe('Tracing.tracingComplete', this.#completeHandler)\n\t\t\t\t.catch(() => undefined)\n\t\t\tthis.#options = undefined\n\t\t\tthis.#completion = undefined\n\t\t\tthrow error\n\t\t}\n\t}\n\n\tasync stop(): Promise<BrowserTracingResult> {\n\t\tif (!this.#active || this.#completion === undefined) {\n\t\t\tthrow new BrowserError('Browser tracing is not active')\n\t\t}\n\t\tconst completion = this.#completion\n\t\tconst options = this.#options\n\t\tthis.#active = false\n\t\tlet stream: string | undefined\n\t\tconst chunks: Uint8Array[] = []\n\t\ttry {\n\t\t\tawait this.#frame.send('Tracing.end')\n\t\t\tstream = await this.#wait(completion.promise)\n\t\t\twhile (true) {\n\t\t\t\tconst chunk = readBrowserStreamChunk(await this.#frame.send('IO.read', { handle: stream }))\n\t\t\t\tchunks.push(chunk.bytes)\n\t\t\t\tif (chunk.eof) break\n\t\t\t}\n\t\t} finally {\n\t\t\tif (stream !== undefined) {\n\t\t\t\tawait this.#frame.send('IO.close', { handle: stream }).catch(() => undefined)\n\t\t\t}\n\t\t\tawait this.#frame\n\t\t\t\t.unsubscribe('Tracing.tracingComplete', this.#completeHandler)\n\t\t\t\t.catch(() => undefined)\n\t\t\tthis.#options = undefined\n\t\t\tthis.#completion = undefined\n\t\t}\n\t\tconst bytes = concatBytes(chunks)\n\t\tif (options?.path !== undefined) {\n\t\t\tif (this.#writer === undefined) {\n\t\t\t\tthrow new BrowserError('Browser trace path requires a configured writer')\n\t\t\t}\n\t\t\tawait this.#writer.write(options.path, bytes)\n\t\t}\n\t\treturn { bytes, path: options?.path }\n\t}\n\n\tasync destroy(): Promise<void> {\n\t\tif (!this.#active) return\n\t\tawait this.stop().catch(() => undefined)\n\t}\n\n\tasync #wait(promise: Promise<string>): Promise<string> {\n\t\tconst deferred = Promise.withResolvers<string>()\n\t\tconst timer = setTimeout(() => {\n\t\t\tdeferred.reject(new BrowserError('Browser trace completion timed out'))\n\t\t}, BROWSER_DEFAULT_TIMEOUT_MS)\n\t\tvoid promise.then(deferred.resolve, deferred.reject)\n\t\ttry {\n\t\t\treturn await deferred.promise\n\t\t} finally {\n\t\t\tclearTimeout(timer)\n\t\t}\n\t}\n\n\t#handleComplete(params: Readonly<Record<string, unknown>>): void {\n\t\tconst completion = this.#completion\n\t\tif (completion === undefined) return\n\t\tif (isString(params['stream'])) completion.resolve(params['stream'])\n\t\telse completion.reject(new BrowserError('Browser trace did not return an IO stream'))\n\t}\n}\n","import type {\n\tBrowserCoverageInterface,\n\tBrowserDiagnosticsInterface,\n\tBrowserFrameInterface,\n\tBrowserPerformanceInterface,\n\tBrowserTracingInterface,\n\tScreenshotWriterInterface,\n} from './types.js'\nimport { BrowserCoverage } from './BrowserCoverage.js'\nimport { BrowserPerformance } from './BrowserPerformance.js'\nimport { BrowserTracing } from './BrowserTracing.js'\n\n/**\n * Diagnostic subentities grouped beneath one page.\n */\nexport class BrowserDiagnostics implements BrowserDiagnosticsInterface {\n\treadonly #tracing: BrowserTracing\n\treadonly #coverage: BrowserCoverage\n\treadonly #performance: BrowserPerformance\n\n\tconstructor(frame: BrowserFrameInterface, writer?: ScreenshotWriterInterface) {\n\t\tthis.#tracing = new BrowserTracing(frame, writer)\n\t\tthis.#coverage = new BrowserCoverage(frame)\n\t\tthis.#performance = new BrowserPerformance(frame)\n\t}\n\n\tget tracing(): BrowserTracingInterface {\n\t\treturn this.#tracing\n\t}\n\n\tget coverage(): BrowserCoverageInterface {\n\t\treturn this.#coverage\n\t}\n\n\tget performance(): BrowserPerformanceInterface {\n\t\treturn this.#performance\n\t}\n\n\tasync destroy(): Promise<void> {\n\t\tawait this.#tracing.destroy()\n\t\tawait this.#coverage.destroy()\n\t\tawait this.#performance.destroy()\n\t}\n}\n","import type {\n\tBrowserDialogCategory,\n\tBrowserDialogInterface,\n\tBrowserFrameInterface,\n} from './types.js'\nimport { BrowserError } from './errors.js'\n\n/**\n * One JavaScript dialog awaiting a user decision.\n */\nexport class BrowserDialog implements BrowserDialogInterface {\n\treadonly #frame: BrowserFrameInterface\n\treadonly #category: BrowserDialogCategory\n\treadonly #message: string\n\treadonly #default: string\n\t#handled = false\n\t#handling = false\n\n\tconstructor(\n\t\tframe: BrowserFrameInterface,\n\t\tcategory: BrowserDialogCategory,\n\t\tmessage: string,\n\t\tvalue: string,\n\t) {\n\t\tthis.#frame = frame\n\t\tthis.#category = category\n\t\tthis.#message = message\n\t\tthis.#default = value\n\t}\n\n\tget category(): BrowserDialogCategory {\n\t\treturn this.#category\n\t}\n\n\tget message(): string {\n\t\treturn this.#message\n\t}\n\n\tget default(): string {\n\t\treturn this.#default\n\t}\n\n\tasync accept(value?: string): Promise<void> {\n\t\tthis.#assert()\n\t\tthis.#handling = true\n\t\ttry {\n\t\t\tawait this.#frame.send('Page.handleJavaScriptDialog', {\n\t\t\t\taccept: true,\n\t\t\t\tpromptText: value,\n\t\t\t})\n\t\t\tthis.#handled = true\n\t\t} finally {\n\t\t\tthis.#handling = false\n\t\t}\n\t}\n\n\tasync dismiss(): Promise<void> {\n\t\tthis.#assert()\n\t\tthis.#handling = true\n\t\ttry {\n\t\t\tawait this.#frame.send('Page.handleJavaScriptDialog', { accept: false })\n\t\t\tthis.#handled = true\n\t\t} finally {\n\t\t\tthis.#handling = false\n\t\t}\n\t}\n\n\t#assert(): void {\n\t\tif (this.#handled || this.#handling) {\n\t\t\tthrow new BrowserError('Browser dialog is already handled')\n\t\t}\n\t}\n}\n","import type {\n\tBrowserDownloadEventMap,\n\tBrowserDownloadInterface,\n\tBrowserDownloadProgress,\n\tBrowserDownloadStatus,\n\tCDPClientInterface,\n} from './types.js'\nimport type { EmitterInterface } from '@orkestrel/emitter'\nimport { Emitter } from '@orkestrel/emitter'\n\n/**\n * One Chromium download and its progress lifecycle.\n */\nexport class BrowserDownload implements BrowserDownloadInterface {\n\treadonly #client: CDPClientInterface\n\treadonly #context: string | undefined\n\treadonly #emitter: Emitter<BrowserDownloadEventMap>\n\treadonly #id: string\n\treadonly #url: string\n\treadonly #name: string\n\t#status: BrowserDownloadStatus = 'pending'\n\t#received = 0\n\t#total = 0\n\t#path: string | undefined\n\n\tconstructor(client: CDPClientInterface, id: string, url: string, name: string, context?: string) {\n\t\tthis.#client = client\n\t\tthis.#context = context\n\t\tthis.#id = id\n\t\tthis.#url = url\n\t\tthis.#name = name\n\t\tthis.#emitter = new Emitter()\n\t}\n\n\tget emitter(): EmitterInterface<BrowserDownloadEventMap> {\n\t\treturn this.#emitter\n\t}\n\n\tget id(): string {\n\t\treturn this.#id\n\t}\n\n\tget url(): string {\n\t\treturn this.#url\n\t}\n\n\tget name(): string {\n\t\treturn this.#name\n\t}\n\n\tget status(): BrowserDownloadStatus {\n\t\treturn this.#status\n\t}\n\n\tget received(): number {\n\t\treturn this.#received\n\t}\n\n\tget total(): number {\n\t\treturn this.#total\n\t}\n\n\tget path(): string | undefined {\n\t\treturn this.#path\n\t}\n\n\tasync cancel(): Promise<void> {\n\t\tif (this.#status !== 'pending') return\n\t\tconst params: Record<string, unknown> = { guid: this.#id }\n\t\tif (this.#context !== undefined) params['browserContextId'] = this.#context\n\t\tawait this.#client.send('Browser.cancelDownload', params)\n\t}\n\n\tupdate(progress: BrowserDownloadProgress): void {\n\t\tif (this.#status !== 'pending') return\n\t\tthis.#received = progress.received\n\t\tthis.#total = progress.total\n\t\tthis.#path = progress.path\n\t\tthis.#emitter.emit('progress', this.#received, this.#total)\n\t\tif (progress.status === 'complete') {\n\t\t\tthis.#status = 'complete'\n\t\t\tthis.#emitter.emit('complete', this.#path)\n\t\t\tthis.#emitter.destroy()\n\t\t} else if (progress.status === 'cancelled') {\n\t\t\tthis.#status = 'cancelled'\n\t\t\tthis.#emitter.emit('cancel')\n\t\t\tthis.#emitter.destroy()\n\t\t}\n\t}\n}\n","import type { BrowserHandleInterface, CDPClientInterface } from './types.js'\nimport { BrowserError } from './errors.js'\nimport { readEvaluationResult } from './helpers.js'\nimport { isRecord, isString } from '@orkestrel/contract'\n\n/**\n * One retained remote object in a frame execution context.\n */\nexport class BrowserHandle implements BrowserHandleInterface {\n\treadonly #client: CDPClientInterface\n\treadonly #session: string\n\treadonly #id: string\n\t#disposed = false\n\n\tconstructor(client: CDPClientInterface, session: string, id: string) {\n\t\tthis.#client = client\n\t\tthis.#session = session\n\t\tthis.#id = id\n\t}\n\n\tget id(): string {\n\t\treturn this.#id\n\t}\n\n\tasync value(): Promise<unknown> {\n\t\treturn await this.call('function() { return this }')\n\t}\n\n\tasync call(declaration: string, args?: readonly unknown[]): Promise<unknown> {\n\t\tthis.#assert()\n\t\tconst result = await this.#client.send(\n\t\t\t'Runtime.callFunctionOn',\n\t\t\t{\n\t\t\t\tobjectId: this.#id,\n\t\t\t\tfunctionDeclaration: declaration,\n\t\t\t\targuments: args?.map((value) => ({ value })),\n\t\t\t\tawaitPromise: true,\n\t\t\t\treturnByValue: true,\n\t\t\t},\n\t\t\tthis.#session,\n\t\t)\n\t\treturn readEvaluationResult(result)\n\t}\n\n\tasync property(name: string): Promise<BrowserHandleInterface | undefined> {\n\t\tthis.#assert()\n\t\tconst result = await this.#client.send(\n\t\t\t'Runtime.callFunctionOn',\n\t\t\t{\n\t\t\t\tobjectId: this.#id,\n\t\t\t\tfunctionDeclaration: 'function(name) { return this[name] }',\n\t\t\t\targuments: [{ value: name }],\n\t\t\t\tawaitPromise: true,\n\t\t\t\treturnByValue: false,\n\t\t\t},\n\t\t\tthis.#session,\n\t\t)\n\t\tif (!isRecord(result) || !isRecord(result['result'])) return undefined\n\t\tconst id = result['result']['objectId']\n\t\treturn isString(id) ? new BrowserHandle(this.#client, this.#session, id) : undefined\n\t}\n\n\tasync properties(): Promise<Readonly<Record<string, unknown>>> {\n\t\tconst value = await this.call(\n\t\t\t'function() { const values = {}; for (const key of Object.keys(this)) values[key] = this[key]; return values }',\n\t\t)\n\t\tif (!isRecord(value)) {\n\t\t\tthrow new BrowserError('Browser handle properties did not resolve to an object')\n\t\t}\n\t\treturn value\n\t}\n\n\tasync dispose(): Promise<void> {\n\t\tif (this.#disposed) return\n\t\tthis.#disposed = true\n\t\tif (!this.#client.connected) return\n\t\ttry {\n\t\t\tawait this.#client.send('Runtime.releaseObject', { objectId: this.#id }, this.#session)\n\t\t} catch {\n\t\t\t// The execution context may already be gone.\n\t\t}\n\t}\n\n\t#assert(): void {\n\t\tif (this.#disposed) throw new BrowserError('Browser handle is disposed')\n\t\tif (!this.#client.connected) throw new BrowserError('Browser handle is disconnected')\n\t}\n}\n","import type {\n\tBrowserActionOptions,\n\tBrowserFrameInterface,\n\tBrowserKeyboardInterface,\n} from './types.js'\nimport {\n\tcomputeBrowserModifiers,\n\tkeyToBrowserInput,\n\tparseBrowserChord,\n\tvalidateBrowserActionOptions,\n} from './helpers.js'\n\n/**\n * Trusted keyboard input through Chromium's CDP Input domain.\n */\nexport class BrowserKeyboard implements BrowserKeyboardInterface {\n\treadonly #frame: BrowserFrameInterface\n\treadonly #modifiers = new Set<string>()\n\n\tconstructor(frame: BrowserFrameInterface) {\n\t\tthis.#frame = frame\n\t}\n\n\tasync down(value: string): Promise<void> {\n\t\tconst key = keyToBrowserInput(value)\n\t\tconst modifier = ['Alt', 'Control', 'Meta', 'Shift'].includes(key.key)\n\t\tconst modifiers = computeBrowserModifiers([...this.#modifiers, ...(modifier ? [key.key] : [])])\n\t\tconst text = modifiers === 0 || modifiers === 8 ? key.text : undefined\n\t\tawait this.#frame.send('Input.dispatchKeyEvent', {\n\t\t\ttype: 'keyDown',\n\t\t\tkey: key.key,\n\t\t\tcode: key.code,\n\t\t\ttext,\n\t\t\tunmodifiedText: key.text,\n\t\t\twindowsVirtualKeyCode: key.number,\n\t\t\tnativeVirtualKeyCode: key.number,\n\t\t\tmodifiers,\n\t\t})\n\t\tif (modifier) this.#modifiers.add(key.key)\n\t}\n\n\tasync up(value: string): Promise<void> {\n\t\tconst key = keyToBrowserInput(value)\n\t\ttry {\n\t\t\tawait this.#frame.send('Input.dispatchKeyEvent', {\n\t\t\t\ttype: 'keyUp',\n\t\t\t\tkey: key.key,\n\t\t\t\tcode: key.code,\n\t\t\t\twindowsVirtualKeyCode: key.number,\n\t\t\t\tnativeVirtualKeyCode: key.number,\n\t\t\t\tmodifiers: computeBrowserModifiers([...this.#modifiers]),\n\t\t\t})\n\t\t} finally {\n\t\t\tthis.#modifiers.delete(key.key)\n\t\t}\n\t}\n\n\tasync press(value: string, options?: BrowserActionOptions): Promise<void> {\n\t\tvalidateBrowserActionOptions(options)\n\t\tconst chord = parseBrowserChord(value)\n\t\tfor (const modifier of chord.modifiers) await this.down(modifier)\n\t\ttry {\n\t\t\tawait this.down(chord.key)\n\t\t\tif (options?.delay !== undefined && options.delay > 0) {\n\t\t\t\tawait new Promise((resolve) => setTimeout(resolve, options.delay))\n\t\t\t}\n\t\t\tawait this.up(chord.key)\n\t\t} finally {\n\t\t\tfor (const modifier of [...chord.modifiers].reverse()) await this.up(modifier)\n\t\t}\n\t}\n\n\tasync type(value: string, options?: BrowserActionOptions): Promise<void> {\n\t\tvalidateBrowserActionOptions(options)\n\t\tfor (const character of value) {\n\t\t\tawait this.down(character)\n\t\t\tawait this.up(character)\n\t\t\tif (options?.delay !== undefined && options.delay > 0) {\n\t\t\t\tawait new Promise((resolve) => setTimeout(resolve, options.delay))\n\t\t\t}\n\t\t}\n\t}\n\n\tasync insert(value: string): Promise<void> {\n\t\tawait this.#frame.send('Input.insertText', { text: value })\n\t}\n}\n","import type {\n\tBrowserActionOptions,\n\tBrowserFrameInterface,\n\tBrowserMouseButton,\n\tBrowserMouseInterface,\n\tBrowserPoint,\n} from './types.js'\nimport {\n\tcomputeBrowserButtons,\n\tvalidateBrowserActionOptions,\n\tvalidateBrowserPoint,\n} from './helpers.js'\n\n/**\n * Trusted mouse input through Chromium's CDP Input domain.\n */\nexport class BrowserMouse implements BrowserMouseInterface {\n\treadonly #frame: BrowserFrameInterface\n\treadonly #buttons = new Set<BrowserMouseButton>()\n\t#point: BrowserPoint = { x: 0, y: 0 }\n\n\tconstructor(frame: BrowserFrameInterface) {\n\t\tthis.#frame = frame\n\t}\n\n\tasync move(point: BrowserPoint): Promise<void> {\n\t\tvalidateBrowserPoint(point)\n\t\tthis.#point = point\n\t\tawait this.#frame.send('Input.dispatchMouseEvent', {\n\t\t\ttype: 'mouseMoved',\n\t\t\tx: point.x,\n\t\t\ty: point.y,\n\t\t\tbutton: 'none',\n\t\t\tbuttons: computeBrowserButtons([...this.#buttons]),\n\t\t})\n\t}\n\n\tasync down(button: BrowserMouseButton = 'left', count = 1): Promise<void> {\n\t\tvalidateBrowserActionOptions({ count })\n\t\tconst buttons = new Set(this.#buttons)\n\t\tbuttons.add(button)\n\t\tawait this.#frame.send('Input.dispatchMouseEvent', {\n\t\t\ttype: 'mousePressed',\n\t\t\tx: this.#point.x,\n\t\t\ty: this.#point.y,\n\t\t\tbutton,\n\t\t\tbuttons: computeBrowserButtons([...buttons]),\n\t\t\tclickCount: count,\n\t\t})\n\t\tthis.#buttons.add(button)\n\t}\n\n\tasync up(button: BrowserMouseButton = 'left', count = 1): Promise<void> {\n\t\tvalidateBrowserActionOptions({ count })\n\t\tconst buttons = new Set(this.#buttons)\n\t\tbuttons.delete(button)\n\t\ttry {\n\t\t\tawait this.#frame.send('Input.dispatchMouseEvent', {\n\t\t\t\ttype: 'mouseReleased',\n\t\t\t\tx: this.#point.x,\n\t\t\t\ty: this.#point.y,\n\t\t\t\tbutton,\n\t\t\t\tbuttons: computeBrowserButtons([...buttons]),\n\t\t\t\tclickCount: count,\n\t\t\t})\n\t\t} finally {\n\t\t\tthis.#buttons.delete(button)\n\t\t}\n\t}\n\n\tasync click(point: BrowserPoint, options?: BrowserActionOptions): Promise<void> {\n\t\tvalidateBrowserActionOptions(options)\n\t\tconst button = options?.button ?? 'left'\n\t\tconst count = options?.count ?? 1\n\t\tawait this.move(point)\n\t\tawait this.down(button, count)\n\t\tif (options?.delay !== undefined && options.delay > 0) {\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, options.delay))\n\t\t}\n\t\tawait this.up(button, count)\n\t}\n\n\tasync drag(\n\t\tstart: BrowserPoint,\n\t\tend: BrowserPoint,\n\t\toptions?: BrowserActionOptions,\n\t): Promise<void> {\n\t\tvalidateBrowserActionOptions(options)\n\t\tvalidateBrowserPoint(start)\n\t\tvalidateBrowserPoint(end)\n\t\tconst steps = options?.steps ?? 10\n\t\tawait this.move(start)\n\t\tawait this.down(options?.button ?? 'left', 1)\n\t\ttry {\n\t\t\tfor (let step = 1; step <= steps; step += 1) {\n\t\t\t\tawait this.move({\n\t\t\t\t\tx: start.x + ((end.x - start.x) * step) / steps,\n\t\t\t\t\ty: start.y + ((end.y - start.y) * step) / steps,\n\t\t\t\t})\n\t\t\t\tif (options?.delay !== undefined && options.delay > 0) {\n\t\t\t\t\tawait new Promise((resolve) => setTimeout(resolve, options.delay))\n\t\t\t\t}\n\t\t\t}\n\t\t} finally {\n\t\t\tawait this.up(options?.button ?? 'left', 1)\n\t\t}\n\t}\n\n\tasync wheel(delta: BrowserPoint): Promise<void> {\n\t\tvalidateBrowserPoint(delta)\n\t\tawait this.#frame.send('Input.dispatchMouseEvent', {\n\t\t\ttype: 'mouseWheel',\n\t\t\tx: this.#point.x,\n\t\t\ty: this.#point.y,\n\t\t\tdeltaX: delta.x,\n\t\t\tdeltaY: delta.y,\n\t\t\tbuttons: computeBrowserButtons([...this.#buttons]),\n\t\t})\n\t}\n}\n","import type {\n\tBrowserActionOptions,\n\tBrowserActionabilityOptions,\n\tBrowserFilterOptions,\n\tBrowserFrameInterface,\n\tBrowserHandleInterface,\n\tBrowserLocatorInterface,\n\tBrowserPoint,\n\tBrowserQuery,\n\tBrowserScreenshotOptions,\n\tBrowserScreenshotResult,\n\tBrowserTextResultOptions,\n\tBrowserUploadOptions,\n\tBrowserWaitOptions,\n\tBrowserWaitState,\n} from './types.js'\nimport { BROWSER_DEFAULT_TIMEOUT_MS, BROWSER_WAIT_POLL_INTERVAL_MS } from './constants.js'\nimport {\n\tcompileActionabilityFunction,\n\tcompileAttachedLocatorWaitExpression,\n\tcompileDetachedLocatorWaitExpression,\n\tcompileHiddenLocatorWaitExpression,\n\tcompileLocatorExpression,\n\tcompileLocatorListExpression,\n\tcompileVisibleLocatorWaitExpression,\n\tbrowserScreenshotToParams,\n\tcompileScreenshotCleanupExpression,\n\tcompileScreenshotPreparationExpression,\n\tdecodeBase64,\n\treadBrowserQuad,\n\trequireBrowserString,\n\tvalidateBrowserActionOptions,\n} from './helpers.js'\nimport { BrowserError, BrowserSelectorError } from './errors.js'\nimport { isArray, isFiniteNumber, isInteger, isRecord, isString } from '@orkestrel/contract'\n\n/**\n * Reusable strict semantic locator over one frame.\n */\nexport class BrowserLocator implements BrowserLocatorInterface {\n\treadonly #frame: BrowserFrameInterface\n\treadonly #query: BrowserQuery\n\n\tconstructor(frame: BrowserFrameInterface, query: BrowserQuery) {\n\t\tthis.#frame = frame\n\t\tthis.#query = query\n\t}\n\n\tget frame(): BrowserFrameInterface {\n\t\treturn this.#frame\n\t}\n\n\tget query(): BrowserQuery {\n\t\treturn this.#query\n\t}\n\n\tlocator(selector: string): BrowserLocatorInterface {\n\t\treturn new BrowserLocator(this.#frame, {\n\t\t\tselector: 'css',\n\t\t\tvalue: selector,\n\t\t\tparent: this.#query,\n\t\t})\n\t}\n\n\tfilter(options: BrowserFilterOptions): BrowserLocatorInterface {\n\t\treturn new BrowserLocator(this.#frame, { ...this.#query, filter: options })\n\t}\n\n\tfirst(): BrowserLocatorInterface {\n\t\treturn this.item(0)\n\t}\n\n\tlast(): BrowserLocatorInterface {\n\t\treturn this.item(-1)\n\t}\n\n\titem(index: number): BrowserLocatorInterface {\n\t\tif (!isInteger(index)) throw new BrowserError('Browser locator index must be an integer')\n\t\treturn new BrowserLocator(this.#frame, { ...this.#query, index })\n\t}\n\n\tasync count(): Promise<number> {\n\t\tconst value = await this.#frame.evaluate(\n\t\t\t`(${compileLocatorListExpression(this.#query)}).length`,\n\t\t)\n\t\tif (!isInteger(value) || value < 0) {\n\t\t\tthrow new BrowserError('Browser locator count did not resolve to a non-negative integer')\n\t\t}\n\t\treturn value\n\t}\n\n\tasync all(): Promise<readonly BrowserLocatorInterface[]> {\n\t\tconst count = await this.count()\n\t\tconst locators: BrowserLocatorInterface[] = []\n\t\tfor (let index = 0; index < count; index += 1) {\n\t\t\tlocators.push(this.item(index))\n\t\t}\n\t\treturn locators\n\t}\n\n\tasync click(options?: BrowserActionOptions): Promise<void> {\n\t\tconst handle = await this.#resolve(options, 'visible')\n\t\ttry {\n\t\t\tconst point = await this.#point(handle, options, {\n\t\t\t\tvisible: true,\n\t\t\t\tstable: true,\n\t\t\t\tevents: true,\n\t\t\t\tenabled: true,\n\t\t\t})\n\t\t\tif (options?.trial === true) return\n\t\t\tawait this.#frame.mouse.click(point, options)\n\t\t} finally {\n\t\t\tawait handle.dispose()\n\t\t}\n\t}\n\n\tasync fill(value: string, options?: BrowserActionOptions): Promise<void> {\n\t\tconst handle = await this.#resolve(options, 'visible')\n\t\ttry {\n\t\t\tif (options?.force !== true) {\n\t\t\t\tawait handle.call(\n\t\t\t\t\tcompileActionabilityFunction({\n\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\tstable: true,\n\t\t\t\t\t\tevents: false,\n\t\t\t\t\t\tenabled: true,\n\t\t\t\t\t\teditable: true,\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t}\n\t\t\tif (options?.trial === true) return\n\t\t\tawait handle.call(`function() {\n\t\t\t\tthis.focus()\n\t\t\t\tif (this.isContentEditable) {\n\t\t\t\t\tconst selection = this.ownerDocument.getSelection()\n\t\t\t\t\tconst range = this.ownerDocument.createRange()\n\t\t\t\t\trange.selectNodeContents(this)\n\t\t\t\t\tselection.removeAllRanges()\n\t\t\t\t\tselection.addRange(range)\n\t\t\t\t} else {\n\t\t\t\t\tthis.select()\n\t\t\t\t}\n\t\t\t}`)\n\t\t\tawait this.#frame.keyboard.insert(value)\n\t\t} finally {\n\t\t\tawait handle.dispose()\n\t\t}\n\t}\n\n\tasync select(values: readonly string[], options?: BrowserActionOptions): Promise<void> {\n\t\tconst handle = await this.#resolve(options, 'visible')\n\t\ttry {\n\t\t\tif (options?.force !== true) {\n\t\t\t\tawait handle.call(\n\t\t\t\t\tcompileActionabilityFunction({\n\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\tstable: true,\n\t\t\t\t\t\tevents: false,\n\t\t\t\t\t\tenabled: true,\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t}\n\t\t\tif (options?.trial === true) return\n\t\t\tawait handle.call(\n\t\t\t\t`function(values) {\n\t\t\t\t\tif (!(this instanceof HTMLSelectElement)) throw new Error('Element is not a select')\n\t\t\t\t\tif (!this.multiple && values.length > 1) throw new Error('Single select cannot accept multiple values')\n\t\t\t\t\tconst available = new Set(Array.from(this.options, (option) => option.value))\n\t\t\t\t\tconst missing = values.filter((value) => !available.has(value))\n\t\t\t\t\tif (missing.length > 0) throw new Error('Select options not found: ' + missing.join(', '))\n\t\t\t\t\tfor (const option of this.options) option.selected = values.includes(option.value)\n\t\t\t\t\tthis.dispatchEvent(new Event('input', { bubbles: true }))\n\t\t\t\t\tthis.dispatchEvent(new Event('change', { bubbles: true }))\n\t\t\t\t}`,\n\t\t\t\t[[...values]],\n\t\t\t)\n\t\t} finally {\n\t\t\tawait handle.dispose()\n\t\t}\n\t}\n\n\tasync check(options?: BrowserActionOptions): Promise<void> {\n\t\tif ((await this.#boolean('checked')) === true) return\n\t\tawait this.click(options)\n\t\tif ((await this.#boolean('checked')) !== true) {\n\t\t\tthrow new BrowserError('Browser locator did not become checked')\n\t\t}\n\t}\n\n\tasync uncheck(options?: BrowserActionOptions): Promise<void> {\n\t\tif ((await this.#boolean('checked')) === false) return\n\t\tawait this.click(options)\n\t\tif ((await this.#boolean('checked')) !== false) {\n\t\t\tthrow new BrowserError('Browser locator did not become unchecked')\n\t\t}\n\t}\n\n\tasync hover(options?: BrowserActionOptions): Promise<void> {\n\t\tconst handle = await this.#resolve(options, 'visible')\n\t\ttry {\n\t\t\tconst point = await this.#point(handle, options, {\n\t\t\t\tvisible: true,\n\t\t\t\tstable: true,\n\t\t\t\tevents: true,\n\t\t\t})\n\t\t\tif (options?.trial !== true) await this.#frame.mouse.move(point)\n\t\t} finally {\n\t\t\tawait handle.dispose()\n\t\t}\n\t}\n\n\tasync focus(options?: BrowserActionOptions): Promise<void> {\n\t\tconst handle = await this.#resolve(options, 'attached')\n\t\ttry {\n\t\t\tif (options?.trial !== true) await handle.call('function() { this.focus() }')\n\t\t} finally {\n\t\t\tawait handle.dispose()\n\t\t}\n\t}\n\n\tasync press(key: string, options?: BrowserActionOptions): Promise<void> {\n\t\tawait this.focus(options)\n\t\tif (options?.trial !== true) await this.#frame.keyboard.press(key, options)\n\t}\n\n\tasync type(value: string, options?: BrowserActionOptions): Promise<void> {\n\t\tawait this.focus(options)\n\t\tif (options?.trial !== true) await this.#frame.keyboard.type(value, options)\n\t}\n\n\tasync clear(options?: BrowserActionOptions): Promise<void> {\n\t\tconst handle = await this.#resolve(options, 'visible')\n\t\ttry {\n\t\t\tif (options?.trial === true) return\n\t\t\tawait handle.call(`function() {\n\t\t\t\tthis.focus()\n\t\t\t\tif (this.isContentEditable) {\n\t\t\t\t\tthis.textContent = ''\n\t\t\t\t} else if ('value' in this) {\n\t\t\t\t\tthis.value = ''\n\t\t\t\t} else {\n\t\t\t\t\tthrow new Error('Element is not editable')\n\t\t\t\t}\n\t\t\t\tthis.dispatchEvent(new InputEvent('input', { bubbles: true, inputType: 'deleteContentBackward' }))\n\t\t\t\tthis.dispatchEvent(new Event('change', { bubbles: true }))\n\t\t\t}`)\n\t\t} finally {\n\t\t\tawait handle.dispose()\n\t\t}\n\t}\n\n\tasync wait(options?: BrowserWaitOptions): Promise<void> {\n\t\tconst timeout = options?.timeout ?? BROWSER_DEFAULT_TIMEOUT_MS\n\t\tif (!isFiniteNumber(timeout) || timeout < 0) {\n\t\t\tthrow new BrowserError(\n\t\t\t\t'Browser wait timeout must be a non-negative finite number',\n\t\t\t\tundefined,\n\t\t\t\t{\n\t\t\t\t\ttimeout,\n\t\t\t\t},\n\t\t\t)\n\t\t}\n\t\tconst state = options?.state ?? 'attached'\n\t\tconst expression = this.#waitExpression(state, options?.strict ?? true, timeout)\n\t\tlet found: unknown\n\t\ttry {\n\t\t\tfound = await this.#frame.evaluate(expression, timeout + BROWSER_WAIT_POLL_INTERVAL_MS)\n\t\t} catch (error) {\n\t\t\tthrow new BrowserSelectorError('Browser locator wait failed', {\n\t\t\t\tquery: this.#query,\n\t\t\t\tstate,\n\t\t\t\ttimeout,\n\t\t\t\tframe: this.#frame.id,\n\t\t\t\terror,\n\t\t\t})\n\t\t}\n\t\tif (found === true) return\n\t\tthrow new BrowserSelectorError('Timeout waiting for browser locator', {\n\t\t\tquery: this.#query,\n\t\t\tstate,\n\t\t\ttimeout,\n\t\t\tframe: this.#frame.id,\n\t\t})\n\t}\n\n\tasync text(options?: BrowserTextResultOptions): Promise<string | readonly string[]> {\n\t\tconst expression =\n\t\t\toptions?.all === true\n\t\t\t\t? `(${compileLocatorListExpression(this.#query)}).map((element) => element.innerText)`\n\t\t\t\t: `(${compileLocatorExpression(this.#query)})?.innerText`\n\t\tconst value = await this.#frame.evaluate(expression)\n\t\tif (options?.all === true) {\n\t\t\tif (!isArray(value) || !value.every(isString)) {\n\t\t\t\tthrow new BrowserError('Browser locator text list is malformed')\n\t\t\t}\n\t\t\treturn value\n\t\t}\n\t\treturn requireBrowserString(value, 'Browser locator text')\n\t}\n\n\tasync html(): Promise<string> {\n\t\treturn await this.#string('outerHTML', 'Browser locator HTML')\n\t}\n\n\tasync value(): Promise<string> {\n\t\tconst value = await this.#frame.evaluate(\n\t\t\t`(() => { const element = ${compileLocatorExpression(this.#query)}; return element && 'value' in element ? element.value : element?.textContent })()`,\n\t\t)\n\t\treturn requireBrowserString(value, 'Browser locator value')\n\t}\n\n\tasync attribute(name: string): Promise<string | undefined> {\n\t\tconst value = await this.#frame.evaluate(\n\t\t\t`(${compileLocatorExpression(this.#query)})?.getAttribute(${JSON.stringify(name)})`,\n\t\t)\n\t\treturn isString(value) ? value : undefined\n\t}\n\n\tasync visible(): Promise<boolean> {\n\t\treturn await this.#boolean('visible')\n\t}\n\n\tasync enabled(): Promise<boolean> {\n\t\treturn await this.#boolean('enabled')\n\t}\n\n\tasync editable(): Promise<boolean> {\n\t\treturn await this.#boolean('editable')\n\t}\n\n\tasync screenshot(options?: BrowserScreenshotOptions): Promise<BrowserScreenshotResult> {\n\t\tif (options?.full === true || options?.clip !== undefined) {\n\t\t\tthrow new BrowserError('Browser locator screenshot cannot use full-page or custom clip')\n\t\t}\n\t\tconst handle = await this.#resolve(undefined, 'visible')\n\t\tlet token: string | undefined\n\t\ttry {\n\t\t\tawait handle.call(\n\t\t\t\tcompileActionabilityFunction({\n\t\t\t\t\tvisible: true,\n\t\t\t\t\tstable: true,\n\t\t\t\t\tevents: false,\n\t\t\t\t\tenabled: false,\n\t\t\t\t}),\n\t\t\t)\n\t\t\tconst quad = await this.#quad(handle)\n\t\t\tconst xs = [quad.points[0], quad.points[2], quad.points[4], quad.points[6]]\n\t\t\tconst ys = [quad.points[1], quad.points[3], quad.points[5], quad.points[7]]\n\t\t\tconst x = Math.min(...xs)\n\t\t\tconst y = Math.min(...ys)\n\t\t\tconst width = Math.max(...xs) - x\n\t\t\tconst height = Math.max(...ys) - y\n\t\t\tconst params: Record<string, unknown> = {\n\t\t\t\t...browserScreenshotToParams(options),\n\t\t\t\tclip: { x, y, width, height, scale: 1 },\n\t\t\t\tcaptureBeyondViewport: true,\n\t\t\t}\n\t\t\tif (options?.scale === 'device') {\n\t\t\t\tconst ratio = await this.#frame.evaluate('devicePixelRatio')\n\t\t\t\tif (!isFiniteNumber(ratio) || ratio <= 0) {\n\t\t\t\t\tthrow new BrowserError('Browser screenshot device scale is malformed')\n\t\t\t\t}\n\t\t\t\tparams['clip'] = { x, y, width, height, scale: ratio }\n\t\t\t}\n\t\t\tconst preparation = compileScreenshotPreparationExpression(options)\n\t\t\tif (preparation !== undefined) {\n\t\t\t\tconst value = await this.#frame.evaluate(preparation)\n\t\t\t\tif (!isString(value)) throw new BrowserError('Browser screenshot preparation failed')\n\t\t\t\ttoken = value\n\t\t\t}\n\t\t\tif (options?.transparent === true) {\n\t\t\t\tawait this.#frame.send('Emulation.setDefaultBackgroundColorOverride', {\n\t\t\t\t\tcolor: { r: 0, g: 0, b: 0, a: 0 },\n\t\t\t\t})\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tconst result = await this.#frame.send('Page.captureScreenshot', params)\n\t\t\t\tif (!isRecord(result) || !isString(result['data'])) {\n\t\t\t\t\tthrow new BrowserError('Locator screenshot failed: no data returned')\n\t\t\t\t}\n\t\t\t\tconst bytes = decodeBase64(result['data'])\n\t\t\t\tif (options?.path !== undefined) await this.#frame.save(options.path, bytes)\n\t\t\t\treturn { bytes, path: options?.path }\n\t\t\t} finally {\n\t\t\t\tif (options?.transparent === true) {\n\t\t\t\t\tawait this.#frame\n\t\t\t\t\t\t.send('Emulation.setDefaultBackgroundColorOverride')\n\t\t\t\t\t\t.catch(() => undefined)\n\t\t\t\t}\n\t\t\t}\n\t\t} finally {\n\t\t\tif (token !== undefined) {\n\t\t\t\tawait this.#frame.evaluate(compileScreenshotCleanupExpression(token)).catch(() => undefined)\n\t\t\t}\n\t\t\tawait handle.dispose()\n\t\t}\n\t}\n\n\tasync upload(options: BrowserUploadOptions): Promise<void> {\n\t\tconst handle = await this.#resolve(options, 'attached')\n\t\ttry {\n\t\t\tif (options.trial === true) return\n\t\t\tawait this.#frame.send('DOM.setFileInputFiles', {\n\t\t\t\tobjectId: handle.id,\n\t\t\t\tfiles: [...options.files],\n\t\t\t})\n\t\t} finally {\n\t\t\tawait handle.dispose()\n\t\t}\n\t}\n\n\tasync drag(target: BrowserLocatorInterface, options?: BrowserActionOptions): Promise<void> {\n\t\tif (target.frame.id !== this.#frame.id) {\n\t\t\tthrow new BrowserError('Browser drag target must belong to the same frame')\n\t\t}\n\t\tconst sourceHandle = await this.#resolve(options, 'visible')\n\t\tlet targetHandle: BrowserHandleInterface | undefined\n\t\ttry {\n\t\t\tawait target.wait({\n\t\t\t\t...(options?.timeout !== undefined ? { timeout: options.timeout } : {}),\n\t\t\t\t...(options?.strict !== undefined ? { strict: options.strict } : {}),\n\t\t\t\tstate: 'visible',\n\t\t\t})\n\t\t\ttargetHandle = await target.frame.handle(compileLocatorExpression(target.query))\n\t\t\tconst source = await this.#point(sourceHandle, options, {\n\t\t\t\tvisible: true,\n\t\t\t\tstable: true,\n\t\t\t\tevents: true,\n\t\t\t})\n\t\t\tconst destination = await this.#point(targetHandle, undefined, {\n\t\t\t\tvisible: true,\n\t\t\t\tstable: true,\n\t\t\t\tevents: true,\n\t\t\t})\n\t\t\tif (options?.trial !== true) {\n\t\t\t\tawait this.#frame.mouse.drag(source, destination, options)\n\t\t\t}\n\t\t} finally {\n\t\t\tawait sourceHandle.dispose()\n\t\t\tawait targetHandle?.dispose()\n\t\t}\n\t}\n\n\tasync #resolve(\n\t\toptions: BrowserActionOptions | undefined,\n\t\tstate: 'attached' | 'visible',\n\t): Promise<BrowserHandleInterface> {\n\t\tvalidateBrowserActionOptions(options)\n\t\tawait this.wait({\n\t\t\t...(options?.timeout !== undefined ? { timeout: options.timeout } : {}),\n\t\t\t...(options?.strict !== undefined ? { strict: options.strict } : {}),\n\t\t\tstate,\n\t\t})\n\t\treturn await this.#frame.handle(compileLocatorExpression(this.#query))\n\t}\n\n\tasync #point(\n\t\thandle: BrowserHandleInterface,\n\t\toptions: BrowserActionOptions | undefined,\n\t\tactionability: BrowserActionabilityOptions,\n\t): Promise<BrowserPoint> {\n\t\tif (options?.force !== true) {\n\t\t\tawait handle.call(\n\t\t\t\tcompileActionabilityFunction({\n\t\t\t\t\t...actionability,\n\t\t\t\t\t...(options?.position !== undefined ? { position: options.position } : {}),\n\t\t\t\t}),\n\t\t\t)\n\t\t}\n\t\tconst quad = await this.#quad(handle)\n\t\tif (options?.position === undefined) return quad.center\n\t\tconst xs = [quad.points[0], quad.points[2], quad.points[4], quad.points[6]]\n\t\tconst ys = [quad.points[1], quad.points[3], quad.points[5], quad.points[7]]\n\t\treturn {\n\t\t\tx: Math.min(...xs) + options.position.x,\n\t\t\ty: Math.min(...ys) + options.position.y,\n\t\t}\n\t}\n\n\tasync #quad(handle: BrowserHandleInterface): Promise<ReturnType<typeof readBrowserQuad>> {\n\t\treturn readBrowserQuad(await this.#frame.send('DOM.getContentQuads', { objectId: handle.id }))\n\t}\n\n\tasync #string(property: string, field: string): Promise<string> {\n\t\tconst value = await this.#frame.evaluate(\n\t\t\t`(${compileLocatorExpression(this.#query)})?.[${JSON.stringify(property)}]`,\n\t\t)\n\t\treturn requireBrowserString(value, field)\n\t}\n\n\tasync #boolean(property: 'checked' | 'visible' | 'enabled' | 'editable'): Promise<boolean> {\n\t\tlet expression: string\n\t\tswitch (property) {\n\t\t\tcase 'checked':\n\t\t\t\texpression = `Boolean((${compileLocatorExpression(this.#query)})?.checked)`\n\t\t\t\tbreak\n\t\t\tcase 'visible':\n\t\t\t\texpression = `(() => { const element = ${compileLocatorExpression(this.#query)}; if (!element) return false; const style = getComputedStyle(element); const rect = element.getBoundingClientRect(); return style.display !== 'none' && style.visibility !== 'hidden' && style.visibility !== 'collapse' && rect.width > 0 && rect.height > 0 })()`\n\t\t\t\tbreak\n\t\t\tcase 'enabled':\n\t\t\t\texpression = `(() => { const element = ${compileLocatorExpression(this.#query)}; return Boolean(element && !element.matches(':disabled')) })()`\n\t\t\t\tbreak\n\t\t\tcase 'editable':\n\t\t\t\texpression = `(() => { const element = ${compileLocatorExpression(this.#query)}; return Boolean(element && !element.matches(':disabled,[readonly]') && (element.isContentEditable || 'value' in element)) })()`\n\t\t\t\tbreak\n\t\t}\n\t\treturn (await this.#frame.evaluate(expression)) === true\n\t}\n\n\t#waitExpression(state: BrowserWaitState, strict: boolean, timeout: number): string {\n\t\tswitch (state) {\n\t\t\tcase 'attached':\n\t\t\t\treturn compileAttachedLocatorWaitExpression(this.#query, strict, timeout)\n\t\t\tcase 'detached':\n\t\t\t\treturn compileDetachedLocatorWaitExpression(this.#query, strict, timeout)\n\t\t\tcase 'visible':\n\t\t\t\treturn compileVisibleLocatorWaitExpression(this.#query, strict, timeout)\n\t\t\tcase 'hidden':\n\t\t\t\treturn compileHiddenLocatorWaitExpression(this.#query, strict, timeout)\n\t\t}\n\t}\n}\n","import type {\n\tBrowserFrameInterface,\n\tBrowserLocatorInterface,\n\tBrowserRoleOptions,\n\tBrowserSelectorManagerInterface,\n\tBrowserTextOptions,\n} from './types.js'\nimport { BrowserLocator } from './BrowserLocator.js'\n\n/**\n * Semantic locator factory for one frame.\n */\nexport class BrowserSelectorManager implements BrowserSelectorManagerInterface {\n\treadonly #frame: BrowserFrameInterface\n\n\tconstructor(frame: BrowserFrameInterface) {\n\t\tthis.#frame = frame\n\t}\n\n\tcss(value: string): BrowserLocatorInterface {\n\t\treturn new BrowserLocator(this.#frame, { selector: 'css', value })\n\t}\n\n\trole(value: string, options?: BrowserRoleOptions): BrowserLocatorInterface {\n\t\treturn new BrowserLocator(this.#frame, {\n\t\t\tselector: 'role',\n\t\t\tvalue,\n\t\t\t...(options?.name !== undefined ? { name: options.name } : {}),\n\t\t\t...(options?.exact !== undefined ? { exact: options.exact } : {}),\n\t\t})\n\t}\n\n\ttext(value: string, options?: BrowserTextOptions): BrowserLocatorInterface {\n\t\treturn new BrowserLocator(this.#frame, {\n\t\t\tselector: 'text',\n\t\t\tvalue,\n\t\t\t...(options?.exact !== undefined ? { exact: options.exact } : {}),\n\t\t})\n\t}\n\n\tlabel(value: string, options?: BrowserTextOptions): BrowserLocatorInterface {\n\t\treturn new BrowserLocator(this.#frame, {\n\t\t\tselector: 'label',\n\t\t\tvalue,\n\t\t\t...(options?.exact !== undefined ? { exact: options.exact } : {}),\n\t\t})\n\t}\n\n\tplaceholder(value: string, options?: BrowserTextOptions): BrowserLocatorInterface {\n\t\treturn new BrowserLocator(this.#frame, {\n\t\t\tselector: 'placeholder',\n\t\t\tvalue,\n\t\t\t...(options?.exact !== undefined ? { exact: options.exact } : {}),\n\t\t})\n\t}\n\n\ttest(value: string): BrowserLocatorInterface {\n\t\treturn new BrowserLocator(this.#frame, { selector: 'test', value })\n\t}\n}\n","import type { BrowserFrameInterface, BrowserPoint, BrowserTouchInterface } from './types.js'\nimport { validateBrowserPoint } from './helpers.js'\n\n/**\n * Trusted touch input through Chromium's CDP Input domain.\n */\nexport class BrowserTouch implements BrowserTouchInterface {\n\treadonly #frame: BrowserFrameInterface\n\n\tconstructor(frame: BrowserFrameInterface) {\n\t\tthis.#frame = frame\n\t}\n\n\tasync tap(point: BrowserPoint): Promise<void> {\n\t\tvalidateBrowserPoint(point)\n\t\tconst touch = { x: point.x, y: point.y }\n\t\tawait this.#frame.send('Input.dispatchTouchEvent', {\n\t\t\ttype: 'touchStart',\n\t\t\ttouchPoints: [touch],\n\t\t})\n\t\ttry {\n\t\t\tawait this.#frame.send('Input.dispatchTouchEvent', {\n\t\t\t\ttype: 'touchEnd',\n\t\t\t\ttouchPoints: [],\n\t\t\t})\n\t\t} catch (error) {\n\t\t\tawait this.#frame\n\t\t\t\t.send('Input.dispatchTouchEvent', {\n\t\t\t\t\ttype: 'touchCancel',\n\t\t\t\t\ttouchPoints: [],\n\t\t\t\t})\n\t\t\t\t.catch(() => undefined)\n\t\t\tthrow error\n\t\t}\n\t}\n}\n","import type {\n\tBrowserActionOptions,\n\tBrowserContentResult,\n\tBrowserFrameInterface,\n\tBrowserHandleInterface,\n\tBrowserKeyboardInterface,\n\tBrowserMouseInterface,\n\tBrowserSelectorManagerInterface,\n\tBrowserSessionFunction,\n\tBrowserTouchInterface,\n\tBrowserWaitOptions,\n\tCDPHandler,\n\tCDPClientInterface,\n} from './types.js'\nimport { BrowserHandle } from './BrowserHandle.js'\nimport { BrowserKeyboard } from './BrowserKeyboard.js'\nimport { BrowserMouse } from './BrowserMouse.js'\nimport { BrowserSelectorManager } from './BrowserSelectorManager.js'\nimport { BrowserTouch } from './BrowserTouch.js'\nimport { BROWSER_FRAME_WORLD_NAME, BROWSER_RESULT_LIMIT } from './constants.js'\nimport { guardEvaluateExpression, readEvaluationResult, requireBrowserString } from './helpers.js'\nimport { BrowserError } from './errors.js'\nimport { isInteger, isRecord, isString } from '@orkestrel/contract'\nimport { createHTML, renderText } from '@orkestrel/html'\n\n/**\n * One attached document frame, evaluated through its own CDP execution world.\n */\nexport class BrowserFrame implements BrowserFrameInterface {\n\treadonly #client: CDPClientInterface\n\treadonly #session: string | BrowserSessionFunction\n\treadonly #id: string\n\treadonly #parent: string | undefined\n\treadonly #name: string | undefined\n\treadonly #isolated: boolean\n\treadonly #selectors: BrowserSelectorManager\n\treadonly #keyboard: BrowserKeyboard\n\treadonly #mouse: BrowserMouse\n\treadonly #touch: BrowserTouch\n\t#url: string\n\n\tconstructor(\n\t\tclient: CDPClientInterface,\n\t\tsession: string | BrowserSessionFunction,\n\t\tid: string,\n\t\turl: string,\n\t\tparent?: string,\n\t\tname?: string,\n\t\tisolated = true,\n\t) {\n\t\tthis.#client = client\n\t\tthis.#session = session\n\t\tthis.#id = id\n\t\tthis.#url = url\n\t\tthis.#parent = parent\n\t\tthis.#name = name\n\t\tthis.#isolated = isolated\n\t\tthis.#selectors = new BrowserSelectorManager(this)\n\t\tthis.#keyboard = new BrowserKeyboard(this)\n\t\tthis.#mouse = new BrowserMouse(this)\n\t\tthis.#touch = new BrowserTouch(this)\n\t}\n\n\tget id(): string {\n\t\treturn this.#id\n\t}\n\n\tget parent(): string | undefined {\n\t\treturn this.#parent\n\t}\n\n\tget name(): string | undefined {\n\t\treturn this.#name\n\t}\n\n\tget url(): string {\n\t\treturn this.#url\n\t}\n\n\tget selectors(): BrowserSelectorManagerInterface {\n\t\treturn this.#selectors\n\t}\n\n\tget keyboard(): BrowserKeyboardInterface {\n\t\treturn this.#keyboard\n\t}\n\n\tget mouse(): BrowserMouseInterface {\n\t\treturn this.#mouse\n\t}\n\n\tget touch(): BrowserTouchInterface {\n\t\treturn this.#touch\n\t}\n\n\tasync title(): Promise<string> {\n\t\tthis.assert()\n\t\tconst result = await this.#evaluate('document.title')\n\t\treturn requireBrowserString(result, 'Document title')\n\t}\n\n\tasync content(): Promise<BrowserContentResult> {\n\t\tthis.assert()\n\t\tconst [title, html, text, currentUrl] = await Promise.all([\n\t\t\tthis.#evaluate('document.title'),\n\t\t\tthis.#captureHTML(),\n\t\t\tthis.#evaluate(\n\t\t\t\tguardEvaluateExpression(\n\t\t\t\t\t'document.body ? document.body.innerText : \"\"',\n\t\t\t\t\tBROWSER_RESULT_LIMIT,\n\t\t\t\t),\n\t\t\t),\n\t\t\tthis.#evaluate('location.href'),\n\t\t])\n\n\t\tconst url = requireBrowserString(currentUrl, 'Document URL')\n\t\tthis.#url = url\n\t\treturn {\n\t\t\turl,\n\t\t\ttitle: requireBrowserString(title, 'Document title'),\n\t\t\thtml: requireBrowserString(html, 'Document HTML'),\n\t\t\ttext: requireBrowserString(text, 'Document text'),\n\t\t}\n\t}\n\n\tasync article(): Promise<string> {\n\t\tthis.assert()\n\t\tconst html = requireBrowserString(await this.#captureHTML(), 'Document HTML')\n\t\treturn renderText(createHTML(html).distill().document)\n\t}\n\n\tasync click(selector: string, options?: BrowserActionOptions): Promise<void> {\n\t\tthis.assert()\n\t\tawait this.#selectors.css(selector).click(options)\n\t}\n\n\tasync fill(selector: string, value: string, options?: BrowserActionOptions): Promise<void> {\n\t\tthis.assert()\n\t\tawait this.#selectors.css(selector).fill(value, options)\n\t}\n\n\tasync select(\n\t\tselector: string,\n\t\tvalues: readonly string[],\n\t\toptions?: BrowserActionOptions,\n\t): Promise<void> {\n\t\tthis.assert()\n\t\tawait this.#selectors.css(selector).select(values, options)\n\t}\n\n\tasync evaluate(expression: string, timeout?: number): Promise<unknown> {\n\t\tthis.assert()\n\t\treturn await this.#evaluate(guardEvaluateExpression(expression, BROWSER_RESULT_LIMIT), timeout)\n\t}\n\n\tasync handle(expression: string): Promise<BrowserHandleInterface> {\n\t\tthis.assert()\n\t\tconst session = await this.#sessionId()\n\t\tconst params: Record<string, unknown> = {\n\t\t\texpression,\n\t\t\treturnByValue: false,\n\t\t\tawaitPromise: true,\n\t\t}\n\t\tconst context = await this.#context(session)\n\t\tif (context !== undefined) params['contextId'] = context\n\t\tconst result = await this.#client.send('Runtime.evaluate', params, session)\n\t\tif (\n\t\t\t!isRecord(result) ||\n\t\t\t!isRecord(result['result']) ||\n\t\t\t!isString(result['result']['objectId'])\n\t\t) {\n\t\t\tthrow new BrowserError('Browser expression did not resolve to an object handle', undefined, {\n\t\t\t\tframe: this.#id,\n\t\t\t})\n\t\t}\n\t\treturn new BrowserHandle(this.#client, session, result['result']['objectId'])\n\t}\n\n\tasync wait(selector: string, options?: BrowserWaitOptions): Promise<void> {\n\t\tthis.assert()\n\t\tawait this.#selectors.css(selector).wait(options)\n\t}\n\n\tasync send(\n\t\tmethod: string,\n\t\tparams?: Readonly<Record<string, unknown>>,\n\t\ttimeout?: number,\n\t): Promise<unknown> {\n\t\tthis.assert()\n\t\treturn await this.#client.send(method, params, await this.#sessionId(), timeout)\n\t}\n\n\tasync subscribe(method: string, handler: CDPHandler): Promise<void> {\n\t\tthis.assert()\n\t\tthis.#client.subscribe(method, handler, await this.#sessionId())\n\t}\n\n\tasync unsubscribe(method: string, handler: CDPHandler): Promise<void> {\n\t\tthis.#client.unsubscribe(method, handler, await this.#sessionId())\n\t}\n\n\tasync save(path: string, _bytes: Uint8Array): Promise<void> {\n\t\t// Frames satisfy the persistence contract, but only top-level pages receive a writer.\n\t\tthrow new BrowserError('Browser frame has no configured file writer', undefined, { path })\n\t}\n\n\tassert(): void {\n\t\tif (!this.#client.connected) {\n\t\t\tthrow new BrowserError('Browser frame is disconnected', undefined, { frame: this.#id })\n\t\t}\n\t}\n\n\tupdate(url: string): void {\n\t\tthis.#url = url\n\t}\n\n\tasync #captureHTML(): Promise<unknown> {\n\t\treturn await this.#evaluate(\n\t\t\tguardEvaluateExpression('document.documentElement.outerHTML', BROWSER_RESULT_LIMIT),\n\t\t)\n\t}\n\n\tasync #evaluate(expression: string, timeout?: number): Promise<unknown> {\n\t\tconst session = await this.#sessionId()\n\t\tconst params: Record<string, unknown> = {\n\t\t\texpression,\n\t\t\treturnByValue: true,\n\t\t\tawaitPromise: true,\n\t\t}\n\n\t\tconst context = await this.#context(session, timeout)\n\t\tif (context !== undefined) params['contextId'] = context\n\n\t\tconst result = await this.#client.send('Runtime.evaluate', params, session, timeout)\n\t\treturn readEvaluationResult(result)\n\t}\n\n\tasync #context(session: string, timeout?: number): Promise<number | undefined> {\n\t\tif (!this.#isolated) return undefined\n\t\tconst world = await this.#client.send(\n\t\t\t'Page.createIsolatedWorld',\n\t\t\t{ frameId: this.#id, worldName: BROWSER_FRAME_WORLD_NAME },\n\t\t\tsession,\n\t\t\ttimeout,\n\t\t)\n\t\tif (!isRecord(world) || !isInteger(world['executionContextId'])) {\n\t\t\tthrow new BrowserError('Failed to create frame execution context', undefined, {\n\t\t\t\tframe: this.#id,\n\t\t\t})\n\t\t}\n\t\treturn world['executionContextId']\n\t}\n\n\tasync #sessionId(): Promise<string> {\n\t\tif (isString(this.#session)) return this.#session\n\t\treturn await this.#session(this.#id)\n\t}\n}\n","import type { BrowserFileChooserInterface, BrowserFrameInterface } from './types.js'\nimport { BrowserError } from './errors.js'\n\n/**\n * One intercepted file input selection.\n */\nexport class BrowserFileChooser implements BrowserFileChooserInterface {\n\treadonly #frame: BrowserFrameInterface\n\treadonly #backend: number\n\treadonly #multiple: boolean\n\t#handled = false\n\t#handling = false\n\n\tconstructor(frame: BrowserFrameInterface, backend: number, multiple: boolean) {\n\t\tthis.#frame = frame\n\t\tthis.#backend = backend\n\t\tthis.#multiple = multiple\n\t}\n\n\tget multiple(): boolean {\n\t\treturn this.#multiple\n\t}\n\n\tasync upload(files: readonly string[]): Promise<void> {\n\t\tthis.#assert()\n\t\tif (!this.#multiple && files.length > 1) {\n\t\t\tthrow new BrowserError('Single file chooser cannot accept multiple files')\n\t\t}\n\t\tthis.#handling = true\n\t\ttry {\n\t\t\tawait this.#frame.send('DOM.setFileInputFiles', {\n\t\t\t\tbackendNodeId: this.#backend,\n\t\t\t\tfiles: [...files],\n\t\t\t})\n\t\t\tthis.#handled = true\n\t\t} finally {\n\t\t\tthis.#handling = false\n\t\t}\n\t}\n\n\tasync cancel(): Promise<void> {\n\t\tthis.#assert()\n\t\tthis.#handling = true\n\t\ttry {\n\t\t\tawait this.#frame.send('DOM.setFileInputFiles', {\n\t\t\t\tbackendNodeId: this.#backend,\n\t\t\t\tfiles: [],\n\t\t\t})\n\t\t\tthis.#handled = true\n\t\t} finally {\n\t\t\tthis.#handling = false\n\t\t}\n\t}\n\n\t#assert(): void {\n\t\tif (this.#handled || this.#handling) {\n\t\t\tthrow new BrowserError('Browser file chooser is already handled')\n\t\t}\n\t}\n}\n","import type {\n\tBrowserHAR,\n\tBrowserHAREntry,\n\tBrowserHARManagerInterface,\n\tBrowserHAROptions,\n\tBrowserHARPending,\n\tBrowserHARReplayOptions,\n\tBrowserNetworkManagerInterface,\n\tBrowserRequest,\n\tBrowserRequestFailure,\n\tBrowserResponse,\n\tBrowserRouteHandler,\n\tScreenshotWriterInterface,\n} from './types.js'\nimport { BROWSER_HAR_CREATOR } from './constants.js'\nimport {\n\tbrowserHARHeadersToRecord,\n\tcreateBrowserHAREntry,\n\tdecodeBase64,\n\ttextToBytes,\n\tvalidateBrowserHAR,\n} from './helpers.js'\nimport { BrowserError } from './errors.js'\n\n/**\n * HTTP archive recording and replay over one page network manager.\n */\nexport class BrowserHARManager implements BrowserHARManagerInterface {\n\treadonly #network: BrowserNetworkManagerInterface\n\treadonly #writer: ScreenshotWriterInterface | undefined\n\treadonly #pending: Map<string, BrowserHARPending> = new Map()\n\treadonly #entries: BrowserHAREntry[] = []\n\treadonly #tasks: Set<Promise<void>> = new Set()\n\t#options: BrowserHAROptions | undefined\n\t#recording = false\n\t#failure: unknown\n\t#archive: BrowserHAR | undefined\n\t#fallback = false\n\treadonly #requestHandler = this.#handleRequest.bind(this)\n\treadonly #responseHandler = this.#handleResponse.bind(this)\n\treadonly #failureHandler = this.#handleFailure.bind(this)\n\treadonly #finishHandler = this.#handleFinish.bind(this)\n\treadonly #replayHandler: BrowserRouteHandler = this.#handleReplay.bind(this)\n\n\tconstructor(network: BrowserNetworkManagerInterface, writer?: ScreenshotWriterInterface) {\n\t\tthis.#network = network\n\t\tthis.#writer = writer\n\t}\n\n\tget recording(): boolean {\n\t\treturn this.#recording\n\t}\n\n\tasync start(options?: BrowserHAROptions): Promise<void> {\n\t\tif (this.#recording) return\n\t\tthis.#options = options\n\t\tthis.#entries.length = 0\n\t\tthis.#pending.clear()\n\t\tthis.#failure = undefined\n\t\tthis.#network.emitter.on('request', this.#requestHandler)\n\t\tthis.#network.emitter.on('response', this.#responseHandler)\n\t\tthis.#network.emitter.on('failure', this.#failureHandler)\n\t\tthis.#network.emitter.on('finish', this.#finishHandler)\n\t\tthis.#recording = true\n\t\ttry {\n\t\t\tawait this.#network.start()\n\t\t} catch (error) {\n\t\t\tthis.#recording = false\n\t\t\tthis.#network.emitter.off('request', this.#requestHandler)\n\t\t\tthis.#network.emitter.off('response', this.#responseHandler)\n\t\t\tthis.#network.emitter.off('failure', this.#failureHandler)\n\t\t\tthis.#network.emitter.off('finish', this.#finishHandler)\n\t\t\tthrow error\n\t\t}\n\t}\n\n\tasync stop(): Promise<BrowserHAR> {\n\t\tif (this.#recording) {\n\t\t\tthis.#recording = false\n\t\t\tthis.#network.emitter.off('request', this.#requestHandler)\n\t\t\tthis.#network.emitter.off('response', this.#responseHandler)\n\t\t\tthis.#network.emitter.off('failure', this.#failureHandler)\n\t\t\tthis.#network.emitter.off('finish', this.#finishHandler)\n\t\t\tawait Promise.allSettled([...this.#tasks])\n\t\t\tfor (const id of [...this.#pending.keys()]) {\n\t\t\t\tconst pending = this.#pending.get(id)\n\t\t\t\tif (pending === undefined) continue\n\t\t\t\tthis.#pending.delete(id)\n\t\t\t\tthis.#entries.push(\n\t\t\t\t\tcreateBrowserHAREntry(\n\t\t\t\t\t\tpending,\n\t\t\t\t\t\tMath.max(0, Date.now() - pending.started),\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t'Request was incomplete when recording stopped',\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\t\tif (this.#failure !== undefined) {\n\t\t\tthrow new BrowserError('Browser HAR recording failed', 'BROWSER_HAR_ERROR', {\n\t\t\t\terror: this.#failure,\n\t\t\t})\n\t\t}\n\t\tconst har: BrowserHAR = {\n\t\t\tlog: {\n\t\t\t\tversion: '1.2',\n\t\t\t\tcreator: BROWSER_HAR_CREATOR,\n\t\t\t\tentries: [...this.#entries],\n\t\t\t},\n\t\t}\n\t\tif (this.#options?.path !== undefined) {\n\t\t\tif (this.#writer === undefined) {\n\t\t\t\tthrow new BrowserError('Browser HAR path requires a configured writer')\n\t\t\t}\n\t\t\tawait this.#writer.write(this.#options.path, textToBytes(JSON.stringify(har, undefined, 2)))\n\t\t}\n\t\treturn har\n\t}\n\n\tasync replay(har: BrowserHAR, options?: BrowserHARReplayOptions): Promise<void> {\n\t\tvalidateBrowserHAR(har)\n\t\tif (this.#archive !== undefined) await this.#network.unroute(this.#replayHandler)\n\t\tthis.#archive = har\n\t\tthis.#fallback = options?.fallback === true\n\t\ttry {\n\t\t\tawait this.#network.route({}, this.#replayHandler)\n\t\t} catch (error) {\n\t\t\tthis.#archive = undefined\n\t\t\tthis.#fallback = false\n\t\t\tthrow error\n\t\t}\n\t}\n\n\tasync clear(): Promise<void> {\n\t\tif (this.#recording) await this.stop()\n\t\tconst replaying = this.#archive !== undefined\n\t\tthis.#archive = undefined\n\t\tthis.#fallback = false\n\t\tif (replaying) await this.#network.unroute(this.#replayHandler)\n\t\tthis.#entries.length = 0\n\t\tthis.#pending.clear()\n\t}\n\n\t#handleRequest(request: BrowserRequest): void {\n\t\tif (!this.#recording) return\n\t\tthis.#pending.set(request.id, {\n\t\t\trequest,\n\t\t\tstarted: request.walltime === undefined ? Date.now() : request.walltime * 1000,\n\t\t\tresponse: undefined,\n\t\t})\n\t}\n\n\t#handleResponse(response: BrowserResponse): void {\n\t\tconst pending = this.#pending.get(response.id)\n\t\tif (pending === undefined) return\n\t\tthis.#pending.set(response.id, {\n\t\t\trequest: pending.request,\n\t\t\tstarted: pending.started,\n\t\t\tresponse,\n\t\t})\n\t}\n\n\t#handleFailure(failure: BrowserRequestFailure): void {\n\t\tconst pending = this.#pending.get(failure.id)\n\t\tif (pending === undefined) return\n\t\tthis.#pending.delete(failure.id)\n\t\tthis.#entries.push(\n\t\t\tcreateBrowserHAREntry(\n\t\t\t\tpending,\n\t\t\t\tMath.max(0, Date.now() - pending.started),\n\t\t\t\tundefined,\n\t\t\t\tfailure.error,\n\t\t\t),\n\t\t)\n\t}\n\n\t#handleFinish(id: string): void {\n\t\tthis.#track(this.#complete(id))\n\t}\n\n\tasync #handleReplay(route: Parameters<BrowserRouteHandler>[0]): Promise<void> {\n\t\tconst entry = this.#archive?.log.entries.find(\n\t\t\t(candidate) =>\n\t\t\t\tcandidate.request.url === route.request.url &&\n\t\t\t\tcandidate.request.method === route.request.method,\n\t\t)\n\t\tif (entry === undefined || entry.response.status === 0) {\n\t\t\tif (this.#fallback) await route.continue()\n\t\t\telse await route.abort('Failed')\n\t\t\treturn\n\t\t}\n\t\tconst body =\n\t\t\tentry.response.content.text === undefined\n\t\t\t\t? undefined\n\t\t\t\t: entry.response.content.encoding === 'base64'\n\t\t\t\t\t? decodeBase64(entry.response.content.text)\n\t\t\t\t\t: entry.response.content.text\n\t\tawait route.fulfill({\n\t\t\tstatus: entry.response.status,\n\t\t\tphrase: entry.response.statusText,\n\t\t\theaders: browserHARHeadersToRecord(entry.response.headers),\n\t\t\t...(body !== undefined ? { body } : {}),\n\t\t})\n\t}\n\n\tasync #complete(id: string): Promise<void> {\n\t\tconst pending = this.#pending.get(id)\n\t\tif (pending === undefined) return\n\t\tthis.#pending.delete(id)\n\t\tlet body: Uint8Array | undefined\n\t\tif (this.#options?.content === true && pending.response !== undefined) {\n\t\t\ttry {\n\t\t\t\tbody = await this.#network.body(id)\n\t\t\t} catch {\n\t\t\t\t// Some redirects, cached resources, and protocol errors have no retrievable body.\n\t\t\t}\n\t\t}\n\t\tthis.#entries.push(\n\t\t\tcreateBrowserHAREntry(pending, Math.max(0, Date.now() - pending.started), body),\n\t\t)\n\t}\n\n\t#track(task: Promise<void>): void {\n\t\tthis.#tasks.add(task)\n\t\tvoid task\n\t\t\t.catch((error: unknown) => {\n\t\t\t\tif (this.#failure === undefined) this.#failure = error\n\t\t\t})\n\t\t\t.finally(() => this.#tasks.delete(task))\n\t}\n}\n","import type {\n\tBrowserFrameInterface,\n\tBrowserRequest,\n\tBrowserRouteContinueOptions,\n\tBrowserRouteFulfillOptions,\n\tBrowserRouteInterface,\n} from './types.js'\nimport { browserHeadersToProtocol, encodeBase64, textToBytes } from './helpers.js'\nimport { BrowserError } from './errors.js'\nimport { isInteger, isString } from '@orkestrel/contract'\n\n/**\n * One paused request that can be aborted, continued, or fulfilled exactly once.\n */\nexport class BrowserRoute implements BrowserRouteInterface {\n\treadonly #frame: BrowserFrameInterface\n\treadonly #id: string\n\treadonly #request: BrowserRequest\n\t#handled = false\n\t#handling = false\n\n\tconstructor(frame: BrowserFrameInterface, id: string, request: BrowserRequest) {\n\t\tthis.#frame = frame\n\t\tthis.#id = id\n\t\tthis.#request = request\n\t}\n\n\tget id(): string {\n\t\treturn this.#id\n\t}\n\n\tget request(): BrowserRequest {\n\t\treturn this.#request\n\t}\n\n\tget handled(): boolean {\n\t\treturn this.#handled\n\t}\n\n\tasync abort(reason = 'Failed'): Promise<void> {\n\t\tthis.#assert()\n\t\tthis.#handling = true\n\t\ttry {\n\t\t\tawait this.#frame.send('Fetch.failRequest', {\n\t\t\t\trequestId: this.#id,\n\t\t\t\terrorReason: reason,\n\t\t\t})\n\t\t\tthis.#handled = true\n\t\t} finally {\n\t\t\tthis.#handling = false\n\t\t}\n\t}\n\n\tasync continue(options?: BrowserRouteContinueOptions): Promise<void> {\n\t\tthis.#assert()\n\t\tconst params: Record<string, unknown> = { requestId: this.#id }\n\t\tif (options?.url !== undefined) params['url'] = options.url\n\t\tif (options?.method !== undefined) params['method'] = options.method\n\t\tif (options?.headers !== undefined) {\n\t\t\tparams['headers'] = browserHeadersToProtocol(options.headers)\n\t\t}\n\t\tif (options?.post !== undefined) {\n\t\t\tparams['postData'] = encodeBase64(textToBytes(options.post))\n\t\t}\n\t\tthis.#handling = true\n\t\ttry {\n\t\t\tawait this.#frame.send('Fetch.continueRequest', params)\n\t\t\tthis.#handled = true\n\t\t} finally {\n\t\t\tthis.#handling = false\n\t\t}\n\t}\n\n\tasync fulfill(options: BrowserRouteFulfillOptions): Promise<void> {\n\t\tthis.#assert()\n\t\tconst status = options.status ?? 200\n\t\tif (!isInteger(status) || status < 100 || status > 999) {\n\t\t\tthrow new BrowserError('Browser route status must be an integer from 100 to 999', undefined, {\n\t\t\t\tstatus,\n\t\t\t})\n\t\t}\n\t\tconst params: Record<string, unknown> = {\n\t\t\trequestId: this.#id,\n\t\t\tresponseCode: status,\n\t\t}\n\t\tif (options.phrase !== undefined) params['responsePhrase'] = options.phrase\n\t\tif (options.headers !== undefined) {\n\t\t\tparams['responseHeaders'] = browserHeadersToProtocol(options.headers)\n\t\t}\n\t\tif (options.body !== undefined) {\n\t\t\tparams['body'] = encodeBase64(\n\t\t\t\tisString(options.body) ? textToBytes(options.body) : options.body,\n\t\t\t)\n\t\t}\n\t\tthis.#handling = true\n\t\ttry {\n\t\t\tawait this.#frame.send('Fetch.fulfillRequest', params)\n\t\t\tthis.#handled = true\n\t\t} finally {\n\t\t\tthis.#handling = false\n\t\t}\n\t}\n\n\t#assert(): void {\n\t\tif (this.#handled || this.#handling) throw new BrowserError('Browser route is already handled')\n\t}\n}\n","import type {\n\tBrowserWebSocketEventMap,\n\tBrowserWebSocketFrame,\n\tBrowserWebSocketInterface,\n} from './types.js'\nimport type { EmitterInterface } from '@orkestrel/emitter'\nimport { Emitter } from '@orkestrel/emitter'\n\n/**\n * Observable WebSocket connection reconstructed from Network-domain events.\n */\nexport class BrowserWebSocket implements BrowserWebSocketInterface {\n\treadonly #emitter: Emitter<BrowserWebSocketEventMap>\n\treadonly #id: string\n\treadonly #url: string\n\t#closed = false\n\n\tconstructor(id: string, url: string) {\n\t\tthis.#id = id\n\t\tthis.#url = url\n\t\tthis.#emitter = new Emitter()\n\t}\n\n\tget emitter(): EmitterInterface<BrowserWebSocketEventMap> {\n\t\treturn this.#emitter\n\t}\n\n\tget id(): string {\n\t\treturn this.#id\n\t}\n\n\tget url(): string {\n\t\treturn this.#url\n\t}\n\n\treceive(frame: BrowserWebSocketFrame): void {\n\t\tif (!this.#closed) this.#emitter.emit('receive', frame)\n\t}\n\n\ttransmit(frame: BrowserWebSocketFrame): void {\n\t\tif (!this.#closed) this.#emitter.emit('transmit', frame)\n\t}\n\n\tfail(message: string): void {\n\t\tif (!this.#closed) this.#emitter.emit('error', message)\n\t}\n\n\tclose(timestamp: number): void {\n\t\tif (this.#closed) return\n\t\tthis.#closed = true\n\t\tthis.#emitter.emit('close', timestamp)\n\t\tthis.#emitter.destroy()\n\t}\n}\n","import type {\n\tBrowserCredentials,\n\tBrowserFrameInterface,\n\tBrowserHARManagerInterface,\n\tBrowserNetworkEventMap,\n\tBrowserNetworkManagerInterface,\n\tBrowserRouteDefinition,\n\tBrowserRouteHandler,\n\tBrowserRouteQuery,\n\tScreenshotWriterInterface,\n} from './types.js'\nimport type { EmitterInterface } from '@orkestrel/emitter'\nimport { BrowserHARManager } from './BrowserHARManager.js'\nimport { BrowserRoute } from './BrowserRoute.js'\nimport { BrowserWebSocket } from './BrowserWebSocket.js'\nimport {\n\tbytesToText,\n\tdecodeBase64,\n\tmatchesBrowserRoute,\n\treadBrowserRequest,\n\treadBrowserRequestFailure,\n\treadBrowserResponse,\n\treadBrowserWebSocketFrame,\n\ttextToBytes,\n} from './helpers.js'\nimport { BrowserError } from './errors.js'\nimport { attempt, isFiniteNumber, isRecord, isString } from '@orkestrel/contract'\nimport { Emitter } from '@orkestrel/emitter'\n\n/**\n * Page-scoped Network and Fetch domain lifecycle.\n */\nexport class BrowserNetworkManager implements BrowserNetworkManagerInterface {\n\treadonly #frame: BrowserFrameInterface\n\treadonly #emitter: Emitter<BrowserNetworkEventMap>\n\treadonly #har: BrowserHARManager\n\treadonly #routes: BrowserRouteDefinition[] = []\n\treadonly #sockets: Map<string, BrowserWebSocket> = new Map()\n\t#credentials: BrowserCredentials | undefined\n\t#started = false\n\t#fetch = false\n\t#destroyed = false\n\t#starting: Promise<void> | undefined\n\treadonly #requestHandler = this.#handleRequest.bind(this)\n\treadonly #responseHandler = this.#handleResponse.bind(this)\n\treadonly #failureHandler = this.#handleFailure.bind(this)\n\treadonly #finishHandler = this.#handleFinish.bind(this)\n\treadonly #pausedHandler = this.#handlePause.bind(this)\n\treadonly #authHandler = this.#handleAuth.bind(this)\n\treadonly #socketHandler = this.#handleSocket.bind(this)\n\treadonly #socketReceiveHandler = this.#handleSocketReceive.bind(this)\n\treadonly #socketTransmitHandler = this.#handleSocketTransmit.bind(this)\n\treadonly #socketErrorHandler = this.#handleSocketError.bind(this)\n\treadonly #socketCloseHandler = this.#handleSocketClose.bind(this)\n\n\tconstructor(frame: BrowserFrameInterface, writer?: ScreenshotWriterInterface) {\n\t\tthis.#frame = frame\n\t\tthis.#emitter = new Emitter()\n\t\tthis.#har = new BrowserHARManager(this, writer)\n\t}\n\n\tget emitter(): EmitterInterface<BrowserNetworkEventMap> {\n\t\treturn this.#emitter\n\t}\n\n\tget har(): BrowserHARManagerInterface {\n\t\treturn this.#har\n\t}\n\n\tasync start(): Promise<void> {\n\t\tif (this.#destroyed) throw new BrowserError('Browser network manager is destroyed')\n\t\tif (this.#started) return\n\t\tconst active = this.#starting\n\t\tif (active !== undefined) {\n\t\t\tawait active\n\t\t\treturn\n\t\t}\n\t\tconst transition = this.#begin()\n\t\tthis.#starting = transition\n\t\ttry {\n\t\t\tawait transition\n\t\t} finally {\n\t\t\tif (this.#starting === transition) this.#starting = undefined\n\t\t}\n\t}\n\n\tasync body(id: string): Promise<Uint8Array> {\n\t\tawait this.start()\n\t\tconst result = await this.#frame.send('Network.getResponseBody', { requestId: id })\n\t\tif (!isRecord(result) || !isString(result['body'])) {\n\t\t\tthrow new BrowserError('Browser response body is malformed', undefined, { id })\n\t\t}\n\t\treturn result['base64Encoded'] === true\n\t\t\t? decodeBase64(result['body'])\n\t\t\t: textToBytes(result['body'])\n\t}\n\n\tasync text(id: string): Promise<string> {\n\t\treturn bytesToText(await this.body(id))\n\t}\n\n\tasync json(id: string): Promise<unknown> {\n\t\tconst text = await this.text(id)\n\t\tconst result = attempt<unknown>(() => JSON.parse(text))\n\t\tif (result.success) return result.value\n\t\tthrow new BrowserError('Browser response body is not valid JSON', 'BROWSER_JSON_ERROR', {\n\t\t\tid,\n\t\t\terror: result.error,\n\t\t})\n\t}\n\n\tasync route(query: BrowserRouteQuery, handler: BrowserRouteHandler): Promise<void> {\n\t\tawait this.start()\n\t\tconst definition = { query, handler }\n\t\tthis.#routes.push(definition)\n\t\ttry {\n\t\t\tawait this.#configure()\n\t\t} catch (error) {\n\t\t\tthis.#routes.splice(this.#routes.indexOf(definition), 1)\n\t\t\tthrow error\n\t\t}\n\t}\n\n\tasync unroute(handler?: BrowserRouteHandler): Promise<void> {\n\t\tif (handler === undefined) {\n\t\t\tthis.#routes.length = 0\n\t\t} else {\n\t\t\tfor (let index = this.#routes.length - 1; index >= 0; index -= 1) {\n\t\t\t\tif (this.#routes[index]?.handler === handler) this.#routes.splice(index, 1)\n\t\t\t}\n\t\t}\n\t\tif (this.#started && !this.#destroyed) await this.#configure()\n\t}\n\n\tasync headers(headers: Readonly<Record<string, string>>): Promise<void> {\n\t\tawait this.start()\n\t\tawait this.#frame.send('Network.setExtraHTTPHeaders', { headers })\n\t}\n\n\tasync offline(offline: boolean): Promise<void> {\n\t\tawait this.start()\n\t\tawait this.#frame.send('Network.emulateNetworkConditions', {\n\t\t\toffline,\n\t\t\tlatency: 0,\n\t\t\tdownloadThroughput: -1,\n\t\t\tuploadThroughput: -1,\n\t\t})\n\t}\n\n\tasync credentials(credentials?: BrowserCredentials): Promise<void> {\n\t\tawait this.start()\n\t\tconst previous = this.#credentials\n\t\tthis.#credentials = credentials\n\t\ttry {\n\t\t\tawait this.#configure()\n\t\t} catch (error) {\n\t\t\tthis.#credentials = previous\n\t\t\tthrow error\n\t\t}\n\t}\n\n\tasync destroy(): Promise<void> {\n\t\tif (this.#destroyed) return\n\t\tthis.#destroyed = true\n\t\tlet failed = false\n\t\tlet failure: unknown\n\t\ttry {\n\t\t\tawait this.#har.clear()\n\t\t} catch (error) {\n\t\t\tfailed = true\n\t\t\tfailure = error\n\t\t}\n\t\tif (this.#fetch) {\n\t\t\ttry {\n\t\t\t\tawait this.#frame.send('Fetch.disable')\n\t\t\t} catch (error) {\n\t\t\t\tif (!failed) {\n\t\t\t\t\tfailed = true\n\t\t\t\t\tfailure = error\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (this.#started) {\n\t\t\ttry {\n\t\t\t\tawait this.#frame.send('Network.disable')\n\t\t\t} catch (error) {\n\t\t\t\tif (!failed) {\n\t\t\t\t\tfailed = true\n\t\t\t\t\tfailure = error\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\ttry {\n\t\t\tawait this.#unsubscribe()\n\t\t} catch (error) {\n\t\t\tif (!failed) {\n\t\t\t\tfailed = true\n\t\t\t\tfailure = error\n\t\t\t}\n\t\t}\n\t\tfor (const socket of this.#sockets.values()) socket.close(Date.now() / 1000)\n\t\tthis.#sockets.clear()\n\t\tthis.#routes.length = 0\n\t\tthis.#emitter.destroy()\n\t\tif (failed) throw failure\n\t}\n\n\t#handleRequest(params: Readonly<Record<string, unknown>>): void {\n\t\tconst request = readBrowserRequest(params)\n\t\tif (request !== undefined) this.#emitter.emit('request', request)\n\t}\n\n\t#handleResponse(params: Readonly<Record<string, unknown>>): void {\n\t\tconst response = readBrowserResponse(params)\n\t\tif (response !== undefined) this.#emitter.emit('response', response)\n\t}\n\n\t#handleFailure(params: Readonly<Record<string, unknown>>): void {\n\t\tconst failure = readBrowserRequestFailure(params)\n\t\tif (failure !== undefined) this.#emitter.emit('failure', failure)\n\t}\n\n\t#handleFinish(params: Readonly<Record<string, unknown>>): void {\n\t\tif (isString(params['requestId'])) this.#emitter.emit('finish', params['requestId'])\n\t}\n\n\t#handlePause(params: Readonly<Record<string, unknown>>): void {\n\t\tvoid this.#route(params).catch(() => undefined)\n\t}\n\n\t#handleAuth(params: Readonly<Record<string, unknown>>): void {\n\t\tvoid this.#authenticate(params).catch(() => undefined)\n\t}\n\n\t#handleSocket(params: Readonly<Record<string, unknown>>): void {\n\t\tif (!isString(params['requestId']) || !isString(params['url'])) return\n\t\tconst socket = new BrowserWebSocket(params['requestId'], params['url'])\n\t\tthis.#sockets.set(socket.id, socket)\n\t\tthis.#emitter.emit('socket', socket)\n\t}\n\n\t#handleSocketReceive(params: Readonly<Record<string, unknown>>): void {\n\t\tconst socket = isString(params['requestId'])\n\t\t\t? this.#sockets.get(params['requestId'])\n\t\t\t: undefined\n\t\tconst frame = readBrowserWebSocketFrame(params)\n\t\tif (socket !== undefined && frame !== undefined) socket.receive(frame)\n\t}\n\n\t#handleSocketTransmit(params: Readonly<Record<string, unknown>>): void {\n\t\tconst socket = isString(params['requestId'])\n\t\t\t? this.#sockets.get(params['requestId'])\n\t\t\t: undefined\n\t\tconst frame = readBrowserWebSocketFrame(params)\n\t\tif (socket !== undefined && frame !== undefined) socket.transmit(frame)\n\t}\n\n\t#handleSocketError(params: Readonly<Record<string, unknown>>): void {\n\t\tconst socket = isString(params['requestId'])\n\t\t\t? this.#sockets.get(params['requestId'])\n\t\t\t: undefined\n\t\tif (socket !== undefined && isString(params['errorMessage']))\n\t\t\tsocket.fail(params['errorMessage'])\n\t}\n\n\t#handleSocketClose(params: Readonly<Record<string, unknown>>): void {\n\t\tif (!isString(params['requestId'])) return\n\t\tconst socket = this.#sockets.get(params['requestId'])\n\t\tif (socket === undefined) return\n\t\tthis.#sockets.delete(params['requestId'])\n\t\tsocket.close(isFiniteNumber(params['timestamp']) ? params['timestamp'] : Date.now() / 1000)\n\t}\n\n\tasync #begin(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.#subscribe()\n\t\t\tawait this.#frame.send('Network.enable')\n\t\t\tthis.#started = true\n\t\t\tawait this.#configure()\n\t\t} catch (error) {\n\t\t\tthis.#started = false\n\t\t\tthis.#fetch = false\n\t\t\tawait this.#frame.send('Fetch.disable').catch(() => undefined)\n\t\t\tawait this.#frame.send('Network.disable').catch(() => undefined)\n\t\t\tawait this.#unsubscribe().catch(() => undefined)\n\t\t\tthrow error\n\t\t}\n\t}\n\n\tasync #configure(): Promise<void> {\n\t\tconst enabled = this.#routes.length > 0 || this.#credentials !== undefined\n\t\tif (!enabled) {\n\t\t\tif (this.#fetch) {\n\t\t\t\tawait this.#frame.send('Fetch.disable')\n\t\t\t\tthis.#fetch = false\n\t\t\t}\n\t\t\treturn\n\t\t}\n\t\tawait this.#frame.send('Fetch.enable', {\n\t\t\tpatterns: this.#routes.map((definition) => ({\n\t\t\t\turlPattern: definition.query.url ?? '*',\n\t\t\t\tresourceType: definition.query.resource,\n\t\t\t\trequestStage: 'Request',\n\t\t\t})),\n\t\t\thandleAuthRequests: this.#credentials !== undefined,\n\t\t})\n\t\tthis.#fetch = true\n\t}\n\n\tasync #route(params: Readonly<Record<string, unknown>>): Promise<void> {\n\t\tconst request = readBrowserRequest(params)\n\t\tif (request === undefined) {\n\t\t\tif (isString(params['requestId'])) {\n\t\t\t\tawait this.#frame.send('Fetch.failRequest', {\n\t\t\t\t\trequestId: params['requestId'],\n\t\t\t\t\terrorReason: 'Failed',\n\t\t\t\t})\n\t\t\t}\n\t\t\treturn\n\t\t}\n\t\tconst definition = this.#routes.find((candidate) =>\n\t\t\tmatchesBrowserRoute(request, candidate.query),\n\t\t)\n\t\tif (definition === undefined) {\n\t\t\tawait this.#frame.send('Fetch.continueRequest', { requestId: request.id })\n\t\t\treturn\n\t\t}\n\t\tconst route = new BrowserRoute(this.#frame, request.id, request)\n\t\ttry {\n\t\t\tawait definition.handler(route)\n\t\t\tif (!route.handled) await route.continue()\n\t\t} catch {\n\t\t\tif (!route.handled) await route.abort('Failed').catch(() => undefined)\n\t\t}\n\t}\n\n\tasync #authenticate(params: Readonly<Record<string, unknown>>): Promise<void> {\n\t\tconst id = params['requestId']\n\t\tif (!isString(id)) return\n\t\tconst credentials = this.#credentials\n\t\tawait this.#frame.send('Fetch.continueWithAuth', {\n\t\t\trequestId: id,\n\t\t\tauthChallengeResponse:\n\t\t\t\tcredentials === undefined\n\t\t\t\t\t? { response: 'Default' }\n\t\t\t\t\t: {\n\t\t\t\t\t\t\tresponse: 'ProvideCredentials',\n\t\t\t\t\t\t\tusername: credentials.username,\n\t\t\t\t\t\t\tpassword: credentials.password,\n\t\t\t\t\t\t},\n\t\t})\n\t}\n\n\tasync #subscribe(): Promise<void> {\n\t\tawait this.#frame.subscribe('Network.requestWillBeSent', this.#requestHandler)\n\t\tawait this.#frame.subscribe('Network.responseReceived', this.#responseHandler)\n\t\tawait this.#frame.subscribe('Network.loadingFailed', this.#failureHandler)\n\t\tawait this.#frame.subscribe('Network.loadingFinished', this.#finishHandler)\n\t\tawait this.#frame.subscribe('Fetch.requestPaused', this.#pausedHandler)\n\t\tawait this.#frame.subscribe('Fetch.authRequired', this.#authHandler)\n\t\tawait this.#frame.subscribe('Network.webSocketCreated', this.#socketHandler)\n\t\tawait this.#frame.subscribe('Network.webSocketFrameReceived', this.#socketReceiveHandler)\n\t\tawait this.#frame.subscribe('Network.webSocketFrameSent', this.#socketTransmitHandler)\n\t\tawait this.#frame.subscribe('Network.webSocketFrameError', this.#socketErrorHandler)\n\t\tawait this.#frame.subscribe('Network.webSocketClosed', this.#socketCloseHandler)\n\t}\n\n\tasync #unsubscribe(): Promise<void> {\n\t\tawait this.#frame.unsubscribe('Network.requestWillBeSent', this.#requestHandler)\n\t\tawait this.#frame.unsubscribe('Network.responseReceived', this.#responseHandler)\n\t\tawait this.#frame.unsubscribe('Network.loadingFailed', this.#failureHandler)\n\t\tawait this.#frame.unsubscribe('Network.loadingFinished', this.#finishHandler)\n\t\tawait this.#frame.unsubscribe('Fetch.requestPaused', this.#pausedHandler)\n\t\tawait this.#frame.unsubscribe('Fetch.authRequired', this.#authHandler)\n\t\tawait this.#frame.unsubscribe('Network.webSocketCreated', this.#socketHandler)\n\t\tawait this.#frame.unsubscribe('Network.webSocketFrameReceived', this.#socketReceiveHandler)\n\t\tawait this.#frame.unsubscribe('Network.webSocketFrameSent', this.#socketTransmitHandler)\n\t\tawait this.#frame.unsubscribe('Network.webSocketFrameError', this.#socketErrorHandler)\n\t\tawait this.#frame.unsubscribe('Network.webSocketClosed', this.#socketCloseHandler)\n\t}\n}\n","import type {\n\tBrowserNavigationManagerInterface,\n\tBrowserNavigationWait,\n\tBrowserNavigationWaitOptions,\n\tBrowserPageInterface,\n} from './types.js'\nimport { BROWSER_DEFAULT_TIMEOUT_MS, BROWSER_WAIT_POLL_INTERVAL_MS } from './constants.js'\nimport {\n\tcompileFunctionWaitExpression,\n\tmatchesBrowserURL,\n\tvalidateBrowserTimeout,\n} from './helpers.js'\nimport { BrowserError } from './errors.js'\n\n/**\n * URL and page-predicate waits resilient to ordinary navigation events.\n */\nexport class BrowserNavigationManager implements BrowserNavigationManagerInterface {\n\treadonly #page: BrowserPageInterface\n\treadonly #waits: Map<symbol, BrowserNavigationWait> = new Map()\n\treadonly #navigateHandler = this.#handleNavigate.bind(this)\n\treadonly #closeHandler = this.#handleClose.bind(this)\n\n\tconstructor(page: BrowserPageInterface) {\n\t\tthis.#page = page\n\t\tthis.#page.emitter.on('navigate', this.#navigateHandler)\n\t\tthis.#page.emitter.on('close', this.#closeHandler)\n\t}\n\n\tasync wait(pattern: string, options?: BrowserNavigationWaitOptions): Promise<string> {\n\t\tconst timeout = this.#timeout(options)\n\t\tif (matchesBrowserURL(this.#page.url, pattern)) return this.#page.url\n\t\tconst deferred = Promise.withResolvers<string>()\n\t\tconst id = Symbol(pattern)\n\t\tconst timer = setTimeout(() => {\n\t\t\tthis.#waits.delete(id)\n\t\t\tdeferred.reject(\n\t\t\t\tnew BrowserError('Browser URL wait timed out', 'BROWSER_NAVIGATION_TIMEOUT', {\n\t\t\t\t\tpattern,\n\t\t\t\t\ttimeout,\n\t\t\t\t}),\n\t\t\t)\n\t\t}, timeout)\n\t\tthis.#waits.set(id, {\n\t\t\tpattern,\n\t\t\ttimer,\n\t\t\tresolve: deferred.resolve,\n\t\t\treject: deferred.reject,\n\t\t})\n\t\treturn await deferred.promise\n\t}\n\n\tasync until(expression: string, options?: BrowserNavigationWaitOptions): Promise<unknown> {\n\t\tconst timeout = this.#timeout(options)\n\t\tconst result = await this.#page.evaluate(\n\t\t\tcompileFunctionWaitExpression(expression, timeout),\n\t\t\ttimeout + BROWSER_WAIT_POLL_INTERVAL_MS,\n\t\t)\n\t\tif (result !== false) return result\n\t\tthrow new BrowserError('Browser predicate wait timed out', 'BROWSER_NAVIGATION_TIMEOUT', {\n\t\t\texpression,\n\t\t\ttimeout,\n\t\t})\n\t}\n\n\t#handleNavigate(url: string): void {\n\t\tfor (const [id, wait] of this.#waits) {\n\t\t\tif (!matchesBrowserURL(url, wait.pattern)) continue\n\t\t\tclearTimeout(wait.timer)\n\t\t\tthis.#waits.delete(id)\n\t\t\twait.resolve(url)\n\t\t}\n\t}\n\n\t#handleClose(): void {\n\t\tfor (const [id, wait] of this.#waits) {\n\t\t\tclearTimeout(wait.timer)\n\t\t\tthis.#waits.delete(id)\n\t\t\twait.reject(new BrowserError('Browser URL wait ended because the page closed'))\n\t\t}\n\t}\n\n\t#timeout(options?: BrowserNavigationWaitOptions): number {\n\t\tconst timeout = options?.timeout ?? BROWSER_DEFAULT_TIMEOUT_MS\n\t\tvalidateBrowserTimeout(timeout)\n\t\treturn timeout\n\t}\n}\n","import type {\n\tBrowserBindingHandler,\n\tBrowserFrameInterface,\n\tBrowserScriptEntry,\n\tBrowserScriptManagerInterface,\n} from './types.js'\nimport {\n\tcompileBrowserBindingCleanup,\n\tcompileBrowserBindingSource,\n\tcompileBrowserBindingResult,\n\treadBrowserBindingCall,\n\treadBrowserScriptIdentifier,\n} from './helpers.js'\nimport { BrowserError } from './errors.js'\n\n/**\n * New-document scripts and promise-based host functions for one page.\n */\nexport class BrowserScriptManager implements BrowserScriptManagerInterface {\n\treadonly #frame: BrowserFrameInterface\n\treadonly #bindings: Map<string, BrowserBindingHandler> = new Map()\n\treadonly #scripts: Map<string, BrowserScriptEntry> = new Map()\n\t#subscribed = false\n\t#destroyed = false\n\treadonly #bindingHandler = this.#handleBinding.bind(this)\n\n\tconstructor(frame: BrowserFrameInterface) {\n\t\tthis.#frame = frame\n\t}\n\n\tasync add(source: string): Promise<string> {\n\t\tthis.#assert()\n\t\tconst result = await this.#frame.send('Page.addScriptToEvaluateOnNewDocument', { source })\n\t\tconst id = readBrowserScriptIdentifier(result)\n\t\tthis.#scripts.set(id, { source, binding: undefined })\n\t\ttry {\n\t\t\tawait this.#frame.evaluate(`(() => { ${source}\\n })()`)\n\t\t\treturn id\n\t\t} catch (error) {\n\t\t\tawait this.#frame\n\t\t\t\t.send('Page.removeScriptToEvaluateOnNewDocument', { identifier: id })\n\t\t\t\t.catch(() => undefined)\n\t\t\tthis.#scripts.delete(id)\n\t\t\tthrow error\n\t\t}\n\t}\n\n\tasync remove(id: string): Promise<void> {\n\t\tthis.#assert()\n\t\tif (!this.#scripts.has(id)) return\n\t\tawait this.#frame.send('Page.removeScriptToEvaluateOnNewDocument', { identifier: id })\n\t\tthis.#scripts.delete(id)\n\t}\n\n\tasync expose(name: string, handler: BrowserBindingHandler): Promise<void> {\n\t\tthis.#assert()\n\t\tif (!/^[$A-Z_a-z][$\\w]*$/.test(name)) {\n\t\t\tthrow new BrowserError(\n\t\t\t\t'Browser binding name must be a valid JavaScript identifier',\n\t\t\t\tundefined,\n\t\t\t\t{\n\t\t\t\t\tname,\n\t\t\t\t},\n\t\t\t)\n\t\t}\n\t\tif (this.#bindings.has(name)) {\n\t\t\tthrow new BrowserError('Browser binding already exists', undefined, { name })\n\t\t}\n\t\tconst subscribed = this.#subscribed\n\t\tif (!subscribed) {\n\t\t\tawait this.#frame.subscribe('Runtime.bindingCalled', this.#bindingHandler)\n\t\t\tthis.#subscribed = true\n\t\t}\n\t\tlet added = false\n\t\ttry {\n\t\t\tawait this.#frame.send('Runtime.addBinding', { name })\n\t\t\tadded = true\n\t\t\tconst id = await this.add(compileBrowserBindingSource(name))\n\t\t\tconst entry = this.#scripts.get(id)\n\t\t\tif (entry === undefined) {\n\t\t\t\tthrow new BrowserError('Browser binding script registration was lost', undefined, {\n\t\t\t\t\tname,\n\t\t\t\t})\n\t\t\t}\n\t\t\tthis.#scripts.set(id, { source: entry.source, binding: name })\n\t\t\tthis.#bindings.set(name, handler)\n\t\t} catch (error) {\n\t\t\tif (added) {\n\t\t\t\tawait this.#frame.send('Runtime.removeBinding', { name }).catch(() => undefined)\n\t\t\t}\n\t\t\tif (!subscribed && this.#bindings.size === 0) {\n\t\t\t\tawait this.#frame\n\t\t\t\t\t.unsubscribe('Runtime.bindingCalled', this.#bindingHandler)\n\t\t\t\t\t.catch(() => undefined)\n\t\t\t\tthis.#subscribed = false\n\t\t\t}\n\t\t\tthrow error\n\t\t}\n\t}\n\n\tasync revoke(name: string): Promise<void> {\n\t\tthis.#assert()\n\t\tif (!this.#bindings.has(name)) return\n\t\tfor (const [id, entry] of this.#scripts) {\n\t\t\tif (entry.binding !== name) continue\n\t\t\tawait this.#frame.send('Page.removeScriptToEvaluateOnNewDocument', { identifier: id })\n\t\t\tthis.#scripts.delete(id)\n\t\t}\n\t\tawait this.#frame.evaluate(compileBrowserBindingCleanup(name))\n\t\tawait this.#frame.send('Runtime.removeBinding', { name })\n\t\tthis.#bindings.delete(name)\n\t}\n\n\tasync destroy(): Promise<void> {\n\t\tif (this.#destroyed) return\n\t\tfor (const name of [...this.#bindings.keys()]) {\n\t\t\tawait this.revoke(name).catch(() => undefined)\n\t\t}\n\t\tfor (const id of [...this.#scripts.keys()]) {\n\t\t\tawait this.remove(id).catch(() => undefined)\n\t\t}\n\t\tif (this.#subscribed) {\n\t\t\tawait this.#frame\n\t\t\t\t.unsubscribe('Runtime.bindingCalled', this.#bindingHandler)\n\t\t\t\t.catch(() => undefined)\n\t\t}\n\t\tthis.#subscribed = false\n\t\tthis.#destroyed = true\n\t}\n\n\tasync #call(params: Readonly<Record<string, unknown>>): Promise<void> {\n\t\tconst call = readBrowserBindingCall(params)\n\t\tif (call === undefined) return\n\t\tconst handler = this.#bindings.get(call.name)\n\t\tif (handler === undefined) return\n\t\ttry {\n\t\t\tconst value = await handler(...call.args)\n\t\t\tawait this.#frame.send('Runtime.evaluate', {\n\t\t\t\texpression: compileBrowserBindingResult(call.name, call.id, true, value),\n\t\t\t\tcontextId: call.context,\n\t\t\t\tawaitPromise: true,\n\t\t\t})\n\t\t} catch (error) {\n\t\t\tawait this.#frame.send('Runtime.evaluate', {\n\t\t\t\texpression: compileBrowserBindingResult(call.name, call.id, false, String(error)),\n\t\t\t\tcontextId: call.context,\n\t\t\t\tawaitPromise: true,\n\t\t\t})\n\t\t}\n\t}\n\n\t#handleBinding(params: Readonly<Record<string, unknown>>): void {\n\t\tvoid this.#call(params).catch(() => undefined)\n\t}\n\n\t#assert(): void {\n\t\tif (this.#destroyed) throw new BrowserError('Browser script manager is destroyed')\n\t}\n}\n","import type {\n\tBrowserDocument,\n\tBrowserNode,\n\tBrowserNodePredicate,\n\tBrowserNodeQuery,\n\tBrowserSiblingRelation,\n\tBrowserSnapshotInput,\n\tBrowserSnapshotInterface,\n\tBrowserWalkOptions,\n} from './types.js'\nimport { isInteger } from '@orkestrel/contract'\nimport { BrowserError } from './errors.js'\nimport { isBrowserNodeQuery, matchesBrowserNode } from './helpers.js'\n\n/** A navigable, serializable browser DOM snapshot. */\nexport class BrowserSnapshot implements BrowserSnapshotInterface {\n\t// Documents are fixed and frozen at construction, so the derived owner index cannot go stale.\n\t#owners: ReadonlyMap<number, BrowserNode> | undefined\n\treadonly documents: readonly BrowserDocument[]\n\treadonly styles: readonly string[]\n\n\tconstructor(input: BrowserSnapshotInput) {\n\t\tthis.documents = Object.freeze([...input.documents])\n\t\tthis.styles = Object.freeze([...input.styles])\n\t}\n\n\twalk(options?: BrowserWalkOptions): Generator<BrowserNode, void, unknown> {\n\t\treturn options?.order === 'breadth' ? this.#breadth(options.root) : this.#depth(options?.root)\n\t}\n\n\t*descendants(node: BrowserNode): Generator<BrowserNode, void, unknown> {\n\t\tlet first = true\n\t\tfor (const descendant of this.#depth(node)) {\n\t\t\tif (first) {\n\t\t\t\tfirst = false\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tyield descendant\n\t\t}\n\t}\n\n\tdocument(node: BrowserNode): BrowserDocument | undefined {\n\t\treturn this.documents.find((document) => document.index === node.document)\n\t}\n\n\tchildren(node: BrowserNode): readonly BrowserNode[] {\n\t\tconst document = this.document(node)\n\t\tif (document === undefined) return []\n\t\tconst children = document.nodes.filter((candidate) => candidate.parent === node.index)\n\t\tif (node.content === undefined) return children\n\t\tconst content = this.documents.find((candidate) => candidate.index === node.content)\n\t\tif (content === undefined) return children\n\t\treturn [...children, ...content.nodes.filter((candidate) => candidate.parent === undefined)]\n\t}\n\n\tparent(node: BrowserNode): BrowserNode | undefined {\n\t\tconst document = this.document(node)\n\t\tif (document === undefined) return undefined\n\t\treturn node.parent === undefined ? this.#owner(node.document) : document.nodes[node.parent]\n\t}\n\n\tsiblings(node: BrowserNode, relation?: BrowserSiblingRelation): readonly BrowserNode[] {\n\t\tconst candidates = this.#candidates(node)\n\t\tconst index = candidates.findIndex(\n\t\t\t(candidate) => candidate.document === node.document && candidate.index === node.index,\n\t\t)\n\t\tif (relation === 'preceding') return index < 0 ? [] : candidates.slice(0, index)\n\t\tif (relation === 'following') return index < 0 ? [] : candidates.slice(index + 1)\n\t\treturn candidates.filter(\n\t\t\t(candidate) => candidate.document !== node.document || candidate.index !== node.index,\n\t\t)\n\t}\n\n\tancestors(node: BrowserNode): readonly BrowserNode[] {\n\t\tconst ancestors: BrowserNode[] = []\n\t\tconst visited = new Set<string>()\n\t\tlet current = node\n\n\t\twhile (true) {\n\t\t\tconst parent = this.parent(current)\n\t\t\tif (parent === undefined) break\n\t\t\tconst identity = this.#identity(parent)\n\t\t\tif (visited.has(identity)) break\n\t\t\tvisited.add(identity)\n\t\t\tancestors.push(parent)\n\t\t\tcurrent = parent\n\t\t}\n\t\treturn ancestors\n\t}\n\n\tcommon(first: BrowserNode, second: BrowserNode): BrowserNode | undefined {\n\t\tconst firstAncestors = this.#chain(first)\n\t\tconst secondAncestors = this.#chain(second)\n\t\tconst identities = new Set(firstAncestors.map((node) => this.#identity(node)))\n\t\treturn secondAncestors.find((node) => identities.has(this.#identity(node)))\n\t}\n\n\tdistance(first: BrowserNode, second: BrowserNode): number | undefined {\n\t\tconst common = this.common(first, second)\n\t\tif (common === undefined) return undefined\n\t\tconst identity = this.#identity(common)\n\t\tconst firstDistance = this.#chain(first).findIndex((node) => this.#identity(node) === identity)\n\t\tconst secondDistance = this.#chain(second).findIndex(\n\t\t\t(node) => this.#identity(node) === identity,\n\t\t)\n\t\tif (firstDistance < 0 || secondDistance < 0) return undefined\n\t\treturn firstDistance + secondDistance\n\t}\n\n\tfind(query: BrowserNodeQuery | BrowserNodePredicate): BrowserNode | undefined {\n\t\tfor (const node of this.walk()) {\n\t\t\tif (this.#match(node, query)) return node\n\t\t}\n\t\treturn undefined\n\t}\n\n\tfilter(query: BrowserNodeQuery | BrowserNodePredicate, limit?: number): readonly BrowserNode[] {\n\t\tif (limit !== undefined && (!isInteger(limit) || limit < 0)) {\n\t\t\tthrow new BrowserError(\n\t\t\t\t'Browser node result limit must be a non-negative integer',\n\t\t\t\tundefined,\n\t\t\t\t{\n\t\t\t\t\tlimit,\n\t\t\t\t},\n\t\t\t)\n\t\t}\n\t\tif (limit === 0) return []\n\t\tconst found: BrowserNode[] = []\n\t\tfor (const node of this.walk()) {\n\t\t\tif (!this.#match(node, query)) continue\n\t\t\tfound.push(node)\n\t\t\tif (limit !== undefined && found.length >= limit) break\n\t\t}\n\t\treturn found\n\t}\n\n\tclosest(\n\t\tnode: BrowserNode,\n\t\tquery: BrowserNodeQuery | BrowserNodePredicate,\n\t): BrowserNode | undefined {\n\t\tif (this.#match(node, query)) return node\n\t\tfor (const ancestor of this.ancestors(node)) {\n\t\t\tif (this.#match(ancestor, query)) return ancestor\n\t\t}\n\t\treturn undefined\n\t}\n\n\tpath(node: BrowserNode): string {\n\t\tconst document = this.document(node)\n\t\tif (document === undefined) return `document:${node.document} > node:${node.index}`\n\t\tconst chain = [...this.ancestors(node)].reverse()\n\t\tchain.push(node)\n\t\tconst segments: string[] = []\n\n\t\tfor (const current of chain) {\n\t\t\tif (current.type !== 1) {\n\t\t\t\tsegments.push(`${current.name.toLowerCase()}:${current.index}`)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tlet ordinal = 1\n\t\t\tif (current.parent !== undefined) {\n\t\t\t\tconst owner = this.document(current)\n\t\t\t\tfor (const sibling of owner?.nodes ?? []) {\n\t\t\t\t\tif (sibling.index >= current.index) break\n\t\t\t\t\tif (sibling.parent === current.parent && sibling.name === current.name) ordinal += 1\n\t\t\t\t}\n\t\t\t}\n\t\t\tsegments.push(`${current.name.toLowerCase()}:${ordinal}`)\n\t\t}\n\n\t\treturn `frame(${JSON.stringify(document.frame)}) > ${segments.join(' > ')}`\n\t}\n\n\t#roots(): readonly BrowserNode[] {\n\t\tconst roots: BrowserNode[] = []\n\t\tfor (const document of this.documents) {\n\t\t\troots.push(...document.nodes.filter((node) => node.parent === undefined))\n\t\t}\n\t\tfor (const document of this.documents) roots.push(...document.nodes)\n\t\treturn roots\n\t}\n\n\t#owner(document: number): BrowserNode | undefined {\n\t\tconst owners = this.#owners\n\t\tif (owners !== undefined) return owners.get(document)\n\t\tconst index = new Map<number, BrowserNode>()\n\t\tfor (const node of this.walk()) {\n\t\t\tif (node.content !== undefined && !index.has(node.content)) index.set(node.content, node)\n\t\t}\n\t\tthis.#owners = index\n\t\treturn index.get(document)\n\t}\n\n\t*#depth(root?: BrowserNode): Generator<BrowserNode, void, unknown> {\n\t\tconst visited = new Set<string>()\n\t\tfor (const seed of root === undefined ? this.#roots() : [root]) {\n\t\t\tconst stack: BrowserNode[] = [seed]\n\t\t\twhile (stack.length > 0) {\n\t\t\t\tconst node = stack.pop()\n\t\t\t\tif (node === undefined) break\n\t\t\t\tconst identity = this.#identity(node)\n\t\t\t\tif (visited.has(identity)) continue\n\t\t\t\tvisited.add(identity)\n\t\t\t\tyield node\n\n\t\t\t\tconst children = this.children(node)\n\t\t\t\tfor (let index = children.length - 1; index >= 0; index -= 1) {\n\t\t\t\t\tconst child = children[index]\n\t\t\t\t\tif (child !== undefined) stack.push(child)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t*#breadth(root?: BrowserNode): Generator<BrowserNode, void, unknown> {\n\t\tconst visited = new Set<string>()\n\t\tfor (const seed of root === undefined ? this.#roots() : [root]) {\n\t\t\tconst queue: BrowserNode[] = [seed]\n\t\t\tlet cursor = 0\n\t\t\twhile (cursor < queue.length) {\n\t\t\t\tconst node = queue[cursor]\n\t\t\t\tcursor += 1\n\t\t\t\tif (node === undefined) continue\n\t\t\t\tconst identity = this.#identity(node)\n\t\t\t\tif (visited.has(identity)) continue\n\t\t\t\tvisited.add(identity)\n\t\t\t\tyield node\n\t\t\t\tqueue.push(...this.children(node))\n\t\t\t}\n\t\t}\n\t}\n\n\t#candidates(node: BrowserNode): readonly BrowserNode[] {\n\t\tconst parent = this.parent(node)\n\t\treturn parent === undefined\n\t\t\t? (this.document(node)?.nodes.filter((candidate) => candidate.parent === undefined) ?? [])\n\t\t\t: this.children(parent)\n\t}\n\n\t#chain(node: BrowserNode): readonly BrowserNode[] {\n\t\treturn [node, ...this.ancestors(node)]\n\t}\n\n\t#match(node: BrowserNode, query: BrowserNodeQuery | BrowserNodePredicate): boolean {\n\t\treturn isBrowserNodeQuery(query) ? matchesBrowserNode(node, query) : query(node)\n\t}\n\n\t#identity(node: BrowserNode): string {\n\t\treturn `${node.document}:${node.index}`\n\t}\n}\n","import type { BrowserWorkerCategory, BrowserWorkerInterface, CDPClientInterface } from './types.js'\nimport { BROWSER_RESULT_LIMIT } from './constants.js'\nimport { guardEvaluateExpression, readEvaluationResult } from './helpers.js'\nimport { BrowserError } from './errors.js'\n\n/**\n * Dedicated, shared, or service worker attached through a flattened target session.\n */\nexport class BrowserWorker implements BrowserWorkerInterface {\n\treadonly #client: CDPClientInterface\n\treadonly #session: string\n\treadonly #id: string\n\treadonly #url: string\n\treadonly #category: BrowserWorkerCategory\n\t#closed = false\n\n\tconstructor(\n\t\tclient: CDPClientInterface,\n\t\tsession: string,\n\t\tid: string,\n\t\turl: string,\n\t\tcategory: BrowserWorkerCategory,\n\t) {\n\t\tthis.#client = client\n\t\tthis.#session = session\n\t\tthis.#id = id\n\t\tthis.#url = url\n\t\tthis.#category = category\n\t}\n\n\tget id(): string {\n\t\treturn this.#id\n\t}\n\n\tget url(): string {\n\t\treturn this.#url\n\t}\n\n\tget category(): BrowserWorkerCategory {\n\t\treturn this.#category\n\t}\n\n\tasync evaluate(expression: string, timeout?: number): Promise<unknown> {\n\t\tthis.#assert()\n\t\treturn readEvaluationResult(\n\t\t\tawait this.#client.send(\n\t\t\t\t'Runtime.evaluate',\n\t\t\t\t{\n\t\t\t\t\texpression: guardEvaluateExpression(expression, BROWSER_RESULT_LIMIT),\n\t\t\t\t\treturnByValue: true,\n\t\t\t\t\tawaitPromise: true,\n\t\t\t\t},\n\t\t\t\tthis.#session,\n\t\t\t\ttimeout,\n\t\t\t),\n\t\t)\n\t}\n\n\tasync send(method: string, params?: Readonly<Record<string, unknown>>): Promise<unknown> {\n\t\tthis.#assert()\n\t\treturn await this.#client.send(method, params, this.#session)\n\t}\n\n\tdetach(): void {\n\t\tthis.#closed = true\n\t}\n\n\tasync close(): Promise<void> {\n\t\tif (this.#closed) return\n\t\tthis.#closed = true\n\t\ttry {\n\t\t\tawait this.#client.send('Target.closeTarget', { targetId: this.#id })\n\t\t} catch {\n\t\t\t// The worker may already have terminated.\n\t\t}\n\t}\n\n\t#assert(): void {\n\t\tif (this.#closed) throw new BrowserError('Browser worker is closed')\n\t\tif (!this.#client.connected) throw new BrowserError('Browser worker is disconnected')\n\t}\n}\n","import type {\n\tBrowserCodegenInterface,\n\tBrowserCodegenOptions,\n\tBrowserClockInterface,\n\tBrowserDiagnosticsInterface,\n\tBrowserFrameInfo,\n\tBrowserFrameInterface,\n\tBrowserNavigationOptions,\n\tBrowserNavigationManagerInterface,\n\tBrowserNavigationResult,\n\tBrowserNavigationWatch,\n\tBrowserNetworkManagerInterface,\n\tBrowserPDFOptions,\n\tBrowserPDFResult,\n\tBrowserPageInterface,\n\tBrowserPageEventMap,\n\tBrowserResponse,\n\tBrowserScreenshotOptions,\n\tBrowserScreenshotResult,\n\tBrowserScriptManagerInterface,\n\tBrowserSnapshotInterface,\n\tBrowserSnapshotOptions,\n\tBrowserWaitUntil,\n\tBrowserWorkerCategory,\n\tBrowserAccessibilityInterface,\n\tCDPClientInterface,\n\tScreenshotWriterInterface,\n} from './types.js'\nimport type { EmitterInterface } from '@orkestrel/emitter'\nimport { BrowserCodegen } from './BrowserCodegen.js'\nimport { BrowserAccessibility } from './BrowserAccessibility.js'\nimport { BrowserClock } from './BrowserClock.js'\nimport { BrowserDiagnostics } from './BrowserDiagnostics.js'\nimport { BrowserDialog } from './BrowserDialog.js'\nimport { BrowserDownload } from './BrowserDownload.js'\nimport { BrowserFrame } from './BrowserFrame.js'\nimport { BrowserFileChooser } from './BrowserFileChooser.js'\nimport { BrowserNetworkManager } from './BrowserNetworkManager.js'\nimport { BrowserNavigationManager } from './BrowserNavigationManager.js'\nimport { BrowserScriptManager } from './BrowserScriptManager.js'\nimport { BrowserSnapshot } from './BrowserSnapshot.js'\nimport { BrowserWorker } from './BrowserWorker.js'\nimport { BrowserError } from './errors.js'\nimport {\n\tBROWSER_DEFAULT_TIMEOUT_MS,\n\tBROWSER_SNAPSHOT_NODE_LIMIT,\n\tBROWSER_STOP_LOADING_TIMEOUT_MS,\n} from './constants.js'\nimport {\n\tdecodeBase64,\n\tdecodeBrowserSnapshot,\n\tbrowserPDFToParams,\n\tbrowserScreenshotToParams,\n\tcompileScreenshotCleanupExpression,\n\tcompileScreenshotPreparationExpression,\n\treadBrowserConsoleMessage,\n\treadBrowserDownloadProgress,\n\treadBrowserDownloadStart,\n\treadBrowserFrames,\n\treadBrowserPageError,\n\trequireBrowserString,\n\tvalidateBrowserTimeout,\n} from './helpers.js'\nimport { isArray, isFiniteNumber, isInteger, isRecord, isString } from '@orkestrel/contract'\nimport { Emitter } from '@orkestrel/emitter'\n\n/**\n * A top-level browser page, including its target lifecycle and child frames.\n */\nexport class BrowserPage extends BrowserFrame implements BrowserPageInterface {\n\treadonly #client: CDPClientInterface\n\treadonly #targetId: string\n\treadonly #sessionId: string\n\treadonly #writer: ScreenshotWriterInterface | undefined\n\treadonly #contextId: string | undefined\n\treadonly #opener: BrowserPageInterface | undefined\n\treadonly #emitter: Emitter<BrowserPageEventMap>\n\treadonly #network: BrowserNetworkManager\n\treadonly #navigationManager: BrowserNavigationManager\n\treadonly #scripts: BrowserScriptManager\n\treadonly #accessibility: BrowserAccessibility\n\treadonly #diagnostics: BrowserDiagnostics\n\treadonly #clock: BrowserClock\n\treadonly #frameSessions: Map<string, Promise<string>> = new Map()\n\treadonly #frameIds: Map<string, string> = new Map()\n\treadonly #downloads: Map<string, BrowserDownload> = new Map()\n\treadonly #workers: Map<string, BrowserWorker> = new Map()\n\treadonly #popups: Map<string, BrowserPage> = new Map()\n\t#closed = false\n\t#codegen: BrowserCodegen | undefined\n\t#codegenStart: Promise<BrowserCodegen> | undefined\n\t#navigation: Promise<BrowserNavigationResult> | undefined\n\t#closing: Promise<void> | undefined\n\t#releasing: Promise<void> | undefined\n\t#loadEvents: readonly string[] = []\n\t#sameDocument = false\n\t#loadTimer: ReturnType<typeof setTimeout> | undefined\n\t#loadResolve: (() => void) | undefined\n\t#loadReject: ((error: unknown) => void) | undefined\n\t#responses: BrowserResponse[] | undefined\n\treadonly #navigationResponseHandler = this.#handleNavigationResponse.bind(this)\n\treadonly #destroyHandler = this.#handleDestroy.bind(this)\n\treadonly #loadHandler = this.#handleLoad.bind(this)\n\treadonly #frameAttachedHandler = this.#handleFrameAttached.bind(this)\n\treadonly #frameNavigatedHandler = this.#handleFrameNavigated.bind(this)\n\treadonly #frameDetachedHandler = this.#handleFrameDetached.bind(this)\n\treadonly #dialogHandler = this.#handleDialog.bind(this)\n\treadonly #chooserHandler = this.#handleChooser.bind(this)\n\treadonly #consoleHandler = this.#handleConsole.bind(this)\n\treadonly #errorHandler = this.#handleError.bind(this)\n\treadonly #crashHandler = this.#handleCrash.bind(this)\n\treadonly #downloadHandler = this.#handleDownload.bind(this)\n\treadonly #downloadProgressHandler = this.#handleDownloadProgress.bind(this)\n\treadonly #attachedHandler = this.#handleAttached.bind(this)\n\treadonly #detachedHandler = this.#handleDetached.bind(this)\n\n\tconstructor(\n\t\tclient: CDPClientInterface,\n\t\ttargetId: string,\n\t\tsessionId: string,\n\t\twriter?: ScreenshotWriterInterface,\n\t\turl?: string,\n\t\tframeId?: string,\n\t\tcontextId?: string,\n\t\topener?: BrowserPageInterface,\n\t) {\n\t\tsuper(client, sessionId, frameId ?? targetId, url ?? 'about:blank', undefined, undefined, false)\n\t\tthis.#client = client\n\t\tthis.#targetId = targetId\n\t\tthis.#sessionId = sessionId\n\t\tthis.#writer = writer\n\t\tthis.#contextId = contextId\n\t\tthis.#opener = opener\n\t\tthis.#emitter = new Emitter()\n\t\tthis.#network = new BrowserNetworkManager(this, writer)\n\t\tthis.#navigationManager = new BrowserNavigationManager(this)\n\t\tthis.#scripts = new BrowserScriptManager(this)\n\t\tthis.#accessibility = new BrowserAccessibility(this)\n\t\tthis.#diagnostics = new BrowserDiagnostics(this, writer)\n\t\tthis.#clock = new BrowserClock(this)\n\t\tthis.#network.emitter.on('request', (request) => this.#emitter.emit('request', request))\n\t\tthis.#network.emitter.on('response', (response) => this.#emitter.emit('response', response))\n\t\tthis.#network.emitter.on('failure', (failure) => this.#emitter.emit('failure', failure))\n\t\tthis.#network.emitter.on('socket', (socket) => this.#emitter.emit('socket', socket))\n\n\t\tthis.#client.subscribe('Target.targetDestroyed', this.#destroyHandler)\n\t\tthis.#client.subscribe('Target.attachedToTarget', this.#attachedHandler, this.#sessionId)\n\t\tthis.#client.subscribe('Target.detachedFromTarget', this.#detachedHandler, this.#sessionId)\n\t\tthis.#client.subscribe('Page.frameAttached', this.#frameAttachedHandler, this.#sessionId)\n\t\tthis.#client.subscribe('Page.frameNavigated', this.#frameNavigatedHandler, this.#sessionId)\n\t\tthis.#client.subscribe('Page.frameDetached', this.#frameDetachedHandler, this.#sessionId)\n\t\tthis.#client.subscribe('Page.javascriptDialogOpening', this.#dialogHandler, this.#sessionId)\n\t\tthis.#client.subscribe('Page.fileChooserOpened', this.#chooserHandler, this.#sessionId)\n\t\tthis.#client.subscribe('Runtime.consoleAPICalled', this.#consoleHandler, this.#sessionId)\n\t\tthis.#client.subscribe('Runtime.exceptionThrown', this.#errorHandler, this.#sessionId)\n\t\tthis.#client.subscribe('Inspector.targetCrashed', this.#crashHandler, this.#sessionId)\n\t\tthis.#client.subscribe('Browser.downloadWillBegin', this.#downloadHandler)\n\t\tthis.#client.subscribe('Browser.downloadProgress', this.#downloadProgressHandler)\n\t}\n\n\tget emitter(): EmitterInterface<BrowserPageEventMap> {\n\t\treturn this.#emitter\n\t}\n\n\tget network(): BrowserNetworkManagerInterface {\n\t\treturn this.#network\n\t}\n\n\tget navigation(): BrowserNavigationManagerInterface {\n\t\treturn this.#navigationManager\n\t}\n\n\tget scripts(): BrowserScriptManagerInterface {\n\t\treturn this.#scripts\n\t}\n\n\tget accessibility(): BrowserAccessibilityInterface {\n\t\treturn this.#accessibility\n\t}\n\n\tget diagnostics(): BrowserDiagnosticsInterface {\n\t\treturn this.#diagnostics\n\t}\n\n\tget clock(): BrowserClockInterface {\n\t\treturn this.#clock\n\t}\n\n\tget opener(): BrowserPageInterface | undefined {\n\t\treturn this.#opener\n\t}\n\n\tget target(): string {\n\t\treturn this.#targetId\n\t}\n\n\tget closed(): boolean {\n\t\treturn this.#closed\n\t}\n\n\tasync navigate(\n\t\turl: string,\n\t\toptions?: BrowserNavigationOptions,\n\t): Promise<BrowserNavigationResult> {\n\t\tthis.assert()\n\t\twhile (this.#navigation !== undefined) {\n\t\t\tawait this.#navigation.catch(() => undefined)\n\t\t}\n\t\tthis.assert()\n\t\tconst navigation = this.#navigate(url, options)\n\t\tthis.#navigation = navigation\n\n\t\ttry {\n\t\t\treturn await navigation\n\t\t} finally {\n\t\t\tif (this.#navigation === navigation) this.#navigation = undefined\n\t\t}\n\t}\n\n\tasync reload(options?: BrowserNavigationOptions): Promise<BrowserNavigationResult> {\n\t\tthis.assert()\n\t\twhile (this.#navigation !== undefined) {\n\t\t\tawait this.#navigation.catch(() => undefined)\n\t\t}\n\t\tthis.assert()\n\t\tconst navigation = this.#reload(options)\n\t\tthis.#navigation = navigation\n\n\t\ttry {\n\t\t\treturn await navigation\n\t\t} finally {\n\t\t\tif (this.#navigation === navigation) this.#navigation = undefined\n\t\t}\n\t}\n\n\tasync back(options?: BrowserNavigationOptions): Promise<BrowserNavigationResult> {\n\t\treturn await this.#history(-1, options)\n\t}\n\n\tasync forward(options?: BrowserNavigationOptions): Promise<BrowserNavigationResult> {\n\t\treturn await this.#history(1, options)\n\t}\n\n\tasync screenshot(options?: BrowserScreenshotOptions): Promise<BrowserScreenshotResult> {\n\t\tthis.assert()\n\t\tconst params: Record<string, unknown> = { ...browserScreenshotToParams(options) }\n\n\t\tif (options?.full === true) {\n\t\t\tconst metrics = await this.send('Page.getLayoutMetrics')\n\t\t\tconst size =\n\t\t\t\tisRecord(metrics) && isRecord(metrics['cssContentSize'])\n\t\t\t\t\t? metrics['cssContentSize']\n\t\t\t\t\t: isRecord(metrics) && isRecord(metrics['contentSize'])\n\t\t\t\t\t\t? metrics['contentSize']\n\t\t\t\t\t\t: undefined\n\t\t\tconst width = size?.['width']\n\t\t\tconst height = size?.['height']\n\t\t\tif (!isFiniteNumber(width) || width <= 0 || !isFiniteNumber(height) || height <= 0) {\n\t\t\t\tthrow new BrowserError('Browser full-page screenshot metrics are malformed')\n\t\t\t}\n\t\t\tparams['clip'] = { x: 0, y: 0, width, height, scale: 1 }\n\t\t\tparams['captureBeyondViewport'] = true\n\t\t}\n\n\t\tif (options?.scale !== undefined) {\n\t\t\tconst ratio = options.scale === 'css' ? 1 : await this.evaluate('devicePixelRatio')\n\t\t\tif (!isFiniteNumber(ratio) || ratio <= 0) {\n\t\t\t\tthrow new BrowserError('Browser screenshot device scale is malformed')\n\t\t\t}\n\t\t\tif (!isRecord(params['clip'])) {\n\t\t\t\tconst metrics = await this.send('Page.getLayoutMetrics')\n\t\t\t\tconst viewport =\n\t\t\t\t\tisRecord(metrics) && isRecord(metrics['cssVisualViewport'])\n\t\t\t\t\t\t? metrics['cssVisualViewport']\n\t\t\t\t\t\t: undefined\n\t\t\t\tif (\n\t\t\t\t\tviewport === undefined ||\n\t\t\t\t\t!isFiniteNumber(viewport['pageX']) ||\n\t\t\t\t\t!isFiniteNumber(viewport['pageY']) ||\n\t\t\t\t\t!isFiniteNumber(viewport['clientWidth']) ||\n\t\t\t\t\tviewport['clientWidth'] <= 0 ||\n\t\t\t\t\t!isFiniteNumber(viewport['clientHeight']) ||\n\t\t\t\t\tviewport['clientHeight'] <= 0\n\t\t\t\t) {\n\t\t\t\t\tthrow new BrowserError('Browser screenshot viewport metrics are malformed')\n\t\t\t\t}\n\t\t\t\tparams['clip'] = {\n\t\t\t\t\tx: viewport['pageX'],\n\t\t\t\t\ty: viewport['pageY'],\n\t\t\t\t\twidth: viewport['clientWidth'],\n\t\t\t\t\theight: viewport['clientHeight'],\n\t\t\t\t\tscale: ratio,\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tparams['clip']['scale'] = ratio\n\t\t\t}\n\t\t}\n\n\t\tlet token: string | undefined\n\t\tlet transparent = false\n\t\ttry {\n\t\t\tconst preparation = compileScreenshotPreparationExpression(options)\n\t\t\tif (preparation !== undefined) {\n\t\t\t\tconst value = await this.evaluate(preparation)\n\t\t\t\tif (!isString(value)) throw new BrowserError('Browser screenshot preparation failed')\n\t\t\t\ttoken = value\n\t\t\t}\n\t\t\tif (options?.transparent === true) {\n\t\t\t\tawait this.send('Emulation.setDefaultBackgroundColorOverride', {\n\t\t\t\t\tcolor: { r: 0, g: 0, b: 0, a: 0 },\n\t\t\t\t})\n\t\t\t\ttransparent = true\n\t\t\t}\n\t\t\tconst result = await this.send('Page.captureScreenshot', params)\n\t\t\tif (!isRecord(result) || !isString(result['data'])) {\n\t\t\t\tthrow new BrowserError('Screenshot failed: no data returned')\n\t\t\t}\n\n\t\t\tconst bytes = decodeBase64(result['data'])\n\t\t\tif (options?.path !== undefined) await this.save(options.path, bytes)\n\t\t\treturn { bytes, path: options?.path }\n\t\t} finally {\n\t\t\tif (transparent) {\n\t\t\t\tawait this.send('Emulation.setDefaultBackgroundColorOverride').catch(() => undefined)\n\t\t\t}\n\t\t\tif (token !== undefined) {\n\t\t\t\tawait this.evaluate(compileScreenshotCleanupExpression(token)).catch(() => undefined)\n\t\t\t}\n\t\t}\n\t}\n\n\tasync pdf(options?: BrowserPDFOptions): Promise<BrowserPDFResult> {\n\t\tthis.assert()\n\t\tconst result = await this.send('Page.printToPDF', browserPDFToParams(options))\n\t\tif (!isRecord(result) || !isString(result['data'])) {\n\t\t\tthrow new BrowserError('PDF failed: no data returned')\n\t\t}\n\t\tconst bytes = decodeBase64(result['data'])\n\t\tif (options?.path !== undefined) await this.save(options.path, bytes)\n\t\treturn { bytes, path: options?.path }\n\t}\n\n\toverride async save(path: string, bytes: Uint8Array): Promise<void> {\n\t\tif (this.#writer === undefined) {\n\t\t\tthrow new BrowserError('Browser page has no configured file writer', undefined, { path })\n\t\t}\n\t\tawait this.#writer.write(path, bytes)\n\t}\n\n\tasync frame(name: string): Promise<BrowserFrameInterface | undefined> {\n\t\tconst frames = await this.frames()\n\t\treturn frames.find((frame) => frame.name === name || frame.url === name)\n\t}\n\n\tasync frames(): Promise<readonly BrowserFrameInterface[]> {\n\t\tthis.assert()\n\t\tconst result = await this.send('Page.getFrameTree')\n\t\treturn readBrowserFrames(result).map((frame) => this.#frame(frame))\n\t}\n\n\tasync snapshot(options?: BrowserSnapshotOptions): Promise<BrowserSnapshotInterface> {\n\t\tthis.assert()\n\t\tconst styles = options?.styles ?? []\n\t\tconst result = await this.send('DOMSnapshot.captureSnapshot', {\n\t\t\tcomputedStyles: [...styles],\n\t\t\tincludePaintOrder: options?.paint ?? false,\n\t\t\tincludeDOMRects: options?.rects ?? false,\n\t\t})\n\t\treturn new BrowserSnapshot(\n\t\t\tdecodeBrowserSnapshot(result, styles, options?.limit ?? BROWSER_SNAPSHOT_NODE_LIMIT),\n\t\t)\n\t}\n\n\tasync codegen(options?: BrowserCodegenOptions): Promise<BrowserCodegenInterface> {\n\t\tthis.assert()\n\t\tif (this.#codegen !== undefined) return this.#codegen\n\t\tconst active = this.#codegenStart\n\t\tif (active !== undefined) return await active\n\n\t\tconst attempt = this.#startCodegen(options)\n\t\tthis.#codegenStart = attempt\n\t\ttry {\n\t\t\treturn await attempt\n\t\t} finally {\n\t\t\tif (this.#codegenStart === attempt) this.#codegenStart = undefined\n\t\t}\n\t}\n\n\tdestroy(): Promise<void> {\n\t\tconst active = this.#closing\n\t\tif (active !== undefined) return active\n\n\t\tthis.#closed = true\n\t\tconst closing = this.#destroy()\n\t\tthis.#closing = closing\n\t\treturn closing\n\t}\n\n\tclose(): Promise<void> {\n\t\tconst active = this.#closing\n\t\tif (active !== undefined) return active\n\n\t\tif (this.#closed) {\n\t\t\tconst closing = this.#release()\n\t\t\tthis.#closing = closing\n\t\t\treturn closing\n\t\t}\n\n\t\tthis.#closed = true\n\t\tconst closing = this.#close()\n\t\tthis.#closing = closing\n\t\treturn closing\n\t}\n\n\toverride assert(): void {\n\t\tsuper.assert()\n\t\tif (this.#closed) throw new BrowserError('Browser page is closed')\n\t}\n\n\tasync #navigate(\n\t\turl: string,\n\t\toptions?: BrowserNavigationOptions,\n\t): Promise<BrowserNavigationResult> {\n\t\tconst timeout = options?.timeout ?? BROWSER_DEFAULT_TIMEOUT_MS\n\t\tvalidateBrowserTimeout(timeout)\n\t\tconst watch = this.#watchNavigation()\n\t\tconst condition = options?.condition ?? 'load'\n\t\tconst wait = this.#waitForLoadEvent(condition, timeout)\n\t\tvoid wait.catch(() => undefined)\n\t\tlet loader: string | undefined\n\n\t\ttry {\n\t\t\tconst result = await this.send('Page.navigate', { url }, timeout)\n\t\t\tif (isRecord(result) && isString(result['errorText'])) {\n\t\t\t\tthrow new BrowserError(`Navigation failed: ${result['errorText']}`)\n\t\t\t}\n\t\t\tif (isRecord(result) && isString(result['loaderId'])) loader = result['loaderId']\n\t\t\tawait wait\n\t\t} catch (error) {\n\t\t\tthis.#clearNavigationWatch(watch)\n\t\t\tthis.#cancelLoad()\n\t\t\tawait this.#stopLoading(Math.min(timeout, BROWSER_STOP_LOADING_TIMEOUT_MS))\n\t\t\tthrow error\n\t\t}\n\n\t\treturn await this.#completeNavigation(watch, loader)\n\t}\n\n\tasync #reload(options?: BrowserNavigationOptions): Promise<BrowserNavigationResult> {\n\t\tconst timeout = options?.timeout ?? BROWSER_DEFAULT_TIMEOUT_MS\n\t\tvalidateBrowserTimeout(timeout)\n\t\tconst watch = this.#watchNavigation()\n\t\tconst wait = this.#waitForLoadEvent(options?.condition ?? 'load', timeout)\n\t\tvoid wait.catch(() => undefined)\n\n\t\ttry {\n\t\t\tawait this.send('Page.reload', undefined, timeout)\n\t\t\tawait wait\n\t\t} catch (error) {\n\t\t\tthis.#clearNavigationWatch(watch)\n\t\t\tthis.#cancelLoad()\n\t\t\tawait this.#stopLoading(Math.min(timeout, BROWSER_STOP_LOADING_TIMEOUT_MS))\n\t\t\tthrow error\n\t\t}\n\n\t\treturn await this.#completeNavigation(watch)\n\t}\n\n\tasync #history(\n\t\toffset: -1 | 1,\n\t\toptions?: BrowserNavigationOptions,\n\t): Promise<BrowserNavigationResult> {\n\t\tthis.assert()\n\t\twhile (this.#navigation !== undefined) {\n\t\t\tawait this.#navigation.catch(() => undefined)\n\t\t}\n\t\tthis.assert()\n\t\tconst navigation = this.#navigateHistory(offset, options)\n\t\tthis.#navigation = navigation\n\n\t\ttry {\n\t\t\treturn await navigation\n\t\t} finally {\n\t\t\tif (this.#navigation === navigation) this.#navigation = undefined\n\t\t}\n\t}\n\n\tasync #navigateHistory(\n\t\toffset: -1 | 1,\n\t\toptions?: BrowserNavigationOptions,\n\t): Promise<BrowserNavigationResult> {\n\t\tconst timeout = options?.timeout ?? BROWSER_DEFAULT_TIMEOUT_MS\n\t\tvalidateBrowserTimeout(timeout)\n\t\tconst history = await this.send('Page.getNavigationHistory')\n\t\tif (!isRecord(history) || !isInteger(history['currentIndex']) || !isArray(history['entries'])) {\n\t\t\tthrow new BrowserError('Navigation history is malformed')\n\t\t}\n\t\tconst entry = history['entries'][history['currentIndex'] + offset]\n\t\tif (!isRecord(entry) || !isInteger(entry['id'])) {\n\t\t\treturn { url: this.url, response: undefined, same: false }\n\t\t}\n\n\t\tconst watch = this.#watchNavigation()\n\t\tconst wait = this.#waitForLoadEvent(options?.condition ?? 'load', timeout)\n\t\tvoid wait.catch(() => undefined)\n\t\ttry {\n\t\t\tawait this.send('Page.navigateToHistoryEntry', { entryId: entry['id'] }, timeout)\n\t\t\tawait wait\n\t\t} catch (error) {\n\t\t\tthis.#clearNavigationWatch(watch)\n\t\t\tthis.#cancelLoad()\n\t\t\tawait this.#stopLoading(Math.min(timeout, BROWSER_STOP_LOADING_TIMEOUT_MS))\n\t\t\tthrow error\n\t\t}\n\n\t\treturn await this.#completeNavigation(watch)\n\t}\n\n\t#watchNavigation(): BrowserNavigationWatch {\n\t\tconst responses: BrowserResponse[] = []\n\t\tthis.#responses = responses\n\t\tthis.#network.emitter.on('response', this.#navigationResponseHandler)\n\t\treturn { responses }\n\t}\n\n\t#clearNavigationWatch(watch: BrowserNavigationWatch): void {\n\t\tthis.#network.emitter.off('response', this.#navigationResponseHandler)\n\t\tif (this.#responses === watch.responses) this.#responses = undefined\n\t}\n\n\t#navigationResult(\n\t\twatch: BrowserNavigationWatch,\n\t\turl: string,\n\t\tloader?: string,\n\t): BrowserNavigationResult {\n\t\tthis.#clearNavigationWatch(watch)\n\t\tconst response =\n\t\t\tloader === undefined\n\t\t\t\t? watch.responses.findLast((candidate) => candidate.url === url)\n\t\t\t\t: watch.responses.findLast((candidate) => candidate.loader === loader)\n\t\treturn {\n\t\t\turl,\n\t\t\tresponse,\n\t\t\tsame: this.#sameDocument,\n\t\t}\n\t}\n\n\tasync #completeNavigation(\n\t\twatch: BrowserNavigationWatch,\n\t\tloader?: string,\n\t): Promise<BrowserNavigationResult> {\n\t\ttry {\n\t\t\tconst currentUrl = await this.evaluate('location.href')\n\t\t\tconst resolved = requireBrowserString(currentUrl, 'Navigation URL')\n\t\t\tthis.update(resolved)\n\t\t\treturn this.#navigationResult(watch, resolved, loader)\n\t\t} catch (error) {\n\t\t\tthis.#clearNavigationWatch(watch)\n\t\t\tthrow error\n\t\t}\n\t}\n\n\tasync #startCodegen(options?: BrowserCodegenOptions): Promise<BrowserCodegen> {\n\t\tconst codegen = new BrowserCodegen(this.#client, this.#sessionId, options)\n\t\tawait codegen.start()\n\t\tif (this.#closed) {\n\t\t\tawait codegen.destroy()\n\t\t\tthrow new BrowserError('Browser page is closed')\n\t\t}\n\t\tthis.#codegen = codegen\n\t\treturn codegen\n\t}\n\n\tasync #destroy(): Promise<void> {\n\t\tawait this.#release()\n\t\ttry {\n\t\t\tawait this.#client.send('Target.detachFromTarget', { sessionId: this.#sessionId })\n\t\t} catch {\n\t\t\t// The session may already be detached.\n\t\t}\n\t}\n\n\tasync #close(): Promise<void> {\n\t\tawait this.#release()\n\t\ttry {\n\t\t\tawait this.#client.send('Target.closeTarget', { targetId: this.#targetId })\n\t\t} catch {\n\t\t\t// The target may already be closed.\n\t\t}\n\t}\n\n\t#release(): Promise<void> {\n\t\tconst active = this.#releasing\n\t\tif (active !== undefined) return active\n\t\tconst release = this.#releaseResources()\n\t\tthis.#releasing = release\n\t\treturn release\n\t}\n\n\tasync #releaseResources(): Promise<void> {\n\t\tthis.#cancelLoad()\n\t\tawait this.#codegenStart?.catch(() => undefined)\n\t\tawait this.#scripts.destroy().catch(() => undefined)\n\t\tawait this.#diagnostics.destroy().catch(() => undefined)\n\t\tawait this.#clock.uninstall().catch(() => undefined)\n\t\tawait this.#network.destroy().catch(() => undefined)\n\n\t\tif (this.#codegen !== undefined) {\n\t\t\ttry {\n\t\t\t\tawait this.#codegen.destroy()\n\t\t\t} catch {\n\t\t\t\t// The recorder's session may already be unavailable.\n\t\t\t}\n\t\t\tthis.#codegen = undefined\n\t\t}\n\n\t\tthis.#frameSessions.clear()\n\t\tthis.#frameIds.clear()\n\t\tfor (const worker of this.#workers.values()) worker.detach()\n\t\tthis.#workers.clear()\n\t\tthis.#popups.clear()\n\t\tthis.#downloads.clear()\n\t\tthis.#client.unsubscribe('Target.targetDestroyed', this.#destroyHandler)\n\t\tthis.#client.unsubscribe('Target.attachedToTarget', this.#attachedHandler, this.#sessionId)\n\t\tthis.#client.unsubscribe('Target.detachedFromTarget', this.#detachedHandler, this.#sessionId)\n\t\tthis.#client.unsubscribe('Page.frameAttached', this.#frameAttachedHandler, this.#sessionId)\n\t\tthis.#client.unsubscribe('Page.frameNavigated', this.#frameNavigatedHandler, this.#sessionId)\n\t\tthis.#client.unsubscribe('Page.frameDetached', this.#frameDetachedHandler, this.#sessionId)\n\t\tthis.#client.unsubscribe('Page.javascriptDialogOpening', this.#dialogHandler, this.#sessionId)\n\t\tthis.#client.unsubscribe('Page.fileChooserOpened', this.#chooserHandler, this.#sessionId)\n\t\tthis.#client.unsubscribe('Runtime.consoleAPICalled', this.#consoleHandler, this.#sessionId)\n\t\tthis.#client.unsubscribe('Runtime.exceptionThrown', this.#errorHandler, this.#sessionId)\n\t\tthis.#client.unsubscribe('Inspector.targetCrashed', this.#crashHandler, this.#sessionId)\n\t\tthis.#client.unsubscribe('Browser.downloadWillBegin', this.#downloadHandler)\n\t\tthis.#client.unsubscribe('Browser.downloadProgress', this.#downloadProgressHandler)\n\t\tif (!this.#emitter.destroyed) {\n\t\t\tthis.#emitter.emit('close')\n\t\t\tthis.#emitter.destroy()\n\t\t}\n\t}\n\n\t#frame(frame: BrowserFrameInfo): BrowserFrameInterface {\n\t\treturn new BrowserFrame(\n\t\t\tthis.#client,\n\t\t\t(id) => this.#resolveFrameSession(id),\n\t\t\tframe.id,\n\t\t\tframe.url,\n\t\t\tframe.parent,\n\t\t\tframe.name,\n\t\t)\n\t}\n\n\tasync #resolveFrameSession(frame: string): Promise<string> {\n\t\tconst session = this.#frameSessions.get(frame)\n\t\treturn session === undefined ? this.#sessionId : await session\n\t}\n\n\tasync #enableFrameSession(session: string): Promise<string> {\n\t\tawait this.#client.send('Page.enable', undefined, session)\n\t\tawait this.#client.send('Runtime.enable', undefined, session)\n\t\treturn session\n\t}\n\n\tasync #attachWorker(\n\t\tsession: string,\n\t\tid: string,\n\t\turl: string,\n\t\tcategory: BrowserWorkerCategory,\n\t): Promise<void> {\n\t\ttry {\n\t\t\tawait this.#client.send('Runtime.enable', undefined, session)\n\t\t\tif (this.#closed) {\n\t\t\t\tawait this.#detachChild(session)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst worker = new BrowserWorker(this.#client, session, id, url, category)\n\t\t\tthis.#workers.set(id, worker)\n\t\t\tthis.#emitter.emit('worker', worker)\n\t\t} catch {\n\t\t\t// A worker can terminate before its session is enabled.\n\t\t\tawait this.#detachChild(session)\n\t\t}\n\t}\n\n\tasync #attachPopup(session: string, id: string, url: string): Promise<void> {\n\t\tlet popup: BrowserPage | undefined\n\t\ttry {\n\t\t\tawait this.#client.send('Page.enable', undefined, session)\n\t\t\tawait this.#client.send('Runtime.enable', undefined, session)\n\t\t\tconst result = await this.#client.send('Page.getFrameTree', undefined, session)\n\t\t\tconst frame = readBrowserFrames(result)[0]\n\t\t\tif (frame === undefined || this.#closed) {\n\t\t\t\tawait this.#detachChild(session)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tpopup = new BrowserPage(\n\t\t\t\tthis.#client,\n\t\t\t\tid,\n\t\t\t\tsession,\n\t\t\t\tthis.#writer,\n\t\t\t\turl,\n\t\t\t\tframe.id,\n\t\t\t\tthis.#contextId,\n\t\t\t\tthis,\n\t\t\t)\n\t\t\tawait popup.send('Target.setAutoAttach', {\n\t\t\t\tautoAttach: true,\n\t\t\t\twaitForDebuggerOnStart: false,\n\t\t\t\tflatten: true,\n\t\t\t})\n\t\t\tawait popup.send('Page.setInterceptFileChooserDialog', { enabled: true })\n\t\t\tawait popup.network.start()\n\t\t\tif (this.#closed) {\n\t\t\t\tawait popup.destroy()\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.#popups.set(id, popup)\n\t\t\tthis.#emitter.emit('popup', popup)\n\t\t} catch {\n\t\t\t// A popup can close before its session initialization completes.\n\t\t\tif (popup !== undefined) await popup.destroy()\n\t\t\telse await this.#detachChild(session)\n\t\t}\n\t}\n\n\tasync #detachChild(session: string): Promise<void> {\n\t\tawait this.#client\n\t\t\t.send('Target.detachFromTarget', { sessionId: session })\n\t\t\t.catch(() => undefined)\n\t}\n\n\tasync #stopLoading(timeout: number): Promise<void> {\n\t\ttry {\n\t\t\tawait this.send('Page.stopLoading', undefined, timeout)\n\t\t} catch {\n\t\t\t// Best-effort only — the original navigation error wins.\n\t\t}\n\t}\n\n\t#handleNavigationResponse(response: BrowserResponse): void {\n\t\tif (response.frame === this.id) this.#responses?.push(response)\n\t}\n\n\t#handleDestroy(params: Readonly<Record<string, unknown>>): void {\n\t\tif (!isString(params['targetId']) || params['targetId'] !== this.#targetId) return\n\t\tthis.#closed = true\n\t\tvoid this.#release().catch(() => undefined)\n\t}\n\n\t#handleLoad(params: Readonly<Record<string, unknown>>): void {\n\t\tif (this.#loadEvents.includes('Page.navigatedWithinDocument')) {\n\t\t\tconst frame = params['frameId']\n\t\t\tif (isString(frame) && frame === this.id) {\n\t\t\t\tthis.#sameDocument = true\n\t\t\t\tthis.#resolveLoad()\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t\tif (this.#loadEvents.includes('Page.frameNavigated')) {\n\t\t\tconst frame = params['frame']\n\t\t\tif (isRecord(frame) && frame['id'] === this.id) this.#resolveLoad()\n\t\t\treturn\n\t\t}\n\t\tif (\n\t\t\tthis.#loadEvents.includes('Page.loadEventFired') ||\n\t\t\tthis.#loadEvents.includes('Page.domContentEventFired')\n\t\t) {\n\t\t\tthis.#resolveLoad()\n\t\t}\n\t}\n\n\t#handleFrameAttached(params: Readonly<Record<string, unknown>>): void {\n\t\tconst frame = params['frameId']\n\t\tconst parent = params['parentFrameId']\n\t\tif (!isString(frame)) return\n\t\tthis.#emitter.emit(\n\t\t\t'attach',\n\t\t\tnew BrowserFrame(\n\t\t\t\tthis.#client,\n\t\t\t\t(id) => this.#resolveFrameSession(id),\n\t\t\t\tframe,\n\t\t\t\t'about:blank',\n\t\t\t\tisString(parent) ? parent : undefined,\n\t\t\t),\n\t\t)\n\t}\n\n\t#handleFrameNavigated(params: Readonly<Record<string, unknown>>): void {\n\t\tconst frame = params['frame']\n\t\tif (!isRecord(frame) || !isString(frame['id']) || !isString(frame['url'])) return\n\t\tif (frame['id'] === this.id) {\n\t\t\tthis.update(frame['url'])\n\t\t\tthis.#emitter.emit('navigate', frame['url'])\n\t\t}\n\t}\n\n\t#handleFrameDetached(params: Readonly<Record<string, unknown>>): void {\n\t\tconst frame = params['frameId']\n\t\tif (!isString(frame)) return\n\t\tthis.#frameSessions.delete(frame)\n\t\tthis.#emitter.emit('detach', frame)\n\t}\n\n\t#handleDialog(params: Readonly<Record<string, unknown>>): void {\n\t\tconst category = params['type']\n\t\tif (\n\t\t\t(category !== 'alert' &&\n\t\t\t\tcategory !== 'confirm' &&\n\t\t\t\tcategory !== 'prompt' &&\n\t\t\t\tcategory !== 'beforeunload') ||\n\t\t\t!isString(params['message'])\n\t\t) {\n\t\t\treturn\n\t\t}\n\t\tthis.#emitter.emit(\n\t\t\t'dialog',\n\t\t\tnew BrowserDialog(\n\t\t\t\tthis,\n\t\t\t\tcategory,\n\t\t\t\tparams['message'],\n\t\t\t\tisString(params['defaultPrompt']) ? params['defaultPrompt'] : '',\n\t\t\t),\n\t\t)\n\t}\n\n\t#handleChooser(params: Readonly<Record<string, unknown>>): void {\n\t\tconst backend = params['backendNodeId']\n\t\tconst mode = params['mode']\n\t\tif (!isInteger(backend)) return\n\t\tthis.#emitter.emit('chooser', new BrowserFileChooser(this, backend, mode === 'selectMultiple'))\n\t}\n\n\t#handleConsole(params: Readonly<Record<string, unknown>>): void {\n\t\tconst message = readBrowserConsoleMessage(params)\n\t\tif (message !== undefined) this.#emitter.emit('console', message)\n\t}\n\n\t#handleError(params: Readonly<Record<string, unknown>>): void {\n\t\tconst error = readBrowserPageError(params)\n\t\tif (error !== undefined) this.#emitter.emit('error', error)\n\t}\n\n\t#handleCrash(): void {\n\t\tthis.#emitter.emit('crash')\n\t}\n\n\t#handleDownload(params: Readonly<Record<string, unknown>>): void {\n\t\tconst start = readBrowserDownloadStart(params)\n\t\tif (start === undefined || (start.frame !== this.id && !this.#frameSessions.has(start.frame))) {\n\t\t\treturn\n\t\t}\n\t\tconst download = new BrowserDownload(\n\t\t\tthis.#client,\n\t\t\tstart.id,\n\t\t\tstart.url,\n\t\t\tstart.name,\n\t\t\tthis.#contextId,\n\t\t)\n\t\tthis.#downloads.set(start.id, download)\n\t\tthis.#emitter.emit('download', download)\n\t}\n\n\t#handleDownloadProgress(params: Readonly<Record<string, unknown>>): void {\n\t\tconst decoded = readBrowserDownloadProgress(params)\n\t\tif (decoded === undefined) return\n\t\tconst [id, progress] = decoded\n\t\tconst download = this.#downloads.get(id)\n\t\tif (download === undefined) return\n\t\tdownload.update(progress)\n\t\tif (progress.status !== 'pending') this.#downloads.delete(id)\n\t}\n\n\t#handleAttached(params: Readonly<Record<string, unknown>>): void {\n\t\tconst target = params['targetInfo']\n\t\tconst session = params['sessionId']\n\t\tif (!isRecord(target) || !isString(target['targetId']) || !isString(session)) {\n\t\t\treturn\n\t\t}\n\n\t\tconst category = target['type']\n\t\tif (category === 'worker' || category === 'service_worker' || category === 'shared_worker') {\n\t\t\tvoid this.#attachWorker(\n\t\t\t\tsession,\n\t\t\t\ttarget['targetId'],\n\t\t\t\tisString(target['url']) ? target['url'] : '',\n\t\t\t\tcategory,\n\t\t\t)\n\t\t\treturn\n\t\t}\n\t\tif (category === 'page') {\n\t\t\tvoid this.#attachPopup(\n\t\t\t\tsession,\n\t\t\t\ttarget['targetId'],\n\t\t\t\tisString(target['url']) ? target['url'] : 'about:blank',\n\t\t\t)\n\t\t\treturn\n\t\t}\n\t\tif (category !== 'iframe') return\n\n\t\tconst frame = target['targetId']\n\t\tconst attempt = this.#enableFrameSession(session)\n\t\tthis.#frameSessions.set(frame, attempt)\n\t\tthis.#frameIds.set(session, frame)\n\t\tvoid attempt.catch(() => {\n\t\t\tif (this.#frameSessions.get(frame) === attempt) this.#frameSessions.delete(frame)\n\t\t\tif (this.#frameIds.get(session) === frame) this.#frameIds.delete(session)\n\t\t\tvoid this.#detachChild(session)\n\t\t})\n\t}\n\n\t#handleDetached(params: Readonly<Record<string, unknown>>): void {\n\t\tconst session = params['sessionId']\n\t\tconst target = params['targetId']\n\t\tif (isString(target)) {\n\t\t\tconst worker = this.#workers.get(target)\n\t\t\tif (worker !== undefined) {\n\t\t\t\tworker.detach()\n\t\t\t\tthis.#workers.delete(target)\n\t\t\t}\n\t\t\tconst popup = this.#popups.get(target)\n\t\t\tif (popup !== undefined) {\n\t\t\t\tthis.#popups.delete(target)\n\t\t\t\tvoid popup.destroy().catch(() => undefined)\n\t\t\t}\n\t\t}\n\t\tconst frame = isString(target)\n\t\t\t? target\n\t\t\t: isString(session)\n\t\t\t\t? this.#frameIds.get(session)\n\t\t\t\t: undefined\n\t\tif (frame !== undefined) this.#frameSessions.delete(frame)\n\t\tif (isString(session)) this.#frameIds.delete(session)\n\t}\n\n\t#waitForLoadEvent(condition: BrowserWaitUntil, timeout: number): Promise<void> {\n\t\tconst eventName =\n\t\t\tcondition === 'commit'\n\t\t\t\t? 'Page.frameNavigated'\n\t\t\t\t: condition === 'domcontentloaded'\n\t\t\t\t\t? 'Page.domContentEventFired'\n\t\t\t\t\t: 'Page.loadEventFired'\n\t\tconst deferred = Promise.withResolvers<void>()\n\t\tthis.#sameDocument = false\n\t\tthis.#loadEvents = [eventName, 'Page.navigatedWithinDocument']\n\t\tthis.#loadResolve = deferred.resolve\n\t\tthis.#loadReject = deferred.reject\n\t\tthis.#loadTimer = setTimeout(() => {\n\t\t\tthis.#rejectLoad(new BrowserError(`Navigation timeout after ${timeout}ms`))\n\t\t}, timeout)\n\t\tfor (const event of this.#loadEvents) {\n\t\t\tthis.#client.subscribe(event, this.#loadHandler, this.#sessionId)\n\t\t}\n\t\treturn deferred.promise\n\t}\n\n\t#resolveLoad(): void {\n\t\tconst resolve = this.#loadResolve\n\t\tthis.#clearLoad()\n\t\tresolve?.()\n\t}\n\n\t#rejectLoad(error: unknown): void {\n\t\tconst reject = this.#loadReject\n\t\tthis.#clearLoad()\n\t\treject?.(error)\n\t}\n\n\t#cancelLoad(): void {\n\t\tthis.#rejectLoad(new BrowserError('Navigation cancelled'))\n\t}\n\n\t#clearLoad(): void {\n\t\tif (this.#loadTimer !== undefined) clearTimeout(this.#loadTimer)\n\t\tfor (const event of this.#loadEvents) {\n\t\t\tthis.#client.unsubscribe(event, this.#loadHandler, this.#sessionId)\n\t\t}\n\t\tthis.#loadEvents = []\n\t\tthis.#loadTimer = undefined\n\t\tthis.#loadResolve = undefined\n\t\tthis.#loadReject = undefined\n\t}\n}\n","import type { BrowserPermissionManagerInterface, CDPClientInterface } from './types.js'\n\n/**\n * Permission overrides isolated to one browser context.\n */\nexport class BrowserPermissionManager implements BrowserPermissionManagerInterface {\n\treadonly #client: CDPClientInterface\n\treadonly #context: string | undefined\n\n\tconstructor(client: CDPClientInterface, context?: string) {\n\t\tthis.#client = client\n\t\tthis.#context = context\n\t}\n\n\tasync grant(permissions: readonly string[], origin?: string): Promise<void> {\n\t\tawait this.#set(permissions, 'granted', origin)\n\t}\n\n\tasync deny(permissions: readonly string[], origin?: string): Promise<void> {\n\t\tawait this.#set(permissions, 'denied', origin)\n\t}\n\n\tasync clear(): Promise<void> {\n\t\tconst params: Record<string, unknown> = {}\n\t\tif (this.#context !== undefined) params['browserContextId'] = this.#context\n\t\tawait this.#client.send('Browser.resetPermissions', params)\n\t}\n\n\tasync #set(\n\t\tpermissions: readonly string[],\n\t\tsetting: 'granted' | 'denied',\n\t\torigin?: string,\n\t): Promise<void> {\n\t\tfor (const name of permissions) {\n\t\t\tconst params: Record<string, unknown> = {\n\t\t\t\tpermission: { name },\n\t\t\t\tsetting,\n\t\t\t}\n\t\t\tif (origin !== undefined) params['origin'] = origin\n\t\t\tif (this.#context !== undefined) params['browserContextId'] = this.#context\n\t\t\tawait this.#client.send('Browser.setPermission', params)\n\t\t}\n\t}\n}\n","import type {\n\tBrowserCookieInput,\n\tBrowserCookieManagerInterface,\n\tBrowserPageInterface,\n\tBrowserStorageManagerInterface,\n\tBrowserStorageOptions,\n\tBrowserStorageOrigin,\n\tBrowserStorageState,\n} from './types.js'\nimport {\n\tcompileStorageClearExpression,\n\tcompileStorageReadExpression,\n\tcompileStorageRestoreExpression,\n\treadBrowserStorageOrigin,\n} from './helpers.js'\nimport { BrowserError } from './errors.js'\nimport { attempt } from '@orkestrel/contract'\n\n/**\n * Portable cookie and web-storage state for one browser context.\n */\nexport class BrowserStorageManager implements BrowserStorageManagerInterface {\n\treadonly #cookies: BrowserCookieManagerInterface\n\treadonly #pages: () => readonly BrowserPageInterface[]\n\n\tconstructor(\n\t\tcookies: BrowserCookieManagerInterface,\n\t\tpages: () => readonly BrowserPageInterface[],\n\t) {\n\t\tthis.#cookies = cookies\n\t\tthis.#pages = pages\n\t}\n\n\tasync state(options?: BrowserStorageOptions): Promise<BrowserStorageState> {\n\t\tconst pages = this.#pages()\n\t\tconst requested = options?.origins\n\t\tconst origins =\n\t\t\trequested === undefined\n\t\t\t\t? [\n\t\t\t\t\t\t...new Set(\n\t\t\t\t\t\t\tpages.map((page) => this.#origin(page.url)).filter((origin) => origin !== undefined),\n\t\t\t\t\t\t),\n\t\t\t\t\t]\n\t\t\t\t: [...new Set(requested.map((origin) => this.#validate(origin)))]\n\t\tconst storage: BrowserStorageOrigin[] = []\n\n\t\tfor (const origin of origins) {\n\t\t\tconst page = pages.find((candidate) => this.#origin(candidate.url) === origin)\n\t\t\tif (page === undefined) {\n\t\t\t\tthrow new BrowserError('Storage origin has no attached page', undefined, { origin })\n\t\t\t}\n\t\t\tstorage.push(\n\t\t\t\treadBrowserStorageOrigin(await page.evaluate(compileStorageReadExpression()), origin),\n\t\t\t)\n\t\t}\n\n\t\tconst cookies: BrowserCookieInput[] = (await this.#cookies.list()).map((cookie) => ({\n\t\t\tname: cookie.name,\n\t\t\tvalue: cookie.value,\n\t\t\tdomain: cookie.domain,\n\t\t\tpath: cookie.path,\n\t\t\texpires: cookie.expires,\n\t\t\thttp: cookie.http,\n\t\t\tsecure: cookie.secure,\n\t\t\t...(cookie.site !== undefined ? { site: cookie.site } : {}),\n\t\t\t...(cookie.partition !== undefined ? { partition: cookie.partition } : {}),\n\t\t}))\n\t\treturn { cookies, origins: storage }\n\t}\n\n\tasync restore(state: BrowserStorageState): Promise<void> {\n\t\tconst pages = this.#pages()\n\t\tfor (const origin of state.origins) {\n\t\t\tconst normalized = this.#validate(origin.origin)\n\t\t\tconst page = pages.find((candidate) => this.#origin(candidate.url) === normalized)\n\t\t\tif (page === undefined) {\n\t\t\t\tthrow new BrowserError('Storage origin has no attached page', undefined, {\n\t\t\t\t\torigin: normalized,\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t\tawait this.#cookies.set(state.cookies)\n\t\tfor (const origin of state.origins) {\n\t\t\tconst normalized = this.#validate(origin.origin)\n\t\t\tconst page = pages.find((candidate) => this.#origin(candidate.url) === normalized)\n\t\t\tif (page === undefined) {\n\t\t\t\tthrow new BrowserError('Storage origin disappeared during restore', undefined, {\n\t\t\t\t\torigin: normalized,\n\t\t\t\t})\n\t\t\t}\n\t\t\tawait page.evaluate(compileStorageRestoreExpression(origin))\n\t\t}\n\t}\n\n\tasync clear(origin?: string): Promise<void> {\n\t\tawait this.#cookies.clear()\n\t\tconst normalized = origin === undefined ? undefined : this.#validate(origin)\n\t\tfor (const page of this.#pages()) {\n\t\t\tif (normalized !== undefined && this.#origin(page.url) !== normalized) continue\n\t\t\tawait page.evaluate(compileStorageClearExpression())\n\t\t}\n\t}\n\n\t#origin(value: string): string | undefined {\n\t\tconst result = attempt(() => new URL(value))\n\t\tif (!result.success) return undefined\n\t\tif (result.value.protocol !== 'http:' && result.value.protocol !== 'https:') return undefined\n\t\treturn result.value.origin\n\t}\n\n\t#validate(value: string): string {\n\t\tconst origin = this.#origin(value)\n\t\tif (origin === undefined) {\n\t\t\tthrow new BrowserError(\n\t\t\t\t'Browser storage origin must be an absolute HTTP(S) origin',\n\t\t\t\tundefined,\n\t\t\t\t{\n\t\t\t\t\torigin: value,\n\t\t\t\t},\n\t\t\t)\n\t\t}\n\t\treturn origin\n\t}\n}\n","import type {\n\tBrowserContextEventMap,\n\tBrowserContextInterface,\n\tBrowserCookieManagerInterface,\n\tBrowserDownloadOptions,\n\tBrowserEmulationManagerInterface,\n\tBrowserEmulationOptions,\n\tBrowserPageInterface,\n\tBrowserPageOptions,\n\tBrowserPermissionManagerInterface,\n\tBrowserStorageManagerInterface,\n\tBrowserViewport,\n\tCDPClientInterface,\n\tCDPTarget,\n\tScreenshotWriterInterface,\n} from './types.js'\nimport type { EmitterInterface } from '@orkestrel/emitter'\nimport { BrowserCookieManager } from './BrowserCookieManager.js'\nimport { BrowserEmulationManager } from './BrowserEmulationManager.js'\nimport { BrowserPage } from './BrowserPage.js'\nimport { BrowserPermissionManager } from './BrowserPermissionManager.js'\nimport { BrowserStorageManager } from './BrowserStorageManager.js'\nimport { BrowserError } from './errors.js'\nimport { readBrowserFrames, validateBrowserViewport } from './helpers.js'\nimport { instanceOf, isRecord, isString } from '@orkestrel/contract'\nimport { Emitter } from '@orkestrel/emitter'\n\n// === BrowserContext\n\n/**\n * Owns pages and shared state inside one Chromium browser context.\n */\nexport class BrowserContext implements BrowserContextInterface {\n\treadonly #client: CDPClientInterface\n\treadonly #id: string | undefined\n\treadonly #viewport: BrowserViewport | undefined\n\treadonly #writer: ScreenshotWriterInterface | undefined\n\treadonly #downloads: BrowserDownloadOptions | undefined\n\treadonly #emitter: Emitter<BrowserContextEventMap>\n\treadonly #cookies: BrowserCookieManager\n\treadonly #permissions: BrowserPermissionManager\n\treadonly #storage: BrowserStorageManager\n\treadonly #emulation: BrowserEmulationManager\n\treadonly #pages: Map<string, BrowserPage> = new Map()\n\treadonly #creating: Set<Promise<BrowserPage>> = new Set()\n\t#syncing: Promise<void> | undefined\n\t#shutdown: Promise<void> | undefined\n\t#closed = false\n\n\tconstructor(\n\t\tclient: CDPClientInterface,\n\t\tid?: string,\n\t\tviewport?: BrowserViewport,\n\t\twriter?: ScreenshotWriterInterface,\n\t\temulation?: BrowserEmulationOptions,\n\t\tdownloads?: BrowserDownloadOptions,\n\t) {\n\t\tthis.#client = client\n\t\tif (viewport !== undefined) validateBrowserViewport(viewport)\n\t\tthis.#id = id\n\t\tthis.#viewport = viewport\n\t\tthis.#writer = writer\n\t\tthis.#downloads = downloads\n\t\tthis.#emitter = new Emitter()\n\t\tthis.#cookies = new BrowserCookieManager(client, id)\n\t\tthis.#permissions = new BrowserPermissionManager(client, id)\n\t\tthis.#storage = new BrowserStorageManager(this.#cookies, () => this.pages())\n\t\tthis.#emulation = new BrowserEmulationManager(() => this.pages(), emulation)\n\t}\n\n\tget emitter(): EmitterInterface<BrowserContextEventMap> {\n\t\treturn this.#emitter\n\t}\n\n\tget id(): string | undefined {\n\t\treturn this.#id\n\t}\n\n\tget cookies(): BrowserCookieManagerInterface {\n\t\treturn this.#cookies\n\t}\n\n\tget permissions(): BrowserPermissionManagerInterface {\n\t\treturn this.#permissions\n\t}\n\n\tget storage(): BrowserStorageManagerInterface {\n\t\treturn this.#storage\n\t}\n\n\tget emulation(): BrowserEmulationManagerInterface {\n\t\treturn this.#emulation\n\t}\n\n\tpage(index?: number): BrowserPageInterface | undefined {\n\t\tconst i = index ?? 0\n\t\tconst pages = [...this.#pages.values()]\n\t\treturn i >= 0 && i < pages.length ? pages[i] : undefined\n\t}\n\n\tpages(): readonly BrowserPageInterface[] {\n\t\treturn [...this.#pages.values()]\n\t}\n\n\tasync create(options?: BrowserPageOptions): Promise<BrowserPageInterface> {\n\t\tif (this.#closed) throw new BrowserError('Browser context is closed')\n\n\t\tconst attempt = this.#create(options)\n\t\tthis.#creating.add(attempt)\n\t\ttry {\n\t\t\treturn await attempt\n\t\t} finally {\n\t\t\tthis.#creating.delete(attempt)\n\t\t}\n\t}\n\n\tasync sync(targets: readonly CDPTarget[]): Promise<void> {\n\t\twhile (this.#syncing !== undefined) {\n\t\t\tawait this.#syncing\n\t\t}\n\t\tif (this.#closed) throw new BrowserError('Browser context is closed')\n\n\t\tconst attempt = this.#sync(targets)\n\t\tthis.#syncing = attempt\n\t\ttry {\n\t\t\tawait attempt\n\t\t} finally {\n\t\t\tif (this.#syncing === attempt) this.#syncing = undefined\n\t\t}\n\t}\n\n\tdestroy(): Promise<void> {\n\t\tconst active = this.#shutdown\n\t\tif (active !== undefined) return active\n\n\t\tthis.#closed = true\n\t\tconst shutdown = this.#destroyResources()\n\t\tthis.#shutdown = shutdown\n\t\treturn shutdown\n\t}\n\n\tclose(): Promise<void> {\n\t\tconst active = this.#shutdown\n\t\tif (active !== undefined) return active\n\n\t\tthis.#closed = true\n\t\tconst shutdown = this.#closeResources()\n\t\tthis.#shutdown = shutdown\n\t\treturn shutdown\n\t}\n\n\t// === Private helpers\n\n\tasync #create(options?: BrowserPageOptions): Promise<BrowserPage> {\n\t\tif (options?.viewport !== undefined) validateBrowserViewport(options.viewport)\n\t\tconst result: unknown = await this.#client.send('Target.createTarget', {\n\t\t\turl: 'about:blank',\n\t\t\t...(this.#id === undefined ? {} : { browserContextId: this.#id }),\n\t\t})\n\n\t\tif (!isRecord(result) || !isString(result['targetId'])) {\n\t\t\tthrow new BrowserError('Failed to create new browser target')\n\t\t}\n\n\t\tconst targetId = result['targetId']\n\t\tlet page: BrowserPage | undefined\n\n\t\ttry {\n\t\t\tconst viewport = options?.viewport ?? this.#viewport\n\t\t\tpage = await this.#attach(targetId, options?.url ?? 'about:blank', viewport)\n\n\t\t\tif (options?.url !== undefined && options.url !== 'about:blank') {\n\t\t\t\tawait page.navigate(options.url, {\n\t\t\t\t\t...(options.timeout !== undefined ? { timeout: options.timeout } : {}),\n\t\t\t\t})\n\t\t\t}\n\t\t\tif (this.#closed) throw new BrowserError('Browser context closed during page creation')\n\n\t\t\tthis.#pages.set(targetId, page)\n\t\t\tthis.#emitter.emit('page', page)\n\t\t\treturn page\n\t\t} catch (error) {\n\t\t\tif (page !== undefined) {\n\t\t\t\tawait page.close()\n\t\t\t} else {\n\t\t\t\tawait this.#closeTarget(targetId)\n\t\t\t}\n\t\t\tthrow error\n\t\t}\n\t}\n\n\tasync #sync(targets: readonly CDPTarget[]): Promise<void> {\n\t\tconst pageTargets = targets.filter((target) => target.type === 'page')\n\t\tconst targetIds = new Set(pageTargets.map((target) => target.id))\n\n\t\tfor (const [id, page] of this.#pages) {\n\t\t\tif (targetIds.has(id)) continue\n\t\t\tawait page.destroy()\n\t\t\tthis.#pages.delete(id)\n\t\t}\n\n\t\tfor (const target of pageTargets) {\n\t\t\tif (this.#closed || this.#pages.has(target.id)) continue\n\n\t\t\ttry {\n\t\t\t\tconst page = await this.#reattach(target.id, target.url, this.#viewport)\n\t\t\t\tif (this.#closed) {\n\t\t\t\t\tawait page.destroy()\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tthis.#pages.set(target.id, page)\n\t\t\t\tthis.#emitter.emit('page', page)\n\t\t\t} catch {\n\t\t\t\t// A disappearing or unsupported target does not invalidate its siblings.\n\t\t\t}\n\t\t}\n\t}\n\n\tasync #attach(\n\t\ttargetId: string,\n\t\turl: string,\n\t\tviewport: BrowserViewport | undefined,\n\t): Promise<BrowserPage> {\n\t\tlet sessionId: string | undefined\n\t\tlet page: BrowserPage | undefined\n\n\t\ttry {\n\t\t\tsessionId = await this.#openSession(targetId)\n\t\t\tawait this.#enableSession(sessionId)\n\t\t\tconst frameId = await this.#mainFrame(sessionId)\n\t\t\tpage = new BrowserPage(\n\t\t\t\tthis.#client,\n\t\t\t\ttargetId,\n\t\t\t\tsessionId,\n\t\t\t\tthis.#writer,\n\t\t\t\turl,\n\t\t\t\tframeId,\n\t\t\t\tthis.#id,\n\t\t\t)\n\t\t\tawait this.#configurePage(page)\n\t\t\tawait this.#emulation.attach(page)\n\t\t\tif (viewport !== undefined) await this.#applyViewport(sessionId, viewport)\n\t\t\tthis.#observe(page)\n\n\t\t\treturn page\n\t\t} catch (error) {\n\t\t\tif (page !== undefined) await page.destroy().catch(() => undefined)\n\t\t\telse if (sessionId !== undefined) await this.#detachSession(sessionId)\n\t\t\tthrow error\n\t\t}\n\t}\n\n\tasync #reattach(\n\t\ttargetId: string,\n\t\turl: string,\n\t\tviewport: BrowserViewport | undefined,\n\t): Promise<BrowserPage> {\n\t\tlet sessionId: string | undefined\n\t\tlet page: BrowserPage | undefined\n\n\t\ttry {\n\t\t\tsessionId = await this.#openSession(targetId)\n\t\t\tawait this.#enableSession(sessionId)\n\t\t\tconst frameId = await this.#mainFrame(sessionId)\n\t\t\tpage = new BrowserPage(\n\t\t\t\tthis.#client,\n\t\t\t\ttargetId,\n\t\t\t\tsessionId,\n\t\t\t\tthis.#writer,\n\t\t\t\turl,\n\t\t\t\tframeId,\n\t\t\t\tthis.#id,\n\t\t\t)\n\t\t\tawait this.#configurePage(page)\n\t\t\tawait this.#emulation.attach(page)\n\t\t\tif (viewport !== undefined) await this.#tryViewport(sessionId, viewport)\n\t\t\tthis.#observe(page)\n\n\t\t\treturn page\n\t\t} catch (error) {\n\t\t\tif (page !== undefined) await page.destroy().catch(() => undefined)\n\t\t\telse if (sessionId !== undefined) await this.#detachSession(sessionId)\n\t\t\tthrow error\n\t\t}\n\t}\n\n\tasync #destroyResources(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.#settle()\n\t\t\tlet failed = false\n\t\t\tlet failure: unknown\n\t\t\tfor (const page of this.#pages.values()) {\n\t\t\t\ttry {\n\t\t\t\t\tawait page.destroy()\n\t\t\t\t} catch (error) {\n\t\t\t\t\tif (!failed) {\n\t\t\t\t\t\tfailed = true\n\t\t\t\t\t\tfailure = error\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.#pages.clear()\n\t\t\tif (failed) throw failure\n\t\t} finally {\n\t\t\tthis.#finish()\n\t\t}\n\t}\n\n\tasync #closeResources(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.#settle()\n\t\t\tlet failed = false\n\t\t\tlet failure: unknown\n\t\t\tfor (const page of this.#pages.values()) {\n\t\t\t\ttry {\n\t\t\t\t\tawait page.close()\n\t\t\t\t} catch (error) {\n\t\t\t\t\tif (!failed) {\n\t\t\t\t\t\tfailed = true\n\t\t\t\t\t\tfailure = error\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.#pages.clear()\n\n\t\t\tif (this.#id !== undefined) {\n\t\t\t\ttry {\n\t\t\t\t\tawait this.#client.send('Target.disposeBrowserContext', {\n\t\t\t\t\t\tbrowserContextId: this.#id,\n\t\t\t\t\t})\n\t\t\t\t} catch (error) {\n\t\t\t\t\tif (!failed) {\n\t\t\t\t\t\tfailed = true\n\t\t\t\t\t\tfailure = error\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (failed) throw failure\n\t\t} finally {\n\t\t\tthis.#finish()\n\t\t}\n\t}\n\n\tasync #settle(): Promise<void> {\n\t\tawait Promise.allSettled([...this.#creating])\n\t\tawait this.#syncing?.catch(() => undefined)\n\t}\n\n\tasync #openSession(targetId: string): Promise<string> {\n\t\tconst result: unknown = await this.#client.send('Target.attachToTarget', {\n\t\t\ttargetId,\n\t\t\tflatten: true,\n\t\t})\n\t\tif (!isRecord(result) || !isString(result['sessionId'])) {\n\t\t\tthrow new BrowserError('Failed to attach to browser target')\n\t\t}\n\t\treturn result['sessionId']\n\t}\n\n\tasync #enableSession(sessionId: string): Promise<void> {\n\t\tawait this.#client.send('Page.enable', undefined, sessionId)\n\t\tawait this.#client.send('Runtime.enable', undefined, sessionId)\n\t}\n\n\tasync #mainFrame(sessionId: string): Promise<string> {\n\t\tconst result = await this.#client.send('Page.getFrameTree', undefined, sessionId)\n\t\tconst frame = readBrowserFrames(result)[0]\n\t\tif (frame === undefined) throw new BrowserError('Failed to resolve the main browser frame')\n\t\treturn frame.id\n\t}\n\n\tasync #configurePage(page: BrowserPage): Promise<void> {\n\t\tawait page.send('Target.setAutoAttach', {\n\t\t\tautoAttach: true,\n\t\t\twaitForDebuggerOnStart: false,\n\t\t\tflatten: true,\n\t\t})\n\t\tawait page.send('Page.setInterceptFileChooserDialog', { enabled: true })\n\t\tconst download: Record<string, unknown> = {\n\t\t\tbehavior:\n\t\t\t\tthis.#downloads === undefined\n\t\t\t\t\t? 'default'\n\t\t\t\t\t: this.#downloads.named === true\n\t\t\t\t\t\t? 'allowAndName'\n\t\t\t\t\t\t: 'allow',\n\t\t\teventsEnabled: true,\n\t\t}\n\t\tif (this.#id !== undefined) download['browserContextId'] = this.#id\n\t\tif (this.#downloads !== undefined) download['downloadPath'] = this.#downloads.path\n\t\tawait this.#client.send('Browser.setDownloadBehavior', download)\n\t\tawait page.network.start()\n\t}\n\n\tasync #applyViewport(sessionId: string, viewport: BrowserViewport): Promise<void> {\n\t\tawait this.#client.send(\n\t\t\t'Emulation.setDeviceMetricsOverride',\n\t\t\t{\n\t\t\t\twidth: viewport.width,\n\t\t\t\theight: viewport.height,\n\t\t\t\tdeviceScaleFactor: viewport.scale ?? 1,\n\t\t\t\tmobile: viewport.mobile ?? false,\n\t\t\t\tscreenOrientation:\n\t\t\t\t\tviewport.landscape === undefined\n\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t: {\n\t\t\t\t\t\t\t\ttype: viewport.landscape ? 'landscapePrimary' : 'portraitPrimary',\n\t\t\t\t\t\t\t\tangle: viewport.landscape ? 90 : 0,\n\t\t\t\t\t\t\t},\n\t\t\t},\n\t\t\tsessionId,\n\t\t)\n\t\tawait this.#client.send(\n\t\t\t'Emulation.setTouchEmulationEnabled',\n\t\t\t{ enabled: viewport.touch ?? false },\n\t\t\tsessionId,\n\t\t)\n\t}\n\n\tasync #tryViewport(sessionId: string, viewport: BrowserViewport): Promise<void> {\n\t\ttry {\n\t\t\tawait this.#applyViewport(sessionId, viewport)\n\t\t} catch {\n\t\t\t// Reattached targets may not support viewport emulation.\n\t\t}\n\t}\n\n\tasync #closeTarget(targetId: string): Promise<void> {\n\t\ttry {\n\t\t\tawait this.#client.send('Target.closeTarget', { targetId })\n\t\t} catch {\n\t\t\t// The target may already be gone.\n\t\t}\n\t}\n\n\tasync #detachSession(sessionId: string): Promise<void> {\n\t\ttry {\n\t\t\tawait this.#client.send('Target.detachFromTarget', { sessionId })\n\t\t} catch {\n\t\t\t// The session may already be detached.\n\t\t}\n\t}\n\n\t#observe(page: BrowserPage): void {\n\t\tpage.emitter.on('popup', (popup) => {\n\t\t\tif (this.#closed) {\n\t\t\t\tvoid popup.destroy().catch(() => undefined)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (instanceOf(BrowserPage)(popup)) {\n\t\t\t\tvoid this.#adoptPopup(popup)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.#emitter.emit('page', popup)\n\t\t})\n\t\tpage.emitter.on('close', () => {\n\t\t\tif (this.#pages.get(page.target) === page) this.#pages.delete(page.target)\n\t\t})\n\t}\n\n\tasync #adoptPopup(popup: BrowserPage): Promise<void> {\n\t\ttry {\n\t\t\tawait this.#emulation.attach(popup)\n\t\t\tif (this.#closed) {\n\t\t\t\tawait popup.destroy()\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.#pages.set(popup.target, popup)\n\t\t\tthis.#observe(popup)\n\t\t\tthis.#emitter.emit('page', popup)\n\t\t} catch {\n\t\t\tawait popup.destroy().catch(() => undefined)\n\t\t}\n\t}\n\n\t#finish(): void {\n\t\tif (this.#emitter.destroyed) return\n\t\tthis.#emitter.emit('close')\n\t\tthis.#emitter.destroy()\n\t}\n}\n","import type {\n\tBrowserSnapshotInput,\n\tBrowserSnapshotInterface,\n\tCDPClientInterface,\n\tCDPClientOptions,\n} from './types.js'\nimport { BrowserSnapshot } from './BrowserSnapshot.js'\nimport { CDPClient } from './CDPClient.js'\n\n/**\n * Create a CDP client bound to the given transport.\n *\n * @param options - The transport (and optional timeout) the client uses\n * @returns A {@link CDPClientInterface}\n *\n * @example\n * ```ts\n * import { createCDPClient } from '@src/core'\n *\n * const client = createCDPClient({ transport })\n * await client.connect()\n * ```\n */\nexport function createCDPClient(options: CDPClientOptions): CDPClientInterface {\n\treturn new CDPClient(options)\n}\n\n/**\n * Create a navigable browser snapshot from decoded serializable data.\n *\n * @param input - Captured documents and computed-style names\n * @returns A {@link BrowserSnapshotInterface}\n *\n * @example\n * ```ts\n * import { createBrowserSnapshot, decodeBrowserSnapshot } from '@src/core'\n *\n * const snapshot = createBrowserSnapshot(decodeBrowserSnapshot(captured, ['display']))\n * snapshot.find({ name: 'main' })\n * ```\n */\nexport function createBrowserSnapshot(input: BrowserSnapshotInput): BrowserSnapshotInterface {\n\treturn new BrowserSnapshot(input)\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","names":[],"sources":["../../../src/core/constants.ts","../../../src/core/errors.ts","../../../src/core/helpers.ts","../../../src/core/CDPClient.ts","../../../src/core/BrowserAccessibility.ts","../../../src/core/BrowserClock.ts","../../../src/core/BrowserCoverage.ts","../../../src/core/BrowserCookieManager.ts","../../../src/core/BrowserEmulationManager.ts","../../../src/core/BrowserCodegen.ts","../../../src/core/BrowserPerformance.ts","../../../src/core/BrowserTracing.ts","../../../src/core/BrowserDiagnostics.ts","../../../src/core/BrowserDialog.ts","../../../src/core/BrowserDownload.ts","../../../src/core/BrowserHandle.ts","../../../src/core/BrowserKeyboard.ts","../../../src/core/BrowserMouse.ts","../../../src/core/BrowserLocator.ts","../../../src/core/BrowserSelectorManager.ts","../../../src/core/BrowserTouch.ts","../../../src/core/BrowserFrame.ts","../../../src/core/BrowserFileChooser.ts","../../../src/core/BrowserHARManager.ts","../../../src/core/BrowserRoute.ts","../../../src/core/BrowserWebSocket.ts","../../../src/core/BrowserNetworkManager.ts","../../../src/core/BrowserNavigationManager.ts","../../../src/core/BrowserScriptManager.ts","../../../src/core/BrowserSnapshot.ts","../../../src/core/BrowserWorker.ts","../../../src/core/BrowserPage.ts","../../../src/core/BrowserPermissionManager.ts","../../../src/core/BrowserStorageManager.ts","../../../src/core/BrowserContext.ts","../../../src/core/factories.ts"],"sourcesContent":["import type { BrowserMouseButton } from './types.js'\n\n// === Base64\n//\n// The lookup table is written out rather than computed from BASE64_CHARS at module scope:\n// constants.ts holds data, and a module-scope callback here is a placement violation the fleet\n// policy sweep rejects. Entry n of the table is BASE64_CHARS[n], and the whole-alphabet\n// round-trip in tests/src/core/helpers.test.ts fails on any single-entry disagreement.\n\n/** Base64 alphabet, index-ordered, used to build {@link BASE64_LOOKUP}. */\nexport const BASE64_CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\n\n/** Base64 character to 6-bit value lookup table, derived from {@link BASE64_CHARS}. */\nexport const BASE64_LOOKUP: Readonly<Record<string, number>> = Object.freeze({\n\tA: 0,\n\tB: 1,\n\tC: 2,\n\tD: 3,\n\tE: 4,\n\tF: 5,\n\tG: 6,\n\tH: 7,\n\tI: 8,\n\tJ: 9,\n\tK: 10,\n\tL: 11,\n\tM: 12,\n\tN: 13,\n\tO: 14,\n\tP: 15,\n\tQ: 16,\n\tR: 17,\n\tS: 18,\n\tT: 19,\n\tU: 20,\n\tV: 21,\n\tW: 22,\n\tX: 23,\n\tY: 24,\n\tZ: 25,\n\ta: 26,\n\tb: 27,\n\tc: 28,\n\td: 29,\n\te: 30,\n\tf: 31,\n\tg: 32,\n\th: 33,\n\ti: 34,\n\tj: 35,\n\tk: 36,\n\tl: 37,\n\tm: 38,\n\tn: 39,\n\to: 40,\n\tp: 41,\n\tq: 42,\n\tr: 43,\n\ts: 44,\n\tt: 45,\n\tu: 46,\n\tv: 47,\n\tw: 48,\n\tx: 49,\n\ty: 50,\n\tz: 51,\n\t'0': 52,\n\t'1': 53,\n\t'2': 54,\n\t'3': 55,\n\t'4': 56,\n\t'5': 57,\n\t'6': 58,\n\t'7': 59,\n\t'8': 60,\n\t'9': 61,\n\t'+': 62,\n\t'/': 63,\n})\n\n// === Browser\n\n/** Default timeout in milliseconds for browser connection, requests, and navigation. */\nexport const BROWSER_DEFAULT_TIMEOUT_MS = 30_000\n\n/**\n * Maximum serialized-character length for an `evaluate()`/`content()` result,\n * enforced IN-PAGE before the result is returned to CDP.\n *\n * @remarks\n * This counts UTF-16 STRING LENGTH (`String#length`), not transport BYTES —\n * the actual CDP frame is UTF-8 encoded (up to 3 bytes/char for common\n * multibyte content) and carries additional JSON/CDP framing overhead on top\n * of the raw content. A `Runtime.evaluate` result above this size, once\n * framed as a CDP JSON response, overflows the native WebSocket inbound frame\n * limit and closes the whole CDP connection — a page-level failure with no\n * clean error. The limit is set well under the observed ~3-4MB transport\n * ceiling (rather than at it) to leave headroom for the length-vs-bytes gap\n * and framing overhead. The cap is enforced by stringifying the candidate\n * result in-page and throwing a recognizable sentinel error (see\n * {@link BROWSER_RESULT_LIMIT_SENTINEL_PREFIX}) before the oversized frame is\n * ever produced, so the caller gets a coded error instead of a dropped\n * connection.\n */\nexport const BROWSER_RESULT_LIMIT = 2_500_000\n\n/**\n * Distinctive prefix for the in-page result-limit sentinel error, immediately\n * followed by the serialized length.\n *\n * @remarks\n * Deliberately unlikely to appear in a page's own thrown error text (unlike\n * a plain `BROWSER_RESULT_LIMIT: ` label), so {@link BROWSER_RESULT_LIMIT_PATTERN}\n * can distinguish the guard's own throw from a page error that merely\n * mentions similar text.\n */\nexport const BROWSER_RESULT_LIMIT_SENTINEL_PREFIX = '[[ORKESTREL_BROWSER_RESULT_LIMIT]]'\n\n/**\n * Matches the in-page result-limit sentinel error message, anchored\n * immediately after the `Error: ` (optionally `Uncaught Error: `) prefix that\n * Chromium prepends to a thrown error's description — so the guard's own\n * throw is recognized only at the message START, not wherever the substring\n * happens to occur.\n */\nexport const BROWSER_RESULT_LIMIT_PATTERN = new RegExp(\n\t`^(?:Uncaught )?Error: \\\\[\\\\[ORKESTREL_BROWSER_RESULT_LIMIT\\\\]\\\\](\\\\d+)`,\n)\n\n/** Poll interval in milliseconds while waiting for a selector to appear. */\nexport const BROWSER_WAIT_POLL_INTERVAL_MS = 100\n\n/** Default maximum node count accepted from a decoded CDP DOM snapshot. */\nexport const BROWSER_SNAPSHOT_NODE_LIMIT = 100_000\n\n/** Isolated-world name used for iframe evaluation. */\nexport const BROWSER_FRAME_WORLD_NAME = '__orkestrelBrowserFrame'\n\n/** Attribute used by the semantic test-id selector. */\nexport const BROWSER_TEST_ID_ATTRIBUTE = 'data-testid'\n\n/** Number of animation frames whose element bounds must agree before trusted input. */\nexport const BROWSER_STABLE_FRAME_COUNT = 2\n\n/** CDP Input modifier bit values keyed by canonical key name. */\nexport const BROWSER_KEY_MODIFIERS: Readonly<Record<string, number>> = Object.freeze({\n\tAlt: 1,\n\tControl: 2,\n\tMeta: 4,\n\tShift: 8,\n})\n\n/** CDP Input pressed-button bit values keyed by public mouse button. */\nexport const BROWSER_MOUSE_BUTTON_MASKS: Readonly<Record<BrowserMouseButton, number>> =\n\tObject.freeze({\n\t\tleft: 1,\n\t\tright: 2,\n\t\tmiddle: 4,\n\t\tback: 8,\n\t\tforward: 16,\n\t})\n\n/** Tool identity embedded in HAR 1.2 documents. */\nexport const BROWSER_HAR_CREATOR = Object.freeze({\n\tname: '@orkestrel/browser',\n\tversion: '0.0.11',\n})\n\n/** Attribute used to tag temporary screenshot styles and masks. */\nexport const BROWSER_SCREENSHOT_ATTRIBUTE = 'data-orkestrel-screenshot'\n\n/**\n * Bound (in milliseconds) on the best-effort `Page.stopLoading` call issued\n * after a failed `navigate()`.\n *\n * @remarks\n * A wedged renderer can make the underlying CDP call hang for the full\n * per-call timeout; capping it to a small fixed bound keeps a navigate\n * failure's total latency close to the original timeout instead of doubling\n * it. Best-effort only — never masks the original navigate error.\n */\nexport const BROWSER_STOP_LOADING_TIMEOUT_MS = 1_000\n\n/** Default viewport width in pixels. */\nexport const BROWSER_DEFAULT_VIEWPORT_WIDTH = 1280\n\n/** Default viewport height in pixels. */\nexport const BROWSER_DEFAULT_VIEWPORT_HEIGHT = 720\n\n// === Browser codegen\n\n/** Name of the CDP runtime binding the codegen recorder script calls into. */\nexport const BROWSER_CODEGEN_BINDING_NAME = '__orkestrelBrowserCodegen'\n\n/**\n * In-page recorder script injected via `Page.addScriptToEvaluateOnNewDocument`\n * and `Runtime.evaluate`.\n *\n * @remarks\n * Attaches capturing-phase listeners for `click`, `input` (fill), and\n * `change` (select) on `document`, builds a stable CSS selector for the\n * target element, and forwards each action to the CDP binding\n * ({@link BROWSER_CODEGEN_BINDING_NAME}) as a JSON string payload. Guarded to\n * install exactly once per document (`window[name]` sentinel) so repeated\n * injection on every new document is idempotent.\n */\nexport const BROWSER_CODEGEN_SOURCE = `(() => {\n\tconst bindingName = ${JSON.stringify(BROWSER_CODEGEN_BINDING_NAME)}\n\tif (window[bindingName + '__installed']) return\n\twindow[bindingName + '__installed'] = true\n\n\tconst selectorFor = (el) => {\n\t\tif (el.id) return '#' + CSS.escape(el.id)\n\t\tconst parts = []\n\t\tlet node = el\n\t\twhile (node && node.nodeType === 1 && parts.length < 8) {\n\t\t\tlet part = node.tagName.toLowerCase()\n\t\t\tif (node.classList && node.classList.length > 0) {\n\t\t\t\tpart += '.' + Array.from(node.classList).map((cls) => CSS.escape(cls)).join('.')\n\t\t\t}\n\t\t\tconst parent = node.parentElement\n\t\t\tif (parent) {\n\t\t\t\tconst siblings = Array.from(parent.children).filter((c) => c.tagName === node.tagName)\n\t\t\t\tif (siblings.length > 1) {\n\t\t\t\t\tpart += ':nth-of-type(' + (siblings.indexOf(node) + 1) + ')'\n\t\t\t\t}\n\t\t\t}\n\t\t\tparts.unshift(part)\n\t\t\tnode = parent\n\t\t}\n\t\treturn parts.join(' > ')\n\t}\n\n\tconst send = (payload) => {\n\t\tif (typeof window[bindingName] === 'function') {\n\t\t\twindow[bindingName](JSON.stringify(payload))\n\t\t}\n\t}\n\n\tdocument.addEventListener(\n\t\t'click',\n\t\t(event) => {\n\t\t\tconst target = event.target\n\t\t\tif (!target || target.nodeType !== 1) return\n\t\t\tsend({ action: 'click', selector: selectorFor(target) })\n\t\t},\n\t\ttrue,\n\t)\n\n\tconst fillableTypes = new Set([\n\t\t'text',\n\t\t'search',\n\t\t'url',\n\t\t'tel',\n\t\t'email',\n\t\t'password',\n\t\t'number',\n\t])\n\n\tdocument.addEventListener(\n\t\t'input',\n\t\t(event) => {\n\t\t\tconst target = event.target\n\t\t\tif (!target || target.nodeType !== 1) return\n\n\t\t\tif (target.isContentEditable) {\n\t\t\t\tsend({ action: 'fill', selector: selectorFor(target), value: target.textContent || '' })\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif (typeof target.value !== 'string') return\n\t\t\tconst tag = target.tagName\n\t\t\tif (tag === 'TEXTAREA') {\n\t\t\t\tsend({ action: 'fill', selector: selectorFor(target), value: target.value })\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (tag === 'INPUT' && fillableTypes.has((target.type || 'text').toLowerCase())) {\n\t\t\t\tsend({ action: 'fill', selector: selectorFor(target), value: target.value })\n\t\t\t}\n\t\t},\n\t\ttrue,\n\t)\n\n\tdocument.addEventListener(\n\t\t'change',\n\t\t(event) => {\n\t\t\tconst target = event.target\n\t\t\tif (!target || target.tagName !== 'SELECT') return\n\t\t\tconst values = Array.from(target.selectedOptions || []).map((option) => option.value)\n\t\t\tsend({ action: 'select', selector: selectorFor(target), values })\n\t\t},\n\t\ttrue,\n\t)\n})()`\n","import { isInstance } from '@orkestrel/contract'\n\n// === Browser errors\n\n/**\n * Base error for all browser automation operations.\n *\n * @remarks\n * Carries a machine-readable `code` and optional `context` (AGENTS §12) so\n * callers can branch in a `catch` without parsing message strings.\n */\nexport class BrowserError extends Error {\n\treadonly code: string\n\treadonly context: Readonly<Record<string, unknown>> | undefined\n\n\tconstructor(\n\t\tmessage: string,\n\t\tcode = 'BROWSER_ERROR',\n\t\tcontext?: Readonly<Record<string, unknown>>,\n\t) {\n\t\tsuper(message)\n\t\tthis.name = 'BrowserError'\n\t\tthis.code = code\n\t\tthis.context = context\n\t}\n}\n\n/**\n * A selector-based lookup or wait timed out without the element appearing.\n */\nexport class BrowserSelectorError extends BrowserError {\n\tconstructor(message: string, context?: Readonly<Record<string, unknown>>) {\n\t\tsuper(message, 'BROWSER_SELECTOR_ERROR', context)\n\t\tthis.name = 'BrowserSelectorError'\n\t}\n}\n\n/**\n * A CDP request received an error response from the remote endpoint.\n *\n * @remarks\n * Carries the originating `method` plus the CDP error's own `code`,\n * `message`, and `data` (when present) in `context`, so callers can branch\n * on the protocol-level error instead of parsing the message string.\n */\nexport class CDPError extends BrowserError {\n\tconstructor(message: string, context?: Readonly<Record<string, unknown>>) {\n\t\tsuper(message, 'BROWSER_CDP_ERROR', context)\n\t\tthis.name = 'CDPError'\n\t}\n}\n\n/**\n * A CDP request could not be sent or completed because the client was not in\n * a connectable state (not connected, closed while connecting, or the\n * connection dropped mid-request).\n */\nexport class CDPConnectionError extends BrowserError {\n\tconstructor(message: string, context?: Readonly<Record<string, unknown>>) {\n\t\tsuper(message, 'BROWSER_CDP_CONNECTION_ERROR', context)\n\t\tthis.name = 'CDPConnectionError'\n\t}\n}\n\n/**\n * A pending CDP request was not answered within its timeout window.\n */\nexport class CDPTimeoutError extends BrowserError {\n\tconstructor(message: string, context?: Readonly<Record<string, unknown>>) {\n\t\tsuper(message, 'BROWSER_CDP_TIMEOUT_ERROR', context)\n\t\tthis.name = 'CDPTimeoutError'\n\t}\n}\n\n/**\n * An `evaluate()`/`content()` result exceeded {@link BROWSER_RESULT_LIMIT}\n * and was rejected in-page before it could overflow the CDP transport frame.\n */\nexport class BrowserResultLimitError extends BrowserError {\n\tconstructor(message: string, context?: Readonly<Record<string, unknown>>) {\n\t\tsuper(message, 'BROWSER_RESULT_LIMIT_ERROR', context)\n\t\tthis.name = 'BrowserResultLimitError'\n\t}\n}\n\n// === Browser type guards\n\n/**\n * Narrow an unknown value to BrowserError.\n *\n * @param value - Value to check\n * @returns True when value is a BrowserError instance\n */\nexport function isBrowserError(value: unknown): value is BrowserError {\n\treturn isInstance(value, BrowserError)\n}\n\n/**\n * Narrow an unknown value to BrowserSelectorError.\n *\n * @param value - Value to check\n * @returns True when value is a BrowserSelectorError instance\n */\nexport function isBrowserSelectorError(value: unknown): value is BrowserSelectorError {\n\treturn isInstance(value, BrowserSelectorError)\n}\n\n/**\n * Narrow an unknown value to CDPError.\n *\n * @param value - Value to check\n * @returns True when value is a CDPError instance\n */\nexport function isCDPError(value: unknown): value is CDPError {\n\treturn isInstance(value, CDPError)\n}\n\n/**\n * Narrow an unknown value to CDPConnectionError.\n *\n * @param value - Value to check\n * @returns True when value is a CDPConnectionError instance\n */\nexport function isCDPConnectionError(value: unknown): value is CDPConnectionError {\n\treturn isInstance(value, CDPConnectionError)\n}\n\n/**\n * Narrow an unknown value to CDPTimeoutError.\n *\n * @param value - Value to check\n * @returns True when value is a CDPTimeoutError instance\n */\nexport function isCDPTimeoutError(value: unknown): value is CDPTimeoutError {\n\treturn isInstance(value, CDPTimeoutError)\n}\n\n/**\n * Narrow an unknown value to BrowserResultLimitError.\n *\n * @param value - Value to check\n * @returns True when value is a BrowserResultLimitError instance\n */\nexport function isBrowserResultLimitError(value: unknown): value is BrowserResultLimitError {\n\treturn isInstance(value, BrowserResultLimitError)\n}\n","import type {\n\tBrowserCodegenAction,\n\tBrowserCodegenScriptOptions,\n\tBrowserBindingCall,\n\tBrowserChord,\n\tBrowserCookie,\n\tBrowserCookieInput,\n\tBrowserCookiePartition,\n\tBrowserConsoleMessage,\n\tBrowserContextOptions,\n\tBrowserCoverageRange,\n\tBrowserDocument,\n\tBrowserDownloadProgress,\n\tBrowserDownloadStart,\n\tBrowserEmulationOptions,\n\tBrowserFrameInfo,\n\tBrowserFunctionCoverage,\n\tBrowserHAR,\n\tBrowserHAREntry,\n\tBrowserHARPending,\n\tBrowserHARValue,\n\tBrowserLayout,\n\tBrowserMetric,\n\tBrowserActionabilityOptions,\n\tBrowserActionOptions,\n\tBrowserAccessibilityOptions,\n\tBrowserAccessibilitySnapshot,\n\tBrowserAXNode,\n\tBrowserKey,\n\tBrowserNode,\n\tBrowserNodePredicate,\n\tBrowserNodeQuery,\n\tBrowserPageError,\n\tBrowserProfile,\n\tBrowserProfileFrame,\n\tBrowserProfileNode,\n\tBrowserMouseButton,\n\tBrowserPoint,\n\tBrowserPDFOptions,\n\tBrowserMedia,\n\tBrowserRequest,\n\tBrowserRequestFailure,\n\tBrowserResponse,\n\tBrowserRouteQuery,\n\tBrowserSecurity,\n\tBrowserQuad,\n\tBrowserQuery,\n\tBrowserRect,\n\tBrowserSnapshotInput,\n\tBrowserScriptCoverage,\n\tBrowserScreenshotOptions,\n\tBrowserStorageEntry,\n\tBrowserStorageOrigin,\n\tBrowserStreamChunk,\n\tBrowserStackFrame,\n\tBrowserStyleCoverage,\n\tBrowserTiming,\n\tBrowserTimingRange,\n\tBrowserViewport,\n\tBrowserWebSocketFrame,\n} from './types.js'\nimport {\n\tattempt,\n\tisArray,\n\tisBoolean,\n\tisFiniteNumber,\n\tisFunction,\n\tisInteger,\n\tisRecord,\n\tisString,\n\tparseArray,\n\tparseEnum,\n\tparseJSON,\n} from '@orkestrel/contract'\nimport {\n\tBASE64_CHARS,\n\tBASE64_LOOKUP,\n\tBROWSER_RESULT_LIMIT,\n\tBROWSER_RESULT_LIMIT_PATTERN,\n\tBROWSER_RESULT_LIMIT_SENTINEL_PREFIX,\n\tBROWSER_SCREENSHOT_ATTRIBUTE,\n\tBROWSER_SNAPSHOT_NODE_LIMIT,\n\tBROWSER_STABLE_FRAME_COUNT,\n\tBROWSER_TEST_ID_ATTRIBUTE,\n\tBROWSER_KEY_MODIFIERS,\n\tBROWSER_MOUSE_BUTTON_MASKS,\n\tBROWSER_WAIT_POLL_INTERVAL_MS,\n} from './constants.js'\nimport { BrowserError, BrowserResultLimitError } from './errors.js'\n\n/**\n * Decode a base64-encoded string into raw bytes.\n *\n * @remarks\n * Pure JS implementation — no `Buffer`, no `atob` (DOM-only) — so it runs\n * identically in Node and browser environments. Whitespace and `=` padding\n * are ignored; invalid characters are skipped.\n *\n * @param text - Base64-encoded input string\n * @returns Decoded bytes\n *\n * @example\n * ```ts\n * decodeBase64('aGVsbG8=') // Uint8Array [104, 101, 108, 108, 111]\n * ```\n */\nexport function decodeBase64(text: string): Uint8Array {\n\tconst clean = text.replace(/[^A-Za-z0-9+/]/g, '')\n\tconst bytes: number[] = []\n\n\tlet buffer = 0\n\tlet bits = 0\n\n\tfor (const char of clean) {\n\t\tconst value = BASE64_LOOKUP[char]\n\t\tif (value === undefined) continue\n\n\t\tbuffer = (buffer << 6) | value\n\t\tbits += 6\n\n\t\tif (bits >= 8) {\n\t\t\tbits -= 8\n\t\t\tbytes.push((buffer >> bits) & 0xff)\n\t\t}\n\t}\n\n\treturn new Uint8Array(bytes)\n}\n\n/**\n * Encode raw bytes as base64 without relying on Node or DOM globals.\n *\n * @param bytes - Raw input bytes\n * @returns Base64 text\n */\nexport function encodeBase64(bytes: Uint8Array): string {\n\tlet result = ''\n\tfor (let index = 0; index < bytes.length; index += 3) {\n\t\tconst first = bytes[index]\n\t\tconst second = bytes[index + 1]\n\t\tconst third = bytes[index + 2]\n\t\tif (first === undefined) break\n\t\tconst value = (first << 16) | ((second ?? 0) << 8) | (third ?? 0)\n\t\tresult += BASE64_CHARS[(value >> 18) & 63] ?? ''\n\t\tresult += BASE64_CHARS[(value >> 12) & 63] ?? ''\n\t\tresult += second === undefined ? '=' : (BASE64_CHARS[(value >> 6) & 63] ?? '')\n\t\tresult += third === undefined ? '=' : (BASE64_CHARS[value & 63] ?? '')\n\t}\n\treturn result\n}\n\n/** Encode UTF-8 text as bytes. */\nexport function textToBytes(value: string): Uint8Array {\n\treturn new TextEncoder().encode(value)\n}\n\n/** Decode UTF-8 bytes as text. */\nexport function bytesToText(value: Uint8Array): string {\n\treturn new TextDecoder().decode(value)\n}\n\n/**\n * Convert a header record to Fetch-domain name/value entries.\n *\n * @param headers - Header record\n * @returns Protocol header entries\n */\nexport function browserHeadersToProtocol(\n\theaders: Readonly<Record<string, string>>,\n): ReadonlyArray<Readonly<Record<string, string>>> {\n\treturn Object.entries(headers).map(([name, value]) => ({ name, value }))\n}\n\n/**\n * Decode a Chromium Headers object into string values.\n *\n * @param value - Unknown headers\n * @returns Frozen-compatible header record\n */\nexport function readBrowserHeaders(value: unknown): Readonly<Record<string, string>> {\n\tif (!isRecord(value)) return {}\n\tconst headers: Record<string, string> = {}\n\tfor (const [name, entry] of Object.entries(value)) {\n\t\tif (isString(entry) || isFiniteNumber(entry)) headers[name] = String(entry)\n\t}\n\treturn headers\n}\n\n/**\n * Decode one `Network.requestWillBeSent` or `Fetch.requestPaused` event.\n *\n * @param value - Unknown event parameters\n * @returns Request or undefined\n */\nexport function readBrowserRequest(value: unknown): BrowserRequest | undefined {\n\tif (!isRecord(value) || !isString(value['requestId']) || !isRecord(value['request'])) {\n\t\treturn undefined\n\t}\n\tconst request = value['request']\n\tif (!isString(request['url']) || !isString(request['method'])) {\n\t\treturn undefined\n\t}\n\tconst timestamp = isFiniteNumber(value['timestamp']) ? value['timestamp'] : undefined\n\tconst walltime = isFiniteNumber(value['wallTime']) ? value['wallTime'] : undefined\n\treturn {\n\t\tid: value['requestId'],\n\t\tloader: isString(value['loaderId']) ? value['loaderId'] : undefined,\n\t\tframe: isString(value['frameId']) ? value['frameId'] : undefined,\n\t\turl: request['url'],\n\t\tmethod: request['method'],\n\t\theaders: readBrowserHeaders(request['headers']),\n\t\tpost: isString(request['postData']) ? request['postData'] : undefined,\n\t\tresource: isString(value['type'])\n\t\t\t? value['type']\n\t\t\t: isString(value['resourceType'])\n\t\t\t\t? value['resourceType']\n\t\t\t\t: undefined,\n\t\ttimestamp,\n\t\twalltime,\n\t\tredirect: readBrowserResponseRecord(\n\t\t\tvalue['redirectResponse'],\n\t\t\tvalue['requestId'],\n\t\t\tisString(value['loaderId']) ? value['loaderId'] : '',\n\t\t\tisString(value['frameId']) ? value['frameId'] : undefined,\n\t\t\ttimestamp ?? 0,\n\t\t),\n\t}\n}\n\n/**\n * Decode one `Network.responseReceived` event.\n *\n * @param value - Unknown event parameters\n * @returns Response or undefined\n */\nexport function readBrowserResponse(value: unknown): BrowserResponse | undefined {\n\tif (\n\t\t!isRecord(value) ||\n\t\t!isString(value['requestId']) ||\n\t\t!isString(value['loaderId']) ||\n\t\t!isFiniteNumber(value['timestamp'])\n\t) {\n\t\treturn undefined\n\t}\n\treturn readBrowserResponseRecord(\n\t\tvalue['response'],\n\t\tvalue['requestId'],\n\t\tvalue['loaderId'],\n\t\tisString(value['frameId']) ? value['frameId'] : undefined,\n\t\tvalue['timestamp'],\n\t)\n}\n\n/**\n * Decode one Chromium response object with its event identity.\n *\n * @param value - Unknown response object\n * @param id - Request id\n * @param loader - Loader id\n * @param frame - Optional frame id\n * @param timestamp - Monotonic event timestamp\n * @returns Response or undefined\n */\nexport function readBrowserResponseRecord(\n\tvalue: unknown,\n\tid: string,\n\tloader: string,\n\tframe: string | undefined,\n\ttimestamp: number,\n): BrowserResponse | undefined {\n\tif (\n\t\t!isRecord(value) ||\n\t\t!isString(value['url']) ||\n\t\t!isFiniteNumber(value['status']) ||\n\t\t!isString(value['statusText']) ||\n\t\t!isString(value['mimeType']) ||\n\t\t!isString(value['protocol']) ||\n\t\t!isFiniteNumber(timestamp)\n\t) {\n\t\treturn undefined\n\t}\n\treturn {\n\t\tid,\n\t\tloader,\n\t\tframe,\n\t\turl: value['url'],\n\t\tstatus: value['status'],\n\t\tphrase: value['statusText'],\n\t\theaders: readBrowserHeaders(value['headers']),\n\t\tmime: value['mimeType'],\n\t\tprotocol: value['protocol'],\n\t\taddress: isString(value['remoteIPAddress']) ? value['remoteIPAddress'] : undefined,\n\t\tport: isFiniteNumber(value['remotePort']) ? value['remotePort'] : undefined,\n\t\tcached: value['fromDiskCache'] === true || value['fromPrefetchCache'] === true,\n\t\tworker: value['fromServiceWorker'] === true,\n\t\ttimestamp,\n\t\ttiming: readBrowserTiming(value['timing']),\n\t\tsecurity: readBrowserSecurity(value['securityDetails']),\n\t}\n}\n\n/**\n * Decode Chromium response timing.\n *\n * @param value - Unknown timing object\n * @returns Timing or undefined\n */\nexport function readBrowserTiming(value: unknown): BrowserTiming | undefined {\n\tif (!isRecord(value) || !isFiniteNumber(value['requestTime']) || value['requestTime'] < 0) {\n\t\treturn undefined\n\t}\n\tconst receive = value['receiveHeadersEnd']\n\treturn {\n\t\trequest: value['requestTime'],\n\t\tproxy: readBrowserTimingRange(value, 'proxyStart', 'proxyEnd'),\n\t\tdns: readBrowserTimingRange(value, 'dnsStart', 'dnsEnd'),\n\t\tconnect: readBrowserTimingRange(value, 'connectStart', 'connectEnd'),\n\t\tssl: readBrowserTimingRange(value, 'sslStart', 'sslEnd'),\n\t\tsend: readBrowserTimingRange(value, 'sendStart', 'sendEnd'),\n\t\treceive: isFiniteNumber(receive) && receive >= 0 ? receive : undefined,\n\t}\n}\n\n/**\n * Decode one start/end pair from Chromium network timing data.\n *\n * @param value - Unknown timing object\n * @param start - Start field\n * @param end - End field\n * @returns Timing range or undefined\n */\nexport function readBrowserTimingRange(\n\tvalue: unknown,\n\tstart: string,\n\tend: string,\n): BrowserTimingRange | undefined {\n\tif (!isRecord(value)) return undefined\n\tconst startValue = value[start]\n\tconst endValue = value[end]\n\tif (\n\t\t!isFiniteNumber(startValue) ||\n\t\tstartValue < 0 ||\n\t\t!isFiniteNumber(endValue) ||\n\t\tendValue < startValue\n\t) {\n\t\treturn undefined\n\t}\n\treturn { start: startValue, end: endValue }\n}\n\n/**\n * Build a standards-shaped HAR 1.2 entry from one observed exchange.\n *\n * @param pending - Request and optional response captured by the recorder\n * @param duration - Whole exchange duration in milliseconds\n * @param body - Optional decoded response body\n * @param error - Optional request failure description\n * @returns HAR 1.2 entry\n */\nexport function createBrowserHAREntry(\n\tpending: BrowserHARPending,\n\tduration: number,\n\tbody?: Uint8Array,\n\terror?: string,\n): BrowserHAREntry {\n\tconst response = pending.response\n\tconst requestHeaders: BrowserHARValue[] = Object.entries(pending.request.headers).map(\n\t\t([name, value]) => ({ name, value }),\n\t)\n\tconst responseHeaders: BrowserHARValue[] =\n\t\tresponse === undefined\n\t\t\t? []\n\t\t\t: Object.entries(response.headers).map(([name, value]) => ({ name, value }))\n\tconst query: BrowserHARValue[] = []\n\tif (URL.canParse(pending.request.url)) {\n\t\tfor (const [name, value] of new URL(pending.request.url).searchParams) {\n\t\t\tquery.push({ name, value })\n\t\t}\n\t}\n\tconst post = pending.request.post\n\tconst requestMime =\n\t\tObject.entries(pending.request.headers).find(\n\t\t\t([name]) => name.toLowerCase() === 'content-type',\n\t\t)?.[1] ?? 'application/octet-stream'\n\tconst redirect =\n\t\tresponse === undefined\n\t\t\t? ''\n\t\t\t: (Object.entries(response.headers).find(\n\t\t\t\t\t([name]) => name.toLowerCase() === 'location',\n\t\t\t\t)?.[1] ?? '')\n\tconst timing = response?.timing\n\tconst dns = timing?.dns === undefined ? -1 : Math.max(0, timing.dns.end - timing.dns.start)\n\tconst connect =\n\t\ttiming?.connect === undefined ? -1 : Math.max(0, timing.connect.end - timing.connect.start)\n\tconst send = timing?.send === undefined ? 0 : Math.max(0, timing.send.end - timing.send.start)\n\tconst wait =\n\t\ttiming?.receive === undefined\n\t\t\t? Math.max(0, duration)\n\t\t\t: Math.max(0, timing.receive - (timing.send?.end ?? 0))\n\tconst ssl = timing?.ssl === undefined ? -1 : Math.max(0, timing.ssl.end - timing.ssl.start)\n\tconst text = body === undefined ? undefined : encodeBase64(body)\n\tconst size = body?.byteLength ?? (response === undefined ? 0 : -1)\n\n\treturn {\n\t\tstartedDateTime: new Date(pending.started).toISOString(),\n\t\ttime: Math.max(0, duration),\n\t\trequest: {\n\t\t\tmethod: pending.request.method,\n\t\t\turl: pending.request.url,\n\t\t\thttpVersion: response?.protocol ?? 'HTTP/0.0',\n\t\t\tcookies: [],\n\t\t\theaders: requestHeaders,\n\t\t\tqueryString: query,\n\t\t\t...(post !== undefined\n\t\t\t\t? {\n\t\t\t\t\t\tpostData: {\n\t\t\t\t\t\t\tmimeType: requestMime,\n\t\t\t\t\t\t\ttext: post,\n\t\t\t\t\t\t},\n\t\t\t\t\t}\n\t\t\t\t: {}),\n\t\t\theadersSize: -1,\n\t\t\tbodySize: post === undefined ? 0 : textToBytes(post).byteLength,\n\t\t},\n\t\tresponse: {\n\t\t\tstatus: response?.status ?? 0,\n\t\t\tstatusText: response?.phrase ?? error ?? 'Request failed',\n\t\t\thttpVersion: response?.protocol ?? 'HTTP/0.0',\n\t\t\tcookies: [],\n\t\t\theaders: responseHeaders,\n\t\t\tcontent: {\n\t\t\t\tsize,\n\t\t\t\tmimeType: response?.mime ?? 'application/octet-stream',\n\t\t\t\t...(text !== undefined ? { text, encoding: 'base64' } : {}),\n\t\t\t},\n\t\t\tredirectURL: redirect,\n\t\t\theadersSize: -1,\n\t\t\tbodySize: size,\n\t\t},\n\t\tcache: {},\n\t\ttimings: {\n\t\t\tblocked: -1,\n\t\t\tdns,\n\t\t\tconnect,\n\t\t\tsend,\n\t\t\twait,\n\t\t\treceive: Math.max(0, duration - wait - send),\n\t\t\tssl,\n\t\t},\n\t}\n}\n\n/**\n * Convert HAR name/value headers into a Fetch-domain header record.\n *\n * @param headers - HAR header entries\n * @returns Header record with later duplicate names replacing earlier values\n */\nexport function browserHARHeadersToRecord(\n\theaders: readonly BrowserHARValue[],\n): Readonly<Record<string, string>> {\n\tconst result: Record<string, string> = {}\n\tfor (const header of headers) {\n\t\tObject.defineProperty(result, header.name, {\n\t\t\tvalue: header.value,\n\t\t\tenumerable: true,\n\t\t\tconfigurable: true,\n\t\t\twritable: true,\n\t\t})\n\t}\n\treturn result\n}\n\n/**\n * Validate the HAR 1.2 fields required for deterministic replay.\n *\n * @param value - Candidate archive\n */\nexport function validateBrowserHAR(value: unknown): asserts value is BrowserHAR {\n\tif (\n\t\t!isRecord(value) ||\n\t\t!isRecord(value['log']) ||\n\t\tvalue['log']['version'] !== '1.2' ||\n\t\t!isRecord(value['log']['creator']) ||\n\t\t!isString(value['log']['creator']['name']) ||\n\t\t!isString(value['log']['creator']['version']) ||\n\t\t!isArray(value['log']['entries'])\n\t) {\n\t\tthrow new BrowserError('Browser HAR document is malformed')\n\t}\n\tfor (const [index, entry] of value['log']['entries'].entries()) {\n\t\tif (\n\t\t\t!isRecord(entry) ||\n\t\t\t!isString(entry['startedDateTime']) ||\n\t\t\t!isFiniteNumber(Date.parse(entry['startedDateTime'])) ||\n\t\t\t!isFiniteNumber(entry['time']) ||\n\t\t\tentry['time'] < 0 ||\n\t\t\t!isRecord(entry['request']) ||\n\t\t\t!isString(entry['request']['url']) ||\n\t\t\t!URL.canParse(entry['request']['url']) ||\n\t\t\t!isString(entry['request']['method']) ||\n\t\t\t!isString(entry['request']['httpVersion']) ||\n\t\t\t!isArray(entry['request']['cookies']) ||\n\t\t\t!isArray(entry['request']['headers']) ||\n\t\t\t!isArray(entry['request']['queryString']) ||\n\t\t\t!isInteger(entry['request']['headersSize']) ||\n\t\t\tentry['request']['headersSize'] < -1 ||\n\t\t\t!isInteger(entry['request']['bodySize']) ||\n\t\t\tentry['request']['bodySize'] < -1 ||\n\t\t\t!isRecord(entry['response']) ||\n\t\t\t!isInteger(entry['response']['status']) ||\n\t\t\tentry['response']['status'] < 0 ||\n\t\t\tentry['response']['status'] > 999 ||\n\t\t\t!isString(entry['response']['statusText']) ||\n\t\t\t!isString(entry['response']['httpVersion']) ||\n\t\t\t!isArray(entry['response']['cookies']) ||\n\t\t\t!isArray(entry['response']['headers']) ||\n\t\t\t!isRecord(entry['response']['content']) ||\n\t\t\t!isString(entry['response']['redirectURL']) ||\n\t\t\t!isInteger(entry['response']['headersSize']) ||\n\t\t\tentry['response']['headersSize'] < -1 ||\n\t\t\t!isInteger(entry['response']['bodySize']) ||\n\t\t\tentry['response']['bodySize'] < -1 ||\n\t\t\t!isRecord(entry['cache']) ||\n\t\t\t!isRecord(entry['timings'])\n\t\t) {\n\t\t\tthrow new BrowserError('Browser HAR entry is malformed', undefined, { index })\n\t\t}\n\t\tfor (const [cookieIndex, cookie] of entry['request']['cookies'].entries()) {\n\t\t\tif (\n\t\t\t\t!isRecord(cookie) ||\n\t\t\t\t!isString(cookie['name']) ||\n\t\t\t\t!isString(cookie['value']) ||\n\t\t\t\t(cookie['path'] !== undefined && !isString(cookie['path'])) ||\n\t\t\t\t(cookie['domain'] !== undefined && !isString(cookie['domain'])) ||\n\t\t\t\t(cookie['expires'] !== undefined && !isString(cookie['expires'])) ||\n\t\t\t\t(cookie['httpOnly'] !== undefined && !isBoolean(cookie['httpOnly'])) ||\n\t\t\t\t(cookie['secure'] !== undefined && !isBoolean(cookie['secure']))\n\t\t\t) {\n\t\t\t\tthrow new BrowserError('Browser HAR request cookie is malformed', undefined, {\n\t\t\t\t\tindex,\n\t\t\t\t\tcookie: cookieIndex,\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t\tfor (const [headerIndex, header] of entry['request']['headers'].entries()) {\n\t\t\tif (!isRecord(header) || !isString(header['name']) || !isString(header['value'])) {\n\t\t\t\tthrow new BrowserError('Browser HAR request header is malformed', undefined, {\n\t\t\t\t\tindex,\n\t\t\t\t\theader: headerIndex,\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t\tfor (const [queryIndex, query] of entry['request']['queryString'].entries()) {\n\t\t\tif (!isRecord(query) || !isString(query['name']) || !isString(query['value'])) {\n\t\t\t\tthrow new BrowserError('Browser HAR query value is malformed', undefined, {\n\t\t\t\t\tindex,\n\t\t\t\t\tquery: queryIndex,\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t\tconst post = entry['request']['postData']\n\t\tif (\n\t\t\tpost !== undefined &&\n\t\t\t(!isRecord(post) || !isString(post['mimeType']) || !isString(post['text']))\n\t\t) {\n\t\t\tthrow new BrowserError('Browser HAR request body is malformed', undefined, { index })\n\t\t}\n\t\tfor (const [cookieIndex, cookie] of entry['response']['cookies'].entries()) {\n\t\t\tif (\n\t\t\t\t!isRecord(cookie) ||\n\t\t\t\t!isString(cookie['name']) ||\n\t\t\t\t!isString(cookie['value']) ||\n\t\t\t\t(cookie['path'] !== undefined && !isString(cookie['path'])) ||\n\t\t\t\t(cookie['domain'] !== undefined && !isString(cookie['domain'])) ||\n\t\t\t\t(cookie['expires'] !== undefined && !isString(cookie['expires'])) ||\n\t\t\t\t(cookie['httpOnly'] !== undefined && !isBoolean(cookie['httpOnly'])) ||\n\t\t\t\t(cookie['secure'] !== undefined && !isBoolean(cookie['secure']))\n\t\t\t) {\n\t\t\t\tthrow new BrowserError('Browser HAR response cookie is malformed', undefined, {\n\t\t\t\t\tindex,\n\t\t\t\t\tcookie: cookieIndex,\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t\tfor (const [headerIndex, header] of entry['response']['headers'].entries()) {\n\t\t\tif (!isRecord(header) || !isString(header['name']) || !isString(header['value'])) {\n\t\t\t\tthrow new BrowserError('Browser HAR response header is malformed', undefined, {\n\t\t\t\t\tindex,\n\t\t\t\t\theader: headerIndex,\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t\tconst text = entry['response']['content']['text']\n\t\tconst encoding = entry['response']['content']['encoding']\n\t\tif (\n\t\t\t!isInteger(entry['response']['content']['size']) ||\n\t\t\tentry['response']['content']['size'] < -1 ||\n\t\t\t!isString(entry['response']['content']['mimeType']) ||\n\t\t\t(text !== undefined && !isString(text)) ||\n\t\t\t(encoding !== undefined && encoding !== 'base64') ||\n\t\t\t(encoding === 'base64' &&\n\t\t\t\t(text === undefined ||\n\t\t\t\t\t!/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(text)))\n\t\t) {\n\t\t\tthrow new BrowserError('Browser HAR response content is malformed', undefined, { index })\n\t\t}\n\t\tfor (const name of ['blocked', 'dns', 'connect', 'send', 'wait', 'receive', 'ssl']) {\n\t\t\tconst timing = entry['timings'][name]\n\t\t\tif (!isFiniteNumber(timing) || timing < -1) {\n\t\t\t\tthrow new BrowserError('Browser HAR timing is malformed', undefined, {\n\t\t\t\t\tindex,\n\t\t\t\t\ttiming: name,\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t}\n}\n\n/**\n * Decode Chromium TLS security details.\n *\n * @param value - Unknown security details\n * @returns Security metadata or undefined\n */\nexport function readBrowserSecurity(value: unknown): BrowserSecurity | undefined {\n\tif (\n\t\t!isRecord(value) ||\n\t\t!isString(value['protocol']) ||\n\t\t!isString(value['issuer']) ||\n\t\t!isFiniteNumber(value['validFrom']) ||\n\t\t!isFiniteNumber(value['validTo']) ||\n\t\tvalue['validTo'] < value['validFrom']\n\t) {\n\t\treturn undefined\n\t}\n\treturn {\n\t\tprotocol: value['protocol'],\n\t\tissuer: value['issuer'],\n\t\tfrom: value['validFrom'],\n\t\tto: value['validTo'],\n\t}\n}\n\n/**\n * Decode one `Network.loadingFailed` event.\n *\n * @param value - Unknown event parameters\n * @returns Failure or undefined\n */\nexport function readBrowserRequestFailure(value: unknown): BrowserRequestFailure | undefined {\n\tif (!isRecord(value) || !isString(value['requestId']) || !isString(value['errorText'])) {\n\t\treturn undefined\n\t}\n\treturn {\n\t\tid: value['requestId'],\n\t\terror: value['errorText'],\n\t\tcancelled: value['canceled'] === true,\n\t\tblocked: isString(value['blockedReason']) ? value['blockedReason'] : undefined,\n\t}\n}\n\n/**\n * Decode one WebSocket frame event.\n *\n * @param value - Unknown event parameters\n * @returns Frame or undefined\n */\nexport function readBrowserWebSocketFrame(value: unknown): BrowserWebSocketFrame | undefined {\n\tif (!isRecord(value) || !isRecord(value['response']) || !isFiniteNumber(value['timestamp'])) {\n\t\treturn undefined\n\t}\n\tconst frame = value['response']\n\tif (!isInteger(frame['opcode']) || frame['opcode'] < 0 || !isString(frame['payloadData'])) {\n\t\treturn undefined\n\t}\n\treturn {\n\t\topcode: frame['opcode'],\n\t\tdata: frame['payloadData'],\n\t\tmasked: frame['mask'] === true,\n\t\ttimestamp: value['timestamp'],\n\t}\n}\n\n/**\n * Match a request against route criteria.\n *\n * @param request - Observed request\n * @param query - Match criteria\n * @returns Whether every supplied criterion matches\n */\nexport function matchesBrowserRoute(request: BrowserRequest, query: BrowserRouteQuery): boolean {\n\tif (query.method !== undefined && request.method !== query.method) return false\n\tif (query.resource !== undefined && request.resource !== query.resource) return false\n\tif (query.url === undefined) return true\n\treturn matchesBrowserURL(request.url, query.url)\n}\n\n/**\n * Match a URL using Chromium-style `*` and `**` glob segments.\n *\n * @param url - Candidate URL\n * @param pattern - Glob pattern\n * @returns Whether the whole URL matches\n */\nexport function matchesBrowserURL(url: string, pattern: string): boolean {\n\tconst source = pattern\n\t\t.replace(/[.+?^${}()|[\\]\\\\]/g, '\\\\$&')\n\t\t.replace(/\\*\\*/g, '[[DOUBLE_STAR]]')\n\t\t.replace(/\\*/g, '[^/]*')\n\t\t.replace(/\\[\\[DOUBLE_STAR\\]\\]/g, '.*')\n\treturn new RegExp(`^${source}$`).test(url)\n}\n\n/**\n * Compile an auto-retrying in-page predicate wait.\n *\n * @param expression - Value or function expression\n * @param timeout - Maximum wait in milliseconds\n * @returns Promise expression resolving to the first truthy value or false\n */\nexport function compileFunctionWaitExpression(expression: string, timeout: number): string {\n\treturn `new Promise((resolve, reject) => {\n\tconst deadline = performance.now() + ${timeout}\n\tconst predicate = (${expression})\n\tconst check = async () => {\n\t\ttry {\n\t\t\tconst value = typeof predicate === 'function' ? await predicate() : await predicate\n\t\t\tif (value) {\n\t\t\t\tresolve(value)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (performance.now() >= deadline) {\n\t\t\t\tresolve(false)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tsetTimeout(check, ${BROWSER_WAIT_POLL_INTERVAL_MS})\n\t\t} catch (error) {\n\t\t\treject(error)\n\t\t}\n\t}\n\tvoid check()\n})`\n}\n\n/**\n * Decode one Runtime binding invocation.\n *\n * @param value - Unknown `Runtime.bindingCalled` parameters\n * @returns Valid call or undefined\n */\nexport function readBrowserBindingCall(value: unknown): BrowserBindingCall | undefined {\n\tif (\n\t\t!isRecord(value) ||\n\t\t!isString(value['name']) ||\n\t\t!isString(value['payload']) ||\n\t\t!isInteger(value['executionContextId'])\n\t) {\n\t\treturn undefined\n\t}\n\tconst payload = parseJSON(value['payload'])\n\tif (\n\t\t!isRecord(payload) ||\n\t\t!isString(payload['id']) ||\n\t\t!isString(payload['name']) ||\n\t\t!isArray(payload['args']) ||\n\t\tpayload['name'] !== value['name']\n\t) {\n\t\treturn undefined\n\t}\n\treturn {\n\t\tid: payload['id'],\n\t\tname: payload['name'],\n\t\targs: payload['args'],\n\t\tcontext: value['executionContextId'],\n\t}\n}\n\n/**\n * Compile the page-side promise facade for one Runtime binding.\n *\n * @param name - Binding identifier\n * @returns Self-installing script source\n */\nexport function compileBrowserBindingSource(name: string): string {\n\tconst binding = JSON.stringify(name)\n\tconst state = JSON.stringify(`__orkestrelBinding_${name}`)\n\treturn `(() => {\n\tconst name = ${binding}\n\tconst key = ${state}\n\tif (globalThis[key]) return\n\tconst send = globalThis[name]\n\tif (typeof send !== 'function') throw new Error('Browser binding transport is unavailable')\n\tconst pending = new Map()\n\tlet sequence = 0\n\tglobalThis[key] = {\n\t\tresolve(id, success, value) {\n\t\t\tconst entry = pending.get(id)\n\t\t\tif (!entry) return\n\t\t\tpending.delete(id)\n\t\t\tif (success) entry.resolve(value)\n\t\t\telse entry.reject(new Error(String(value)))\n\t\t},\n\t}\n\tglobalThis[name] = (...args) => new Promise((resolve, reject) => {\n\t\tsequence += 1\n\t\tconst id = String(sequence)\n\t\tpending.set(id, { resolve, reject })\n\t\tsend(JSON.stringify({ id, name, args }))\n\t})\n})()`\n}\n\n/**\n * Compile delivery of a host binding result to one execution context.\n *\n * @param name - Binding identifier\n * @param id - Call identifier\n * @param success - Resolve rather than reject\n * @param value - Serializable result or error\n * @returns Runtime expression\n */\nexport function compileBrowserBindingResult(\n\tname: string,\n\tid: string,\n\tsuccess: boolean,\n\tvalue: unknown,\n): string {\n\treturn `globalThis[${JSON.stringify(`__orkestrelBinding_${name}`)}]?.resolve(${JSON.stringify(id)}, ${JSON.stringify(success)}, ${JSON.stringify(value)})`\n}\n\n/**\n * Compile current-document cleanup for one page-side host binding facade.\n *\n * @param name - Binding identifier\n * @returns Runtime cleanup expression\n */\nexport function compileBrowserBindingCleanup(name: string): string {\n\treturn `(() => {\n\tdelete globalThis[${JSON.stringify(name)}]\n\tdelete globalThis[${JSON.stringify(`__orkestrelBinding_${name}`)}]\n\treturn true\n})()`\n}\n\n/**\n * Decode `Page.addScriptToEvaluateOnNewDocument` result.\n *\n * @param value - Unknown protocol result\n * @returns Script identifier\n */\nexport function readBrowserScriptIdentifier(value: unknown): string {\n\tif (!isRecord(value) || !isString(value['identifier'])) {\n\t\tthrow new BrowserError('Browser init script identifier is malformed')\n\t}\n\treturn value['identifier']\n}\n\n/**\n * Validate viewport input coordinates.\n *\n * @param point - Candidate point\n */\nexport function validateBrowserPoint(point: BrowserPoint): void {\n\tif (!isFiniteNumber(point.x) || !isFiniteNumber(point.y)) {\n\t\tthrow new BrowserError('Browser input coordinates must be finite', undefined, { point })\n\t}\n}\n\n/**\n * Validate shared trusted-input options.\n *\n * @param options - Candidate action options\n */\nexport function validateBrowserActionOptions(options?: BrowserActionOptions): void {\n\tif (options?.delay !== undefined && (!isFiniteNumber(options.delay) || options.delay < 0)) {\n\t\tthrow new BrowserError('Browser input delay must be non-negative and finite', undefined, {\n\t\t\tdelay: options.delay,\n\t\t})\n\t}\n\tif (options?.count !== undefined && (!isInteger(options.count) || options.count <= 0)) {\n\t\tthrow new BrowserError('Browser click count must be a positive integer', undefined, {\n\t\t\tcount: options.count,\n\t\t})\n\t}\n\tif (options?.steps !== undefined && (!isInteger(options.steps) || options.steps <= 0)) {\n\t\tthrow new BrowserError('Browser drag steps must be a positive integer', undefined, {\n\t\t\tsteps: options.steps,\n\t\t})\n\t}\n\tif (options?.position !== undefined) validateBrowserPoint(options.position)\n}\n\n/**\n * Validate a public browser timeout before protocol work begins.\n *\n * @param timeout - Timeout in milliseconds\n */\nexport function validateBrowserTimeout(timeout: number): void {\n\tif (!isFiniteNumber(timeout) || timeout < 0) {\n\t\tthrow new BrowserError('Browser timeout must be a non-negative finite number', undefined, {\n\t\t\ttimeout,\n\t\t})\n\t}\n}\n\n/**\n * Validate Chromium viewport metrics.\n *\n * @param viewport - Public viewport configuration\n */\nexport function validateBrowserViewport(viewport: BrowserViewport): void {\n\tif (\n\t\t!isInteger(viewport.width) ||\n\t\tviewport.width <= 0 ||\n\t\t!isInteger(viewport.height) ||\n\t\tviewport.height <= 0\n\t) {\n\t\tthrow new BrowserError('Browser viewport dimensions must be positive integers', undefined, {\n\t\t\tviewport,\n\t\t})\n\t}\n\tif (viewport.scale !== undefined && (!isFiniteNumber(viewport.scale) || viewport.scale <= 0)) {\n\t\tthrow new BrowserError('Browser viewport scale must be positive and finite', undefined, {\n\t\t\tscale: viewport.scale,\n\t\t})\n\t}\n}\n\n/**\n * Validate context emulation boundaries before partial application.\n *\n * @param options - Public emulation configuration\n */\nexport function validateBrowserEmulationOptions(options: BrowserEmulationOptions): void {\n\tif (options.viewport !== undefined) validateBrowserViewport(options.viewport)\n\tif (options.user !== undefined && options.user.value.length === 0) {\n\t\tthrow new BrowserError('Browser user agent cannot be empty')\n\t}\n\tif (options.locale !== undefined && options.locale.length === 0) {\n\t\tthrow new BrowserError('Browser locale cannot be empty')\n\t}\n\tif (options.timezone !== undefined && options.timezone.length === 0) {\n\t\tthrow new BrowserError('Browser timezone cannot be empty')\n\t}\n\tif (options.geolocation !== undefined) {\n\t\tconst location = options.geolocation\n\t\tif (\n\t\t\t!isFiniteNumber(location.latitude) ||\n\t\t\tlocation.latitude < -90 ||\n\t\t\tlocation.latitude > 90 ||\n\t\t\t!isFiniteNumber(location.longitude) ||\n\t\t\tlocation.longitude < -180 ||\n\t\t\tlocation.longitude > 180 ||\n\t\t\t(location.accuracy !== undefined &&\n\t\t\t\t(!isFiniteNumber(location.accuracy) || location.accuracy < 0))\n\t\t) {\n\t\t\tthrow new BrowserError('Browser geolocation is outside valid coordinate bounds', undefined, {\n\t\t\t\tlocation,\n\t\t\t})\n\t\t}\n\t}\n\tfor (const name of Object.keys(options.headers ?? {})) {\n\t\tif (name.length === 0) throw new BrowserError('Browser header name cannot be empty')\n\t}\n}\n\n/**\n * Validate isolated-context options before creating remote state.\n *\n * @param options - Public context configuration\n */\nexport function validateBrowserContextOptions(options?: BrowserContextOptions): void {\n\tif (options === undefined) return\n\tif (options.emulation !== undefined) validateBrowserEmulationOptions(options.emulation)\n\tif (options.proxy !== undefined) {\n\t\tif (options.proxy.server.length === 0) {\n\t\t\tthrow new BrowserError('Browser proxy server cannot be empty')\n\t\t}\n\t\tif (options.proxy.bypass?.some((entry) => entry.length === 0) === true) {\n\t\t\tthrow new BrowserError('Browser proxy bypass entries cannot be empty')\n\t\t}\n\t}\n\tfor (const origin of options.origins ?? []) {\n\t\tconst result = attempt(() => new URL(origin))\n\t\tif (!result.success) {\n\t\t\tthrow new BrowserError('Browser context origin must be valid', undefined, { origin })\n\t\t}\n\t\tconst url = result.value\n\t\tif (\n\t\t\t(url.protocol !== 'http:' && url.protocol !== 'https:') ||\n\t\t\turl.origin !== origin.replace(/\\/$/, '')\n\t\t) {\n\t\t\tthrow new BrowserError(\n\t\t\t\t'Browser context origin must be an absolute HTTP(S) origin',\n\t\t\t\tundefined,\n\t\t\t\t{\n\t\t\t\t\torigin,\n\t\t\t\t},\n\t\t\t)\n\t\t}\n\t}\n\tif (options.downloads !== undefined && options.downloads.path.length === 0) {\n\t\tthrow new BrowserError('Browser download path cannot be empty')\n\t}\n}\n\n/**\n * Validate Accessibility-domain snapshot bounds.\n *\n * @param options - Public accessibility snapshot options\n */\nexport function validateBrowserAccessibilityOptions(options?: BrowserAccessibilityOptions): void {\n\tif (options?.root !== undefined && (!isInteger(options.root) || options.root <= 0)) {\n\t\tthrow new BrowserError('Browser accessibility root must be a positive integer', undefined, {\n\t\t\troot: options.root,\n\t\t})\n\t}\n\tif (options?.depth !== undefined && (!isInteger(options.depth) || options.depth < 0)) {\n\t\tthrow new BrowserError(\n\t\t\t'Browser accessibility depth must be a non-negative integer',\n\t\t\tundefined,\n\t\t\t{ depth: options.depth },\n\t\t)\n\t}\n}\n\n/**\n * Validate and compile Page.printToPDF parameters.\n *\n * @param options - Public PDF options\n * @returns Protocol parameter record\n */\nexport function browserPDFToParams(options?: BrowserPDFOptions): Readonly<Record<string, unknown>> {\n\tconst params: Record<string, unknown> = {\n\t\tlandscape: options?.landscape ?? false,\n\t\tprintBackground: options?.background ?? false,\n\t\tdisplayHeaderFooter: options?.header !== undefined || options?.footer !== undefined,\n\t\tgenerateTaggedPDF: options?.tagged ?? false,\n\t\tgenerateDocumentOutline: options?.outline ?? false,\n\t}\n\tif (options?.scale !== undefined) {\n\t\tvalidateBrowserRange(options.scale, 'PDF scale', 0.1, 2)\n\t\tparams['scale'] = options.scale\n\t}\n\tif (options?.width !== undefined) {\n\t\tvalidateBrowserRange(options.width, 'PDF width', 0, Number.MAX_VALUE, false)\n\t\tparams['paperWidth'] = options.width\n\t}\n\tif (options?.height !== undefined) {\n\t\tvalidateBrowserRange(options.height, 'PDF height', 0, Number.MAX_VALUE, false)\n\t\tparams['paperHeight'] = options.height\n\t}\n\tif (options?.ranges !== undefined) params['pageRanges'] = options.ranges\n\tif (options?.header !== undefined) params['headerTemplate'] = options.header\n\tif (options?.footer !== undefined) params['footerTemplate'] = options.footer\n\tfor (const [name, value] of Object.entries(options?.margin ?? {})) {\n\t\tif (!isFiniteNumber(value)) continue\n\t\tvalidateBrowserRange(value, `PDF ${name} margin`, 0, Number.MAX_VALUE)\n\t\tparams[`margin${name[0]?.toUpperCase()}${name.slice(1)}`] = value\n\t}\n\treturn params\n}\n\n/**\n * Validate and compile basic Page.captureScreenshot parameters.\n *\n * @param options - Public screenshot options\n * @returns Protocol parameter record\n */\nexport function browserScreenshotToParams(\n\toptions?: BrowserScreenshotOptions,\n): Readonly<Record<string, unknown>> {\n\tconst format = options?.type ?? 'png'\n\tif (options?.quality !== undefined) {\n\t\tif (format !== 'jpeg') {\n\t\t\tthrow new BrowserError('Browser screenshot quality is only valid for JPEG')\n\t\t}\n\t\tif (!isInteger(options.quality) || options.quality < 0 || options.quality > 100) {\n\t\t\tthrow new BrowserError('Browser screenshot quality must be an integer from 0 to 100')\n\t\t}\n\t}\n\tif (options?.full === true && options.clip !== undefined) {\n\t\tthrow new BrowserError('Browser screenshot cannot combine full-page and clip capture')\n\t}\n\tconst params: Record<string, unknown> = {\n\t\tformat,\n\t\tfromSurface: true,\n\t}\n\tif (options?.quality !== undefined) params['quality'] = options.quality\n\tif (options?.clip !== undefined) {\n\t\tconst [x, y, width, height] = options.clip\n\t\tvalidateBrowserRange(x, 'Screenshot clip x', -Number.MAX_VALUE, Number.MAX_VALUE)\n\t\tvalidateBrowserRange(y, 'Screenshot clip y', -Number.MAX_VALUE, Number.MAX_VALUE)\n\t\tvalidateBrowserRange(width, 'Screenshot clip width', 0, Number.MAX_VALUE, false)\n\t\tvalidateBrowserRange(height, 'Screenshot clip height', 0, Number.MAX_VALUE, false)\n\t\tparams['clip'] = { x, y, width, height, scale: 1 }\n\t\tparams['captureBeyondViewport'] = true\n\t}\n\treturn params\n}\n\n/**\n * Compile temporary animation, caret, and mask setup for a screenshot.\n *\n * @param options - Screenshot controls\n * @returns Setup expression or undefined when no preparation is required\n */\nexport function compileScreenshotPreparationExpression(\n\toptions?: BrowserScreenshotOptions,\n): string | undefined {\n\tconst masks = options?.mask ?? []\n\tif (options?.animations !== false && options?.caret !== false && masks.length === 0) {\n\t\treturn undefined\n\t}\n\tconst queries = masks.map((locator) => compileLocatorListExpression(locator.query))\n\treturn `(() => {\n\tconst attribute = ${JSON.stringify(BROWSER_SCREENSHOT_ATTRIBUTE)}\n\tconst sequence = (globalThis.__orkestrelScreenshotSequence ?? 0) + 1\n\tglobalThis.__orkestrelScreenshotSequence = sequence\n\tconst token = String(sequence)\n\tif (${JSON.stringify(options?.animations === false || options?.caret === false)}) {\n\t\tconst style = document.createElement('style')\n\t\tstyle.setAttribute(attribute, token)\n\t\tstyle.textContent = ${JSON.stringify(\n\t\t\t`${options?.animations === false ? '*,*::before,*::after{animation:none!important;transition:none!important;scroll-behavior:auto!important}' : ''}${options?.caret === false ? '*{caret-color:transparent!important}' : ''}`,\n\t\t)}\n\t\tdocument.documentElement.appendChild(style)\n\t}\n\tconst groups = [${queries.join(',')}]\n\tfor (const group of groups) {\n\t\tfor (const element of group) {\n\t\t\tconst rect = element.getBoundingClientRect()\n\t\t\tconst mask = document.createElement('div')\n\t\t\tmask.setAttribute(attribute, token)\n\t\t\tmask.style.cssText = 'position:fixed;pointer-events:none;z-index:2147483647;' +\n\t\t\t\t'left:' + rect.left + 'px;top:' + rect.top + 'px;width:' + rect.width + 'px;height:' + rect.height + 'px;' +\n\t\t\t\t'background:' + ${JSON.stringify(options?.color ?? '#ff00ff')}\n\t\t\tdocument.documentElement.appendChild(mask)\n\t\t}\n\t}\n\treturn token\n})()`\n}\n\n/**\n * Compile cleanup for temporary screenshot styles and masks.\n *\n * @param token - Preparation token\n * @returns Cleanup expression\n */\nexport function compileScreenshotCleanupExpression(token: string): string {\n\treturn `(() => {\n\tconst attribute = ${JSON.stringify(BROWSER_SCREENSHOT_ATTRIBUTE)}\n\tfor (const element of document.querySelectorAll('[' + attribute + ']')) {\n\t\tif (element.getAttribute(attribute) === ${JSON.stringify(token)}) element.remove()\n\t}\n\treturn true\n})()`\n}\n\n/**\n * Validate a finite numeric range.\n *\n * @param value - Candidate number\n * @param field - Diagnostic field\n * @param minimum - Inclusive lower bound\n * @param maximum - Inclusive upper bound\n * @param inclusive - Whether the lower bound is inclusive\n */\nexport function validateBrowserRange(\n\tvalue: number,\n\tfield: string,\n\tminimum: number,\n\tmaximum: number,\n\tinclusive = true,\n): void {\n\tif (\n\t\t!isFiniteNumber(value) ||\n\t\t(inclusive ? value < minimum : value <= minimum) ||\n\t\tvalue > maximum\n\t) {\n\t\tthrow new BrowserError(`${field} is outside its valid range`, undefined, {\n\t\t\tvalue,\n\t\t\tminimum,\n\t\t\tmaximum,\n\t\t\tinclusive,\n\t\t})\n\t}\n}\n\n/**\n * Decode Accessibility-domain nodes into a flat serializable tree.\n *\n * @param value - Unknown full or partial AX-tree result\n * @returns Valid accessibility snapshot\n */\nexport function readBrowserAccessibility(value: unknown): BrowserAccessibilitySnapshot {\n\tif (!isRecord(value) || !isArray(value['nodes'])) {\n\t\tthrow new BrowserError('Browser accessibility tree is malformed')\n\t}\n\tconst nodes: BrowserAXNode[] = []\n\tfor (const [index, candidate] of value['nodes'].entries()) {\n\t\tif (!isRecord(candidate) || !isString(candidate['nodeId'])) {\n\t\t\tthrow new BrowserError('Browser accessibility node is malformed', undefined, { index })\n\t\t}\n\t\tconst children = isArray(candidate['childIds']) ? candidate['childIds'].filter(isString) : []\n\t\tconst properties: Record<string, unknown> = {}\n\t\tif (isArray(candidate['properties'])) {\n\t\t\tfor (const property of candidate['properties']) {\n\t\t\t\tif (!isRecord(property) || !isString(property['name'])) continue\n\t\t\t\tproperties[property['name']] = readBrowserAXValue(property['value'])\n\t\t\t}\n\t\t}\n\t\tnodes.push({\n\t\t\tid: candidate['nodeId'],\n\t\t\tparent: isString(candidate['parentId']) ? candidate['parentId'] : undefined,\n\t\t\tchildren,\n\t\t\tbackend: isInteger(candidate['backendDOMNodeId']) ? candidate['backendDOMNodeId'] : undefined,\n\t\t\tframe: isString(candidate['frameId']) ? candidate['frameId'] : undefined,\n\t\t\tignored: candidate['ignored'] === true,\n\t\t\trole: readBrowserAXString(candidate['role']),\n\t\t\tname: readBrowserAXString(candidate['name']),\n\t\t\tdescription: readBrowserAXString(candidate['description']),\n\t\t\tvalue: readBrowserAXValue(candidate['value']),\n\t\t\tproperties,\n\t\t})\n\t}\n\treturn {\n\t\troots: nodes.filter((node) => node.parent === undefined).map((node) => node.id),\n\t\tnodes,\n\t}\n}\n\n/**\n * Decode an Accessibility-domain AXValue.\n *\n * @param value - Unknown AX value\n * @returns Underlying value\n */\nexport function readBrowserAXValue(value: unknown): unknown {\n\treturn isRecord(value) && 'value' in value ? value['value'] : undefined\n}\n\n/**\n * Decode a string-valued Accessibility-domain AXValue.\n *\n * @param value - Unknown AX value\n * @returns String or undefined\n */\nexport function readBrowserAXString(value: unknown): string | undefined {\n\tconst decoded = readBrowserAXValue(value)\n\treturn isString(decoded) ? decoded : undefined\n}\n\n/**\n * Concatenate byte chunks without Node-specific buffers.\n *\n * @param chunks - Byte arrays in source order\n * @returns Combined bytes\n */\nexport function concatBytes(chunks: readonly Uint8Array[]): Uint8Array {\n\tconst count = chunks.reduce((total, chunk) => total + chunk.byteLength, 0)\n\tconst result = new Uint8Array(count)\n\tlet offset = 0\n\tfor (const chunk of chunks) {\n\t\tresult.set(chunk, offset)\n\t\toffset += chunk.byteLength\n\t}\n\treturn result\n}\n\n/**\n * Decode one `IO.read` response.\n *\n * @param value - Unknown protocol result\n * @returns Valid stream chunk\n */\nexport function readBrowserStreamChunk(value: unknown): BrowserStreamChunk {\n\tif (!isRecord(value) || !isString(value['data'])) {\n\t\tthrow new BrowserError('Browser IO stream chunk is malformed')\n\t}\n\treturn {\n\t\tbytes:\n\t\t\tvalue['base64Encoded'] === true ? decodeBase64(value['data']) : textToBytes(value['data']),\n\t\teof: value['eof'] === true,\n\t}\n}\n\n/**\n * Decode JavaScript precise coverage.\n *\n * @param value - Unknown `Profiler.takePreciseCoverage` result\n * @returns Script coverage\n */\nexport function readBrowserScriptCoverage(value: unknown): readonly BrowserScriptCoverage[] {\n\tif (!isRecord(value) || !isArray(value['result'])) {\n\t\tthrow new BrowserError('Browser JavaScript coverage is malformed')\n\t}\n\treturn value['result'].map((script, index) => {\n\t\tif (\n\t\t\t!isRecord(script) ||\n\t\t\t!isString(script['scriptId']) ||\n\t\t\t!isString(script['url']) ||\n\t\t\t!isArray(script['functions'])\n\t\t) {\n\t\t\tthrow new BrowserError('Browser script coverage entry is malformed', undefined, { index })\n\t\t}\n\t\tconst functions: BrowserFunctionCoverage[] = script['functions'].map((entry, functionIndex) => {\n\t\t\tif (!isRecord(entry) || !isString(entry['functionName']) || !isArray(entry['ranges'])) {\n\t\t\t\tthrow new BrowserError('Browser function coverage entry is malformed', undefined, {\n\t\t\t\t\tindex,\n\t\t\t\t\tfunction: functionIndex,\n\t\t\t\t})\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tname: entry['functionName'],\n\t\t\t\tranges: readBrowserCoverageRanges(entry['ranges'], index),\n\t\t\t\tblock: entry['isBlockCoverage'] === true,\n\t\t\t}\n\t\t})\n\t\treturn {\n\t\t\tid: script['scriptId'],\n\t\t\turl: script['url'],\n\t\t\tfunctions,\n\t\t}\n\t})\n}\n\n/**\n * Decode CSS rule usage.\n *\n * @param value - Unknown `CSS.stopRuleUsageTracking` result\n * @returns Stylesheet coverage\n */\nexport function readBrowserStyleCoverage(value: unknown): readonly BrowserStyleCoverage[] {\n\tif (!isRecord(value) || !isArray(value['ruleUsage'])) {\n\t\tthrow new BrowserError('Browser CSS coverage is malformed')\n\t}\n\tconst styles = new Map<string, BrowserCoverageRange[]>()\n\tfor (const [index, entry] of value['ruleUsage'].entries()) {\n\t\tif (\n\t\t\t!isRecord(entry) ||\n\t\t\t!isString(entry['styleSheetId']) ||\n\t\t\t!isInteger(entry['startOffset']) ||\n\t\t\tentry['startOffset'] < 0 ||\n\t\t\t!isInteger(entry['endOffset']) ||\n\t\t\tentry['endOffset'] < entry['startOffset']\n\t\t) {\n\t\t\tthrow new BrowserError('Browser CSS coverage entry is malformed', undefined, { index })\n\t\t}\n\t\tconst ranges = styles.get(entry['styleSheetId']) ?? []\n\t\tranges.push({\n\t\t\tstart: entry['startOffset'],\n\t\t\tend: entry['endOffset'],\n\t\t\tcount: entry['used'] === true ? 1 : 0,\n\t\t})\n\t\tstyles.set(entry['styleSheetId'], ranges)\n\t}\n\treturn [...styles].map(([id, ranges]) => ({ id, ranges }))\n}\n\n/**\n * Decode coverage ranges.\n *\n * @param value - Unknown ranges\n * @param script - Script index for diagnostics\n * @returns Valid ranges\n */\nexport function readBrowserCoverageRanges(\n\tvalue: unknown,\n\tscript: number,\n): readonly BrowserCoverageRange[] {\n\tif (!isArray(value)) {\n\t\tthrow new BrowserError('Browser coverage ranges are malformed', undefined, { script })\n\t}\n\treturn value.map((range, index) => {\n\t\tif (\n\t\t\t!isRecord(range) ||\n\t\t\t!isInteger(range['startOffset']) ||\n\t\t\trange['startOffset'] < 0 ||\n\t\t\t!isInteger(range['endOffset']) ||\n\t\t\trange['endOffset'] < range['startOffset'] ||\n\t\t\t!isInteger(range['count']) ||\n\t\t\trange['count'] < 0\n\t\t) {\n\t\t\tthrow new BrowserError('Browser coverage range is malformed', undefined, {\n\t\t\t\tscript,\n\t\t\t\tindex,\n\t\t\t})\n\t\t}\n\t\treturn {\n\t\t\tstart: range['startOffset'],\n\t\t\tend: range['endOffset'],\n\t\t\tcount: range['count'],\n\t\t}\n\t})\n}\n\n/**\n * Decode Performance-domain metrics.\n *\n * @param value - Unknown metrics result\n * @returns Valid metrics\n */\nexport function readBrowserMetrics(value: unknown): readonly BrowserMetric[] {\n\tif (!isRecord(value) || !isArray(value['metrics'])) {\n\t\tthrow new BrowserError('Browser performance metrics are malformed')\n\t}\n\treturn value['metrics'].map((metric, index) => {\n\t\tif (!isRecord(metric) || !isString(metric['name']) || !isFiniteNumber(metric['value'])) {\n\t\t\tthrow new BrowserError('Browser performance metric is malformed', undefined, { index })\n\t\t}\n\t\treturn { name: metric['name'], value: metric['value'] }\n\t})\n}\n\n/**\n * Decode one CPU profile.\n *\n * @param value - Unknown `Profiler.stop` result\n * @returns Valid profile\n */\nexport function readBrowserProfile(value: unknown): BrowserProfile {\n\tif (!isRecord(value) || !isRecord(value['profile'])) {\n\t\tthrow new BrowserError('Browser CPU profile is malformed')\n\t}\n\tconst profile = value['profile']\n\tif (\n\t\t!isFiniteNumber(profile['startTime']) ||\n\t\t!isFiniteNumber(profile['endTime']) ||\n\t\tprofile['endTime'] < profile['startTime'] ||\n\t\t!isArray(profile['nodes'])\n\t) {\n\t\tthrow new BrowserError('Browser CPU profile metadata is malformed')\n\t}\n\tconst nodes: BrowserProfileNode[] = profile['nodes'].map((node, index) => {\n\t\tif (\n\t\t\t!isRecord(node) ||\n\t\t\t!isInteger(node['id']) ||\n\t\t\tnode['id'] < 0 ||\n\t\t\t(node['hitCount'] !== undefined && (!isInteger(node['hitCount']) || node['hitCount'] < 0))\n\t\t) {\n\t\t\tthrow new BrowserError('Browser CPU profile node is malformed', undefined, { index })\n\t\t}\n\t\tconst children = node['children'] === undefined ? [] : parseArray(node['children'], isInteger)\n\t\tif (children === undefined || children.some((child) => child < 0)) {\n\t\t\tthrow new BrowserError('Browser CPU profile node is malformed', undefined, { index })\n\t\t}\n\t\treturn {\n\t\t\tid: node['id'],\n\t\t\tframe: readBrowserProfileFrame(node['callFrame'], index),\n\t\t\thit: isInteger(node['hitCount']) ? node['hitCount'] : undefined,\n\t\t\tchildren,\n\t\t}\n\t})\n\tconst samples = profile['samples'] === undefined ? [] : parseArray(profile['samples'], isInteger)\n\tif (samples === undefined || samples.some((sample) => sample < 0)) {\n\t\tthrow new BrowserError('Browser CPU profile samples are malformed')\n\t}\n\tconst deltas =\n\t\tprofile['timeDeltas'] === undefined ? [] : parseArray(profile['timeDeltas'], isFiniteNumber)\n\tif (deltas === undefined || deltas.some((delta) => delta < 0)) {\n\t\tthrow new BrowserError('Browser CPU profile deltas are malformed')\n\t}\n\treturn {\n\t\tstart: profile['startTime'],\n\t\tend: profile['endTime'],\n\t\tnodes,\n\t\tsamples,\n\t\tdeltas,\n\t}\n}\n\n/**\n * Decode a CPU profile call frame.\n *\n * @param value - Unknown call frame\n * @param node - Node index for diagnostics\n * @returns Valid call frame\n */\nexport function readBrowserProfileFrame(value: unknown, node: number): BrowserProfileFrame {\n\tif (\n\t\t!isRecord(value) ||\n\t\t!isString(value['functionName']) ||\n\t\t!isString(value['scriptId']) ||\n\t\t!isString(value['url']) ||\n\t\t!isInteger(value['lineNumber']) ||\n\t\t!isInteger(value['columnNumber'])\n\t) {\n\t\tthrow new BrowserError('Browser CPU profile call frame is malformed', undefined, { node })\n\t}\n\treturn {\n\t\tfunction: value['functionName'],\n\t\tscript: value['scriptId'],\n\t\turl: value['url'],\n\t\tline: value['lineNumber'],\n\t\tcolumn: value['columnNumber'],\n\t}\n}\n\n/**\n * Convert a typed cookie input into Chromium protocol fields.\n *\n * @param cookie - Validated public cookie input\n * @returns Protocol cookie record\n */\nexport function cookieToProtocol(cookie: BrowserCookieInput): Readonly<Record<string, unknown>> {\n\tif (cookie.name.length === 0) throw new BrowserError('Browser cookie name cannot be empty')\n\tif (cookie.url === undefined && (cookie.domain === undefined || cookie.path === undefined)) {\n\t\tthrow new BrowserError('Browser cookie requires either url or domain with path', undefined, {\n\t\t\tname: cookie.name,\n\t\t})\n\t}\n\tif (cookie.url !== undefined && !URL.canParse(cookie.url)) {\n\t\tthrow new BrowserError('Browser cookie URL must be valid', undefined, {\n\t\t\tname: cookie.name,\n\t\t\turl: cookie.url,\n\t\t})\n\t}\n\tif (cookie.expires !== undefined && !isFiniteNumber(cookie.expires)) {\n\t\tthrow new BrowserError('Browser cookie expiry must be finite', undefined, {\n\t\t\tname: cookie.name,\n\t\t\texpires: cookie.expires,\n\t\t})\n\t}\n\tconst result: Record<string, unknown> = {\n\t\tname: cookie.name,\n\t\tvalue: cookie.value,\n\t}\n\tif (cookie.url !== undefined) result['url'] = cookie.url\n\tif (cookie.domain !== undefined) result['domain'] = cookie.domain\n\tif (cookie.path !== undefined) result['path'] = cookie.path\n\tif (cookie.expires !== undefined) result['expires'] = cookie.expires\n\tif (cookie.http !== undefined) result['httpOnly'] = cookie.http\n\tif (cookie.secure !== undefined) result['secure'] = cookie.secure\n\tif (cookie.site !== undefined) result['sameSite'] = cookie.site\n\tif (cookie.priority !== undefined) result['priority'] = cookie.priority\n\tif (cookie.partition !== undefined) {\n\t\tresult['partitionKey'] = {\n\t\t\ttopLevelSite: cookie.partition.site,\n\t\t\thasCrossSiteAncestor: cookie.partition.ancestor ?? false,\n\t\t}\n\t}\n\treturn result\n}\n\n/**\n * Decode cookies returned by `Storage.getCookies`.\n *\n * @param value - Unknown protocol result\n * @returns Valid cookies\n */\nexport function readBrowserCookies(value: unknown): readonly BrowserCookie[] {\n\tif (!isRecord(value) || !isArray(value['cookies'])) {\n\t\tthrow new BrowserError('Browser cookie result is malformed')\n\t}\n\treturn value['cookies'].map((candidate, index) => readBrowserCookie(candidate, index))\n}\n\n/**\n * Decode one Chromium cookie.\n *\n * @param value - Unknown cookie record\n * @param index - Source array position for diagnostics\n * @returns Valid cookie\n */\nexport function readBrowserCookie(value: unknown, index: number): BrowserCookie {\n\tif (\n\t\t!isRecord(value) ||\n\t\t!isString(value['name']) ||\n\t\t!isString(value['value']) ||\n\t\t!isString(value['domain']) ||\n\t\t!isString(value['path']) ||\n\t\t!isFiniteNumber(value['expires']) ||\n\t\t!isBoolean(value['httpOnly']) ||\n\t\t!isBoolean(value['secure'])\n\t) {\n\t\tthrow new BrowserError('Browser cookie is malformed', undefined, { index })\n\t}\n\tconst sameSite = parseEnum(value['sameSite'], ['Strict', 'Lax', 'None'])\n\tif (value['sameSite'] !== undefined && sameSite === undefined) {\n\t\tthrow new BrowserError('Browser cookie same-site policy is malformed', undefined, { index })\n\t}\n\treturn {\n\t\tname: value['name'],\n\t\tvalue: value['value'],\n\t\tdomain: value['domain'],\n\t\tpath: value['path'],\n\t\texpires: value['expires'],\n\t\thttp: value['httpOnly'],\n\t\tsecure: value['secure'],\n\t\tsite: sameSite,\n\t\tpartition: readBrowserCookiePartition(value['partitionKey']),\n\t}\n}\n\n/**\n * Match a decoded cookie against one request URL.\n *\n * @param cookie - Decoded context cookie\n * @param value - Candidate absolute URL\n * @returns Whether domain, path, and secure constraints match\n */\nexport function matchesBrowserCookieURL(cookie: BrowserCookie, value: string): boolean {\n\tconst result = attempt(() => new URL(value))\n\tif (!result.success) {\n\t\tthrow new BrowserError('Browser cookie URL must be valid', undefined, { url: value })\n\t}\n\tconst url = result.value\n\tconst domain = cookie.domain.startsWith('.') ? cookie.domain.slice(1) : cookie.domain\n\tconst domainMatches = url.hostname === domain || url.hostname.endsWith(`.${domain}`)\n\tconst pathMatches =\n\t\turl.pathname === cookie.path ||\n\t\t(url.pathname.startsWith(cookie.path) &&\n\t\t\t(cookie.path.endsWith('/') || url.pathname[cookie.path.length] === '/'))\n\tconst secureMatches = !cookie.secure || url.protocol === 'https:' || url.protocol === 'wss:'\n\treturn domainMatches && pathMatches && secureMatches\n}\n\n/**\n * Decode an optional Chromium cookie partition key.\n *\n * @param value - Unknown partition value\n * @returns Partition key or undefined\n */\nexport function readBrowserCookiePartition(value: unknown): BrowserCookiePartition | undefined {\n\tif (!isRecord(value) || !isString(value['topLevelSite'])) return undefined\n\treturn {\n\t\tsite: value['topLevelSite'],\n\t\t...(isBoolean(value['hasCrossSiteAncestor'])\n\t\t\t? { ancestor: value['hasCrossSiteAncestor'] }\n\t\t\t: {}),\n\t}\n}\n\n/**\n * Compile an expression that serializes local and session storage.\n *\n * @returns In-page storage expression\n */\nexport function compileStorageReadExpression(): string {\n\treturn `({\n\tlocal: Array.from({ length: localStorage.length }, (_, index) => {\n\t\tconst name = localStorage.key(index)\n\t\treturn { name, value: name === null ? '' : localStorage.getItem(name) ?? '' }\n\t}),\n\tsession: Array.from({ length: sessionStorage.length }, (_, index) => {\n\t\tconst name = sessionStorage.key(index)\n\t\treturn { name, value: name === null ? '' : sessionStorage.getItem(name) ?? '' }\n\t}),\n})`\n}\n\n/**\n * Compile an expression that restores one origin's web storage.\n *\n * @param origin - Storage values to restore\n * @returns In-page restore expression\n */\nexport function compileStorageRestoreExpression(origin: BrowserStorageOrigin): string {\n\treturn `(() => {\n\tconst state = ${JSON.stringify({ local: origin.local, session: origin.session })}\n\tlocalStorage.clear()\n\tsessionStorage.clear()\n\tfor (const entry of state.local) localStorage.setItem(entry.name, entry.value)\n\tfor (const entry of state.session) sessionStorage.setItem(entry.name, entry.value)\n\treturn true\n})()`\n}\n\n/**\n * Compile an expression that clears local and session storage.\n *\n * @returns In-page clear expression\n */\nexport function compileStorageClearExpression(): string {\n\treturn `(() => {\n\tlocalStorage.clear()\n\tsessionStorage.clear()\n\treturn true\n})()`\n}\n\n/**\n * Decode one in-page web-storage snapshot.\n *\n * @param value - Unknown evaluation result\n * @param origin - Origin represented by the result\n * @returns Valid origin storage\n */\nexport function readBrowserStorageOrigin(value: unknown, origin: string): BrowserStorageOrigin {\n\tif (!isRecord(value))\n\t\tthrow new BrowserError('Browser storage result is malformed', undefined, { origin })\n\treturn {\n\t\torigin,\n\t\tlocal: readBrowserStorageEntries(value['local'], origin, 'local'),\n\t\tsession: readBrowserStorageEntries(value['session'], origin, 'session'),\n\t}\n}\n\n/**\n * Decode a list of web-storage entries.\n *\n * @param value - Unknown entry list\n * @param origin - Origin used for diagnostics\n * @param storage - Storage family used for diagnostics\n * @returns Valid key/value entries\n */\nexport function readBrowserStorageEntries(\n\tvalue: unknown,\n\torigin: string,\n\tstorage: 'local' | 'session',\n): readonly BrowserStorageEntry[] {\n\tif (!isArray(value)) {\n\t\tthrow new BrowserError('Browser storage entries are malformed', undefined, { origin, storage })\n\t}\n\treturn value.map((entry, index) => {\n\t\tif (!isRecord(entry) || !isString(entry['name']) || !isString(entry['value'])) {\n\t\t\tthrow new BrowserError('Browser storage entry is malformed', undefined, {\n\t\t\t\torigin,\n\t\t\t\tstorage,\n\t\t\t\tindex,\n\t\t\t})\n\t\t}\n\t\treturn { name: entry['name'], value: entry['value'] }\n\t})\n}\n\n/**\n * Convert typed media preferences to Chromium emulated media features.\n *\n * @param media - Public media configuration\n * @returns Protocol feature records\n */\nexport function mediaToFeatures(\n\tmedia: BrowserMedia,\n): ReadonlyArray<Readonly<Record<string, string>>> {\n\tconst features: Array<Readonly<Record<string, string>>> = []\n\tif (media.color !== undefined) features.push({ name: 'prefers-color-scheme', value: media.color })\n\tif (media.contrast !== undefined) {\n\t\tfeatures.push({ name: 'prefers-contrast', value: media.contrast })\n\t}\n\tif (media.motion !== undefined) {\n\t\tfeatures.push({ name: 'prefers-reduced-motion', value: media.motion })\n\t}\n\tif (media.colors !== undefined) {\n\t\tfeatures.push({ name: 'forced-colors', value: media.colors })\n\t}\n\treturn features\n}\n\n/**\n * Decode a Chromium runtime stack trace.\n *\n * @param value - Unknown stack trace or call-frame list\n * @returns Valid stack frames\n */\nexport function readBrowserStack(value: unknown): readonly BrowserStackFrame[] {\n\tconst frames = isRecord(value) ? value['callFrames'] : value\n\tif (!isArray(frames)) return []\n\tconst stack: BrowserStackFrame[] = []\n\tfor (const frame of frames) {\n\t\tif (\n\t\t\t!isRecord(frame) ||\n\t\t\t!isString(frame['url']) ||\n\t\t\t!isString(frame['functionName']) ||\n\t\t\t!isInteger(frame['lineNumber']) ||\n\t\t\t!isInteger(frame['columnNumber'])\n\t\t) {\n\t\t\tcontinue\n\t\t}\n\t\tstack.push({\n\t\t\turl: frame['url'],\n\t\t\tfunction: frame['functionName'],\n\t\t\tline: frame['lineNumber'],\n\t\t\tcolumn: frame['columnNumber'],\n\t\t})\n\t}\n\treturn stack\n}\n\n/**\n * Decode one `Runtime.consoleAPICalled` event.\n *\n * @param value - Unknown event parameters\n * @returns Console message or undefined\n */\nexport function readBrowserConsoleMessage(value: unknown): BrowserConsoleMessage | undefined {\n\tif (\n\t\t!isRecord(value) ||\n\t\t!isString(value['type']) ||\n\t\t!isFiniteNumber(value['timestamp']) ||\n\t\t!isArray(value['args'])\n\t) {\n\t\treturn undefined\n\t}\n\tconst values = value['args'].map(readBrowserRemoteValue)\n\treturn {\n\t\tlevel: value['type'],\n\t\ttext: values\n\t\t\t.map((entry) => {\n\t\t\t\tif (isString(entry)) return entry\n\t\t\t\tconst serialized = attempt<unknown>(() => JSON.stringify(entry))\n\t\t\t\treturn serialized.success && isString(serialized.value) ? serialized.value : String(entry)\n\t\t\t})\n\t\t\t.join(' '),\n\t\tvalues,\n\t\ttimestamp: value['timestamp'],\n\t\tstack: readBrowserStack(value['stackTrace']),\n\t}\n}\n\n/**\n * Decode a Runtime remote object's printable value.\n *\n * @param value - Unknown remote object\n * @returns By-value data or a description\n */\nexport function readBrowserRemoteValue(value: unknown): unknown {\n\tif (!isRecord(value)) return undefined\n\tif ('value' in value) return value['value']\n\tif (isString(value['unserializableValue'])) return value['unserializableValue']\n\tif (isString(value['description'])) return value['description']\n\treturn undefined\n}\n\n/**\n * Decode one `Runtime.exceptionThrown` event.\n *\n * @param value - Unknown event parameters\n * @returns Page error or undefined\n */\nexport function readBrowserPageError(value: unknown): BrowserPageError | undefined {\n\tif (!isRecord(value) || !isRecord(value['exceptionDetails'])) return undefined\n\tconst details = value['exceptionDetails']\n\tconst timestamp = isFiniteNumber(value['timestamp']) ? value['timestamp'] : Date.now()\n\tconst exception = readBrowserRemoteValue(details['exception'])\n\tconst message = isString(exception)\n\t\t? exception\n\t\t: isString(details['text'])\n\t\t\t? details['text']\n\t\t\t: 'Uncaught page exception'\n\treturn {\n\t\tmessage,\n\t\tstack: readBrowserStack(details['stackTrace']),\n\t\ttimestamp,\n\t}\n}\n\n/**\n * Decode one `Browser.downloadWillBegin` event.\n *\n * @param value - Unknown event parameters\n * @returns Download start or undefined\n */\nexport function readBrowserDownloadStart(value: unknown): BrowserDownloadStart | undefined {\n\tif (\n\t\t!isRecord(value) ||\n\t\t!isString(value['guid']) ||\n\t\t!isString(value['url']) ||\n\t\t!isString(value['suggestedFilename']) ||\n\t\t!isString(value['frameId'])\n\t) {\n\t\treturn undefined\n\t}\n\treturn {\n\t\tid: value['guid'],\n\t\turl: value['url'],\n\t\tname: value['suggestedFilename'],\n\t\tframe: value['frameId'],\n\t}\n}\n\n/**\n * Decode one `Browser.downloadProgress` event.\n *\n * @param value - Unknown event parameters\n * @returns Download id and progress, or undefined\n */\nexport function readBrowserDownloadProgress(\n\tvalue: unknown,\n): readonly [id: string, progress: BrowserDownloadProgress] | undefined {\n\tif (\n\t\t!isRecord(value) ||\n\t\t!isString(value['guid']) ||\n\t\t!isFiniteNumber(value['receivedBytes']) ||\n\t\tvalue['receivedBytes'] < 0 ||\n\t\t!isFiniteNumber(value['totalBytes']) ||\n\t\tvalue['totalBytes'] < 0\n\t) {\n\t\treturn undefined\n\t}\n\tconst state = parseEnum(value['state'], ['completed', 'canceled', 'inProgress'])\n\tconst status =\n\t\tstate === 'completed'\n\t\t\t? 'complete'\n\t\t\t: state === 'canceled'\n\t\t\t\t? 'cancelled'\n\t\t\t\t: state === 'inProgress'\n\t\t\t\t\t? 'pending'\n\t\t\t\t\t: undefined\n\tif (status === undefined) return undefined\n\treturn [\n\t\tvalue['guid'],\n\t\t{\n\t\t\tstatus,\n\t\t\treceived: value['receivedBytes'],\n\t\t\ttotal: value['totalBytes'],\n\t\t\t...(isString(value['filePath']) ? { path: value['filePath'] } : {}),\n\t\t},\n\t]\n}\n\n/**\n * Wrap a `Runtime.evaluate` expression so the IN-PAGE code stringifies its\n * own result and throws a recognizable error before an oversized result\n * would overflow the CDP transport frame.\n *\n * @remarks\n * A result whose `JSON.stringify` length exceeds `limit` throws\n * `Error('BROWSER_RESULT_LIMIT: <length>')` inside the page instead of being\n * returned — the caller maps that sentinel to a coded\n * {@link BrowserResultLimitError}. A non-serializable result (`undefined`,\n * a function, a symbol) makes `JSON.stringify` return `undefined`, so the\n * length check is skipped and today's undefined-passthrough behavior is\n * unchanged.\n *\n * The expression is placed on its own line inside the wrapper (rather than\n * inline with the guard code) so a trailing `//` line comment in the\n * expression cannot swallow the closing guard syntax that follows it.\n *\n * @param expression - The candidate JavaScript expression to evaluate\n * @param limit - Maximum serialized-character length (see {@link BROWSER_RESULT_LIMIT})\n * @returns The wrapped, guarded expression\n */\nexport function guardEvaluateExpression(expression: string, limit: number): string {\n\treturn `(() => { const r = (\n${expression}\n); const s = JSON.stringify(r); if (typeof s === 'string' && s.length > ${limit}) throw new Error(${JSON.stringify(BROWSER_RESULT_LIMIT_SENTINEL_PREFIX)} + s.length); return r })()`\n}\n\n/**\n * Decode one CDP `Runtime.evaluate` result.\n *\n * @param value - Unknown CDP result\n * @returns The returned by-value payload, or undefined\n */\nexport function readEvaluationResult(value: unknown): unknown {\n\tif (!isRecord(value)) return undefined\n\n\tif (isRecord(value['exceptionDetails'])) {\n\t\tconst details = value['exceptionDetails']\n\t\tif (isRecord(details['exception']) && isString(details['exception']['description'])) {\n\t\t\tconst description = details['exception']['description']\n\t\t\tconst limitMatch = BROWSER_RESULT_LIMIT_PATTERN.exec(description)\n\t\t\tif (limitMatch !== null) {\n\t\t\t\tthrow new BrowserResultLimitError('Evaluation result exceeds BROWSER_RESULT_LIMIT', {\n\t\t\t\t\tlength: Number(limitMatch[1]),\n\t\t\t\t\tlimit: BROWSER_RESULT_LIMIT,\n\t\t\t\t})\n\t\t\t}\n\t\t\tthrow new BrowserError(description)\n\t\t}\n\t\tthrow new BrowserError('JavaScript evaluation failed')\n\t}\n\n\tconst remoteObject = value['result']\n\tif (!isRecord(remoteObject)) return undefined\n\treturn 'value' in remoteObject ? remoteObject['value'] : undefined\n}\n\n/**\n * Require an evaluated browser value to be a string.\n *\n * @param value - Candidate evaluated value\n * @param field - Human-readable field name used in the error\n * @returns The narrowed string\n */\nexport function requireBrowserString(value: unknown, field: string): string {\n\tif (isString(value)) return value\n\tthrow new BrowserError(`${field} failed: no string value returned`)\n}\n\n/**\n * Normalize a raw list of recorded codegen actions.\n *\n * @remarks\n * Collapses consecutive `fill` actions on the same selector into the latest\n * value (a text input fires one `input` event per keystroke) so the\n * compiled script reflects the final typed value rather than every\n * intermediate keystroke.\n *\n * @param actions - Raw recorded actions, in capture order\n * @returns Normalized actions, in the same order\n */\nexport function normalizeCodegenActions(\n\tactions: readonly BrowserCodegenAction[],\n): readonly BrowserCodegenAction[] {\n\tconst result: BrowserCodegenAction[] = []\n\n\tfor (const action of actions) {\n\t\tconst previous = result[result.length - 1]\n\t\tif (\n\t\t\tprevious !== undefined &&\n\t\t\tprevious.action === 'fill' &&\n\t\t\taction.action === 'fill' &&\n\t\t\tprevious.selector === action.selector\n\t\t) {\n\t\t\tresult[result.length - 1] = action\n\t\t\tcontinue\n\t\t}\n\t\tresult.push(action)\n\t}\n\n\treturn result\n}\n\n/**\n * Parse a codegen binding payload into a typed action.\n *\n * @remarks\n * The in-page recorder script calls the CDP binding with a JSON string\n * payload shaped like a {@link BrowserCodegenAction}. Returns `undefined`\n * when the payload is not valid JSON or does not match a known action shape.\n *\n * @param payload - Raw binding call payload (the CDP `payload` param)\n * @returns The parsed action, or `undefined` when the payload is malformed\n */\nexport function parseCodegenActionPayload(payload: unknown): BrowserCodegenAction | undefined {\n\tif (!isString(payload)) return undefined\n\tconst parsed = parseJSON(payload)\n\tif (!isRecord(parsed)) return undefined\n\n\tconst action = parseEnum(parsed['action'], ['click', 'fill', 'select'])\n\tconst selector = parsed['selector']\n\n\tif (action === 'click' && isString(selector)) {\n\t\treturn { action: 'click', selector }\n\t}\n\n\tif (action === 'fill' && isString(selector) && isString(parsed['value'])) {\n\t\treturn { action: 'fill', selector, value: parsed['value'] }\n\t}\n\n\tif (action === 'select' && isString(selector)) {\n\t\tconst values = parseArray(parsed['values'], isString)\n\t\tif (values !== undefined) return { action: 'select', selector, values }\n\t}\n\n\treturn undefined\n}\n\n/**\n * Derive a `navigate` codegen action from a `Page.frameNavigated` CDP event.\n *\n * @remarks\n * Only the top-level (main) frame's navigation is recorded — a frame\n * carrying a `parentId` is a sub-frame and is ignored.\n *\n * @param params - The CDP `Page.frameNavigated` event params\n * @returns A `navigate` action, or `undefined` when the event is not a\n * top-level navigation with a resolvable URL\n */\nexport function readCodegenNavigateAction(\n\tparams: Readonly<Record<string, unknown>>,\n): BrowserCodegenAction | undefined {\n\tconst frame = params['frame']\n\tif (!isRecord(frame)) return undefined\n\tif ('parentId' in frame) return undefined\n\tif (!isString(frame['url'])) return undefined\n\n\treturn { action: 'navigate', url: frame['url'] }\n}\n\n/**\n * Compile recorded codegen actions into a replayable script.\n *\n * @remarks\n * Emits one statement per action against a `page` object shaped like\n * {@link BrowserPageInterface} (`page.navigate(...)`, `page.click(...)`, …).\n * Both target languages emit an `async function run(page)` body whose\n * statements are `await`-ed; `language` only toggles whether the `page`\n * parameter carries a TypeScript type annotation (default `'javascript'`).\n *\n * @param actions - Normalized actions to compile\n * @param options - Compilation options (target language)\n * @returns The compiled script source\n */\nexport function compileCodegenScript(\n\tactions: readonly BrowserCodegenAction[],\n\toptions?: BrowserCodegenScriptOptions,\n): string {\n\tconst language = options?.language ?? 'javascript'\n\n\tconst lines = actions.map((action) => {\n\t\tswitch (action.action) {\n\t\t\tcase 'navigate':\n\t\t\t\treturn `await page.navigate(${JSON.stringify(action.url)})`\n\t\t\tcase 'click':\n\t\t\t\treturn `await page.click(${JSON.stringify(action.selector)})`\n\t\t\tcase 'fill':\n\t\t\t\treturn `await page.fill(${JSON.stringify(action.selector)}, ${JSON.stringify(action.value)})`\n\t\t\tcase 'select':\n\t\t\t\treturn `await page.select(${JSON.stringify(action.selector)}, ${JSON.stringify(action.values)})`\n\t\t}\n\t})\n\n\tif (language === 'typescript') {\n\t\treturn [\n\t\t\t`async function run(page: import('@orkestrel/browser').BrowserPageInterface): Promise<void> {`,\n\t\t\t...lines.map((line) => `\\t${line}`),\n\t\t\t`}`,\n\t\t].join('\\n')\n\t}\n\n\treturn [`async function run(page) {`, ...lines.map((line) => `\\t${line}`), `}`].join('\\n')\n}\n\n/**\n * Decode a flattened CDP `Page.getFrameTree` result.\n *\n * @param value - Unknown CDP result\n * @returns Frame metadata in depth-first, main-frame-first order\n */\nexport function readBrowserFrames(value: unknown): readonly BrowserFrameInfo[] {\n\tif (!isRecord(value) || !isRecord(value['frameTree'])) return []\n\n\tconst frames: BrowserFrameInfo[] = []\n\tconst stack: Array<Readonly<Record<string, unknown>>> = [value['frameTree']]\n\n\twhile (stack.length > 0) {\n\t\tconst node = stack.pop()\n\t\tif (node === undefined) break\n\t\tconst frame = node['frame']\n\n\t\tif (isRecord(frame) && isString(frame['id']) && isString(frame['url'])) {\n\t\t\tframes.push({\n\t\t\t\tid: frame['id'],\n\t\t\t\tparent: isString(frame['parentId']) ? frame['parentId'] : undefined,\n\t\t\t\tname: isString(frame['name']) && frame['name'] !== '' ? frame['name'] : undefined,\n\t\t\t\turl: frame['url'],\n\t\t\t})\n\t\t}\n\n\t\tconst children = node['childFrames']\n\t\tif (!isArray(children)) continue\n\t\tfor (let index = children.length - 1; index >= 0; index -= 1) {\n\t\t\tconst child = children[index]\n\t\t\tif (isRecord(child)) stack.push(child)\n\t\t}\n\t}\n\n\treturn frames\n}\n\n/**\n * Compile a deep, shadow-aware locator query returning every match.\n *\n * @param query - Serializable locator query\n * @returns Runtime expression returning an element array\n */\nexport function compileLocatorListExpression(query: BrowserQuery): string {\n\treturn `(() => {\n\tconst query = ${JSON.stringify(query)}\n\tconst normalize = (value) => String(value ?? '').replace(/\\\\s+/g, ' ').trim()\n\tconst matchesText = (actual, expected, exact) => exact ? normalize(actual) === normalize(expected) : normalize(actual).includes(normalize(expected))\n\tconst elements = (root) => {\n\t\tconst found = []\n\t\tconst stack = []\n\t\tif (root instanceof Document || root instanceof ShadowRoot) {\n\t\t\tfor (let index = root.children.length - 1; index >= 0; index -= 1) stack.push(root.children[index])\n\t\t} else {\n\t\t\tfor (let index = root.children.length - 1; index >= 0; index -= 1) stack.push(root.children[index])\n\t\t}\n\t\twhile (stack.length > 0) {\n\t\t\tconst element = stack.pop()\n\t\t\tif (!(element instanceof Element)) continue\n\t\t\tfound.push(element)\n\t\t\tif (element.shadowRoot) {\n\t\t\t\tfor (let index = element.shadowRoot.children.length - 1; index >= 0; index -= 1) stack.push(element.shadowRoot.children[index])\n\t\t\t}\n\t\t\tfor (let index = element.children.length - 1; index >= 0; index -= 1) stack.push(element.children[index])\n\t\t}\n\t\treturn found\n\t}\n\tconst roleOf = (element) => {\n\t\tconst explicit = element.getAttribute('role')\n\t\tif (explicit) return explicit.split(/\\\\s+/)[0]\n\t\tconst tag = element.tagName.toLowerCase()\n\t\tif (tag === 'a' && element.hasAttribute('href')) return 'link'\n\t\tif (tag === 'button') return 'button'\n\t\tif (tag === 'textarea') return 'textbox'\n\t\tif (tag === 'select') return element.multiple ? 'listbox' : 'combobox'\n\t\tif (tag === 'option') return 'option'\n\t\tif (tag === 'img') return 'img'\n\t\tif (tag === 'nav') return 'navigation'\n\t\tif (tag === 'main') return 'main'\n\t\tif (tag === 'header') return 'banner'\n\t\tif (tag === 'footer') return 'contentinfo'\n\t\tif (tag === 'aside') return 'complementary'\n\t\tif (tag === 'article') return 'article'\n\t\tif (tag === 'form') return 'form'\n\t\tif (tag === 'table') return 'table'\n\t\tif (tag === 'tr') return 'row'\n\t\tif (tag === 'th') return 'columnheader'\n\t\tif (tag === 'td') return 'cell'\n\t\tif (tag === 'ul' || tag === 'ol') return 'list'\n\t\tif (tag === 'li') return 'listitem'\n\t\tif (/^h[1-6]$/.test(tag)) return 'heading'\n\t\tif (tag === 'input') {\n\t\t\tconst type = (element.getAttribute('type') || 'text').toLowerCase()\n\t\t\tif (type === 'checkbox') return 'checkbox'\n\t\t\tif (type === 'radio') return 'radio'\n\t\t\tif (type === 'range') return 'slider'\n\t\t\tif (type === 'number') return 'spinbutton'\n\t\t\tif (type === 'button' || type === 'submit' || type === 'reset') return 'button'\n\t\t\tif (type !== 'hidden') return 'textbox'\n\t\t}\n\t\treturn undefined\n\t}\n\tconst labelOf = (element) => {\n\t\tconst labelled = element.getAttribute('aria-labelledby')\n\t\tif (labelled) {\n\t\t\tconst text = labelled.split(/\\\\s+/).map((id) => element.ownerDocument.getElementById(id)?.textContent || '').join(' ')\n\t\t\tif (normalize(text)) return normalize(text)\n\t\t}\n\t\tif (element.hasAttribute('aria-label')) return normalize(element.getAttribute('aria-label'))\n\t\tif ('labels' in element && element.labels && element.labels.length > 0) {\n\t\t\tconst text = Array.from(element.labels, (label) => label.textContent || '').join(' ')\n\t\t\treturn normalize(text)\n\t\t}\n\t\treturn undefined\n\t}\n\tconst nameOf = (element) => {\n\t\tconst label = labelOf(element)\n\t\tif (label !== undefined) return label\n\t\tconst alt = element.getAttribute('alt')\n\t\tif (alt) return normalize(alt)\n\t\tconst title = element.getAttribute('title')\n\t\tif (title) return normalize(title)\n\t\tif (element instanceof HTMLInputElement && ['button', 'submit', 'reset'].includes(element.type)) return normalize(element.value)\n\t\treturn normalize(element.textContent)\n\t}\n\tconst visible = (element) => {\n\t\tconst style = getComputedStyle(element)\n\t\tconst rect = element.getBoundingClientRect()\n\t\treturn style.display !== 'none' && style.visibility !== 'hidden' && style.visibility !== 'collapse' && rect.width > 0 && rect.height > 0\n\t}\n\tconst resolve = (candidate) => {\n\t\tconst roots = candidate.parent ? resolve(candidate.parent) : [document]\n\t\tlet found = []\n\t\tfor (const root of roots) {\n\t\t\tconst candidates = elements(root)\n\t\t\tswitch (candidate.selector) {\n\t\t\t\tcase 'css':\n\t\t\t\t\tfound.push(...candidates.filter((element) => element.matches(candidate.value)))\n\t\t\t\t\tbreak\n\t\t\t\tcase 'role':\n\t\t\t\t\tfound.push(...candidates.filter((element) => roleOf(element) === candidate.value && (candidate.name === undefined || matchesText(nameOf(element), candidate.name, candidate.exact === true))))\n\t\t\t\t\tbreak\n\t\t\t\tcase 'text':\n\t\t\t\t\tfound.push(...candidates.filter((element) => matchesText(element.textContent, candidate.value, candidate.exact === true) && !Array.from(element.children).some((child) => matchesText(child.textContent, candidate.value, candidate.exact === true))))\n\t\t\t\t\tbreak\n\t\t\t\tcase 'label':\n\t\t\t\t\tfound.push(...candidates.filter((element) => {\n\t\t\t\t\t\tconst label = labelOf(element)\n\t\t\t\t\t\treturn label !== undefined && matchesText(label, candidate.value, candidate.exact === true)\n\t\t\t\t\t}))\n\t\t\t\t\tbreak\n\t\t\t\tcase 'placeholder':\n\t\t\t\t\tfound.push(...candidates.filter((element) => matchesText(element.getAttribute('placeholder'), candidate.value, candidate.exact === true)))\n\t\t\t\t\tbreak\n\t\t\t\tcase 'test':\n\t\t\t\t\tfound.push(...candidates.filter((element) => element.getAttribute(${JSON.stringify(BROWSER_TEST_ID_ATTRIBUTE)}) === candidate.value))\n\t\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\tfound = found.filter((element, index) => found.indexOf(element) === index)\n\t\tif (candidate.filter?.text !== undefined) found = found.filter((element) => matchesText(element.textContent, candidate.filter.text, candidate.filter.exact === true))\n\t\tif (candidate.filter?.visible !== undefined) found = found.filter((element) => visible(element) === candidate.filter.visible)\n\t\tif (candidate.index !== undefined) {\n\t\t\tconst index = candidate.index < 0 ? found.length + candidate.index : candidate.index\n\t\t\treturn found[index] ? [found[index]] : []\n\t\t}\n\t\treturn found\n\t}\n\treturn resolve(query)\n})()`\n}\n\n/**\n * Compile a deep locator query returning its first match.\n *\n * @param query - Serializable locator query\n * @returns Runtime expression returning one element or undefined\n */\nexport function compileLocatorExpression(query: BrowserQuery): string {\n\treturn `(${compileLocatorListExpression(query)})[0]`\n}\n\n/**\n * Compile an attached-state locator wait.\n */\nexport function compileAttachedLocatorWaitExpression(\n\tquery: BrowserQuery,\n\tstrict: boolean,\n\ttimeout: number,\n): string {\n\treturn `new Promise((resolve, reject) => {\n\tconst deadline = performance.now() + ${timeout}\n\tconst check = () => {\n\t\tconst matches = ${compileLocatorListExpression(query)}\n\t\tif (${JSON.stringify(strict)} && matches.length > 1) {\n\t\t\treject(new Error('Strict locator matched ' + matches.length + ' elements'))\n\t\t\treturn true\n\t\t}\n\t\tif (matches.length > 0) {\n\t\t\tresolve(true)\n\t\t\treturn true\n\t\t}\n\t\tif (performance.now() >= deadline) {\n\t\t\tresolve(false)\n\t\t\treturn true\n\t\t}\n\t\treturn false\n\t}\n\tif (check()) return\n\tconst timer = setInterval(() => {\n\t\tif (!check()) return\n\t\tclearInterval(timer)\n\t}, 50)\n})`\n}\n\n/**\n * Compile a detached-state locator wait.\n */\nexport function compileDetachedLocatorWaitExpression(\n\tquery: BrowserQuery,\n\tstrict: boolean,\n\ttimeout: number,\n): string {\n\treturn `new Promise((resolve, reject) => {\n\tconst deadline = performance.now() + ${timeout}\n\tconst check = () => {\n\t\tconst matches = ${compileLocatorListExpression(query)}\n\t\tif (${JSON.stringify(strict)} && matches.length > 1) {\n\t\t\treject(new Error('Strict locator matched ' + matches.length + ' elements'))\n\t\t\treturn true\n\t\t}\n\t\tif (matches.length === 0) {\n\t\t\tresolve(true)\n\t\t\treturn true\n\t\t}\n\t\tif (performance.now() >= deadline) {\n\t\t\tresolve(false)\n\t\t\treturn true\n\t\t}\n\t\treturn false\n\t}\n\tif (check()) return\n\tconst timer = setInterval(() => {\n\t\tif (!check()) return\n\t\tclearInterval(timer)\n\t}, 50)\n})`\n}\n\n/**\n * Compile a visible-state locator wait.\n */\nexport function compileVisibleLocatorWaitExpression(\n\tquery: BrowserQuery,\n\tstrict: boolean,\n\ttimeout: number,\n): string {\n\treturn `new Promise((resolve, reject) => {\n\tconst deadline = performance.now() + ${timeout}\n\tconst visible = (element) => {\n\t\tconst style = getComputedStyle(element)\n\t\tconst rect = element.getBoundingClientRect()\n\t\treturn style.display !== 'none' && style.visibility !== 'hidden' && style.visibility !== 'collapse' && rect.width > 0 && rect.height > 0\n\t}\n\tconst check = () => {\n\t\tconst matches = ${compileLocatorListExpression(query)}\n\t\tif (${JSON.stringify(strict)} && matches.length > 1) {\n\t\t\treject(new Error('Strict locator matched ' + matches.length + ' elements'))\n\t\t\treturn true\n\t\t}\n\t\tif (matches.length > 0 && visible(matches[0])) {\n\t\t\tresolve(true)\n\t\t\treturn true\n\t\t}\n\t\tif (performance.now() >= deadline) {\n\t\t\tresolve(false)\n\t\t\treturn true\n\t\t}\n\t\treturn false\n\t}\n\tif (check()) return\n\tconst timer = setInterval(() => {\n\t\tif (!check()) return\n\t\tclearInterval(timer)\n\t}, 50)\n})`\n}\n\n/**\n * Compile a hidden-state locator wait.\n */\nexport function compileHiddenLocatorWaitExpression(\n\tquery: BrowserQuery,\n\tstrict: boolean,\n\ttimeout: number,\n): string {\n\treturn `new Promise((resolve, reject) => {\n\tconst deadline = performance.now() + ${timeout}\n\tconst visible = (element) => {\n\t\tconst style = getComputedStyle(element)\n\t\tconst rect = element.getBoundingClientRect()\n\t\treturn style.display !== 'none' && style.visibility !== 'hidden' && style.visibility !== 'collapse' && rect.width > 0 && rect.height > 0\n\t}\n\tconst check = () => {\n\t\tconst matches = ${compileLocatorListExpression(query)}\n\t\tif (${JSON.stringify(strict)} && matches.length > 1) {\n\t\t\treject(new Error('Strict locator matched ' + matches.length + ' elements'))\n\t\t\treturn true\n\t\t}\n\t\tif (matches.length === 0 || matches.every((element) => !visible(element))) {\n\t\t\tresolve(true)\n\t\t\treturn true\n\t\t}\n\t\tif (performance.now() >= deadline) {\n\t\t\tresolve(false)\n\t\t\treturn true\n\t\t}\n\t\treturn false\n\t}\n\tif (check()) return\n\tconst timer = setInterval(() => {\n\t\tif (!check()) return\n\t\tclearInterval(timer)\n\t}, 50)\n})`\n}\n\n/**\n * Compile the element-side actionability pass used before trusted input.\n *\n * @param options - Checks required for the action\n * @returns Async `Runtime.callFunctionOn` function declaration\n */\nexport function compileActionabilityFunction(options: BrowserActionabilityOptions): string {\n\treturn `async function() {\n\tif (!(this instanceof Element) || !this.isConnected) throw new Error('Element is detached')\n\tthis.scrollIntoView({ block: 'center', inline: 'center', behavior: 'instant' })\n\tconst visible = () => {\n\t\tconst style = getComputedStyle(this)\n\t\tconst rect = this.getBoundingClientRect()\n\t\treturn style.display !== 'none' && style.visibility !== 'hidden' && style.visibility !== 'collapse' && rect.width > 0 && rect.height > 0\n\t}\n\tif (${JSON.stringify(options.visible === true)} && !visible()) throw new Error('Element is not visible')\n\tif (${JSON.stringify(options.enabled === true)} && this.matches(':disabled')) throw new Error('Element is disabled')\n\tif (${JSON.stringify(options.editable === true)} && (this.matches('[readonly]') || (!this.isContentEditable && !('value' in this)))) throw new Error('Element is not editable')\n\tlet previous\n\tfor (let index = 0; index < ${BROWSER_STABLE_FRAME_COUNT}; index += 1) {\n\t\tawait new Promise((resolve) => requestAnimationFrame(resolve))\n\t\tconst rect = this.getBoundingClientRect()\n\t\tconst current = [rect.x, rect.y, rect.width, rect.height]\n\t\tif (${JSON.stringify(options.stable === true)} && previous && current.some((value, part) => value !== previous[part])) {\n\t\t\tindex = 0\n\t\t}\n\t\tprevious = current\n\t}\n\tif (${JSON.stringify(options.events === true)}) {\n\t\tconst rect = this.getBoundingClientRect()\n\t\tconst position = ${JSON.stringify(options.position)}\n\t\tconst x = rect.x + (position?.x ?? rect.width / 2)\n\t\tconst y = rect.y + (position?.y ?? rect.height / 2)\n\t\tconst target = this.ownerDocument.elementFromPoint(x, y)\n\t\tif (target !== this && !this.contains(target)) throw new Error('Element does not receive pointer events')\n\t}\n\treturn true\n}`\n}\n\n/**\n * Decode the first `DOM.getContentQuads` quad and its center.\n *\n * @param value - Unknown CDP result\n * @returns Decoded quad\n */\nexport function readBrowserQuad(value: unknown): BrowserQuad {\n\tif (!isRecord(value) || !isArray(value['quads'])) {\n\t\tthrow new BrowserError('Element has no content quad')\n\t}\n\tconst points = readNumberArray(value['quads'][0])\n\tif (points === undefined || points.length !== 8) {\n\t\tthrow new BrowserError('Element has a malformed content quad')\n\t}\n\tconst x1 = points[0]\n\tconst y1 = points[1]\n\tconst x2 = points[2]\n\tconst y2 = points[3]\n\tconst x3 = points[4]\n\tconst y3 = points[5]\n\tconst x4 = points[6]\n\tconst y4 = points[7]\n\tif (\n\t\tx1 === undefined ||\n\t\ty1 === undefined ||\n\t\tx2 === undefined ||\n\t\ty2 === undefined ||\n\t\tx3 === undefined ||\n\t\ty3 === undefined ||\n\t\tx4 === undefined ||\n\t\ty4 === undefined\n\t) {\n\t\tthrow new BrowserError('Element has a malformed content quad')\n\t}\n\treturn {\n\t\tpoints: [x1, y1, x2, y2, x3, y3, x4, y4],\n\t\tcenter: {\n\t\t\tx: (x1 + x2 + x3 + x4) / 4,\n\t\t\ty: (y1 + y2 + y3 + y4) / 4,\n\t\t},\n\t}\n}\n\n/**\n * Parse a keyboard chord such as `Control+Shift+P`.\n *\n * @param value - Chord source\n * @returns Canonical modifiers and terminal key\n */\nexport function parseBrowserChord(value: string): BrowserChord {\n\tconst parts = value.split('+').filter((part) => part.length > 0)\n\tconst key = parts.pop()\n\tif (key === undefined) throw new BrowserError('Browser key chord is empty')\n\tconst modifiers = parts.map((modifier) => {\n\t\tswitch (modifier) {\n\t\t\tcase 'Ctrl':\n\t\t\t\treturn 'Control'\n\t\t\tcase 'Cmd':\n\t\t\tcase 'Command':\n\t\t\t\treturn 'Meta'\n\t\t\tdefault:\n\t\t\t\treturn modifier\n\t\t}\n\t})\n\tfor (const modifier of modifiers) {\n\t\tif (BROWSER_KEY_MODIFIERS[modifier] === undefined) {\n\t\t\tthrow new BrowserError(`Unsupported browser key modifier: ${modifier}`)\n\t\t}\n\t}\n\treturn { modifiers, key }\n}\n\n/**\n * Compute the CDP Input modifier bitmask.\n *\n * @param modifiers - Canonical modifier names\n * @returns Combined CDP modifier mask\n */\nexport function computeBrowserModifiers(modifiers: readonly string[]): number {\n\tlet mask = 0\n\tfor (const modifier of modifiers) mask |= BROWSER_KEY_MODIFIERS[modifier] ?? 0\n\treturn mask\n}\n\n/**\n * Compute the CDP Input pressed-button bitmask.\n *\n * @param buttons - Currently pressed public mouse buttons\n * @returns Combined CDP pressed-button mask\n */\nexport function computeBrowserButtons(buttons: readonly BrowserMouseButton[]): number {\n\tlet mask = 0\n\tfor (const button of buttons) mask |= BROWSER_MOUSE_BUTTON_MASKS[button]\n\treturn mask\n}\n\n/**\n * Normalize one key to CDP keyboard event data.\n *\n * @param value - Key value or canonical key name\n * @returns Normalized key data\n */\nexport function keyToBrowserInput(value: string): BrowserKey {\n\tconst named: Readonly<Record<string, BrowserKey>> = {\n\t\tBackspace: { key: 'Backspace', code: 'Backspace', text: undefined, number: 8 },\n\t\tTab: { key: 'Tab', code: 'Tab', text: '\\t', number: 9 },\n\t\tEnter: { key: 'Enter', code: 'Enter', text: '\\r', number: 13 },\n\t\tShift: { key: 'Shift', code: 'ShiftLeft', text: undefined, number: 16 },\n\t\tControl: { key: 'Control', code: 'ControlLeft', text: undefined, number: 17 },\n\t\tAlt: { key: 'Alt', code: 'AltLeft', text: undefined, number: 18 },\n\t\tEscape: { key: 'Escape', code: 'Escape', text: undefined, number: 27 },\n\t\tSpace: { key: ' ', code: 'Space', text: ' ', number: 32 },\n\t\tPageUp: { key: 'PageUp', code: 'PageUp', text: undefined, number: 33 },\n\t\tPageDown: { key: 'PageDown', code: 'PageDown', text: undefined, number: 34 },\n\t\tEnd: { key: 'End', code: 'End', text: undefined, number: 35 },\n\t\tHome: { key: 'Home', code: 'Home', text: undefined, number: 36 },\n\t\tArrowLeft: { key: 'ArrowLeft', code: 'ArrowLeft', text: undefined, number: 37 },\n\t\tArrowUp: { key: 'ArrowUp', code: 'ArrowUp', text: undefined, number: 38 },\n\t\tArrowRight: { key: 'ArrowRight', code: 'ArrowRight', text: undefined, number: 39 },\n\t\tArrowDown: { key: 'ArrowDown', code: 'ArrowDown', text: undefined, number: 40 },\n\t\tDelete: { key: 'Delete', code: 'Delete', text: undefined, number: 46 },\n\t\tMeta: { key: 'Meta', code: 'MetaLeft', text: undefined, number: 91 },\n\t}\n\tconst matched = named[value]\n\tif (matched !== undefined) return matched\n\tif ([...value].length !== 1) throw new BrowserError(`Unsupported browser key: ${value}`)\n\tconst character = [...value][0]\n\tif (character === undefined) throw new BrowserError('Browser key is empty')\n\tconst upper = character.toUpperCase()\n\tconst letter = /^[A-Z]$/.test(upper)\n\tconst digit = /^[0-9]$/.test(character)\n\treturn {\n\t\tkey: character,\n\t\tcode: letter ? `Key${upper}` : digit ? `Digit${character}` : '',\n\t\ttext: character,\n\t\tnumber: upper.charCodeAt(0),\n\t}\n}\n\n/**\n * Compile an in-page wait for an attached selector.\n *\n * @param selector - CSS selector\n * @param strict - Whether more than one match is an error\n * @param timeout - Maximum wait in milliseconds\n * @returns Runtime expression resolving to whether the state was reached\n */\nexport function compileAttachedWaitExpression(\n\tselector: string,\n\tstrict: boolean,\n\ttimeout: number,\n): string {\n\treturn `new Promise((resolve, reject) => {\n\tconst selector = ${JSON.stringify(selector)}\n\tconst strict = ${JSON.stringify(strict)}\n\tconst check = () => {\n\t\tconst matches = document.querySelectorAll(selector)\n\t\tif (strict && matches.length > 1) {\n\t\t\treject(new Error('Strict selector matched ' + matches.length + ' elements: ' + selector))\n\t\t\treturn true\n\t\t}\n\t\tif (matches.length > 0) {\n\t\t\tresolve(true)\n\t\t\treturn true\n\t\t}\n\t\treturn false\n\t}\n\tif (check()) return\n\tconst observer = new MutationObserver(() => {\n\t\tif (!check()) return\n\t\tobserver.disconnect()\n\t\tclearTimeout(timer)\n\t})\n\tconst timer = setTimeout(() => {\n\t\tobserver.disconnect()\n\t\tresolve(false)\n\t}, ${timeout})\n\tobserver.observe(document, { childList: true, subtree: true, attributes: true })\n})`\n}\n\n/**\n * Compile an in-page wait for a detached selector.\n *\n * @param selector - CSS selector\n * @param strict - Whether more than one match is an error\n * @param timeout - Maximum wait in milliseconds\n * @returns Runtime expression resolving to whether the state was reached\n */\nexport function compileDetachedWaitExpression(\n\tselector: string,\n\tstrict: boolean,\n\ttimeout: number,\n): string {\n\treturn `new Promise((resolve, reject) => {\n\tconst selector = ${JSON.stringify(selector)}\n\tconst strict = ${JSON.stringify(strict)}\n\tconst check = () => {\n\t\tconst matches = document.querySelectorAll(selector)\n\t\tif (strict && matches.length > 1) {\n\t\t\treject(new Error('Strict selector matched ' + matches.length + ' elements: ' + selector))\n\t\t\treturn true\n\t\t}\n\t\tif (matches.length === 0) {\n\t\t\tresolve(true)\n\t\t\treturn true\n\t\t}\n\t\treturn false\n\t}\n\tif (check()) return\n\tconst observer = new MutationObserver(() => {\n\t\tif (!check()) return\n\t\tobserver.disconnect()\n\t\tclearTimeout(timer)\n\t})\n\tconst timer = setTimeout(() => {\n\t\tobserver.disconnect()\n\t\tresolve(false)\n\t}, ${timeout})\n\tobserver.observe(document, { childList: true, subtree: true, attributes: true })\n})`\n}\n\n/**\n * Compile an in-page wait for a visible selector.\n *\n * @param selector - CSS selector\n * @param strict - Whether more than one match is an error\n * @param timeout - Maximum wait in milliseconds\n * @returns Runtime expression resolving to whether the state was reached\n */\nexport function compileVisibleWaitExpression(\n\tselector: string,\n\tstrict: boolean,\n\ttimeout: number,\n): string {\n\treturn `new Promise((resolve, reject) => {\n\tconst selector = ${JSON.stringify(selector)}\n\tconst strict = ${JSON.stringify(strict)}\n\tconst visible = (element) => {\n\t\tconst style = getComputedStyle(element)\n\t\tconst rect = element.getBoundingClientRect()\n\t\treturn style.display !== 'none' && style.visibility !== 'hidden' && style.visibility !== 'collapse' && rect.width > 0 && rect.height > 0\n\t}\n\tconst check = () => {\n\t\tconst matches = document.querySelectorAll(selector)\n\t\tif (strict && matches.length > 1) {\n\t\t\treject(new Error('Strict selector matched ' + matches.length + ' elements: ' + selector))\n\t\t\treturn true\n\t\t}\n\t\tif (matches.length > 0 && visible(matches[0])) {\n\t\t\tresolve(true)\n\t\t\treturn true\n\t\t}\n\t\treturn false\n\t}\n\tif (check()) return\n\tconst observer = new MutationObserver(() => {\n\t\tif (!check()) return\n\t\tobserver.disconnect()\n\t\tclearTimeout(timer)\n\t})\n\tconst timer = setTimeout(() => {\n\t\tobserver.disconnect()\n\t\tresolve(false)\n\t}, ${timeout})\n\tobserver.observe(document, { childList: true, subtree: true, attributes: true })\n})`\n}\n\n/**\n * Compile an in-page wait for a hidden selector.\n *\n * @param selector - CSS selector\n * @param strict - Whether more than one match is an error\n * @param timeout - Maximum wait in milliseconds\n * @returns Runtime expression resolving to whether the state was reached\n */\nexport function compileHiddenWaitExpression(\n\tselector: string,\n\tstrict: boolean,\n\ttimeout: number,\n): string {\n\treturn `new Promise((resolve, reject) => {\n\tconst selector = ${JSON.stringify(selector)}\n\tconst strict = ${JSON.stringify(strict)}\n\tconst visible = (element) => {\n\t\tconst style = getComputedStyle(element)\n\t\tconst rect = element.getBoundingClientRect()\n\t\treturn style.display !== 'none' && style.visibility !== 'hidden' && style.visibility !== 'collapse' && rect.width > 0 && rect.height > 0\n\t}\n\tconst check = () => {\n\t\tconst matches = document.querySelectorAll(selector)\n\t\tif (strict && matches.length > 1) {\n\t\t\treject(new Error('Strict selector matched ' + matches.length + ' elements: ' + selector))\n\t\t\treturn true\n\t\t}\n\t\tif (matches.length === 0 || Array.from(matches).every((element) => !visible(element))) {\n\t\t\tresolve(true)\n\t\t\treturn true\n\t\t}\n\t\treturn false\n\t}\n\tif (check()) return\n\tconst observer = new MutationObserver(() => {\n\t\tif (!check()) return\n\t\tobserver.disconnect()\n\t\tclearTimeout(timer)\n\t})\n\tconst timer = setTimeout(() => {\n\t\tobserver.disconnect()\n\t\tresolve(false)\n\t}, ${timeout})\n\tobserver.observe(document, { childList: true, subtree: true, attributes: true })\n})`\n}\n\n/**\n * Compile a strict, visibility-checked click expression.\n *\n * @param selector - CSS selector\n * @param strict - Whether more than one match is an error\n * @returns Runtime expression\n */\nexport function compileClickExpression(selector: string, strict: boolean): string {\n\treturn `(() => {\n\tconst selector = ${JSON.stringify(selector)}\n\tconst matches = document.querySelectorAll(selector)\n\tif (${JSON.stringify(strict)} && matches.length !== 1) throw new Error('Strict selector matched ' + matches.length + ' elements: ' + selector)\n\tconst el = matches[0]\n\tif (!el) throw new Error('Element not found: ' + selector)\n\tconst style = getComputedStyle(el)\n\tconst rect = el.getBoundingClientRect()\n\tif (style.display === 'none' || style.visibility === 'hidden' || style.visibility === 'collapse' || rect.width <= 0 || rect.height <= 0) throw new Error('Element is not visible: ' + selector)\n\tif (el.matches(':disabled')) throw new Error('Element is disabled: ' + selector)\n\tel.scrollIntoView({ block: 'center', inline: 'center' })\n\tel.click()\n})()`\n}\n\n/**\n * Compile a strict, editable fill expression.\n *\n * @param selector - CSS selector\n * @param value - Value to assign\n * @param strict - Whether more than one match is an error\n * @returns Runtime expression\n */\nexport function compileFillExpression(selector: string, value: string, strict: boolean): string {\n\treturn `(() => {\n\tconst selector = ${JSON.stringify(selector)}\n\tconst matches = document.querySelectorAll(selector)\n\tif (${JSON.stringify(strict)} && matches.length !== 1) throw new Error('Strict selector matched ' + matches.length + ' elements: ' + selector)\n\tconst el = matches[0]\n\tif (!el) throw new Error('Element not found: ' + selector)\n\tconst style = getComputedStyle(el)\n\tconst rect = el.getBoundingClientRect()\n\tif (style.display === 'none' || style.visibility === 'hidden' || style.visibility === 'collapse' || rect.width <= 0 || rect.height <= 0) throw new Error('Element is not visible: ' + selector)\n\tif (el.matches(':disabled') || el.matches('[readonly]')) throw new Error('Element is not editable: ' + selector)\n\tif (!el.isContentEditable && !('value' in el)) throw new Error('Element cannot be filled: ' + selector)\n\tel.focus()\n\tif (el.isContentEditable) {\n\t\tel.textContent = ${JSON.stringify(value)}\n\t} else {\n\t\tel.value = ${JSON.stringify(value)}\n\t}\n\tel.dispatchEvent(new InputEvent('input', { bubbles: true, inputType: 'insertText', data: ${JSON.stringify(value)} }))\n\tel.dispatchEvent(new Event('change', { bubbles: true }))\n})()`\n}\n\n/**\n * Compile a strict select expression.\n *\n * @param selector - CSS selector\n * @param values - Option values to select\n * @param strict - Whether more than one match is an error\n * @returns Runtime expression\n */\nexport function compileSelectExpression(\n\tselector: string,\n\tvalues: readonly string[],\n\tstrict: boolean,\n): string {\n\treturn `(() => {\n\tconst selector = ${JSON.stringify(selector)}\n\tconst matches = document.querySelectorAll(selector)\n\tif (${JSON.stringify(strict)} && matches.length !== 1) throw new Error('Strict selector matched ' + matches.length + ' elements: ' + selector)\n\tconst el = matches[0]\n\tif (!el) throw new Error('Element not found: ' + selector)\n\tif (!(el instanceof HTMLSelectElement)) throw new Error('Element is not a select: ' + selector)\n\tif (el.disabled) throw new Error('Element is disabled: ' + selector)\n\tconst values = ${JSON.stringify([...values])}\n\tif (!el.multiple && values.length > 1) throw new Error('Single select cannot accept multiple values: ' + selector)\n\tconst available = new Set(Array.from(el.options, (option) => option.value))\n\tconst missing = values.filter((value) => !available.has(value))\n\tif (missing.length > 0) throw new Error('Select options not found: ' + missing.join(', '))\n\tfor (const opt of el.options) opt.selected = values.includes(opt.value)\n\tel.dispatchEvent(new Event('input', { bubbles: true }))\n\tel.dispatchEvent(new Event('change', { bubbles: true }))\n})()`\n}\n\n/**\n * Read an unknown value as an all-number array.\n *\n * @param value - Candidate value\n * @returns The number array, or undefined\n */\nexport function readNumberArray(value: unknown): readonly number[] | undefined {\n\tif (!isArray(value) || !value.every(isFiniteNumber)) {\n\t\treturn undefined\n\t}\n\treturn value\n}\n\n/**\n * Resolve one index from a CDP snapshot string table.\n *\n * @param strings - Snapshot string table\n * @param index - Candidate string index\n * @returns The resolved string, or undefined\n */\nexport function readSnapshotString(strings: readonly string[], index: unknown): string | undefined {\n\tif (!isInteger(index)) return undefined\n\treturn strings[index]\n}\n\n/**\n * Decode CDP snapshot sparse string data.\n *\n * @param value - Sparse `{ index, value }` record\n * @param strings - Snapshot string table\n * @returns Node-index to string map\n */\nexport function decodeRareStringData(\n\tvalue: unknown,\n\tstrings: readonly string[],\n): ReadonlyMap<number, string> {\n\tconst decoded = new Map<number, string>()\n\tif (!isRecord(value)) return decoded\n\tconst indexes = readNumberArray(value['index'])\n\tconst values = readNumberArray(value['value'])\n\tif (indexes === undefined || values === undefined) return decoded\n\n\tfor (let index = 0; index < indexes.length; index += 1) {\n\t\tconst node = indexes[index]\n\t\tconst text = readSnapshotString(strings, values[index])\n\t\tif (node !== undefined && text !== undefined) decoded.set(node, text)\n\t}\n\treturn decoded\n}\n\n/**\n * Decode CDP snapshot sparse boolean data.\n *\n * @param value - Sparse `{ index }` record\n * @returns Set of node indexes whose value is true\n */\nexport function decodeRareBooleanData(value: unknown): ReadonlySet<number> {\n\tif (!isRecord(value)) return new Set()\n\treturn new Set(readNumberArray(value['index']) ?? [])\n}\n\n/**\n * Decode CDP snapshot sparse integer data.\n *\n * @param value - Sparse `{ index, value }` record\n * @returns Node-index to integer map\n */\nexport function decodeRareIntegerData(value: unknown): ReadonlyMap<number, number> {\n\tconst decoded = new Map<number, number>()\n\tif (!isRecord(value)) return decoded\n\tconst indexes = readNumberArray(value['index'])\n\tconst values = readNumberArray(value['value'])\n\tif (indexes === undefined || values === undefined) return decoded\n\n\tfor (let index = 0; index < indexes.length; index += 1) {\n\t\tconst node = indexes[index]\n\t\tconst integer = values[index]\n\t\tif (node !== undefined && integer !== undefined) decoded.set(node, integer)\n\t}\n\treturn decoded\n}\n\n/**\n * Decode a CDP snapshot rectangle.\n *\n * @param value - Candidate four-number array\n * @returns A rectangle, or undefined\n */\nexport function readBrowserRect(value: unknown): BrowserRect | undefined {\n\tconst numbers = readNumberArray(value)\n\tif (numbers === undefined || numbers.length !== 4) return undefined\n\tconst x = numbers[0]\n\tconst y = numbers[1]\n\tconst width = numbers[2]\n\tconst height = numbers[3]\n\tif (x === undefined || y === undefined || width === undefined || height === undefined) {\n\t\treturn undefined\n\t}\n\treturn [x, y, width, height]\n}\n\n/**\n * Decode flattened CDP node attributes.\n *\n * @param value - Candidate string-index array\n * @param strings - Snapshot string table\n * @returns Frozen attribute record\n */\nexport function decodeBrowserAttributes(\n\tvalue: unknown,\n\tstrings: readonly string[],\n): Readonly<Record<string, string>> {\n\tconst indexes = readNumberArray(value)\n\tconst attributes: Record<string, string> = {}\n\tif (indexes === undefined) return Object.freeze(attributes)\n\n\tfor (let index = 0; index < indexes.length; index += 2) {\n\t\tconst name = readSnapshotString(strings, indexes[index])\n\t\tconst attribute = readSnapshotString(strings, indexes[index + 1])\n\t\tif (name !== undefined && attribute !== undefined) attributes[name] = attribute\n\t}\n\treturn Object.freeze(attributes)\n}\n\n/**\n * Decode a CDP `DOMSnapshot.captureSnapshot` result.\n *\n * @param value - Unknown CDP result\n * @param styles - Requested computed-style names, in protocol order\n * @param limit - Maximum accepted node count\n * @returns A typed serializable browser snapshot\n */\nexport function decodeBrowserSnapshot(\n\tvalue: unknown,\n\tstyles: readonly string[] = [],\n\tlimit = BROWSER_SNAPSHOT_NODE_LIMIT,\n): BrowserSnapshotInput {\n\tif (!isInteger(limit) || limit < 0) {\n\t\tthrow new BrowserError('Browser snapshot limit must be a non-negative integer', undefined, {\n\t\t\tlimit,\n\t\t})\n\t}\n\tif (!isRecord(value) || !isArray(value['strings']) || !isArray(value['documents'])) {\n\t\tthrow new BrowserError('Malformed DOMSnapshot.captureSnapshot result')\n\t}\n\tif (!value['strings'].every(isString)) {\n\t\tthrow new BrowserError('Malformed DOMSnapshot string table')\n\t}\n\n\tconst strings: readonly string[] = value['strings']\n\tlet count = 0\n\tfor (const document of value['documents']) {\n\t\tif (!isRecord(document) || !isRecord(document['nodes'])) continue\n\t\tcount += readNumberArray(document['nodes']['nodeType'])?.length ?? 0\n\t}\n\tif (count > limit) {\n\t\tthrow new BrowserResultLimitError('DOM snapshot exceeds the configured node limit', {\n\t\t\tlength: count,\n\t\t\tlimit,\n\t\t})\n\t}\n\n\tconst documents: BrowserDocument[] = []\n\tfor (let documentIndex = 0; documentIndex < value['documents'].length; documentIndex += 1) {\n\t\tconst rawDocument = value['documents'][documentIndex]\n\t\tif (!isRecord(rawDocument) || !isRecord(rawDocument['nodes'])) {\n\t\t\tthrow new BrowserError('Malformed DOM snapshot document', undefined, {\n\t\t\t\tdocument: documentIndex,\n\t\t\t})\n\t\t}\n\n\t\tconst rawNodes = rawDocument['nodes']\n\t\tconst frame = readSnapshotString(strings, rawDocument['frameId'])\n\t\tconst url = readSnapshotString(strings, rawDocument['documentURL'])\n\t\tconst title =\n\t\t\trawDocument['title'] === -1 ? '' : readSnapshotString(strings, rawDocument['title'])\n\t\tif (frame === undefined || url === undefined || title === undefined) {\n\t\t\tthrow new BrowserError('Malformed DOM snapshot document metadata', undefined, {\n\t\t\t\tdocument: documentIndex,\n\t\t\t})\n\t\t}\n\t\tconst types = readNumberArray(rawNodes['nodeType'])\n\t\tconst names = readNumberArray(rawNodes['nodeName'])\n\t\tconst values = readNumberArray(rawNodes['nodeValue'])\n\t\tif (types === undefined || names === undefined || values === undefined) {\n\t\t\tthrow new BrowserError('Malformed DOM snapshot node table', undefined, {\n\t\t\t\tdocument: documentIndex,\n\t\t\t})\n\t\t}\n\n\t\tconst parents = readNumberArray(rawNodes['parentIndex']) ?? []\n\t\tconst ids = readNumberArray(rawNodes['backendNodeId']) ?? []\n\t\tconst rawAttributes = isArray(rawNodes['attributes']) ? rawNodes['attributes'] : []\n\t\tconst texts = decodeRareStringData(rawNodes['textValue'], strings)\n\t\tconst inputs = decodeRareStringData(rawNodes['inputValue'], strings)\n\t\tconst checked = decodeRareBooleanData(rawNodes['inputChecked'])\n\t\tconst selected = decodeRareBooleanData(rawNodes['optionSelected'])\n\t\tconst clickable = decodeRareBooleanData(rawNodes['isClickable'])\n\t\tconst shadows = decodeRareStringData(rawNodes['shadowRootType'], strings)\n\t\tconst contents = decodeRareIntegerData(rawNodes['contentDocumentIndex'])\n\t\tconst pseudos = decodeRareStringData(rawNodes['pseudoType'], strings)\n\t\tconst sources = decodeRareStringData(rawNodes['currentSourceURL'], strings)\n\t\tconst origins = decodeRareStringData(rawNodes['originURL'], strings)\n\t\tconst layouts = new Map<number, BrowserLayout>()\n\n\t\tif (isRecord(rawDocument['layout'])) {\n\t\t\tconst rawLayout = rawDocument['layout']\n\t\t\tconst nodeIndexes = readNumberArray(rawLayout['nodeIndex']) ?? []\n\t\t\tconst rawStyles = isArray(rawLayout['styles']) ? rawLayout['styles'] : []\n\t\t\tconst rawBounds = isArray(rawLayout['bounds']) ? rawLayout['bounds'] : []\n\t\t\tconst rawTexts = readNumberArray(rawLayout['text']) ?? []\n\t\t\tconst paints = readNumberArray(rawLayout['paintOrders']) ?? []\n\t\t\tconst rawOffsets = isArray(rawLayout['offsetRects']) ? rawLayout['offsetRects'] : []\n\t\t\tconst rawScrolls = isArray(rawLayout['scrollRects']) ? rawLayout['scrollRects'] : []\n\t\t\tconst rawClients = isArray(rawLayout['clientRects']) ? rawLayout['clientRects'] : []\n\n\t\t\tfor (let layoutIndex = 0; layoutIndex < nodeIndexes.length; layoutIndex += 1) {\n\t\t\t\tconst nodeIndex = nodeIndexes[layoutIndex]\n\t\t\t\tif (nodeIndex === undefined) continue\n\t\t\t\tconst styleIndexes = readNumberArray(rawStyles[layoutIndex]) ?? []\n\t\t\t\tconst computed: Record<string, string> = {}\n\t\t\t\tfor (let styleIndex = 0; styleIndex < styles.length; styleIndex += 1) {\n\t\t\t\t\tconst name = styles[styleIndex]\n\t\t\t\t\tconst style = readSnapshotString(strings, styleIndexes[styleIndex])\n\t\t\t\t\tif (name !== undefined && style !== undefined) computed[name] = style\n\t\t\t\t}\n\t\t\t\tlayouts.set(nodeIndex, {\n\t\t\t\t\tbounds: readBrowserRect(rawBounds[layoutIndex]),\n\t\t\t\t\tstyles: Object.freeze(computed),\n\t\t\t\t\ttext: readSnapshotString(strings, rawTexts[layoutIndex]),\n\t\t\t\t\tpaint: paints[layoutIndex],\n\t\t\t\t\toffset: readBrowserRect(rawOffsets[layoutIndex]),\n\t\t\t\t\tscroll: readBrowserRect(rawScrolls[layoutIndex]),\n\t\t\t\t\tclient: readBrowserRect(rawClients[layoutIndex]),\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\tconst nodes: BrowserNode[] = []\n\t\tfor (let nodeIndex = 0; nodeIndex < types.length; nodeIndex += 1) {\n\t\t\tconst type = types[nodeIndex]\n\t\t\tconst name = readSnapshotString(strings, names[nodeIndex])\n\t\t\tconst nodeValue =\n\t\t\t\tvalues[nodeIndex] === -1 ? '' : readSnapshotString(strings, values[nodeIndex])\n\t\t\tif (type === undefined || name === undefined || nodeValue === undefined) {\n\t\t\t\tthrow new BrowserError('Malformed DOM snapshot node', undefined, {\n\t\t\t\t\tdocument: documentIndex,\n\t\t\t\t\tindex: nodeIndex,\n\t\t\t\t})\n\t\t\t}\n\t\t\tconst parent = parents[nodeIndex]\n\t\t\tnodes.push({\n\t\t\t\tdocument: documentIndex,\n\t\t\t\tframe,\n\t\t\t\tindex: nodeIndex,\n\t\t\t\tid: ids[nodeIndex],\n\t\t\t\tparent: parent === undefined || parent < 0 ? undefined : parent,\n\t\t\t\ttype,\n\t\t\t\tname,\n\t\t\t\tvalue: nodeValue,\n\t\t\t\tattributes: decodeBrowserAttributes(rawAttributes[nodeIndex], strings),\n\t\t\t\ttext: texts.get(nodeIndex),\n\t\t\t\tinput: inputs.get(nodeIndex),\n\t\t\t\tchecked: checked.has(nodeIndex) ? true : undefined,\n\t\t\t\tselected: selected.has(nodeIndex) ? true : undefined,\n\t\t\t\tclickable: clickable.has(nodeIndex) ? true : undefined,\n\t\t\t\tshadow: shadows.get(nodeIndex),\n\t\t\t\tcontent: contents.get(nodeIndex),\n\t\t\t\tpseudo: pseudos.get(nodeIndex),\n\t\t\t\tsource: sources.get(nodeIndex),\n\t\t\t\torigin: origins.get(nodeIndex),\n\t\t\t\tlayout: layouts.get(nodeIndex),\n\t\t\t})\n\t\t}\n\n\t\tdocuments.push({\n\t\t\tindex: documentIndex,\n\t\t\tframe,\n\t\t\turl,\n\t\t\ttitle,\n\t\t\tnodes,\n\t\t\tscroll: [\n\t\t\t\tisFiniteNumber(rawDocument['scrollOffsetX']) ? rawDocument['scrollOffsetX'] : undefined,\n\t\t\t\tisFiniteNumber(rawDocument['scrollOffsetY']) ? rawDocument['scrollOffsetY'] : undefined,\n\t\t\t],\n\t\t\twidth: isFiniteNumber(rawDocument['contentWidth']) ? rawDocument['contentWidth'] : undefined,\n\t\t\theight: isFiniteNumber(rawDocument['contentHeight'])\n\t\t\t\t? rawDocument['contentHeight']\n\t\t\t\t: undefined,\n\t\t})\n\t}\n\n\treturn { documents, styles: [...styles] }\n}\n\n/**\n * Read one captured node attribute.\n *\n * @param node - Captured browser node\n * @param name - Attribute name\n * @returns Attribute value, or undefined\n */\nexport function attributeOfBrowserNode(node: BrowserNode, name: string): string | undefined {\n\treturn node.attributes[name]\n}\n\n/**\n * Test whether a browser-node matcher is a declarative query.\n *\n * @param value - Browser-node query or predicate\n * @returns Whether the matcher is a declarative query\n *\n * @example\n * ```ts\n * import { isBrowserNodeQuery } from '@src/core'\n *\n * isBrowserNodeQuery({ name: 'main' }) // true\n * isBrowserNodeQuery(() => true) // false\n * ```\n */\nexport function isBrowserNodeQuery(\n\tvalue: BrowserNodeQuery | BrowserNodePredicate,\n): value is BrowserNodeQuery {\n\treturn !isFunction(value)\n}\n\n/**\n * Test a captured node against a declarative query.\n *\n * @param node - Captured browser node\n * @param query - Fields every candidate must satisfy\n * @returns Whether the node matches\n */\nexport function matchesBrowserNode(node: BrowserNode, query: BrowserNodeQuery): boolean {\n\tif (query.name !== undefined && node.name.toLowerCase() !== query.name.toLowerCase()) return false\n\tif (\n\t\tquery.text !== undefined &&\n\t\t!node.value.includes(query.text) &&\n\t\tnode.text?.includes(query.text) !== true\n\t) {\n\t\treturn false\n\t}\n\tif (query.frame !== undefined && node.frame !== query.frame) return false\n\tif (query.clickable !== undefined && (node.clickable === true) !== query.clickable) return false\n\tif (query.visible !== undefined && isBrowserNodeVisible(node) !== query.visible) return false\n\tif (query.attributes !== undefined) {\n\t\tfor (const [name, value] of Object.entries(query.attributes)) {\n\t\t\tif (node.attributes[name] !== value) return false\n\t\t}\n\t}\n\treturn true\n}\n\n/**\n * Test whether a captured node has a non-empty rendered layout box.\n *\n * @param node - Captured browser node\n * @returns Whether the snapshot reports a visible layout box\n */\nexport function isBrowserNodeVisible(node: BrowserNode): boolean {\n\tconst bounds = node.layout?.bounds\n\treturn bounds !== undefined && bounds[2] > 0 && bounds[3] > 0\n}\n","import type {\n\tCDPClientInterface,\n\tCDPClientOptions,\n\tCDPHandler,\n\tCDPTransportInterface,\n} from './types.js'\nimport { BROWSER_DEFAULT_TIMEOUT_MS } from './constants.js'\nimport { CDPConnectionError, CDPError, CDPTimeoutError } from './errors.js'\nimport { isInteger, isRecord, isString, parseJSON } from '@orkestrel/contract'\n\n// === CDPClient\n\n/**\n * Lightweight Chrome DevTools Protocol client over a {@link CDPTransportInterface}.\n *\n * @remarks\n * Sends JSON-RPC messages over the injected transport and dispatches\n * responses and events. The transport owns the connection itself\n * (WebSocket, pipe, or any other duplex channel); this class owns only\n * the JSON-RPC framing and id/session correlation.\n *\n * Supports session-scoped event subscriptions: when a sessionId is\n * provided to subscribe/unsubscribe, the handler only fires for CDP\n * events carrying that sessionId. Global subscriptions (no sessionId)\n * continue to see ALL events for backwards compatibility.\n */\nexport class CDPClient implements CDPClientInterface {\n\treadonly #transport: CDPTransportInterface\n\t#messageId = 0\n\treadonly #pending: Map<\n\t\tnumber,\n\t\t{\n\t\t\tmethod: string\n\t\t\tresolve: (value: unknown) => void\n\t\t\treject: (reason: unknown) => void\n\t\t\ttimer: ReturnType<typeof setTimeout>\n\t\t}\n\t> = new Map()\n\treadonly #subscriptions: Map<string, Set<CDPHandler>> = new Map()\n\treadonly #sessionSubscriptions: Map<string, Map<string, Set<CDPHandler>>> = new Map()\n\t#connected = false\n\t#active = false\n\t#wired = false\n\treadonly #timeout: number\n\t#connecting: Promise<void> | undefined\n\t#closing: Promise<void> | undefined\n\t#closeRequested = false\n\n\tconstructor(options: CDPClientOptions) {\n\t\tthis.#transport = options.transport\n\t\tthis.#timeout = options.timeout ?? BROWSER_DEFAULT_TIMEOUT_MS\n\t}\n\n\tget connected(): boolean {\n\t\treturn this.#connected\n\t}\n\n\tasync connect(): Promise<void> {\n\t\tif (this.#closing !== undefined) await this.#closing\n\t\tif (this.#connected) return\n\t\tif (this.#connecting !== undefined) return this.#connecting\n\n\t\tthis.#closeRequested = false\n\t\tconst attempt = this.#start()\n\t\tthis.#connecting = attempt\n\t\ttry {\n\t\t\tawait attempt\n\t\t} finally {\n\t\t\tif (this.#connecting === attempt) this.#connecting = undefined\n\t\t}\n\t}\n\n\t/**\n\t * Close the transport and re-establish a fresh connection.\n\t *\n\t * @remarks\n\t * Client-level subscriptions (`subscribe`/`unsubscribe` registrations)\n\t * survive `close()` and remain active after the reconnect — only pending\n\t * in-flight requests are rejected. This lets a caller reconnect a dropped\n\t * transport without re-registering every handler.\n\t */\n\tasync reconnect(): Promise<void> {\n\t\tawait this.close()\n\t\tawait this.connect()\n\t}\n\n\tasync send(\n\t\tmethod: string,\n\t\tparams?: Readonly<Record<string, unknown>>,\n\t\tsessionId?: string,\n\t\ttimeout?: number,\n\t): Promise<unknown> {\n\t\tif (!this.#connected) {\n\t\t\tthrow new CDPConnectionError('CDP client is not connected', { method })\n\t\t}\n\n\t\tconst id = this.#nextId()\n\t\tconst message: Record<string, unknown> = { id, method }\n\n\t\tif (params !== undefined) {\n\t\t\tmessage['params'] = params\n\t\t}\n\t\tif (sessionId !== undefined) {\n\t\t\tmessage['sessionId'] = sessionId\n\t\t}\n\n\t\tconst serialized = JSON.stringify(message)\n\t\tconst effectiveTimeout = timeout ?? this.#timeout\n\n\t\treturn new Promise<unknown>((resolve, reject) => {\n\t\t\tconst timer = setTimeout(() => {\n\t\t\t\tthis.#pending.delete(id)\n\t\t\t\treject(\n\t\t\t\t\tnew CDPTimeoutError(`CDP request timed out: ${method}`, {\n\t\t\t\t\t\tmethod,\n\t\t\t\t\t\ttimeout: effectiveTimeout,\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t}, effectiveTimeout)\n\n\t\t\tthis.#pending.set(id, { method, resolve, reject, timer })\n\n\t\t\tthis.#transport.send(serialized).catch((thrown: unknown) => {\n\t\t\t\tthis.#pending.delete(id)\n\t\t\t\tclearTimeout(timer)\n\t\t\t\treject(thrown)\n\t\t\t})\n\t\t})\n\t}\n\n\tsubscribe(method: string, handler: CDPHandler, sessionId?: string): void {\n\t\tif (sessionId !== undefined) {\n\t\t\tlet sessionMap = this.#sessionSubscriptions.get(sessionId)\n\t\t\tif (sessionMap === undefined) {\n\t\t\t\tsessionMap = new Map()\n\t\t\t\tthis.#sessionSubscriptions.set(sessionId, sessionMap)\n\t\t\t}\n\t\t\tlet handlers = sessionMap.get(method)\n\t\t\tif (handlers === undefined) {\n\t\t\t\thandlers = new Set()\n\t\t\t\tsessionMap.set(method, handlers)\n\t\t\t}\n\t\t\thandlers.add(handler)\n\t\t} else {\n\t\t\tlet handlers = this.#subscriptions.get(method)\n\t\t\tif (handlers === undefined) {\n\t\t\t\thandlers = new Set()\n\t\t\t\tthis.#subscriptions.set(method, handlers)\n\t\t\t}\n\t\t\thandlers.add(handler)\n\t\t}\n\t}\n\n\tunsubscribe(method: string, handler: CDPHandler, sessionId?: string): void {\n\t\tif (sessionId !== undefined) {\n\t\t\tconst sessionMap = this.#sessionSubscriptions.get(sessionId)\n\t\t\tif (sessionMap !== undefined) {\n\t\t\t\tconst handlers = sessionMap.get(method)\n\t\t\t\tif (handlers !== undefined) {\n\t\t\t\t\thandlers.delete(handler)\n\t\t\t\t\tif (handlers.size === 0) {\n\t\t\t\t\t\tsessionMap.delete(method)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (sessionMap.size === 0) {\n\t\t\t\t\tthis.#sessionSubscriptions.delete(sessionId)\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tconst handlers = this.#subscriptions.get(method)\n\t\t\tif (handlers !== undefined) {\n\t\t\t\thandlers.delete(handler)\n\t\t\t\tif (handlers.size === 0) {\n\t\t\t\t\tthis.#subscriptions.delete(method)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Close the transport and reject all pending requests.\n\t *\n\t * @remarks\n\t * Subscriptions registered via `subscribe()` are client-level\n\t * registrations, not connection-level state — they survive `close()`\n\t * (and a subsequent `reconnect()`/`connect()`) and keep firing once the\n\t * transport is active again. Only pending requests are rejected here.\n\t * If `close()` is called while `connect()` is still awaiting\n\t * `transport.start()`, the in-flight connect is rejected and the\n\t * transport is closed deterministically once `start()` resolves.\n\t */\n\tasync close(): Promise<void> {\n\t\tconst active = this.#closing\n\t\tif (active !== undefined) {\n\t\t\tawait active\n\t\t\treturn\n\t\t}\n\n\t\tconst attempt = this.#stop()\n\t\tthis.#closing = attempt\n\t\ttry {\n\t\t\tawait attempt\n\t\t} finally {\n\t\t\tif (this.#closing === attempt) this.#closing = undefined\n\t\t}\n\t}\n\n\t// === Private helpers\n\n\tasync #start(): Promise<void> {\n\t\tif (!this.#wired) {\n\t\t\tthis.#transport.emitter.on('message', (data) => this.#onMessage(data))\n\t\t\tthis.#transport.emitter.on('close', () => this.#onClose())\n\t\t\tthis.#transport.emitter.on('error', (error) => this.#onError(error))\n\t\t\tthis.#wired = true\n\t\t}\n\n\t\tawait this.#transport.start()\n\t\tthis.#active = true\n\n\t\tif (this.#closeRequested) {\n\t\t\tthis.#closeRequested = false\n\t\t\ttry {\n\t\t\t\tawait this.#transport.close()\n\t\t\t} finally {\n\t\t\t\tthis.#active = false\n\t\t\t}\n\t\t\tthrow new CDPConnectionError('CDP client was closed while connecting', {\n\t\t\t\tmethod: 'connect',\n\t\t\t})\n\t\t}\n\n\t\tthis.#connected = true\n\t}\n\n\tasync #stop(): Promise<void> {\n\t\tif (this.#connecting !== undefined) {\n\t\t\tthis.#closeRequested = true\n\t\t\tawait this.#connecting.catch(() => undefined)\n\t\t\t// The in-flight attempt may have already flipped #connected to\n\t\t\t// true before observing #closeRequested (race between the\n\t\t\t// attempt's final steps and #closeRequested being set here).\n\t\t\t// Fall through to the normal connected-close path instead of\n\t\t\t// returning early, or the close would be silently lost.\n\t\t}\n\n\t\tif (!this.#connected && !this.#active) return\n\n\t\tthis.#connected = false\n\n\t\t// Reject all pending requests\n\t\tfor (const [id, entry] of this.#pending) {\n\t\t\tclearTimeout(entry.timer)\n\t\t\tentry.reject(new CDPConnectionError('CDP connection closed', { method: entry.method }))\n\t\t\tthis.#pending.delete(id)\n\t\t}\n\n\t\ttry {\n\t\t\tawait this.#transport.close()\n\t\t} finally {\n\t\t\tthis.#active = false\n\t\t}\n\t}\n\n\t#nextId(): number {\n\t\tthis.#messageId += 1\n\t\treturn this.#messageId\n\t}\n\n\t#onClose(): void {\n\t\tthis.#connected = false\n\t\tthis.#active = false\n\n\t\t// Reject all pending requests\n\t\tfor (const [id, entry] of this.#pending) {\n\t\t\tclearTimeout(entry.timer)\n\t\t\tentry.reject(new CDPConnectionError('CDP connection closed', { method: entry.method }))\n\t\t\tthis.#pending.delete(id)\n\t\t}\n\t}\n\n\t#onError(error: unknown): void {\n\t\tthis.#connected = false\n\t\tfor (const [id, entry] of this.#pending) {\n\t\t\tclearTimeout(entry.timer)\n\t\t\tentry.reject(\n\t\t\t\tnew CDPConnectionError(`CDP connection failed: ${String(error)}`, {\n\t\t\t\t\tmethod: entry.method,\n\t\t\t\t\terror,\n\t\t\t\t}),\n\t\t\t)\n\t\t\tthis.#pending.delete(id)\n\t\t}\n\t}\n\n\t#onMessage(data: string): void {\n\t\tconst parsed = parseJSON(data)\n\t\tif (!isRecord(parsed)) return\n\n\t\t// Response to a pending request\n\t\tif (isInteger(parsed['id'])) {\n\t\t\tconst id = parsed['id']\n\t\t\tconst entry = this.#pending.get(id)\n\t\t\tif (entry !== undefined) {\n\t\t\t\tthis.#pending.delete(id)\n\t\t\t\tclearTimeout(entry.timer)\n\n\t\t\t\tconst errorValue = parsed['error']\n\t\t\t\tif (isRecord(errorValue)) {\n\t\t\t\t\tconst message = isString(errorValue['message']) ? errorValue['message'] : 'CDP error'\n\t\t\t\t\tconst context: Record<string, unknown> = { method: entry.method }\n\t\t\t\t\tif ('code' in errorValue) context['code'] = errorValue['code']\n\t\t\t\t\tcontext['message'] = message\n\t\t\t\t\tif ('data' in errorValue) context['data'] = errorValue['data']\n\t\t\t\t\tentry.reject(new CDPError(message, context))\n\t\t\t\t} else {\n\t\t\t\t\tentry.resolve('result' in parsed ? parsed['result'] : undefined)\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn\n\t\t}\n\n\t\t// CDP event\n\t\tif (isString(parsed['method'])) {\n\t\t\tconst method = parsed['method']\n\t\t\tconst rawParams = parsed['params']\n\t\t\tconst params: Readonly<Record<string, unknown>> = isRecord(rawParams)\n\t\t\t\t? rawParams\n\t\t\t\t: Object.freeze({})\n\n\t\t\t// Fire global handlers (backwards compatible — see ALL events)\n\t\t\tconst globalHandlers = this.#subscriptions.get(method)\n\t\t\tif (globalHandlers !== undefined) {\n\t\t\t\tthis.#dispatch(globalHandlers, params)\n\t\t\t}\n\n\t\t\t// Fire session-scoped handlers\n\t\t\tconst eventSessionId = parsed['sessionId']\n\t\t\tif (isString(eventSessionId)) {\n\t\t\t\tconst sessionMap = this.#sessionSubscriptions.get(eventSessionId)\n\t\t\t\tif (sessionMap !== undefined) {\n\t\t\t\t\tconst sessionHandlers = sessionMap.get(method)\n\t\t\t\t\tif (sessionHandlers !== undefined) {\n\t\t\t\t\t\tthis.#dispatch(sessionHandlers, params)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t#dispatch(handlers: ReadonlySet<CDPHandler>, params: Readonly<Record<string, unknown>>): void {\n\t\tfor (const handler of [...handlers]) {\n\t\t\ttry {\n\t\t\t\thandler(params)\n\t\t\t} catch {\n\t\t\t\t// One observer must not prevent sibling observers from receiving the event.\n\t\t\t}\n\t\t}\n\t}\n}\n","import type {\n\tBrowserAccessibilityInterface,\n\tBrowserAccessibilityOptions,\n\tBrowserAccessibilitySnapshot,\n\tBrowserFrameInterface,\n} from './types.js'\nimport { readBrowserAccessibility, validateBrowserAccessibilityOptions } from './helpers.js'\n\n/**\n * Chromium Accessibility-domain snapshots for one page.\n */\nexport class BrowserAccessibility implements BrowserAccessibilityInterface {\n\treadonly #frame: BrowserFrameInterface\n\n\tconstructor(frame: BrowserFrameInterface) {\n\t\tthis.#frame = frame\n\t}\n\n\tasync snapshot(options?: BrowserAccessibilityOptions): Promise<BrowserAccessibilitySnapshot> {\n\t\tvalidateBrowserAccessibilityOptions(options)\n\t\tawait this.#frame.send('Accessibility.enable')\n\t\ttry {\n\t\t\tconst result =\n\t\t\t\toptions?.root === undefined\n\t\t\t\t\t? await this.#frame.send('Accessibility.getFullAXTree', {\n\t\t\t\t\t\t\tdepth: options?.depth,\n\t\t\t\t\t\t\tframeId: this.#frame.id,\n\t\t\t\t\t\t})\n\t\t\t\t\t: await this.#frame.send('Accessibility.getPartialAXTree', {\n\t\t\t\t\t\t\tbackendNodeId: options.root,\n\t\t\t\t\t\t\tfetchRelatives: true,\n\t\t\t\t\t\t})\n\t\t\treturn readBrowserAccessibility(result)\n\t\t} finally {\n\t\t\tawait this.#frame.send('Accessibility.disable').catch(() => undefined)\n\t\t}\n\t}\n}\n","import type { BrowserClockInterface, BrowserFrameInterface } from './types.js'\nimport { BROWSER_DEFAULT_TIMEOUT_MS } from './constants.js'\nimport { BrowserError } from './errors.js'\nimport { isFiniteNumber } from '@orkestrel/contract'\n\n/**\n * Chromium virtual-time budget controls for deterministic page timers.\n */\nexport class BrowserClock implements BrowserClockInterface {\n\treadonly #frame: BrowserFrameInterface\n\t#installed = false\n\t#advancing = false\n\t#budgetResolve: (() => void) | undefined\n\treadonly #budgetHandler = this.#handleBudget.bind(this)\n\n\tconstructor(frame: BrowserFrameInterface) {\n\t\tthis.#frame = frame\n\t}\n\n\tget installed(): boolean {\n\t\treturn this.#installed\n\t}\n\n\tasync install(time = Date.now()): Promise<void> {\n\t\tif (this.#installed) throw new BrowserError('Browser clock is already installed')\n\t\tif (!isFiniteNumber(time) || time < 0) {\n\t\t\tthrow new BrowserError('Browser clock time must be a non-negative finite epoch', undefined, {\n\t\t\t\ttime,\n\t\t\t})\n\t\t}\n\t\tawait this.#frame.send('Emulation.setVirtualTimePolicy', {\n\t\t\tpolicy: 'pause',\n\t\t\tinitialVirtualTime: time / 1000,\n\t\t})\n\t\tthis.#installed = true\n\t}\n\n\tasync pause(): Promise<void> {\n\t\tthis.#assert()\n\t\tthis.#idle()\n\t\tawait this.#frame.send('Emulation.setVirtualTimePolicy', { policy: 'pause' })\n\t}\n\n\tasync resume(): Promise<void> {\n\t\tthis.#assert()\n\t\tthis.#idle()\n\t\tawait this.#frame.send('Emulation.setVirtualTimePolicy', {\n\t\t\tpolicy: 'advance',\n\t\t\tmaxVirtualTimeTaskStarvationCount: 10_000,\n\t\t})\n\t}\n\n\tasync advance(ms: number): Promise<void> {\n\t\tthis.#assert()\n\t\tthis.#idle()\n\t\tif (!isFiniteNumber(ms) || ms < 0) {\n\t\t\tthrow new BrowserError('Browser clock advance must be non-negative and finite', undefined, {\n\t\t\t\tms,\n\t\t\t})\n\t\t}\n\t\tif (ms === 0) {\n\t\t\tawait this.pause()\n\t\t\treturn\n\t\t}\n\t\tconst deferred = Promise.withResolvers<void>()\n\t\tthis.#advancing = true\n\t\tthis.#budgetResolve = deferred.resolve\n\t\ttry {\n\t\t\tawait this.#frame.subscribe('Emulation.virtualTimeBudgetExpired', this.#budgetHandler)\n\t\t} catch (error) {\n\t\t\tthis.#budgetResolve = undefined\n\t\t\tthis.#advancing = false\n\t\t\tthrow error\n\t\t}\n\t\tconst timer = setTimeout(() => {\n\t\t\tdeferred.reject(new BrowserError('Browser virtual-time budget timed out'))\n\t\t}, BROWSER_DEFAULT_TIMEOUT_MS)\n\t\tlet failed = false\n\t\tlet failure: unknown\n\t\ttry {\n\t\t\tawait this.#frame.send('Emulation.setVirtualTimePolicy', {\n\t\t\t\tpolicy: 'advance',\n\t\t\t\tbudget: ms,\n\t\t\t\tmaxVirtualTimeTaskStarvationCount: 10_000,\n\t\t\t})\n\t\t\tawait deferred.promise\n\t\t} catch (error) {\n\t\t\tfailed = true\n\t\t\tfailure = error\n\t\t} finally {\n\t\t\tclearTimeout(timer)\n\t\t\tthis.#budgetResolve = undefined\n\t\t\ttry {\n\t\t\t\tawait this.#frame.unsubscribe('Emulation.virtualTimeBudgetExpired', this.#budgetHandler)\n\t\t\t} catch (error) {\n\t\t\t\tif (!failed) {\n\t\t\t\t\tfailed = true\n\t\t\t\t\tfailure = error\n\t\t\t\t}\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tawait this.#frame.send('Emulation.setVirtualTimePolicy', { policy: 'pause' })\n\t\t\t} catch (error) {\n\t\t\t\tif (!failed) {\n\t\t\t\t\tfailed = true\n\t\t\t\t\tfailure = error\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.#advancing = false\n\t\t}\n\t\tif (failed) throw failure\n\t}\n\n\tasync uninstall(): Promise<void> {\n\t\tif (!this.#installed) return\n\t\tthis.#idle()\n\t\tawait this.#frame.send('Emulation.setVirtualTimePolicy', {\n\t\t\tpolicy: 'advance',\n\t\t\tmaxVirtualTimeTaskStarvationCount: 10_000,\n\t\t})\n\t\tthis.#installed = false\n\t}\n\n\t#assert(): void {\n\t\tif (!this.#installed) throw new BrowserError('Browser clock is not installed')\n\t}\n\n\t#idle(): void {\n\t\tif (this.#advancing) throw new BrowserError('Browser clock advance is already active')\n\t}\n\n\t#handleBudget(): void {\n\t\tthis.#budgetResolve?.()\n\t}\n}\n","import type {\n\tBrowserCoverageInterface,\n\tBrowserCoverageOptions,\n\tBrowserCoverageResult,\n\tBrowserFrameInterface,\n} from './types.js'\nimport { readBrowserScriptCoverage, readBrowserStyleCoverage } from './helpers.js'\nimport { BrowserError } from './errors.js'\n\n/**\n * JavaScript precise coverage and CSS rule usage for one page target.\n */\nexport class BrowserCoverage implements BrowserCoverageInterface {\n\treadonly #frame: BrowserFrameInterface\n\t#active = false\n\t#options: BrowserCoverageOptions | undefined\n\n\tconstructor(frame: BrowserFrameInterface) {\n\t\tthis.#frame = frame\n\t}\n\n\tget active(): boolean {\n\t\treturn this.#active\n\t}\n\n\tasync start(options?: BrowserCoverageOptions): Promise<void> {\n\t\tif (this.#active) throw new BrowserError('Browser coverage is already active')\n\t\tconst javascript = options?.javascript ?? true\n\t\tconst css = options?.css ?? true\n\t\tif (!javascript && !css) {\n\t\t\tthrow new BrowserError('Browser coverage requires JavaScript, CSS, or both')\n\t\t}\n\t\tlet profiler = false\n\t\tlet precise = false\n\t\tlet dom = false\n\t\tlet styles = false\n\t\tlet rules = false\n\t\ttry {\n\t\t\tif (javascript) {\n\t\t\t\tawait this.#frame.send('Profiler.enable')\n\t\t\t\tprofiler = true\n\t\t\t\tawait this.#frame.send('Profiler.startPreciseCoverage', {\n\t\t\t\t\tcallCount: true,\n\t\t\t\t\tdetailed: options?.detailed ?? true,\n\t\t\t\t\tallowTriggeredUpdates: false,\n\t\t\t\t})\n\t\t\t\tprecise = true\n\t\t\t}\n\t\t\tif (css) {\n\t\t\t\tawait this.#frame.send('DOM.enable')\n\t\t\t\tdom = true\n\t\t\t\tawait this.#frame.send('CSS.enable')\n\t\t\t\tstyles = true\n\t\t\t\tawait this.#frame.send('CSS.startRuleUsageTracking')\n\t\t\t\trules = true\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tif (rules) {\n\t\t\t\tawait this.#frame.send('CSS.stopRuleUsageTracking').catch(() => undefined)\n\t\t\t}\n\t\t\tif (styles) await this.#frame.send('CSS.disable').catch(() => undefined)\n\t\t\tif (dom) await this.#frame.send('DOM.disable').catch(() => undefined)\n\t\t\tif (precise) {\n\t\t\t\tawait this.#frame.send('Profiler.stopPreciseCoverage').catch(() => undefined)\n\t\t\t}\n\t\t\tif (profiler) await this.#frame.send('Profiler.disable').catch(() => undefined)\n\t\t\tthrow error\n\t\t}\n\t\tthis.#options = options\n\t\tthis.#active = true\n\t}\n\n\tasync stop(): Promise<BrowserCoverageResult> {\n\t\tif (!this.#active) throw new BrowserError('Browser coverage is not active')\n\t\tthis.#active = false\n\t\tconst javascript = this.#options?.javascript ?? true\n\t\tconst css = this.#options?.css ?? true\n\t\tlet scripts: BrowserCoverageResult['scripts'] = []\n\t\tlet styles: BrowserCoverageResult['styles'] = []\n\t\tlet failed = false\n\t\tlet failure: unknown\n\t\tif (javascript) {\n\t\t\ttry {\n\t\t\t\tscripts = await this.#stopJavaScript()\n\t\t\t} catch (error) {\n\t\t\t\tfailed = true\n\t\t\t\tfailure = error\n\t\t\t}\n\t\t}\n\t\tif (css) {\n\t\t\ttry {\n\t\t\t\tstyles = await this.#stopCSS()\n\t\t\t} catch (error) {\n\t\t\t\tif (!failed) {\n\t\t\t\t\tfailed = true\n\t\t\t\t\tfailure = error\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tthis.#options = undefined\n\t\tif (failed) throw failure\n\t\treturn { scripts, styles }\n\t}\n\n\tasync destroy(): Promise<void> {\n\t\tif (!this.#active) return\n\t\tawait this.stop().catch(() => undefined)\n\t}\n\n\tasync #stopJavaScript(): Promise<BrowserCoverageResult['scripts']> {\n\t\tlet result: unknown\n\t\tlet failed = false\n\t\tlet failure: unknown\n\t\ttry {\n\t\t\tresult = await this.#frame.send('Profiler.takePreciseCoverage')\n\t\t} catch (error) {\n\t\t\tfailed = true\n\t\t\tfailure = error\n\t\t}\n\t\ttry {\n\t\t\tawait this.#frame.send('Profiler.stopPreciseCoverage')\n\t\t} catch (error) {\n\t\t\tif (!failed) {\n\t\t\t\tfailed = true\n\t\t\t\tfailure = error\n\t\t\t}\n\t\t}\n\t\ttry {\n\t\t\tawait this.#frame.send('Profiler.disable')\n\t\t} catch (error) {\n\t\t\tif (!failed) {\n\t\t\t\tfailed = true\n\t\t\t\tfailure = error\n\t\t\t}\n\t\t}\n\t\tif (failed) throw failure\n\t\treturn readBrowserScriptCoverage(result)\n\t}\n\n\tasync #stopCSS(): Promise<BrowserCoverageResult['styles']> {\n\t\tlet result: unknown\n\t\tlet failed = false\n\t\tlet failure: unknown\n\t\ttry {\n\t\t\tresult = await this.#frame.send('CSS.stopRuleUsageTracking')\n\t\t} catch (error) {\n\t\t\tfailed = true\n\t\t\tfailure = error\n\t\t}\n\t\ttry {\n\t\t\tawait this.#frame.send('CSS.disable')\n\t\t} catch (error) {\n\t\t\tif (!failed) {\n\t\t\t\tfailed = true\n\t\t\t\tfailure = error\n\t\t\t}\n\t\t}\n\t\ttry {\n\t\t\tawait this.#frame.send('DOM.disable')\n\t\t} catch (error) {\n\t\t\tif (!failed) {\n\t\t\t\tfailed = true\n\t\t\t\tfailure = error\n\t\t\t}\n\t\t}\n\t\tif (failed) throw failure\n\t\treturn readBrowserStyleCoverage(result)\n\t}\n}\n","import type {\n\tBrowserCookie,\n\tBrowserCookieFilter,\n\tBrowserCookieInput,\n\tBrowserCookieManagerInterface,\n\tCDPClientInterface,\n} from './types.js'\nimport { cookieToProtocol, matchesBrowserCookieURL, readBrowserCookies } from './helpers.js'\nimport { isRecord } from '@orkestrel/contract'\nimport { BrowserError } from './errors.js'\n\n/**\n * Cookie operations isolated to one browser context.\n */\nexport class BrowserCookieManager implements BrowserCookieManagerInterface {\n\treadonly #client: CDPClientInterface\n\treadonly #context: string | undefined\n\n\tconstructor(client: CDPClientInterface, context?: string) {\n\t\tthis.#client = client\n\t\tthis.#context = context\n\t}\n\n\tasync list(urls?: readonly string[]): Promise<readonly BrowserCookie[]> {\n\t\tconst params: Record<string, unknown> = {}\n\t\tif (this.#context !== undefined) params['browserContextId'] = this.#context\n\t\tconst result = await this.#client.send('Storage.getCookies', params)\n\t\tconst cookies = readBrowserCookies(result)\n\t\tif (urls === undefined || urls.length === 0) return cookies\n\n\t\treturn cookies.filter((cookie) => urls.some((value) => matchesBrowserCookieURL(cookie, value)))\n\t}\n\n\tasync set(cookies: readonly BrowserCookieInput[]): Promise<void> {\n\t\tif (cookies.length === 0) return\n\t\tconst params: Record<string, unknown> = {\n\t\t\tcookies: cookies.map(cookieToProtocol),\n\t\t}\n\t\tif (this.#context !== undefined) params['browserContextId'] = this.#context\n\t\tawait this.#client.send('Storage.setCookies', params)\n\t}\n\n\tasync clear(filter?: BrowserCookieFilter): Promise<void> {\n\t\tconst params: Record<string, unknown> = {}\n\t\tif (this.#context !== undefined) params['browserContextId'] = this.#context\n\t\tif (filter === undefined) {\n\t\t\tawait this.#client.send('Storage.clearCookies', params)\n\t\t\treturn\n\t\t}\n\n\t\tconst retained = (await this.list()).filter((cookie) => {\n\t\t\tif (filter.name !== undefined && cookie.name !== filter.name) return true\n\t\t\tif (filter.domain !== undefined && cookie.domain !== filter.domain) return true\n\t\t\tif (filter.path !== undefined && cookie.path !== filter.path) return true\n\t\t\treturn false\n\t\t})\n\t\tawait this.#client.send('Storage.clearCookies', params)\n\t\tif (retained.length === 0) return\n\t\tconst cookies = retained.map((cookie) =>\n\t\t\tcookieToProtocol({\n\t\t\t\tname: cookie.name,\n\t\t\t\tvalue: cookie.value,\n\t\t\t\tdomain: cookie.domain,\n\t\t\t\tpath: cookie.path,\n\t\t\t\texpires: cookie.expires,\n\t\t\t\thttp: cookie.http,\n\t\t\t\tsecure: cookie.secure,\n\t\t\t\t...(cookie.site !== undefined ? { site: cookie.site } : {}),\n\t\t\t\t...(cookie.partition !== undefined ? { partition: cookie.partition } : {}),\n\t\t\t}),\n\t\t)\n\t\tconst restore: Record<string, unknown> = { cookies }\n\t\tif (this.#context !== undefined) restore['browserContextId'] = this.#context\n\t\tconst result = await this.#client.send('Storage.setCookies', restore)\n\t\tif (result !== undefined && !isRecord(result)) {\n\t\t\tthrow new BrowserError('Browser cookie restore returned a malformed result')\n\t\t}\n\t}\n}\n","import type {\n\tBrowserEmulationManagerInterface,\n\tBrowserEmulationOptions,\n\tBrowserPageInterface,\n} from './types.js'\nimport { mediaToFeatures, validateBrowserEmulationOptions } from './helpers.js'\n\n/**\n * Rendering, identity, location, and network emulation for context pages.\n */\nexport class BrowserEmulationManager implements BrowserEmulationManagerInterface {\n\treadonly #pages: () => readonly BrowserPageInterface[]\n\t#options: BrowserEmulationOptions | undefined\n\n\tconstructor(pages: () => readonly BrowserPageInterface[], options?: BrowserEmulationOptions) {\n\t\tif (options !== undefined) validateBrowserEmulationOptions(options)\n\t\tthis.#pages = pages\n\t\tthis.#options = options\n\t}\n\n\tasync apply(options: BrowserEmulationOptions): Promise<void> {\n\t\tvalidateBrowserEmulationOptions(options)\n\t\tconst previous = this.#options\n\t\tconst changed: BrowserPageInterface[] = []\n\t\ttry {\n\t\t\tfor (const page of this.#pages()) {\n\t\t\t\tchanged.push(page)\n\t\t\t\tif (previous !== undefined) await this.#clearPage(page, previous)\n\t\t\t\tawait this.#configurePage(page, options)\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tfor (const page of changed.reverse()) {\n\t\t\t\tawait this.#clearPage(page, options).catch(() => undefined)\n\t\t\t\tif (previous !== undefined) {\n\t\t\t\t\tawait this.#configurePage(page, previous).catch(() => undefined)\n\t\t\t\t}\n\t\t\t}\n\t\t\tthrow error\n\t\t}\n\t\tthis.#options = options\n\t}\n\n\tasync clear(): Promise<void> {\n\t\tconst previous = this.#options\n\t\tif (previous === undefined) return\n\t\tconst changed: BrowserPageInterface[] = []\n\t\ttry {\n\t\t\tfor (const page of this.#pages()) {\n\t\t\t\tchanged.push(page)\n\t\t\t\tawait this.#clearPage(page, previous)\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tfor (const page of changed.reverse()) {\n\t\t\t\tawait this.#clearPage(page, previous).catch(() => undefined)\n\t\t\t\tawait this.#configurePage(page, previous).catch(() => undefined)\n\t\t\t}\n\t\t\tthrow error\n\t\t}\n\t\tthis.#options = undefined\n\t}\n\n\tasync attach(page: BrowserPageInterface): Promise<void> {\n\t\tconst options = this.#options\n\t\tif (options === undefined) return\n\t\ttry {\n\t\t\tawait this.#configurePage(page, options)\n\t\t} catch (error) {\n\t\t\tawait this.#clearPage(page, options).catch(() => undefined)\n\t\t\tthrow error\n\t\t}\n\t}\n\n\tasync #configurePage(\n\t\tpage: BrowserPageInterface,\n\t\toptions: BrowserEmulationOptions,\n\t): Promise<void> {\n\t\tif (options.viewport !== undefined) {\n\t\t\tawait page.send('Emulation.setDeviceMetricsOverride', {\n\t\t\t\twidth: options.viewport.width,\n\t\t\t\theight: options.viewport.height,\n\t\t\t\tdeviceScaleFactor: options.viewport.scale ?? 1,\n\t\t\t\tmobile: options.viewport.mobile ?? false,\n\t\t\t\tscreenOrientation:\n\t\t\t\t\toptions.viewport.landscape === undefined\n\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t: {\n\t\t\t\t\t\t\t\ttype: options.viewport.landscape ? 'landscapePrimary' : 'portraitPrimary',\n\t\t\t\t\t\t\t\tangle: options.viewport.landscape ? 90 : 0,\n\t\t\t\t\t\t\t},\n\t\t\t})\n\t\t\tawait page.send('Emulation.setTouchEmulationEnabled', {\n\t\t\t\tenabled: options.viewport.touch ?? false,\n\t\t\t})\n\t\t}\n\t\tif (options.user !== undefined) {\n\t\t\tawait page.send('Emulation.setUserAgentOverride', {\n\t\t\t\tuserAgent: options.user.value,\n\t\t\t\tacceptLanguage: options.user.language,\n\t\t\t\tplatform: options.user.platform,\n\t\t\t})\n\t\t}\n\t\tif (options.locale !== undefined) {\n\t\t\tawait page.send('Emulation.setLocaleOverride', { locale: options.locale })\n\t\t}\n\t\tif (options.timezone !== undefined) {\n\t\t\tawait page.send('Emulation.setTimezoneOverride', { timezoneId: options.timezone })\n\t\t}\n\t\tif (options.geolocation !== undefined) {\n\t\t\tawait page.send('Emulation.setGeolocationOverride', {\n\t\t\t\tlatitude: options.geolocation.latitude,\n\t\t\t\tlongitude: options.geolocation.longitude,\n\t\t\t\taccuracy: options.geolocation.accuracy,\n\t\t\t})\n\t\t}\n\t\tif (options.media !== undefined) {\n\t\t\tawait page.send('Emulation.setEmulatedMedia', {\n\t\t\t\tmedia: options.media.media ?? '',\n\t\t\t\tfeatures: mediaToFeatures(options.media),\n\t\t\t})\n\t\t}\n\t\tif (options.offline !== undefined) {\n\t\t\tawait page.send('Network.emulateNetworkConditions', {\n\t\t\t\toffline: options.offline,\n\t\t\t\tlatency: 0,\n\t\t\t\tdownloadThroughput: -1,\n\t\t\t\tuploadThroughput: -1,\n\t\t\t})\n\t\t}\n\t\tif (options.headers !== undefined) {\n\t\t\tawait page.send('Network.setExtraHTTPHeaders', { headers: options.headers })\n\t\t}\n\t\tif (options.credentials !== undefined) {\n\t\t\tawait page.network.credentials(options.credentials)\n\t\t}\n\t}\n\n\tasync #clearPage(page: BrowserPageInterface, options: BrowserEmulationOptions): Promise<void> {\n\t\tif (options.viewport !== undefined) {\n\t\t\tawait page.send('Emulation.clearDeviceMetricsOverride')\n\t\t\tawait page.send('Emulation.setTouchEmulationEnabled', { enabled: false })\n\t\t}\n\t\tif (options.user !== undefined) {\n\t\t\tawait page.send('Emulation.setUserAgentOverride', { userAgent: '' })\n\t\t}\n\t\tif (options.locale !== undefined) {\n\t\t\tawait page.send('Emulation.setLocaleOverride', { locale: '' })\n\t\t}\n\t\tif (options.timezone !== undefined) {\n\t\t\tawait page.send('Emulation.setTimezoneOverride', { timezoneId: '' })\n\t\t}\n\t\tif (options.geolocation !== undefined) {\n\t\t\tawait page.send('Emulation.clearGeolocationOverride')\n\t\t}\n\t\tif (options.media !== undefined) {\n\t\t\tawait page.send('Emulation.setEmulatedMedia', { media: '', features: [] })\n\t\t}\n\t\tif (options.offline !== undefined) {\n\t\t\tawait page.send('Network.emulateNetworkConditions', {\n\t\t\t\toffline: false,\n\t\t\t\tlatency: 0,\n\t\t\t\tdownloadThroughput: -1,\n\t\t\t\tuploadThroughput: -1,\n\t\t\t})\n\t\t}\n\t\tif (options.headers !== undefined) {\n\t\t\tawait page.send('Network.setExtraHTTPHeaders', { headers: {} })\n\t\t}\n\t\tif (options.credentials !== undefined) await page.network.credentials(undefined)\n\t}\n}\n","import type {\n\tBrowserCodegenAction,\n\tBrowserCodegenEventMap,\n\tBrowserCodegenInterface,\n\tBrowserCodegenOptions,\n\tBrowserCodegenScriptOptions,\n\tCDPClientInterface,\n} from './types.js'\nimport type { EmitterInterface } from '@orkestrel/emitter'\nimport { BROWSER_CODEGEN_BINDING_NAME, BROWSER_CODEGEN_SOURCE } from './constants.js'\nimport {\n\tcompileCodegenScript,\n\tnormalizeCodegenActions,\n\tparseCodegenActionPayload,\n\treadCodegenNavigateAction,\n} from './helpers.js'\nimport { Emitter } from '@orkestrel/emitter'\n\n// === BrowserCodegen\n\n/**\n * Records page navigation and form interactions and compiles replayable scripts.\n */\nexport class BrowserCodegen implements BrowserCodegenInterface {\n\treadonly #client: CDPClientInterface\n\treadonly #sessionId: string\n\t#actions: BrowserCodegenAction[] = []\n\t#started = false\n\t#destroyed = false\n\t#starting: Promise<void> | undefined\n\t#stopping: Promise<readonly BrowserCodegenAction[]> | undefined\n\t#shutdown: Promise<void> | undefined\n\treadonly #emitter: Emitter<BrowserCodegenEventMap>\n\treadonly #onBindingCalled = this.#handleBindingCalled.bind(this)\n\treadonly #onFrameNavigated = this.#handleFrameNavigated.bind(this)\n\n\tconstructor(client: CDPClientInterface, sessionId: string, options?: BrowserCodegenOptions) {\n\t\tthis.#client = client\n\t\tthis.#sessionId = sessionId\n\t\tthis.#emitter = new Emitter({\n\t\t\t...(options?.on !== undefined ? { on: options.on } : {}),\n\t\t\t...(options?.error !== undefined ? { error: options.error } : {}),\n\t\t})\n\t}\n\n\t// === Property accessors\n\n\tget emitter(): EmitterInterface<BrowserCodegenEventMap> {\n\t\treturn this.#emitter\n\t}\n\n\tget started(): boolean {\n\t\treturn this.#started\n\t}\n\n\t// === Public API\n\n\tasync start(): Promise<void> {\n\t\tif (this.#destroyed) return\n\t\tif (this.#stopping !== undefined) await this.#stopping\n\t\tif (this.#destroyed) return\n\t\tif (this.#started) return\n\t\tconst active = this.#starting\n\t\tif (active !== undefined) {\n\t\t\tawait active\n\t\t\treturn\n\t\t}\n\n\t\tconst attempt = this.#begin()\n\t\tthis.#starting = attempt\n\t\ttry {\n\t\t\tawait attempt\n\t\t} finally {\n\t\t\tif (this.#starting === attempt) this.#starting = undefined\n\t\t}\n\t}\n\n\tasync stop(): Promise<readonly BrowserCodegenAction[]> {\n\t\tawait this.#starting?.catch(() => undefined)\n\t\tif (!this.#started) return this.actions()\n\t\tconst active = this.#stopping\n\t\tif (active !== undefined) return await active\n\n\t\tconst attempt = this.#end()\n\t\tthis.#stopping = attempt\n\t\ttry {\n\t\t\treturn await attempt\n\t\t} finally {\n\t\t\tif (this.#stopping === attempt) this.#stopping = undefined\n\t\t}\n\t}\n\n\tactions(): readonly BrowserCodegenAction[] {\n\t\treturn normalizeCodegenActions(this.#actions)\n\t}\n\n\tscript(options?: BrowserCodegenScriptOptions): string {\n\t\treturn compileCodegenScript(this.actions(), options)\n\t}\n\n\tclear(): void {\n\t\tthis.#actions = []\n\t\tthis.#emitter.emit('clear')\n\t}\n\n\tdestroy(): Promise<void> {\n\t\tconst active = this.#shutdown\n\t\tif (active !== undefined) return active\n\t\tif (this.#destroyed) return Promise.resolve()\n\n\t\tthis.#destroyed = true\n\t\tconst shutdown = this.#destroy()\n\t\tthis.#shutdown = shutdown\n\t\treturn shutdown\n\t}\n\n\t// === Private helpers\n\n\tasync #begin(): Promise<void> {\n\t\tthis.#client.subscribe('Runtime.bindingCalled', this.#onBindingCalled, this.#sessionId)\n\t\tthis.#client.subscribe('Page.frameNavigated', this.#onFrameNavigated, this.#sessionId)\n\n\t\ttry {\n\t\t\tawait this.#client.send('Runtime.enable', undefined, this.#sessionId)\n\t\t\tawait this.#client.send(\n\t\t\t\t'Runtime.addBinding',\n\t\t\t\t{ name: BROWSER_CODEGEN_BINDING_NAME },\n\t\t\t\tthis.#sessionId,\n\t\t\t)\n\t\t\tawait this.#client.send(\n\t\t\t\t'Page.addScriptToEvaluateOnNewDocument',\n\t\t\t\t{ source: BROWSER_CODEGEN_SOURCE },\n\t\t\t\tthis.#sessionId,\n\t\t\t)\n\t\t\tawait this.#client.send(\n\t\t\t\t'Runtime.evaluate',\n\t\t\t\t{ expression: BROWSER_CODEGEN_SOURCE, awaitPromise: true },\n\t\t\t\tthis.#sessionId,\n\t\t\t)\n\t\t\tif (this.#destroyed) {\n\t\t\t\tthis.#unsubscribe()\n\t\t\t\treturn\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tthis.#unsubscribe()\n\t\t\tthrow error\n\t\t}\n\n\t\tthis.#started = true\n\t\tthis.#emitter.emit('start')\n\t}\n\n\tasync #end(): Promise<readonly BrowserCodegenAction[]> {\n\t\tthis.#unsubscribe()\n\t\tthis.#started = false\n\n\t\tconst snapshot = this.actions()\n\t\tthis.#emitter.emit('stop', snapshot)\n\t\treturn snapshot\n\t}\n\n\tasync #destroy(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.stop()\n\t\t} catch {\n\t\t\t// Swallow teardown errors — the underlying session may already be gone\n\t\t}\n\n\t\tthis.#actions = []\n\t\tthis.#emitter.destroy()\n\t}\n\n\t#handleBindingCalled(params: Readonly<Record<string, unknown>>): void {\n\t\tif (params['name'] !== BROWSER_CODEGEN_BINDING_NAME) return\n\n\t\tconst action = parseCodegenActionPayload(params['payload'])\n\t\tif (action === undefined) return\n\n\t\tthis.#actions.push(action)\n\t\tthis.#emitter.emit('action', action)\n\t}\n\n\t#handleFrameNavigated(params: Readonly<Record<string, unknown>>): void {\n\t\tconst action = readCodegenNavigateAction(params)\n\t\tif (action === undefined) return\n\n\t\tthis.#actions.push(action)\n\t\tthis.#emitter.emit('action', action)\n\t}\n\n\t#unsubscribe(): void {\n\t\tthis.#client.unsubscribe('Runtime.bindingCalled', this.#onBindingCalled, this.#sessionId)\n\t\tthis.#client.unsubscribe('Page.frameNavigated', this.#onFrameNavigated, this.#sessionId)\n\t}\n}\n","import type {\n\tBrowserFrameInterface,\n\tBrowserMetric,\n\tBrowserPerformanceInterface,\n\tBrowserProfile,\n} from './types.js'\nimport { readBrowserMetrics, readBrowserProfile } from './helpers.js'\nimport { BrowserError } from './errors.js'\nimport { isInteger } from '@orkestrel/contract'\n\n/**\n * Performance-domain metrics and sampled JavaScript CPU profiles.\n */\nexport class BrowserPerformance implements BrowserPerformanceInterface {\n\treadonly #frame: BrowserFrameInterface\n\t#active = false\n\n\tconstructor(frame: BrowserFrameInterface) {\n\t\tthis.#frame = frame\n\t}\n\n\tget active(): boolean {\n\t\treturn this.#active\n\t}\n\n\tasync metrics(): Promise<readonly BrowserMetric[]> {\n\t\tawait this.#frame.send('Performance.enable')\n\t\ttry {\n\t\t\treturn readBrowserMetrics(await this.#frame.send('Performance.getMetrics'))\n\t\t} finally {\n\t\t\tawait this.#frame.send('Performance.disable').catch(() => undefined)\n\t\t}\n\t}\n\n\tasync start(interval?: number): Promise<void> {\n\t\tif (this.#active) throw new BrowserError('Browser CPU profiling is already active')\n\t\tif (interval !== undefined) {\n\t\t\tif (!isInteger(interval) || interval <= 0) {\n\t\t\t\tthrow new BrowserError(\n\t\t\t\t\t'Browser CPU sampling interval must be a positive integer',\n\t\t\t\t\tundefined,\n\t\t\t\t\t{\n\t\t\t\t\t\tinterval,\n\t\t\t\t\t},\n\t\t\t\t)\n\t\t\t}\n\t\t\tawait this.#frame.send('Profiler.setSamplingInterval', { interval })\n\t\t}\n\t\tawait this.#frame.send('Profiler.enable')\n\t\ttry {\n\t\t\tawait this.#frame.send('Profiler.start')\n\t\t\tthis.#active = true\n\t\t} catch (error) {\n\t\t\tawait this.#frame.send('Profiler.disable').catch(() => undefined)\n\t\t\tthrow error\n\t\t}\n\t}\n\n\tasync stop(): Promise<BrowserProfile> {\n\t\tif (!this.#active) throw new BrowserError('Browser CPU profiling is not active')\n\t\tthis.#active = false\n\t\tlet result: unknown\n\t\ttry {\n\t\t\tresult = await this.#frame.send('Profiler.stop')\n\t\t} finally {\n\t\t\tawait this.#frame.send('Profiler.disable').catch(() => undefined)\n\t\t}\n\t\treturn readBrowserProfile(result)\n\t}\n\n\tasync destroy(): Promise<void> {\n\t\tif (!this.#active) return\n\t\tawait this.stop().catch(() => undefined)\n\t}\n}\n","import type {\n\tBrowserFrameInterface,\n\tBrowserTracingInterface,\n\tBrowserTracingOptions,\n\tBrowserTracingResult,\n\tScreenshotWriterInterface,\n} from './types.js'\nimport { BROWSER_DEFAULT_TIMEOUT_MS } from './constants.js'\nimport { concatBytes, readBrowserStreamChunk } from './helpers.js'\nimport { BrowserError } from './errors.js'\nimport { isString } from '@orkestrel/contract'\n\n/**\n * Chromium trace capture streamed through the IO domain.\n */\nexport class BrowserTracing implements BrowserTracingInterface {\n\treadonly #frame: BrowserFrameInterface\n\treadonly #writer: ScreenshotWriterInterface | undefined\n\t#active = false\n\t#options: BrowserTracingOptions | undefined\n\t#completion: PromiseWithResolvers<string> | undefined\n\treadonly #completeHandler = this.#handleComplete.bind(this)\n\n\tconstructor(frame: BrowserFrameInterface, writer?: ScreenshotWriterInterface) {\n\t\tthis.#frame = frame\n\t\tthis.#writer = writer\n\t}\n\n\tget active(): boolean {\n\t\treturn this.#active\n\t}\n\n\tasync start(options?: BrowserTracingOptions): Promise<void> {\n\t\tif (this.#active) throw new BrowserError('Browser tracing is already active')\n\t\tconst categories = [...(options?.categories ?? ['devtools.timeline', 'v8.execute'])]\n\t\tif (options?.screenshots === true) {\n\t\t\tcategories.push('disabled-by-default-devtools.screenshot')\n\t\t}\n\t\tif (options?.sampling === true) {\n\t\t\tcategories.push('disabled-by-default-v8.cpu_profiler')\n\t\t}\n\t\tthis.#options = options\n\t\tthis.#completion = Promise.withResolvers<string>()\n\t\ttry {\n\t\t\tawait this.#frame.subscribe('Tracing.tracingComplete', this.#completeHandler)\n\t\t\tawait this.#frame.send('Tracing.start', {\n\t\t\t\ttransferMode: 'ReturnAsStream',\n\t\t\t\ttraceConfig: {\n\t\t\t\t\tincludedCategories: categories,\n\t\t\t\t},\n\t\t\t})\n\t\t\tthis.#active = true\n\t\t} catch (error) {\n\t\t\tawait this.#frame\n\t\t\t\t.unsubscribe('Tracing.tracingComplete', this.#completeHandler)\n\t\t\t\t.catch(() => undefined)\n\t\t\tthis.#options = undefined\n\t\t\tthis.#completion = undefined\n\t\t\tthrow error\n\t\t}\n\t}\n\n\tasync stop(): Promise<BrowserTracingResult> {\n\t\tif (!this.#active || this.#completion === undefined) {\n\t\t\tthrow new BrowserError('Browser tracing is not active')\n\t\t}\n\t\tconst completion = this.#completion\n\t\tconst options = this.#options\n\t\tthis.#active = false\n\t\tlet stream: string | undefined\n\t\tconst chunks: Uint8Array[] = []\n\t\ttry {\n\t\t\tawait this.#frame.send('Tracing.end')\n\t\t\tstream = await this.#wait(completion.promise)\n\t\t\twhile (true) {\n\t\t\t\tconst chunk = readBrowserStreamChunk(await this.#frame.send('IO.read', { handle: stream }))\n\t\t\t\tchunks.push(chunk.bytes)\n\t\t\t\tif (chunk.eof) break\n\t\t\t}\n\t\t} finally {\n\t\t\tif (stream !== undefined) {\n\t\t\t\tawait this.#frame.send('IO.close', { handle: stream }).catch(() => undefined)\n\t\t\t}\n\t\t\tawait this.#frame\n\t\t\t\t.unsubscribe('Tracing.tracingComplete', this.#completeHandler)\n\t\t\t\t.catch(() => undefined)\n\t\t\tthis.#options = undefined\n\t\t\tthis.#completion = undefined\n\t\t}\n\t\tconst bytes = concatBytes(chunks)\n\t\tif (options?.path !== undefined) {\n\t\t\tif (this.#writer === undefined) {\n\t\t\t\tthrow new BrowserError('Browser trace path requires a configured writer')\n\t\t\t}\n\t\t\tawait this.#writer.write(options.path, bytes)\n\t\t}\n\t\treturn { bytes, path: options?.path }\n\t}\n\n\tasync destroy(): Promise<void> {\n\t\tif (!this.#active) return\n\t\tawait this.stop().catch(() => undefined)\n\t}\n\n\tasync #wait(promise: Promise<string>): Promise<string> {\n\t\tconst deferred = Promise.withResolvers<string>()\n\t\tconst timer = setTimeout(() => {\n\t\t\tdeferred.reject(new BrowserError('Browser trace completion timed out'))\n\t\t}, BROWSER_DEFAULT_TIMEOUT_MS)\n\t\tvoid promise.then(deferred.resolve, deferred.reject)\n\t\ttry {\n\t\t\treturn await deferred.promise\n\t\t} finally {\n\t\t\tclearTimeout(timer)\n\t\t}\n\t}\n\n\t#handleComplete(params: Readonly<Record<string, unknown>>): void {\n\t\tconst completion = this.#completion\n\t\tif (completion === undefined) return\n\t\tif (isString(params['stream'])) completion.resolve(params['stream'])\n\t\telse completion.reject(new BrowserError('Browser trace did not return an IO stream'))\n\t}\n}\n","import type {\n\tBrowserCoverageInterface,\n\tBrowserDiagnosticsInterface,\n\tBrowserFrameInterface,\n\tBrowserPerformanceInterface,\n\tBrowserTracingInterface,\n\tScreenshotWriterInterface,\n} from './types.js'\nimport { BrowserCoverage } from './BrowserCoverage.js'\nimport { BrowserPerformance } from './BrowserPerformance.js'\nimport { BrowserTracing } from './BrowserTracing.js'\n\n/**\n * Diagnostic subentities grouped beneath one page.\n */\nexport class BrowserDiagnostics implements BrowserDiagnosticsInterface {\n\treadonly #tracing: BrowserTracing\n\treadonly #coverage: BrowserCoverage\n\treadonly #performance: BrowserPerformance\n\n\tconstructor(frame: BrowserFrameInterface, writer?: ScreenshotWriterInterface) {\n\t\tthis.#tracing = new BrowserTracing(frame, writer)\n\t\tthis.#coverage = new BrowserCoverage(frame)\n\t\tthis.#performance = new BrowserPerformance(frame)\n\t}\n\n\tget tracing(): BrowserTracingInterface {\n\t\treturn this.#tracing\n\t}\n\n\tget coverage(): BrowserCoverageInterface {\n\t\treturn this.#coverage\n\t}\n\n\tget performance(): BrowserPerformanceInterface {\n\t\treturn this.#performance\n\t}\n\n\tasync destroy(): Promise<void> {\n\t\tawait this.#tracing.destroy()\n\t\tawait this.#coverage.destroy()\n\t\tawait this.#performance.destroy()\n\t}\n}\n","import type {\n\tBrowserDialogCategory,\n\tBrowserDialogInterface,\n\tBrowserFrameInterface,\n} from './types.js'\nimport { BrowserError } from './errors.js'\n\n/**\n * One JavaScript dialog awaiting a user decision.\n */\nexport class BrowserDialog implements BrowserDialogInterface {\n\treadonly #frame: BrowserFrameInterface\n\treadonly #category: BrowserDialogCategory\n\treadonly #message: string\n\treadonly #default: string\n\t#handled = false\n\t#handling = false\n\n\tconstructor(\n\t\tframe: BrowserFrameInterface,\n\t\tcategory: BrowserDialogCategory,\n\t\tmessage: string,\n\t\tvalue: string,\n\t) {\n\t\tthis.#frame = frame\n\t\tthis.#category = category\n\t\tthis.#message = message\n\t\tthis.#default = value\n\t}\n\n\tget category(): BrowserDialogCategory {\n\t\treturn this.#category\n\t}\n\n\tget message(): string {\n\t\treturn this.#message\n\t}\n\n\tget default(): string {\n\t\treturn this.#default\n\t}\n\n\tasync accept(value?: string): Promise<void> {\n\t\tthis.#assert()\n\t\tthis.#handling = true\n\t\ttry {\n\t\t\tawait this.#frame.send('Page.handleJavaScriptDialog', {\n\t\t\t\taccept: true,\n\t\t\t\tpromptText: value,\n\t\t\t})\n\t\t\tthis.#handled = true\n\t\t} finally {\n\t\t\tthis.#handling = false\n\t\t}\n\t}\n\n\tasync dismiss(): Promise<void> {\n\t\tthis.#assert()\n\t\tthis.#handling = true\n\t\ttry {\n\t\t\tawait this.#frame.send('Page.handleJavaScriptDialog', { accept: false })\n\t\t\tthis.#handled = true\n\t\t} finally {\n\t\t\tthis.#handling = false\n\t\t}\n\t}\n\n\t#assert(): void {\n\t\tif (this.#handled || this.#handling) {\n\t\t\tthrow new BrowserError('Browser dialog is already handled')\n\t\t}\n\t}\n}\n","import type {\n\tBrowserDownloadEventMap,\n\tBrowserDownloadInterface,\n\tBrowserDownloadProgress,\n\tBrowserDownloadStatus,\n\tCDPClientInterface,\n} from './types.js'\nimport type { EmitterInterface } from '@orkestrel/emitter'\nimport { Emitter } from '@orkestrel/emitter'\n\n/**\n * One Chromium download and its progress lifecycle.\n */\nexport class BrowserDownload implements BrowserDownloadInterface {\n\treadonly #client: CDPClientInterface\n\treadonly #context: string | undefined\n\treadonly #emitter: Emitter<BrowserDownloadEventMap>\n\treadonly #id: string\n\treadonly #url: string\n\treadonly #name: string\n\t#status: BrowserDownloadStatus = 'pending'\n\t#received = 0\n\t#total = 0\n\t#path: string | undefined\n\n\tconstructor(client: CDPClientInterface, id: string, url: string, name: string, context?: string) {\n\t\tthis.#client = client\n\t\tthis.#context = context\n\t\tthis.#id = id\n\t\tthis.#url = url\n\t\tthis.#name = name\n\t\tthis.#emitter = new Emitter()\n\t}\n\n\tget emitter(): EmitterInterface<BrowserDownloadEventMap> {\n\t\treturn this.#emitter\n\t}\n\n\tget id(): string {\n\t\treturn this.#id\n\t}\n\n\tget url(): string {\n\t\treturn this.#url\n\t}\n\n\tget name(): string {\n\t\treturn this.#name\n\t}\n\n\tget status(): BrowserDownloadStatus {\n\t\treturn this.#status\n\t}\n\n\tget received(): number {\n\t\treturn this.#received\n\t}\n\n\tget total(): number {\n\t\treturn this.#total\n\t}\n\n\tget path(): string | undefined {\n\t\treturn this.#path\n\t}\n\n\tasync cancel(): Promise<void> {\n\t\tif (this.#status !== 'pending') return\n\t\tconst params: Record<string, unknown> = { guid: this.#id }\n\t\tif (this.#context !== undefined) params['browserContextId'] = this.#context\n\t\tawait this.#client.send('Browser.cancelDownload', params)\n\t}\n\n\tupdate(progress: BrowserDownloadProgress): void {\n\t\tif (this.#status !== 'pending') return\n\t\tthis.#received = progress.received\n\t\tthis.#total = progress.total\n\t\tthis.#path = progress.path\n\t\tthis.#emitter.emit('progress', this.#received, this.#total)\n\t\tif (progress.status === 'complete') {\n\t\t\tthis.#status = 'complete'\n\t\t\tthis.#emitter.emit('complete', this.#path)\n\t\t\tthis.#emitter.destroy()\n\t\t} else if (progress.status === 'cancelled') {\n\t\t\tthis.#status = 'cancelled'\n\t\t\tthis.#emitter.emit('cancel')\n\t\t\tthis.#emitter.destroy()\n\t\t}\n\t}\n}\n","import type { BrowserHandleInterface, CDPClientInterface } from './types.js'\nimport { BrowserError } from './errors.js'\nimport { readEvaluationResult } from './helpers.js'\nimport { isRecord, isString } from '@orkestrel/contract'\n\n/**\n * One retained remote object in a frame execution context.\n */\nexport class BrowserHandle implements BrowserHandleInterface {\n\treadonly #client: CDPClientInterface\n\treadonly #session: string\n\treadonly #id: string\n\t#disposed = false\n\n\tconstructor(client: CDPClientInterface, session: string, id: string) {\n\t\tthis.#client = client\n\t\tthis.#session = session\n\t\tthis.#id = id\n\t}\n\n\tget id(): string {\n\t\treturn this.#id\n\t}\n\n\tasync value(): Promise<unknown> {\n\t\treturn await this.call('function() { return this }')\n\t}\n\n\tasync call(declaration: string, args?: readonly unknown[]): Promise<unknown> {\n\t\tthis.#assert()\n\t\tconst result = await this.#client.send(\n\t\t\t'Runtime.callFunctionOn',\n\t\t\t{\n\t\t\t\tobjectId: this.#id,\n\t\t\t\tfunctionDeclaration: declaration,\n\t\t\t\targuments: args?.map((value) => ({ value })),\n\t\t\t\tawaitPromise: true,\n\t\t\t\treturnByValue: true,\n\t\t\t},\n\t\t\tthis.#session,\n\t\t)\n\t\treturn readEvaluationResult(result)\n\t}\n\n\tasync property(name: string): Promise<BrowserHandleInterface | undefined> {\n\t\tthis.#assert()\n\t\tconst result = await this.#client.send(\n\t\t\t'Runtime.callFunctionOn',\n\t\t\t{\n\t\t\t\tobjectId: this.#id,\n\t\t\t\tfunctionDeclaration: 'function(name) { return this[name] }',\n\t\t\t\targuments: [{ value: name }],\n\t\t\t\tawaitPromise: true,\n\t\t\t\treturnByValue: false,\n\t\t\t},\n\t\t\tthis.#session,\n\t\t)\n\t\tif (!isRecord(result) || !isRecord(result['result'])) return undefined\n\t\tconst id = result['result']['objectId']\n\t\treturn isString(id) ? new BrowserHandle(this.#client, this.#session, id) : undefined\n\t}\n\n\tasync properties(): Promise<Readonly<Record<string, unknown>>> {\n\t\tconst value = await this.call(\n\t\t\t'function() { const values = {}; for (const key of Object.keys(this)) values[key] = this[key]; return values }',\n\t\t)\n\t\tif (!isRecord(value)) {\n\t\t\tthrow new BrowserError('Browser handle properties did not resolve to an object')\n\t\t}\n\t\treturn value\n\t}\n\n\tasync dispose(): Promise<void> {\n\t\tif (this.#disposed) return\n\t\tthis.#disposed = true\n\t\tif (!this.#client.connected) return\n\t\ttry {\n\t\t\tawait this.#client.send('Runtime.releaseObject', { objectId: this.#id }, this.#session)\n\t\t} catch {\n\t\t\t// The execution context may already be gone.\n\t\t}\n\t}\n\n\t#assert(): void {\n\t\tif (this.#disposed) throw new BrowserError('Browser handle is disposed')\n\t\tif (!this.#client.connected) throw new BrowserError('Browser handle is disconnected')\n\t}\n}\n","import type {\n\tBrowserActionOptions,\n\tBrowserFrameInterface,\n\tBrowserKeyboardInterface,\n} from './types.js'\nimport {\n\tcomputeBrowserModifiers,\n\tkeyToBrowserInput,\n\tparseBrowserChord,\n\tvalidateBrowserActionOptions,\n} from './helpers.js'\n\n/**\n * Trusted keyboard input through Chromium's CDP Input domain.\n */\nexport class BrowserKeyboard implements BrowserKeyboardInterface {\n\treadonly #frame: BrowserFrameInterface\n\treadonly #modifiers = new Set<string>()\n\n\tconstructor(frame: BrowserFrameInterface) {\n\t\tthis.#frame = frame\n\t}\n\n\tasync down(value: string): Promise<void> {\n\t\tconst key = keyToBrowserInput(value)\n\t\tconst modifier = ['Alt', 'Control', 'Meta', 'Shift'].includes(key.key)\n\t\tconst modifiers = computeBrowserModifiers([...this.#modifiers, ...(modifier ? [key.key] : [])])\n\t\tconst text = modifiers === 0 || modifiers === 8 ? key.text : undefined\n\t\tawait this.#frame.send('Input.dispatchKeyEvent', {\n\t\t\ttype: 'keyDown',\n\t\t\tkey: key.key,\n\t\t\tcode: key.code,\n\t\t\ttext,\n\t\t\tunmodifiedText: key.text,\n\t\t\twindowsVirtualKeyCode: key.number,\n\t\t\tnativeVirtualKeyCode: key.number,\n\t\t\tmodifiers,\n\t\t})\n\t\tif (modifier) this.#modifiers.add(key.key)\n\t}\n\n\tasync up(value: string): Promise<void> {\n\t\tconst key = keyToBrowserInput(value)\n\t\ttry {\n\t\t\tawait this.#frame.send('Input.dispatchKeyEvent', {\n\t\t\t\ttype: 'keyUp',\n\t\t\t\tkey: key.key,\n\t\t\t\tcode: key.code,\n\t\t\t\twindowsVirtualKeyCode: key.number,\n\t\t\t\tnativeVirtualKeyCode: key.number,\n\t\t\t\tmodifiers: computeBrowserModifiers([...this.#modifiers]),\n\t\t\t})\n\t\t} finally {\n\t\t\tthis.#modifiers.delete(key.key)\n\t\t}\n\t}\n\n\tasync press(value: string, options?: BrowserActionOptions): Promise<void> {\n\t\tvalidateBrowserActionOptions(options)\n\t\tconst chord = parseBrowserChord(value)\n\t\tfor (const modifier of chord.modifiers) await this.down(modifier)\n\t\ttry {\n\t\t\tawait this.down(chord.key)\n\t\t\tif (options?.delay !== undefined && options.delay > 0) {\n\t\t\t\tawait new Promise((resolve) => setTimeout(resolve, options.delay))\n\t\t\t}\n\t\t\tawait this.up(chord.key)\n\t\t} finally {\n\t\t\tfor (const modifier of [...chord.modifiers].reverse()) await this.up(modifier)\n\t\t}\n\t}\n\n\tasync type(value: string, options?: BrowserActionOptions): Promise<void> {\n\t\tvalidateBrowserActionOptions(options)\n\t\tfor (const character of value) {\n\t\t\tawait this.down(character)\n\t\t\tawait this.up(character)\n\t\t\tif (options?.delay !== undefined && options.delay > 0) {\n\t\t\t\tawait new Promise((resolve) => setTimeout(resolve, options.delay))\n\t\t\t}\n\t\t}\n\t}\n\n\tasync insert(value: string): Promise<void> {\n\t\tawait this.#frame.send('Input.insertText', { text: value })\n\t}\n}\n","import type {\n\tBrowserActionOptions,\n\tBrowserFrameInterface,\n\tBrowserMouseButton,\n\tBrowserMouseInterface,\n\tBrowserPoint,\n} from './types.js'\nimport {\n\tcomputeBrowserButtons,\n\tvalidateBrowserActionOptions,\n\tvalidateBrowserPoint,\n} from './helpers.js'\n\n/**\n * Trusted mouse input through Chromium's CDP Input domain.\n */\nexport class BrowserMouse implements BrowserMouseInterface {\n\treadonly #frame: BrowserFrameInterface\n\treadonly #buttons = new Set<BrowserMouseButton>()\n\t#point: BrowserPoint = { x: 0, y: 0 }\n\n\tconstructor(frame: BrowserFrameInterface) {\n\t\tthis.#frame = frame\n\t}\n\n\tasync move(point: BrowserPoint): Promise<void> {\n\t\tvalidateBrowserPoint(point)\n\t\tthis.#point = point\n\t\tawait this.#frame.send('Input.dispatchMouseEvent', {\n\t\t\ttype: 'mouseMoved',\n\t\t\tx: point.x,\n\t\t\ty: point.y,\n\t\t\tbutton: 'none',\n\t\t\tbuttons: computeBrowserButtons([...this.#buttons]),\n\t\t})\n\t}\n\n\tasync down(button: BrowserMouseButton = 'left', count = 1): Promise<void> {\n\t\tvalidateBrowserActionOptions({ count })\n\t\tconst buttons = new Set(this.#buttons)\n\t\tbuttons.add(button)\n\t\tawait this.#frame.send('Input.dispatchMouseEvent', {\n\t\t\ttype: 'mousePressed',\n\t\t\tx: this.#point.x,\n\t\t\ty: this.#point.y,\n\t\t\tbutton,\n\t\t\tbuttons: computeBrowserButtons([...buttons]),\n\t\t\tclickCount: count,\n\t\t})\n\t\tthis.#buttons.add(button)\n\t}\n\n\tasync up(button: BrowserMouseButton = 'left', count = 1): Promise<void> {\n\t\tvalidateBrowserActionOptions({ count })\n\t\tconst buttons = new Set(this.#buttons)\n\t\tbuttons.delete(button)\n\t\ttry {\n\t\t\tawait this.#frame.send('Input.dispatchMouseEvent', {\n\t\t\t\ttype: 'mouseReleased',\n\t\t\t\tx: this.#point.x,\n\t\t\t\ty: this.#point.y,\n\t\t\t\tbutton,\n\t\t\t\tbuttons: computeBrowserButtons([...buttons]),\n\t\t\t\tclickCount: count,\n\t\t\t})\n\t\t} finally {\n\t\t\tthis.#buttons.delete(button)\n\t\t}\n\t}\n\n\tasync click(point: BrowserPoint, options?: BrowserActionOptions): Promise<void> {\n\t\tvalidateBrowserActionOptions(options)\n\t\tconst button = options?.button ?? 'left'\n\t\tconst count = options?.count ?? 1\n\t\tawait this.move(point)\n\t\tawait this.down(button, count)\n\t\tif (options?.delay !== undefined && options.delay > 0) {\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, options.delay))\n\t\t}\n\t\tawait this.up(button, count)\n\t}\n\n\tasync drag(\n\t\tstart: BrowserPoint,\n\t\tend: BrowserPoint,\n\t\toptions?: BrowserActionOptions,\n\t): Promise<void> {\n\t\tvalidateBrowserActionOptions(options)\n\t\tvalidateBrowserPoint(start)\n\t\tvalidateBrowserPoint(end)\n\t\tconst steps = options?.steps ?? 10\n\t\tawait this.move(start)\n\t\tawait this.down(options?.button ?? 'left', 1)\n\t\ttry {\n\t\t\tfor (let step = 1; step <= steps; step += 1) {\n\t\t\t\tawait this.move({\n\t\t\t\t\tx: start.x + ((end.x - start.x) * step) / steps,\n\t\t\t\t\ty: start.y + ((end.y - start.y) * step) / steps,\n\t\t\t\t})\n\t\t\t\tif (options?.delay !== undefined && options.delay > 0) {\n\t\t\t\t\tawait new Promise((resolve) => setTimeout(resolve, options.delay))\n\t\t\t\t}\n\t\t\t}\n\t\t} finally {\n\t\t\tawait this.up(options?.button ?? 'left', 1)\n\t\t}\n\t}\n\n\tasync wheel(delta: BrowserPoint): Promise<void> {\n\t\tvalidateBrowserPoint(delta)\n\t\tawait this.#frame.send('Input.dispatchMouseEvent', {\n\t\t\ttype: 'mouseWheel',\n\t\t\tx: this.#point.x,\n\t\t\ty: this.#point.y,\n\t\t\tdeltaX: delta.x,\n\t\t\tdeltaY: delta.y,\n\t\t\tbuttons: computeBrowserButtons([...this.#buttons]),\n\t\t})\n\t}\n}\n","import type {\n\tBrowserActionOptions,\n\tBrowserActionabilityOptions,\n\tBrowserFilterOptions,\n\tBrowserFrameInterface,\n\tBrowserHandleInterface,\n\tBrowserLocatorInterface,\n\tBrowserPoint,\n\tBrowserQuery,\n\tBrowserScreenshotOptions,\n\tBrowserScreenshotResult,\n\tBrowserTextResultOptions,\n\tBrowserUploadOptions,\n\tBrowserWaitOptions,\n\tBrowserWaitState,\n} from './types.js'\nimport { BROWSER_DEFAULT_TIMEOUT_MS, BROWSER_WAIT_POLL_INTERVAL_MS } from './constants.js'\nimport {\n\tcompileActionabilityFunction,\n\tcompileAttachedLocatorWaitExpression,\n\tcompileDetachedLocatorWaitExpression,\n\tcompileHiddenLocatorWaitExpression,\n\tcompileLocatorExpression,\n\tcompileLocatorListExpression,\n\tcompileVisibleLocatorWaitExpression,\n\tbrowserScreenshotToParams,\n\tcompileScreenshotCleanupExpression,\n\tcompileScreenshotPreparationExpression,\n\tdecodeBase64,\n\treadBrowserQuad,\n\trequireBrowserString,\n\tvalidateBrowserActionOptions,\n} from './helpers.js'\nimport { BrowserError, BrowserSelectorError } from './errors.js'\nimport { isArray, isFiniteNumber, isInteger, isRecord, isString } from '@orkestrel/contract'\n\n/**\n * Reusable strict semantic locator over one frame.\n */\nexport class BrowserLocator implements BrowserLocatorInterface {\n\treadonly #frame: BrowserFrameInterface\n\treadonly #query: BrowserQuery\n\n\tconstructor(frame: BrowserFrameInterface, query: BrowserQuery) {\n\t\tthis.#frame = frame\n\t\tthis.#query = query\n\t}\n\n\tget frame(): BrowserFrameInterface {\n\t\treturn this.#frame\n\t}\n\n\tget query(): BrowserQuery {\n\t\treturn this.#query\n\t}\n\n\tlocator(selector: string): BrowserLocatorInterface {\n\t\treturn new BrowserLocator(this.#frame, {\n\t\t\tselector: 'css',\n\t\t\tvalue: selector,\n\t\t\tparent: this.#query,\n\t\t})\n\t}\n\n\tfilter(options: BrowserFilterOptions): BrowserLocatorInterface {\n\t\treturn new BrowserLocator(this.#frame, { ...this.#query, filter: options })\n\t}\n\n\tfirst(): BrowserLocatorInterface {\n\t\treturn this.item(0)\n\t}\n\n\tlast(): BrowserLocatorInterface {\n\t\treturn this.item(-1)\n\t}\n\n\titem(index: number): BrowserLocatorInterface {\n\t\tif (!isInteger(index)) throw new BrowserError('Browser locator index must be an integer')\n\t\treturn new BrowserLocator(this.#frame, { ...this.#query, index })\n\t}\n\n\tasync count(): Promise<number> {\n\t\tconst value = await this.#frame.evaluate(\n\t\t\t`(${compileLocatorListExpression(this.#query)}).length`,\n\t\t)\n\t\tif (!isInteger(value) || value < 0) {\n\t\t\tthrow new BrowserError('Browser locator count did not resolve to a non-negative integer')\n\t\t}\n\t\treturn value\n\t}\n\n\tasync all(): Promise<readonly BrowserLocatorInterface[]> {\n\t\tconst count = await this.count()\n\t\tconst locators: BrowserLocatorInterface[] = []\n\t\tfor (let index = 0; index < count; index += 1) {\n\t\t\tlocators.push(this.item(index))\n\t\t}\n\t\treturn locators\n\t}\n\n\tasync click(options?: BrowserActionOptions): Promise<void> {\n\t\tconst handle = await this.#resolve(options, 'visible')\n\t\ttry {\n\t\t\tconst point = await this.#point(handle, options, {\n\t\t\t\tvisible: true,\n\t\t\t\tstable: true,\n\t\t\t\tevents: true,\n\t\t\t\tenabled: true,\n\t\t\t})\n\t\t\tif (options?.trial === true) return\n\t\t\tawait this.#frame.mouse.click(point, options)\n\t\t} finally {\n\t\t\tawait handle.dispose()\n\t\t}\n\t}\n\n\tasync fill(value: string, options?: BrowserActionOptions): Promise<void> {\n\t\tconst handle = await this.#resolve(options, 'visible')\n\t\ttry {\n\t\t\tif (options?.force !== true) {\n\t\t\t\tawait handle.call(\n\t\t\t\t\tcompileActionabilityFunction({\n\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\tstable: true,\n\t\t\t\t\t\tevents: false,\n\t\t\t\t\t\tenabled: true,\n\t\t\t\t\t\teditable: true,\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t}\n\t\t\tif (options?.trial === true) return\n\t\t\tawait handle.call(`function() {\n\t\t\t\tthis.focus()\n\t\t\t\tif (this.isContentEditable) {\n\t\t\t\t\tconst selection = this.ownerDocument.getSelection()\n\t\t\t\t\tconst range = this.ownerDocument.createRange()\n\t\t\t\t\trange.selectNodeContents(this)\n\t\t\t\t\tselection.removeAllRanges()\n\t\t\t\t\tselection.addRange(range)\n\t\t\t\t} else {\n\t\t\t\t\tthis.select()\n\t\t\t\t}\n\t\t\t}`)\n\t\t\tawait this.#frame.keyboard.insert(value)\n\t\t} finally {\n\t\t\tawait handle.dispose()\n\t\t}\n\t}\n\n\tasync select(values: readonly string[], options?: BrowserActionOptions): Promise<void> {\n\t\tconst handle = await this.#resolve(options, 'visible')\n\t\ttry {\n\t\t\tif (options?.force !== true) {\n\t\t\t\tawait handle.call(\n\t\t\t\t\tcompileActionabilityFunction({\n\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\tstable: true,\n\t\t\t\t\t\tevents: false,\n\t\t\t\t\t\tenabled: true,\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t}\n\t\t\tif (options?.trial === true) return\n\t\t\tawait handle.call(\n\t\t\t\t`function(values) {\n\t\t\t\t\tif (!(this instanceof HTMLSelectElement)) throw new Error('Element is not a select')\n\t\t\t\t\tif (!this.multiple && values.length > 1) throw new Error('Single select cannot accept multiple values')\n\t\t\t\t\tconst available = new Set(Array.from(this.options, (option) => option.value))\n\t\t\t\t\tconst missing = values.filter((value) => !available.has(value))\n\t\t\t\t\tif (missing.length > 0) throw new Error('Select options not found: ' + missing.join(', '))\n\t\t\t\t\tfor (const option of this.options) option.selected = values.includes(option.value)\n\t\t\t\t\tthis.dispatchEvent(new Event('input', { bubbles: true }))\n\t\t\t\t\tthis.dispatchEvent(new Event('change', { bubbles: true }))\n\t\t\t\t}`,\n\t\t\t\t[[...values]],\n\t\t\t)\n\t\t} finally {\n\t\t\tawait handle.dispose()\n\t\t}\n\t}\n\n\tasync check(options?: BrowserActionOptions): Promise<void> {\n\t\tif ((await this.#boolean('checked')) === true) return\n\t\tawait this.click(options)\n\t\tif ((await this.#boolean('checked')) !== true) {\n\t\t\tthrow new BrowserError('Browser locator did not become checked')\n\t\t}\n\t}\n\n\tasync uncheck(options?: BrowserActionOptions): Promise<void> {\n\t\tif ((await this.#boolean('checked')) === false) return\n\t\tawait this.click(options)\n\t\tif ((await this.#boolean('checked')) !== false) {\n\t\t\tthrow new BrowserError('Browser locator did not become unchecked')\n\t\t}\n\t}\n\n\tasync hover(options?: BrowserActionOptions): Promise<void> {\n\t\tconst handle = await this.#resolve(options, 'visible')\n\t\ttry {\n\t\t\tconst point = await this.#point(handle, options, {\n\t\t\t\tvisible: true,\n\t\t\t\tstable: true,\n\t\t\t\tevents: true,\n\t\t\t})\n\t\t\tif (options?.trial !== true) await this.#frame.mouse.move(point)\n\t\t} finally {\n\t\t\tawait handle.dispose()\n\t\t}\n\t}\n\n\tasync focus(options?: BrowserActionOptions): Promise<void> {\n\t\tconst handle = await this.#resolve(options, 'attached')\n\t\ttry {\n\t\t\tif (options?.trial !== true) await handle.call('function() { this.focus() }')\n\t\t} finally {\n\t\t\tawait handle.dispose()\n\t\t}\n\t}\n\n\tasync press(key: string, options?: BrowserActionOptions): Promise<void> {\n\t\tawait this.focus(options)\n\t\tif (options?.trial !== true) await this.#frame.keyboard.press(key, options)\n\t}\n\n\tasync type(value: string, options?: BrowserActionOptions): Promise<void> {\n\t\tawait this.focus(options)\n\t\tif (options?.trial !== true) await this.#frame.keyboard.type(value, options)\n\t}\n\n\tasync clear(options?: BrowserActionOptions): Promise<void> {\n\t\tconst handle = await this.#resolve(options, 'visible')\n\t\ttry {\n\t\t\tif (options?.trial === true) return\n\t\t\tawait handle.call(`function() {\n\t\t\t\tthis.focus()\n\t\t\t\tif (this.isContentEditable) {\n\t\t\t\t\tthis.textContent = ''\n\t\t\t\t} else if ('value' in this) {\n\t\t\t\t\tthis.value = ''\n\t\t\t\t} else {\n\t\t\t\t\tthrow new Error('Element is not editable')\n\t\t\t\t}\n\t\t\t\tthis.dispatchEvent(new InputEvent('input', { bubbles: true, inputType: 'deleteContentBackward' }))\n\t\t\t\tthis.dispatchEvent(new Event('change', { bubbles: true }))\n\t\t\t}`)\n\t\t} finally {\n\t\t\tawait handle.dispose()\n\t\t}\n\t}\n\n\tasync wait(options?: BrowserWaitOptions): Promise<void> {\n\t\tconst timeout = options?.timeout ?? BROWSER_DEFAULT_TIMEOUT_MS\n\t\tif (!isFiniteNumber(timeout) || timeout < 0) {\n\t\t\tthrow new BrowserError(\n\t\t\t\t'Browser wait timeout must be a non-negative finite number',\n\t\t\t\tundefined,\n\t\t\t\t{\n\t\t\t\t\ttimeout,\n\t\t\t\t},\n\t\t\t)\n\t\t}\n\t\tconst state = options?.state ?? 'attached'\n\t\tconst expression = this.#waitExpression(state, options?.strict ?? true, timeout)\n\t\tlet found: unknown\n\t\ttry {\n\t\t\tfound = await this.#frame.evaluate(expression, timeout + BROWSER_WAIT_POLL_INTERVAL_MS)\n\t\t} catch (error) {\n\t\t\tthrow new BrowserSelectorError('Browser locator wait failed', {\n\t\t\t\tquery: this.#query,\n\t\t\t\tstate,\n\t\t\t\ttimeout,\n\t\t\t\tframe: this.#frame.id,\n\t\t\t\terror,\n\t\t\t})\n\t\t}\n\t\tif (found === true) return\n\t\tthrow new BrowserSelectorError('Timeout waiting for browser locator', {\n\t\t\tquery: this.#query,\n\t\t\tstate,\n\t\t\ttimeout,\n\t\t\tframe: this.#frame.id,\n\t\t})\n\t}\n\n\tasync text(options?: BrowserTextResultOptions): Promise<string | readonly string[]> {\n\t\tconst expression =\n\t\t\toptions?.all === true\n\t\t\t\t? `(${compileLocatorListExpression(this.#query)}).map((element) => element.innerText)`\n\t\t\t\t: `(${compileLocatorExpression(this.#query)})?.innerText`\n\t\tconst value = await this.#frame.evaluate(expression)\n\t\tif (options?.all === true) {\n\t\t\tif (!isArray(value) || !value.every(isString)) {\n\t\t\t\tthrow new BrowserError('Browser locator text list is malformed')\n\t\t\t}\n\t\t\treturn value\n\t\t}\n\t\treturn requireBrowserString(value, 'Browser locator text')\n\t}\n\n\tasync html(): Promise<string> {\n\t\treturn await this.#string('outerHTML', 'Browser locator HTML')\n\t}\n\n\tasync value(): Promise<string> {\n\t\tconst value = await this.#frame.evaluate(\n\t\t\t`(() => { const element = ${compileLocatorExpression(this.#query)}; return element && 'value' in element ? element.value : element?.textContent })()`,\n\t\t)\n\t\treturn requireBrowserString(value, 'Browser locator value')\n\t}\n\n\tasync attribute(name: string): Promise<string | undefined> {\n\t\tconst value = await this.#frame.evaluate(\n\t\t\t`(${compileLocatorExpression(this.#query)})?.getAttribute(${JSON.stringify(name)})`,\n\t\t)\n\t\treturn isString(value) ? value : undefined\n\t}\n\n\tasync visible(): Promise<boolean> {\n\t\treturn await this.#boolean('visible')\n\t}\n\n\tasync enabled(): Promise<boolean> {\n\t\treturn await this.#boolean('enabled')\n\t}\n\n\tasync editable(): Promise<boolean> {\n\t\treturn await this.#boolean('editable')\n\t}\n\n\tasync screenshot(options?: BrowserScreenshotOptions): Promise<BrowserScreenshotResult> {\n\t\tif (options?.full === true || options?.clip !== undefined) {\n\t\t\tthrow new BrowserError('Browser locator screenshot cannot use full-page or custom clip')\n\t\t}\n\t\tconst handle = await this.#resolve(undefined, 'visible')\n\t\tlet token: string | undefined\n\t\ttry {\n\t\t\tawait handle.call(\n\t\t\t\tcompileActionabilityFunction({\n\t\t\t\t\tvisible: true,\n\t\t\t\t\tstable: true,\n\t\t\t\t\tevents: false,\n\t\t\t\t\tenabled: false,\n\t\t\t\t}),\n\t\t\t)\n\t\t\tconst quad = await this.#quad(handle)\n\t\t\tconst xs = [quad.points[0], quad.points[2], quad.points[4], quad.points[6]]\n\t\t\tconst ys = [quad.points[1], quad.points[3], quad.points[5], quad.points[7]]\n\t\t\tconst x = Math.min(...xs)\n\t\t\tconst y = Math.min(...ys)\n\t\t\tconst width = Math.max(...xs) - x\n\t\t\tconst height = Math.max(...ys) - y\n\t\t\tconst params: Record<string, unknown> = {\n\t\t\t\t...browserScreenshotToParams(options),\n\t\t\t\tclip: { x, y, width, height, scale: 1 },\n\t\t\t\tcaptureBeyondViewport: true,\n\t\t\t}\n\t\t\tif (options?.scale === 'device') {\n\t\t\t\tconst ratio = await this.#frame.evaluate('devicePixelRatio')\n\t\t\t\tif (!isFiniteNumber(ratio) || ratio <= 0) {\n\t\t\t\t\tthrow new BrowserError('Browser screenshot device scale is malformed')\n\t\t\t\t}\n\t\t\t\tparams['clip'] = { x, y, width, height, scale: ratio }\n\t\t\t}\n\t\t\tconst preparation = compileScreenshotPreparationExpression(options)\n\t\t\tif (preparation !== undefined) {\n\t\t\t\tconst value = await this.#frame.evaluate(preparation)\n\t\t\t\tif (!isString(value)) throw new BrowserError('Browser screenshot preparation failed')\n\t\t\t\ttoken = value\n\t\t\t}\n\t\t\tif (options?.transparent === true) {\n\t\t\t\tawait this.#frame.send('Emulation.setDefaultBackgroundColorOverride', {\n\t\t\t\t\tcolor: { r: 0, g: 0, b: 0, a: 0 },\n\t\t\t\t})\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tconst result = await this.#frame.send('Page.captureScreenshot', params)\n\t\t\t\tif (!isRecord(result) || !isString(result['data'])) {\n\t\t\t\t\tthrow new BrowserError('Locator screenshot failed: no data returned')\n\t\t\t\t}\n\t\t\t\tconst bytes = decodeBase64(result['data'])\n\t\t\t\tif (options?.path !== undefined) await this.#frame.save(options.path, bytes)\n\t\t\t\treturn { bytes, path: options?.path }\n\t\t\t} finally {\n\t\t\t\tif (options?.transparent === true) {\n\t\t\t\t\tawait this.#frame\n\t\t\t\t\t\t.send('Emulation.setDefaultBackgroundColorOverride')\n\t\t\t\t\t\t.catch(() => undefined)\n\t\t\t\t}\n\t\t\t}\n\t\t} finally {\n\t\t\tif (token !== undefined) {\n\t\t\t\tawait this.#frame.evaluate(compileScreenshotCleanupExpression(token)).catch(() => undefined)\n\t\t\t}\n\t\t\tawait handle.dispose()\n\t\t}\n\t}\n\n\tasync upload(options: BrowserUploadOptions): Promise<void> {\n\t\tconst handle = await this.#resolve(options, 'attached')\n\t\ttry {\n\t\t\tif (options.trial === true) return\n\t\t\tawait this.#frame.send('DOM.setFileInputFiles', {\n\t\t\t\tobjectId: handle.id,\n\t\t\t\tfiles: [...options.files],\n\t\t\t})\n\t\t} finally {\n\t\t\tawait handle.dispose()\n\t\t}\n\t}\n\n\tasync drag(target: BrowserLocatorInterface, options?: BrowserActionOptions): Promise<void> {\n\t\tif (target.frame.id !== this.#frame.id) {\n\t\t\tthrow new BrowserError('Browser drag target must belong to the same frame')\n\t\t}\n\t\tconst sourceHandle = await this.#resolve(options, 'visible')\n\t\tlet targetHandle: BrowserHandleInterface | undefined\n\t\ttry {\n\t\t\tawait target.wait({\n\t\t\t\t...(options?.timeout !== undefined ? { timeout: options.timeout } : {}),\n\t\t\t\t...(options?.strict !== undefined ? { strict: options.strict } : {}),\n\t\t\t\tstate: 'visible',\n\t\t\t})\n\t\t\ttargetHandle = await target.frame.handle(compileLocatorExpression(target.query))\n\t\t\tconst source = await this.#point(sourceHandle, options, {\n\t\t\t\tvisible: true,\n\t\t\t\tstable: true,\n\t\t\t\tevents: true,\n\t\t\t})\n\t\t\tconst destination = await this.#point(targetHandle, undefined, {\n\t\t\t\tvisible: true,\n\t\t\t\tstable: true,\n\t\t\t\tevents: true,\n\t\t\t})\n\t\t\tif (options?.trial !== true) {\n\t\t\t\tawait this.#frame.mouse.drag(source, destination, options)\n\t\t\t}\n\t\t} finally {\n\t\t\tawait sourceHandle.dispose()\n\t\t\tawait targetHandle?.dispose()\n\t\t}\n\t}\n\n\tasync #resolve(\n\t\toptions: BrowserActionOptions | undefined,\n\t\tstate: 'attached' | 'visible',\n\t): Promise<BrowserHandleInterface> {\n\t\tvalidateBrowserActionOptions(options)\n\t\tawait this.wait({\n\t\t\t...(options?.timeout !== undefined ? { timeout: options.timeout } : {}),\n\t\t\t...(options?.strict !== undefined ? { strict: options.strict } : {}),\n\t\t\tstate,\n\t\t})\n\t\treturn await this.#frame.handle(compileLocatorExpression(this.#query))\n\t}\n\n\tasync #point(\n\t\thandle: BrowserHandleInterface,\n\t\toptions: BrowserActionOptions | undefined,\n\t\tactionability: BrowserActionabilityOptions,\n\t): Promise<BrowserPoint> {\n\t\tif (options?.force !== true) {\n\t\t\tawait handle.call(\n\t\t\t\tcompileActionabilityFunction({\n\t\t\t\t\t...actionability,\n\t\t\t\t\t...(options?.position !== undefined ? { position: options.position } : {}),\n\t\t\t\t}),\n\t\t\t)\n\t\t}\n\t\tconst quad = await this.#quad(handle)\n\t\tif (options?.position === undefined) return quad.center\n\t\tconst xs = [quad.points[0], quad.points[2], quad.points[4], quad.points[6]]\n\t\tconst ys = [quad.points[1], quad.points[3], quad.points[5], quad.points[7]]\n\t\treturn {\n\t\t\tx: Math.min(...xs) + options.position.x,\n\t\t\ty: Math.min(...ys) + options.position.y,\n\t\t}\n\t}\n\n\tasync #quad(handle: BrowserHandleInterface): Promise<ReturnType<typeof readBrowserQuad>> {\n\t\treturn readBrowserQuad(await this.#frame.send('DOM.getContentQuads', { objectId: handle.id }))\n\t}\n\n\tasync #string(property: string, field: string): Promise<string> {\n\t\tconst value = await this.#frame.evaluate(\n\t\t\t`(${compileLocatorExpression(this.#query)})?.[${JSON.stringify(property)}]`,\n\t\t)\n\t\treturn requireBrowserString(value, field)\n\t}\n\n\tasync #boolean(property: 'checked' | 'visible' | 'enabled' | 'editable'): Promise<boolean> {\n\t\tlet expression: string\n\t\tswitch (property) {\n\t\t\tcase 'checked':\n\t\t\t\texpression = `Boolean((${compileLocatorExpression(this.#query)})?.checked)`\n\t\t\t\tbreak\n\t\t\tcase 'visible':\n\t\t\t\texpression = `(() => { const element = ${compileLocatorExpression(this.#query)}; if (!element) return false; const style = getComputedStyle(element); const rect = element.getBoundingClientRect(); return style.display !== 'none' && style.visibility !== 'hidden' && style.visibility !== 'collapse' && rect.width > 0 && rect.height > 0 })()`\n\t\t\t\tbreak\n\t\t\tcase 'enabled':\n\t\t\t\texpression = `(() => { const element = ${compileLocatorExpression(this.#query)}; return Boolean(element && !element.matches(':disabled')) })()`\n\t\t\t\tbreak\n\t\t\tcase 'editable':\n\t\t\t\texpression = `(() => { const element = ${compileLocatorExpression(this.#query)}; return Boolean(element && !element.matches(':disabled,[readonly]') && (element.isContentEditable || 'value' in element)) })()`\n\t\t\t\tbreak\n\t\t}\n\t\treturn (await this.#frame.evaluate(expression)) === true\n\t}\n\n\t#waitExpression(state: BrowserWaitState, strict: boolean, timeout: number): string {\n\t\tswitch (state) {\n\t\t\tcase 'attached':\n\t\t\t\treturn compileAttachedLocatorWaitExpression(this.#query, strict, timeout)\n\t\t\tcase 'detached':\n\t\t\t\treturn compileDetachedLocatorWaitExpression(this.#query, strict, timeout)\n\t\t\tcase 'visible':\n\t\t\t\treturn compileVisibleLocatorWaitExpression(this.#query, strict, timeout)\n\t\t\tcase 'hidden':\n\t\t\t\treturn compileHiddenLocatorWaitExpression(this.#query, strict, timeout)\n\t\t}\n\t}\n}\n","import type {\n\tBrowserFrameInterface,\n\tBrowserLocatorInterface,\n\tBrowserRoleOptions,\n\tBrowserSelectorManagerInterface,\n\tBrowserTextOptions,\n} from './types.js'\nimport { BrowserLocator } from './BrowserLocator.js'\n\n/**\n * Semantic locator factory for one frame.\n */\nexport class BrowserSelectorManager implements BrowserSelectorManagerInterface {\n\treadonly #frame: BrowserFrameInterface\n\n\tconstructor(frame: BrowserFrameInterface) {\n\t\tthis.#frame = frame\n\t}\n\n\tcss(value: string): BrowserLocatorInterface {\n\t\treturn new BrowserLocator(this.#frame, { selector: 'css', value })\n\t}\n\n\trole(value: string, options?: BrowserRoleOptions): BrowserLocatorInterface {\n\t\treturn new BrowserLocator(this.#frame, {\n\t\t\tselector: 'role',\n\t\t\tvalue,\n\t\t\t...(options?.name !== undefined ? { name: options.name } : {}),\n\t\t\t...(options?.exact !== undefined ? { exact: options.exact } : {}),\n\t\t})\n\t}\n\n\ttext(value: string, options?: BrowserTextOptions): BrowserLocatorInterface {\n\t\treturn new BrowserLocator(this.#frame, {\n\t\t\tselector: 'text',\n\t\t\tvalue,\n\t\t\t...(options?.exact !== undefined ? { exact: options.exact } : {}),\n\t\t})\n\t}\n\n\tlabel(value: string, options?: BrowserTextOptions): BrowserLocatorInterface {\n\t\treturn new BrowserLocator(this.#frame, {\n\t\t\tselector: 'label',\n\t\t\tvalue,\n\t\t\t...(options?.exact !== undefined ? { exact: options.exact } : {}),\n\t\t})\n\t}\n\n\tplaceholder(value: string, options?: BrowserTextOptions): BrowserLocatorInterface {\n\t\treturn new BrowserLocator(this.#frame, {\n\t\t\tselector: 'placeholder',\n\t\t\tvalue,\n\t\t\t...(options?.exact !== undefined ? { exact: options.exact } : {}),\n\t\t})\n\t}\n\n\ttest(value: string): BrowserLocatorInterface {\n\t\treturn new BrowserLocator(this.#frame, { selector: 'test', value })\n\t}\n}\n","import type { BrowserFrameInterface, BrowserPoint, BrowserTouchInterface } from './types.js'\nimport { validateBrowserPoint } from './helpers.js'\n\n/**\n * Trusted touch input through Chromium's CDP Input domain.\n */\nexport class BrowserTouch implements BrowserTouchInterface {\n\treadonly #frame: BrowserFrameInterface\n\n\tconstructor(frame: BrowserFrameInterface) {\n\t\tthis.#frame = frame\n\t}\n\n\tasync tap(point: BrowserPoint): Promise<void> {\n\t\tvalidateBrowserPoint(point)\n\t\tconst touch = { x: point.x, y: point.y }\n\t\tawait this.#frame.send('Input.dispatchTouchEvent', {\n\t\t\ttype: 'touchStart',\n\t\t\ttouchPoints: [touch],\n\t\t})\n\t\ttry {\n\t\t\tawait this.#frame.send('Input.dispatchTouchEvent', {\n\t\t\t\ttype: 'touchEnd',\n\t\t\t\ttouchPoints: [],\n\t\t\t})\n\t\t} catch (error) {\n\t\t\tawait this.#frame\n\t\t\t\t.send('Input.dispatchTouchEvent', {\n\t\t\t\t\ttype: 'touchCancel',\n\t\t\t\t\ttouchPoints: [],\n\t\t\t\t})\n\t\t\t\t.catch(() => undefined)\n\t\t\tthrow error\n\t\t}\n\t}\n}\n","import type {\n\tBrowserActionOptions,\n\tBrowserContentResult,\n\tBrowserFrameInterface,\n\tBrowserHandleInterface,\n\tBrowserKeyboardInterface,\n\tBrowserMouseInterface,\n\tBrowserSelectorManagerInterface,\n\tBrowserSessionFunction,\n\tBrowserTouchInterface,\n\tBrowserWaitOptions,\n\tCDPHandler,\n\tCDPClientInterface,\n} from './types.js'\nimport { BrowserHandle } from './BrowserHandle.js'\nimport { BrowserKeyboard } from './BrowserKeyboard.js'\nimport { BrowserMouse } from './BrowserMouse.js'\nimport { BrowserSelectorManager } from './BrowserSelectorManager.js'\nimport { BrowserTouch } from './BrowserTouch.js'\nimport { BROWSER_FRAME_WORLD_NAME, BROWSER_RESULT_LIMIT } from './constants.js'\nimport { guardEvaluateExpression, readEvaluationResult, requireBrowserString } from './helpers.js'\nimport { BrowserError } from './errors.js'\nimport { isInteger, isRecord, isString } from '@orkestrel/contract'\nimport { createHTML, renderText } from '@orkestrel/html'\n\n/**\n * One attached document frame, evaluated through its own CDP execution world.\n */\nexport class BrowserFrame implements BrowserFrameInterface {\n\treadonly #client: CDPClientInterface\n\treadonly #session: string | BrowserSessionFunction\n\treadonly #id: string\n\treadonly #parent: string | undefined\n\treadonly #name: string | undefined\n\treadonly #isolated: boolean\n\treadonly #selectors: BrowserSelectorManager\n\treadonly #keyboard: BrowserKeyboard\n\treadonly #mouse: BrowserMouse\n\treadonly #touch: BrowserTouch\n\t#url: string\n\n\tconstructor(\n\t\tclient: CDPClientInterface,\n\t\tsession: string | BrowserSessionFunction,\n\t\tid: string,\n\t\turl: string,\n\t\tparent?: string,\n\t\tname?: string,\n\t\tisolated = true,\n\t) {\n\t\tthis.#client = client\n\t\tthis.#session = session\n\t\tthis.#id = id\n\t\tthis.#url = url\n\t\tthis.#parent = parent\n\t\tthis.#name = name\n\t\tthis.#isolated = isolated\n\t\tthis.#selectors = new BrowserSelectorManager(this)\n\t\tthis.#keyboard = new BrowserKeyboard(this)\n\t\tthis.#mouse = new BrowserMouse(this)\n\t\tthis.#touch = new BrowserTouch(this)\n\t}\n\n\tget id(): string {\n\t\treturn this.#id\n\t}\n\n\tget parent(): string | undefined {\n\t\treturn this.#parent\n\t}\n\n\tget name(): string | undefined {\n\t\treturn this.#name\n\t}\n\n\tget url(): string {\n\t\treturn this.#url\n\t}\n\n\tget selectors(): BrowserSelectorManagerInterface {\n\t\treturn this.#selectors\n\t}\n\n\tget keyboard(): BrowserKeyboardInterface {\n\t\treturn this.#keyboard\n\t}\n\n\tget mouse(): BrowserMouseInterface {\n\t\treturn this.#mouse\n\t}\n\n\tget touch(): BrowserTouchInterface {\n\t\treturn this.#touch\n\t}\n\n\tasync title(): Promise<string> {\n\t\tthis.assert()\n\t\tconst result = await this.#evaluate('document.title')\n\t\treturn requireBrowserString(result, 'Document title')\n\t}\n\n\tasync content(): Promise<BrowserContentResult> {\n\t\tthis.assert()\n\t\tconst [title, html, text, currentUrl] = await Promise.all([\n\t\t\tthis.#evaluate('document.title'),\n\t\t\tthis.#captureHTML(),\n\t\t\tthis.#evaluate(\n\t\t\t\tguardEvaluateExpression(\n\t\t\t\t\t'document.body ? document.body.innerText : \"\"',\n\t\t\t\t\tBROWSER_RESULT_LIMIT,\n\t\t\t\t),\n\t\t\t),\n\t\t\tthis.#evaluate('location.href'),\n\t\t])\n\n\t\tconst url = requireBrowserString(currentUrl, 'Document URL')\n\t\tthis.#url = url\n\t\treturn {\n\t\t\turl,\n\t\t\ttitle: requireBrowserString(title, 'Document title'),\n\t\t\thtml: requireBrowserString(html, 'Document HTML'),\n\t\t\ttext: requireBrowserString(text, 'Document text'),\n\t\t}\n\t}\n\n\tasync article(): Promise<string> {\n\t\tthis.assert()\n\t\tconst html = requireBrowserString(await this.#captureHTML(), 'Document HTML')\n\t\treturn renderText(createHTML(html).distill().document)\n\t}\n\n\tasync click(selector: string, options?: BrowserActionOptions): Promise<void> {\n\t\tthis.assert()\n\t\tawait this.#selectors.css(selector).click(options)\n\t}\n\n\tasync fill(selector: string, value: string, options?: BrowserActionOptions): Promise<void> {\n\t\tthis.assert()\n\t\tawait this.#selectors.css(selector).fill(value, options)\n\t}\n\n\tasync select(\n\t\tselector: string,\n\t\tvalues: readonly string[],\n\t\toptions?: BrowserActionOptions,\n\t): Promise<void> {\n\t\tthis.assert()\n\t\tawait this.#selectors.css(selector).select(values, options)\n\t}\n\n\tasync evaluate(expression: string, timeout?: number): Promise<unknown> {\n\t\tthis.assert()\n\t\treturn await this.#evaluate(guardEvaluateExpression(expression, BROWSER_RESULT_LIMIT), timeout)\n\t}\n\n\tasync handle(expression: string): Promise<BrowserHandleInterface> {\n\t\tthis.assert()\n\t\tconst session = await this.#sessionId()\n\t\tconst params: Record<string, unknown> = {\n\t\t\texpression,\n\t\t\treturnByValue: false,\n\t\t\tawaitPromise: true,\n\t\t}\n\t\tconst context = await this.#context(session)\n\t\tif (context !== undefined) params['contextId'] = context\n\t\tconst result = await this.#client.send('Runtime.evaluate', params, session)\n\t\tif (\n\t\t\t!isRecord(result) ||\n\t\t\t!isRecord(result['result']) ||\n\t\t\t!isString(result['result']['objectId'])\n\t\t) {\n\t\t\tthrow new BrowserError('Browser expression did not resolve to an object handle', undefined, {\n\t\t\t\tframe: this.#id,\n\t\t\t})\n\t\t}\n\t\treturn new BrowserHandle(this.#client, session, result['result']['objectId'])\n\t}\n\n\tasync wait(selector: string, options?: BrowserWaitOptions): Promise<void> {\n\t\tthis.assert()\n\t\tawait this.#selectors.css(selector).wait(options)\n\t}\n\n\tasync send(\n\t\tmethod: string,\n\t\tparams?: Readonly<Record<string, unknown>>,\n\t\ttimeout?: number,\n\t): Promise<unknown> {\n\t\tthis.assert()\n\t\treturn await this.#client.send(method, params, await this.#sessionId(), timeout)\n\t}\n\n\tasync subscribe(method: string, handler: CDPHandler): Promise<void> {\n\t\tthis.assert()\n\t\tthis.#client.subscribe(method, handler, await this.#sessionId())\n\t}\n\n\tasync unsubscribe(method: string, handler: CDPHandler): Promise<void> {\n\t\tthis.#client.unsubscribe(method, handler, await this.#sessionId())\n\t}\n\n\tasync save(path: string, _bytes: Uint8Array): Promise<void> {\n\t\t// Frames satisfy the persistence contract, but only top-level pages receive a writer.\n\t\tthrow new BrowserError('Browser frame has no configured file writer', undefined, { path })\n\t}\n\n\tassert(): void {\n\t\tif (!this.#client.connected) {\n\t\t\tthrow new BrowserError('Browser frame is disconnected', undefined, { frame: this.#id })\n\t\t}\n\t}\n\n\tupdate(url: string): void {\n\t\tthis.#url = url\n\t}\n\n\tasync #captureHTML(): Promise<unknown> {\n\t\treturn await this.#evaluate(\n\t\t\tguardEvaluateExpression('document.documentElement.outerHTML', BROWSER_RESULT_LIMIT),\n\t\t)\n\t}\n\n\tasync #evaluate(expression: string, timeout?: number): Promise<unknown> {\n\t\tconst session = await this.#sessionId()\n\t\tconst params: Record<string, unknown> = {\n\t\t\texpression,\n\t\t\treturnByValue: true,\n\t\t\tawaitPromise: true,\n\t\t}\n\n\t\tconst context = await this.#context(session, timeout)\n\t\tif (context !== undefined) params['contextId'] = context\n\n\t\tconst result = await this.#client.send('Runtime.evaluate', params, session, timeout)\n\t\treturn readEvaluationResult(result)\n\t}\n\n\tasync #context(session: string, timeout?: number): Promise<number | undefined> {\n\t\tif (!this.#isolated) return undefined\n\t\tconst world = await this.#client.send(\n\t\t\t'Page.createIsolatedWorld',\n\t\t\t{ frameId: this.#id, worldName: BROWSER_FRAME_WORLD_NAME },\n\t\t\tsession,\n\t\t\ttimeout,\n\t\t)\n\t\tif (!isRecord(world) || !isInteger(world['executionContextId'])) {\n\t\t\tthrow new BrowserError('Failed to create frame execution context', undefined, {\n\t\t\t\tframe: this.#id,\n\t\t\t})\n\t\t}\n\t\treturn world['executionContextId']\n\t}\n\n\tasync #sessionId(): Promise<string> {\n\t\tif (isString(this.#session)) return this.#session\n\t\treturn await this.#session(this.#id)\n\t}\n}\n","import type { BrowserFileChooserInterface, BrowserFrameInterface } from './types.js'\nimport { BrowserError } from './errors.js'\n\n/**\n * One intercepted file input selection.\n */\nexport class BrowserFileChooser implements BrowserFileChooserInterface {\n\treadonly #frame: BrowserFrameInterface\n\treadonly #backend: number\n\treadonly #multiple: boolean\n\t#handled = false\n\t#handling = false\n\n\tconstructor(frame: BrowserFrameInterface, backend: number, multiple: boolean) {\n\t\tthis.#frame = frame\n\t\tthis.#backend = backend\n\t\tthis.#multiple = multiple\n\t}\n\n\tget multiple(): boolean {\n\t\treturn this.#multiple\n\t}\n\n\tasync upload(files: readonly string[]): Promise<void> {\n\t\tthis.#assert()\n\t\tif (!this.#multiple && files.length > 1) {\n\t\t\tthrow new BrowserError('Single file chooser cannot accept multiple files')\n\t\t}\n\t\tthis.#handling = true\n\t\ttry {\n\t\t\tawait this.#frame.send('DOM.setFileInputFiles', {\n\t\t\t\tbackendNodeId: this.#backend,\n\t\t\t\tfiles: [...files],\n\t\t\t})\n\t\t\tthis.#handled = true\n\t\t} finally {\n\t\t\tthis.#handling = false\n\t\t}\n\t}\n\n\tasync cancel(): Promise<void> {\n\t\tthis.#assert()\n\t\tthis.#handling = true\n\t\ttry {\n\t\t\tawait this.#frame.send('DOM.setFileInputFiles', {\n\t\t\t\tbackendNodeId: this.#backend,\n\t\t\t\tfiles: [],\n\t\t\t})\n\t\t\tthis.#handled = true\n\t\t} finally {\n\t\t\tthis.#handling = false\n\t\t}\n\t}\n\n\t#assert(): void {\n\t\tif (this.#handled || this.#handling) {\n\t\t\tthrow new BrowserError('Browser file chooser is already handled')\n\t\t}\n\t}\n}\n","import type {\n\tBrowserHAR,\n\tBrowserHAREntry,\n\tBrowserHARManagerInterface,\n\tBrowserHAROptions,\n\tBrowserHARPending,\n\tBrowserHARReplayOptions,\n\tBrowserNetworkManagerInterface,\n\tBrowserRequest,\n\tBrowserRequestFailure,\n\tBrowserResponse,\n\tBrowserRouteHandler,\n\tScreenshotWriterInterface,\n} from './types.js'\nimport { BROWSER_HAR_CREATOR } from './constants.js'\nimport {\n\tbrowserHARHeadersToRecord,\n\tcreateBrowserHAREntry,\n\tdecodeBase64,\n\ttextToBytes,\n\tvalidateBrowserHAR,\n} from './helpers.js'\nimport { BrowserError } from './errors.js'\n\n/**\n * HTTP archive recording and replay over one page network manager.\n */\nexport class BrowserHARManager implements BrowserHARManagerInterface {\n\treadonly #network: BrowserNetworkManagerInterface\n\treadonly #writer: ScreenshotWriterInterface | undefined\n\treadonly #pending: Map<string, BrowserHARPending> = new Map()\n\treadonly #entries: BrowserHAREntry[] = []\n\treadonly #tasks: Set<Promise<void>> = new Set()\n\t#options: BrowserHAROptions | undefined\n\t#recording = false\n\t#failure: unknown\n\t#archive: BrowserHAR | undefined\n\t#fallback = false\n\treadonly #requestHandler = this.#handleRequest.bind(this)\n\treadonly #responseHandler = this.#handleResponse.bind(this)\n\treadonly #failureHandler = this.#handleFailure.bind(this)\n\treadonly #finishHandler = this.#handleFinish.bind(this)\n\treadonly #replayHandler: BrowserRouteHandler = this.#handleReplay.bind(this)\n\n\tconstructor(network: BrowserNetworkManagerInterface, writer?: ScreenshotWriterInterface) {\n\t\tthis.#network = network\n\t\tthis.#writer = writer\n\t}\n\n\tget recording(): boolean {\n\t\treturn this.#recording\n\t}\n\n\tasync start(options?: BrowserHAROptions): Promise<void> {\n\t\tif (this.#recording) return\n\t\tthis.#options = options\n\t\tthis.#entries.length = 0\n\t\tthis.#pending.clear()\n\t\tthis.#failure = undefined\n\t\tthis.#network.emitter.on('request', this.#requestHandler)\n\t\tthis.#network.emitter.on('response', this.#responseHandler)\n\t\tthis.#network.emitter.on('failure', this.#failureHandler)\n\t\tthis.#network.emitter.on('finish', this.#finishHandler)\n\t\tthis.#recording = true\n\t\ttry {\n\t\t\tawait this.#network.start()\n\t\t} catch (error) {\n\t\t\tthis.#recording = false\n\t\t\tthis.#network.emitter.off('request', this.#requestHandler)\n\t\t\tthis.#network.emitter.off('response', this.#responseHandler)\n\t\t\tthis.#network.emitter.off('failure', this.#failureHandler)\n\t\t\tthis.#network.emitter.off('finish', this.#finishHandler)\n\t\t\tthrow error\n\t\t}\n\t}\n\n\tasync stop(): Promise<BrowserHAR> {\n\t\tif (this.#recording) {\n\t\t\tthis.#recording = false\n\t\t\tthis.#network.emitter.off('request', this.#requestHandler)\n\t\t\tthis.#network.emitter.off('response', this.#responseHandler)\n\t\t\tthis.#network.emitter.off('failure', this.#failureHandler)\n\t\t\tthis.#network.emitter.off('finish', this.#finishHandler)\n\t\t\tawait Promise.allSettled([...this.#tasks])\n\t\t\tfor (const id of [...this.#pending.keys()]) {\n\t\t\t\tconst pending = this.#pending.get(id)\n\t\t\t\tif (pending === undefined) continue\n\t\t\t\tthis.#pending.delete(id)\n\t\t\t\tthis.#entries.push(\n\t\t\t\t\tcreateBrowserHAREntry(\n\t\t\t\t\t\tpending,\n\t\t\t\t\t\tMath.max(0, Date.now() - pending.started),\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t'Request was incomplete when recording stopped',\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\t\tif (this.#failure !== undefined) {\n\t\t\tthrow new BrowserError('Browser HAR recording failed', 'BROWSER_HAR_ERROR', {\n\t\t\t\terror: this.#failure,\n\t\t\t})\n\t\t}\n\t\tconst har: BrowserHAR = {\n\t\t\tlog: {\n\t\t\t\tversion: '1.2',\n\t\t\t\tcreator: BROWSER_HAR_CREATOR,\n\t\t\t\tentries: [...this.#entries],\n\t\t\t},\n\t\t}\n\t\tif (this.#options?.path !== undefined) {\n\t\t\tif (this.#writer === undefined) {\n\t\t\t\tthrow new BrowserError('Browser HAR path requires a configured writer')\n\t\t\t}\n\t\t\tawait this.#writer.write(this.#options.path, textToBytes(JSON.stringify(har, undefined, 2)))\n\t\t}\n\t\treturn har\n\t}\n\n\tasync replay(har: BrowserHAR, options?: BrowserHARReplayOptions): Promise<void> {\n\t\tvalidateBrowserHAR(har)\n\t\tif (this.#archive !== undefined) await this.#network.unroute(this.#replayHandler)\n\t\tthis.#archive = har\n\t\tthis.#fallback = options?.fallback === true\n\t\ttry {\n\t\t\tawait this.#network.route({}, this.#replayHandler)\n\t\t} catch (error) {\n\t\t\tthis.#archive = undefined\n\t\t\tthis.#fallback = false\n\t\t\tthrow error\n\t\t}\n\t}\n\n\tasync clear(): Promise<void> {\n\t\tif (this.#recording) await this.stop()\n\t\tconst replaying = this.#archive !== undefined\n\t\tthis.#archive = undefined\n\t\tthis.#fallback = false\n\t\tif (replaying) await this.#network.unroute(this.#replayHandler)\n\t\tthis.#entries.length = 0\n\t\tthis.#pending.clear()\n\t}\n\n\t#handleRequest(request: BrowserRequest): void {\n\t\tif (!this.#recording) return\n\t\tthis.#pending.set(request.id, {\n\t\t\trequest,\n\t\t\tstarted: request.walltime === undefined ? Date.now() : request.walltime * 1000,\n\t\t\tresponse: undefined,\n\t\t})\n\t}\n\n\t#handleResponse(response: BrowserResponse): void {\n\t\tconst pending = this.#pending.get(response.id)\n\t\tif (pending === undefined) return\n\t\tthis.#pending.set(response.id, {\n\t\t\trequest: pending.request,\n\t\t\tstarted: pending.started,\n\t\t\tresponse,\n\t\t})\n\t}\n\n\t#handleFailure(failure: BrowserRequestFailure): void {\n\t\tconst pending = this.#pending.get(failure.id)\n\t\tif (pending === undefined) return\n\t\tthis.#pending.delete(failure.id)\n\t\tthis.#entries.push(\n\t\t\tcreateBrowserHAREntry(\n\t\t\t\tpending,\n\t\t\t\tMath.max(0, Date.now() - pending.started),\n\t\t\t\tundefined,\n\t\t\t\tfailure.error,\n\t\t\t),\n\t\t)\n\t}\n\n\t#handleFinish(id: string): void {\n\t\tthis.#track(this.#complete(id))\n\t}\n\n\tasync #handleReplay(route: Parameters<BrowserRouteHandler>[0]): Promise<void> {\n\t\tconst entry = this.#archive?.log.entries.find(\n\t\t\t(candidate) =>\n\t\t\t\tcandidate.request.url === route.request.url &&\n\t\t\t\tcandidate.request.method === route.request.method,\n\t\t)\n\t\tif (entry === undefined || entry.response.status === 0) {\n\t\t\tif (this.#fallback) await route.continue()\n\t\t\telse await route.abort('Failed')\n\t\t\treturn\n\t\t}\n\t\tconst body =\n\t\t\tentry.response.content.text === undefined\n\t\t\t\t? undefined\n\t\t\t\t: entry.response.content.encoding === 'base64'\n\t\t\t\t\t? decodeBase64(entry.response.content.text)\n\t\t\t\t\t: entry.response.content.text\n\t\tawait route.fulfill({\n\t\t\tstatus: entry.response.status,\n\t\t\tphrase: entry.response.statusText,\n\t\t\theaders: browserHARHeadersToRecord(entry.response.headers),\n\t\t\t...(body !== undefined ? { body } : {}),\n\t\t})\n\t}\n\n\tasync #complete(id: string): Promise<void> {\n\t\tconst pending = this.#pending.get(id)\n\t\tif (pending === undefined) return\n\t\tthis.#pending.delete(id)\n\t\tlet body: Uint8Array | undefined\n\t\tif (this.#options?.content === true && pending.response !== undefined) {\n\t\t\ttry {\n\t\t\t\tbody = await this.#network.body(id)\n\t\t\t} catch {\n\t\t\t\t// Some redirects, cached resources, and protocol errors have no retrievable body.\n\t\t\t}\n\t\t}\n\t\tthis.#entries.push(\n\t\t\tcreateBrowserHAREntry(pending, Math.max(0, Date.now() - pending.started), body),\n\t\t)\n\t}\n\n\t#track(task: Promise<void>): void {\n\t\tthis.#tasks.add(task)\n\t\tvoid task\n\t\t\t.catch((error: unknown) => {\n\t\t\t\tif (this.#failure === undefined) this.#failure = error\n\t\t\t})\n\t\t\t.finally(() => this.#tasks.delete(task))\n\t}\n}\n","import type {\n\tBrowserFrameInterface,\n\tBrowserRequest,\n\tBrowserRouteContinueOptions,\n\tBrowserRouteFulfillOptions,\n\tBrowserRouteInterface,\n} from './types.js'\nimport { browserHeadersToProtocol, encodeBase64, textToBytes } from './helpers.js'\nimport { BrowserError } from './errors.js'\nimport { isInteger, isString } from '@orkestrel/contract'\n\n/**\n * One paused request that can be aborted, continued, or fulfilled exactly once.\n */\nexport class BrowserRoute implements BrowserRouteInterface {\n\treadonly #frame: BrowserFrameInterface\n\treadonly #id: string\n\treadonly #request: BrowserRequest\n\t#handled = false\n\t#handling = false\n\n\tconstructor(frame: BrowserFrameInterface, id: string, request: BrowserRequest) {\n\t\tthis.#frame = frame\n\t\tthis.#id = id\n\t\tthis.#request = request\n\t}\n\n\tget id(): string {\n\t\treturn this.#id\n\t}\n\n\tget request(): BrowserRequest {\n\t\treturn this.#request\n\t}\n\n\tget handled(): boolean {\n\t\treturn this.#handled\n\t}\n\n\tasync abort(reason = 'Failed'): Promise<void> {\n\t\tthis.#assert()\n\t\tthis.#handling = true\n\t\ttry {\n\t\t\tawait this.#frame.send('Fetch.failRequest', {\n\t\t\t\trequestId: this.#id,\n\t\t\t\terrorReason: reason,\n\t\t\t})\n\t\t\tthis.#handled = true\n\t\t} finally {\n\t\t\tthis.#handling = false\n\t\t}\n\t}\n\n\tasync continue(options?: BrowserRouteContinueOptions): Promise<void> {\n\t\tthis.#assert()\n\t\tconst params: Record<string, unknown> = { requestId: this.#id }\n\t\tif (options?.url !== undefined) params['url'] = options.url\n\t\tif (options?.method !== undefined) params['method'] = options.method\n\t\tif (options?.headers !== undefined) {\n\t\t\tparams['headers'] = browserHeadersToProtocol(options.headers)\n\t\t}\n\t\tif (options?.post !== undefined) {\n\t\t\tparams['postData'] = encodeBase64(textToBytes(options.post))\n\t\t}\n\t\tthis.#handling = true\n\t\ttry {\n\t\t\tawait this.#frame.send('Fetch.continueRequest', params)\n\t\t\tthis.#handled = true\n\t\t} finally {\n\t\t\tthis.#handling = false\n\t\t}\n\t}\n\n\tasync fulfill(options: BrowserRouteFulfillOptions): Promise<void> {\n\t\tthis.#assert()\n\t\tconst status = options.status ?? 200\n\t\tif (!isInteger(status) || status < 100 || status > 999) {\n\t\t\tthrow new BrowserError('Browser route status must be an integer from 100 to 999', undefined, {\n\t\t\t\tstatus,\n\t\t\t})\n\t\t}\n\t\tconst params: Record<string, unknown> = {\n\t\t\trequestId: this.#id,\n\t\t\tresponseCode: status,\n\t\t}\n\t\tif (options.phrase !== undefined) params['responsePhrase'] = options.phrase\n\t\tif (options.headers !== undefined) {\n\t\t\tparams['responseHeaders'] = browserHeadersToProtocol(options.headers)\n\t\t}\n\t\tif (options.body !== undefined) {\n\t\t\tparams['body'] = encodeBase64(\n\t\t\t\tisString(options.body) ? textToBytes(options.body) : options.body,\n\t\t\t)\n\t\t}\n\t\tthis.#handling = true\n\t\ttry {\n\t\t\tawait this.#frame.send('Fetch.fulfillRequest', params)\n\t\t\tthis.#handled = true\n\t\t} finally {\n\t\t\tthis.#handling = false\n\t\t}\n\t}\n\n\t#assert(): void {\n\t\tif (this.#handled || this.#handling) throw new BrowserError('Browser route is already handled')\n\t}\n}\n","import type {\n\tBrowserWebSocketEventMap,\n\tBrowserWebSocketFrame,\n\tBrowserWebSocketInterface,\n} from './types.js'\nimport type { EmitterInterface } from '@orkestrel/emitter'\nimport { Emitter } from '@orkestrel/emitter'\n\n/**\n * Observable WebSocket connection reconstructed from Network-domain events.\n */\nexport class BrowserWebSocket implements BrowserWebSocketInterface {\n\treadonly #emitter: Emitter<BrowserWebSocketEventMap>\n\treadonly #id: string\n\treadonly #url: string\n\t#closed = false\n\n\tconstructor(id: string, url: string) {\n\t\tthis.#id = id\n\t\tthis.#url = url\n\t\tthis.#emitter = new Emitter()\n\t}\n\n\tget emitter(): EmitterInterface<BrowserWebSocketEventMap> {\n\t\treturn this.#emitter\n\t}\n\n\tget id(): string {\n\t\treturn this.#id\n\t}\n\n\tget url(): string {\n\t\treturn this.#url\n\t}\n\n\treceive(frame: BrowserWebSocketFrame): void {\n\t\tif (!this.#closed) this.#emitter.emit('receive', frame)\n\t}\n\n\ttransmit(frame: BrowserWebSocketFrame): void {\n\t\tif (!this.#closed) this.#emitter.emit('transmit', frame)\n\t}\n\n\tfail(message: string): void {\n\t\tif (!this.#closed) this.#emitter.emit('error', message)\n\t}\n\n\tclose(timestamp: number): void {\n\t\tif (this.#closed) return\n\t\tthis.#closed = true\n\t\tthis.#emitter.emit('close', timestamp)\n\t\tthis.#emitter.destroy()\n\t}\n}\n","import type {\n\tBrowserCredentials,\n\tBrowserFrameInterface,\n\tBrowserHARManagerInterface,\n\tBrowserNetworkEventMap,\n\tBrowserNetworkManagerInterface,\n\tBrowserRouteDefinition,\n\tBrowserRouteHandler,\n\tBrowserRouteQuery,\n\tScreenshotWriterInterface,\n} from './types.js'\nimport type { EmitterInterface } from '@orkestrel/emitter'\nimport { BrowserHARManager } from './BrowserHARManager.js'\nimport { BrowserRoute } from './BrowserRoute.js'\nimport { BrowserWebSocket } from './BrowserWebSocket.js'\nimport {\n\tbytesToText,\n\tdecodeBase64,\n\tmatchesBrowserRoute,\n\treadBrowserRequest,\n\treadBrowserRequestFailure,\n\treadBrowserResponse,\n\treadBrowserWebSocketFrame,\n\ttextToBytes,\n} from './helpers.js'\nimport { BrowserError } from './errors.js'\nimport { attempt, isFiniteNumber, isRecord, isString } from '@orkestrel/contract'\nimport { Emitter } from '@orkestrel/emitter'\n\n/**\n * Page-scoped Network and Fetch domain lifecycle.\n */\nexport class BrowserNetworkManager implements BrowserNetworkManagerInterface {\n\treadonly #frame: BrowserFrameInterface\n\treadonly #emitter: Emitter<BrowserNetworkEventMap>\n\treadonly #har: BrowserHARManager\n\treadonly #routes: BrowserRouteDefinition[] = []\n\treadonly #sockets: Map<string, BrowserWebSocket> = new Map()\n\t#credentials: BrowserCredentials | undefined\n\t#started = false\n\t#fetch = false\n\t#destroyed = false\n\t#starting: Promise<void> | undefined\n\treadonly #requestHandler = this.#handleRequest.bind(this)\n\treadonly #responseHandler = this.#handleResponse.bind(this)\n\treadonly #failureHandler = this.#handleFailure.bind(this)\n\treadonly #finishHandler = this.#handleFinish.bind(this)\n\treadonly #pausedHandler = this.#handlePause.bind(this)\n\treadonly #authHandler = this.#handleAuth.bind(this)\n\treadonly #socketHandler = this.#handleSocket.bind(this)\n\treadonly #socketReceiveHandler = this.#handleSocketReceive.bind(this)\n\treadonly #socketTransmitHandler = this.#handleSocketTransmit.bind(this)\n\treadonly #socketErrorHandler = this.#handleSocketError.bind(this)\n\treadonly #socketCloseHandler = this.#handleSocketClose.bind(this)\n\n\tconstructor(frame: BrowserFrameInterface, writer?: ScreenshotWriterInterface) {\n\t\tthis.#frame = frame\n\t\tthis.#emitter = new Emitter()\n\t\tthis.#har = new BrowserHARManager(this, writer)\n\t}\n\n\tget emitter(): EmitterInterface<BrowserNetworkEventMap> {\n\t\treturn this.#emitter\n\t}\n\n\tget har(): BrowserHARManagerInterface {\n\t\treturn this.#har\n\t}\n\n\tasync start(): Promise<void> {\n\t\tif (this.#destroyed) throw new BrowserError('Browser network manager is destroyed')\n\t\tif (this.#started) return\n\t\tconst active = this.#starting\n\t\tif (active !== undefined) {\n\t\t\tawait active\n\t\t\treturn\n\t\t}\n\t\tconst transition = this.#begin()\n\t\tthis.#starting = transition\n\t\ttry {\n\t\t\tawait transition\n\t\t} finally {\n\t\t\tif (this.#starting === transition) this.#starting = undefined\n\t\t}\n\t}\n\n\tasync body(id: string): Promise<Uint8Array> {\n\t\tawait this.start()\n\t\tconst result = await this.#frame.send('Network.getResponseBody', { requestId: id })\n\t\tif (!isRecord(result) || !isString(result['body'])) {\n\t\t\tthrow new BrowserError('Browser response body is malformed', undefined, { id })\n\t\t}\n\t\treturn result['base64Encoded'] === true\n\t\t\t? decodeBase64(result['body'])\n\t\t\t: textToBytes(result['body'])\n\t}\n\n\tasync text(id: string): Promise<string> {\n\t\treturn bytesToText(await this.body(id))\n\t}\n\n\tasync json(id: string): Promise<unknown> {\n\t\tconst text = await this.text(id)\n\t\tconst result = attempt<unknown>(() => JSON.parse(text))\n\t\tif (result.success) return result.value\n\t\tthrow new BrowserError('Browser response body is not valid JSON', 'BROWSER_JSON_ERROR', {\n\t\t\tid,\n\t\t\terror: result.error,\n\t\t})\n\t}\n\n\tasync route(query: BrowserRouteQuery, handler: BrowserRouteHandler): Promise<void> {\n\t\tawait this.start()\n\t\tconst definition = { query, handler }\n\t\tthis.#routes.push(definition)\n\t\ttry {\n\t\t\tawait this.#configure()\n\t\t} catch (error) {\n\t\t\tthis.#routes.splice(this.#routes.indexOf(definition), 1)\n\t\t\tthrow error\n\t\t}\n\t}\n\n\tasync unroute(handler?: BrowserRouteHandler): Promise<void> {\n\t\tif (handler === undefined) {\n\t\t\tthis.#routes.length = 0\n\t\t} else {\n\t\t\tfor (let index = this.#routes.length - 1; index >= 0; index -= 1) {\n\t\t\t\tif (this.#routes[index]?.handler === handler) this.#routes.splice(index, 1)\n\t\t\t}\n\t\t}\n\t\tif (this.#started && !this.#destroyed) await this.#configure()\n\t}\n\n\tasync headers(headers: Readonly<Record<string, string>>): Promise<void> {\n\t\tawait this.start()\n\t\tawait this.#frame.send('Network.setExtraHTTPHeaders', { headers })\n\t}\n\n\tasync offline(offline: boolean): Promise<void> {\n\t\tawait this.start()\n\t\tawait this.#frame.send('Network.emulateNetworkConditions', {\n\t\t\toffline,\n\t\t\tlatency: 0,\n\t\t\tdownloadThroughput: -1,\n\t\t\tuploadThroughput: -1,\n\t\t})\n\t}\n\n\tasync credentials(credentials?: BrowserCredentials): Promise<void> {\n\t\tawait this.start()\n\t\tconst previous = this.#credentials\n\t\tthis.#credentials = credentials\n\t\ttry {\n\t\t\tawait this.#configure()\n\t\t} catch (error) {\n\t\t\tthis.#credentials = previous\n\t\t\tthrow error\n\t\t}\n\t}\n\n\tasync destroy(): Promise<void> {\n\t\tif (this.#destroyed) return\n\t\tthis.#destroyed = true\n\t\tlet failed = false\n\t\tlet failure: unknown\n\t\ttry {\n\t\t\tawait this.#har.clear()\n\t\t} catch (error) {\n\t\t\tfailed = true\n\t\t\tfailure = error\n\t\t}\n\t\tif (this.#fetch) {\n\t\t\ttry {\n\t\t\t\tawait this.#frame.send('Fetch.disable')\n\t\t\t} catch (error) {\n\t\t\t\tif (!failed) {\n\t\t\t\t\tfailed = true\n\t\t\t\t\tfailure = error\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (this.#started) {\n\t\t\ttry {\n\t\t\t\tawait this.#frame.send('Network.disable')\n\t\t\t} catch (error) {\n\t\t\t\tif (!failed) {\n\t\t\t\t\tfailed = true\n\t\t\t\t\tfailure = error\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\ttry {\n\t\t\tawait this.#unsubscribe()\n\t\t} catch (error) {\n\t\t\tif (!failed) {\n\t\t\t\tfailed = true\n\t\t\t\tfailure = error\n\t\t\t}\n\t\t}\n\t\tfor (const socket of this.#sockets.values()) socket.close(Date.now() / 1000)\n\t\tthis.#sockets.clear()\n\t\tthis.#routes.length = 0\n\t\tthis.#emitter.destroy()\n\t\tif (failed) throw failure\n\t}\n\n\t#handleRequest(params: Readonly<Record<string, unknown>>): void {\n\t\tconst request = readBrowserRequest(params)\n\t\tif (request !== undefined) this.#emitter.emit('request', request)\n\t}\n\n\t#handleResponse(params: Readonly<Record<string, unknown>>): void {\n\t\tconst response = readBrowserResponse(params)\n\t\tif (response !== undefined) this.#emitter.emit('response', response)\n\t}\n\n\t#handleFailure(params: Readonly<Record<string, unknown>>): void {\n\t\tconst failure = readBrowserRequestFailure(params)\n\t\tif (failure !== undefined) this.#emitter.emit('failure', failure)\n\t}\n\n\t#handleFinish(params: Readonly<Record<string, unknown>>): void {\n\t\tif (isString(params['requestId'])) this.#emitter.emit('finish', params['requestId'])\n\t}\n\n\t#handlePause(params: Readonly<Record<string, unknown>>): void {\n\t\tvoid this.#route(params).catch(() => undefined)\n\t}\n\n\t#handleAuth(params: Readonly<Record<string, unknown>>): void {\n\t\tvoid this.#authenticate(params).catch(() => undefined)\n\t}\n\n\t#handleSocket(params: Readonly<Record<string, unknown>>): void {\n\t\tif (!isString(params['requestId']) || !isString(params['url'])) return\n\t\tconst socket = new BrowserWebSocket(params['requestId'], params['url'])\n\t\tthis.#sockets.set(socket.id, socket)\n\t\tthis.#emitter.emit('socket', socket)\n\t}\n\n\t#handleSocketReceive(params: Readonly<Record<string, unknown>>): void {\n\t\tconst socket = isString(params['requestId'])\n\t\t\t? this.#sockets.get(params['requestId'])\n\t\t\t: undefined\n\t\tconst frame = readBrowserWebSocketFrame(params)\n\t\tif (socket !== undefined && frame !== undefined) socket.receive(frame)\n\t}\n\n\t#handleSocketTransmit(params: Readonly<Record<string, unknown>>): void {\n\t\tconst socket = isString(params['requestId'])\n\t\t\t? this.#sockets.get(params['requestId'])\n\t\t\t: undefined\n\t\tconst frame = readBrowserWebSocketFrame(params)\n\t\tif (socket !== undefined && frame !== undefined) socket.transmit(frame)\n\t}\n\n\t#handleSocketError(params: Readonly<Record<string, unknown>>): void {\n\t\tconst socket = isString(params['requestId'])\n\t\t\t? this.#sockets.get(params['requestId'])\n\t\t\t: undefined\n\t\tif (socket !== undefined && isString(params['errorMessage']))\n\t\t\tsocket.fail(params['errorMessage'])\n\t}\n\n\t#handleSocketClose(params: Readonly<Record<string, unknown>>): void {\n\t\tif (!isString(params['requestId'])) return\n\t\tconst socket = this.#sockets.get(params['requestId'])\n\t\tif (socket === undefined) return\n\t\tthis.#sockets.delete(params['requestId'])\n\t\tsocket.close(isFiniteNumber(params['timestamp']) ? params['timestamp'] : Date.now() / 1000)\n\t}\n\n\tasync #begin(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.#subscribe()\n\t\t\tawait this.#frame.send('Network.enable')\n\t\t\tthis.#started = true\n\t\t\tawait this.#configure()\n\t\t} catch (error) {\n\t\t\tthis.#started = false\n\t\t\tthis.#fetch = false\n\t\t\tawait this.#frame.send('Fetch.disable').catch(() => undefined)\n\t\t\tawait this.#frame.send('Network.disable').catch(() => undefined)\n\t\t\tawait this.#unsubscribe().catch(() => undefined)\n\t\t\tthrow error\n\t\t}\n\t}\n\n\tasync #configure(): Promise<void> {\n\t\tconst enabled = this.#routes.length > 0 || this.#credentials !== undefined\n\t\tif (!enabled) {\n\t\t\tif (this.#fetch) {\n\t\t\t\tawait this.#frame.send('Fetch.disable')\n\t\t\t\tthis.#fetch = false\n\t\t\t}\n\t\t\treturn\n\t\t}\n\t\tawait this.#frame.send('Fetch.enable', {\n\t\t\tpatterns: this.#routes.map((definition) => ({\n\t\t\t\turlPattern: definition.query.url ?? '*',\n\t\t\t\tresourceType: definition.query.resource,\n\t\t\t\trequestStage: 'Request',\n\t\t\t})),\n\t\t\thandleAuthRequests: this.#credentials !== undefined,\n\t\t})\n\t\tthis.#fetch = true\n\t}\n\n\tasync #route(params: Readonly<Record<string, unknown>>): Promise<void> {\n\t\tconst request = readBrowserRequest(params)\n\t\tif (request === undefined) {\n\t\t\tif (isString(params['requestId'])) {\n\t\t\t\tawait this.#frame.send('Fetch.failRequest', {\n\t\t\t\t\trequestId: params['requestId'],\n\t\t\t\t\terrorReason: 'Failed',\n\t\t\t\t})\n\t\t\t}\n\t\t\treturn\n\t\t}\n\t\tconst definition = this.#routes.find((candidate) =>\n\t\t\tmatchesBrowserRoute(request, candidate.query),\n\t\t)\n\t\tif (definition === undefined) {\n\t\t\tawait this.#frame.send('Fetch.continueRequest', { requestId: request.id })\n\t\t\treturn\n\t\t}\n\t\tconst route = new BrowserRoute(this.#frame, request.id, request)\n\t\ttry {\n\t\t\tawait definition.handler(route)\n\t\t\tif (!route.handled) await route.continue()\n\t\t} catch {\n\t\t\tif (!route.handled) await route.abort('Failed').catch(() => undefined)\n\t\t}\n\t}\n\n\tasync #authenticate(params: Readonly<Record<string, unknown>>): Promise<void> {\n\t\tconst id = params['requestId']\n\t\tif (!isString(id)) return\n\t\tconst credentials = this.#credentials\n\t\tawait this.#frame.send('Fetch.continueWithAuth', {\n\t\t\trequestId: id,\n\t\t\tauthChallengeResponse:\n\t\t\t\tcredentials === undefined\n\t\t\t\t\t? { response: 'Default' }\n\t\t\t\t\t: {\n\t\t\t\t\t\t\tresponse: 'ProvideCredentials',\n\t\t\t\t\t\t\tusername: credentials.username,\n\t\t\t\t\t\t\tpassword: credentials.password,\n\t\t\t\t\t\t},\n\t\t})\n\t}\n\n\tasync #subscribe(): Promise<void> {\n\t\tawait this.#frame.subscribe('Network.requestWillBeSent', this.#requestHandler)\n\t\tawait this.#frame.subscribe('Network.responseReceived', this.#responseHandler)\n\t\tawait this.#frame.subscribe('Network.loadingFailed', this.#failureHandler)\n\t\tawait this.#frame.subscribe('Network.loadingFinished', this.#finishHandler)\n\t\tawait this.#frame.subscribe('Fetch.requestPaused', this.#pausedHandler)\n\t\tawait this.#frame.subscribe('Fetch.authRequired', this.#authHandler)\n\t\tawait this.#frame.subscribe('Network.webSocketCreated', this.#socketHandler)\n\t\tawait this.#frame.subscribe('Network.webSocketFrameReceived', this.#socketReceiveHandler)\n\t\tawait this.#frame.subscribe('Network.webSocketFrameSent', this.#socketTransmitHandler)\n\t\tawait this.#frame.subscribe('Network.webSocketFrameError', this.#socketErrorHandler)\n\t\tawait this.#frame.subscribe('Network.webSocketClosed', this.#socketCloseHandler)\n\t}\n\n\tasync #unsubscribe(): Promise<void> {\n\t\tawait this.#frame.unsubscribe('Network.requestWillBeSent', this.#requestHandler)\n\t\tawait this.#frame.unsubscribe('Network.responseReceived', this.#responseHandler)\n\t\tawait this.#frame.unsubscribe('Network.loadingFailed', this.#failureHandler)\n\t\tawait this.#frame.unsubscribe('Network.loadingFinished', this.#finishHandler)\n\t\tawait this.#frame.unsubscribe('Fetch.requestPaused', this.#pausedHandler)\n\t\tawait this.#frame.unsubscribe('Fetch.authRequired', this.#authHandler)\n\t\tawait this.#frame.unsubscribe('Network.webSocketCreated', this.#socketHandler)\n\t\tawait this.#frame.unsubscribe('Network.webSocketFrameReceived', this.#socketReceiveHandler)\n\t\tawait this.#frame.unsubscribe('Network.webSocketFrameSent', this.#socketTransmitHandler)\n\t\tawait this.#frame.unsubscribe('Network.webSocketFrameError', this.#socketErrorHandler)\n\t\tawait this.#frame.unsubscribe('Network.webSocketClosed', this.#socketCloseHandler)\n\t}\n}\n","import type {\n\tBrowserNavigationManagerInterface,\n\tBrowserNavigationWait,\n\tBrowserNavigationWaitOptions,\n\tBrowserPageInterface,\n} from './types.js'\nimport { BROWSER_DEFAULT_TIMEOUT_MS, BROWSER_WAIT_POLL_INTERVAL_MS } from './constants.js'\nimport {\n\tcompileFunctionWaitExpression,\n\tmatchesBrowserURL,\n\tvalidateBrowserTimeout,\n} from './helpers.js'\nimport { BrowserError } from './errors.js'\n\n/**\n * URL and page-predicate waits resilient to ordinary navigation events.\n */\nexport class BrowserNavigationManager implements BrowserNavigationManagerInterface {\n\treadonly #page: BrowserPageInterface\n\treadonly #waits: Map<symbol, BrowserNavigationWait> = new Map()\n\treadonly #navigateHandler = this.#handleNavigate.bind(this)\n\treadonly #closeHandler = this.#handleClose.bind(this)\n\n\tconstructor(page: BrowserPageInterface) {\n\t\tthis.#page = page\n\t\tthis.#page.emitter.on('navigate', this.#navigateHandler)\n\t\tthis.#page.emitter.on('close', this.#closeHandler)\n\t}\n\n\tasync wait(pattern: string, options?: BrowserNavigationWaitOptions): Promise<string> {\n\t\tconst timeout = this.#timeout(options)\n\t\tif (matchesBrowserURL(this.#page.url, pattern)) return this.#page.url\n\t\tconst deferred = Promise.withResolvers<string>()\n\t\tconst id = Symbol(pattern)\n\t\tconst timer = setTimeout(() => {\n\t\t\tthis.#waits.delete(id)\n\t\t\tdeferred.reject(\n\t\t\t\tnew BrowserError('Browser URL wait timed out', 'BROWSER_NAVIGATION_TIMEOUT', {\n\t\t\t\t\tpattern,\n\t\t\t\t\ttimeout,\n\t\t\t\t}),\n\t\t\t)\n\t\t}, timeout)\n\t\tthis.#waits.set(id, {\n\t\t\tpattern,\n\t\t\ttimer,\n\t\t\tresolve: deferred.resolve,\n\t\t\treject: deferred.reject,\n\t\t})\n\t\treturn await deferred.promise\n\t}\n\n\tasync until(expression: string, options?: BrowserNavigationWaitOptions): Promise<unknown> {\n\t\tconst timeout = this.#timeout(options)\n\t\tconst result = await this.#page.evaluate(\n\t\t\tcompileFunctionWaitExpression(expression, timeout),\n\t\t\ttimeout + BROWSER_WAIT_POLL_INTERVAL_MS,\n\t\t)\n\t\tif (result !== false) return result\n\t\tthrow new BrowserError('Browser predicate wait timed out', 'BROWSER_NAVIGATION_TIMEOUT', {\n\t\t\texpression,\n\t\t\ttimeout,\n\t\t})\n\t}\n\n\t#handleNavigate(url: string): void {\n\t\tfor (const [id, wait] of this.#waits) {\n\t\t\tif (!matchesBrowserURL(url, wait.pattern)) continue\n\t\t\tclearTimeout(wait.timer)\n\t\t\tthis.#waits.delete(id)\n\t\t\twait.resolve(url)\n\t\t}\n\t}\n\n\t#handleClose(): void {\n\t\tfor (const [id, wait] of this.#waits) {\n\t\t\tclearTimeout(wait.timer)\n\t\t\tthis.#waits.delete(id)\n\t\t\twait.reject(new BrowserError('Browser URL wait ended because the page closed'))\n\t\t}\n\t}\n\n\t#timeout(options?: BrowserNavigationWaitOptions): number {\n\t\tconst timeout = options?.timeout ?? BROWSER_DEFAULT_TIMEOUT_MS\n\t\tvalidateBrowserTimeout(timeout)\n\t\treturn timeout\n\t}\n}\n","import type {\n\tBrowserBindingHandler,\n\tBrowserFrameInterface,\n\tBrowserScriptEntry,\n\tBrowserScriptManagerInterface,\n} from './types.js'\nimport {\n\tcompileBrowserBindingCleanup,\n\tcompileBrowserBindingSource,\n\tcompileBrowserBindingResult,\n\treadBrowserBindingCall,\n\treadBrowserScriptIdentifier,\n} from './helpers.js'\nimport { BrowserError } from './errors.js'\n\n/**\n * New-document scripts and promise-based host functions for one page.\n */\nexport class BrowserScriptManager implements BrowserScriptManagerInterface {\n\treadonly #frame: BrowserFrameInterface\n\treadonly #bindings: Map<string, BrowserBindingHandler> = new Map()\n\treadonly #scripts: Map<string, BrowserScriptEntry> = new Map()\n\t#subscribed = false\n\t#destroyed = false\n\treadonly #bindingHandler = this.#handleBinding.bind(this)\n\n\tconstructor(frame: BrowserFrameInterface) {\n\t\tthis.#frame = frame\n\t}\n\n\tasync add(source: string): Promise<string> {\n\t\tthis.#assert()\n\t\tconst result = await this.#frame.send('Page.addScriptToEvaluateOnNewDocument', { source })\n\t\tconst id = readBrowserScriptIdentifier(result)\n\t\tthis.#scripts.set(id, { source, binding: undefined })\n\t\ttry {\n\t\t\tawait this.#frame.evaluate(`(() => { ${source}\\n })()`)\n\t\t\treturn id\n\t\t} catch (error) {\n\t\t\tawait this.#frame\n\t\t\t\t.send('Page.removeScriptToEvaluateOnNewDocument', { identifier: id })\n\t\t\t\t.catch(() => undefined)\n\t\t\tthis.#scripts.delete(id)\n\t\t\tthrow error\n\t\t}\n\t}\n\n\tasync remove(id: string): Promise<void> {\n\t\tthis.#assert()\n\t\tif (!this.#scripts.has(id)) return\n\t\tawait this.#frame.send('Page.removeScriptToEvaluateOnNewDocument', { identifier: id })\n\t\tthis.#scripts.delete(id)\n\t}\n\n\tasync expose(name: string, handler: BrowserBindingHandler): Promise<void> {\n\t\tthis.#assert()\n\t\tif (!/^[$A-Z_a-z][$\\w]*$/.test(name)) {\n\t\t\tthrow new BrowserError(\n\t\t\t\t'Browser binding name must be a valid JavaScript identifier',\n\t\t\t\tundefined,\n\t\t\t\t{\n\t\t\t\t\tname,\n\t\t\t\t},\n\t\t\t)\n\t\t}\n\t\tif (this.#bindings.has(name)) {\n\t\t\tthrow new BrowserError('Browser binding already exists', undefined, { name })\n\t\t}\n\t\tconst subscribed = this.#subscribed\n\t\tif (!subscribed) {\n\t\t\tawait this.#frame.subscribe('Runtime.bindingCalled', this.#bindingHandler)\n\t\t\tthis.#subscribed = true\n\t\t}\n\t\tlet added = false\n\t\ttry {\n\t\t\tawait this.#frame.send('Runtime.addBinding', { name })\n\t\t\tadded = true\n\t\t\tconst id = await this.add(compileBrowserBindingSource(name))\n\t\t\tconst entry = this.#scripts.get(id)\n\t\t\tif (entry === undefined) {\n\t\t\t\tthrow new BrowserError('Browser binding script registration was lost', undefined, {\n\t\t\t\t\tname,\n\t\t\t\t})\n\t\t\t}\n\t\t\tthis.#scripts.set(id, { source: entry.source, binding: name })\n\t\t\tthis.#bindings.set(name, handler)\n\t\t} catch (error) {\n\t\t\tif (added) {\n\t\t\t\tawait this.#frame.send('Runtime.removeBinding', { name }).catch(() => undefined)\n\t\t\t}\n\t\t\tif (!subscribed && this.#bindings.size === 0) {\n\t\t\t\tawait this.#frame\n\t\t\t\t\t.unsubscribe('Runtime.bindingCalled', this.#bindingHandler)\n\t\t\t\t\t.catch(() => undefined)\n\t\t\t\tthis.#subscribed = false\n\t\t\t}\n\t\t\tthrow error\n\t\t}\n\t}\n\n\tasync revoke(name: string): Promise<void> {\n\t\tthis.#assert()\n\t\tif (!this.#bindings.has(name)) return\n\t\tfor (const [id, entry] of this.#scripts) {\n\t\t\tif (entry.binding !== name) continue\n\t\t\tawait this.#frame.send('Page.removeScriptToEvaluateOnNewDocument', { identifier: id })\n\t\t\tthis.#scripts.delete(id)\n\t\t}\n\t\tawait this.#frame.evaluate(compileBrowserBindingCleanup(name))\n\t\tawait this.#frame.send('Runtime.removeBinding', { name })\n\t\tthis.#bindings.delete(name)\n\t}\n\n\tasync destroy(): Promise<void> {\n\t\tif (this.#destroyed) return\n\t\tfor (const name of [...this.#bindings.keys()]) {\n\t\t\tawait this.revoke(name).catch(() => undefined)\n\t\t}\n\t\tfor (const id of [...this.#scripts.keys()]) {\n\t\t\tawait this.remove(id).catch(() => undefined)\n\t\t}\n\t\tif (this.#subscribed) {\n\t\t\tawait this.#frame\n\t\t\t\t.unsubscribe('Runtime.bindingCalled', this.#bindingHandler)\n\t\t\t\t.catch(() => undefined)\n\t\t}\n\t\tthis.#subscribed = false\n\t\tthis.#destroyed = true\n\t}\n\n\tasync #call(params: Readonly<Record<string, unknown>>): Promise<void> {\n\t\tconst call = readBrowserBindingCall(params)\n\t\tif (call === undefined) return\n\t\tconst handler = this.#bindings.get(call.name)\n\t\tif (handler === undefined) return\n\t\ttry {\n\t\t\tconst value = await handler(...call.args)\n\t\t\tawait this.#frame.send('Runtime.evaluate', {\n\t\t\t\texpression: compileBrowserBindingResult(call.name, call.id, true, value),\n\t\t\t\tcontextId: call.context,\n\t\t\t\tawaitPromise: true,\n\t\t\t})\n\t\t} catch (error) {\n\t\t\tawait this.#frame.send('Runtime.evaluate', {\n\t\t\t\texpression: compileBrowserBindingResult(call.name, call.id, false, String(error)),\n\t\t\t\tcontextId: call.context,\n\t\t\t\tawaitPromise: true,\n\t\t\t})\n\t\t}\n\t}\n\n\t#handleBinding(params: Readonly<Record<string, unknown>>): void {\n\t\tvoid this.#call(params).catch(() => undefined)\n\t}\n\n\t#assert(): void {\n\t\tif (this.#destroyed) throw new BrowserError('Browser script manager is destroyed')\n\t}\n}\n","import type {\n\tBrowserDocument,\n\tBrowserNode,\n\tBrowserNodePredicate,\n\tBrowserNodeQuery,\n\tBrowserSiblingRelation,\n\tBrowserSnapshotInput,\n\tBrowserSnapshotInterface,\n\tBrowserWalkOptions,\n} from './types.js'\nimport { isInteger } from '@orkestrel/contract'\nimport { BrowserError } from './errors.js'\nimport { isBrowserNodeQuery, matchesBrowserNode } from './helpers.js'\n\n/** A navigable, serializable browser DOM snapshot. */\nexport class BrowserSnapshot implements BrowserSnapshotInterface {\n\t// Documents are fixed and frozen at construction, so the derived owner index cannot go stale.\n\t#owners: ReadonlyMap<number, BrowserNode> | undefined\n\treadonly documents: readonly BrowserDocument[]\n\treadonly styles: readonly string[]\n\n\tconstructor(input: BrowserSnapshotInput) {\n\t\tthis.documents = Object.freeze([...input.documents])\n\t\tthis.styles = Object.freeze([...input.styles])\n\t}\n\n\twalk(options?: BrowserWalkOptions): Generator<BrowserNode, void, unknown> {\n\t\treturn options?.order === 'breadth' ? this.#breadth(options.root) : this.#depth(options?.root)\n\t}\n\n\t*descendants(node: BrowserNode): Generator<BrowserNode, void, unknown> {\n\t\tlet first = true\n\t\tfor (const descendant of this.#depth(node)) {\n\t\t\tif (first) {\n\t\t\t\tfirst = false\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tyield descendant\n\t\t}\n\t}\n\n\tdocument(node: BrowserNode): BrowserDocument | undefined {\n\t\treturn this.documents.find((document) => document.index === node.document)\n\t}\n\n\tchildren(node: BrowserNode): readonly BrowserNode[] {\n\t\tconst document = this.document(node)\n\t\tif (document === undefined) return []\n\t\tconst children = document.nodes.filter((candidate) => candidate.parent === node.index)\n\t\tif (node.content === undefined) return children\n\t\tconst content = this.documents.find((candidate) => candidate.index === node.content)\n\t\tif (content === undefined) return children\n\t\treturn [...children, ...content.nodes.filter((candidate) => candidate.parent === undefined)]\n\t}\n\n\tparent(node: BrowserNode): BrowserNode | undefined {\n\t\tconst document = this.document(node)\n\t\tif (document === undefined) return undefined\n\t\treturn node.parent === undefined ? this.#owner(node.document) : document.nodes[node.parent]\n\t}\n\n\tsiblings(node: BrowserNode, relation?: BrowserSiblingRelation): readonly BrowserNode[] {\n\t\tconst candidates = this.#candidates(node)\n\t\tconst index = candidates.findIndex(\n\t\t\t(candidate) => candidate.document === node.document && candidate.index === node.index,\n\t\t)\n\t\tif (relation === 'preceding') return index < 0 ? [] : candidates.slice(0, index)\n\t\tif (relation === 'following') return index < 0 ? [] : candidates.slice(index + 1)\n\t\treturn candidates.filter(\n\t\t\t(candidate) => candidate.document !== node.document || candidate.index !== node.index,\n\t\t)\n\t}\n\n\tancestors(node: BrowserNode): readonly BrowserNode[] {\n\t\tconst ancestors: BrowserNode[] = []\n\t\tconst visited = new Set<string>()\n\t\tlet current = node\n\n\t\twhile (true) {\n\t\t\tconst parent = this.parent(current)\n\t\t\tif (parent === undefined) break\n\t\t\tconst identity = this.#identity(parent)\n\t\t\tif (visited.has(identity)) break\n\t\t\tvisited.add(identity)\n\t\t\tancestors.push(parent)\n\t\t\tcurrent = parent\n\t\t}\n\t\treturn ancestors\n\t}\n\n\tcommon(first: BrowserNode, second: BrowserNode): BrowserNode | undefined {\n\t\tconst firstAncestors = this.#chain(first)\n\t\tconst secondAncestors = this.#chain(second)\n\t\tconst identities = new Set(firstAncestors.map((node) => this.#identity(node)))\n\t\treturn secondAncestors.find((node) => identities.has(this.#identity(node)))\n\t}\n\n\tdistance(first: BrowserNode, second: BrowserNode): number | undefined {\n\t\tconst common = this.common(first, second)\n\t\tif (common === undefined) return undefined\n\t\tconst identity = this.#identity(common)\n\t\tconst firstDistance = this.#chain(first).findIndex((node) => this.#identity(node) === identity)\n\t\tconst secondDistance = this.#chain(second).findIndex(\n\t\t\t(node) => this.#identity(node) === identity,\n\t\t)\n\t\tif (firstDistance < 0 || secondDistance < 0) return undefined\n\t\treturn firstDistance + secondDistance\n\t}\n\n\tfind(query: BrowserNodeQuery | BrowserNodePredicate): BrowserNode | undefined {\n\t\tfor (const node of this.walk()) {\n\t\t\tif (this.#match(node, query)) return node\n\t\t}\n\t\treturn undefined\n\t}\n\n\tfilter(query: BrowserNodeQuery | BrowserNodePredicate, limit?: number): readonly BrowserNode[] {\n\t\tif (limit !== undefined && (!isInteger(limit) || limit < 0)) {\n\t\t\tthrow new BrowserError(\n\t\t\t\t'Browser node result limit must be a non-negative integer',\n\t\t\t\tundefined,\n\t\t\t\t{\n\t\t\t\t\tlimit,\n\t\t\t\t},\n\t\t\t)\n\t\t}\n\t\tif (limit === 0) return []\n\t\tconst found: BrowserNode[] = []\n\t\tfor (const node of this.walk()) {\n\t\t\tif (!this.#match(node, query)) continue\n\t\t\tfound.push(node)\n\t\t\tif (limit !== undefined && found.length >= limit) break\n\t\t}\n\t\treturn found\n\t}\n\n\tclosest(\n\t\tnode: BrowserNode,\n\t\tquery: BrowserNodeQuery | BrowserNodePredicate,\n\t): BrowserNode | undefined {\n\t\tif (this.#match(node, query)) return node\n\t\tfor (const ancestor of this.ancestors(node)) {\n\t\t\tif (this.#match(ancestor, query)) return ancestor\n\t\t}\n\t\treturn undefined\n\t}\n\n\tpath(node: BrowserNode): string {\n\t\tconst document = this.document(node)\n\t\tif (document === undefined) return `document:${node.document} > node:${node.index}`\n\t\tconst chain = [...this.ancestors(node)].reverse()\n\t\tchain.push(node)\n\t\tconst segments: string[] = []\n\n\t\tfor (const current of chain) {\n\t\t\tif (current.type !== 1) {\n\t\t\t\tsegments.push(`${current.name.toLowerCase()}:${current.index}`)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tlet ordinal = 1\n\t\t\tif (current.parent !== undefined) {\n\t\t\t\tconst owner = this.document(current)\n\t\t\t\tfor (const sibling of owner?.nodes ?? []) {\n\t\t\t\t\tif (sibling.index >= current.index) break\n\t\t\t\t\tif (sibling.parent === current.parent && sibling.name === current.name) ordinal += 1\n\t\t\t\t}\n\t\t\t}\n\t\t\tsegments.push(`${current.name.toLowerCase()}:${ordinal}`)\n\t\t}\n\n\t\treturn `frame(${JSON.stringify(document.frame)}) > ${segments.join(' > ')}`\n\t}\n\n\t#roots(): readonly BrowserNode[] {\n\t\tconst roots: BrowserNode[] = []\n\t\tfor (const document of this.documents) {\n\t\t\troots.push(...document.nodes.filter((node) => node.parent === undefined))\n\t\t}\n\t\tfor (const document of this.documents) roots.push(...document.nodes)\n\t\treturn roots\n\t}\n\n\t#owner(document: number): BrowserNode | undefined {\n\t\tconst owners = this.#owners\n\t\tif (owners !== undefined) return owners.get(document)\n\t\tconst index = new Map<number, BrowserNode>()\n\t\tfor (const node of this.walk()) {\n\t\t\tif (node.content !== undefined && !index.has(node.content)) index.set(node.content, node)\n\t\t}\n\t\tthis.#owners = index\n\t\treturn index.get(document)\n\t}\n\n\t*#depth(root?: BrowserNode): Generator<BrowserNode, void, unknown> {\n\t\tconst visited = new Set<string>()\n\t\tfor (const seed of root === undefined ? this.#roots() : [root]) {\n\t\t\tconst stack: BrowserNode[] = [seed]\n\t\t\twhile (stack.length > 0) {\n\t\t\t\tconst node = stack.pop()\n\t\t\t\tif (node === undefined) break\n\t\t\t\tconst identity = this.#identity(node)\n\t\t\t\tif (visited.has(identity)) continue\n\t\t\t\tvisited.add(identity)\n\t\t\t\tyield node\n\n\t\t\t\tconst children = this.children(node)\n\t\t\t\tfor (let index = children.length - 1; index >= 0; index -= 1) {\n\t\t\t\t\tconst child = children[index]\n\t\t\t\t\tif (child !== undefined) stack.push(child)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t*#breadth(root?: BrowserNode): Generator<BrowserNode, void, unknown> {\n\t\tconst visited = new Set<string>()\n\t\tfor (const seed of root === undefined ? this.#roots() : [root]) {\n\t\t\tconst queue: BrowserNode[] = [seed]\n\t\t\tlet cursor = 0\n\t\t\twhile (cursor < queue.length) {\n\t\t\t\tconst node = queue[cursor]\n\t\t\t\tcursor += 1\n\t\t\t\tif (node === undefined) continue\n\t\t\t\tconst identity = this.#identity(node)\n\t\t\t\tif (visited.has(identity)) continue\n\t\t\t\tvisited.add(identity)\n\t\t\t\tyield node\n\t\t\t\tqueue.push(...this.children(node))\n\t\t\t}\n\t\t}\n\t}\n\n\t#candidates(node: BrowserNode): readonly BrowserNode[] {\n\t\tconst parent = this.parent(node)\n\t\treturn parent === undefined\n\t\t\t? (this.document(node)?.nodes.filter((candidate) => candidate.parent === undefined) ?? [])\n\t\t\t: this.children(parent)\n\t}\n\n\t#chain(node: BrowserNode): readonly BrowserNode[] {\n\t\treturn [node, ...this.ancestors(node)]\n\t}\n\n\t#match(node: BrowserNode, query: BrowserNodeQuery | BrowserNodePredicate): boolean {\n\t\treturn isBrowserNodeQuery(query) ? matchesBrowserNode(node, query) : query(node)\n\t}\n\n\t#identity(node: BrowserNode): string {\n\t\treturn `${node.document}:${node.index}`\n\t}\n}\n","import type { BrowserWorkerCategory, BrowserWorkerInterface, CDPClientInterface } from './types.js'\nimport { BROWSER_RESULT_LIMIT } from './constants.js'\nimport { guardEvaluateExpression, readEvaluationResult } from './helpers.js'\nimport { BrowserError } from './errors.js'\n\n/**\n * Dedicated, shared, or service worker attached through a flattened target session.\n */\nexport class BrowserWorker implements BrowserWorkerInterface {\n\treadonly #client: CDPClientInterface\n\treadonly #session: string\n\treadonly #id: string\n\treadonly #url: string\n\treadonly #category: BrowserWorkerCategory\n\t#closed = false\n\n\tconstructor(\n\t\tclient: CDPClientInterface,\n\t\tsession: string,\n\t\tid: string,\n\t\turl: string,\n\t\tcategory: BrowserWorkerCategory,\n\t) {\n\t\tthis.#client = client\n\t\tthis.#session = session\n\t\tthis.#id = id\n\t\tthis.#url = url\n\t\tthis.#category = category\n\t}\n\n\tget id(): string {\n\t\treturn this.#id\n\t}\n\n\tget url(): string {\n\t\treturn this.#url\n\t}\n\n\tget category(): BrowserWorkerCategory {\n\t\treturn this.#category\n\t}\n\n\tasync evaluate(expression: string, timeout?: number): Promise<unknown> {\n\t\tthis.#assert()\n\t\treturn readEvaluationResult(\n\t\t\tawait this.#client.send(\n\t\t\t\t'Runtime.evaluate',\n\t\t\t\t{\n\t\t\t\t\texpression: guardEvaluateExpression(expression, BROWSER_RESULT_LIMIT),\n\t\t\t\t\treturnByValue: true,\n\t\t\t\t\tawaitPromise: true,\n\t\t\t\t},\n\t\t\t\tthis.#session,\n\t\t\t\ttimeout,\n\t\t\t),\n\t\t)\n\t}\n\n\tasync send(method: string, params?: Readonly<Record<string, unknown>>): Promise<unknown> {\n\t\tthis.#assert()\n\t\treturn await this.#client.send(method, params, this.#session)\n\t}\n\n\tdetach(): void {\n\t\tthis.#closed = true\n\t}\n\n\tasync close(): Promise<void> {\n\t\tif (this.#closed) return\n\t\tthis.#closed = true\n\t\ttry {\n\t\t\tawait this.#client.send('Target.closeTarget', { targetId: this.#id })\n\t\t} catch {\n\t\t\t// The worker may already have terminated.\n\t\t}\n\t}\n\n\t#assert(): void {\n\t\tif (this.#closed) throw new BrowserError('Browser worker is closed')\n\t\tif (!this.#client.connected) throw new BrowserError('Browser worker is disconnected')\n\t}\n}\n","import type {\n\tBrowserCodegenInterface,\n\tBrowserCodegenOptions,\n\tBrowserClockInterface,\n\tBrowserDiagnosticsInterface,\n\tBrowserFrameInfo,\n\tBrowserFrameInterface,\n\tBrowserNavigationOptions,\n\tBrowserNavigationManagerInterface,\n\tBrowserNavigationResult,\n\tBrowserNavigationWatch,\n\tBrowserNetworkManagerInterface,\n\tBrowserPDFOptions,\n\tBrowserPDFResult,\n\tBrowserPageInterface,\n\tBrowserPageEventMap,\n\tBrowserResponse,\n\tBrowserScreenshotOptions,\n\tBrowserScreenshotResult,\n\tBrowserScriptManagerInterface,\n\tBrowserSnapshotInterface,\n\tBrowserSnapshotOptions,\n\tBrowserWaitUntil,\n\tBrowserWorkerCategory,\n\tBrowserAccessibilityInterface,\n\tCDPClientInterface,\n\tScreenshotWriterInterface,\n} from './types.js'\nimport type { EmitterInterface } from '@orkestrel/emitter'\nimport { BrowserCodegen } from './BrowserCodegen.js'\nimport { BrowserAccessibility } from './BrowserAccessibility.js'\nimport { BrowserClock } from './BrowserClock.js'\nimport { BrowserDiagnostics } from './BrowserDiagnostics.js'\nimport { BrowserDialog } from './BrowserDialog.js'\nimport { BrowserDownload } from './BrowserDownload.js'\nimport { BrowserFrame } from './BrowserFrame.js'\nimport { BrowserFileChooser } from './BrowserFileChooser.js'\nimport { BrowserNetworkManager } from './BrowserNetworkManager.js'\nimport { BrowserNavigationManager } from './BrowserNavigationManager.js'\nimport { BrowserScriptManager } from './BrowserScriptManager.js'\nimport { BrowserSnapshot } from './BrowserSnapshot.js'\nimport { BrowserWorker } from './BrowserWorker.js'\nimport { BrowserError } from './errors.js'\nimport {\n\tBROWSER_DEFAULT_TIMEOUT_MS,\n\tBROWSER_SNAPSHOT_NODE_LIMIT,\n\tBROWSER_STOP_LOADING_TIMEOUT_MS,\n} from './constants.js'\nimport {\n\tdecodeBase64,\n\tdecodeBrowserSnapshot,\n\tbrowserPDFToParams,\n\tbrowserScreenshotToParams,\n\tcompileScreenshotCleanupExpression,\n\tcompileScreenshotPreparationExpression,\n\treadBrowserConsoleMessage,\n\treadBrowserDownloadProgress,\n\treadBrowserDownloadStart,\n\treadBrowserFrames,\n\treadBrowserPageError,\n\trequireBrowserString,\n\tvalidateBrowserTimeout,\n} from './helpers.js'\nimport { isArray, isFiniteNumber, isInteger, isRecord, isString } from '@orkestrel/contract'\nimport { Emitter } from '@orkestrel/emitter'\n\n/**\n * A top-level browser page, including its target lifecycle and child frames.\n */\nexport class BrowserPage extends BrowserFrame implements BrowserPageInterface {\n\treadonly #client: CDPClientInterface\n\treadonly #targetId: string\n\treadonly #sessionId: string\n\treadonly #writer: ScreenshotWriterInterface | undefined\n\treadonly #contextId: string | undefined\n\treadonly #opener: BrowserPageInterface | undefined\n\treadonly #emitter: Emitter<BrowserPageEventMap>\n\treadonly #network: BrowserNetworkManager\n\treadonly #navigationManager: BrowserNavigationManager\n\treadonly #scripts: BrowserScriptManager\n\treadonly #accessibility: BrowserAccessibility\n\treadonly #diagnostics: BrowserDiagnostics\n\treadonly #clock: BrowserClock\n\treadonly #frameSessions: Map<string, Promise<string>> = new Map()\n\treadonly #frameIds: Map<string, string> = new Map()\n\treadonly #downloads: Map<string, BrowserDownload> = new Map()\n\treadonly #workers: Map<string, BrowserWorker> = new Map()\n\treadonly #popups: Map<string, BrowserPage> = new Map()\n\t#closed = false\n\t#codegen: BrowserCodegen | undefined\n\t#codegenStart: Promise<BrowserCodegen> | undefined\n\t#navigation: Promise<BrowserNavigationResult> | undefined\n\t#closing: Promise<void> | undefined\n\t#releasing: Promise<void> | undefined\n\t#loadEvents: readonly string[] = []\n\t#sameDocument = false\n\t#loadTimer: ReturnType<typeof setTimeout> | undefined\n\t#loadResolve: (() => void) | undefined\n\t#loadReject: ((error: unknown) => void) | undefined\n\t#responses: BrowserResponse[] | undefined\n\treadonly #navigationResponseHandler = this.#handleNavigationResponse.bind(this)\n\treadonly #destroyHandler = this.#handleDestroy.bind(this)\n\treadonly #loadHandler = this.#handleLoad.bind(this)\n\treadonly #frameAttachedHandler = this.#handleFrameAttached.bind(this)\n\treadonly #frameNavigatedHandler = this.#handleFrameNavigated.bind(this)\n\treadonly #frameDetachedHandler = this.#handleFrameDetached.bind(this)\n\treadonly #dialogHandler = this.#handleDialog.bind(this)\n\treadonly #chooserHandler = this.#handleChooser.bind(this)\n\treadonly #consoleHandler = this.#handleConsole.bind(this)\n\treadonly #errorHandler = this.#handleError.bind(this)\n\treadonly #crashHandler = this.#handleCrash.bind(this)\n\treadonly #downloadHandler = this.#handleDownload.bind(this)\n\treadonly #downloadProgressHandler = this.#handleDownloadProgress.bind(this)\n\treadonly #attachedHandler = this.#handleAttached.bind(this)\n\treadonly #detachedHandler = this.#handleDetached.bind(this)\n\n\tconstructor(\n\t\tclient: CDPClientInterface,\n\t\ttargetId: string,\n\t\tsessionId: string,\n\t\twriter?: ScreenshotWriterInterface,\n\t\turl?: string,\n\t\tframeId?: string,\n\t\tcontextId?: string,\n\t\topener?: BrowserPageInterface,\n\t) {\n\t\tsuper(client, sessionId, frameId ?? targetId, url ?? 'about:blank', undefined, undefined, false)\n\t\tthis.#client = client\n\t\tthis.#targetId = targetId\n\t\tthis.#sessionId = sessionId\n\t\tthis.#writer = writer\n\t\tthis.#contextId = contextId\n\t\tthis.#opener = opener\n\t\tthis.#emitter = new Emitter()\n\t\tthis.#network = new BrowserNetworkManager(this, writer)\n\t\tthis.#navigationManager = new BrowserNavigationManager(this)\n\t\tthis.#scripts = new BrowserScriptManager(this)\n\t\tthis.#accessibility = new BrowserAccessibility(this)\n\t\tthis.#diagnostics = new BrowserDiagnostics(this, writer)\n\t\tthis.#clock = new BrowserClock(this)\n\t\tthis.#network.emitter.on('request', (request) => this.#emitter.emit('request', request))\n\t\tthis.#network.emitter.on('response', (response) => this.#emitter.emit('response', response))\n\t\tthis.#network.emitter.on('failure', (failure) => this.#emitter.emit('failure', failure))\n\t\tthis.#network.emitter.on('socket', (socket) => this.#emitter.emit('socket', socket))\n\n\t\tthis.#client.subscribe('Target.targetDestroyed', this.#destroyHandler)\n\t\tthis.#client.subscribe('Target.attachedToTarget', this.#attachedHandler, this.#sessionId)\n\t\tthis.#client.subscribe('Target.detachedFromTarget', this.#detachedHandler, this.#sessionId)\n\t\tthis.#client.subscribe('Page.frameAttached', this.#frameAttachedHandler, this.#sessionId)\n\t\tthis.#client.subscribe('Page.frameNavigated', this.#frameNavigatedHandler, this.#sessionId)\n\t\tthis.#client.subscribe('Page.frameDetached', this.#frameDetachedHandler, this.#sessionId)\n\t\tthis.#client.subscribe('Page.javascriptDialogOpening', this.#dialogHandler, this.#sessionId)\n\t\tthis.#client.subscribe('Page.fileChooserOpened', this.#chooserHandler, this.#sessionId)\n\t\tthis.#client.subscribe('Runtime.consoleAPICalled', this.#consoleHandler, this.#sessionId)\n\t\tthis.#client.subscribe('Runtime.exceptionThrown', this.#errorHandler, this.#sessionId)\n\t\tthis.#client.subscribe('Inspector.targetCrashed', this.#crashHandler, this.#sessionId)\n\t\tthis.#client.subscribe('Browser.downloadWillBegin', this.#downloadHandler)\n\t\tthis.#client.subscribe('Browser.downloadProgress', this.#downloadProgressHandler)\n\t}\n\n\tget emitter(): EmitterInterface<BrowserPageEventMap> {\n\t\treturn this.#emitter\n\t}\n\n\tget network(): BrowserNetworkManagerInterface {\n\t\treturn this.#network\n\t}\n\n\tget navigation(): BrowserNavigationManagerInterface {\n\t\treturn this.#navigationManager\n\t}\n\n\tget scripts(): BrowserScriptManagerInterface {\n\t\treturn this.#scripts\n\t}\n\n\tget accessibility(): BrowserAccessibilityInterface {\n\t\treturn this.#accessibility\n\t}\n\n\tget diagnostics(): BrowserDiagnosticsInterface {\n\t\treturn this.#diagnostics\n\t}\n\n\tget clock(): BrowserClockInterface {\n\t\treturn this.#clock\n\t}\n\n\tget opener(): BrowserPageInterface | undefined {\n\t\treturn this.#opener\n\t}\n\n\tget target(): string {\n\t\treturn this.#targetId\n\t}\n\n\tget closed(): boolean {\n\t\treturn this.#closed\n\t}\n\n\tasync navigate(\n\t\turl: string,\n\t\toptions?: BrowserNavigationOptions,\n\t): Promise<BrowserNavigationResult> {\n\t\tthis.assert()\n\t\twhile (this.#navigation !== undefined) {\n\t\t\tawait this.#navigation.catch(() => undefined)\n\t\t}\n\t\tthis.assert()\n\t\tconst navigation = this.#navigate(url, options)\n\t\tthis.#navigation = navigation\n\n\t\ttry {\n\t\t\treturn await navigation\n\t\t} finally {\n\t\t\tif (this.#navigation === navigation) this.#navigation = undefined\n\t\t}\n\t}\n\n\tasync reload(options?: BrowserNavigationOptions): Promise<BrowserNavigationResult> {\n\t\tthis.assert()\n\t\twhile (this.#navigation !== undefined) {\n\t\t\tawait this.#navigation.catch(() => undefined)\n\t\t}\n\t\tthis.assert()\n\t\tconst navigation = this.#reload(options)\n\t\tthis.#navigation = navigation\n\n\t\ttry {\n\t\t\treturn await navigation\n\t\t} finally {\n\t\t\tif (this.#navigation === navigation) this.#navigation = undefined\n\t\t}\n\t}\n\n\tasync back(options?: BrowserNavigationOptions): Promise<BrowserNavigationResult> {\n\t\treturn await this.#history(-1, options)\n\t}\n\n\tasync forward(options?: BrowserNavigationOptions): Promise<BrowserNavigationResult> {\n\t\treturn await this.#history(1, options)\n\t}\n\n\tasync screenshot(options?: BrowserScreenshotOptions): Promise<BrowserScreenshotResult> {\n\t\tthis.assert()\n\t\tconst params: Record<string, unknown> = { ...browserScreenshotToParams(options) }\n\n\t\tif (options?.full === true) {\n\t\t\tconst metrics = await this.send('Page.getLayoutMetrics')\n\t\t\tconst size =\n\t\t\t\tisRecord(metrics) && isRecord(metrics['cssContentSize'])\n\t\t\t\t\t? metrics['cssContentSize']\n\t\t\t\t\t: isRecord(metrics) && isRecord(metrics['contentSize'])\n\t\t\t\t\t\t? metrics['contentSize']\n\t\t\t\t\t\t: undefined\n\t\t\tconst width = size?.['width']\n\t\t\tconst height = size?.['height']\n\t\t\tif (!isFiniteNumber(width) || width <= 0 || !isFiniteNumber(height) || height <= 0) {\n\t\t\t\tthrow new BrowserError('Browser full-page screenshot metrics are malformed')\n\t\t\t}\n\t\t\tparams['clip'] = { x: 0, y: 0, width, height, scale: 1 }\n\t\t\tparams['captureBeyondViewport'] = true\n\t\t}\n\n\t\tif (options?.scale !== undefined) {\n\t\t\tconst ratio = options.scale === 'css' ? 1 : await this.evaluate('devicePixelRatio')\n\t\t\tif (!isFiniteNumber(ratio) || ratio <= 0) {\n\t\t\t\tthrow new BrowserError('Browser screenshot device scale is malformed')\n\t\t\t}\n\t\t\tif (!isRecord(params['clip'])) {\n\t\t\t\tconst metrics = await this.send('Page.getLayoutMetrics')\n\t\t\t\tconst viewport =\n\t\t\t\t\tisRecord(metrics) && isRecord(metrics['cssVisualViewport'])\n\t\t\t\t\t\t? metrics['cssVisualViewport']\n\t\t\t\t\t\t: undefined\n\t\t\t\tif (\n\t\t\t\t\tviewport === undefined ||\n\t\t\t\t\t!isFiniteNumber(viewport['pageX']) ||\n\t\t\t\t\t!isFiniteNumber(viewport['pageY']) ||\n\t\t\t\t\t!isFiniteNumber(viewport['clientWidth']) ||\n\t\t\t\t\tviewport['clientWidth'] <= 0 ||\n\t\t\t\t\t!isFiniteNumber(viewport['clientHeight']) ||\n\t\t\t\t\tviewport['clientHeight'] <= 0\n\t\t\t\t) {\n\t\t\t\t\tthrow new BrowserError('Browser screenshot viewport metrics are malformed')\n\t\t\t\t}\n\t\t\t\tparams['clip'] = {\n\t\t\t\t\tx: viewport['pageX'],\n\t\t\t\t\ty: viewport['pageY'],\n\t\t\t\t\twidth: viewport['clientWidth'],\n\t\t\t\t\theight: viewport['clientHeight'],\n\t\t\t\t\tscale: ratio,\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tparams['clip']['scale'] = ratio\n\t\t\t}\n\t\t}\n\n\t\tlet token: string | undefined\n\t\tlet transparent = false\n\t\ttry {\n\t\t\tconst preparation = compileScreenshotPreparationExpression(options)\n\t\t\tif (preparation !== undefined) {\n\t\t\t\tconst value = await this.evaluate(preparation)\n\t\t\t\tif (!isString(value)) throw new BrowserError('Browser screenshot preparation failed')\n\t\t\t\ttoken = value\n\t\t\t}\n\t\t\tif (options?.transparent === true) {\n\t\t\t\tawait this.send('Emulation.setDefaultBackgroundColorOverride', {\n\t\t\t\t\tcolor: { r: 0, g: 0, b: 0, a: 0 },\n\t\t\t\t})\n\t\t\t\ttransparent = true\n\t\t\t}\n\t\t\tconst result = await this.send('Page.captureScreenshot', params)\n\t\t\tif (!isRecord(result) || !isString(result['data'])) {\n\t\t\t\tthrow new BrowserError('Screenshot failed: no data returned')\n\t\t\t}\n\n\t\t\tconst bytes = decodeBase64(result['data'])\n\t\t\tif (options?.path !== undefined) await this.save(options.path, bytes)\n\t\t\treturn { bytes, path: options?.path }\n\t\t} finally {\n\t\t\tif (transparent) {\n\t\t\t\tawait this.send('Emulation.setDefaultBackgroundColorOverride').catch(() => undefined)\n\t\t\t}\n\t\t\tif (token !== undefined) {\n\t\t\t\tawait this.evaluate(compileScreenshotCleanupExpression(token)).catch(() => undefined)\n\t\t\t}\n\t\t}\n\t}\n\n\tasync pdf(options?: BrowserPDFOptions): Promise<BrowserPDFResult> {\n\t\tthis.assert()\n\t\tconst result = await this.send('Page.printToPDF', browserPDFToParams(options))\n\t\tif (!isRecord(result) || !isString(result['data'])) {\n\t\t\tthrow new BrowserError('PDF failed: no data returned')\n\t\t}\n\t\tconst bytes = decodeBase64(result['data'])\n\t\tif (options?.path !== undefined) await this.save(options.path, bytes)\n\t\treturn { bytes, path: options?.path }\n\t}\n\n\toverride async save(path: string, bytes: Uint8Array): Promise<void> {\n\t\tif (this.#writer === undefined) {\n\t\t\tthrow new BrowserError('Browser page has no configured file writer', undefined, { path })\n\t\t}\n\t\tawait this.#writer.write(path, bytes)\n\t}\n\n\tasync frame(name: string): Promise<BrowserFrameInterface | undefined> {\n\t\tconst frames = await this.frames()\n\t\treturn frames.find((frame) => frame.name === name || frame.url === name)\n\t}\n\n\tasync frames(): Promise<readonly BrowserFrameInterface[]> {\n\t\tthis.assert()\n\t\tconst result = await this.send('Page.getFrameTree')\n\t\treturn readBrowserFrames(result).map((frame) => this.#frame(frame))\n\t}\n\n\tasync snapshot(options?: BrowserSnapshotOptions): Promise<BrowserSnapshotInterface> {\n\t\tthis.assert()\n\t\tconst styles = options?.styles ?? []\n\t\tconst result = await this.send('DOMSnapshot.captureSnapshot', {\n\t\t\tcomputedStyles: [...styles],\n\t\t\tincludePaintOrder: options?.paint ?? false,\n\t\t\tincludeDOMRects: options?.rects ?? false,\n\t\t})\n\t\treturn new BrowserSnapshot(\n\t\t\tdecodeBrowserSnapshot(result, styles, options?.limit ?? BROWSER_SNAPSHOT_NODE_LIMIT),\n\t\t)\n\t}\n\n\tasync codegen(options?: BrowserCodegenOptions): Promise<BrowserCodegenInterface> {\n\t\tthis.assert()\n\t\tif (this.#codegen !== undefined) return this.#codegen\n\t\tconst active = this.#codegenStart\n\t\tif (active !== undefined) return await active\n\n\t\tconst attempt = this.#startCodegen(options)\n\t\tthis.#codegenStart = attempt\n\t\ttry {\n\t\t\treturn await attempt\n\t\t} finally {\n\t\t\tif (this.#codegenStart === attempt) this.#codegenStart = undefined\n\t\t}\n\t}\n\n\tdestroy(): Promise<void> {\n\t\tconst active = this.#closing\n\t\tif (active !== undefined) return active\n\n\t\tthis.#closed = true\n\t\tconst closing = this.#destroy()\n\t\tthis.#closing = closing\n\t\treturn closing\n\t}\n\n\tclose(): Promise<void> {\n\t\tconst active = this.#closing\n\t\tif (active !== undefined) return active\n\n\t\tif (this.#closed) {\n\t\t\tconst closing = this.#release()\n\t\t\tthis.#closing = closing\n\t\t\treturn closing\n\t\t}\n\n\t\tthis.#closed = true\n\t\tconst closing = this.#close()\n\t\tthis.#closing = closing\n\t\treturn closing\n\t}\n\n\toverride assert(): void {\n\t\tsuper.assert()\n\t\tif (this.#closed) throw new BrowserError('Browser page is closed')\n\t}\n\n\tasync #navigate(\n\t\turl: string,\n\t\toptions?: BrowserNavigationOptions,\n\t): Promise<BrowserNavigationResult> {\n\t\tconst timeout = options?.timeout ?? BROWSER_DEFAULT_TIMEOUT_MS\n\t\tvalidateBrowserTimeout(timeout)\n\t\tconst watch = this.#watchNavigation()\n\t\tconst condition = options?.condition ?? 'load'\n\t\tconst wait = this.#waitForLoadEvent(condition, timeout)\n\t\tvoid wait.catch(() => undefined)\n\t\tlet loader: string | undefined\n\n\t\ttry {\n\t\t\tconst result = await this.send('Page.navigate', { url }, timeout)\n\t\t\tif (isRecord(result) && isString(result['errorText'])) {\n\t\t\t\tthrow new BrowserError(`Navigation failed: ${result['errorText']}`)\n\t\t\t}\n\t\t\tif (isRecord(result) && isString(result['loaderId'])) loader = result['loaderId']\n\t\t\tawait wait\n\t\t} catch (error) {\n\t\t\tthis.#clearNavigationWatch(watch)\n\t\t\tthis.#cancelLoad()\n\t\t\tawait this.#stopLoading(Math.min(timeout, BROWSER_STOP_LOADING_TIMEOUT_MS))\n\t\t\tthrow error\n\t\t}\n\n\t\treturn await this.#completeNavigation(watch, loader)\n\t}\n\n\tasync #reload(options?: BrowserNavigationOptions): Promise<BrowserNavigationResult> {\n\t\tconst timeout = options?.timeout ?? BROWSER_DEFAULT_TIMEOUT_MS\n\t\tvalidateBrowserTimeout(timeout)\n\t\tconst watch = this.#watchNavigation()\n\t\tconst wait = this.#waitForLoadEvent(options?.condition ?? 'load', timeout)\n\t\tvoid wait.catch(() => undefined)\n\n\t\ttry {\n\t\t\tawait this.send('Page.reload', undefined, timeout)\n\t\t\tawait wait\n\t\t} catch (error) {\n\t\t\tthis.#clearNavigationWatch(watch)\n\t\t\tthis.#cancelLoad()\n\t\t\tawait this.#stopLoading(Math.min(timeout, BROWSER_STOP_LOADING_TIMEOUT_MS))\n\t\t\tthrow error\n\t\t}\n\n\t\treturn await this.#completeNavigation(watch)\n\t}\n\n\tasync #history(\n\t\toffset: -1 | 1,\n\t\toptions?: BrowserNavigationOptions,\n\t): Promise<BrowserNavigationResult> {\n\t\tthis.assert()\n\t\twhile (this.#navigation !== undefined) {\n\t\t\tawait this.#navigation.catch(() => undefined)\n\t\t}\n\t\tthis.assert()\n\t\tconst navigation = this.#navigateHistory(offset, options)\n\t\tthis.#navigation = navigation\n\n\t\ttry {\n\t\t\treturn await navigation\n\t\t} finally {\n\t\t\tif (this.#navigation === navigation) this.#navigation = undefined\n\t\t}\n\t}\n\n\tasync #navigateHistory(\n\t\toffset: -1 | 1,\n\t\toptions?: BrowserNavigationOptions,\n\t): Promise<BrowserNavigationResult> {\n\t\tconst timeout = options?.timeout ?? BROWSER_DEFAULT_TIMEOUT_MS\n\t\tvalidateBrowserTimeout(timeout)\n\t\tconst history = await this.send('Page.getNavigationHistory')\n\t\tif (!isRecord(history) || !isInteger(history['currentIndex']) || !isArray(history['entries'])) {\n\t\t\tthrow new BrowserError('Navigation history is malformed')\n\t\t}\n\t\tconst entry = history['entries'][history['currentIndex'] + offset]\n\t\tif (!isRecord(entry) || !isInteger(entry['id'])) {\n\t\t\treturn { url: this.url, response: undefined, same: false }\n\t\t}\n\n\t\tconst watch = this.#watchNavigation()\n\t\tconst wait = this.#waitForLoadEvent(options?.condition ?? 'load', timeout)\n\t\tvoid wait.catch(() => undefined)\n\t\ttry {\n\t\t\tawait this.send('Page.navigateToHistoryEntry', { entryId: entry['id'] }, timeout)\n\t\t\tawait wait\n\t\t} catch (error) {\n\t\t\tthis.#clearNavigationWatch(watch)\n\t\t\tthis.#cancelLoad()\n\t\t\tawait this.#stopLoading(Math.min(timeout, BROWSER_STOP_LOADING_TIMEOUT_MS))\n\t\t\tthrow error\n\t\t}\n\n\t\treturn await this.#completeNavigation(watch)\n\t}\n\n\t#watchNavigation(): BrowserNavigationWatch {\n\t\tconst responses: BrowserResponse[] = []\n\t\tthis.#responses = responses\n\t\tthis.#network.emitter.on('response', this.#navigationResponseHandler)\n\t\treturn { responses }\n\t}\n\n\t#clearNavigationWatch(watch: BrowserNavigationWatch): void {\n\t\tthis.#network.emitter.off('response', this.#navigationResponseHandler)\n\t\tif (this.#responses === watch.responses) this.#responses = undefined\n\t}\n\n\t#navigationResult(\n\t\twatch: BrowserNavigationWatch,\n\t\turl: string,\n\t\tloader?: string,\n\t): BrowserNavigationResult {\n\t\tthis.#clearNavigationWatch(watch)\n\t\tconst response =\n\t\t\tloader === undefined\n\t\t\t\t? watch.responses.findLast((candidate) => candidate.url === url)\n\t\t\t\t: watch.responses.findLast((candidate) => candidate.loader === loader)\n\t\treturn {\n\t\t\turl,\n\t\t\tresponse,\n\t\t\tsame: this.#sameDocument,\n\t\t}\n\t}\n\n\tasync #completeNavigation(\n\t\twatch: BrowserNavigationWatch,\n\t\tloader?: string,\n\t): Promise<BrowserNavigationResult> {\n\t\ttry {\n\t\t\tconst currentUrl = await this.evaluate('location.href')\n\t\t\tconst resolved = requireBrowserString(currentUrl, 'Navigation URL')\n\t\t\tthis.update(resolved)\n\t\t\treturn this.#navigationResult(watch, resolved, loader)\n\t\t} catch (error) {\n\t\t\tthis.#clearNavigationWatch(watch)\n\t\t\tthrow error\n\t\t}\n\t}\n\n\tasync #startCodegen(options?: BrowserCodegenOptions): Promise<BrowserCodegen> {\n\t\tconst codegen = new BrowserCodegen(this.#client, this.#sessionId, options)\n\t\tawait codegen.start()\n\t\tif (this.#closed) {\n\t\t\tawait codegen.destroy()\n\t\t\tthrow new BrowserError('Browser page is closed')\n\t\t}\n\t\tthis.#codegen = codegen\n\t\treturn codegen\n\t}\n\n\tasync #destroy(): Promise<void> {\n\t\tawait this.#release()\n\t\ttry {\n\t\t\tawait this.#client.send('Target.detachFromTarget', { sessionId: this.#sessionId })\n\t\t} catch {\n\t\t\t// The session may already be detached.\n\t\t}\n\t}\n\n\tasync #close(): Promise<void> {\n\t\tawait this.#release()\n\t\ttry {\n\t\t\tawait this.#client.send('Target.closeTarget', { targetId: this.#targetId })\n\t\t} catch {\n\t\t\t// The target may already be closed.\n\t\t}\n\t}\n\n\t#release(): Promise<void> {\n\t\tconst active = this.#releasing\n\t\tif (active !== undefined) return active\n\t\tconst release = this.#releaseResources()\n\t\tthis.#releasing = release\n\t\treturn release\n\t}\n\n\tasync #releaseResources(): Promise<void> {\n\t\tthis.#cancelLoad()\n\t\tawait this.#codegenStart?.catch(() => undefined)\n\t\tawait this.#scripts.destroy().catch(() => undefined)\n\t\tawait this.#diagnostics.destroy().catch(() => undefined)\n\t\tawait this.#clock.uninstall().catch(() => undefined)\n\t\tawait this.#network.destroy().catch(() => undefined)\n\n\t\tif (this.#codegen !== undefined) {\n\t\t\ttry {\n\t\t\t\tawait this.#codegen.destroy()\n\t\t\t} catch {\n\t\t\t\t// The recorder's session may already be unavailable.\n\t\t\t}\n\t\t\tthis.#codegen = undefined\n\t\t}\n\n\t\tthis.#frameSessions.clear()\n\t\tthis.#frameIds.clear()\n\t\tfor (const worker of this.#workers.values()) worker.detach()\n\t\tthis.#workers.clear()\n\t\tthis.#popups.clear()\n\t\tthis.#downloads.clear()\n\t\tthis.#client.unsubscribe('Target.targetDestroyed', this.#destroyHandler)\n\t\tthis.#client.unsubscribe('Target.attachedToTarget', this.#attachedHandler, this.#sessionId)\n\t\tthis.#client.unsubscribe('Target.detachedFromTarget', this.#detachedHandler, this.#sessionId)\n\t\tthis.#client.unsubscribe('Page.frameAttached', this.#frameAttachedHandler, this.#sessionId)\n\t\tthis.#client.unsubscribe('Page.frameNavigated', this.#frameNavigatedHandler, this.#sessionId)\n\t\tthis.#client.unsubscribe('Page.frameDetached', this.#frameDetachedHandler, this.#sessionId)\n\t\tthis.#client.unsubscribe('Page.javascriptDialogOpening', this.#dialogHandler, this.#sessionId)\n\t\tthis.#client.unsubscribe('Page.fileChooserOpened', this.#chooserHandler, this.#sessionId)\n\t\tthis.#client.unsubscribe('Runtime.consoleAPICalled', this.#consoleHandler, this.#sessionId)\n\t\tthis.#client.unsubscribe('Runtime.exceptionThrown', this.#errorHandler, this.#sessionId)\n\t\tthis.#client.unsubscribe('Inspector.targetCrashed', this.#crashHandler, this.#sessionId)\n\t\tthis.#client.unsubscribe('Browser.downloadWillBegin', this.#downloadHandler)\n\t\tthis.#client.unsubscribe('Browser.downloadProgress', this.#downloadProgressHandler)\n\t\tif (!this.#emitter.destroyed) {\n\t\t\tthis.#emitter.emit('close')\n\t\t\tthis.#emitter.destroy()\n\t\t}\n\t}\n\n\t#frame(frame: BrowserFrameInfo): BrowserFrameInterface {\n\t\treturn new BrowserFrame(\n\t\t\tthis.#client,\n\t\t\t(id) => this.#resolveFrameSession(id),\n\t\t\tframe.id,\n\t\t\tframe.url,\n\t\t\tframe.parent,\n\t\t\tframe.name,\n\t\t)\n\t}\n\n\tasync #resolveFrameSession(frame: string): Promise<string> {\n\t\tconst session = this.#frameSessions.get(frame)\n\t\treturn session === undefined ? this.#sessionId : await session\n\t}\n\n\tasync #enableFrameSession(session: string): Promise<string> {\n\t\tawait this.#client.send('Page.enable', undefined, session)\n\t\tawait this.#client.send('Runtime.enable', undefined, session)\n\t\treturn session\n\t}\n\n\tasync #attachWorker(\n\t\tsession: string,\n\t\tid: string,\n\t\turl: string,\n\t\tcategory: BrowserWorkerCategory,\n\t): Promise<void> {\n\t\ttry {\n\t\t\tawait this.#client.send('Runtime.enable', undefined, session)\n\t\t\tif (this.#closed) {\n\t\t\t\tawait this.#detachChild(session)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst worker = new BrowserWorker(this.#client, session, id, url, category)\n\t\t\tthis.#workers.set(id, worker)\n\t\t\tthis.#emitter.emit('worker', worker)\n\t\t} catch {\n\t\t\t// A worker can terminate before its session is enabled.\n\t\t\tawait this.#detachChild(session)\n\t\t}\n\t}\n\n\tasync #attachPopup(session: string, id: string, url: string): Promise<void> {\n\t\tlet popup: BrowserPage | undefined\n\t\ttry {\n\t\t\tawait this.#client.send('Page.enable', undefined, session)\n\t\t\tawait this.#client.send('Runtime.enable', undefined, session)\n\t\t\tconst result = await this.#client.send('Page.getFrameTree', undefined, session)\n\t\t\tconst frame = readBrowserFrames(result)[0]\n\t\t\tif (frame === undefined || this.#closed) {\n\t\t\t\tawait this.#detachChild(session)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tpopup = new BrowserPage(\n\t\t\t\tthis.#client,\n\t\t\t\tid,\n\t\t\t\tsession,\n\t\t\t\tthis.#writer,\n\t\t\t\turl,\n\t\t\t\tframe.id,\n\t\t\t\tthis.#contextId,\n\t\t\t\tthis,\n\t\t\t)\n\t\t\tawait popup.send('Target.setAutoAttach', {\n\t\t\t\tautoAttach: true,\n\t\t\t\twaitForDebuggerOnStart: false,\n\t\t\t\tflatten: true,\n\t\t\t})\n\t\t\tawait popup.send('Page.setInterceptFileChooserDialog', { enabled: true })\n\t\t\tawait popup.network.start()\n\t\t\tif (this.#closed) {\n\t\t\t\tawait popup.destroy()\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.#popups.set(id, popup)\n\t\t\tthis.#emitter.emit('popup', popup)\n\t\t} catch {\n\t\t\t// A popup can close before its session initialization completes.\n\t\t\tif (popup !== undefined) await popup.destroy()\n\t\t\telse await this.#detachChild(session)\n\t\t}\n\t}\n\n\tasync #detachChild(session: string): Promise<void> {\n\t\tawait this.#client\n\t\t\t.send('Target.detachFromTarget', { sessionId: session })\n\t\t\t.catch(() => undefined)\n\t}\n\n\tasync #stopLoading(timeout: number): Promise<void> {\n\t\ttry {\n\t\t\tawait this.send('Page.stopLoading', undefined, timeout)\n\t\t} catch {\n\t\t\t// Best-effort only — the original navigation error wins.\n\t\t}\n\t}\n\n\t#handleNavigationResponse(response: BrowserResponse): void {\n\t\tif (response.frame === this.id) this.#responses?.push(response)\n\t}\n\n\t#handleDestroy(params: Readonly<Record<string, unknown>>): void {\n\t\tif (!isString(params['targetId']) || params['targetId'] !== this.#targetId) return\n\t\tthis.#closed = true\n\t\tvoid this.#release().catch(() => undefined)\n\t}\n\n\t#handleLoad(params: Readonly<Record<string, unknown>>): void {\n\t\tif (this.#loadEvents.includes('Page.navigatedWithinDocument')) {\n\t\t\tconst frame = params['frameId']\n\t\t\tif (isString(frame) && frame === this.id) {\n\t\t\t\tthis.#sameDocument = true\n\t\t\t\tthis.#resolveLoad()\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t\tif (this.#loadEvents.includes('Page.frameNavigated')) {\n\t\t\tconst frame = params['frame']\n\t\t\tif (isRecord(frame) && frame['id'] === this.id) this.#resolveLoad()\n\t\t\treturn\n\t\t}\n\t\tif (\n\t\t\tthis.#loadEvents.includes('Page.loadEventFired') ||\n\t\t\tthis.#loadEvents.includes('Page.domContentEventFired')\n\t\t) {\n\t\t\tthis.#resolveLoad()\n\t\t}\n\t}\n\n\t#handleFrameAttached(params: Readonly<Record<string, unknown>>): void {\n\t\tconst frame = params['frameId']\n\t\tconst parent = params['parentFrameId']\n\t\tif (!isString(frame)) return\n\t\tthis.#emitter.emit(\n\t\t\t'attach',\n\t\t\tnew BrowserFrame(\n\t\t\t\tthis.#client,\n\t\t\t\t(id) => this.#resolveFrameSession(id),\n\t\t\t\tframe,\n\t\t\t\t'about:blank',\n\t\t\t\tisString(parent) ? parent : undefined,\n\t\t\t),\n\t\t)\n\t}\n\n\t#handleFrameNavigated(params: Readonly<Record<string, unknown>>): void {\n\t\tconst frame = params['frame']\n\t\tif (!isRecord(frame) || !isString(frame['id']) || !isString(frame['url'])) return\n\t\tif (frame['id'] === this.id) {\n\t\t\tthis.update(frame['url'])\n\t\t\tthis.#emitter.emit('navigate', frame['url'])\n\t\t}\n\t}\n\n\t#handleFrameDetached(params: Readonly<Record<string, unknown>>): void {\n\t\tconst frame = params['frameId']\n\t\tif (!isString(frame)) return\n\t\tthis.#frameSessions.delete(frame)\n\t\tthis.#emitter.emit('detach', frame)\n\t}\n\n\t#handleDialog(params: Readonly<Record<string, unknown>>): void {\n\t\tconst category = params['type']\n\t\tif (\n\t\t\t(category !== 'alert' &&\n\t\t\t\tcategory !== 'confirm' &&\n\t\t\t\tcategory !== 'prompt' &&\n\t\t\t\tcategory !== 'beforeunload') ||\n\t\t\t!isString(params['message'])\n\t\t) {\n\t\t\treturn\n\t\t}\n\t\tthis.#emitter.emit(\n\t\t\t'dialog',\n\t\t\tnew BrowserDialog(\n\t\t\t\tthis,\n\t\t\t\tcategory,\n\t\t\t\tparams['message'],\n\t\t\t\tisString(params['defaultPrompt']) ? params['defaultPrompt'] : '',\n\t\t\t),\n\t\t)\n\t}\n\n\t#handleChooser(params: Readonly<Record<string, unknown>>): void {\n\t\tconst backend = params['backendNodeId']\n\t\tconst mode = params['mode']\n\t\tif (!isInteger(backend)) return\n\t\tthis.#emitter.emit('chooser', new BrowserFileChooser(this, backend, mode === 'selectMultiple'))\n\t}\n\n\t#handleConsole(params: Readonly<Record<string, unknown>>): void {\n\t\tconst message = readBrowserConsoleMessage(params)\n\t\tif (message !== undefined) this.#emitter.emit('console', message)\n\t}\n\n\t#handleError(params: Readonly<Record<string, unknown>>): void {\n\t\tconst error = readBrowserPageError(params)\n\t\tif (error !== undefined) this.#emitter.emit('error', error)\n\t}\n\n\t#handleCrash(): void {\n\t\tthis.#emitter.emit('crash')\n\t}\n\n\t#handleDownload(params: Readonly<Record<string, unknown>>): void {\n\t\tconst start = readBrowserDownloadStart(params)\n\t\tif (start === undefined || (start.frame !== this.id && !this.#frameSessions.has(start.frame))) {\n\t\t\treturn\n\t\t}\n\t\tconst download = new BrowserDownload(\n\t\t\tthis.#client,\n\t\t\tstart.id,\n\t\t\tstart.url,\n\t\t\tstart.name,\n\t\t\tthis.#contextId,\n\t\t)\n\t\tthis.#downloads.set(start.id, download)\n\t\tthis.#emitter.emit('download', download)\n\t}\n\n\t#handleDownloadProgress(params: Readonly<Record<string, unknown>>): void {\n\t\tconst decoded = readBrowserDownloadProgress(params)\n\t\tif (decoded === undefined) return\n\t\tconst [id, progress] = decoded\n\t\tconst download = this.#downloads.get(id)\n\t\tif (download === undefined) return\n\t\tdownload.update(progress)\n\t\tif (progress.status !== 'pending') this.#downloads.delete(id)\n\t}\n\n\t#handleAttached(params: Readonly<Record<string, unknown>>): void {\n\t\tconst target = params['targetInfo']\n\t\tconst session = params['sessionId']\n\t\tif (!isRecord(target) || !isString(target['targetId']) || !isString(session)) {\n\t\t\treturn\n\t\t}\n\n\t\tconst category = target['type']\n\t\tif (category === 'worker' || category === 'service_worker' || category === 'shared_worker') {\n\t\t\tvoid this.#attachWorker(\n\t\t\t\tsession,\n\t\t\t\ttarget['targetId'],\n\t\t\t\tisString(target['url']) ? target['url'] : '',\n\t\t\t\tcategory,\n\t\t\t)\n\t\t\treturn\n\t\t}\n\t\tif (category === 'page') {\n\t\t\tvoid this.#attachPopup(\n\t\t\t\tsession,\n\t\t\t\ttarget['targetId'],\n\t\t\t\tisString(target['url']) ? target['url'] : 'about:blank',\n\t\t\t)\n\t\t\treturn\n\t\t}\n\t\tif (category !== 'iframe') return\n\n\t\tconst frame = target['targetId']\n\t\tconst attempt = this.#enableFrameSession(session)\n\t\tthis.#frameSessions.set(frame, attempt)\n\t\tthis.#frameIds.set(session, frame)\n\t\tvoid attempt.catch(() => {\n\t\t\tif (this.#frameSessions.get(frame) === attempt) this.#frameSessions.delete(frame)\n\t\t\tif (this.#frameIds.get(session) === frame) this.#frameIds.delete(session)\n\t\t\tvoid this.#detachChild(session)\n\t\t})\n\t}\n\n\t#handleDetached(params: Readonly<Record<string, unknown>>): void {\n\t\tconst session = params['sessionId']\n\t\tconst target = params['targetId']\n\t\tif (isString(target)) {\n\t\t\tconst worker = this.#workers.get(target)\n\t\t\tif (worker !== undefined) {\n\t\t\t\tworker.detach()\n\t\t\t\tthis.#workers.delete(target)\n\t\t\t}\n\t\t\tconst popup = this.#popups.get(target)\n\t\t\tif (popup !== undefined) {\n\t\t\t\tthis.#popups.delete(target)\n\t\t\t\tvoid popup.destroy().catch(() => undefined)\n\t\t\t}\n\t\t}\n\t\tconst frame = isString(target)\n\t\t\t? target\n\t\t\t: isString(session)\n\t\t\t\t? this.#frameIds.get(session)\n\t\t\t\t: undefined\n\t\tif (frame !== undefined) this.#frameSessions.delete(frame)\n\t\tif (isString(session)) this.#frameIds.delete(session)\n\t}\n\n\t#waitForLoadEvent(condition: BrowserWaitUntil, timeout: number): Promise<void> {\n\t\tconst eventName =\n\t\t\tcondition === 'commit'\n\t\t\t\t? 'Page.frameNavigated'\n\t\t\t\t: condition === 'domcontentloaded'\n\t\t\t\t\t? 'Page.domContentEventFired'\n\t\t\t\t\t: 'Page.loadEventFired'\n\t\tconst deferred = Promise.withResolvers<void>()\n\t\tthis.#sameDocument = false\n\t\tthis.#loadEvents = [eventName, 'Page.navigatedWithinDocument']\n\t\tthis.#loadResolve = deferred.resolve\n\t\tthis.#loadReject = deferred.reject\n\t\tthis.#loadTimer = setTimeout(() => {\n\t\t\tthis.#rejectLoad(new BrowserError(`Navigation timeout after ${timeout}ms`))\n\t\t}, timeout)\n\t\tfor (const event of this.#loadEvents) {\n\t\t\tthis.#client.subscribe(event, this.#loadHandler, this.#sessionId)\n\t\t}\n\t\treturn deferred.promise\n\t}\n\n\t#resolveLoad(): void {\n\t\tconst resolve = this.#loadResolve\n\t\tthis.#clearLoad()\n\t\tresolve?.()\n\t}\n\n\t#rejectLoad(error: unknown): void {\n\t\tconst reject = this.#loadReject\n\t\tthis.#clearLoad()\n\t\treject?.(error)\n\t}\n\n\t#cancelLoad(): void {\n\t\tthis.#rejectLoad(new BrowserError('Navigation cancelled'))\n\t}\n\n\t#clearLoad(): void {\n\t\tif (this.#loadTimer !== undefined) clearTimeout(this.#loadTimer)\n\t\tfor (const event of this.#loadEvents) {\n\t\t\tthis.#client.unsubscribe(event, this.#loadHandler, this.#sessionId)\n\t\t}\n\t\tthis.#loadEvents = []\n\t\tthis.#loadTimer = undefined\n\t\tthis.#loadResolve = undefined\n\t\tthis.#loadReject = undefined\n\t}\n}\n","import type { BrowserPermissionManagerInterface, CDPClientInterface } from './types.js'\n\n/**\n * Permission overrides isolated to one browser context.\n */\nexport class BrowserPermissionManager implements BrowserPermissionManagerInterface {\n\treadonly #client: CDPClientInterface\n\treadonly #context: string | undefined\n\n\tconstructor(client: CDPClientInterface, context?: string) {\n\t\tthis.#client = client\n\t\tthis.#context = context\n\t}\n\n\tasync grant(permissions: readonly string[], origin?: string): Promise<void> {\n\t\tawait this.#set(permissions, 'granted', origin)\n\t}\n\n\tasync deny(permissions: readonly string[], origin?: string): Promise<void> {\n\t\tawait this.#set(permissions, 'denied', origin)\n\t}\n\n\tasync clear(): Promise<void> {\n\t\tconst params: Record<string, unknown> = {}\n\t\tif (this.#context !== undefined) params['browserContextId'] = this.#context\n\t\tawait this.#client.send('Browser.resetPermissions', params)\n\t}\n\n\tasync #set(\n\t\tpermissions: readonly string[],\n\t\tsetting: 'granted' | 'denied',\n\t\torigin?: string,\n\t): Promise<void> {\n\t\tfor (const name of permissions) {\n\t\t\tconst params: Record<string, unknown> = {\n\t\t\t\tpermission: { name },\n\t\t\t\tsetting,\n\t\t\t}\n\t\t\tif (origin !== undefined) params['origin'] = origin\n\t\t\tif (this.#context !== undefined) params['browserContextId'] = this.#context\n\t\t\tawait this.#client.send('Browser.setPermission', params)\n\t\t}\n\t}\n}\n","import type {\n\tBrowserCookieInput,\n\tBrowserCookieManagerInterface,\n\tBrowserPageInterface,\n\tBrowserStorageManagerInterface,\n\tBrowserStorageOptions,\n\tBrowserStorageOrigin,\n\tBrowserStorageState,\n} from './types.js'\nimport {\n\tcompileStorageClearExpression,\n\tcompileStorageReadExpression,\n\tcompileStorageRestoreExpression,\n\treadBrowserStorageOrigin,\n} from './helpers.js'\nimport { BrowserError } from './errors.js'\nimport { attempt } from '@orkestrel/contract'\n\n/**\n * Portable cookie and web-storage state for one browser context.\n */\nexport class BrowserStorageManager implements BrowserStorageManagerInterface {\n\treadonly #cookies: BrowserCookieManagerInterface\n\treadonly #pages: () => readonly BrowserPageInterface[]\n\n\tconstructor(\n\t\tcookies: BrowserCookieManagerInterface,\n\t\tpages: () => readonly BrowserPageInterface[],\n\t) {\n\t\tthis.#cookies = cookies\n\t\tthis.#pages = pages\n\t}\n\n\tasync state(options?: BrowserStorageOptions): Promise<BrowserStorageState> {\n\t\tconst pages = this.#pages()\n\t\tconst requested = options?.origins\n\t\tconst origins =\n\t\t\trequested === undefined\n\t\t\t\t? [\n\t\t\t\t\t\t...new Set(\n\t\t\t\t\t\t\tpages.map((page) => this.#origin(page.url)).filter((origin) => origin !== undefined),\n\t\t\t\t\t\t),\n\t\t\t\t\t]\n\t\t\t\t: [...new Set(requested.map((origin) => this.#validate(origin)))]\n\t\tconst storage: BrowserStorageOrigin[] = []\n\n\t\tfor (const origin of origins) {\n\t\t\tconst page = pages.find((candidate) => this.#origin(candidate.url) === origin)\n\t\t\tif (page === undefined) {\n\t\t\t\tthrow new BrowserError('Storage origin has no attached page', undefined, { origin })\n\t\t\t}\n\t\t\tstorage.push(\n\t\t\t\treadBrowserStorageOrigin(await page.evaluate(compileStorageReadExpression()), origin),\n\t\t\t)\n\t\t}\n\n\t\tconst cookies: BrowserCookieInput[] = (await this.#cookies.list()).map((cookie) => ({\n\t\t\tname: cookie.name,\n\t\t\tvalue: cookie.value,\n\t\t\tdomain: cookie.domain,\n\t\t\tpath: cookie.path,\n\t\t\texpires: cookie.expires,\n\t\t\thttp: cookie.http,\n\t\t\tsecure: cookie.secure,\n\t\t\t...(cookie.site !== undefined ? { site: cookie.site } : {}),\n\t\t\t...(cookie.partition !== undefined ? { partition: cookie.partition } : {}),\n\t\t}))\n\t\treturn { cookies, origins: storage }\n\t}\n\n\tasync restore(state: BrowserStorageState): Promise<void> {\n\t\tconst pages = this.#pages()\n\t\tfor (const origin of state.origins) {\n\t\t\tconst normalized = this.#validate(origin.origin)\n\t\t\tconst page = pages.find((candidate) => this.#origin(candidate.url) === normalized)\n\t\t\tif (page === undefined) {\n\t\t\t\tthrow new BrowserError('Storage origin has no attached page', undefined, {\n\t\t\t\t\torigin: normalized,\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t\tawait this.#cookies.set(state.cookies)\n\t\tfor (const origin of state.origins) {\n\t\t\tconst normalized = this.#validate(origin.origin)\n\t\t\tconst page = pages.find((candidate) => this.#origin(candidate.url) === normalized)\n\t\t\tif (page === undefined) {\n\t\t\t\tthrow new BrowserError('Storage origin disappeared during restore', undefined, {\n\t\t\t\t\torigin: normalized,\n\t\t\t\t})\n\t\t\t}\n\t\t\tawait page.evaluate(compileStorageRestoreExpression(origin))\n\t\t}\n\t}\n\n\tasync clear(origin?: string): Promise<void> {\n\t\tawait this.#cookies.clear()\n\t\tconst normalized = origin === undefined ? undefined : this.#validate(origin)\n\t\tfor (const page of this.#pages()) {\n\t\t\tif (normalized !== undefined && this.#origin(page.url) !== normalized) continue\n\t\t\tawait page.evaluate(compileStorageClearExpression())\n\t\t}\n\t}\n\n\t#origin(value: string): string | undefined {\n\t\tconst result = attempt(() => new URL(value))\n\t\tif (!result.success) return undefined\n\t\tif (result.value.protocol !== 'http:' && result.value.protocol !== 'https:') return undefined\n\t\treturn result.value.origin\n\t}\n\n\t#validate(value: string): string {\n\t\tconst origin = this.#origin(value)\n\t\tif (origin === undefined) {\n\t\t\tthrow new BrowserError(\n\t\t\t\t'Browser storage origin must be an absolute HTTP(S) origin',\n\t\t\t\tundefined,\n\t\t\t\t{\n\t\t\t\t\torigin: value,\n\t\t\t\t},\n\t\t\t)\n\t\t}\n\t\treturn origin\n\t}\n}\n","import type {\n\tBrowserContextEventMap,\n\tBrowserContextInterface,\n\tBrowserCookieManagerInterface,\n\tBrowserDownloadOptions,\n\tBrowserEmulationManagerInterface,\n\tBrowserEmulationOptions,\n\tBrowserPageInterface,\n\tBrowserPageOptions,\n\tBrowserPermissionManagerInterface,\n\tBrowserStorageManagerInterface,\n\tBrowserViewport,\n\tCDPClientInterface,\n\tCDPTarget,\n\tScreenshotWriterInterface,\n} from './types.js'\nimport type { EmitterInterface } from '@orkestrel/emitter'\nimport { BrowserCookieManager } from './BrowserCookieManager.js'\nimport { BrowserEmulationManager } from './BrowserEmulationManager.js'\nimport { BrowserPage } from './BrowserPage.js'\nimport { BrowserPermissionManager } from './BrowserPermissionManager.js'\nimport { BrowserStorageManager } from './BrowserStorageManager.js'\nimport { BrowserError } from './errors.js'\nimport { readBrowserFrames, validateBrowserViewport } from './helpers.js'\nimport { instanceOf, isRecord, isString } from '@orkestrel/contract'\nimport { Emitter } from '@orkestrel/emitter'\n\n// === BrowserContext\n\n/**\n * Owns pages and shared state inside one Chromium browser context.\n */\nexport class BrowserContext implements BrowserContextInterface {\n\treadonly #client: CDPClientInterface\n\treadonly #id: string | undefined\n\treadonly #viewport: BrowserViewport | undefined\n\treadonly #writer: ScreenshotWriterInterface | undefined\n\treadonly #downloads: BrowserDownloadOptions | undefined\n\treadonly #emitter: Emitter<BrowserContextEventMap>\n\treadonly #cookies: BrowserCookieManager\n\treadonly #permissions: BrowserPermissionManager\n\treadonly #storage: BrowserStorageManager\n\treadonly #emulation: BrowserEmulationManager\n\treadonly #pages: Map<string, BrowserPage> = new Map()\n\treadonly #creating: Set<Promise<BrowserPage>> = new Set()\n\t#syncing: Promise<void> | undefined\n\t#shutdown: Promise<void> | undefined\n\t#closed = false\n\n\tconstructor(\n\t\tclient: CDPClientInterface,\n\t\tid?: string,\n\t\tviewport?: BrowserViewport,\n\t\twriter?: ScreenshotWriterInterface,\n\t\temulation?: BrowserEmulationOptions,\n\t\tdownloads?: BrowserDownloadOptions,\n\t) {\n\t\tthis.#client = client\n\t\tif (viewport !== undefined) validateBrowserViewport(viewport)\n\t\tthis.#id = id\n\t\tthis.#viewport = viewport\n\t\tthis.#writer = writer\n\t\tthis.#downloads = downloads\n\t\tthis.#emitter = new Emitter()\n\t\tthis.#cookies = new BrowserCookieManager(client, id)\n\t\tthis.#permissions = new BrowserPermissionManager(client, id)\n\t\tthis.#storage = new BrowserStorageManager(this.#cookies, () => this.pages())\n\t\tthis.#emulation = new BrowserEmulationManager(() => this.pages(), emulation)\n\t}\n\n\tget emitter(): EmitterInterface<BrowserContextEventMap> {\n\t\treturn this.#emitter\n\t}\n\n\tget id(): string | undefined {\n\t\treturn this.#id\n\t}\n\n\tget cookies(): BrowserCookieManagerInterface {\n\t\treturn this.#cookies\n\t}\n\n\tget permissions(): BrowserPermissionManagerInterface {\n\t\treturn this.#permissions\n\t}\n\n\tget storage(): BrowserStorageManagerInterface {\n\t\treturn this.#storage\n\t}\n\n\tget emulation(): BrowserEmulationManagerInterface {\n\t\treturn this.#emulation\n\t}\n\n\tpage(index?: number): BrowserPageInterface | undefined {\n\t\tconst i = index ?? 0\n\t\tconst pages = [...this.#pages.values()]\n\t\treturn i >= 0 && i < pages.length ? pages[i] : undefined\n\t}\n\n\tpages(): readonly BrowserPageInterface[] {\n\t\treturn [...this.#pages.values()]\n\t}\n\n\tasync create(options?: BrowserPageOptions): Promise<BrowserPageInterface> {\n\t\tif (this.#closed) throw new BrowserError('Browser context is closed')\n\n\t\tconst attempt = this.#create(options)\n\t\tthis.#creating.add(attempt)\n\t\ttry {\n\t\t\treturn await attempt\n\t\t} finally {\n\t\t\tthis.#creating.delete(attempt)\n\t\t}\n\t}\n\n\tasync sync(targets: readonly CDPTarget[]): Promise<void> {\n\t\twhile (this.#syncing !== undefined) {\n\t\t\tawait this.#syncing\n\t\t}\n\t\tif (this.#closed) throw new BrowserError('Browser context is closed')\n\n\t\tconst attempt = this.#sync(targets)\n\t\tthis.#syncing = attempt\n\t\ttry {\n\t\t\tawait attempt\n\t\t} finally {\n\t\t\tif (this.#syncing === attempt) this.#syncing = undefined\n\t\t}\n\t}\n\n\tdestroy(): Promise<void> {\n\t\tconst active = this.#shutdown\n\t\tif (active !== undefined) return active\n\n\t\tthis.#closed = true\n\t\tconst shutdown = this.#destroyResources()\n\t\tthis.#shutdown = shutdown\n\t\treturn shutdown\n\t}\n\n\tclose(): Promise<void> {\n\t\tconst active = this.#shutdown\n\t\tif (active !== undefined) return active\n\n\t\tthis.#closed = true\n\t\tconst shutdown = this.#closeResources()\n\t\tthis.#shutdown = shutdown\n\t\treturn shutdown\n\t}\n\n\t// === Private helpers\n\n\tasync #create(options?: BrowserPageOptions): Promise<BrowserPage> {\n\t\tif (options?.viewport !== undefined) validateBrowserViewport(options.viewport)\n\t\tconst result: unknown = await this.#client.send('Target.createTarget', {\n\t\t\turl: 'about:blank',\n\t\t\t...(this.#id === undefined ? {} : { browserContextId: this.#id }),\n\t\t})\n\n\t\tif (!isRecord(result) || !isString(result['targetId'])) {\n\t\t\tthrow new BrowserError('Failed to create new browser target')\n\t\t}\n\n\t\tconst targetId = result['targetId']\n\t\tlet page: BrowserPage | undefined\n\n\t\ttry {\n\t\t\tconst viewport = options?.viewport ?? this.#viewport\n\t\t\tpage = await this.#attach(targetId, options?.url ?? 'about:blank', viewport)\n\n\t\t\tif (options?.url !== undefined && options.url !== 'about:blank') {\n\t\t\t\tawait page.navigate(options.url, {\n\t\t\t\t\t...(options.timeout !== undefined ? { timeout: options.timeout } : {}),\n\t\t\t\t})\n\t\t\t}\n\t\t\tif (this.#closed) throw new BrowserError('Browser context closed during page creation')\n\n\t\t\tthis.#pages.set(targetId, page)\n\t\t\tthis.#emitter.emit('page', page)\n\t\t\treturn page\n\t\t} catch (error) {\n\t\t\tif (page !== undefined) {\n\t\t\t\tawait page.close()\n\t\t\t} else {\n\t\t\t\tawait this.#closeTarget(targetId)\n\t\t\t}\n\t\t\tthrow error\n\t\t}\n\t}\n\n\tasync #sync(targets: readonly CDPTarget[]): Promise<void> {\n\t\tconst pageTargets = targets.filter((target) => target.type === 'page')\n\t\tconst targetIds = new Set(pageTargets.map((target) => target.id))\n\n\t\tfor (const [id, page] of this.#pages) {\n\t\t\tif (targetIds.has(id)) continue\n\t\t\tawait page.destroy()\n\t\t\tthis.#pages.delete(id)\n\t\t}\n\n\t\tfor (const target of pageTargets) {\n\t\t\tif (this.#closed || this.#pages.has(target.id)) continue\n\n\t\t\ttry {\n\t\t\t\tconst page = await this.#reattach(target.id, target.url, this.#viewport)\n\t\t\t\tif (this.#closed) {\n\t\t\t\t\tawait page.destroy()\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tthis.#pages.set(target.id, page)\n\t\t\t\tthis.#emitter.emit('page', page)\n\t\t\t} catch {\n\t\t\t\t// A disappearing or unsupported target does not invalidate its siblings.\n\t\t\t}\n\t\t}\n\t}\n\n\tasync #attach(\n\t\ttargetId: string,\n\t\turl: string,\n\t\tviewport: BrowserViewport | undefined,\n\t): Promise<BrowserPage> {\n\t\tlet sessionId: string | undefined\n\t\tlet page: BrowserPage | undefined\n\n\t\ttry {\n\t\t\tsessionId = await this.#openSession(targetId)\n\t\t\tawait this.#enableSession(sessionId)\n\t\t\tconst frameId = await this.#mainFrame(sessionId)\n\t\t\tpage = new BrowserPage(\n\t\t\t\tthis.#client,\n\t\t\t\ttargetId,\n\t\t\t\tsessionId,\n\t\t\t\tthis.#writer,\n\t\t\t\turl,\n\t\t\t\tframeId,\n\t\t\t\tthis.#id,\n\t\t\t)\n\t\t\tawait this.#configurePage(page)\n\t\t\tawait this.#emulation.attach(page)\n\t\t\tif (viewport !== undefined) await this.#applyViewport(sessionId, viewport)\n\t\t\tthis.#observe(page)\n\n\t\t\treturn page\n\t\t} catch (error) {\n\t\t\tif (page !== undefined) await page.destroy().catch(() => undefined)\n\t\t\telse if (sessionId !== undefined) await this.#detachSession(sessionId)\n\t\t\tthrow error\n\t\t}\n\t}\n\n\tasync #reattach(\n\t\ttargetId: string,\n\t\turl: string,\n\t\tviewport: BrowserViewport | undefined,\n\t): Promise<BrowserPage> {\n\t\tlet sessionId: string | undefined\n\t\tlet page: BrowserPage | undefined\n\n\t\ttry {\n\t\t\tsessionId = await this.#openSession(targetId)\n\t\t\tawait this.#enableSession(sessionId)\n\t\t\tconst frameId = await this.#mainFrame(sessionId)\n\t\t\tpage = new BrowserPage(\n\t\t\t\tthis.#client,\n\t\t\t\ttargetId,\n\t\t\t\tsessionId,\n\t\t\t\tthis.#writer,\n\t\t\t\turl,\n\t\t\t\tframeId,\n\t\t\t\tthis.#id,\n\t\t\t)\n\t\t\tawait this.#configurePage(page)\n\t\t\tawait this.#emulation.attach(page)\n\t\t\tif (viewport !== undefined) await this.#tryViewport(sessionId, viewport)\n\t\t\tthis.#observe(page)\n\n\t\t\treturn page\n\t\t} catch (error) {\n\t\t\tif (page !== undefined) await page.destroy().catch(() => undefined)\n\t\t\telse if (sessionId !== undefined) await this.#detachSession(sessionId)\n\t\t\tthrow error\n\t\t}\n\t}\n\n\tasync #destroyResources(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.#settle()\n\t\t\tlet failed = false\n\t\t\tlet failure: unknown\n\t\t\tfor (const page of this.#pages.values()) {\n\t\t\t\ttry {\n\t\t\t\t\tawait page.destroy()\n\t\t\t\t} catch (error) {\n\t\t\t\t\tif (!failed) {\n\t\t\t\t\t\tfailed = true\n\t\t\t\t\t\tfailure = error\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.#pages.clear()\n\t\t\tif (failed) throw failure\n\t\t} finally {\n\t\t\tthis.#finish()\n\t\t}\n\t}\n\n\tasync #closeResources(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.#settle()\n\t\t\tlet failed = false\n\t\t\tlet failure: unknown\n\t\t\tfor (const page of this.#pages.values()) {\n\t\t\t\ttry {\n\t\t\t\t\tawait page.close()\n\t\t\t\t} catch (error) {\n\t\t\t\t\tif (!failed) {\n\t\t\t\t\t\tfailed = true\n\t\t\t\t\t\tfailure = error\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.#pages.clear()\n\n\t\t\tif (this.#id !== undefined) {\n\t\t\t\ttry {\n\t\t\t\t\tawait this.#client.send('Target.disposeBrowserContext', {\n\t\t\t\t\t\tbrowserContextId: this.#id,\n\t\t\t\t\t})\n\t\t\t\t} catch (error) {\n\t\t\t\t\tif (!failed) {\n\t\t\t\t\t\tfailed = true\n\t\t\t\t\t\tfailure = error\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (failed) throw failure\n\t\t} finally {\n\t\t\tthis.#finish()\n\t\t}\n\t}\n\n\tasync #settle(): Promise<void> {\n\t\tawait Promise.allSettled([...this.#creating])\n\t\tawait this.#syncing?.catch(() => undefined)\n\t}\n\n\tasync #openSession(targetId: string): Promise<string> {\n\t\tconst result: unknown = await this.#client.send('Target.attachToTarget', {\n\t\t\ttargetId,\n\t\t\tflatten: true,\n\t\t})\n\t\tif (!isRecord(result) || !isString(result['sessionId'])) {\n\t\t\tthrow new BrowserError('Failed to attach to browser target')\n\t\t}\n\t\treturn result['sessionId']\n\t}\n\n\tasync #enableSession(sessionId: string): Promise<void> {\n\t\tawait this.#client.send('Page.enable', undefined, sessionId)\n\t\tawait this.#client.send('Runtime.enable', undefined, sessionId)\n\t}\n\n\tasync #mainFrame(sessionId: string): Promise<string> {\n\t\tconst result = await this.#client.send('Page.getFrameTree', undefined, sessionId)\n\t\tconst frame = readBrowserFrames(result)[0]\n\t\tif (frame === undefined) throw new BrowserError('Failed to resolve the main browser frame')\n\t\treturn frame.id\n\t}\n\n\tasync #configurePage(page: BrowserPage): Promise<void> {\n\t\tawait page.send('Target.setAutoAttach', {\n\t\t\tautoAttach: true,\n\t\t\twaitForDebuggerOnStart: false,\n\t\t\tflatten: true,\n\t\t})\n\t\tawait page.send('Page.setInterceptFileChooserDialog', { enabled: true })\n\t\tconst download: Record<string, unknown> = {\n\t\t\tbehavior:\n\t\t\t\tthis.#downloads === undefined\n\t\t\t\t\t? 'default'\n\t\t\t\t\t: this.#downloads.named === true\n\t\t\t\t\t\t? 'allowAndName'\n\t\t\t\t\t\t: 'allow',\n\t\t\teventsEnabled: true,\n\t\t}\n\t\tif (this.#id !== undefined) download['browserContextId'] = this.#id\n\t\tif (this.#downloads !== undefined) download['downloadPath'] = this.#downloads.path\n\t\tawait this.#client.send('Browser.setDownloadBehavior', download)\n\t\tawait page.network.start()\n\t}\n\n\tasync #applyViewport(sessionId: string, viewport: BrowserViewport): Promise<void> {\n\t\tawait this.#client.send(\n\t\t\t'Emulation.setDeviceMetricsOverride',\n\t\t\t{\n\t\t\t\twidth: viewport.width,\n\t\t\t\theight: viewport.height,\n\t\t\t\tdeviceScaleFactor: viewport.scale ?? 1,\n\t\t\t\tmobile: viewport.mobile ?? false,\n\t\t\t\tscreenOrientation:\n\t\t\t\t\tviewport.landscape === undefined\n\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t: {\n\t\t\t\t\t\t\t\ttype: viewport.landscape ? 'landscapePrimary' : 'portraitPrimary',\n\t\t\t\t\t\t\t\tangle: viewport.landscape ? 90 : 0,\n\t\t\t\t\t\t\t},\n\t\t\t},\n\t\t\tsessionId,\n\t\t)\n\t\tawait this.#client.send(\n\t\t\t'Emulation.setTouchEmulationEnabled',\n\t\t\t{ enabled: viewport.touch ?? false },\n\t\t\tsessionId,\n\t\t)\n\t}\n\n\tasync #tryViewport(sessionId: string, viewport: BrowserViewport): Promise<void> {\n\t\ttry {\n\t\t\tawait this.#applyViewport(sessionId, viewport)\n\t\t} catch {\n\t\t\t// Reattached targets may not support viewport emulation.\n\t\t}\n\t}\n\n\tasync #closeTarget(targetId: string): Promise<void> {\n\t\ttry {\n\t\t\tawait this.#client.send('Target.closeTarget', { targetId })\n\t\t} catch {\n\t\t\t// The target may already be gone.\n\t\t}\n\t}\n\n\tasync #detachSession(sessionId: string): Promise<void> {\n\t\ttry {\n\t\t\tawait this.#client.send('Target.detachFromTarget', { sessionId })\n\t\t} catch {\n\t\t\t// The session may already be detached.\n\t\t}\n\t}\n\n\t#observe(page: BrowserPage): void {\n\t\tpage.emitter.on('popup', (popup) => {\n\t\t\tif (this.#closed) {\n\t\t\t\tvoid popup.destroy().catch(() => undefined)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (instanceOf(BrowserPage)(popup)) {\n\t\t\t\tvoid this.#adoptPopup(popup)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.#emitter.emit('page', popup)\n\t\t})\n\t\tpage.emitter.on('close', () => {\n\t\t\tif (this.#pages.get(page.target) === page) this.#pages.delete(page.target)\n\t\t})\n\t}\n\n\tasync #adoptPopup(popup: BrowserPage): Promise<void> {\n\t\ttry {\n\t\t\tawait this.#emulation.attach(popup)\n\t\t\tif (this.#closed) {\n\t\t\t\tawait popup.destroy()\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.#pages.set(popup.target, popup)\n\t\t\tthis.#observe(popup)\n\t\t\tthis.#emitter.emit('page', popup)\n\t\t} catch {\n\t\t\tawait popup.destroy().catch(() => undefined)\n\t\t}\n\t}\n\n\t#finish(): void {\n\t\tif (this.#emitter.destroyed) return\n\t\tthis.#emitter.emit('close')\n\t\tthis.#emitter.destroy()\n\t}\n}\n","import type {\n\tBrowserSnapshotInput,\n\tBrowserSnapshotInterface,\n\tCDPClientInterface,\n\tCDPClientOptions,\n} from './types.js'\nimport { BrowserSnapshot } from './BrowserSnapshot.js'\nimport { CDPClient } from './CDPClient.js'\n\n/**\n * Create a CDP client bound to the given transport.\n *\n * @param options - The transport (and optional timeout) the client uses\n * @returns A {@link CDPClientInterface}\n *\n * @example\n * ```ts\n * import { createCDPClient } from '@src/core'\n *\n * const client = createCDPClient({ transport })\n * await client.connect()\n * ```\n */\nexport function createCDPClient(options: CDPClientOptions): CDPClientInterface {\n\treturn new CDPClient(options)\n}\n\n/**\n * Create a navigable browser snapshot from decoded serializable data.\n *\n * @param input - Captured documents and computed-style names\n * @returns A {@link BrowserSnapshotInterface}\n *\n * @example\n * ```ts\n * import { createBrowserSnapshot, decodeBrowserSnapshot } from '@src/core'\n *\n * const snapshot = createBrowserSnapshot(decodeBrowserSnapshot(captured, ['display']))\n * snapshot.find({ name: 'main' })\n * ```\n */\nexport function createBrowserSnapshot(input: BrowserSnapshotInput): BrowserSnapshotInterface {\n\treturn new BrowserSnapshot(input)\n}\n"],"mappings":"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"}