@effect-agent/platform-cloudflare 0.1.0-beta.126 → 0.1.0-beta.129

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.
@@ -710,8 +710,27 @@ declare const encodeAdminResponse: (input: AdminFailed | ExplainedRecovery | Obl
710
710
  readonly message: string;
711
711
  readonly cause?: Schema.Json | undefined;
712
712
  } | {
713
- readonly _tag: "ThreadNotMaterialized";
714
- readonly threadId: string;
713
+ readonly _tag: "HostProtocolError";
714
+ readonly message: string;
715
+ } | {
716
+ readonly _tag: "DigestError";
717
+ readonly message: string;
718
+ readonly cause?: Schema.Json | undefined;
719
+ } | {
720
+ readonly _tag: "AdmissionPolicyError";
721
+ readonly reason: "occupied" | "refused" | "unavailable";
722
+ readonly code: string;
723
+ readonly cause?: import("effect-agent/failure-diagnostic").Diagnostic | undefined;
724
+ readonly stack?: string | undefined;
725
+ } | {
726
+ readonly _tag: "SettlementConflict";
727
+ readonly submissionId: string;
728
+ readonly existingOutcome: "aborted" | "completed" | "failed";
729
+ } | {
730
+ readonly _tag: "LedgerError";
731
+ readonly operation: string;
732
+ readonly message: string;
733
+ readonly cause?: import("effect-agent/failure-diagnostic").Diagnostic | undefined;
715
734
  } | {
716
735
  readonly _tag: "ThreadStoreError";
717
736
  readonly operation: string;
@@ -725,10 +744,8 @@ declare const encodeAdminResponse: (input: AdminFailed | ExplainedRecovery | Obl
725
744
  readonly sequence?: number | undefined;
726
745
  } | undefined;
727
746
  } | {
728
- readonly _tag: "LedgerError";
729
- readonly operation: string;
730
- readonly message: string;
731
- readonly cause?: import("effect-agent/failure-diagnostic").Diagnostic | undefined;
747
+ readonly _tag: "ThreadNotMaterialized";
748
+ readonly threadId: string;
732
749
  } | {
733
750
  readonly _tag: "AppendConflict";
734
751
  readonly threadId: string;
@@ -741,29 +758,15 @@ declare const encodeAdminResponse: (input: AdminFailed | ExplainedRecovery | Obl
741
758
  readonly threadId: string;
742
759
  readonly actualEpoch: number;
743
760
  readonly attemptedEpoch: number;
761
+ } | {
762
+ readonly _tag: "DurableRuntimeFailpointError";
763
+ readonly location: "abort:after-intent" | "approval:after-request-append" | "approval:after-suspend" | "checkpoint:after-save" | "checkpoint:before-save" | "claim:after-claim" | "compaction:after-canonical-append" | "compaction:before-canonical-append" | "input:after-canonical-append" | "join:after-canonical-append" | "join:after-claim" | "policy:after-reservation-append" | "policy:before-reservation-append" | "resolve:after-intent" | "run:after-duration-append" | "run:after-start-append" | "run:before-duration-append" | "run:before-start-append" | "step:after-step-append" | "subagent:after-admit" | "subagent:after-child-abort-intent" | "subagent:after-child-ready" | "subagent:after-join-append" | "subagent:after-release" | "subagent:after-release-pending" | "subagent:after-request-append" | "subagent:after-reserve" | "subagent:after-sibling-settle" | "subagent:after-start-append" | "subagent:after-suspend" | "subagent:before-join-append" | "submit:after-admit" | "submit:after-materialize" | "terminalize:after-canonical-append" | "terminalize:after-reserve" | "tools:after-prepared-append" | "tools:after-unavailable-append" | "tools:before-prepared-append" | "tools:before-unavailable-append" | "turn:after-canonical-append" | "turn:after-response-append" | "turn:after-results-append" | "update:after-canonical-append" | "update:after-delivery-insert" | "update:before-canonical-append" | "update:before-delivery-insert" | "worker:after-completion-append" | "worker:after-origin-append" | "worker:after-report-append" | "worker:after-report-delivery" | "worker:after-source-append" | "worker:after-stop-append" | "worker:after-stop-seal" | "worker:after-subtree-append" | "worker:before-completion-append" | "worker:before-origin-append" | "worker:before-report-append" | "worker:before-report-delivery" | "worker:before-source-append" | "worker:before-stop-append" | "worker:before-stop-seal" | "worker:before-subtree-append";
744
764
  } | {
745
765
  readonly _tag: "OperationDenied";
746
766
  readonly operation: "abort" | "awaitSettlement" | "explain" | "observe" | "resolveApproval" | "resolveUnknown" | "retry" | "scanObligations" | "verify" | "wake";
747
767
  readonly reason: string;
748
768
  readonly threadId?: string | undefined;
749
769
  readonly submissionId?: string | undefined;
750
- } | {
751
- readonly _tag: "AdmissionPolicyError";
752
- readonly reason: "occupied" | "refused" | "unavailable";
753
- readonly code: string;
754
- readonly cause?: import("effect-agent/failure-diagnostic").Diagnostic | undefined;
755
- readonly stack?: string | undefined;
756
- } | {
757
- readonly _tag: "DigestError";
758
- readonly message: string;
759
- readonly cause?: Schema.Json | undefined;
760
- } | {
761
- readonly _tag: "DurableRuntimeFailpointError";
762
- readonly location: "abort:after-intent" | "approval:after-request-append" | "approval:after-suspend" | "checkpoint:after-save" | "checkpoint:before-save" | "claim:after-claim" | "compaction:after-canonical-append" | "compaction:before-canonical-append" | "input:after-canonical-append" | "join:after-canonical-append" | "join:after-claim" | "policy:after-reservation-append" | "policy:before-reservation-append" | "resolve:after-intent" | "run:after-duration-append" | "run:after-start-append" | "run:before-duration-append" | "run:before-start-append" | "step:after-step-append" | "subagent:after-admit" | "subagent:after-child-abort-intent" | "subagent:after-child-ready" | "subagent:after-join-append" | "subagent:after-release" | "subagent:after-release-pending" | "subagent:after-request-append" | "subagent:after-reserve" | "subagent:after-sibling-settle" | "subagent:after-start-append" | "subagent:after-suspend" | "subagent:before-join-append" | "submit:after-admit" | "submit:after-materialize" | "terminalize:after-canonical-append" | "terminalize:after-reserve" | "tools:after-prepared-append" | "tools:after-unavailable-append" | "tools:before-prepared-append" | "tools:before-unavailable-append" | "turn:after-canonical-append" | "turn:after-response-append" | "turn:after-results-append" | "update:after-canonical-append" | "update:after-delivery-insert" | "update:before-canonical-append" | "update:before-delivery-insert" | "worker:after-completion-append" | "worker:after-origin-append" | "worker:after-report-append" | "worker:after-report-delivery" | "worker:after-source-append" | "worker:after-stop-append" | "worker:after-stop-seal" | "worker:after-subtree-append" | "worker:before-completion-append" | "worker:before-origin-append" | "worker:before-report-append" | "worker:before-report-delivery" | "worker:before-source-append" | "worker:before-stop-append" | "worker:before-stop-seal" | "worker:before-subtree-append";
763
- } | {
764
- readonly _tag: "SettlementConflict";
765
- readonly submissionId: string;
766
- readonly existingOutcome: "aborted" | "completed" | "failed";
767
770
  } | {
768
771
  readonly _tag: "ApprovalSuspensionError";
769
772
  readonly cause: Schema.Json;
@@ -775,9 +778,6 @@ declare const encodeAdminResponse: (input: AdminFailed | ExplainedRecovery | Obl
775
778
  readonly _tag: "RunJournalError";
776
779
  readonly message: string;
777
780
  readonly cause?: Schema.Json | undefined;
778
- } | {
779
- readonly _tag: "HostProtocolError";
780
- readonly message: string;
781
781
  } | {
782
782
  readonly _tag: "RetryRefused";
783
783
  readonly submissionId: string;
@@ -836,4 +836,4 @@ interface Class<EventServices = never> {
836
836
  declare const make: <ApplicationServices, ApplicationError, EventServices = never, EventLayerError = never>(applicationLayer: Layer.Layer<CloudflareDurableRuntimeServices | ApplicationServices, ApplicationError, CloudflareBootstrapServices | DurableObjectState$1.DurableObjectState | WorkerEnvironment | DurableObjectContext | ThreadObjectNamespace>, options: Options<ApplicationServices, EventServices, EventLayerError>) => Class<ApplicationServices | EventServices>;
837
837
  //#endregion
838
838
  export { ThreadPublicationOptions as A, portCall as C, CloudflareDurableRuntimeOptions as D, CloudflareDurableRuntimeInitializationError as E, layerConfig as M, layerHostConfig as N, CloudflareDurableRuntimeServices as O, layerInHost as P, make as S, CloudflareBootstrapServices as T, decodeAdminVerifyRequest as _, AdminVerifyRequest as a, encodeAdminResponse as b, Instance as c, RetryExecuted as d, ThreadObject_d_exports as f, decodeAdminResponse as g, decodeAdminExplainRequest as h, AdminResponse as i, layer as j, ThreadObjectPorts as k, ObligationsScanned as l, VerifiedIntegrity as m, AdminFailed as n, Class as o, ThreadRpcOperation as p, AdminFailure as r, ExplainedRecovery as s, AdminExplainRequest as t, Options as u, decodeObligationThresholds as v, submit as w, handleRpc as x, decodeRetryCommand as y };
839
- //# sourceMappingURL=ThreadObject-D8GzJxJB.d.mts.map
839
+ //# sourceMappingURL=ThreadObject-9ho9DTjd.d.mts.map
@@ -1,2 +1,2 @@
1
- import { A as ThreadPublicationOptions, C as portCall, D as CloudflareDurableRuntimeOptions, E as CloudflareDurableRuntimeInitializationError, M as layerConfig, N as layerHostConfig, O as CloudflareDurableRuntimeServices, P as layerInHost, S as make, T as CloudflareBootstrapServices, _ as decodeAdminVerifyRequest, a as AdminVerifyRequest, b as encodeAdminResponse, c as Instance, d as RetryExecuted, g as decodeAdminResponse, h as decodeAdminExplainRequest, i as AdminResponse, j as layer, k as ThreadObjectPorts, l as ObligationsScanned, m as VerifiedIntegrity, n as AdminFailed, o as Class, p as ThreadRpcOperation, r as AdminFailure, s as ExplainedRecovery, t as AdminExplainRequest, u as Options, v as decodeObligationThresholds, w as submit, x as handleRpc, y as decodeRetryCommand } from "./ThreadObject-D8GzJxJB.mjs";
1
+ import { A as ThreadPublicationOptions, C as portCall, D as CloudflareDurableRuntimeOptions, E as CloudflareDurableRuntimeInitializationError, M as layerConfig, N as layerHostConfig, O as CloudflareDurableRuntimeServices, P as layerInHost, S as make, T as CloudflareBootstrapServices, _ as decodeAdminVerifyRequest, a as AdminVerifyRequest, b as encodeAdminResponse, c as Instance, d as RetryExecuted, g as decodeAdminResponse, h as decodeAdminExplainRequest, i as AdminResponse, j as layer, k as ThreadObjectPorts, l as ObligationsScanned, m as VerifiedIntegrity, n as AdminFailed, o as Class, p as ThreadRpcOperation, r as AdminFailure, s as ExplainedRecovery, t as AdminExplainRequest, u as Options, v as decodeObligationThresholds, w as submit, x as handleRpc, y as decodeRetryCommand } from "./ThreadObject-9ho9DTjd.mjs";
2
2
  export { AdminExplainRequest, AdminFailed, AdminFailure, AdminResponse, AdminVerifyRequest, type CloudflareBootstrapServices as BootstrapServices, Class, ExplainedRecovery, type CloudflareDurableRuntimeInitializationError as InitializationError, Instance, ObligationsScanned, Options, type ThreadPublicationOptions as PublicationOptions, RetryExecuted, type CloudflareDurableRuntimeOptions as RuntimeOptions, type CloudflareDurableRuntimeServices as Services, ThreadObjectPorts, ThreadRpcOperation, VerifiedIntegrity, decodeAdminExplainRequest, decodeAdminResponse, decodeAdminVerifyRequest, decodeObligationThresholds, decodeRetryCommand, encodeAdminResponse, handleRpc, layer, layerConfig, layerHostConfig, layerInHost, make, portCall, submit };
package/dist/index.d.mts CHANGED
@@ -10,6 +10,6 @@ import { t as CloudflareMemory_d_exports } from "./CloudflareMemory.mjs";
10
10
  import { t as CloudflareScheduling_d_exports } from "./CloudflareScheduling.mjs";
11
11
  import { t as CloudflareSubscriptions_d_exports } from "./CloudflareSubscriptions.mjs";
12
12
  import { t as CloudflareThreadClient_d_exports } from "./CloudflareThreadClient.mjs";
13
- import { f as ThreadObject_d_exports } from "./ThreadObject-D8GzJxJB.mjs";
13
+ import { f as ThreadObject_d_exports } from "./ThreadObject-9ho9DTjd.mjs";
14
14
  import { t as WakeScheduler_d_exports } from "./WakeScheduler.mjs";
15
15
  export { Alarm_d_exports as Alarm, BrowserCredentials_d_exports as BrowserCredentials, BrowserSession_d_exports as BrowserSession, CloudflareAiGateway_d_exports as CloudflareAiGateway, CloudflareBindings_d_exports as CloudflareBindings, CloudflareBrowser_d_exports as CloudflareBrowser, CloudflareCodeMode_d_exports as CloudflareCodeMode, CloudflareConfig_d_exports as CloudflareConfig, CloudflareMemory_d_exports as CloudflareMemory, CloudflareScheduling_d_exports as CloudflareScheduling, CloudflareSubscriptions_d_exports as CloudflareSubscriptions, CloudflareThreadClient_d_exports as CloudflareThreadClient, ThreadObject_d_exports as ThreadObject, WakeScheduler_d_exports as WakeScheduler };
package/dist/index.mjs CHANGED
@@ -11,5 +11,5 @@ import { t as WakeScheduler_exports } from "./WakeScheduler.mjs";
11
11
  import { l as ThreadObject_exports } from "./ThreadObject-CVhZC-7l.mjs";
12
12
  import { t as CloudflareAiGateway_exports } from "./CloudflareAiGateway.mjs";
13
13
  import { t as BrowserCredentials_exports } from "./BrowserCredentials.mjs";
14
- import { i as BrowserSession_exports } from "./BrowserSession-DuOUcC6G.mjs";
14
+ import { i as BrowserSession_exports } from "./BrowserSession-BplIoNfi.mjs";
15
15
  export { Alarm_exports as Alarm, BrowserCredentials_exports as BrowserCredentials, BrowserSession_exports as BrowserSession, CloudflareAiGateway_exports as CloudflareAiGateway, CloudflareBindings_exports as CloudflareBindings, CloudflareBrowser_exports as CloudflareBrowser, CloudflareCodeMode_exports as CloudflareCodeMode, CloudflareConfig_exports as CloudflareConfig, CloudflareMemory_exports as CloudflareMemory, CloudflareScheduling_exports as CloudflareScheduling, CloudflareSubscriptions_exports as CloudflareSubscriptions, CloudflareThreadClient_exports as CloudflareThreadClient, ThreadObject_exports as ThreadObject, WakeScheduler_exports as WakeScheduler };
package/package.json CHANGED
@@ -1 +1 @@
1
- {"name":"@effect-agent/platform-cloudflare","version":"0.1.0-beta.126","dependencies":{"@effect-agent/storage-cloudflare":"0.1.0-beta.126","@effect/platform-browser":"4.0.0-rc.116","@effect/sql-sqlite-do":"4.0.0-rc.116","effect-agent":"0.1.0-beta.126","puppeteer-core":"24.29.0"},"devDependencies":{"@cloudflare/vitest-pool-workers":"0.21.3","@cloudflare/workers-types":"5.20260825.1","@effect-agent/testing":"0.1.0-beta.126","@effect/platform-node":"4.0.0-rc.116","@effect/sql-d1":"4.0.0-rc.116","@effect/vitest":"4.0.0-rc.116","effect":"4.0.0-rc.116","effect-cf":"0.44.1","esbuild":"0.28.1","miniflare":"5.20260811.1-alpha","typescript":"7.0.2","vite-plus":"0.3.2","vitest":"4.1.11"},"peerDependencies":{"effect":"^4.0.0-rc.116","effect-cf":"^0.44.1 || ^0.45.0"},"exports":{".":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"./alarm":{"types":"./dist/Alarm.d.mts","default":"./dist/Alarm.mjs"},"./browser-rest-capture":{"types":"./dist/BrowserRestCapture.d.mts","default":"./dist/BrowserRestCapture.mjs"},"./browser-rest-crawl":{"types":"./dist/BrowserRestCrawl.d.mts","default":"./dist/BrowserRestCrawl.mjs"},"./cloudflare-bindings":{"types":"./dist/CloudflareBindings.d.mts","default":"./dist/CloudflareBindings.mjs"},"./cloudflare-browser":{"types":"./dist/CloudflareBrowser.d.mts","default":"./dist/CloudflareBrowser.mjs"},"./cloudflare-code-mode":{"types":"./dist/CloudflareCodeMode.d.mts","default":"./dist/CloudflareCodeMode.mjs"},"./cloudflare-config":{"types":"./dist/CloudflareConfig.d.mts","default":"./dist/CloudflareConfig.mjs"},"./cloudflare-memory":{"types":"./dist/CloudflareMemory.d.mts","default":"./dist/CloudflareMemory.mjs"},"./cloudflare-scheduling":{"types":"./dist/CloudflareScheduling.d.mts","default":"./dist/CloudflareScheduling.mjs"},"./cloudflare-subscriptions":{"types":"./dist/CloudflareSubscriptions.d.mts","default":"./dist/CloudflareSubscriptions.mjs"},"./cloudflare-thread-client":{"types":"./dist/CloudflareThreadClient.d.mts","default":"./dist/CloudflareThreadClient.mjs"},"./interactive-browser":{"types":"./dist/InteractiveBrowser.d.mts","default":"./dist/InteractiveBrowser.mjs"},"./browser-session":{"types":"./dist/BrowserSession.d.mts","default":"./dist/BrowserSession.mjs"},"./browser-credentials":{"types":"./dist/BrowserCredentials.d.mts","default":"./dist/BrowserCredentials.mjs"},"./thread-object":{"types":"./dist/ThreadObject.d.mts","default":"./dist/ThreadObject.mjs"},"./wake-scheduler":{"types":"./dist/WakeScheduler.d.mts","default":"./dist/WakeScheduler.mjs"},"./cloudflare-ai-gateway":{"types":"./dist/CloudflareAiGateway.d.mts","default":"./dist/CloudflareAiGateway.mjs"}},"description":"Cloudflare Layer assembly for Effect Agent: Durable Objects and Browser Run adapters.","license":"MIT","repository":{"type":"git","url":"git+https://github.com/danieljvdm/effect-agent.git","directory":"packages/platform-cloudflare"},"files":["dist","src"],"type":"module","sideEffects":[],"publishConfig":{"access":"public"},"scripts":{"build":"vp pack","check":"tsc --noEmit -p tsconfig.json"}}
1
+ {"name":"@effect-agent/platform-cloudflare","version":"0.1.0-beta.129","dependencies":{"@effect-agent/storage-cloudflare":"0.1.0-beta.129","@effect/platform-browser":"4.0.0-rc.116","@effect/sql-sqlite-do":"4.0.0-rc.116","effect-agent":"0.1.0-beta.129","puppeteer-core":"24.29.0"},"devDependencies":{"@cloudflare/vitest-pool-workers":"0.21.3","@cloudflare/workers-types":"5.20260825.1","@effect-agent/testing":"0.1.0-beta.129","@effect/platform-node":"4.0.0-rc.116","@effect/sql-d1":"4.0.0-rc.116","@effect/vitest":"4.0.0-rc.116","effect":"4.0.0-rc.116","effect-cf":"0.44.1","esbuild":"0.28.1","miniflare":"5.20260811.1-alpha","typescript":"7.0.2","vite-plus":"0.3.2","vitest":"4.1.11"},"peerDependencies":{"effect":"^4.0.0-rc.116","effect-cf":"^0.44.1 || ^0.45.0"},"exports":{".":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"./alarm":{"types":"./dist/Alarm.d.mts","default":"./dist/Alarm.mjs"},"./browser-rest-capture":{"types":"./dist/BrowserRestCapture.d.mts","default":"./dist/BrowserRestCapture.mjs"},"./browser-rest-crawl":{"types":"./dist/BrowserRestCrawl.d.mts","default":"./dist/BrowserRestCrawl.mjs"},"./cloudflare-bindings":{"types":"./dist/CloudflareBindings.d.mts","default":"./dist/CloudflareBindings.mjs"},"./cloudflare-browser":{"types":"./dist/CloudflareBrowser.d.mts","default":"./dist/CloudflareBrowser.mjs"},"./cloudflare-code-mode":{"types":"./dist/CloudflareCodeMode.d.mts","default":"./dist/CloudflareCodeMode.mjs"},"./cloudflare-config":{"types":"./dist/CloudflareConfig.d.mts","default":"./dist/CloudflareConfig.mjs"},"./cloudflare-memory":{"types":"./dist/CloudflareMemory.d.mts","default":"./dist/CloudflareMemory.mjs"},"./cloudflare-scheduling":{"types":"./dist/CloudflareScheduling.d.mts","default":"./dist/CloudflareScheduling.mjs"},"./cloudflare-subscriptions":{"types":"./dist/CloudflareSubscriptions.d.mts","default":"./dist/CloudflareSubscriptions.mjs"},"./cloudflare-thread-client":{"types":"./dist/CloudflareThreadClient.d.mts","default":"./dist/CloudflareThreadClient.mjs"},"./interactive-browser":{"types":"./dist/InteractiveBrowser.d.mts","default":"./dist/InteractiveBrowser.mjs"},"./browser-session":{"types":"./dist/BrowserSession.d.mts","default":"./dist/BrowserSession.mjs"},"./browser-credentials":{"types":"./dist/BrowserCredentials.d.mts","default":"./dist/BrowserCredentials.mjs"},"./thread-object":{"types":"./dist/ThreadObject.d.mts","default":"./dist/ThreadObject.mjs"},"./wake-scheduler":{"types":"./dist/WakeScheduler.d.mts","default":"./dist/WakeScheduler.mjs"},"./cloudflare-ai-gateway":{"types":"./dist/CloudflareAiGateway.d.mts","default":"./dist/CloudflareAiGateway.mjs"}},"description":"Cloudflare Layer assembly for Effect Agent: Durable Objects and Browser Run adapters.","license":"MIT","repository":{"type":"git","url":"git+https://github.com/danieljvdm/effect-agent.git","directory":"packages/platform-cloudflare"},"files":["dist","src"],"type":"module","sideEffects":[],"publishConfig":{"access":"public"},"scripts":{"build":"vp pack","check":"tsc --noEmit -p tsconfig.json"}}
@@ -242,8 +242,10 @@ export class BrowserSessions extends Context.Service<
242
242
  attachment === undefined
243
243
  ? Effect.void
244
244
  : attachment.retire.pipe(
245
+ // Dispatch is already fenced; give the socket close handshake the same
246
+ // bounded window as keepalive instead of failing a settled command after 1s.
245
247
  Effect.timeoutOrElse({
246
- duration: "1 second",
248
+ duration: "10 seconds",
247
249
  orElse: () => Effect.fail(failure("cleanup")),
248
250
  }),
249
251
  Effect.catchCause((cause) =>
@@ -148,7 +148,8 @@ export class BrowserRunBinding extends Context.Service<
148
148
  retirementFailure ??= browserFailure(disconnectOperation, cause);
149
149
  }
150
150
  try {
151
- if (socket !== undefined && socket.readyState < WebSocket.CLOSING) socket.close();
151
+ // Manual-close runtimes also require a reply when the peer leaves us CLOSING.
152
+ if (socket !== undefined && socket.readyState < WebSocket.CLOSED) socket.close();
152
153
  } catch (cause) {
153
154
  retirementFailure ??= browserFailure(disconnectOperation, cause);
154
155
  }
@@ -183,7 +184,7 @@ export class BrowserRunBinding extends Context.Service<
183
184
  "close",
184
185
  () => {
185
186
  try {
186
- fence();
187
+ retireNow();
187
188
  } catch (cause) {
188
189
  retirementFailure ??= browserFailure(disconnectOperation, cause);
189
190
  }
@@ -191,7 +192,8 @@ export class BrowserRunBinding extends Context.Service<
191
192
  { once: true },
192
193
  );
193
194
 
194
- return await puppeteer.connect({ transport });
195
+ // Attaching must not replace the viewport owned by the host or another viewer.
196
+ return await puppeteer.connect({ transport, defaultViewport: null });
195
197
  } catch (cause) {
196
198
  try {
197
199
  retireNow();
@@ -1 +0,0 @@
1
- {"version":3,"file":"BrowserSession-DuOUcC6G.mjs","names":[],"sources":["../src/internal/browser-credentials.ts","../src/BrowserSession.ts"],"sourcesContent":["import { Cause, Context, Effect, Redacted, Schema } from \"effect\";\nimport type { Frame, Page } from \"puppeteer-core/lib/esm/puppeteer/puppeteer-core-browser.js\";\n\nimport {\n BrowserCredentialAccess,\n type BrowserCredentialMaterial,\n CardCredential,\n type CredentialDispatch,\n type CredentialFieldRole,\n CredentialFillError,\n CredentialFillResult,\n CredentialOrigin,\n CredentialTarget,\n FillCredentialRequest,\n LoginCredential,\n type CredentialAccessRequest,\n} from \"../BrowserCredentials.ts\";\n\n/** Supplied only under the attachment lock, with the remaining command/session budget. */\nexport class BrowserSessionPage extends Context.Service<\n BrowserSessionPage,\n {\n readonly page: Page;\n readonly commandTimeoutMillis: number;\n }\n>()(\"@effect-agent/platform-cloudflare/internal/BrowserSessionPage\") {}\n\nconst TargetReply = Schema.Union([\n Schema.Struct({ action: Schema.String.check(Schema.isMaxLength(2048)) }),\n Schema.Struct({ reason: Schema.Literals([\"stale-target\", \"unsupported\"]) }),\n]);\n\nconst WriteReply = Schema.Literals([\n \"filled\",\n \"stale-target\",\n \"unsupported-before-write\",\n \"unsupported\",\n]);\n\n// One invocation-local isolated-world handle. Actual nodes and fingerprints never leave the page.\n// This program neither discovers controls nor classifies roles nor observes page content.\nconst prepareFields = `(() => {\n const doc = document;\n let fields = [];\n let form;\n let snapshots = [];\n const describe = el => {\n if (!el || !el.isConnected || el.ownerDocument !== doc || doc !== document) return null;\n const native = el instanceof HTMLTextAreaElement ||\n (el instanceof HTMLSelectElement && !el.multiple) ||\n (el instanceof HTMLInputElement && ['text','email','password','tel','number','month','search','url','date','time','week','datetime-local'].includes(el.type));\n if (!native || el.matches(':disabled') || el.readOnly || !el.form) return null;\n const values = [el.form.action, el.form.method, el.form.enctype, el.name, el.type, el.autocomplete ?? ''];\n if (values.some(value => value.length > 2048)) return null;\n return JSON.stringify(values);\n };\n const validate = () => fields.length > 0 && fields.every((el, index) =>\n el.form === form && describe(el) !== null && describe(el) === snapshots[index]);\n return {\n prepare(selectors) {\n try {\n fields = selectors.map(selector => {\n const matches = doc.querySelectorAll(selector);\n return matches.length === 1 ? matches[0] : null;\n });\n } catch { return {reason: 'stale-target'}; }\n if (fields.some(el => !el) || new Set(fields).size !== fields.length) return {reason: 'stale-target'};\n snapshots = fields.map(describe);\n form = fields[0].form;\n if (!form || snapshots.some(value => value === null) || fields.some(el => el.form !== form)) return {reason: 'unsupported'};\n return {action: form.action};\n },\n target() { return validate() ? {action: form.action} : {reason: 'stale-target'}; },\n fill(index, value) {\n if (!validate()) return 'stale-target';\n const el = fields[index];\n if (el instanceof HTMLSelectElement) {\n const options = [...el.options].filter(option => option.value === value);\n if (options.length !== 1 || options[0].matches(':disabled')) return 'unsupported-before-write';\n }\n let prototype = Object.getPrototypeOf(el);\n let setter;\n while (prototype && !setter) { setter = Object.getOwnPropertyDescriptor(prototype, 'value')?.set; prototype = Object.getPrototypeOf(prototype); }\n if (!setter) return 'unsupported-before-write';\n setter.call(el, value);\n if (el.value !== value) return 'unsupported';\n el.dispatchEvent(new Event('input', {bubbles: true}));\n el.dispatchEvent(new Event('change', {bubbles: true}));\n return 'filled';\n }\n };\n})()`;\n\nconst secretFor = (material: BrowserCredentialMaterial, role: typeof CredentialFieldRole.Type) => {\n if (material._tag === \"LoginCredential\")\n return role === \"username\"\n ? material.username\n : role === \"password\"\n ? material.password\n : undefined;\n switch (role) {\n case \"card-name\":\n return material.name;\n case \"card-number\":\n return material.number;\n case \"card-expiry\":\n return material.expiry;\n case \"card-expiry-month\":\n return material.expiryMonth;\n case \"card-expiry-year\":\n return material.expiryYear;\n case \"card-security-code\":\n return material.securityCode;\n case \"username\":\n case \"password\":\n return undefined;\n }\n};\n\n/**\n * Fill explicit native fields on an existing page without submitting. The owning browser session\n * serializes operations and closes on timeout, interruption or uncertain dispatch; this function releases\n * only its local handles. Ordinary native observations remain available, including credential echoes.\n */\nexport const fillCredential = Effect.fnUntraced(function* (\n input: FillCredentialRequest,\n): Effect.fn.Return<\n CredentialFillResult,\n CredentialFillError,\n BrowserCredentialAccess | BrowserSessionPage\n> {\n const { page, commandTimeoutMillis } = yield* BrowserSessionPage;\n let dispatch: typeof CredentialDispatch.Type = \"not-dispatched\";\n let filled = 0;\n\n const fail = (reason: CredentialFillError[\"reason\"]) =>\n new CredentialFillError({ reason, dispatch, filled, cleanup: \"not-requested\" });\n\n const remote = <A>(run: (signal: AbortSignal) => Promise<A>) =>\n Effect.tryPromise({\n try: async (signal) => {\n try {\n return { ok: true as const, value: await run(signal) };\n } catch {\n return { ok: false as const };\n }\n },\n catch: () => fail(\"provider\"),\n }).pipe(\n Effect.flatMap((result) =>\n result.ok ? Effect.succeed(result.value) : Effect.fail(fail(\"provider\")),\n ),\n );\n\n const release = (handles: ReadonlyArray<{ dispose(): Promise<void> }>) =>\n Effect.promise(async () => {\n await Promise.all(handles.map((handle) => handle.dispose().catch(() => {})));\n }).pipe(Effect.interruptible, Effect.timeoutOption(\"1 second\"), Effect.asVoid);\n\n const acquire = <A extends { dispose(): Promise<void> }>(run: () => Promise<ReadonlyArray<A>>) =>\n Effect.acquireRelease(\n remote(async (signal) => {\n const handles = await run();\n\n if (signal.aborted) {\n await Promise.all(handles.map((handle) => handle.dispose().catch(() => {})));\n throw fail(\"provider\");\n }\n\n return handles;\n }).pipe(Effect.interruptible),\n release,\n );\n\n const origin = (value: string) =>\n Effect.try({\n try: () => {\n const url = new URL(value);\n\n if (url.username || url.password) throw fail(\"denied\");\n\n return url.origin;\n },\n catch: () => fail(\"denied\"),\n }).pipe(\n Effect.flatMap(Schema.decodeUnknownEffect(CredentialOrigin)),\n Effect.mapError(() => fail(\"denied\")),\n );\n\n return yield* Effect.gen(function* () {\n const request = yield* Schema.decodeEffect(FillCredentialRequest, {\n onExcessProperty: \"error\",\n })(input).pipe(Effect.mapError(() => fail(\"denied\")));\n\n const roles = request.fields.map((field) => field.role);\n\n if (\n new Set(roles).size !== roles.length ||\n roles.some(\n (role) => (request.kind === \"login\") !== (role === \"username\" || role === \"password\"),\n )\n )\n return yield* fail(\"denied\");\n const access = yield* BrowserCredentialAccess;\n let frame: Frame = page.mainFrame();\n\n for (const selector of request.frame ?? []) {\n const matches = yield* acquire(() => frame.$$(selector));\n const element = matches[0];\n\n if (matches.length !== 1 || element === undefined) return yield* fail(\"stale-target\");\n const child = yield* remote(() => element.contentFrame());\n\n if (child === null) return yield* fail(\"unsupported\");\n frame = child;\n }\n\n const handles = yield* acquire(async () => [\n await frame.isolatedRealm().evaluateHandle(prepareFields),\n ]);\n\n const held = handles[0];\n\n if (held === undefined) return yield* fail(\"provider\");\n\n const inspect = (raw: unknown) =>\n Schema.decodeUnknownEffect(TargetReply)(raw).pipe(\n Effect.mapError(() => fail(\"provider\")),\n Effect.flatMap((reply) =>\n \"reason\" in reply ? Effect.fail(fail(reply.reason)) : Effect.succeed(reply.action),\n ),\n );\n\n const action = yield* remote(() =>\n held.evaluate(\n (state, selectors) => {\n if (typeof state !== \"object\" || state === null) return null;\n\n return Reflect.apply(Reflect.get(state, \"prepare\"), state, [selectors]);\n },\n request.fields.map((field) => field.selector),\n ),\n ).pipe(Effect.flatMap(inspect));\n\n const target = CredentialTarget.make({\n topOrigin: yield* origin(page.url()),\n frameOrigin: yield* origin(frame.url()),\n recipientOrigin: yield* origin(action),\n });\n\n const authorization: CredentialAccessRequest = {\n credential: request.credential,\n kind: request.kind,\n target,\n roles,\n };\n\n const authorize = Effect.suspend(() => access.authorize(authorization)).pipe(\n Effect.mapError((error) => fail(error.reason)),\n );\n\n const validate = Effect.gen(function* () {\n if (\n frame.detached ||\n (yield* origin(page.url())) !== target.topOrigin ||\n (yield* origin(frame.url())) !== target.frameOrigin\n )\n return yield* fail(\"stale-target\");\n\n const current = yield* remote(() =>\n held.evaluate((state) => {\n if (typeof state !== \"object\" || state === null) return null;\n\n return Reflect.apply(Reflect.get(state, \"target\"), state, []);\n }),\n ).pipe(Effect.flatMap(inspect));\n\n if ((yield* origin(current)) !== target.recipientOrigin) return yield* fail(\"stale-target\");\n });\n\n yield* authorize;\n yield* validate;\n\n const raw = yield* access\n .resolve(authorization)\n .pipe(Effect.mapError((error) => fail(error.reason)));\n\n const material = yield* Schema.decodeEffect(\n request.kind === \"login\" ? LoginCredential : CardCredential,\n )(raw).pipe(Effect.mapError(() => fail(\"resolver\")));\n\n for (const role of roles)\n if (secretFor(material, role) === undefined) return yield* fail(\"missing-credential\");\n for (const [index, role] of roles.entries()) {\n yield* authorize;\n yield* validate;\n const value = secretFor(material, role);\n\n if (value === undefined) return yield* fail(\"missing-credential\");\n const previous = dispatch;\n\n const result = yield* remote((signal) => {\n if (signal.aborted) return Promise.reject(fail(\"provider\"));\n dispatch = \"possibly-dispatched\";\n\n return held.evaluate(\n (state, field, secret) => {\n if (typeof state !== \"object\" || state === null) return \"stale-target\";\n\n return Reflect.apply(Reflect.get(state, \"fill\"), state, [field, secret]);\n },\n index,\n Redacted.value(value),\n );\n }).pipe(\n Effect.flatMap(Schema.decodeUnknownEffect(WriteReply)),\n Effect.mapError(() => fail(\"provider\")),\n );\n\n if (result === \"stale-target\" || result === \"unsupported-before-write\") {\n dispatch = previous;\n\n return yield* fail(result === \"stale-target\" ? \"stale-target\" : \"unsupported\");\n }\n if (result === \"unsupported\") return yield* fail(\"unsupported\");\n dispatch = \"dispatched\";\n filled++;\n }\n\n return CredentialFillResult.make({ dispatch: \"dispatched\", filled });\n }).pipe(\n Effect.scoped,\n Effect.timeoutOrElse({\n duration: commandTimeoutMillis,\n orElse: () => Effect.fail(fail(\"timeout\")),\n }),\n Effect.catchCause((cause) => {\n if (Cause.hasInterrupts(cause)) return Effect.interrupt;\n if (\n cause.reasons.some(\n (reason) =>\n reason._tag === \"Die\" ||\n (reason._tag === \"Fail\" && !Schema.is(CredentialFillError)(reason.error)),\n )\n )\n return Effect.fail(fail(\"provider\"));\n\n const expected = cause.reasons.find(\n (reason) => reason._tag === \"Fail\" && Schema.is(CredentialFillError)(reason.error),\n );\n\n return Effect.fail(\n fail(\n expected?._tag === \"Fail\" && Schema.is(CredentialFillError)(expected.error)\n ? expected.error.reason\n : \"provider\",\n ),\n );\n }),\n Effect.withTracerEnabled(false),\n );\n});\n","/// <reference types=\"@cloudflare/workers-types\" />\n\nimport {\n Cause,\n Clock,\n Context,\n Effect,\n Exit,\n Layer,\n Redacted,\n Schema,\n Semaphore,\n Scope,\n} from \"effect\";\nimport type { Page } from \"puppeteer-core/lib/esm/puppeteer/puppeteer-core-browser.js\";\n\nimport {\n CredentialFillError,\n type BrowserCredentialAccess,\n type CredentialFillResult,\n type FillCredentialRequest,\n} from \"./BrowserCredentials.ts\";\nimport {\n BrowserRunHandoffRequest,\n BrowserRunHandoffResult,\n BrowserRunHandoffState,\n BrowserRunLiveViewRequest,\n BrowserRunLiveViewResult,\n} from \"./InteractiveBrowser.ts\";\nimport { BrowserRunBinding, type BrowserRunAttachment } from \"./internal/browser-binding.ts\";\nimport { BrowserSessionPage, fillCredential } from \"./internal/browser-credentials.ts\";\nimport { reportBrowserCause, reportedBrowserError } from \"./internal/browser-failure.ts\";\nimport {\n BrowserRunSessionLifecycle,\n type BrowserRunLifecycleOptions,\n} from \"./internal/browser-session-lifecycle.ts\";\n\nexport {\n BrowserRunHandoffRequest,\n BrowserRunHandoffResult,\n BrowserRunHandoffState,\n BrowserRunLiveViewRequest,\n BrowserRunLiveViewResult,\n};\n\nconst PositiveMillis = Schema.Int.check(\n Schema.isGreaterThan(0),\n Schema.isLessThanOrEqualTo(Number.MAX_SAFE_INTEGER),\n);\n\nconst SessionId = Schema.Redacted(Schema.String.check(Schema.isUUID()));\nconst ProviderId = Schema.Redacted(Schema.NonEmptyString.check(Schema.isMaxLength(256)));\n\n/** Private host record, not a model capability. Persist together with the owner's controller state. */\nexport class BrowserSessionReference extends Schema.Class<BrowserSessionReference>(\n \"BrowserSessionReference\",\n)({\n version: Schema.Literal(1),\n sessionId: SessionId,\n contextId: ProviderId,\n targetId: ProviderId,\n expiresAt: PositiveMillis,\n commandTimeoutMillis: PositiveMillis,\n}) {}\n\nexport class BrowserSessionOptions extends Schema.Class<BrowserSessionOptions>(\n \"BrowserSessionOptions\",\n)({\n maxElapsedMillis: PositiveMillis,\n keepAliveMillis: Schema.optionalKey(PositiveMillis.check(Schema.isLessThanOrEqualTo(600_000))),\n commandTimeoutMillis: Schema.optionalKey(PositiveMillis),\n}) {}\n\n/** No SDK text, selectors, page data, or credential values are retained in public failures. */\nexport class BrowserSessionError extends Schema.TaggedError<BrowserSessionError>()(\n \"BrowserSessionError\",\n {\n reason: Schema.Literals([\n \"invalid\",\n \"expired\",\n \"missing-page\",\n \"busy\",\n \"closed\",\n \"provider\",\n \"timeout\",\n \"cleanup\",\n ]),\n dispatch: Schema.Literals([\"not-dispatched\", \"possibly-dispatched\"]),\n cleanup: Schema.Literals([\"not-requested\", \"confirmed\", \"unconfirmed\"]),\n },\n) {}\n\n/**\n * One local attachment to an application-owned browser. Scope release disconnects; it never\n * transfers ownership or closes a healthy remote session. The owner serializes attachments,\n * fences old attempts, authorizes human access, and calls BrowserSessions.close on expiry/stop.\n * Native callbacks are trusted host code: never retain SDK handles or start unawaited work.\n */\nexport interface BrowserSession {\n readonly reference: BrowserSessionReference;\n /**\n * Check current authority under the lock before native dispatch. A settled SDK rejection leaves\n * the session available for inspection, but may have changed the website; never retry blindly.\n * Timeout/interruption fences outstanding SDK work and terminates the exact browser.\n */\n readonly run: <A, E, R>(\n authorize: Effect.Effect<void, E, R>,\n action: (page: Page) => Promise<A>,\n ) => Effect.Effect<A, E | BrowserSessionError, R>;\n /**\n * Resolves host-owned material under fresh credential grants. Never submits or retries a write.\n * Credential timeouts retain acknowledged writes and dispatch evidence alongside cleanup.\n */\n readonly fillCredential: (\n request: FillCredentialRequest,\n ) => Effect.Effect<\n CredentialFillResult,\n CredentialFillError | BrowserSessionError,\n BrowserCredentialAccess\n >;\n readonly handoff: <E, R>(\n authorize: Effect.Effect<void, E, R>,\n request: BrowserRunHandoffRequest,\n ) => Effect.Effect<BrowserRunHandoffResult, E | BrowserSessionError, R>;\n readonly getLiveView: <E, R>(\n authorize: Effect.Effect<void, E, R>,\n request: BrowserRunLiveViewRequest,\n ) => Effect.Effect<BrowserRunLiveViewResult, E | BrowserSessionError, R>;\n readonly getHandoffState: <E, R>(\n authorize: Effect.Effect<void, E, R>,\n ) => Effect.Effect<BrowserRunHandoffState, E | BrowserSessionError, R>;\n}\n\nconst failure = (\n reason: BrowserSessionError[\"reason\"],\n dispatch: BrowserSessionError[\"dispatch\"] = \"not-dispatched\",\n cleanup: BrowserSessionError[\"cleanup\"] = \"not-requested\",\n) => new BrowserSessionError({ reason, dispatch, cleanup });\n\nconst decode = <A>(schema: Schema.Codec<A>, input: unknown) =>\n Schema.decodeUnknownEffect(schema, { onExcessProperty: \"error\" })(input).pipe(\n Effect.mapError(() => failure(\"invalid\")),\n );\n\n// Catch inside the Promise before workerd can report an unhandled foreign diagnostic.\nconst native = Effect.fnUntraced(function* <A>(\n operation: string,\n action: (signal: AbortSignal) => Promise<A>,\n) {\n const runReport = Effect.runPromiseWith(yield* Effect.context<never>());\n\n return yield* Effect.tryPromise({\n try: async (signal) => {\n try {\n return { ok: true as const, value: await action(signal) };\n } catch (cause) {\n if (!signal.aborted || cause !== signal.reason)\n await runReport(reportBrowserCause(operation, Cause.fail(cause)));\n\n return { ok: false as const };\n }\n },\n catch: () => failure(\"provider\"),\n }).pipe(\n Effect.flatMap((result) =>\n result.ok\n ? Effect.succeed(result.value)\n : Effect.fail(reportedBrowserError(failure(\"provider\"))),\n ),\n Effect.withTracerEnabled(false),\n );\n});\n\nconst targetId = (page: Page) =>\n native(\"session.target\", async () => {\n const cdp = await page.createCDPSession();\n\n try {\n return (await cdp.send(\"Target.getTargetInfo\")).targetInfo.targetId;\n } finally {\n await cdp.detach();\n }\n });\n\nexport interface BrowserSessionsOptions extends BrowserRunLifecycleOptions {\n readonly browser: Pick<BrowserRun, \"fetch\">;\n}\n\n/** Native Cloudflare sessions; no framework browser workflow, checkpoint transfer, or observation policy. */\nexport class BrowserSessions extends Context.Service<\n BrowserSessions,\n {\n /**\n * Allocate once and commit its private reference in retain. Failed/uncommitted creation closes\n * the allocation. After retain succeeds the application owns remote cleanup, independent of\n * attempt Scopes. A lost allocation reply can remain indeterminate until provider idle expiry.\n */\n readonly create: <E, R>(\n options: BrowserSessionOptions,\n retain: (reference: BrowserSessionReference) => Effect.Effect<void, E, R>,\n ) => Effect.Effect<BrowserSessionReference, E | BrowserSessionError, R>;\n /** Attach only the exact saved context/page. Never recreate missing/expired state. */\n readonly attach: (\n reference: BrowserSessionReference,\n ) => Effect.Effect<BrowserSession, BrowserSessionError, Scope.Scope>;\n /** Refresh provider inactivity only; the owner must still enforce its expiresAt. */\n readonly keepAlive: (\n sessionId: Redacted.Redacted<string>,\n ) => Effect.Effect<void, BrowserSessionError>;\n readonly close: (\n sessionId: Redacted.Redacted<string>,\n ) => Effect.Effect<void, BrowserSessionError>;\n }\n>()(\"@effect-agent/platform-cloudflare/BrowserSessions\") {\n static readonly layerNoDeps = Layer.effect(\n this,\n Effect.gen(function* () {\n const binding = yield* BrowserRunBinding;\n const lifecycle = yield* BrowserRunSessionLifecycle;\n\n const close = (sessionId: Redacted.Redacted<string>) =>\n decode(SessionId, sessionId).pipe(\n Effect.flatMap((id) =>\n lifecycle\n .close(id)\n .pipe(Effect.mapError(() => failure(\"cleanup\", \"not-dispatched\", \"unconfirmed\"))),\n ),\n );\n\n const cleanup = (sessionId: Redacted.Redacted<string>) =>\n close(sessionId).pipe(\n Effect.as(\"confirmed\" as const),\n Effect.catchCause((cause) =>\n reportBrowserCause(\"session.close\", cause).pipe(Effect.as(\"unconfirmed\" as const)),\n ),\n );\n\n const connect = Effect.fnUntraced(function* (sessionId: Redacted.Redacted<string>) {\n let attachment: BrowserRunAttachment | undefined;\n\n const retire = Effect.suspend(() =>\n attachment === undefined\n ? Effect.void\n : attachment.retire.pipe(\n Effect.timeoutOrElse({\n duration: \"1 second\",\n orElse: () => Effect.fail(failure(\"cleanup\")),\n }),\n Effect.catchCause((cause) =>\n reportBrowserCause(\"session.disconnect\", cause).pipe(\n Effect.andThen(Effect.die(failure(\"cleanup\", \"not-dispatched\", \"unconfirmed\"))),\n ),\n ),\n ),\n );\n\n yield* Effect.addFinalizer(() => retire);\n\n const browser = yield* native(\"session.connect\", (signal) => {\n attachment = binding.connect(Redacted.value(sessionId), \"session.connect\", signal);\n\n return attachment.browser;\n });\n\n return { browser, retire };\n });\n\n const create = <E, R>(\n input: BrowserSessionOptions,\n retain: (reference: BrowserSessionReference) => Effect.Effect<void, E, R>,\n ) =>\n Effect.gen(function* () {\n const options = yield* decode(BrowserSessionOptions, input);\n const expiresAt = (yield* Clock.currentTimeMillis) + options.maxElapsedMillis;\n\n if (!Number.isSafeInteger(expiresAt)) return yield* failure(\"invalid\");\n let sessionId: Redacted.Redacted<string> | undefined;\n let retained = false;\n const runCleanup = Effect.runPromiseWith(yield* Effect.context<never>());\n\n yield* Effect.addFinalizer(() =>\n sessionId === undefined || retained ? Effect.void : cleanup(sessionId),\n );\n sessionId = yield* native(\"session.acquire\", async (signal) => {\n const id = Redacted.make(\n await binding.acquire(options.keepAliveMillis ?? 600_000, \"session.acquire\"),\n );\n\n if (signal.aborted) {\n await runCleanup(cleanup(id));\n signal.throwIfAborted();\n }\n\n return id;\n });\n const { browser } = yield* connect(sessionId);\n\n const page = yield* native(\"session.page\", async () => {\n const context = await browser.createBrowserContext();\n\n return await context.newPage();\n });\n\n const reference = yield* decode(BrowserSessionReference, {\n version: 1,\n sessionId,\n contextId: Redacted.make(page.browserContext().id ?? \"\"),\n targetId: Redacted.make(yield* targetId(page)),\n expiresAt,\n commandTimeoutMillis: options.commandTimeoutMillis ?? 30_000,\n });\n\n yield* Effect.uninterruptibleMask((restore) =>\n restore(retain(reference)).pipe(\n Effect.tap(() =>\n Effect.sync(() => {\n retained = true;\n }),\n ),\n ),\n );\n\n return reference;\n }).pipe(\n Effect.scoped,\n Effect.timeoutOrElse({\n duration: \"30 seconds\",\n orElse: () => Effect.fail(failure(\"timeout\")),\n }),\n Effect.withTracerEnabled(false),\n );\n\n const attachPage = Effect.fnUntraced(function* (input: BrowserSessionReference) {\n const reference = yield* decode(BrowserSessionReference, input);\n\n if (reference.expiresAt <= (yield* Clock.currentTimeMillis))\n return yield* failure(\"expired\");\n const scope = yield* Effect.scope;\n const { browser, retire } = yield* connect(reference.sessionId);\n\n const context = browser\n .browserContexts()\n .find((value) => value.id === Redacted.value(reference.contextId));\n\n if (context === undefined) return yield* failure(\"missing-page\");\n let page: Page | undefined;\n\n for (const candidate of yield* native(\"session.pages\", () => context.pages())) {\n if ((yield* targetId(candidate)) === Redacted.value(reference.targetId)) {\n page = candidate;\n break;\n }\n }\n if (page === undefined) return yield* failure(\"missing-page\");\n const currentPage = page;\n const lock = yield* Semaphore.make(1);\n let invalid = false;\n\n const terminate = Effect.suspend(() => {\n invalid = true;\n\n return retire.pipe(\n Effect.catchCause((cause) => reportBrowserCause(\"session.disconnect\", cause)),\n Effect.andThen(cleanup(reference.sessionId)),\n );\n });\n\n const runEffect = <A, E, R>(\n action: (commandTimeoutMillis: number) => Effect.Effect<A, E, R>,\n ) =>\n lock\n .withPermitsIfAvailable(1)(\n Effect.gen(function* () {\n if (invalid || scope.state._tag === \"Closed\" || !browser.isConnected())\n return yield* failure(\"closed\");\n const remaining = reference.expiresAt - (yield* Clock.currentTimeMillis);\n\n if (remaining <= 0) {\n return yield* failure(\"expired\", \"not-dispatched\", yield* terminate);\n }\n\n return yield* action(Math.min(remaining, reference.commandTimeoutMillis)).pipe(\n Effect.catchDefect((defect) =>\n reportBrowserCause(\"session.command\", Cause.die(defect)).pipe(\n Effect.andThen(terminate),\n Effect.flatMap((closed) =>\n Effect.fail(failure(\"provider\", \"possibly-dispatched\", closed)),\n ),\n ),\n ),\n Effect.onInterrupt(() => terminate),\n );\n }),\n )\n .pipe(\n Effect.flatMap(Effect.fromOption(() => failure(\"busy\"))),\n Effect.withTracerEnabled(false),\n );\n\n const run = <A, E, R>(\n authorize: Effect.Effect<void, E, R>,\n action: (page: Page) => Promise<A>,\n terminateOnError = false,\n ) =>\n runEffect((commandTimeoutMillis) =>\n authorize.pipe(\n Effect.andThen(() =>\n native(\"session.command\", () => action(currentPage)).pipe(\n Effect.catch((error) =>\n Effect.gen(function* () {\n const closed = terminateOnError ? yield* terminate : \"not-requested\";\n\n return yield* reportedBrowserError(\n failure(error.reason, \"possibly-dispatched\", closed),\n );\n }),\n ),\n ),\n ),\n Effect.timeoutOrElse({\n duration: commandTimeoutMillis,\n orElse: () =>\n terminate.pipe(\n Effect.flatMap((closed) =>\n Effect.fail(failure(\"timeout\", \"possibly-dispatched\", closed)),\n ),\n ),\n }),\n ),\n );\n\n const command = <A, E, R>(\n authorize: Effect.Effect<void, E, R>,\n method: string,\n parameters: Record<string, string | number>,\n schema: Schema.Codec<A>,\n ) =>\n run(\n authorize,\n async (page) => {\n const cdp = await page.createCDPSession();\n\n try {\n const result: unknown = await Reflect.apply(cdp.send, cdp, [method, parameters]);\n\n return Schema.decodeUnknownSync(schema)(result);\n } finally {\n await cdp.detach();\n }\n },\n method === \"Cloudflare.handoff\",\n );\n\n const session: BrowserSession = {\n reference,\n run,\n fillCredential: (request) =>\n runEffect((commandTimeoutMillis) =>\n fillCredential(request).pipe(\n Effect.provideService(BrowserSessionPage, {\n page: currentPage,\n commandTimeoutMillis,\n }),\n Effect.catchIf(\n (error) => error.reason === \"timeout\" || error.dispatch === \"possibly-dispatched\",\n (error) =>\n terminate.pipe(\n Effect.flatMap((cleanup) =>\n Effect.fail(CredentialFillError.make({ ...error, cleanup })),\n ),\n ),\n ),\n ),\n ),\n handoff: (authorize, request) =>\n decode(BrowserRunHandoffRequest, request).pipe(\n Effect.flatMap((value) =>\n command(\n authorize,\n \"Cloudflare.handoff\",\n { instructions: value.instructions, timeout: value.timeout },\n Schema.Struct({\n handoffId: Schema.NonEmptyString.check(Schema.isMaxLength(1024)),\n }),\n ),\n ),\n Effect.map((value) =>\n BrowserRunHandoffResult.make({ handoffId: Redacted.make(value.handoffId) }),\n ),\n ),\n getLiveView: (authorize, request) =>\n decode(BrowserRunLiveViewRequest, request).pipe(\n Effect.flatMap((value) =>\n command(\n authorize,\n \"Cloudflare.getLiveView\",\n { mode: value.mode, expiresInMs: value.expiresInMs },\n Schema.Struct({ devtoolsFrontendUrl: Schema.String }),\n ),\n ),\n Effect.flatMap((value) =>\n decode(BrowserRunLiveViewResult, {\n devtoolsFrontendUrl: Redacted.make(value.devtoolsFrontendUrl),\n }),\n ),\n ),\n getHandoffState: (authorize) =>\n command(\n authorize,\n \"Cloudflare.getHandoffState\",\n {},\n Schema.Struct({\n active: Schema.Boolean,\n handoffId: Schema.optionalKey(\n Schema.NonEmptyString.check(Schema.isMaxLength(1024)),\n ),\n durationMs: Schema.optionalKey(Schema.Natural),\n }),\n ).pipe(\n Effect.map((value) =>\n BrowserRunHandoffState.make({\n active: value.active,\n ...(value.handoffId === undefined\n ? {}\n : { handoffId: Redacted.make(value.handoffId) }),\n ...(value.durationMs === undefined ? {} : { durationMs: value.durationMs }),\n }),\n ),\n ),\n };\n\n return session;\n });\n\n const attach = Effect.fnUntraced(function* (input: BrowserSessionReference) {\n const reference = yield* decode(BrowserSessionReference, input);\n const scope = yield* Scope.fork(yield* Effect.scope);\n\n return yield* attachPage(reference).pipe(\n Effect.provideService(Scope.Scope, scope),\n Effect.timeoutOrElse({\n duration: reference.commandTimeoutMillis,\n orElse: () =>\n reportBrowserCause(\"session.connect\", Cause.fail(failure(\"timeout\"))).pipe(\n Effect.andThen(Effect.fail(reportedBrowserError(failure(\"timeout\")))),\n ),\n }),\n Effect.onExit((exit) => (Exit.isFailure(exit) ? Scope.close(scope, exit) : Effect.void)),\n );\n });\n\n return BrowserSessions.of({\n create,\n attach,\n close,\n keepAlive: (sessionId) =>\n decode(SessionId, sessionId).pipe(\n Effect.flatMap((id) =>\n binding.keepAlive(Redacted.value(id)).pipe(\n Effect.timeoutOrElse({\n duration: \"10 seconds\",\n orElse: () => Effect.fail(failure(\"timeout\")),\n }),\n Effect.catch((error) =>\n reportBrowserCause(\"session.keepAlive\", Cause.fail(error)).pipe(\n Effect.andThen(\n Effect.fail(\n reportedBrowserError(\n failure(error.reason === \"timeout\" ? \"timeout\" : \"provider\"),\n ),\n ),\n ),\n ),\n ),\n ),\n ),\n Effect.withTracerEnabled(false),\n ),\n });\n }),\n );\n\n static layer(options: BrowserSessionsOptions) {\n return this.layerNoDeps.pipe(\n Layer.provide(BrowserRunBinding.layer(options.browser)),\n Layer.provide(BrowserRunSessionLifecycle.layer(options)),\n );\n }\n}\n"],"mappings":"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"}