effect-browser 0.2.0-beta.7 → 0.2.0-beta.9

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.
Files changed (68) hide show
  1. package/README.md +504 -152
  2. package/dist/Browser-BF9_sORP.d.mts +388 -0
  3. package/dist/Browser.d.mts +3 -200
  4. package/dist/Browser.mjs +9 -1
  5. package/dist/Browser.mjs.map +1 -1
  6. package/dist/{BrowserData-KHk4o__c.d.mts → BrowserData-CPIIIHol.d.mts} +81 -7
  7. package/dist/BrowserData.d.mts +2 -2
  8. package/dist/BrowserData.mjs +104 -6
  9. package/dist/BrowserData.mjs.map +1 -1
  10. package/dist/{BrowserRuntime-hxkTNlRa.d.mts → BrowserRuntime-B6nT1G4X.d.mts} +16 -11
  11. package/dist/{BrowserRuntime-Cr76CN4I.mjs → BrowserRuntime-C1r2aSRK.mjs} +5065 -4305
  12. package/dist/BrowserRuntime-C1r2aSRK.mjs.map +1 -0
  13. package/dist/BrowserRuntime.d.mts +2 -2
  14. package/dist/BrowserRuntime.mjs +2 -1
  15. package/dist/Capture.d.mts +9 -7
  16. package/dist/Capture.mjs +157 -32
  17. package/dist/Capture.mjs.map +1 -1
  18. package/dist/{CaptureData-Dys0Ko9d.mjs → CaptureData-CYriZHX1.mjs} +25 -6
  19. package/dist/CaptureData-CYriZHX1.mjs.map +1 -0
  20. package/dist/CaptureData.d.mts +62 -3
  21. package/dist/CaptureData.mjs +2 -2
  22. package/dist/Chromium.d.mts +2 -2
  23. package/dist/Chromium.mjs +19 -10
  24. package/dist/Chromium.mjs.map +1 -1
  25. package/dist/Errors.d.mts +66 -17
  26. package/dist/Errors.mjs +47 -5
  27. package/dist/Errors.mjs.map +1 -1
  28. package/dist/Images-yCG9BmRU.mjs +76 -0
  29. package/dist/Images-yCG9BmRU.mjs.map +1 -0
  30. package/dist/OperationOptions-DAeRS6O9.mjs +55 -0
  31. package/dist/OperationOptions-DAeRS6O9.mjs.map +1 -0
  32. package/dist/PageControl.d.mts +6 -6
  33. package/dist/PageControl.mjs +16 -10
  34. package/dist/PageControl.mjs.map +1 -1
  35. package/dist/PageRegistry-B3q9DS3g.mjs +164 -0
  36. package/dist/PageRegistry-B3q9DS3g.mjs.map +1 -0
  37. package/dist/Plan-Dyxu2q8C.mjs +543 -0
  38. package/dist/Plan-Dyxu2q8C.mjs.map +1 -0
  39. package/dist/Plan.d.mts +3 -0
  40. package/dist/Plan.mjs +2 -0
  41. package/dist/PlanData-B668RxbQ.d.mts +4831 -0
  42. package/dist/PlanData.d.mts +3 -0
  43. package/dist/PlanData.mjs +268 -0
  44. package/dist/PlanData.mjs.map +1 -0
  45. package/dist/PlanInput-BJcPPncs.mjs +75 -0
  46. package/dist/PlanInput-BJcPPncs.mjs.map +1 -0
  47. package/dist/PublicSession-DCSMMqOj.mjs +5602 -0
  48. package/dist/PublicSession-DCSMMqOj.mjs.map +1 -0
  49. package/dist/Testing.d.mts +48 -6
  50. package/dist/Testing.mjs +651 -113
  51. package/dist/Testing.mjs.map +1 -1
  52. package/dist/Timeline-fV22Xk-S.d.mts +29 -0
  53. package/dist/Timeline.d.mts +4 -0
  54. package/dist/Timeline.mjs +20 -0
  55. package/dist/Timeline.mjs.map +1 -0
  56. package/dist/TimelineData-BsOn-YGZ.d.mts +3818 -0
  57. package/dist/TimelineData.d.mts +3 -0
  58. package/dist/TimelineData.mjs +482 -0
  59. package/dist/TimelineData.mjs.map +1 -0
  60. package/dist/index.d.mts +5 -1
  61. package/dist/index.mjs +5 -1
  62. package/package.json +18 -2
  63. package/dist/Association-CH3kPHXE.mjs +0 -167
  64. package/dist/Association-CH3kPHXE.mjs.map +0 -1
  65. package/dist/BrowserRuntime-Cr76CN4I.mjs.map +0 -1
  66. package/dist/CaptureData-Dys0Ko9d.mjs.map +0 -1
  67. package/dist/PageControlAssociation-DabEg5AR.mjs +0 -10
  68. package/dist/PageControlAssociation-DabEg5AR.mjs.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BrowserRuntime-C1r2aSRK.mjs","names":["Registration.snapshot","Trace.capture","Registration.invoke","Trace.span","Trace.autonomous","invoke","keySchedule","moveSchedule","pointerSchedule","scroll","scrollSchedule","Bootstrap.empty","Trace.span"],"sources":["../src/internal/browser/Binding.ts","../src/internal/browser/BindingRunner.ts","../src/internal/browser/Bootstrap.ts","../src/internal/browser/Bindings.ts","../src/internal/browser/NativeAttempt.ts","../src/internal/browser/ElementAccess.ts","../src/internal/browser/Keyboard.ts","../src/internal/browser/Descriptor.ts","../src/internal/browser/PageRead.ts","../src/internal/browser/Observation.ts","../src/internal/browser/Pointer.ts","../src/internal/browser/Settled.ts","../src/internal/browser/Actions.ts","../src/internal/browser/CallbackTasks.ts","../src/internal/browser/CaptureSource.ts","../src/internal/browser/NativeBindings.ts","../src/internal/browser/Initialization.ts","../src/internal/browser/PageExecution.ts","../src/internal/browser/NativePageControl.ts","../src/internal/browser/PolicyCleanup.ts","../src/internal/browser/Targets.ts","../src/internal/browser/Playwright.ts","../src/BrowserRuntime.ts"],"sourcesContent":["import type { Effect } from \"effect\";\n\nimport type { BrowserError, InitializationError } from \"../../Errors.ts\";\nimport type { Driver, DriverEvents, DriverOptions } from \"./Driver.ts\";\n\n/**\n * Random values the owner draws from its `Crypto` service for one connection attempt. A native\n * engine has no randomness of its own.\n */\nexport interface ConnectionIdentity {\n /** Scopes the page, frame, observation and suspension ids this connection reports. */\n readonly namespace: string;\n /** Names the native binding channel's page globals. Never reported, so no page can claim them first. */\n readonly bindings: string;\n}\n\n/** What the owner asks of a native engine for one connection attempt. */\nexport interface ConnectRequest {\n /** The provider-issued connection address, unvalidated. */\n readonly connection: unknown;\n readonly identity: ConnectionIdentity;\n readonly options: DriverOptions;\n readonly events: DriverEvents;\n /** A connection that completes after the attempt was interrupted is disposed through this. */\n readonly onAbandoned: () => void;\n /** Called once the native attempt settles, whether or not anyone still waits for it. */\n readonly onSettled: () => void;\n}\n\nexport interface BindingImplementation {\n readonly connect: (\n request: ConnectRequest,\n ) => Effect.Effect<Driver, BrowserError | InitializationError>;\n}\n\n/**\n * Binding identity is issuance, never shape: a value that merely looks like a binding has no\n * entry here and cannot reach the owner, so only this package's constructors supply an engine.\n */\nconst issued = new WeakMap<object, BindingImplementation>();\n\nexport const issueBinding = <B extends object>(\n binding: B,\n implementation: BindingImplementation,\n) => {\n issued.set(binding, implementation);\n\n return Object.freeze(binding);\n};\n\nexport const bindingImplementation = (binding: object): BindingImplementation | undefined =>\n issued.get(binding);\n","import { Effect, Exit, type Fiber, FiberSet, Scope } from \"effect\";\n\nimport type { CallbackFailureMode } from \"./CallbackTasks.ts\";\nimport type { DriverFault } from \"./Driver.ts\";\nimport { exitPromise } from \"./NativeCalls.ts\";\n\nexport type BindingRejection = \"closed\" | \"capacity\";\n\nexport type BindingAdmission<A, E> =\n | { readonly _tag: \"Rejected\"; readonly reason: BindingRejection }\n | { readonly _tag: \"Accepted\"; readonly result: Promise<Exit.Exit<A, E>> };\n\n/**\n * Scoped host runner for future page-callable bindings. Admission is synchronous and finite:\n * no Fiber exists until a slot has been reserved. The owning Scope interrupts accepted work;\n * consumer failures remain in an Exit on the host and are never page reply material here.\n */\nexport interface BindingRunner<I, A, E> {\n /** Fence new callbacks synchronously; the owning Scope still owns accepted work. */\n readonly close: () => void;\n /** Native owner faults request cancellation immediately; the Scope still joins every fiber. */\n readonly interrupt: () => void;\n /** Revoke selected accepted work without closing admission for other inputs. */\n readonly interruptWhere: (predicate: (input: I) => boolean) => void;\n readonly submit: (input: I, failureMode?: CallbackFailureMode) => BindingAdmission<A, E>;\n}\n\nexport const makeBindingRunner = <I, A, E, R>(\n capacity: number,\n handle: (input: I) => Effect.Effect<A, E, R>,\n onFault: (event: Extract<DriverFault, { readonly source: \"binding\" }>) => void,\n): Effect.Effect<BindingRunner<I, A, E>, never, R | Scope.Scope> => {\n if (!Number.isSafeInteger(capacity) || capacity < 1)\n throw new RangeError(\"Invalid binding callback capacity\");\n\n return Effect.gen(function* () {\n const parent = yield* Scope.Scope;\n // Do not depend on an application's ambient finalizer strategy for callback ordering.\n // One private sequential child owns both FiberSet and the admission fence.\n const runtimeScope = yield* Scope.fork(parent, \"sequential\");\n\n const fibers = yield* FiberSet.make<Exit.Exit<A, E>, never>().pipe(Scope.provide(runtimeScope));\n const run = yield* FiberSet.runtime(fibers)<R>();\n const inputs = new Map<Fiber.Fiber<Exit.Exit<A, E>, never>, I>();\n\n let accepting = true;\n let faulted = false;\n let inFlight = 0;\n\n const close = () => {\n accepting = false;\n };\n\n const interrupt = () => {\n close();\n // Called synchronously by native owner fencing; scoped FiberSet cleanup performs the join.\n for (const fiber of fibers) fiber.interruptUnsafe();\n };\n\n const interruptWhere = (predicate: (input: I) => boolean) => {\n for (const [fiber, input] of inputs) {\n if (predicate(input)) fiber.interruptUnsafe();\n }\n };\n\n const fault = () => {\n if (!accepting || faulted) return;\n faulted = true;\n onFault({ source: \"binding\", reason: \"callback-failure\", disposition: \"known\" });\n };\n\n // FiberSet registered its child-scope finalizer first. Sequential reverse registration\n // order therefore closes admission before the set interrupts accepted callbacks.\n yield* Scope.addFinalizer(runtimeScope, Effect.sync(close));\n\n const submit = (\n input: I,\n failureMode: CallbackFailureMode = \"fail-session\",\n ): BindingAdmission<A, E> => {\n if (!accepting || faulted) return { _tag: \"Rejected\", reason: \"closed\" };\n if (inFlight >= capacity) {\n if (failureMode === \"fail-session\") fault();\n\n return { _tag: \"Rejected\", reason: \"capacity\" };\n }\n\n inFlight++;\n // Construct the consumer Effect inside the admitted fiber as well: a consumer callback\n // that throws while producing its Effect is a host defect, not work allowed before admission.\n const fiber = run(Effect.exit(Effect.suspend(() => handle(input))));\n\n inputs.set(fiber, input);\n\n fiber.addObserver(() => {\n inputs.delete(fiber);\n });\n\n const execution = exitPromise(fiber).then((exit) =>\n Exit.isSuccess(exit) ? exit.value : Exit.failCause(exit.cause),\n );\n\n const result = execution\n .then(\n (exit) => {\n if (failureMode === \"fail-session\" && Exit.isFailure(exit)) fault();\n\n return exit;\n },\n (error: unknown) => {\n if (failureMode === \"fail-session\") fault();\n throw error;\n },\n )\n .finally(() => {\n inFlight--;\n });\n\n // A native caller may disappear while the host callback is still settling. Keep the\n // Promise observed without consuming the Exit returned to a caller that is still present.\n void result.catch(() => {});\n\n return { _tag: \"Accepted\", result };\n };\n\n return { close, interrupt, interruptWhere, submit };\n });\n};\n","import type { Plan } from \"../../Bootstrap.ts\";\n\nexport interface ReadinessRequirement {\n readonly step: string;\n readonly expression: string;\n readonly timeoutMillis: number;\n readonly origins?: ReadonlyArray<string>;\n}\n\n/** What the native driver installs: one ordered bundle, its capabilities and its gates. */\nexport interface CompiledBootstrap {\n readonly bundle?: string;\n readonly permissions: ReadonlyArray<{\n readonly origin: string;\n readonly permissions: ReadonlyArray<string>;\n }>;\n readonly readiness: ReadonlyArray<ReadinessRequirement>;\n readonly existingDocuments: \"RequireFreshNavigation\" | \"AcceptAlreadyRunning\";\n}\n\nconst guarded = (content: string, origins: ReadonlyArray<string> | undefined): string =>\n origins === undefined\n ? `(() => {\\n${content}\\n})();`\n : `(() => {\\nconst origins = ${JSON.stringify([...origins])};\\nif (!origins.includes(globalThis.location && globalThis.location.origin)) return;\\n${content}\\n})();`;\n\n/**\n * Dependent steps become one script in declared order: a failing step stops the ones after it\n * rather than letting a later step observe half-initialized state. Origin-excluded steps are\n * skipped inside the document that reports the origin, never by guessing from a navigation URL.\n */\nexport const compileBootstrap = (\n plan: Pick<Plan, \"scripts\" | \"permissions\">,\n): CompiledBootstrap | undefined => {\n if (plan.scripts.length === 0 && plan.permissions.length === 0) return undefined;\n\n const bundle =\n plan.scripts.length === 0\n ? undefined\n : plan.scripts.map((script) => guarded(script.content, script.origins)).join(\"\\n\");\n\n const readiness = plan.scripts.flatMap((script) =>\n script.readiness === undefined\n ? []\n : [\n {\n step: script.id,\n expression: script.readiness.expression,\n timeoutMillis: script.readiness.timeoutMillis,\n ...(script.origins === undefined ? {} : { origins: script.origins }),\n },\n ],\n );\n\n // The most conservative declared policy governs the whole plan: one document is either\n // admitted for dependent work or it is not, and steps cannot disagree about that.\n const existingDocuments = plan.scripts.some(\n (script) => script.readiness?.existingDocuments === \"RequireFreshNavigation\",\n )\n ? \"RequireFreshNavigation\"\n : \"AcceptAlreadyRunning\";\n\n return {\n ...(bundle === undefined ? {} : { bundle }),\n permissions: plan.permissions.map((grant) => ({\n origin: grant.origin,\n permissions: [...grant.permissions],\n })),\n readiness,\n existingDocuments,\n };\n};\n\n/** Duplicate step identity would make registration order and readiness reports ambiguous. */\nexport const duplicateStep = (plan: Pick<Plan, \"scripts\" | \"permissions\" | \"bindings\">): boolean =>\n new Set(plan.scripts.map((script) => script.id)).size !== plan.scripts.length ||\n new Set(plan.permissions.map((grant) => grant.origin)).size !== plan.permissions.length ||\n new Set((plan.bindings ?? []).map((registration) => registration.name)).size !==\n (plan.bindings?.length ?? 0);\n","import { Cause, Deferred, Effect, Exit, Schema, Scope, Tracer } from \"effect\";\n\nimport * as Bootstrap from \"../../Bootstrap.ts\";\nimport { BrowserError, InitializationError, Reasons } from \"../../Errors.ts\";\nimport * as Trace from \"../Trace.ts\";\nimport * as Registration from \"./BindingRegistration.ts\";\nimport { makeBindingRunner } from \"./BindingRunner.ts\";\nimport { duplicateStep } from \"./Bootstrap.ts\";\nimport type { DriverFault } from \"./Driver.ts\";\n\nexport interface NativeBindingCall {\n /** Exact registered connection-local identities, when supplied by the native adapter. */\n readonly pageId?: string;\n readonly frameId?: string;\n /** The calling document's origin, fixed by its native execution context. */\n readonly origin: string;\n /** Validate native membership, allowed origin and the captured document before returning JSON. */\n readonly read: (signal: AbortSignal) => Promise<string>;\n /** Revalidate the same native caller/document; never substitute a newly selected document. */\n readonly check: (signal: AbortSignal) => Promise<void>;\n /** Idempotently fence retained handles and dispose late arrivals as they become available. */\n readonly dispose: () => Promise<void>;\n}\n\nexport interface NativeBinding {\n readonly name: string;\n readonly origins: ReadonlyArray<string>;\n readonly maxConcurrent: number;\n readonly maxInputBytes: number;\n readonly timeoutMillis: number;\n /** Rejected admission never calls read/check/dispose; the native callback still owns its handles. */\n readonly invoke: (call: NativeBindingCall) => Promise<string>;\n}\n\nexport interface ConnectionBindings {\n readonly bindings: ReadonlyArray<NativeBinding>;\n readonly close: () => void;\n /** Fence this page's admission before interrupting its accepted consumer callbacks. */\n readonly fencePage: (pageId: string) => void;\n readonly resumePage: (pageId: string) => void;\n readonly pauseAdmission: () => void;\n readonly resumeAdmission: () => void;\n /**\n * Whether no accepted invocation is still outstanding. Work a page originated while that page is\n * `held` (quarantined by a dialog or popup policy) cannot hold up the handoff that releases it:\n * its reply is already fenced from the page.\n */\n readonly drained: (held?: (pageId: string) => boolean) => boolean;\n /** Positive native closure removes admission history; accepted late work stays accounted for. */\n readonly retirePage: (pageId: string) => void;\n /** Native registration/transport failure supervises the owner, not a single page invocation. */\n readonly reportFailure: (error: InitializationError) => void;\n /** Drain scoped Effect fibers. Late native promises remain observed and occupy capacity. */\n readonly dispose: Effect.Effect<void>;\n}\n\nexport interface Bindings<E> {\n readonly failure: Effect.Effect<never, E | InitializationError>;\n readonly diagnostics: Effect.Effect<Bootstrap.BindingDiagnostics<E>>;\n readonly connect: (\n onFault: (event: DriverFault) => void,\n isActive: () => boolean,\n isCurrent?: () => boolean,\n ) => Effect.Effect<ConnectionBindings, never, Scope.Scope>;\n}\n\nconst invalidPlan = () =>\n BrowserError.make({\n operation: \"configure\",\n reason: Reasons.Configuration.make({}),\n outcome: \"undispatched\",\n });\n\nconst AdmissionPlan = Schema.Struct({\n ...Bootstrap.Plan.fields,\n bindings: Schema.optionalKey(Schema.Array(Schema.Unknown).check(Schema.isMaxLength(16))),\n});\n\n/** Validate before allocation and retain an immutable snapshot, including authenticated callbacks. */\nexport const preparePlan = Effect.fnUntraced(function* <E, R>(\n plan: Bootstrap.Plan<E, R>,\n): Effect.fn.Return<Bootstrap.Plan<E, R>, BrowserError> {\n const source = yield* Effect.try({\n try: () => ({ ...plan }),\n catch: invalidPlan,\n });\n\n const data = yield* Schema.decodeEffect(AdmissionPlan, { onExcessProperty: \"error\" })(\n source,\n ).pipe(Effect.mapError(invalidPlan));\n\n if (duplicateStep({ scripts: data.scripts, permissions: data.permissions }))\n return yield* invalidPlan();\n const candidates = source.bindings === undefined ? [] : source.bindings;\n\n const bindings = yield* Effect.forEach([...candidates], (registration) =>\n Registration.snapshot(registration),\n );\n\n if (new Set(bindings.map((registration) => registration.name)).size !== bindings.length) {\n return yield* invalidPlan();\n }\n\n return Object.freeze({\n scripts: Object.freeze(\n data.scripts.map((script) =>\n Object.freeze({\n ...script,\n ...(script.origins === undefined ? {} : { origins: Object.freeze([...script.origins]) }),\n ...(script.readiness === undefined\n ? {}\n : { readiness: Object.freeze({ ...script.readiness }) }),\n }),\n ),\n ),\n permissions: Object.freeze(\n data.permissions.map((grant) =>\n Object.freeze({\n ...grant,\n permissions: Object.freeze([...grant.permissions]),\n }),\n ),\n ),\n ...(bindings.length === 0 ? {} : { bindings: Object.freeze(bindings) }),\n });\n});\n\nconst rejected = (): Promise<never> => {\n const error = new Error(\"Browser binding call rejected\");\n\n error.name = \"BrowserBindingError\";\n error.stack = \"\";\n const result = Promise.reject(error);\n\n void result.catch(() => {});\n\n return result;\n};\n\nconst increment = (value: number) => Math.min(Number.MAX_SAFE_INTEGER, value + 1);\n\n/** The caller must pass preparePlan's snapshot; dependencies are captured at acquisition. */\nexport const makeBindings = Effect.fnUntraced(function* <E, R>(\n plan: Bootstrap.Plan<E, R>,\n): Effect.fn.Return<Bindings<E>, never, Exclude<R, Scope.Scope> | Scope.Scope> {\n // Effect.scoped installs a fresh invocation Scope inside this captured context. A consumer\n // handler never receives the acquisition Scope even when the actual context contains it.\n const consumer = yield* Effect.context<Exclude<R, Scope.Scope>>();\n const acquisition = yield* Trace.capture;\n const ownerScope = yield* Scope.fork(yield* Scope.Scope, \"sequential\");\n const failure = yield* Deferred.make<never, E | InitializationError>();\n const connections = new Set<ConnectionBindings>();\n // Every accepted invocation until it releases its capacity, across connections and bindings.\n const outstanding = new Set<{ readonly call: NativeBindingCall }>();\n const failures: Array<Bootstrap.BindingFailure<E>> = [];\n let droppedFailures = 0;\n let faulted = false;\n let ownerClosed = false;\n\n const entries = (plan.bindings ?? []).map((registration) => ({\n registration,\n state: {\n name: registration.name,\n inFlight: 0,\n pendingNative: 0,\n retired: 0,\n accepted: 0,\n succeeded: 0,\n rejected: 0,\n },\n }));\n\n yield* Scope.addFinalizer(\n ownerScope,\n Effect.suspend(() => {\n ownerClosed = true;\n const owned = [...connections];\n\n for (const connection of owned) connection.close();\n\n return Effect.forEach(owned, (connection) => connection.dispose, { discard: true });\n }),\n );\n\n const connect = Effect.fnUntraced(function* (\n onFault: (event: DriverFault) => void,\n isActive: () => boolean,\n isCurrent: () => boolean = isActive,\n ): Effect.fn.Return<ConnectionBindings, never, Scope.Scope> {\n const connectionScope = yield* Scope.fork(yield* Scope.Scope, \"sequential\");\n let closed = ownerClosed || faulted;\n let admitting = true;\n const fences: Array<() => void> = [];\n const revokedPages = new Set<string>();\n\n const pageFences: Array<{\n readonly mark: (pageId: string) => void;\n readonly interrupt: (pageId: string) => void;\n }> = [];\n\n const current = () => !closed && !ownerClosed && !faulted && isCurrent();\n const active = () => current() && isActive();\n\n const close = () => {\n closed = true;\n for (const fence of fences) fence();\n };\n\n const fencePage = (pageId: string) => {\n revokedPages.add(pageId);\n // Every registration observes revocation before any interrupted finalizer can reenter.\n for (const fence of pageFences) fence.mark(pageId);\n for (const fence of pageFences) fence.interrupt(pageId);\n };\n\n const record = (\n registration: Pick<Registration.Registration<E, R>, \"name\" | \"failureMode\">,\n cause: Cause.Cause<E | InitializationError>,\n event: DriverFault = { source: \"binding\", reason: \"callback-failure\", disposition: \"known\" },\n ) => {\n if (failures.length === 32) {\n failures.shift();\n droppedFailures = increment(droppedFailures);\n }\n failures.push(\n Object.freeze({ name: registration.name, mode: registration.failureMode, cause }),\n );\n if (registration.failureMode === \"fail-session\" && current()) {\n faulted = true;\n // The host can observe the original typed cause as soon as its owner is fenced.\n Deferred.doneUnsafe(failure, Effect.failCause(cause));\n // The owner must fence browser admission before interrupted callback finalizers run.\n onFault(event);\n for (const connection of connections) connection.close();\n }\n };\n\n const bindings = yield* Effect.forEach(entries, ({ registration, state }) =>\n Effect.gen(function* () {\n const error = (\n reason: InitializationError[\"reason\"],\n operation: InitializationError[\"operation\"] = \"callback\",\n ) => InitializationError.make({ operation, step: registration.name, reason });\n\n interface Work {\n readonly call: NativeBindingCall;\n pending: number;\n finished: boolean;\n released: boolean;\n revoked: boolean;\n readonly retirementFailures: Set<unknown>;\n nativeFault?: Extract<DriverFault, { readonly source: \"native\" }>;\n }\n\n const owned = new Set<Work>();\n const workActive = (work: Work) => !work.revoked && active();\n\n const revokedError = (work: Work) => {\n const failure = error(\"closed\");\n\n if (work.revoked) work.retirementFailures.add(failure);\n\n return failure;\n };\n\n const intentionalRetirement = (work: Work, cause: Cause.Cause<E | InitializationError>) =>\n work.revoked &&\n cause.reasons.length > 0 &&\n cause.reasons.every(\n (reason) =>\n Cause.isInterruptReason(reason) ||\n (Cause.isFailReason(reason) && work.retirementFailures.has(reason.error)),\n );\n\n const release = (work: Work) => {\n if (!work.finished || work.pending !== 0 || work.released) return;\n work.released = true;\n state.inFlight--;\n state.retired--;\n owned.delete(work);\n outstanding.delete(work);\n };\n\n const track = <A>(work: Work, promise: Promise<A>): Promise<A> => {\n work.pending++;\n state.pendingNative++;\n\n const settled = () => {\n work.pending--;\n state.pendingNative--;\n release(work);\n };\n\n void promise.then(settled, settled);\n\n return promise;\n };\n\n const finish = (work: Work) => {\n if (work.finished) return;\n work.finished = true;\n state.retired++;\n\n // Disposal may complete before an abort-ignoring read. Both remain accounted for.\n const disposing = Promise.resolve()\n .then(() => work.call.dispose())\n .catch((cause: unknown) => {\n if (\n work.revoked &&\n Schema.is(InitializationError)(cause) &&\n (cause.reason === \"closed\" || cause.reason === \"stale\")\n )\n return;\n record(registration, Cause.fail(error(\"native\", \"dispose\")), {\n source: \"native\",\n reason: \"callback\",\n disposition: \"unknown\",\n });\n });\n\n void track(work, disposing);\n };\n\n const native = <A>(work: Work, action: (signal: AbortSignal) => Promise<A>) =>\n Effect.tryPromise({\n try: (signal) => track(work, action(signal)),\n catch: (cause) => {\n work.nativeFault = { source: \"native\", reason: \"callback\", disposition: \"unknown\" };\n\n const failure = Schema.is(InitializationError)(cause)\n ? error(cause.reason)\n : error(\"native\");\n\n if (\n work.revoked &&\n Schema.is(InitializationError)(cause) &&\n (cause.reason === \"closed\" || cause.reason === \"stale\")\n )\n work.retirementFailures.add(failure);\n\n return failure;\n },\n });\n\n const execute = Effect.fnUntraced(function* (work: Work) {\n const check = Effect.suspend(() =>\n workActive(work) ? native(work, work.call.check) : Effect.fail(revokedError(work)),\n );\n\n if (!workActive(work)) return yield* revokedError(work);\n const text = yield* native(work, work.call.read);\n const result = yield* Registration.invoke(registration, text, check);\n\n yield* check;\n\n return result;\n });\n\n const runner = yield* makeBindingRunner(\n registration.maxConcurrent,\n (work: Work) =>\n Effect.scoped(execute(work)).pipe(\n Effect.timeoutOrElse({\n duration: registration.timeoutMillis,\n orElse: () => Effect.fail(error(\"timeout\")),\n }),\n Trace.span(\"Browser.binding\", {\n ...Trace.autonomous(acquisition),\n attributes: {\n \"browser.operation\": \"callback\",\n \"browser.binding.mode\": registration.failureMode,\n },\n }),\n Effect.withTracerEnabled(acquisition.enabled),\n Effect.provideService(Tracer.CurrentTraceLevel, acquisition.level),\n Effect.provideService(Tracer.MinimumTraceLevel, acquisition.minimum),\n Effect.provideContext(consumer),\n ),\n () => {},\n ).pipe(Scope.provide(connectionScope));\n\n fences.push(runner.interrupt);\n pageFences.push({\n mark: (pageId) => {\n for (const work of owned) {\n if (work.call.pageId === pageId) work.revoked = true;\n }\n },\n interrupt: (pageId) => runner.interruptWhere((work) => work.call.pageId === pageId),\n });\n\n const invoke = (call: NativeBindingCall): Promise<string> => {\n if (\n !admitting ||\n !active() ||\n (call.pageId !== undefined && revokedPages.has(call.pageId))\n ) {\n state.rejected = increment(state.rejected);\n\n return rejected();\n }\n // A document outside the binding's origins has no authority over the owner. It is\n // refused before admission, so it can neither take capacity nor apply fail-session.\n if (!registration.origins.includes(call.origin)) {\n state.rejected = increment(state.rejected);\n record(\n { name: registration.name, failureMode: \"reject-call\" },\n Cause.fail(error(\"origin\")),\n );\n\n return rejected();\n }\n if (state.inFlight >= registration.maxConcurrent) {\n state.rejected = increment(state.rejected);\n record(registration, Cause.fail(error(\"busy\")));\n\n return rejected();\n }\n // This reservation also covers codec work, native validation and late native disposal.\n // It is shared across connections, so reconnect cannot reset quarantined capacity.\n state.inFlight++;\n state.accepted = increment(state.accepted);\n\n const work: Work = {\n call,\n pending: 0,\n finished: false,\n released: false,\n revoked: false,\n retirementFailures: new Set(),\n };\n\n owned.add(work);\n outstanding.add(work);\n const admission = runner.submit(work, \"reject-call\");\n\n if (admission._tag === \"Rejected\") {\n state.rejected = increment(state.rejected);\n finish(work);\n\n return rejected();\n }\n\n const result = admission.result\n .then(\n (exit) => {\n if (Exit.isFailure(exit)) {\n state.rejected = increment(state.rejected);\n if (!intentionalRetirement(work, exit.cause))\n record(registration, exit.cause, work.nativeFault);\n\n return rejected();\n }\n if (!workActive(work)) {\n state.rejected = increment(state.rejected);\n\n return rejected();\n }\n state.succeeded = increment(state.succeeded);\n\n return exit.value;\n },\n () => {\n state.rejected = increment(state.rejected);\n if (active())\n record(registration, Cause.fail(error(\"native\")), {\n source: \"native\",\n reason: \"callback\",\n disposition: \"unknown\",\n });\n\n return rejected();\n },\n )\n .finally(() => finish(work));\n\n void result.catch(() => {});\n\n return result;\n };\n\n return Object.freeze({\n name: registration.name,\n origins: registration.origins,\n maxConcurrent: registration.maxConcurrent,\n maxInputBytes: registration.maxInputBytes,\n timeoutMillis: registration.timeoutMillis,\n invoke,\n });\n }),\n );\n\n const connection: ConnectionBindings = {\n bindings: Object.freeze(bindings),\n close,\n fencePage,\n resumePage: (pageId) => revokedPages.delete(pageId),\n pauseAdmission: () => {\n admitting = false;\n },\n resumeAdmission: () => {\n admitting = true;\n },\n drained: (held = () => false) =>\n [...outstanding].every(({ call }) => call.pageId !== undefined && held(call.pageId)),\n retirePage: (pageId) => revokedPages.delete(pageId),\n reportFailure: (error) => {\n if (!current()) return;\n record({ name: error.step, failureMode: \"fail-session\" }, Cause.fail(error), {\n source: \"native\",\n reason: \"registration\",\n disposition: \"unknown\",\n });\n },\n dispose: Effect.sync(close).pipe(Effect.andThen(Scope.close(connectionScope, Exit.void))),\n };\n\n connections.add(connection);\n yield* Scope.addFinalizer(\n connectionScope,\n Effect.sync(() => {\n close();\n connections.delete(connection);\n }),\n );\n\n return connection;\n }, Effect.uninterruptible);\n\n return {\n failure: Deferred.await(failure),\n diagnostics: Effect.sync(() =>\n Object.freeze({\n faulted,\n bindings: Object.freeze(entries.map(({ state }) => Object.freeze({ ...state }))),\n failures: Object.freeze([...failures]),\n droppedFailures,\n }),\n ),\n connect,\n };\n});\n","import { Effect, Schema } from \"effect\";\n\nimport { BrowserError, InitializationError, Reasons } from \"../../Errors.ts\";\nimport type { BindingImplementation, ConnectRequest } from \"./Binding.ts\";\nimport type { Driver } from \"./Driver.ts\";\nimport { providerReason, publicError } from \"./NativeCalls.ts\";\n\n/**\n * A native attempt as a Promise with its own abort signal. Interruption aborts the signal; a\n * connection that still arrives afterwards is fenced and disconnected here, so a late native\n * success can never become a live, unowned browser.\n */\nexport type NativeAttempt = (request: ConnectRequest, signal: AbortSignal) => Promise<Driver>;\n\nexport const fromNativeAttempt = (attempt: NativeAttempt): BindingImplementation => ({\n connect: (request) =>\n Effect.tryPromise({\n try: (signal) => {\n const pending = attempt(request, signal).then(async (driver) => {\n if (signal.aborted) {\n request.onAbandoned();\n driver.fenceInitialization?.();\n await driver.disconnect().catch(() => {});\n throw BrowserError.make({\n operation: \"connect\",\n reason: Reasons.Interrupted.make({}),\n outcome: \"unknown\",\n });\n }\n\n return driver;\n });\n\n void pending.then(request.onSettled, request.onSettled);\n\n return pending;\n },\n catch: (error) =>\n Schema.is(InitializationError)(error)\n ? error\n : publicError(error, \"connect\", {\n reason: providerReason(error),\n outcome: \"unknown\",\n }),\n }),\n});\n","import type { ElementHandle } from \"playwright-core\";\n\nimport type { ControlFacts } from \"../../BrowserData.ts\";\nimport { Reasons } from \"../../Errors.ts\";\nimport type { DriverTarget, ElementTarget } from \"./Driver.ts\";\nimport { closeWithin, failure } from \"./NativeCalls.ts\";\nimport type { AdmissionPolicy, Observation } from \"./Observation.ts\";\nimport type { Ticket } from \"./Owner.ts\";\n\n/**\n * Exact-node admission shared by every element input: clicks, fills and forms in Actions, and\n * the pointer and keyboard drivers. It depends only on the observation seam, so those drivers\n * can be built before the actions that use them.\n */\nexport const makeElementAccess = (observation: Observation) => {\n const targetFor = (element: ElementTarget, target: DriverTarget): DriverTarget => {\n if (typeof element === \"string\" || !(\"_tag\" in element)) return target;\n if (target.pageId !== element.target.pageId)\n throw failure(Reasons.Stale.make({}), \"undispatched\");\n\n return element.target;\n };\n\n /**\n * Acts on the exact attached node a target names. The observation seam establishes that it is\n * still the control that was inspected and that the host's policy, if any, admits it. `admit`\n * then sees that node before anything is dispatched, so a refusal it raises is undispatched\n * too, and what it learns reaches the action without the node being resolved a second time.\n * `enablement` is a form step's: see `Observation.resolve`.\n */\n const withAdmittedElement = async <Admitted, A>(\n target: ElementTarget,\n ticket: Ticket,\n admit: (element: ElementHandle<Element>, facts: ControlFacts | undefined) => Promise<Admitted>,\n action: (\n element: ElementHandle<Element>,\n admitted: Admitted,\n check: () => void,\n readmit: () => Promise<void>,\n ) => Promise<A>,\n policy: AdmissionPolicy | undefined,\n browserTarget: DriverTarget,\n enablement = false,\n automaticDispatch = true,\n ): Promise<A> => {\n const { element, check, readmit, facts, capture, release } = await observation.resolve(\n target,\n ticket,\n policy,\n false,\n targetFor(target, browserTarget),\n enablement,\n ticket.performance !== undefined,\n );\n\n try {\n check();\n const admitted = await admit(element, facts);\n\n check();\n ticket.check();\n ticket.captureTarget?.(target, capture);\n // ElementHandle actions do not re-resolve the selector onto a replacement node.\n if (automaticDispatch) ticket.dispatch();\n\n const result = await action(element, admitted, check, readmit);\n\n ticket.acknowledge?.();\n ticket.followUp?.();\n\n return result;\n } finally {\n await closeWithin(release).catch(() => {});\n }\n };\n\n const withElement = <A>(\n target: ElementTarget,\n ticket: Ticket,\n action: (\n element: ElementHandle<Element>,\n admitted: void,\n check: () => void,\n readmit: () => Promise<void>,\n ) => Promise<A>,\n policy: AdmissionPolicy | undefined,\n browserTarget: DriverTarget,\n automaticDispatch = true,\n ): Promise<A> =>\n withAdmittedElement(\n target,\n ticket,\n async () => {},\n action,\n policy,\n browserTarget,\n false,\n automaticDispatch,\n );\n\n return { targetFor, withAdmittedElement, withElement };\n};\n\nexport type ElementAccess = ReturnType<typeof makeElementAccess>;\n","import { Result } from \"effect\";\nimport type { CDPSession, ElementHandle, Keyboard, Page } from \"playwright-core\";\n\nimport type { KeyModifier } from \"../../BrowserData.ts\";\nimport { Reasons } from \"../../Errors.ts\";\nimport type { DriverTarget, ElementTarget } from \"./Driver.ts\";\nimport type { ElementAccess } from \"./ElementAccess.ts\";\nimport { failure, sanitize } from \"./NativeCalls.ts\";\nimport { isPerformed, ownerPacing, type PerformedTicket } from \"./NativePacing.ts\";\nimport type { AdmissionPolicy } from \"./Observation.ts\";\nimport type { Ticket } from \"./Owner.ts\";\nimport { keys as keySchedule, type KeySchedule, type Stroke } from \"./Performance.ts\";\nimport type { NativeInput } from \"./Pointer.ts\";\nimport type { Targets } from \"./Targets.ts\";\n\n// Printable US keys match the pinned Playwright layout. Uppercase and shifted punctuation\n// carry their literal text without holding Shift, just as Keyboard.type does. Other Unicode\n// code points use Chromium's native insertText; neither path manufactures DOM events.\nconst punctuation: ReadonlyArray<readonly [string, string, number]> = [\n [\"`~\", \"Backquote\", 192],\n [\"1!\", \"Digit1\", 49],\n [\"2@\", \"Digit2\", 50],\n [\"3#\", \"Digit3\", 51],\n [\"4$\", \"Digit4\", 52],\n [\"5%\", \"Digit5\", 53],\n [\"6^\", \"Digit6\", 54],\n [\"7&\", \"Digit7\", 55],\n [\"8*\", \"Digit8\", 56],\n [\"9(\", \"Digit9\", 57],\n [\"0)\", \"Digit0\", 48],\n [\"-_\", \"Minus\", 189],\n [\"=+\", \"Equal\", 187],\n [\"\\\\|\", \"Backslash\", 220],\n [\"[{\", \"BracketLeft\", 219],\n [\"]}\", \"BracketRight\", 221],\n [\";:\", \"Semicolon\", 186],\n [\"'\\\"\", \"Quote\", 222],\n [\",<\", \"Comma\", 188],\n [\".>\", \"Period\", 190],\n [\"/?\", \"Slash\", 191],\n [\" \", \"Space\", 32],\n];\n\nconst keyDescription = (\n key: string,\n): { readonly code: string; readonly keyCode: number } | undefined => {\n if (/^[a-zA-Z]$/.test(key)) {\n const upper = key.toUpperCase();\n\n return { code: `Key${upper}`, keyCode: upper.charCodeAt(0) };\n }\n\n const named: ReadonlyArray<readonly [string, string, number]> = [\n [\"Enter\", \"Enter\", 13],\n [\"Tab\", \"Tab\", 9],\n [\"Backspace\", \"Backspace\", 8],\n [\"Delete\", \"Delete\", 46],\n [\"Escape\", \"Escape\", 27],\n [\"ArrowLeft\", \"ArrowLeft\", 37],\n [\"ArrowRight\", \"ArrowRight\", 39],\n [\"ArrowUp\", \"ArrowUp\", 38],\n [\"ArrowDown\", \"ArrowDown\", 40],\n [\"Home\", \"Home\", 36],\n [\"End\", \"End\", 35],\n [\"PageUp\", \"PageUp\", 33],\n [\"PageDown\", \"PageDown\", 34],\n ];\n\n const special = named.find(([name]) => name === key);\n\n if (special !== undefined) return { code: special[1], keyCode: special[2] };\n const description = punctuation.find(([characters]) => characters.includes(key));\n\n return description === undefined ? undefined : { code: description[1], keyCode: description[2] };\n};\n\n/** Performed text holds Shift for uppercase and shifted punctuation, as a person would. */\nconst heldModifiers = (\n key: string,\n modifiers: ReadonlyArray<KeyModifier>,\n typed: boolean,\n): ReadonlyArray<KeyModifier> =>\n typed && /^[A-Z~!@#$%^&*()_+{}|:\"<>?]$/u.test(key) && !modifiers.includes(\"Shift\")\n ? [...modifiers, \"Shift\"]\n : modifiers;\n\nconst nanos = (milliseconds: number) => BigInt(Math.round(milliseconds * 1e6));\n\n/** The commands a stroke submits: inserted text, or its key and held modifiers down and up. */\nconst commandsOf = (stroke: Stroke, modifiers: ReadonlyArray<KeyModifier>, typed: boolean) =>\n keyDescription(stroke.key) === undefined\n ? 1\n : 2 * (1 + heldModifiers(stroke.key, modifiers, typed).length);\n\n/**\n * The measured pace of one performed key run. Strokes start at their absolute schedule offsets,\n * and each key is held from its key-down's submission. Before a stroke's first command, the rest\n * of the schedule must still fit the original deadline at the round trips the browser has\n * actually taken, so a stroke that could not finish is refused whole, never cut between a key and\n * its release.\n *\n * A stroke's commands share their round trip, but a renderer handles them one at a time. So each\n * stroke is measured from its first submission (its span) and from its last (its drain) until its\n * last reply, and charged as strokes of its own command count were. More commands never finish\n * sooner: a larger stroke's measures bound a smaller one's, and a smaller one's are scaled up by\n * command count, which overcharges latency only until a stroke of this size has drained.\n */\nconst makePace = (\n pacing: ReturnType<typeof ownerPacing>,\n strokes: ReadonlyArray<Stroke>,\n started: bigint,\n focus: boolean,\n modifiers: ReadonlyArray<KeyModifier>,\n typed: boolean,\n) => {\n const focused = { nanos: 0n, count: 0 };\n const drained = new Map<number, { span: bigint; drain: bigint; count: number }>();\n\n const mean = (total: bigint, count: number) =>\n count === 0 ? 0 : Number(total / BigInt(count)) / 1e6;\n\n const expected = (commands: number, check: number) => {\n let bound: number | undefined;\n let below: number | undefined;\n\n for (const size of drained.keys()) {\n if (size >= commands && (bound === undefined || size < bound)) bound = size;\n if (size < commands && (below === undefined || size > below)) below = size;\n }\n const size = bound ?? below;\n const measured = size === undefined ? undefined : drained.get(size);\n\n // Before any stroke has drained, a focus check's round trip is the best estimate there is.\n if (size === undefined || measured === undefined)\n return { span: 0, drain: check * Math.max(1, commands / 2) };\n const scale = size < commands ? commands / size : 1;\n\n return {\n span: mean(measured.span, measured.count) * scale,\n drain: mean(measured.drain, measured.count) * scale,\n };\n };\n\n return {\n observeFocus: (elapsed: bigint) => {\n focused.nanos += elapsed;\n focused.count++;\n },\n observeDrain: (commands: number, span: bigint, drain: bigint) => {\n const measured = drained.get(commands) ?? { span: 0n, drain: 0n, count: 0 };\n\n measured.span += span;\n measured.drain += drain;\n measured.count++;\n drained.set(commands, measured);\n },\n /** Called after stroke `from`'s focus check, before its first command. */\n require: (from: number) => {\n const check = focus ? mean(focused.nanos, focused.count) : 0;\n let at = Number(pacing.now() - started) / 1e6;\n\n for (let index = from; index < strokes.length; index++) {\n const stroke = strokes[index];\n\n if (stroke === undefined) break;\n // This stroke has already paid for its focus check.\n const down = Math.max(at, stroke.offsetMillis) + (index === from ? 0 : check);\n const { span, drain } = expected(commandsOf(stroke, modifiers, typed), check);\n\n // A key's releases are submitted once it has been held; inserted text holds after it lands.\n at =\n keyDescription(stroke.key) === undefined\n ? down + Math.max(drain, stroke.holdMillis)\n : down + Math.max(stroke.holdMillis + drain, span);\n }\n pacing.requireBy(started + nanos(at));\n },\n };\n};\n\n/** At most sixteen complete strokes / thirty-two replies live at once. */\nconst typeWindow = async (port: CDPSession, characters: ReadonlyArray<string>, ticket: Ticket) => {\n const pending: Array<Promise<void>> = [];\n let failed = false;\n let firstFailure: unknown;\n\n const reject = (error: unknown) => {\n if (!failed) {\n failed = true;\n firstFailure = error;\n }\n };\n\n const submit = (command: () => Promise<unknown>) => {\n ticket.check();\n ticket.dispatch();\n // Observe every reply immediately, including a rejection arriving after caller cancellation.\n pending.push(command().then(() => {}, reject));\n };\n\n try {\n for (const key of characters) {\n const description = keyDescription(key);\n\n if (description === undefined) submit(() => port.send(\"Input.insertText\", { text: key }));\n else {\n const { code, keyCode } = description;\n\n submit(() =>\n port.send(\"Input.dispatchKeyEvent\", {\n type: \"keyDown\",\n modifiers: 0,\n windowsVirtualKeyCode: keyCode,\n code,\n commands: [],\n key,\n text: key,\n unmodifiedText: key,\n autoRepeat: false,\n location: 0,\n isKeypad: false,\n }),\n );\n // An authority loss during keydown leaves this unsent; cleanup never repairs input.\n submit(() =>\n port.send(\"Input.dispatchKeyEvent\", {\n type: \"keyUp\",\n modifiers: 0,\n key,\n windowsVirtualKeyCode: keyCode,\n code,\n location: 0,\n }),\n );\n }\n }\n } catch (error) {\n reject(error);\n }\n await Promise.all(pending);\n if (failed) throw firstFailure;\n ticket.acknowledge?.();\n};\n\n/**\n * Real key input to the exact target page. Every stroke is one the browser would receive from a\n * keyboard, so handlers see trusted `keydown` and `keyup`, and the browser itself decides what\n * has focus. Nothing here focuses, paces or retries: a caller that wants a cadence sends its keys.\n */\nexport const makeKeyboard = (\n targets: Targets,\n elements: ElementAccess,\n receipt: (page: Page) => NativeInput,\n) => {\n const { current } = targets;\n\n // A port whose run drained every reply stays attached, idle, for the next run on its page:\n // attaching and detaching cost three serial round trips, more than a one-character run.\n type Slot = { release?: () => void; idle?: CDPSession };\n\n // The native Page object is the authority for its port. Retiring the caller's permit does\n // not retire setup, input replies or failed detach, so those slots remain independently.\n const typing = new Map<Page, Slot>();\n\n const retirePage = (page: Page) => {\n const slot = typing.get(page);\n\n slot?.release?.();\n if (typing.get(page) === slot) typing.delete(page);\n };\n\n const retire = () => {\n for (const page of typing.keys()) retirePage(page);\n };\n\n // Only the acknowledgement, a close event, or positive connection retirement returns\n // capacity; a failed close does not.\n const detach = async (slot: Slot, port: CDPSession) => {\n await port.detach();\n slot.release?.();\n };\n\n const withTypingPort = async <A>(\n page: Page,\n ticket: Ticket,\n action: (port: CDPSession) => Promise<A>,\n ) => {\n ticket.check();\n const previous = typing.get(page);\n\n if (previous !== undefined && previous.idle === undefined)\n throw failure(Reasons.Busy.make({}), \"undispatched\");\n if (previous === undefined && typing.size >= 32)\n throw failure(Reasons.Busy.make({}), \"undispatched\");\n // Reserve before attachment: a canceled waiter cannot admit more native setup or input.\n const slot: Slot = previous ?? {};\n let port = slot.idle;\n\n slot.idle = undefined;\n typing.set(page, slot);\n\n let result:\n | { readonly _tag: \"Success\"; readonly value: A }\n | { readonly _tag: \"Failure\"; readonly error: unknown };\n\n try {\n if (port === undefined) {\n port = await page.context().newCDPSession(page);\n const attached = port;\n\n const release = () => {\n attached.off(\"close\", release);\n if (typing.get(page) === slot) typing.delete(page);\n };\n\n slot.release = release;\n if (typing.get(page) === slot) attached.on(\"close\", release);\n }\n ticket.check();\n if (typing.get(page) !== slot) throw failure(Reasons.Closed.make({}), \"undispatched\");\n\n result = { _tag: \"Success\", value: await action(port) };\n } catch (error) {\n result = { _tag: \"Failure\", error };\n // A terminal constructor rejection returned no owned port and has no pending setup.\n // Cancellation alone never reaches here while that constructor is still unresolved.\n if (port === undefined && typing.get(page) === slot) typing.delete(page);\n }\n if (port !== undefined && typing.get(page) === slot) {\n // Drained input replies precede detach; a failed run never leaves its port for reuse.\n if (result._tag === \"Success\") slot.idle = port;\n else await detach(slot, port).catch(() => {});\n }\n if (result._tag === \"Failure\") throw result.error;\n\n return result.value;\n };\n\n /**\n * Keys reach the focused element of the focused document, so the guard requires both: the\n * element named is that element or holds it, through any open shadow root, and its document\n * has focus. The pinned Chromium clears a frame's active element when focus leaves that\n * frame, which makes the second check redundant wherever that holds. It is kept because that\n * is the browser's bookkeeping, not a guarantee, and where it failed the keys would land in\n * another frame than the one this guard was asked about.\n */\n const requireFocus = async (element: ElementHandle<Element>): Promise<void> => {\n const focused: unknown = await element.evaluate((node) => {\n if (!node.isConnected || node.ownerDocument !== document || !node.ownerDocument.hasFocus())\n return false;\n let active = node.ownerDocument.activeElement;\n\n while (active?.shadowRoot?.activeElement) active = active.shadowRoot.activeElement;\n\n for (let at: Node | null = active; at !== null;) {\n if (at === node) return true;\n at = at.parentNode ?? (at instanceof ShadowRoot ? at.host : null);\n }\n\n return false;\n });\n\n // Nothing more is sent; the owner keeps whatever earlier input it acknowledged.\n if (focused !== true) throw failure(Reasons.NotFocused.make({}), \"undispatched\");\n };\n\n const planKeys = (text: string, ticket: PerformedTicket): KeySchedule => {\n const { performance } = ticket;\n const planned = keySchedule(performance.plan, text, performance.fieldIndex);\n\n if (Result.isFailure(planned)) throw planned.failure;\n\n return planned.success;\n };\n\n const prepareKeys = (text: string, ticket: PerformedTicket): KeySchedule => {\n const schedule = planKeys(text, ticket);\n\n ownerPacing(ticket).requireDuration(schedule.durationMillis);\n\n return schedule;\n };\n\n /**\n * One paired native stroke remains unresolved until its key and modifiers are all released.\n * Playwright's own keyboard builds each event, so a performed stroke carries exactly what a\n * plain `press` sends, including the editing commands Chromium on macOS needs for Backspace,\n * Delete, the arrows, Home and End. Like plain typing's windows, a stroke submits its commands\n * in order without waiting for each reply, so a key is held for its planned time rather than for\n * its key-down's round trip, and a held modifier adds no round trip of its own. A stroke has at\n * most ten replies outstanding, its key and up to four modifiers each down and up, and drains\n * them all before it resolves.\n */\n const pacedStroke = async (\n keyboard: Keyboard,\n stroke: Stroke,\n ticket: PerformedTicket,\n check: () => void,\n pace: ReturnType<typeof makePace>,\n index: number,\n element?: ElementHandle<Element>,\n modifiers: ReadonlyArray<KeyModifier> = [],\n typed = true,\n ) => {\n const pacing = ownerPacing(ticket);\n\n pacing.requireDuration(stroke.holdMillis);\n // Focus is required once, before the stroke's first command. The key's own default action\n // may move it (Tab, an Enter that submits, an auto-advancing field), and the releases still\n // belong to this stroke: like plain typing's, they are fenced by the ticket alone.\n check();\n if (element !== undefined) {\n const before = pacing.now();\n\n await requireFocus(element);\n pace.observeFocus(pacing.now() - before);\n }\n check();\n pace.require(index);\n\n const pending: Array<Promise<void>> = [];\n let failed = false;\n let firstFailure: unknown;\n const first = pacing.now();\n let submitted = first;\n\n const reject = (error: unknown) => {\n if (!failed) {\n failed = true;\n firstFailure = error;\n }\n };\n\n const submit = (command: () => Promise<unknown>) => {\n // A refused reply ends the stroke: nothing after it is sent, and nothing is repaired.\n if (failed) throw firstFailure;\n check();\n ticket.dispatch();\n submitted = pacing.now();\n // Observe every reply immediately, including a rejection arriving after a refusal.\n pending.push(command().then(() => {}, reject));\n };\n\n const drain = async () => {\n await Promise.all(pending);\n if (failed) throw firstFailure;\n const replied = pacing.now();\n\n pace.observeDrain(pending.length, replied - first, replied - submitted);\n ticket.acknowledge?.({ subphase: \"key-burst\", logicalComplete: false });\n };\n\n // A character the US layout cannot produce is committed as text, as plain typing does.\n if (keyDescription(stroke.key) === undefined) {\n submit(() => keyboard.insertText(stroke.key));\n await drain();\n await pacing.pauseUntil(first + nanos(stroke.holdMillis));\n\n return;\n }\n const held = heldModifiers(stroke.key, modifiers, typed);\n\n try {\n for (const modifier of held) submit(() => keyboard.down(modifier));\n const down = pacing.now();\n\n submit(() => keyboard.down(stroke.key));\n // The hold runs from the key-down's submission, whether or not its reply has arrived.\n await pacing.pauseUntil(down + nanos(stroke.holdMillis));\n submit(() => keyboard.up(stroke.key));\n for (const modifier of held.toReversed()) submit(() => keyboard.up(modifier));\n } catch (error) {\n reject(error);\n }\n await drain();\n };\n\n const pacedKeys = async (\n keyboard: Keyboard,\n schedule: KeySchedule,\n ticket: PerformedTicket,\n check: () => void,\n element?: ElementHandle<Element>,\n ) => {\n const pacing = ownerPacing(ticket);\n\n pacing.requireDuration(schedule.durationMillis);\n const started = pacing.now();\n const pace = makePace(pacing, schedule.strokes, started, element !== undefined, [], true);\n\n for (const [index, stroke] of schedule.strokes.entries()) {\n check();\n // Absolute offsets: a slow reply delays the stroke after it, never every later one.\n await pacing.pauseUntil(started + nanos(stroke.offsetMillis));\n await pacedStroke(keyboard, stroke, ticket, check, pace, index, element);\n }\n };\n\n /** Focus/select happens only for Fill, on its already admitted exact node. */\n const fillElement = (\n page: Page,\n element: ElementHandle<Element>,\n schedule: KeySchedule,\n ticket: PerformedTicket,\n check: () => void,\n readmit?: () => Promise<void>,\n ) =>\n withTypingPort(page, ticket, async () => {\n const pacing = ownerPacing(ticket);\n\n check();\n pacing.requireDuration(schedule.durationMillis);\n ticket.dispatch();\n await element.selectText({ timeout: ticket.remainingMillis() });\n ticket.acknowledge?.({ subphase: \"focus\", logicalComplete: false });\n await readmit?.();\n check();\n const before = pacing.now();\n\n await requireFocus(element);\n const roundTrip = pacing.now() - before;\n\n // The erase (a key-down and key-up) and every stroke must fit before the old value goes.\n const pace = makePace(\n pacing,\n schedule.strokes,\n pacing.now() + 2n * roundTrip,\n true,\n [],\n true,\n );\n\n pace.observeFocus(roundTrip);\n pace.require(0);\n check();\n ticket.dispatch();\n await page.keyboard.press(\"Backspace\");\n ticket.acknowledge?.({ subphase: \"key-burst\", logicalComplete: false });\n if (schedule.strokes.length > 0) await readmit?.();\n check();\n await pacedKeys(page.keyboard, schedule, ticket, check, element);\n });\n\n /** Sends under one dispatch, either to whatever has focus or to the one element that must. */\n const send = async (\n into: ElementTarget | undefined,\n ticket: Ticket,\n policy: AdmissionPolicy | undefined,\n keys: (page: Page, element?: ElementHandle<Element>, check?: () => void) => Promise<void>,\n browserTarget: DriverTarget,\n ): Promise<NativeInput> => {\n if (into !== undefined) browserTarget = elements.targetFor(into, browserTarget);\n const { page } = current(browserTarget).entry;\n\n if (into === undefined) {\n if (ticket.performance === undefined) ticket.dispatch();\n await keys(page, undefined, () => ticket.check());\n ticket.acknowledge?.();\n ticket.followUp?.();\n } else\n await elements.withAdmittedElement(\n into,\n ticket,\n (element) => requireFocus(element),\n (element, _admitted, check) => keys(page, element, check),\n policy,\n browserTarget,\n false,\n ticket.performance === undefined,\n );\n ticket.check();\n\n return receipt(page);\n };\n\n const press = (\n key: string,\n modifiers: ReadonlyArray<KeyModifier>,\n into: ElementTarget | undefined,\n ticket: Ticket,\n policy: AdmissionPolicy | undefined,\n browserTarget: DriverTarget,\n ) =>\n sanitize(async () => {\n if (isPerformed(ticket)) {\n const performed = ticket;\n const schedule = planKeys(\" \", performed);\n const planned = schedule.strokes[0];\n\n if (planned === undefined) throw failure(Reasons.Malformed.make({}), \"undispatched\");\n ownerPacing(performed).requireDuration(planned.holdMillis);\n if (into !== undefined) browserTarget = elements.targetFor(into, browserTarget);\n const { page } = current(browserTarget).entry;\n\n return withTypingPort(page, ticket, () =>\n send(\n into,\n ticket,\n policy,\n (_page, element, check) => {\n const stroke = { ...planned, key };\n const pacing = ownerPacing(performed);\n\n return pacedStroke(\n page.keyboard,\n stroke,\n performed,\n check ?? (() => performed.check()),\n makePace(pacing, [stroke], pacing.now(), element !== undefined, modifiers, false),\n 0,\n element,\n modifiers,\n false,\n );\n },\n browserTarget,\n ),\n );\n }\n\n // Both halves are closed vocabularies by now, so the engine's `+` syntax is only ever ours.\n return send(\n into,\n ticket,\n policy,\n (page) => page.keyboard.press([...modifiers, key].join(\"+\")),\n browserTarget,\n );\n });\n\n const type = (\n text: string,\n into: ElementTarget | undefined,\n ticket: Ticket,\n policy: AdmissionPolicy | undefined,\n browserTarget: DriverTarget,\n ) =>\n sanitize(async () => {\n if (into !== undefined) browserTarget = elements.targetFor(into, browserTarget);\n const { page } = current(browserTarget).entry;\n\n const performed = isPerformed(ticket)\n ? { ticket, schedule: prepareKeys(text, ticket) }\n : undefined;\n\n return withTypingPort(page, ticket, async (port) => {\n if (current(browserTarget).entry.page !== page)\n throw failure(Reasons.Stale.make({}), \"undispatched\");\n\n return send(\n into,\n ticket,\n policy,\n async (_page, element, check) => {\n if (performed !== undefined) {\n await pacedKeys(\n page.keyboard,\n performed.schedule,\n performed.ticket,\n check ?? (() => ticket.check()),\n element,\n );\n\n return;\n }\n const characters = [...text];\n\n for (let start = 0; start < characters.length; start += 16) {\n ticket.check();\n if (start > 0 && element !== undefined) {\n // Keep the exact admitted node; resolving a selector again could redirect input.\n await requireFocus(element);\n ticket.check();\n }\n await typeWindow(port, characters.slice(start, start + 16), ticket);\n }\n },\n browserTarget,\n );\n });\n });\n\n return {\n press,\n type,\n prepareKeys,\n fillElement,\n retire,\n retirePage,\n /** A typing slot on a `quarantined` page waits for its operator, not for a handoff drain. */\n drained: (quarantined: (page: Page) => boolean = () => false) =>\n [...typing].every(([page, slot]) => slot.idle !== undefined || quarantined(page)),\n };\n};\n","import { Schema } from \"effect\";\n\nimport { ControlFacts } from \"../../BrowserData.ts\";\nimport type { ActionTarget, Descriptor, FrameDescriptor } from \"../../PlanData.ts\";\nimport type { DriverTarget } from \"./Driver.ts\";\nimport type { Ticket } from \"./Owner.ts\";\n\nconst Presence = Schema.Literals([\"absent\", \"complete\", \"omitted\"]);\n\n/** Native completeness belongs to the host; it is never an observed control field. */\nexport const FactsCompleteness = Schema.Struct({\n label: Schema.Literals([\"complete\", \"omitted\"]),\n inputType: Presence,\n autocomplete: Presence,\n destination: Presence,\n formMethod: Presence,\n});\n\nexport type FactsCompleteness = typeof FactsCompleteness.Type;\n\n/** Missing metadata cannot establish complete recording evidence. */\nexport const NativeControlFacts = Schema.Struct({\n ...ControlFacts.fields,\n completeness: Schema.optionalKey(FactsCompleteness),\n});\n\nexport type NativeControlFacts = typeof NativeControlFacts.Type;\n\nexport interface DescriptorSample {\n readonly facts: ControlFacts;\n readonly scope: \"document\" | \"viewport\";\n readonly completeness?: FactsCompleteness;\n readonly frame?: FrameDescriptor;\n readonly frameComplete: boolean;\n readonly ordinal?: { readonly index: number; readonly of: number };\n}\n\n/** The producing observation authenticates this value in its private WeakMap. */\nexport interface ResolvedElement {\n readonly _tag: \"ResolvedElement\";\n readonly target: DriverTarget;\n}\n\nexport interface ResolvedGroup {\n readonly elements: ReadonlyArray<ResolvedElement>;\n readonly samples?: ReadonlyArray<DescriptorSample | undefined>;\n readonly activate: (ticket: Ticket) => void;\n readonly release: () => Promise<void>;\n}\n\nexport interface ResolveRequest {\n readonly target: ActionTarget;\n /** An earlier request naming this option's exact native parent select. */\n readonly parent?: number;\n /** A passive exact-node wait has no later input facts read to supply capture. */\n readonly captureInitial?: boolean;\n}\n\nexport interface DescriptorQuery {\n readonly descriptor: Descriptor;\n readonly parent?: Element;\n readonly contextual: boolean;\n}\n\nexport const MaximumGroupNodes = 32 * 65 + 1;\n\nexport const DescriptorReadResult = Schema.Struct({\n exhausted: Schema.Boolean,\n visited: Schema.Natural,\n results: Schema.Array(\n Schema.Struct({\n status: Schema.Literals([\"matched\", \"missing\", \"ambiguous\", \"incomplete\"]),\n count: Schema.Natural,\n documentCount: Schema.Natural,\n facts: Schema.optionalKey(NativeControlFacts),\n value: Schema.optionalKey(Schema.String.check(Schema.isMaxLength(65536))),\n }),\n ).check(Schema.isMaxLength(MaximumGroupNodes)),\n});\n\nexport type DescriptorReadResult = typeof DescriptorReadResult.Type;\n","import { Schema } from \"effect\";\n\nimport { type ControlFacts, ObservedControl, ViewportEvidence } from \"../../BrowserData.ts\";\nimport { NativeControlFacts, type DescriptorQuery } from \"./Descriptor.ts\";\n\nconst ControlIndex = Schema.Natural.check(Schema.isLessThanOrEqualTo(63));\n\n/**\n * What the page reader returns. It is decoded on the host, so a page that tampers with its own\n * prototypes can make a read fail but cannot make it return something unbounded or untyped.\n */\nexport const PageReadResult = Schema.Struct({\n text: Schema.String.check(Schema.isMaxLength(131072)),\n textTruncated: Schema.Boolean,\n controlsTruncated: Schema.Boolean,\n controls: Schema.Array(NativeControlFacts).check(Schema.isMaxLength(64)),\n /** Private selection identity, separate from every public control-facts projection. */\n selects: Schema.optionalKey(\n Schema.Array(\n Schema.Struct({\n index: ControlIndex,\n optionsTruncated: Schema.Boolean,\n options: Schema.Array(\n Schema.Struct({\n index: ControlIndex,\n value: Schema.String.check(Schema.isMaxLength(65536)),\n }),\n ).check(Schema.isMaxLength(64)),\n }),\n ).check(\n Schema.isMaxLength(64),\n Schema.makeFilter(\n (selects) => selects.reduce((size, select) => size + select.options.length, 0) <= 64,\n ),\n ),\n ),\n viewport: Schema.Struct(ViewportEvidence.fields),\n /**\n * Sampled points that something taking no pointer events lies over, which only the browser's\n * own hit test can settle. They were counted as uncertain in this reading.\n */\n pending: Schema.optionalKey(\n Schema.Struct({\n points: Schema.Array(Schema.Tuple([Schema.Int, Schema.Int])).check(\n Schema.isMinLength(1),\n Schema.isMaxLength(256),\n ),\n scrollX: Schema.Finite,\n scrollY: Schema.Finite,\n }),\n ),\n});\n\nexport type PageReadResult = typeof PageReadResult.Type;\n\n/**\n * What the browser found on top at one sampled point once pointer events are ignored: the\n * pointer's own target or something inside it (`self`), a box that paints there (`covered`), or\n * boxes that paint nothing there (`clear`).\n */\nexport const PointVerdict = Schema.Literals([\"self\", \"covered\", \"clear\"]);\n\nexport type PointVerdict = typeof PointVerdict.Type;\n\nexport interface PageReadRequest {\n readonly scope: \"document\" | \"viewport\";\n readonly maximumBytes: number;\n readonly controlLimit: number;\n /** Bounds the traversal itself, not just what is returned from it. */\n readonly nodeBudget: number;\n /** When set, only this exact node's facts are read and nothing is traversed. */\n readonly only?: Element;\n /** Action observations issue a visible select's choices even while its dropdown is closed. */\n readonly choices?: boolean;\n /**\n * Case-insensitive text a reading keeps, applied before any limit: text lines and controls\n * whose label contains it. A select is kept through its own label or any option label, and an\n * option only beside the select it belongs to.\n */\n readonly match?: string;\n /** Fresh membership and identity checks for already retained options; values stay private. */\n readonly options?: ReadonlyArray<{ readonly node: Element; readonly value: string }>;\n /** Descriptor matching counts its complete bounded universe before returning any node. */\n readonly descriptors?: ReadonlyArray<DescriptorQuery>;\n /** The browser's answers for the points an earlier reading of this page left pending. */\n readonly verdicts?: Readonly<Record<string, PointVerdict>>;\n /**\n * Classify these points against `top`, the box the browser found above each with pointer\n * events ignored, instead of reading anything.\n */\n readonly classify?: ReadonlyArray<readonly [number, number]>;\n}\n\n/** What makes a control the one that was inspected. Geometry is excluded: scrolling moves it. */\nexport const identityOf = (facts: ControlFacts): string =>\n JSON.stringify([\n facts.kind,\n facts.label,\n facts.disabled,\n facts.checked ?? null,\n facts.selected ?? null,\n facts.required ?? null,\n facts.multiple ?? null,\n facts.editable,\n facts.inputType ?? null,\n facts.autocomplete ?? null,\n facts.destination ?? null,\n facts.formMethod ?? null,\n ]);\n\n/**\n * The same identity without enablement. A form may enable the control it is about to use, so a\n * form step compares this and separately requires the control to be enabled now. `editable`\n * follows `disabled`, so it is left out too; a form step checks it where text is written.\n */\nexport const stableIdentityOf = (facts: ControlFacts): string =>\n JSON.stringify([\n facts.kind,\n facts.label,\n facts.checked ?? null,\n facts.selected ?? null,\n facts.required ?? null,\n facts.multiple ?? null,\n facts.inputType ?? null,\n facts.autocomplete ?? null,\n facts.destination ?? null,\n facts.formMethod ?? null,\n ]);\n\n/** The model-facing projection: no destination, form or geometry ever leaves through it. */\nexport const observedControl = (\n facts: ControlFacts,\n elementId: string,\n selection: { readonly selectElementId?: string; readonly optionsTruncated?: boolean } = {},\n): ObservedControl =>\n ObservedControl.make({\n elementId,\n kind: facts.kind,\n label: facts.label,\n disabled: facts.disabled,\n ...(facts.checked === undefined ? {} : { checked: facts.checked }),\n ...(facts.selected === undefined ? {} : { selected: facts.selected }),\n ...(facts.inputType === undefined ? {} : { inputType: facts.inputType }),\n ...(facts.required === undefined ? {} : { required: facts.required }),\n ...(facts.multiple === undefined ? {} : { multiple: facts.multiple }),\n ...selection,\n });\n\n/**\n * Runs inside the page, so it is one self-contained function: it may not reference anything in\n * this module. It reads; it never scrolls, focuses, mutates or dispatches.\n *\n * Visibility here is geometry and hit-testing, never a pixel comparison. Text is kept only when\n * its line boxes intersect the viewport and the browser finds its own element at a sampled\n * point. Something that takes no pointer events is invisible to that hit test, so a point with\n * such a box over it is left pending and counted as uncertain. The host then asks the browser\n * which box is on top there with pointer events ignored, which also finds boxes inside closed\n * shadow roots, and reads again with the answers: a box that paints at the point covers it, and\n * a box that paints nothing there does not. Nothing is kept as visible without that answer.\n *\n * With `classify`, it instead judges each point against `top`, the box the browser returned for\n * it, and returns one verdict per point.\n */\nexport const readPage = (\n request: PageReadRequest,\n top?: unknown,\n): { readonly nodes: Array<Element>; readonly data: unknown } => {\n const { scope, maximumBytes, controlLimit, nodeBudget, only } = request;\n const width = window.innerWidth;\n const height = window.innerHeight;\n const scrolling = document.scrollingElement;\n const needle = request.match?.toLowerCase();\n\n const matches = (value: string): boolean =>\n needle === undefined || value.toLowerCase().includes(needle);\n\n const evidence = {\n width,\n height,\n ...(scrolling === null\n ? {}\n : {\n documentScroll: {\n x: window.scrollX,\n y: window.scrollY,\n scrollWidth: scrolling.scrollWidth,\n scrollHeight: scrolling.scrollHeight,\n clientWidth: scrolling.clientWidth,\n clientHeight: scrolling.clientHeight,\n },\n }),\n clippedText: 0,\n coveredText: 0,\n uncertainText: 0,\n unreachableControls: 0,\n exhausted: false,\n };\n\n type Box = Pick<DOMRect, \"left\" | \"top\" | \"right\" | \"bottom\" | \"width\" | \"height\">;\n\n const intersects = (rect: Box): boolean =>\n rect.width > 0 &&\n rect.height > 0 &&\n rect.bottom > 0 &&\n rect.right > 0 &&\n rect.top < height &&\n rect.left < width;\n\n const within = (rect: DOMRect): boolean =>\n rect.top >= 0 && rect.left >= 0 && rect.bottom <= height && rect.right <= width;\n\n const contains = (rect: Box, x: number, y: number): boolean =>\n x >= rect.left && x < rect.right && y >= rect.top && y < rect.bottom;\n\n /** The flat-tree parent: a shadow root's host rather than the root itself. */\n const parentOf = (node: Node): Node | null => {\n const parent = node.parentNode;\n\n return parent instanceof ShadowRoot ? parent.host : parent;\n };\n\n /** Whether `inner` is `outer` or lies inside it, across shadow boundaries. */\n const holds = (outer: Node, inner: Node): boolean => {\n for (let node: Node | null = inner; node !== null; node = parentOf(node))\n if (node === outer) return true;\n\n return false;\n };\n\n const related = (left: Node, right: Node): boolean => holds(left, right) || holds(right, left);\n\n /** The alpha of a computed colour; an unparsed format counts as opaque. */\n const alphaOf = (color: string): number => {\n if (color === \"transparent\") return 0;\n const inside = /\\(([^)]*)\\)/.exec(color)?.[1];\n\n if (inside === undefined) return 1;\n const alpha = inside.includes(\"/\") ? inside.split(\"/\")[1] : inside.split(\",\")[3];\n\n if (alpha === undefined) return 1;\n const value = Number.parseFloat(alpha);\n\n if (Number.isNaN(value)) return 1;\n\n return alpha.trim().endsWith(\"%\") ? value / 100 : value;\n };\n\n /** Whether a computed style draws anything of its own: a fill, a border, a shadow or an effect. */\n const draws = (style: CSSStyleDeclaration): boolean =>\n alphaOf(style.backgroundColor) > 0 ||\n style.backgroundImage !== \"none\" ||\n [\"top\", \"right\", \"bottom\", \"left\"].some(\n (side) =>\n Number.parseFloat(style.getPropertyValue(`border-${side}-width`)) > 0 &&\n ![\"none\", \"hidden\"].includes(style.getPropertyValue(`border-${side}-style`)) &&\n alphaOf(style.getPropertyValue(`border-${side}-color`)) > 0,\n ) ||\n style.boxShadow !== \"none\" ||\n (style.outlineStyle !== \"none\" && Number.parseFloat(style.outlineWidth) > 0) ||\n style.filter !== \"none\" ||\n (style.getPropertyValue(\"backdrop-filter\") || \"none\") !== \"none\" ||\n style.mixBlendMode !== \"normal\";\n\n // Elements whose own box shows content, whatever their style says.\n const replaced = new Set([\n \"IMG\",\n \"VIDEO\",\n \"CANVAS\",\n \"IFRAME\",\n \"EMBED\",\n \"OBJECT\",\n \"INPUT\",\n \"SELECT\",\n \"TEXTAREA\",\n \"BUTTON\",\n \"METER\",\n \"PROGRESS\",\n ]);\n\n const pseudoDraws = (element: Element, type: \"::before\" | \"::after\"): boolean => {\n const style = getComputedStyle(element, type);\n\n return (\n style.content !== \"none\" &&\n style.content !== \"normal\" &&\n style.display !== \"none\" &&\n (draws(style) || !/^(\"\"|'')$/.test(style.content))\n );\n };\n\n /** Whether `element` has its own text on a line box over the point. */\n const textAt = (element: Element, x: number, y: number): boolean => {\n const lines = document.createRange();\n\n for (const child of element.childNodes) {\n if (!(child instanceof Text) || child.data.trim() === \"\") continue;\n lines.selectNodeContents(child);\n for (const rect of lines.getClientRects()) if (contains(rect, x, y)) return true;\n }\n\n return false;\n };\n\n /** Whether `element` itself, not a descendant, paints at the point. */\n const paintsAt = (element: Element, x: number, y: number): boolean =>\n element.checkVisibility?.({ opacityProperty: true, visibilityProperty: true }) !== false &&\n (replaced.has(element.tagName) ||\n element instanceof SVGElement ||\n draws(getComputedStyle(element)) ||\n textAt(element, x, y));\n\n /** The element the pointer would reach at this point, inside open shadow roots. */\n const pointerAt = (x: number, y: number): Element | null => {\n let hit = document.elementFromPoint(x, y);\n\n while (hit?.shadowRoot) {\n const inner = hit.shadowRoot.elementFromPoint(x, y);\n\n if (inner === null || inner === hit) break;\n hit = inner;\n }\n\n return hit;\n };\n\n if (request.classify !== undefined) {\n // `top` is an Element, or a CSSPseudoElement that stands for a ::before or ::after box.\n const pseudo =\n top instanceof Node || typeof top !== \"object\" || top === null\n ? undefined\n : (top as { readonly element?: unknown; readonly type?: unknown });\n\n const origin =\n top instanceof Element\n ? top\n : pseudo?.element instanceof Element\n ? pseudo.element\n : undefined;\n\n const verdictAt = ([x, y]: readonly [number, number]): string => {\n const hit = pointerAt(x, y);\n\n if (hit === null || origin === undefined) return \"unknown\";\n if (pseudo === undefined) {\n if (related(origin, hit)) return \"self\";\n } else {\n // The pointer's own generated box, or one of something inside it.\n if (holds(hit, origin)) return \"self\";\n if (pseudoDraws(origin, pseudo.type === \"::after\" ? \"::after\" : \"::before\"))\n return \"covered\";\n }\n // Every box from the top down to the first one that also holds the pointer's target lies\n // above that target here. Any of them that paints at the point covers it.\n for (\n let node: Node | null = origin;\n node !== null && !holds(node, hit);\n node = parentOf(node)\n )\n if (\n node instanceof Element &&\n contains(node.getBoundingClientRect(), x, y) &&\n paintsAt(node, x, y)\n )\n return \"covered\";\n\n return \"clear\";\n };\n\n return { nodes: [], data: request.classify.map(verdictAt) };\n }\n\n // Boxes of elements that take no pointer events, in the light DOM and open shadow roots.\n // Hit-testing sees through them, so a point beneath one waits for the browser's own answer.\n // `painting` keeps those that draw something of their own, with painting pseudo-elements at an\n // approximated box. The scan has its own budget: an incomplete one leaves every point pending.\n const boxes: Array<{ readonly element: Element; readonly rect: Box }> = [];\n const painting: Array<{ readonly element: Element; readonly rect: Box }> = [];\n let scanned = 0;\n let scanComplete = true;\n\n if (only === undefined && scope === \"viewport\" && document.body !== null) {\n const roots: Array<ParentNode> = [document.body];\n\n for (let root = roots.pop(); root !== undefined && scanComplete; root = roots.pop()) {\n const all = root.querySelectorAll(\"*\");\n\n for (let i = 0; i < all.length; i++) {\n const element = all[i];\n\n if (++scanned > nodeBudget || boxes.length >= 512 || painting.length >= 512) {\n scanComplete = false;\n break;\n }\n if (element === undefined) continue;\n if (element.shadowRoot !== null) roots.push(element.shadowRoot);\n const style = getComputedStyle(element);\n\n if (style.pointerEvents !== \"none\" || style.visibility === \"hidden\") continue;\n if (Number(style.opacity) <= 0) continue;\n const rect = element.getBoundingClientRect();\n\n if (intersects(rect)) {\n boxes.push({ element, rect });\n if (\n replaced.has(element.tagName) ||\n element instanceof SVGElement ||\n draws(style) ||\n [...element.childNodes].some(\n (child) => child instanceof Text && child.data.trim() !== \"\",\n )\n )\n painting.push({ element, rect });\n }\n for (const type of [\"::before\", \"::after\"] as const) {\n if (!pseudoDraws(element, type)) continue;\n const generated = getComputedStyle(element, type);\n let area: Box = rect;\n\n // A positioned pseudo-element is placed from its host's box; others fill it.\n if (\n (generated.position === \"absolute\" || generated.position === \"fixed\") &&\n style.position !== \"static\"\n ) {\n const left = rect.left + (Number.parseFloat(generated.left) || 0);\n const top = rect.top + (Number.parseFloat(generated.top) || 0);\n const across = Number.parseFloat(generated.width) || 0;\n const down = Number.parseFloat(generated.height) || 0;\n\n area = {\n left,\n top,\n right: left + across,\n bottom: top + down,\n width: across,\n height: down,\n };\n }\n if (intersects(area)) {\n boxes.push({ element, rect: area });\n painting.push({ element, rect: area });\n }\n }\n }\n }\n if (!scanComplete) evidence.exhausted = true;\n }\n\n const pending: Array<readonly [number, number]> = [];\n const pendingKeys = new Set<string>();\n let visited = 0;\n\n /** Whether the browser finds `owner` at this point, and how far that can be trusted. */\n const hitTest = (owner: Element, rect: DOMRect): \"self\" | \"covered\" | \"uncertain\" => {\n const x = Math.floor(Math.min(width - 1, Math.max(0, rect.left + rect.width / 2)));\n const y = Math.floor(Math.min(height - 1, Math.max(0, rect.top + rect.height / 2)));\n const hit = pointerAt(x, y);\n\n if (hit === null) return \"uncertain\";\n if (hit !== owner && !owner.contains(hit) && !hit.contains(owner)) return \"covered\";\n\n const over = (layers: ReadonlyArray<{ readonly element: Element; readonly rect: Box }>) =>\n layers.some((layer) => !related(layer.element, owner) && contains(layer.rect, x, y));\n\n if (scanComplete && !over(boxes)) return \"self\";\n const key = `${String(x)},${String(y)}`;\n const verdict = request.verdicts?.[key];\n\n if (verdict === \"self\") return \"self\";\n if (verdict === \"covered\") return \"covered\";\n // Nothing on top paints here; a painting box beneath the top one could still hide it.\n if (verdict === \"clear\") return over(painting) ? \"uncertain\" : \"self\";\n if (request.verdicts === undefined && !pendingKeys.has(key) && pending.length < 256) {\n pendingKeys.add(key);\n pending.push([x, y]);\n }\n\n return \"uncertain\";\n };\n\n const factsOf = (node: Element) => {\n const tag = node.tagName.toLowerCase();\n const role = node.getAttribute(\"role\");\n\n const booleanAttribute = (name: string): boolean | undefined => {\n const value = node.getAttribute(name);\n\n return value === \"true\" ? true : value === \"false\" ? false : undefined;\n };\n\n const isNativeToggle =\n node instanceof HTMLInputElement && (node.type === \"checkbox\" || node.type === \"radio\");\n\n const checked = isNativeToggle\n ? node.type === \"checkbox\" && node.indeterminate\n ? undefined\n : node.checked\n : role !== null &&\n [\"checkbox\", \"radio\", \"switch\", \"menuitemcheckbox\", \"menuitemradio\"].includes(role)\n ? booleanAttribute(\"aria-checked\")\n : undefined;\n\n const selected =\n node instanceof HTMLOptionElement\n ? node.selected\n : !(node instanceof HTMLSelectElement) &&\n role !== null &&\n [\"option\", \"tab\", \"treeitem\", \"row\", \"gridcell\"].includes(role)\n ? booleanAttribute(\"aria-selected\")\n : undefined;\n\n const required =\n node instanceof HTMLSelectElement ||\n node instanceof HTMLTextAreaElement ||\n (node instanceof HTMLInputElement &&\n ![\"hidden\", \"button\", \"submit\", \"reset\", \"image\", \"range\", \"color\"].includes(node.type))\n ? node.required\n : role !== null &&\n [\n \"checkbox\",\n \"combobox\",\n \"gridcell\",\n \"listbox\",\n \"radiogroup\",\n \"spinbutton\",\n \"textbox\",\n \"tree\",\n ].includes(role)\n ? booleanAttribute(\"aria-required\")\n : undefined;\n\n const field =\n node instanceof HTMLInputElement ||\n node instanceof HTMLButtonElement ||\n node instanceof HTMLSelectElement ||\n node instanceof HTMLTextAreaElement\n ? node\n : undefined;\n\n const submits =\n (node instanceof HTMLButtonElement && node.type === \"submit\") ||\n (node instanceof HTMLInputElement && (node.type === \"submit\" || node.type === \"image\"));\n\n // The effective destination: a resolved link target, or where this control submits its\n // form, including a `formaction` override. The browser resolves both against the base URL.\n const form = submits ? field?.form : undefined;\n\n const target =\n node instanceof HTMLAnchorElement || node instanceof HTMLAreaElement\n ? node.href\n : form === undefined || form === null\n ? undefined\n : node.hasAttribute(\"formaction\") && field !== undefined && \"formAction\" in field\n ? field.formAction\n : form.action;\n\n const method =\n form === undefined || form === null\n ? undefined\n : (node.hasAttribute(\"formmethod\") && field !== undefined && \"formMethod\" in field\n ? field.formMethod\n : form.method\n ).toLowerCase();\n\n const disabled = node.matches(\":disabled\") || node.getAttribute(\"aria-disabled\") === \"true\";\n const rect = node.getBoundingClientRect();\n const placement = !intersects(rect) ? \"outside\" : within(rect) ? \"inside\" : \"partial\";\n\n const autocomplete =\n node instanceof HTMLInputElement ||\n node instanceof HTMLSelectElement ||\n node instanceof HTMLTextAreaElement\n ? node.autocomplete\n : \"\";\n\n // Entered or editable content is a control's value, never its name: text typed into it must\n // not become a label that observations show and recordings store.\n const editable =\n (node instanceof HTMLElement && node.isContentEditable) ||\n (role !== null && [\"textbox\", \"searchbox\", \"combobox\", \"spinbutton\"].includes(role));\n\n const label =\n node.getAttribute(\"aria-label\") ??\n node.getAttribute(\"placeholder\") ??\n (node instanceof HTMLInputElement || node instanceof HTMLTextAreaElement\n ? (node.labels?.[0]?.textContent ?? node.getAttribute(\"aria-placeholder\"))\n : node instanceof HTMLOptionElement\n ? node.label\n : editable\n ? node.getAttribute(\"aria-placeholder\")\n : node.textContent) ??\n \"\";\n\n const inputType =\n node instanceof HTMLInputElement || node instanceof HTMLButtonElement ? node.type : undefined;\n\n return {\n kind:\n tag === \"a\"\n ? \"link\"\n : [\"button\", \"input\", \"select\", \"textarea\"].includes(tag)\n ? tag\n : \"other\",\n label: label.slice(0, 256),\n completeness: {\n label: label.length <= 256 ? (\"complete\" as const) : (\"omitted\" as const),\n inputType:\n inputType === undefined\n ? (\"absent\" as const)\n : inputType.length <= 32\n ? (\"complete\" as const)\n : (\"omitted\" as const),\n autocomplete:\n autocomplete === \"\"\n ? (\"absent\" as const)\n : autocomplete.length <= 128\n ? (\"complete\" as const)\n : (\"omitted\" as const),\n destination:\n target === undefined\n ? (\"absent\" as const)\n : target.length <= 2048\n ? (\"complete\" as const)\n : (\"omitted\" as const),\n formMethod:\n method === undefined\n ? (\"absent\" as const)\n : method === \"get\" || method === \"post\" || method === \"dialog\"\n ? (\"complete\" as const)\n : (\"omitted\" as const),\n },\n disabled,\n ...(checked === undefined ? {} : { checked }),\n ...(selected === undefined ? {} : { selected }),\n ...(required === undefined ? {} : { required }),\n ...(node instanceof HTMLSelectElement ? { multiple: node.multiple } : {}),\n editable:\n !disabled &&\n (node instanceof HTMLInputElement || node instanceof HTMLTextAreaElement\n ? !node.readOnly\n : node instanceof HTMLSelectElement),\n ...(inputType === undefined ? {} : { inputType: inputType.slice(0, 32) }),\n ...(autocomplete === \"\" ? {} : { autocomplete: autocomplete.slice(0, 128) }),\n // An over-long destination is left out, never cut: half a URL is a different URL.\n ...(target === undefined || target.length > 2048 ? {} : { destination: target }),\n ...(method === \"get\" || method === \"post\" || method === \"dialog\"\n ? { formMethod: method }\n : {}),\n box: { x: rect.left, y: rect.top, width: rect.width, height: rect.height },\n placement,\n hitTest: placement === \"outside\" ? \"unsampled\" : hitTest(node, rect),\n mainFrame: window.top === window,\n };\n };\n\n if (request.descriptors !== undefined) {\n const candidateSelector =\n \"a[href],button,input,select,textarea,option,[role=button],[role=checkbox],[role=radio],[role=switch],[role=menuitemcheckbox],[role=menuitemradio],[role=option],[role=tab],[role=treeitem],[role=row],[role=gridcell],[role=textbox],[role=combobox],[role=listbox],[role=radiogroup],[role=spinbutton],[role=tree]\";\n\n const matches = request.descriptors.map(() => ({\n documentCount: 0,\n visibleCount: 0,\n document: undefined as\n | { readonly node: Element; readonly facts: ReturnType<typeof factsOf> }\n | undefined,\n visible: undefined as\n | { readonly node: Element; readonly facts: ReturnType<typeof factsOf> }\n | undefined,\n uncertain: false,\n }));\n\n const walker = document.createTreeWalker(document, NodeFilter.SHOW_ELEMENT);\n let exhausted = false;\n\n for (let candidate = walker.nextNode(); candidate !== null; candidate = walker.nextNode()) {\n if (++visited > nodeBudget) {\n exhausted = true;\n break;\n }\n if (!(candidate instanceof Element) || !candidate.matches(candidateSelector)) continue;\n const facts = factsOf(candidate);\n\n for (const [index, query] of request.descriptors.entries()) {\n const result = matches[index];\n const descriptor = query.descriptor;\n\n if (\n result === undefined ||\n facts.kind !== descriptor.kind ||\n facts.completeness.label !== \"complete\" ||\n facts.label !== descriptor.label\n )\n continue;\n if (\n query.parent !== undefined &&\n (!(query.parent instanceof HTMLSelectElement) ||\n !(candidate instanceof HTMLOptionElement) ||\n candidate.closest(\"select\") !== query.parent ||\n query.parent.options.item(candidate.index) !== candidate)\n )\n continue;\n if (\n descriptor.destination !== undefined &&\n (facts.completeness.destination !== \"complete\" ||\n facts.destination !== descriptor.destination)\n )\n continue;\n const identity = descriptor.identity;\n\n if (\n identity !== undefined &&\n ((identity.inputType !== undefined &&\n (facts.completeness.inputType !== \"complete\" ||\n facts.inputType !== identity.inputType)) ||\n (identity.autocomplete !== undefined &&\n (facts.completeness.autocomplete !== \"complete\" ||\n facts.autocomplete !== identity.autocomplete)) ||\n (identity.formMethod !== undefined &&\n (facts.completeness.formMethod !== \"complete\" ||\n facts.formMethod !== identity.formMethod)))\n )\n continue;\n const matched = { node: candidate, facts };\n\n if (result.documentCount === (descriptor.ordinal?.index ?? 0)) result.document = matched;\n result.documentCount++;\n if (facts.hitTest === \"self\") {\n if (result.visibleCount === (descriptor.ordinal?.index ?? 0)) result.visible = matched;\n result.visibleCount++;\n } else if (facts.hitTest === \"uncertain\" && facts.placement !== \"outside\")\n result.uncertain = true;\n }\n }\n\n const nodes: Array<Element> = [];\n\n const results = request.descriptors.map((query, index) => {\n const result = matches[index];\n\n const picked =\n query.descriptor.matchScope === \"viewport\" ? result?.visible : result?.document;\n\n const count =\n query.descriptor.matchScope === \"viewport\"\n ? (result?.visibleCount ?? 0)\n : (result?.documentCount ?? 0);\n\n const documentCount = result?.documentCount ?? 0;\n\n const status = (value: \"missing\" | \"ambiguous\" | \"incomplete\") => ({\n status: value,\n count,\n documentCount,\n });\n\n if (exhausted) return status(\"incomplete\");\n if (query.descriptor.matchScope === \"viewport\") {\n if (result?.uncertain) return status(\"incomplete\");\n }\n if (count === 0) return status(\"missing\");\n if (query.descriptor.matchScope === \"viewport\" && !query.contextual && documentCount > 1)\n return { ...status(\"ambiguous\"), count: documentCount };\n const ordinal = query.descriptor.ordinal;\n\n if (ordinal !== undefined && ordinal.of !== count) return status(\"incomplete\");\n if (ordinal === undefined && count !== 1) return status(\"ambiguous\");\n if (picked === undefined) return status(\"incomplete\");\n if (query.parent !== undefined && picked.node instanceof HTMLOptionElement) {\n if (picked.node.value.length > 65536) return status(\"incomplete\");\n nodes.push(picked.node);\n\n return {\n status: \"matched\",\n count,\n documentCount,\n facts: picked.facts,\n value: picked.node.value,\n };\n }\n nodes.push(picked.node);\n\n return { status: \"matched\", count, documentCount, facts: picked.facts };\n });\n\n return { nodes, data: { exhausted, visited, results } };\n }\n\n if (only !== undefined)\n return {\n nodes: [only],\n data: {\n facts: factsOf(only),\n ...(request.options === undefined\n ? {}\n : {\n attached: only.isConnected && only.ownerDocument === document,\n options: request.options.map(({ node, value }) => ({\n facts: factsOf(node),\n member:\n only instanceof HTMLSelectElement &&\n node instanceof HTMLOptionElement &&\n node.isConnected &&\n node.ownerDocument === document &&\n node.closest(\"select\") === only &&\n only.options.item(node.index) === node,\n valueMatches: node instanceof HTMLOptionElement && node.value === value,\n })),\n }),\n },\n };\n\n const nodes: Array<Element> = [];\n const controls: Array<ReturnType<typeof factsOf>> = [];\n const selectIndices = new Map<HTMLSelectElement, number>();\n\n const candidates = document.querySelectorAll(\n \"a[href],button,input,select,textarea,option,[role=button],[role=checkbox],[role=radio],[role=switch],[role=menuitemcheckbox],[role=menuitemradio],[role=option],[role=tab],[role=treeitem],[role=row],[role=gridcell],[role=textbox],[role=combobox],[role=listbox],[role=radiogroup],[role=spinbutton],[role=tree]\",\n );\n\n let controlsTruncated = false;\n\n for (let i = 0; i < candidates.length; i++) {\n if (++visited > nodeBudget) {\n evidence.exhausted = true;\n controlsTruncated = true;\n break;\n }\n const node = candidates[i];\n\n if (node === undefined) continue;\n const facts = factsOf(node);\n\n const parentSelect = node instanceof HTMLOptionElement ? node.closest(\"select\") : null;\n\n const choice =\n request.choices === true && parentSelect !== null && selectIndices.has(parentSelect);\n\n // A select stays with its choices: it matches through its own label or any option label,\n // and an option is kept only beside the select it belongs to.\n if (needle !== undefined) {\n const kept =\n node instanceof HTMLOptionElement\n ? parentSelect !== null && selectIndices.has(parentSelect)\n : matches(facts.label) ||\n (node instanceof HTMLSelectElement &&\n Array.from(node.options).some((option) => matches(option.label)));\n\n if (!kept) continue;\n }\n\n // Choices of a visible native select are metadata, not evidence of visible dropdown rows.\n // Filter before applying the shared limit so offscreen controls cannot spend it first.\n if (scope === \"viewport\" && !choice && facts.hitTest !== \"self\") {\n if (facts.placement !== \"outside\") evidence.unreachableControls++;\n continue;\n }\n if (nodes.length >= controlLimit) {\n controlsTruncated = true;\n break;\n }\n nodes.push(node);\n controls.push(facts);\n if (node instanceof HTMLSelectElement) selectIndices.set(node, nodes.length - 1);\n }\n\n const selects =\n request.choices === true\n ? [...selectIndices].map(([select, index]) => {\n const options: Array<{ readonly index: number; readonly value: string }> = [];\n\n nodes.forEach((node, optionIndex) => {\n if (\n node instanceof HTMLOptionElement &&\n node.closest(\"select\") === select &&\n select.options.item(node.index) === node\n ) {\n const value = node.value;\n\n if (value.length <= 65536) options.push({ index: optionIndex, value });\n }\n });\n\n return { index, options, optionsTruncated: options.length !== select.options.length };\n })\n : undefined;\n\n const encoder = new TextEncoder();\n let text = \"\";\n let textTruncated = false;\n\n if (scope === \"document\") {\n const whole = document.body?.innerText ?? \"\";\n\n const encoded = encoder.encode(\n needle === undefined\n ? whole\n : whole\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter((line) => line !== \"\" && matches(line))\n .join(\"\\n\"),\n );\n\n let end = Math.min(encoded.length, maximumBytes);\n\n // Do not manufacture a replacement character by cutting a UTF-8 sequence.\n while (end > 0 && end < encoded.length && ((encoded[end] ?? 0) & 192) === 128) end--;\n text = new TextDecoder().decode(encoded.subarray(0, end));\n textTruncated = end < encoded.length;\n } else if (document.body !== null) {\n const walker = document.createTreeWalker(document.body, NodeFilter.SHOW_TEXT);\n const range = document.createRange();\n let bytes = 0;\n let lastBottom = Number.NEGATIVE_INFINITY;\n\n // The first laid-out character at or after `index`; collapsed whitespace has no box.\n const boxAt = (node: Text, index: number): DOMRect | undefined => {\n const length = node.data.length;\n\n for (let k = index; k < Math.min(length, index + 8); k++) {\n range.setStart(node, k);\n range.setEnd(node, k + 1);\n const rect = range.getClientRects()[0];\n\n if (rect !== undefined && rect.width + rect.height > 0) return rect;\n }\n\n return undefined;\n };\n\n for (let node = walker.nextNode(); node !== null; node = walker.nextNode()) {\n if (++visited > nodeBudget) {\n evidence.exhausted = true;\n textTruncated = true;\n break;\n }\n const owner = node.parentElement;\n\n if (!(node instanceof Text) || owner === null || node.data.trim() === \"\") continue;\n if ([\"SCRIPT\", \"STYLE\", \"NOSCRIPT\", \"TEMPLATE\"].includes(owner.tagName)) continue;\n if (owner.checkVisibility?.({ opacityProperty: true, visibilityProperty: true }) === false)\n continue;\n range.selectNodeContents(node);\n const lines = [...range.getClientRects()].filter(intersects);\n const first = lines[0];\n\n // Laid out entirely off screen: not evidence of anything, and not counted as hidden.\n if (first === undefined) continue;\n const verdict = hitTest(owner, first);\n\n if (verdict !== \"self\") {\n if (verdict === \"covered\") evidence.coveredText++;\n else evidence.uncertainText++;\n continue;\n }\n range.selectNodeContents(node);\n let visible = node.data;\n\n if (![...range.getClientRects()].every(within)) {\n // Lines run top to bottom, so the visible run is found by bisecting on character boxes\n // rather than by copying a whole node of which one line is on screen.\n const length = node.data.length;\n let low = 0;\n let high = length;\n\n while (low < high) {\n const middle = (low + high) >> 1;\n const rect = boxAt(node, middle);\n\n if (rect === undefined || rect.bottom <= 0) low = middle + 1;\n else high = middle;\n }\n const start = low;\n\n high = length;\n while (low < high) {\n const middle = (low + high) >> 1;\n const rect = boxAt(node, middle);\n\n if (rect !== undefined && rect.top >= height) high = middle;\n else low = middle + 1;\n }\n visible = node.data.slice(start, low);\n evidence.clippedText++;\n }\n const fragment = visible.replace(/\\s+/g, \" \").trim();\n\n if (fragment === \"\" || !matches(fragment)) continue;\n const joined = (text === \"\" ? \"\" : first.top >= lastBottom - 1 ? \"\\n\" : \" \") + fragment;\n const size = encoder.encode(joined).length;\n\n if (bytes + size > maximumBytes) {\n textTruncated = true;\n break;\n }\n text += joined;\n bytes += size;\n lastBottom = Math.max(lastBottom, first.bottom);\n }\n }\n\n return {\n nodes,\n data: {\n text,\n textTruncated,\n controlsTruncated,\n controls,\n viewport: evidence,\n ...(selects === undefined ? {} : { selects }),\n ...(pending.length === 0\n ? {}\n : { pending: { points: pending, scrollX: window.scrollX, scrollY: window.scrollY } }),\n },\n };\n};\n","import { Schema } from \"effect\";\nimport type { ElementHandle, Frame, JSHandle, Page } from \"playwright-core\";\n\nimport { ControlFacts, type ObservedElement, type SelectOptions } from \"../../BrowserData.ts\";\nimport { BrowserError, Reasons } from \"../../Errors.ts\";\nimport type { Condition, Descriptor, FrameDescriptor, ResolveGuard } from \"../../PlanData.ts\";\nimport {\n DescriptorReadResult,\n MaximumGroupNodes,\n NativeControlFacts,\n type DescriptorSample,\n type ResolveRequest,\n type ResolvedElement,\n type ResolvedGroup,\n} from \"./Descriptor.ts\";\nimport type { DriverEvents, DriverTarget, NativeCheckpoint, NativeObservation } from \"./Driver.ts\";\nimport { pngGeometry } from \"./Images.ts\";\nimport {\n closeWithin,\n failure,\n NativeFailure,\n safeDecode,\n sanitize,\n timeout,\n} from \"./NativeCalls.ts\";\nimport type { ObservationScope, ReadTicket, Ticket } from \"./Owner.ts\";\nimport {\n identityOf,\n observedControl,\n PageReadResult,\n PointVerdict,\n readPage,\n stableIdentityOf,\n} from \"./PageRead.ts\";\nimport type { Targets } from \"./Targets.ts\";\n\nexport type {\n DescriptorSample,\n ResolveRequest,\n ResolvedElement,\n ResolvedGroup,\n} from \"./Descriptor.ts\";\n\nconst TextResult = Schema.Struct({\n text: Schema.String,\n missing: Schema.Boolean,\n byteLength: Schema.Natural,\n});\n\nconst Geometry = Schema.Struct({ width: Schema.Natural, height: Schema.Natural });\n\nconst checkScreenshotGeometry = (geometry: typeof Geometry.Type) => {\n if (geometry.width < 1) throw failure(Reasons.Malformed.make({ path: \"screenshot.width\" }));\n if (geometry.height < 1) throw failure(Reasons.Malformed.make({ path: \"screenshot.height\" }));\n if (geometry.width > 16384)\n throw failure(\n Reasons.Limit.make({ dimension: \"width\", maximum: 16384, observed: geometry.width }),\n );\n if (geometry.height > 16384)\n throw failure(\n Reasons.Limit.make({ dimension: \"height\", maximum: 16384, observed: geometry.height }),\n );\n const pixels = geometry.width * geometry.height;\n\n if (pixels > 33_554_432)\n throw failure(\n Reasons.Limit.make({ dimension: \"pixels\", maximum: 33_554_432, observed: pixels }),\n );\n};\n\nconst Count = Schema.Natural.check(Schema.isLessThanOrEqualTo(1000000));\n\nconst Facts = Schema.Struct({ facts: NativeControlFacts });\n\nconst SelectionFacts = Schema.Struct({\n facts: NativeControlFacts,\n attached: Schema.Boolean,\n options: Schema.Array(\n Schema.Struct({\n facts: NativeControlFacts,\n member: Schema.Boolean,\n valueMatches: Schema.Boolean,\n }),\n ).check(Schema.isMaxLength(64)),\n});\n\n/** Bounds the page traversal itself, so a huge document costs a bounded read. */\nconst NodeBudget = 20_000;\n\n/** Bounds the browser's own hit test for one reading; past it, pending points stay uncertain. */\nconst ConfirmMillis = 5000;\n\nconst FrameTree = Schema.Struct({\n frameTree: Schema.Struct({ frame: Schema.Struct({ id: Schema.String }) }),\n});\n\nconst Located = Schema.Struct({ backendNodeId: Schema.Int, frameId: Schema.String });\n\nconst Resolved = Schema.Struct({ object: Schema.Struct({ objectId: Schema.String }) });\n\nconst Classified = Schema.Struct({\n result: Schema.Struct({\n value: Schema.Struct({\n data: Schema.Array(Schema.Union([PointVerdict, Schema.Literal(\"unknown\")])).check(\n Schema.isMaxLength(256),\n ),\n }),\n }),\n});\n\ninterface NativeRetention {\n readonly own: (value: object, dispose: () => Promise<unknown>, slots?: number) => void;\n readonly dispose: (value: object) => Promise<void>;\n readonly work: <A>(body: () => Promise<A>) => Promise<A>;\n}\n\n/**\n * Asks the browser which box is on top at each pending point once pointer events are ignored,\n * then has the page judge whether that box paints there. Chromium's own hit test finds boxes the\n * page cannot see, such as those inside closed shadow roots. It runs on a short-lived session of\n * the page's existing connection, reads only, and answers for main-frame boxes; a point whose\n * top box belongs to another frame, or whose answer does not arrive, gets no verdict.\n */\nconst confirmPending = async (\n page: Page,\n pending: NonNullable<PageReadResult[\"pending\"]>,\n check: () => void,\n retention?: NativeRetention,\n): Promise<Record<string, PointVerdict>> => {\n const cdp = await page.context().newCDPSession(page);\n const group = \"effect-browser-occlusion\";\n\n const dispose = async () => {\n await closeWithin(() => cdp.send(\"Runtime.releaseObjectGroup\", { objectGroup: group })).catch(\n () => {},\n );\n await cdp.detach();\n };\n\n // A detached port positively retires its object group too. Failed detach retains the\n // reservation, even when the caller's occlusion deadline has already returned.\n retention?.own(cdp, dispose, 257);\n\n try {\n check();\n\n const [tree, ...located] = await Promise.all([\n cdp.send(\"Page.getFrameTree\"),\n ...pending.points.map(([x, y]) =>\n cdp\n .send(\"DOM.getNodeForLocation\", {\n x: x + Math.round(pending.scrollX),\n y: y + Math.round(pending.scrollY),\n ignorePointerEventsNone: true,\n })\n .then((raw) => safeDecode(Located, raw))\n .catch(() => undefined),\n ),\n ]);\n\n check();\n const mainFrame = safeDecode(FrameTree, tree).frameTree.frame.id;\n const byNode = new Map<number, Array<readonly [number, number]>>();\n\n pending.points.forEach((point, index) => {\n const top = located[index];\n\n if (top === undefined || top.frameId !== mainFrame) return;\n byNode.set(top.backendNodeId, [...(byNode.get(top.backendNodeId) ?? []), point]);\n });\n\n const answers = await Promise.all(\n [...byNode].map(async ([backendNodeId, points]) => {\n try {\n const { object } = safeDecode(\n Resolved,\n await cdp.send(\"DOM.resolveNode\", { backendNodeId, objectGroup: group }),\n );\n\n check();\n\n const { result } = safeDecode(\n Classified,\n await cdp.send(\"Runtime.callFunctionOn\", {\n functionDeclaration: String(readPage),\n objectId: object.objectId,\n arguments: [\n {\n value: {\n scope: \"viewport\",\n maximumBytes: 0,\n controlLimit: 0,\n nodeBudget: 0,\n classify: points,\n },\n },\n { objectId: object.objectId },\n ],\n returnByValue: true,\n }),\n );\n\n return points.map((point, index) => [point, result.value.data[index]] as const);\n } catch {\n return [];\n }\n }),\n );\n\n check();\n const verdicts: Record<string, PointVerdict> = {};\n\n for (const [[x, y], verdict] of answers.flat())\n if (verdict !== undefined && verdict !== \"unknown\")\n verdicts[`${String(x)},${String(y)}`] = verdict;\n\n return verdicts;\n } finally {\n await closeWithin(() => retention?.dispose(cdp) ?? dispose()).catch(() => {});\n }\n};\n\n/** A host's own decision about one control, made on facts read from the page just now. */\nexport type AdmissionPolicy = (facts: ControlFacts) => boolean;\n\n/**\n * A node's private state after a form step: its value, checked state or selected option values.\n * It is compared on the host and never leaves it. Runs inside the page, so it is self-contained.\n */\nconst PrivateStateBytes = 512 * 1024;\n\nconst privateState = (node: Element, maximumBytes: number): string | null => {\n if (!node.isConnected || node.ownerDocument !== document) return null;\n const role = node.getAttribute(\"role\");\n\n const encode = (value: ReadonlyArray<string | boolean | ReadonlyArray<string>>) => {\n const text = JSON.stringify(value);\n\n // A page can replace JSON.stringify; only a bounded string may cross to the host.\n return typeof text === \"string\" &&\n text.length <= maximumBytes &&\n new TextEncoder().encode(text).length <= maximumBytes\n ? text\n : null;\n };\n\n if (node instanceof HTMLInputElement && (node.type === \"checkbox\" || node.type === \"radio\"))\n return encode([\"checked\", node.checked]);\n if (node instanceof HTMLInputElement || node instanceof HTMLTextAreaElement)\n return node.value.length > maximumBytes ? null : encode([\"value\", node.value]);\n if (node instanceof HTMLSelectElement) {\n if (node.selectedOptions.length > 64) return null;\n const values: string[] = [];\n let length = 0;\n\n for (const option of node.selectedOptions) {\n length += option.value.length;\n if (length > maximumBytes) return null;\n values.push(option.value);\n }\n\n return encode([\"options\", values]);\n }\n if (\n role !== null &&\n [\"checkbox\", \"radio\", \"switch\", \"menuitemcheckbox\", \"menuitemradio\"].includes(role)\n )\n return encode([\"checked\", node.getAttribute(\"aria-checked\") === \"true\"]);\n if (node instanceof HTMLElement && node.isContentEditable) {\n const text = node.textContent ?? \"\";\n\n return text.length > maximumBytes ? null : encode([\"text\", text]);\n }\n\n return encode([\"other\"]);\n};\n\n/**\n * Reads that private state once. A node that is gone, or a document that navigated away while it\n * was read, reads as unknown: after a dispatched step this never becomes a failure of its own.\n */\nexport const readFieldState = async (\n element: ElementHandle<Element>,\n): Promise<string | undefined> => {\n try {\n const value: unknown = await element.evaluate(privateState, PrivateStateBytes);\n\n return typeof value === \"string\" ? value : undefined;\n } catch {\n return undefined;\n }\n};\n\n/**\n * Selects only the first `count` entries of a page-built node array, which the caller has already\n * validated. A null-prototype record makes indexed assignment independent of page-modified\n * Array/Object prototypes, so enumerable properties the page adds to that array never cross the\n * handle boundary and `getProperties()` materializes at most `count` host handles.\n */\nconst validatedNodes = (\n holder: JSHandle<{ readonly nodes: ReadonlyArray<Element> }>,\n count: number,\n) =>\n holder.evaluateHandle((read, count) => {\n const picked: {\n readonly __proto__: null;\n [index: number]: Element | undefined;\n } = { __proto__: null };\n\n for (let i = 0; i < count; i++) picked[i] = read.nodes[i];\n\n return picked;\n }, count);\n\n/** Whether a private state says a toggle ended checked, or unchecked, as it was asked to. */\nexport const holdsChecked = (state: string | undefined, checked: boolean): boolean =>\n state === JSON.stringify([\"checked\", checked]);\n\ninterface Retained {\n readonly handle: ElementHandle<Element>;\n /** What made this control the one that was inspected; see `identityOf`. */\n readonly identity: string;\n /** The same without enablement, for form steps; see `stableIdentityOf`. */\n readonly stable: string;\n readonly multiple?: boolean;\n /** The submitted value is retained privately and never appears in a control or receipt. */\n readonly option?: { readonly selectElementId: string; readonly value: string };\n leases: number;\n retired: boolean;\n readonly snapshot: Snapshot;\n}\n\n/** Validated at the supplying runtime boundary; never model-controlled. */\nexport interface ObservationLimits {\n readonly maxSnapshotsPerPage: number;\n readonly maxSnapshotsPerSession: number;\n readonly maxHandlesPerPage: number;\n readonly maxHandlesPerSession: number;\n readonly maxBytesPerPage: number;\n readonly maxBytesPerSession: number;\n}\n\nconst DefaultObservationLimits: ObservationLimits = {\n maxSnapshotsPerPage: 16,\n maxSnapshotsPerSession: 64,\n maxHandlesPerPage: 8192,\n maxHandlesPerSession: 32768,\n maxBytesPerPage: 64 * 1024 * 1024,\n maxBytesPerSession: 256 * 1024 * 1024,\n};\n\ninterface NativeResource {\n readonly dispose: () => Promise<unknown>;\n readonly slots: number;\n disposal?: Promise<void>;\n}\n\n/**\n * `suspended` is a page hold: the nodes are kept but none may be acted on until it is checked\n * again, one node at a time. Anything else that could change the page makes it `invalid`.\n */\ninterface Snapshot {\n readonly id: string;\n readonly target: DriverTarget;\n readonly documentEpoch: number;\n readonly generation: number;\n readonly scope: \"document\" | \"viewport\";\n private: boolean;\n origin?: AbortSignal;\n validity: \"reading\" | \"valid\" | \"suspended\" | \"invalid\";\n readonly nodes: Map<string, Retained>;\n readonly revalidated: Set<string>;\n readonly resources: Map<object, NativeResource>;\n reading: boolean;\n pending: number;\n retired: boolean;\n nativeRetired: boolean;\n reservedHandles: number;\n reservedBytes: number;\n}\n\n/**\n * One current snapshot per exact frame. Retired native reservations remain bounded until\n * actual disposal or positive page/connection retirement; they never regain action authority.\n */\nexport const makeObservation = (\n targets: Targets,\n /** Observation ids from an earlier connection never name this one's nodes. */\n connectionNamespace: string,\n events: DriverEvents,\n limits: ObservationLimits = DefaultObservationLimits,\n) => {\n const { current } = targets;\n const snapshots = new Map<string, Snapshot>();\n const reservations = new Set<Snapshot>();\n\n const resolvedElements = new WeakMap<\n ResolvedElement,\n {\n readonly node: Retained;\n readonly snapshot: Snapshot;\n readonly scope: \"document\" | \"viewport\";\n readonly descriptor?: Descriptor;\n readonly group: ReadonlyArray<Snapshot>;\n }\n >();\n\n let observationSerial = 0;\n let connectionRetired = false;\n\n const scopeMatches = (snapshot: Snapshot, scope: ObservationScope) =>\n scope !== \"none\" &&\n (scope === \"all\" ||\n (scope.pageId === snapshot.target.pageId &&\n (scope.frameId === undefined || scope.frameId === snapshot.target.frameId)));\n\n const invalidate = (scope: ObservationScope = \"all\", origin?: AbortSignal) => {\n for (const snapshot of reservations)\n if (\n scopeMatches(snapshot, scope) &&\n !(snapshot.private && origin !== undefined && snapshot.origin === origin)\n )\n snapshot.validity = \"invalid\";\n };\n\n /**\n * A read is ordered against document replacement by failing: if the document it was reading\n * was replaced underneath it, or a navigation is still in flight on its page, the native error\n * is `target-changed` and `undispatched`, so a caller knows to read again. A read is never a\n * mutation, so reading again is always safe.\n */\n const reading = async <A>(body: () => Promise<A>, target: DriverTarget): Promise<A> => {\n const { entry, frame } = current(target);\n const epoch = targets.epochOf(frame);\n\n try {\n return await body();\n } catch (error) {\n // A fenced ticket and a failure with its own reason already say what happened. Only an\n // unexplained native error is explained by the document having gone.\n const unexplained =\n !Schema.is(BrowserError)(error) &&\n (!Schema.is(NativeFailure)(error) || error.reason._tag === \"Provider\");\n\n if (unexplained && (targets.epochOf(frame) !== epoch || targets.navigating.has(entry.id)))\n throw failure(Reasons.TargetChanged.make({}), \"undispatched\");\n throw error;\n }\n };\n\n const changed = (\n reason: Parameters<DriverEvents[\"invalidate\"]>[0],\n scope: ObservationScope = \"all\",\n ) => {\n invalidate(scope);\n events.invalidate(reason, scope);\n };\n\n /**\n * Holding or resuming a page may run its `freeze` and `resume` handlers, so nothing observed\n * on it may be acted on unchecked. Another page's observation is untouched: a stage hold is\n * independent of the page an agent is driving.\n */\n const held = (pageId: string) => {\n for (const snapshot of reservations) {\n if (snapshot.target.pageId !== pageId) continue;\n if (snapshot.private || snapshot.validity === \"reading\") snapshot.validity = \"invalid\";\n else if (snapshot.validity === \"valid\") {\n snapshot.validity = \"suspended\";\n snapshot.revalidated.clear();\n }\n }\n };\n\n const bytes = (value: string): number => new TextEncoder().encode(value).length;\n\n const refresh = (snapshot: Snapshot) => {\n if (snapshot.nativeRetired) return;\n if (snapshot.reading || snapshot.pending > 0) return;\n if (snapshot.retired && snapshot.resources.size === 0) {\n reservations.delete(snapshot);\n snapshot.nodes.clear();\n\n return;\n }\n const nodes = new Set<object>([...snapshot.nodes.values()].map((node) => node.handle));\n\n // A wrapper can still own the entire read result, and an occlusion port owns its group.\n // Keep their worst-case byte/handle reservation until their actual disposal is confirmed.\n if ([...snapshot.resources.keys()].some((value) => !nodes.has(value))) return;\n snapshot.reservedHandles = [...snapshot.resources.values()].reduce(\n (total, resource) => total + resource.slots,\n 0,\n );\n snapshot.reservedBytes =\n 4096 +\n [...snapshot.nodes.values()].reduce(\n (total, node) =>\n total + bytes(node.identity) + bytes(node.stable) + bytes(node.option?.value ?? \"\"),\n 0,\n );\n };\n\n const disposeResource = (snapshot: Snapshot, value: object): Promise<void> => {\n const resource = snapshot.resources.get(value);\n\n if (snapshot.nativeRetired || resource === undefined) return Promise.resolve();\n if (resource.disposal === undefined) {\n resource.disposal = Promise.resolve().then(async () => {\n if (!snapshot.nativeRetired) await resource.dispose();\n });\n // Observe rejection immediately. Failure retains capacity and never fabricates disposal.\n void resource.disposal.then(\n () => {\n snapshot.resources.delete(value);\n refresh(snapshot);\n },\n () => {},\n );\n }\n\n return resource.disposal;\n };\n\n const retentionFor = (snapshot: Snapshot): NativeRetention => ({\n own: (value, dispose, slots = 1) => {\n if (!snapshot.nativeRetired && !snapshot.resources.has(value))\n snapshot.resources.set(value, { dispose, slots });\n },\n dispose: (value) => disposeResource(snapshot, value),\n work: async (body) => {\n snapshot.pending++;\n try {\n return await body();\n } finally {\n snapshot.pending--;\n refresh(snapshot);\n }\n },\n });\n\n const disposeNode = (node: Retained): Promise<void> =>\n disposeResource(node.snapshot, node.handle);\n\n const retireNode = (node: Retained): Promise<void> => {\n node.retired = true;\n\n return node.leases === 0 ? disposeNode(node) : Promise.resolve();\n };\n\n const retireSnapshot = async (snapshot: Snapshot) => {\n snapshot.retired = true;\n snapshot.validity = \"invalid\";\n if (snapshots.get(snapshot.target.frameId) === snapshot)\n snapshots.delete(snapshot.target.frameId);\n await closeWithin(() => Promise.allSettled([...snapshot.nodes.values()].map(retireNode)));\n const handles = new Set<object>([...snapshot.nodes.values()].map((node) => node.handle));\n\n await closeWithin(() =>\n Promise.allSettled(\n [...snapshot.resources.keys()]\n .filter((value) => !handles.has(value))\n .map((value) => disposeResource(snapshot, value)),\n ),\n ).catch(() => {});\n refresh(snapshot);\n };\n\n const dispose = async (target?: DriverTarget) => {\n const retiring =\n target === undefined\n ? [...reservations]\n : [snapshots.get(target.frameId)].filter((snapshot) => snapshot !== undefined);\n\n await Promise.allSettled(retiring.map(retireSnapshot));\n };\n\n const retirePage = (pageId: string) => {\n for (const snapshot of reservations) {\n if (snapshot.target.pageId !== pageId) continue;\n snapshot.validity = \"invalid\";\n snapshot.retired = true;\n snapshot.nativeRetired = true;\n if (snapshots.get(snapshot.target.frameId) === snapshot)\n snapshots.delete(snapshot.target.frameId);\n for (const node of snapshot.nodes.values()) node.retired = true;\n snapshot.resources.clear();\n snapshot.nodes.clear();\n reservations.delete(snapshot);\n }\n };\n\n /** Refuses, before it is taken, any reservation that would exceed a page or session limit. */\n const admitReservation = (\n pageId: string,\n requested: { readonly snapshots: number; readonly handles: number; readonly bytes: number },\n ) => {\n const page = [...reservations].filter((previous) => previous.target.pageId === pageId);\n\n const dimensions = [\n {\n dimension: \"observation-snapshots\",\n pageMaximum: limits.maxSnapshotsPerPage,\n sessionMaximum: limits.maxSnapshotsPerSession,\n count: (_previous: Snapshot) => 1,\n requested: requested.snapshots,\n },\n {\n dimension: \"observation-handles\",\n pageMaximum: limits.maxHandlesPerPage,\n sessionMaximum: limits.maxHandlesPerSession,\n count: (previous: Snapshot) => previous.reservedHandles,\n requested: requested.handles,\n },\n {\n dimension: \"observation-bytes\",\n pageMaximum: limits.maxBytesPerPage,\n sessionMaximum: limits.maxBytesPerSession,\n count: (previous: Snapshot) => previous.reservedBytes,\n requested: requested.bytes,\n },\n ] as const;\n\n for (const { dimension, pageMaximum, sessionMaximum, count, requested } of dimensions) {\n const scopes: ReadonlyArray<readonly [ReadonlyArray<Snapshot>, number]> = [\n [page, pageMaximum],\n [[...reservations], sessionMaximum],\n ];\n\n for (const [owned, maximum] of scopes) {\n const observed = owned.reduce<number>(\n (total, previous) => total + count(previous),\n requested,\n );\n\n if (observed > maximum)\n throw failure(Reasons.Limit.make({ dimension, maximum, observed }), \"undispatched\");\n }\n }\n };\n\n const reserve = (snapshot: Snapshot) => {\n admitReservation(snapshot.target.pageId, {\n snapshots: 1,\n handles: snapshot.reservedHandles,\n bytes: snapshot.reservedBytes,\n });\n reservations.add(snapshot);\n };\n\n /** Extends a reserved reading snapshot by what one more resolved node retains. */\n const extendReservation = (snapshot: Snapshot, handles: number, retainedBytes: number) => {\n admitReservation(snapshot.target.pageId, {\n snapshots: 0,\n handles,\n bytes: retainedBytes,\n });\n snapshot.reservedHandles += handles;\n snapshot.reservedBytes += retainedBytes;\n };\n\n /** Temporary readers use the same finite native ownership as published frame snapshots. */\n const temporary = (\n target: DriverTarget,\n ticket: ReadTicket,\n reservedHandles: number,\n reservedBytes: number,\n ownPhase = false,\n ) => {\n ticket.check();\n if (connectionRetired) throw failure(Reasons.Stale.make({}), \"undispatched\");\n\n const snapshot: Snapshot = {\n id: \"\",\n target,\n documentEpoch: targets.epochOf(current(target).frame),\n generation: ticket.generation,\n scope: \"document\",\n private: ownPhase,\n ...(ownPhase ? { origin: ticket.signal } : {}),\n validity: \"reading\",\n nodes: new Map(),\n revalidated: new Set(),\n resources: new Map(),\n reading: true,\n pending: 0,\n retired: false,\n nativeRetired: false,\n reservedHandles,\n reservedBytes,\n };\n\n reserve(snapshot);\n const retention = retentionFor(snapshot);\n let releasing: Promise<void> | undefined;\n\n return {\n retention,\n check: () => checkPrivate(snapshot, ticket),\n release: (): Promise<void> => {\n releasing ??= (async () => {\n snapshot.reading = false;\n snapshot.retired = true;\n snapshot.validity = \"invalid\";\n await closeWithin(() =>\n Promise.allSettled([...snapshot.resources.keys()].map(retention.dispose)),\n ).catch(() => {});\n refresh(snapshot);\n })();\n\n return releasing;\n },\n };\n };\n\n const withTemporary = async <A>(\n target: DriverTarget,\n ticket: ReadTicket,\n handles: number,\n bytes: number,\n body: (retention: NativeRetention) => Promise<A>,\n ): Promise<A> => {\n const owned = temporary(target, ticket, handles, bytes);\n\n try {\n return await body(owned.retention);\n } finally {\n await owned.release();\n }\n };\n\n const exactElement = async (\n selector: string,\n ticket: Ticket,\n target: DriverTarget,\n retention: NativeRetention,\n ): Promise<ElementHandle<Element>> => {\n ticket.check();\n\n const holder = await current(target).frame.evaluateHandle((requested) => {\n try {\n const matches = document.querySelectorAll(requested);\n\n return { count: matches.length, node: matches.length === 1 ? matches[0] : null };\n } catch {\n return { count: 0, node: null };\n }\n }, selector);\n\n retention.own(holder, () => holder.dispose());\n let node: JSHandle | undefined;\n\n try {\n const countHandle = await holder.getProperty(\"count\");\n\n retention.own(countHandle, () => countHandle.dispose());\n let count: number;\n\n try {\n count = safeDecode(Count, await countHandle.jsonValue());\n } finally {\n await retention.dispose(countHandle);\n }\n ticket.check();\n if (count !== 1)\n throw failure(\n count === 0 ? Reasons.NotFound.make({}) : Reasons.Ambiguous.make({}),\n \"undispatched\",\n );\n node = await holder.getProperty(\"node\");\n const ownedNode = node;\n\n retention.own(ownedNode, () => ownedNode.dispose());\n const element = node.asElement();\n\n if (element === null) throw failure(Reasons.NotFound.make({}), \"undispatched\");\n ticket.check();\n\n return element;\n } catch (error) {\n if (node !== undefined) await retention.dispose(node).catch(() => {});\n throw error;\n } finally {\n await retention.dispose(holder);\n }\n };\n\n /** The exact registered frame, document and snapshot cannot be replaced. */\n const checkSnapshot = (snapshot: Snapshot, ticket: ReadTicket): void => {\n ticket.check();\n if (\n connectionRetired ||\n snapshots.get(snapshot.target.frameId) !== snapshot ||\n snapshot.generation !== ticket.generation ||\n snapshot.validity === \"invalid\"\n )\n throw failure(Reasons.Stale.make({}), \"undispatched\");\n\n if (targets.epochOf(current(snapshot.target).frame) !== snapshot.documentEpoch)\n throw failure(Reasons.Stale.make({}), \"undispatched\");\n };\n\n /** A retained node is only as current as the observation that produced it. */\n const retained = (\n target: ObservedElement,\n ticket: ReadTicket,\n allowSuspended = false,\n caller: DriverTarget,\n ) => {\n ticket.check();\n\n // Authenticate the caller before looking at a Ref. No supplied observation id can choose\n // another page's frame, read its native facts, or redirect a caller's operation into it.\n current(caller);\n const snapshot = snapshots.get(caller.frameId);\n\n if (\n snapshot === undefined ||\n snapshot.target.pageId !== caller.pageId ||\n snapshot.id !== target.observationId\n )\n throw failure(Reasons.Stale.make({}), \"undispatched\");\n const node = snapshot.nodes.get(target.elementId);\n\n if (node === undefined) throw failure(Reasons.Stale.make({}), \"undispatched\");\n\n const check = (): void => {\n checkSnapshot(snapshot, ticket);\n\n const usable =\n snapshot.validity === \"valid\" ||\n (snapshot.validity === \"suspended\" &&\n (allowSuspended || snapshot.revalidated.has(target.elementId)));\n\n if (!usable || snapshot.nodes.get(target.elementId) !== node)\n throw failure(Reasons.Stale.make({}), \"undispatched\");\n };\n\n check();\n\n return { node, snapshot, check };\n };\n\n /**\n * A wait borrows one exact node without authorizing input. Its state may change. Retiring the\n * observation defers this node's disposal until the native wait actually releases the lease.\n */\n const lease = (\n reference: ObservedElement | ResolvedElement,\n ticket: ReadTicket,\n browserTarget: DriverTarget,\n ) => {\n const privateReference = \"_tag\" in reference;\n\n const leased = privateReference\n ? privateRetained(reference, ticket, browserTarget)\n : retained(reference, ticket, false, browserTarget);\n\n const { node, snapshot } = leased;\n\n node.leases++;\n let released: Promise<void> | undefined;\n\n return {\n element: node.handle,\n target: snapshot.target,\n check: () => {\n if (privateReference) {\n leased.check();\n\n return;\n }\n ticket.check();\n if (\n connectionRetired ||\n snapshots.get(snapshot.target.frameId) !== snapshot ||\n snapshot.validity === \"invalid\" ||\n targets.epochOf(current(snapshot.target).frame) !== snapshot.documentEpoch\n )\n throw failure(Reasons.Stale.make({}), \"undispatched\");\n },\n release: (): Promise<void> => {\n released ??= (async () => {\n node.leases--;\n if (node.retired && node.leases === 0) await disposeNode(node);\n })();\n\n return released;\n },\n };\n };\n\n /** A timed-out after-step read keeps its node and capacity until the raw reply settles. */\n const passiveRead = async <A>(\n reference: ObservedElement | ResolvedElement,\n ticket: Ticket,\n body: () => Promise<A>,\n browserTarget: DriverTarget,\n ): Promise<A> => {\n const leased = lease(reference, ticket, browserTarget);\n\n try {\n return await withTemporary(leased.target, ticket, 0, 4096 + PrivateStateBytes, body);\n } finally {\n await leased.release();\n }\n };\n\n /**\n * Read from the exact node, never re-resolved from a selector or a label. It is the same page\n * function an observation uses, told to read one node and traverse nothing.\n */\n const sampleFacts = async (\n element: ElementHandle<Element>,\n ticket: ReadTicket,\n check: () => void,\n target: DriverTarget,\n options?: ReadonlyArray<{ readonly node: ElementHandle<Element>; readonly value: string }>,\n ): Promise<unknown> => {\n check();\n\n return withTemporary(\n target,\n ticket,\n 1,\n 4096 + (1 + (options?.length ?? 0)) * 512 * 1024,\n async (retention) => {\n const holder = await current(target).frame.evaluateHandle(readPage, {\n scope: \"document\" as const,\n maximumBytes: 0,\n controlLimit: 0,\n nodeBudget: 0,\n only: element,\n ...(options === undefined ? {} : { options }),\n });\n\n retention.own(holder, () => holder.dispose());\n try {\n check();\n const raw = await holder.evaluate((read) => read.data);\n\n check();\n\n return raw;\n } finally {\n await retention.dispose(holder);\n }\n },\n );\n };\n\n const checkPrivate = (snapshot: Snapshot, ticket: ReadTicket) => {\n ticket.check();\n if (\n connectionRetired ||\n snapshot.retired ||\n snapshot.validity === \"invalid\" ||\n snapshot.generation !== ticket.generation ||\n targets.epochOf(current(snapshot.target).frame) !== snapshot.documentEpoch\n )\n throw failure(Reasons.Stale.make({}), \"undispatched\");\n };\n\n const privateRetained = (target: ResolvedElement, ticket: ReadTicket, caller: DriverTarget) => {\n const resolved = resolvedElements.get(target);\n\n if (\n resolved === undefined ||\n (caller !== undefined &&\n (caller.pageId !== resolved.snapshot.target.pageId ||\n caller.frameId !== resolved.snapshot.target.frameId))\n )\n throw failure(Reasons.Stale.make({}), \"undispatched\");\n\n const check = () => {\n for (const snapshot of resolved.group) checkPrivate(snapshot, ticket);\n };\n\n check();\n\n return { ...resolved, check };\n };\n\n const frameSample = (target: DriverTarget): Pick<DescriptorSample, \"frame\" | \"frameComplete\"> => {\n const { entry, frame } = current(target);\n const main = entry.page.mainFrame();\n\n if (frame === main) return { frameComplete: true };\n const path: FrameDescriptor[\"path\"][number][] = [];\n let child: Frame | null = frame;\n\n while (child !== main) {\n if (child === null || child.isDetached() || path.length >= 8) return { frameComplete: false };\n const parent: Frame | null = child.parentFrame();\n const name = child.name();\n const url = child.url();\n\n if (parent === null || name.length === 0 || name.length > 256 || url.length > 8192)\n return { frameComplete: false };\n const siblings = parent.childFrames();\n\n if (siblings.length > 128) return { frameComplete: false };\n\n const matches = siblings.filter(\n (candidate) => candidate.name() === name && candidate.url() === url,\n );\n\n const index = matches.indexOf(child);\n\n if (index < 0) return { frameComplete: false };\n path.unshift({\n name,\n url,\n ...(matches.length === 1 ? {} : { ordinal: { index, of: matches.length } }),\n });\n child = parent;\n }\n\n return { frameComplete: true, frame: { path } };\n };\n\n const descriptorTarget = (descriptor: Descriptor, bound: DriverTarget, ticket: ReadTicket) => {\n const { entry, frame: boundFrame } = current(bound);\n\n if (descriptor.frame === undefined) return bound;\n let frame = entry.page.mainFrame();\n\n for (const segment of descriptor.frame.path) {\n ticket.check();\n const children = frame.childFrames();\n\n if (children.length > 128)\n throw failure(\n Reasons.Limit.make({ dimension: \"frames\", maximum: 128, observed: children.length }),\n \"undispatched\",\n );\n\n const matches = children.filter(\n (child) => child.name() === segment.name && child.url() === segment.url,\n );\n\n if (matches.length === 0) throw failure(Reasons.Missing.make({}), \"undispatched\");\n if (segment.ordinal !== undefined && segment.ordinal.of !== matches.length)\n throw failure(Reasons.Incomplete.make({}), \"undispatched\");\n if (segment.ordinal === undefined && matches.length !== 1)\n throw failure(Reasons.Ambiguous.make({ count: matches.length }), \"undispatched\");\n const child = matches[segment.ordinal?.index ?? 0];\n\n if (child === undefined || child.isDetached())\n throw failure(Reasons.Stale.make({}), \"undispatched\");\n frame = child;\n }\n if (boundFrame !== entry.page.mainFrame() && frame !== boundFrame)\n throw failure(Reasons.Unsupported.make({}), \"undispatched\");\n ticket.check();\n\n return { pageId: entry.id, frameId: targets.frameId(frame) };\n };\n\n const scanDescriptor = async (\n descriptor: Descriptor,\n snapshot: Snapshot,\n ticket: Ticket,\n contextual: boolean,\n parent?: ElementHandle<Element>,\n ) => {\n const retention = retentionFor(snapshot);\n const check = () => checkPrivate(snapshot, ticket);\n\n check();\n\n const holder = await current(snapshot.target).frame.evaluateHandle(readPage, {\n scope: descriptor.matchScope,\n maximumBytes: 0,\n controlLimit: 0,\n nodeBudget: NodeBudget,\n descriptors: [{ descriptor, contextual, ...(parent === undefined ? {} : { parent }) }],\n });\n\n retention.own(holder, () => holder.dispose());\n let nodes: JSHandle | undefined;\n\n try {\n check();\n const raw = await holder.evaluate((read) => read.data);\n const data = safeDecode(DescriptorReadResult, raw);\n\n check();\n if (data.exhausted)\n throw failure(\n Reasons.Limit.make({\n dimension: \"controls\",\n maximum: NodeBudget,\n observed: data.visited,\n }),\n \"undispatched\",\n );\n const result = data.results[0];\n\n if (data.results.length !== 1 || result === undefined)\n throw failure(Reasons.Malformed.make({}), \"undispatched\");\n if (result.status === \"missing\") throw failure(Reasons.Missing.make({}), \"undispatched\");\n if (result.status === \"ambiguous\")\n throw failure(\n Reasons.Ambiguous.make({ count: result.count || result.documentCount }),\n \"undispatched\",\n );\n if (result.status !== \"matched\" || result.facts === undefined)\n throw failure(Reasons.Incomplete.make({}), \"undispatched\");\n nodes = await validatedNodes(holder, 1);\n const ownedNodes = nodes;\n\n retention.own(ownedNodes, () => ownedNodes.dispose());\n check();\n const properties = await nodes.getProperties();\n\n for (const handle of properties.values()) retention.own(handle, () => handle.dispose());\n check();\n if (properties.size !== 1) throw failure(Reasons.Malformed.make({}), \"undispatched\");\n const element = properties.get(\"0\")?.asElement();\n\n if (element === null || element === undefined)\n throw failure(Reasons.Malformed.make({}), \"undispatched\");\n\n const picked: Array<ElementHandle<Element>> = [];\n\n // Playwright types property handles as any; asElement rejected every other native value.\n // oxlint-disable-next-line typescript/no-unsafe-argument -- untyped Playwright property handle\n picked.push(element);\n const exact = picked[0];\n\n if (exact === undefined) throw failure(Reasons.Malformed.make({}), \"undispatched\");\n\n return { element: exact, facts: result.facts, value: result.value };\n } finally {\n if (nodes !== undefined) await retention.dispose(nodes).catch(() => {});\n await retention.dispose(holder);\n }\n };\n\n const resolveGroup = (\n requests: ReadonlyArray<ResolveRequest>,\n ticket: Ticket,\n browserTarget: DriverTarget,\n guard: ResolveGuard,\n ): Promise<ResolvedGroup> =>\n sanitize(async () => {\n ticket.check();\n current(browserTarget);\n if (requests.length === 0 || requests.length > MaximumGroupNodes)\n throw failure(\n Reasons.Limit.make({\n dimension: \"controls\",\n maximum: MaximumGroupNodes,\n observed: requests.length,\n }),\n \"undispatched\",\n );\n if (guard._tag === \"ViewportContext\") await expectations(guard.before, ticket, browserTarget);\n const group: Snapshot[] = [];\n const elements: ResolvedElement[] = [];\n const samples: Array<DescriptorSample | undefined> = [];\n const records: Retained[] = [];\n\n let released: Promise<void> | undefined;\n\n const release = (): Promise<void> => {\n released ??= Promise.allSettled(group.map(retireSnapshot)).then(() => {});\n\n return released;\n };\n\n const privateSnapshot = (target: DriverTarget, scope: \"document\" | \"viewport\") => {\n const previous = group.find((snapshot) => snapshot.target.frameId === target.frameId);\n\n if (previous !== undefined) return previous;\n\n const snapshot: Snapshot = {\n id: `observation-${connectionNamespace}-${++observationSerial}`,\n target,\n documentEpoch: targets.epochOf(current(target).frame),\n generation: ticket.generation,\n scope,\n private: true,\n validity: \"reading\",\n nodes: new Map(),\n revalidated: new Set(),\n resources: new Map(),\n reading: true,\n pending: 0,\n retired: false,\n nativeRetired: false,\n // One descriptor read at a time: its holder, node array and worst-case reply. Each\n // resolved node then extends this by what it actually retains.\n reservedHandles: 3,\n reservedBytes: 4096 + 512 * 1024,\n };\n\n reserve(snapshot);\n group.push(snapshot);\n\n return snapshot;\n };\n\n try {\n for (const [index, request] of requests.entries()) {\n ticket.check();\n if (request.parent !== undefined && (request.parent < 0 || request.parent >= index))\n throw failure(Reasons.Malformed.make({}), \"undispatched\");\n const parent = request.parent === undefined ? undefined : records[request.parent];\n let snapshot: Snapshot;\n let node: Retained;\n let scope: \"document\" | \"viewport\";\n let sampledFacts: NativeControlFacts | undefined;\n\n if (request.target._tag === \"Ref\") {\n const source = retained(request.target.reference, ticket, false, browserTarget);\n\n scope = source.snapshot.scope;\n snapshot = privateSnapshot(source.snapshot.target, scope);\n\n const previous = [...snapshot.nodes.values()].find(\n (kept) => kept.handle === source.node.handle,\n );\n\n if (previous !== undefined) node = previous;\n else {\n source.node.leases++;\n retentionFor(snapshot).own(\n source.node.handle,\n async () => {\n source.node.leases--;\n if (source.node.retired && source.node.leases === 0)\n await disposeNode(source.node);\n },\n 0,\n );\n node = { ...source.node, snapshot, leases: 0, retired: false };\n }\n if (request.captureInitial === true && ticket.captureTarget !== undefined)\n sampledFacts = safeDecode(\n Facts,\n await sampleFacts(source.node.handle, ticket, source.check, source.snapshot.target),\n ).facts;\n } else {\n const target = descriptorTarget(request.target.descriptor, browserTarget, ticket);\n\n scope = request.target.descriptor.matchScope;\n snapshot = privateSnapshot(target, scope);\n if (parent !== undefined && parent.snapshot.target.frameId !== target.frameId)\n throw failure(Reasons.Unsupported.make({}), \"undispatched\");\n\n const found = await scanDescriptor(\n request.target.descriptor,\n snapshot,\n ticket,\n guard._tag === \"ViewportContext\",\n parent?.handle,\n );\n\n sampledFacts = found.facts;\n\n node = {\n handle: found.element,\n identity: identityOf(found.facts),\n stable: stableIdentityOf(found.facts),\n snapshot,\n leases: 0,\n retired: false,\n ...(found.facts.multiple === undefined ? {} : { multiple: found.facts.multiple }),\n ...(request.parent === undefined || found.value === undefined\n ? {}\n : { option: { selectElementId: `element-${request.parent}`, value: found.value } }),\n };\n }\n if (parent !== undefined) {\n if (parent.multiple === undefined || parent.snapshot !== snapshot)\n throw failure(Reasons.Incomplete.make({}), \"undispatched\");\n let value = node.option?.value;\n\n if (value === undefined) {\n const sampled = safeDecode(\n Schema.Struct({\n member: Schema.Boolean,\n value: Schema.optionalKey(Schema.String.check(Schema.isMaxLength(65536))),\n }),\n await node.handle.evaluate(\n (candidate, select) => ({\n member:\n candidate instanceof HTMLOptionElement &&\n select instanceof HTMLSelectElement &&\n candidate.isConnected &&\n select.isConnected &&\n candidate.ownerDocument === document &&\n candidate.closest(\"select\") === select &&\n select.options.item(candidate.index) === candidate,\n ...(candidate instanceof HTMLOptionElement && candidate.value.length <= 65536\n ? { value: candidate.value }\n : {}),\n }),\n parent.handle,\n ),\n );\n\n checkPrivate(snapshot, ticket);\n if (!sampled.member) throw failure(Reasons.Stale.make({}), \"undispatched\");\n value = sampled.value;\n }\n if (value === undefined) throw failure(Reasons.Incomplete.make({}), \"undispatched\");\n node = { ...node, option: { selectElementId: `element-${request.parent}`, value } };\n }\n extendReservation(\n snapshot,\n request.target._tag === \"Descriptor\" ? 1 : 0,\n bytes(node.identity) + bytes(node.stable) + bytes(node.option?.value ?? \"\"),\n );\n snapshot.nodes.set(`element-${index}`, node);\n records.push(node);\n\n const element: ResolvedElement = Object.freeze({\n _tag: \"ResolvedElement\",\n target: snapshot.target,\n });\n\n resolvedElements.set(element, {\n node,\n snapshot,\n scope,\n group,\n ...(request.target._tag === \"Descriptor\"\n ? { descriptor: request.target.descriptor }\n : {}),\n });\n elements.push(element);\n samples.push(\n sampledFacts === undefined || ticket.captureTarget === undefined\n ? undefined\n : {\n facts: ControlFacts.make(sampledFacts),\n scope,\n ...frameSample(snapshot.target),\n ...(sampledFacts.completeness === undefined\n ? {}\n : { completeness: sampledFacts.completeness }),\n ...(request.target._tag !== \"Descriptor\" ||\n request.target.descriptor.ordinal === undefined\n ? {}\n : { ordinal: request.target.descriptor.ordinal }),\n },\n );\n }\n for (const snapshot of group) {\n checkPrivate(snapshot, ticket);\n snapshot.reading = false;\n snapshot.validity = \"valid\";\n refresh(snapshot);\n }\n\n return {\n elements: Object.freeze(elements),\n samples: Object.freeze(samples),\n activate: (next: Ticket) => {\n for (const snapshot of group) checkPrivate(snapshot, next);\n for (const snapshot of group) snapshot.origin = next.signal;\n },\n release,\n };\n } catch (error) {\n for (const snapshot of group) snapshot.reading = false;\n await release();\n throw error;\n }\n });\n\n const resolveDescriptor = (\n descriptor: Descriptor,\n ticket: Ticket,\n browserTarget: DriverTarget,\n guard: ResolveGuard,\n ) =>\n sanitize(async () => {\n const group = await resolveGroup(\n [{ target: { _tag: \"Descriptor\", descriptor } }],\n ticket,\n browserTarget,\n guard,\n );\n\n const element = group.elements[0];\n const resolved = element === undefined ? undefined : resolvedElements.get(element);\n\n try {\n if (resolved === undefined) throw failure(Reasons.Malformed.make({}), \"undispatched\");\n checkPrivate(resolved.snapshot, ticket);\n if (\n resolved.snapshot.target.pageId !== browserTarget.pageId ||\n resolved.snapshot.target.frameId !== browserTarget.frameId\n )\n throw failure(Reasons.Stale.make({}), \"undispatched\");\n const previous = snapshots.get(resolved.snapshot.target.frameId);\n\n if (previous !== undefined) await retireSnapshot(previous);\n checkPrivate(resolved.snapshot, ticket);\n resolved.snapshot.private = false;\n snapshots.set(resolved.snapshot.target.frameId, resolved.snapshot);\n\n return { observationId: resolved.snapshot.id, elementId: \"element-0\" };\n } catch (error) {\n await group.release();\n throw error;\n }\n });\n\n const expectations = (\n conditions: ReadonlyArray<Condition>,\n ticket: Ticket,\n browserTarget: DriverTarget,\n ) =>\n sanitize(async () => {\n ticket.check();\n const frame = current(browserTarget).frame;\n const epoch = targets.epochOf(frame);\n\n const check = () => {\n ticket.check();\n if (targets.epochOf(current(browserTarget).frame) !== epoch)\n throw failure(Reasons.Stale.make({}), \"undispatched\");\n };\n\n if (conditions.length > 16)\n throw failure(\n Reasons.Limit.make({ dimension: \"controls\", maximum: 16, observed: conditions.length }),\n \"undispatched\",\n );\n for (const condition of conditions) {\n check();\n let matches = false;\n\n if (condition._tag === \"Origin\" || condition._tag === \"Path\") {\n const url = new URL(targets.url(browserTarget));\n\n matches = (condition._tag === \"Origin\" ? url.origin : url.pathname) === condition.value;\n } else if (condition._tag === \"Viewport\" || condition._tag === \"Scroll\") {\n const actual = safeDecode(\n Schema.Struct({\n width: Schema.Finite,\n height: Schema.Finite,\n x: Schema.Finite,\n y: Schema.Finite,\n }),\n await withTemporary(browserTarget, ticket, 0, 4096, () =>\n frame.evaluate(() => ({\n width: window.innerWidth,\n height: window.innerHeight,\n x: window.scrollX,\n y: window.scrollY,\n })),\n ),\n );\n\n matches =\n condition._tag === \"Viewport\"\n ? actual.width === condition.width && actual.height === condition.height\n : actual.x === condition.x && actual.y === condition.y;\n } else if (condition._tag === \"Text\") {\n const sampled = await withTemporary(\n browserTarget,\n ticket,\n 260,\n 4096 + 131072,\n (retention) =>\n reading(\n () =>\n read(\n condition.scope,\n 131072,\n 0,\n check,\n false,\n browserTarget,\n undefined,\n retention,\n ),\n browserTarget,\n ),\n );\n\n const data = sampled.data;\n\n matches =\n condition.match === \"contains\"\n ? data.text.includes(condition.value)\n : data.text === condition.value;\n if (\n (condition.match === \"equals\" || !matches) &&\n (data.textTruncated ||\n data.viewport.exhausted ||\n (condition.scope === \"viewport\" &&\n (data.viewport.uncertainText > 0 || data.viewport.clippedText > 0)))\n )\n throw failure(Reasons.Incomplete.make({}), \"undispatched\");\n } else {\n const group = await resolveGroup(\n [{ target: { _tag: \"Descriptor\", descriptor: condition.target } }],\n ticket,\n browserTarget,\n { _tag: \"Strict\" },\n );\n\n try {\n const target = group.elements[0];\n\n if (target === undefined) throw failure(Reasons.Malformed.make({}), \"undispatched\");\n const resolved = privateRetained(target, ticket, browserTarget);\n\n const sampled = safeDecode(\n Facts,\n await sampleFacts(\n resolved.node.handle,\n ticket,\n resolved.check,\n resolved.snapshot.target,\n ),\n ).facts;\n\n matches =\n sampled.box.x === condition.box.x &&\n sampled.box.y === condition.box.y &&\n sampled.box.width === condition.box.width &&\n sampled.box.height === condition.box.height;\n } finally {\n await group.release();\n }\n }\n check();\n if (!matches) throw failure(Reasons.Drifted.make({}), \"undispatched\");\n }\n });\n\n /**\n * The exact attached node a target names, checked against the page right now. A selector must\n * still match it and nothing else. A retained node must still be the control that was\n * inspected: the same node with a different destination, type or label is not. A host policy\n * then decides on those fresh facts, and a refusal or a policy that throws sends nothing.\n * `enablement` is for form steps only: the control may have become enabled since it was\n * observed, and it must be enabled now; every other fact must be unchanged.\n */\n const resolve = async (\n target: string | ObservedElement | ResolvedElement,\n ticket: Ticket,\n policy: AdmissionPolicy | undefined,\n allowSuspended: boolean,\n browserTarget: DriverTarget,\n enablement = false,\n ownPhase = false,\n ): Promise<{\n readonly element: ElementHandle<Element>;\n readonly reference: ObservedElement | ResolvedElement | undefined;\n readonly kept: boolean;\n readonly check: () => void;\n readonly readmit: () => Promise<void>;\n readonly facts: ControlFacts | undefined;\n readonly capture: DescriptorSample | undefined;\n readonly release: () => Promise<void>;\n }> => {\n if (ownPhase && typeof target !== \"string\" && !(\"_tag\" in target)) {\n const group = await resolveGroup(\n [{ target: { _tag: \"Ref\", reference: target } }],\n ticket,\n browserTarget,\n { _tag: \"Strict\" },\n );\n\n try {\n group.activate(ticket);\n const leased = group.elements[0];\n\n if (leased === undefined) throw failure(Reasons.Malformed.make({}), \"undispatched\");\n\n const resolved = await resolve(\n leased,\n ticket,\n policy,\n allowSuspended,\n browserTarget,\n enablement,\n );\n\n let released: Promise<void> | undefined;\n\n return {\n ...resolved,\n release: () => {\n released ??= (async () => {\n try {\n await resolved.release();\n } finally {\n await group.release();\n }\n })();\n\n return released;\n },\n };\n } catch (error) {\n await group.release();\n throw error;\n }\n }\n const kept = typeof target !== \"string\";\n\n const retainedNode =\n typeof target === \"string\"\n ? undefined\n : \"_tag\" in target\n ? privateRetained(target, ticket, browserTarget)\n : retained(target, ticket, allowSuspended, browserTarget);\n\n const node = retainedNode?.node;\n const resolvedTarget = retainedNode?.snapshot.target ?? browserTarget;\n const owned = kept ? undefined : temporary(resolvedTarget, ticket, 3, 4096, ownPhase);\n\n const check =\n retainedNode?.check ?? (ownPhase ? owned?.check : undefined) ?? (() => ticket.check());\n\n let released: Promise<void> | undefined;\n\n if (node !== undefined) node.leases++;\n\n const release = (): Promise<void> => {\n released ??= (async () => {\n if (owned !== undefined) await owned.release();\n if (node !== undefined) {\n node.leases--;\n if (node.retired && node.leases === 0) await disposeNode(node);\n }\n })();\n\n return released;\n };\n\n let facts: ControlFacts | undefined;\n let capture: DescriptorSample | undefined;\n\n try {\n const element =\n typeof target === \"string\" && owned !== undefined\n ? await exactElement(target, ticket, resolvedTarget, owned.retention)\n : node?.handle;\n\n if (element === undefined) throw failure(Reasons.Stale.make({}), \"undispatched\");\n check();\n\n const select =\n node?.option === undefined\n ? undefined\n : retainedNode?.snapshot.nodes.get(node.option.selectElementId)?.handle;\n\n // Reuse this original lease after owned preparation; never resolve its selector again.\n const readmit = async (refresh = false) => {\n check();\n if (refresh && node === undefined && policy === undefined) return;\n\n const attached: unknown = await element.evaluate(\n (candidate, { selector, selection }) => {\n if (!candidate.isConnected || candidate.ownerDocument !== document) return false;\n if (\n selection !== undefined &&\n (!(candidate instanceof HTMLOptionElement) ||\n !(selection.select instanceof HTMLSelectElement) ||\n !selection.select.isConnected ||\n candidate.closest(\"select\") !== selection.select ||\n selection.select.options.item(candidate.index) !== candidate ||\n candidate.value !== selection.value)\n )\n return false;\n if (selector === undefined) return true;\n const matches = candidate.ownerDocument.querySelectorAll(selector);\n\n return matches.length === 1 && matches[0] === candidate;\n },\n {\n selector: typeof target === \"string\" ? target : undefined,\n selection:\n select === undefined || node?.option === undefined\n ? undefined\n : { select, value: node.option.value },\n },\n );\n\n check();\n if (attached !== true) throw failure(Reasons.Stale.make({}), \"undispatched\");\n if (\n node !== undefined ||\n policy !== undefined ||\n ticket.captureTarget !== undefined ||\n ownPhase\n ) {\n const sampled = safeDecode(\n Facts,\n await sampleFacts(element, ticket, check, resolvedTarget),\n ).facts;\n\n facts = ControlFacts.make(sampled);\n\n if (ticket.captureTarget !== undefined) {\n const privateTarget =\n typeof target !== \"string\" && \"_tag\" in target\n ? resolvedElements.get(target)\n : undefined;\n\n capture = {\n facts: ControlFacts.make({ ...sampled, box: { ...sampled.box } }),\n scope: privateTarget?.scope ?? retainedNode?.snapshot.scope ?? \"document\",\n ...frameSample(resolvedTarget),\n ...(sampled.completeness === undefined ? {} : { completeness: sampled.completeness }),\n ...(privateTarget?.descriptor?.ordinal === undefined\n ? {}\n : { ordinal: privateTarget.descriptor.ordinal }),\n };\n }\n\n check();\n if (\n node !== undefined &&\n (enablement\n ? stableIdentityOf(facts) !== node.stable\n : identityOf(facts) !== node.identity)\n )\n throw failure(Reasons.Stale.make({}), \"undispatched\");\n if (enablement && facts.disabled)\n throw failure(Reasons.Disabled.make({}), \"undispatched\");\n if (policy !== undefined) {\n let admitted = false;\n\n try {\n admitted = policy(facts) === true;\n } catch {\n admitted = false;\n }\n if (!admitted) throw failure(Reasons.Denied.make({}), \"undispatched\");\n }\n }\n check();\n };\n\n await readmit();\n\n return {\n element,\n reference: typeof target === \"string\" ? undefined : target,\n kept,\n check,\n readmit: () => readmit(true),\n facts,\n capture,\n release,\n };\n } catch (error) {\n await closeWithin(release).catch(() => {});\n check();\n throw error;\n }\n };\n\n /** Validate all options in one fresh page read, while keeping the original exact handles. */\n const selectOptions = async (\n target: ObservedElement | ResolvedElement,\n ids: SelectOptions | ReadonlyArray<ResolvedElement>,\n element: ElementHandle<Element>,\n ticket: Ticket,\n enablement = false,\n browserTarget: DriverTarget,\n ) => {\n const same = (facts: ControlFacts, node: Retained) =>\n enablement ? stableIdentityOf(facts) === node.stable : identityOf(facts) === node.identity;\n\n const select =\n \"_tag\" in target\n ? privateRetained(target, ticket, browserTarget)\n : retained(target, ticket, false, browserTarget);\n\n if (select.node.handle !== element) throw failure(Reasons.Stale.make({}), \"undispatched\");\n if (select.node.multiple === undefined)\n throw failure(Reasons.Unsupported.make({}), \"undispatched\");\n\n const selectElementId =\n \"_tag\" in target\n ? [...select.snapshot.nodes].find(([_key, node]) => node === select.node)?.[0]\n : target.elementId;\n\n const options = ids.map((elementId) => {\n const option =\n typeof elementId !== \"string\"\n ? privateRetained(elementId, ticket, browserTarget)\n : \"_tag\" in target\n ? undefined\n : retained(\n { observationId: target.observationId, elementId },\n ticket,\n false,\n browserTarget,\n );\n\n if (option === undefined || option.snapshot !== select.snapshot)\n throw failure(Reasons.Stale.make({}), \"undispatched\");\n\n const identity = option.node.option;\n\n if (identity === undefined || identity.selectElementId !== selectElementId)\n throw failure(Reasons.Stale.make({}), \"undispatched\");\n\n return { ...option, value: identity.value };\n });\n\n const check = () => {\n select.check();\n for (const option of options) option.check();\n };\n\n const fresh = safeDecode(\n SelectionFacts,\n await sampleFacts(\n element,\n ticket,\n check,\n select.snapshot.target,\n options.map((option) => ({ node: option.node.handle, value: option.value })),\n ),\n );\n\n check();\n if (!fresh.attached || !same(fresh.facts, select.node))\n throw failure(Reasons.Stale.make({}), \"undispatched\");\n if (fresh.options.length !== options.length)\n throw failure(Reasons.Malformed.make({}), \"undispatched\");\n for (const [index, sampled] of fresh.options.entries()) {\n const option = options[index];\n\n if (\n option === undefined ||\n !sampled.member ||\n !sampled.valueMatches ||\n !same(sampled.facts, option.node)\n )\n throw failure(Reasons.Stale.make({}), \"undispatched\");\n }\n if (fresh.facts.disabled || fresh.options.some((option) => option.facts.disabled))\n throw failure(Reasons.Disabled.make({}), \"undispatched\");\n if (fresh.facts.multiple !== true && ids.length > 1)\n throw failure(Reasons.Unsupported.make({}), \"undispatched\");\n check();\n\n if (ticket.captureTarget !== undefined)\n for (const [index, sampled] of fresh.options.entries()) {\n const reference = ids[index];\n\n if (reference === undefined || typeof reference === \"string\") continue;\n const option = privateRetained(reference, ticket, browserTarget);\n\n ticket.captureTarget(reference, {\n facts: ControlFacts.make(sampled.facts),\n scope: option.scope,\n ...frameSample(option.snapshot.target),\n ...(sampled.facts.completeness === undefined\n ? {}\n : { completeness: sampled.facts.completeness }),\n ...(option.descriptor?.ordinal === undefined\n ? {}\n : { ordinal: option.descriptor.ordinal }),\n });\n }\n\n return {\n handles: options.map((option) => option.node.handle),\n values: options.map((option) => option.value),\n };\n };\n\n const controlFacts = (target: ObservedElement, ticket: Ticket, browserTarget: DriverTarget) =>\n sanitize(async () => {\n const { facts, check, release } = await resolve(\n target,\n ticket,\n undefined,\n false,\n browserTarget,\n );\n\n try {\n check();\n if (facts === undefined) throw failure(Reasons.Malformed.make({}), \"undispatched\");\n\n return facts;\n } finally {\n await release();\n }\n });\n\n /**\n * Current private states of this observation's own nodes, read without an identity check: a\n * form's own steps may have changed exactly what identity compares. A retired observation or a\n * replaced document still fails stale, and a detached node reads as absent.\n */\n const formState = (\n references: ReadonlyArray<ObservedElement | ResolvedElement>,\n ticket: Ticket,\n browserTarget: DriverTarget,\n ) =>\n sanitize(async () => {\n const states: Array<string | undefined> = [];\n\n for (const reference of references) {\n if (\"_tag\" in reference && reference.target.pageId !== browserTarget.pageId)\n throw failure(Reasons.Stale.make({}), \"undispatched\");\n\n const leased = lease(\n reference,\n ticket,\n \"_tag\" in reference ? reference.target : browserTarget,\n );\n\n try {\n leased.check();\n states.push(\n await withTemporary(leased.target, ticket, 0, 4096 + PrivateStateBytes, () =>\n readFieldState(leased.element),\n ),\n );\n leased.check();\n } finally {\n await leased.release();\n }\n }\n\n return states;\n });\n\n /** After a hold, one node at a time: still attached, and still the control inspected. */\n const revalidate = (target: ObservedElement, ticket: Ticket, browserTarget: DriverTarget) =>\n sanitize(async () => {\n const { snapshot } = retained(target, ticket, true, browserTarget);\n const { check, release } = await resolve(target, ticket, undefined, true, browserTarget);\n\n try {\n check();\n if (snapshots.get(snapshot.target.frameId) !== snapshot)\n throw failure(Reasons.Stale.make({}), \"undispatched\");\n snapshot.revalidated.add(target.elementId);\n } finally {\n await release();\n }\n });\n\n const readText = (\n selector: string | undefined,\n maximumBytes: number,\n ticket: Ticket,\n target: DriverTarget,\n ) =>\n sanitize(async () => {\n ticket.check();\n\n return withTemporary(target, ticket, 0, 4096 + maximumBytes, async () => {\n const raw: unknown = await reading(\n () =>\n current(target).frame.evaluate(\n ({ selector, maximumBytes }) => {\n const element =\n selector === undefined ? document.body : document.querySelector(selector);\n\n if (element === null) return { text: \"\", missing: true, byteLength: 0 };\n\n const text =\n element instanceof HTMLElement ? element.innerText : (element.textContent ?? \"\");\n\n const byteLength = new TextEncoder().encode(text).length;\n\n return { text: byteLength > maximumBytes ? \"\" : text, missing: false, byteLength };\n },\n { selector, maximumBytes },\n ),\n target,\n );\n\n ticket.check();\n const value = safeDecode(TextResult, raw);\n\n if (value.missing) throw failure(Reasons.NotFound.make({}));\n\n const observedBytes = Math.max(\n value.byteLength,\n new TextEncoder().encode(value.text).length,\n );\n\n if (observedBytes > maximumBytes)\n throw failure(\n Reasons.Limit.make({\n dimension: \"text\",\n maximum: maximumBytes,\n observed: observedBytes,\n }),\n );\n\n return value.text;\n });\n });\n\n /** One pass of the page reader over the selected frame, and the node handles it names. */\n const readOnce = async (\n scope: \"document\" | \"viewport\",\n maximumBytes: number,\n controlLimit: number,\n check: () => void,\n keepNodes: boolean,\n target: DriverTarget,\n match: string | undefined,\n verdicts: Record<string, PointVerdict> | undefined,\n retention?: NativeRetention,\n ) => {\n check();\n\n const holder = await current(target).frame.evaluateHandle(readPage, {\n scope,\n maximumBytes,\n controlLimit,\n nodeBudget: NodeBudget,\n choices: keepNodes,\n ...(match === undefined ? {} : { match }),\n ...(verdicts === undefined ? {} : { verdicts }),\n });\n\n retention?.own(holder, () => holder.dispose());\n\n const release = (value: JSHandle): Promise<void> =>\n retention?.dispose(value) ?? value.dispose();\n\n const handles: Array<ElementHandle<Element>> = [];\n let nodesHandle: JSHandle | undefined;\n // A hosted page can take hundreds of milliseconds to answer each call, so a reading makes a\n // fixed number of them: one for the data, and one for every node handle at once.\n let spare: Array<JSHandle> = [];\n\n try {\n let data: PageReadResult;\n\n try {\n check();\n const raw = await holder.evaluate((read) => read.data);\n\n check();\n data = safeDecode(PageReadResult, raw);\n check();\n const textBytes = new TextEncoder().encode(data.text).length;\n\n if (textBytes > maximumBytes)\n throw failure(\n Reasons.Limit.make({ dimension: \"text\", maximum: maximumBytes, observed: textBytes }),\n );\n if (data.controls.length > controlLimit)\n throw failure(\n Reasons.Limit.make({\n dimension: \"controls\",\n maximum: controlLimit,\n observed: data.controls.length,\n }),\n );\n // A reading with no controls names no nodes: skip the empty wrapper's round trips.\n if (keepNodes && data.controls.length > 0) {\n nodesHandle = await validatedNodes(holder, data.controls.length);\n const ownedNodes = nodesHandle;\n\n retention?.own(ownedNodes, () => ownedNodes.dispose());\n check();\n const nodes = await nodesHandle.getProperties();\n\n spare = [...nodes.values()];\n for (const node of spare) retention?.own(node, () => node.dispose());\n check();\n if (spare.length > controlLimit)\n throw failure(\n Reasons.Limit.make({\n dimension: \"observation-handles\",\n maximum: controlLimit,\n observed: spare.length,\n }),\n \"undispatched\",\n );\n const picked: Array<ElementHandle<Element>> = [];\n\n for (let i = 0; i < data.controls.length; i++) {\n const element = nodes.get(String(i))?.asElement() ?? null;\n\n if (element === null) throw failure(Reasons.Malformed.make({}));\n // Playwright types every property handle as `any`. readPage stores only Elements\n // under `nodes`, and asElement() has already rejected any other value.\n // oxlint-disable-next-line typescript/no-unsafe-argument -- untyped Playwright handle\n picked.push(element);\n }\n const kept = new Set<JSHandle>(picked);\n\n spare = spare.filter((node) => !kept.has(node));\n handles.push(...picked);\n }\n } finally {\n await closeWithin(() => Promise.allSettled(spare.map(release))).catch(() => {});\n if (nodesHandle !== undefined) await release(nodesHandle).catch(() => {});\n await release(holder);\n }\n check();\n\n return { data, handles };\n } catch (error) {\n // Ownership transfers only after wrapper release succeeds and the snapshot is rechecked.\n await closeWithin(() => Promise.allSettled(handles.map(release))).catch(() => {});\n check();\n throw error;\n }\n };\n\n /**\n * One bounded read of the selected frame, and the node handles it names, in order. A viewport\n * read of the main frame that left points pending asks the browser about them and reads once\n * more with its answers; if that fails, the first reading stands, pending points uncertain.\n */\n const read = async (\n scope: \"document\" | \"viewport\",\n maximumBytes: number,\n controlLimit: number,\n check: () => void,\n keepNodes: boolean,\n target: DriverTarget,\n match?: string,\n retention?: NativeRetention,\n ) => {\n const first = await readOnce(\n scope,\n maximumBytes,\n controlLimit,\n check,\n keepNodes,\n target,\n match,\n undefined,\n retention,\n );\n\n const pending = first.data.pending;\n const { entry, frame } = current(target);\n\n if (pending === undefined || frame !== entry.page.mainFrame()) return first;\n let verdicts: Record<string, PointVerdict> | undefined;\n\n await closeWithin(async () => {\n const confirm = () => confirmPending(entry.page, pending, check, retention);\n\n verdicts = await (retention?.work(confirm) ?? confirm());\n }, ConfirmMillis).catch(() => {});\n check();\n if (verdicts === undefined || Object.keys(verdicts).length === 0) return first;\n await closeWithin(() =>\n Promise.allSettled(\n first.handles.map((handle) => retention?.dispose(handle) ?? handle.dispose()),\n ),\n ).catch(() => {});\n\n return readOnce(\n scope,\n maximumBytes,\n controlLimit,\n check,\n keepNodes,\n target,\n match,\n verdicts,\n retention,\n );\n };\n\n const observe = (\n scope: \"document\" | \"viewport\",\n maximumBytes: number,\n controlLimit: number,\n ticket: Ticket,\n match: string | undefined,\n target: DriverTarget,\n ) =>\n sanitize(async () => {\n ticket.check();\n\n current(target);\n await dispose(target);\n ticket.check();\n\n const snapshot: Snapshot = {\n id: `observation-${connectionNamespace}-${++observationSerial}`,\n target,\n documentEpoch: targets.epochOf(current(target).frame),\n generation: ticket.generation,\n scope,\n private: false,\n validity: \"reading\",\n nodes: new Map(),\n revalidated: new Set(),\n resources: new Map(),\n reading: true,\n pending: 0,\n retired: false,\n nativeRetired: false,\n // Two DOM passes, their wrappers, and the bounded occlusion object group/port.\n reservedHandles: 2 * controlLimit + 260,\n // Each private option value is <=65,536 UTF-16 units. Both escaped identities plus\n // its UTF-8 value fit within 512KiB; data text and fixed snapshot metadata are separate.\n reservedBytes: 4096 + maximumBytes + controlLimit * 512 * 1024,\n };\n\n // Own-page events must also retire a read whose native handles have not arrived yet.\n reserve(snapshot);\n snapshots.set(target.frameId, snapshot);\n const retention = retentionFor(snapshot);\n\n const check = () => checkSnapshot(snapshot, ticket);\n\n let handles: Array<ElementHandle<Element>> = [];\n\n try {\n const sampled = await reading(\n () => read(scope, maximumBytes, controlLimit, check, true, target, match, retention),\n target,\n );\n\n handles = sampled.handles;\n check();\n const { data } = sampled;\n const selects = new Map<number, boolean>();\n const options = new Map<number, NonNullable<Retained[\"option\"]>>();\n\n for (const select of data.selects ?? []) {\n if (selects.has(select.index) || data.controls[select.index]?.multiple === undefined)\n throw failure(Reasons.Malformed.make({}));\n selects.set(select.index, select.optionsTruncated);\n for (const option of select.options) {\n if (options.has(option.index) || data.controls[option.index]?.selected === undefined)\n throw failure(Reasons.Malformed.make({}));\n options.set(option.index, {\n selectElementId: `element-${select.index}`,\n value: option.value,\n });\n }\n }\n\n // One handle per control, in the order the page returned them.\n handles.forEach((handle, i) => {\n const facts = data.controls[i];\n\n if (facts !== undefined) {\n const option = options.get(i);\n\n snapshot.nodes.set(`element-${i}`, {\n handle,\n identity: identityOf(facts),\n stable: stableIdentityOf(facts),\n leases: 0,\n retired: false,\n snapshot,\n ...(facts.multiple === undefined ? {} : { multiple: facts.multiple }),\n ...(option === undefined ? {} : { option }),\n });\n }\n });\n if (snapshot.nodes.size !== data.controls.length) throw failure(Reasons.Malformed.make({}));\n\n const result: NativeObservation = {\n observationId: snapshot.id,\n scope,\n ...(match === undefined ? {} : { match }),\n url: targets.url(target),\n text: data.text,\n textTruncated: data.textTruncated,\n controlsTruncated: data.controlsTruncated,\n controls: data.controls.map((facts, i) => {\n const option = options.get(i);\n const optionsTruncated = selects.get(i);\n\n return observedControl(facts, `element-${i}`, {\n ...(option === undefined ? {} : { selectElementId: option.selectElementId }),\n ...(optionsTruncated === undefined ? {} : { optionsTruncated }),\n });\n }),\n viewport: data.viewport,\n };\n\n check();\n snapshot.validity = \"valid\";\n\n return result;\n } catch (error) {\n snapshot.validity = \"invalid\";\n snapshot.retired = true;\n if (snapshots.get(target.frameId) === snapshot) snapshots.delete(target.frameId);\n await closeWithin(() =>\n Promise.allSettled([...snapshot.resources.keys()].map(retention.dispose)),\n ).catch(() => {});\n throw error;\n } finally {\n snapshot.reading = false;\n refresh(snapshot);\n }\n });\n\n /** The picture alone. Its caller has already reserved `4096 + maximumBytes` for it. */\n const picture = (fullPage: boolean, maximumBytes: number, ticket: Ticket, exact: DriverTarget) =>\n reading(async () => {\n const page = current(exact).entry.page;\n\n ticket.check();\n\n const raw: unknown = await page.evaluate(\n (full) => ({\n width: full\n ? Math.max(document.documentElement.scrollWidth, window.innerWidth)\n : window.innerWidth,\n height: full\n ? Math.max(document.documentElement.scrollHeight, window.innerHeight)\n : window.innerHeight,\n }),\n fullPage,\n );\n\n const geometry = safeDecode(Geometry, raw);\n\n checkScreenshotGeometry(geometry);\n ticket.check();\n\n const picturedFrame = page.mainFrame();\n const picturedTarget = { pageId: exact.pageId, frameId: targets.frameId(picturedFrame) };\n\n ticket.picture?.({\n phase: \"Requested\",\n target: picturedTarget,\n documentEpoch: targets.epochOf(picturedFrame),\n geometry,\n });\n\n const bytes: unknown = await page.screenshot({\n type: \"png\",\n fullPage,\n scale: \"css\",\n timeout: timeout(ticket),\n });\n\n ticket.picture?.({\n phase: \"Returned\",\n target: picturedTarget,\n documentEpoch: targets.epochOf(picturedFrame),\n geometry,\n ...(bytes instanceof Uint8Array ? { byteLength: bytes.length } : {}),\n });\n\n if (!(bytes instanceof Uint8Array)) throw failure(Reasons.Malformed.make({}));\n if (bytes.length > maximumBytes)\n throw failure(\n Reasons.Limit.make({\n dimension: \"returned-bytes\",\n maximum: maximumBytes,\n observed: bytes.length,\n }),\n );\n const actual = pngGeometry(bytes);\n\n checkScreenshotGeometry(actual);\n ticket.check();\n\n return new Uint8Array(bytes);\n }, exact);\n\n const screenshot = (\n fullPage: boolean,\n maximumBytes: number,\n ticket: Ticket,\n target: DriverTarget,\n ) =>\n sanitize(async () => {\n return withTemporary(target, ticket, 0, 4096 + maximumBytes, () =>\n picture(fullPage, maximumBytes, ticket, target),\n );\n });\n\n /**\n * Passive: it reads what is on screen and takes a picture, keeps no node, and leaves the\n * retained observation exactly as it was. Text and picture are sampled one after the other,\n * so a document replaced in between is reported rather than hidden.\n */\n const checkpoint = (\n maximumBytes: number,\n controlLimit: number,\n pictureBytes: number | undefined,\n ticket: Ticket,\n target: DriverTarget,\n ) =>\n sanitize(async () => {\n ticket.check();\n const { frame } = current(target);\n const epoch = targets.epochOf(frame);\n\n return withTemporary(\n target,\n ticket,\n 260,\n 4096 + maximumBytes + controlLimit * 512 * 1024 + (pictureBytes ?? 0),\n async (retention) => {\n const { data } = await reading(\n () =>\n read(\n \"viewport\",\n maximumBytes,\n controlLimit,\n () => ticket.check(),\n false,\n target,\n undefined,\n retention,\n ),\n target,\n );\n\n // This read's own reservation already includes the picture's bytes.\n const pictured =\n pictureBytes === undefined\n ? undefined\n : await picture(false, pictureBytes, ticket, target);\n\n const result: NativeCheckpoint = {\n url: targets.url(target),\n text: data.text,\n textTruncated: data.textTruncated,\n controls: data.controls,\n controlsTruncated: data.controlsTruncated,\n viewport: data.viewport,\n ...(pictured === undefined ? {} : { picture: pictured }),\n documentChanged: targets.epochOf(frame) !== epoch,\n };\n\n return result;\n },\n );\n });\n\n return {\n /** Snapshots of a `quarantined` page wait for its operator, not for a handoff drain. */\n drained: (quarantined: (pageId: string) => boolean = () => false) =>\n [...reservations].every(\n (snapshot) =>\n quarantined(snapshot.target.pageId) ||\n (!snapshot.reading &&\n snapshot.pending === 0 &&\n [...snapshot.resources.values()].every((resource) => resource.disposal === undefined)),\n ),\n invalidate,\n changed,\n held,\n dispose,\n lease,\n passiveRead,\n retirePage,\n retireConnection: () => {\n connectionRetired = true;\n for (const snapshot of reservations) retirePage(snapshot.target.pageId);\n snapshots.clear();\n },\n resolve,\n resolveDescriptor,\n resolveGroup,\n expectations,\n selectOptions,\n controlFacts,\n formState,\n revalidate,\n readText,\n observe,\n screenshot,\n checkpoint,\n };\n};\n\nexport type Observation = ReturnType<typeof makeObservation>;\n","import { Result, Schema } from \"effect\";\nimport type { ElementHandle, Page } from \"playwright-core\";\n\nimport type { InputReceipt } from \"../../BrowserData.ts\";\nimport { Reasons } from \"../../Errors.ts\";\nimport type { DriverTarget, ElementTarget } from \"./Driver.ts\";\nimport type { ElementAccess } from \"./ElementAccess.ts\";\nimport { failure, safeDecode, sanitize } from \"./NativeCalls.ts\";\nimport { isPerformed, ownerPacing, type PerformedTicket } from \"./NativePacing.ts\";\nimport type { AdmissionPolicy } from \"./Observation.ts\";\nimport type { Ticket } from \"./Owner.ts\";\nimport { move as moveSchedule, pointer as pointerSchedule } from \"./Performance.ts\";\nimport type { Targets } from \"./Targets.ts\";\n\nexport interface NativePoint {\n readonly x: number;\n readonly y: number;\n}\n\n/** What one native pointer command did. The session adds target identity and the host clock. */\nexport interface NativeInput {\n /** The last point this driver commanded on the page, or null if it never placed the pointer. */\n readonly position: NativePoint | null;\n readonly intended?: InputReceipt[\"intended\"];\n}\n\nconst Reach = Schema.Struct({\n x: Schema.Finite,\n y: Schema.Finite,\n reachable: Schema.Boolean,\n});\n\n/** Runs in each document on the path to the exact node, including cross-origin frames. */\nconst hitPoint = (\n node: Node,\n input: NativePoint & { readonly child: boolean },\n): { readonly x: number; readonly y: number; readonly reachable: boolean } => {\n const refused = { x: input.x, y: input.y, reachable: false };\n\n if (\n !(node instanceof Element) ||\n !node.isConnected ||\n input.x < 0 ||\n input.y < 0 ||\n input.x >= innerWidth ||\n input.y >= innerHeight\n )\n return refused;\n\n let hit = node.ownerDocument.elementFromPoint(input.x, input.y);\n\n for (let depth = 0; hit?.shadowRoot; depth++) {\n if (depth >= 32) return refused;\n const inner = hit.shadowRoot.elementFromPoint(input.x, input.y);\n\n if (inner === null || inner === hit) break;\n hit = inner;\n }\n if (hit === null || (hit !== node && !node.contains(hit))) return refused;\n if (!input.child) return { x: input.x, y: input.y, reachable: true };\n if (!(node instanceof HTMLElement)) return refused;\n\n // Mapping a bounding rectangle through rotation/perspective would guess a point. Admit\n // positive axis-aligned scaling/translation; reject unsupported transforms before input.\n let ancestor: Element | null = node;\n\n for (let depth = 0; ancestor !== null; depth++) {\n if (depth >= 128) return refused;\n const style = getComputedStyle(ancestor);\n const rotation = style.getPropertyValue(\"rotate\");\n const scale = style.getPropertyValue(\"scale\");\n\n if (\n (rotation !== \"\" && rotation !== \"none\" && rotation !== \"0deg\") ||\n (scale !== \"\" &&\n scale !== \"none\" &&\n scale.split(/\\s+/).some((axis) => !(Number.parseFloat(axis) > 0))) ||\n style.perspective !== \"none\" ||\n (style.offsetPath !== \"\" && style.offsetPath !== \"none\")\n )\n return refused;\n if (style.transform !== \"none\") {\n const matrix = new DOMMatrixReadOnly(style.transform);\n\n if (!matrix.is2D || matrix.b !== 0 || matrix.c !== 0 || matrix.a <= 0 || matrix.d <= 0)\n return refused;\n }\n const root = ancestor.getRootNode();\n\n ancestor = ancestor.parentElement ?? (root instanceof ShadowRoot ? root.host : null);\n }\n\n const rect = node.getBoundingClientRect();\n const scaleX = rect.width / node.offsetWidth;\n const scaleY = rect.height / node.offsetHeight;\n\n if (!Number.isFinite(scaleX) || !Number.isFinite(scaleY) || scaleX <= 0 || scaleY <= 0)\n return refused;\n const style = getComputedStyle(node);\n const left = Number.parseFloat(style.paddingLeft);\n const top = Number.parseFloat(style.paddingTop);\n const right = Number.parseFloat(style.paddingRight);\n const bottom = Number.parseFloat(style.paddingBottom);\n const x = (input.x - rect.left) / scaleX - node.clientLeft - left;\n const y = (input.y - rect.top) / scaleY - node.clientTop - top;\n\n if (\n !Number.isFinite(x) ||\n !Number.isFinite(y) ||\n x < 0 ||\n y < 0 ||\n x >= node.clientWidth - left - right ||\n y >= node.clientHeight - top - bottom\n )\n return refused;\n\n return { x, y, reachable: true };\n};\n\n/**\n * Real pointer input to the exact target page. Every command is one the browser would receive from\n * a person, so handlers see trusted events and the browser decides what is under the pointer.\n * Nothing here scrolls, eases or retries: a caller that wants a trajectory sends its points.\n */\nexport const makePointer = (targets: Targets, elements: ElementAccess) => {\n const { current } = targets;\n // Chromium keeps a pointer position per page; this is only the last one this driver set.\n const positions = new WeakMap<Page, NativePoint | null>();\n // Where the last input on a page aimed. A click leaves the actual position unknown, but the\n // next performed glide still starts from its aim; this is never reported as a position.\n const aims = new WeakMap<Page, NativePoint>();\n\n const moveTo = async (page: Page, point: NativePoint): Promise<void> => {\n await page.mouse.move(point.x, point.y);\n positions.set(page, point);\n aims.set(page, point);\n };\n\n const receipt = (page: Page): NativeInput => ({ position: positions.get(page) ?? null });\n\n const invalidate = (page: Page, aim?: NativePoint): void => {\n positions.set(page, null);\n if (aim === undefined) aims.delete(page);\n else aims.set(page, aim);\n };\n\n const glideFrom = (page: Page) => positions.get(page) ?? aims.get(page) ?? null;\n\n const pointerMove = (point: NativePoint, ticket: Ticket, target: DriverTarget) =>\n sanitize(async () => {\n const { entry, frame } = current(target);\n const { page } = entry;\n const epoch = targets.epochOf(frame);\n\n if (isPerformed(ticket)) {\n const pacing = ownerPacing(ticket);\n\n const viewport = safeDecode(\n Schema.Struct({ width: Schema.Finite, height: Schema.Finite }),\n await page.mainFrame().evaluate(() => ({ width: innerWidth, height: innerHeight })),\n );\n\n ticket.check();\n\n const planned = moveSchedule(ticket.performance.plan, {\n from: glideFrom(page),\n to: point,\n viewport,\n });\n\n if (Result.isFailure(planned)) throw planned.failure;\n pacing.requireDuration(planned.success.durationMillis);\n const started = pacing.now();\n\n if (planned.success.samples.length >= 2)\n ticket.recordGlide?.({\n target: { pageId: entry.id, frameId: targets.frameId(frame) },\n startedMonotonicNanos: started,\n samples: planned.success.samples,\n });\n if (planned.success.durationMillis > 0)\n await pacing.pauseUntil(\n started + BigInt(Math.round(planned.success.durationMillis * 1e6)),\n );\n ticket.check();\n if (current(target).frame !== frame || targets.epochOf(frame) !== epoch)\n throw failure(Reasons.Stale.make({}), \"undispatched\");\n }\n ticket.dispatch();\n await moveTo(page, point);\n ticket.acknowledge?.();\n ticket.followUp?.();\n ticket.check();\n\n return receipt(page);\n });\n\n /**\n * The centre of the element's box, in main-frame viewport pixels, and only if the pointer can\n * really be placed there: the box has area, the point is inside the viewport, and the element\n * is what the browser finds at that point. An open shadow root is followed to the node a\n * person would actually be over.\n */\n const reachablePoint = async (\n page: Page,\n element: ElementHandle<Element>,\n requested?: NativePoint,\n check: () => void = () => {},\n ): Promise<NativePoint> => {\n check();\n const box = await element.boundingBox();\n\n check();\n\n if (box === null || box.width <= 0 || box.height <= 0)\n throw failure(Reasons.NotVisible.make({}), \"undispatched\");\n const point = requested ?? { x: box.x + box.width / 2, y: box.y + box.height / 2 };\n\n const ancestors: Array<ElementHandle<Node>> = [];\n\n try {\n check();\n let frame = await element.ownerFrame();\n\n check();\n if (frame === null || frame.page() !== page)\n throw failure(Reasons.Stale.make({}), \"undispatched\");\n while (frame !== page.mainFrame()) {\n if (ancestors.length >= 32)\n throw failure(\n Reasons.Limit.make({\n dimension: \"frame-depth\",\n maximum: 32,\n observed: ancestors.length,\n }),\n \"undispatched\",\n );\n check();\n ancestors.push(await frame.frameElement());\n check();\n frame = frame.parentFrame();\n if (frame === null) throw failure(Reasons.Stale.make({}), \"undispatched\");\n }\n\n let localPoint = point;\n\n // A visible node in a child can still sit behind an overlay in any ancestor. Check the\n // actual commanded point from the main viewport down, then hit-test the exact node.\n for (const ancestor of ancestors.reverse()) {\n check();\n\n const reached = safeDecode(\n Reach,\n await ancestor.evaluate(hitPoint, { ...localPoint, child: true }),\n );\n\n check();\n if (!reached.reachable) throw failure(Reasons.NotVisible.make({}), \"undispatched\");\n localPoint = { x: reached.x, y: reached.y };\n }\n\n check();\n\n const reached = safeDecode(\n Reach,\n await element.evaluate(hitPoint, { ...localPoint, child: false }),\n );\n\n check();\n if (!reached.reachable) throw failure(Reasons.NotVisible.make({}), \"undispatched\");\n } finally {\n await Promise.all(ancestors.map((ancestor) => ancestor.dispose()));\n }\n\n return point;\n };\n\n /**\n * Plans and paces the glide to one exact node. A press may first scroll its node into view; a\n * hover never scrolls (`scrollIntoView: false`): it aims inside the node's visible part and\n * refuses a node with none `NotVisible`. Each read of the node's box is one protocol round trip\n * on the main frame, and the fastest of them is returned for the caller to charge its input by.\n */\n const preparePress = async (\n page: Page,\n element: ElementHandle<Element>,\n ticket: PerformedTicket,\n check: () => void,\n options: { readonly scrollIntoView?: boolean } = {},\n ): Promise<\n NativeInput & {\n readonly intended: NonNullable<InputReceipt[\"intended\"]>;\n readonly roundTripNanos: bigint;\n }\n > => {\n const pacing = ownerPacing(ticket);\n const { performance } = ticket;\n let roundTripNanos: bigint | undefined;\n\n const boxOf = async () => {\n const started = pacing.now();\n const measured = await element.boundingBox();\n const elapsed = pacing.now() - started;\n\n if (roundTripNanos === undefined || elapsed < roundTripNanos) roundTripNanos = elapsed;\n\n return measured;\n };\n\n check();\n const frame = await element.ownerFrame();\n\n check();\n const pageId = targets.pageIdOf(page);\n\n if (frame === null || frame.page() !== page || pageId === undefined)\n throw failure(Reasons.Stale.make({}), \"undispatched\");\n const target = { pageId, frameId: targets.frameId(frame) };\n\n // In the node's own frame: whether its viewport or an overflow ancestor clips it, and the part\n // of it that stays visible, both in that frame's viewport coordinates.\n const layout = safeDecode(\n Schema.NullOr(\n Schema.Struct({\n clipped: Schema.Boolean,\n left: Schema.Finite,\n top: Schema.Finite,\n visible: Schema.Struct({\n left: Schema.Finite,\n top: Schema.Finite,\n right: Schema.Finite,\n bottom: Schema.Finite,\n }),\n }),\n ),\n await element.evaluate((node) => {\n if (!node.isConnected) return null;\n const rect = node.getBoundingClientRect();\n\n if (rect.width <= 0 || rect.height <= 0) return null;\n\n let clipped =\n rect.left < 0 || rect.top < 0 || rect.right > innerWidth || rect.bottom > innerHeight;\n\n let left = Math.max(rect.left, 0);\n let top = Math.max(rect.top, 0);\n let right = Math.min(rect.right, innerWidth);\n let bottom = Math.min(rect.bottom, innerHeight);\n let ancestor: Element | null = node.parentElement;\n\n for (let depth = 0; ancestor !== null; depth++) {\n if (depth >= 128) return null;\n const style = getComputedStyle(ancestor);\n const clip = ancestor.getBoundingClientRect();\n\n if (style.overflowX !== \"visible\") {\n if (rect.left < clip.left || rect.right > clip.right) clipped = true;\n left = Math.max(left, clip.left);\n right = Math.min(right, clip.right);\n }\n if (style.overflowY !== \"visible\") {\n if (rect.top < clip.top || rect.bottom > clip.bottom) clipped = true;\n top = Math.max(top, clip.top);\n bottom = Math.min(bottom, clip.bottom);\n }\n const root = ancestor.getRootNode();\n\n ancestor = ancestor.parentElement ?? (root instanceof ShadowRoot ? root.host : null);\n }\n\n return { clipped, left: rect.left, top: rect.top, visible: { left, top, right, bottom } };\n }),\n );\n\n check();\n if (layout === null) throw failure(Reasons.NotVisible.make({}), \"undispatched\");\n\n const viewport = safeDecode(\n Schema.Struct({ width: Schema.Finite, height: Schema.Finite }),\n await page.mainFrame().evaluate(() => ({ width: innerWidth, height: innerHeight })),\n );\n\n check();\n let box = await boxOf();\n\n check();\n if (box === null) throw failure(Reasons.NotVisible.make({}), \"undispatched\");\n\n const outside =\n layout.clipped ||\n box.x < 0 ||\n box.y < 0 ||\n box.x + box.width > viewport.width ||\n box.y + box.height > viewport.height;\n\n // The glide aims inside this region of the page: the whole node unless only part is visible.\n let aimRegion = box;\n\n if (outside && options.scrollIntoView === false) {\n // A hover never scrolls: it aims inside the part of the node that is visible now, as a plain\n // hover may, and refuses only a node with no visible part. The frame-local region moves into\n // page coordinates by the node's own offset; the hit test then checks the planned point.\n const width = layout.visible.right - layout.visible.left;\n const height = layout.visible.bottom - layout.visible.top;\n\n if (width <= 0 || height <= 0) throw failure(Reasons.NotVisible.make({}), \"undispatched\");\n aimRegion = {\n x: box.x - layout.left + layout.visible.left,\n y: box.y - layout.top + layout.visible.top,\n width,\n height,\n };\n } else if (outside) {\n const startedMonotonicNanos = pacing.now();\n\n ticket.dispatch();\n await element.scrollIntoViewIfNeeded({ timeout: ticket.remainingMillis() });\n ticket.acknowledge?.({ subphase: \"scroll-into-view\", logicalComplete: false });\n ticket.recordScroll?.({\n target,\n qualification: \"exact-node-scroll-into-view\",\n startedMonotonicNanos,\n completedMonotonicNanos: pacing.now(),\n });\n check();\n const scrolled = await boxOf();\n\n check();\n if (scrolled === null) throw failure(Reasons.NotVisible.make({}), \"undispatched\");\n box = scrolled;\n aimRegion = scrolled;\n }\n\n const planned = pointerSchedule(performance.plan, {\n from: glideFrom(page),\n box: aimRegion,\n viewport,\n });\n\n if (Result.isFailure(planned)) throw planned.failure;\n const schedule = planned.success;\n\n pacing.requireDuration(schedule.durationMillis);\n\n await reachablePoint(page, element, schedule.aim, check);\n check();\n\n const border = safeDecode(\n Schema.Struct({ left: Schema.Finite, top: Schema.Finite }),\n await element.evaluate((node) => {\n const style = getComputedStyle(node);\n\n return {\n left: Number.parseFloat(style.borderLeftWidth),\n top: Number.parseFloat(style.borderTopWidth),\n };\n }),\n );\n\n check();\n\n const relativePosition = {\n x: schedule.aim.x - box.x - border.left,\n y: schedule.aim.y - box.y - border.top,\n };\n\n if (relativePosition.x < 0 || relativePosition.y < 0)\n throw failure(Reasons.NotVisible.make({}), \"undispatched\");\n const started = pacing.now();\n\n if (schedule.samples.length >= 2)\n ticket.recordGlide?.({ target, startedMonotonicNanos: started, samples: schedule.samples });\n if (schedule.durationMillis > 0)\n await pacing.pauseUntil(started + BigInt(Math.round(schedule.durationMillis * 1e6)));\n check();\n const beforeInput = await boxOf();\n\n check();\n if (\n beforeInput === null ||\n Math.abs(beforeInput.x - box.x) > 0.01 ||\n Math.abs(beforeInput.y - box.y) > 0.01 ||\n Math.abs(beforeInput.width - box.width) > 0.01 ||\n Math.abs(beforeInput.height - box.height) > 0.01\n )\n throw failure(Reasons.Stale.make({}), \"undispatched\");\n await reachablePoint(page, element, schedule.aim, check);\n check();\n\n return {\n position: null,\n intended: {\n position: schedule.aim,\n relativePosition,\n qualification: \"checked-exact-node-sample\",\n },\n roundTripNanos: roundTripNanos ?? 0n,\n };\n };\n\n const hover = (\n target: ElementTarget,\n ticket: Ticket,\n policy: AdmissionPolicy | undefined,\n browserTarget: DriverTarget,\n ) =>\n sanitize(async () => {\n browserTarget = elements.targetFor(target, browserTarget);\n const { page } = current(browserTarget).entry;\n\n // Plain hover moves straight to the node's reachable point under automatic dispatch; a\n // performed one glides there and dispatches its own move once the glide is checked.\n if (isPerformed(ticket))\n await elements.withAdmittedElement(\n target,\n ticket,\n async () => {},\n async (element, _admitted, check, readmit) => {\n const planned = await preparePress(page, element, ticket, check, {\n scrollIntoView: false,\n });\n\n await readmit();\n check();\n ticket.dispatch();\n await moveTo(page, planned.intended.position);\n },\n policy,\n browserTarget,\n false,\n false,\n );\n else\n await elements.withAdmittedElement(\n target,\n ticket,\n (element) => reachablePoint(page, element),\n (_element, point) => moveTo(page, point),\n policy,\n browserTarget,\n );\n ticket.check();\n\n return receipt(page);\n });\n\n const wheel = (\n deltaX: number,\n deltaY: number,\n at: NativePoint | undefined,\n ticket: Ticket,\n target: DriverTarget,\n ) =>\n sanitize(async () => {\n const { page } = current(target).entry;\n\n if (at !== undefined) {\n ticket.dispatch();\n await moveTo(page, at);\n ticket.acknowledge?.();\n }\n ticket.dispatch();\n // Dispatched, not awaited: Chromium scrolls afterwards, on its own schedule.\n await page.mouse.wheel(deltaX, deltaY);\n ticket.acknowledge?.();\n ticket.followUp?.();\n ticket.check();\n\n return receipt(page);\n });\n\n return { pointerMove, hover, wheel, receipt, invalidate, preparePress };\n};\n","import { Schema } from \"effect\";\nimport type { Frame, JSHandle } from \"playwright-core\";\n\nimport { Reasons } from \"../../Errors.ts\";\nimport type { SettledEvidence, SettledOptions } from \"../../PlanData.ts\";\nimport { failure, safeDecode, sanitize } from \"./NativeCalls.ts\";\nimport type { WaitTicket } from \"./Owner.ts\";\n\nconst Evidence = Schema.Struct({\n quietMillis: Schema.Finite,\n withinMillis: Schema.Finite,\n observedMillis: Schema.Finite,\n signals: Schema.Tuple([\n Schema.Literal(\"dom-mutation\"),\n Schema.Literal(\"scroll\"),\n Schema.Literal(\"root-geometry\"),\n Schema.Literal(\"viewport\"),\n ]),\n samples: Schema.Natural,\n mutations: Schema.Natural,\n scrollChanges: Schema.Natural,\n geometryChanges: Schema.Natural,\n viewportChanges: Schema.Natural,\n visibility: Schema.Literals([\"visible\", \"hidden\"]),\n});\n\nconst Reply = Schema.Union([\n Schema.Struct({ status: Schema.Literal(\"quiet\"), evidence: Evidence }),\n Schema.Struct({ status: Schema.Literals([\"timeout\", \"interrupted\", \"stale\", \"malformed\"]) }),\n]);\n\ntype NativeReply = typeof Reply.Type;\n\ninterface QuietObserver {\n readonly completed: Promise<NativeReply>;\n readonly stop: () => void;\n}\n\n/**\n * One self-contained observer in the pinned document. Geometry means the root and scrolling\n * element's box and dimensions; it does not measure every descendant animation or painted pixel.\n * Timers work without requestAnimationFrame, including when the document is hidden. Browser\n * throttling can still prevent positive quiet evidence before the original host deadline.\n */\nconst observeQuiet = (\n options: SettledOptions & { readonly maximumMillis: number },\n): QuietObserver => {\n const originalDocument = document;\n const root = document.documentElement;\n const viewport = window.visualViewport;\n const started = performance.now();\n let changed = started;\n let done = false;\n let timer: number | undefined;\n let observer: MutationObserver | undefined;\n let samples = 1;\n let mutations = 0;\n let scrollChanges = 0;\n let geometryChanges = 0;\n let viewportChanges = 0;\n let complete: (reply: NativeReply) => void = () => {};\n\n const completed = new Promise<NativeReply>((resolve) => {\n complete = resolve;\n });\n\n const valid = () =>\n document === originalDocument && document.documentElement === root && root.isConnected;\n\n const increment = (count: number, amount = 1) =>\n Math.min(Number.MAX_SAFE_INTEGER, count + amount);\n\n const mark = () => {\n changed = performance.now();\n };\n\n const scroll = () => {\n scrollChanges = increment(scrollChanges);\n mark();\n };\n\n const resize = () => {\n viewportChanges = increment(viewportChanges);\n mark();\n };\n\n const geometry = () => {\n const rectangle = root.getBoundingClientRect();\n const scrolling = document.scrollingElement ?? root;\n\n return [\n rectangle.x,\n rectangle.y,\n rectangle.width,\n rectangle.height,\n root.clientWidth,\n root.clientHeight,\n root.scrollWidth,\n root.scrollHeight,\n scrolling.clientWidth,\n scrolling.clientHeight,\n scrolling.scrollWidth,\n scrolling.scrollHeight,\n ];\n };\n\n const scrollPosition = () => {\n const scrolling = document.scrollingElement ?? root;\n\n return [window.scrollX, window.scrollY, scrolling.scrollLeft, scrolling.scrollTop];\n };\n\n const viewportMetrics = () => [\n window.innerWidth,\n window.innerHeight,\n window.devicePixelRatio,\n viewport?.width ?? window.innerWidth,\n viewport?.height ?? window.innerHeight,\n viewport?.offsetLeft ?? 0,\n viewport?.offsetTop ?? 0,\n viewport?.scale ?? 1,\n ];\n\n let previousGeometry = geometry();\n let previousScroll = scrollPosition();\n let previousViewport = viewportMetrics();\n\n const cleanup = () => {\n observer?.disconnect();\n window.clearTimeout(timer);\n window.removeEventListener(\"scroll\", scroll, true);\n window.removeEventListener(\"resize\", resize);\n window.removeEventListener(\"pagehide\", pageHide);\n viewport?.removeEventListener(\"resize\", resize);\n viewport?.removeEventListener(\"scroll\", resize);\n document.removeEventListener(\"visibilitychange\", mark);\n };\n\n const finish = (reply: NativeReply) => {\n if (done) return;\n done = true;\n cleanup();\n complete(reply);\n };\n\n const pageHide = () => finish({ status: \"stale\" });\n\n const differs = (next: ReadonlyArray<number>, previous: ReadonlyArray<number>) =>\n next.some((value, index) => value !== previous[index]);\n\n const sample = () => {\n if (done) return;\n try {\n if (!valid()) {\n finish({ status: \"stale\" });\n\n return;\n }\n const now = performance.now();\n\n if (now - started >= options.maximumMillis) {\n finish({ status: \"timeout\" });\n\n return;\n }\n const nextGeometry = geometry();\n const nextScroll = scrollPosition();\n const nextViewport = viewportMetrics();\n\n samples = increment(samples);\n if (differs(nextGeometry, previousGeometry)) {\n geometryChanges = increment(geometryChanges);\n changed = now;\n }\n if (differs(nextScroll, previousScroll)) {\n scrollChanges = increment(scrollChanges);\n changed = now;\n }\n if (differs(nextViewport, previousViewport)) {\n viewportChanges = increment(viewportChanges);\n changed = now;\n }\n previousGeometry = nextGeometry;\n previousScroll = nextScroll;\n previousViewport = nextViewport;\n if (now - changed >= options.quietMillis) {\n finish({\n status: \"quiet\",\n evidence: {\n quietMillis: options.quietMillis,\n withinMillis: options.withinMillis,\n observedMillis: now - started,\n signals: [\"dom-mutation\", \"scroll\", \"root-geometry\", \"viewport\"],\n samples,\n mutations,\n scrollChanges,\n geometryChanges,\n viewportChanges,\n visibility: document.visibilityState === \"visible\" ? \"visible\" : \"hidden\",\n },\n });\n\n return;\n }\n timer = window.setTimeout(\n sample,\n Math.max(\n 1,\n Math.min(\n 25,\n options.quietMillis - (now - changed),\n options.maximumMillis - (now - started),\n ),\n ),\n );\n } catch {\n finish({ status: \"malformed\" });\n }\n };\n\n observer = new MutationObserver((records) => {\n mutations = increment(mutations, records.length);\n mark();\n if (!valid()) finish({ status: \"stale\" });\n });\n observer.observe(document, {\n subtree: true,\n childList: true,\n attributes: true,\n characterData: true,\n });\n window.addEventListener(\"scroll\", scroll, true);\n window.addEventListener(\"resize\", resize);\n window.addEventListener(\"pagehide\", pageHide);\n viewport?.addEventListener(\"resize\", resize);\n viewport?.addEventListener(\"scroll\", resize);\n document.addEventListener(\"visibilitychange\", mark);\n timer = window.setTimeout(\n sample,\n Math.max(1, Math.min(25, options.quietMillis, options.maximumMillis)),\n );\n\n return { completed, stop: () => finish({ status: \"interrupted\" }) };\n};\n\n/**\n * Whether the observer's own execution context still answers. Its document being replaced or its\n * frame detached ends that context, and with it every timer and listener the observer owned.\n */\nconst answers = (handle: JSHandle<QuietObserver>): Promise<boolean> =>\n handle\n .evaluate(() => true)\n .then(\n () => true,\n () => false,\n );\n\nexport interface SettledResource {\n readonly wait: () => Promise<SettledEvidence>;\n readonly check: () => void;\n readonly dispose: () => Promise<void>;\n}\n\n/** The existing one-Page wait owner retains capacity until this exact resource is disposed. */\nexport const makeSettledResource = (\n frame: Frame,\n ticket: WaitTicket,\n options: SettledOptions,\n): SettledResource => {\n let setup: Promise<JSHandle<QuietObserver>> | undefined;\n let waiting: Promise<SettledEvidence> | undefined;\n let disposal: Promise<void> | undefined;\n\n const check = () => {\n ticket.check();\n if (frame.isDetached()) throw failure(Reasons.Stale.make({}), \"undispatched\");\n };\n\n const dispose = (): Promise<void> => {\n disposal ??= sanitize(async () => {\n ticket.signal.removeEventListener(\"abort\", abort);\n const pending = setup;\n\n if (pending === undefined) return;\n const handle = await pending;\n\n try {\n await handle.evaluate((resource) => resource.stop());\n } catch (error) {\n // A context that no longer answers took the observer with it: disposal is confirmed.\n if (await answers(handle)) throw error;\n } finally {\n await handle.dispose();\n }\n });\n\n return disposal;\n };\n\n const abort = () => {\n // Observe teardown even if its caller has left. The raw wait's finally awaits the same\n // Promise and refuses retirement on failure; this observer never fabricates disposal.\n void dispose().catch(() => undefined);\n };\n\n ticket.signal.addEventListener(\"abort\", abort, { once: true });\n if (ticket.signal.aborted) abort();\n\n return {\n check,\n dispose,\n wait: () => {\n waiting ??= sanitize(async () => {\n check();\n if (disposal !== undefined) throw failure(Reasons.Interrupted.make({}), \"undispatched\");\n setup = frame.evaluateHandle(observeQuiet, {\n ...options,\n maximumMillis: Math.min(options.withinMillis, ticket.remainingMillis()),\n });\n const handle = await setup;\n\n check();\n\n const reply = safeDecode(\n Reply,\n await handle\n .evaluate((resource) => resource.completed)\n .catch(async (error: unknown) => {\n // The observed document was replaced before it could report its own pagehide.\n if (!(await answers(handle))) throw failure(Reasons.Stale.make({}), \"undispatched\");\n throw error;\n }),\n );\n\n check();\n switch (reply.status) {\n case \"quiet\":\n return reply.evidence;\n case \"timeout\":\n throw failure(Reasons.Timeout.make({}), \"undispatched\");\n case \"interrupted\":\n throw failure(Reasons.Interrupted.make({}), \"undispatched\");\n case \"stale\":\n throw failure(Reasons.Stale.make({}), \"undispatched\");\n case \"malformed\":\n throw failure(Reasons.Malformed.make({}), \"undispatched\");\n }\n });\n\n return waiting;\n },\n };\n};\n","import { Result, Schema } from \"effect\";\nimport type {\n BrowserContext,\n Download,\n ElementHandle,\n FileChooser,\n Frame,\n Page,\n} from \"playwright-core\";\n\nimport { type InputReceipt, SafeFilename } from \"../../BrowserData.ts\";\nimport { Reasons } from \"../../Errors.ts\";\nimport type {\n Driver,\n DriverTarget,\n ElementTarget,\n InputCapture,\n NativeFileSelection,\n NavigationControl,\n} from \"./Driver.ts\";\nimport { makeElementAccess } from \"./ElementAccess.ts\";\nimport { makeKeyboard } from \"./Keyboard.ts\";\nimport {\n closeWithin,\n failure,\n type NativeFailure,\n safeDecode,\n sanitize,\n timeout,\n} from \"./NativeCalls.ts\";\nimport { isPerformed, ownerPacing, type PerformedTicket } from \"./NativePacing.ts\";\nimport { holdsChecked, type Observation, readFieldState } from \"./Observation.ts\";\nimport type { Ticket, WaitTicket } from \"./Owner.ts\";\nimport { scroll as scrollSchedule, type KeySchedule } from \"./Performance.ts\";\nimport { makePointer } from \"./Pointer.ts\";\nimport { makeSettledResource } from \"./Settled.ts\";\nimport type { Entry, Targets } from \"./Targets.ts\";\n\n/**\n * Input types whose whole value is assigned, as Playwright's fill does, rather than typed key by\n * key. A fill checks each on a detached probe; performed typing cannot produce any of them.\n */\nconst AssignedInputTypes: ReadonlyArray<string> = [\n \"color\",\n \"date\",\n \"time\",\n \"datetime-local\",\n \"month\",\n \"range\",\n \"week\",\n];\n\n/** Refuses, undispatched, performed typing into a control whose value can only be assigned. */\nconst refusePerformedTyping = (inputType: string | undefined) => {\n if (inputType !== undefined && AssignedInputTypes.includes(inputType))\n throw failure(Reasons.Unsupported.make({}), \"undispatched\");\n};\n\n/**\n * What Playwright's own input would refuse only after dispatch, checked before it: a node it\n * would wait for until the deadline, or text it would not put into this control. Either way the\n * wait or the thrown error would be an unknown outcome that fences the owner. It mirrors\n * Playwright's visible, enabled and editable checks and its fill rules for the control and text.\n * Runs in the page, so it is self-contained and receives the assigned input types from the host.\n */\nconst inputRefusal = (\n node: Element,\n { text, assigned }: { readonly text?: string; readonly assigned: ReadonlyArray<string> },\n): \"not-visible\" | \"disabled\" | \"unsupported\" | null => {\n const style = getComputedStyle(node);\n\n if (style.display !== \"contents\") {\n const rect = node.getBoundingClientRect();\n\n if (\n (\"checkVisibility\" in node && !node.checkVisibility()) ||\n style.visibility !== \"visible\" ||\n !(rect.width > 0 && rect.height > 0)\n )\n return \"not-visible\";\n }\n if (node.matches(\":disabled\") || node.getAttribute(\"aria-disabled\") === \"true\") return \"disabled\";\n if (text === undefined) return null;\n if (node instanceof HTMLInputElement) {\n const type = node.type.toLowerCase();\n const typed = [\"\", \"email\", \"number\", \"password\", \"search\", \"tel\", \"text\", \"url\"];\n\n if (node.readOnly || (!typed.includes(type) && !assigned.includes(type))) return \"unsupported\";\n if (type === \"number\" && Number.isNaN(Number(text.trim()))) return \"unsupported\";\n if (assigned.includes(type)) {\n // A fresh detached control with the same constraints shows whether this one would keep\n // the value; nothing is written to the page's own node or announced to the page.\n const probe = document.createElement(\"input\");\n const value = type === \"color\" ? text.trim().toLowerCase() : text.trim();\n\n probe.type = type;\n for (const name of [\"min\", \"max\", \"step\"]) {\n const constraint = node.getAttribute(name);\n\n if (constraint !== null) probe.setAttribute(name, constraint);\n }\n probe.value = value;\n if (probe.value !== value) return \"unsupported\";\n }\n\n return null;\n }\n if (node instanceof HTMLTextAreaElement) return node.readOnly ? \"unsupported\" : null;\n\n return node instanceof HTMLElement && node.isContentEditable ? null : \"unsupported\";\n};\n\n/**\n * Lets the page's own handlers run after a form step: two animation frames when the page renders\n * them, then `millis`. A hidden page renders no frames, so the host bounds the wait as well; the\n * wait is never a failure of a step that already dispatched. Runs in the page.\n */\nconst settleInPage = (_node: Element, millis: number) =>\n new Promise<void>((resolve) => {\n let rendered = false;\n let elapsed = false;\n\n const finish = () => {\n if (rendered && elapsed) resolve();\n };\n\n requestAnimationFrame(() =>\n requestAnimationFrame(() => {\n rendered = true;\n finish();\n }),\n );\n setTimeout(() => {\n elapsed = true;\n finish();\n }, millis);\n });\n\n/**\n * The round trips a performed click is charged before dispatch. Over relays adding 18 to 70 ms\n * each way, Playwright 1.63's positioned click took 17 to 23 round trips in all, 14 to 19 of them\n * checking the node before its first input event. A deadline inside those checks closes the Page\n * over input never sent, while a refusal leaves it open, so the charge covers the most checking\n * measured, at the cost of refusing a click that had a few round trips to spare.\n */\nconst performedClickRoundTrips = 20;\n\n/**\n * What a performed click is charged besides its round trips. Playwright's stability check waits\n * for the node across animation frames, which no round trip measures: without a relay, a whole\n * click took 57 ms.\n */\nconst performedClickFloorMillis = 100;\n\n/** A step that already dispatched reads back within a bounded wait, and never fails for it. */\nconst bounded = async <A>(work: Promise<A>, millis: number, fallback: A): Promise<A> => {\n let timer: ReturnType<typeof setTimeout> | undefined;\n\n void work.catch(() => {});\n\n try {\n return await Promise.race([\n work.catch(() => fallback),\n new Promise<A>((resolve) => {\n timer = setTimeout(() => resolve(fallback), Math.max(0, millis));\n }),\n ]);\n } finally {\n clearTimeout(timer);\n }\n};\n\nexport const waitEvent = <A>(\n add: (listener: (value: A) => void) => void,\n remove: (listener: (value: A) => void) => void,\n ticket: Ticket,\n accepts: (value: A) => boolean = () => true,\n) => {\n let done = false;\n let resolve: (value: A) => void = () => {};\n let reject: (error: NativeFailure) => void = () => {};\n\n const promise = new Promise<A>((yes, no) => {\n resolve = yes;\n reject = no;\n });\n\n // Attach a rejection observer immediately, even while the action is still running.\n void promise.catch(() => {});\n\n const cleanup = () => {\n remove(listener);\n ticket.signal.removeEventListener(\"abort\", abort);\n clearTimeout(timer);\n };\n\n const abort = () => {\n if (!done) {\n done = true;\n cleanup();\n reject(failure(Reasons.Interrupted.make({})));\n }\n };\n\n const listener = (value: A) => {\n if (!done && accepts(value)) {\n done = true;\n cleanup();\n resolve(value);\n }\n };\n\n const timer = setTimeout(() => {\n if (!done) {\n done = true;\n cleanup();\n reject(failure(Reasons.Timeout.make({})));\n }\n }, ticket.remainingMillis());\n\n add(listener);\n ticket.signal.addEventListener(\"abort\", abort, { once: true });\n if (ticket.signal.aborted) abort();\n\n return { promise, cancel: abort };\n};\n\ninterface NavigationStopPort {\n readonly stop: () => Promise<void>;\n readonly close: () => Promise<void>;\n}\n\n/**\n * Native stop setup may yield while the navigation completes. Recheck its owner immediately\n * before dispatch, while the caller still holds the browser-owner permit.\n */\nexport const dispatchNavigationStop = async (\n ticket: Ticket,\n pending: () => boolean,\n onDispatch: () => void,\n open: () => Promise<NavigationStopPort>,\n retainSetup: () => () => void,\n): Promise<\"dispatched\" | \"settled\"> => {\n ticket.check();\n const retired = retainSetup();\n let port: NavigationStopPort | undefined;\n\n try {\n port = await open();\n ticket.check();\n if (!pending()) return \"settled\";\n // No await may separate this admission check from dispatch.\n ticket.check();\n ticket.dispatch();\n onDispatch();\n await port.stop();\n ticket.check();\n\n return \"dispatched\";\n } finally {\n // The owner's Effect bounds the caller's wait. A timeout or rejection of native detach\n // does not prove retirement and must not allow another setup to consume this slot.\n if (port !== undefined) await port.close();\n retired();\n }\n};\n\n/**\n * In-memory bytes and provider-stored paths reach the page by different mechanisms and are\n * never mixed: the first is streamed from this client, the second is opened by the browser\n * process itself. A mixed request is a configuration error, not a native surprise later.\n */\nexport const nativeSelection = (\n files: ReadonlyArray<NativeFileSelection>,\n):\n | {\n readonly _tag: \"Inline\";\n readonly payload: Array<{ name: string; mimeType: string; buffer: Buffer }>;\n }\n | { readonly _tag: \"Remote\"; readonly paths: Array<string> } => {\n if (files.length === 0) throw failure(Reasons.Configuration.make({}), \"undispatched\");\n const inline = files.filter((file) => file._tag === \"Inline\");\n const remote = files.filter((file) => file._tag === \"Remote\");\n\n // The maintained native API encodes a Node Buffer; this lazily loaded driver already\n // requires the Node-only Playwright peer, so the conversion belongs here and nowhere else.\n if (inline.length === files.length) {\n return {\n _tag: \"Inline\",\n payload: inline.map((file) => ({\n name: file.name,\n mimeType: file.mediaType,\n buffer: Buffer.from(file.bytes),\n })),\n };\n }\n if (remote.length === files.length)\n return { _tag: \"Remote\", paths: remote.map((file) => file.path) };\n throw failure(Reasons.Configuration.make({}), \"undispatched\");\n};\n\n/**\n * Input to one exact document. Each native mutation marks dispatch before it starts and records\n * its acknowledgement before follow-up reads, which may fail after the mutation was performed.\n */\nexport const makeActions = (\n context: BrowserContext,\n targets: Targets,\n observation: Observation,\n isTimeoutError: (error: unknown) => boolean,\n) => {\n const { current } = targets;\n // Built in dependency order: exact-node admission, then the pointer and keyboard drivers that\n // use it, then the actions that use all three.\n const elements = makeElementAccess(observation);\n const { targetFor, withAdmittedElement, withElement } = elements;\n const pointer = makePointer(targets, elements);\n const keyboard = makeKeyboard(targets, elements, pointer.receipt);\n\n const navigationControls = new Map<\n string,\n {\n readonly control: NavigationControl | undefined;\n readonly mainFrame: boolean;\n }\n >();\n\n let downloadSerial = 0;\n\n /** A result URL is only ever an http(s) address without credentials. */\n const httpUrl = (value: string) => {\n let url: URL;\n\n try {\n url = new URL(value);\n } catch {\n throw failure(Reasons.Malformed.make({}));\n }\n if (![\"http:\", \"https:\"].includes(url.protocol) || url.username || url.password)\n throw failure(Reasons.Malformed.make({}));\n\n return value;\n };\n\n const reportable = (value: string): string | undefined => {\n try {\n const url = new URL(value);\n\n return value.length <= 8192 &&\n [\"http:\", \"https:\"].includes(url.protocol) &&\n url.hostname !== \"\" &&\n !url.username &&\n !url.password\n ? value\n : undefined;\n } catch {\n return undefined;\n }\n };\n\n const ownHttpAddress = (value: string): boolean => {\n try {\n return [\"http:\", \"https:\"].includes(new URL(value).protocol);\n } catch {\n return false;\n }\n };\n\n /**\n * The frame's own http(s) address or, for a document without one (srcdoc, about:blank, data:),\n * its nearest ancestor's. An http(s) address that cannot be reported (longer than 8,192\n * characters, or carrying credentials) is never replaced by an ancestor's, which belongs to a\n * different document: it yields nothing.\n */\n const addressOf = (frame: Frame): string | undefined => {\n for (let at: Frame | null = frame; at !== null; at = at.parentFrame()) {\n const value = at.url();\n\n if (ownHttpAddress(value)) return reportable(value);\n }\n\n return undefined;\n };\n\n /**\n * The address an action reports, read from the host's frame tree and never from the page. A\n * document without an http(s) URL of its own (`about:srcdoc`, `about:blank`, `data:`) reports\n * its nearest ancestor frame's, which is also its base URL. It is resolved before dispatch, so\n * an action never fails over its URL after its input landed: a target with no reportable\n * address, including one whose own http(s) address is too long or carries credentials, is\n * refused unsent, and afterwards the address read before dispatch stands in when the action\n * left none, including when the action removed its own frame or closed its page.\n */\n const resultUrl = (target: DriverTarget) => {\n const { frame } = current(target);\n const before = addressOf(frame);\n\n if (before === undefined) throw failure(Reasons.Unsupported.make({}), \"undispatched\");\n\n return () => (frame.isDetached() ? before : (addressOf(frame) ?? before));\n };\n\n /** Refuses, undispatched, what `inputRefusal` finds on this exact node right now. */\n const refuseInput = async (element: ElementHandle<Element>, text?: string) => {\n const refusal: unknown = await element.evaluate(inputRefusal, {\n ...(text === undefined ? {} : { text }),\n assigned: AssignedInputTypes,\n });\n\n if (refusal === \"not-visible\") throw failure(Reasons.NotVisible.make({}), \"undispatched\");\n if (refusal === \"disabled\") throw failure(Reasons.Disabled.make({}), \"undispatched\");\n if (refusal === \"unsupported\") throw failure(Reasons.Unsupported.make({}), \"undispatched\");\n if (refusal !== null) throw failure(Reasons.Malformed.make({}), \"undispatched\");\n };\n\n /** What is left of a step's deadline for reading back, keeping a margin for the owner. */\n const readBack = (ticket: Ticket, wanted: number) =>\n Math.min(wanted, Math.max(0, ticket.remainingMillis() - 250));\n\n const clickElement = (\n page: Page,\n element: ElementHandle<Element>,\n ticket: Ticket,\n capture?: InputCapture,\n check: () => void = () => ticket.check(),\n readmit?: () => Promise<void>,\n ): Promise<InputReceipt | undefined> => {\n if (isPerformed(ticket)) {\n return pointer.preparePress(page, element, ticket, check).then(async (prepared) => {\n // The round trip is measured here to charge the click; it is not part of the receipt.\n const { roundTripNanos, ...planned } = prepared;\n\n await readmit?.();\n check();\n\n const dispatch = async () => {\n check();\n // Dispatch is marked before Playwright's click, whose own node checks then precede its\n // first input event. A deadline inside them would report an unknown outcome for input\n // never sent, so the click must fit the deadline at this page's measured round trip.\n ownerPacing(ticket).requireDuration(\n performedClickFloorMillis + (performedClickRoundTrips * Number(roundTripNanos)) / 1e6,\n );\n ticket.dispatch();\n // The click moves the pointer where it aimed; the next glide starts there.\n pointer.invalidate(page, planned.intended.position);\n await element.click({\n timeout: timeout(ticket),\n scroll: \"none\",\n position: planned.intended.relativePosition,\n });\n ticket.acknowledge?.();\n ticket.followUp?.();\n };\n\n return capture === undefined\n ? dispatch().then(() => undefined)\n : capture(dispatch, planned);\n });\n }\n\n const dispatch = async () => {\n pointer.invalidate(page);\n await element.click({ timeout: timeout(ticket) });\n ticket.acknowledge?.();\n ticket.followUp?.();\n };\n\n return capture === undefined\n ? dispatch().then(() => undefined)\n : capture(dispatch, { position: null });\n };\n\n const click: Driver[\"click\"] = (target, ticket, capture, policy, browserTarget) =>\n sanitize(async () => {\n browserTarget = targetFor(target, browserTarget);\n const url = resultUrl(browserTarget);\n const { page } = current(browserTarget).entry;\n\n const input = await withAdmittedElement(\n target,\n ticket,\n (element) => (ticket.performance === undefined ? Promise.resolve() : refuseInput(element)),\n (element, _admitted, check, readmit) =>\n clickElement(page, element, ticket, capture, check, readmit),\n policy,\n browserTarget,\n false,\n ticket.performance === undefined,\n );\n\n ticket.check();\n\n if (input === undefined) throw failure(Reasons.Malformed.make({}));\n\n return { url: url(), input };\n });\n\n const clickWithoutReceipt = async (\n target: ElementTarget,\n ticket: Ticket,\n browserTarget: DriverTarget,\n ): Promise<string> => {\n browserTarget = targetFor(target, browserTarget);\n const url = resultUrl(browserTarget);\n const { page } = current(browserTarget).entry;\n\n await withElement(\n target,\n ticket,\n (element, _admitted, check, readmit) =>\n clickElement(page, element, ticket, undefined, check, readmit),\n undefined,\n browserTarget,\n ticket.performance === undefined,\n );\n ticket.check();\n\n return url();\n };\n\n /**\n * A file the provider already stores is named to the browser process, which opens it; this\n * client never reads that path. Exactly one main-frame node may match, and exactly one\n * command dispatches. A retained node or child frame is refused rather than approximated.\n */\n const attachStoredFiles = async (\n target: ElementTarget,\n paths: ReadonlyArray<string>,\n ticket: Ticket,\n browserTarget: DriverTarget,\n ) => {\n if (typeof target !== \"string\") throw failure(Reasons.Unsupported.make({}), \"undispatched\");\n const { entry, frame } = current(browserTarget);\n\n if (frame !== entry.page.mainFrame())\n throw failure(Reasons.Unsupported.make({}), \"undispatched\");\n const cdp = await context.newCDPSession(entry.page);\n\n try {\n ticket.check();\n\n const root = safeDecode(\n Schema.Struct({ root: Schema.Struct({ nodeId: Schema.Int }) }),\n await cdp.send(\"DOM.getDocument\", { depth: 0 }),\n );\n\n const matched = safeDecode(\n Schema.Struct({ nodeIds: Schema.Array(Schema.Int).check(Schema.isMaxLength(64)) }),\n await cdp.send(\"DOM.querySelectorAll\", { nodeId: root.root.nodeId, selector: target }),\n );\n\n ticket.check();\n const nodeId = matched.nodeIds[0];\n\n if (matched.nodeIds.length !== 1 || nodeId === undefined)\n throw failure(\n matched.nodeIds.length === 0 ? Reasons.NotFound.make({}) : Reasons.Ambiguous.make({}),\n \"undispatched\",\n );\n ticket.dispatch();\n await cdp.send(\"DOM.setFileInputFiles\", { files: [...paths], nodeId });\n ticket.acknowledge?.();\n ticket.followUp?.();\n } finally {\n await closeWithin(() => cdp.detach()).catch(() => {});\n }\n };\n\n const beginNavigation: Driver[\"beginNavigation\"] = (\n url,\n timeoutMillis,\n ticket,\n target,\n control,\n ) =>\n sanitize(async () => {\n const { entry, frame } = current(target);\n const active = { control, mainFrame: frame === entry.page.mainFrame() };\n\n ticket.dispatch();\n navigationControls.set(entry.id, active);\n targets.navigating.begin(entry.id);\n\n // Not awaited here: the permit that dispatched it is released while the browser loads.\n const settled = sanitize(async () => {\n try {\n await frame.goto(url, { waitUntil: \"domcontentloaded\", timeout: timeoutMillis });\n } catch (error) {\n // Preserve the installed engine's exact timeout identity before generic sanitization.\n if (isTimeoutError(error)) throw failure(Reasons.Timeout.make({}), \"unknown\");\n throw error;\n } finally {\n // A stop may have admitted a successor before this old goto finally rejects.\n if (navigationControls.get(entry.id) === active) {\n navigationControls.delete(entry.id);\n targets.navigating.end(entry.id);\n }\n }\n\n // The frame that navigated, not whatever is selected by the time it finishes.\n return httpUrl(targets.urlOf(frame));\n });\n\n // Whoever awaits it sees the failure; a caller that never does raises nothing unhandled.\n void settled.catch(() => {});\n\n return {\n pageId: entry.id,\n mainFrame: active.mainFrame,\n settled,\n stop: (stopTicket, pending, onDispatch, retainSetup) =>\n sanitize(async () => {\n return dispatchNavigationStop(\n stopTicket,\n pending,\n onDispatch,\n async () => {\n const cdp = await context.newCDPSession(entry.page);\n\n return {\n stop: async () => {\n await cdp.send(\"Page.stopLoading\");\n },\n close: () => cdp.detach(),\n };\n },\n retainSetup,\n );\n }),\n };\n });\n\n const fill: Driver[\"fill\"] = (target, value, ticket, policy, browserTarget) =>\n sanitize(async () => {\n browserTarget = targetFor(target, browserTarget);\n const url = resultUrl(browserTarget);\n\n await withAdmittedElement(\n target,\n ticket,\n async (element, facts) => {\n await refuseInput(element, value);\n if (!isPerformed(ticket)) return undefined;\n refusePerformedTyping(facts?.inputType);\n\n return { ticket, schedule: keyboard.prepareKeys(value, ticket) };\n },\n (element, performed, check, readmit) =>\n performed === undefined\n ? element.fill(value, { timeout: timeout(ticket) })\n : keyboard.fillElement(\n current(browserTarget).entry.page,\n element,\n performed.schedule,\n performed.ticket,\n check,\n readmit,\n ),\n policy,\n browserTarget,\n false,\n ticket.performance === undefined,\n );\n ticket.check();\n\n return url();\n });\n\n /**\n * One form step on an exact observed node, which may have become enabled since it was\n * observed. Text is filled and the control is then left, as a person moving on would, so what\n * the page does on blur belongs to this step. A toggle is clicked only when it is not already\n * in the requested state, and a native radio is never asked to clear itself. Options are the\n * issued nodes of the same observation, exactly as `selectOption` sends them.\n */\n const formStep: Driver[\"formStep\"] = (\n target,\n field,\n ticket,\n policy,\n settleMillis,\n capture,\n browserTarget,\n ) =>\n sanitize(async () => {\n browserTarget = targetFor(target, browserTarget);\n const url = resultUrl(browserTarget);\n\n const {\n element,\n reference: leasedReference,\n check,\n readmit,\n facts,\n capture: sampled,\n release,\n } = await observation.resolve(\n target,\n ticket,\n policy,\n false,\n browserTarget,\n true,\n ticket.performance !== undefined,\n );\n\n try {\n check();\n if (facts === undefined) throw failure(Reasons.Malformed.make({}), \"undispatched\");\n let act: (() => Promise<unknown>) | undefined;\n let input: InputReceipt | undefined;\n\n if (field.options !== undefined) {\n const admitted = await observation.selectOptions(\n target,\n field.options,\n element,\n ticket,\n true,\n browserTarget,\n );\n\n act = async () => {\n const values = await element.selectOption(admitted.handles, {\n timeout: timeout(ticket),\n });\n\n ticket.acknowledge?.();\n ticket.followUp?.();\n const expected = [...admitted.values].sort();\n\n if (\n values.length !== expected.length ||\n values.sort().some((value, i) => value !== expected[i])\n )\n throw failure(Reasons.Stale.make({}));\n };\n } else if (field.checked !== undefined) {\n if (facts.checked === undefined)\n throw failure(Reasons.Unsupported.make({}), \"undispatched\");\n if (facts.checked !== field.checked) {\n if (!field.checked && facts.inputType === \"radio\")\n throw failure(Reasons.Unsupported.make({}), \"undispatched\");\n await refuseInput(element);\n act = async () => {\n input = await clickElement(\n current(browserTarget).entry.page,\n element,\n ticket,\n capture,\n check,\n readmit,\n );\n };\n }\n } else {\n const text = field.value ?? \"\";\n\n await refuseInput(element, text);\n\n let performed:\n | { readonly ticket: PerformedTicket; readonly schedule: KeySchedule }\n | undefined;\n\n if (isPerformed(ticket)) {\n refusePerformedTyping(facts.inputType);\n performed = { ticket, schedule: keyboard.prepareKeys(text, ticket) };\n }\n act = async () => {\n if (performed === undefined) await element.fill(text, { timeout: timeout(ticket) });\n else\n await keyboard.fillElement(\n current(browserTarget).entry.page,\n element,\n performed.schedule,\n performed.ticket,\n check,\n readmit,\n );\n ticket.acknowledge?.({ subphase: \"key-burst\", logicalComplete: false });\n check();\n ticket.dispatch();\n await element.evaluate((node) => {\n if (node instanceof HTMLElement && node.ownerDocument.activeElement === node)\n node.blur();\n });\n ticket.acknowledge?.();\n ticket.followUp?.();\n };\n }\n check();\n ticket.check();\n ticket.captureTarget?.(target, sampled);\n if (act !== undefined) {\n // ElementHandle actions do not re-resolve onto a replacement node.\n if (ticket.performance === undefined || field.options !== undefined) ticket.dispatch();\n await act();\n if (settleMillis > 0)\n await bounded(\n observation.passiveRead(\n leasedReference ?? target,\n ticket,\n () => element.evaluate(settleInPage, settleMillis),\n browserTarget,\n ),\n readBack(ticket, settleMillis + 250),\n undefined,\n );\n }\n\n const state = await bounded(\n observation.passiveRead(\n leasedReference ?? target,\n ticket,\n () => readFieldState(element),\n browserTarget,\n ),\n readBack(ticket, 1000),\n undefined,\n );\n\n ticket.check();\n\n return {\n status: act === undefined ? \"unchanged\" : \"set\",\n reached:\n field.checked === undefined ||\n state === undefined ||\n holdsChecked(state, field.checked),\n state,\n url: url(),\n ...(input === undefined ? {} : { input }),\n };\n } finally {\n await closeWithin(release).catch(() => {});\n }\n });\n\n /** The one submit click, on an exact observed node that may have become enabled. */\n const formSubmit: Driver[\"formSubmit\"] = (target, ticket, capture, policy, browserTarget) =>\n sanitize(async () => {\n browserTarget = targetFor(target, browserTarget);\n const url = resultUrl(browserTarget);\n const { page } = current(browserTarget).entry;\n\n const input = await withAdmittedElement(\n target,\n ticket,\n (element) => refuseInput(element),\n (element, _admitted, check, readmit) =>\n clickElement(page, element, ticket, capture, check, readmit),\n policy,\n browserTarget,\n true,\n ticket.performance === undefined,\n );\n\n ticket.check();\n\n if (input === undefined) throw failure(Reasons.Malformed.make({}));\n\n return { url: url(), input };\n });\n\n const selectOption: Driver[\"selectOption\"] = (target, options, ticket, policy, browserTarget) =>\n sanitize(async () => {\n browserTarget = targetFor(target, browserTarget);\n const url = resultUrl(browserTarget);\n\n await withAdmittedElement(\n target,\n ticket,\n (element) =>\n observation.selectOptions(target, options, element, ticket, false, browserTarget),\n async (element, admitted) => {\n // Only issued native nodes reach this command. Its returned values stay private.\n const values = await element.selectOption(admitted.handles, { timeout: timeout(ticket) });\n\n ticket.acknowledge?.();\n ticket.followUp?.();\n const expected = [...admitted.values].sort();\n\n if (\n values.length !== expected.length ||\n values.sort().some((value, i) => value !== expected[i])\n )\n throw failure(Reasons.Stale.make({}));\n },\n policy,\n browserTarget,\n );\n ticket.check();\n\n return url();\n });\n\n const scroll: Driver[\"scroll\"] = (deltaX, deltaY, ticket, target) =>\n sanitize(async () => {\n const { frame } = current(target);\n const url = resultUrl(target);\n\n if (isPerformed(ticket)) {\n const pacing = ownerPacing(ticket);\n const planned = scrollSchedule(ticket.performance.plan, deltaX, deltaY);\n\n if (Result.isFailure(planned)) throw planned.failure;\n pacing.requireDuration(planned.success.durationMillis);\n const epoch = targets.epochOf(frame);\n const started = pacing.now();\n\n for (const sample of planned.success.samples) {\n await pacing.pauseUntil(started + BigInt(Math.round(sample.offsetMillis * 1e6)));\n ticket.check();\n if (current(target).frame !== frame || targets.epochOf(frame) !== epoch)\n throw failure(Reasons.Stale.make({}), \"undispatched\");\n const requested = pacing.now();\n\n ticket.dispatch();\n await frame.evaluate(\n ({ x, y }) => window.scrollBy({ left: x, top: y, behavior: \"instant\" }),\n { x: sample.deltaX, y: sample.deltaY },\n );\n ticket.acknowledge?.({ subphase: \"scroll-burst\", logicalComplete: false });\n ticket.recordScroll?.({\n target,\n x: sample.deltaX,\n y: sample.deltaY,\n startedMonotonicNanos: requested,\n completedMonotonicNanos: pacing.now(),\n });\n }\n ticket.acknowledge?.();\n ticket.followUp?.();\n ticket.check();\n\n return url();\n }\n ticket.dispatch();\n await frame.evaluate(\n ({ x, y }) => window.scrollBy({ left: x, top: y, behavior: \"instant\" }),\n { x: deltaX, y: deltaY },\n );\n ticket.acknowledge?.();\n ticket.followUp?.();\n ticket.check();\n\n return url();\n });\n\n const scrollTo: Driver[\"scrollTo\"] = (target, ticket, browserTarget) =>\n sanitize(async () => {\n browserTarget = targetFor(target, browserTarget);\n const url = resultUrl(browserTarget);\n\n await withElement(\n target,\n ticket,\n (element) =>\n element.evaluate((node) =>\n node.scrollIntoView({ behavior: \"instant\", block: \"center\", inline: \"center\" }),\n ),\n undefined,\n browserTarget,\n );\n ticket.check();\n\n return url();\n });\n\n let waitConnectionRetired = false;\n\n const pendingWaits = new Map<Entry, { readonly frame: Frame; readonly ticket: WaitTicket }>();\n\n /** Capture native identity before releasing admission; no later read follows live selection. */\n const waitOn = <A>(\n ticket: WaitTicket,\n target: DriverTarget,\n acquire: () => {\n readonly wait: () => Promise<A>;\n readonly check?: () => void;\n readonly dispose: () => Promise<void>;\n },\n ): Promise<A> => {\n ticket.check();\n const { entry, frame } = current(target);\n\n if (waitConnectionRetired) throw failure(Reasons.Closed.make({}), \"undispatched\");\n // One native wait per exact Page, including canceled waits whose disposal has not been\n // confirmed. The aggregate remains finite even when closed caller fibers leave work behind.\n if (pendingWaits.has(entry) || pendingWaits.size >= 32)\n throw failure(Reasons.Busy.make({}), \"undispatched\");\n const epoch = targets.epochOf(frame);\n const resource = acquire();\n const pending = { frame, ticket };\n\n pendingWaits.set(entry, pending);\n\n const check = () => {\n ticket.check();\n const resolved = current(target);\n\n if (\n waitConnectionRetired ||\n resolved.entry !== entry ||\n resolved.frame !== frame ||\n targets.epochOf(frame) !== epoch\n )\n throw failure(Reasons.Stale.make({}), \"undispatched\");\n resource.check?.();\n };\n\n return sanitize(async () => {\n let result: A;\n\n try {\n try {\n check();\n result = await resource.wait();\n check();\n } catch (error) {\n // Lifecycle/deadline evidence wins over a native cancellation or detached-node error.\n check();\n if (isTimeoutError(error)) throw failure(Reasons.Timeout.make({}), \"undispatched\");\n throw error;\n }\n } finally {\n // This raw release is observed after caller cancellation, without renewing its deadline.\n // A rejected disposal proves no retirement, so keep that Page's native capacity until\n // positive Page or connection closure. Old completion never frees a successor's slot.\n await resource.dispose();\n ticket.retire();\n if (pendingWaits.get(entry) === pending) pendingWaits.delete(entry);\n }\n check();\n\n return result;\n });\n };\n\n const waitFor: Driver[\"waitFor\"] = (selector, state, ticket, target) =>\n waitOn(ticket, target, () => {\n const { frame } = current(target);\n let node: ElementHandle<Element> | null | undefined;\n\n return {\n wait: async () => {\n node = await frame.waitForSelector(selector, {\n state,\n strict: true,\n timeout: timeout(ticket),\n signal: ticket.signal,\n });\n },\n dispose: async () => {\n if (!waitConnectionRetired) await node?.dispose();\n },\n };\n });\n\n const waitForElement: Driver[\"waitForElement\"] = (reference, state, ticket, target) =>\n waitOn(ticket, targetFor(reference, target) ?? target, () => {\n target = targetFor(reference, target) ?? target;\n const leased = observation.lease(reference, ticket, target);\n\n /** A node that can no longer be read, because its document is gone, is not attached. */\n const attached = async () => {\n leased.check();\n\n const present = await leased.element\n .evaluate((node) => node.isConnected && node.ownerDocument === document)\n .catch(() => false);\n\n leased.check();\n if (present !== true) throw failure(Reasons.Stale.make({}), \"undispatched\");\n };\n\n return {\n check: leased.check,\n wait: async () => {\n try {\n await leased.element.waitForElementState(state, {\n timeout: timeout(ticket),\n signal: ticket.signal,\n });\n } catch (error) {\n // A replaced document can reject the native wait before the navigation event\n // advances its epoch, so ask the node itself. A hidden wait needs asking only then:\n // a node removed from a live document already satisfies it.\n if (state !== \"hidden\" || !(isTimeoutError(error) || ticket.signal.aborted))\n await attached();\n throw error;\n }\n // A hidden node may have left its document; any other state needs it attached.\n if (state !== \"hidden\") await attached();\n },\n dispose: leased.release,\n };\n });\n\n const settled: Driver[\"settled\"] = (options, ticket, target) =>\n waitOn(ticket, target, () => makeSettledResource(current(target).frame, ticket, options));\n\n const clickAndWait: Driver[\"clickAndWait\"] = (target, ticket, capture, browserTarget) =>\n sanitize(async () => {\n browserTarget = targetFor(target, browserTarget);\n const url = resultUrl(browserTarget);\n const { entry, frame } = current(browserTarget);\n\n const observer = waitEvent<Frame>(\n (on) => entry.page.on(\"framenavigated\", on),\n (off) => entry.page.off(\"framenavigated\", off),\n ticket,\n (changedFrame) => changedFrame === frame,\n );\n\n try {\n const clicked = await click(target, ticket, capture, undefined, browserTarget);\n\n await observer.promise;\n await frame.waitForLoadState(\"domcontentloaded\", { timeout: timeout(ticket) });\n ticket.check();\n\n return { url: url(), input: clicked.input };\n } finally {\n observer.cancel();\n }\n });\n\n const clickForDownload: Driver[\"clickForDownload\"] = (target, ticket, browserTarget) =>\n sanitize(async () => {\n browserTarget = targetFor(target, browserTarget);\n const page = current(browserTarget).entry.page;\n\n const observer = waitEvent<Download>(\n (on) => page.on(\"download\", on),\n (off) => page.off(\"download\", off),\n ticket,\n );\n\n try {\n await clickWithoutReceipt(target, ticket, browserTarget);\n const download = await observer.promise;\n\n const filename = safeDecode(SafeFilename, download.suggestedFilename());\n\n const error = await download.failure();\n\n ticket.check();\n\n return {\n downloadId: `native-download-${++downloadSerial}`,\n filename,\n state: error === null ? \"completed\" : \"failed\",\n };\n } finally {\n observer.cancel();\n }\n });\n\n const selectFiles: Driver[\"selectFiles\"] = (target, files, ticket, browserTarget) =>\n sanitize(async () => {\n browserTarget = targetFor(target, browserTarget);\n const url = resultUrl(browserTarget);\n const selection = nativeSelection(files);\n\n if (selection._tag === \"Remote\")\n await attachStoredFiles(target, selection.paths, ticket, browserTarget);\n else\n await withElement(\n target,\n ticket,\n (element) => element.setInputFiles(selection.payload, { timeout: timeout(ticket) }),\n undefined,\n browserTarget,\n );\n ticket.check();\n\n return url();\n });\n\n const clickForFileSelection: Driver[\"clickForFileSelection\"] = (\n target,\n files,\n ticket,\n browserTarget,\n ) =>\n sanitize(async () => {\n browserTarget = targetFor(target, browserTarget);\n const url = resultUrl(browserTarget);\n const selection = nativeSelection(files);\n\n // A chooser is satisfied with bytes this client holds. A provider-stored file is\n // attached to an exact input node instead, where the browser can open the path.\n if (selection._tag === \"Remote\") throw failure(Reasons.Unsupported.make({}), \"undispatched\");\n const page = current(browserTarget).entry.page;\n\n const observer = waitEvent<FileChooser>(\n (on) => page.on(\"filechooser\", on),\n (off) => page.off(\"filechooser\", off),\n ticket,\n );\n\n try {\n await clickWithoutReceipt(target, ticket, browserTarget);\n const chooser = await observer.promise;\n\n ticket.check();\n if (!chooser.isMultiple() && selection.payload.length > 1)\n throw failure(Reasons.Unsupported.make({}));\n // Exactly one attachment for this chooser; a second would open another dispatch.\n ticket.dispatch();\n await chooser.setFiles(selection.payload, { timeout: timeout(ticket) });\n ticket.acknowledge?.();\n ticket.followUp?.();\n ticket.check();\n\n return url();\n } finally {\n observer.cancel();\n }\n });\n\n return {\n pointer,\n keyboard,\n withAdmittedElement,\n targetFor,\n beginNavigation,\n /** Capture the exact navigation at dialog arrival; acknowledgement never looks it up again. */\n beforeUnload: (pageId: string) => {\n const active = navigationControls.get(pageId);\n\n return active?.mainFrame === true ? active.control?.beforeUnload() : undefined;\n },\n click,\n fill,\n formStep,\n formSubmit,\n selectOption,\n scroll,\n scrollTo,\n settled,\n waitFor,\n waitForElement,\n waitChanged: (entry: Entry, frame?: Frame) => {\n const pending = pendingWaits.get(entry);\n\n if (\n pending !== undefined &&\n (frame === undefined || frame === pending.frame || frame === entry.page.mainFrame())\n )\n pending.ticket.invalidate();\n },\n retireWaitPage: (entry: Entry) => {\n const pending = pendingWaits.get(entry);\n\n if (pending === undefined) return;\n pending.ticket.invalidate();\n pending.ticket.retire();\n if (pendingWaits.get(entry) === pending) pendingWaits.delete(entry);\n },\n retireWait: () => {\n waitConnectionRetired = true;\n for (const pending of pendingWaits.values()) {\n pending.ticket.invalidate();\n pending.ticket.retire();\n }\n pendingWaits.clear();\n },\n clickAndWait,\n clickForDownload,\n selectFiles,\n clickForFileSelection,\n };\n};\n","export type CallbackFailureMode = \"reject-call\" | \"fail-session\";\n\nexport type CallbackDisposition = \"not-dispatched\" | \"unknown\";\n\n/** Native callbacks cannot await a Semaphore. Reserve a bounded slot synchronously\n * before starting native work; never construct an already-running Promise first.\n * Fail-session pressure/failure fences the connection once. Reject-call pressure or\n * failure remains local to that invocation and reopens admission when accepted work\n * settles. Accepted rejections remain observed after close, and no callback-side Fiber\n * or unbounded producer queue is created. */\nexport class CallbackTasks {\n private readonly pending = new Set<Promise<void>>();\n private stopped = false;\n private faulted = false;\n\n private readonly capacity: number;\n private readonly onFault: (disposition: CallbackDisposition) => void;\n\n constructor(capacity: number, onFault: (disposition: CallbackDisposition) => void) {\n if (!Number.isSafeInteger(capacity) || capacity < 1)\n throw new RangeError(\"Invalid callback capacity\");\n this.capacity = capacity;\n this.onFault = onFault;\n }\n\n private fault(disposition: CallbackDisposition): void {\n if (this.stopped || this.faulted) return;\n this.faulted = true;\n this.onFault(disposition);\n }\n\n submit(\n action: () => Promise<unknown>,\n failureMode: CallbackFailureMode = \"fail-session\",\n ): boolean {\n if (this.stopped || this.faulted) return false;\n if (this.pending.size >= this.capacity) {\n if (failureMode === \"fail-session\") this.fault(\"not-dispatched\");\n\n return false;\n }\n\n const task = Promise.resolve()\n .then(action)\n .then(\n () => {},\n () => {\n if (failureMode === \"fail-session\") this.fault(\"unknown\");\n },\n )\n .finally(() => this.pending.delete(task));\n\n this.pending.add(task);\n\n return true;\n }\n\n stop(): void {\n this.stopped = true;\n }\n\n drained(): boolean {\n return this.pending.size === 0;\n }\n\n async settle(): Promise<void> {\n await Promise.all(this.pending);\n }\n}\n","import type { Frame } from \"playwright-core\";\n\nimport { Reasons } from \"../../Errors.ts\";\nimport type {\n CaptureBinding,\n CaptureInvalidation,\n CaptureSource,\n CaptureTarget,\n NativeFrame,\n} from \"./Driver.ts\";\nimport { failure, sanitize } from \"./NativeCalls.ts\";\nimport type { Entry, Targets } from \"./Targets.ts\";\n\ninterface CaptureWatcher {\n readonly frameId: string;\n readonly invalidate: (reason: CaptureInvalidation) => void;\n readonly document?: (url: string, sameDocument: boolean) => void;\n}\n\n/**\n * Screencast sources bound to one page and frame, and the watchers that learn when that binding\n * stops describing what the page shows. A main-frame change invalidates every watcher on the page.\n */\nexport const makeCaptureSources = (targets: Targets) => {\n const { current, entries, frameId } = targets;\n const captureWatchers = new Map<string, Set<CaptureWatcher>>();\n\n const invalidate = (entry: Entry, reason: CaptureInvalidation, frame?: Frame): void => {\n const watchers = captureWatchers.get(entry.id);\n\n if (watchers === undefined) return;\n const changedFrameId = frame === undefined ? undefined : frameId(frame);\n const mainFrameId = frameId(entry.page.mainFrame());\n\n // oxlint-disable-next-line unicorn/no-useless-spread -- a callback may start or stop a watcher\n for (const watcher of [...watchers]) {\n if (\n frame !== undefined &&\n changedFrameId !== mainFrameId &&\n changedFrameId !== watcher.frameId\n )\n continue;\n // The page's screencast keeps running across a main-frame navigation. An interval that\n // follows its page is told a new document began; one bound to a document ends, as before.\n if (\n frame !== undefined &&\n watcher.document !== undefined &&\n reason === \"target-changed\" &&\n changedFrameId === mainFrameId &&\n watcher.frameId === mainFrameId\n )\n // Read inside the navigation event itself: this is the address that just committed.\n watcher.document(frame.url(), false);\n else watcher.invalidate(reason);\n }\n };\n\n const sameDocumentNavigated = (entry: Entry, frame: Frame): void => {\n const watchers = captureWatchers.get(entry.id);\n\n if (watchers === undefined || frame !== entry.page.mainFrame()) return;\n for (const watcher of watchers)\n if (watcher.frameId === frameId(frame)) watcher.document?.(frame.url(), true);\n };\n\n const forget = (entry: Entry) => {\n const watchers = captureWatchers.get(entry.id);\n\n if (watchers !== undefined)\n // oxlint-disable-next-line unicorn/no-useless-spread -- invalidation releases watchers from this set\n for (const watcher of [...watchers]) watcher.invalidate(\"target-closed\");\n captureWatchers.delete(entry.id);\n };\n\n const clear = () => {\n captureWatchers.clear();\n };\n\n const capture = (target: CaptureTarget): Promise<CaptureBinding> =>\n sanitize(async () => {\n const entry = entries.get(target.pageId);\n\n if (entry === undefined || entry.page.isClosed())\n throw failure(Reasons.NotFound.make({}), \"undispatched\");\n if ((await targets.targetId(entry)) !== target.targetId)\n throw failure(Reasons.Stale.make({}), \"undispatched\");\n const captureFrame = entry.page.mainFrame();\n const page = entry.page;\n const targetId = await targets.targetId(entry);\n const watchedFrameId = frameId(captureFrame);\n\n current({ pageId: entry.id, frameId: watchedFrameId });\n\n // The maintained API is required; older Playwright versions fail explicitly, never silently emulate it.\n if (page.screencast === undefined) throw failure(Reasons.Unsupported.make({}));\n let watcherSet: Set<CaptureWatcher> | undefined;\n let watcher: CaptureWatcher | undefined;\n\n const source: CaptureSource = {\n start: ({ receive, quality, size, invalidate, opened, document }) =>\n sanitize(async () => {\n watcherSet = captureWatchers.get(entry.id) ?? new Set<CaptureWatcher>();\n captureWatchers.set(entry.id, watcherSet);\n watcher = {\n frameId: watchedFrameId,\n invalidate,\n ...(document === undefined ? {} : { document }),\n };\n watcherSet.add(watcher);\n // No await separates these two lines, so no navigation event can run between them.\n opened?.(captureFrame.url());\n await page.screencast.start({\n quality,\n ...(size === undefined ? {} : { size }),\n onFrame: (frame: NativeFrame) => {\n receive(frame);\n },\n });\n }),\n stop: () =>\n sanitize(async () => {\n // A closed target cannot produce more frames; its page channel rejects stop.\n if (page.isClosed()) return;\n try {\n await page.screencast.stop();\n } catch (error) {\n // Closure can race the stop request. A live target still requires quarantine.\n if (!page.isClosed()) throw error;\n }\n }),\n release: () => {\n if (watcher !== undefined && watcherSet !== undefined) {\n watcherSet.delete(watcher);\n watcher = undefined;\n if (watcherSet.size === 0) captureWatchers.delete(entry.id);\n }\n },\n };\n\n return { pageId: entry.id, targetId, frameId: watchedFrameId, source };\n });\n\n return { invalidate, sameDocumentNavigated, forget, clear, capture };\n};\n","import { Schema } from \"effect\";\nimport type { BrowserContext, CDPSession, Frame, Page } from \"playwright-core\";\n\nimport { Identifier } from \"../../BrowserData.ts\";\nimport { InitializationError } from \"../../Errors.ts\";\nimport type { NativeBinding } from \"./Bindings.ts\";\nimport { safeDecode } from \"./NativeCalls.ts\";\n\nconst ContextCreated = Schema.Struct({\n context: Schema.Struct({\n id: Schema.Int.check(Schema.isGreaterThan(0)),\n uniqueId: Schema.NonEmptyString.check(Schema.isMaxLength(256)),\n origin: Schema.String.check(Schema.isMaxLength(2048)),\n auxData: Schema.optionalKey(Schema.Struct({ isDefault: Schema.Boolean, frameId: Identifier })),\n }),\n});\n\nconst ContextDestroyed = Schema.Struct({ executionContextId: Schema.Int });\nconst TargetIdentity = Schema.Struct({ targetInfo: Schema.Struct({ targetId: Identifier }) });\n\nconst Call = Schema.Struct({\n name: Identifier,\n sequence: Schema.Int.check(Schema.isBetween({ minimum: 1, maximum: Number.MAX_SAFE_INTEGER })),\n input: Schema.String.check(Schema.isMaxLength(1024 * 1024)),\n});\n\ntype DocumentIdentity = typeof ContextCreated.Type.context & {\n sequence: number;\n readonly targetId: string;\n};\n\ninterface TargetRegistration {\n readonly cdp: CDPSession;\n readonly documents: Map<number, DocumentIdentity>;\n readonly page: Page;\n readonly off: () => void;\n closed: boolean;\n}\n\nconst error = (step: string, reason: InitializationError[\"reason\"]) =>\n InitializationError.make({ operation: \"callback\", step, reason });\n\n/**\n * A small page-side transport, not a second host scheduler. Each document owns its finite\n * pending replies and one startup timer; host authority always comes from Chromium's native\n * execution-context event, never the fields in this message or a page-reported origin.\n */\nconst pageBundle = (\n nativeName: string,\n controllerName: string,\n bindings: ReadonlyArray<NativeBinding>,\n): string => `(() => {\n const nativeName = ${JSON.stringify(nativeName)};\n const controllerName = ${JSON.stringify(controllerName)};\n if (Object.prototype.hasOwnProperty.call(globalThis, controllerName)) return;\n const definitions = ${JSON.stringify(\n bindings.map(({ name, maxConcurrent, maxInputBytes, timeoutMillis }) => ({\n name,\n maximum: maxConcurrent + 1,\n maxInputBytes,\n timeoutMillis,\n })),\n )};\n const stringify = JSON.stringify.bind(JSON);\n const parse = JSON.parse.bind(JSON);\n const encode = new TextEncoder();\n const descriptors = Object.getOwnPropertyDescriptors;\n const ownKeys = Reflect.ownKeys;\n const prototype = Object.getPrototypeOf;\n const plain = Object.prototype;\n const arrayPrototype = Array.prototype;\n const pending = new Map();\n const functions = new Map();\n const counts = new Map();\n let sequence = 0;\n let closed = false;\n let startup;\n const rejected = () => {\n const value = new Error('Browser binding call rejected');\n value.name = 'BrowserBindingError';\n value.stack = '';\n return value;\n };\n const jsonInput = (value, maximum) => {\n let nodes = 0;\n const ancestors = new Set();\n const visit = (item, depth) => {\n if (++nodes > Math.min(maximum, 65536) || depth > 64) throw rejected();\n if (item === null || typeof item === 'boolean') return;\n if (typeof item === 'string') { if (item.length > maximum) throw rejected(); return; }\n if (typeof item === 'number') { if (!Number.isFinite(item)) throw rejected(); return; }\n if (typeof item !== 'object' || ancestors.has(item)) throw rejected();\n const array = Array.isArray(item);\n const parent = prototype(item);\n if (array ? parent !== arrayPrototype : parent !== plain && parent !== null) throw rejected();\n ancestors.add(item);\n const fields = descriptors(item);\n const keys = ownKeys(fields);\n if (keys.length > Math.min(maximum, 65536)) throw rejected();\n if (array && keys.length !== item.length + 1) throw rejected();\n for (const key of keys) {\n if (array && key === 'length') continue;\n if (typeof key !== 'string' || key.length > maximum || key === 'toJSON') throw rejected();\n const field = fields[key];\n if (!field.enumerable || !Object.prototype.hasOwnProperty.call(field, 'value')) throw rejected();\n if (array && (!/^(0|[1-9][0-9]*)$/.test(key) || Number(key) >= item.length)) throw rejected();\n visit(field.value, depth + 1);\n }\n ancestors.delete(item);\n };\n visit(value, 0);\n return stringify(value);\n };\n const settle = (id, packet) => {\n const call = pending.get(id);\n if (!call) return;\n pending.delete(id);\n clearTimeout(call.timer);\n counts.set(call.name, (counts.get(call.name) || 1) - 1);\n if (packet && packet.ok === true) {\n try { call.resolve(parse(packet.text)); } catch { call.reject(rejected()); }\n } else call.reject(rejected());\n };\n const dispatch = () => {\n clearTimeout(startup);\n startup = undefined;\n if (closed) return;\n const native = globalThis[nativeName];\n if (typeof native !== 'function') {\n if (pending.size > 0) startup = setTimeout(dispatch, 10);\n return;\n }\n for (const [id, call] of pending) {\n if (call.sent) continue;\n call.sent = true;\n try { native(call.message); } catch { settle(id); }\n }\n };\n const close = () => {\n if (closed) return;\n closed = true;\n clearTimeout(startup);\n for (const id of [...pending.keys()]) settle(id);\n for (const [name, fn] of functions) {\n if (globalThis[name] === fn) delete globalThis[name];\n }\n };\n const controller = Object.freeze({ deliver: settle, close,\n get status() { return closed ? 'closed' : functions.size === definitions.length ? 'ready' : 'installing'; }\n });\n Object.defineProperty(globalThis, controllerName, { value: controller, configurable: true });\n for (const definition of definitions) {\n if (Object.prototype.hasOwnProperty.call(globalThis, definition.name)) { close(); return; }\n const fn = (...args) => new Promise((resolve, reject) => {\n if (closed || args.length !== 1 || sequence >= Number.MAX_SAFE_INTEGER ||\n (counts.get(definition.name) || 0) >= definition.maximum) {\n reject(rejected()); return;\n }\n let input;\n try {\n input = jsonInput(args[0], definition.maxInputBytes);\n if (typeof input !== 'string' || input.length > definition.maxInputBytes ||\n encode.encode(input).byteLength > definition.maxInputBytes) throw rejected();\n } catch { reject(rejected()); return; }\n const id = ++sequence;\n const timer = setTimeout(() => settle(id), definition.timeoutMillis);\n counts.set(definition.name, (counts.get(definition.name) || 0) + 1);\n pending.set(id, { name: definition.name, resolve, reject, timer, sent: false,\n message: stringify({ name: definition.name, sequence: id, input }) });\n dispatch();\n });\n functions.set(definition.name, fn);\n Object.defineProperty(globalThis, definition.name, { value: fn, configurable: true });\n }\n})();`;\n\n/**\n * The pinned Playwright binding callback reports a Frame but no calling document identity.\n * That Frame survives navigation, so checking frame.url() would authorize an old document\n * using its replacement's origin. Chromium's maintained Runtime binding protocol supplies\n * the original executionContextId; uniqueId prevents context-id reuse when publishing replies.\n * These are child CDP sessions on the existing owned Playwright connection, not another owner,\n * websocket, browser resource or publicly exposed raw-protocol capability.\n */\n/**\n * Whether a native call failed with this Playwright refusal. Playwright prefixes the text with the\n * calling API, which differs between runtimes and between `newCDPSession` and `send`, so only the\n * stable refusal itself is compared.\n */\nconst nativeRefusal = (cause: unknown, refusal: string): boolean =>\n cause instanceof Error && cause.message.includes(refusal);\n\nexport const makeNativeBindings = (\n context: BrowserContext,\n /** Unpredictable and never reported, so no page can define these globals before they install. */\n bindingIdentity: string,\n bindings: ReadonlyArray<NativeBinding>,\n fault: () => void,\n /** Resolve only the still-registered exact native page; never reconstruct retired authority. */\n pageIdOf: (page: Page) => string | undefined,\n) => {\n const identity = bindingIdentity.replaceAll(\"-\", \"\");\n const nativeName = `__effect_agent_binding_${identity}`;\n const controllerName = `__effect_agent_bindings_${identity}`;\n const bundle = pageBundle(nativeName, controllerName, bindings);\n const byName = new Map(bindings.map((binding) => [binding.name, binding]));\n const targets = new Map<string, TargetRegistration>();\n const currentDocuments = new Map<string, DocumentIdentity>();\n // Each subject still being attached, with the page it belongs to when that page is registered.\n const attaching = new Map<Page | Frame, string | undefined>();\n const retiredRegistrations = new WeakSet<InitializationError>();\n\n const retirementError = (reason: \"closed\" | \"stale\") => {\n const cause = InitializationError.make({ operation: \"register\", step: \"bindings\", reason });\n\n retiredRegistrations.add(cause);\n\n return cause;\n };\n\n // Native replies are bounded too, including rejected calls and late native completions.\n const maximumReplies = 16 + bindings.reduce((sum, binding) => sum + binding.maxConcurrent, 0);\n let replies = 0;\n // Outstanding replies by the page whose document called; a page has an entry only while one is.\n const replyPages = new Map<string, number>();\n let closing = false;\n let disposed: Promise<void> | undefined;\n\n const close = () => {\n closing = true;\n };\n\n const attach = async (subject: Page | Frame, page: Page): Promise<void> => {\n const registrationError = (reason: InitializationError[\"reason\"]) =>\n InitializationError.make({ operation: \"register\", step: \"bindings\", reason });\n\n const check = () => {\n if (closing || page.isClosed() || pageIdOf(page) === undefined)\n throw retirementError(\"closed\");\n if (subject !== page && \"isDetached\" in subject && subject.isDetached())\n throw retirementError(\"stale\");\n };\n\n check();\n if (attaching.has(subject)) return;\n if (attaching.size >= 128) throw registrationError(\"busy\");\n attaching.set(subject, pageIdOf(page));\n let cdp: CDPSession | undefined;\n let retained = false;\n let nativeClosed = false;\n\n const onNativeClosed = () => {\n nativeClosed = true;\n };\n\n try {\n try {\n cdp = await context.newCDPSession(subject);\n } catch (cause) {\n // Chromium routes same-process child frames through their parent's target. Only this\n // Playwright refusal selects that already-owned session; other failures remain faults\n // rather than silently omitting an out-of-process frame.\n if (subject !== page && nativeRefusal(cause, \"does not have a separate CDP session\"))\n return;\n throw cause;\n }\n const native = cdp;\n\n native.on(\"close\", onNativeClosed);\n check();\n\n const targetId = safeDecode(TargetIdentity, await native.send(\"Target.getTargetInfo\"))\n .targetInfo.targetId;\n\n check();\n if (targets.has(targetId)) return;\n if (targets.size >= 128) throw error(\"bindings\", \"busy\");\n const documents = new Map<number, DocumentIdentity>();\n\n const created = (raw: unknown) => {\n const parsed = Schema.decodeUnknownOption(ContextCreated)(raw);\n\n if (parsed._tag === \"None\") return;\n const value = parsed.value.context;\n\n if (closing || value.auxData?.isDefault !== true) return;\n const prior = documents.get(value.id);\n\n if (prior?.uniqueId === value.uniqueId) return;\n const previous = currentDocuments.get(value.auxData.frameId);\n\n if (previous !== undefined) {\n const previousDocuments = targets.get(previous.targetId)?.documents;\n\n if (previousDocuments?.get(previous.id) === previous)\n previousDocuments.delete(previous.id);\n currentDocuments.delete(value.auxData.frameId);\n }\n if (documents.size >= 128 && !documents.has(value.id)) {\n fault();\n\n return;\n }\n const document = { ...value, sequence: 0, targetId };\n\n // A new default context for the native frame retires the old document even when its\n // destruction event lags a process swap or a back/forward-cache transition.\n currentDocuments.set(value.auxData.frameId, document);\n documents.set(value.id, document);\n };\n\n const destroyed = (raw: unknown) => {\n const parsed = Schema.decodeUnknownOption(ContextDestroyed)(raw);\n\n if (parsed._tag === \"Some\") {\n const document = documents.get(parsed.value.executionContextId);\n const frameId = document?.auxData?.frameId;\n\n if (frameId !== undefined && currentDocuments.get(frameId) === document)\n currentDocuments.delete(frameId);\n documents.delete(parsed.value.executionContextId);\n }\n };\n\n const cleared = () => {\n for (const document of documents.values()) {\n const frameId = document.auxData?.frameId;\n\n if (frameId !== undefined && currentDocuments.get(frameId) === document)\n currentDocuments.delete(frameId);\n }\n documents.clear();\n };\n\n const called = (event: {\n readonly name: string;\n readonly payload: string;\n readonly executionContextId: number;\n }) => {\n if (closing || event.name !== nativeName || replies >= maximumReplies) return;\n const document = documents.get(event.executionContextId);\n const pageId = pageIdOf(page);\n\n if (\n pageId === undefined ||\n document === undefined ||\n event.payload.length > 2 * 1024 * 1024 + 512\n )\n return;\n const parsed = Schema.decodeOption(Schema.fromJsonString(Call))(event.payload);\n\n if (parsed._tag === \"None\") return;\n const call = parsed.value;\n const binding = byName.get(call.name);\n\n if (binding === undefined || call.sequence <= document.sequence) return;\n document.sequence = call.sequence;\n replies++;\n replyPages.set(pageId, (replyPages.get(pageId) ?? 0) + 1);\n let retired = false;\n\n const check = async (signal: AbortSignal) => {\n const current = () => {\n if (\n closing ||\n retired ||\n signal.aborted ||\n page.isClosed() ||\n pageIdOf(page) !== pageId\n )\n throw error(binding.name, \"closed\");\n if (\n documents.get(document.id) !== document ||\n currentDocuments.get(document.auxData?.frameId ?? \"\") !== document\n )\n throw error(binding.name, \"stale\");\n if (!binding.origins.includes(document.origin)) throw error(binding.name, \"origin\");\n };\n\n current();\n\n const result = await native.send(\"Runtime.evaluate\", {\n expression: \"true\",\n uniqueContextId: document.uniqueId,\n returnByValue: true,\n silent: true,\n timeout: binding.timeoutMillis,\n });\n\n current();\n if (result.exceptionDetails !== undefined || result.result.value !== true)\n throw error(binding.name, \"stale\");\n };\n\n const reply = async (\n packet: { readonly ok: false } | { readonly ok: true; readonly text: string },\n ) => {\n if (\n closing ||\n page.isClosed() ||\n documents.get(document.id) !== document ||\n currentDocuments.get(document.auxData?.frameId ?? \"\") !== document\n )\n return;\n await native.send(\"Runtime.evaluate\", {\n expression: `globalThis[${JSON.stringify(controllerName)}]?.deliver(${call.sequence},${JSON.stringify(packet)})`,\n uniqueContextId: document.uniqueId,\n returnByValue: true,\n silent: true,\n timeout: binding.timeoutMillis,\n });\n };\n\n // Runtime admission is synchronous before a consumer fiber or native validation starts.\n // Both branches stay observed even when the source document disappears while settling.\n void binding\n .invoke({\n pageId,\n origin: document.origin,\n read: async (signal) => {\n // An environment-free codec can still suspend or invoke host code. Authorize\n // before even decoding, then recheck after decode and before publishing a reply.\n await check(signal);\n\n return call.input;\n },\n check,\n dispose: async () => {\n retired = true;\n },\n })\n .then(\n (text) => reply({ ok: true, text }),\n () => reply({ ok: false }),\n )\n .catch(() => {})\n .finally(() => {\n replies--;\n const remaining = (replyPages.get(pageId) ?? 1) - 1;\n\n if (remaining === 0) replyPages.delete(pageId);\n else replyPages.set(pageId, remaining);\n });\n };\n\n const off = () => {\n native.off(\"Runtime.executionContextCreated\", created);\n native.off(\"Runtime.executionContextDestroyed\", destroyed);\n native.off(\"Runtime.executionContextsCleared\", cleared);\n native.off(\"Runtime.bindingCalled\", called);\n cleared();\n };\n\n const target: TargetRegistration = { cdp: native, documents, page, off, closed: false };\n\n const onClosed = () => {\n target.closed = true;\n off();\n if (targets.get(targetId) === target) targets.delete(targetId);\n native.off(\"close\", onClosed);\n };\n\n native.on(\"close\", onClosed);\n targets.set(targetId, target);\n retained = true;\n native.on(\"Runtime.executionContextCreated\", created);\n native.on(\"Runtime.executionContextDestroyed\", destroyed);\n native.on(\"Runtime.executionContextsCleared\", cleared);\n native.on(\"Runtime.bindingCalled\", called);\n check();\n await native.send(\"Runtime.enable\");\n check();\n await native.send(\"Runtime.addBinding\", { name: nativeName });\n if (closing) {\n await native.send(\"Runtime.removeBinding\", { name: nativeName }).catch(() => {});\n\n return;\n }\n // Existing documents receive only the callable bridge, never replayed consumer init scripts.\n for (const document of documents.values()) {\n check();\n\n const current = () =>\n documents.get(document.id) === document &&\n currentDocuments.get(document.auxData?.frameId ?? \"\") === document;\n\n const installed = await native\n .send(\"Runtime.evaluate\", {\n expression: `${bundle}\\nglobalThis[${JSON.stringify(controllerName)}]?.status`,\n uniqueContextId: document.uniqueId,\n returnByValue: true,\n silent: true,\n timeout: 2000,\n })\n .catch((cause: unknown) => {\n // The document's own retirement, not the wording of the failure, decides this.\n if (!current()) throw retirementError(\"stale\");\n throw cause;\n });\n\n if (!current()) continue;\n if (installed.exceptionDetails !== undefined || installed.result.value !== \"ready\")\n throw InitializationError.make({\n operation: \"register\",\n step: \"bindings\",\n reason: \"configuration\",\n });\n }\n } catch (cause) {\n // The error text only classifies a failure after this exact native subject has positively\n // retired; it never supplies page, frame or document authority. Other protocol failures\n // remain failures even when a close event happened before their rejection reached this code.\n if (\n nativeRefusal(cause, \"Target page, context or browser has been closed\") &&\n (page.isClosed() ||\n nativeClosed ||\n (subject !== page && \"isDetached\" in subject && subject.isDetached()))\n )\n throw retirementError(page.isClosed() || nativeClosed ? \"closed\" : \"stale\");\n throw cause;\n } finally {\n if (cdp !== undefined && (!retained || closing)) await cdp.detach().catch(() => {});\n cdp?.off(\"close\", onNativeClosed);\n attaching.delete(subject);\n }\n };\n\n const dispose = (): Promise<void> => {\n close();\n disposed ??= (async () => {\n const settled = await Promise.allSettled(\n [...targets.values()].map(async (target) => {\n const documents = [...target.documents.values()];\n\n target.off();\n\n const removal = await Promise.allSettled([\n (async () => {\n if (!target.closed && !target.page.isClosed()) {\n for (const document of documents) {\n await target.cdp\n .send(\"Runtime.evaluate\", {\n expression: `globalThis[${JSON.stringify(controllerName)}]?.close()`,\n uniqueContextId: document.uniqueId,\n returnByValue: true,\n silent: true,\n timeout: 1000,\n })\n .catch(() => {});\n }\n if (!target.closed)\n await target.cdp.send(\"Runtime.removeBinding\", { name: nativeName });\n }\n })(),\n ]);\n\n // Always attempt detach without overwriting an earlier removal failure. A native\n // target close is terminal evidence; an arbitrary transport error is not.\n const wasClosed = target.closed || target.page.isClosed();\n\n const detachment = await Promise.allSettled([\n target.closed ? Promise.resolve() : target.cdp.detach(),\n ]);\n\n if (!wasClosed && removal.some((result) => result.status === \"rejected\"))\n throw InitializationError.make({\n operation: \"dispose\",\n step: \"bindings\",\n reason: \"native\",\n });\n if (\n !target.closed &&\n !target.page.isClosed() &&\n detachment.some((result) => result.status === \"rejected\")\n )\n throw InitializationError.make({\n operation: \"dispose\",\n step: \"bindings\",\n reason: \"native\",\n });\n }),\n );\n\n targets.clear();\n currentDocuments.clear();\n if (settled.some((result) => result.status === \"rejected\"))\n throw InitializationError.make({\n operation: \"dispose\",\n step: \"bindings\",\n reason: \"native\",\n });\n })();\n\n return disposed;\n };\n\n return {\n bundle,\n attach,\n close,\n dispose,\n /**\n * Whether no attachment or reply is outstanding. Work for a page that is `held` (quarantined by\n * a dialog or popup policy) cannot hold up the handoff that releases it: a reply to that page\n * waits behind its dialog, and the operator's release lets it through.\n */\n drained: (held: (pageId: string) => boolean = () => false) =>\n [...attaching.values()].every((pageId) => pageId !== undefined && held(pageId)) &&\n [...replyPages.keys()].every(held),\n retiredRegistration: (cause: unknown) =>\n Schema.is(InitializationError)(cause) && retiredRegistrations.has(cause),\n };\n};\n","import { Schema } from \"effect\";\nimport type { BrowserContext, Disposable, Frame, Page } from \"playwright-core\";\n\nimport { Reasons, InitializationError } from \"../../Errors.ts\";\nimport type { CompiledBootstrap } from \"./Bootstrap.ts\";\nimport type { CallbackTasks } from \"./CallbackTasks.ts\";\nimport type {\n Driver,\n DriverEvents,\n DriverOptions,\n DriverTarget,\n ReadinessState,\n} from \"./Driver.ts\";\nimport { makeNativeBindings } from \"./NativeBindings.ts\";\nimport { failure, NativeFailure, sanitize } from \"./NativeCalls.ts\";\nimport type { Ticket } from \"./Owner.ts\";\nimport type { Targets } from \"./Targets.ts\";\n\n/**\n * The connection's bootstrap registrations and native bindings, and the readiness of the selected\n * document under that bootstrap. Fencing is synchronous; disposal removes what was registered.\n */\nexport const makeInitialization = (\n context: BrowserContext,\n options: DriverOptions,\n bindingIdentity: string,\n targets: Targets,\n callbacks: CallbackTasks,\n events: DriverEvents,\n closing: () => boolean,\n) => {\n const { current, entries, epochOf } = targets;\n const registeredEpochs = new WeakMap<Frame, number>();\n const readyDocuments = new WeakMap<Frame, number>();\n const registrations: Disposable[] = [];\n let initializationClosed = false;\n let disposal: Promise<void> | undefined;\n\n const pendingReadiness = new Map<\n Frame,\n { readonly pageId: string; readonly work: Promise<unknown> }\n >();\n\n const initializationFault = (error: InitializationError) => {\n if (closing() || initializationClosed) return;\n if (options.onBindingFault === undefined)\n events.fault({\n source: \"native\",\n reason: \"registration\",\n disposition: error.reason === \"busy\" ? \"not-dispatched\" : \"unknown\",\n });\n else options.onBindingFault(error);\n };\n\n const revokedPages = new WeakSet<Page>();\n const livePage = (page: Page) => !revokedPages.has(page) && targets.pageIdOf(page) !== undefined;\n\n const bindingTask = (page: Page, action: () => Promise<void>) => {\n const admitted = callbacks.submit(async () => {\n if (!livePage(page)) return;\n try {\n await action();\n } catch (cause) {\n // Revocation does not erase a registration or transport failure. Only native setup\n // that positively identified retirement can settle locally after its page is fenced.\n if (bindings?.retiredRegistration(cause)) return;\n initializationFault(\n Schema.is(InitializationError)(cause)\n ? cause\n : InitializationError.make({\n operation: \"register\",\n step: \"bindings\",\n reason: \"native\",\n }),\n );\n }\n }, \"reject-call\");\n\n if (!admitted && livePage(page))\n initializationFault(\n InitializationError.make({ operation: \"register\", step: \"bindings\", reason: \"busy\" }),\n );\n };\n\n const bindings =\n options.bindings === undefined || options.bindings.length === 0\n ? undefined\n : makeNativeBindings(\n context,\n bindingIdentity,\n options.bindings,\n () =>\n initializationFault(\n InitializationError.make({ operation: \"register\", step: \"bindings\", reason: \"busy\" }),\n ),\n (page) => (livePage(page) ? targets.pageIdOf(page) : undefined),\n );\n\n /**\n * Pending readiness evaluations and native binding work can outlive their callers. Work for a\n * page a dialog or popup has quarantined (`held`) cannot hold up the handoff that releases it.\n */\n const drained = (held: (pageId: string) => boolean = () => false) =>\n [...pendingReadiness.values()].every((pending) => held(pending.pageId)) &&\n (bindings?.drained(held) ?? true);\n\n const attach = async (page: Page) => {\n if (bindings === undefined) return;\n await bindings.attach(page, page);\n for (const frame of page.frames())\n if (frame !== page.mainFrame()) await bindings.attach(frame, page);\n };\n\n const fence = () => {\n initializationClosed = true;\n bindings?.close();\n };\n\n const fencePage = (pageId: string) => {\n const page = entries.get(pageId)?.page;\n\n if (page !== undefined) revokedPages.add(page);\n };\n\n /**\n * The owner calls this only after the global handoff drain and operator release. Pending work\n * on this page, or on a page still `held`, was exempt from that drain and cannot refuse it now.\n */\n const restorePage = (pageId: string, held: (pageId: string) => boolean = () => false) => {\n const page = entries.get(pageId)?.page;\n\n if (\n initializationClosed ||\n !drained((candidate) => candidate === pageId || held(candidate)) ||\n page === undefined ||\n page.isClosed() ||\n targets.pageIdOf(page) !== pageId\n )\n throw failure(Reasons.Stale.make({}));\n revokedPages.delete(page);\n };\n\n const retirePage = (pageId: string) => {\n for (const [frame, pending] of pendingReadiness)\n if (pending.pageId === pageId) pendingReadiness.delete(frame);\n };\n\n const dispose = (): Promise<void> => {\n fence();\n disposal ??= (async () => {\n const outcomes = await Promise.allSettled([\n ...registrations.splice(0).map((registration) => registration.dispose()),\n ...(bindings === undefined ? [] : [bindings.dispose()]),\n ]);\n\n if (outcomes.some((result) => result.status === \"rejected\"))\n throw failure(Reasons.Provider.make({}));\n })();\n\n return disposal;\n };\n\n /** Attaches a page this connection registered after initialization, off the event path. */\n const attachPage = (page: Page) => {\n if (bindings !== undefined) bindingTask(page, () => attach(page));\n };\n\n /** Attaches the new document of a frame that navigated after initialization. */\n const attachFrame = (frame: Frame, page: Page) => {\n if (bindings !== undefined) bindingTask(page, () => bindings.attach(frame, page));\n };\n\n /**\n * Registrations are installed once per connection and before this connection creates any\n * document. Documents that were already running keep their recorded epoch, so the readiness\n * policy can tell them apart from documents that actually ran the bundle.\n */\n const install = async () => {\n const bootstrap = options.bootstrap;\n\n if (bootstrap === undefined && bindings === undefined) return;\n for (const entry of entries.values())\n for (const frame of entry.page.frames()) registeredEpochs.set(frame, epochOf(frame));\n // Host capabilities precede the bundle: a step may depend on a granted capability.\n for (const grant of bootstrap?.permissions ?? [])\n await context.grantPermissions([...grant.permissions], { origin: grant.origin });\n\n // One bundle guarantees callable wrappers exist before dependent init steps. Ordering\n // between two Playwright addInitScript registrations is intentionally not assumed.\n const content = [bindings?.bundle, bootstrap?.bundle]\n .filter((part) => part !== undefined)\n .join(\"\\n\");\n\n if (content.length > 0) {\n const registration = await context.addInitScript({ content });\n\n if (initializationClosed) await registration.dispose();\n else registrations.push(registration);\n }\n };\n\n const documentOrigin = (frame: Frame): string => {\n try {\n const url = new URL(frame.url());\n\n return [\"http:\", \"https:\"].includes(url.protocol) ? url.origin : \"\";\n } catch {\n return \"\";\n }\n };\n\n /** A finite wait for a page promise. Native work continues; only this wait is bounded. */\n const evaluateWithin = async (\n frame: Frame,\n expression: string,\n milliseconds: number,\n ): Promise<unknown> => {\n const pageId = targets.pageIdOf(frame.page());\n\n if (pageId === undefined || !livePage(frame.page()) || frame.isDetached())\n throw failure(Reasons.Stale.make({}));\n if (pendingReadiness.has(frame) || pendingReadiness.size >= 32)\n throw failure(Reasons.Busy.make({}));\n const pending = { pageId, work: Promise.resolve().then(() => frame.evaluate(expression)) };\n\n pendingReadiness.set(frame, pending);\n\n const retired = () => {\n if (pendingReadiness.get(frame) === pending) pendingReadiness.delete(frame);\n };\n\n void pending.work.then(retired, retired);\n let timer: ReturnType<typeof setTimeout> | undefined;\n\n try {\n return await Promise.race([\n pending.work,\n new Promise<never>((_, reject) => {\n timer = setTimeout(() => reject(failure(Reasons.Timeout.make({}))), milliseconds);\n }),\n ]);\n } finally {\n clearTimeout(timer);\n }\n };\n\n const readiness = async (\n bootstrap: CompiledBootstrap,\n ticket: Ticket,\n target: DriverTarget,\n ): Promise<ReadinessState> => {\n const { frame } = current(target);\n\n if (!livePage(frame.page()) || frame.isDetached()) throw failure(Reasons.Stale.make({}));\n const epoch = epochOf(frame);\n\n if (readyDocuments.get(frame) === epoch) return { _tag: \"Ready\" };\n ticket.check();\n // A document that predates registration never ran the bundle; saying so is the contract.\n if (epoch <= (registeredEpochs.get(frame) ?? -1)) {\n if (bootstrap.existingDocuments === \"RequireFreshNavigation\")\n return { _tag: \"RequiresNavigation\" };\n }\n const origin = documentOrigin(frame);\n\n const applicable = bootstrap.readiness.filter(\n (requirement) => requirement.origins === undefined || requirement.origins.includes(origin),\n );\n\n if (applicable.length === 0) {\n readyDocuments.set(frame, epoch);\n\n return { _tag: \"NotApplicable\" };\n }\n\n for (const requirement of applicable) {\n const budget = Math.max(1, Math.min(requirement.timeoutMillis, ticket.remainingMillis()));\n let value: unknown;\n\n try {\n value = await evaluateWithin(frame, requirement.expression, budget);\n } catch (error) {\n if (Schema.is(NativeFailure)(error) && error.reason._tag === \"Busy\") throw error;\n if (epochOf(frame) !== epoch || frame.isDetached() || !livePage(frame.page()))\n return { _tag: \"NotReady\", step: requirement.step, reason: \"stale\" };\n\n return {\n _tag: \"NotReady\",\n step: requirement.step,\n reason:\n Schema.is(NativeFailure)(error) && error.reason._tag === \"Timeout\"\n ? \"timeout\"\n : \"failed\",\n };\n }\n ticket.check();\n // A completed wait cannot ready a document that replaced the one it observed.\n if (epochOf(frame) !== epoch || frame.isDetached() || !livePage(frame.page()))\n return { _tag: \"NotReady\", step: requirement.step, reason: \"stale\" };\n if (value !== true) return { _tag: \"NotReady\", step: requirement.step, reason: \"failed\" };\n }\n readyDocuments.set(frame, epoch);\n\n return { _tag: \"Ready\" };\n };\n\n const documentReadiness: Driver[\"documentReadiness\"] = (ticket, target) =>\n sanitize(async () => {\n const bootstrap = options.bootstrap;\n\n return bootstrap === undefined || bootstrap.readiness.length === 0\n ? { _tag: \"Ready\" as const }\n : readiness(bootstrap, ticket, target);\n });\n\n return {\n attach,\n attachPage,\n attachFrame,\n fence,\n fencePage,\n restorePage,\n drained,\n retirePage,\n dispose,\n install,\n documentReadiness,\n };\n};\n","import { PageExecutionState, PageSuspension } from \"../../BrowserData.ts\";\nimport { Reasons, BrowserError } from \"../../Errors.ts\";\nimport type { Ticket } from \"./Owner.ts\";\n\nexport interface PageExecutionNative {\n readonly readRate: () => Promise<number>;\n readonly rate: (value: number) => Promise<void>;\n readonly focus: (enabled: boolean) => Promise<void>;\n readonly lifecycle: (state: \"active\" | \"frozen\") => Promise<void>;\n readonly activate: () => Promise<void>;\n readonly frameBarrier: (ticket: Ticket) => Promise<void>;\n readonly closed: () => boolean;\n readonly detach: () => Promise<void>;\n}\n\nconst fail = (\n reason: BrowserError[\"reason\"],\n outcome: \"undispatched\" | \"unknown\" = \"undispatched\",\n) => BrowserError.make({ operation: \"page-control\", reason, outcome });\n\n/** Owned by one native page/connection. Cleanup never resumes or rolls back a hold. */\nexport class PageExecution {\n private phase: PageExecutionState[\"state\"] = \"running\";\n private revision = 0;\n private receipt: PageSuspension | undefined;\n private priorRate: number | undefined;\n private disposed = false;\n readonly pageId: string;\n readonly targetId: string;\n private readonly port: PageExecutionNative;\n private readonly freshId: () => string;\n constructor(\n pageId: string,\n targetId: string,\n /** Each hold's receipt id, unique on this connection and never reissued by a later one. */\n freshId: () => string,\n port: PageExecutionNative,\n ) {\n this.pageId = pageId;\n this.targetId = targetId;\n this.port = port;\n this.freshId = freshId;\n }\n state(): PageExecutionState {\n if (this.disposed || this.port.closed()) throw fail(Reasons.Closed.make({}));\n\n return PageExecutionState.make({\n pageId: this.pageId,\n targetId: this.targetId,\n state: this.phase,\n ...(this.receipt === undefined ? {} : { suspensionId: this.receipt.suspensionId }),\n });\n }\n assertRunning(): void {\n if (this.disposed || this.port.closed()) throw fail(Reasons.Closed.make({}));\n if (this.phase !== \"running\") throw fail(Reasons.Busy.make({}));\n }\n invalidate(): boolean {\n const held = this.phase !== \"running\";\n\n this.revision++;\n this.receipt = undefined;\n if (held) this.phase = \"unknown\";\n\n return held;\n }\n private check(ticket: Ticket, revision: number): void {\n ticket.check();\n const outcome = ticket.dispatched ? \"unknown\" : \"undispatched\";\n\n if (this.disposed || this.port.closed()) throw fail(Reasons.Closed.make({}), outcome);\n if (this.revision !== revision) throw fail(Reasons.Stale.make({}), outcome);\n }\n private async write(\n ticket: Ticket,\n revision: number,\n command: () => Promise<void>,\n ): Promise<void> {\n this.check(ticket, revision);\n ticket.dispatch();\n await command();\n this.check(ticket, revision);\n }\n async suspend(ticket: Ticket): Promise<PageSuspension> {\n this.assertRunning();\n const revision = this.revision;\n\n this.check(ticket, revision);\n const rate = await this.port.readRate();\n\n this.check(ticket, revision);\n if (!Number.isFinite(rate)) throw fail(Reasons.Malformed.make({}));\n this.phase = \"unknown\";\n this.priorRate = rate;\n await this.write(ticket, revision, () => this.port.rate(0));\n await this.write(ticket, revision, () => this.port.focus(false));\n await this.write(ticket, revision, () => this.port.lifecycle(\"frozen\"));\n\n const receipt = Object.freeze(\n PageSuspension.make({\n pageId: this.pageId,\n targetId: this.targetId,\n suspensionId: this.freshId(),\n }),\n );\n\n this.check(ticket, revision);\n this.receipt = receipt;\n this.phase = \"suspended\";\n ticket.acknowledge?.();\n\n return receipt;\n }\n async resume(receipt: PageSuspension, ticket: Ticket): Promise<void> {\n this.check(ticket, this.revision);\n if (\n this.phase !== \"suspended\" ||\n this.receipt === undefined ||\n receipt.pageId !== this.pageId ||\n receipt.targetId !== this.targetId ||\n receipt.suspensionId !== this.receipt.suspensionId ||\n this.priorRate === undefined\n )\n throw fail(Reasons.Stale.make({}));\n const revision = this.revision;\n const rate = this.priorRate;\n\n this.receipt = undefined;\n this.phase = \"unknown\";\n await this.write(ticket, revision, () => this.port.lifecycle(\"active\"));\n await this.write(ticket, revision, () => this.port.activate());\n await this.write(ticket, revision, () => this.port.focus(true));\n // Blink anchors SetPlaybackRate to the last animation-frame clock. Settle one real frame at zero.\n await this.write(ticket, revision, () => this.port.frameBarrier(ticket));\n await this.write(ticket, revision, () => this.port.rate(rate));\n this.priorRate = undefined;\n this.phase = \"running\";\n ticket.acknowledge?.();\n }\n async dispose(): Promise<void> {\n if (this.disposed) return;\n this.disposed = true;\n this.phase = \"unknown\";\n this.receipt = undefined;\n this.revision++;\n await this.port.detach();\n }\n}\n","import { Schema } from \"effect\";\nimport type { Browser, BrowserContext, Frame } from \"playwright-core\";\n\nimport { Identifier, type PageInfo, type PageSuspension } from \"../../BrowserData.ts\";\nimport { Reasons } from \"../../Errors.ts\";\nimport type { CallbackTasks } from \"./CallbackTasks.ts\";\nimport type { Driver, DriverEvents, DriverOptions } from \"./Driver.ts\";\nimport { closeWithin, failure, safeDecode, sanitize } from \"./NativeCalls.ts\";\nimport type { Ticket } from \"./Owner.ts\";\nimport { PageExecution } from \"./PageExecution.ts\";\nimport type { Entry, Targets } from \"./Targets.ts\";\n\n/**\n * One native page execution per registered page, created once over its own CDP session. Its\n * receipt is invalidated when the page closes or its main frame navigates, and holds and\n * resumes act only on the exact page and target they name.\n */\nexport const makePageControl = (\n browser: Browser,\n context: BrowserContext,\n options: DriverOptions,\n /** Suspension ids from an earlier connection never match a hold on this one. */\n connectionNamespace: string,\n targets: Targets,\n callbacks: CallbackTasks,\n events: DriverEvents,\n closing: () => boolean,\n /** A hold or a resume is about to be dispatched to this page. */\n held: (pageId: string) => void,\n) => {\n const { current, entries } = targets;\n let suspensions = 0;\n\n const suspensionId = () => `suspension-${connectionNamespace}-${++suspensions}`;\n\n const execution = (entry: Entry): Promise<PageExecution> => {\n if (!options.pageControl)\n return Promise.reject(failure(Reasons.Unsupported.make({}), \"undispatched\"));\n entry.execution ??= sanitize(async () => {\n const cdp = await context.newCDPSession(entry.page);\n\n try {\n const targetId = await targets.targetId(entry);\n\n if (closing() || entry.page.isClosed()) throw failure(Reasons.Closed.make({}));\n await cdp.send(\"Emulation.setFocusEmulationEnabled\", { enabled: true });\n if (closing() || entry.page.isClosed()) throw failure(Reasons.Closed.make({}));\n\n const control = new PageExecution(entry.id, targetId, suspensionId, {\n readRate: async () =>\n safeDecode(\n Schema.Struct({ playbackRate: Schema.Finite }),\n await cdp.send(\"Animation.getPlaybackRate\"),\n ).playbackRate,\n rate: async (playbackRate) => {\n await cdp.send(\"Animation.setPlaybackRate\", { playbackRate });\n },\n focus: async (enabled) => {\n await cdp.send(\"Emulation.setFocusEmulationEnabled\", { enabled });\n },\n lifecycle: async (state) => {\n await cdp.send(\"Page.setWebLifecycleState\", { state });\n },\n activate: async () => {\n await cdp.send(\"Page.bringToFront\");\n },\n closed: () => closing() || !browser.isConnected() || entry.page.isClosed(),\n detach: async () => {\n if (entry.page.isClosed() || !browser.isConnected()) return;\n try {\n await closeWithin(() => cdp.detach());\n } catch (error) {\n if (!entry.page.isClosed() && browser.isConnected()) throw error;\n }\n },\n frameBarrier: async (ticket) => {\n ticket.check();\n\n const tree = safeDecode(\n Schema.Struct({\n frameTree: Schema.Struct({ frame: Schema.Struct({ id: Identifier }) }),\n }),\n await cdp.send(\"Page.getFrameTree\"),\n );\n\n ticket.check();\n\n const world = await cdp.send(\"Page.createIsolatedWorld\", {\n frameId: tree.frameTree.frame.id,\n worldName: \"effect-browser-page-control\",\n });\n\n ticket.check();\n\n const result = await cdp.send(\"Runtime.evaluate\", {\n expression: \"new Promise(resolve => requestAnimationFrame(() => resolve(true)))\",\n contextId: safeDecode(\n Schema.Int.check(Schema.isGreaterThan(0)),\n world.executionContextId,\n ),\n awaitPromise: true,\n returnByValue: true,\n userGesture: false,\n timeout: Math.min(2000, ticket.remainingMillis()),\n });\n\n ticket.check();\n if (result.exceptionDetails !== undefined || result.result.value !== true)\n throw failure(Reasons.Malformed.make({}));\n },\n });\n\n entry.executionValue = control;\n\n return control;\n } catch (error) {\n await closeWithin(() => cdp.detach()).catch(() => {});\n throw error;\n }\n });\n\n return entry.execution;\n };\n\n const explicit = async (\n target: { readonly pageId: string; readonly targetId: string },\n ticket: Ticket,\n ) => {\n ticket.check();\n const entry = entries.get(target.pageId);\n\n if (entry === undefined || entry.page.isClosed())\n throw failure(Reasons.Closed.make({}), \"undispatched\");\n const control = await execution(entry);\n\n ticket.check();\n if (control.targetId !== target.targetId) throw failure(Reasons.Stale.make({}), \"undispatched\");\n\n return control;\n };\n\n /** A closed page's execution is invalidated at once and disposed outside the event. */\n const closed = (entry: Entry) => {\n entry.executionValue?.invalidate();\n if (entry.execution !== undefined)\n callbacks.submit(async () => {\n await (await entry.execution)?.dispose();\n });\n };\n\n /** A held main-frame navigation invalidates its receipt and contains its exact page. */\n const navigating = (entry: Entry, frame: Frame) => {\n if (frame === entry.page.mainFrame() && entry.executionValue?.invalidate())\n events.pageFault?.(entry.id);\n };\n\n const operations: NonNullable<Driver[\"pageControl\"]> = {\n state: (page: PageInfo, ticket: Ticket) =>\n sanitize(async () => (await explicit(page, ticket)).state()),\n // Announced before the dispatch, so an unknown outcome still leaves nothing unchecked.\n suspend: (page: PageInfo, ticket: Ticket) =>\n sanitize(async () => {\n const control = await explicit(page, ticket);\n\n held(control.pageId);\n\n return control.suspend(ticket);\n }),\n resume: (receipt: PageSuspension, ticket: Ticket) =>\n sanitize(async () => {\n const control = await explicit(receipt, ticket);\n\n held(control.pageId);\n\n return control.resume(receipt, ticket);\n }),\n checkTarget: (target, ticket: Ticket) =>\n sanitize(async () => {\n ticket.check();\n const control = await execution(current(target).entry);\n\n ticket.check();\n control.assertRunning();\n }),\n };\n\n const dispose = () =>\n Promise.allSettled(\n [...entries.values()].map(async (entry) => {\n if (entry.execution !== undefined) await (await entry.execution).dispose();\n }),\n );\n\n return { execution, closed, navigating, operations, dispose };\n};\n","import type { DriverEvents, DriverFault } from \"./Driver.ts\";\n\ntype PolicyReason = Extract<DriverFault, { readonly source: \"policy\" }>[\"reason\"];\n\nexport type CleanupDisposition = \"confirmed\" | \"not-dispatched\" | \"unknown\";\n\ninterface CleanupOptions {\n /** Absent for an ordinary policy close or dismissal within the configured bounds. */\n readonly overflow?: PolicyReason;\n /** A modeled dismissal checks its ticket immediately before the native dispatch. */\n readonly dispatch?: () => void;\n /** Delivers one bounded result, including to the captured before-unload navigation. */\n readonly settled?: (disposition: CleanupDisposition) => void;\n}\n\n/**\n * One connection's policy closes and dismissals. The timer bounds observation, never native\n * capacity: a late native promise still owns its slot. Exact objects share their first result,\n * including an uncertain result, so neither another event nor shutdown resends that command.\n */\nexport class PolicyCleanup {\n private readonly pending = new Set<Promise<void>>();\n private readonly results = new WeakMap<object, Promise<CleanupDisposition>>();\n private readonly timers = new Set<ReturnType<typeof setTimeout>>();\n private readonly retirements = new Set<() => void>();\n private readonly refused = {};\n private stopped = false;\n private connectionRetired = false;\n\n private readonly events: Pick<DriverEvents, \"fault\">;\n\n constructor(events: Pick<DriverEvents, \"fault\">) {\n this.events = events;\n }\n\n run(\n subject: object,\n action: () => Promise<unknown>,\n options: CleanupOptions = {},\n ): Promise<CleanupDisposition> {\n const existing = this.results.get(subject);\n\n if (existing !== undefined) return existing;\n let resolve: (disposition: CleanupDisposition) => void = () => {};\n let completed = false;\n\n const result = new Promise<CleanupDisposition>((done) => {\n resolve = done;\n });\n\n this.results.set(subject, result);\n const token = {};\n\n const record = (\n disposition: CleanupDisposition | \"pending\" | \"dispatched\",\n identity: object = token,\n ) => {\n if (this.connectionRetired) return;\n if (options.overflow !== undefined)\n this.events.fault({\n source: \"policy\",\n reason: options.overflow,\n token: identity,\n disposition,\n });\n else if (disposition === \"unknown\" || disposition === \"not-dispatched\")\n this.events.fault({ source: \"native\", reason: \"callback\", disposition });\n };\n\n const finish = (disposition: CleanupDisposition) => {\n if (completed) return;\n completed = true;\n options.settled?.(disposition);\n resolve(disposition);\n };\n\n if (this.stopped || this.pending.size >= 32) {\n if (!this.stopped) record(\"not-dispatched\", this.refused);\n finish(\"not-dispatched\");\n\n return result;\n }\n let dispatched = false;\n const retire = () => finish(dispatched ? \"unknown\" : \"not-dispatched\");\n\n this.retirements.add(retire);\n\n const execution = async (): Promise<CleanupDisposition> => {\n if (this.stopped) {\n return \"not-dispatched\";\n }\n try {\n options.dispatch?.();\n } catch {\n return \"not-dispatched\";\n }\n dispatched = true;\n record(\"dispatched\");\n\n const timer = setTimeout(() => {\n this.timers.delete(timer);\n record(\"unknown\");\n finish(\"unknown\");\n }, 2000);\n\n this.timers.add(timer);\n try {\n await action();\n\n return \"confirmed\";\n } catch {\n return \"unknown\";\n } finally {\n clearTimeout(timer);\n this.timers.delete(timer);\n }\n };\n\n const task = Promise.resolve()\n .then(execution)\n .then((disposition) => {\n // Release capacity before waking a confirmed waiter that may submit the next cleanup.\n this.pending.delete(task);\n this.retirements.delete(retire);\n // A late acknowledgement is evidence, but cannot change the waiter's unknown result.\n if (!completed || disposition === \"confirmed\") record(disposition);\n finish(disposition);\n });\n\n this.pending.add(task);\n record(\"pending\");\n\n return result;\n }\n\n /** Stop admission before native disconnection; accepted promises remain observed. */\n stop(): void {\n this.stopped = true;\n }\n\n /** Only confirmed connection retirement may forget deadline observers of unresolved work. */\n retired(): void {\n this.stop();\n this.connectionRetired = true;\n for (const timer of this.timers) clearTimeout(timer);\n this.timers.clear();\n for (const retire of this.retirements) retire();\n this.retirements.clear();\n this.pending.clear();\n }\n\n async settle(): Promise<void> {\n await Promise.all(this.pending);\n }\n\n drained(): boolean {\n return this.pending.size === 0;\n }\n}\n","import { Schema } from \"effect\";\nimport type { Browser, BrowserContext, Dialog, Frame, Page } from \"playwright-core\";\n\nimport { FrameInfo, PageInfo, Identifier } from \"../../BrowserData.ts\";\nimport { Reasons } from \"../../Errors.ts\";\nimport type {\n DriverOptions,\n DriverTarget,\n NativeCachedPage,\n NativePageLifecycle,\n} from \"./Driver.ts\";\nimport { closeWithin, failure, safeDecode, sanitize } from \"./NativeCalls.ts\";\nimport type { ObservationScope, Ticket } from \"./Owner.ts\";\nimport type { PageExecution } from \"./PageExecution.ts\";\n\nconst TargetInfo = Schema.Struct({\n targetInfo: Schema.Struct({ targetId: Identifier, type: Schema.Literal(\"page\") }),\n});\n\nconst URLText = Schema.String.check(Schema.isMaxLength(8192));\n\nexport interface Entry {\n readonly id: string;\n readonly page: Page;\n targetId?: string;\n /** Undefined until read; null records an omitted oversized native title. */\n cachedTitle?: string | null;\n readonly off: Array<() => void>;\n execution?: Promise<PageExecution>;\n executionValue?: PageExecution;\n}\n\n/** The selected page and frame. Only the registry and the connection's own setup assign it. */\nexport interface Selection {\n entry?: Entry;\n frame?: Frame;\n}\n\n/**\n * What the other driver seams do when a registered page changes. The registry calls each at one\n * fixed point of its own event handling, so their order relative to its state never moves.\n */\nexport interface TargetHooks {\n readonly lifecycle?: (event: NativePageLifecycle) => void;\n /** A tracked page was registered; `created` while this driver is opening the page itself. */\n readonly opened: (entry: Entry, created: boolean) => void;\n /**\n * A page registered while this driver was opening one, which turned out to be another page:\n * a popup, say. It is now treated as any page from outside is.\n */\n readonly external: (entry: Entry) => void;\n /** An excess page is never admitted to this registry; its configured policy owns cleanup. */\n readonly overflow: (entry: Entry) => void;\n /** Before a closed page leaves the registry. */\n readonly closed: (entry: Entry) => void;\n /** Before a navigated frame's document epoch advances. */\n readonly navigating: (entry: Entry, frame: Frame) => void;\n /** After a navigated frame's document epoch advances. */\n readonly navigated: (entry: Entry, frame: Frame) => void;\n /** A URL changed inside the current document; no observation or document epoch is retired. */\n readonly sameDocumentNavigated: (entry: Entry, frame: Frame) => void;\n /** A frame navigated or detached, before any consequence for the selection. */\n readonly frameChanged: (entry: Entry, frame: Frame) => void;\n readonly dialog: (entry: Entry, dialog: Dialog) => void;\n /** Selection changes notify the owner without retiring another page's retained nodes. */\n readonly changed: (reason: \"target-changed\", scope: ObservationScope) => void;\n}\n\n/**\n * Where the pages this driver opens come from. Chromium paints only the front tab of a window,\n * so a screenshot of a tab behind it waits seconds for a compositor frame, or never gets one. A\n * page in a window of its own is painted whether or not another page is in front.\n */\nexport interface Windows {\n /**\n * Asks the browser for a blank page in a new window, and returns its target id with the sizing\n * of that window still in flight. Undefined when the browser refused the window, which means it\n * created nothing: a tab is then the only page it offers.\n */\n readonly open: () => Promise<OpenedWindow | undefined>;\n}\n\nexport interface OpenedWindow {\n readonly targetId: string;\n readonly sized: Promise<void>;\n /** Closes the window's page by its target id, for a page this driver never adopted. */\n readonly discard: () => Promise<void>;\n}\n\ninterface ClientFrameNavigation {\n readonly newDocument?: unknown;\n readonly error?: unknown;\n}\n\ninterface ClientFrame {\n readonly _eventEmitter: {\n readonly on: (event: \"navigated\", listener: (event: ClientFrameNavigation) => void) => void;\n readonly off: (event: \"navigated\", listener: (event: ClientFrameNavigation) => void) => void;\n };\n}\n\n/**\n * Playwright 1.63.0's client Frame emits this synchronous private event before the public Page\n * `framenavigated` event. Its `newDocument` field distinguishes document commits from URL-only\n * changes. A missing emitter is an unsupported runtime, never a reason to guess from the URL.\n */\nconst clientNavigationEmitter = (frame: Frame): ClientFrame[\"_eventEmitter\"] => {\n // oxlint-disable-next-line typescript/no-unsafe-type-assertion -- accesses the exact pinned client seam described above\n const emitter = (frame as unknown as ClientFrame)._eventEmitter;\n\n if (typeof emitter?.on !== \"function\" || typeof emitter.off !== \"function\")\n throw new Error(\"Playwright 1.63.0 client Frame navigation event is unavailable\");\n\n return emitter;\n};\n\n/**\n * The connection's pages, frames and document epochs, and the one selected target every other\n * seam acts on. A page beyond the configured bound is handed to policy recovery, never tracked.\n */\nexport const makeTargets = (\n browser: Browser,\n context: BrowserContext,\n options: DriverOptions,\n /**\n * FrameInfo is connection-local public metadata. A new driver after reconnect must never\n * regenerate an old frame id for a different frame, even when serial order happens to match.\n */\n connectionNamespace: string,\n closing: () => boolean,\n hooks: TargetHooks,\n windows: Windows,\n) => {\n const entries = new Map<string, Entry>();\n const byPage = new WeakMap<Page, Entry>();\n const frameIds = new WeakMap<Frame, string>();\n // A frame object outlives its documents, so readiness is keyed by frame *and* epoch.\n const documentEpochs = new WeakMap<Frame, number>();\n const selection: Selection = {};\n // Pages whose navigation this driver began and has not seen settle.\n const navigating = new Set<string>();\n\n let serial = 0,\n frameSerial = 0;\n\n let creatingPage = false;\n // Told of every page registered while this driver opens one, since the event brings it here.\n const arrivals = new Set<(entry: Entry) => void>();\n\n const epochOf = (frame: Frame): number => documentEpochs.get(frame) ?? 0;\n\n const frameId = (frame: Frame): string => {\n let id = frameIds.get(frame);\n\n if (id === undefined) {\n id = `frame-${connectionNamespace}-${++frameSerial}`;\n frameIds.set(frame, id);\n }\n\n return id;\n };\n\n const cachedPage = (entry: Entry): NativeCachedPage => {\n const frame = entry.page.mainFrame();\n const url = frame.url();\n let displayState: NativeCachedPage[\"displayState\"] = \"unknown\";\n\n try {\n displayState = entry.executionValue?.state().state ?? \"unknown\";\n } catch {\n // Native retirement can precede the registry close listener; no native read repairs it.\n }\n\n return Object.freeze({\n pageId: entry.id,\n frameId: frameId(frame),\n targetId: entry.targetId ?? null,\n documentEpoch: epochOf(frame),\n url: url.length <= 8192 ? url : null,\n urlQualification: url.length <= 8192 ? \"NativeCached\" : \"Omitted\",\n title: entry.cachedTitle ?? null,\n titleQualification:\n entry.cachedTitle === undefined\n ? \"Unread\"\n : entry.cachedTitle === null\n ? \"Omitted\"\n : \"ObservedCached\",\n selected: selection.entry === entry,\n displayState,\n });\n };\n\n const notify = (entry: Entry, kind: \"Opened\" | \"Metadata\" | \"Display\") => {\n if (entries.get(entry.id) === entry) hooks.lifecycle?.({ _tag: kind, page: cachedPage(entry) });\n };\n\n const navigated = (entry: Entry, frame: Frame, sameDocument: boolean) => {\n const url = frame.url();\n\n hooks.lifecycle?.({\n _tag: \"Navigated\",\n page: cachedPage(entry),\n frameId: frameId(frame),\n documentEpoch: epochOf(frame),\n sameDocument,\n url: url.length <= 8192 ? url : null,\n urlQualification: url.length <= 8192 ? \"NativeCached\" : \"Omitted\",\n });\n };\n\n const retire = (entry: Entry): void => {\n if (entries.get(entry.id) !== entry) return;\n hooks.closed(entry);\n entries.delete(entry.id);\n navigating.delete(entry.id);\n for (const off of entry.off.splice(0)) off();\n if (selection.entry !== entry) return;\n selection.entry = undefined;\n selection.frame = undefined;\n for (const candidate of entries.values()) {\n const frame = candidate.page.mainFrame();\n\n if (candidate.page.isClosed() || frame.isDetached()) continue;\n try {\n candidate.executionValue?.assertRunning();\n } catch {\n continue;\n }\n selection.entry = candidate;\n selection.frame = frame;\n break;\n }\n hooks.changed(\"target-changed\", { pageId: entry.id });\n if (selection.entry !== undefined) notify(selection.entry, \"Display\");\n };\n\n const register = (page: Page): Entry => {\n const existing = byPage.get(page);\n\n if (existing !== undefined) return existing;\n const entry: Entry = { id: `page-${connectionNamespace}-${++serial}`, page, off: [] };\n\n byPage.set(page, entry);\n for (const arrived of arrivals) arrived(entry);\n if (entries.size >= options.maxPages) {\n hooks.overflow(entry);\n\n return entry;\n }\n entries.set(entry.id, entry);\n const sameDocumentNavigations = new WeakSet<Frame>();\n const frameNavigationOff = new WeakMap<Frame, () => void>();\n\n const watchFrameNavigation = (frame: Frame): void => {\n if (frameNavigationOff.has(frame)) return;\n const emitter = clientNavigationEmitter(frame);\n\n const onNavigated = (event: ClientFrameNavigation) => {\n if (event.error !== undefined || event.newDocument !== undefined) return;\n sameDocumentNavigations.add(frame);\n navigated(entry, frame, true);\n hooks.sameDocumentNavigated(entry, frame);\n };\n\n emitter.on(\"navigated\", onNavigated);\n const off = () => emitter.off(\"navigated\", onNavigated);\n\n frameNavigationOff.set(frame, off);\n entry.off.push(off);\n };\n\n for (const frame of page.frames()) {\n frameId(frame);\n watchFrameNavigation(frame);\n }\n\n const onClose = () => {\n retire(entry);\n };\n\n const onNavigation = (frame: Frame) => {\n // The private client event above runs synchronously before this public event.\n if (sameDocumentNavigations.delete(frame)) return;\n hooks.navigating(entry, frame);\n documentEpochs.set(frame, epochOf(frame) + 1);\n if (frame === page.mainFrame()) entry.cachedTitle = undefined;\n hooks.navigated(entry, frame);\n navigated(entry, frame, false);\n frameId(frame);\n hooks.frameChanged(entry, frame);\n if (selection.entry === entry && (selection.frame === frame || frame === page.mainFrame()))\n hooks.changed(\"target-changed\", { pageId: entry.id });\n };\n\n const onDetached = (frame: Frame) => {\n const off = frameNavigationOff.get(frame);\n\n off?.();\n const cleanupIndex = off === undefined ? -1 : entry.off.indexOf(off);\n\n if (cleanupIndex !== -1) entry.off.splice(cleanupIndex, 1);\n frameNavigationOff.delete(frame);\n hooks.frameChanged(entry, frame);\n if (selection.frame === frame) {\n selection.frame = undefined;\n hooks.changed(\"target-changed\", { pageId: entry.id });\n }\n };\n\n const onDialog = (dialog: Dialog) => {\n hooks.dialog(entry, dialog);\n };\n\n const onFrameAttached = (frame: Frame) => {\n frameId(frame);\n watchFrameNavigation(frame);\n };\n\n page.on(\"close\", onClose);\n page.on(\"frameattached\", onFrameAttached);\n page.on(\"framenavigated\", onNavigation);\n page.on(\"framedetached\", onDetached);\n page.on(\"dialog\", onDialog);\n entry.off.push(\n () => page.off(\"close\", onClose),\n () => page.off(\"frameattached\", onFrameAttached),\n () => page.off(\"framenavigated\", onNavigation),\n () => page.off(\"framedetached\", onDetached),\n () => page.off(\"dialog\", onDialog),\n );\n hooks.opened(entry, creatingPage);\n notify(entry, \"Opened\");\n\n return entry;\n };\n\n /** Bootstrap callbacks may name only an exact page still owned by this registry. */\n const pageIdOf = (page: Page): string | undefined => {\n const entry = byPage.get(page);\n\n return entry !== undefined && entries.get(entry.id) === entry && !page.isClosed()\n ? entry.id\n : undefined;\n };\n\n const selectedCurrent = () => {\n if (\n closing() ||\n !browser.isConnected() ||\n selection.entry === undefined ||\n selection.entry.page.isClosed() ||\n selection.frame === undefined ||\n selection.frame.isDetached()\n )\n throw failure(Reasons.Closed.make({}), \"undispatched\");\n\n return { entry: selection.entry, frame: selection.frame };\n };\n\n const explicitCurrent = (target: DriverTarget) => {\n if (closing() || !browser.isConnected()) throw failure(Reasons.Closed.make({}), \"undispatched\");\n const entry = entries.get(target.pageId);\n\n if (entry === undefined || entry.page.isClosed())\n throw failure(Reasons.Stale.make({}), \"undispatched\");\n const frame = entry.page.frames().find((candidate) => frameId(candidate) === target.frameId);\n\n if (frame === undefined || frame.isDetached())\n throw failure(Reasons.Stale.make({}), \"undispatched\");\n\n return { entry, frame };\n };\n\n /** The exact live page and frame a target names; display selection never stands in for it. */\n const current = (target: DriverTarget) => explicitCurrent(target);\n\n const targetId = async (entry: Entry, ticket?: Ticket): Promise<string> => {\n ticket?.check();\n if (entry.targetId !== undefined) return entry.targetId;\n const cdp = await context.newCDPSession(entry.page);\n\n try {\n ticket?.check();\n const info: unknown = await cdp.send(\"Target.getTargetInfo\");\n\n ticket?.check();\n entry.targetId = safeDecode(TargetInfo, info).targetInfo.targetId;\n notify(entry, \"Metadata\");\n\n return entry.targetId;\n } finally {\n await closeWithin(() => cdp.detach()).catch(() => {});\n }\n };\n\n const urlOf = (frame: Frame) => safeDecode(URLText, frame.url());\n\n /**\n * Opens one page: in a window of its own when the browser opens one, else as a tab. The window's\n * page arrives through the context's page event like any other, and its target id tells it\n * apart from a popup arriving at the same time. It is registered, and sized, when this returns.\n */\n const open = async (signal: AbortSignal): Promise<Entry> => {\n const arrived: Entry[] = [];\n let wake = () => {};\n\n const arrival = (entry: Entry) => {\n arrived.push(entry);\n wake();\n };\n\n const next = () =>\n new Promise<void>((resolve, reject) => {\n const abort = () => reject(failure(Reasons.Interrupted.make({}), \"unknown\"));\n\n if (signal.aborted) {\n abort();\n\n return;\n }\n signal.addEventListener(\"abort\", abort, { once: true });\n wake = () => {\n signal.removeEventListener(\"abort\", abort);\n resolve();\n };\n });\n\n const adopt = async (created: string): Promise<Entry> => {\n for (let index = 0; ; index++) {\n while (arrived.length <= index) await next();\n const candidate = arrived[index];\n // A page whose id cannot be read, such as a popup already closing, is not this one.\n const id = candidate === undefined ? undefined : await targetId(candidate).catch(() => {});\n\n if (candidate !== undefined && id === created) return candidate;\n }\n };\n\n /** Every other page that arrived meanwhile is from outside, and its policy applies now. */\n const settle = (isOurs: (entry: Entry) => boolean) => {\n for (const entry of arrived)\n if (!isOurs(entry) && entries.get(entry.id) === entry) hooks.external(entry);\n };\n\n arrivals.add(arrival);\n try {\n const opened = await windows.open();\n\n if (opened === undefined) {\n const entry = register(await context.newPage());\n\n settle((candidate) => candidate === entry);\n\n return entry;\n }\n try {\n const [entry] = await Promise.all([adopt(opened.targetId), opened.sized]);\n\n settle((candidate) => candidate === entry);\n\n return entry;\n } catch (error) {\n // Whatever went wrong after the browser opened the window, that window is not kept.\n await closeWithin(opened.discard).catch(() => {});\n // Only a page known to be another one is let through; the window may be any unread one.\n settle(\n (candidate) => candidate.targetId === undefined || candidate.targetId === opened.targetId,\n );\n throw error;\n }\n } finally {\n arrivals.delete(arrival);\n }\n };\n\n const url = (target: DriverTarget) => urlOf(current(target).frame);\n\n /**\n * Chooses the connection's first target: a page it opens itself, the one the caller named, or\n * the only page present. Assignments land on the live selection as they happen.\n */\n const selectInitial = async (): Promise<void> => {\n if (options.newPage || entries.size === 0) {\n creatingPage = true;\n try {\n selection.entry = await open(AbortSignal.timeout(15000));\n } finally {\n creatingPage = false;\n }\n } else if (options.initialTargetId !== undefined) {\n for (const entry of entries.values())\n if ((await targetId(entry)) === options.initialTargetId) selection.entry = entry;\n if (selection.entry === undefined) throw failure(Reasons.NotFound.make({}));\n } else {\n if (entries.size !== 1) throw failure(Reasons.Ambiguous.make({}));\n selection.entry = entries.values().next().value;\n }\n };\n\n const clear = () => {\n entries.clear();\n selection.entry = undefined;\n selection.frame = undefined;\n };\n\n const selected = () => {\n const { entry, frame } = selectedCurrent();\n\n return { pageId: entry.id, frameId: frameId(frame) };\n };\n\n /** Detach records the selected page alone; none of its frames can make that fail. */\n const selectedTargetId = () =>\n sanitize(() => {\n const entry = selection.entry;\n\n if (closing() || !browser.isConnected() || entry === undefined || entry.page.isClosed())\n throw failure(Reasons.Closed.make({}), \"undispatched\");\n\n return targetId(entry);\n });\n\n /** Describe this exact entry, including when creation has already dispatched. */\n const pageInfo = async (entry: Entry, ticket: Ticket): Promise<PageInfo> => {\n const id = await targetId(entry, ticket);\n\n ticket.check();\n const title: unknown = await entry.page.title();\n\n ticket.check();\n if (entries.get(entry.id) !== entry || entry.page.isClosed())\n throw failure(Reasons.Stale.make({}), ticket.dispatched ? \"unknown\" : \"undispatched\");\n if (typeof title !== \"string\") throw failure(Reasons.Malformed.make({ path: \"page.title\" }));\n entry.cachedTitle = title.length <= 512 ? title : null;\n notify(entry, \"Metadata\");\n\n return safeDecode(PageInfo, {\n pageId: entry.id,\n targetId: id,\n title: title.slice(0, 512),\n url: entry.page.url(),\n selected: selection.entry === entry,\n });\n };\n\n /** Each page's title is its own round trip, so they are read together rather than in turn. */\n const listPages = (ticket: Ticket) =>\n sanitize(async () => {\n ticket.check();\n\n return Promise.all([...entries.values()].map((entry) => pageInfo(entry, ticket)));\n });\n\n const explicitPage = async (page: PageInfo, ticket: Ticket): Promise<Entry> => {\n ticket.check();\n const entry = entries.get(page.pageId);\n\n if (entry === undefined || entry.page.isClosed())\n throw failure(Reasons.NotFound.make({}), \"undispatched\");\n if ((await targetId(entry, ticket)) !== page.targetId)\n throw failure(Reasons.Stale.make({}), \"undispatched\");\n ticket.check();\n if (entries.get(entry.id) !== entry || entry.page.isClosed())\n throw failure(Reasons.Stale.make({}), \"undispatched\");\n\n return entry;\n };\n\n const describePage = (page: PageInfo, ticket: Ticket) =>\n sanitize(async () => pageInfo(await explicitPage(page, ticket), ticket));\n\n const resolvePage = (page: PageInfo, ticket: Ticket) =>\n sanitize(async () => {\n const entry = await explicitPage(page, ticket);\n\n return { pageId: entry.id, frameId: frameId(entry.page.mainFrame()) };\n });\n\n const selectPage = (page: PageInfo, ticket: Ticket) =>\n sanitize(async () => {\n const entry = await explicitPage(page, ticket);\n const previous = selection.entry;\n\n ticket.check();\n if (entries.get(entry.id) !== entry || entry.page.isClosed())\n throw failure(Reasons.Stale.make({}), \"undispatched\");\n selection.entry = entry;\n selection.frame = entry.page.mainFrame();\n hooks.changed(\"target-changed\", \"none\");\n if (previous !== undefined && previous !== entry) notify(previous, \"Display\");\n notify(entry, \"Display\");\n });\n\n const newPage = (ticket: Ticket) =>\n sanitize(async () => {\n if (entries.size >= options.maxPages)\n throw failure(\n Reasons.Limit.make({\n dimension: \"pages\",\n maximum: options.maxPages,\n observed: entries.size,\n }),\n \"undispatched\",\n );\n ticket.dispatch();\n creatingPage = true;\n let entry: Entry;\n\n try {\n entry = await open(ticket.signal);\n\n if (ticket.signal.aborted) {\n await closeWithin(() => entry.page.close()).catch(() => {});\n ticket.check();\n }\n } finally {\n creatingPage = false;\n }\n\n ticket.acknowledge?.();\n ticket.followUp?.();\n\n // Creation never selects or relists. A failed metadata read cannot repeat the creation.\n return pageInfo(entry, ticket);\n });\n\n const closePage = (page: PageInfo, ticket: Ticket, onDispatch?: () => void) =>\n sanitize(async () => {\n const entry = await explicitPage(page, ticket);\n\n ticket.dispatch();\n onDispatch?.();\n await entry.page.close({ runBeforeUnload: false });\n if (!entry.page.isClosed()) throw failure(Reasons.Failed.make({}), \"unknown\");\n ticket.acknowledge?.();\n ticket.followUp?.();\n retire(entry);\n ticket.check();\n });\n\n const containPage = async (pageId: string): Promise<void> => {\n const entry = entries.get(pageId);\n\n // A closed page has already left the registry.\n if (entry === undefined) return;\n await closeWithin(() => entry.page.close({ runBeforeUnload: false }));\n if (!entry.page.isClosed()) throw failure(Reasons.Failed.make({}));\n retire(entry);\n };\n\n const listFrames = (ticket: Ticket, page: PageInfo) =>\n sanitize(async () => {\n ticket.check();\n const entry = await explicitPage(page, ticket);\n const frames = entry.page.frames();\n\n if (frames.length > 128)\n throw failure(\n Reasons.Limit.make({ dimension: \"frames\", maximum: 128, observed: frames.length }),\n );\n\n return frames.map((frame) => {\n const parent = frame.parentFrame();\n\n return safeDecode(FrameInfo, {\n frameId: frameId(frame),\n parentFrameId: parent === null ? null : frameId(parent),\n url: frame.url(),\n name: frame.name().slice(0, 256),\n });\n });\n });\n\n const resolveFrame = (page: PageInfo, requested: FrameInfo, ticket: Ticket) =>\n sanitize(async () => {\n const entry = await explicitPage(page, ticket);\n\n const frame = entry.page\n .frames()\n .find((candidate) => frameId(candidate) === requested.frameId);\n\n if (frame === undefined || frame.isDetached())\n throw failure(Reasons.NotFound.make({}), \"undispatched\");\n ticket.check();\n\n return { pageId: entry.id, frameId: frameId(frame) };\n });\n\n return {\n entries: entries as ReadonlyMap<string, Entry>,\n cachedPages: () => Object.freeze([...entries.values()].map(cachedPage)),\n cachedPage,\n notifyDisplay: (entry: Entry) => notify(entry, \"Display\"),\n selection,\n epochOf,\n frameId,\n register,\n pageIdOf,\n current,\n targetId,\n urlOf,\n /** A navigation this driver began on the page is still in flight. */\n navigating: {\n begin: (pageId: string) => void navigating.add(pageId),\n end: (pageId: string) => void navigating.delete(pageId),\n has: (pageId: string) => navigating.has(pageId),\n },\n url,\n selectInitial,\n clear,\n selected,\n selectedTargetId,\n listPages,\n describePage,\n resolvePage,\n selectPage,\n newPage,\n closePage,\n containPage,\n listFrames,\n resolveFrame,\n };\n};\n\nexport type Targets = ReturnType<typeof makeTargets>;\n","import { Schema } from \"effect\";\nimport type { Browser, CDPSession, Dialog, Frame, Page } from \"playwright-core\";\n\nimport { Identifier } from \"../../BrowserData.ts\";\nimport { Reasons, BrowserError, InitializationError } from \"../../Errors.ts\";\nimport { makeActions } from \"./Actions.ts\";\nimport type { ConnectionIdentity } from \"./Binding.ts\";\nimport { CallbackTasks } from \"./CallbackTasks.ts\";\nimport { makeCaptureSources } from \"./CaptureSource.ts\";\nimport type { Driver, DriverEvents, DriverOptions } from \"./Driver.ts\";\nimport { makeInitialization } from \"./Initialization.ts\";\nimport {\n closeWithin,\n failure,\n NativeFailure,\n providerReason,\n safeDecode,\n sanitize,\n} from \"./NativeCalls.ts\";\nimport { makePageControl } from \"./NativePageControl.ts\";\nimport { makeObservation } from \"./Observation.ts\";\nimport { PolicyCleanup } from \"./PolicyCleanup.ts\";\nimport { type Entry, makeTargets } from \"./Targets.ts\";\n\nconst NativeWindow = Schema.Struct({ windowId: Schema.Natural });\n\nconst CreatedTarget = Schema.Struct({ targetId: Identifier });\n\n/**\n * Playwright 1.63.0 reports the browser's own error reply to a CDP command this way. A reply is\n * the browser's answer that it did not do what was asked; anything else leaves that unknown.\n */\nconst refusedBy = (method: string, error: unknown): boolean =>\n error instanceof Error &&\n error.message.includes(`Protocol error (${method})`) &&\n // Playwright's own rejection of a call still pending when its session closed.\n !error.message.includes(\"session closed\");\n\n/**\n * Connects to an already validated or host-resolved CDP endpoint and builds the one driver. The\n * import is lazy, so constructing any Layer cannot load Playwright or allocate a browser. A\n * trusted observer sees the engine's browser before the driver exists and never replaces it.\n */\nexport const connectPlaywrightEndpoint = async (\n endpoint: string,\n signal: AbortSignal,\n identity: ConnectionIdentity,\n options: DriverOptions,\n events: DriverEvents,\n observe?: (browser: Browser) => void,\n): Promise<Driver> => {\n if (signal.aborted) throw failure(Reasons.Interrupted.make({}));\n const { chromium } = await import(\"playwright-core\");\n\n const browser = await sanitize(() =>\n chromium.connectOverCDP(endpoint, {\n timeout: 15000,\n ...(options.pageControl ? { noDefaults: true } : {}),\n }),\n );\n\n if (signal.aborted) {\n await closeWithin(() => browser.close()).catch(() => {});\n throw failure(Reasons.Interrupted.make({}));\n }\n try {\n observe?.(browser);\n const driver = await makePlaywrightDriver(browser, identity, options, events);\n\n if (signal.aborted) {\n await driver.disconnect().catch(() => {});\n throw failure(Reasons.Interrupted.make({}));\n }\n\n return driver;\n } catch (error) {\n await closeWithin(() => browser.close()).catch(() => {});\n throw Schema.is(BrowserError)(error) ||\n Schema.is(InitializationError)(error) ||\n Schema.is(NativeFailure)(error)\n ? error\n : failure(providerReason(error));\n }\n};\n\n/** Tests may supply a real already-connected browser. This is deliberately not an exported subpath. */\nexport const makePlaywrightDriver = async (\n browser: Browser,\n identity: ConnectionIdentity,\n options: DriverOptions,\n events: DriverEvents,\n): Promise<Driver> => {\n // This constructor is reached only after native acquisition, including in driver tests.\n const { errors } = await import(\"playwright-core\");\n const contexts = browser.contexts();\n const [context] = contexts;\n\n if (contexts.length !== 1 || context === undefined) throw failure(Reasons.Ambiguous.make({}));\n\n const dialogs = new Map<\n Dialog,\n { readonly dismissed: (confirmed: boolean) => void } | undefined\n >();\n\n const callbacks = new CallbackTasks(32, (disposition) =>\n events.fault({ source: \"native\", reason: \"callback\", disposition }),\n );\n\n const policyCleanup = new PolicyCleanup(events);\n const blockedPopup = {};\n\n let closing = false;\n let initialized = false;\n let browserCdp: CDPSession | undefined;\n // Cleared the first time the browser refuses a window; the pages it opens are tabs from then on.\n let windows = true;\n let sameDocumentCapture: (entry: Entry, frame: Frame) => void = () => {};\n\n const targets = makeTargets(\n browser,\n context,\n options,\n identity.namespace,\n () => closing,\n {\n lifecycle: (event) => events.pageLifecycle?.(event),\n opened: (entry, created) => {\n if (initialized && !created && options.popupPolicy === \"close\") {\n void policyCleanup.run(entry.page, () => entry.page.close({ runBeforeUnload: false }));\n\n return;\n }\n if (initialized && options.pageControl)\n callbacks.submit(async () => {\n await pageControl.execution(entry);\n });\n if (initialized) initialization.attachPage(entry.page);\n if (initialized && !created && options.popupPolicy === \"pause\")\n events.pause(\"popup\", entry.id);\n },\n external: (entry) => {\n if (!initialized) return;\n if (options.popupPolicy === \"close\")\n void policyCleanup.run(entry.page, () => entry.page.close({ runBeforeUnload: false }));\n else if (options.popupPolicy === \"pause\") events.pause(\"popup\", entry.id);\n },\n overflow: (entry) => {\n if (options.popupPolicy === \"close\")\n void policyCleanup.run(entry.page, () => entry.page.close({ runBeforeUnload: false }), {\n overflow: \"popup-overflow\",\n });\n else\n events.fault({\n source: \"policy\",\n reason: \"popup-overflow\",\n token: blockedPopup,\n disposition: \"not-dispatched\",\n });\n },\n closed: (entry) => {\n actions.retireWaitPage(entry);\n keyboard.retirePage(entry.page);\n for (const [dialog, beforeUnload] of dialogs)\n if (dialog.page() === entry.page) {\n beforeUnload?.dismissed(false);\n dialogs.delete(dialog);\n }\n observation.retirePage(entry.id);\n pageControl.closed(entry);\n captures.forget(entry);\n events.pageClosed?.(entry.id, targets.cachedPage(entry));\n },\n navigating: (entry, frame) => pageControl.navigating(entry, frame),\n navigated: (entry, frame) => {\n if (initialized) initialization.attachFrame(frame, entry.page);\n },\n sameDocumentNavigated: (entry, frame) => sameDocumentCapture(entry, frame),\n frameChanged: (entry, frame) => {\n if (frame.isDetached()) events.frameClosed?.(entry.id, targets.frameId(frame));\n actions.waitChanged(entry, frame);\n // Only the frame an observation read can change what it names.\n observation.invalidate({ pageId: entry.id, frameId: targets.frameId(frame) });\n captures.invalidate(entry, \"target-changed\", frame);\n },\n dialog: (entry, dialog) => {\n // Capture the exact navigation now. A page lookup after acknowledgement could name its successor.\n const beforeUnload =\n dialog.type() === \"beforeunload\" ? actions.beforeUnload(entry.id) : undefined;\n\n const overflow = dialogs.size >= 8;\n\n if (options.dialogPolicy === \"dismiss\" || overflow)\n void policyCleanup.run(dialog, () => dialog.dismiss(), {\n ...(overflow ? { overflow: \"dialog-overflow\" } : {}),\n settled: (disposition) => beforeUnload?.dismissed(disposition === \"confirmed\"),\n });\n else {\n dialogs.set(dialog, beforeUnload);\n observation.invalidate({ pageId: entry.id });\n events.pause(\"dialog\", entry.id);\n }\n },\n changed: (reason, scope) => observation.changed(reason, scope),\n },\n {\n open: async () => {\n if (!windows) return undefined;\n const cdp = browserSession();\n let created: unknown;\n\n try {\n created = await cdp.send(\"Target.createTarget\", { url: \"about:blank\", newWindow: true });\n } catch (error) {\n if (!refusedBy(\"Target.createTarget\", error)) throw error;\n windows = false;\n\n return undefined;\n }\n const { targetId } = safeDecode(CreatedTarget, created);\n\n return {\n targetId,\n // The browser sizes a new window like the last one it showed, which may be a popup's, so\n // a fixed viewport is set on each. A preserved viewport is the provider's to size.\n sized: options.preserveViewport ? Promise.resolve() : sizeNativeWindow(targetId),\n discard: async () => {\n await cdp.send(\"Target.closeTarget\", { targetId });\n },\n };\n },\n },\n );\n\n const { current, entries, register } = targets;\n\n const initialization = makeInitialization(\n context,\n options,\n identity.bindings,\n targets,\n callbacks,\n events,\n () => closing,\n );\n\n const observation = makeObservation(\n targets,\n identity.namespace,\n events,\n options.observationLimits,\n );\n\n const actions = makeActions(\n context,\n targets,\n observation,\n (error) => error instanceof errors.TimeoutError,\n );\n\n const { pointer, keyboard } = actions;\n const captures = makeCaptureSources(targets);\n\n sameDocumentCapture = captures.sameDocumentNavigated;\n\n const pageControl = makePageControl(\n browser,\n context,\n options,\n identity.namespace,\n targets,\n callbacks,\n events,\n () => closing,\n (pageId) => observation.held(pageId),\n );\n\n const onPage = (page: Page) => {\n register(page);\n };\n\n const retired = () => {\n policyCleanup.retired();\n keyboard.retire();\n actions.retireWait();\n observation.retireConnection();\n events.retired?.();\n };\n\n const onDisconnected = () => {\n retired();\n if (!closing) {\n observation.invalidate();\n events.disconnected();\n }\n };\n\n context.on(\"page\", onPage);\n browser.on(\"disconnected\", onDisconnected);\n\n const browserSession = (): CDPSession => {\n if (browserCdp === undefined) throw failure(Reasons.Closed.make({}), \"undispatched\");\n\n return browserCdp;\n };\n\n const sizeNativeWindow = async (targetId: string): Promise<void> => {\n const cdp = browserSession();\n const current: unknown = await cdp.send(\"Browser.getWindowForTarget\", { targetId });\n const native = safeDecode(NativeWindow, current);\n\n await cdp.send(\"Browser.setContentsSize\", {\n windowId: native.windowId,\n width: options.viewport.width,\n height: options.viewport.height,\n });\n };\n\n const sizeNativeContents = async (entry: Entry): Promise<void> =>\n sizeNativeWindow(await targets.targetId(entry));\n\n const driver: Driver = {\n ...(options.pageControl\n ? {\n pageControl: {\n ...pageControl.operations,\n suspend: async (page, ticket) => {\n try {\n return await pageControl.operations.suspend(page, ticket);\n } finally {\n const entry = entries.get(page.pageId);\n\n if (entry !== undefined) targets.notifyDisplay(entry);\n }\n },\n resume: async (receipt, ticket) => {\n try {\n await pageControl.operations.resume(receipt, ticket);\n } finally {\n const entry = entries.get(receipt.pageId);\n\n if (entry !== undefined) targets.notifyDisplay(entry);\n }\n },\n },\n }\n : {}),\n selected: targets.selected,\n cachedPages: targets.cachedPages,\n selectedTargetId: targets.selectedTargetId,\n listPages: targets.listPages,\n describePage: targets.describePage,\n resolvePage: targets.resolvePage,\n selectPage: targets.selectPage,\n newPage: targets.newPage,\n closePage: targets.closePage,\n containPage: targets.containPage,\n listFrames: targets.listFrames,\n resolveFrame: targets.resolveFrame,\n beginNavigation: actions.beginNavigation,\n readText: observation.readText,\n observe: observation.observe,\n checkpoint: observation.checkpoint,\n controlFacts: observation.controlFacts,\n revalidate: observation.revalidate,\n resolveDescriptor: (descriptor, ticket, target, guard) =>\n observation.resolveDescriptor(descriptor, ticket, target, guard ?? { _tag: \"Strict\" }),\n resolveGroup: observation.resolveGroup,\n expectations: observation.expectations,\n settled: actions.settled,\n scrollTo: actions.scrollTo,\n click: actions.click,\n fill: actions.fill,\n formStep: actions.formStep,\n formState: observation.formState,\n formSubmit: actions.formSubmit,\n selectOption: actions.selectOption,\n scroll: actions.scroll,\n pointerMove: pointer.pointerMove,\n hover: pointer.hover,\n wheel: pointer.wheel,\n press: keyboard.press,\n type: keyboard.type,\n screenshot: observation.screenshot,\n resize: (viewport, ticket, target) =>\n sanitize(async () => {\n const { entry } = current(target);\n const { page } = entry;\n\n ticket.dispatch();\n captures.invalidate(entry, \"resized\");\n observation.changed(\"resized\", { pageId: entry.id });\n await page.setViewportSize(viewport);\n ticket.acknowledge?.();\n ticket.check();\n }),\n waitFor: actions.waitFor,\n waitForElement: actions.waitForElement,\n clickAndWait: actions.clickAndWait,\n clickForDownload: actions.clickForDownload,\n selectFiles: actions.selectFiles,\n clickForFileSelection: actions.clickForFileSelection,\n documentReadiness: initialization.documentReadiness,\n dismissDialogs: (ticket) =>\n sanitize(async () => {\n for (const [dialog, beforeUnload] of dialogs) {\n const disposition = await policyCleanup.run(dialog, () => dialog.dismiss(), {\n dispatch: () => ticket.dispatch(),\n settled: (disposition) => beforeUnload?.dismissed(disposition === \"confirmed\"),\n });\n\n if (disposition === \"confirmed\") {\n ticket.acknowledge?.();\n ticket.followUp?.();\n }\n ticket.check();\n if (disposition !== \"confirmed\")\n throw failure(\n disposition === \"not-dispatched\" ? Reasons.Busy.make({}) : Reasons.Provider.make({}),\n disposition === \"not-dispatched\" ? \"undispatched\" : \"unknown\",\n );\n dialogs.delete(dialog);\n }\n }),\n capture: captures.capture,\n invalidateObservation: observation.invalidate,\n fenceInitialization: initialization.fence,\n fenceInitializationPage: initialization.fencePage,\n restoreInitializationPage: initialization.restorePage,\n handoffDrained: (quarantined) =>\n initialization.drained(quarantined) &&\n callbacks.drained() &&\n policyCleanup.drained() &&\n observation.drained(quarantined) &&\n keyboard.drained((page) => {\n const pageId = targets.pageIdOf(page);\n\n return pageId !== undefined && quarantined(pageId);\n }),\n retireInitializationPage: initialization.retirePage,\n disposeInitialization: initialization.dispose,\n disconnect: () =>\n sanitize(async () => {\n closing = true;\n initialization.fence();\n callbacks.stop();\n observation.invalidate();\n context.off(\"page\", onPage);\n // Explicit cleanup owns its close result. Preserve the established ordering by removing\n // the ordinary disconnect listener first; positive retirement is recorded only after the\n // close below actually settles. Natural disconnects still retire through onDisconnected.\n browser.off(\"disconnected\", onDisconnected);\n for (const entry of entries.values()) for (const off of entry.off.splice(0)) off();\n // Retained dialogs share their one dismissal with explicit resume. A timed-out dismissal\n // stays in the pool and is never sent a second time by connection cleanup.\n for (const [dialog, beforeUnload] of dialogs)\n void policyCleanup.run(dialog, () => dialog.dismiss(), {\n settled: (disposition) => beforeUnload?.dismissed(disposition === \"confirmed\"),\n });\n captures.clear();\n await closeWithin(initialization.dispose).catch(() => {});\n await observation.dispose().catch(() => {});\n await closeWithin(() => policyCleanup.settle()).catch(() => {});\n policyCleanup.stop();\n dialogs.clear();\n await closeWithin(() => callbacks.settle()).catch(() => {});\n await closeWithin(() => pageControl.dispose()).catch(() => {});\n await closeWithin(() => browserCdp?.detach() ?? Promise.resolve()).catch(() => {});\n await closeWithin(() => browser.close());\n retired();\n targets.clear();\n }),\n };\n\n try {\n for (const page of context.pages()) register(page);\n browserCdp = await browser.newBrowserCDPSession();\n await browserCdp.send(\"Browser.setDownloadBehavior\", {\n behavior: \"allow\",\n downloadPath: \"downloads\",\n eventsEnabled: true,\n });\n // Registrations precede the first document this connection creates, and precede any\n // navigation the caller makes, without this setup navigating anything itself.\n await initialization.install();\n for (const entry of entries.values()) await initialization.attach(entry.page);\n await targets.selectInitial();\n const { selection } = targets;\n\n if (selection.entry === undefined) throw failure(Reasons.NotFound.make({}));\n await initialization.attach(selection.entry.page);\n selection.frame = selection.entry.page.mainFrame();\n if (!options.preserveViewport) {\n await sizeNativeContents(selection.entry);\n await selection.entry.page.setViewportSize(options.viewport);\n }\n await targets.targetId(selection.entry);\n if (options.pageControl)\n for (const entry of entries.values()) await pageControl.execution(entry);\n initialized = true;\n for (const entry of entries.values()) targets.notifyDisplay(entry);\n\n return driver;\n } catch (error) {\n await driver.disconnect().catch(() => {});\n throw error;\n }\n};\n","import { Crypto, Effect, type Option, Redacted, Schema, Scope } from \"effect\";\n\nimport * as Bootstrap from \"./Bootstrap.ts\";\nimport type { BrowserSession, OpenOptions, OperationOptions, Page } from \"./Browser.ts\";\nimport {\n ActionResult,\n AutomationOptions,\n BrowserPolicy,\n ClickRequest,\n Identifier,\n type Inventory,\n InlineFiles,\n type InlineFile,\n SafeFilename,\n Selector,\n Viewport,\n} from \"./BrowserData.ts\";\nimport {\n BrowserError,\n Reasons,\n type BrowserOperation,\n type InitializationError,\n} from \"./Errors.ts\";\nimport { bindingImplementation, issueBinding } from \"./internal/browser/Binding.ts\";\nimport { makeBindings, preparePlan } from \"./internal/browser/Bindings.ts\";\nimport { compileBootstrap } from \"./internal/browser/Bootstrap.ts\";\nimport type { ConnectionCleanup } from \"./internal/browser/ConnectionCleanup.ts\";\nimport type { DriverOptions, NativeFileSelection } from \"./internal/browser/Driver.ts\";\nimport { fromNativeAttempt } from \"./internal/browser/NativeAttempt.ts\";\nimport { resolvePageControlsForSession } from \"./internal/browser/PageRegistry.ts\";\nimport { connectPlaywrightEndpoint } from \"./internal/browser/Playwright.ts\";\nimport {\n checked,\n checkedOperationOptions,\n decoded,\n makeSession,\n} from \"./internal/browser/PublicSession.ts\";\nimport { acquireSession, type PageControls } from \"./internal/browser/Session.ts\";\nimport * as Trace from \"./internal/Trace.ts\";\nimport { TimelineDefaults } from \"./TimelineData.ts\";\n\nexport {\n cleanupStep,\n noConnection,\n reported,\n type CleanupStep,\n type ConnectionCleanup,\n type ConnectionState,\n} from \"./internal/browser/ConnectionCleanup.ts\";\n\n/** Opaque engine configuration. Only this constructor's issued values can acquire a runtime. */\nexport interface BrowserBinding {\n readonly _tag: \"BrowserBinding\";\n}\n\nexport interface PlaywrightOptions {\n /** A trusted integration validates its own endpoint authority before routing the connection. */\n readonly resolveEndpoint?: (connection: {\n readonly url: Redacted.Redacted<string>;\n }) => Effect.Effect<string, BrowserError>;\n /** Trusted instrumentation of the existing native connection, before the owner starts using it. */\n readonly onConnected?: (connection: {\n readonly native: unknown;\n readonly endpoint: string;\n }) => void;\n}\n\n/** A maintained Playwright connection, loaded lazily. No driver or protocol capability is returned. */\nexport const playwright = (options: PlaywrightOptions = {}): BrowserBinding => {\n const { resolveEndpoint, onConnected } = options;\n\n return issueBinding(\n { _tag: \"BrowserBinding\" as const },\n {\n connect: (request) =>\n Effect.gen(function* () {\n const address = yield* decoded(\n Schema.NonEmptyString.check(Schema.isMaxLength(16384)),\n \"connect\",\n \"undispatched\",\n )(request.connection);\n\n const endpoint =\n resolveEndpoint === undefined\n ? address\n : yield* resolveEndpoint({ url: Redacted.make(address) });\n\n return yield* fromNativeAttempt((attempt, signal) =>\n connectPlaywrightEndpoint(\n endpoint,\n signal,\n attempt.identity,\n attempt.options,\n attempt.events,\n onConnected === undefined ? undefined : (native) => onConnected({ native, endpoint }),\n ),\n ).connect(request);\n }),\n },\n );\n};\n\nconst defaultBinding = playwright();\n\n/**\n * An integration owns endpoint authority and the meaning of release. Its source must register\n * release in the supplied Scope before returning; the runtime owns only the connection below it.\n */\nexport interface Lifetime {\n readonly reference: unknown;\n readonly connection: (\n remainingMillis: number,\n ) => Effect.Effect<Redacted.Redacted<string>, BrowserError>;\n readonly release: Effect.Effect<unknown>;\n readonly cleanupResult: Effect.Effect<Option.Option<unknown>>;\n readonly closeChecked: Effect.Effect<void, BrowserError>;\n /**\n * Memory-only evidence that canonical owned cleanup terminated native browser control.\n * Omission is unknown. Borrowed disconnection alone never establishes this fact.\n */\n readonly controlRetired?: Effect.Effect<boolean>;\n readonly verifyReconnect?: Effect.Effect<void, BrowserError>;\n}\n\nexport type Source<L extends Lifetime, E, R = never> = (\n cleanup: ConnectionCleanup,\n lifetimeDeadline: number,\n) => Effect.Effect<L, E, R | Scope.Scope>;\n\nexport interface RuntimeOptions {\n readonly implementation: string;\n readonly binding?: BrowserBinding;\n readonly automation?: AutomationOptions;\n readonly viewport?: Viewport;\n readonly preserveViewport?: boolean;\n readonly keepAlive?: boolean;\n}\n\nexport interface AcquireOptions<E = never, R = never> extends OpenOptions<E, R> {\n /** Attach to an existing page without creating a tab or changing its viewport. */\n readonly existingTarget?: { readonly targetId?: string };\n}\n\n/**\n * Resolved host input for an integration constructing its own runtime. Stored paths must already\n * have been authorized by that integration; a session cannot recover these operations afterwards.\n */\nexport type ResolvedFileSelection =\n | { readonly _tag: \"Inline\"; readonly files: ReadonlyArray<InlineFile> }\n | { readonly _tag: \"Stored\"; readonly paths: ReadonlyArray<string> };\n\nexport interface FileRequest {\n readonly selector: string;\n readonly selection: ResolvedFileSelection;\n}\n\nexport class DownloadEvent extends Schema.Class<DownloadEvent>(\"BrowserDownloadEvent\")({\n downloadId: Identifier,\n filename: SafeFilename,\n state: Schema.Literals([\"completed\", \"failed\"]),\n}) {}\n\n/**\n * Modeled host operations for the integration creating this connection. Native authority stays\n * inside the owner; the integration adds only the capabilities its public session supports.\n */\nexport interface TransferOperations {\n readonly clickForDownload: (\n request: ClickRequest,\n options?: OperationOptions,\n ) => Effect.Effect<DownloadEvent, BrowserError>;\n readonly selectFiles: (\n request: FileRequest,\n options?: OperationOptions,\n ) => Effect.Effect<ActionResult, BrowserError>;\n readonly clickForFileSelection: (\n request: FileRequest,\n options?: OperationOptions,\n ) => Effect.Effect<ActionResult, BrowserError>;\n}\n\n/** The transfer bridge accepts only a Page issued by this exact session on its original owner. */\nexport interface Integration<Reference> {\n readonly forPage: (page: Page) => Effect.Effect<TransferOperations, BrowserError>;\n readonly liveView: <A>(\n issue: Effect.Effect<A, BrowserError>,\n options?: OperationOptions,\n ) => Effect.Effect<A, BrowserError>;\n readonly beginHandoff: <A>(\n issue: Effect.Effect<A, BrowserError>,\n options?: OperationOptions,\n ) => Effect.Effect<{ readonly token: Redacted.Redacted<string>; readonly view: A }, BrowserError>;\n readonly resume: (\n token: Redacted.Redacted<string>,\n operatorReleasedControl: boolean,\n options?: OperationOptions,\n ) => Effect.Effect<Inventory, BrowserError>;\n readonly detach: Effect.Effect<\n { readonly reference: Reference; readonly targetId: string; readonly inventory: Inventory },\n BrowserError\n >;\n readonly reconnect: (\n operatorReleasedControl: boolean,\n options?: OperationOptions,\n ) => Effect.Effect<Inventory, BrowserError | InitializationError>;\n}\n\nexport interface Connection<Reference, E = never> {\n /** Preserve this object's identity when adding an integration's public capabilities. */\n readonly session: BrowserSession<E>;\n readonly operations: Integration<Reference>;\n}\n\nexport interface Acquisition<L extends Lifetime, E = never> {\n readonly reference: L[\"reference\"];\n readonly lifetime: L;\n readonly failure: Effect.Effect<never, E | InitializationError>;\n readonly close: L[\"release\"];\n readonly connect: Effect.Effect<\n Connection<L[\"reference\"], E>,\n BrowserError | InitializationError | E\n >;\n}\n\nexport interface Runtime {\n readonly acquire: <L extends Lifetime, AE, AR, E = never, R = never>(\n policy: BrowserPolicy,\n source: Source<L, AE, AR>,\n request?: AcquireOptions<E, R>,\n ) => Effect.Effect<\n Acquisition<L, E>,\n AE | BrowserError,\n Scope.Scope | AR | Exclude<R, Scope.Scope>\n >;\n}\n\nconst StoredPath = Schema.NonEmptyString.check(\n Schema.isMaxLength(4096),\n Schema.makeFilter(\n (value) =>\n value.startsWith(\"/\") &&\n !value.includes(\"\\\\\") &&\n !value.includes(\"//\") &&\n ![...value].some((character) => character < \" \" || character === \"\\x7f\") &&\n value.split(\"/\").every((segment) => segment !== \".\" && segment !== \"..\"),\n ),\n);\n\nconst Selection = Schema.Union([\n Schema.TaggedStruct(\"Inline\", { files: InlineFiles }),\n Schema.TaggedStruct(\"Stored\", {\n paths: Schema.Array(StoredPath).check(Schema.isMinLength(1), Schema.isMaxLength(8)),\n }),\n]);\n\nconst resolveFiles = (\n selection: ResolvedFileSelection,\n operation: BrowserOperation,\n): Effect.Effect<ReadonlyArray<NativeFileSelection>, BrowserError> =>\n checked(Selection, selection, operation).pipe(\n Effect.map((value) =>\n value._tag === \"Inline\"\n ? value.files.map((file) => ({\n _tag: \"Inline\" as const,\n name: file.name,\n mediaType: file.mediaType,\n bytes: new Uint8Array(file.bytes),\n }))\n : value.paths.map((path) => ({ _tag: \"Remote\" as const, path })),\n ),\n );\n\nconst makeTransferOperations = (\n controls: Pick<PageControls, \"clickForDownload\" | \"selectFiles\" | \"clickForFileSelection\">,\n): TransferOperations => {\n const fileOperation = (\n operation: \"select-files\" | \"file-chooser\",\n request: FileRequest,\n options?: OperationOptions,\n ) =>\n checkedOperationOptions(options, operation).pipe(\n Effect.flatMap((options) =>\n checked(Selector, request.selector, operation).pipe(\n Effect.flatMap((selector) =>\n resolveFiles(request.selection, operation).pipe(\n Effect.flatMap((files) =>\n operation === \"select-files\"\n ? controls.selectFiles(selector, files, options)\n : controls.clickForFileSelection(selector, files, options),\n ),\n ),\n ),\n ),\n ),\n Effect.flatMap((url) => decoded(ActionResult, \"action-result\", \"performed\")({ url })),\n );\n\n return {\n clickForDownload: (request, options) =>\n checked(ClickRequest, request, \"download-action\").pipe(\n Effect.flatMap((value) =>\n checkedOperationOptions(options, \"download-action\").pipe(\n Effect.flatMap((options) => controls.clickForDownload(value.selector, options)),\n ),\n ),\n Effect.flatMap(decoded(DownloadEvent, \"download-action\", \"performed\")),\n ),\n selectFiles: (request, options) => fileOperation(\"select-files\", request, options),\n clickForFileSelection: (request, options) => fileOperation(\"file-chooser\", request, options),\n };\n};\n\n/**\n * Validate immutable connection configuration without loading a peer or acquiring a lifetime.\n * Connection ids and handoff tokens come from the `Crypto` service captured here, so a Layer\n * built on this runtime requires `Crypto` once and its operations never do.\n */\nexport const make = Effect.fnUntraced(function* (\n options: RuntimeOptions,\n): Effect.fn.Return<Runtime, BrowserError, Crypto.Crypto> {\n const implementation = yield* checked(\n Schema.NonEmptyString.check(Schema.isMaxLength(128)),\n options.implementation,\n \"configure\",\n );\n\n const automation = yield* checked(AutomationOptions, options.automation ?? {}, \"configure\");\n\n const viewport = yield* checked(\n Viewport,\n options.viewport ?? { width: 1280, height: 720 },\n \"configure\",\n );\n\n const preserveViewport = yield* checked(\n Schema.Boolean,\n options.preserveViewport ?? false,\n \"configure\",\n );\n\n const keepAlive = yield* checked(Schema.Boolean, options.keepAlive ?? false, \"configure\");\n\n const timelineLimits = Object.freeze({\n ...TimelineDefaults,\n ...automation.timelineLimits,\n maxEventBytes:\n automation.timelineLimits?.maxEventBytes ??\n Math.min(\n TimelineDefaults.maxEventBytes,\n automation.timelineLimits?.maxBytes ?? TimelineDefaults.maxBytes,\n ),\n });\n\n const engine = bindingImplementation(options.binding ?? defaultBinding);\n\n if (engine === undefined)\n return yield* BrowserError.make({\n operation: \"connect\",\n reason: Reasons.UnregisteredSession.make({}),\n outcome: \"undispatched\",\n });\n\n const pageControl = automation.pageControl ?? false;\n const popupPolicy = automation.popupPolicy ?? \"retain\";\n const dialogPolicy = automation.dialogPolicy ?? \"dismiss\";\n\n const observationLimits =\n automation.observationLimits === undefined\n ? undefined\n : Object.freeze({ ...automation.observationLimits });\n\n if (pageControl && (keepAlive || popupPolicy === \"pause\" || dialogPolicy === \"pause\"))\n return yield* BrowserError.make({\n operation: \"configure\",\n reason: Reasons.Unsupported.make({}),\n outcome: \"undispatched\",\n });\n\n const driver: DriverOptions = {\n viewport,\n pageControl,\n maxPages: automation.maxPages ?? 10,\n popupPolicy,\n dialogPolicy,\n preserveViewport,\n ...(observationLimits === undefined ? {} : { observationLimits }),\n ...(automation.initialPage === undefined\n ? {}\n : \"targetId\" in automation.initialPage\n ? { initialTargetId: automation.initialPage.targetId }\n : { newPage: true }),\n };\n\n const crypto = yield* Crypto.Crypto;\n\n const acquire = Effect.fnUntraced(\n function* <L extends Lifetime, AE, AR, E = never, R = never>(\n policy: BrowserPolicy,\n source: Source<L, AE, AR>,\n request: AcquireOptions<E, R> = {},\n ) {\n const fixed = yield* checked(BrowserPolicy, policy, \"configure\");\n const plan = yield* preparePlan<E, R>(request.bootstrap ?? Bootstrap.empty);\n\n const existing =\n request.existingTarget === undefined\n ? undefined\n : yield* checked(\n Schema.Struct({ targetId: Schema.optionalKey(Identifier) }),\n request.existingTarget,\n \"configure\",\n );\n\n // Even a parent with parallel finalizers closes this connection before callback scopes end.\n const scope = yield* Scope.fork(yield* Scope.Scope, \"sequential\");\n const bindings = yield* makeBindings(plan).pipe(Scope.provide(scope));\n const bootstrap = compileBootstrap(plan);\n\n const connectionDriver: DriverOptions =\n existing === undefined\n ? driver\n : {\n viewport,\n pageControl,\n maxPages: driver.maxPages,\n popupPolicy,\n dialogPolicy,\n newPage: false,\n preserveViewport: true,\n ...(observationLimits === undefined ? {} : { observationLimits }),\n ...(existing.targetId === undefined ? {} : { initialTargetId: existing.targetId }),\n };\n\n const acquired = yield* acquireSession(\n {\n maxActions: fixed.maxActions,\n maxElapsedMillis: fixed.maxElapsedMillis,\n actionTimeoutMillis: automation.actionTimeoutMillis ?? 10_000,\n maxHostReads: automation.maxHostReads ?? 10_000,\n timelineLimits,\n ...(automation.admissionLimits === undefined\n ? {}\n : { admissionLimits: automation.admissionLimits }),\n },\n {\n implementation,\n remote: source,\n engine,\n keepAlive: existing === undefined && keepAlive,\n driver: { ...connectionDriver, ...(bootstrap === undefined ? {} : { bootstrap }) },\n connectBindings: bindings.connect,\n maxReturnedBytes: fixed.maxReturnedBytes,\n },\n ).pipe(Scope.provide(scope), Effect.provideService(Crypto.Crypto, crypto));\n\n const connected = yield* Effect.cached(\n acquired.connect.pipe(\n Effect.map((controls): Connection<L[\"reference\"], E> => {\n const session = makeSession(controls, bindings);\n\n return {\n session,\n operations: {\n forPage: (page) =>\n resolvePageControlsForSession(session, page).pipe(\n Effect.map(makeTransferOperations),\n ),\n liveView: (issue, options) =>\n checkedOperationOptions(options, \"live-view\").pipe(\n Effect.flatMap((options) => controls.liveView(issue, options)),\n ),\n beginHandoff: (issue, options) =>\n checkedOperationOptions(options, \"handoff\").pipe(\n Effect.flatMap((options) => controls.beginHandoff(issue, options)),\n ),\n resume: (token, released, options) =>\n checkedOperationOptions(options, \"resume\").pipe(\n Effect.flatMap((options) => controls.resume(token, released, options)),\n ),\n detach: controls.detach,\n reconnect: (released, options) =>\n checkedOperationOptions(options, \"reconnect\").pipe(\n Effect.flatMap((options) => controls.reconnect(released, options)),\n ),\n },\n };\n }),\n ),\n );\n\n return {\n reference: acquired.reference,\n lifetime: acquired.lease,\n failure: bindings.failure,\n close: acquired.close,\n connect: Effect.raceFirst(\n bindings.failure,\n acquired.connect.pipe(Effect.andThen(connected)),\n ).pipe(Effect.onError(() => acquired.close.pipe(Effect.asVoid))),\n } satisfies Acquisition<L, E>;\n },\n Trace.span(\"Browser.acquire\", { attributes: { \"browser.operation\": \"acquire\" } }),\n );\n\n return { acquire } satisfies Runtime;\n});\n"],"mappings":"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"}