effect-browser 0.2.0-beta.9 → 0.3.0-beta.10
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.
- package/README.md +849 -1161
- package/dist/Browser-S4kvpmqa.mjs +605 -0
- package/dist/Browser-S4kvpmqa.mjs.map +1 -0
- package/dist/Browser.d.mts +127 -3
- package/dist/Browser.mjs +2 -22
- package/dist/BrowserError-Coy7EW1N.d.mts +140 -0
- package/dist/BrowserError.d.mts +2 -0
- package/dist/BrowserError.mjs +211 -0
- package/dist/BrowserError.mjs.map +1 -0
- package/dist/BrowserEvent-BRu2juEz.d.mts +279 -0
- package/dist/BrowserEvent.d.mts +2 -0
- package/dist/BrowserEvent.mjs +297 -0
- package/dist/BrowserEvent.mjs.map +1 -0
- package/dist/Cdp.d.mts +32 -0
- package/dist/Cdp.mjs +61 -0
- package/dist/Cdp.mjs.map +1 -0
- package/dist/Change-DNvztNLu.mjs +138 -0
- package/dist/Change-DNvztNLu.mjs.map +1 -0
- package/dist/Change-iMlcuzVD.d.mts +71 -0
- package/dist/Change.d.mts +2 -0
- package/dist/Change.mjs +2 -0
- package/dist/Chromium.d.mts +29 -81
- package/dist/Chromium.mjs +57 -392
- package/dist/Chromium.mjs.map +1 -1
- package/dist/Expect.d.mts +62 -0
- package/dist/Expect.mjs +114 -0
- package/dist/Expect.mjs.map +1 -0
- package/dist/Frame-BERmf_gM.d.mts +117 -0
- package/dist/Frame.d.mts +2 -0
- package/dist/Frame.mjs +123 -0
- package/dist/Frame.mjs.map +1 -0
- package/dist/Moment.d.mts +2 -0
- package/dist/Moment.mjs +288 -0
- package/dist/Moment.mjs.map +1 -0
- package/dist/Motion.d.mts +40 -0
- package/dist/Motion.mjs +122 -0
- package/dist/Motion.mjs.map +1 -0
- package/dist/Page-B5cjaUp5.mjs +618 -0
- package/dist/Page-B5cjaUp5.mjs.map +1 -0
- package/dist/Page-BlPjfibv.d.mts +595 -0
- package/dist/Page.d.mts +2 -0
- package/dist/Page.mjs +2 -0
- package/dist/Plan-BI8XGvDu.d.mts +209 -0
- package/dist/Plan-D1wrJVs8.mjs +508 -0
- package/dist/Plan-D1wrJVs8.mjs.map +1 -0
- package/dist/Plan.d.mts +2 -3
- package/dist/Plan.mjs +2 -2
- package/dist/Policy.d.mts +76 -0
- package/dist/Policy.mjs +237 -0
- package/dist/Policy.mjs.map +1 -0
- package/dist/Presentation.d.mts +48 -0
- package/dist/Presentation.mjs +117 -0
- package/dist/Presentation.mjs.map +1 -0
- package/dist/Snapshot-B34hZ4Jl.d.mts +68 -0
- package/dist/Snapshot.d.mts +2 -0
- package/dist/Snapshot.mjs +79 -0
- package/dist/Snapshot.mjs.map +1 -0
- package/dist/Stage.d.mts +64 -0
- package/dist/Stage.mjs +237 -0
- package/dist/Stage.mjs.map +1 -0
- package/dist/Supervisor-CYWFK3vM.d.mts +280 -0
- package/dist/Supervisor-TNKNOVzu.mjs +599 -0
- package/dist/Supervisor-TNKNOVzu.mjs.map +1 -0
- package/dist/Supervisor.d.mts +2 -0
- package/dist/Supervisor.mjs +2 -0
- package/dist/context-B6xr8nVi.mjs +261 -0
- package/dist/context-B6xr8nVi.mjs.map +1 -0
- package/dist/index.d.mts +17 -14
- package/dist/index.mjs +18 -13
- package/dist/match.inpage-xOe9LNO0.mjs +48 -0
- package/dist/match.inpage-xOe9LNO0.mjs.map +1 -0
- package/dist/page-B8tUQELg.mjs +5073 -0
- package/dist/page-B8tUQELg.mjs.map +1 -0
- package/dist/rolldown-runtime-D7D4PA-g.mjs +13 -0
- package/dist/url-Cd04Okid.mjs +264 -0
- package/dist/url-Cd04Okid.mjs.map +1 -0
- package/package.json +96 -61
- package/src/Browser.ts +666 -0
- package/src/BrowserError.ts +234 -0
- package/src/BrowserEvent.ts +296 -0
- package/src/Cdp.ts +101 -0
- package/src/Change.ts +88 -0
- package/src/Chromium.ts +102 -0
- package/src/Expect.ts +180 -0
- package/src/Frame.ts +130 -0
- package/src/Moment.ts +479 -0
- package/src/Motion.ts +166 -0
- package/src/Page.ts +522 -0
- package/src/Plan.ts +663 -0
- package/src/Policy.ts +325 -0
- package/src/Presentation.ts +195 -0
- package/src/Snapshot.ts +89 -0
- package/src/Stage.ts +467 -0
- package/src/Supervisor.ts +599 -0
- package/src/index.ts +20 -0
- package/src/internal/input/actions.ts +610 -0
- package/src/internal/input/dispatch.ts +161 -0
- package/src/internal/input/edit.inpage.ts +162 -0
- package/src/internal/input/evidence.inpage.ts +164 -0
- package/src/internal/input/gate.ts +224 -0
- package/src/internal/input/guard.inpage.ts +605 -0
- package/src/internal/input/guard.ts +184 -0
- package/src/internal/input/keyboard.ts +112 -0
- package/src/internal/input/keys.ts +127 -0
- package/src/internal/input/perform.ts +376 -0
- package/src/internal/input/pointer.ts +153 -0
- package/src/internal/input/replies.ts +195 -0
- package/src/internal/input/settle.ts +50 -0
- package/src/internal/input/style.ts +186 -0
- package/src/internal/input/targets.inpage.ts +293 -0
- package/src/internal/input/targets.ts +148 -0
- package/src/internal/page/bridge.ts +386 -0
- package/src/internal/page/context.ts +312 -0
- package/src/internal/page/lane.ts +311 -0
- package/src/internal/page/navigation.ts +183 -0
- package/src/internal/page/openings.ts +87 -0
- package/src/internal/page/page.ts +165 -0
- package/src/internal/page/url.ts +100 -0
- package/src/internal/page/viewport.ts +43 -0
- package/src/internal/pictures/capture.ts +776 -0
- package/src/internal/pictures/clock.ts +141 -0
- package/src/internal/pictures/counts.ts +92 -0
- package/src/internal/pictures/pictures.ts +520 -0
- package/src/internal/pictures/transport.ts +242 -0
- package/src/internal/reading/choose.ts +100 -0
- package/src/internal/reading/context.inpage.ts +201 -0
- package/src/internal/reading/controls.inpage.ts +158 -0
- package/src/internal/reading/expect.inpage.ts +70 -0
- package/src/internal/reading/match.inpage.ts +92 -0
- package/src/internal/reading/names.inpage.ts +306 -0
- package/src/internal/reading/outline.inpage.ts +260 -0
- package/src/internal/reading/reading.ts +223 -0
- package/src/internal/reading/ready.inpage.ts +164 -0
- package/src/internal/reading/ready.ts +111 -0
- package/src/internal/reading/subjects.inpage.ts +188 -0
- package/src/internal/reading/text.inpage.ts +135 -0
- package/src/internal/reading/walk.inpage.ts +220 -0
- package/src/internal/supervisor/lifecycle.ts +416 -0
- package/src/internal/timeline/changes.inpage.ts +216 -0
- package/src/internal/timeline/changes.ts +100 -0
- package/src/internal/timeline/events.ts +94 -0
- package/src/internal/timeline/fold.inpage.ts +123 -0
- package/src/internal/timeline/history.inpage.ts +229 -0
- package/src/internal/timeline/marks.inpage.ts +207 -0
- package/src/internal/timeline/record.inpage.ts +133 -0
- package/src/internal/timeline/sight.inpage.ts +122 -0
- package/src/internal/timeline/window.ts +96 -0
- package/src/internal/timeline/words.ts +65 -0
- package/dist/Bootstrap-B9UUXsvF.d.mts +0 -183
- package/dist/Bootstrap-CeQOWBy6.mjs +0 -189
- package/dist/Bootstrap-CeQOWBy6.mjs.map +0 -1
- package/dist/Bootstrap.d.mts +0 -3
- package/dist/Bootstrap.mjs +0 -2
- package/dist/Browser-BF9_sORP.d.mts +0 -388
- package/dist/Browser.mjs.map +0 -1
- package/dist/BrowserData-CPIIIHol.d.mts +0 -585
- package/dist/BrowserData.d.mts +0 -3
- package/dist/BrowserData.mjs +0 -695
- package/dist/BrowserData.mjs.map +0 -1
- package/dist/BrowserRuntime-B6nT1G4X.d.mts +0 -148
- package/dist/BrowserRuntime-C1r2aSRK.mjs +0 -6820
- package/dist/BrowserRuntime-C1r2aSRK.mjs.map +0 -1
- package/dist/BrowserRuntime.d.mts +0 -3
- package/dist/BrowserRuntime.mjs +0 -3
- package/dist/Capture.d.mts +0 -56
- package/dist/Capture.mjs +0 -678
- package/dist/Capture.mjs.map +0 -1
- package/dist/CaptureData-CYriZHX1.mjs +0 -201
- package/dist/CaptureData-CYriZHX1.mjs.map +0 -1
- package/dist/CaptureData.d.mts +0 -219
- package/dist/CaptureData.mjs +0 -2
- package/dist/Errors.d.mts +0 -158
- package/dist/Errors.mjs +0 -207
- package/dist/Errors.mjs.map +0 -1
- package/dist/Images-yCG9BmRU.mjs +0 -76
- package/dist/Images-yCG9BmRU.mjs.map +0 -1
- package/dist/OperationOptions-DAeRS6O9.mjs +0 -55
- package/dist/OperationOptions-DAeRS6O9.mjs.map +0 -1
- package/dist/PageControl.d.mts +0 -15
- package/dist/PageControl.mjs +0 -34
- package/dist/PageControl.mjs.map +0 -1
- package/dist/PageRegistry-B3q9DS3g.mjs +0 -164
- package/dist/PageRegistry-B3q9DS3g.mjs.map +0 -1
- package/dist/Plan-Dyxu2q8C.mjs +0 -543
- package/dist/Plan-Dyxu2q8C.mjs.map +0 -1
- package/dist/PlanData-B668RxbQ.d.mts +0 -4831
- package/dist/PlanData.d.mts +0 -3
- package/dist/PlanData.mjs +0 -268
- package/dist/PlanData.mjs.map +0 -1
- package/dist/PlanInput-BJcPPncs.mjs +0 -75
- package/dist/PlanInput-BJcPPncs.mjs.map +0 -1
- package/dist/PublicSession-DCSMMqOj.mjs +0 -5602
- package/dist/PublicSession-DCSMMqOj.mjs.map +0 -1
- package/dist/Testing.d.mts +0 -479
- package/dist/Testing.mjs +0 -2147
- package/dist/Testing.mjs.map +0 -1
- package/dist/Timeline-fV22Xk-S.d.mts +0 -29
- package/dist/Timeline.d.mts +0 -4
- package/dist/Timeline.mjs +0 -20
- package/dist/Timeline.mjs.map +0 -1
- package/dist/TimelineData-BsOn-YGZ.d.mts +0 -3818
- package/dist/TimelineData.d.mts +0 -3
- package/dist/TimelineData.mjs +0 -482
- package/dist/TimelineData.mjs.map +0 -1
package/dist/Testing.mjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Testing.mjs","names":["makeRuntime"],"sources":["../src/internal/testing/Crypto.ts","../src/internal/testing/Frame.ts","../src/internal/testing/Script.ts","../src/internal/testing/Engine.ts","../src/internal/testing/Lifetime.ts","../src/Testing.ts"],"sourcesContent":["import { Crypto, Effect, PlatformError } from \"effect\";\n\n/**\n * A `Crypto` whose bytes count up from one, so every id and handoff token a scripted browser draws\n * is predictable. A namespace occupies UUID bytes untouched by its version/variant bits.\n * It is not random and computes no digest.\n */\nexport const makeSequentialCrypto = (namespace = 0): Crypto.Crypto => {\n let draws = 0;\n\n return Crypto.make({\n randomBytes: (size) => {\n const bytes = new Uint8Array(size);\n let rest = ++draws;\n\n for (let index = size - 1; index >= 0 && rest > 0; index--) {\n bytes[index] = rest % 256;\n rest = Math.floor(rest / 256);\n }\n let scope = BigInt(namespace);\n\n for (let index = 0; index < size - 8 && scope > 0n; index++) {\n if (index === 6) continue;\n bytes[index] = Number(scope % 256n);\n scope /= 256n;\n }\n\n return bytes;\n },\n digest: () =>\n Effect.fail(\n PlatformError.badArgument({\n module: \"Crypto\",\n method: \"digest\",\n description: \"A scripted browser's Crypto computes no digest\",\n }),\n ),\n });\n};\n","// This module imports nothing. The public testing entry re-exports it, and a declaration\n// bundled from the engine would carry the engine's native type graph into a consumer that\n// installs no Playwright.\n\n/** A valid 64×48 baseline JPEG, the bytes a scripted capture frame carries by default. */\nexport const jpegFrame = (): Uint8Array =>\n Uint8Array.from(\n atob(\n \"/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAoHBwgHBgoICAgLCgoLDhgQDg0NDh0VFhEYIx8lJCIfIiEmKzcvJik0KSEiMEExNDk7Pj4+JS5ESUM8SDc9Pjv/2wBDAQoLCw4NDhwQEBw7KCIoOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozv/wAARCAAwAEADASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDyVLf2qdLf2q6lv7VOlv7UoyMadcpJb+1Tpb+1XUt/ap0t/atoyPSp1yklv7VYS39qupb+1Tpb+1bxkejTrlJLf2qdLf2q6lv7VOlv7VtGR6NOuYKW/tU6W/tV1Lf2qwlv7V4kZH5fTrlFLf2qwlv7VdS39qnS39q2jI9GnXKSW/tU6W/tV1Lf2qdLf2raMj0adcpJb+1Tpb+1Xkt/ap0t/at4yPRp1zBS39qnS39qupb+1Tpb+1eHGR+X065SS39qnS39qupb+1Tpb+1bxkejTrlJLf2qwlv7VdS39qnS39q2jI9GnXKSW/tU6W/tV1Lf2qdLf2raMj0adc//2Q==\",\n ),\n (character) => character.charCodeAt(0),\n );\n","import { type Effect, type Option, Schema } from \"effect\";\n\nimport type { BrowserSession } from \"../../Browser.ts\";\nimport {\n Identifier,\n DocumentScroll,\n ObservedControl,\n SafeFilename,\n TargetUrl,\n type ViewportPoint,\n} from \"../../BrowserData.ts\";\nimport {\n type BrowserOperation,\n type BrowserError,\n type BrowserOutcome,\n type BrowserReason,\n} from \"../../Errors.ts\";\n\nconst uniqueBy = <A>(key: (value: A) => string, title: string) =>\n Schema.makeFilter((items: ReadonlyArray<A>) => new Set(items.map(key)).size === items.length, {\n title,\n });\n\n/** Host-only facts a scripted control reports beyond what its observed fields imply. */\nexport const ControlFactsScript = Schema.Struct({\n editable: Schema.optionalKey(Schema.Boolean),\n formMethod: Schema.optionalKey(Schema.Literals([\"get\", \"post\", \"dialog\"])),\n hitTest: Schema.optionalKey(Schema.Literals([\"self\", \"covered\", \"uncertain\", \"unsampled\"])),\n placement: Schema.optionalKey(Schema.Literals([\"inside\", \"partial\", \"outside\"])),\n autocomplete: Schema.optionalKey(Schema.String.check(Schema.isMaxLength(128))),\n box: Schema.optionalKey(\n Schema.Struct({\n x: Schema.Finite,\n y: Schema.Finite,\n width: Schema.Finite,\n height: Schema.Finite,\n }),\n ),\n});\n\n/**\n * One control a scripted document offers. `id` becomes the issued `elementId`, so a scripted\n * model turn can name it statically. Nothing here is a live capability.\n */\nexport const ControlScript = Schema.Struct({\n id: Identifier,\n kind: ObservedControl.fields.kind,\n label: ObservedControl.fields.label,\n disabled: Schema.optionalKey(Schema.Boolean),\n /** A checkbox or radio `input` without it starts unchecked, as a real one does. */\n checked: Schema.optionalKey(Schema.Boolean),\n selected: Schema.optionalKey(Schema.Boolean),\n inputType: Schema.optionalKey(Schema.String.check(Schema.isMaxLength(32))),\n required: Schema.optionalKey(Schema.Boolean),\n multiple: Schema.optionalKey(Schema.Boolean),\n /** The scripted select this option belongs to; it must be in the same document. */\n selectElementId: Schema.optionalKey(Identifier),\n /**\n * The link target, or the form action a submit control sends to: reported as the control's\n * destination fact, and where activating it leads. Only a `link`, or a `button`/`input` whose\n * `inputType` is `submit` or `image`, has one, because that is all a real document reports.\n */\n destination: Schema.optionalKey(TargetUrl),\n /** Where activation leads with no destination fact: what an `onclick` handler does. */\n activates: Schema.optionalKey(TargetUrl),\n /** Outside the viewport: absent from viewport readings and refused by hover. */\n offscreen: Schema.optionalKey(Schema.Boolean),\n /** What `readText({ selector: \"#id\" })` returns; defaults to the label. */\n text: Schema.optionalKey(Schema.String.check(Schema.isMaxLength(65536))),\n /** Clicking for a download completes one with this name. */\n download: Schema.optionalKey(SafeFilename),\n facts: Schema.optionalKey(ControlFactsScript),\n}).check(\n Schema.makeFilter(\n (control: {\n readonly kind: string;\n readonly inputType?: string;\n readonly destination?: string;\n }) =>\n control.destination === undefined ||\n control.kind === \"link\" ||\n ((control.kind === \"button\" || control.kind === \"input\") &&\n (control.inputType === \"submit\" || control.inputType === \"image\")),\n { title: \"a destination only on a link or a submit control\" },\n ),\n);\n\nexport type ControlScript = typeof ControlScript.Type;\n\nexport const DocumentScript = Schema.Struct({\n url: TargetUrl,\n title: Schema.optionalKey(Schema.String.check(Schema.isMaxLength(512))),\n text: Schema.String.check(Schema.isMaxLength(131072)),\n /**\n * Authored root-document geometry, not inferred layout. Readings carry this exact snapshot;\n * use document.update to supply the next state after a scripted scroll or resize.\n */\n documentScroll: Schema.optionalKey(DocumentScroll),\n controls: Schema.optionalKey(\n Schema.Array(ControlScript).check(\n Schema.isMaxLength(64),\n uniqueBy((control: ControlScript) => control.id, \"unique control ids\"),\n ),\n ),\n});\n\nexport type DocumentScript = typeof DocumentScript.Type;\n\n/**\n * The documents a scripted browser can show. A navigation to a listed address reaches that\n * document; an unlisted address reaches an empty document with that address.\n */\nexport const Script = Schema.Struct({\n documents: Schema.Array(DocumentScript).check(\n Schema.isMinLength(1),\n Schema.isMaxLength(64),\n uniqueBy((document: DocumentScript) => document.url, \"unique document addresses\"),\n ),\n /** The first page's document at connect; defaults to the first listed document. */\n start: Schema.optionalKey(TargetUrl),\n /**\n * What successive connection attempts to one browser do: `refuse` fails the attempt as an\n * unreachable endpoint would, and `accept` connects. Attempts past the list connect.\n */\n connections: Schema.optionalKey(\n Schema.Array(Schema.Literals([\"accept\", \"refuse\"])).check(Schema.isMaxLength(16)),\n ),\n});\n\nexport type Script = typeof Script.Type;\n\nexport class ScriptedReference extends Schema.Class<ScriptedReference>(\"ScriptedBrowserReference\")({\n provider: Schema.Literal(\"scripted\"),\n id: Identifier,\n}) {}\n\nexport class ScriptedCleanupIssue extends Schema.Class<ScriptedCleanupIssue>(\n \"ScriptedCleanupIssue\",\n)({\n step: Schema.Literals([\"fence\", \"capture\", \"initialization\", \"disconnect\"]),\n reason: Schema.Literals([\"timeout\", \"failed\", \"interrupted\"]),\n}) {}\n\n/** Connection teardown facts for a scripted browser; there is no process or provider status. */\nexport class ScriptedCleanupResult extends Schema.Class<ScriptedCleanupResult>(\n \"ScriptedCleanupResult\",\n)({\n reference: ScriptedReference,\n connection: Schema.Literals([\"closed\", \"failed\", \"not-connected\", \"pending\"]),\n issues: Schema.Array(ScriptedCleanupIssue).check(Schema.isMaxLength(16)),\n}) {}\n\n/**\n * The operations whose next call a test may script. `disconnect` is the owner's native teardown\n * of a connection: a `Fail` makes it fail and a `Hold` parks it, however long cleanup waits.\n */\nexport const ScriptableOperation = Schema.Literals([\n \"navigate\",\n \"navigate-stop\",\n \"observe\",\n \"checkpoint\",\n \"control-facts\",\n \"revalidate\",\n \"read-text\",\n \"screenshot\",\n \"wait\",\n \"resolve\",\n \"run\",\n \"settled\",\n \"click\",\n \"fill\",\n \"fill-form\",\n \"select-option\",\n \"scroll\",\n \"click-and-wait\",\n \"download-action\",\n \"select-files\",\n \"file-chooser\",\n \"pointer-move\",\n \"hover\",\n \"wheel\",\n \"press\",\n \"type\",\n \"list-pages\",\n \"describe-page\",\n \"list-frames\",\n \"select-page\",\n \"new-page\",\n \"close-page\",\n \"resize\",\n \"page-suspend\",\n \"page-resume\",\n \"capture-stop\",\n \"disconnect\",\n] satisfies ReadonlyArray<BrowserOperation>);\n\nexport type ScriptableOperation = typeof ScriptableOperation.Type;\n\n/** A held native call: the test learns that it arrived, then decides when it may finish. */\nexport interface Gate {\n /** Resolves once the held call has reached the engine. */\n readonly reached: Effect.Effect<void>;\n /** Lets the held call finish normally. */\n readonly open: Effect.Effect<void>;\n}\n\n/**\n * What the next admitted call of one operation does instead of following the document model.\n * `Fail` with `outcome: \"unknown\"` dispatches first and then fails, so the owner fences the\n * session; the other outcomes never dispatch. `Hold` parks the call until its gate opens, before\n * or after native dispatch. `Disconnect` drops the connection inside the call.\n */\nexport type ScriptedOutcome =\n | { readonly _tag: \"Fail\"; readonly reason: BrowserReason; readonly outcome: BrowserOutcome }\n | { readonly _tag: \"Hold\"; readonly gate: Gate; readonly dispatched: boolean }\n | { readonly _tag: \"Disconnect\"; readonly dispatched?: boolean };\n\n/** Evidence of one admitted call. It never carries filled values, typed text or addresses. */\nexport interface RecordedCall {\n readonly sequence: number;\n readonly operation: BrowserOperation;\n readonly pageId: string;\n readonly elementId?: string;\n readonly selector?: string;\n /** The engine was asked to act: the moment after which an outcome can be unknown. */\n readonly dispatched: boolean;\n readonly settled: \"completed\" | \"failed\" | \"pending\";\n}\n\n/** One frame a test hands to a running capture interval; omitted fields take defaults. */\nexport interface ScriptedFrame {\n readonly bytes?: Uint8Array;\n /** Presentation time in Unix milliseconds; defaults to forty milliseconds after the last frame. */\n readonly timestamp?: number;\n readonly viewportWidth?: number;\n readonly viewportHeight?: number;\n}\n\n/**\n * How one connection to a scripted browser went: refused by the script, still open, closed by\n * its owner, dropped (as `disconnect` or an armed `Disconnect` drops it), or failed to close.\n */\nexport type ScriptedConnection = \"refused\" | \"open\" | \"closed\" | \"dropped\" | \"close-failed\";\n\n/** What a page would see when it calls a registered binding: a reply, or a bare rejection. */\nexport type BindingReply = { readonly ok: true; readonly output: unknown } | { readonly ok: false };\n\n/**\n * The test's side of one scripted browser. The browser outlives any one connection, as a\n * keep-alive browser does: a reconnection finds the same pages, and this handle keeps working\n * while no connection is open.\n */\nexport interface ScriptedControl {\n readonly calls: Effect.Effect<ReadonlyArray<RecordedCall>>;\n /** Arm the next admitted call of one operation. Arms are consumed one-shot in arming order. */\n readonly next: (operation: ScriptableOperation, outcome: ScriptedOutcome) => Effect.Effect<void>;\n readonly gate: Effect.Effect<Gate>;\n readonly document: {\n /**\n * The document of the page selected last, whether or not a connection is open; `Closed`\n * once that page is closed.\n */\n readonly current: Effect.Effect<DocumentScript, BrowserError>;\n /**\n * The document is replaced, as a navigation replaces it: every retained node and every\n * pending wait on that page becomes stale, and a capture learns of a new document.\n */\n readonly replace: (next: DocumentScript) => Effect.Effect<void, BrowserError>;\n /**\n * The same document changes, as its own script would change it: controls that keep their\n * id keep their identity, removed ones detach, waits re-evaluate, nothing goes stale.\n */\n readonly update: (next: DocumentScript) => Effect.Effect<void, BrowserError>;\n /** What `fill` and `type` put into which control id. Never part of `calls`. */\n readonly values: Effect.Effect<ReadonlyMap<string, string>>;\n /** File names attached to which control id by file selection. */\n readonly files: Effect.Effect<ReadonlyMap<string, ReadonlyArray<string>>>;\n };\n /**\n * The last point a pointer command placed on any page, or null when none was placed yet. An\n * input receipt reports the point placed on its own page, as Chromium's per-page pointer does.\n */\n readonly pointer: Effect.Effect<ViewportPoint | null>;\n readonly capture: {\n /** Deliver one frame to the interval capturing the selected page. */\n readonly emit: (frame?: ScriptedFrame) => Effect.Effect<void, BrowserError>;\n };\n /** A page-side call of a registered `Bootstrap.binding`, through the real admission path. */\n readonly invoke: (\n name: string,\n input: unknown,\n options?: { readonly origin?: string },\n ) => Effect.Effect<BindingReply>;\n /** Every open connection drops; each owner reports its session as disconnected. */\n readonly disconnect: Effect.Effect<void>;\n /** Every connection made to this browser, in order, and how each has ended so far. */\n readonly connections: Effect.Effect<ReadonlyArray<ScriptedConnection>>;\n}\n\n/** The real public session over the scripted engine, decorated the way owned sessions are. */\nexport interface ScriptedSession<E = never> extends BrowserSession<E> {\n readonly reference: ScriptedReference;\n readonly control: ScriptedControl;\n readonly closeChecked: Effect.Effect<ScriptedCleanupResult, BrowserError>;\n readonly close: Effect.Effect<ScriptedCleanupResult>;\n readonly cleanupResult: Effect.Effect<Option.Option<ScriptedCleanupResult>>;\n}\n","import { Effect, Schema } from \"effect\";\n\nimport {\n ControlFacts,\n FrameInfo,\n ObservedControl,\n PageExecutionState,\n PageInfo,\n PageSuspension,\n ViewportEvidence,\n ViewportRect,\n ObservedElement,\n type InputReceipt,\n type KeyModifier,\n type SelectOptions,\n type Viewport,\n type ViewportPoint,\n type DocumentScroll,\n type WaitForElementRequest,\n} from \"../../BrowserData.ts\";\nimport {\n BrowserError,\n InitializationError,\n Reasons,\n type BrowserOperation,\n type BrowserOutcome,\n type BrowserReason,\n} from \"../../Errors.ts\";\nimport type {\n Descriptor,\n Precondition,\n ResolveGuard,\n SettledEvidence,\n SettledOptions,\n} from \"../../PlanData.ts\";\nimport type { NativeBinding } from \"../browser/Bindings.ts\";\nimport {\n MaximumGroupNodes,\n type DescriptorSample,\n type ResolvedElement,\n type ResolvedGroup,\n type ResolveRequest,\n} from \"../browser/Descriptor.ts\";\nimport type {\n CaptureBinding,\n CaptureStart,\n Driver,\n DriverEvents,\n DriverOptions,\n DriverTarget,\n InputCapture,\n NativeCheckpoint,\n NativeFileSelection,\n NativeNavigation,\n NativeCachedPage,\n NativeObservation,\n ReadinessState,\n} from \"../browser/Driver.ts\";\nimport { pngGeometry } from \"../browser/Images.ts\";\nimport type { AdmissionPolicy } from \"../browser/Observation.ts\";\nimport type { ObservationScope, ReadTicket, Ticket, WaitTicket } from \"../browser/Owner.ts\";\nimport { identityOf, stableIdentityOf } from \"../browser/PageRead.ts\";\nimport type { NativeInput } from \"../browser/Pointer.ts\";\nimport { checked } from \"../browser/PublicSession.ts\";\nimport { jpegFrame } from \"./Frame.ts\";\nimport {\n DocumentScript,\n type BindingReply,\n type ControlScript,\n type Gate,\n type RecordedCall,\n type Script,\n type ScriptableOperation,\n type ScriptedConnection,\n type ScriptedControl,\n type ScriptedFrame,\n type ScriptedOutcome,\n} from \"./Script.ts\";\n\n/** Time for an in-flight navigation, on the Effect clock the engine was opened under. */\nexport interface EngineTimers {\n readonly sleep: (millis: number) => {\n readonly done: Promise<void>;\n readonly cancel: () => void;\n };\n}\n\n/**\n * One scripted browser. Its pages, documents, recorder and arms outlive any one connection, as a\n * keep-alive browser's do; each connection gets its own driver, selection and observation.\n */\nexport interface ScriptedBrowser {\n readonly connect: (options: DriverOptions, events: DriverEvents) => Driver;\n readonly control: ScriptedControl;\n}\n\n/** What the browser needs from each connection open to it. */\ninterface Live {\n readonly opened: (pageId: string) => void;\n readonly navigated: (pageId: string, sameDocument: boolean) => void;\n readonly metadata: (pageId: string) => void;\n readonly retire: (pageId: string) => void;\n readonly closed: (pageId: string) => void;\n readonly announce: (pageId: string) => void;\n readonly drop: () => void;\n readonly invoke: (\n name: string,\n input: unknown,\n origin: string | undefined,\n ) => Promise<BindingReply>;\n readonly pointer: () => ViewportPoint | null;\n readonly viewport: (pageId: string) => Viewport;\n}\n\ninterface ControlState {\n script: ControlScript;\n checked: boolean | undefined;\n selected: boolean | undefined;\n}\n\ninterface DocumentState {\n readonly url: string;\n readonly title: string;\n readonly text: string;\n readonly documentScroll?: DocumentScroll;\n readonly controls: ReadonlyArray<ControlState>;\n}\n\ninterface InFlight {\n readonly stop: () => void;\n readonly drop: () => void;\n readonly by: Live;\n}\n\ninterface Page {\n readonly pageId: string;\n readonly targetId: string;\n readonly frameId: string;\n document: DocumentState;\n cachedTitle?: string | null;\n epoch: number;\n /** The document epoch that predates registration; `-1` when every document ran the bundle. */\n readonly registeredEpoch: number;\n readonly values: Map<string, string>;\n readonly files: Map<string, ReadonlyArray<string>>;\n readonly scroll: { x: number; y: number };\n mutations: number;\n focused: string | undefined;\n closed: boolean;\n held: { readonly suspensionId: string; readonly by: Live } | undefined;\n navigation: InFlight | undefined;\n readonly watchers: Set<() => void>;\n viewport?: Viewport;\n capture: { readonly start: CaptureStart; readonly by: Live } | undefined;\n}\n\ninterface Snapshot {\n readonly id: string;\n readonly pageId: string;\n readonly frameId: string;\n readonly epoch: number;\n readonly generation: number;\n readonly scope: \"document\" | \"viewport\";\n origin?: AbortSignal;\n validity: \"valid\" | \"suspended\" | \"invalid\";\n readonly nodes: Map<string, ControlState>;\n readonly identities: Map<string, { readonly identity: string; readonly stable: string }>;\n readonly revalidated: Set<string>;\n}\n\ninterface ResolvedNode {\n readonly node: ControlState;\n readonly snapshot: Snapshot;\n readonly scope: \"document\" | \"viewport\";\n readonly identity: string;\n readonly stable: string;\n readonly parent?: ControlState;\n readonly descriptor?: Descriptor;\n}\n\ntype ElementTarget = ObservedElement | ResolvedElement;\ntype Selection = SelectOptions | ReadonlyArray<ResolvedElement>;\ntype FormStep = {\n readonly value?: string;\n readonly checked?: boolean;\n readonly options?: Selection;\n};\n\ninterface InternalGate {\n readonly reach: () => void;\n readonly opened: Promise<void>;\n}\n\ntype MutableCall = {\n -readonly [K in keyof RecordedCall]: RecordedCall[K];\n};\n\nconst gates = new WeakMap<Gate, InternalGate>();\n\n/** A gate that holds a scripted call until the test opens it. */\nconst makeGate = Effect.sync((): Gate => {\n let reach: () => void = () => {};\n let open: () => void = () => {};\n\n const reached = new Promise<void>((resolve) => {\n reach = resolve;\n });\n\n const opened = new Promise<void>((resolve) => {\n open = resolve;\n });\n\n const gate: Gate = {\n reached: Effect.promise(() => reached),\n open: Effect.sync(() => {\n open();\n }),\n };\n\n gates.set(gate, { reach, opened });\n\n return gate;\n});\n\n/** A 1×1 PNG: what a scripted screenshot or checkpoint picture contains. */\nconst PNG = Uint8Array.from(\n atob(\n \"iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNkYPhfDwAChwGA60e6kgAAAABJRU5ErkJggg==\",\n ),\n (character) => character.charCodeAt(0),\n);\n\nconst fail = (\n operation: BrowserOperation,\n reason: BrowserReason,\n outcome: BrowserOutcome = \"undispatched\",\n): BrowserError => BrowserError.make({ operation, reason, outcome });\n\nconst encoder = new TextEncoder();\n\n/** Cut at a character boundary so the bounded text is still valid UTF-16. */\nconst bounded = (text: string, maximumBytes: number) => {\n if (encoder.encode(text).length <= maximumBytes) return { text, truncated: false };\n let kept = \"\";\n let bytes = 0;\n\n for (const character of text) {\n const size = encoder.encode(character).length;\n\n if (bytes + size > maximumBytes) break;\n kept += character;\n bytes += size;\n }\n\n return { text: kept, truncated: true };\n};\n\nconst originOf = (url: string): string => {\n try {\n return new URL(url).origin;\n } catch {\n return \"null\";\n }\n};\n\nconst isSelectable = (kind: ControlScript[\"kind\"]) => kind === \"select\";\n\nconst isEditable = (control: ControlScript) =>\n (control.kind === \"input\" || control.kind === \"textarea\") && control.disabled !== true;\n\nconst isToggle = (control: ControlScript) =>\n control.kind === \"input\" && (control.inputType === \"checkbox\" || control.inputType === \"radio\");\n\n/** Input types native fill types or assigns text into; every other input takes none. */\nconst textInputs = new Set([\n \"\",\n \"email\",\n \"number\",\n \"password\",\n \"search\",\n \"tel\",\n \"text\",\n \"url\",\n \"color\",\n \"date\",\n \"time\",\n \"datetime-local\",\n \"month\",\n \"range\",\n \"week\",\n]);\n\n/**\n * What the real driver refuses before dispatching text into a control: a disabled one, one that\n * takes no text, and a number field given something that is not a number.\n */\nconst textRefusal = (control: ControlScript, text: string): BrowserReason | undefined => {\n const editable = control.facts?.editable;\n\n if (control.disabled === true) return Reasons.Disabled.make({});\n if (editable === false) return Reasons.Unsupported.make({});\n if (control.kind === \"textarea\") return undefined;\n if (control.kind !== \"input\") return editable === true ? undefined : Reasons.Unsupported.make({});\n const type = (control.inputType ?? \"\").toLowerCase();\n\n if (!textInputs.has(type)) return Reasons.Unsupported.make({});\n\n return type === \"number\" && Number.isNaN(Number(text.trim()))\n ? Reasons.Unsupported.make({})\n : undefined;\n};\n\nconst controlState = (script: ControlScript): ControlState => ({\n script,\n checked: script.checked ?? (isToggle(script) ? false : undefined),\n selected: script.selected,\n});\n\nexport const makeScriptedBrowser = (script: Script, timers: EngineTimers): ScriptedBrowser => {\n const pages = new Map<string, Page>();\n const calls: Array<MutableCall> = [];\n const armed = new Map<ScriptableOperation, Array<ScriptedOutcome>>();\n const connections: Array<ScriptedConnection> = [];\n const live = new Set<Live>();\n let latest: Live | undefined;\n /** The page last selected by any connection: where the control's document operations act. */\n let lastSelected: string | undefined;\n let attempts = 0;\n let sequence = 0;\n let pageSerial = 0;\n let observationSerial = 0;\n let suspensionSerial = 0;\n let downloadSerial = 0;\n let lastTimestamp = 1_700_000_000_000;\n\n const state = (document: DocumentScript): DocumentState => ({\n url: document.url,\n title: document.title ?? \"\",\n text: document.text,\n ...(document.documentScroll === undefined\n ? {}\n : { documentScroll: { ...document.documentScroll } }),\n controls: (document.controls ?? []).map(controlState),\n });\n\n const documentFor = (url: string): DocumentState => {\n const listed = script.documents.find((document) => document.url === url);\n\n return state(listed ?? { url, text: \"\" });\n };\n\n const createPage = (document: DocumentState, registered: boolean): Page => {\n const serial = ++pageSerial;\n\n const page: Page = {\n pageId: `page-${serial}`,\n targetId: `target-${serial}`,\n frameId: `frame-${serial}`,\n document,\n epoch: 0,\n registeredEpoch: registered ? 0 : -1,\n values: new Map(),\n files: new Map(),\n scroll: { x: 0, y: 0 },\n mutations: 0,\n focused: undefined,\n closed: false,\n held: undefined,\n navigation: undefined,\n watchers: new Set(),\n capture: undefined,\n };\n\n pages.set(page.pageId, page);\n for (const connection of live) connection.opened(page.pageId);\n\n return page;\n };\n\n const openPages = () => [...pages.values()].filter((page) => !page.closed);\n\n const notify = (page: Page) => {\n const watchers = Array.from(page.watchers);\n\n for (const watcher of watchers) watcher();\n };\n\n /** The page shows a new document: nodes go stale, values reset, captures learn of it. */\n const commit = (page: Page, document: DocumentState) => {\n page.document = document;\n page.cachedTitle = undefined;\n page.epoch++;\n page.values.clear();\n page.files.clear();\n page.focused = undefined;\n page.scroll.x = 0;\n page.scroll.y = 0;\n page.mutations++;\n page.navigation = undefined;\n for (const connection of live) connection.retire(page.pageId);\n for (const connection of live) connection.navigated(page.pageId, false);\n if (page.capture !== undefined) {\n const { start } = page.capture;\n\n if (start.document === undefined) start.invalidate(\"target-changed\");\n else start.document(document.url, false);\n }\n notify(page);\n for (const connection of live) connection.announce(page.pageId);\n };\n\n /** In-document change: identity survives by control id, so retained nodes and waits carry on. */\n const update = (page: Page, document: DocumentScript) => {\n const previousUrl = page.document.url;\n const before = JSON.stringify(page.document);\n const previous = new Map(page.document.controls.map((control) => [control.script.id, control]));\n\n const controls = (document.controls ?? []).map((script): ControlState => {\n const existing = previous.get(script.id);\n\n if (existing === undefined) return controlState(script);\n existing.script = script;\n if (script.checked !== undefined) existing.checked = script.checked;\n if (script.selected !== undefined) existing.selected = script.selected;\n\n return existing;\n });\n\n page.document = {\n url: document.url,\n title: document.title ?? \"\",\n text: document.text,\n ...(document.documentScroll === undefined\n ? {}\n : { documentScroll: { ...document.documentScroll } }),\n controls,\n };\n if (JSON.stringify(page.document) !== before) page.mutations++;\n if (page.focused !== undefined && !previous.has(page.focused)) page.focused = undefined;\n if (previousUrl !== document.url) {\n for (const connection of live) connection.navigated(page.pageId, true);\n page.capture?.start.document?.(document.url, true);\n }\n notify(page);\n };\n\n const take = (operation: ScriptableOperation): ScriptedOutcome | undefined => {\n const queue = armed.get(operation);\n const next = queue?.shift();\n\n if (queue !== undefined && queue.length === 0) armed.delete(operation);\n\n return next;\n };\n\n const internalGate = (gate: Gate): InternalGate => {\n const internal = gates.get(gate);\n\n if (internal === undefined)\n throw new Error(\"A scripted gate must come from the browser it holds\");\n\n return internal;\n };\n\n /** Only a mutation's Ticket carries dispatch evidence; a read's ticket has none to give. */\n const isTicket = (ticket: ReadTicket): ticket is Ticket => \"dispatch\" in ticket;\n\n const connect = (options: DriverOptions, events: DriverEvents): Driver => {\n const ordinal = attempts++;\n\n if (script.connections?.[ordinal] === \"refuse\") {\n connections.push(\"refused\");\n throw new Error(\"The scripted browser refused this connection\");\n }\n\n const bindings: ReadonlyArray<NativeBinding> = options.bindings ?? [];\n const viewport: Viewport = { ...options.viewport };\n // Chromium keeps a pointer position per page; a receipt reports the one placed on its page.\n const positions = new Map<string, ViewportPoint>();\n let pointer: ViewportPoint | null = null;\n let selectedId: string | undefined;\n const snapshots = new Map<string, Snapshot>();\n const privateSnapshots = new Set<Snapshot>();\n const resolvedElements = new WeakMap<ResolvedElement, ResolvedNode>();\n let disconnected = false;\n let index = -1;\n\n const place = (pageId: string, point: ViewportPoint) => {\n positions.set(pageId, point);\n pointer = point;\n };\n\n const invalidatePointer = (pageId: string) => {\n positions.delete(pageId);\n if (selectedId === pageId) pointer = null;\n };\n\n const dispatchObservers = new WeakMap<MutableCall, () => void>();\n\n const receipt = (pageId: string): NativeInput => ({ position: positions.get(pageId) ?? null });\n\n const select = (pageId: string | undefined) => {\n const previous = selectedId;\n\n selectedId = pageId;\n lastSelected = pageId;\n for (const id of previous === pageId ? [pageId] : [previous, pageId]) {\n const page = id === undefined ? undefined : pages.get(id);\n\n if (page !== undefined && !page.closed)\n events.pageLifecycle?.({ _tag: \"Display\", page: cachedPage(page) });\n }\n };\n\n const selectedPage = (operation: BrowserOperation = \"target\"): Page => {\n const page = selectedId === undefined ? undefined : pages.get(selectedId);\n\n if (disconnected || page === undefined || page.closed)\n throw fail(operation, Reasons.Closed.make({}));\n\n return page;\n };\n\n const current = (target: DriverTarget, operation: BrowserOperation): Page => {\n if (disconnected) throw fail(operation, Reasons.Closed.make({}));\n const page = pages.get(target.pageId);\n\n if (page === undefined || page.closed || page.frameId !== target.frameId)\n throw fail(operation, Reasons.Stale.make({}));\n\n return page;\n };\n\n const pageOf = (info: PageInfo, operation: BrowserOperation): Page => {\n const page = pages.get(info.pageId);\n\n if (page === undefined) throw fail(operation, Reasons.NotFound.make({}));\n if (page.closed || page.targetId !== info.targetId)\n throw fail(operation, Reasons.Stale.make({}));\n\n return page;\n };\n\n const cachedPage = (page: Page): NativeCachedPage =>\n Object.freeze({\n pageId: page.pageId,\n frameId: page.frameId,\n targetId: page.targetId,\n documentEpoch: page.epoch,\n url: page.document.url.length <= 8192 ? page.document.url : null,\n urlQualification: page.document.url.length <= 8192 ? \"NativeCached\" : \"Omitted\",\n title: page.cachedTitle ?? null,\n titleQualification:\n page.cachedTitle === undefined\n ? \"Unread\"\n : page.cachedTitle === null\n ? \"Omitted\"\n : \"ObservedCached\",\n selected: page.pageId === selectedId,\n displayState:\n options.pageControl === true\n ? page.held === undefined\n ? \"running\"\n : \"suspended\"\n : \"unknown\",\n });\n\n const info = (page: Page): PageInfo => {\n page.cachedTitle = page.document.title.length <= 512 ? page.document.title : null;\n\n const value = PageInfo.make({\n pageId: page.pageId,\n targetId: page.targetId,\n url: page.document.url,\n title: page.document.title,\n selected: page.pageId === selectedId,\n });\n\n events.pageLifecycle?.({ _tag: \"Metadata\", page: cachedPage(page) });\n\n return value;\n };\n\n const picture = (page: Page, ticket: Ticket): Uint8Array => {\n const target = { pageId: page.pageId, frameId: page.frameId };\n const geometry = pngGeometry(PNG);\n\n ticket.picture?.({ phase: \"Requested\", target, documentEpoch: page.epoch, geometry });\n const bytes = new Uint8Array(PNG);\n\n ticket.picture?.({\n phase: \"Returned\",\n target,\n documentEpoch: page.epoch,\n geometry,\n byteLength: bytes.length,\n });\n\n return bytes;\n };\n\n const frameInfo = (page: Page): FrameInfo =>\n FrameInfo.make({\n frameId: page.frameId,\n parentFrameId: null,\n url: page.document.url,\n name: \"\",\n });\n\n const invalidateSnapshot = (scope: ObservationScope = \"all\", origin?: AbortSignal) => {\n for (const snapshot of [...snapshots.values(), ...privateSnapshots])\n if (\n scope !== \"none\" &&\n (scope === \"all\" ||\n (scope.pageId === snapshot.pageId &&\n (scope.frameId === undefined || scope.frameId === snapshot.frameId)))\n ) {\n if (privateSnapshots.has(snapshot) && origin !== undefined && snapshot.origin === origin)\n continue;\n snapshot.validity = \"invalid\";\n }\n };\n\n /** The page closes as a browser closes it: every connection learns, and nothing on it lasts. */\n const close = (target: Page) => {\n target.closed = true;\n target.navigation?.drop();\n target.capture?.start.invalidate(\"target-changed\");\n target.capture = undefined;\n notify(target);\n if (selectedId === target.pageId) select(undefined);\n snapshots.delete(target.frameId);\n events.pageClosed?.(target.pageId, cachedPage(target));\n events.invalidate(\"target-changed\", { pageId: target.pageId });\n for (const other of live) {\n if (other === connection) continue;\n other.closed(target.pageId);\n other.announce(target.pageId);\n }\n };\n\n /** This connection ends: what it held on the browser's pages ends with it. */\n const dropConnection = (announce: boolean, ended: ScriptedConnection = \"dropped\") => {\n if (disconnected) return;\n disconnected = true;\n invalidateSnapshot();\n snapshots.clear();\n privateSnapshots.clear();\n connections[index] = ended;\n live.delete(connection);\n for (const page of pages.values()) {\n if (page.navigation?.by === connection) page.navigation.drop();\n if (page.held?.by === connection) page.held = undefined;\n if (page.capture?.by === connection) page.capture = undefined;\n notify(page);\n }\n if (announce) events.disconnected();\n events.retired?.();\n };\n\n const dispatch = (ticket: ReadTicket, record: MutableCall) => {\n if (record.dispatched) return;\n if (isTicket(ticket)) ticket.dispatch();\n record.dispatched = true;\n dispatchObservers.get(record)?.();\n };\n\n /** Once the owner aborts the admitted call, its own check names the reason. */\n const aborted = (ticket: ReadTicket, operation: BrowserOperation): BrowserError => {\n try {\n ticket.check();\n } catch (error) {\n if (Schema.is(BrowserError)(error)) return error;\n }\n\n return fail(operation, Reasons.Interrupted.make({}), \"unknown\");\n };\n\n const hold = (\n gate: Gate,\n ticket: ReadTicket,\n operation: BrowserOperation,\n record: MutableCall,\n ): Promise<void> => {\n const internal = internalGate(gate);\n\n internal.reach();\n\n return new Promise<void>((resolve, reject) => {\n const onAbort = () => {\n cleanup();\n // The owner has already decided; the recorder must not lag behind its fiber.\n record.settled = \"failed\";\n reject(aborted(ticket, operation));\n };\n\n const cleanup = () => ticket.signal.removeEventListener(\"abort\", onAbort);\n\n if (ticket.signal.aborted) {\n onAbort();\n\n return;\n }\n ticket.signal.addEventListener(\"abort\", onAbort, { once: true });\n void internal.opened.then(() => {\n cleanup();\n resolve();\n });\n });\n };\n\n const applyArmed = async (\n operation: ScriptableOperation,\n ticket: ReadTicket,\n record: MutableCall,\n ): Promise<void> => {\n const outcome = take(operation);\n\n if (outcome === undefined) return;\n switch (outcome._tag) {\n case \"Fail\": {\n if (outcome.outcome === \"unknown\") dispatch(ticket, record);\n throw fail(operation, outcome.reason, outcome.outcome);\n }\n case \"Hold\": {\n if (outcome.dispatched) dispatch(ticket, record);\n await hold(outcome.gate, ticket, operation, record);\n ticket.check();\n\n return;\n }\n case \"Disconnect\": {\n if (outcome.dispatched === true) dispatch(ticket, record);\n dropConnection(true);\n throw fail(\n operation,\n Reasons.Disconnected.make({}),\n record.dispatched ? \"unknown\" : \"undispatched\",\n );\n }\n }\n };\n\n const attempt = async <A>(\n operation: ScriptableOperation,\n ticket: ReadTicket | undefined,\n meta: {\n readonly pageId?: string;\n readonly elementId?: string;\n readonly selector?: string;\n },\n body: (record: MutableCall) => Promise<A>,\n onDispatch?: () => void,\n ): Promise<A> => {\n const record: MutableCall = {\n sequence: ++sequence,\n operation,\n pageId: meta.pageId ?? selectedId ?? \"\",\n ...(meta.elementId === undefined ? {} : { elementId: meta.elementId }),\n ...(meta.selector === undefined ? {} : { selector: meta.selector }),\n dispatched: false,\n settled: \"pending\",\n };\n\n calls.push(record);\n if (onDispatch !== undefined) dispatchObservers.set(record, onDispatch);\n try {\n ticket?.check();\n if (ticket !== undefined) await applyArmed(operation, ticket, record);\n const value = await body(record);\n\n record.settled = \"completed\";\n if (ticket !== undefined && isTicket(ticket)) ticket.acknowledge?.();\n\n return value;\n } catch (error) {\n record.settled = \"failed\";\n throw error;\n }\n };\n\n const meta = (target: string | ElementTarget | undefined) =>\n target === undefined\n ? {}\n : typeof target === \"string\"\n ? { selector: target }\n : {\n elementId:\n \"_tag\" in target ? resolvedElements.get(target)?.node.script.id : target.elementId,\n };\n\n const facts = (control: ControlState): ControlFacts => {\n const { script: value } = control;\n const extra = value.facts ?? {};\n\n return ControlFacts.make({\n kind: value.kind,\n label: value.label,\n disabled: value.disabled ?? false,\n ...(control.checked === undefined ? {} : { checked: control.checked }),\n ...(control.selected === undefined ? {} : { selected: control.selected }),\n ...(value.required === undefined ? {} : { required: value.required }),\n ...(value.multiple === undefined ? {} : { multiple: value.multiple }),\n editable: extra.editable ?? isEditable(value),\n ...(value.inputType === undefined ? {} : { inputType: value.inputType }),\n ...(extra.autocomplete === undefined ? {} : { autocomplete: extra.autocomplete }),\n ...(value.destination === undefined || value.destination.length > 2048\n ? {}\n : { destination: value.destination }),\n ...(extra.formMethod === undefined ? {} : { formMethod: extra.formMethod }),\n box: ViewportRect.make(extra.box ?? { x: 0, y: 0, width: 120, height: 24 }),\n placement: extra.placement ?? (value.offscreen === true ? \"outside\" : \"inside\"),\n hitTest: extra.hitTest ?? (value.offscreen === true ? \"unsampled\" : \"self\"),\n mainFrame: true,\n });\n };\n\n const observed = (control: ControlState): ObservedControl => {\n const { script: value } = control;\n\n return ObservedControl.make({\n elementId: value.id,\n kind: value.kind,\n label: value.label,\n disabled: value.disabled ?? false,\n ...(control.checked === undefined ? {} : { checked: control.checked }),\n ...(control.selected === undefined ? {} : { selected: control.selected }),\n ...(value.inputType === undefined ? {} : { inputType: value.inputType }),\n ...(value.required === undefined ? {} : { required: value.required }),\n ...(value.multiple === undefined ? {} : { multiple: value.multiple }),\n ...(value.selectElementId === undefined ? {} : { selectElementId: value.selectElementId }),\n });\n };\n\n const bySelector = (page: Page, selector: string, operation: BrowserOperation) => {\n const id = selector.startsWith(\"#\") ? selector.slice(1) : undefined;\n\n const control =\n id === undefined ? undefined : page.document.controls.find((c) => c.script.id === id);\n\n if (control === undefined) throw fail(operation, Reasons.NotFound.make({}));\n\n return control;\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 operation: BrowserOperation,\n allowSuspended = false,\n attached = true,\n browserTarget: DriverTarget,\n ) => {\n ticket.check();\n const stale = () => fail(operation, Reasons.Stale.make({}));\n const page = current(browserTarget, operation);\n const snapshot = snapshots.get(page.frameId);\n\n if (\n snapshot === undefined ||\n snapshot.pageId !== page.pageId ||\n snapshot.id !== target.observationId\n )\n throw stale();\n const node = snapshot.nodes.get(target.elementId);\n\n if (node === undefined) throw stale();\n if (snapshot.validity === \"invalid\" || snapshot.generation !== ticket.generation)\n throw stale();\n if (page.epoch !== snapshot.epoch) throw stale();\n if (\n snapshot.validity === \"suspended\" &&\n !allowSuspended &&\n !snapshot.revalidated.has(target.elementId)\n )\n throw stale();\n if (attached && !page.document.controls.includes(node)) throw stale();\n\n return { node, page, snapshot };\n };\n\n const privateRetained = (\n target: ResolvedElement,\n ticket: ReadTicket,\n operation: BrowserOperation,\n browserTarget: DriverTarget,\n attached = true,\n ) => {\n ticket.check();\n const record = resolvedElements.get(target);\n const page = current(browserTarget, operation);\n\n if (\n record === undefined ||\n record.snapshot.validity !== \"valid\" ||\n !privateSnapshots.has(record.snapshot) ||\n record.snapshot.generation !== ticket.generation ||\n record.snapshot.pageId !== page.pageId ||\n record.snapshot.frameId !== page.frameId ||\n record.snapshot.epoch !== page.epoch ||\n (attached && !page.document.controls.includes(record.node)) ||\n (record.parent !== undefined &&\n (!page.document.controls.includes(record.parent) ||\n record.node.script.selectElementId !== record.parent.script.id))\n )\n throw fail(operation, Reasons.Stale.make({}));\n\n return { ...record, page };\n };\n\n const retainedElement = (\n target: ElementTarget,\n ticket: ReadTicket,\n operation: BrowserOperation,\n allowSuspended = false,\n attached = true,\n browserTarget: DriverTarget,\n ) =>\n \"_tag\" in target\n ? privateRetained(target, ticket, operation, browserTarget, attached)\n : retained(target, ticket, operation, allowSuspended, attached, browserTarget);\n\n const sample = (\n node: ControlState,\n fresh: ControlFacts,\n scope: \"document\" | \"viewport\",\n descriptor?: Descriptor,\n ): DescriptorSample => ({\n facts: fresh,\n scope,\n frameComplete: true,\n completeness: {\n label: \"complete\",\n inputType: node.script.inputType === undefined ? \"absent\" : \"complete\",\n autocomplete: node.script.facts?.autocomplete === undefined ? \"absent\" : \"complete\",\n destination:\n node.script.destination === undefined\n ? \"absent\"\n : node.script.destination.length > 2048\n ? \"omitted\"\n : \"complete\",\n formMethod: node.script.facts?.formMethod === undefined ? \"absent\" : \"complete\",\n },\n ...(descriptor?.ordinal === undefined ? {} : { ordinal: descriptor.ordinal }),\n });\n\n const resolve = (\n target: string | ElementTarget,\n ticket: ReadTicket,\n operation: BrowserOperation,\n policy: AdmissionPolicy | undefined,\n browserTarget: DriverTarget,\n allowSuspended = false,\n enablement = false,\n ) => {\n let node: ControlState;\n let page: Page;\n\n if (typeof target === \"string\") {\n page = current(browserTarget, operation);\n node = bySelector(page, target, operation);\n } else {\n ({ node, page } = retainedElement(\n target,\n ticket,\n operation,\n allowSuspended,\n true,\n browserTarget,\n ));\n }\n const fresh = facts(node);\n const captured = ControlFacts.make({ ...fresh, box: ViewportRect.make({ ...fresh.box }) });\n\n const privateTarget =\n typeof target !== \"string\" && \"_tag\" in target ? resolvedElements.get(target) : undefined;\n\n if (\n privateTarget !== undefined &&\n (enablement\n ? stableIdentityOf(fresh) !== privateTarget.stable\n : identityOf(fresh) !== privateTarget.identity)\n )\n throw fail(operation, Reasons.Stale.make({}));\n\n // A form step's control may have become enabled since it was observed; it must be now.\n if (enablement && node.script.disabled === true)\n throw fail(operation, Reasons.Disabled.make({}));\n if (policy !== undefined) {\n let admitted = false;\n\n try {\n admitted = policy(fresh) === true;\n } catch {\n admitted = false;\n }\n if (!admitted) throw fail(operation, Reasons.Denied.make({}));\n }\n ticket.check();\n if (isTicket(ticket)) {\n const scope =\n privateTarget?.scope ??\n (typeof target === \"string\"\n ? \"document\"\n : (snapshots.get(page.frameId)?.scope ?? \"document\"));\n\n ticket.captureTarget?.(target, sample(node, captured, scope, privateTarget?.descriptor));\n }\n\n return { node, page, facts: fresh };\n };\n\n /** The complete scripted document, never a previously clipped observation, proves cardinality. */\n const descriptorNode = (\n descriptor: Descriptor,\n page: Page,\n operation: BrowserOperation,\n contextual: boolean,\n parent?: ControlState,\n ): ControlState => {\n if (descriptor.frame !== undefined) throw fail(operation, Reasons.Unsupported.make({}));\n\n const matches = page.document.controls.filter((node) => {\n const fresh = facts(node);\n const identity = descriptor.identity;\n\n return (\n fresh.kind === descriptor.kind &&\n fresh.label === descriptor.label &&\n (parent === undefined ||\n (parent.script.kind === \"select\" &&\n node.script.selectElementId === parent.script.id)) &&\n (descriptor.destination === undefined || fresh.destination === descriptor.destination) &&\n (identity?.inputType === undefined || fresh.inputType === identity.inputType) &&\n (identity?.autocomplete === undefined || fresh.autocomplete === identity.autocomplete) &&\n (identity?.formMethod === undefined || fresh.formMethod === identity.formMethod)\n );\n });\n\n const viewportMatches = matches.filter((node) => facts(node).hitTest === \"self\");\n\n if (descriptor.matchScope === \"viewport\") {\n if (\n matches.some((node) => {\n const fresh = facts(node);\n\n return fresh.hitTest === \"uncertain\" && fresh.placement !== \"outside\";\n })\n )\n throw fail(operation, Reasons.Incomplete.make({}));\n if (!contextual && matches.length > 1)\n throw fail(operation, Reasons.Ambiguous.make({ count: matches.length }));\n }\n const candidates = descriptor.matchScope === \"viewport\" ? viewportMatches : matches;\n\n if (candidates.length === 0) throw fail(operation, Reasons.Missing.make({}));\n if (descriptor.ordinal !== undefined && descriptor.ordinal.of !== candidates.length)\n throw fail(operation, Reasons.Incomplete.make({}));\n if (descriptor.ordinal === undefined && candidates.length !== 1)\n throw fail(operation, Reasons.Ambiguous.make({ count: candidates.length }));\n const picked = candidates[descriptor.ordinal?.index ?? 0];\n\n if (picked === undefined) throw fail(operation, Reasons.Incomplete.make({}));\n\n return picked;\n };\n\n const expectations = (\n conditions: ReadonlyArray<Precondition>,\n ticket: Ticket,\n browserTarget: DriverTarget,\n ): void => {\n ticket.check();\n const page = current(browserTarget, \"run\");\n const size = page.viewport ?? viewport;\n\n if (conditions.length > 16)\n throw fail(\n \"run\",\n Reasons.Limit.make({ dimension: \"controls\", maximum: 16, observed: conditions.length }),\n );\n for (const condition of conditions) {\n ticket.check();\n let matches: boolean;\n\n switch (condition._tag) {\n case \"Origin\":\n matches = originOf(page.document.url) === condition.value;\n break;\n case \"Path\":\n matches = new URL(page.document.url).pathname === condition.value;\n break;\n case \"Viewport\":\n matches = size.width === condition.width && size.height === condition.height;\n break;\n case \"Scroll\":\n matches = page.scroll.x === condition.x && page.scroll.y === condition.y;\n break;\n case \"Text\":\n if (condition.scope === \"viewport\") throw fail(\"run\", Reasons.Unsupported.make({}));\n matches =\n condition.match === \"equals\"\n ? page.document.text === condition.value\n : page.document.text.includes(condition.value);\n break;\n case \"Geometry\": {\n const node = descriptorNode(condition.target, page, \"run\", false);\n const box = facts(node).box;\n\n matches =\n box.x === condition.box.x &&\n box.y === condition.box.y &&\n box.width === condition.box.width &&\n box.height === condition.box.height;\n break;\n }\n }\n if (!matches) throw fail(\"run\", Reasons.Denied.make({}));\n }\n ticket.check();\n };\n\n const resolveGroup = (\n requests: ReadonlyArray<ResolveRequest>,\n ticket: Ticket,\n browserTarget: DriverTarget,\n guard: ResolveGuard,\n ): ResolvedGroup => {\n ticket.check();\n const page = current(browserTarget, \"resolve\");\n\n if (requests.length === 0 || requests.length > MaximumGroupNodes)\n throw fail(\n \"resolve\",\n Reasons.Limit.make({\n dimension: \"controls\",\n maximum: MaximumGroupNodes,\n observed: requests.length,\n }),\n );\n if (guard._tag === \"ViewportContext\") expectations(guard.before, ticket, browserTarget);\n const retainedSnapshots = [...snapshots.values(), ...privateSnapshots];\n\n const perPage = retainedSnapshots.filter(\n (snapshot) => snapshot.pageId === page.pageId,\n ).length;\n\n const pageMaximum = options.observationLimits?.maxSnapshotsPerPage ?? 16;\n const sessionMaximum = options.observationLimits?.maxSnapshotsPerSession ?? 64;\n\n if (perPage >= pageMaximum || retainedSnapshots.length >= sessionMaximum)\n throw fail(\n \"resolve\",\n Reasons.Limit.make({\n dimension: \"observation-snapshots\",\n maximum: perPage >= pageMaximum ? pageMaximum : sessionMaximum,\n observed: perPage >= pageMaximum ? perPage + 1 : retainedSnapshots.length + 1,\n }),\n );\n\n const snapshot: Snapshot = {\n id: `observation-${++observationSerial}`,\n pageId: page.pageId,\n frameId: page.frameId,\n epoch: page.epoch,\n generation: ticket.generation,\n scope: \"document\",\n validity: \"valid\",\n nodes: new Map(),\n identities: new Map(),\n revalidated: new Set(),\n };\n\n const elements: ResolvedElement[] = [];\n const records: ResolvedNode[] = [];\n const samples: Array<DescriptorSample | undefined> = [];\n\n privateSnapshots.add(snapshot);\n\n const release = async (): Promise<void> => {\n snapshot.validity = \"invalid\";\n privateSnapshots.delete(snapshot);\n };\n\n try {\n for (const [index, request] of requests.entries()) {\n ticket.check();\n if (\n request.parent !== undefined &&\n (!Number.isInteger(request.parent) || request.parent < 0 || request.parent >= index)\n )\n throw fail(\"resolve\", Reasons.Malformed.make({}));\n const parent = request.parent === undefined ? undefined : records[request.parent]?.node;\n let node: ControlState;\n let scope: \"document\" | \"viewport\";\n let identity: string;\n let stable: string;\n\n if (request.target._tag === \"Ref\") {\n const source = retained(\n request.target.reference,\n ticket,\n \"resolve\",\n false,\n true,\n browserTarget,\n );\n\n const captured = source.snapshot.identities.get(request.target.reference.elementId);\n\n if (captured === undefined) throw fail(\"resolve\", Reasons.Incomplete.make({}));\n node = source.node;\n scope = source.snapshot.scope;\n ({ identity, stable } = captured);\n } else {\n node = descriptorNode(\n request.target.descriptor,\n page,\n \"resolve\",\n guard._tag === \"ViewportContext\",\n parent,\n );\n scope = request.target.descriptor.matchScope;\n const fresh = facts(node);\n\n identity = identityOf(fresh);\n stable = stableIdentityOf(fresh);\n }\n if (\n parent !== undefined &&\n (parent.script.kind !== \"select\" || node.script.selectElementId !== parent.script.id)\n )\n throw fail(\"resolve\", Reasons.Stale.make({}));\n\n const element: ResolvedElement = Object.freeze({\n _tag: \"ResolvedElement\",\n target: Object.freeze({ pageId: page.pageId, frameId: page.frameId }),\n });\n\n const record: ResolvedNode = {\n node,\n snapshot,\n scope,\n identity,\n stable,\n ...(parent === undefined ? {} : { parent }),\n ...(request.target._tag === \"Descriptor\"\n ? { descriptor: request.target.descriptor }\n : {}),\n };\n\n snapshot.nodes.set(node.script.id, node);\n snapshot.identities.set(node.script.id, { identity, stable });\n resolvedElements.set(element, record);\n elements.push(element);\n records.push(record);\n samples.push(\n request.target._tag === \"Descriptor\" ||\n (request.captureInitial === true && ticket.captureTarget !== undefined)\n ? sample(node, facts(node), scope, record.descriptor)\n : undefined,\n );\n }\n ticket.check();\n\n return {\n elements: Object.freeze(elements),\n samples: Object.freeze(samples),\n activate: (next) => {\n for (const element of elements) privateRetained(element, next, \"run\", browserTarget);\n snapshot.origin = next.signal;\n },\n release,\n };\n } catch (error) {\n snapshot.validity = \"invalid\";\n privateSnapshots.delete(snapshot);\n throw error;\n }\n };\n\n const requireRunning = (page: Page, operation: BrowserOperation) => {\n if (page.held !== undefined) throw fail(operation, Reasons.Busy.make({}));\n };\n\n const heldObservation = (pageId: string) => {\n for (const snapshot of snapshots.values())\n if (snapshot.pageId === pageId && snapshot.validity === \"valid\") {\n snapshot.validity = \"suspended\";\n snapshot.revalidated.clear();\n }\n };\n\n const activate = (page: Page, node: ControlState) => {\n const { script: value } = node;\n\n page.focused = value.id;\n if (value.kind === \"input\" && value.inputType === \"checkbox\") node.checked = !node.checked;\n if (value.kind === \"input\" && value.inputType === \"radio\") node.checked = true;\n const target = value.destination ?? value.activates;\n\n if (target !== undefined) commit(page, documentFor(target));\n\n return page.document.url;\n };\n\n const focusedOrRefuse = (\n into: string | ElementTarget | undefined,\n ticket: ReadTicket,\n operation: BrowserOperation,\n policy: AdmissionPolicy | undefined,\n browserTarget: DriverTarget,\n ) => {\n if (into === undefined) return current(browserTarget, operation);\n const { node, page } = resolve(into, ticket, operation, policy, browserTarget);\n\n if (page.focused !== node.script.id) throw fail(operation, Reasons.NotFocused.make({}));\n\n return page;\n };\n\n const typed = (page: Page, text: string) => {\n const focused =\n page.focused === undefined\n ? undefined\n : page.document.controls.find((control) => control.script.id === page.focused);\n\n if (focused !== undefined && isEditable(focused.script))\n page.values.set(focused.script.id, (page.values.get(focused.script.id) ?? \"\") + text);\n };\n\n /** Issued options of one select, refused exactly where native selection refuses them. */\n const chosen = (\n page: Page,\n node: ControlState,\n ids: Selection,\n ticket: Ticket,\n operation: BrowserOperation,\n enablement = false,\n ) => {\n if (!isSelectable(node.script.kind)) throw fail(operation, Reasons.Unsupported.make({}));\n\n const options = ids.map((id) => {\n let option: ControlState;\n\n if (typeof id === \"string\") {\n const snapshot = snapshots.get(page.frameId);\n const kept = snapshot?.nodes.get(id);\n\n if (\n snapshot === undefined ||\n kept === undefined ||\n snapshot.nodes.get(node.script.id) !== node\n )\n throw fail(operation, Reasons.Stale.make({}));\n option = kept;\n } else {\n const kept = privateRetained(id, ticket, operation, {\n pageId: page.pageId,\n frameId: page.frameId,\n });\n\n const fresh = facts(kept.node);\n\n if (\n kept.parent !== node ||\n (enablement\n ? stableIdentityOf(fresh) !== kept.stable\n : identityOf(fresh) !== kept.identity)\n )\n throw fail(operation, Reasons.Stale.make({}));\n option = kept.node;\n }\n if (\n option.script.selectElementId !== node.script.id ||\n !page.document.controls.includes(option)\n )\n throw fail(operation, Reasons.Stale.make({}));\n ticket.captureTarget?.(\n typeof id === \"string\"\n ? ObservedElement.make({\n observationId: snapshots.get(page.frameId)?.id ?? \"\",\n elementId: id,\n })\n : id,\n sample(\n option,\n facts(option),\n typeof id === \"string\"\n ? (snapshots.get(page.frameId)?.scope ?? \"document\")\n : (resolvedElements.get(id)?.scope ?? \"document\"),\n typeof id === \"string\" ? undefined : resolvedElements.get(id)?.descriptor,\n ),\n );\n\n return option;\n });\n\n if (\n node.script.disabled === true ||\n options.some((option) => option.script.disabled === true)\n )\n throw fail(operation, Reasons.Disabled.make({}));\n if (node.script.multiple !== true && options.length > 1)\n throw fail(operation, Reasons.Unsupported.make({}));\n\n return options;\n };\n\n const choose = (page: Page, node: ControlState, options: ReadonlyArray<ControlState>) => {\n if (node.script.multiple !== true)\n for (const candidate of page.document.controls)\n if (candidate.script.selectElementId === node.script.id) candidate.selected = false;\n for (const option of options) option.selected = true;\n page.focused = node.script.id;\n };\n\n /** A control's private state after a form step. It is compared here and never returned. */\n const fieldState = (page: Page, node: ControlState): string => {\n const { script: value } = node;\n\n if (node.checked !== undefined) return JSON.stringify([\"checked\", node.checked]);\n if (value.kind === \"select\")\n return JSON.stringify([\n \"options\",\n page.document.controls\n .filter((option) => option.script.selectElementId === value.id && option.selected)\n .map((option) => option.script.id),\n ]);\n if (value.kind === \"input\" || value.kind === \"textarea\" || value.facts?.editable === true)\n return JSON.stringify([\"value\", page.values.get(value.id) ?? \"\"]);\n\n return JSON.stringify([\"other\"]);\n };\n\n /** One form step, as the real driver takes it; see `Driver[\"formStep\"]`. */\n const formStep = async (\n page: Page,\n node: ControlState,\n field: FormStep,\n ticket: Ticket,\n record: MutableCall,\n capture: InputCapture,\n ) => {\n const epoch = page.epoch;\n let act: (() => void | Promise<void>) | undefined;\n let input: InputReceipt | undefined;\n\n if (field.options !== undefined) {\n const options = chosen(page, node, field.options, ticket, \"fill-form\", true);\n\n act = () => choose(page, node, options);\n } else if (field.checked !== undefined) {\n if (node.checked === undefined) throw fail(\"fill-form\", Reasons.Unsupported.make({}));\n if (node.checked !== field.checked) {\n if (!field.checked && node.script.inputType === \"radio\")\n throw fail(\"fill-form\", Reasons.Unsupported.make({}));\n act = async () => {\n // The scripted engine has no browser cursor point for an element click either.\n invalidatePointer(page.pageId);\n input = await capture(\n async () => {\n activate(page, node);\n },\n { position: null },\n );\n };\n }\n } else {\n const text = field.value ?? \"\";\n const refusal = textRefusal(node.script, text);\n\n if (refusal !== undefined) throw fail(\"fill-form\", refusal);\n act = () => {\n page.values.set(node.script.id, text);\n // The step then leaves the control, as a person moving on would.\n page.focused = undefined;\n };\n }\n if (act !== undefined) {\n dispatch(ticket, record);\n await act();\n }\n\n // A step that navigated away cannot be read back, which is never a failure of its own.\n const state =\n page.epoch === epoch && !page.closed && page.document.controls.includes(node)\n ? fieldState(page, node)\n : undefined;\n\n return {\n status: act === undefined ? (\"unchanged\" as const) : (\"set\" as const),\n reached:\n field.checked === undefined ||\n state === undefined ||\n state === JSON.stringify([\"checked\", field.checked]),\n state,\n url: page.document.url,\n ...(input === undefined ? {} : { input }),\n };\n };\n\n const inFlight = (\n page: Page,\n url: string,\n outcome: ScriptedOutcome,\n timeoutMillis: number,\n record: MutableCall,\n ): Promise<string> =>\n new Promise<string>((resolve, reject) => {\n let done = false;\n const timer = timers.sleep(timeoutMillis);\n\n const finish = (settle: () => void) => {\n if (done) return;\n done = true;\n timer.cancel();\n if (page.navigation === flight) page.navigation = undefined;\n settle();\n };\n\n const failed = (reason: BrowserReason) =>\n finish(() => {\n record.settled = \"failed\";\n reject(fail(\"navigate\", reason, \"unknown\"));\n });\n\n const flight: InFlight = {\n stop: () => failed(Reasons.Interrupted.make({})),\n drop: () => failed(Reasons.Disconnected.make({})),\n by: connection,\n };\n\n page.navigation = flight;\n timer.done.then(\n () => failed(Reasons.Timeout.make({})),\n () => {},\n );\n switch (outcome._tag) {\n case \"Fail\": {\n failed(outcome.reason);\n\n return;\n }\n case \"Disconnect\": {\n dropConnection(true);\n\n return;\n }\n case \"Hold\": {\n const gate = internalGate(outcome.gate);\n\n gate.reach();\n void gate.opened.then(() =>\n finish(() => {\n commit(page, documentFor(url));\n resolve(url);\n }),\n );\n }\n }\n });\n\n const waitUntil = (\n ticket: WaitTicket,\n page: Page,\n operation: BrowserOperation,\n record: MutableCall,\n satisfied: () => boolean,\n detached: () => boolean,\n ): Promise<void> =>\n new Promise<void>((resolve, reject) => {\n const cleanup = () => {\n page.watchers.delete(check);\n ticket.signal.removeEventListener(\"abort\", onAbort);\n ticket.retire();\n };\n\n const onAbort = () => {\n cleanup();\n record.settled = \"failed\";\n reject(aborted(ticket, operation));\n };\n\n const check = () => {\n try {\n ticket.check();\n if (disconnected) throw fail(operation, Reasons.Disconnected.make({}));\n if (detached()) throw fail(operation, Reasons.Stale.make({}));\n if (!satisfied()) return;\n cleanup();\n resolve();\n } catch (error) {\n cleanup();\n record.settled = \"failed\";\n reject(error);\n }\n };\n\n if (ticket.signal.aborted) {\n onAbort();\n\n return;\n }\n ticket.signal.addEventListener(\"abort\", onAbort, { once: true });\n page.watchers.add(check);\n check();\n });\n\n /** Quiet in the finite scripted source; the actual Chromium observer owns native root metrics. */\n const waitSettled = (\n options: SettledOptions,\n ticket: WaitTicket,\n page: Page,\n record: MutableCall,\n ): Promise<SettledEvidence> =>\n new Promise<SettledEvidence>((resolve, reject) => {\n const epoch = page.epoch;\n const started = ticket.deadline - ticket.remainingMillis();\n const elapsed = () => Math.max(0, ticket.deadline - ticket.remainingMillis() - started);\n\n const geometry = () =>\n JSON.stringify(page.document.controls.map((node) => facts(node).box));\n\n const size = () => page.viewport ?? viewport;\n let previousGeometry = geometry();\n let previousViewport = JSON.stringify(size());\n let previousScroll = JSON.stringify(page.scroll);\n let previousMutations = page.mutations;\n let lastChanged = 0;\n let samples = 0;\n let mutations = 0;\n let scrollChanges = 0;\n let geometryChanges = 0;\n let viewportChanges = 0;\n let finished = false;\n let timer: ReturnType<EngineTimers[\"sleep\"]> | undefined;\n\n const cleanup = () => {\n timer?.cancel();\n timer = undefined;\n page.watchers.delete(check);\n ticket.signal.removeEventListener(\"abort\", onAbort);\n };\n\n const failWait = (error: unknown) => {\n if (finished) return;\n finished = true;\n cleanup();\n record.settled = \"failed\";\n reject(error);\n };\n\n const onAbort = () => failWait(aborted(ticket, \"settled\"));\n\n const check = () => {\n if (finished) return;\n try {\n ticket.check();\n if (disconnected) throw fail(\"settled\", Reasons.Disconnected.make({}));\n if (page.closed || page.epoch !== epoch) throw fail(\"settled\", Reasons.Stale.make({}));\n const now = elapsed();\n const nextGeometry = geometry();\n const nextViewport = JSON.stringify(size());\n const nextScroll = JSON.stringify(page.scroll);\n\n const changed =\n page.mutations !== previousMutations ||\n nextGeometry !== previousGeometry ||\n nextViewport !== previousViewport ||\n nextScroll !== previousScroll;\n\n samples = Math.min(Number.MAX_SAFE_INTEGER, samples + 1);\n mutations = Math.min(\n Number.MAX_SAFE_INTEGER,\n mutations + Math.max(0, page.mutations - previousMutations),\n );\n if (nextGeometry !== previousGeometry) geometryChanges++;\n if (nextViewport !== previousViewport) viewportChanges++;\n if (nextScroll !== previousScroll) scrollChanges++;\n previousMutations = page.mutations;\n previousGeometry = nextGeometry;\n previousViewport = nextViewport;\n previousScroll = nextScroll;\n if (changed) lastChanged = now;\n if (now >= options.withinMillis) throw fail(\"settled\", Reasons.Timeout.make({}));\n if (now - lastChanged >= options.quietMillis) {\n finished = true;\n cleanup();\n resolve({\n quietMillis: options.quietMillis,\n withinMillis: options.withinMillis,\n observedMillis: now,\n signals: [\"dom-mutation\", \"scroll\", \"root-geometry\", \"viewport\"],\n samples,\n mutations,\n scrollChanges,\n geometryChanges,\n viewportChanges,\n visibility: \"visible\",\n });\n\n return;\n }\n timer?.cancel();\n timer = timers.sleep(\n Math.min(\n 25,\n options.quietMillis - (now - lastChanged),\n options.withinMillis - now,\n ticket.remainingMillis(),\n ),\n );\n timer.done.then(check, () => {});\n } catch (error) {\n failWait(error);\n }\n };\n\n if (ticket.signal.aborted) {\n onAbort();\n\n return;\n }\n ticket.signal.addEventListener(\"abort\", onAbort, { once: true });\n page.watchers.add(check);\n check();\n });\n\n const invokeBinding = async (\n name: string,\n input: unknown,\n origin: string | undefined,\n ): Promise<BindingReply> => {\n const binding = bindings.find((candidate) => candidate.name === name);\n\n if (binding === undefined) return { ok: false };\n const page = selectedId === undefined ? undefined : pages.get(selectedId);\n const epoch = page?.epoch;\n const documentOrigin = origin ?? (page === undefined ? \"null\" : originOf(page.document.url));\n const text = JSON.stringify(input) ?? \"null\";\n\n const error = (reason: InitializationError[\"reason\"]) =>\n InitializationError.make({ operation: \"callback\", step: name, reason });\n\n const check = async (signal: AbortSignal) => {\n if (disconnected || signal.aborted) throw error(\"closed\");\n if (page === undefined || page.closed || page.epoch !== epoch) throw error(\"stale\");\n if (!binding.origins.includes(documentOrigin)) throw error(\"origin\");\n };\n\n try {\n const reply = await binding.invoke({\n origin: documentOrigin,\n read: async (signal) => {\n await check(signal);\n\n return text;\n },\n check,\n dispose: async () => {},\n });\n\n return { ok: true, output: JSON.parse(reply) as unknown };\n } catch {\n return { ok: false };\n }\n };\n\n if (pages.size === 0) {\n // The first page shows the starting document, and predates every registration.\n const startUrl = script.start ?? script.documents[0]?.url ?? \"https://scripted.invalid/\";\n const first = createPage(documentFor(startUrl), true);\n\n select(first.pageId);\n if (options.initialTargetId !== undefined && options.initialTargetId !== first.targetId)\n throw fail(\"connect\", Reasons.NotFound.make({}));\n if (options.newPage === true)\n select(createPage(state({ url: startUrl, text: \"\" }), false).pageId);\n } else if (options.initialTargetId !== undefined) {\n // A later connection reattaches to a page the browser already has.\n const target = openPages().find((page) => page.targetId === options.initialTargetId);\n\n if (target === undefined) throw fail(\"connect\", Reasons.NotFound.make({}));\n select(target.pageId);\n } else if (options.newPage === true) {\n select(createPage(state({ url: \"https://scripted.invalid/blank\", text: \"\" }), false).pageId);\n } else {\n const previous = lastSelected === undefined ? undefined : pages.get(lastSelected);\n\n select(previous !== undefined && !previous.closed ? previous.pageId : openPages()[0]?.pageId);\n }\n\n const pageControl: Driver[\"pageControl\"] = {\n state: async (page, ticket) => {\n ticket.check();\n const target = pageOf(page, \"page-control\");\n\n return PageExecutionState.make({\n pageId: target.pageId,\n targetId: target.targetId,\n state: target.held === undefined ? \"running\" : \"suspended\",\n ...(target.held === undefined ? {} : { suspensionId: target.held.suspensionId }),\n });\n },\n suspend: (page, ticket) =>\n attempt(\"page-suspend\", ticket, { pageId: page.pageId }, async (record) => {\n const target = pageOf(page, \"page-suspend\");\n\n requireRunning(target, \"page-suspend\");\n dispatch(ticket, record);\n target.held = { suspensionId: `suspension-${++suspensionSerial}`, by: connection };\n heldObservation(target.pageId);\n ticket.acknowledge?.();\n events.pageLifecycle?.({ _tag: \"Display\", page: cachedPage(target) });\n\n return PageSuspension.make({\n pageId: target.pageId,\n targetId: target.targetId,\n suspensionId: target.held.suspensionId,\n });\n }),\n resume: (receipt, ticket) =>\n attempt(\"page-resume\", ticket, { pageId: receipt.pageId }, async (record) => {\n const target = pages.get(receipt.pageId);\n\n if (\n target === undefined ||\n target.closed ||\n target.held === undefined ||\n target.targetId !== receipt.targetId ||\n target.held.suspensionId !== receipt.suspensionId\n )\n throw fail(\"page-resume\", Reasons.Stale.make({}));\n dispatch(ticket, record);\n target.held = undefined;\n heldObservation(target.pageId);\n ticket.acknowledge?.();\n events.pageLifecycle?.({ _tag: \"Display\", page: cachedPage(target) });\n }),\n checkTarget: async (target, ticket) => {\n ticket.check();\n requireRunning(current(target, \"page-control\"), \"page-control\");\n },\n };\n\n const driver: Driver = {\n cachedPages: () => Object.freeze(openPages().map(cachedPage)),\n ...(options.pageControl === true ? { pageControl } : {}),\n selected: () => {\n const page = selectedPage();\n\n return { pageId: page.pageId, frameId: page.frameId };\n },\n selectedTargetId: async () => selectedPage().targetId,\n listPages: (ticket) => attempt(\"list-pages\", ticket, {}, async () => openPages().map(info)),\n describePage: (page, ticket) =>\n attempt(\"describe-page\", ticket, { pageId: page.pageId }, async () =>\n info(pageOf(page, \"describe-page\")),\n ),\n resolvePage: async (page, ticket) => {\n ticket.check();\n const target = pageOf(page, \"target\");\n\n return { pageId: target.pageId, frameId: target.frameId };\n },\n selectPage: (page, ticket) =>\n attempt(\"select-page\", ticket, { pageId: page.pageId }, async () => {\n const target = pageOf(page, \"select-page\");\n\n select(target.pageId);\n // As the real driver does: moving the selection retires no observation and no wait.\n events.invalidate(\"target-changed\", \"none\");\n }),\n newPage: (ticket) =>\n attempt(\"new-page\", ticket, {}, async (record) => {\n if (openPages().length >= options.maxPages)\n throw fail(\n \"new-page\",\n Reasons.Limit.make({\n dimension: \"pages\",\n maximum: options.maxPages,\n observed: openPages().length,\n }),\n );\n dispatch(ticket, record);\n\n return info(\n createPage(state({ url: \"https://scripted.invalid/blank\", text: \"\" }), false),\n );\n }),\n closePage: (page, ticket, onDispatch) =>\n attempt(\n \"close-page\",\n ticket,\n { pageId: page.pageId },\n async (record) => {\n const target = pageOf(page, \"close-page\");\n\n dispatch(ticket, record);\n close(target);\n },\n onDispatch,\n ),\n // Recorded as a close; an armed `close-page` failure makes it fail instead, so the owner\n // fences, and the page stays open.\n containPage: (pageId) =>\n attempt(\"close-page\", undefined, { pageId }, async (record) => {\n const target = pages.get(pageId);\n\n if (target === undefined || target.closed) return;\n const outcome = take(\"close-page\");\n\n record.dispatched = true;\n if (outcome?._tag === \"Fail\") throw fail(\"close-page\", outcome.reason, outcome.outcome);\n close(target);\n }),\n listFrames: (ticket, page) =>\n attempt(\"list-frames\", ticket, {}, async () => [frameInfo(pageOf(page, \"list-frames\"))]),\n resolveFrame: async (page, frame, ticket) => {\n ticket.check();\n const target = pageOf(page, \"target\");\n\n if (frame.frameId !== target.frameId) throw fail(\"target\", Reasons.NotFound.make({}));\n\n return { pageId: target.pageId, frameId: target.frameId };\n },\n beginNavigation: (url, timeoutMillis, ticket, target) =>\n attempt(\"navigate\", undefined, { pageId: target.pageId }, async (record) => {\n ticket.check();\n const page = current(target, \"navigate\");\n\n requireRunning(page, \"navigate\");\n const outcome = take(\"navigate\");\n\n if (outcome?._tag === \"Fail\" && outcome.outcome !== \"unknown\")\n throw fail(\"navigate\", outcome.reason, outcome.outcome);\n if (outcome?._tag === \"Hold\" && !outcome.dispatched) {\n await hold(outcome.gate, ticket, \"navigate\", record);\n ticket.check();\n }\n if (outcome?._tag === \"Disconnect\" && outcome.dispatched !== true) {\n dropConnection(true);\n throw fail(\"navigate\", Reasons.Disconnected.make({}));\n }\n dispatch(ticket, record);\n page.navigation?.stop();\n\n const inFlightOutcome =\n outcome === undefined || (outcome._tag === \"Hold\" && !outcome.dispatched)\n ? undefined\n : outcome;\n\n let settled: Promise<string>;\n\n if (inFlightOutcome === undefined) {\n commit(page, documentFor(url));\n settled = Promise.resolve(url);\n } else {\n settled = inFlight(page, url, inFlightOutcome, timeoutMillis, record);\n void settled.catch(() => {});\n }\n\n const navigation: NativeNavigation = {\n pageId: page.pageId,\n mainFrame: true,\n settled,\n stop: (stopTicket, pending, onDispatch) =>\n attempt(\"navigate-stop\", undefined, { pageId: page.pageId }, async (stopRecord) => {\n stopTicket.check();\n const armedStop = take(\"navigate-stop\");\n\n if (armedStop?._tag === \"Hold\" && !armedStop.dispatched) {\n await hold(armedStop.gate, stopTicket, \"navigate-stop\", stopRecord);\n stopTicket.check();\n }\n if (!pending()) return \"settled\" as const;\n if (armedStop?._tag === \"Fail\" && armedStop.outcome !== \"unknown\")\n throw fail(\"navigate-stop\", armedStop.reason, armedStop.outcome);\n if (armedStop?._tag === \"Disconnect\" && armedStop.dispatched !== true) {\n dropConnection(true);\n throw fail(\"navigate-stop\", Reasons.Disconnected.make({}));\n }\n dispatch(stopTicket, stopRecord);\n onDispatch();\n switch (armedStop?._tag) {\n case \"Fail\":\n throw fail(\"navigate-stop\", armedStop.reason, \"unknown\");\n case \"Disconnect\":\n dropConnection(true);\n throw fail(\"navigate-stop\", Reasons.Disconnected.make({}), \"unknown\");\n case \"Hold\":\n if (armedStop.dispatched) {\n await hold(armedStop.gate, stopTicket, \"navigate-stop\", stopRecord);\n stopTicket.check();\n }\n break;\n case undefined:\n break;\n }\n page.navigation?.stop();\n\n return \"dispatched\" as const;\n }),\n };\n\n return navigation;\n }),\n readText: (selector, maximumBytes, ticket, target) =>\n attempt(\"read-text\", ticket, { pageId: target.pageId, ...meta(selector) }, async () => {\n const page = current(target, \"read-text\");\n\n if (selector === undefined) return bounded(page.document.text, maximumBytes).text;\n const control = bySelector(page, selector, \"read-text\");\n\n return bounded(control.script.text ?? control.script.label, maximumBytes).text;\n }),\n observe: (scope, maximumBytes, controls, ticket, match, target) =>\n attempt(\n \"observe\",\n ticket,\n { pageId: target.pageId },\n async (): Promise<NativeObservation> => {\n const page = current(target, \"observe\");\n const size = page.viewport ?? viewport;\n const needle = match?.toLowerCase();\n\n const matches = (value: string) =>\n needle === undefined || value.toLowerCase().includes(needle);\n\n snapshots.delete(page.frameId);\n\n // A select matches through its own label or an option's, and keeps its options with it.\n const selects = new Set(\n page.document.controls\n .filter(\n (control) =>\n isSelectable(control.script.kind) &&\n (matches(control.script.label) ||\n page.document.controls.some(\n (option) =>\n option.script.selectElementId === control.script.id &&\n matches(option.script.label),\n )),\n )\n .map((control) => control.script.id),\n );\n\n const matching = page.document.controls.filter((control) =>\n control.script.selectElementId !== undefined\n ? selects.has(control.script.selectElementId)\n : isSelectable(control.script.kind)\n ? selects.has(control.script.id)\n : matches(control.script.label),\n );\n\n const reachable = matching.filter(\n (control) => scope === \"document\" || control.script.offscreen !== true,\n );\n\n const kept = reachable.slice(0, controls);\n\n const text = bounded(\n needle === undefined\n ? page.document.text\n : page.document.text\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter((line) => line !== \"\" && matches(line))\n .join(\"\\n\"),\n maximumBytes,\n );\n\n const next: Snapshot = {\n id: `observation-${++observationSerial}`,\n pageId: page.pageId,\n frameId: page.frameId,\n epoch: page.epoch,\n generation: ticket.generation,\n scope,\n validity: \"valid\",\n nodes: new Map(kept.map((control) => [control.script.id, control])),\n identities: new Map(\n kept.map((control) => {\n const fresh = facts(control);\n\n return [\n control.script.id,\n { identity: identityOf(fresh), stable: stableIdentityOf(fresh) },\n ];\n }),\n ),\n revalidated: new Set(),\n };\n\n snapshots.set(page.frameId, next);\n\n return {\n observationId: next.id,\n scope,\n ...(match === undefined ? {} : { match }),\n url: page.document.url,\n text: text.text,\n textTruncated: text.truncated,\n controls: kept.map(observed),\n controlsTruncated: kept.length < reachable.length,\n viewport: ViewportEvidence.make({\n width: size.width,\n height: size.height,\n ...(page.document.documentScroll === undefined\n ? {}\n : { documentScroll: { ...page.document.documentScroll } }),\n clippedText: 0,\n coveredText: 0,\n uncertainText: 0,\n unreachableControls: matching.length - reachable.length,\n exhausted: false,\n }),\n };\n },\n ),\n checkpoint: (maximumBytes, controls, pictureBytes, ticket, target) =>\n attempt(\n \"checkpoint\",\n ticket,\n { pageId: target.pageId },\n async (): Promise<NativeCheckpoint> => {\n const page = current(target, \"checkpoint\");\n const size = page.viewport ?? viewport;\n const text = bounded(page.document.text, maximumBytes);\n\n const reachable = page.document.controls.filter(\n (control) => control.script.offscreen !== true,\n );\n\n return {\n url: page.document.url,\n text: text.text,\n textTruncated: text.truncated,\n controls: reachable.slice(0, controls).map(facts),\n controlsTruncated: reachable.length > controls,\n viewport: ViewportEvidence.make({\n width: size.width,\n height: size.height,\n ...(page.document.documentScroll === undefined\n ? {}\n : { documentScroll: { ...page.document.documentScroll } }),\n clippedText: 0,\n coveredText: 0,\n uncertainText: 0,\n unreachableControls: page.document.controls.length - reachable.length,\n exhausted: false,\n }),\n documentChanged: false,\n ...(pictureBytes === undefined ? {} : { picture: picture(page, ticket) }),\n };\n },\n ),\n controlFacts: (target, ticket, browserTarget) =>\n attempt(\n \"control-facts\",\n ticket,\n { pageId: browserTarget.pageId, ...meta(target) },\n async () => resolve(target, ticket, \"control-facts\", undefined, browserTarget).facts,\n ),\n resolveDescriptor: (\n descriptor: Descriptor,\n ticket: Ticket,\n target: DriverTarget,\n guard: ResolveGuard = { _tag: \"Strict\" },\n ) =>\n attempt(\"resolve\", ticket, { pageId: target.pageId }, async () => {\n const group = resolveGroup(\n [{ target: { _tag: \"Descriptor\", descriptor } }],\n ticket,\n target,\n guard,\n );\n\n const element = group.elements[0];\n const resolved = element === undefined ? undefined : resolvedElements.get(element);\n\n if (resolved === undefined) {\n await group.release();\n throw fail(\"resolve\", Reasons.Malformed.make({}));\n }\n try {\n ticket.check();\n const previous = snapshots.get(resolved.snapshot.frameId);\n\n if (previous !== undefined) previous.validity = \"invalid\";\n privateSnapshots.delete(resolved.snapshot);\n snapshots.set(resolved.snapshot.frameId, {\n ...resolved.snapshot,\n scope: resolved.scope,\n });\n\n return ObservedElement.make({\n observationId: resolved.snapshot.id,\n elementId: resolved.node.script.id,\n });\n } catch (error) {\n await group.release();\n throw error;\n }\n }),\n resolveGroup: (\n requests: ReadonlyArray<ResolveRequest>,\n ticket: Ticket,\n target: DriverTarget,\n guard: ResolveGuard,\n ) =>\n attempt(\"resolve\", ticket, { pageId: target.pageId }, async () =>\n resolveGroup(requests, ticket, target, guard),\n ),\n expectations: (\n conditions: ReadonlyArray<Precondition>,\n ticket: Ticket,\n target: DriverTarget,\n ) =>\n attempt(\"run\", ticket, { pageId: target.pageId }, async () =>\n expectations(conditions, ticket, target),\n ),\n revalidate: (target, ticket, browserTarget) =>\n attempt(\n \"revalidate\",\n ticket,\n { pageId: browserTarget.pageId, ...meta(target) },\n async () => {\n const { snapshot: current } = retained(\n target,\n ticket,\n \"revalidate\",\n true,\n true,\n browserTarget,\n );\n\n current.revalidated.add(target.elementId);\n },\n ),\n click: (target, ticket, capture, policy, browserTarget) =>\n attempt(\n \"click\",\n ticket,\n { pageId: browserTarget.pageId, ...meta(target) },\n async (record) => {\n const { node, page } = resolve(target, ticket, \"click\", policy, browserTarget);\n\n requireRunning(page, \"click\");\n dispatch(ticket, record);\n let url = \"\";\n\n const input = await capture(\n async () => {\n url = activate(page, node);\n },\n { position: null },\n );\n\n return { url, input };\n },\n () => invalidatePointer(browserTarget.pageId),\n ),\n fill: (target, value, ticket, policy, browserTarget) =>\n attempt(\n \"fill\",\n ticket,\n { pageId: browserTarget.pageId, ...meta(target) },\n async (record) => {\n const { node, page } = resolve(target, ticket, \"fill\", policy, browserTarget);\n\n requireRunning(page, \"fill\");\n const refusal = textRefusal(node.script, value);\n\n if (refusal !== undefined) throw fail(\"fill\", refusal);\n dispatch(ticket, record);\n page.focused = node.script.id;\n page.values.set(node.script.id, value);\n\n return page.document.url;\n },\n ),\n selectOption: (target, ids, ticket, policy, browserTarget) =>\n attempt(\n \"select-option\",\n ticket,\n { pageId: browserTarget.pageId, ...meta(target) },\n async (record) => {\n const { node, page } = resolve(target, ticket, \"select-option\", policy, browserTarget);\n\n requireRunning(page, \"select-option\");\n const options = chosen(page, node, ids, ticket, \"select-option\");\n\n dispatch(ticket, record);\n choose(page, node, options);\n\n return page.document.url;\n },\n ),\n formStep: (target, field, ticket, policy, _settleMillis, capture, browserTarget) =>\n attempt(\n \"fill-form\",\n ticket,\n { pageId: browserTarget.pageId, ...meta(target) },\n async (record) => {\n const { node, page } = resolve(\n target,\n ticket,\n \"fill-form\",\n policy,\n browserTarget,\n false,\n true,\n );\n\n requireRunning(page, \"fill-form\");\n\n return formStep(page, node, field, ticket, record, capture);\n },\n field.checked === undefined ? undefined : () => invalidatePointer(browserTarget.pageId),\n ),\n formState: (targets, ticket, browserTarget) =>\n attempt(\"fill-form\", ticket, { pageId: browserTarget.pageId }, async () =>\n targets.map((target) => {\n // A node the form's own steps detached reads as absent rather than stale.\n const { node, page } = retainedElement(\n target,\n ticket,\n \"fill-form\",\n false,\n false,\n browserTarget,\n );\n\n return page.document.controls.includes(node) ? fieldState(page, node) : undefined;\n }),\n ),\n formSubmit: (target, ticket, capture, policy, browserTarget) =>\n attempt(\n \"fill-form\",\n ticket,\n { pageId: browserTarget.pageId, ...meta(target) },\n async (record) => {\n const { node, page } = resolve(\n target,\n ticket,\n \"fill-form\",\n policy,\n browserTarget,\n false,\n true,\n );\n\n requireRunning(page, \"fill-form\");\n dispatch(ticket, record);\n let url = \"\";\n\n const input = await capture(\n async () => {\n url = activate(page, node);\n },\n { position: null },\n );\n\n return { url, input };\n },\n () => invalidatePointer(browserTarget.pageId),\n ),\n scroll: (deltaX, deltaY, ticket, target) =>\n attempt(\"scroll\", ticket, { pageId: target.pageId }, async (record) => {\n const page = current(target, \"scroll\");\n\n requireRunning(page, \"scroll\");\n dispatch(ticket, record);\n page.scroll.x += deltaX;\n page.scroll.y += deltaY;\n notify(page);\n\n return page.document.url;\n }),\n scrollTo: (target: ElementTarget, ticket: Ticket, browserTarget: DriverTarget) =>\n attempt(\n \"scroll\",\n ticket,\n { pageId: browserTarget.pageId, ...meta(target) },\n async (record) => {\n const { page, facts: fresh } = resolve(\n target,\n ticket,\n \"scroll\",\n undefined,\n browserTarget,\n );\n\n requireRunning(page, \"scroll\");\n dispatch(ticket, record);\n page.scroll.x += fresh.box.x;\n page.scroll.y += fresh.box.y;\n notify(page);\n\n return page.document.url;\n },\n ),\n pointerMove: (to, ticket, target) =>\n attempt(\n \"pointer-move\",\n ticket,\n { pageId: target.pageId },\n async (record): Promise<NativeInput> => {\n const page = current(target, \"pointer-move\");\n\n requireRunning(page, \"pointer-move\");\n dispatch(ticket, record);\n place(page.pageId, { x: to.x, y: to.y });\n\n return receipt(page.pageId);\n },\n ),\n hover: (target, ticket, policy, browserTarget) =>\n attempt(\n \"hover\",\n ticket,\n { pageId: browserTarget.pageId, ...meta(target) },\n async (record): Promise<NativeInput> => {\n const {\n node,\n page,\n facts: fresh,\n } = resolve(target, ticket, \"hover\", policy, browserTarget);\n\n requireRunning(page, \"hover\");\n if (node.script.offscreen === true) throw fail(\"hover\", Reasons.NotVisible.make({}));\n dispatch(ticket, record);\n place(page.pageId, {\n x: fresh.box.x + fresh.box.width / 2,\n y: fresh.box.y + fresh.box.height / 2,\n });\n\n return receipt(page.pageId);\n },\n ),\n wheel: (deltaX, deltaY, at, ticket, target) =>\n attempt(\n \"wheel\",\n ticket,\n { pageId: target.pageId },\n async (record): Promise<NativeInput> => {\n const page = current(target, \"wheel\");\n\n requireRunning(page, \"wheel\");\n dispatch(ticket, record);\n if (at !== undefined) place(page.pageId, { x: at.x, y: at.y });\n page.scroll.x += deltaX;\n page.scroll.y += deltaY;\n notify(page);\n\n return receipt(page.pageId);\n },\n ),\n press: (key, _modifiers: ReadonlyArray<KeyModifier>, into, ticket, policy, browserTarget) =>\n attempt(\n \"press\",\n ticket,\n { pageId: browserTarget.pageId, ...meta(into) },\n async (record): Promise<NativeInput> => {\n const page = focusedOrRefuse(into, ticket, \"press\", policy, browserTarget);\n\n requireRunning(page, \"press\");\n dispatch(ticket, record);\n if (key.length === 1) typed(page, key);\n\n return receipt(page.pageId);\n },\n ),\n type: (text, into, ticket, policy, browserTarget) =>\n attempt(\n \"type\",\n ticket,\n { pageId: browserTarget.pageId, ...meta(into) },\n async (record): Promise<NativeInput> => {\n const page = focusedOrRefuse(into, ticket, \"type\", policy, browserTarget);\n\n requireRunning(page, \"type\");\n dispatch(ticket, record);\n typed(page, text);\n\n return receipt(page.pageId);\n },\n ),\n screenshot: (_fullPage, _maximumBytes, ticket, target) =>\n attempt(\"screenshot\", ticket, { pageId: target.pageId }, async () => {\n const page = current(target, \"screenshot\");\n\n return picture(page, ticket);\n }),\n resize: (next, ticket, target) =>\n attempt(\"resize\", ticket, { pageId: target.pageId }, async (record) => {\n const page = current(target, \"resize\");\n\n dispatch(ticket, record);\n page.viewport = { width: next.width, height: next.height };\n page.capture?.start.invalidate(\"resized\");\n events.invalidate(\"resized\", { pageId: page.pageId });\n }),\n waitFor: (selector, state, ticket, target) =>\n attempt(\"wait\", ticket, { pageId: target.pageId, selector }, async (record) => {\n const page = current(target, \"wait\");\n const epoch = page.epoch;\n\n const find = () => {\n const id = selector.startsWith(\"#\") ? selector.slice(1) : undefined;\n\n return id === undefined\n ? undefined\n : page.document.controls.find((control) => control.script.id === id);\n };\n\n await waitUntil(\n ticket,\n page,\n \"wait\",\n record,\n () => {\n const control = find();\n const present = control !== undefined;\n const visible = present && control.script.offscreen !== true;\n\n switch (state) {\n case \"visible\":\n return visible;\n case \"hidden\":\n return !visible;\n case \"attached\":\n return present;\n case \"detached\":\n return !present;\n }\n },\n () => page.closed || page.epoch !== epoch,\n );\n }).finally(() => ticket.retire()),\n settled: (options: SettledOptions, ticket: WaitTicket, target: DriverTarget) =>\n attempt(\"settled\", ticket, { pageId: target.pageId }, async (record) => {\n const page = current(target, \"settled\");\n\n requireRunning(page, \"settled\");\n\n return waitSettled(options, ticket, page, record);\n }).finally(() => ticket.retire()),\n waitForElement: (reference, state, ticket, target) =>\n attempt(\"wait\", ticket, { pageId: target.pageId, ...meta(reference) }, async (record) => {\n const page = current(target, \"wait\");\n const { node } = retainedElement(reference, ticket, \"wait\", true, true, target);\n const epoch = page.epoch;\n\n await waitUntil(\n ticket,\n page,\n \"wait\",\n record,\n () => {\n const present = page.document.controls.includes(node);\n const visible = present && node.script.offscreen !== true;\n\n switch (state satisfies WaitForElementRequest[\"state\"]) {\n case \"visible\":\n return visible;\n case \"hidden\":\n return !visible;\n case \"enabled\":\n return present && node.script.disabled !== true;\n case \"disabled\":\n return present && node.script.disabled === true;\n }\n },\n () => page.closed || page.epoch !== epoch,\n );\n }).finally(() => ticket.retire()),\n clickAndWait: (target, ticket, capture, browserTarget) =>\n attempt(\n \"click-and-wait\",\n ticket,\n { pageId: browserTarget.pageId, ...meta(target) },\n async (record) => {\n const { node, page } = resolve(\n target,\n ticket,\n \"click-and-wait\",\n undefined,\n browserTarget,\n );\n\n requireRunning(page, \"click-and-wait\");\n dispatch(ticket, record);\n let url = \"\";\n\n const input = await capture(\n async () => {\n url = activate(page, node);\n },\n { position: null },\n );\n\n return { url, input };\n },\n () => invalidatePointer(browserTarget.pageId),\n ),\n clickForDownload: (target, ticket, browserTarget) =>\n attempt(\n \"download-action\",\n ticket,\n { pageId: browserTarget.pageId, ...meta(target) },\n async (record) => {\n const { node, page } = resolve(\n target,\n ticket,\n \"download-action\",\n undefined,\n browserTarget,\n );\n\n requireRunning(page, \"download-action\");\n if (node.script.download === undefined)\n throw fail(\"download-action\", Reasons.Unsupported.make({}));\n dispatch(ticket, record);\n page.focused = node.script.id;\n\n return {\n downloadId: `download-${++downloadSerial}`,\n filename: node.script.download,\n state: \"completed\" as const,\n };\n },\n ),\n selectFiles: (target, files, ticket, browserTarget) =>\n attempt(\n \"select-files\",\n ticket,\n { pageId: browserTarget.pageId, ...meta(target) },\n async (record) =>\n selectFilesOn(target, files, ticket, record, \"select-files\", browserTarget),\n ),\n clickForFileSelection: (target, files, ticket, browserTarget) =>\n attempt(\n \"file-chooser\",\n ticket,\n { pageId: browserTarget.pageId, ...meta(target) },\n async (record) =>\n selectFilesOn(target, files, ticket, record, \"file-chooser\", browserTarget),\n ),\n documentReadiness: async (ticket, target): Promise<ReadinessState> => {\n ticket.check();\n const page = current(target, \"ready\");\n const bootstrap = options.bootstrap;\n\n if (bootstrap === undefined || bootstrap.readiness.length === 0) return { _tag: \"Ready\" };\n if (\n page.epoch <= page.registeredEpoch &&\n bootstrap.existingDocuments === \"RequireFreshNavigation\"\n )\n return { _tag: \"RequiresNavigation\" };\n const origin = originOf(page.document.url);\n\n const applicable = bootstrap.readiness.some(\n (requirement) =>\n requirement.origins === undefined || requirement.origins.includes(origin),\n );\n\n return applicable ? { _tag: \"Ready\" } : { _tag: \"NotApplicable\" };\n },\n dismissDialogs: async () => {},\n capture: async (target): Promise<CaptureBinding> => {\n const page = pageOf(\n PageInfo.make({\n pageId: target.pageId,\n targetId: target.targetId,\n url: \"\",\n title: \"\",\n selected: false,\n }),\n \"capture\",\n );\n\n return {\n pageId: page.pageId,\n targetId: page.targetId,\n frameId: page.frameId,\n source: {\n start: async (start) => {\n if (disconnected || page.closed) throw fail(\"capture-start\", Reasons.Closed.make({}));\n page.capture = { start, by: connection };\n start.opened?.(page.document.url);\n },\n stop: async () => {\n page.capture = undefined;\n const outcome = take(\"capture-stop\");\n\n if (outcome?._tag === \"Fail\")\n throw fail(\"capture-stop\", outcome.reason, outcome.outcome);\n },\n },\n };\n },\n invalidateObservation: (scope, origin) => {\n invalidateSnapshot(scope, origin);\n },\n disconnect: async () => {\n if (disconnected) return;\n const outcome = take(\"disconnect\");\n\n if (outcome?._tag === \"Hold\") {\n // A native disconnect cannot be aborted: it waits for the gate however long cleanup does.\n const gate = internalGate(outcome.gate);\n\n gate.reach();\n await gate.opened;\n }\n if (outcome?._tag === \"Fail\") {\n dropConnection(false, \"close-failed\");\n throw fail(\"disconnect\", outcome.reason, outcome.outcome);\n }\n dropConnection(false, \"closed\");\n },\n };\n\n const selectFilesOn = (\n target: string | ElementTarget,\n files: ReadonlyArray<NativeFileSelection>,\n ticket: Ticket,\n record: MutableCall,\n operation: \"select-files\" | \"file-chooser\",\n browserTarget: DriverTarget,\n ) => {\n const { node, page } = resolve(target, ticket, operation, undefined, browserTarget);\n\n requireRunning(page, operation);\n if (node.script.kind !== \"input\" || node.script.inputType !== \"file\")\n throw fail(operation, Reasons.Unsupported.make({}));\n dispatch(ticket, record);\n page.files.set(\n node.script.id,\n files.map((file) => (file._tag === \"Inline\" ? file.name : file.path)),\n );\n\n return page.document.url;\n };\n\n const connection: Live = {\n opened: (pageId) => {\n const page = pages.get(pageId);\n\n if (page !== undefined) events.pageLifecycle?.({ _tag: \"Opened\", page: cachedPage(page) });\n },\n navigated: (pageId, sameDocument) => {\n const page = pages.get(pageId);\n\n if (page !== undefined)\n events.pageLifecycle?.({\n _tag: \"Navigated\",\n page: cachedPage(page),\n frameId: page.frameId,\n documentEpoch: page.epoch,\n sameDocument,\n url: page.document.url.length <= 8192 ? page.document.url : null,\n urlQualification: page.document.url.length <= 8192 ? \"NativeCached\" : \"Omitted\",\n });\n },\n metadata: (pageId) => {\n const page = pages.get(pageId);\n\n if (page !== undefined)\n events.pageLifecycle?.({ _tag: \"Metadata\", page: cachedPage(page) });\n },\n retire: (pageId) => invalidateSnapshot({ pageId }),\n closed: (pageId) => {\n const page = pages.get(pageId);\n\n if (page !== undefined) snapshots.delete(page.frameId);\n events.pageClosed?.(pageId, page === undefined ? undefined : cachedPage(page));\n },\n announce: (pageId) => events.invalidate(\"target-changed\", { pageId }),\n drop: () => dropConnection(true),\n invoke: invokeBinding,\n pointer: () => pointer,\n viewport: (pageId) => pages.get(pageId)?.viewport ?? viewport,\n };\n\n index = connections.push(\"open\") - 1;\n live.add(connection);\n latest = connection;\n\n return driver;\n };\n\n const toScript = (document: DocumentState): DocumentScript => ({\n url: document.url,\n title: document.title,\n text: document.text,\n ...(document.documentScroll === undefined\n ? {}\n : { documentScroll: { ...document.documentScroll } }),\n controls: document.controls.map((control) => ({\n ...control.script,\n ...(control.checked === undefined ? {} : { checked: control.checked }),\n ...(control.selected === undefined ? {} : { selected: control.selected }),\n })),\n });\n\n /** The page last selected by any connection; it stays reachable while no connection is open. */\n const selectedOrClosed = Effect.suspend(() => {\n const page = lastSelected === undefined ? undefined : pages.get(lastSelected);\n\n return page === undefined || page.closed\n ? Effect.fail(fail(\"target\", Reasons.Closed.make({})))\n : Effect.succeed(page);\n });\n\n const control: ScriptedControl = {\n calls: Effect.sync(() => calls.map((call) => Object.freeze({ ...call }))),\n next: (operation, outcome) =>\n Effect.sync(() => {\n const queue = armed.get(operation) ?? [];\n\n queue.push(outcome);\n armed.set(operation, queue);\n }),\n gate: makeGate,\n document: {\n current: selectedOrClosed.pipe(Effect.map((page) => toScript(page.document))),\n replace: (next) =>\n checked(DocumentScript, next, \"configure\").pipe(\n Effect.flatMap((document) =>\n selectedOrClosed.pipe(\n Effect.map((page) => {\n page.navigation?.stop();\n commit(page, state(document));\n }),\n ),\n ),\n ),\n update: (next) =>\n checked(DocumentScript, next, \"configure\").pipe(\n Effect.flatMap((document) =>\n selectedOrClosed.pipe(\n Effect.map((page) => {\n update(page, document);\n }),\n ),\n ),\n ),\n values: Effect.sync(() =>\n lastSelected === undefined ? new Map() : new Map(pages.get(lastSelected)?.values ?? []),\n ),\n files: Effect.sync(() =>\n lastSelected === undefined ? new Map() : new Map(pages.get(lastSelected)?.files ?? []),\n ),\n },\n pointer: Effect.sync(() => latest?.pointer() ?? null),\n capture: {\n emit: (frame: ScriptedFrame = {}) =>\n selectedOrClosed.pipe(\n Effect.flatMap((page) => {\n const running = page.capture?.start;\n\n if (running === undefined)\n return Effect.fail(fail(\"capture-consume\", Reasons.NotFound.make({})));\n const timestamp = frame.timestamp ?? lastTimestamp + 40;\n const viewport = page.capture?.by.viewport(page.pageId) ?? { width: 0, height: 0 };\n\n lastTimestamp = Math.max(lastTimestamp, timestamp);\n\n return Effect.sync(() => {\n running.receive({\n data: frame.bytes ?? jpegFrame(),\n timestamp,\n viewportWidth: frame.viewportWidth ?? viewport.width,\n viewportHeight: frame.viewportHeight ?? viewport.height,\n });\n });\n }),\n ),\n },\n invoke: (name, input, invokeOptions) =>\n Effect.promise(() => {\n const open = [...live].at(-1);\n\n return open === undefined\n ? Promise.resolve<BindingReply>({ ok: false })\n : open.invoke(name, input, invokeOptions?.origin);\n }),\n disconnect: Effect.sync(() => {\n // oxlint-disable-next-line unicorn/no-useless-spread -- dropping removes it from `live`\n for (const connection of [...live]) connection.drop();\n }),\n connections: Effect.sync(() => [...connections]),\n };\n\n return { connect, control };\n};\n","import { Effect, Option, Redacted } from \"effect\";\n\nimport type { Lifetime, Source } from \"../../BrowserRuntime.ts\";\nimport { BrowserError, Reasons } from \"../../Errors.ts\";\nimport { cleanupStep, reported } from \"../browser/ConnectionCleanup.ts\";\nimport { ScriptedCleanupIssue, ScriptedCleanupResult, type ScriptedReference } from \"./Script.ts\";\n\nexport interface ScriptedLease extends Lifetime {\n readonly reference: ScriptedReference;\n readonly closeChecked: Effect.Effect<ScriptedCleanupResult, BrowserError>;\n readonly release: Effect.Effect<ScriptedCleanupResult>;\n readonly cleanupResult: Effect.Effect<Option.Option<ScriptedCleanupResult>>;\n}\n\n/**\n * A lifetime with nothing outside the connection: no process to terminate and no provider to\n * release. Cleanup runs the same local steps an owned Chromium runs, each settling on its own,\n * and reports the same kind of receipt.\n */\nexport const scriptedSource =\n (\n reference: ScriptedReference,\n onCleanup?: (result: ScriptedCleanupResult) => Effect.Effect<void>,\n ): Source<ScriptedLease, never, never> =>\n (local) =>\n Effect.gen(function* () {\n let latest: ScriptedCleanupResult | undefined;\n let closing = false;\n\n const close = yield* Effect.cached(\n Effect.uninterruptible(\n Effect.gen(function* () {\n const issues: ScriptedCleanupIssue[] = [];\n\n const step = <A, E>(name: ScriptedCleanupIssue[\"step\"], action: Effect.Effect<A, E>) =>\n cleanupStep(action, 3000).pipe(\n Effect.tap((result) =>\n Effect.sync(() => {\n if (result._tag === \"Failure\")\n issues.push(ScriptedCleanupIssue.make({ step: name, reason: result.reason }));\n }),\n ),\n );\n\n yield* step(\"fence\", local.fence);\n yield* step(\"capture\", local.capture);\n yield* step(\"initialization\", local.initialization);\n const disconnected = yield* step(\"disconnect\", local.disconnect);\n\n const result = ScriptedCleanupResult.make({\n reference,\n connection: disconnected._tag === \"Success\" ? disconnected.value : \"failed\",\n issues,\n });\n\n Object.freeze(result.issues);\n latest = Object.freeze(result);\n\n return latest;\n }),\n ),\n );\n\n const release = yield* Effect.cached(\n Effect.gen(function* () {\n closing = true;\n const result = yield* close;\n\n if (onCleanup !== undefined) yield* reported(Effect.suspend(() => onCleanup(result)));\n\n return result;\n }).pipe(Effect.uninterruptible),\n );\n\n yield* Effect.addFinalizer(() => release.pipe(Effect.asVoid));\n\n return {\n reference,\n connection: () =>\n Effect.suspend(() =>\n closing\n ? Effect.fail(\n BrowserError.make({\n operation: \"connect\",\n reason: Reasons.Closed.make({}),\n outcome: \"undispatched\",\n }),\n )\n : Effect.succeed(Redacted.make(`scripted://${reference.id}`)),\n ),\n release,\n closeChecked: release.pipe(\n Effect.filterOrFail(\n (result) => result.connection === \"closed\" && result.issues.length === 0,\n () =>\n BrowserError.make({\n operation: \"close\",\n reason: Reasons.Failed.make({}),\n outcome: \"unknown\",\n }),\n ),\n ),\n cleanupResult: Effect.sync(() => Option.fromNullishOr(latest)),\n controlRetired: Effect.sync(() => latest !== undefined && latest.connection === \"closed\"),\n } satisfies ScriptedLease;\n });\n","import { Crypto, Effect, Layer, Redacted, type Scope } from \"effect\";\n\nimport type { OpenOptions } from \"./Browser.ts\";\nimport { type AutomationOptions, BrowserPolicy, type Viewport } from \"./BrowserData.ts\";\nimport { type BrowserBinding, make as makeRuntime } from \"./BrowserRuntime.ts\";\nimport { BrowserError, Reasons, type InitializationError } from \"./Errors.ts\";\nimport { issueBinding } from \"./internal/browser/Binding.ts\";\nimport { fromNativeAttempt, type NativeAttempt } from \"./internal/browser/NativeAttempt.ts\";\nimport { checked } from \"./internal/browser/PublicSession.ts\";\nimport { makeSequentialCrypto } from \"./internal/testing/Crypto.ts\";\nimport {\n makeScriptedBrowser,\n type EngineTimers,\n type ScriptedBrowser,\n} from \"./internal/testing/Engine.ts\";\nimport { jpegFrame } from \"./internal/testing/Frame.ts\";\nimport { scriptedSource } from \"./internal/testing/Lifetime.ts\";\nimport {\n Script,\n ScriptedReference,\n type ScriptedCleanupResult,\n type ScriptedControl,\n type ScriptedSession,\n} from \"./internal/testing/Script.ts\";\n\nexport {\n ControlFactsScript,\n ControlScript,\n DocumentScript,\n ScriptableOperation,\n Script,\n ScriptedCleanupIssue,\n ScriptedCleanupResult,\n ScriptedReference,\n} from \"./internal/testing/Script.ts\";\n\nexport type {\n BindingReply,\n Gate,\n RecordedCall,\n ScriptedConnection,\n ScriptedControl,\n ScriptedFrame,\n ScriptedOutcome,\n ScriptedSession,\n} from \"./internal/testing/Script.ts\";\n\n/**\n * How a scripted browser is opened. The defaults are the ones a Chromium launch would use: an\n * unrestricted policy of 100 actions, five minutes and 2 MiB, a 1280×720 viewport and a\n * ten-second action timeout.\n */\nexport interface ScriptedOptions<E = never, R = never> extends OpenOptions<E, R> {\n readonly policy?: BrowserPolicy;\n readonly automation?: AutomationOptions;\n readonly viewport?: Viewport;\n readonly onCleanup?: (result: ScriptedCleanupResult) => Effect.Effect<void>;\n}\n\n/**\n * The scripted engine as an opaque binding. Connections to one address reach one browser, so a\n * reconnection finds the pages it left; each browser has one control handle.\n */\nexport interface ScriptedBinding {\n readonly binding: BrowserBinding;\n /** One control for each browser connected to so far, in first-connection order. */\n readonly browsers: Effect.Effect<ReadonlyArray<ScriptedControl>>;\n}\n\nlet references = 0;\n\nconst makeEngine = Effect.fnUntraced(function* (script: Script) {\n // Time for an in-flight navigation follows the clock this browser was opened under, so a\n // TestClock advances it and nothing real elapses.\n const context = yield* Effect.context<never>();\n const browsers = new Map<string, ScriptedBrowser>();\n\n const timers: EngineTimers = {\n sleep: (millis) => {\n const controller = new AbortController();\n\n const done = Effect.runPromiseWith(context)(Effect.sleep(millis), {\n signal: controller.signal,\n });\n\n void done.catch(() => {});\n\n return { done, cancel: () => controller.abort() };\n },\n };\n\n // The provider's address names the browser: the same address reaches the same pages again. A\n // refused connection throws inside the engine; `async` turns that into the rejection the\n // owner's `onSettled` bookkeeping waits for.\n // oxlint-disable-next-line effecttsgo/async-function -- NativeAttempt is Promise-based\n const attempt: NativeAttempt = async (request) => {\n const address = Redacted.isRedacted(request.connection)\n ? String(Redacted.value(request.connection))\n : String(request.connection);\n\n let browser = browsers.get(address);\n\n if (browser === undefined) {\n browser = makeScriptedBrowser(script, timers);\n browsers.set(address, browser);\n }\n\n return browser.connect(request.options, request.events);\n };\n\n const binding = issueBinding({ _tag: \"BrowserBinding\" as const }, fromNativeAttempt(attempt));\n\n return { binding, controls: () => [...browsers.values()].map((browser) => browser.control) };\n});\n\n/**\n * Open one scripted browser in the caller's Scope. The session is the real owner over a\n * scripted native engine: admission, budgets, staleness, dispatch evidence, capture, page holds\n * and typed callbacks are the production code paths. Only the page and its outcomes are scripted,\n * and the owner's ids and handoff tokens use deterministic Crypto namespaced by this\n * scripted reference, so independently opened sessions have distinct evidence domains.\n */\nexport const open = Effect.fnUntraced(function* <E = never, R = never>(\n script: Script,\n options: ScriptedOptions<E, R> = {},\n): Effect.fn.Return<\n ScriptedSession<E>,\n BrowserError | InitializationError | E,\n Scope.Scope | Exclude<R, Scope.Scope>\n> {\n const fixed = yield* checked(Script, script, \"configure\");\n\n const policy = yield* checked(\n BrowserPolicy,\n options.policy ?? BrowserPolicy.unrestricted(),\n \"configure\",\n );\n\n const engine = yield* makeEngine(fixed);\n const namespace = ++references;\n\n const reference = Object.freeze(\n ScriptedReference.make({ provider: \"scripted\", id: `scripted-${namespace}` }),\n );\n\n const runtime = yield* makeRuntime({\n implementation: \"scripted\",\n binding: engine.binding,\n ...(options.automation === undefined ? {} : { automation: options.automation }),\n ...(options.viewport === undefined ? {} : { viewport: options.viewport }),\n }).pipe(Effect.provide(Layer.sync(Crypto.Crypto, () => makeSequentialCrypto(namespace))));\n\n const acquired = yield* runtime.acquire(\n policy,\n scriptedSource(reference, options.onCleanup),\n options.bootstrap === undefined ? {} : { bootstrap: options.bootstrap },\n );\n\n const connection = yield* acquired.connect;\n const control = engine.controls().at(-1);\n\n if (control === undefined)\n return yield* BrowserError.make({\n operation: \"connect\",\n reason: Reasons.Provider.make({}),\n outcome: \"unknown\",\n });\n\n return Object.assign(connection.session, {\n reference,\n control,\n closeChecked: connection.session.closeChecked.pipe(\n Effect.andThen(acquired.lifetime.closeChecked),\n ),\n close: acquired.close,\n cleanupResult: acquired.lifetime.cleanupResult,\n }) satisfies ScriptedSession<E>;\n});\n\n/**\n * The `Crypto` scripted browsers draw their ids and handoff tokens from. Its bytes count up from\n * one on each build, so every value is predictable; it is not random and computes no digest.\n * `open` uses the same counter with its original scripted-reference namespace. A provider\n * Layer built over `binding` still requires a `Crypto`, and\n * this one keeps such a test free of a platform package.\n */\nexport const sequentialCrypto: Layer.Layer<Crypto.Crypto> = Layer.sync(\n Crypto.Crypto,\n makeSequentialCrypto,\n);\n\n/**\n * The same engine for a provider Layer built on `browser-runtime`, such as\n * `BrowserbaseBrowser.layer` with `BrowserBinding.layer(binding)`. Each address the Layer\n * connects to is one browser with one control handle; reconnecting to it finds its pages.\n */\nexport const binding = Effect.fnUntraced(function* (\n script: Script,\n): Effect.fn.Return<ScriptedBinding, BrowserError> {\n const fixed = yield* checked(Script, script, \"configure\");\n const engine = yield* makeEngine(fixed);\n\n return {\n binding: engine.binding,\n browsers: Effect.sync(engine.controls),\n };\n});\n\n/** A valid 64×48 JPEG: the default bytes of a scripted capture frame, for a caller's own frames. */\nexport const jpeg = jpegFrame;\n"],"mappings":"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"}
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import { A as Stamp, D as Snapshot, R as TimelineError, T as Selector, V as TimelineMalformed, f as Cursor, k as SnapshotOptions, m as Event, o as ClientPageEvent, r as ClientEvent, y as PageEvent } from "./TimelineData-BsOn-YGZ.mjs";
|
|
2
|
-
import { Effect, Schema, Stream } from "effect";
|
|
3
|
-
//#region src/Timeline.d.ts
|
|
4
|
-
/** A live host capability; its streams replay metadata, never native mutations. */
|
|
5
|
-
interface Timeline {
|
|
6
|
-
readonly snapshot: (options?: SnapshotOptions) => Effect.Effect<Snapshot, TimelineError>;
|
|
7
|
-
readonly events: (selector?: Selector) => Stream.Stream<Event, TimelineError>;
|
|
8
|
-
readonly now: Effect.Effect<Stamp>;
|
|
9
|
-
}
|
|
10
|
-
/** Host evidence encoding retains bounded addresses and uses decimal-string bigint offsets. */
|
|
11
|
-
declare const encode: (event: Event) => Effect.Effect<Schema.Json, TimelineMalformed, never>;
|
|
12
|
-
/** Explicit client projection excludes host address fields even on augmented host values. */
|
|
13
|
-
declare const project: (event: Event) => Effect.Effect<ClientEvent, TimelineMalformed>;
|
|
14
|
-
declare const encodeClient: (event: Event) => Effect.Effect<Schema.Json, TimelineMalformed, never>;
|
|
15
|
-
declare const decode: (value: unknown) => Effect.Effect<Event, TimelineMalformed>;
|
|
16
|
-
declare const encodeCursor: (cursor: Cursor) => Effect.Effect<Schema.Json, TimelineMalformed, never>;
|
|
17
|
-
declare const decodeCursor: (value: unknown) => Effect.Effect<{
|
|
18
|
-
readonly storeId: string;
|
|
19
|
-
readonly clockId: string;
|
|
20
|
-
readonly sequence: bigint;
|
|
21
|
-
}, TimelineMalformed, never>;
|
|
22
|
-
declare const encodeSnapshot: (snapshot: Snapshot) => Effect.Effect<Schema.Json, TimelineMalformed, never>;
|
|
23
|
-
/** Copy the allowlisted lifecycle projection; cached host addresses/titles remain private. */
|
|
24
|
-
declare const projectPages: (value: PageEvent) => Effect.Effect<ClientPageEvent, TimelineMalformed>;
|
|
25
|
-
declare const encodePages: (value: PageEvent) => Effect.Effect<Schema.Json, TimelineMalformed, never>;
|
|
26
|
-
//#endregion
|
|
27
|
-
export { encodeClient as a, encodeSnapshot as c, encode as i, project as l, decode as n, encodeCursor as o, decodeCursor as r, encodePages as s, Timeline as t, projectPages as u };
|
|
28
|
-
export {};
|
|
29
|
-
//# sourceMappingURL=Timeline-fV22Xk-S.d.mts.map
|
package/dist/Timeline.d.mts
DELETED
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import { B as TimelineLimit, I as TimelineCursorError, R as TimelineError, V as TimelineMalformed, z as TimelineGap } from "./TimelineData-BsOn-YGZ.mjs";
|
|
2
|
-
import { a as encodeClient, c as encodeSnapshot, i as encode, l as project, n as decode, o as encodeCursor, r as decodeCursor, s as encodePages, t as Timeline, u as projectPages } from "./Timeline-fV22Xk-S.mjs";
|
|
3
|
-
export { Timeline, TimelineCursorError, type TimelineError, TimelineGap, TimelineLimit, TimelineMalformed, decode, decodeCursor, encode, encodeClient, encodeCursor, encodePages, encodeSnapshot, project, projectPages };
|
|
4
|
-
export {};
|
package/dist/Timeline.mjs
DELETED
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import { t as guardedDecode } from "./PlanInput-BJcPPncs.mjs";
|
|
2
|
-
import { ClientEvent, ClientEventJson, ClientPageEvent, ClientPageEventJson, CursorJson, EventJson, SnapshotJson, TimelineCursorError, TimelineGap, TimelineLimit, TimelineMalformed } from "./TimelineData.mjs";
|
|
3
|
-
import { Effect, Schema } from "effect";
|
|
4
|
-
//#region src/Timeline.ts
|
|
5
|
-
/** Host evidence encoding retains bounded addresses and uses decimal-string bigint offsets. */
|
|
6
|
-
const encode = (event) => Schema.encodeEffect(EventJson)(event).pipe(Effect.mapError(() => new TimelineMalformed({})));
|
|
7
|
-
/** Explicit client projection excludes host address fields even on augmented host values. */
|
|
8
|
-
const project = (event) => Schema.decodeEffect(ClientEvent)(event).pipe(Effect.map((value) => Object.freeze(value)), Effect.mapError(() => new TimelineMalformed({})));
|
|
9
|
-
const encodeClient = (event) => project(event).pipe(Effect.flatMap((value) => Schema.encodeEffect(ClientEventJson)(value)), Effect.mapError(() => new TimelineMalformed({})));
|
|
10
|
-
const decode = (value) => guardedDecode(EventJson)(value, { onExcessProperty: "error" }).pipe(Effect.mapError(() => new TimelineMalformed({})));
|
|
11
|
-
const encodeCursor = (cursor) => Schema.encodeEffect(CursorJson)(cursor).pipe(Effect.mapError(() => new TimelineMalformed({})));
|
|
12
|
-
const decodeCursor = (value) => guardedDecode(CursorJson)(value, { onExcessProperty: "error" }).pipe(Effect.mapError(() => new TimelineMalformed({})));
|
|
13
|
-
const encodeSnapshot = (snapshot) => Schema.encodeEffect(SnapshotJson)(snapshot).pipe(Effect.mapError(() => new TimelineMalformed({})));
|
|
14
|
-
/** Copy the allowlisted lifecycle projection; cached host addresses/titles remain private. */
|
|
15
|
-
const projectPages = (value) => Schema.decodeEffect(ClientPageEvent)(value).pipe(Effect.map((projected) => Object.freeze(projected)), Effect.mapError(() => new TimelineMalformed({})));
|
|
16
|
-
const encodePages = (value) => projectPages(value).pipe(Effect.flatMap((projected) => Schema.encodeEffect(ClientPageEventJson)(projected)), Effect.mapError(() => new TimelineMalformed({})));
|
|
17
|
-
//#endregion
|
|
18
|
-
export { TimelineCursorError, TimelineGap, TimelineLimit, TimelineMalformed, decode, decodeCursor, encode, encodeClient, encodeCursor, encodePages, encodeSnapshot, project, projectPages };
|
|
19
|
-
|
|
20
|
-
//# sourceMappingURL=Timeline.mjs.map
|
package/dist/Timeline.mjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Timeline.mjs","names":["ClientEventSchema","ClientPageEventSchema"],"sources":["../src/Timeline.ts"],"sourcesContent":["import { Effect, Schema, type Stream } from \"effect\";\n\nimport { guardedDecode } from \"./internal/browser/PlanInput.ts\";\nimport {\n ClientEvent as ClientEventSchema,\n ClientEventJson,\n ClientPageEvent as ClientPageEventSchema,\n ClientPageEventJson,\n CursorJson,\n EventJson,\n SnapshotJson,\n TimelineMalformed,\n type ClientPageEvent,\n type ClientEvent,\n type Cursor,\n type Event,\n type PageEvent,\n type Selector,\n type Snapshot,\n type SnapshotOptions,\n type Stamp,\n type TimelineError,\n} from \"./TimelineData.ts\";\n\nexport {\n TimelineCursorError,\n TimelineGap,\n TimelineLimit,\n TimelineMalformed,\n type TimelineError,\n} from \"./TimelineData.ts\";\n\n/** A live host capability; its streams replay metadata, never native mutations. */\nexport interface Timeline {\n readonly snapshot: (options?: SnapshotOptions) => Effect.Effect<Snapshot, TimelineError>;\n readonly events: (selector?: Selector) => Stream.Stream<Event, TimelineError>;\n readonly now: Effect.Effect<Stamp>;\n}\n\n/** Host evidence encoding retains bounded addresses and uses decimal-string bigint offsets. */\nexport const encode = (event: Event) =>\n Schema.encodeEffect(EventJson)(event).pipe(Effect.mapError(() => new TimelineMalformed({})));\n\n/** Explicit client projection excludes host address fields even on augmented host values. */\nexport const project = (event: Event): Effect.Effect<ClientEvent, TimelineMalformed> =>\n Schema.decodeEffect(ClientEventSchema)(event).pipe(\n Effect.map((value) => Object.freeze(value)),\n Effect.mapError(() => new TimelineMalformed({})),\n );\n\nexport const encodeClient = (event: Event) =>\n project(event).pipe(\n Effect.flatMap((value) => Schema.encodeEffect(ClientEventJson)(value)),\n Effect.mapError(() => new TimelineMalformed({})),\n );\n\nexport const decode = (value: unknown): Effect.Effect<Event, TimelineMalformed> =>\n guardedDecode(EventJson)(value, { onExcessProperty: \"error\" }).pipe(\n Effect.mapError(() => new TimelineMalformed({})),\n );\n\nexport const encodeCursor = (cursor: Cursor) =>\n Schema.encodeEffect(CursorJson)(cursor).pipe(Effect.mapError(() => new TimelineMalformed({})));\n\nexport const decodeCursor = (value: unknown) =>\n guardedDecode(CursorJson)(value, { onExcessProperty: \"error\" }).pipe(\n Effect.mapError(() => new TimelineMalformed({})),\n );\n\nexport const encodeSnapshot = (snapshot: Snapshot) =>\n Schema.encodeEffect(SnapshotJson)(snapshot).pipe(\n Effect.mapError(() => new TimelineMalformed({})),\n );\n\n/** Copy the allowlisted lifecycle projection; cached host addresses/titles remain private. */\nexport const projectPages = (value: PageEvent): Effect.Effect<ClientPageEvent, TimelineMalformed> =>\n Schema.decodeEffect(ClientPageEventSchema)(value).pipe(\n Effect.map((projected) => Object.freeze(projected)),\n Effect.mapError(() => new TimelineMalformed({})),\n );\n\nexport const encodePages = (value: PageEvent) =>\n projectPages(value).pipe(\n Effect.flatMap((projected) => Schema.encodeEffect(ClientPageEventJson)(projected)),\n Effect.mapError(() => new TimelineMalformed({})),\n );\n"],"mappings":";;;;;AAwCA,MAAa,UAAU,UACrB,OAAO,aAAa,SAAS,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,OAAO,eAAe,IAAI,kBAAkB,CAAC,CAAC,CAAC,CAAC;;AAG7F,MAAa,WAAW,UACtB,OAAO,aAAaA,WAAiB,CAAC,CAAC,KAAK,CAAC,CAAC,KAC5C,OAAO,KAAK,UAAU,OAAO,OAAO,KAAK,CAAC,GAC1C,OAAO,eAAe,IAAI,kBAAkB,CAAC,CAAC,CAAC,CACjD;AAEF,MAAa,gBAAgB,UAC3B,QAAQ,KAAK,CAAC,CAAC,KACb,OAAO,SAAS,UAAU,OAAO,aAAa,eAAe,CAAC,CAAC,KAAK,CAAC,GACrE,OAAO,eAAe,IAAI,kBAAkB,CAAC,CAAC,CAAC,CACjD;AAEF,MAAa,UAAU,UACrB,cAAc,SAAS,CAAC,CAAC,OAAO,EAAE,kBAAkB,QAAQ,CAAC,CAAC,CAAC,KAC7D,OAAO,eAAe,IAAI,kBAAkB,CAAC,CAAC,CAAC,CACjD;AAEF,MAAa,gBAAgB,WAC3B,OAAO,aAAa,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,OAAO,eAAe,IAAI,kBAAkB,CAAC,CAAC,CAAC,CAAC;AAE/F,MAAa,gBAAgB,UAC3B,cAAc,UAAU,CAAC,CAAC,OAAO,EAAE,kBAAkB,QAAQ,CAAC,CAAC,CAAC,KAC9D,OAAO,eAAe,IAAI,kBAAkB,CAAC,CAAC,CAAC,CACjD;AAEF,MAAa,kBAAkB,aAC7B,OAAO,aAAa,YAAY,CAAC,CAAC,QAAQ,CAAC,CAAC,KAC1C,OAAO,eAAe,IAAI,kBAAkB,CAAC,CAAC,CAAC,CACjD;;AAGF,MAAa,gBAAgB,UAC3B,OAAO,aAAaC,eAAqB,CAAC,CAAC,KAAK,CAAC,CAAC,KAChD,OAAO,KAAK,cAAc,OAAO,OAAO,SAAS,CAAC,GAClD,OAAO,eAAe,IAAI,kBAAkB,CAAC,CAAC,CAAC,CACjD;AAEF,MAAa,eAAe,UAC1B,aAAa,KAAK,CAAC,CAAC,KAClB,OAAO,SAAS,cAAc,OAAO,aAAa,mBAAmB,CAAC,CAAC,SAAS,CAAC,GACjF,OAAO,eAAe,IAAI,kBAAkB,CAAC,CAAC,CAAC,CACjD"}
|