@effect-agent/platform-cloudflare 0.1.0-beta.31 → 0.1.0-beta.32
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/dist/index.d.mts +10 -10
- package/dist/index.mjs +2 -2
- package/dist/interactive-browser.d.mts +57 -4
- package/dist/interactive-browser.mjs +277 -57
- package/dist/interactive-browser.mjs.map +1 -1
- package/package.json +6 -6
- package/src/interactive-browser.ts +741 -152
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interactive-browser.mjs","names":[],"sources":["../src/interactive-browser.ts"],"sourcesContent":["/// <reference types=\"@cloudflare/workers-types\" />\n\nimport puppeteer, {\n type Browser,\n type BrowserContext,\n type HTTPRequest,\n type Page,\n} from \"@cloudflare/puppeteer\";\nimport {\n BrowserActionResult,\n BrowserNavigationResult,\n BrowserTextResult,\n InteractiveBrowser,\n InteractiveBrowserActionError,\n InteractiveBrowserBusyError,\n InteractiveBrowserCapacityError,\n InteractiveBrowserExpiredError,\n InteractiveBrowserLimitError,\n InteractiveBrowserPolicy,\n InteractiveBrowserPolicyDeniedError,\n InteractiveBrowserProtocolError,\n SandboxImplementation,\n type BrowserHandle,\n type InteractiveBrowserError,\n} from \"@effect-agent/sandbox\";\nimport { Context, Duration, Effect, Layer, Option, Ref, Schema, Semaphore } from \"effect\";\n\nexport const browserRunInteractiveImplementation = SandboxImplementation.make({\n isolation: \"isolated\",\n identity: \"cloudflare-browser-run-interactive\",\n});\n\nconst MIN_KEEP_ALIVE_MILLIS = 10_000;\nconst MAX_KEEP_ALIVE_MILLIS = 600_000;\nconst MAX_TEXT_LENGTH = 8 * 1024 * 1024;\nconst BoundedRemoteText = Schema.String.check(Schema.isMaxLength(MAX_TEXT_LENGTH));\nconst TextObservation = Schema.Union([\n Schema.Struct({ _tag: Schema.Literal(\"Text\"), text: BoundedRemoteText }),\n Schema.Struct({ _tag: Schema.Literal(\"MissingElement\") }),\n Schema.Struct({ _tag: Schema.Literal(\"OverLimit\"), observed: Schema.Natural }),\n]);\n\ntype BrowserFailure = typeof InteractiveBrowserError.Type;\ntype BrowserOperation = InteractiveBrowserActionError[\"operation\"];\n\ninterface InteractiveBrowserPolicySnapshot {\n readonly allowedHosts: ReadonlyArray<string>;\n readonly maxActions: number;\n readonly maxElapsedMillis: number;\n readonly maxReturnedBytes: number;\n}\n\n/** One intercepted Puppeteer request, narrowed to the policy-relevant surface. */\nexport interface BrowserRunInteractiveRequest {\n readonly url: () => string;\n readonly abort: () => Promise<void>;\n readonly continue: () => Promise<void>;\n}\n\nexport type BrowserRunInteractiveRequestListener = (request: BrowserRunInteractiveRequest) => void;\n\n/** Narrow page boundary used by deterministic tests; SDK values remain in this package. */\nexport interface BrowserRunInteractivePage {\n readonly close: () => Promise<void>;\n readonly setBypassServiceWorker: (enabled: boolean) => Promise<void>;\n readonly setRequestInterception: (enabled: boolean) => Promise<void>;\n readonly onRequest: (listener: BrowserRunInteractiveRequestListener) => void;\n readonly offRequest: (listener: BrowserRunInteractiveRequestListener) => void;\n readonly goto: (url: string) => Promise<void>;\n readonly url: () => unknown;\n readonly readText: (selector: string | undefined, maximumBytes: number) => Promise<unknown>;\n readonly fill: (selector: string, value: string) => Promise<void>;\n readonly click: (selector: string) => Promise<void>;\n}\n\nexport interface BrowserRunInteractiveContext {\n readonly newPage: () => Promise<BrowserRunInteractivePage>;\n readonly close: () => Promise<void>;\n}\n\nexport interface BrowserRunInteractiveBrowser {\n readonly createContext: () => Promise<BrowserRunInteractiveContext>;\n readonly close: () => Promise<void>;\n readonly isConnected: () => boolean;\n readonly onDisconnected: (listener: () => void) => void;\n readonly offDisconnected: (listener: () => void) => void;\n}\n\n/** Host-supplied Browser Run binding projected into one fakeable launch operation. */\nexport class BrowserRunInteractiveBinding extends Context.Service<\n BrowserRunInteractiveBinding,\n {\n readonly launch: (keepAliveMillis: number) => Promise<BrowserRunInteractiveBrowser>;\n }\n>()(\"@effect-agent/platform-cloudflare/BrowserRunInteractiveBinding\") {\n static layer(options: {\n readonly browser: BrowserRun;\n }): Layer.Layer<BrowserRunInteractiveBinding> {\n return Layer.succeed(BrowserRunInteractiveBinding)({\n launch: async (keepAliveMillis) =>\n makeProductionBrowser(\n await puppeteer.launch(options.browser, {\n keep_alive: keepAliveMillis,\n }),\n ),\n });\n }\n}\n\nconst makeProductionRequest = (request: HTTPRequest): BrowserRunInteractiveRequest => ({\n url: () => request.url(),\n abort: () => request.abort(\"blockedbyclient\"),\n continue: () => request.continue(),\n});\n\nconst makeProductionPage = (page: Page): BrowserRunInteractivePage => {\n const listeners = new Map<BrowserRunInteractiveRequestListener, (request: HTTPRequest) => void>();\n return {\n close: () => page.close(),\n setBypassServiceWorker: (enabled) => page.setBypassServiceWorker(enabled),\n setRequestInterception: (enabled) => page.setRequestInterception(enabled),\n onRequest: (listener) => {\n const sdkListener = (request: HTTPRequest) => listener(makeProductionRequest(request));\n listeners.set(listener, sdkListener);\n page.on(\"request\", sdkListener);\n },\n offRequest: (listener) => {\n const sdkListener = listeners.get(listener);\n if (sdkListener !== undefined) {\n page.off(\"request\", sdkListener);\n listeners.delete(listener);\n }\n },\n goto: async (url) => {\n await page.goto(url, { waitUntil: \"networkidle0\", timeout: 0 });\n },\n url: () => page.url(),\n readText: (selector, maximumBytes) =>\n page.evaluate(\n (requestedSelector, maximum) => {\n const pageDocument = Reflect.get(globalThis, \"document\");\n const element =\n requestedSelector === undefined\n ? Reflect.get(pageDocument, \"body\")\n : Reflect.apply(Reflect.get(pageDocument, \"querySelector\"), pageDocument, [\n requestedSelector,\n ]);\n if (element === null) return { _tag: \"MissingElement\" };\n const innerText = Reflect.get(element, \"innerText\");\n const textContent = Reflect.get(element, \"textContent\");\n const text =\n typeof innerText === \"string\"\n ? innerText\n : typeof textContent === \"string\"\n ? textContent\n : \"\";\n const observed = new TextEncoder().encode(text).byteLength;\n return observed > maximum ? { _tag: \"OverLimit\", observed } : { _tag: \"Text\", text };\n },\n selector,\n maximumBytes,\n ),\n fill: async (selector, value) => {\n await page.$eval(\n selector,\n (element, nextValue) => {\n if (!(\"value\" in element)) {\n throw new Error(\"The selector did not resolve to a fillable field\");\n }\n const focus = Reflect.get(element, \"focus\");\n if (typeof focus === \"function\") Reflect.apply(focus, element, []);\n Reflect.set(element, \"value\", nextValue);\n const dispatchEvent = Reflect.get(element, \"dispatchEvent\");\n if (typeof dispatchEvent === \"function\") {\n Reflect.apply(dispatchEvent, element, [new Event(\"input\", { bubbles: true })]);\n Reflect.apply(dispatchEvent, element, [new Event(\"change\", { bubbles: true })]);\n }\n },\n value,\n );\n },\n click: (selector) => page.click(selector),\n };\n};\n\nconst makeProductionContext = (context: BrowserContext): BrowserRunInteractiveContext => ({\n newPage: async () => makeProductionPage(await context.newPage()),\n close: () => context.close(),\n});\n\nconst makeProductionBrowser = (browser: Browser): BrowserRunInteractiveBrowser => ({\n createContext: async () => makeProductionContext(await browser.createBrowserContext()),\n close: () => browser.close(),\n isConnected: () => browser.isConnected(),\n onDisconnected: (listener) => {\n browser.on(\"disconnected\", listener);\n },\n offDisconnected: (listener) => {\n browser.off(\"disconnected\", listener);\n },\n});\n\nconst protocolError = (message: string, cause?: unknown): InteractiveBrowserProtocolError =>\n InteractiveBrowserProtocolError.make({\n implementation: browserRunInteractiveImplementation,\n message,\n ...(cause === undefined ? {} : { cause }),\n });\n\nconst actionError = (operation: BrowserOperation, cause?: unknown): InteractiveBrowserActionError =>\n InteractiveBrowserActionError.make({\n implementation: browserRunInteractiveImplementation,\n operation,\n message: `The interactive browser ${operation} operation failed`,\n ...(cause === undefined ? {} : { cause }),\n });\n\nconst policyError = (message: string): InteractiveBrowserPolicyDeniedError =>\n InteractiveBrowserPolicyDeniedError.make({\n implementation: browserRunInteractiveImplementation,\n message,\n });\n\nconst expiredError = (): InteractiveBrowserExpiredError =>\n InteractiveBrowserExpiredError.make({\n implementation: browserRunInteractiveImplementation,\n message: \"The remote browser is no longer usable\",\n });\n\nconst causeText = (cause: unknown): string => {\n if (cause instanceof Error) return cause.message.slice(0, 8_000);\n return String(cause).slice(0, 8_000);\n};\n\nconst isCapacityRefusal = (cause: unknown): boolean =>\n /(^|\\D)429(\\D|$)|browser time limit|capacity|too many concurrent/i.test(causeText(cause));\n\nconst isRemoteClosure = (cause: unknown): boolean =>\n /target closed|browser.*closed|session.*closed|connection.*closed|not connected|websocket.*closed/i.test(\n causeText(cause),\n );\n\nconst snapshotPolicy = (\n input: InteractiveBrowserPolicy,\n): Effect.Effect<InteractiveBrowserPolicySnapshot, InteractiveBrowserPolicyDeniedError> =>\n Schema.decodeUnknownEffect(InteractiveBrowserPolicy)(input).pipe(\n Effect.mapError(() => policyError(\"The interactive browser policy is malformed\")),\n Effect.map((decoded) =>\n Object.freeze({\n allowedHosts: Object.freeze([...decoded.allowedHosts]),\n maxActions: decoded.maxActions,\n maxElapsedMillis: decoded.maxElapsedMillis,\n maxReturnedBytes: decoded.maxReturnedBytes,\n }),\n ),\n );\n\nconst hostAllowed = (policy: InteractiveBrowserPolicySnapshot, value: string): boolean => {\n try {\n const url = new URL(value);\n return (\n url.protocol === \"https:\" &&\n url.username === \"\" &&\n url.password === \"\" &&\n policy.allowedHosts.some((host) => host === url.host)\n );\n } catch {\n return false;\n }\n};\n\nconst keepAliveMillis = (policy: InteractiveBrowserPolicySnapshot): number =>\n Math.max(MIN_KEEP_ALIVE_MILLIS, Math.min(MAX_KEEP_ALIVE_MILLIS, policy.maxElapsedMillis));\n\ninterface CloseableRemote {\n readonly close: () => Promise<void>;\n}\n\nconst closeLateAcquisition = async <A extends CloseableRemote>(\n signal: AbortSignal,\n acquire: () => Promise<A>,\n): Promise<A> => {\n const acquired = await acquire();\n if (!signal.aborted) return acquired;\n\n // The SDK does not accept AbortSignal. If an acquisition settles after Effect\n // has interrupted it, ownership never reaches Scope, so close it here instead.\n try {\n await acquired.close();\n } catch {\n // No caller remains to observe a late cleanup failure, and provider details\n // must not escape through an unhandled rejection.\n }\n throw new Error(\"The interrupted browser acquisition completed late\");\n};\n\nconst closeWithWarning = (close: () => Promise<void>, warning: string): Effect.Effect<void> =>\n Effect.tryPromise({\n try: close,\n catch: () => protocolError(warning),\n }).pipe(Effect.catchCause(() => Effect.logWarning(warning)));\n\nconst deadlineError = Effect.fn(\"BrowserRunInteractive.deadlineError\")(function* (\n policy: InteractiveBrowserPolicySnapshot,\n startedAt: number,\n) {\n const now = yield* Effect.clockWith((clock) => clock.currentTimeMillis);\n return yield* InteractiveBrowserLimitError.make({\n implementation: browserRunInteractiveImplementation,\n limit: \"elapsed\",\n maximum: policy.maxElapsedMillis,\n observed: Math.max(policy.maxElapsedMillis, now - startedAt),\n message: \"The browser elapsed-time limit was reached\",\n });\n});\n\nconst withinDeadline = Effect.fn(\"BrowserRunInteractive.withinDeadline\")(function* <A, E, R>(\n effect: Effect.Effect<A, E, R>,\n policy: InteractiveBrowserPolicySnapshot,\n startedAt: number,\n onTimeout?: () => void,\n): Effect.fn.Return<A, E | InteractiveBrowserLimitError, R> {\n const now = yield* Effect.clockWith((clock) => clock.currentTimeMillis);\n const elapsed = Math.max(0, now - startedAt);\n const remaining = policy.maxElapsedMillis - elapsed;\n if (remaining <= 0) return yield* deadlineError(policy, startedAt);\n return yield* effect.pipe(\n Effect.timeoutOrElse({\n duration: Duration.millis(remaining),\n orElse: () =>\n Effect.sync(() => onTimeout?.()).pipe(Effect.andThen(deadlineError(policy, startedAt))),\n }),\n );\n});\n\ninterface HandleState {\n readonly disconnected: { value: boolean };\n readonly uncertain: { value: boolean };\n readonly violation: { value: BrowserFailure | undefined };\n readonly pendingRequests: Set<Promise<void>>;\n}\n\nconst stateFailure = (state: HandleState): BrowserFailure | undefined => {\n if (state.violation.value !== undefined) return state.violation.value;\n if (state.disconnected.value || state.uncertain.value) return expiredError();\n return undefined;\n};\n\nconst awaitPendingRequests = (state: HandleState): Effect.Effect<void> =>\n Effect.suspend(() => {\n const pending = [...state.pendingRequests];\n return pending.length === 0\n ? Effect.void\n : Effect.promise(() => Promise.all(pending)).pipe(\n Effect.asVoid,\n Effect.andThen(awaitPendingRequests(state)),\n );\n });\n\nconst decodeNavigationResult = Effect.fn(\"BrowserRunInteractive.decodeNavigationResult\")(function* (\n page: BrowserRunInteractivePage,\n policy: InteractiveBrowserPolicySnapshot,\n) {\n const url = yield* Effect.try({\n try: page.url,\n catch: (cause) => protocolError(\"Reading the browser navigation URL failed\", cause),\n });\n const result = yield* Schema.decodeUnknownEffect(BrowserNavigationResult)({\n url,\n }).pipe(\n Effect.mapError((cause) =>\n protocolError(\"The browser returned a malformed navigation URL\", cause),\n ),\n );\n if (!hostAllowed(policy, result.url)) {\n return yield* policyError(\"The browser returned an off-policy page URL\");\n }\n return result;\n});\n\nconst decodeActionResult = Effect.fn(\"BrowserRunInteractive.decodeActionResult\")(function* (\n page: BrowserRunInteractivePage,\n policy: InteractiveBrowserPolicySnapshot,\n) {\n const url = yield* Effect.try({\n try: page.url,\n catch: (cause) => protocolError(\"Reading the browser page URL failed\", cause),\n });\n const result = yield* Schema.decodeUnknownEffect(BrowserActionResult)({ url }).pipe(\n Effect.mapError((cause) => protocolError(\"The browser returned a malformed page URL\", cause)),\n );\n if (!hostAllowed(policy, result.url)) {\n return yield* policyError(\"The browser returned an off-policy page URL\");\n }\n return result;\n});\n\nconst makeRequestListener =\n (\n policy: InteractiveBrowserPolicySnapshot,\n state: HandleState,\n ): BrowserRunInteractiveRequestListener =>\n (request) => {\n let allowed = false;\n try {\n allowed = hostAllowed(policy, request.url());\n } catch {\n allowed = false;\n }\n if (!allowed) {\n state.violation.value = policyError(\"The browser requested an off-policy URL\");\n }\n\n let settlement: Promise<void>;\n try {\n settlement = allowed ? request.continue() : request.abort();\n } catch {\n state.violation.value = protocolError(\"Resolving an intercepted browser request failed\");\n return;\n }\n const observed = settlement\n .catch(() => {\n state.violation.value = protocolError(\"Resolving an intercepted browser request failed\");\n })\n .finally(() => {\n state.pendingRequests.delete(observed);\n });\n state.pendingRequests.add(observed);\n };\n\nconst makeHandle = Effect.fn(\"BrowserRunInteractive.makeHandle\")(function* (\n page: BrowserRunInteractivePage,\n policy: InteractiveBrowserPolicySnapshot,\n startedAt: number,\n state: HandleState,\n): Effect.fn.Return<BrowserHandle> {\n const permits = yield* Semaphore.make(1);\n const actions = yield* Ref.make(0);\n\n const remote = <A>(operation: BrowserOperation, evaluate: () => Promise<A>) =>\n Effect.tryPromise({\n try: evaluate,\n catch: (cause) => {\n if (state.disconnected.value || isRemoteClosure(cause)) {\n state.disconnected.value = true;\n return expiredError();\n }\n return actionError(operation, cause);\n },\n });\n\n const run = <A>(\n effect: Effect.Effect<A, BrowserFailure>,\n preflight: Effect.Effect<void, BrowserFailure> = Effect.void,\n ) =>\n permits\n .withPermitsIfAvailable(1)(\n Effect.gen(function* () {\n const unavailable = stateFailure(state);\n if (unavailable !== undefined) return yield* unavailable;\n yield* preflight;\n\n const admitted = yield* Ref.modify(actions, (count) =>\n count >= policy.maxActions\n ? [{ allowed: false, observed: count + 1 }, count]\n : [{ allowed: true, observed: count + 1 }, count + 1],\n );\n if (!admitted.allowed) {\n return yield* InteractiveBrowserLimitError.make({\n implementation: browserRunInteractiveImplementation,\n limit: \"actions\",\n maximum: policy.maxActions,\n observed: admitted.observed,\n message: \"The browser action limit was reached\",\n });\n }\n\n const completed = effect.pipe(\n Effect.catch((error) => {\n const failure = stateFailure(state);\n return Effect.fail(failure ?? error);\n }),\n Effect.flatMap((result) =>\n awaitPendingRequests(state).pipe(\n Effect.flatMap(() => {\n const failure = stateFailure(state);\n return failure === undefined ? Effect.succeed(result) : Effect.fail(failure);\n }),\n ),\n ),\n );\n return yield* withinDeadline(completed, policy, startedAt, () => {\n state.uncertain.value = true;\n }).pipe(\n Effect.onInterrupt(() =>\n Effect.sync(() => {\n state.uncertain.value = true;\n }),\n ),\n Effect.catch((error) => {\n if (Schema.is(InteractiveBrowserLimitError)(error) && error.limit === \"elapsed\") {\n return Effect.fail(error);\n }\n const failure = stateFailure(state);\n return Effect.fail(failure ?? error);\n }),\n );\n }),\n )\n .pipe(\n Effect.flatMap((result) =>\n Option.isSome(result)\n ? Effect.succeed(result.value)\n : Effect.fail(\n InteractiveBrowserBusyError.make({\n implementation: browserRunInteractiveImplementation,\n message: \"The browser handle already has an operation in flight\",\n }),\n ),\n ),\n );\n\n return {\n navigate: (request) =>\n run(\n Effect.gen(function* () {\n yield* remote(\"navigate\", () => page.goto(request.url));\n return yield* decodeNavigationResult(page, policy);\n }),\n Effect.suspend(() =>\n hostAllowed(policy, request.url)\n ? Effect.void\n : Effect.fail(policyError(\"The navigation URL is outside the browser policy\")),\n ),\n ),\n readText: (request) =>\n run(\n Effect.gen(function* () {\n const raw = yield* remote(\"read-text\", () =>\n page.readText(request.selector, policy.maxReturnedBytes),\n );\n const observation = yield* Schema.decodeUnknownEffect(TextObservation)(raw).pipe(\n Effect.mapError((cause) =>\n protocolError(\"The browser returned a malformed text observation\", cause),\n ),\n );\n if (observation._tag === \"MissingElement\") {\n return yield* actionError(\"read-text\");\n }\n if (observation._tag === \"OverLimit\") {\n return yield* InteractiveBrowserLimitError.make({\n implementation: browserRunInteractiveImplementation,\n limit: \"returned-bytes\",\n maximum: policy.maxReturnedBytes,\n observed: observation.observed,\n message: \"The browser returned-text limit was reached\",\n });\n }\n const observed = new TextEncoder().encode(observation.text).byteLength;\n if (observed > policy.maxReturnedBytes) {\n return yield* InteractiveBrowserLimitError.make({\n implementation: browserRunInteractiveImplementation,\n limit: \"returned-bytes\",\n maximum: policy.maxReturnedBytes,\n observed,\n message: \"The browser returned-text limit was reached\",\n });\n }\n return yield* Schema.decodeUnknownEffect(BrowserTextResult)({\n text: observation.text,\n }).pipe(\n Effect.mapError((cause) =>\n protocolError(\"The browser returned malformed page text\", cause),\n ),\n );\n }),\n ),\n fill: (request) =>\n run(\n remote(\"fill\", () => page.fill(request.selector, request.value)).pipe(\n Effect.andThen(decodeActionResult(page, policy)),\n ),\n ),\n click: (request) =>\n run(\n remote(\"click\", () => page.click(request.selector)).pipe(\n Effect.andThen(decodeActionResult(page, policy)),\n ),\n ),\n };\n});\n\n/** Worker-only Cloudflare Puppeteer adapter; the caller supplies the Browser Run binding Layer. */\nexport const browserRunInteractiveLayer = (): Layer.Layer<\n InteractiveBrowser,\n never,\n BrowserRunInteractiveBinding\n> =>\n Layer.effect(\n InteractiveBrowser,\n Effect.gen(function* () {\n const binding = yield* BrowserRunInteractiveBinding;\n return InteractiveBrowser.of({\n open: (policy) =>\n Effect.gen(function* () {\n const fixedPolicy = yield* snapshotPolicy(policy);\n const startedAt = yield* Effect.clockWith((clock) => clock.currentTimeMillis);\n const state: HandleState = {\n disconnected: { value: false },\n uncertain: { value: false },\n violation: { value: undefined },\n pendingRequests: new Set(),\n };\n const browser = yield* Effect.acquireRelease(\n withinDeadline(\n Effect.tryPromise({\n try: (signal) =>\n closeLateAcquisition(signal, () =>\n binding.launch(keepAliveMillis(fixedPolicy)),\n ),\n catch: (cause) =>\n isCapacityRefusal(cause)\n ? InteractiveBrowserCapacityError.make({\n implementation: browserRunInteractiveImplementation,\n message: \"Browser Run has no capacity for a new browser session\",\n })\n : protocolError(\"Launching the Browser Run session failed\", cause),\n }),\n fixedPolicy,\n startedAt,\n ),\n (acquired) =>\n Effect.sync(() => {\n state.disconnected.value = true;\n }).pipe(\n Effect.andThen(\n closeWithWarning(acquired.close, \"Closing the interactive browser failed\"),\n ),\n ),\n { interruptible: true },\n );\n\n const disconnected = () => {\n state.disconnected.value = true;\n };\n yield* Effect.acquireRelease(\n Effect.try({\n try: () => browser.onDisconnected(disconnected),\n catch: (cause) =>\n protocolError(\"Installing the browser disconnect listener failed\", cause),\n }),\n () =>\n Effect.sync(() => {\n browser.offDisconnected(disconnected);\n }).pipe(\n Effect.catchCause(() =>\n Effect.logWarning(\"Removing the browser disconnect listener failed\"),\n ),\n ),\n );\n const connected = yield* Effect.try({\n try: browser.isConnected,\n catch: (cause) =>\n protocolError(\"Reading the Browser Run connection state failed\", cause),\n });\n if (!connected) {\n state.disconnected.value = true;\n return yield* expiredError();\n }\n\n const context = yield* Effect.acquireRelease(\n withinDeadline(\n Effect.tryPromise({\n try: (signal) => closeLateAcquisition(signal, browser.createContext),\n catch: (cause) =>\n state.disconnected.value || isRemoteClosure(cause)\n ? expiredError()\n : protocolError(\"Creating the browser context failed\", cause),\n }),\n fixedPolicy,\n startedAt,\n ),\n (acquired) =>\n closeWithWarning(acquired.close, \"Closing the interactive browser context failed\"),\n { interruptible: true },\n );\n const page = yield* Effect.acquireRelease(\n withinDeadline(\n Effect.tryPromise({\n try: (signal) => closeLateAcquisition(signal, context.newPage),\n catch: (cause) =>\n state.disconnected.value || isRemoteClosure(cause)\n ? expiredError()\n : protocolError(\"Creating the browser page failed\", cause),\n }),\n fixedPolicy,\n startedAt,\n ),\n (acquired) =>\n closeWithWarning(acquired.close, \"Closing the interactive browser page failed\"),\n { interruptible: true },\n );\n\n yield* withinDeadline(\n Effect.tryPromise({\n try: () => page.setBypassServiceWorker(true),\n catch: (cause) => protocolError(\"Bypassing browser service workers failed\", cause),\n }),\n fixedPolicy,\n startedAt,\n );\n\n const requestListener = makeRequestListener(fixedPolicy, state);\n yield* Effect.acquireRelease(\n Effect.try({\n try: () => page.onRequest(requestListener),\n catch: (cause) =>\n protocolError(\"Installing the browser request listener failed\", cause),\n }),\n () =>\n Effect.sync(() => {\n page.offRequest(requestListener);\n }).pipe(\n Effect.catchCause(() =>\n Effect.logWarning(\"Removing the browser request policy failed\"),\n ),\n ),\n );\n\n yield* withinDeadline(\n Effect.tryPromise({\n try: () => page.setRequestInterception(true),\n catch: (cause) =>\n protocolError(\"Installing the browser request policy failed\", cause),\n }),\n fixedPolicy,\n startedAt,\n );\n\n yield* withinDeadline(awaitPendingRequests(state), fixedPolicy, startedAt);\n const setupFailure = stateFailure(state);\n if (setupFailure !== undefined) return yield* setupFailure;\n\n return yield* makeHandle(page, fixedPolicy, startedAt, state);\n }),\n });\n }),\n );\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"interactive-browser.mjs","names":[],"sources":["../src/interactive-browser.ts"],"sourcesContent":["/// <reference types=\"@cloudflare/workers-types\" />\n\nimport puppeteer, {\n type Browser,\n type BrowserContext,\n type CDPSession,\n type HTTPRequest,\n type Page,\n} from \"@cloudflare/puppeteer\";\nimport {\n BrowserActionResult,\n BrowserScreenshotRequest,\n BrowserScrollRequest,\n BrowserNavigationResult,\n BrowserTextResult,\n InteractiveBrowser,\n InteractiveBrowserActionError,\n InteractiveBrowserBusyError,\n InteractiveBrowserCapacityError,\n InteractiveBrowserExpiredError,\n InteractiveBrowserLimitError,\n InteractiveBrowserPolicy,\n InteractiveBrowserPolicyDeniedError,\n InteractiveBrowserProtocolError,\n PageScreenshotResult,\n SandboxImplementation,\n type BrowserHandle,\n type InteractiveBrowserError,\n} from \"@effect-agent/sandbox\";\nimport {\n Context,\n Duration,\n Effect,\n Layer,\n Option,\n Redacted,\n Ref,\n Schema,\n Semaphore,\n type Scope,\n} from \"effect\";\n\nexport const browserRunInteractiveImplementation = SandboxImplementation.make({\n isolation: \"isolated\",\n identity: \"cloudflare-browser-run-interactive\",\n});\n\nconst MIN_KEEP_ALIVE_MILLIS = 10_000;\nconst MAX_KEEP_ALIVE_MILLIS = 600_000;\nconst MAX_TEXT_LENGTH = 8 * 1024 * 1024;\nconst MAX_SCREENSHOT_BYTES = 8 * 1024 * 1024;\nconst MIN_LIVE_VIEW_EXPIRY_MILLIS = 60_000;\nconst MAX_LIVE_VIEW_EXPIRY_MILLIS = 60 * 60_000;\nconst MAX_HANDOFF_TIMEOUT_MILLIS = 30 * 60_000;\nconst MAX_HOST_TEXT_LENGTH = 8 * 1024;\nconst CLEANUP_STEP_TIMEOUT_MILLIS = 10_000;\nconst CLOSE_SESSION_TIMEOUT_MILLIS = 10_000;\nconst PositiveInt = Schema.Int.check(Schema.isGreaterThan(0));\nconst BoundedHostText = Schema.String.check(\n Schema.isMinLength(1),\n Schema.isMaxLength(MAX_HOST_TEXT_LENGTH),\n);\nconst BoundedRemoteText = Schema.String.check(Schema.isMaxLength(MAX_TEXT_LENGTH));\nconst TextObservation = Schema.Union([\n Schema.Struct({ _tag: Schema.Literal(\"Text\"), text: BoundedRemoteText }),\n Schema.Struct({ _tag: Schema.Literal(\"MissingElement\") }),\n Schema.Struct({ _tag: Schema.Literal(\"OverLimit\"), observed: Schema.Natural }),\n]);\nconst PngBytes = Schema.Uint8Array.check(\n Schema.isMaxLength(MAX_SCREENSHOT_BYTES),\n Schema.makeFilter(\n (bytes) =>\n bytes.length >= 8 &&\n bytes[0] === 0x89 &&\n bytes[1] === 0x50 &&\n bytes[2] === 0x4e &&\n bytes[3] === 0x47 &&\n bytes[4] === 0x0d &&\n bytes[5] === 0x0a &&\n bytes[6] === 0x1a &&\n bytes[7] === 0x0a,\n { title: \"PNG bytes\" },\n ),\n);\nconst BrowserRunSessionId = Schema.String.check(\n Schema.isMinLength(1),\n Schema.isMaxLength(256),\n Schema.makeFilter((value) => /^[A-Za-z0-9_-]+$/.test(value), {\n title: \"a Browser Run session identifier\",\n }),\n);\nconst LiveViewUrl = Schema.String.check(\n Schema.isMaxLength(MAX_HOST_TEXT_LENGTH),\n Schema.makeFilter(\n (value) => {\n try {\n const url = new URL(value);\n return (\n url.protocol === \"https:\" &&\n url.host === \"live.browser.run\" &&\n url.username === \"\" &&\n url.password === \"\" &&\n url.pathname === \"/ui/view\" &&\n url.searchParams.get(\"mode\") === \"tab\" &&\n (url.searchParams.get(\"wss\") ?? \"\").startsWith(\"live.browser.run/api/devtools/browser/\")\n );\n } catch {\n return false;\n }\n },\n { title: \"a Cloudflare Live View HTTPS URL\" },\n ),\n);\nconst LiveViewObservation = Schema.Struct({ devtoolsFrontendUrl: LiveViewUrl });\nconst HandoffObservation = Schema.Struct({ handoffId: BoundedHostText });\nconst HandoffDuration = Schema.Natural.check(\n Schema.isLessThanOrEqualTo(MAX_HANDOFF_TIMEOUT_MILLIS),\n);\nconst HandoffStateObservation = Schema.Union([\n Schema.Struct({\n active: Schema.Literal(true),\n handoffId: BoundedHostText,\n durationMs: HandoffDuration,\n }),\n Schema.Struct({\n active: Schema.Literal(false),\n handoffId: Schema.optionalKey(BoundedHostText),\n durationMs: Schema.optionalKey(HandoffDuration),\n }),\n]);\n\n/** Host-only request for a redacted Cloudflare Live View URL. */\nexport class BrowserRunLiveViewRequest extends Schema.Class<BrowserRunLiveViewRequest>(\n \"BrowserRunLiveViewRequest\",\n)({\n mode: Schema.Literal(\"tab\"),\n expiresInMs: PositiveInt.check(\n Schema.isBetween({\n minimum: MIN_LIVE_VIEW_EXPIRY_MILLIS,\n maximum: MAX_LIVE_VIEW_EXPIRY_MILLIS,\n }),\n ),\n}) {}\n\nexport class BrowserRunLiveViewResult extends Schema.Class<BrowserRunLiveViewResult>(\n \"BrowserRunLiveViewResult\",\n)({ devtoolsFrontendUrl: Schema.Redacted(LiveViewUrl) }) {}\n\n/** Start one bounded handoff; controller ownership remains a consumer concern. */\nexport class BrowserRunHandoffRequest extends Schema.Class<BrowserRunHandoffRequest>(\n \"BrowserRunHandoffRequest\",\n)({\n instructions: BoundedHostText.check(Schema.isMaxLength(1_024)),\n timeout: PositiveInt.check(Schema.isLessThanOrEqualTo(MAX_HANDOFF_TIMEOUT_MILLIS)),\n}) {}\n\nexport class BrowserRunHandoffResult extends Schema.Class<BrowserRunHandoffResult>(\n \"BrowserRunHandoffResult\",\n)({ handoffId: Schema.Redacted(BoundedHostText) }) {}\n\nexport class BrowserRunHandoffState extends Schema.Class<BrowserRunHandoffState>(\n \"BrowserRunHandoffState\",\n)({\n active: Schema.Boolean,\n handoffId: Schema.optionalKey(Schema.Redacted(BoundedHostText)),\n durationMs: Schema.optionalKey(HandoffDuration),\n}) {}\n\ntype BrowserFailure = typeof InteractiveBrowserError.Type;\ntype BrowserOperation = InteractiveBrowserActionError[\"operation\"];\n\ninterface InteractiveBrowserPolicySnapshot {\n readonly allowedHosts: ReadonlyArray<string>;\n readonly maxActions: number;\n readonly maxElapsedMillis: number;\n readonly maxReturnedBytes: number;\n}\n\n/** One intercepted Puppeteer request, narrowed to the policy-relevant surface. */\nexport interface BrowserRunInteractiveRequest {\n readonly url: () => string;\n readonly abort: () => Promise<void>;\n readonly continue: () => Promise<void>;\n}\n\nexport type BrowserRunInteractiveRequestListener = (request: BrowserRunInteractiveRequest) => void;\n\nexport type BrowserRunCloudflareCommand =\n | \"Cloudflare.getLiveView\"\n | \"Cloudflare.handoff\"\n | \"Cloudflare.getHandoffState\";\n\n/** Narrow CDP boundary for Cloudflare commands absent from the pinned protocol types. */\nexport interface BrowserRunInteractiveCdpSession {\n readonly send: (command: BrowserRunCloudflareCommand, parameters: unknown) => Promise<unknown>;\n readonly detach: () => Promise<void>;\n}\n\n/** Narrow page boundary used by deterministic tests; SDK values remain in this package. */\nexport interface BrowserRunInteractivePage {\n readonly close: () => Promise<void>;\n readonly setBypassServiceWorker: (enabled: boolean) => Promise<void>;\n readonly setRequestInterception: (enabled: boolean) => Promise<void>;\n readonly onRequest: (listener: BrowserRunInteractiveRequestListener) => void;\n readonly offRequest: (listener: BrowserRunInteractiveRequestListener) => void;\n readonly goto: (url: string) => Promise<void>;\n readonly url: () => unknown;\n readonly readText: (selector: string | undefined, maximumBytes: number) => Promise<unknown>;\n readonly fill: (selector: string, value: string) => Promise<void>;\n readonly click: (selector: string) => Promise<void>;\n readonly screenshot: (fullPage: boolean) => Promise<unknown>;\n readonly scroll: (deltaX: number, deltaY: number) => Promise<void>;\n readonly createCdpSession: () => Promise<BrowserRunInteractiveCdpSession>;\n}\n\nexport interface BrowserRunInteractiveContext {\n readonly newPage: () => Promise<BrowserRunInteractivePage>;\n readonly close: () => Promise<void>;\n}\n\nexport interface BrowserRunInteractiveBrowser {\n readonly createContext: () => Promise<BrowserRunInteractiveContext>;\n readonly close: () => Promise<void>;\n readonly sessionId: () => unknown;\n readonly isConnected: () => boolean;\n readonly onDisconnected: (listener: () => void) => void;\n readonly offDisconnected: (listener: () => void) => void;\n}\n\n/** Host-supplied Browser Run binding projected into one fakeable launch operation. */\nexport class BrowserRunInteractiveBinding extends Context.Service<\n BrowserRunInteractiveBinding,\n {\n readonly launch: (keepAliveMillis: number) => Promise<BrowserRunInteractiveBrowser>;\n readonly connect: (sessionId: string) => Promise<BrowserRunInteractiveBrowser>;\n }\n>()(\"@effect-agent/platform-cloudflare/BrowserRunInteractiveBinding\") {\n static layer(options: {\n readonly browser: BrowserRun;\n }): Layer.Layer<BrowserRunInteractiveBinding> {\n return Layer.succeed(BrowserRunInteractiveBinding)({\n launch: async (keepAliveMillis) =>\n makeProductionBrowser(\n await puppeteer.launch(options.browser, {\n keep_alive: keepAliveMillis,\n }),\n ),\n connect: async (sessionId) =>\n makeProductionBrowser(await puppeteer.connect(options.browser, sessionId)),\n });\n }\n}\n\nexport interface BrowserRunInteractiveSession {\n readonly handle: BrowserHandle;\n readonly sessionId: Redacted.Redacted<string>;\n readonly getLiveView: (\n request: BrowserRunLiveViewRequest,\n ) => Effect.Effect<BrowserRunLiveViewResult, InteractiveBrowserError>;\n readonly handoff: (\n request: BrowserRunHandoffRequest,\n ) => Effect.Effect<BrowserRunHandoffResult, InteractiveBrowserError>;\n readonly getHandoffState: Effect.Effect<BrowserRunHandoffState, InteractiveBrowserError>;\n readonly close: Effect.Effect<void, InteractiveBrowserError>;\n}\n\n/** Cloudflare host authority kept separate from the provider-neutral browser handle. */\nexport class BrowserRunInteractiveHost extends Context.Service<\n BrowserRunInteractiveHost,\n {\n readonly open: (\n policy: InteractiveBrowserPolicy,\n ) => Effect.Effect<BrowserRunInteractiveSession, InteractiveBrowserError, Scope.Scope>;\n readonly closeSession: (\n sessionId: Redacted.Redacted<string>,\n ) => Effect.Effect<void, InteractiveBrowserError>;\n }\n>()(\"@effect-agent/platform-cloudflare/BrowserRunInteractiveHost\") {}\n\nconst makeProductionRequest = (request: HTTPRequest): BrowserRunInteractiveRequest => ({\n url: () => request.url(),\n abort: () => request.abort(\"blockedbyclient\"),\n continue: () => request.continue(),\n});\n\nconst makeProductionCdpSession = (session: CDPSession): BrowserRunInteractiveCdpSession => ({\n send: async (command, parameters) => {\n const send = Reflect.get(session, \"send\");\n return await Reflect.apply(send, session, [command, parameters]);\n },\n detach: () => session.detach(),\n});\n\nconst makeProductionPage = (page: Page): BrowserRunInteractivePage => {\n const listeners = new Map<BrowserRunInteractiveRequestListener, (request: HTTPRequest) => void>();\n return {\n close: () => page.close(),\n setBypassServiceWorker: (enabled) => page.setBypassServiceWorker(enabled),\n setRequestInterception: (enabled) => page.setRequestInterception(enabled),\n onRequest: (listener) => {\n const sdkListener = (request: HTTPRequest) => listener(makeProductionRequest(request));\n listeners.set(listener, sdkListener);\n page.on(\"request\", sdkListener);\n },\n offRequest: (listener) => {\n const sdkListener = listeners.get(listener);\n if (sdkListener !== undefined) {\n page.off(\"request\", sdkListener);\n listeners.delete(listener);\n }\n },\n goto: async (url) => {\n await page.goto(url, { waitUntil: \"networkidle0\", timeout: 0 });\n },\n url: () => page.url(),\n readText: (selector, maximumBytes) =>\n page.evaluate(\n (requestedSelector, maximum) => {\n const pageDocument = Reflect.get(globalThis, \"document\");\n const element =\n requestedSelector === undefined\n ? Reflect.get(pageDocument, \"body\")\n : Reflect.apply(Reflect.get(pageDocument, \"querySelector\"), pageDocument, [\n requestedSelector,\n ]);\n if (element === null) return { _tag: \"MissingElement\" };\n const innerText = Reflect.get(element, \"innerText\");\n const textContent = Reflect.get(element, \"textContent\");\n const text =\n typeof innerText === \"string\"\n ? innerText\n : typeof textContent === \"string\"\n ? textContent\n : \"\";\n const observed = new TextEncoder().encode(text).byteLength;\n return observed > maximum ? { _tag: \"OverLimit\", observed } : { _tag: \"Text\", text };\n },\n selector,\n maximumBytes,\n ),\n fill: async (selector, value) => {\n await page.$eval(\n selector,\n (element, nextValue) => {\n if (!(\"value\" in element)) {\n throw new Error(\"The selector did not resolve to a fillable field\");\n }\n const focus = Reflect.get(element, \"focus\");\n if (typeof focus === \"function\") Reflect.apply(focus, element, []);\n Reflect.set(element, \"value\", nextValue);\n const dispatchEvent = Reflect.get(element, \"dispatchEvent\");\n if (typeof dispatchEvent === \"function\") {\n Reflect.apply(dispatchEvent, element, [new Event(\"input\", { bubbles: true })]);\n Reflect.apply(dispatchEvent, element, [new Event(\"change\", { bubbles: true })]);\n }\n },\n value,\n );\n },\n click: (selector) => page.click(selector),\n // Puppeteer materializes the complete image before returning. The adapter\n // validates the 8 MiB Schema ceiling and pass limit immediately afterward.\n screenshot: (fullPage) => page.screenshot({ type: \"png\", fullPage }),\n scroll: (deltaX, deltaY) =>\n page.evaluate(\n (x, y) => {\n const scrollBy = Reflect.get(globalThis, \"scrollBy\");\n Reflect.apply(scrollBy, globalThis, [{ left: x, top: y, behavior: \"instant\" }]);\n },\n deltaX,\n deltaY,\n ),\n createCdpSession: async () => makeProductionCdpSession(await page.createCDPSession()),\n };\n};\n\nconst makeProductionContext = (context: BrowserContext): BrowserRunInteractiveContext => ({\n newPage: async () => makeProductionPage(await context.newPage()),\n close: () => context.close(),\n});\n\nconst makeProductionBrowser = (browser: Browser): BrowserRunInteractiveBrowser => ({\n createContext: async () => makeProductionContext(await browser.createBrowserContext()),\n close: () => browser.close(),\n sessionId: () => browser.sessionId(),\n isConnected: () => browser.isConnected(),\n onDisconnected: (listener) => {\n browser.on(\"disconnected\", listener);\n },\n offDisconnected: (listener) => {\n browser.off(\"disconnected\", listener);\n },\n});\n\nconst protocolError = (message: string, cause?: unknown): InteractiveBrowserProtocolError =>\n InteractiveBrowserProtocolError.make({\n implementation: browserRunInteractiveImplementation,\n message,\n ...(cause === undefined ? {} : { cause }),\n });\n\nconst actionError = (operation: BrowserOperation, cause?: unknown): InteractiveBrowserActionError =>\n InteractiveBrowserActionError.make({\n implementation: browserRunInteractiveImplementation,\n operation,\n message: `The interactive browser ${operation} operation failed`,\n ...(cause === undefined ? {} : { cause }),\n });\n\nconst policyError = (message: string): InteractiveBrowserPolicyDeniedError =>\n InteractiveBrowserPolicyDeniedError.make({\n implementation: browserRunInteractiveImplementation,\n message,\n });\n\nconst expiredError = (): InteractiveBrowserExpiredError =>\n InteractiveBrowserExpiredError.make({\n implementation: browserRunInteractiveImplementation,\n message: \"The remote browser is no longer usable\",\n });\n\nconst causeText = (cause: unknown): string => {\n if (cause instanceof Error) return cause.message.slice(0, 8_000);\n return String(cause).slice(0, 8_000);\n};\n\nconst isCapacityRefusal = (cause: unknown): boolean =>\n /(^|\\D)429(\\D|$)|browser time limit|capacity|too many concurrent/i.test(causeText(cause));\n\nconst isRemoteClosure = (cause: unknown): boolean =>\n /target closed|browser.*closed|session.*closed|connection.*closed|not connected|websocket.*closed/i.test(\n causeText(cause),\n );\n\nconst snapshotPolicy = (\n input: InteractiveBrowserPolicy,\n): Effect.Effect<InteractiveBrowserPolicySnapshot, InteractiveBrowserPolicyDeniedError> =>\n Schema.decodeUnknownEffect(InteractiveBrowserPolicy)(input).pipe(\n Effect.mapError(() => policyError(\"The interactive browser policy is malformed\")),\n Effect.map((decoded) =>\n Object.freeze({\n allowedHosts: Object.freeze([...decoded.allowedHosts]),\n maxActions: decoded.maxActions,\n maxElapsedMillis: decoded.maxElapsedMillis,\n maxReturnedBytes: decoded.maxReturnedBytes,\n }),\n ),\n );\n\nconst hostAllowed = (policy: InteractiveBrowserPolicySnapshot, value: string): boolean => {\n try {\n const url = new URL(value);\n return (\n url.protocol === \"https:\" &&\n url.username === \"\" &&\n url.password === \"\" &&\n policy.allowedHosts.some((host) => host === url.host)\n );\n } catch {\n return false;\n }\n};\n\nconst keepAliveMillis = (policy: InteractiveBrowserPolicySnapshot): number =>\n Math.max(MIN_KEEP_ALIVE_MILLIS, Math.min(MAX_KEEP_ALIVE_MILLIS, policy.maxElapsedMillis));\n\nconst closeLateAcquisition = async <A>(\n signal: AbortSignal,\n acquire: () => Promise<A>,\n close: (acquired: A) => Promise<void>,\n): Promise<A> => {\n const acquired = await acquire();\n if (!signal.aborted) return acquired;\n\n // The SDK does not accept AbortSignal. If an acquisition settles after Effect\n // has interrupted it, ownership never reaches Scope, so close it here instead.\n try {\n await close(acquired);\n } catch {\n // No caller remains to observe a late cleanup failure, and provider details\n // must not escape through an unhandled rejection.\n }\n throw new Error(\"The interrupted browser acquisition completed late\");\n};\n\nconst closeWithWarning = (close: () => Promise<void>, warning: string): Effect.Effect<void> =>\n Effect.tryPromise({\n try: close,\n catch: () => protocolError(warning),\n }).pipe(\n Effect.timeoutOrElse({\n duration: Duration.millis(CLEANUP_STEP_TIMEOUT_MILLIS),\n orElse: () => Effect.fail(protocolError(warning)),\n }),\n Effect.catchCause(() => Effect.logWarning(warning)),\n );\n\nconst deadlineError = Effect.fn(\"BrowserRunInteractive.deadlineError\")(function* (\n policy: InteractiveBrowserPolicySnapshot,\n startedAt: number,\n) {\n const now = yield* Effect.clockWith((clock) => clock.currentTimeMillis);\n return yield* InteractiveBrowserLimitError.make({\n implementation: browserRunInteractiveImplementation,\n limit: \"elapsed\",\n maximum: policy.maxElapsedMillis,\n observed: Math.max(policy.maxElapsedMillis, now - startedAt),\n message: \"The browser elapsed-time limit was reached\",\n });\n});\n\nconst withinDeadline = Effect.fn(\"BrowserRunInteractive.withinDeadline\")(function* <A, E, R>(\n effect: Effect.Effect<A, E, R>,\n policy: InteractiveBrowserPolicySnapshot,\n startedAt: number,\n onTimeout?: () => void,\n): Effect.fn.Return<A, E | InteractiveBrowserLimitError, R> {\n const now = yield* Effect.clockWith((clock) => clock.currentTimeMillis);\n const elapsed = Math.max(0, now - startedAt);\n const remaining = policy.maxElapsedMillis - elapsed;\n if (remaining <= 0) return yield* deadlineError(policy, startedAt);\n return yield* effect.pipe(\n Effect.timeoutOrElse({\n duration: Duration.millis(remaining),\n orElse: () =>\n Effect.sync(() => onTimeout?.()).pipe(Effect.andThen(deadlineError(policy, startedAt))),\n }),\n );\n});\n\ninterface HandleState {\n readonly closed: { value: boolean };\n readonly disconnected: { value: boolean };\n readonly uncertain: { value: boolean };\n readonly violation: { value: BrowserFailure | undefined };\n readonly pendingRequests: Set<Promise<void>>;\n}\n\nconst stateFailure = (state: HandleState): BrowserFailure | undefined => {\n if (state.violation.value !== undefined) return state.violation.value;\n if (state.closed.value || state.disconnected.value || state.uncertain.value) {\n return expiredError();\n }\n return undefined;\n};\n\ninterface CloseFailure {\n readonly error: InteractiveBrowserActionError;\n readonly warning: string;\n}\n\ninterface CloseEntry {\n readonly close: Effect.Effect<void, InteractiveBrowserActionError>;\n readonly warning: string;\n}\n\ninterface HandleRuntime {\n readonly handle: BrowserHandle;\n readonly run: <A>(\n effect: Effect.Effect<A, BrowserFailure>,\n preflight?: Effect.Effect<void, BrowserFailure>,\n ) => Effect.Effect<A, BrowserFailure>;\n}\n\nconst awaitPendingRequests = (state: HandleState): Effect.Effect<void> =>\n Effect.suspend(() => {\n const pending = [...state.pendingRequests];\n return pending.length === 0\n ? Effect.void\n : Effect.promise(() => Promise.all(pending)).pipe(\n Effect.asVoid,\n Effect.andThen(awaitPendingRequests(state)),\n );\n });\n\nconst decodeNavigationResult = Effect.fn(\"BrowserRunInteractive.decodeNavigationResult\")(function* (\n page: BrowserRunInteractivePage,\n policy: InteractiveBrowserPolicySnapshot,\n) {\n const url = yield* Effect.try({\n try: page.url,\n catch: (cause) => protocolError(\"Reading the browser navigation URL failed\", cause),\n });\n const result = yield* Schema.decodeUnknownEffect(BrowserNavigationResult)({\n url,\n }).pipe(\n Effect.mapError((cause) =>\n protocolError(\"The browser returned a malformed navigation URL\", cause),\n ),\n );\n if (!hostAllowed(policy, result.url)) {\n return yield* policyError(\"The browser returned an off-policy page URL\");\n }\n return result;\n});\n\nconst decodeActionResult = Effect.fn(\"BrowserRunInteractive.decodeActionResult\")(function* (\n page: BrowserRunInteractivePage,\n policy: InteractiveBrowserPolicySnapshot,\n) {\n const url = yield* Effect.try({\n try: page.url,\n catch: (cause) => protocolError(\"Reading the browser page URL failed\", cause),\n });\n const result = yield* Schema.decodeUnknownEffect(BrowserActionResult)({ url }).pipe(\n Effect.mapError((cause) => protocolError(\"The browser returned a malformed page URL\", cause)),\n );\n if (!hostAllowed(policy, result.url)) {\n return yield* policyError(\"The browser returned an off-policy page URL\");\n }\n return result;\n});\n\nconst makeRequestListener =\n (\n policy: InteractiveBrowserPolicySnapshot,\n state: HandleState,\n ): BrowserRunInteractiveRequestListener =>\n (request) => {\n let allowed = false;\n try {\n allowed = hostAllowed(policy, request.url());\n } catch {\n allowed = false;\n }\n if (!allowed) {\n state.violation.value = policyError(\"The browser requested an off-policy URL\");\n }\n\n let settlement: Promise<void>;\n try {\n settlement = allowed ? request.continue() : request.abort();\n } catch {\n state.violation.value = protocolError(\"Resolving an intercepted browser request failed\");\n return;\n }\n const observed = settlement\n .catch(() => {\n state.violation.value = protocolError(\"Resolving an intercepted browser request failed\");\n })\n .finally(() => {\n state.pendingRequests.delete(observed);\n });\n state.pendingRequests.add(observed);\n };\n\nconst makeHandle = Effect.fn(\"BrowserRunInteractive.makeHandle\")(function* (\n page: BrowserRunInteractivePage,\n policy: InteractiveBrowserPolicySnapshot,\n startedAt: number,\n state: HandleState,\n close: Effect.Effect<void, InteractiveBrowserError>,\n): Effect.fn.Return<HandleRuntime> {\n const permits = yield* Semaphore.make(1);\n const actions = yield* Ref.make(0);\n\n const remote = <A>(operation: BrowserOperation, evaluate: () => Promise<A>) =>\n Effect.tryPromise({\n try: evaluate,\n catch: (cause) => {\n if (state.disconnected.value || isRemoteClosure(cause)) {\n state.disconnected.value = true;\n return expiredError();\n }\n return actionError(operation, cause);\n },\n });\n\n const run = <A>(\n effect: Effect.Effect<A, BrowserFailure>,\n preflight: Effect.Effect<void, BrowserFailure> = Effect.void,\n ) =>\n permits\n .withPermitsIfAvailable(1)(\n Effect.gen(function* () {\n const unavailable = stateFailure(state);\n if (unavailable !== undefined) return yield* unavailable;\n yield* preflight;\n\n const admitted = yield* Ref.modify(actions, (count) =>\n count >= policy.maxActions\n ? [{ allowed: false, observed: count + 1 }, count]\n : [{ allowed: true, observed: count + 1 }, count + 1],\n );\n if (!admitted.allowed) {\n return yield* InteractiveBrowserLimitError.make({\n implementation: browserRunInteractiveImplementation,\n limit: \"actions\",\n maximum: policy.maxActions,\n observed: admitted.observed,\n message: \"The browser action limit was reached\",\n });\n }\n\n const completed = effect.pipe(\n Effect.catch((error) => {\n const failure = stateFailure(state);\n return Effect.fail(failure ?? error);\n }),\n Effect.flatMap((result) =>\n awaitPendingRequests(state).pipe(\n Effect.flatMap(() => {\n const failure = stateFailure(state);\n return failure === undefined ? Effect.succeed(result) : Effect.fail(failure);\n }),\n ),\n ),\n );\n return yield* withinDeadline(completed, policy, startedAt, () => {\n state.uncertain.value = true;\n }).pipe(\n Effect.onInterrupt(() =>\n Effect.sync(() => {\n state.uncertain.value = true;\n }),\n ),\n Effect.catch((error) => {\n if (Schema.is(InteractiveBrowserLimitError)(error) && error.limit === \"elapsed\") {\n return Effect.fail(error);\n }\n const failure = stateFailure(state);\n return Effect.fail(failure ?? error);\n }),\n );\n }),\n )\n .pipe(\n Effect.flatMap((result) =>\n Option.isSome(result)\n ? Effect.succeed(result.value)\n : Effect.fail(\n InteractiveBrowserBusyError.make({\n implementation: browserRunInteractiveImplementation,\n message: \"The browser handle already has an operation in flight\",\n }),\n ),\n ),\n );\n\n const handle: BrowserHandle = {\n navigate: (request) =>\n run(\n Effect.gen(function* () {\n yield* remote(\"navigate\", () => page.goto(request.url));\n return yield* decodeNavigationResult(page, policy);\n }),\n Effect.suspend(() =>\n hostAllowed(policy, request.url)\n ? Effect.void\n : Effect.fail(policyError(\"The navigation URL is outside the browser policy\")),\n ),\n ),\n readText: (request) =>\n run(\n Effect.gen(function* () {\n const raw = yield* remote(\"read-text\", () =>\n page.readText(request.selector, policy.maxReturnedBytes),\n );\n const observation = yield* Schema.decodeUnknownEffect(TextObservation)(raw).pipe(\n Effect.mapError((cause) =>\n protocolError(\"The browser returned a malformed text observation\", cause),\n ),\n );\n if (observation._tag === \"MissingElement\") {\n return yield* actionError(\"read-text\");\n }\n if (observation._tag === \"OverLimit\") {\n return yield* InteractiveBrowserLimitError.make({\n implementation: browserRunInteractiveImplementation,\n limit: \"returned-bytes\",\n maximum: policy.maxReturnedBytes,\n observed: observation.observed,\n message: \"The browser returned-text limit was reached\",\n });\n }\n const observed = new TextEncoder().encode(observation.text).byteLength;\n if (observed > policy.maxReturnedBytes) {\n return yield* InteractiveBrowserLimitError.make({\n implementation: browserRunInteractiveImplementation,\n limit: \"returned-bytes\",\n maximum: policy.maxReturnedBytes,\n observed,\n message: \"The browser returned-text limit was reached\",\n });\n }\n return yield* Schema.decodeUnknownEffect(BrowserTextResult)({\n text: observation.text,\n }).pipe(\n Effect.mapError((cause) =>\n protocolError(\"The browser returned malformed page text\", cause),\n ),\n );\n }),\n ),\n fill: (request) =>\n run(\n remote(\"fill\", () => page.fill(request.selector, request.value)).pipe(\n Effect.andThen(decodeActionResult(page, policy)),\n ),\n ),\n click: (request) =>\n run(\n remote(\"click\", () => page.click(request.selector)).pipe(\n Effect.andThen(decodeActionResult(page, policy)),\n ),\n ),\n screenshot: (request) =>\n Schema.decodeUnknownEffect(BrowserScreenshotRequest)(request).pipe(\n Effect.mapError(() => policyError(\"The browser screenshot request is malformed\")),\n Effect.flatMap((decoded) =>\n run(\n Effect.gen(function* () {\n const raw = yield* remote(\"screenshot\", () => page.screenshot(decoded.fullPage));\n const bytes = yield* Schema.decodeUnknownEffect(PngBytes)(raw).pipe(\n Effect.mapError(() =>\n protocolError(\"The browser returned a malformed PNG screenshot\"),\n ),\n );\n if (bytes.length > policy.maxReturnedBytes) {\n return yield* InteractiveBrowserLimitError.make({\n implementation: browserRunInteractiveImplementation,\n limit: \"returned-bytes\",\n maximum: policy.maxReturnedBytes,\n observed: bytes.length,\n message: \"The browser screenshot byte limit was reached\",\n });\n }\n return yield* Schema.decodeUnknownEffect(PageScreenshotResult)({\n implementation: browserRunInteractiveImplementation,\n mediaType: \"image/png\",\n bytes: new Uint8Array(bytes),\n }).pipe(\n Effect.mapError(() =>\n protocolError(\"The browser returned a malformed PNG screenshot\"),\n ),\n );\n }),\n decodeActionResult(page, policy).pipe(Effect.asVoid),\n ),\n ),\n ),\n scroll: (request) =>\n Schema.decodeUnknownEffect(BrowserScrollRequest)(request).pipe(\n Effect.mapError(() => policyError(\"The browser scroll request is malformed\")),\n Effect.flatMap((decoded) =>\n run(\n remote(\"scroll\", () => page.scroll(decoded.deltaX, decoded.deltaY)).pipe(\n Effect.andThen(decodeActionResult(page, policy)),\n ),\n decodeActionResult(page, policy).pipe(Effect.asVoid),\n ),\n ),\n ),\n close,\n };\n return { handle, run };\n});\n\nconst remainingMillis = Effect.fn(\"BrowserRunInteractive.remainingMillis\")(function* (\n policy: InteractiveBrowserPolicySnapshot,\n startedAt: number,\n) {\n const now = yield* Effect.clockWith((clock) => clock.currentTimeMillis);\n return Math.max(0, policy.maxElapsedMillis - Math.max(0, now - startedAt));\n});\n\nconst closeEntry = (close: () => Promise<void>, warning: string): CloseEntry => ({\n close: Effect.tryPromise({\n try: close,\n catch: (cause) => actionError(\"close\", cause),\n }).pipe(\n Effect.timeoutOrElse({\n duration: Duration.millis(CLEANUP_STEP_TIMEOUT_MILLIS),\n orElse: () => Effect.fail(actionError(\"close\")),\n }),\n ),\n warning,\n});\n\nconst syncCloseEntry = (close: () => void, warning: string): CloseEntry => ({\n close: Effect.try({\n try: close,\n catch: (cause) => actionError(\"close\", cause),\n }),\n warning,\n});\n\nconst runTeardown = (\n entries: ReadonlyArray<CloseEntry>,\n): Effect.Effect<ReadonlyArray<CloseFailure>> =>\n Effect.forEach([...entries].reverse(), (entry) =>\n entry.close.pipe(\n Effect.match({\n onFailure: (error): CloseFailure | undefined => ({ error, warning: entry.warning }),\n onSuccess: (): CloseFailure | undefined => undefined,\n }),\n ),\n ).pipe(Effect.map((failures) => failures.filter((failure) => failure !== undefined)));\n\nconst cdpCommand = <A>(\n page: BrowserRunInteractivePage,\n state: HandleState,\n command: BrowserRunCloudflareCommand,\n parameters: unknown,\n output: Schema.Codec<A>,\n malformedMessage: string,\n): Effect.Effect<A, InteractiveBrowserError> =>\n Effect.scoped(\n Effect.gen(function* () {\n const cdp = yield* Effect.acquireRelease(\n Effect.tryPromise({\n try: (signal) =>\n closeLateAcquisition(signal, page.createCdpSession, (acquired) => acquired.detach()),\n catch: (cause) =>\n state.disconnected.value || isRemoteClosure(cause)\n ? expiredError()\n : protocolError(\"Creating the Cloudflare browser control session failed\", cause),\n }),\n (acquired) =>\n closeWithWarning(\n acquired.detach,\n \"Detaching the Cloudflare browser control session failed\",\n ),\n { interruptible: true },\n );\n const raw = yield* Effect.tryPromise({\n try: () => cdp.send(command, parameters),\n catch: (cause) =>\n state.disconnected.value || isRemoteClosure(cause)\n ? expiredError()\n : protocolError(\"The Cloudflare browser control command failed\", cause),\n });\n return yield* Schema.decodeUnknownEffect(output)(raw).pipe(\n Effect.mapError(() => protocolError(malformedMessage)),\n );\n }),\n );\n\nconst makeHostService = (\n binding: BrowserRunInteractiveBinding[\"Service\"],\n): BrowserRunInteractiveHost[\"Service\"] => {\n const open = Effect.fn(\"BrowserRunInteractiveHost.open\")(function* (\n policy: InteractiveBrowserPolicy,\n ): Effect.fn.Return<BrowserRunInteractiveSession, InteractiveBrowserError, Scope.Scope> {\n const fixedPolicy = yield* snapshotPolicy(policy);\n const startedAt = yield* Effect.clockWith((clock) => clock.currentTimeMillis);\n const state: HandleState = {\n closed: { value: false },\n disconnected: { value: false },\n uncertain: { value: false },\n violation: { value: undefined },\n pendingRequests: new Set(),\n };\n const lifecycle = {\n managedTeardownInstalled: false,\n explicitCloseInvoked: false,\n };\n const closers: Array<CloseEntry> = [];\n const releaseBeforeManaged = (entry: CloseEntry): Effect.Effect<void> =>\n Effect.suspend(() =>\n lifecycle.managedTeardownInstalled\n ? Effect.void\n : entry.close.pipe(Effect.catchCause(() => Effect.logWarning(entry.warning))),\n );\n\n const browser = yield* Effect.acquireRelease(\n withinDeadline(\n Effect.tryPromise({\n try: (signal) =>\n closeLateAcquisition(\n signal,\n () => binding.launch(keepAliveMillis(fixedPolicy)),\n (acquired) => acquired.close(),\n ),\n catch: (cause) =>\n isCapacityRefusal(cause)\n ? InteractiveBrowserCapacityError.make({\n implementation: browserRunInteractiveImplementation,\n message: \"Browser Run has no capacity for a new browser session\",\n })\n : protocolError(\"Launching the Browser Run session failed\", cause),\n }),\n fixedPolicy,\n startedAt,\n ),\n (acquired) => {\n state.disconnected.value = true;\n return releaseBeforeManaged(\n closeEntry(acquired.close, \"Closing the interactive browser failed\"),\n );\n },\n { interruptible: true },\n );\n closers.push(closeEntry(browser.close, \"Closing the interactive browser failed\"));\n\n const disconnected = () => {\n state.disconnected.value = true;\n };\n yield* Effect.acquireRelease(\n Effect.try({\n try: () => browser.onDisconnected(disconnected),\n catch: (cause) => protocolError(\"Installing the browser disconnect listener failed\", cause),\n }),\n () =>\n releaseBeforeManaged(\n syncCloseEntry(\n () => browser.offDisconnected(disconnected),\n \"Removing the browser disconnect listener failed\",\n ),\n ),\n );\n closers.push(\n syncCloseEntry(\n () => browser.offDisconnected(disconnected),\n \"Removing the browser disconnect listener failed\",\n ),\n );\n const connected = yield* Effect.try({\n try: browser.isConnected,\n catch: (cause) => protocolError(\"Reading the Browser Run connection state failed\", cause),\n });\n if (!connected) {\n state.disconnected.value = true;\n return yield* expiredError();\n }\n\n const sessionIdValue = yield* Effect.try({\n try: browser.sessionId,\n catch: (cause) => protocolError(\"Reading the Browser Run session identity failed\", cause),\n }).pipe(\n Effect.flatMap((value) =>\n Schema.decodeUnknownEffect(BrowserRunSessionId)(value).pipe(\n Effect.mapError(() => protocolError(\"The Browser Run session identity was malformed\")),\n ),\n ),\n );\n\n const context = yield* Effect.acquireRelease(\n withinDeadline(\n Effect.tryPromise({\n try: (signal) =>\n closeLateAcquisition(signal, browser.createContext, (acquired) => acquired.close()),\n catch: (cause) =>\n state.disconnected.value || isRemoteClosure(cause)\n ? expiredError()\n : protocolError(\"Creating the browser context failed\", cause),\n }),\n fixedPolicy,\n startedAt,\n ),\n (acquired) =>\n releaseBeforeManaged(\n closeEntry(acquired.close, \"Closing the interactive browser context failed\"),\n ),\n { interruptible: true },\n );\n closers.push(closeEntry(context.close, \"Closing the interactive browser context failed\"));\n const page = yield* Effect.acquireRelease(\n withinDeadline(\n Effect.tryPromise({\n try: (signal) =>\n closeLateAcquisition(signal, context.newPage, (acquired) => acquired.close()),\n catch: (cause) =>\n state.disconnected.value || isRemoteClosure(cause)\n ? expiredError()\n : protocolError(\"Creating the browser page failed\", cause),\n }),\n fixedPolicy,\n startedAt,\n ),\n (acquired) =>\n releaseBeforeManaged(\n closeEntry(acquired.close, \"Closing the interactive browser page failed\"),\n ),\n { interruptible: true },\n );\n closers.push(closeEntry(page.close, \"Closing the interactive browser page failed\"));\n\n yield* withinDeadline(\n Effect.tryPromise({\n try: () => page.setBypassServiceWorker(true),\n catch: (cause) => protocolError(\"Bypassing browser service workers failed\", cause),\n }),\n fixedPolicy,\n startedAt,\n );\n\n const requestListener = makeRequestListener(fixedPolicy, state);\n yield* Effect.acquireRelease(\n Effect.try({\n try: () => page.onRequest(requestListener),\n catch: (cause) => protocolError(\"Installing the browser request listener failed\", cause),\n }),\n () =>\n releaseBeforeManaged(\n syncCloseEntry(\n () => page.offRequest(requestListener),\n \"Removing the browser request policy failed\",\n ),\n ),\n );\n closers.push(\n syncCloseEntry(\n () => page.offRequest(requestListener),\n \"Removing the browser request policy failed\",\n ),\n );\n\n yield* withinDeadline(\n Effect.tryPromise({\n try: () => page.setRequestInterception(true),\n catch: (cause) => protocolError(\"Installing the browser request policy failed\", cause),\n }),\n fixedPolicy,\n startedAt,\n );\n\n yield* withinDeadline(awaitPendingRequests(state), fixedPolicy, startedAt);\n const setupFailure = stateFailure(state);\n if (setupFailure !== undefined) return yield* setupFailure;\n\n const teardown = yield* Effect.uninterruptible(\n Effect.gen(function* () {\n const cached = yield* Effect.cached(runTeardown(closers));\n lifecycle.managedTeardownInstalled = true;\n yield* Effect.addFinalizer(() =>\n Effect.uninterruptible(\n Effect.sync(() => {\n state.closed.value = true;\n state.disconnected.value = true;\n }).pipe(\n Effect.andThen(cached),\n Effect.flatMap((failures) =>\n lifecycle.explicitCloseInvoked\n ? Effect.void\n : Effect.forEach(failures, (failure) => Effect.logWarning(failure.warning)).pipe(\n Effect.asVoid,\n ),\n ),\n ),\n ),\n );\n return cached;\n }),\n );\n\n const close: Effect.Effect<void, InteractiveBrowserError> = Effect.uninterruptible(\n Effect.sync(() => {\n lifecycle.explicitCloseInvoked = true;\n state.closed.value = true;\n state.disconnected.value = true;\n }).pipe(\n Effect.andThen(teardown),\n Effect.flatMap((failures) =>\n failures[0] === undefined ? Effect.void : Effect.fail(failures[0].error),\n ),\n ),\n );\n\n const runtime = yield* makeHandle(page, fixedPolicy, startedAt, state, close);\n const currentPagePreflight = decodeActionResult(page, fixedPolicy).pipe(Effect.asVoid);\n const requestFitsSession = (requestedMillis: number): Effect.Effect<void, BrowserFailure> =>\n remainingMillis(fixedPolicy, startedAt).pipe(\n Effect.flatMap((remaining) =>\n remaining > 0 && requestedMillis <= remaining\n ? Effect.void\n : Effect.fail(\n policyError(\"The host browser request exceeds the remaining session time\"),\n ),\n ),\n );\n\n return {\n handle: runtime.handle,\n sessionId: Redacted.make(sessionIdValue),\n getLiveView: (request) =>\n Schema.decodeUnknownEffect(BrowserRunLiveViewRequest)(request).pipe(\n Effect.mapError(() => policyError(\"The Live View request is malformed\")),\n Effect.flatMap((decoded) =>\n runtime.run(\n cdpCommand(\n page,\n state,\n \"Cloudflare.getLiveView\",\n { mode: decoded.mode, expiresInMs: decoded.expiresInMs },\n LiveViewObservation,\n \"Cloudflare returned a malformed Live View response\",\n ).pipe(\n Effect.flatMap((observation) =>\n Schema.decodeUnknownEffect(BrowserRunLiveViewResult)({\n devtoolsFrontendUrl: Redacted.make(observation.devtoolsFrontendUrl),\n }).pipe(\n Effect.mapError(() =>\n protocolError(\"Cloudflare returned a malformed Live View response\"),\n ),\n ),\n ),\n ),\n currentPagePreflight.pipe(Effect.andThen(requestFitsSession(decoded.expiresInMs))),\n ),\n ),\n ),\n handoff: (request) =>\n Schema.decodeUnknownEffect(BrowserRunHandoffRequest)(request).pipe(\n Effect.mapError(() => policyError(\"The browser handoff request is malformed\")),\n Effect.flatMap((decoded) =>\n runtime.run(\n cdpCommand(\n page,\n state,\n \"Cloudflare.handoff\",\n { instructions: decoded.instructions, timeout: decoded.timeout },\n HandoffObservation,\n \"Cloudflare returned a malformed browser handoff response\",\n ).pipe(\n Effect.flatMap((observation) =>\n Schema.decodeUnknownEffect(BrowserRunHandoffResult)({\n handoffId: Redacted.make(observation.handoffId),\n }).pipe(\n Effect.mapError(() =>\n protocolError(\"Cloudflare returned a malformed browser handoff response\"),\n ),\n ),\n ),\n ),\n currentPagePreflight.pipe(Effect.andThen(requestFitsSession(decoded.timeout))),\n ),\n ),\n ),\n getHandoffState: runtime.run(\n cdpCommand(\n page,\n state,\n \"Cloudflare.getHandoffState\",\n {},\n HandoffStateObservation,\n \"Cloudflare returned a malformed browser handoff state\",\n ).pipe(\n Effect.flatMap((observation) =>\n Schema.decodeUnknownEffect(BrowserRunHandoffState)({\n active: observation.active,\n ...(observation.handoffId === undefined\n ? {}\n : { handoffId: Redacted.make(observation.handoffId) }),\n ...(observation.durationMs === undefined\n ? {}\n : { durationMs: observation.durationMs }),\n }).pipe(\n Effect.mapError(() =>\n protocolError(\"Cloudflare returned a malformed browser handoff state\"),\n ),\n ),\n ),\n ),\n currentPagePreflight,\n ),\n close,\n };\n });\n\n const closeSession = Effect.fn(\"BrowserRunInteractiveHost.closeSession\")(function* (\n sessionId: Redacted.Redacted<string>,\n ) {\n const decoded = yield* Schema.decodeUnknownEffect(Schema.Redacted(BrowserRunSessionId))(\n sessionId,\n ).pipe(\n Effect.mapError(() => policyError(\"The Browser Run cleanup session identity is malformed\")),\n );\n return yield* Effect.scoped(\n Effect.gen(function* () {\n const closeAttempted = { value: false };\n const browser = yield* Effect.acquireRelease(\n Effect.tryPromise({\n try: (signal) =>\n closeLateAcquisition(\n signal,\n () => binding.connect(Redacted.value(decoded)),\n (acquired) => acquired.close(),\n ),\n catch: (cause) => actionError(\"close\", cause),\n }),\n (acquired) =>\n closeAttempted.value\n ? Effect.void\n : closeWithWarning(acquired.close, \"Closing the leaked Browser Run session failed\"),\n { interruptible: true },\n );\n return yield* Effect.tryPromise({\n try: () => {\n // Mark and start are synchronous so interruption cannot suppress the\n // Scope fallback before the one remote close attempt begins.\n closeAttempted.value = true;\n return browser.close();\n },\n catch: (cause) => actionError(\"close\", cause),\n });\n }),\n ).pipe(\n Effect.timeoutOrElse({\n duration: Duration.millis(CLOSE_SESSION_TIMEOUT_MILLIS),\n orElse: () => Effect.fail(actionError(\"close\")),\n }),\n );\n });\n\n return BrowserRunInteractiveHost.of({ open, closeSession });\n};\n\n/** Cloudflare host controls and private session identity for one scoped Browser Run pass. */\nexport const browserRunInteractiveHostLayer = (): Layer.Layer<\n BrowserRunInteractiveHost,\n never,\n BrowserRunInteractiveBinding\n> =>\n Layer.effect(\n BrowserRunInteractiveHost,\n Effect.gen(function* () {\n return makeHostService(yield* BrowserRunInteractiveBinding);\n }),\n );\n\n/** Worker-only generic adapter; Cloudflare identity and controls remain host-only. */\nexport const browserRunInteractiveLayer = (): Layer.Layer<\n InteractiveBrowser,\n never,\n BrowserRunInteractiveBinding\n> =>\n Layer.effect(\n InteractiveBrowser,\n Effect.gen(function* () {\n const binding = yield* BrowserRunInteractiveBinding;\n const host = makeHostService(binding);\n return InteractiveBrowser.of({\n open: (policy) => host.open(policy).pipe(Effect.map((session) => session.handle)),\n });\n }),\n );\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@effect-agent/platform-cloudflare",
|
|
3
|
-
"version": "0.1.0-beta.
|
|
3
|
+
"version": "0.1.0-beta.32",
|
|
4
4
|
"exports": {
|
|
5
5
|
".": {
|
|
6
6
|
"types": "./dist/index.d.mts",
|
|
@@ -25,11 +25,11 @@
|
|
|
25
25
|
},
|
|
26
26
|
"dependencies": {
|
|
27
27
|
"@cloudflare/puppeteer": "1.1.0",
|
|
28
|
-
"@effect-agent/core": "0.1.0-beta.
|
|
29
|
-
"@effect-agent/engine": "0.1.0-beta.
|
|
30
|
-
"@effect-agent/sandbox": "0.1.0-beta.
|
|
31
|
-
"@effect-agent/session": "0.1.0-beta.
|
|
32
|
-
"@effect-agent/storage-cloudflare": "0.1.0-beta.
|
|
28
|
+
"@effect-agent/core": "0.1.0-beta.32",
|
|
29
|
+
"@effect-agent/engine": "0.1.0-beta.32",
|
|
30
|
+
"@effect-agent/sandbox": "0.1.0-beta.32",
|
|
31
|
+
"@effect-agent/session": "0.1.0-beta.32",
|
|
32
|
+
"@effect-agent/storage-cloudflare": "0.1.0-beta.32",
|
|
33
33
|
"@effect/platform-browser": "4.0.0-rc.110",
|
|
34
34
|
"@effect/sql-sqlite-do": "4.0.0-rc.110",
|
|
35
35
|
"effect": "4.0.0-rc.110"
|