effect-browser 0.2.0-beta.6 → 0.2.0-beta.8
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 +507 -130
- package/dist/Browser-n-bKgBNN.d.mts +372 -0
- package/dist/Browser.d.mts +3 -189
- package/dist/Browser.mjs +9 -1
- package/dist/Browser.mjs.map +1 -1
- package/dist/{BrowserData-DPh3Oaof.d.mts → BrowserData-CPIIIHol.d.mts} +84 -10
- package/dist/BrowserData.d.mts +2 -2
- package/dist/BrowserData.mjs +106 -7
- package/dist/BrowserData.mjs.map +1 -1
- package/dist/{BrowserRuntime-BBAjpVFa.d.mts → BrowserRuntime-CFe9uUTv.d.mts} +16 -11
- package/dist/{BrowserRuntime-DImn_Oe_.mjs → BrowserRuntime-HJ1yYlFS.mjs} +4977 -4134
- package/dist/BrowserRuntime-HJ1yYlFS.mjs.map +1 -0
- package/dist/BrowserRuntime.d.mts +2 -2
- package/dist/BrowserRuntime.mjs +2 -1
- package/dist/Capture.d.mts +9 -7
- package/dist/Capture.mjs +157 -32
- package/dist/Capture.mjs.map +1 -1
- package/dist/{CaptureData-Dys0Ko9d.mjs → CaptureData-CYriZHX1.mjs} +25 -6
- package/dist/CaptureData-CYriZHX1.mjs.map +1 -0
- package/dist/CaptureData.d.mts +62 -3
- package/dist/CaptureData.mjs +2 -2
- package/dist/Chromium.d.mts +2 -2
- package/dist/Chromium.mjs +19 -10
- package/dist/Chromium.mjs.map +1 -1
- package/dist/Errors.d.mts +69 -17
- package/dist/Errors.mjs +57 -6
- package/dist/Errors.mjs.map +1 -1
- package/dist/Images-CaaPNeed.mjs +76 -0
- package/dist/Images-CaaPNeed.mjs.map +1 -0
- package/dist/OperationOptions-DAeRS6O9.mjs +55 -0
- package/dist/OperationOptions-DAeRS6O9.mjs.map +1 -0
- package/dist/PageControl.d.mts +6 -6
- package/dist/PageControl.mjs +16 -10
- package/dist/PageControl.mjs.map +1 -1
- package/dist/PageRegistry-B3q9DS3g.mjs +164 -0
- package/dist/PageRegistry-B3q9DS3g.mjs.map +1 -0
- package/dist/Plan-D8qQ48Ic.mjs +512 -0
- package/dist/Plan-D8qQ48Ic.mjs.map +1 -0
- package/dist/Plan.d.mts +3 -0
- package/dist/Plan.mjs +2 -0
- package/dist/PlanData-B668RxbQ.d.mts +4831 -0
- package/dist/PlanData.d.mts +3 -0
- package/dist/PlanData.mjs +268 -0
- package/dist/PlanData.mjs.map +1 -0
- package/dist/PlanInput-BJcPPncs.mjs +75 -0
- package/dist/PlanInput-BJcPPncs.mjs.map +1 -0
- package/dist/PublicSession-Bs61Eal8.mjs +5601 -0
- package/dist/PublicSession-Bs61Eal8.mjs.map +1 -0
- package/dist/Testing.d.mts +48 -6
- package/dist/Testing.mjs +675 -123
- package/dist/Testing.mjs.map +1 -1
- package/dist/Timeline-fV22Xk-S.d.mts +29 -0
- package/dist/Timeline.d.mts +4 -0
- package/dist/Timeline.mjs +20 -0
- package/dist/Timeline.mjs.map +1 -0
- package/dist/TimelineData-BsOn-YGZ.d.mts +3818 -0
- package/dist/TimelineData.d.mts +3 -0
- package/dist/TimelineData.mjs +482 -0
- package/dist/TimelineData.mjs.map +1 -0
- package/dist/index.d.mts +5 -1
- package/dist/index.mjs +5 -1
- package/package.json +17 -1
- package/dist/Association-BsSfBYVx.mjs +0 -138
- package/dist/Association-BsSfBYVx.mjs.map +0 -1
- package/dist/BrowserRuntime-DImn_Oe_.mjs.map +0 -1
- package/dist/CaptureData-Dys0Ko9d.mjs.map +0 -1
- package/dist/PageControlAssociation-DabEg5AR.mjs +0 -10
- package/dist/PageControlAssociation-DabEg5AR.mjs.map +0 -1
package/dist/Chromium.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Chromium.mjs","names":["BrowserRuntime.make"],"sources":["../src/internal/chromium/Data.ts","../src/internal/chromium/Process.ts","../src/internal/chromium/Session.ts","../src/Chromium.ts"],"sourcesContent":["import { Schema } from \"effect\";\n\nimport { Identifier } from \"../../BrowserData.ts\";\n\n/** Identifies this Chromium ownership lifetime, not a reusable endpoint. */\nexport class ChromiumReference extends Schema.Class<ChromiumReference>(\"ChromiumReference\")({\n provider: Schema.Literal(\"chromium\"),\n id: Identifier,\n}) {}\n\nexport class ChromiumCleanupIssue extends Schema.Class<ChromiumCleanupIssue>(\n \"ChromiumCleanupIssue\",\n)({\n step: Schema.Literals([\n \"fence\",\n \"capture\",\n \"initialization\",\n \"disconnect\",\n \"terminate\",\n \"profile\",\n ]),\n reason: Schema.Literals([\"timeout\", \"failed\", \"interrupted\"]),\n}) {}\n\n/** Connection teardown and observed process exit are separate facts; no provider status exists. */\nexport class ChromiumCleanupResult extends Schema.Class<ChromiumCleanupResult>(\n \"ChromiumCleanupResult\",\n)({\n reference: ChromiumReference,\n ownership: Schema.Literals([\"owned\", \"borrowed\"]),\n connection: Schema.Literals([\"closed\", \"failed\", \"not-connected\", \"pending\"]),\n process: Schema.Literals([\"terminated\", \"unknown\", \"not-owned\"]),\n issues: Schema.Array(ChromiumCleanupIssue).check(Schema.isMaxLength(16)),\n}) {}\n\nconst Text = Schema.NonEmptyString.check(\n Schema.isMaxLength(4096),\n // oxlint-disable-next-line eslint/no-control-regex -- NUL is one of the characters it rejects\n Schema.isPattern(/^[^\\u0000\\r\\n]+$/u),\n);\n\nconst Port = Schema.Int.check(Schema.isBetween({ minimum: 1, maximum: 65535 }));\n\n/** Only a concrete loopback WebSocket is admitted: no HTTP discovery redirects or remote DNS. */\nexport const ChromiumEndpoint = Text.check(\n Schema.makeFilter((value) => {\n try {\n const url = new URL(value);\n\n return (\n url.protocol === \"ws:\" &&\n [\"127.0.0.1\", \"[::1]\"].includes(url.hostname) &&\n Schema.is(Port)(Number(url.port)) &&\n !url.username &&\n !url.password &&\n !url.search &&\n !url.hash &&\n /^\\/devtools\\/browser\\/[A-Za-z0-9_-]+$/u.test(url.pathname)\n );\n } catch {\n return false;\n }\n }),\n);\n\nconst ProxyServer = Text.check(\n Schema.makeFilter((value) => {\n try {\n const url = new URL(value);\n\n return (\n [\"http:\", \"https:\", \"socks5:\"].includes(url.protocol) &&\n url.hostname.length > 0 &&\n !url.username &&\n !url.password &&\n !url.search &&\n !url.hash &&\n [\"\", \"/\"].includes(url.pathname)\n );\n } catch {\n return false;\n }\n }),\n);\n\n/** These arguments belong to the launcher; silently overriding them would change ownership. */\nconst Argument = Text.check(\n Schema.makeFilter(\n (value) =>\n value.startsWith(\"--\") &&\n !/^--(?:user-data-dir|remote-debugging[^=]*|headless|no-sandbox|disable-setuid-sandbox|single-process|proxy-server|proxy-bypass-list)(?:=|$)/u.test(\n value,\n ),\n ),\n);\n\nexport const ChromiumLaunch = Schema.Struct({\n executablePath: Schema.optionalKey(Text),\n headless: Schema.optionalKey(Schema.Boolean),\n /** Enabled by default; a trusted host must explicitly choose a sandbox exception. */\n chromiumSandbox: Schema.optionalKey(Schema.Boolean),\n args: Schema.optionalKey(Schema.Array(Argument).check(Schema.isMaxLength(64))),\n proxy: Schema.optionalKey(\n Schema.Struct({\n server: ProxyServer,\n bypass: Schema.optionalKey(Text),\n }),\n ),\n startupTimeoutMillis: Schema.optionalKey(\n Schema.Int.check(Schema.isBetween({ minimum: 1, maximum: 60000 })),\n ),\n});\n\nexport type ChromiumLaunch = typeof ChromiumLaunch.Type;\n","// rc.115's NodeChildProcessSpawner exposes leader exit, but its bounded group wait can\n// succeed with surviving members. This boundary must observe the leader AND group gone.\n// @effect-diagnostics-next-line nodeBuiltinImport:off\nimport { spawn, type ChildProcess } from \"node:child_process\";\n// FileSystem.remove exposes recursive/force only, not rm's per-entry OS-error retries.\n// Keep native profile creation/read/removal together; removal follows confirmed group exit.\n// @effect-diagnostics-next-line nodeBuiltinImport:off\nimport { mkdtemp, readFile, rm } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\n\nimport { Clock, Duration, Effect, Exit, Path, Redacted, Schema } from \"effect\";\n\nimport { Reasons, BrowserError } from \"../../Errors.ts\";\nimport { ChromiumEndpoint, type ChromiumLaunch } from \"./Data.ts\";\n\nexport interface ChromiumProcess {\n readonly connection: (\n timeoutMillis: number,\n ) => Effect.Effect<Redacted.Redacted<string>, BrowserError>;\n readonly terminate: Effect.Effect<void, BrowserError>;\n readonly removeProfile: Effect.Effect<void, BrowserError>;\n}\n\n/** Explicit host sandbox/proxy choices; the owned profile and debugger endpoint cannot be replaced. */\nexport const launchArguments = (options: ChromiumLaunch, directory: string): string[] => [\n \"--no-first-run\",\n \"--no-default-browser-check\",\n \"--remote-debugging-address=127.0.0.1\",\n \"--remote-debugging-port=0\",\n \"--remote-debugging-pipe\",\n `--user-data-dir=${directory}`,\n ...(options.headless === false ? [] : [\"--headless=new\"]),\n ...(options.chromiumSandbox === false ? [\"--no-sandbox\"] : []),\n ...(options.proxy === undefined\n ? []\n : [\n `--proxy-server=${options.proxy.server}`,\n // Chromium otherwise bypasses proxies for loopback. The host may deliberately override it.\n `--proxy-bypass-list=${options.proxy.bypass ?? \"<-loopback>\"}`,\n ]),\n ...(options.args ?? []),\n \"about:blank\",\n];\n\nconst failure = (operation: \"launch\" | \"connect\" | \"close\", reason: BrowserError[\"reason\"]) =>\n BrowserError.make({\n operation,\n reason,\n outcome: operation === \"close\" ? \"unknown\" : \"undispatched\",\n });\n\nconst exited = (child: ChildProcess) => child.exitCode !== null || child.signalCode !== null;\n\n/** POSIX groups keep Chromium's helpers inside the same owned termination boundary. */\nconst alive = (pid: number): boolean => {\n try {\n process.kill(-pid, 0);\n\n return true;\n } catch (error) {\n if (error instanceof Error && \"code\" in error && error.code === \"ESRCH\") return false;\n throw error;\n }\n};\n\nconst signalGroup = (pid: number, signal: NodeJS.Signals) => {\n try {\n process.kill(-pid, signal);\n } catch (error) {\n if (!(error instanceof Error && \"code\" in error && error.code === \"ESRCH\")) throw error;\n }\n};\n\n/** Called once; observes parent and helper exit, rather than treating a sent signal as cleanup. */\nconst terminate = Effect.fnUntraced(function* (\n child: ChildProcess,\n pid: number,\n clock: Clock.Clock,\n): Effect.fn.Return<void, BrowserError> {\n const stopped = Effect.try({\n try: () => exited(child) && !alive(pid),\n catch: () => failure(\"close\", Reasons.Failed.make({})),\n });\n\n const signal = (value: NodeJS.Signals) =>\n Effect.try({\n try: () => signalGroup(pid, value),\n catch: () => failure(\"close\", Reasons.Failed.make({})),\n });\n\n const pause = clock.sleep(Duration.millis(20));\n\n yield* signal(\"SIGTERM\");\n const graceful = clock.monotonicTimeNanosUnsafe() + 1_500_000_000n;\n\n while (!(yield* stopped) && clock.monotonicTimeNanosUnsafe() < graceful) yield* pause;\n if (yield* stopped) return;\n yield* signal(\"SIGKILL\");\n const forced = clock.monotonicTimeNanosUnsafe() + 1_000_000_000n;\n\n while (!(yield* stopped) && clock.monotonicTimeNanosUnsafe() < forced) yield* pause;\n if (!(yield* stopped)) return yield* failure(\"close\", Reasons.Timeout.make({}));\n});\n\n/** Start only Chromium's process. The shared owner later opens its sole CDP connection. */\nexport const launch = Effect.fnUntraced(function* (\n options: ChromiumLaunch,\n): Effect.fn.Return<ChromiumProcess, BrowserError> {\n if (process.platform === \"win32\") return yield* failure(\"launch\", Reasons.Unsupported.make({}));\n const path = yield* Path.Path.pipe(Effect.provide(Path.layer));\n const clock = yield* Clock.Clock;\n\n const executable =\n options.executablePath ??\n (yield* Effect.tryPromise({\n try: () => import(\"playwright-core\").then(({ chromium }) => chromium.executablePath()),\n catch: () => failure(\"launch\", Reasons.Failed.make({})),\n }));\n\n const directory = yield* Effect.tryPromise({\n try: () => mkdtemp(path.join(tmpdir(), \"effect-browser-chromium-\")),\n catch: () => failure(\"launch\", Reasons.Failed.make({})),\n });\n\n const removeProfile = Effect.tryPromise({\n try: () => rm(directory, { recursive: true, force: true, maxRetries: 5, retryDelay: 50 }),\n catch: () => failure(\"close\", Reasons.Failed.make({})),\n });\n\n let child: ChildProcess | undefined;\n\n return yield* Effect.gen(function* () {\n // Node reports a spawn's outcome on a later tick, so its listeners attach in the same turn.\n const launched = yield* Effect.callback<ChildProcess, BrowserError>((resume) => {\n const failed = () => resume(Effect.fail(failure(\"launch\", Reasons.Failed.make({}))));\n let spawned: ChildProcess;\n\n try {\n spawned = spawn(executable, launchArguments(options, directory), {\n cwd: directory,\n // Chromium watches fd 3 for EOF and closes the browser when the host dies, including\n // SIGKILL before connect. Keep its fd 3/4 pipe pair owned by this ChildProcess; send no\n // commands on it. The shared Playwright driver still controls the loopback endpoint.\n stdio: [\"ignore\", \"ignore\", \"ignore\", \"pipe\", \"pipe\"],\n detached: true,\n });\n } catch {\n failed();\n\n return;\n }\n\n child = spawned;\n spawned.once(\"spawn\", () => resume(Effect.succeed(spawned)));\n spawned.once(\"error\", failed);\n });\n\n const pid = launched.pid;\n\n if (pid === undefined) return yield* failure(\"launch\", Reasons.Failed.make({}));\n\n // One termination continues to its own bounded group-exit decision even if a waiter cancels.\n const closing = yield* Effect.cached(\n terminate(launched, pid, clock).pipe(Effect.uninterruptible),\n );\n\n return {\n connection: (timeoutMillis) =>\n Effect.gen(function* () {\n const deadline =\n clock.monotonicTimeNanosUnsafe() +\n BigInt(Math.ceil(Math.min(timeoutMillis, options.startupTimeoutMillis ?? 15000))) *\n 1_000_000n;\n\n while (clock.monotonicTimeNanosUnsafe() < deadline) {\n if (exited(launched)) return yield* failure(\"connect\", Reasons.Closed.make({}));\n\n const portFile = yield* Effect.tryPromise({\n try: (signal) =>\n readFile(path.join(directory, \"DevToolsActivePort\"), {\n encoding: \"utf8\",\n signal,\n }).catch((error: unknown) => {\n if (error instanceof Error && \"code\" in error && error.code === \"ENOENT\")\n return undefined;\n throw error;\n }),\n catch: () => failure(\"connect\", Reasons.Transport.make({})),\n });\n\n // Chromium creates DevToolsActivePort before it writes the port and path into it. A\n // file without both lines is startup still in progress, not an endpoint; only a\n // complete file that is not a loopback DevTools endpoint is malformed.\n const lines = portFile === undefined ? [] : portFile.trim().split(\"\\n\");\n\n if (lines.length >= 2) {\n const endpoint = `ws://127.0.0.1:${lines[0]}${lines[1]}`;\n\n if (!Schema.is(ChromiumEndpoint)(endpoint))\n return yield* failure(\"connect\", Reasons.Malformed.make({}));\n\n return Redacted.make(endpoint);\n }\n yield* clock.sleep(Duration.millis(20));\n }\n\n return yield* failure(\"connect\", Reasons.Timeout.make({}));\n }),\n terminate: closing,\n removeProfile,\n } satisfies ChromiumProcess;\n }).pipe(\n Effect.onExit((exit) =>\n Exit.isSuccess(exit)\n ? Effect.void\n : Effect.gen(function* () {\n if (child?.pid === undefined) {\n yield* removeProfile.pipe(Effect.ignore);\n\n return;\n }\n const stopped = yield* terminate(child, child.pid, clock).pipe(Effect.exit);\n\n if (Exit.isSuccess(stopped)) yield* removeProfile.pipe(Effect.ignore);\n }),\n ),\n );\n});\n","import { Crypto, Effect, Option, Redacted } from \"effect\";\n\nimport type { Lifetime, Source } from \"../../BrowserRuntime.ts\";\nimport { BrowserError, Reasons } from \"../../Errors.ts\";\nimport { cleanupStep, reported, type ConnectionCleanup } from \"../browser/ConnectionCleanup.ts\";\nimport { checked } from \"../browser/PublicSession.ts\";\nimport { randomUuid } from \"../browser/Random.ts\";\nimport {\n ChromiumCleanupIssue,\n ChromiumCleanupResult,\n ChromiumEndpoint,\n ChromiumReference,\n type ChromiumLaunch,\n} from \"./Data.ts\";\nimport { launch, type ChromiumProcess } from \"./Process.ts\";\n\nexport interface ChromiumLease extends Lifetime {\n readonly reference: ChromiumReference;\n readonly closeChecked: Effect.Effect<ChromiumCleanupResult, BrowserError>;\n readonly release: Effect.Effect<ChromiumCleanupResult>;\n readonly cleanupResult: Effect.Effect<Option.Option<ChromiumCleanupResult>>;\n}\n\n/** Each teardown step runs even when a preceding step fails. Only observed exit permits profile removal. */\nexport const makeChromiumCleanup = Effect.fnUntraced(function* (\n reference: ChromiumReference,\n local: ConnectionCleanup,\n process: ChromiumProcess | undefined,\n) {\n let latest: ChromiumCleanupResult | undefined;\n\n const close = yield* Effect.cached(\n Effect.uninterruptible(\n Effect.gen(function* () {\n const issues: ChromiumCleanupIssue[] = [];\n\n const step = <A, E>(name: ChromiumCleanupIssue[\"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(ChromiumCleanupIssue.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 terminated =\n process === undefined ? undefined : yield* step(\"terminate\", process.terminate);\n\n if (process !== undefined && terminated !== undefined && terminated._tag === \"Success\")\n yield* step(\"profile\", process.removeProfile);\n\n const result = ChromiumCleanupResult.make({\n reference,\n ownership: process === undefined ? \"borrowed\" : \"owned\",\n connection: disconnected._tag === \"Success\" ? disconnected.value : \"failed\",\n process:\n terminated === undefined\n ? \"not-owned\"\n : terminated._tag === \"Success\"\n ? \"terminated\"\n : \"unknown\",\n issues,\n });\n\n Object.freeze(result.issues);\n latest = Object.freeze(result);\n\n return latest;\n }),\n ),\n );\n\n return { close, result: Effect.sync(() => Option.fromNullishOr(latest)) };\n});\n\nconst acquireChromium =\n (\n endpoint: Redacted.Redacted<string> | undefined,\n options: ChromiumLaunch,\n onCleanup?: (result: ChromiumCleanupResult) => Effect.Effect<void>,\n ): Source<ChromiumLease, BrowserError, Crypto.Crypto> =>\n (local) =>\n Effect.uninterruptible(\n Effect.gen(function* () {\n // Drawn first: a draw after the spawn would sit between it and finalizer registration.\n const id = yield* randomUuid(yield* Crypto.Crypto);\n // The process cannot escape between spawn and finalizer registration. Startup waiting happens\n // later in connect, where it is interruptible and the owning finalizer is already installed.\n const process = endpoint === undefined ? yield* launch(options) : undefined;\n const reference = Object.freeze(ChromiumReference.make({ provider: \"chromium\", id }));\n\n const cleanup = yield* makeChromiumCleanup(reference, local, process);\n let closing = false;\n\n const release = yield* Effect.cached(\n Effect.gen(function* () {\n closing = true;\n const result = yield* cleanup.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: (timeoutMillis) =>\n Effect.suspend(() => {\n if (closing)\n return Effect.fail(\n BrowserError.make({\n operation: \"connect\",\n reason: Reasons.Closed.make({}),\n outcome: \"undispatched\",\n }),\n );\n if (process !== undefined) return process.connection(timeoutMillis);\n\n return endpoint === undefined\n ? Effect.fail(\n BrowserError.make({\n operation: \"connect\",\n reason: Reasons.Configuration.make({}),\n outcome: \"undispatched\",\n }),\n )\n : checked(ChromiumEndpoint, Redacted.value(endpoint), \"connect\").pipe(\n Effect.map(Redacted.make),\n );\n }),\n release,\n closeChecked: release.pipe(\n Effect.filterOrFail(\n (result) =>\n result.connection === \"closed\" &&\n result.issues.length === 0 &&\n (result.ownership === \"borrowed\"\n ? result.process === \"not-owned\"\n : result.process === \"terminated\"),\n () =>\n BrowserError.make({\n operation: \"close\",\n reason: Reasons.Failed.make({}),\n outcome: \"unknown\",\n }),\n ),\n ),\n cleanupResult: cleanup.result,\n controlRetired: cleanup.result.pipe(\n Effect.map(\n (result) =>\n Option.isSome(result) &&\n result.value.ownership === \"owned\" &&\n result.value.process === \"terminated\",\n ),\n ),\n } satisfies ChromiumLease;\n }),\n );\n\nexport const ownedChromium = (\n options: ChromiumLaunch,\n onCleanup?: (result: ChromiumCleanupResult) => Effect.Effect<void>,\n) => acquireChromium(undefined, options, onCleanup);\n\nexport const borrowedChromium = (\n endpoint: Redacted.Redacted<string>,\n onCleanup?: (result: ChromiumCleanupResult) => Effect.Effect<void>,\n) => acquireChromium(endpoint, {}, onCleanup);\n","import { Context, Crypto, Effect, Layer, type Option, Redacted, type Scope } from \"effect\";\n\nimport type { BrowserSession, OpenOptions } from \"./Browser.ts\";\nimport type { AutomationOptions, BrowserPolicy, Viewport } from \"./BrowserData.ts\";\nimport * as BrowserRuntime from \"./BrowserRuntime.ts\";\nimport { BrowserError, Reasons, type InitializationError } from \"./Errors.ts\";\nimport { checked } from \"./internal/browser/PublicSession.ts\";\nimport {\n ChromiumEndpoint,\n ChromiumLaunch,\n type ChromiumCleanupResult,\n type ChromiumReference,\n} from \"./internal/chromium/Data.ts\";\nimport { borrowedChromium, ownedChromium } from \"./internal/chromium/Session.ts\";\n\nexport {\n ChromiumCleanupIssue,\n ChromiumCleanupResult,\n ChromiumLaunch,\n ChromiumReference,\n} from \"./internal/chromium/Data.ts\";\n\n/** Host-only process configuration. Building this layer neither loads Playwright nor starts Chromium. */\nexport interface ChromiumOptions extends AutomationOptions {\n readonly launch?: ChromiumLaunch;\n readonly viewport?: Viewport;\n readonly onCleanup?: (result: ChromiumCleanupResult) => Effect.Effect<void>;\n}\n\n/** An owned or borrowed Chromium lifetime with one modeled browser connection. */\nexport interface ChromiumSession<E = never> extends BrowserSession<E> {\n readonly reference: ChromiumReference;\n readonly closeChecked: Effect.Effect<ChromiumCleanupResult, BrowserError>;\n readonly close: Effect.Effect<ChromiumCleanupResult>;\n readonly cleanupResult: Effect.Effect<Option.Option<ChromiumCleanupResult>>;\n}\n\nexport interface ChromiumAcquisition<E = never> {\n readonly reference: ChromiumReference;\n readonly failure: Effect.Effect<never, E | InitializationError>;\n readonly connect: Effect.Effect<ChromiumSession<E>, BrowserError | InitializationError | E>;\n readonly close: Effect.Effect<ChromiumCleanupResult>;\n}\n\nexport interface ChromiumAttachRequest<E = never, R = never> extends OpenOptions<E, R> {\n readonly policy: BrowserPolicy;\n /** Resolve this exact target; without it, multiple open pages are an ambiguity error. */\n readonly target?: { readonly targetId: string };\n}\n\nexport class Chromium extends Context.Service<\n Chromium,\n {\n readonly acquire: <E = never, R = never>(\n policy: BrowserPolicy,\n request?: OpenOptions<E, R>,\n ) => Effect.Effect<ChromiumAcquisition<E>, BrowserError, Scope.Scope | Exclude<R, Scope.Scope>>;\n readonly launch: <E = never, R = never>(\n policy: BrowserPolicy,\n request?: OpenOptions<E, R>,\n ) => Effect.Effect<\n ChromiumSession<E>,\n BrowserError | InitializationError | E,\n Scope.Scope | Exclude<R, Scope.Scope>\n >;\n /** A concrete loopback ws://.../devtools/browser/... endpoint; this scope owns only its connection. */\n readonly attach: <E = never, R = never>(\n endpoint: Redacted.Redacted<string>,\n request: ChromiumAttachRequest<E, R>,\n ) => Effect.Effect<\n ChromiumSession<E>,\n BrowserError | InitializationError | E,\n Scope.Scope | Exclude<R, Scope.Scope>\n >;\n }\n>()(\"effect-browser/Chromium\") {\n /** Launch through the configured service; compose with Browser.scoped for supervised ownership. */\n static launch<E = never, R = never>(policy: BrowserPolicy, request?: OpenOptions<E, R>) {\n return Effect.flatMap(Chromium, (browser) => browser.launch(policy, request));\n }\n\n /** Acquire the process lifetime before connecting, using the caller's scope. */\n static acquire<E = never, R = never>(policy: BrowserPolicy, request?: OpenOptions<E, R>) {\n return Effect.flatMap(Chromium, (browser) => browser.acquire(policy, request));\n }\n\n /** Borrow a concrete loopback endpoint; cleanup never terminates its external process. */\n static attach<E = never, R = never>(\n endpoint: Redacted.Redacted<string>,\n request: ChromiumAttachRequest<E, R>,\n ) {\n return Effect.flatMap(Chromium, (browser) => browser.attach(endpoint, request));\n }\n\n /** Chromium references, connection ids and handoff tokens come from the required `Crypto`. */\n static layer(options: ChromiumOptions = {}): Layer.Layer<Chromium, BrowserError, Crypto.Crypto> {\n return Layer.effect(\n Chromium,\n Effect.gen(function* () {\n const launchInput = yield* checked(ChromiumLaunch, options.launch ?? {}, \"configure\");\n\n const launch = Object.freeze({\n ...launchInput,\n ...(launchInput.args === undefined ? {} : { args: Object.freeze([...launchInput.args]) }),\n ...(launchInput.proxy === undefined\n ? {}\n : { proxy: Object.freeze({ ...launchInput.proxy }) }),\n });\n\n if (Object.prototype.hasOwnProperty.call(options, \"bootstrap\"))\n return yield* BrowserError.make({\n operation: \"configure\",\n reason: Reasons.Configuration.make({}),\n outcome: \"undispatched\",\n });\n\n const runtime = yield* BrowserRuntime.make({\n implementation: \"chromium-playwright-cdp\",\n ...(options.viewport === undefined ? {} : { viewport: options.viewport }),\n automation: {\n ...(options.actionTimeoutMillis === undefined\n ? {}\n : { actionTimeoutMillis: options.actionTimeoutMillis }),\n ...(options.maxPages === undefined ? {} : { maxPages: options.maxPages }),\n ...(options.maxHostReads === undefined ? {} : { maxHostReads: options.maxHostReads }),\n ...(options.initialPage === undefined ? {} : { initialPage: options.initialPage }),\n ...(options.popupPolicy === undefined ? {} : { popupPolicy: options.popupPolicy }),\n ...(options.dialogPolicy === undefined ? {} : { dialogPolicy: options.dialogPolicy }),\n ...(options.pageControl === undefined ? {} : { pageControl: options.pageControl }),\n },\n });\n\n const crypto = yield* Crypto.Crypto;\n\n const acquire = Effect.fnUntraced(function* <E = never, R = never>(\n policy: BrowserPolicy,\n request: OpenOptions<E, R> = {},\n attachment?: { readonly endpoint: Redacted.Redacted<string>; readonly targetId?: string },\n ) {\n const source =\n attachment === undefined\n ? ownedChromium(launch, options.onCleanup)\n : borrowedChromium(attachment.endpoint, options.onCleanup);\n\n const acquired = yield* runtime.acquire(\n policy,\n (cleanup, deadline) =>\n source(cleanup, deadline).pipe(Effect.provideService(Crypto.Crypto, crypto)),\n {\n ...request,\n ...(attachment === undefined\n ? {}\n : {\n existingTarget:\n attachment.targetId === undefined ? {} : { targetId: attachment.targetId },\n }),\n },\n );\n\n const connected = yield* Effect.cached(\n acquired.connect.pipe(\n Effect.map(({ session }): ChromiumSession<E> =>\n Object.assign(session, {\n reference: acquired.reference,\n closeChecked: session.closeChecked.pipe(\n Effect.andThen(acquired.lifetime.closeChecked),\n ),\n close: acquired.close,\n cleanupResult: acquired.lifetime.cleanupResult,\n }),\n ),\n ),\n );\n\n return {\n reference: acquired.reference,\n failure: acquired.failure,\n close: acquired.close,\n connect: acquired.connect.pipe(Effect.andThen(connected)),\n } satisfies ChromiumAcquisition<E>;\n });\n\n return Chromium.of({\n acquire,\n launch: (policy, request) =>\n acquire(policy, request).pipe(Effect.flatMap((acquired) => acquired.connect)),\n attach: (endpoint, request) =>\n Effect.gen(function* () {\n const address = yield* checked(ChromiumEndpoint, Redacted.value(endpoint), \"connect\");\n\n return yield* (yield* acquire(request.policy, request, {\n endpoint: Redacted.make(address),\n ...(request.target === undefined ? {} : { targetId: request.target.targetId }),\n })).connect;\n }),\n });\n }),\n );\n }\n}\n"],"mappings":";;;;;;;;;AAKA,IAAa,oBAAb,cAAuC,OAAO,MAAyB,mBAAmB,CAAC,CAAC;CAC1F,UAAU,OAAO,QAAQ,UAAU;CACnC,IAAI;AACN,CAAC,CAAC,CAAC,CAAC;AAEJ,IAAa,uBAAb,cAA0C,OAAO,MAC/C,sBACF,CAAC,CAAC;CACA,MAAM,OAAO,SAAS;EACpB;EACA;EACA;EACA;EACA;EACA;CACF,CAAC;CACD,QAAQ,OAAO,SAAS;EAAC;EAAW;EAAU;CAAa,CAAC;AAC9D,CAAC,CAAC,CAAC,CAAC;;AAGJ,IAAa,wBAAb,cAA2C,OAAO,MAChD,uBACF,CAAC,CAAC;CACA,WAAW;CACX,WAAW,OAAO,SAAS,CAAC,SAAS,UAAU,CAAC;CAChD,YAAY,OAAO,SAAS;EAAC;EAAU;EAAU;EAAiB;CAAS,CAAC;CAC5E,SAAS,OAAO,SAAS;EAAC;EAAc;EAAW;CAAW,CAAC;CAC/D,QAAQ,OAAO,MAAM,oBAAoB,CAAC,CAAC,MAAM,OAAO,YAAY,EAAE,CAAC;AACzE,CAAC,CAAC,CAAC,CAAC;AAEJ,MAAM,OAAO,OAAO,eAAe,MACjC,OAAO,YAAY,IAAI,GAEvB,OAAO,UAAU,mBAAmB,CACtC;AAEA,MAAM,OAAO,OAAO,IAAI,MAAM,OAAO,UAAU;CAAE,SAAS;CAAG,SAAS;AAAM,CAAC,CAAC;;AAG9E,MAAa,mBAAmB,KAAK,MACnC,OAAO,YAAY,UAAU;CAC3B,IAAI;EACF,MAAM,MAAM,IAAI,IAAI,KAAK;EAEzB,OACE,IAAI,aAAa,SACjB,CAAC,aAAa,OAAO,CAAC,CAAC,SAAS,IAAI,QAAQ,KAC5C,OAAO,GAAG,IAAI,CAAC,CAAC,OAAO,IAAI,IAAI,CAAC,KAChC,CAAC,IAAI,YACL,CAAC,IAAI,YACL,CAAC,IAAI,UACL,CAAC,IAAI,QACL,yCAAyC,KAAK,IAAI,QAAQ;CAE9D,QAAQ;EACN,OAAO;CACT;AACF,CAAC,CACH;AAEA,MAAM,cAAc,KAAK,MACvB,OAAO,YAAY,UAAU;CAC3B,IAAI;EACF,MAAM,MAAM,IAAI,IAAI,KAAK;EAEzB,OACE;GAAC;GAAS;GAAU;EAAS,CAAC,CAAC,SAAS,IAAI,QAAQ,KACpD,IAAI,SAAS,SAAS,KACtB,CAAC,IAAI,YACL,CAAC,IAAI,YACL,CAAC,IAAI,UACL,CAAC,IAAI,QACL,CAAC,IAAI,GAAG,CAAC,CAAC,SAAS,IAAI,QAAQ;CAEnC,QAAQ;EACN,OAAO;CACT;AACF,CAAC,CACH;;AAGA,MAAM,WAAW,KAAK,MACpB,OAAO,YACJ,UACC,MAAM,WAAW,IAAI,KACrB,CAAC,8IAA8I,KAC7I,KACF,CACJ,CACF;AAEA,MAAa,iBAAiB,OAAO,OAAO;CAC1C,gBAAgB,OAAO,YAAY,IAAI;CACvC,UAAU,OAAO,YAAY,OAAO,OAAO;;CAE3C,iBAAiB,OAAO,YAAY,OAAO,OAAO;CAClD,MAAM,OAAO,YAAY,OAAO,MAAM,QAAQ,CAAC,CAAC,MAAM,OAAO,YAAY,EAAE,CAAC,CAAC;CAC7E,OAAO,OAAO,YACZ,OAAO,OAAO;EACZ,QAAQ;EACR,QAAQ,OAAO,YAAY,IAAI;CACjC,CAAC,CACH;CACA,sBAAsB,OAAO,YAC3B,OAAO,IAAI,MAAM,OAAO,UAAU;EAAE,SAAS;EAAG,SAAS;CAAM,CAAC,CAAC,CACnE;AACF,CAAC;;;;ACvFD,MAAa,mBAAmB,SAAyB,cAAgC;CACvF;CACA;CACA;CACA;CACA;CACA,mBAAmB;CACnB,GAAI,QAAQ,aAAa,QAAQ,CAAC,IAAI,CAAC,gBAAgB;CACvD,GAAI,QAAQ,oBAAoB,QAAQ,CAAC,cAAc,IAAI,CAAC;CAC5D,GAAI,QAAQ,UAAU,KAAA,IAClB,CAAC,IACD,CACE,kBAAkB,QAAQ,MAAM,UAEhC,uBAAuB,QAAQ,MAAM,UAAU,eACjD;CACJ,GAAI,QAAQ,QAAQ,CAAC;CACrB;AACF;AAEA,MAAM,WAAW,WAA2C,WAC1D,aAAa,KAAK;CAChB;CACA;CACA,SAAS,cAAc,UAAU,YAAY;AAC/C,CAAC;AAEH,MAAM,UAAU,UAAwB,MAAM,aAAa,QAAQ,MAAM,eAAe;;AAGxF,MAAM,SAAS,QAAyB;CACtC,IAAI;EACF,QAAQ,KAAK,CAAC,KAAK,CAAC;EAEpB,OAAO;CACT,SAAS,OAAO;EACd,IAAI,iBAAiB,SAAS,UAAU,SAAS,MAAM,SAAS,SAAS,OAAO;EAChF,MAAM;CACR;AACF;AAEA,MAAM,eAAe,KAAa,WAA2B;CAC3D,IAAI;EACF,QAAQ,KAAK,CAAC,KAAK,MAAM;CAC3B,SAAS,OAAO;EACd,IAAI,EAAE,iBAAiB,SAAS,UAAU,SAAS,MAAM,SAAS,UAAU,MAAM;CACpF;AACF;;AAGA,MAAM,YAAY,OAAO,WAAW,WAClC,OACA,KACA,OACsC;CACtC,MAAM,UAAU,OAAO,IAAI;EACzB,WAAW,OAAO,KAAK,KAAK,CAAC,MAAM,GAAG;EACtC,aAAa,QAAQ,SAAS,QAAQ,OAAO,KAAK,CAAC,CAAC,CAAC;CACvD,CAAC;CAED,MAAM,UAAU,UACd,OAAO,IAAI;EACT,WAAW,YAAY,KAAK,KAAK;EACjC,aAAa,QAAQ,SAAS,QAAQ,OAAO,KAAK,CAAC,CAAC,CAAC;CACvD,CAAC;CAEH,MAAM,QAAQ,MAAM,MAAM,SAAS,OAAO,EAAE,CAAC;CAE7C,OAAO,OAAO,SAAS;CACvB,MAAM,WAAW,MAAM,yBAAyB,IAAI;CAEpD,OAAO,EAAE,OAAO,YAAY,MAAM,yBAAyB,IAAI,UAAU,OAAO;CAChF,IAAI,OAAO,SAAS;CACpB,OAAO,OAAO,SAAS;CACvB,MAAM,SAAS,MAAM,yBAAyB,IAAI;CAElD,OAAO,EAAE,OAAO,YAAY,MAAM,yBAAyB,IAAI,QAAQ,OAAO;CAC9E,IAAI,EAAE,OAAO,UAAU,OAAO,OAAO,QAAQ,SAAS,QAAQ,QAAQ,KAAK,CAAC,CAAC,CAAC;AAChF,CAAC;;AAGD,MAAa,SAAS,OAAO,WAAW,WACtC,SACiD;CACjD,IAAI,QAAQ,aAAa,SAAS,OAAO,OAAO,QAAQ,UAAU,QAAQ,YAAY,KAAK,CAAC,CAAC,CAAC;CAC9F,MAAM,OAAO,OAAO,KAAK,KAAK,KAAK,OAAO,QAAQ,KAAK,KAAK,CAAC;CAC7D,MAAM,QAAQ,OAAO,MAAM;CAE3B,MAAM,aACJ,QAAQ,mBACP,OAAO,OAAO,WAAW;EACxB,WAAW,OAAO,kBAAkB,CAAC,MAAM,EAAE,eAAe,SAAS,eAAe,CAAC;EACrF,aAAa,QAAQ,UAAU,QAAQ,OAAO,KAAK,CAAC,CAAC,CAAC;CACxD,CAAC;CAEH,MAAM,YAAY,OAAO,OAAO,WAAW;EACzC,WAAW,QAAQ,KAAK,KAAK,OAAO,GAAG,0BAA0B,CAAC;EAClE,aAAa,QAAQ,UAAU,QAAQ,OAAO,KAAK,CAAC,CAAC,CAAC;CACxD,CAAC;CAED,MAAM,gBAAgB,OAAO,WAAW;EACtC,WAAW,GAAG,WAAW;GAAE,WAAW;GAAM,OAAO;GAAM,YAAY;GAAG,YAAY;EAAG,CAAC;EACxF,aAAa,QAAQ,SAAS,QAAQ,OAAO,KAAK,CAAC,CAAC,CAAC;CACvD,CAAC;CAED,IAAI;CAEJ,OAAO,OAAO,OAAO,IAAI,aAAa;EAEpC,MAAM,WAAW,OAAO,OAAO,UAAsC,WAAW;GAC9E,MAAM,eAAe,OAAO,OAAO,KAAK,QAAQ,UAAU,QAAQ,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;GACnF,IAAI;GAEJ,IAAI;IACF,UAAU,MAAM,YAAY,gBAAgB,SAAS,SAAS,GAAG;KAC/D,KAAK;KAIL,OAAO;MAAC;MAAU;MAAU;MAAU;MAAQ;KAAM;KACpD,UAAU;IACZ,CAAC;GACH,QAAQ;IACN,OAAO;IAEP;GACF;GAEA,QAAQ;GACR,QAAQ,KAAK,eAAe,OAAO,OAAO,QAAQ,OAAO,CAAC,CAAC;GAC3D,QAAQ,KAAK,SAAS,MAAM;EAC9B,CAAC;EAED,MAAM,MAAM,SAAS;EAErB,IAAI,QAAQ,KAAA,GAAW,OAAO,OAAO,QAAQ,UAAU,QAAQ,OAAO,KAAK,CAAC,CAAC,CAAC;EAO9E,OAAO;GACL,aAAa,kBACX,OAAO,IAAI,aAAa;IACtB,MAAM,WACJ,MAAM,yBAAyB,IAC/B,OAAO,KAAK,KAAK,KAAK,IAAI,eAAe,QAAQ,wBAAwB,IAAK,CAAC,CAAC,IAC9E;IAEJ,OAAO,MAAM,yBAAyB,IAAI,UAAU;KAClD,IAAI,OAAO,QAAQ,GAAG,OAAO,OAAO,QAAQ,WAAW,QAAQ,OAAO,KAAK,CAAC,CAAC,CAAC;KAE9E,MAAM,WAAW,OAAO,OAAO,WAAW;MACxC,MAAM,WACJ,SAAS,KAAK,KAAK,WAAW,oBAAoB,GAAG;OACnD,UAAU;OACV;MACF,CAAC,CAAC,CAAC,OAAO,UAAmB;OAC3B,IAAI,iBAAiB,SAAS,UAAU,SAAS,MAAM,SAAS,UAC9D,OAAO,KAAA;OACT,MAAM;MACR,CAAC;MACH,aAAa,QAAQ,WAAW,QAAQ,UAAU,KAAK,CAAC,CAAC,CAAC;KAC5D,CAAC;KAKD,MAAM,QAAQ,aAAa,KAAA,IAAY,CAAC,IAAI,SAAS,KAAK,CAAC,CAAC,MAAM,IAAI;KAEtE,IAAI,MAAM,UAAU,GAAG;MACrB,MAAM,WAAW,kBAAkB,MAAM,KAAK,MAAM;MAEpD,IAAI,CAAC,OAAO,GAAG,gBAAgB,CAAC,CAAC,QAAQ,GACvC,OAAO,OAAO,QAAQ,WAAW,QAAQ,UAAU,KAAK,CAAC,CAAC,CAAC;MAE7D,OAAO,SAAS,KAAK,QAAQ;KAC/B;KACA,OAAO,MAAM,MAAM,SAAS,OAAO,EAAE,CAAC;IACxC;IAEA,OAAO,OAAO,QAAQ,WAAW,QAAQ,QAAQ,KAAK,CAAC,CAAC,CAAC;GAC3D,CAAC;GACH,WAAW,OA9CU,OAAO,OAC5B,UAAU,UAAU,KAAK,KAAK,CAAC,CAAC,KAAK,OAAO,eAAe,CAC7D;GA6CE;EACF;CACF,CAAC,CAAC,CAAC,KACD,OAAO,QAAQ,SACb,KAAK,UAAU,IAAI,IACf,OAAO,OACP,OAAO,IAAI,aAAa;EACtB,IAAI,OAAO,QAAQ,KAAA,GAAW;GAC5B,OAAO,cAAc,KAAK,OAAO,MAAM;GAEvC;EACF;EACA,MAAM,UAAU,OAAO,UAAU,OAAO,MAAM,KAAK,KAAK,CAAC,CAAC,KAAK,OAAO,IAAI;EAE1E,IAAI,KAAK,UAAU,OAAO,GAAG,OAAO,cAAc,KAAK,OAAO,MAAM;CACtE,CAAC,CACP,CACF;AACF,CAAC;;;;AC3MD,MAAa,sBAAsB,OAAO,WAAW,WACnD,WACA,OACA,SACA;CACA,IAAI;CAiDJ,OAAO;EAAE,OAAA,OA/CY,OAAO,OAC1B,OAAO,gBACL,OAAO,IAAI,aAAa;GACtB,MAAM,SAAiC,CAAC;GAExC,MAAM,QAAc,MAAoC,WACtD,YAAY,QAAQ,GAAI,CAAC,CAAC,KACxB,OAAO,KAAK,WACV,OAAO,WAAW;IAChB,IAAI,OAAO,SAAS,WAClB,OAAO,KAAK,qBAAqB,KAAK;KAAE,MAAM;KAAM,QAAQ,OAAO;IAAO,CAAC,CAAC;GAChF,CAAC,CACH,CACF;GAEF,OAAO,KAAK,SAAS,MAAM,KAAK;GAChC,OAAO,KAAK,WAAW,MAAM,OAAO;GACpC,OAAO,KAAK,kBAAkB,MAAM,cAAc;GAClD,MAAM,eAAe,OAAO,KAAK,cAAc,MAAM,UAAU;GAE/D,MAAM,aACJ,YAAY,KAAA,IAAY,KAAA,IAAY,OAAO,KAAK,aAAa,QAAQ,SAAS;GAEhF,IAAI,YAAY,KAAA,KAAa,eAAe,KAAA,KAAa,WAAW,SAAS,WAC3E,OAAO,KAAK,WAAW,QAAQ,aAAa;GAE9C,MAAM,SAAS,sBAAsB,KAAK;IACxC;IACA,WAAW,YAAY,KAAA,IAAY,aAAa;IAChD,YAAY,aAAa,SAAS,YAAY,aAAa,QAAQ;IACnE,SACE,eAAe,KAAA,IACX,cACA,WAAW,SAAS,YAClB,eACA;IACR;GACF,CAAC;GAED,OAAO,OAAO,OAAO,MAAM;GAC3B,SAAS,OAAO,OAAO,MAAM;GAE7B,OAAO;EACT,CAAC,CACH,CACF;EAEgB,QAAQ,OAAO,WAAW,OAAO,cAAc,MAAM,CAAC;CAAE;AAC1E,CAAC;AAED,MAAM,mBAEF,UACA,SACA,eAED,UACC,OAAO,gBACL,OAAO,IAAI,aAAa;CAEtB,MAAM,KAAK,OAAO,WAAW,OAAO,OAAO,MAAM;CAGjD,MAAM,UAAU,aAAa,KAAA,IAAY,OAAO,OAAO,OAAO,IAAI,KAAA;CAClE,MAAM,YAAY,OAAO,OAAO,kBAAkB,KAAK;EAAE,UAAU;EAAY;CAAG,CAAC,CAAC;CAEpF,MAAM,UAAU,OAAO,oBAAoB,WAAW,OAAO,OAAO;CACpE,IAAI,UAAU;CAEd,MAAM,UAAU,OAAO,OAAO,OAC5B,OAAO,IAAI,aAAa;EACtB,UAAU;EACV,MAAM,SAAS,OAAO,QAAQ;EAE9B,IAAI,cAAc,KAAA,GAAW,OAAO,SAAS,OAAO,cAAc,UAAU,MAAM,CAAC,CAAC;EAEpF,OAAO;CACT,CAAC,CAAC,CAAC,KAAK,OAAO,eAAe,CAChC;CAEA,OAAO,OAAO,mBAAmB,QAAQ,KAAK,OAAO,MAAM,CAAC;CAE5D,OAAO;EACL;EACA,aAAa,kBACX,OAAO,cAAc;GACnB,IAAI,SACF,OAAO,OAAO,KACZ,aAAa,KAAK;IAChB,WAAW;IACX,QAAQ,QAAQ,OAAO,KAAK,CAAC,CAAC;IAC9B,SAAS;GACX,CAAC,CACH;GACF,IAAI,YAAY,KAAA,GAAW,OAAO,QAAQ,WAAW,aAAa;GAElE,OAAO,aAAa,KAAA,IAChB,OAAO,KACL,aAAa,KAAK;IAChB,WAAW;IACX,QAAQ,QAAQ,cAAc,KAAK,CAAC,CAAC;IACrC,SAAS;GACX,CAAC,CACH,IACA,QAAQ,kBAAkB,SAAS,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,KAC7D,OAAO,IAAI,SAAS,IAAI,CAC1B;EACN,CAAC;EACH;EACA,cAAc,QAAQ,KACpB,OAAO,cACJ,WACC,OAAO,eAAe,YACtB,OAAO,OAAO,WAAW,MACxB,OAAO,cAAc,aAClB,OAAO,YAAY,cACnB,OAAO,YAAY,qBAEvB,aAAa,KAAK;GAChB,WAAW;GACX,QAAQ,QAAQ,OAAO,KAAK,CAAC,CAAC;GAC9B,SAAS;EACX,CAAC,CACL,CACF;EACA,eAAe,QAAQ;EACvB,gBAAgB,QAAQ,OAAO,KAC7B,OAAO,KACJ,WACC,OAAO,OAAO,MAAM,KACpB,OAAO,MAAM,cAAc,WAC3B,OAAO,MAAM,YAAY,YAC7B,CACF;CACF;AACF,CAAC,CACH;AAEJ,MAAa,iBACX,SACA,cACG,gBAAgB,KAAA,GAAW,SAAS,SAAS;AAElD,MAAa,oBACX,UACA,cACG,gBAAgB,UAAU,CAAC,GAAG,SAAS;;;AC/H5C,IAAa,WAAb,MAAa,iBAAiB,QAAQ,QAyBpC,CAAC,CAAC,yBAAyB,CAAC,CAAC;;CAE7B,OAAO,OAA6B,QAAuB,SAA6B;EACtF,OAAO,OAAO,QAAQ,WAAW,YAAY,QAAQ,OAAO,QAAQ,OAAO,CAAC;CAC9E;;CAGA,OAAO,QAA8B,QAAuB,SAA6B;EACvF,OAAO,OAAO,QAAQ,WAAW,YAAY,QAAQ,QAAQ,QAAQ,OAAO,CAAC;CAC/E;;CAGA,OAAO,OACL,UACA,SACA;EACA,OAAO,OAAO,QAAQ,WAAW,YAAY,QAAQ,OAAO,UAAU,OAAO,CAAC;CAChF;;CAGA,OAAO,MAAM,UAA2B,CAAC,GAAuD;EAC9F,OAAO,MAAM,OACX,UACA,OAAO,IAAI,aAAa;GACtB,MAAM,cAAc,OAAO,QAAQ,gBAAgB,QAAQ,UAAU,CAAC,GAAG,WAAW;GAEpF,MAAM,SAAS,OAAO,OAAO;IAC3B,GAAG;IACH,GAAI,YAAY,SAAS,KAAA,IAAY,CAAC,IAAI,EAAE,MAAM,OAAO,OAAO,CAAC,GAAG,YAAY,IAAI,CAAC,EAAE;IACvF,GAAI,YAAY,UAAU,KAAA,IACtB,CAAC,IACD,EAAE,OAAO,OAAO,OAAO,EAAE,GAAG,YAAY,MAAM,CAAC,EAAE;GACvD,CAAC;GAED,IAAI,OAAO,UAAU,eAAe,KAAK,SAAS,WAAW,GAC3D,OAAO,OAAO,aAAa,KAAK;IAC9B,WAAW;IACX,QAAQ,QAAQ,cAAc,KAAK,CAAC,CAAC;IACrC,SAAS;GACX,CAAC;GAEH,MAAM,UAAU,OAAOA,KAAoB;IACzC,gBAAgB;IAChB,GAAI,QAAQ,aAAa,KAAA,IAAY,CAAC,IAAI,EAAE,UAAU,QAAQ,SAAS;IACvE,YAAY;KACV,GAAI,QAAQ,wBAAwB,KAAA,IAChC,CAAC,IACD,EAAE,qBAAqB,QAAQ,oBAAoB;KACvD,GAAI,QAAQ,aAAa,KAAA,IAAY,CAAC,IAAI,EAAE,UAAU,QAAQ,SAAS;KACvE,GAAI,QAAQ,iBAAiB,KAAA,IAAY,CAAC,IAAI,EAAE,cAAc,QAAQ,aAAa;KACnF,GAAI,QAAQ,gBAAgB,KAAA,IAAY,CAAC,IAAI,EAAE,aAAa,QAAQ,YAAY;KAChF,GAAI,QAAQ,gBAAgB,KAAA,IAAY,CAAC,IAAI,EAAE,aAAa,QAAQ,YAAY;KAChF,GAAI,QAAQ,iBAAiB,KAAA,IAAY,CAAC,IAAI,EAAE,cAAc,QAAQ,aAAa;KACnF,GAAI,QAAQ,gBAAgB,KAAA,IAAY,CAAC,IAAI,EAAE,aAAa,QAAQ,YAAY;IAClF;GACF,CAAC;GAED,MAAM,SAAS,OAAO,OAAO;GAE7B,MAAM,UAAU,OAAO,WAAW,WAChC,QACA,UAA6B,CAAC,GAC9B,YACA;IACA,MAAM,SACJ,eAAe,KAAA,IACX,cAAc,QAAQ,QAAQ,SAAS,IACvC,iBAAiB,WAAW,UAAU,QAAQ,SAAS;IAE7D,MAAM,WAAW,OAAO,QAAQ,QAC9B,SACC,SAAS,aACR,OAAO,SAAS,QAAQ,CAAC,CAAC,KAAK,OAAO,eAAe,OAAO,QAAQ,MAAM,CAAC,GAC7E;KACE,GAAG;KACH,GAAI,eAAe,KAAA,IACf,CAAC,IACD,EACE,gBACE,WAAW,aAAa,KAAA,IAAY,CAAC,IAAI,EAAE,UAAU,WAAW,SAAS,EAC7E;IACN,CACF;IAEA,MAAM,YAAY,OAAO,OAAO,OAC9B,SAAS,QAAQ,KACf,OAAO,KAAK,EAAE,cACZ,OAAO,OAAO,SAAS;KACrB,WAAW,SAAS;KACpB,cAAc,QAAQ,aAAa,KACjC,OAAO,QAAQ,SAAS,SAAS,YAAY,CAC/C;KACA,OAAO,SAAS;KAChB,eAAe,SAAS,SAAS;IACnC,CAAC,CACH,CACF,CACF;IAEA,OAAO;KACL,WAAW,SAAS;KACpB,SAAS,SAAS;KAClB,OAAO,SAAS;KAChB,SAAS,SAAS,QAAQ,KAAK,OAAO,QAAQ,SAAS,CAAC;IAC1D;GACF,CAAC;GAED,OAAO,SAAS,GAAG;IACjB;IACA,SAAS,QAAQ,YACf,QAAQ,QAAQ,OAAO,CAAC,CAAC,KAAK,OAAO,SAAS,aAAa,SAAS,OAAO,CAAC;IAC9E,SAAS,UAAU,YACjB,OAAO,IAAI,aAAa;KACtB,MAAM,UAAU,OAAO,QAAQ,kBAAkB,SAAS,MAAM,QAAQ,GAAG,SAAS;KAEpF,OAAO,QAAQ,OAAO,QAAQ,QAAQ,QAAQ,SAAS;MACrD,UAAU,SAAS,KAAK,OAAO;MAC/B,GAAI,QAAQ,WAAW,KAAA,IAAY,CAAC,IAAI,EAAE,UAAU,QAAQ,OAAO,SAAS;KAC9E,CAAC,EAAA,CAAG;IACN,CAAC;GACL,CAAC;EACH,CAAC,CACH;CACF;AACF"}
|
|
1
|
+
{"version":3,"file":"Chromium.mjs","names":["Trace.span","Trace.span","Trace.annotate","BrowserRuntime.make"],"sources":["../src/internal/chromium/Data.ts","../src/internal/chromium/Process.ts","../src/internal/chromium/Session.ts","../src/Chromium.ts"],"sourcesContent":["import { Schema } from \"effect\";\n\nimport { Identifier } from \"../../BrowserData.ts\";\n\n/** Identifies this Chromium ownership lifetime, not a reusable endpoint. */\nexport class ChromiumReference extends Schema.Class<ChromiumReference>(\"ChromiumReference\")({\n provider: Schema.Literal(\"chromium\"),\n id: Identifier,\n}) {}\n\nexport class ChromiumCleanupIssue extends Schema.Class<ChromiumCleanupIssue>(\n \"ChromiumCleanupIssue\",\n)({\n step: Schema.Literals([\n \"fence\",\n \"capture\",\n \"initialization\",\n \"disconnect\",\n \"terminate\",\n \"profile\",\n ]),\n reason: Schema.Literals([\"timeout\", \"failed\", \"interrupted\"]),\n}) {}\n\n/** Connection teardown and observed process exit are separate facts; no provider status exists. */\nexport class ChromiumCleanupResult extends Schema.Class<ChromiumCleanupResult>(\n \"ChromiumCleanupResult\",\n)({\n reference: ChromiumReference,\n ownership: Schema.Literals([\"owned\", \"borrowed\"]),\n connection: Schema.Literals([\"closed\", \"failed\", \"not-connected\", \"pending\"]),\n process: Schema.Literals([\"terminated\", \"unknown\", \"not-owned\"]),\n issues: Schema.Array(ChromiumCleanupIssue).check(Schema.isMaxLength(16)),\n}) {}\n\nconst Text = Schema.NonEmptyString.check(\n Schema.isMaxLength(4096),\n // oxlint-disable-next-line eslint/no-control-regex -- NUL is one of the characters it rejects\n Schema.isPattern(/^[^\\u0000\\r\\n]+$/u),\n);\n\nconst Port = Schema.Int.check(Schema.isBetween({ minimum: 1, maximum: 65535 }));\n\n/** Only a concrete loopback WebSocket is admitted: no HTTP discovery redirects or remote DNS. */\nexport const ChromiumEndpoint = Text.check(\n Schema.makeFilter((value) => {\n try {\n const url = new URL(value);\n\n return (\n url.protocol === \"ws:\" &&\n [\"127.0.0.1\", \"[::1]\"].includes(url.hostname) &&\n Schema.is(Port)(Number(url.port)) &&\n !url.username &&\n !url.password &&\n !url.search &&\n !url.hash &&\n /^\\/devtools\\/browser\\/[A-Za-z0-9_-]+$/u.test(url.pathname)\n );\n } catch {\n return false;\n }\n }),\n);\n\nconst ProxyServer = Text.check(\n Schema.makeFilter((value) => {\n try {\n const url = new URL(value);\n\n return (\n [\"http:\", \"https:\", \"socks5:\"].includes(url.protocol) &&\n url.hostname.length > 0 &&\n !url.username &&\n !url.password &&\n !url.search &&\n !url.hash &&\n [\"\", \"/\"].includes(url.pathname)\n );\n } catch {\n return false;\n }\n }),\n);\n\n/** These arguments belong to the launcher; silently overriding them would change ownership. */\nconst Argument = Text.check(\n Schema.makeFilter(\n (value) =>\n value.startsWith(\"--\") &&\n !/^--(?:user-data-dir|remote-debugging[^=]*|headless|no-sandbox|disable-setuid-sandbox|single-process|proxy-server|proxy-bypass-list|no-startup-window)(?:=|$)/u.test(\n value,\n ),\n ),\n);\n\nexport const ChromiumLaunch = Schema.Struct({\n executablePath: Schema.optionalKey(Text),\n headless: Schema.optionalKey(Schema.Boolean),\n /** Enabled by default; a trusted host must explicitly choose a sandbox exception. */\n chromiumSandbox: Schema.optionalKey(Schema.Boolean),\n args: Schema.optionalKey(Schema.Array(Argument).check(Schema.isMaxLength(64))),\n proxy: Schema.optionalKey(\n Schema.Struct({\n server: ProxyServer,\n bypass: Schema.optionalKey(Text),\n }),\n ),\n startupTimeoutMillis: Schema.optionalKey(\n Schema.Int.check(Schema.isBetween({ minimum: 1, maximum: 60000 })),\n ),\n});\n\nexport type ChromiumLaunch = typeof ChromiumLaunch.Type;\n","// rc.115's NodeChildProcessSpawner exposes leader exit, but its bounded group wait can\n// succeed with surviving members. This boundary must observe the leader AND group gone.\n// @effect-diagnostics-next-line nodeBuiltinImport:off\nimport { spawn, type ChildProcess } from \"node:child_process\";\n// FileSystem.remove exposes recursive/force only, not rm's per-entry OS-error retries.\n// Keep native profile creation/read/removal together; removal follows confirmed group exit.\n// @effect-diagnostics-next-line nodeBuiltinImport:off\nimport { mkdtemp, readFile, rm } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\n\nimport { Clock, Duration, Effect, Exit, Path, Redacted, Schema } from \"effect\";\n\nimport { Reasons, BrowserError } from \"../../Errors.ts\";\nimport * as Trace from \"../Trace.ts\";\nimport { ChromiumEndpoint, type ChromiumLaunch } from \"./Data.ts\";\n\nexport interface ChromiumProcess {\n readonly connection: (\n timeoutMillis: number,\n ) => Effect.Effect<Redacted.Redacted<string>, BrowserError>;\n readonly terminate: Effect.Effect<void, BrowserError>;\n readonly removeProfile: Effect.Effect<void, BrowserError>;\n}\n\n/** Explicit host sandbox/proxy choices; the owned profile and debugger endpoint cannot be replaced. */\nexport const launchArguments = (options: ChromiumLaunch, directory: string): string[] => [\n \"--no-first-run\",\n \"--no-default-browser-check\",\n \"--remote-debugging-address=127.0.0.1\",\n \"--remote-debugging-port=0\",\n \"--remote-debugging-pipe\",\n `--user-data-dir=${directory}`,\n ...(options.headless === false ? [] : [\"--headless=new\"]),\n ...(options.chromiumSandbox === false ? [\"--no-sandbox\"] : []),\n ...(options.proxy === undefined\n ? []\n : [\n `--proxy-server=${options.proxy.server}`,\n // Chromium otherwise bypasses proxies for loopback. The host may deliberately override it.\n `--proxy-bypass-list=${options.proxy.bypass ?? \"<-loopback>\"}`,\n ]),\n ...(options.args ?? []),\n // The shared driver creates its initial Page on the sole connection. Chromium's launch\n // Page can arrive after the debugger endpoint and race that creation.\n \"--no-startup-window\",\n];\n\nconst failure = (operation: \"launch\" | \"connect\" | \"close\", reason: BrowserError[\"reason\"]) =>\n BrowserError.make({\n operation,\n reason,\n outcome: operation === \"close\" ? \"unknown\" : \"undispatched\",\n });\n\nconst exited = (child: ChildProcess) => child.exitCode !== null || child.signalCode !== null;\n\n/** POSIX groups keep Chromium's helpers inside the same owned termination boundary. */\nconst alive = (pid: number): boolean => {\n try {\n process.kill(-pid, 0);\n\n return true;\n } catch (error) {\n if (error instanceof Error && \"code\" in error && error.code === \"ESRCH\") return false;\n throw error;\n }\n};\n\nconst signalGroup = (pid: number, signal: NodeJS.Signals) => {\n try {\n process.kill(-pid, signal);\n } catch (error) {\n if (!(error instanceof Error && \"code\" in error && error.code === \"ESRCH\")) throw error;\n }\n};\n\n/** Called once; observes parent and helper exit, rather than treating a sent signal as cleanup. */\nconst terminate = Effect.fnUntraced(function* (\n child: ChildProcess,\n pid: number,\n clock: Clock.Clock,\n): Effect.fn.Return<void, BrowserError> {\n const stopped = Effect.try({\n try: () => exited(child) && !alive(pid),\n catch: () => failure(\"close\", Reasons.Failed.make({})),\n });\n\n const signal = (value: NodeJS.Signals) =>\n Effect.try({\n try: () => signalGroup(pid, value),\n catch: () => failure(\"close\", Reasons.Failed.make({})),\n });\n\n const pause = clock.sleep(Duration.millis(20));\n\n yield* signal(\"SIGTERM\");\n const graceful = clock.monotonicTimeNanosUnsafe() + 1_500_000_000n;\n\n while (!(yield* stopped) && clock.monotonicTimeNanosUnsafe() < graceful) yield* pause;\n if (yield* stopped) return;\n yield* signal(\"SIGKILL\");\n const forced = clock.monotonicTimeNanosUnsafe() + 1_000_000_000n;\n\n while (!(yield* stopped) && clock.monotonicTimeNanosUnsafe() < forced) yield* pause;\n if (!(yield* stopped)) return yield* failure(\"close\", Reasons.Timeout.make({}));\n}, Trace.span(\"Chromium.terminate\"));\n\n/** Start only Chromium's process. The shared owner later opens its sole CDP connection. */\nexport const launch = Effect.fnUntraced(function* (\n options: ChromiumLaunch,\n): Effect.fn.Return<ChromiumProcess, BrowserError> {\n if (process.platform === \"win32\") return yield* failure(\"launch\", Reasons.Unsupported.make({}));\n const path = yield* Path.Path.pipe(Effect.provide(Path.layer));\n const clock = yield* Clock.Clock;\n\n const executable =\n options.executablePath ??\n (yield* Effect.tryPromise({\n try: () => import(\"playwright-core\").then(({ chromium }) => chromium.executablePath()),\n catch: () => failure(\"launch\", Reasons.Failed.make({})),\n }));\n\n const directory = yield* Effect.tryPromise({\n try: () => mkdtemp(path.join(tmpdir(), \"effect-browser-chromium-\")),\n catch: () => failure(\"launch\", Reasons.Failed.make({})),\n });\n\n const removeProfile = Effect.tryPromise({\n try: () => rm(directory, { recursive: true, force: true, maxRetries: 5, retryDelay: 50 }),\n catch: () => failure(\"close\", Reasons.Failed.make({})),\n });\n\n let child: ChildProcess | undefined;\n\n return yield* Effect.gen(function* () {\n // Node reports a spawn's outcome on a later tick, so its listeners attach in the same turn.\n const launched = yield* Effect.callback<ChildProcess, BrowserError>((resume) => {\n const failed = () => resume(Effect.fail(failure(\"launch\", Reasons.Failed.make({}))));\n let spawned: ChildProcess;\n\n try {\n spawned = spawn(executable, launchArguments(options, directory), {\n cwd: directory,\n // Chromium watches fd 3 for EOF and closes the browser when the host dies, including\n // SIGKILL before connect. Keep its fd 3/4 pipe pair owned by this ChildProcess; send no\n // commands on it. The shared Playwright driver still controls the loopback endpoint.\n stdio: [\"ignore\", \"ignore\", \"ignore\", \"pipe\", \"pipe\"],\n detached: true,\n });\n } catch {\n failed();\n\n return;\n }\n\n child = spawned;\n spawned.once(\"spawn\", () => resume(Effect.succeed(spawned)));\n spawned.once(\"error\", failed);\n });\n\n const pid = launched.pid;\n\n if (pid === undefined) return yield* failure(\"launch\", Reasons.Failed.make({}));\n\n // One termination continues to its own bounded group-exit decision even if a waiter cancels.\n const closing = yield* Effect.cached(\n terminate(launched, pid, clock).pipe(Effect.uninterruptible),\n );\n\n return {\n connection: (timeoutMillis) =>\n Effect.gen(function* () {\n const deadline =\n clock.monotonicTimeNanosUnsafe() +\n BigInt(Math.ceil(Math.min(timeoutMillis, options.startupTimeoutMillis ?? 15000))) *\n 1_000_000n;\n\n while (clock.monotonicTimeNanosUnsafe() < deadline) {\n if (exited(launched)) return yield* failure(\"connect\", Reasons.Closed.make({}));\n\n const portFile = yield* Effect.tryPromise({\n try: (signal) =>\n readFile(path.join(directory, \"DevToolsActivePort\"), {\n encoding: \"utf8\",\n signal,\n }).catch((error: unknown) => {\n if (error instanceof Error && \"code\" in error && error.code === \"ENOENT\")\n return undefined;\n throw error;\n }),\n catch: () => failure(\"connect\", Reasons.Transport.make({})),\n });\n\n // Chromium creates DevToolsActivePort before it writes the port and path into it. A\n // file without both lines is startup still in progress, not an endpoint; only a\n // complete file that is not a loopback DevTools endpoint is malformed.\n const lines = portFile === undefined ? [] : portFile.trim().split(\"\\n\");\n\n if (lines.length >= 2) {\n const endpoint = `ws://127.0.0.1:${lines[0]}${lines[1]}`;\n\n if (!Schema.is(ChromiumEndpoint)(endpoint))\n return yield* failure(\"connect\", Reasons.Malformed.make({}));\n\n return Redacted.make(endpoint);\n }\n yield* clock.sleep(Duration.millis(20));\n }\n\n return yield* failure(\"connect\", Reasons.Timeout.make({}));\n }).pipe(Trace.span(\"Chromium.ready\")),\n terminate: closing,\n removeProfile,\n } satisfies ChromiumProcess;\n }).pipe(\n Effect.onExit((exit) =>\n Exit.isSuccess(exit)\n ? Effect.void\n : Effect.gen(function* () {\n if (child?.pid === undefined) {\n yield* removeProfile.pipe(Effect.ignore);\n\n return;\n }\n const stopped = yield* terminate(child, child.pid, clock).pipe(Effect.exit);\n\n if (Exit.isSuccess(stopped)) yield* removeProfile.pipe(Effect.ignore);\n }),\n ),\n );\n}, Trace.span(\"Chromium.launch\"));\n","import { Crypto, Effect, Option, Redacted } from \"effect\";\n\nimport type { Lifetime, Source } from \"../../BrowserRuntime.ts\";\nimport { BrowserError, Reasons } from \"../../Errors.ts\";\nimport { cleanupStep, reported, type ConnectionCleanup } from \"../browser/ConnectionCleanup.ts\";\nimport { checked } from \"../browser/PublicSession.ts\";\nimport { randomUuid } from \"../browser/Random.ts\";\nimport * as Trace from \"../Trace.ts\";\nimport {\n ChromiumCleanupIssue,\n ChromiumCleanupResult,\n ChromiumEndpoint,\n ChromiumReference,\n type ChromiumLaunch,\n} from \"./Data.ts\";\nimport { launch, type ChromiumProcess } from \"./Process.ts\";\n\nexport interface ChromiumLease extends Lifetime {\n readonly reference: ChromiumReference;\n readonly closeChecked: Effect.Effect<ChromiumCleanupResult, BrowserError>;\n readonly release: Effect.Effect<ChromiumCleanupResult>;\n readonly cleanupResult: Effect.Effect<Option.Option<ChromiumCleanupResult>>;\n}\n\n/** Each teardown step runs even when a preceding step fails. Only observed exit permits profile removal. */\nexport const makeChromiumCleanup = Effect.fnUntraced(function* (\n reference: ChromiumReference,\n local: ConnectionCleanup,\n process: ChromiumProcess | undefined,\n) {\n let latest: ChromiumCleanupResult | undefined;\n\n const close = yield* Effect.cached(\n Effect.uninterruptible(\n Effect.gen(function* () {\n const issues: ChromiumCleanupIssue[] = [];\n\n const step = <A, E>(name: ChromiumCleanupIssue[\"step\"], action: Effect.Effect<A, E>) =>\n cleanupStep(action.pipe(Trace.span(`Chromium.cleanup.${name}`)), 3000).pipe(\n Effect.tap((result) =>\n Effect.sync(() => {\n if (result._tag === \"Failure\")\n issues.push(ChromiumCleanupIssue.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 terminated =\n process === undefined ? undefined : yield* step(\"terminate\", process.terminate);\n\n if (process !== undefined && terminated !== undefined && terminated._tag === \"Success\")\n yield* step(\"profile\", process.removeProfile);\n\n const result = ChromiumCleanupResult.make({\n reference,\n ownership: process === undefined ? \"borrowed\" : \"owned\",\n connection: disconnected._tag === \"Success\" ? disconnected.value : \"failed\",\n process:\n terminated === undefined\n ? \"not-owned\"\n : terminated._tag === \"Success\"\n ? \"terminated\"\n : \"unknown\",\n issues,\n });\n\n Object.freeze(result.issues);\n latest = Object.freeze(result);\n yield* Trace.annotate({\n \"browser.cleanup.connection\": result.connection,\n \"browser.cleanup.process\": result.process,\n \"browser.cleanup.issues\": issues.length,\n });\n\n return latest;\n }).pipe(Trace.span(\"Chromium.cleanup\")),\n ),\n );\n\n return { close, result: Effect.sync(() => Option.fromNullishOr(latest)) };\n});\n\nconst acquireChromium =\n (\n endpoint: Redacted.Redacted<string> | undefined,\n options: ChromiumLaunch,\n onCleanup?: (result: ChromiumCleanupResult) => Effect.Effect<void>,\n ): Source<ChromiumLease, BrowserError, Crypto.Crypto> =>\n (local) =>\n Effect.uninterruptible(\n Effect.gen(function* () {\n // Drawn first: a draw after the spawn would sit between it and finalizer registration.\n const id = yield* randomUuid(yield* Crypto.Crypto);\n // The process cannot escape between spawn and finalizer registration. Startup waiting happens\n // later in connect, where it is interruptible and the owning finalizer is already installed.\n const process = endpoint === undefined ? yield* launch(options) : undefined;\n const reference = Object.freeze(ChromiumReference.make({ provider: \"chromium\", id }));\n\n const cleanup = yield* makeChromiumCleanup(reference, local, process);\n let closing = false;\n\n const release = yield* Effect.cached(\n Effect.gen(function* () {\n closing = true;\n const result = yield* cleanup.close;\n\n if (onCleanup !== undefined) yield* reported(Effect.suspend(() => onCleanup(result)));\n\n return result;\n }).pipe(Trace.span(\"Chromium.release\"), Effect.uninterruptible),\n );\n\n yield* Effect.addFinalizer(() => release.pipe(Effect.asVoid));\n\n return {\n reference,\n connection: (timeoutMillis) =>\n Effect.suspend(() => {\n if (closing)\n return Effect.fail(\n BrowserError.make({\n operation: \"connect\",\n reason: Reasons.Closed.make({}),\n outcome: \"undispatched\",\n }),\n );\n if (process !== undefined) return process.connection(timeoutMillis);\n\n return endpoint === undefined\n ? Effect.fail(\n BrowserError.make({\n operation: \"connect\",\n reason: Reasons.Configuration.make({}),\n outcome: \"undispatched\",\n }),\n )\n : checked(ChromiumEndpoint, Redacted.value(endpoint), \"connect\").pipe(\n Effect.map(Redacted.make),\n );\n }),\n release,\n closeChecked: release.pipe(\n Effect.filterOrFail(\n (result) =>\n result.connection === \"closed\" &&\n result.issues.length === 0 &&\n (result.ownership === \"borrowed\"\n ? result.process === \"not-owned\"\n : result.process === \"terminated\"),\n () =>\n BrowserError.make({\n operation: \"close\",\n reason: Reasons.Failed.make({}),\n outcome: \"unknown\",\n }),\n ),\n Trace.span(\"Chromium.close\"),\n ),\n cleanupResult: cleanup.result,\n controlRetired: cleanup.result.pipe(\n Effect.map(\n (result) =>\n Option.isSome(result) &&\n result.value.ownership === \"owned\" &&\n result.value.process === \"terminated\",\n ),\n ),\n } satisfies ChromiumLease;\n }),\n );\n\nexport const ownedChromium = (\n options: ChromiumLaunch,\n onCleanup?: (result: ChromiumCleanupResult) => Effect.Effect<void>,\n) => acquireChromium(undefined, options, onCleanup);\n\nexport const borrowedChromium = (\n endpoint: Redacted.Redacted<string>,\n onCleanup?: (result: ChromiumCleanupResult) => Effect.Effect<void>,\n) => acquireChromium(endpoint, {}, onCleanup);\n","import { Context, Crypto, Effect, Layer, type Option, Redacted, type Scope } from \"effect\";\n\nimport type { BrowserSession, OpenOptions } from \"./Browser.ts\";\nimport type { AutomationOptions, BrowserPolicy, Viewport } from \"./BrowserData.ts\";\nimport * as BrowserRuntime from \"./BrowserRuntime.ts\";\nimport { BrowserError, Reasons, type InitializationError } from \"./Errors.ts\";\nimport { checked } from \"./internal/browser/PublicSession.ts\";\nimport {\n ChromiumEndpoint,\n ChromiumLaunch,\n type ChromiumCleanupResult,\n type ChromiumReference,\n} from \"./internal/chromium/Data.ts\";\nimport { borrowedChromium, ownedChromium } from \"./internal/chromium/Session.ts\";\n\nexport {\n ChromiumCleanupIssue,\n ChromiumCleanupResult,\n ChromiumLaunch,\n ChromiumReference,\n} from \"./internal/chromium/Data.ts\";\n\n/** Host-only process configuration. Building this layer neither loads Playwright nor starts Chromium. */\nexport interface ChromiumOptions extends AutomationOptions {\n readonly launch?: ChromiumLaunch;\n readonly viewport?: Viewport;\n readonly onCleanup?: (result: ChromiumCleanupResult) => Effect.Effect<void>;\n}\n\n/** An owned or borrowed Chromium lifetime with one modeled browser connection. */\nexport interface ChromiumSession<E = never> extends BrowserSession<E> {\n readonly reference: ChromiumReference;\n readonly closeChecked: Effect.Effect<ChromiumCleanupResult, BrowserError>;\n readonly close: Effect.Effect<ChromiumCleanupResult>;\n readonly cleanupResult: Effect.Effect<Option.Option<ChromiumCleanupResult>>;\n}\n\nexport interface ChromiumAcquisition<E = never> {\n readonly reference: ChromiumReference;\n readonly failure: Effect.Effect<never, E | InitializationError>;\n readonly connect: Effect.Effect<ChromiumSession<E>, BrowserError | InitializationError | E>;\n readonly close: Effect.Effect<ChromiumCleanupResult>;\n}\n\nexport interface ChromiumAttachRequest<E = never, R = never> extends OpenOptions<E, R> {\n readonly policy: BrowserPolicy;\n /** Resolve this exact target; without it, multiple open pages are an ambiguity error. */\n readonly target?: { readonly targetId: string };\n}\n\nexport class Chromium extends Context.Service<\n Chromium,\n {\n readonly acquire: <E = never, R = never>(\n policy: BrowserPolicy,\n request?: OpenOptions<E, R>,\n ) => Effect.Effect<ChromiumAcquisition<E>, BrowserError, Scope.Scope | Exclude<R, Scope.Scope>>;\n readonly launch: <E = never, R = never>(\n policy: BrowserPolicy,\n request?: OpenOptions<E, R>,\n ) => Effect.Effect<\n ChromiumSession<E>,\n BrowserError | InitializationError | E,\n Scope.Scope | Exclude<R, Scope.Scope>\n >;\n /** A concrete loopback ws://.../devtools/browser/... endpoint; this scope owns only its connection. */\n readonly attach: <E = never, R = never>(\n endpoint: Redacted.Redacted<string>,\n request: ChromiumAttachRequest<E, R>,\n ) => Effect.Effect<\n ChromiumSession<E>,\n BrowserError | InitializationError | E,\n Scope.Scope | Exclude<R, Scope.Scope>\n >;\n }\n>()(\"effect-browser/Chromium\") {\n /** Launch through the configured service; compose with Browser.scoped for supervised ownership. */\n static launch<E = never, R = never>(policy: BrowserPolicy, request?: OpenOptions<E, R>) {\n return Effect.flatMap(Chromium, (browser) => browser.launch(policy, request));\n }\n\n /** Acquire the process lifetime before connecting, using the caller's scope. */\n static acquire<E = never, R = never>(policy: BrowserPolicy, request?: OpenOptions<E, R>) {\n return Effect.flatMap(Chromium, (browser) => browser.acquire(policy, request));\n }\n\n /** Borrow a concrete loopback endpoint; cleanup never terminates its external process. */\n static attach<E = never, R = never>(\n endpoint: Redacted.Redacted<string>,\n request: ChromiumAttachRequest<E, R>,\n ) {\n return Effect.flatMap(Chromium, (browser) => browser.attach(endpoint, request));\n }\n\n /** Chromium references, connection ids and handoff tokens come from the required `Crypto`. */\n static layer(options: ChromiumOptions = {}): Layer.Layer<Chromium, BrowserError, Crypto.Crypto> {\n return Layer.effect(\n Chromium,\n Effect.gen(function* () {\n const launchInput = yield* checked(ChromiumLaunch, options.launch ?? {}, \"configure\");\n\n const launch = Object.freeze({\n ...launchInput,\n ...(launchInput.args === undefined ? {} : { args: Object.freeze([...launchInput.args]) }),\n ...(launchInput.proxy === undefined\n ? {}\n : { proxy: Object.freeze({ ...launchInput.proxy }) }),\n });\n\n if (Object.prototype.hasOwnProperty.call(options, \"bootstrap\"))\n return yield* BrowserError.make({\n operation: \"configure\",\n reason: Reasons.Configuration.make({}),\n outcome: \"undispatched\",\n });\n\n const runtime = yield* BrowserRuntime.make({\n implementation: \"chromium-playwright-cdp\",\n ...(options.viewport === undefined ? {} : { viewport: options.viewport }),\n automation: {\n ...(options.timelineLimits === undefined\n ? {}\n : { timelineLimits: options.timelineLimits }),\n ...(options.admissionLimits === undefined\n ? {}\n : { admissionLimits: options.admissionLimits }),\n ...(options.observationLimits === undefined\n ? {}\n : { observationLimits: options.observationLimits }),\n ...(options.actionTimeoutMillis === undefined\n ? {}\n : { actionTimeoutMillis: options.actionTimeoutMillis }),\n ...(options.maxPages === undefined ? {} : { maxPages: options.maxPages }),\n ...(options.maxHostReads === undefined ? {} : { maxHostReads: options.maxHostReads }),\n ...(options.initialPage === undefined ? {} : { initialPage: options.initialPage }),\n ...(options.popupPolicy === undefined ? {} : { popupPolicy: options.popupPolicy }),\n ...(options.dialogPolicy === undefined ? {} : { dialogPolicy: options.dialogPolicy }),\n ...(options.pageControl === undefined ? {} : { pageControl: options.pageControl }),\n },\n });\n\n const crypto = yield* Crypto.Crypto;\n\n const acquire = Effect.fnUntraced(function* <E = never, R = never>(\n policy: BrowserPolicy,\n request: OpenOptions<E, R> = {},\n attachment?: { readonly endpoint: Redacted.Redacted<string>; readonly targetId?: string },\n ) {\n const source =\n attachment === undefined\n ? ownedChromium(launch, options.onCleanup)\n : borrowedChromium(attachment.endpoint, options.onCleanup);\n\n const acquired = yield* runtime.acquire(\n policy,\n (cleanup, deadline) =>\n source(cleanup, deadline).pipe(Effect.provideService(Crypto.Crypto, crypto)),\n {\n ...request,\n ...(attachment === undefined\n ? {}\n : {\n existingTarget:\n attachment.targetId === undefined ? {} : { targetId: attachment.targetId },\n }),\n },\n );\n\n const connected = yield* Effect.cached(\n acquired.connect.pipe(\n Effect.map(({ session }): ChromiumSession<E> =>\n Object.assign(session, {\n reference: acquired.reference,\n closeChecked: session.closeChecked.pipe(\n Effect.andThen(acquired.lifetime.closeChecked),\n ),\n close: acquired.close,\n cleanupResult: acquired.lifetime.cleanupResult,\n }),\n ),\n ),\n );\n\n return {\n reference: acquired.reference,\n failure: acquired.failure,\n close: acquired.close,\n connect: acquired.connect.pipe(Effect.andThen(connected)),\n } satisfies ChromiumAcquisition<E>;\n });\n\n return Chromium.of({\n acquire,\n launch: (policy, request) =>\n acquire(policy, request).pipe(Effect.flatMap((acquired) => acquired.connect)),\n attach: (endpoint, request) =>\n Effect.gen(function* () {\n const address = yield* checked(ChromiumEndpoint, Redacted.value(endpoint), \"connect\");\n\n return yield* (yield* acquire(request.policy, request, {\n endpoint: Redacted.make(address),\n ...(request.target === undefined ? {} : { targetId: request.target.targetId }),\n })).connect;\n }),\n });\n }),\n );\n }\n}\n"],"mappings":"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"}
|
package/dist/Errors.d.mts
CHANGED
|
@@ -5,13 +5,13 @@ import { Schema } from "effect";
|
|
|
5
5
|
* when it admits an operation, so a native step's own name can never become API, and a new
|
|
6
6
|
* spelling is a deliberate edit here rather than a string that merely compiles.
|
|
7
7
|
*/
|
|
8
|
-
export declare const BrowserOperation: Schema.Literals<readonly ["configure", "launch", "connect", "reconnect", "detach", "disconnect", "close", "handoff", "resume", "live-view", "target", "handle", "list-pages", "
|
|
8
|
+
export declare const BrowserOperation: Schema.Literals<readonly ["configure", "launch", "connect", "reconnect", "detach", "disconnect", "close", "handoff", "resume", "live-view", "target", "handle", "list-pages", "describe-page", "list-frames", "select-page", "new-page", "close-page", "resize", "ready", "observe", "checkpoint", "control-facts", "revalidate", "read-text", "screenshot", "wait", "resolve", "run", "settled", "navigate", "navigate-stop", "click", "fill", "fill-form", "select-option", "scroll", "click-and-wait", "download-action", "select-files", "file-chooser", "action-result", "pointer-move", "hover", "wheel", "press", "type", "page-control", "page-state", "page-suspend", "page-resume", "capture", "capture-start", "capture-stop", "capture-consume"]>;
|
|
9
9
|
export type BrowserOperation = typeof BrowserOperation.Type;
|
|
10
10
|
/** Dispatch evidence belongs to the operation, independently of its failure reason. */
|
|
11
|
-
export declare const BrowserOutcome: Schema.Literals<readonly ["undispatched", "rejected", "unknown"]>;
|
|
11
|
+
export declare const BrowserOutcome: Schema.Literals<readonly ["undispatched", "rejected", "performed", "unknown"]>;
|
|
12
12
|
export type BrowserOutcome = typeof BrowserOutcome.Type;
|
|
13
13
|
/** Limits report measured producer facts; an unavailable measurement is never invented. */
|
|
14
|
-
export declare const LimitDimension: Schema.Literals<readonly ["actions", "elapsed", "returned-bytes", "pages", "frames", "frame-depth", "buffered-frames", "buffered-bytes", "host-reads", "controls", "text", "captures", "frame-bytes", "width", "height", "pixels"]>;
|
|
14
|
+
export declare const LimitDimension: Schema.Literals<readonly ["runs", "actions", "elapsed", "returned-bytes", "pages", "frames", "frame-depth", "buffered-frames", "buffered-bytes", "host-reads", "controls", "text", "code-points", "captures", "frame-bytes", "width", "height", "pixels", "observation-snapshots", "observation-handles", "observation-bytes", "native-operations"]>;
|
|
15
15
|
/** Validated constructors for host reasons. The model receives a separate bounded projection. */
|
|
16
16
|
export declare const Reasons: {
|
|
17
17
|
readonly Configuration: Schema.TaggedStruct<"Configuration", {
|
|
@@ -20,24 +20,38 @@ export declare const Reasons: {
|
|
|
20
20
|
readonly UnregisteredSession: Schema.TaggedStruct<"UnregisteredSession", {}>;
|
|
21
21
|
readonly Unsupported: Schema.TaggedStruct<"Unsupported", {}>;
|
|
22
22
|
readonly Busy: Schema.TaggedStruct<"Busy", {}>;
|
|
23
|
+
readonly QueueFull: Schema.TaggedStruct<"QueueFull", {
|
|
24
|
+
readonly scope: Schema.Literals<readonly ["page", "session", "registry"]>;
|
|
25
|
+
readonly maximum: Schema.Natural;
|
|
26
|
+
readonly observed: Schema.Natural;
|
|
27
|
+
}>;
|
|
28
|
+
readonly QueueExpired: Schema.TaggedStruct<"QueueExpired", {}>;
|
|
23
29
|
readonly Closed: Schema.TaggedStruct<"Closed", {}>;
|
|
24
30
|
readonly Stale: Schema.TaggedStruct<"Stale", {}>;
|
|
25
31
|
readonly NotFound: Schema.TaggedStruct<"NotFound", {}>;
|
|
26
|
-
readonly
|
|
32
|
+
readonly Missing: Schema.TaggedStruct<"Missing", {}>;
|
|
33
|
+
readonly Ambiguous: Schema.TaggedStruct<"Ambiguous", {
|
|
34
|
+
readonly count: Schema.optionalKey<Schema.Natural>;
|
|
35
|
+
}>;
|
|
36
|
+
readonly Incomplete: Schema.TaggedStruct<"Incomplete", {}>;
|
|
37
|
+
readonly Drifted: Schema.TaggedStruct<"Drifted", {}>;
|
|
27
38
|
readonly Malformed: Schema.TaggedStruct<"Malformed", {
|
|
28
39
|
readonly path: Schema.optionalKey<Schema.String>;
|
|
29
40
|
}>;
|
|
30
41
|
readonly Limit: Schema.TaggedStruct<"Limit", {
|
|
31
|
-
readonly dimension: Schema.Literals<readonly ["actions", "elapsed", "returned-bytes", "pages", "frames", "frame-depth", "buffered-frames", "buffered-bytes", "host-reads", "controls", "text", "captures", "frame-bytes", "width", "height", "pixels"]>;
|
|
42
|
+
readonly dimension: Schema.Literals<readonly ["runs", "actions", "elapsed", "returned-bytes", "pages", "frames", "frame-depth", "buffered-frames", "buffered-bytes", "host-reads", "controls", "text", "code-points", "captures", "frame-bytes", "width", "height", "pixels", "observation-snapshots", "observation-handles", "observation-bytes", "native-operations"]>;
|
|
32
43
|
readonly maximum: Schema.Natural;
|
|
33
44
|
readonly observed: Schema.Natural;
|
|
34
45
|
}>;
|
|
35
46
|
readonly Timeout: Schema.TaggedStruct<"Timeout", {}>;
|
|
47
|
+
readonly ScheduleMissed: Schema.TaggedStruct<"ScheduleMissed", {}>;
|
|
48
|
+
readonly TimingBudgetExceeded: Schema.TaggedStruct<"TimingBudgetExceeded", {}>;
|
|
36
49
|
readonly Transport: Schema.TaggedStruct<"Transport", {
|
|
37
50
|
readonly status: Schema.optionalKey<Schema.Int>;
|
|
38
51
|
}>;
|
|
39
52
|
readonly Provider: Schema.TaggedStruct<"Provider", {
|
|
40
53
|
readonly status: Schema.optionalKey<Schema.Int>;
|
|
54
|
+
readonly detail: Schema.optionalKey<Schema.String>;
|
|
41
55
|
}>;
|
|
42
56
|
readonly Authorization: Schema.TaggedStruct<"Authorization", {}>;
|
|
43
57
|
readonly RateLimited: Schema.TaggedStruct<"RateLimited", {
|
|
@@ -59,40 +73,78 @@ export declare const Reasons: {
|
|
|
59
73
|
readonly Denied: Schema.TaggedStruct<"Denied", {}>;
|
|
60
74
|
readonly NotFocused: Schema.TaggedStruct<"NotFocused", {}>;
|
|
61
75
|
};
|
|
62
|
-
export declare const BrowserReason: Schema.Union<(Schema.TaggedStruct<"Active", {}> | Schema.TaggedStruct<"Ambiguous", {
|
|
76
|
+
export declare const BrowserReason: Schema.Union<(Schema.TaggedStruct<"Active", {}> | Schema.TaggedStruct<"Ambiguous", {
|
|
77
|
+
readonly count: Schema.optionalKey<Schema.Natural>;
|
|
78
|
+
}> | Schema.TaggedStruct<"Authorization", {}> | Schema.TaggedStruct<"Busy", {}> | Schema.TaggedStruct<"Closed", {}> | Schema.TaggedStruct<"Configuration", {
|
|
63
79
|
readonly path: Schema.optionalKey<Schema.String>;
|
|
64
|
-
}> | Schema.TaggedStruct<"ContentType", {}> | Schema.TaggedStruct<"ContextLease", {}> | Schema.TaggedStruct<"Denied", {}> | Schema.TaggedStruct<"Disabled", {}> | Schema.TaggedStruct<"Disconnected", {}> | Schema.TaggedStruct<"Expired", {}> | Schema.TaggedStruct<"Failed", {}> | Schema.TaggedStruct<"Interrupted", {}> | Schema.TaggedStruct<"Limit", {
|
|
65
|
-
readonly dimension: Schema.Literals<readonly ["actions", "elapsed", "returned-bytes", "pages", "frames", "frame-depth", "buffered-frames", "buffered-bytes", "host-reads", "controls", "text", "captures", "frame-bytes", "width", "height", "pixels"]>;
|
|
80
|
+
}> | Schema.TaggedStruct<"ContentType", {}> | Schema.TaggedStruct<"ContextLease", {}> | Schema.TaggedStruct<"Denied", {}> | Schema.TaggedStruct<"Disabled", {}> | Schema.TaggedStruct<"Disconnected", {}> | Schema.TaggedStruct<"Drifted", {}> | Schema.TaggedStruct<"Expired", {}> | Schema.TaggedStruct<"Failed", {}> | Schema.TaggedStruct<"Incomplete", {}> | Schema.TaggedStruct<"Interrupted", {}> | Schema.TaggedStruct<"Limit", {
|
|
81
|
+
readonly dimension: Schema.Literals<readonly ["runs", "actions", "elapsed", "returned-bytes", "pages", "frames", "frame-depth", "buffered-frames", "buffered-bytes", "host-reads", "controls", "text", "code-points", "captures", "frame-bytes", "width", "height", "pixels", "observation-snapshots", "observation-handles", "observation-bytes", "native-operations"]>;
|
|
66
82
|
readonly maximum: Schema.Natural;
|
|
67
83
|
readonly observed: Schema.Natural;
|
|
68
84
|
}> | Schema.TaggedStruct<"Malformed", {
|
|
69
85
|
readonly path: Schema.optionalKey<Schema.String>;
|
|
70
|
-
}> | Schema.TaggedStruct<"NotFocused", {}> | Schema.TaggedStruct<"NotFound", {}> | Schema.TaggedStruct<"NotVisible", {}> | Schema.TaggedStruct<"Provider", {
|
|
86
|
+
}> | Schema.TaggedStruct<"Missing", {}> | Schema.TaggedStruct<"NotFocused", {}> | Schema.TaggedStruct<"NotFound", {}> | Schema.TaggedStruct<"NotVisible", {}> | Schema.TaggedStruct<"Provider", {
|
|
71
87
|
readonly status: Schema.optionalKey<Schema.Int>;
|
|
88
|
+
readonly detail: Schema.optionalKey<Schema.String>;
|
|
89
|
+
}> | Schema.TaggedStruct<"QueueExpired", {}> | Schema.TaggedStruct<"QueueFull", {
|
|
90
|
+
readonly scope: Schema.Literals<readonly ["page", "session", "registry"]>;
|
|
91
|
+
readonly maximum: Schema.Natural;
|
|
92
|
+
readonly observed: Schema.Natural;
|
|
72
93
|
}> | Schema.TaggedStruct<"RateLimited", {
|
|
73
94
|
readonly retryAfterMillis: Schema.optionalKey<Schema.Natural>;
|
|
74
|
-
}> | Schema.TaggedStruct<"Resized", {}> | Schema.TaggedStruct<"Stale", {}> | Schema.TaggedStruct<"TargetChanged", {}> | Schema.TaggedStruct<"Timeout", {}> | Schema.TaggedStruct<"Timestamp", {}> | Schema.TaggedStruct<"Transport", {
|
|
95
|
+
}> | Schema.TaggedStruct<"Resized", {}> | Schema.TaggedStruct<"ScheduleMissed", {}> | Schema.TaggedStruct<"Stale", {}> | Schema.TaggedStruct<"TargetChanged", {}> | Schema.TaggedStruct<"Timeout", {}> | Schema.TaggedStruct<"Timestamp", {}> | Schema.TaggedStruct<"TimingBudgetExceeded", {}> | Schema.TaggedStruct<"Transport", {
|
|
75
96
|
readonly status: Schema.optionalKey<Schema.Int>;
|
|
76
97
|
}> | Schema.TaggedStruct<"UnregisteredSession", {}> | Schema.TaggedStruct<"UnsafeUrl", {}> | Schema.TaggedStruct<"Unsupported", {}>)[]>;
|
|
77
98
|
export type BrowserReason = typeof BrowserReason.Type;
|
|
99
|
+
/**
|
|
100
|
+
* Containment never changes an uncertain mutation into a known action outcome. `PagePaused` is
|
|
101
|
+
* a page's own popup/dialog-policy quarantine: the page stays open for an operator and refuses
|
|
102
|
+
* automation until a drained handoff and explicit release.
|
|
103
|
+
*/
|
|
104
|
+
export declare const Containment: Schema.Union<readonly [Schema.TaggedStruct<"NotRequired", {}>, Schema.TaggedStruct<"PageClosed", {
|
|
105
|
+
readonly pageId: Schema.String;
|
|
106
|
+
readonly generation: Schema.Natural;
|
|
107
|
+
}>, Schema.TaggedStruct<"PagePaused", {
|
|
108
|
+
readonly pageId: Schema.String;
|
|
109
|
+
readonly generation: Schema.Natural;
|
|
110
|
+
}>, Schema.TaggedStruct<"SessionFenced", {
|
|
111
|
+
readonly generation: Schema.Natural;
|
|
112
|
+
}>]>;
|
|
113
|
+
export type Containment = typeof Containment.Type;
|
|
78
114
|
declare const BrowserError_base: Schema.Class<BrowserError, Schema.TaggedStruct<"BrowserError", {
|
|
79
|
-
readonly operation: Schema.Literals<readonly ["configure", "launch", "connect", "reconnect", "detach", "disconnect", "close", "handoff", "resume", "live-view", "target", "handle", "list-pages", "
|
|
80
|
-
readonly reason: Schema.Union<(Schema.TaggedStruct<"Active", {}> | Schema.TaggedStruct<"Ambiguous", {
|
|
115
|
+
readonly operation: Schema.Literals<readonly ["configure", "launch", "connect", "reconnect", "detach", "disconnect", "close", "handoff", "resume", "live-view", "target", "handle", "list-pages", "describe-page", "list-frames", "select-page", "new-page", "close-page", "resize", "ready", "observe", "checkpoint", "control-facts", "revalidate", "read-text", "screenshot", "wait", "resolve", "run", "settled", "navigate", "navigate-stop", "click", "fill", "fill-form", "select-option", "scroll", "click-and-wait", "download-action", "select-files", "file-chooser", "action-result", "pointer-move", "hover", "wheel", "press", "type", "page-control", "page-state", "page-suspend", "page-resume", "capture", "capture-start", "capture-stop", "capture-consume"]>;
|
|
116
|
+
readonly reason: Schema.Union<(Schema.TaggedStruct<"Active", {}> | Schema.TaggedStruct<"Ambiguous", {
|
|
117
|
+
readonly count: Schema.optionalKey<Schema.Natural>;
|
|
118
|
+
}> | Schema.TaggedStruct<"Authorization", {}> | Schema.TaggedStruct<"Busy", {}> | Schema.TaggedStruct<"Closed", {}> | Schema.TaggedStruct<"Configuration", {
|
|
81
119
|
readonly path: Schema.optionalKey<Schema.String>;
|
|
82
|
-
}> | Schema.TaggedStruct<"ContentType", {}> | Schema.TaggedStruct<"ContextLease", {}> | Schema.TaggedStruct<"Denied", {}> | Schema.TaggedStruct<"Disabled", {}> | Schema.TaggedStruct<"Disconnected", {}> | Schema.TaggedStruct<"Expired", {}> | Schema.TaggedStruct<"Failed", {}> | Schema.TaggedStruct<"Interrupted", {}> | Schema.TaggedStruct<"Limit", {
|
|
83
|
-
readonly dimension: Schema.Literals<readonly ["actions", "elapsed", "returned-bytes", "pages", "frames", "frame-depth", "buffered-frames", "buffered-bytes", "host-reads", "controls", "text", "captures", "frame-bytes", "width", "height", "pixels"]>;
|
|
120
|
+
}> | Schema.TaggedStruct<"ContentType", {}> | Schema.TaggedStruct<"ContextLease", {}> | Schema.TaggedStruct<"Denied", {}> | Schema.TaggedStruct<"Disabled", {}> | Schema.TaggedStruct<"Disconnected", {}> | Schema.TaggedStruct<"Drifted", {}> | Schema.TaggedStruct<"Expired", {}> | Schema.TaggedStruct<"Failed", {}> | Schema.TaggedStruct<"Incomplete", {}> | Schema.TaggedStruct<"Interrupted", {}> | Schema.TaggedStruct<"Limit", {
|
|
121
|
+
readonly dimension: Schema.Literals<readonly ["runs", "actions", "elapsed", "returned-bytes", "pages", "frames", "frame-depth", "buffered-frames", "buffered-bytes", "host-reads", "controls", "text", "code-points", "captures", "frame-bytes", "width", "height", "pixels", "observation-snapshots", "observation-handles", "observation-bytes", "native-operations"]>;
|
|
84
122
|
readonly maximum: Schema.Natural;
|
|
85
123
|
readonly observed: Schema.Natural;
|
|
86
124
|
}> | Schema.TaggedStruct<"Malformed", {
|
|
87
125
|
readonly path: Schema.optionalKey<Schema.String>;
|
|
88
|
-
}> | Schema.TaggedStruct<"NotFocused", {}> | Schema.TaggedStruct<"NotFound", {}> | Schema.TaggedStruct<"NotVisible", {}> | Schema.TaggedStruct<"Provider", {
|
|
126
|
+
}> | Schema.TaggedStruct<"Missing", {}> | Schema.TaggedStruct<"NotFocused", {}> | Schema.TaggedStruct<"NotFound", {}> | Schema.TaggedStruct<"NotVisible", {}> | Schema.TaggedStruct<"Provider", {
|
|
89
127
|
readonly status: Schema.optionalKey<Schema.Int>;
|
|
128
|
+
readonly detail: Schema.optionalKey<Schema.String>;
|
|
129
|
+
}> | Schema.TaggedStruct<"QueueExpired", {}> | Schema.TaggedStruct<"QueueFull", {
|
|
130
|
+
readonly scope: Schema.Literals<readonly ["page", "session", "registry"]>;
|
|
131
|
+
readonly maximum: Schema.Natural;
|
|
132
|
+
readonly observed: Schema.Natural;
|
|
90
133
|
}> | Schema.TaggedStruct<"RateLimited", {
|
|
91
134
|
readonly retryAfterMillis: Schema.optionalKey<Schema.Natural>;
|
|
92
|
-
}> | Schema.TaggedStruct<"Resized", {}> | Schema.TaggedStruct<"Stale", {}> | Schema.TaggedStruct<"TargetChanged", {}> | Schema.TaggedStruct<"Timeout", {}> | Schema.TaggedStruct<"Timestamp", {}> | Schema.TaggedStruct<"Transport", {
|
|
135
|
+
}> | Schema.TaggedStruct<"Resized", {}> | Schema.TaggedStruct<"ScheduleMissed", {}> | Schema.TaggedStruct<"Stale", {}> | Schema.TaggedStruct<"TargetChanged", {}> | Schema.TaggedStruct<"Timeout", {}> | Schema.TaggedStruct<"Timestamp", {}> | Schema.TaggedStruct<"TimingBudgetExceeded", {}> | Schema.TaggedStruct<"Transport", {
|
|
93
136
|
readonly status: Schema.optionalKey<Schema.Int>;
|
|
94
137
|
}> | Schema.TaggedStruct<"UnregisteredSession", {}> | Schema.TaggedStruct<"UnsafeUrl", {}> | Schema.TaggedStruct<"Unsupported", {}>)[]>;
|
|
95
|
-
readonly outcome: Schema.Literals<readonly ["undispatched", "rejected", "unknown"]>;
|
|
138
|
+
readonly outcome: Schema.Literals<readonly ["undispatched", "rejected", "performed", "unknown"]>;
|
|
139
|
+
readonly containment: Schema.optionalKey<Schema.Union<readonly [Schema.TaggedStruct<"NotRequired", {}>, Schema.TaggedStruct<"PageClosed", {
|
|
140
|
+
readonly pageId: Schema.String;
|
|
141
|
+
readonly generation: Schema.Natural;
|
|
142
|
+
}>, Schema.TaggedStruct<"PagePaused", {
|
|
143
|
+
readonly pageId: Schema.String;
|
|
144
|
+
readonly generation: Schema.Natural;
|
|
145
|
+
}>, Schema.TaggedStruct<"SessionFenced", {
|
|
146
|
+
readonly generation: Schema.Natural;
|
|
147
|
+
}>]>>;
|
|
96
148
|
}>, import("effect/Cause").YieldableError>;
|
|
97
149
|
export declare class BrowserError extends BrowserError_base {}
|
|
98
150
|
declare const InitializationError_base: Schema.Class<InitializationError, Schema.TaggedStruct<"InitializationError", {
|
package/dist/Errors.mjs
CHANGED
|
@@ -19,9 +19,9 @@ const BrowserOperation = Schema.Literals([
|
|
|
19
19
|
"target",
|
|
20
20
|
"handle",
|
|
21
21
|
"list-pages",
|
|
22
|
+
"describe-page",
|
|
22
23
|
"list-frames",
|
|
23
24
|
"select-page",
|
|
24
|
-
"select-frame",
|
|
25
25
|
"new-page",
|
|
26
26
|
"close-page",
|
|
27
27
|
"resize",
|
|
@@ -33,6 +33,9 @@ const BrowserOperation = Schema.Literals([
|
|
|
33
33
|
"read-text",
|
|
34
34
|
"screenshot",
|
|
35
35
|
"wait",
|
|
36
|
+
"resolve",
|
|
37
|
+
"run",
|
|
38
|
+
"settled",
|
|
36
39
|
"navigate",
|
|
37
40
|
"navigate-stop",
|
|
38
41
|
"click",
|
|
@@ -63,10 +66,12 @@ const BrowserOperation = Schema.Literals([
|
|
|
63
66
|
const BrowserOutcome = Schema.Literals([
|
|
64
67
|
"undispatched",
|
|
65
68
|
"rejected",
|
|
69
|
+
"performed",
|
|
66
70
|
"unknown"
|
|
67
71
|
]);
|
|
68
72
|
/** Limits report measured producer facts; an unavailable measurement is never invented. */
|
|
69
73
|
const LimitDimension = Schema.Literals([
|
|
74
|
+
"runs",
|
|
70
75
|
"actions",
|
|
71
76
|
"elapsed",
|
|
72
77
|
"returned-bytes",
|
|
@@ -78,23 +83,46 @@ const LimitDimension = Schema.Literals([
|
|
|
78
83
|
"host-reads",
|
|
79
84
|
"controls",
|
|
80
85
|
"text",
|
|
86
|
+
"code-points",
|
|
81
87
|
"captures",
|
|
82
88
|
"frame-bytes",
|
|
83
89
|
"width",
|
|
84
90
|
"height",
|
|
85
|
-
"pixels"
|
|
91
|
+
"pixels",
|
|
92
|
+
"observation-snapshots",
|
|
93
|
+
"observation-handles",
|
|
94
|
+
"observation-bytes",
|
|
95
|
+
"native-operations"
|
|
86
96
|
]);
|
|
87
97
|
const SchemaPath = Schema.String.check(Schema.isMaxLength(512));
|
|
98
|
+
/**
|
|
99
|
+
* What the native engine said about a failure it raised: its first line, without escape codes,
|
|
100
|
+
* with every address cut to its origin. A host diagnostic, never part of the model projection.
|
|
101
|
+
*/
|
|
102
|
+
const NativeDetail = Schema.String.check(Schema.isMaxLength(512));
|
|
88
103
|
/** Validated constructors for host reasons. The model receives a separate bounded projection. */
|
|
89
104
|
const Reasons = {
|
|
90
105
|
Configuration: Schema.TaggedStruct("Configuration", { path: Schema.optionalKey(SchemaPath) }),
|
|
91
106
|
UnregisteredSession: Schema.TaggedStruct("UnregisteredSession", {}),
|
|
92
107
|
Unsupported: Schema.TaggedStruct("Unsupported", {}),
|
|
93
108
|
Busy: Schema.TaggedStruct("Busy", {}),
|
|
109
|
+
QueueFull: Schema.TaggedStruct("QueueFull", {
|
|
110
|
+
scope: Schema.Literals([
|
|
111
|
+
"page",
|
|
112
|
+
"session",
|
|
113
|
+
"registry"
|
|
114
|
+
]),
|
|
115
|
+
maximum: Schema.Natural,
|
|
116
|
+
observed: Schema.Natural
|
|
117
|
+
}),
|
|
118
|
+
QueueExpired: Schema.TaggedStruct("QueueExpired", {}),
|
|
94
119
|
Closed: Schema.TaggedStruct("Closed", {}),
|
|
95
120
|
Stale: Schema.TaggedStruct("Stale", {}),
|
|
96
121
|
NotFound: Schema.TaggedStruct("NotFound", {}),
|
|
97
|
-
|
|
122
|
+
Missing: Schema.TaggedStruct("Missing", {}),
|
|
123
|
+
Ambiguous: Schema.TaggedStruct("Ambiguous", { count: Schema.optionalKey(Schema.Natural) }),
|
|
124
|
+
Incomplete: Schema.TaggedStruct("Incomplete", {}),
|
|
125
|
+
Drifted: Schema.TaggedStruct("Drifted", {}),
|
|
98
126
|
Malformed: Schema.TaggedStruct("Malformed", { path: Schema.optionalKey(SchemaPath) }),
|
|
99
127
|
Limit: Schema.TaggedStruct("Limit", {
|
|
100
128
|
dimension: LimitDimension,
|
|
@@ -102,8 +130,13 @@ const Reasons = {
|
|
|
102
130
|
observed: Schema.Natural
|
|
103
131
|
}),
|
|
104
132
|
Timeout: Schema.TaggedStruct("Timeout", {}),
|
|
133
|
+
ScheduleMissed: Schema.TaggedStruct("ScheduleMissed", {}),
|
|
134
|
+
TimingBudgetExceeded: Schema.TaggedStruct("TimingBudgetExceeded", {}),
|
|
105
135
|
Transport: Schema.TaggedStruct("Transport", { status: Schema.optionalKey(Schema.Int) }),
|
|
106
|
-
Provider: Schema.TaggedStruct("Provider", {
|
|
136
|
+
Provider: Schema.TaggedStruct("Provider", {
|
|
137
|
+
status: Schema.optionalKey(Schema.Int),
|
|
138
|
+
detail: Schema.optionalKey(NativeDetail)
|
|
139
|
+
}),
|
|
107
140
|
Authorization: Schema.TaggedStruct("Authorization", {}),
|
|
108
141
|
RateLimited: Schema.TaggedStruct("RateLimited", { retryAfterMillis: Schema.optionalKey(Schema.Natural) }),
|
|
109
142
|
Disconnected: Schema.TaggedStruct("Disconnected", {}),
|
|
@@ -123,10 +156,28 @@ const Reasons = {
|
|
|
123
156
|
NotFocused: Schema.TaggedStruct("NotFocused", {})
|
|
124
157
|
};
|
|
125
158
|
const BrowserReason = Schema.Union(Object.values(Reasons));
|
|
159
|
+
/**
|
|
160
|
+
* Containment never changes an uncertain mutation into a known action outcome. `PagePaused` is
|
|
161
|
+
* a page's own popup/dialog-policy quarantine: the page stays open for an operator and refuses
|
|
162
|
+
* automation until a drained handoff and explicit release.
|
|
163
|
+
*/
|
|
164
|
+
const Containment = Schema.Union([
|
|
165
|
+
Schema.TaggedStruct("NotRequired", {}),
|
|
166
|
+
Schema.TaggedStruct("PageClosed", {
|
|
167
|
+
pageId: Schema.String,
|
|
168
|
+
generation: Schema.Natural
|
|
169
|
+
}),
|
|
170
|
+
Schema.TaggedStruct("PagePaused", {
|
|
171
|
+
pageId: Schema.String,
|
|
172
|
+
generation: Schema.Natural
|
|
173
|
+
}),
|
|
174
|
+
Schema.TaggedStruct("SessionFenced", { generation: Schema.Natural })
|
|
175
|
+
]);
|
|
126
176
|
var BrowserError = class extends Schema.TaggedError()("BrowserError", {
|
|
127
177
|
operation: BrowserOperation,
|
|
128
178
|
reason: BrowserReason,
|
|
129
|
-
outcome: BrowserOutcome
|
|
179
|
+
outcome: BrowserOutcome,
|
|
180
|
+
containment: Schema.optionalKey(Containment)
|
|
130
181
|
}) {};
|
|
131
182
|
var InitializationError = class extends Schema.TaggedError()("InitializationError", {
|
|
132
183
|
operation: Schema.Literals([
|
|
@@ -151,6 +202,6 @@ var InitializationError = class extends Schema.TaggedError()("InitializationErro
|
|
|
151
202
|
])
|
|
152
203
|
}) {};
|
|
153
204
|
//#endregion
|
|
154
|
-
export { BrowserError, BrowserOperation, BrowserOutcome, BrowserReason, InitializationError, LimitDimension, Reasons };
|
|
205
|
+
export { BrowserError, BrowserOperation, BrowserOutcome, BrowserReason, Containment, InitializationError, LimitDimension, Reasons };
|
|
155
206
|
|
|
156
207
|
//# sourceMappingURL=Errors.mjs.map
|
package/dist/Errors.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Errors.mjs","names":[],"sources":["../src/Errors.ts"],"sourcesContent":["import { Schema } from \"effect\";\n\n/**\n * What a caller asked the owned browser to do. The vocabulary is closed: the owner stamps it\n * when it admits an operation, so a native step's own name can never become API, and a new\n * spelling is a deliberate edit here rather than a string that merely compiles.\n */\nexport const BrowserOperation = Schema.Literals([\n // configuration and lifetime\n \"configure\",\n \"launch\",\n \"connect\",\n \"reconnect\",\n \"detach\",\n \"disconnect\",\n \"close\",\n \"handoff\",\n \"resume\",\n \"live-view\",\n // targets\n \"target\",\n \"handle\",\n \"list-pages\",\n \"list-frames\",\n \"select-page\",\n \"select-frame\",\n \"new-page\",\n \"close-page\",\n \"resize\",\n // reading\n \"ready\",\n \"observe\",\n \"checkpoint\",\n \"control-facts\",\n \"revalidate\",\n \"read-text\",\n \"screenshot\",\n \"wait\",\n // input\n \"navigate\",\n \"navigate-stop\",\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 \"action-result\",\n // native pointer input\n \"pointer-move\",\n \"hover\",\n \"wheel\",\n // native key input\n \"press\",\n \"type\",\n // page control\n \"page-control\",\n \"page-state\",\n \"page-suspend\",\n \"page-resume\",\n // capture\n \"capture\",\n \"capture-start\",\n \"capture-stop\",\n \"capture-consume\",\n]);\n\nexport type BrowserOperation = typeof BrowserOperation.Type;\n\n/** Dispatch evidence belongs to the operation, independently of its failure reason. */\nexport const BrowserOutcome = Schema.Literals([\"undispatched\", \"rejected\", \"unknown\"]);\n\nexport type BrowserOutcome = typeof BrowserOutcome.Type;\n\n/** Limits report measured producer facts; an unavailable measurement is never invented. */\nexport const LimitDimension = Schema.Literals([\n \"actions\",\n \"elapsed\",\n \"returned-bytes\",\n \"pages\",\n \"frames\",\n \"frame-depth\",\n \"buffered-frames\",\n \"buffered-bytes\",\n \"host-reads\",\n \"controls\",\n \"text\",\n \"captures\",\n \"frame-bytes\",\n \"width\",\n \"height\",\n \"pixels\",\n]);\n\nconst SchemaPath = Schema.String.check(Schema.isMaxLength(512));\n\n/** Validated constructors for host reasons. The model receives a separate bounded projection. */\nexport const Reasons = {\n Configuration: Schema.TaggedStruct(\"Configuration\", { path: Schema.optionalKey(SchemaPath) }),\n UnregisteredSession: Schema.TaggedStruct(\"UnregisteredSession\", {}),\n Unsupported: Schema.TaggedStruct(\"Unsupported\", {}),\n Busy: Schema.TaggedStruct(\"Busy\", {}),\n Closed: Schema.TaggedStruct(\"Closed\", {}),\n Stale: Schema.TaggedStruct(\"Stale\", {}),\n NotFound: Schema.TaggedStruct(\"NotFound\", {}),\n Ambiguous: Schema.TaggedStruct(\"Ambiguous\", {}),\n Malformed: Schema.TaggedStruct(\"Malformed\", { path: Schema.optionalKey(SchemaPath) }),\n Limit: Schema.TaggedStruct(\"Limit\", {\n dimension: LimitDimension,\n maximum: Schema.Natural,\n observed: Schema.Natural,\n }),\n Timeout: Schema.TaggedStruct(\"Timeout\", {}),\n Transport: Schema.TaggedStruct(\"Transport\", { status: Schema.optionalKey(Schema.Int) }),\n Provider: Schema.TaggedStruct(\"Provider\", { status: Schema.optionalKey(Schema.Int) }),\n Authorization: Schema.TaggedStruct(\"Authorization\", {}),\n RateLimited: Schema.TaggedStruct(\"RateLimited\", {\n retryAfterMillis: Schema.optionalKey(Schema.Natural),\n }),\n Disconnected: Schema.TaggedStruct(\"Disconnected\", {}),\n Active: Schema.TaggedStruct(\"Active\", {}),\n Disabled: Schema.TaggedStruct(\"Disabled\", {}),\n Expired: Schema.TaggedStruct(\"Expired\", {}),\n Failed: Schema.TaggedStruct(\"Failed\", {}),\n UnsafeUrl: Schema.TaggedStruct(\"UnsafeUrl\", {}),\n ContentType: Schema.TaggedStruct(\"ContentType\", {}),\n Timestamp: Schema.TaggedStruct(\"Timestamp\", {}),\n Resized: Schema.TaggedStruct(\"Resized\", {}),\n TargetChanged: Schema.TaggedStruct(\"TargetChanged\", {}),\n Interrupted: Schema.TaggedStruct(\"Interrupted\", {}),\n ContextLease: Schema.TaggedStruct(\"ContextLease\", {}),\n NotVisible: Schema.TaggedStruct(\"NotVisible\", {}),\n Denied: Schema.TaggedStruct(\"Denied\", {}),\n NotFocused: Schema.TaggedStruct(\"NotFocused\", {}),\n} as const;\n\nexport const BrowserReason = Schema.Union(Object.values(Reasons));\n\nexport type BrowserReason = typeof BrowserReason.Type;\n\nexport class BrowserError extends Schema.TaggedError<BrowserError>()(\"BrowserError\", {\n operation: BrowserOperation,\n reason: BrowserReason,\n outcome: BrowserOutcome,\n}) {}\n\nexport class InitializationError extends Schema.TaggedError<InitializationError>()(\n \"InitializationError\",\n {\n operation: Schema.Literals([\"configure\", \"register\", \"ready\", \"callback\", \"dispose\"]),\n step: Schema.String.check(Schema.isMaxLength(128)),\n reason: Schema.Literals([\n \"configuration\",\n \"unsupported\",\n \"origin\",\n \"stale\",\n \"busy\",\n \"closed\",\n \"timeout\",\n \"input\",\n \"output\",\n \"native\",\n ]),\n },\n) {}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Errors.mjs","names":[],"sources":["../src/Errors.ts"],"sourcesContent":["import { Schema } from \"effect\";\n\n/**\n * What a caller asked the owned browser to do. The vocabulary is closed: the owner stamps it\n * when it admits an operation, so a native step's own name can never become API, and a new\n * spelling is a deliberate edit here rather than a string that merely compiles.\n */\nexport const BrowserOperation = Schema.Literals([\n // configuration and lifetime\n \"configure\",\n \"launch\",\n \"connect\",\n \"reconnect\",\n \"detach\",\n \"disconnect\",\n \"close\",\n \"handoff\",\n \"resume\",\n \"live-view\",\n // targets\n \"target\",\n \"handle\",\n \"list-pages\",\n \"describe-page\",\n \"list-frames\",\n \"select-page\",\n \"new-page\",\n \"close-page\",\n \"resize\",\n // reading\n \"ready\",\n \"observe\",\n \"checkpoint\",\n \"control-facts\",\n \"revalidate\",\n \"read-text\",\n \"screenshot\",\n \"wait\",\n \"resolve\",\n \"run\",\n \"settled\",\n // input\n \"navigate\",\n \"navigate-stop\",\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 \"action-result\",\n // native pointer input\n \"pointer-move\",\n \"hover\",\n \"wheel\",\n // native key input\n \"press\",\n \"type\",\n // page control\n \"page-control\",\n \"page-state\",\n \"page-suspend\",\n \"page-resume\",\n // capture\n \"capture\",\n \"capture-start\",\n \"capture-stop\",\n \"capture-consume\",\n]);\n\nexport type BrowserOperation = typeof BrowserOperation.Type;\n\n/** Dispatch evidence belongs to the operation, independently of its failure reason. */\nexport const BrowserOutcome = Schema.Literals([\"undispatched\", \"rejected\", \"performed\", \"unknown\"]);\n\nexport type BrowserOutcome = typeof BrowserOutcome.Type;\n\n/** Limits report measured producer facts; an unavailable measurement is never invented. */\nexport const LimitDimension = Schema.Literals([\n \"runs\",\n \"actions\",\n \"elapsed\",\n \"returned-bytes\",\n \"pages\",\n \"frames\",\n \"frame-depth\",\n \"buffered-frames\",\n \"buffered-bytes\",\n \"host-reads\",\n \"controls\",\n \"text\",\n \"code-points\",\n \"captures\",\n \"frame-bytes\",\n \"width\",\n \"height\",\n \"pixels\",\n \"observation-snapshots\",\n \"observation-handles\",\n \"observation-bytes\",\n \"native-operations\",\n]);\n\nconst SchemaPath = Schema.String.check(Schema.isMaxLength(512));\n\n/**\n * What the native engine said about a failure it raised: its first line, without escape codes,\n * with every address cut to its origin. A host diagnostic, never part of the model projection.\n */\nconst NativeDetail = Schema.String.check(Schema.isMaxLength(512));\n\n/** Validated constructors for host reasons. The model receives a separate bounded projection. */\nexport const Reasons = {\n Configuration: Schema.TaggedStruct(\"Configuration\", { path: Schema.optionalKey(SchemaPath) }),\n UnregisteredSession: Schema.TaggedStruct(\"UnregisteredSession\", {}),\n Unsupported: Schema.TaggedStruct(\"Unsupported\", {}),\n Busy: Schema.TaggedStruct(\"Busy\", {}),\n QueueFull: Schema.TaggedStruct(\"QueueFull\", {\n scope: Schema.Literals([\"page\", \"session\", \"registry\"]),\n maximum: Schema.Natural,\n observed: Schema.Natural,\n }),\n QueueExpired: Schema.TaggedStruct(\"QueueExpired\", {}),\n Closed: Schema.TaggedStruct(\"Closed\", {}),\n Stale: Schema.TaggedStruct(\"Stale\", {}),\n NotFound: Schema.TaggedStruct(\"NotFound\", {}),\n Missing: Schema.TaggedStruct(\"Missing\", {}),\n Ambiguous: Schema.TaggedStruct(\"Ambiguous\", { count: Schema.optionalKey(Schema.Natural) }),\n Incomplete: Schema.TaggedStruct(\"Incomplete\", {}),\n Drifted: Schema.TaggedStruct(\"Drifted\", {}),\n Malformed: Schema.TaggedStruct(\"Malformed\", { path: Schema.optionalKey(SchemaPath) }),\n Limit: Schema.TaggedStruct(\"Limit\", {\n dimension: LimitDimension,\n maximum: Schema.Natural,\n observed: Schema.Natural,\n }),\n Timeout: Schema.TaggedStruct(\"Timeout\", {}),\n ScheduleMissed: Schema.TaggedStruct(\"ScheduleMissed\", {}),\n TimingBudgetExceeded: Schema.TaggedStruct(\"TimingBudgetExceeded\", {}),\n Transport: Schema.TaggedStruct(\"Transport\", { status: Schema.optionalKey(Schema.Int) }),\n Provider: Schema.TaggedStruct(\"Provider\", {\n status: Schema.optionalKey(Schema.Int),\n detail: Schema.optionalKey(NativeDetail),\n }),\n Authorization: Schema.TaggedStruct(\"Authorization\", {}),\n RateLimited: Schema.TaggedStruct(\"RateLimited\", {\n retryAfterMillis: Schema.optionalKey(Schema.Natural),\n }),\n Disconnected: Schema.TaggedStruct(\"Disconnected\", {}),\n Active: Schema.TaggedStruct(\"Active\", {}),\n Disabled: Schema.TaggedStruct(\"Disabled\", {}),\n Expired: Schema.TaggedStruct(\"Expired\", {}),\n Failed: Schema.TaggedStruct(\"Failed\", {}),\n UnsafeUrl: Schema.TaggedStruct(\"UnsafeUrl\", {}),\n ContentType: Schema.TaggedStruct(\"ContentType\", {}),\n Timestamp: Schema.TaggedStruct(\"Timestamp\", {}),\n Resized: Schema.TaggedStruct(\"Resized\", {}),\n TargetChanged: Schema.TaggedStruct(\"TargetChanged\", {}),\n Interrupted: Schema.TaggedStruct(\"Interrupted\", {}),\n ContextLease: Schema.TaggedStruct(\"ContextLease\", {}),\n NotVisible: Schema.TaggedStruct(\"NotVisible\", {}),\n Denied: Schema.TaggedStruct(\"Denied\", {}),\n NotFocused: Schema.TaggedStruct(\"NotFocused\", {}),\n} as const;\n\nexport const BrowserReason = Schema.Union(Object.values(Reasons));\n\nexport type BrowserReason = typeof BrowserReason.Type;\n\n/**\n * Containment never changes an uncertain mutation into a known action outcome. `PagePaused` is\n * a page's own popup/dialog-policy quarantine: the page stays open for an operator and refuses\n * automation until a drained handoff and explicit release.\n */\nexport const Containment = Schema.Union([\n Schema.TaggedStruct(\"NotRequired\", {}),\n Schema.TaggedStruct(\"PageClosed\", { pageId: Schema.String, generation: Schema.Natural }),\n Schema.TaggedStruct(\"PagePaused\", { pageId: Schema.String, generation: Schema.Natural }),\n Schema.TaggedStruct(\"SessionFenced\", { generation: Schema.Natural }),\n]);\n\nexport type Containment = typeof Containment.Type;\n\nexport class BrowserError extends Schema.TaggedError<BrowserError>()(\"BrowserError\", {\n operation: BrowserOperation,\n reason: BrowserReason,\n outcome: BrowserOutcome,\n containment: Schema.optionalKey(Containment),\n}) {}\n\nexport class InitializationError extends Schema.TaggedError<InitializationError>()(\n \"InitializationError\",\n {\n operation: Schema.Literals([\"configure\", \"register\", \"ready\", \"callback\", \"dispose\"]),\n step: Schema.String.check(Schema.isMaxLength(128)),\n reason: Schema.Literals([\n \"configuration\",\n \"unsupported\",\n \"origin\",\n \"stale\",\n \"busy\",\n \"closed\",\n \"timeout\",\n \"input\",\n \"output\",\n \"native\",\n ]),\n },\n) {}\n"],"mappings":";;;;;;;AAOA,MAAa,mBAAmB,OAAO,SAAS;CAE9C;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAEA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAEA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAEA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAEA;CACA;CACA;CAEA;CACA;CAEA;CACA;CACA;CACA;CAEA;CACA;CACA;CACA;AACF,CAAC;;AAKD,MAAa,iBAAiB,OAAO,SAAS;CAAC;CAAgB;CAAY;CAAa;AAAS,CAAC;;AAKlG,MAAa,iBAAiB,OAAO,SAAS;CAC5C;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;AAED,MAAM,aAAa,OAAO,OAAO,MAAM,OAAO,YAAY,GAAG,CAAC;;;;;AAM9D,MAAM,eAAe,OAAO,OAAO,MAAM,OAAO,YAAY,GAAG,CAAC;;AAGhE,MAAa,UAAU;CACrB,eAAe,OAAO,aAAa,iBAAiB,EAAE,MAAM,OAAO,YAAY,UAAU,EAAE,CAAC;CAC5F,qBAAqB,OAAO,aAAa,uBAAuB,CAAC,CAAC;CAClE,aAAa,OAAO,aAAa,eAAe,CAAC,CAAC;CAClD,MAAM,OAAO,aAAa,QAAQ,CAAC,CAAC;CACpC,WAAW,OAAO,aAAa,aAAa;EAC1C,OAAO,OAAO,SAAS;GAAC;GAAQ;GAAW;EAAU,CAAC;EACtD,SAAS,OAAO;EAChB,UAAU,OAAO;CACnB,CAAC;CACD,cAAc,OAAO,aAAa,gBAAgB,CAAC,CAAC;CACpD,QAAQ,OAAO,aAAa,UAAU,CAAC,CAAC;CACxC,OAAO,OAAO,aAAa,SAAS,CAAC,CAAC;CACtC,UAAU,OAAO,aAAa,YAAY,CAAC,CAAC;CAC5C,SAAS,OAAO,aAAa,WAAW,CAAC,CAAC;CAC1C,WAAW,OAAO,aAAa,aAAa,EAAE,OAAO,OAAO,YAAY,OAAO,OAAO,EAAE,CAAC;CACzF,YAAY,OAAO,aAAa,cAAc,CAAC,CAAC;CAChD,SAAS,OAAO,aAAa,WAAW,CAAC,CAAC;CAC1C,WAAW,OAAO,aAAa,aAAa,EAAE,MAAM,OAAO,YAAY,UAAU,EAAE,CAAC;CACpF,OAAO,OAAO,aAAa,SAAS;EAClC,WAAW;EACX,SAAS,OAAO;EAChB,UAAU,OAAO;CACnB,CAAC;CACD,SAAS,OAAO,aAAa,WAAW,CAAC,CAAC;CAC1C,gBAAgB,OAAO,aAAa,kBAAkB,CAAC,CAAC;CACxD,sBAAsB,OAAO,aAAa,wBAAwB,CAAC,CAAC;CACpE,WAAW,OAAO,aAAa,aAAa,EAAE,QAAQ,OAAO,YAAY,OAAO,GAAG,EAAE,CAAC;CACtF,UAAU,OAAO,aAAa,YAAY;EACxC,QAAQ,OAAO,YAAY,OAAO,GAAG;EACrC,QAAQ,OAAO,YAAY,YAAY;CACzC,CAAC;CACD,eAAe,OAAO,aAAa,iBAAiB,CAAC,CAAC;CACtD,aAAa,OAAO,aAAa,eAAe,EAC9C,kBAAkB,OAAO,YAAY,OAAO,OAAO,EACrD,CAAC;CACD,cAAc,OAAO,aAAa,gBAAgB,CAAC,CAAC;CACpD,QAAQ,OAAO,aAAa,UAAU,CAAC,CAAC;CACxC,UAAU,OAAO,aAAa,YAAY,CAAC,CAAC;CAC5C,SAAS,OAAO,aAAa,WAAW,CAAC,CAAC;CAC1C,QAAQ,OAAO,aAAa,UAAU,CAAC,CAAC;CACxC,WAAW,OAAO,aAAa,aAAa,CAAC,CAAC;CAC9C,aAAa,OAAO,aAAa,eAAe,CAAC,CAAC;CAClD,WAAW,OAAO,aAAa,aAAa,CAAC,CAAC;CAC9C,SAAS,OAAO,aAAa,WAAW,CAAC,CAAC;CAC1C,eAAe,OAAO,aAAa,iBAAiB,CAAC,CAAC;CACtD,aAAa,OAAO,aAAa,eAAe,CAAC,CAAC;CAClD,cAAc,OAAO,aAAa,gBAAgB,CAAC,CAAC;CACpD,YAAY,OAAO,aAAa,cAAc,CAAC,CAAC;CAChD,QAAQ,OAAO,aAAa,UAAU,CAAC,CAAC;CACxC,YAAY,OAAO,aAAa,cAAc,CAAC,CAAC;AAClD;AAEA,MAAa,gBAAgB,OAAO,MAAM,OAAO,OAAO,OAAO,CAAC;;;;;;AAShE,MAAa,cAAc,OAAO,MAAM;CACtC,OAAO,aAAa,eAAe,CAAC,CAAC;CACrC,OAAO,aAAa,cAAc;EAAE,QAAQ,OAAO;EAAQ,YAAY,OAAO;CAAQ,CAAC;CACvF,OAAO,aAAa,cAAc;EAAE,QAAQ,OAAO;EAAQ,YAAY,OAAO;CAAQ,CAAC;CACvF,OAAO,aAAa,iBAAiB,EAAE,YAAY,OAAO,QAAQ,CAAC;AACrE,CAAC;AAID,IAAa,eAAb,cAAkC,OAAO,YAA0B,CAAC,CAAC,gBAAgB;CACnF,WAAW;CACX,QAAQ;CACR,SAAS;CACT,aAAa,OAAO,YAAY,WAAW;AAC7C,CAAC,CAAC,CAAC,CAAC;AAEJ,IAAa,sBAAb,cAAyC,OAAO,YAAiC,CAAC,CAChF,uBACA;CACE,WAAW,OAAO,SAAS;EAAC;EAAa;EAAY;EAAS;EAAY;CAAS,CAAC;CACpF,MAAM,OAAO,OAAO,MAAM,OAAO,YAAY,GAAG,CAAC;CACjD,QAAQ,OAAO,SAAS;EACtB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF,CAAC;AACH,CACF,CAAC,CAAC,CAAC"}
|