@effect-agent/platform-cloudflare 0.1.0-beta.120 → 0.1.0-beta.122
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/CloudflareThreadClient.d.mts +50 -50
- package/dist/{InteractiveBrowser-BQo7QKaP.d.mts → InteractiveBrowser-Cm4xgiGy.d.mts} +2 -2
- package/dist/{InteractiveBrowser-CBUFAECo.mjs → InteractiveBrowser-DXwmvWdA.mjs} +197 -25
- package/dist/InteractiveBrowser-DXwmvWdA.mjs.map +1 -0
- package/dist/InteractiveBrowser.d.mts +1 -1
- package/dist/InteractiveBrowser.mjs +1 -1
- package/dist/ProtectedBrowser.d.mts +15 -1
- package/dist/ProtectedBrowser.mjs +194 -153
- package/dist/ProtectedBrowser.mjs.map +1 -1
- package/dist/{ThreadObject-9IVibJM7.d.mts → ThreadObject-mt0uxvZZ.d.mts} +27 -27
- package/dist/ThreadObject.d.mts +1 -1
- package/dist/index.d.mts +1 -1
- package/package.json +1 -1
- package/src/InteractiveBrowser.ts +17 -12
- package/src/internal/browser-binding.ts +270 -32
- package/src/internal/browser-file-selection.ts +1 -1
- package/src/protected-browser/binding.ts +124 -33
- package/src/protected-browser/host.ts +16 -0
- package/src/protected-browser/native.ts +7 -9
- package/dist/InteractiveBrowser-CBUFAECo.mjs.map +0 -1
|
@@ -1545,8 +1545,50 @@ export declare const encodeHostResponse: (input: AbortRecorded | ApprovalRecorde
|
|
|
1545
1545
|
readonly message: string;
|
|
1546
1546
|
readonly cause?: Schema.Json | undefined;
|
|
1547
1547
|
} | {
|
|
1548
|
-
readonly _tag: "
|
|
1548
|
+
readonly _tag: "HostProtocolError";
|
|
1549
|
+
readonly message: string;
|
|
1550
|
+
} | {
|
|
1551
|
+
readonly _tag: "AgentInputError";
|
|
1552
|
+
readonly message: string;
|
|
1553
|
+
} | {
|
|
1554
|
+
readonly _tag: "DigestError";
|
|
1555
|
+
readonly message: string;
|
|
1556
|
+
readonly cause?: Schema.Json | undefined;
|
|
1557
|
+
} | {
|
|
1558
|
+
readonly _tag: "AdmissionConflict";
|
|
1549
1559
|
readonly threadId: string;
|
|
1560
|
+
readonly principal: string;
|
|
1561
|
+
readonly idempotencyKey: string;
|
|
1562
|
+
readonly existingInputDigest: string;
|
|
1563
|
+
readonly attemptedInputDigest: string;
|
|
1564
|
+
} | {
|
|
1565
|
+
readonly _tag: "AdmissionPolicyError";
|
|
1566
|
+
readonly reason: "occupied" | "refused" | "unavailable";
|
|
1567
|
+
readonly code: string;
|
|
1568
|
+
readonly cause?: import("effect-agent/failure-diagnostic").Diagnostic | undefined;
|
|
1569
|
+
readonly stack?: string | undefined;
|
|
1570
|
+
} | {
|
|
1571
|
+
readonly _tag: "SettlementConflict";
|
|
1572
|
+
readonly submissionId: string;
|
|
1573
|
+
readonly existingOutcome: "aborted" | "completed" | "failed";
|
|
1574
|
+
} | {
|
|
1575
|
+
readonly _tag: "ApprovalConflict";
|
|
1576
|
+
readonly submissionId: string;
|
|
1577
|
+
readonly toolCallId: string;
|
|
1578
|
+
readonly existingDecision: "approved" | "denied";
|
|
1579
|
+
} | {
|
|
1580
|
+
readonly _tag: "UnknownResolutionConflict";
|
|
1581
|
+
readonly submissionId: string;
|
|
1582
|
+
readonly toolCallId: string;
|
|
1583
|
+
} | {
|
|
1584
|
+
readonly _tag: "JoinedToHost";
|
|
1585
|
+
readonly submissionId: string;
|
|
1586
|
+
readonly hostSubmissionId: string;
|
|
1587
|
+
} | {
|
|
1588
|
+
readonly _tag: "LedgerError";
|
|
1589
|
+
readonly operation: string;
|
|
1590
|
+
readonly message: string;
|
|
1591
|
+
readonly cause?: import("effect-agent/failure-diagnostic").Diagnostic | undefined;
|
|
1550
1592
|
} | {
|
|
1551
1593
|
readonly _tag: "ThreadStoreError";
|
|
1552
1594
|
readonly operation: string;
|
|
@@ -1560,10 +1602,8 @@ export declare const encodeHostResponse: (input: AbortRecorded | ApprovalRecorde
|
|
|
1560
1602
|
readonly sequence?: number | undefined;
|
|
1561
1603
|
} | undefined;
|
|
1562
1604
|
} | {
|
|
1563
|
-
readonly _tag: "
|
|
1564
|
-
readonly
|
|
1565
|
-
readonly message: string;
|
|
1566
|
-
readonly cause?: import("effect-agent/failure-diagnostic").Diagnostic | undefined;
|
|
1605
|
+
readonly _tag: "ThreadNotMaterialized";
|
|
1606
|
+
readonly threadId: string;
|
|
1567
1607
|
} | {
|
|
1568
1608
|
readonly _tag: "AppendConflict";
|
|
1569
1609
|
readonly threadId: string;
|
|
@@ -1576,60 +1616,20 @@ export declare const encodeHostResponse: (input: AbortRecorded | ApprovalRecorde
|
|
|
1576
1616
|
readonly threadId: string;
|
|
1577
1617
|
readonly actualEpoch: number;
|
|
1578
1618
|
readonly attemptedEpoch: number;
|
|
1579
|
-
} | {
|
|
1580
|
-
readonly _tag: "OperationDenied";
|
|
1581
|
-
readonly operation: "abort" | "awaitSettlement" | "explain" | "observe" | "resolveApproval" | "resolveUnknown" | "retry" | "scanObligations" | "verify" | "wake";
|
|
1582
|
-
readonly reason: string;
|
|
1583
|
-
readonly threadId?: string | undefined;
|
|
1584
|
-
readonly submissionId?: string | undefined;
|
|
1585
|
-
} | {
|
|
1586
|
-
readonly _tag: "AdmissionConflict";
|
|
1587
|
-
readonly threadId: string;
|
|
1588
|
-
readonly principal: string;
|
|
1589
|
-
readonly idempotencyKey: string;
|
|
1590
|
-
readonly existingInputDigest: string;
|
|
1591
|
-
readonly attemptedInputDigest: string;
|
|
1592
|
-
} | {
|
|
1593
|
-
readonly _tag: "AdmissionPolicyError";
|
|
1594
|
-
readonly reason: "occupied" | "refused" | "unavailable";
|
|
1595
|
-
readonly code: string;
|
|
1596
|
-
readonly cause?: import("effect-agent/failure-diagnostic").Diagnostic | undefined;
|
|
1597
|
-
readonly stack?: string | undefined;
|
|
1598
|
-
} | {
|
|
1599
|
-
readonly _tag: "AgentInputError";
|
|
1600
|
-
readonly message: string;
|
|
1601
|
-
} | {
|
|
1602
|
-
readonly _tag: "DigestError";
|
|
1603
|
-
readonly message: string;
|
|
1604
|
-
readonly cause?: Schema.Json | undefined;
|
|
1605
1619
|
} | {
|
|
1606
1620
|
readonly _tag: "DurableRuntimeFailpointError";
|
|
1607
1621
|
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";
|
|
1608
|
-
} | {
|
|
1609
|
-
readonly _tag: "SettlementConflict";
|
|
1610
|
-
readonly submissionId: string;
|
|
1611
|
-
readonly existingOutcome: "aborted" | "completed" | "failed";
|
|
1612
|
-
} | {
|
|
1613
|
-
readonly _tag: "JoinedToHost";
|
|
1614
|
-
readonly submissionId: string;
|
|
1615
|
-
readonly hostSubmissionId: string;
|
|
1616
1622
|
} | {
|
|
1617
1623
|
readonly _tag: "AdmissionLimitExceeded";
|
|
1618
1624
|
readonly limit: "database-bytes" | "input-bytes" | "queue-depth";
|
|
1619
1625
|
readonly actual: number;
|
|
1620
1626
|
readonly maximum: number;
|
|
1621
1627
|
} | {
|
|
1622
|
-
readonly _tag: "
|
|
1623
|
-
readonly
|
|
1624
|
-
|
|
1625
|
-
readonly
|
|
1626
|
-
readonly submissionId
|
|
1627
|
-
readonly toolCallId: string;
|
|
1628
|
-
readonly existingDecision: "approved" | "denied";
|
|
1629
|
-
} | {
|
|
1630
|
-
readonly _tag: "UnknownResolutionConflict";
|
|
1631
|
-
readonly submissionId: string;
|
|
1632
|
-
readonly toolCallId: string;
|
|
1628
|
+
readonly _tag: "OperationDenied";
|
|
1629
|
+
readonly operation: "abort" | "awaitSettlement" | "explain" | "observe" | "resolveApproval" | "resolveUnknown" | "retry" | "scanObligations" | "verify" | "wake";
|
|
1630
|
+
readonly reason: string;
|
|
1631
|
+
readonly threadId?: string | undefined;
|
|
1632
|
+
readonly submissionId?: string | undefined;
|
|
1633
1633
|
};
|
|
1634
1634
|
}, Schema.SchemaError, never>;
|
|
1635
1635
|
export declare const decodeHostResponse: (input: unknown, options?: import("effect/SchemaAST").ParseOptions) => Effect.Effect<AbortRecorded | ApprovalRecorded | HostFailed | ObservedPage | ProgressCancelled | ProgressObserved | SettlementReached | SubmissionStatusResponse | SubmitSucceeded | UnknownResolutionRecorded, Schema.SchemaError, never>;
|
|
@@ -129,7 +129,7 @@ interface BrowserRunInteractiveBrowser {
|
|
|
129
129
|
}
|
|
130
130
|
declare const BrowserRunInteractiveBinding_base: Context.ServiceClass<BrowserRunInteractiveBinding, "@effect-agent/platform-cloudflare/BrowserRunInteractiveBinding", {
|
|
131
131
|
readonly acquire: (keepAliveMillis: number) => Promise<unknown>;
|
|
132
|
-
readonly connect: (sessionId: string) => Promise<BrowserRunInteractiveBrowser>;
|
|
132
|
+
readonly connect: (sessionId: string, signal?: AbortSignal) => Promise<BrowserRunInteractiveBrowser>;
|
|
133
133
|
/** Success proves whole-browser termination or exact-session absence. */
|
|
134
134
|
readonly closeSession: (sessionId: Redacted.Redacted<string>) => Effect.Effect<void, InteractiveBrowserError>;
|
|
135
135
|
}>;
|
|
@@ -225,4 +225,4 @@ declare const CloudflareInteractiveBrowser: {
|
|
|
225
225
|
};
|
|
226
226
|
//#endregion
|
|
227
227
|
export { CloudflareInteractiveBrowserOptions as C, isBrowserRunUndispatchedActionError as D, browserRunInteractiveLayer as E, BrowserRunCleanupError as O, CloudflareInteractiveBrowser as S, browserRunInteractiveImplementation as T, BrowserRunLiveViewRequest as _, BrowserRunInputState as a, BrowserRunPageObservation as b, BrowserRunInteractiveBrowser as c, BrowserRunInteractiveContext as d, BrowserRunInteractiveHost as f, BrowserRunInteractiveSession as g, BrowserRunInteractiveRequestListener as h, BrowserRunHandoffState as i, BrowserRunSessionLifecycle as k, BrowserRunInteractiveCdpSession as l, BrowserRunInteractiveRequest as m, BrowserRunHandoffRequest as n, BrowserRunInteractiveAcquisition as o, BrowserRunInteractivePage as p, BrowserRunHandoffResult as r, BrowserRunInteractiveBinding as s, BrowserRunCloudflareCommand as t, BrowserRunInteractiveCheckpoint as u, BrowserRunLiveViewResult as v, browserRunInteractiveHostLayer as w, BrowserRunViewport as x, BrowserRunPageIdentity as y };
|
|
228
|
-
//# sourceMappingURL=InteractiveBrowser-
|
|
228
|
+
//# sourceMappingURL=InteractiveBrowser-Cm4xgiGy.d.mts.map
|
|
@@ -2,8 +2,8 @@ import { Cause, Clock, Context, Data, Duration, Effect, Encoding, ErrorReporter,
|
|
|
2
2
|
import { PageScreenshotResult } from "effect-agent/page-screenshot";
|
|
3
3
|
import { SandboxImplementation } from "effect-agent/sandbox";
|
|
4
4
|
import { FetchHttpClient, HttpClient, HttpClientRequest } from "effect/unstable/http";
|
|
5
|
-
import puppeteer from "@cloudflare/puppeteer";
|
|
6
5
|
import { BrowserActionResult, BrowserExpectedTargetState, BrowserFileSelectionResult, BrowserNavigationResult, BrowserScreenshotRequest, BrowserScrollRequest, BrowserSelectFileRequest, BrowserTextResult, InteractiveBrowser, InteractiveBrowserActionError, InteractiveBrowserBusyError, InteractiveBrowserCapacityError, InteractiveBrowserExpiredError, InteractiveBrowserLimitError, InteractiveBrowserPolicy, InteractiveBrowserPolicyDeniedError, InteractiveBrowserProtocolError, InteractiveBrowserTargetUrl, InteractiveBrowserUnsupportedError } from "effect-agent/interactive-browser";
|
|
6
|
+
import puppeteer from "puppeteer-core/lib/esm/puppeteer/puppeteer-core-browser.js";
|
|
7
7
|
//#region src/internal/browser-failure.ts
|
|
8
8
|
/** Source-authored stages and classifications only; never retain SDK text or session capabilities. */
|
|
9
9
|
var BrowserRunFailure = class extends Data.TaggedError("BrowserRunFailure") {
|
|
@@ -49,9 +49,41 @@ const reportBrowserCause = (operation, cause) => ErrorReporter.report(Cause.from
|
|
|
49
49
|
//#endregion
|
|
50
50
|
//#region src/internal/browser-binding.ts
|
|
51
51
|
const Acquired = Schema.Struct({ sessionId: Schema.String.check(Schema.isUUID()) });
|
|
52
|
+
const VersionReply = Schema.fromJsonString(Schema.Struct({
|
|
53
|
+
id: Schema.optionalKey(Schema.Int),
|
|
54
|
+
result: Schema.optionalKey(Schema.Unknown),
|
|
55
|
+
error: Schema.optionalKey(Schema.Unknown)
|
|
56
|
+
}));
|
|
57
|
+
const Version = Schema.Struct({
|
|
58
|
+
product: Schema.NonEmptyString,
|
|
59
|
+
protocolVersion: Schema.NonEmptyString
|
|
60
|
+
});
|
|
52
61
|
/** Native transport port shared by both scoped adapters; the Layer owns the foreign binding. */
|
|
53
62
|
var BrowserRunBinding = class extends Context.Service()("@effect-agent/platform-cloudflare/internal/BrowserRunBinding") {
|
|
54
63
|
static layer(browser) {
|
|
64
|
+
const upgrade = async (sessionId, operation, signal) => {
|
|
65
|
+
const response = await browser.fetch(`https://browser-rendering.cloudflare.com/v1/devtools/browser/${sessionId}`, {
|
|
66
|
+
headers: { Upgrade: "websocket" },
|
|
67
|
+
...signal === void 0 ? {} : { signal }
|
|
68
|
+
});
|
|
69
|
+
if (response.status !== 101) {
|
|
70
|
+
const failure = new BrowserRunFailure({
|
|
71
|
+
operation,
|
|
72
|
+
reason: "provider",
|
|
73
|
+
status: response.status
|
|
74
|
+
});
|
|
75
|
+
try {
|
|
76
|
+
await response.body?.cancel();
|
|
77
|
+
} catch {}
|
|
78
|
+
throw failure;
|
|
79
|
+
}
|
|
80
|
+
const socket = response.webSocket;
|
|
81
|
+
if (socket === null) throw new BrowserRunFailure({
|
|
82
|
+
operation,
|
|
83
|
+
reason: "malformed"
|
|
84
|
+
});
|
|
85
|
+
return socket;
|
|
86
|
+
};
|
|
55
87
|
return Layer.succeed(this)({
|
|
56
88
|
acquire: async (keepAliveMillis, operation) => {
|
|
57
89
|
const response = await browser.fetch(`https://browser-rendering.cloudflare.com/v1/devtools/browser?keep_alive=${keepAliveMillis}&recording=false`, { method: "POST" });
|
|
@@ -68,31 +100,171 @@ var BrowserRunBinding = class extends Context.Service()("@effect-agent/platform-
|
|
|
68
100
|
}
|
|
69
101
|
return Schema.decodeUnknownSync(Acquired)(await response.json()).sessionId;
|
|
70
102
|
},
|
|
71
|
-
connect:
|
|
72
|
-
let
|
|
73
|
-
|
|
74
|
-
|
|
103
|
+
connect: (sessionId, operation, signal) => {
|
|
104
|
+
let socket;
|
|
105
|
+
let retired = false;
|
|
106
|
+
let closedByAbort = false;
|
|
107
|
+
let retirementFailure;
|
|
108
|
+
const disconnectOperation = operation === "protected.connect" ? "protected.disconnect" : "interactive.disconnect";
|
|
109
|
+
const transport = {
|
|
110
|
+
send: (message) => {
|
|
111
|
+
if (retired || socket === void 0) throw new BrowserRunFailure({
|
|
112
|
+
operation,
|
|
113
|
+
reason: "provider"
|
|
114
|
+
});
|
|
115
|
+
socket.send(message);
|
|
116
|
+
},
|
|
117
|
+
close: () => retireNow()
|
|
118
|
+
};
|
|
119
|
+
const onMessage = (event) => {
|
|
120
|
+
if (!retired) transport.onmessage?.(event.data);
|
|
121
|
+
};
|
|
122
|
+
const fence = () => {
|
|
123
|
+
if (retired) return;
|
|
124
|
+
retired = true;
|
|
125
|
+
const notify = transport.onclose;
|
|
126
|
+
transport.onmessage = void 0;
|
|
127
|
+
transport.onclose = void 0;
|
|
128
|
+
try {
|
|
129
|
+
notify?.();
|
|
130
|
+
} finally {
|
|
131
|
+
socket?.removeEventListener("message", onMessage);
|
|
132
|
+
}
|
|
133
|
+
};
|
|
134
|
+
const retireNow = () => {
|
|
135
|
+
try {
|
|
136
|
+
fence();
|
|
137
|
+
} catch (cause) {
|
|
138
|
+
retirementFailure ??= browserFailure(disconnectOperation, cause);
|
|
139
|
+
}
|
|
140
|
+
try {
|
|
141
|
+
if (socket !== void 0 && socket.readyState < WebSocket.CLOSING) socket.close();
|
|
142
|
+
} catch (cause) {
|
|
143
|
+
retirementFailure ??= browserFailure(disconnectOperation, cause);
|
|
144
|
+
}
|
|
145
|
+
if (retirementFailure !== void 0) throw retirementFailure;
|
|
146
|
+
};
|
|
147
|
+
const abort = () => {
|
|
148
|
+
closedByAbort = socket?.readyState === WebSocket.OPEN;
|
|
149
|
+
try {
|
|
150
|
+
retireNow();
|
|
151
|
+
} catch {}
|
|
152
|
+
};
|
|
153
|
+
signal?.addEventListener("abort", abort, { once: true });
|
|
154
|
+
return {
|
|
155
|
+
browser: (async () => {
|
|
75
156
|
try {
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
157
|
+
signal?.throwIfAborted();
|
|
158
|
+
socket = await upgrade(sessionId, operation, signal);
|
|
159
|
+
socket.accept();
|
|
160
|
+
if (retired || signal?.aborted) {
|
|
161
|
+
retireNow();
|
|
162
|
+
signal?.throwIfAborted();
|
|
163
|
+
throw new BrowserRunFailure({
|
|
79
164
|
operation,
|
|
80
|
-
reason: "provider"
|
|
81
|
-
status: response.status
|
|
165
|
+
reason: "provider"
|
|
82
166
|
});
|
|
83
|
-
await response.body?.cancel();
|
|
84
|
-
throw failure;
|
|
85
167
|
}
|
|
86
|
-
|
|
168
|
+
socket.addEventListener("message", onMessage);
|
|
169
|
+
socket.addEventListener("close", () => {
|
|
170
|
+
try {
|
|
171
|
+
fence();
|
|
172
|
+
} catch (cause) {
|
|
173
|
+
retirementFailure ??= browserFailure(disconnectOperation, cause);
|
|
174
|
+
}
|
|
175
|
+
}, { once: true });
|
|
176
|
+
return await puppeteer.connect({ transport });
|
|
87
177
|
} catch (cause) {
|
|
88
|
-
|
|
89
|
-
|
|
178
|
+
try {
|
|
179
|
+
retireNow();
|
|
180
|
+
} catch {}
|
|
181
|
+
const failure = browserFailure(operation, cause);
|
|
182
|
+
throw cause instanceof Error && signal?.aborted === true && (cause === signal.reason || closedByAbort && cause.name === "TargetCloseError") ? reportedBrowserError(failure) : failure;
|
|
183
|
+
} finally {
|
|
184
|
+
signal?.removeEventListener("abort", abort);
|
|
90
185
|
}
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
186
|
+
})(),
|
|
187
|
+
retire: Effect.callback((resume) => {
|
|
188
|
+
const connected = socket;
|
|
189
|
+
const onClose = () => resume(Effect.void);
|
|
190
|
+
try {
|
|
191
|
+
retireNow();
|
|
192
|
+
if (connected === void 0 || connected.readyState === WebSocket.CLOSED) resume(Effect.void);
|
|
193
|
+
else connected.addEventListener("close", onClose, { once: true });
|
|
194
|
+
} catch (cause) {
|
|
195
|
+
resume(Effect.fail(browserFailure(disconnectOperation, cause)));
|
|
196
|
+
}
|
|
197
|
+
return Effect.sync(() => connected?.removeEventListener("close", onClose));
|
|
198
|
+
})
|
|
199
|
+
};
|
|
200
|
+
},
|
|
201
|
+
keepAlive: Effect.fnUntraced(function* (sessionId) {
|
|
202
|
+
const operation = "protected.keepAlive";
|
|
203
|
+
const runReport = Effect.runPromiseWith(yield* Effect.context());
|
|
204
|
+
const release = (socket) => Effect.sync(() => socket.close()).pipe(Effect.catchCause((cause) => reportBrowserCause(operation, cause)));
|
|
205
|
+
const socket = yield* Effect.acquireRelease(Effect.tryPromise({
|
|
206
|
+
try: async (signal) => {
|
|
207
|
+
let acquired;
|
|
208
|
+
try {
|
|
209
|
+
acquired = await upgrade(sessionId, operation, signal);
|
|
210
|
+
acquired.accept();
|
|
211
|
+
signal.throwIfAborted();
|
|
212
|
+
return acquired;
|
|
213
|
+
} catch (cause) {
|
|
214
|
+
if (acquired !== void 0) await runReport(release(acquired));
|
|
215
|
+
if (signal.aborted && cause !== signal.reason) await runReport(reportBrowserCause(operation, Cause.fail(cause)));
|
|
216
|
+
throw cause;
|
|
217
|
+
}
|
|
218
|
+
},
|
|
219
|
+
catch: (cause) => browserFailure(operation, cause)
|
|
220
|
+
}), release, { interruptible: true });
|
|
221
|
+
yield* Effect.callback((resume) => {
|
|
222
|
+
const finish = (result) => {
|
|
223
|
+
removeListeners();
|
|
224
|
+
resume(result);
|
|
225
|
+
};
|
|
226
|
+
const fail = (reason) => finish(Effect.fail(new BrowserRunFailure({
|
|
227
|
+
operation,
|
|
228
|
+
reason
|
|
229
|
+
})));
|
|
230
|
+
const onMessage = (event) => {
|
|
231
|
+
try {
|
|
232
|
+
if (typeof event.data !== "string" || event.data.length > 16384) {
|
|
233
|
+
fail("malformed");
|
|
234
|
+
return;
|
|
235
|
+
}
|
|
236
|
+
const reply = Schema.decodeSync(VersionReply)(event.data);
|
|
237
|
+
if (reply.id !== 1) return;
|
|
238
|
+
if (reply.error !== void 0) {
|
|
239
|
+
fail("provider");
|
|
240
|
+
return;
|
|
241
|
+
}
|
|
242
|
+
Schema.decodeUnknownSync(Version)(reply.result);
|
|
243
|
+
finish(Effect.void);
|
|
244
|
+
} catch {
|
|
245
|
+
fail("malformed");
|
|
246
|
+
}
|
|
247
|
+
};
|
|
248
|
+
const onClose = () => fail("provider");
|
|
249
|
+
const removeListeners = () => {
|
|
250
|
+
socket.removeEventListener("message", onMessage);
|
|
251
|
+
socket.removeEventListener("close", onClose);
|
|
252
|
+
socket.removeEventListener("error", onClose);
|
|
253
|
+
};
|
|
254
|
+
socket.addEventListener("message", onMessage);
|
|
255
|
+
socket.addEventListener("close", onClose);
|
|
256
|
+
socket.addEventListener("error", onClose);
|
|
257
|
+
try {
|
|
258
|
+
socket.send(JSON.stringify({
|
|
259
|
+
id: 1,
|
|
260
|
+
method: "Browser.getVersion"
|
|
261
|
+
}));
|
|
262
|
+
} catch (cause) {
|
|
263
|
+
finish(Effect.fail(browserFailure(operation, cause)));
|
|
264
|
+
}
|
|
265
|
+
return Effect.sync(removeListeners);
|
|
266
|
+
});
|
|
267
|
+
}, Effect.scoped)
|
|
96
268
|
});
|
|
97
269
|
}
|
|
98
270
|
};
|
|
@@ -412,7 +584,7 @@ var BrowserRunInteractiveBinding = class BrowserRunInteractiveBinding extends Co
|
|
|
412
584
|
const viewport = options.viewport === void 0 ? void 0 : yield* decodeViewport(options.viewport);
|
|
413
585
|
return {
|
|
414
586
|
acquire: async (keepAliveMillis) => binding.acquire(keepAliveMillis, "interactive.acquire"),
|
|
415
|
-
connect: async (sessionId) => makeProductionBrowser(await binding.connect(sessionId, "interactive.connect"), viewport),
|
|
587
|
+
connect: async (sessionId, signal) => makeProductionBrowser(await binding.connect(sessionId, "interactive.connect", signal).browser, sessionId, viewport),
|
|
416
588
|
closeSession: (sessionId) => lifecycle.close(sessionId).pipe(Effect.mapError((cause) => actionError("close", cause)))
|
|
417
589
|
};
|
|
418
590
|
})).pipe(Layer.provide(BrowserRunBinding.layer(options.browser)));
|
|
@@ -952,7 +1124,7 @@ const makeProductionContext = (context, viewport) => ({
|
|
|
952
1124
|
}
|
|
953
1125
|
}
|
|
954
1126
|
});
|
|
955
|
-
const makeProductionBrowser = (browser, viewport) => ({
|
|
1127
|
+
const makeProductionBrowser = (browser, sessionId, viewport) => ({
|
|
956
1128
|
detach: () => browser.disconnect(),
|
|
957
1129
|
reattach: async (identity) => {
|
|
958
1130
|
const context = browser.browserContexts().find((candidate) => candidate.id === identity.contextId);
|
|
@@ -976,7 +1148,7 @@ const makeProductionBrowser = (browser, viewport) => ({
|
|
|
976
1148
|
if (!isRemoteClosure(cause)) throw cause;
|
|
977
1149
|
}
|
|
978
1150
|
},
|
|
979
|
-
sessionId: () =>
|
|
1151
|
+
sessionId: () => sessionId,
|
|
980
1152
|
isConnected: () => browser.isConnected(),
|
|
981
1153
|
onDisconnected: (listener) => {
|
|
982
1154
|
browser.on("disconnected", listener);
|
|
@@ -1548,7 +1720,7 @@ const makeHostService = (binding) => {
|
|
|
1548
1720
|
if (!lifecycle.managedTeardownInstalled) releaseOwner();
|
|
1549
1721
|
}));
|
|
1550
1722
|
const browser = yield* Effect.acquireRelease(withinDeadline(Effect.tryPromise({
|
|
1551
|
-
try: (signal) => observeLate(signal, closeLateAcquisition(signal, () => binding.connect(sessionIdValue), (acquired) => runCleanup(resume === void 0 ? closeAcquired(acquired) : closeEntry(acquired.detach ?? (async () => {}), "Detaching the browser failed").close))),
|
|
1723
|
+
try: (signal) => observeLate(signal, closeLateAcquisition(signal, () => binding.connect(sessionIdValue, signal), (acquired) => runCleanup(resume === void 0 ? closeAcquired(acquired) : closeEntry(acquired.detach ?? (async () => {}), "Detaching the browser failed").close))),
|
|
1552
1724
|
catch: (cause) => resume !== void 0 && cause instanceof BrowserRunFailure && (cause.status === 404 || cause.status === 410) ? expiredError() : protocolError("Connecting to the Browser Run session failed", cause)
|
|
1553
1725
|
}).pipe(Effect.timeoutOrElse({
|
|
1554
1726
|
duration: "10 seconds",
|
|
@@ -1746,4 +1918,4 @@ const CloudflareInteractiveBrowser = {
|
|
|
1746
1918
|
//#endregion
|
|
1747
1919
|
export { reportBrowserCause as C, inheritBrowserReport as S, BrowserRunCleanupError as _, BrowserRunInteractiveCheckpoint as a, BrowserRunFailure as b, BrowserRunLiveViewResult as c, BrowserRunViewport as d, CloudflareInteractiveBrowser as f, isBrowserRunUndispatchedActionError as g, browserRunInteractiveLayer as h, BrowserRunInteractiveBinding as i, BrowserRunPageIdentity as l, browserRunInteractiveImplementation as m, BrowserRunHandoffResult as n, BrowserRunInteractiveHost as o, browserRunInteractiveHostLayer as p, BrowserRunHandoffState as r, BrowserRunLiveViewRequest as s, BrowserRunHandoffRequest as t, BrowserRunPageObservation as u, BrowserRunSessionLifecycle as v, reportedBrowserError as w, browserFailure as x, BrowserRunBinding as y };
|
|
1748
1920
|
|
|
1749
|
-
//# sourceMappingURL=InteractiveBrowser-
|
|
1921
|
+
//# sourceMappingURL=InteractiveBrowser-DXwmvWdA.mjs.map
|