effect-browserbase 0.2.0-beta.9 → 0.3.0-beta.6

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.
Files changed (155) hide show
  1. package/README.md +252 -317
  2. package/dist/Browserbase-FDltiz36.mjs +542 -0
  3. package/dist/Browserbase-FDltiz36.mjs.map +1 -0
  4. package/dist/Browserbase.d.mts +105 -0
  5. package/dist/Browserbase.mjs +3 -0
  6. package/dist/BrowserbaseClient-CtAQ2rg4.d.mts +195 -0
  7. package/dist/BrowserbaseClient.d.mts +2 -0
  8. package/dist/BrowserbaseClient.mjs +190 -0
  9. package/dist/BrowserbaseClient.mjs.map +1 -0
  10. package/dist/BrowserbaseError-D1EOrLNc.d.mts +79 -0
  11. package/dist/BrowserbaseError.d.mts +2 -0
  12. package/dist/BrowserbaseError.mjs +101 -0
  13. package/dist/BrowserbaseError.mjs.map +1 -0
  14. package/dist/ContextLease.d.mts +42 -0
  15. package/dist/ContextLease.mjs +80 -0
  16. package/dist/ContextLease.mjs.map +1 -0
  17. package/dist/index.d.mts +5 -27
  18. package/dist/index.mjs +5 -26
  19. package/dist/rolldown-runtime-D7D4PA-g.mjs +13 -0
  20. package/dist/testing/index.d.mts +136 -0
  21. package/dist/testing/index.mjs +440 -0
  22. package/dist/testing/index.mjs.map +1 -0
  23. package/package.json +51 -121
  24. package/src/Browserbase.ts +698 -0
  25. package/src/BrowserbaseClient.ts +559 -0
  26. package/src/BrowserbaseError.ts +108 -0
  27. package/src/ContextLease.ts +118 -0
  28. package/src/index.ts +7 -0
  29. package/src/internal/captureConnection.ts +214 -0
  30. package/src/testing/BrowserbaseContract.ts +170 -0
  31. package/src/testing/TestBrowserbase.ts +509 -0
  32. package/src/testing/index.ts +7 -0
  33. package/dist/Account.d.mts +0 -32
  34. package/dist/Account.mjs +0 -36
  35. package/dist/Account.mjs.map +0 -1
  36. package/dist/Acquisition-BOABu_qJ.mjs +0 -244
  37. package/dist/Acquisition-BOABu_qJ.mjs.map +0 -1
  38. package/dist/Agents-CPaTOH_g.d.mts +0 -156
  39. package/dist/Agents.d.mts +0 -3
  40. package/dist/Agents.mjs +0 -292
  41. package/dist/Agents.mjs.map +0 -1
  42. package/dist/Allocation.d.mts +0 -97
  43. package/dist/Allocation.mjs +0 -27
  44. package/dist/Allocation.mjs.map +0 -1
  45. package/dist/Authorization-Ll5f_XNM.mjs +0 -12
  46. package/dist/Authorization-Ll5f_XNM.mjs.map +0 -1
  47. package/dist/Browser-ByrWJ0ss.mjs +0 -274
  48. package/dist/Browser-ByrWJ0ss.mjs.map +0 -1
  49. package/dist/Browser.d.mts +0 -83
  50. package/dist/Browser.mjs +0 -3
  51. package/dist/BrowserBinding.d.mts +0 -13
  52. package/dist/BrowserBinding.mjs +0 -31
  53. package/dist/BrowserBinding.mjs.map +0 -1
  54. package/dist/Certificates-D4NQmyeA.d.mts +0 -34
  55. package/dist/Certificates.d.mts +0 -3
  56. package/dist/Certificates.mjs +0 -85
  57. package/dist/Certificates.mjs.map +0 -1
  58. package/dist/Cleanup-DMTDBir8.d.mts +0 -23
  59. package/dist/Cleanup.d.mts +0 -3
  60. package/dist/Cleanup.mjs +0 -43
  61. package/dist/Cleanup.mjs.map +0 -1
  62. package/dist/Client-BEC4Q8ZS.mjs +0 -564
  63. package/dist/Client-BEC4Q8ZS.mjs.map +0 -1
  64. package/dist/Client-B_f6bBLT.d.mts +0 -52
  65. package/dist/Client.d.mts +0 -3
  66. package/dist/Client.mjs +0 -2
  67. package/dist/Connection-sxyxtwlk.mjs +0 -56
  68. package/dist/Connection-sxyxtwlk.mjs.map +0 -1
  69. package/dist/ContextCoordination.d.mts +0 -29
  70. package/dist/ContextCoordination.mjs +0 -94
  71. package/dist/ContextCoordination.mjs.map +0 -1
  72. package/dist/ContextWriter-CiEma24z.mjs +0 -204
  73. package/dist/ContextWriter-CiEma24z.mjs.map +0 -1
  74. package/dist/Contexts-DqdL7cyX.d.mts +0 -31
  75. package/dist/Contexts.d.mts +0 -3
  76. package/dist/Contexts.mjs +0 -97
  77. package/dist/Contexts.mjs.map +0 -1
  78. package/dist/Deadline-CrViaogr.mjs +0 -13
  79. package/dist/Deadline-CrViaogr.mjs.map +0 -1
  80. package/dist/Downloads-CX52GOFJ.d.mts +0 -43
  81. package/dist/Downloads.d.mts +0 -3
  82. package/dist/Downloads.mjs +0 -137
  83. package/dist/Downloads.mjs.map +0 -1
  84. package/dist/Errors.d.mts +0 -100
  85. package/dist/Errors.mjs +0 -194
  86. package/dist/Errors.mjs.map +0 -1
  87. package/dist/Extensions-BTUn9zhK.mjs +0 -231
  88. package/dist/Extensions-BTUn9zhK.mjs.map +0 -1
  89. package/dist/Extensions-DBXuVM1f.d.mts +0 -43
  90. package/dist/Extensions.d.mts +0 -3
  91. package/dist/Extensions.mjs +0 -2
  92. package/dist/Functions-CsKMMUuZ.d.mts +0 -226
  93. package/dist/Functions.d.mts +0 -3
  94. package/dist/Functions.mjs +0 -318
  95. package/dist/Functions.mjs.map +0 -1
  96. package/dist/Issued-DejqoMYL.mjs +0 -15
  97. package/dist/Issued-DejqoMYL.mjs.map +0 -1
  98. package/dist/Launch-cAdE2rrZ.mjs +0 -115
  99. package/dist/Launch-cAdE2rrZ.mjs.map +0 -1
  100. package/dist/Launch.d.mts +0 -127
  101. package/dist/Launch.mjs +0 -97
  102. package/dist/Launch.mjs.map +0 -1
  103. package/dist/PageFetch-CjAM_0DS.d.mts +0 -40
  104. package/dist/PageFetch.d.mts +0 -3
  105. package/dist/PageFetch.mjs +0 -59
  106. package/dist/PageFetch.mjs.map +0 -1
  107. package/dist/Projects-tm5bTDH0.d.mts +0 -38
  108. package/dist/Projects.d.mts +0 -3
  109. package/dist/Projects.mjs +0 -65
  110. package/dist/Projects.mjs.map +0 -1
  111. package/dist/Recordings-B9k5aODB.d.mts +0 -27
  112. package/dist/Recordings.d.mts +0 -3
  113. package/dist/Recordings.mjs +0 -144
  114. package/dist/Recordings.mjs.map +0 -1
  115. package/dist/References-DOH3Wu44.d.mts +0 -34
  116. package/dist/References.d.mts +0 -3
  117. package/dist/References.mjs +0 -33
  118. package/dist/References.mjs.map +0 -1
  119. package/dist/Replays-mV93WGtx.d.mts +0 -27
  120. package/dist/Replays.d.mts +0 -3
  121. package/dist/Replays.mjs +0 -107
  122. package/dist/Replays.mjs.map +0 -1
  123. package/dist/Resource-J7Kkk5mu.mjs +0 -54
  124. package/dist/Resource-J7Kkk5mu.mjs.map +0 -1
  125. package/dist/Search-B64e7g-h.d.mts +0 -37
  126. package/dist/Search.d.mts +0 -3
  127. package/dist/Search.mjs +0 -46
  128. package/dist/Search.mjs.map +0 -1
  129. package/dist/SessionData-5xYZDshJ.d.mts +0 -38
  130. package/dist/SessionData.d.mts +0 -3
  131. package/dist/SessionData.mjs +0 -48
  132. package/dist/SessionData.mjs.map +0 -1
  133. package/dist/Sessions-D2H5m6rF.mjs +0 -260
  134. package/dist/Sessions-D2H5m6rF.mjs.map +0 -1
  135. package/dist/Sessions-oJEUmZth.d.mts +0 -69
  136. package/dist/Sessions.d.mts +0 -4
  137. package/dist/Sessions.mjs +0 -3
  138. package/dist/Testing.d.mts +0 -119
  139. package/dist/Testing.mjs +0 -206
  140. package/dist/Testing.mjs.map +0 -1
  141. package/dist/TransferPolicy-DQ06i7SZ.mjs +0 -25
  142. package/dist/TransferPolicy-DQ06i7SZ.mjs.map +0 -1
  143. package/dist/Transfers-GVqzrDWl.d.mts +0 -89
  144. package/dist/Transfers.d.mts +0 -3
  145. package/dist/Transfers.mjs +0 -85
  146. package/dist/Transfers.mjs.map +0 -1
  147. package/dist/Uploads-C2_bACgv.d.mts +0 -28
  148. package/dist/Uploads.d.mts +0 -3
  149. package/dist/Uploads.mjs +0 -105
  150. package/dist/Uploads.mjs.map +0 -1
  151. package/dist/Webhooks-BoeRAxzG.d.mts +0 -59
  152. package/dist/Webhooks.d.mts +0 -3
  153. package/dist/Webhooks.mjs +0 -134
  154. package/dist/Webhooks.mjs.map +0 -1
  155. package/dist/WriterFacts-BBJRDZYY.d.mts +0 -54
@@ -1,27 +0,0 @@
1
- import { a as SessionReference } from "./References-DOH3Wu44.mjs";
2
- import { ArtifactError } from "./Errors.mjs";
3
- import { t as BrowserbaseClient } from "./Client-B_f6bBLT.mjs";
4
- import { t as BrowserbaseSessions } from "./Sessions-oJEUmZth.mjs";
5
- import { c as RecordingPageReference, o as RecordingBatch, t as ArtifactTransferPolicy } from "./Transfers-GVqzrDWl.mjs";
6
- import { Context, Effect, Layer, Stream } from "effect";
7
- //#region src/Recordings.d.ts
8
- interface PollOptions {
9
- readonly timeoutMillis?: number;
10
- readonly intervalMillis?: number;
11
- }
12
- /** Recording transfers share the canonical artifact bounds. */
13
- type DownloadLimits = ArtifactTransferPolicy;
14
- declare const BrowserbaseRecordings_base: Context.ServiceClass<BrowserbaseRecordings, "effect-browserbase/Recordings", {
15
- readonly request: (reference: SessionReference, mode?: "initial" | "retry-failed") => Effect.Effect<RecordingBatch, ArtifactError>;
16
- readonly status: (reference: SessionReference) => Effect.Effect<RecordingBatch, ArtifactError>;
17
- readonly wait: (reference: SessionReference, options?: PollOptions) => Effect.Effect<RecordingBatch, ArtifactError>;
18
- readonly download: (reference: RecordingPageReference, limits: DownloadLimits) => Stream.Stream<Uint8Array, ArtifactError>;
19
- }>;
20
- /** Independent of a live browser. Merely building this Layer performs no provider calls. */
21
- declare class BrowserbaseRecordings extends BrowserbaseRecordings_base {
22
- static readonly layer: Layer.Layer<BrowserbaseRecordings, never, BrowserbaseClient | BrowserbaseSessions>;
23
- }
24
- //#endregion
25
- export { DownloadLimits as n, PollOptions as r, BrowserbaseRecordings as t };
26
- export {};
27
- //# sourceMappingURL=Recordings-B9k5aODB.d.mts.map
@@ -1,3 +0,0 @@
1
- import { n as DownloadLimits, r as PollOptions, t as BrowserbaseRecordings } from "./Recordings-B9k5aODB.mjs";
2
- export { BrowserbaseRecordings, DownloadLimits, PollOptions };
3
- export {};
@@ -1,144 +0,0 @@
1
- import { Identifier } from "./References.mjs";
2
- import { ArtifactError } from "./Errors.mjs";
3
- import { i as stream, n as annotate, r as span, t as BrowserbaseClient } from "./Client-BEC4Q8ZS.mjs";
4
- import { RecordingBatch, RecordingPage, RecordingPageReference } from "./Transfers.mjs";
5
- import { n as transferPolicy } from "./TransferPolicy-DQ06i7SZ.mjs";
6
- import { n as nowMillis, r as until, t as deadlineAfter } from "./Deadline-CrViaogr.mjs";
7
- import { t as BrowserbaseSessions } from "./Sessions-D2H5m6rF.mjs";
8
- import { t as requireTerminalSession } from "./Authorization-Ll5f_XNM.mjs";
9
- import { Context, Effect, Layer, Redacted, Schema, Semaphore, Stream } from "effect";
10
- //#region src/Recordings.ts
11
- const RawPage = Schema.Struct({
12
- pageId: Identifier,
13
- status: Schema.Literals([
14
- "NOT_REQUESTED",
15
- "PENDING",
16
- "COMPLETED",
17
- "FAILED"
18
- ]),
19
- completedAt: Schema.optionalKey(Schema.String.check(Schema.isMaxLength(64))),
20
- downloadUrl: Schema.optionalKey(Schema.String.check(Schema.isMaxLength(16384)))
21
- });
22
- const RawBatch = Schema.Struct({ downloads: Schema.Array(RawPage).check(Schema.isMaxLength(256)) });
23
- const failure = (operation, reason) => ArtifactError.make({
24
- operation,
25
- reason
26
- });
27
- const fromClient = (operation) => (error) => ArtifactError.make({
28
- operation,
29
- reason: error.reason,
30
- ...error.outcome === void 0 ? {} : { outcome: error.outcome },
31
- ...error.status === void 0 ? {} : { status: error.status },
32
- ...error.retryAfterMillis === void 0 ? {} : { retryAfterMillis: error.retryAfterMillis }
33
- });
34
- const within = (effect, deadline, operation) => until(effect, deadline, () => failure(operation, "timeout"));
35
- /** Independent of a live browser. Merely building this Layer performs no provider calls. */
36
- var BrowserbaseRecordings = class BrowserbaseRecordings extends Context.Service()("effect-browserbase/Recordings") {
37
- static layer = Layer.effect(BrowserbaseRecordings, Effect.gen(function* () {
38
- const client = yield* BrowserbaseClient;
39
- const sessions = yield* BrowserbaseSessions;
40
- const requests = yield* Semaphore.make(1);
41
- const path = (ref) => `/v1/sessions/${encodeURIComponent(ref.sessionId)}/recording/downloads`;
42
- const read = (ref, deadline) => client.json("GET", path(ref), void 0, deadline).pipe(Effect.mapError(fromClient("recording-status")), Effect.flatMap((raw) => Schema.decodeUnknownEffect(RawBatch)(raw).pipe(Effect.mapError(() => failure("recording-status", "malformed")))), Effect.filterOrFail((raw) => new Set(raw.downloads.map((page) => page.pageId)).size === raw.downloads.length, () => failure("recording-status", "malformed")));
43
- const project = (ref, raw, timedOut = false) => RecordingBatch.make({
44
- reference: ref,
45
- timedOut,
46
- pages: raw.downloads.map((page) => RecordingPage.make({
47
- pageId: page.pageId,
48
- status: page.status,
49
- delivery: page.status !== "COMPLETED" ? "not-ready" : page.downloadUrl === void 0 ? "external-storage" : "download",
50
- ...page.completedAt === void 0 ? {} : { completedAt: page.completedAt }
51
- }))
52
- });
53
- const authorize = (ref) => requireTerminalSession(sessions, ref, () => failure("recording", "active"), (error) => ArtifactError.make({
54
- operation: "recording",
55
- reason: error.reason
56
- }));
57
- const status = Effect.fnUntraced(function* (ref) {
58
- yield* authorize(ref);
59
- return project(ref, yield* read(ref));
60
- }, span("BrowserbaseRecordings.status"));
61
- const request = (ref, mode = "initial") => requests.withPermits(1)(Effect.gen(function* () {
62
- if (mode !== "initial" && mode !== "retry-failed") return yield* ArtifactError.make({
63
- operation: "recording-request",
64
- reason: "configuration",
65
- outcome: "undispatched"
66
- });
67
- yield* authorize(ref);
68
- const before = yield* read(ref);
69
- if (!(mode === "retry-failed" ? before.downloads.some((page) => page.status === "FAILED") : before.downloads.every((page) => page.status === "NOT_REQUESTED"))) return project(ref, before);
70
- const raw = yield* client.json("POST", path(ref)).pipe(Effect.mapError((error) => ArtifactError.make({
71
- operation: "recording-request",
72
- reason: error.status !== void 0 && error.status >= 400 && error.status < 500 ? error.reason : "assembly-unknown",
73
- outcome: error.status !== void 0 && error.status >= 400 && error.status < 500 ? "rejected" : "unknown",
74
- ...error.status === void 0 ? {} : { status: error.status },
75
- ...error.retryAfterMillis === void 0 ? {} : { retryAfterMillis: error.retryAfterMillis }
76
- })), Effect.flatMap((value) => Schema.decodeUnknownEffect(RawBatch)(value).pipe(Effect.mapError(() => ArtifactError.make({
77
- operation: "recording-request",
78
- reason: "malformed",
79
- outcome: "unknown"
80
- })))));
81
- return project(ref, raw);
82
- })).pipe(span("BrowserbaseRecordings.request"));
83
- const wait = (ref, options = {}) => Effect.suspend(() => {
84
- let failedPolls = 0;
85
- let lastFailure;
86
- let timedOut = false;
87
- return Effect.gen(function* () {
88
- const timeout = options.timeoutMillis ?? 12e4;
89
- const interval = options.intervalMillis ?? 3e3;
90
- if (!Number.isSafeInteger(timeout) || timeout < 1 || timeout > 6e5 || !Number.isSafeInteger(interval) || interval < 10 || interval > 3e4) return yield* failure("recording-wait", "configuration");
91
- const deadline = yield* deadlineAfter(timeout);
92
- yield* within(authorize(ref), deadline, "recording-wait").pipe(Effect.withTracerEnabled(false));
93
- let latest = { downloads: [] };
94
- for (;;) {
95
- const result = yield* within(read(ref, deadline), deadline, "recording-wait").pipe(Effect.withTracerEnabled(false), Effect.tapError((error) => Effect.sync(() => {
96
- failedPolls = Math.min(Number.MAX_SAFE_INTEGER, failedPolls + 1);
97
- lastFailure = error.reason;
98
- })), Effect.result);
99
- if (result._tag === "Success") {
100
- latest = result.success;
101
- if (latest.downloads.every((page) => page.status === "COMPLETED" || page.status === "FAILED")) return project(ref, latest);
102
- } else if (![
103
- "timeout",
104
- "rate-limited",
105
- "provider",
106
- "transport"
107
- ].includes(result.failure.reason)) return yield* result.failure;
108
- const remaining = deadline - (yield* nowMillis);
109
- if (remaining <= 0) {
110
- timedOut = true;
111
- return project(ref, latest, true);
112
- }
113
- yield* Effect.sleep(Math.min(interval, remaining));
114
- }
115
- }).pipe(Effect.onExit(() => annotate({
116
- "browser.wait.timed-out": timedOut,
117
- "browser.wait.failed-polls": failedPolls,
118
- ...lastFailure === void 0 ? {} : { "browser.wait.last-failure": lastFailure }
119
- })), span("BrowserbaseRecordings.wait", { attributes: { "browser.operation": "recording-wait" } }));
120
- });
121
- const download = (ref, limits) => Stream.unwrap(Effect.gen(function* () {
122
- yield* Schema.decodeEffect(RecordingPageReference)(ref).pipe(Effect.mapError(() => failure("recording-download", "configuration")));
123
- const { maxBytes, timeoutMillis } = yield* transferPolicy(limits, () => failure("recording-download", "configuration"));
124
- const deadline = yield* deadlineAfter(timeoutMillis);
125
- yield* within(authorize(ref.session), deadline, "recording-download");
126
- const page = (yield* within(read(ref.session, deadline), deadline, "recording-download")).downloads.find((entry) => entry.pageId === ref.pageId);
127
- if (page === void 0) return yield* failure("recording-download", "not-found");
128
- if (page.status === "FAILED") return yield* failure("recording-download", "failed");
129
- if (page.status !== "COMPLETED") return yield* failure("recording-download", "active");
130
- if (page.downloadUrl === void 0) return yield* failure("recording-download", "byos");
131
- return client.media(Redacted.make(page.downloadUrl), maxBytes, ["video/mp4", "application/octet-stream"], timeoutMillis, deadline).pipe(Stream.mapError(fromClient("recording-download")));
132
- })).pipe(stream("BrowserbaseRecordings.download"));
133
- return BrowserbaseRecordings.of({
134
- request,
135
- status,
136
- wait,
137
- download
138
- });
139
- }));
140
- };
141
- //#endregion
142
- export { BrowserbaseRecordings };
143
-
144
- //# sourceMappingURL=Recordings.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Recordings.mjs","names":["Trace.span","Trace.annotate","Trace.stream"],"sources":["../src/Recordings.ts"],"sourcesContent":["import { Context, Effect, Layer, Redacted, Schema, Semaphore, Stream } from \"effect\";\n\nimport { BrowserbaseClient } from \"./Client.ts\";\nimport { ArtifactError, type ClientError } from \"./Errors.ts\";\nimport { requireTerminalSession } from \"./internal/artifact/Authorization.ts\";\nimport { transferPolicy } from \"./internal/artifact/TransferPolicy.ts\";\nimport { deadlineAfter, nowMillis, until } from \"./internal/Deadline.ts\";\nimport * as Trace from \"./internal/Trace.ts\";\nimport { Identifier, type SessionReference } from \"./References.ts\";\nimport { BrowserbaseSessions } from \"./Sessions.ts\";\nimport {\n type ArtifactTransferPolicy,\n RecordingBatch,\n RecordingPage,\n RecordingPageReference,\n} from \"./Transfers.ts\";\n\nconst RawPage = Schema.Struct({\n pageId: Identifier,\n status: Schema.Literals([\"NOT_REQUESTED\", \"PENDING\", \"COMPLETED\", \"FAILED\"]),\n completedAt: Schema.optionalKey(Schema.String.check(Schema.isMaxLength(64))),\n downloadUrl: Schema.optionalKey(Schema.String.check(Schema.isMaxLength(16384))),\n});\n\nconst RawBatch = Schema.Struct({ downloads: Schema.Array(RawPage).check(Schema.isMaxLength(256)) });\n\nexport interface PollOptions {\n readonly timeoutMillis?: number;\n readonly intervalMillis?: number;\n}\n\n/** Recording transfers share the canonical artifact bounds. */\nexport type DownloadLimits = ArtifactTransferPolicy;\n\nconst failure = (operation: ArtifactError[\"operation\"], reason: ArtifactError[\"reason\"]) =>\n ArtifactError.make({ operation, reason });\n\nconst fromClient = (operation: ArtifactError[\"operation\"]) => (error: ClientError) =>\n ArtifactError.make({\n operation,\n reason: error.reason,\n ...(error.outcome === undefined ? {} : { outcome: error.outcome }),\n ...(error.status === undefined ? {} : { status: error.status }),\n ...(error.retryAfterMillis === undefined ? {} : { retryAfterMillis: error.retryAfterMillis }),\n });\n\nconst within = <A, E, R>(\n effect: Effect.Effect<A, E, R>,\n deadline: number,\n operation: ArtifactError[\"operation\"],\n) => until(effect, deadline, () => failure(operation, \"timeout\"));\n\n/** Independent of a live browser. Merely building this Layer performs no provider calls. */\nexport class BrowserbaseRecordings extends Context.Service<\n BrowserbaseRecordings,\n {\n readonly request: (\n reference: SessionReference,\n mode?: \"initial\" | \"retry-failed\",\n ) => Effect.Effect<RecordingBatch, ArtifactError>;\n readonly status: (reference: SessionReference) => Effect.Effect<RecordingBatch, ArtifactError>;\n readonly wait: (\n reference: SessionReference,\n options?: PollOptions,\n ) => Effect.Effect<RecordingBatch, ArtifactError>;\n readonly download: (\n reference: RecordingPageReference,\n limits: DownloadLimits,\n ) => Stream.Stream<Uint8Array, ArtifactError>;\n }\n>()(\"effect-browserbase/Recordings\") {\n static readonly layer: Layer.Layer<\n BrowserbaseRecordings,\n never,\n BrowserbaseClient | BrowserbaseSessions\n > = Layer.effect(\n BrowserbaseRecordings,\n Effect.gen(function* () {\n const client = yield* BrowserbaseClient;\n const sessions = yield* BrowserbaseSessions;\n const requests = yield* Semaphore.make(1);\n\n const path = (ref: SessionReference) =>\n `/v1/sessions/${encodeURIComponent(ref.sessionId)}/recording/downloads`;\n\n const read = (ref: SessionReference, deadline?: number) =>\n client.json(\"GET\", path(ref), undefined, deadline).pipe(\n Effect.mapError(fromClient(\"recording-status\")),\n Effect.flatMap((raw) =>\n Schema.decodeUnknownEffect(RawBatch)(raw).pipe(\n Effect.mapError(() => failure(\"recording-status\", \"malformed\")),\n ),\n ),\n Effect.filterOrFail(\n (raw) =>\n new Set(raw.downloads.map((page) => page.pageId)).size === raw.downloads.length,\n () => failure(\"recording-status\", \"malformed\"),\n ),\n );\n\n const project = (ref: SessionReference, raw: typeof RawBatch.Type, timedOut = false) =>\n RecordingBatch.make({\n reference: ref,\n timedOut,\n pages: raw.downloads.map((page) =>\n RecordingPage.make({\n pageId: page.pageId,\n status: page.status,\n delivery:\n page.status !== \"COMPLETED\"\n ? \"not-ready\"\n : page.downloadUrl === undefined\n ? \"external-storage\"\n : \"download\",\n ...(page.completedAt === undefined ? {} : { completedAt: page.completedAt }),\n }),\n ),\n });\n\n const authorize = (ref: SessionReference) =>\n requireTerminalSession(\n sessions,\n ref,\n () => failure(\"recording\", \"active\"),\n (error) => ArtifactError.make({ operation: \"recording\", reason: error.reason }),\n );\n\n const status = Effect.fnUntraced(function* (ref: SessionReference) {\n yield* authorize(ref);\n\n return project(ref, yield* read(ref));\n }, Trace.span(\"BrowserbaseRecordings.status\"));\n\n const request = (ref: SessionReference, mode: \"initial\" | \"retry-failed\" = \"initial\") =>\n requests\n .withPermits(1)(\n Effect.gen(function* () {\n if (mode !== \"initial\" && mode !== \"retry-failed\")\n return yield* ArtifactError.make({\n operation: \"recording-request\",\n reason: \"configuration\",\n outcome: \"undispatched\",\n });\n yield* authorize(ref);\n // A prior uncertain POST is reconciled by this GET before any resubmission.\n const before = yield* read(ref);\n\n const needed =\n mode === \"retry-failed\"\n ? before.downloads.some((page) => page.status === \"FAILED\")\n : before.downloads.every((page) => page.status === \"NOT_REQUESTED\");\n\n if (!needed) return project(ref, before);\n\n const raw = yield* client.json(\"POST\", path(ref)).pipe(\n Effect.mapError((error) =>\n ArtifactError.make({\n operation: \"recording-request\",\n reason:\n error.status !== undefined && error.status >= 400 && error.status < 500\n ? error.reason\n : \"assembly-unknown\",\n outcome:\n error.status !== undefined && error.status >= 400 && error.status < 500\n ? \"rejected\"\n : \"unknown\",\n ...(error.status === undefined ? {} : { status: error.status }),\n ...(error.retryAfterMillis === undefined\n ? {}\n : { retryAfterMillis: error.retryAfterMillis }),\n }),\n ),\n Effect.flatMap((value) =>\n Schema.decodeUnknownEffect(RawBatch)(value).pipe(\n Effect.mapError(() =>\n ArtifactError.make({\n operation: \"recording-request\",\n reason: \"malformed\",\n outcome: \"unknown\",\n }),\n ),\n ),\n ),\n );\n\n return project(ref, raw);\n }),\n )\n .pipe(Trace.span(\"BrowserbaseRecordings.request\"));\n\n const wait = (ref: SessionReference, options: PollOptions = {}) =>\n Effect.suspend(() => {\n let failedPolls = 0;\n let lastFailure: ArtifactError[\"reason\"] | undefined;\n let timedOut = false;\n\n return Effect.gen(function* () {\n const timeout = options.timeoutMillis ?? 120_000;\n const interval = options.intervalMillis ?? 3000;\n\n if (\n !Number.isSafeInteger(timeout) ||\n timeout < 1 ||\n timeout > 600_000 ||\n !Number.isSafeInteger(interval) ||\n interval < 10 ||\n interval > 30_000\n ) {\n return yield* failure(\"recording-wait\", \"configuration\");\n }\n const deadline = yield* deadlineAfter(timeout);\n\n yield* within(authorize(ref), deadline, \"recording-wait\").pipe(\n Effect.withTracerEnabled(false),\n );\n let latest: typeof RawBatch.Type = { downloads: [] };\n\n for (;;) {\n const result = yield* within(read(ref, deadline), deadline, \"recording-wait\").pipe(\n Effect.withTracerEnabled(false),\n Effect.tapError((error) =>\n Effect.sync(() => {\n failedPolls = Math.min(Number.MAX_SAFE_INTEGER, failedPolls + 1);\n lastFailure = error.reason;\n }),\n ),\n Effect.result,\n );\n\n if (result._tag === \"Success\") {\n latest = result.success;\n if (\n latest.downloads.every(\n (page) => page.status === \"COMPLETED\" || page.status === \"FAILED\",\n )\n )\n return project(ref, latest);\n } else if (\n ![\"timeout\", \"rate-limited\", \"provider\", \"transport\"].includes(\n result.failure.reason,\n )\n ) {\n return yield* result.failure;\n }\n const remaining = deadline - (yield* nowMillis);\n\n if (remaining <= 0) {\n timedOut = true;\n\n return project(ref, latest, true);\n }\n yield* Effect.sleep(Math.min(interval, remaining));\n }\n }).pipe(\n Effect.onExit(() =>\n Trace.annotate({\n \"browser.wait.timed-out\": timedOut,\n \"browser.wait.failed-polls\": failedPolls,\n ...(lastFailure === undefined ? {} : { \"browser.wait.last-failure\": lastFailure }),\n }),\n ),\n Trace.span(\"BrowserbaseRecordings.wait\", {\n attributes: { \"browser.operation\": \"recording-wait\" },\n }),\n );\n });\n\n const download = (ref: RecordingPageReference, limits: DownloadLimits) =>\n Stream.unwrap(\n Effect.gen(function* () {\n yield* Schema.decodeEffect(RecordingPageReference)(ref).pipe(\n Effect.mapError(() => failure(\"recording-download\", \"configuration\")),\n );\n\n const { maxBytes, timeoutMillis } = yield* transferPolicy(limits, () =>\n failure(\"recording-download\", \"configuration\"),\n );\n\n const deadline = yield* deadlineAfter(timeoutMillis);\n\n yield* within(authorize(ref.session), deadline, \"recording-download\");\n\n const latest = yield* within(\n read(ref.session, deadline),\n deadline,\n \"recording-download\",\n );\n\n const page = latest.downloads.find((entry) => entry.pageId === ref.pageId);\n\n if (page === undefined) return yield* failure(\"recording-download\", \"not-found\");\n if (page.status === \"FAILED\") return yield* failure(\"recording-download\", \"failed\");\n if (page.status !== \"COMPLETED\") return yield* failure(\"recording-download\", \"active\");\n if (page.downloadUrl === undefined) return yield* failure(\"recording-download\", \"byos\");\n\n // A fresh GET mints access for this subscription. No URL is persisted in the reference.\n return client\n .media(\n Redacted.make(page.downloadUrl),\n maxBytes,\n [\"video/mp4\", \"application/octet-stream\"],\n timeoutMillis,\n deadline,\n )\n .pipe(Stream.mapError(fromClient(\"recording-download\")));\n }),\n ).pipe(Trace.stream(\"BrowserbaseRecordings.download\"));\n\n return BrowserbaseRecordings.of({ request, status, wait, download });\n }),\n );\n}\n"],"mappings":"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"}
@@ -1,34 +0,0 @@
1
- import { Schema } from "effect";
2
- import { Identifier as Identifier$1 } from "effect-browser/browser-data";
3
- //#region src/References.d.ts
4
- declare const SessionReference_base: Schema.Class<SessionReference, Schema.Struct<{
5
- readonly provider: Schema.Literal<"browserbase">;
6
- readonly projectId: Schema.NonEmptyString;
7
- readonly sessionId: Schema.NonEmptyString;
8
- }>, {}>;
9
- declare class SessionReference extends SessionReference_base {}
10
- declare const AllocationAttempt_base: Schema.Class<AllocationAttempt, Schema.Struct<{
11
- readonly projectId: Schema.NonEmptyString;
12
- readonly attemptId: Schema.NonEmptyString;
13
- readonly requestedAtMillis: Schema.Finite;
14
- readonly timeoutSeconds: Schema.Int;
15
- }>, {}>;
16
- /** The nonce is reconciliation metadata, not provider idempotency. */
17
- declare class AllocationAttempt extends AllocationAttempt_base {}
18
- declare const ContextReference_base: Schema.Class<ContextReference, Schema.Struct<{
19
- readonly provider: Schema.Literal<"browserbase">;
20
- readonly projectId: Schema.NonEmptyString;
21
- readonly contextId: Schema.NonEmptyString;
22
- }>, {}>;
23
- /** Project-qualified durable identity; no browser connection or credential is retained. */
24
- declare class ContextReference extends ContextReference_base {}
25
- declare const ExtensionReference_base: Schema.Class<ExtensionReference, Schema.Struct<{
26
- readonly provider: Schema.Literal<"browserbase">;
27
- readonly projectId: Schema.NonEmptyString;
28
- readonly extensionId: Schema.NonEmptyString;
29
- }>, {}>;
30
- declare class ExtensionReference extends ExtensionReference_base {}
31
- //#endregion
32
- export { SessionReference as a, Identifier$1 as i, ContextReference as n, ExtensionReference as r, AllocationAttempt as t };
33
- export {};
34
- //# sourceMappingURL=References-DOH3Wu44.d.mts.map
@@ -1,3 +0,0 @@
1
- import { a as SessionReference, i as Identifier, n as ContextReference, r as ExtensionReference, t as AllocationAttempt } from "./References-DOH3Wu44.mjs";
2
- export { AllocationAttempt, ContextReference, ExtensionReference, Identifier, SessionReference };
3
- export {};
@@ -1,33 +0,0 @@
1
- import { Schema } from "effect";
2
- import { Identifier, Identifier as Identifier$1 } from "effect-browser/browser-data";
3
- //#region src/References.ts
4
- var SessionReference = class extends Schema.Class("BrowserbaseSessionReference")({
5
- provider: Schema.Literal("browserbase"),
6
- projectId: Identifier$1,
7
- sessionId: Identifier$1
8
- }) {};
9
- /** The nonce is reconciliation metadata, not provider idempotency. */
10
- var AllocationAttempt = class extends Schema.Class("BrowserbaseAllocationAttempt")({
11
- projectId: Identifier$1,
12
- attemptId: Identifier$1,
13
- requestedAtMillis: Schema.Finite,
14
- timeoutSeconds: Schema.Int.check(Schema.isBetween({
15
- minimum: 60,
16
- maximum: 21600
17
- }))
18
- }) {};
19
- /** Project-qualified durable identity; no browser connection or credential is retained. */
20
- var ContextReference = class extends Schema.Class("BrowserbaseContextReference")({
21
- provider: Schema.Literal("browserbase"),
22
- projectId: Identifier$1,
23
- contextId: Identifier$1
24
- }) {};
25
- var ExtensionReference = class extends Schema.Class("BrowserbaseExtensionReference")({
26
- provider: Schema.Literal("browserbase"),
27
- projectId: Identifier$1,
28
- extensionId: Identifier$1
29
- }) {};
30
- //#endregion
31
- export { AllocationAttempt, ContextReference, ExtensionReference, Identifier, SessionReference };
32
-
33
- //# sourceMappingURL=References.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"References.mjs","names":["Identifier"],"sources":["../src/References.ts"],"sourcesContent":["import { Schema } from \"effect\";\nimport { Identifier } from \"effect-browser/browser-data\";\n\nexport { Identifier } from \"effect-browser/browser-data\";\n\nexport class SessionReference extends Schema.Class<SessionReference>(\"BrowserbaseSessionReference\")(\n {\n provider: Schema.Literal(\"browserbase\"),\n projectId: Identifier,\n sessionId: Identifier,\n },\n) {}\n\n/** The nonce is reconciliation metadata, not provider idempotency. */\nexport class AllocationAttempt extends Schema.Class<AllocationAttempt>(\n \"BrowserbaseAllocationAttempt\",\n)({\n projectId: Identifier,\n attemptId: Identifier,\n requestedAtMillis: Schema.Finite,\n timeoutSeconds: Schema.Int.check(Schema.isBetween({ minimum: 60, maximum: 21600 })),\n}) {}\n\n/** Project-qualified durable identity; no browser connection or credential is retained. */\nexport class ContextReference extends Schema.Class<ContextReference>(\"BrowserbaseContextReference\")(\n {\n provider: Schema.Literal(\"browserbase\"),\n projectId: Identifier,\n contextId: Identifier,\n },\n) {}\n\nexport class ExtensionReference extends Schema.Class<ExtensionReference>(\n \"BrowserbaseExtensionReference\",\n)({\n provider: Schema.Literal(\"browserbase\"),\n projectId: Identifier,\n extensionId: Identifier,\n}) {}\n"],"mappings":";;;AAKA,IAAa,mBAAb,cAAsC,OAAO,MAAwB,6BAA6B,CAAC,CACjG;CACE,UAAU,OAAO,QAAQ,aAAa;CACtC,WAAWA;CACX,WAAWA;AACb,CACF,CAAC,CAAC,CAAC;;AAGH,IAAa,oBAAb,cAAuC,OAAO,MAC5C,8BACF,CAAC,CAAC;CACA,WAAWA;CACX,WAAWA;CACX,mBAAmB,OAAO;CAC1B,gBAAgB,OAAO,IAAI,MAAM,OAAO,UAAU;EAAE,SAAS;EAAI,SAAS;CAAM,CAAC,CAAC;AACpF,CAAC,CAAC,CAAC,CAAC;;AAGJ,IAAa,mBAAb,cAAsC,OAAO,MAAwB,6BAA6B,CAAC,CACjG;CACE,UAAU,OAAO,QAAQ,aAAa;CACtC,WAAWA;CACX,WAAWA;AACb,CACF,CAAC,CAAC,CAAC;AAEH,IAAa,qBAAb,cAAwC,OAAO,MAC7C,+BACF,CAAC,CAAC;CACA,UAAU,OAAO,QAAQ,aAAa;CACtC,WAAWA;CACX,aAAaA;AACf,CAAC,CAAC,CAAC,CAAC"}
@@ -1,27 +0,0 @@
1
- import { a as SessionReference } from "./References-DOH3Wu44.mjs";
2
- import { ArtifactError } from "./Errors.mjs";
3
- import { t as BrowserbaseClient } from "./Client-B_f6bBLT.mjs";
4
- import { t as BrowserbaseSessions } from "./Sessions-oJEUmZth.mjs";
5
- import { c as RecordingPageReference, t as ArtifactTransferPolicy, u as ReplayPage } from "./Transfers-GVqzrDWl.mjs";
6
- import { Context, Effect, Layer, Redacted, Stream } from "effect";
7
- //#region src/Replays.d.ts
8
- interface ReplayAccess {
9
- readonly reference: RecordingPageReference;
10
- /** Temporary playback material for an authorized host route; never includes the API key. */
11
- readonly playlist: Redacted.Redacted<string>;
12
- readonly fetchedAtMillis: number;
13
- readonly mediaCount: number;
14
- /** Optional host proxy of an indexed URI from this exact playlist; no arbitrary URL parameter. */
15
- readonly media: (index: number, limits: ArtifactTransferPolicy) => Stream.Stream<Uint8Array, ArtifactError>;
16
- }
17
- declare const BrowserbaseReplays_base: Context.ServiceClass<BrowserbaseReplays, "effect-browserbase/Replays", {
18
- readonly metadata: (reference: SessionReference) => Effect.Effect<ReadonlyArray<ReplayPage>, ArtifactError>;
19
- readonly openPage: (reference: RecordingPageReference) => Effect.Effect<ReplayAccess, ArtifactError>;
20
- }>;
21
- declare class BrowserbaseReplays extends BrowserbaseReplays_base {
22
- static readonly layer: Layer.Layer<BrowserbaseReplays, never, BrowserbaseClient | BrowserbaseSessions>;
23
- }
24
- //#endregion
25
- export { ReplayAccess as n, BrowserbaseReplays as t };
26
- export {};
27
- //# sourceMappingURL=Replays-mV93WGtx.d.mts.map
@@ -1,3 +0,0 @@
1
- import { n as ReplayAccess, t as BrowserbaseReplays } from "./Replays-mV93WGtx.mjs";
2
- export { BrowserbaseReplays, ReplayAccess };
3
- export {};
package/dist/Replays.mjs DELETED
@@ -1,107 +0,0 @@
1
- import { Identifier } from "./References.mjs";
2
- import { ArtifactError } from "./Errors.mjs";
3
- import { i as stream, r as span, t as BrowserbaseClient } from "./Client-BEC4Q8ZS.mjs";
4
- import { RecordingPageReference, ReplayPage } from "./Transfers.mjs";
5
- import { n as transferPolicy } from "./TransferPolicy-DQ06i7SZ.mjs";
6
- import { t as BrowserbaseSessions } from "./Sessions-D2H5m6rF.mjs";
7
- import { t as requireTerminalSession } from "./Authorization-Ll5f_XNM.mjs";
8
- import { Clock, Context, Effect, Layer, Redacted, Schema, Stream } from "effect";
9
- //#region src/Replays.ts
10
- const Metadata = Schema.Struct({
11
- pageCount: Schema.Natural,
12
- pages: Schema.Array(Schema.Struct({
13
- pageId: Identifier,
14
- startTimeMs: Schema.Finite,
15
- endTimeMs: Schema.Finite,
16
- url: Schema.String.check(Schema.isMaxLength(16384))
17
- })).check(Schema.isMaxLength(256))
18
- });
19
- const failure = (operation, reason) => ArtifactError.make({
20
- operation,
21
- reason
22
- });
23
- const fromClient = (operation) => (error) => ArtifactError.make({
24
- operation,
25
- reason: error.reason,
26
- ...error.outcome === void 0 ? {} : { outcome: error.outcome },
27
- ...error.status === void 0 ? {} : { status: error.status },
28
- ...error.retryAfterMillis === void 0 ? {} : { retryAfterMillis: error.retryAfterMillis }
29
- });
30
- /** Media-playlist validation, not a player. Unsupported URI-bearing tags fail closed. */
31
- const playlistUrls = (body, allowed) => {
32
- const lines = body.split(/\r?\n/);
33
- if (lines[0] !== "#EXTM3U" || !lines.includes("#EXT-X-ENDLIST") || lines.length > 32768) throw failure("replay-playlist", "malformed");
34
- const urls = [];
35
- for (const raw of lines.slice(1)) {
36
- const line = raw.trim();
37
- if (line === "") continue;
38
- if (line.startsWith("#EXT-X-STREAM-INF") || line.startsWith("#EXT-X-MEDIA:") || line.startsWith("#EXT-X-KEY:") && line !== "#EXT-X-KEY:METHOD=NONE") throw failure("replay-playlist", "unsupported");
39
- let url;
40
- if (!line.startsWith("#")) url = line;
41
- else if (/URI\s*=/.test(line)) {
42
- if (!line.startsWith("#EXT-X-MAP:")) throw failure("replay-playlist", "unsupported");
43
- const match = /(?:^|,)URI="([^"]+)"(?:,|$)/.exec(line.slice(11));
44
- if (match === null) throw failure("replay-playlist", "malformed");
45
- url = match[1];
46
- }
47
- if (url !== void 0) {
48
- if (!allowed(url) || urls.length >= 16384) throw failure("replay-playlist", "unsafe-url");
49
- urls.push(url);
50
- }
51
- }
52
- if (urls.length === 0) throw failure("replay-playlist", "malformed");
53
- return urls;
54
- };
55
- var BrowserbaseReplays = class BrowserbaseReplays extends Context.Service()("effect-browserbase/Replays") {
56
- static layer = Layer.effect(BrowserbaseReplays, Effect.gen(function* () {
57
- const client = yield* BrowserbaseClient;
58
- const sessions = yield* BrowserbaseSessions;
59
- const metadata = Effect.fnUntraced(function* (ref) {
60
- yield* requireTerminalSession(sessions, ref, () => failure("replay", "active"), (error) => ArtifactError.make({
61
- operation: "replay",
62
- reason: error.reason
63
- }));
64
- const raw = yield* client.json("GET", `/v1/sessions/${encodeURIComponent(ref.sessionId)}/replays`).pipe(Effect.mapError(fromClient("replay-metadata")), Effect.flatMap((value) => Schema.decodeUnknownEffect(Metadata)(value).pipe(Effect.mapError(() => failure("replay-metadata", "malformed")))));
65
- if (raw.pageCount !== raw.pages.length || new Set(raw.pages.map((page) => page.pageId)).size !== raw.pages.length || raw.pages.some((page) => page.startTimeMs < 0 || page.endTimeMs < page.startTimeMs)) return yield* failure("replay-metadata", "malformed");
66
- return raw.pages.map((page) => ReplayPage.make({
67
- pageId: page.pageId,
68
- startTimeMs: page.startTimeMs,
69
- endTimeMs: page.endTimeMs
70
- }));
71
- }, span("BrowserbaseReplays.metadata"));
72
- const openPage = Effect.fnUntraced(function* (ref) {
73
- yield* Schema.decodeEffect(RecordingPageReference)(ref).pipe(Effect.mapError(() => failure("replay", "configuration")));
74
- if (!(yield* metadata(ref.session)).some((page) => page.pageId === ref.pageId)) return yield* failure("replay", "not-found");
75
- const body = yield* client.text(`/v1/sessions/${encodeURIComponent(ref.session.sessionId)}/replays/${encodeURIComponent(ref.pageId)}`, 1048576, ["application/vnd.apple.mpegurl", "application/x-mpegurl"]).pipe(Effect.mapError(fromClient("replay-playlist")));
76
- const urls = yield* Effect.try({
77
- try: () => playlistUrls(body, client.validateMediaUrl),
78
- catch: () => failure("replay-playlist", "malformed")
79
- });
80
- return {
81
- reference: ref,
82
- playlist: Redacted.make(body),
83
- fetchedAtMillis: yield* Clock.currentTimeMillis,
84
- mediaCount: urls.length,
85
- media: (index, limits) => {
86
- const url = Number.isSafeInteger(index) ? urls[index] : void 0;
87
- return (url === void 0 ? Stream.fail(failure("replay-media", "not-found")) : Stream.unwrap(transferPolicy({
88
- maxBytes: limits.maxBytes,
89
- ...limits.timeoutMillis === void 0 ? {} : { timeoutMillis: limits.timeoutMillis }
90
- }, () => failure("replay-media", "configuration")).pipe(Effect.map(({ maxBytes, timeoutMillis }) => client.media(Redacted.make(url), maxBytes, [
91
- "video/mp4",
92
- "video/iso.segment",
93
- "application/octet-stream"
94
- ], timeoutMillis).pipe(Stream.mapError(fromClient("replay-media"))))))).pipe(stream("BrowserbaseReplays.media"));
95
- }
96
- };
97
- }, span("BrowserbaseReplays.openPage"));
98
- return BrowserbaseReplays.of({
99
- metadata,
100
- openPage
101
- });
102
- }));
103
- };
104
- //#endregion
105
- export { BrowserbaseReplays };
106
-
107
- //# sourceMappingURL=Replays.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Replays.mjs","names":["Trace.span","Trace.stream"],"sources":["../src/Replays.ts"],"sourcesContent":["import { Clock, Context, Effect, Layer, Redacted, Schema, Stream } from \"effect\";\n\nimport { BrowserbaseClient } from \"./Client.ts\";\nimport { ArtifactError, type ClientError } from \"./Errors.ts\";\nimport { requireTerminalSession } from \"./internal/artifact/Authorization.ts\";\nimport { transferPolicy } from \"./internal/artifact/TransferPolicy.ts\";\nimport * as Trace from \"./internal/Trace.ts\";\nimport { Identifier, type SessionReference } from \"./References.ts\";\nimport { BrowserbaseSessions } from \"./Sessions.ts\";\nimport {\n type ArtifactTransferPolicy as DownloadLimits,\n RecordingPageReference,\n ReplayPage,\n} from \"./Transfers.ts\";\n\nconst Metadata = Schema.Struct({\n pageCount: Schema.Natural,\n pages: Schema.Array(\n Schema.Struct({\n pageId: Identifier,\n startTimeMs: Schema.Finite,\n endTimeMs: Schema.Finite,\n url: Schema.String.check(Schema.isMaxLength(16384)),\n }),\n ).check(Schema.isMaxLength(256)),\n});\n\nconst failure = (operation: ArtifactError[\"operation\"], reason: ArtifactError[\"reason\"]) =>\n ArtifactError.make({ operation, reason });\n\nconst fromClient = (operation: ArtifactError[\"operation\"]) => (error: ClientError) =>\n ArtifactError.make({\n operation,\n reason: error.reason,\n ...(error.outcome === undefined ? {} : { outcome: error.outcome }),\n ...(error.status === undefined ? {} : { status: error.status }),\n ...(error.retryAfterMillis === undefined ? {} : { retryAfterMillis: error.retryAfterMillis }),\n });\n\nexport interface ReplayAccess {\n readonly reference: RecordingPageReference;\n /** Temporary playback material for an authorized host route; never includes the API key. */\n readonly playlist: Redacted.Redacted<string>;\n readonly fetchedAtMillis: number;\n readonly mediaCount: number;\n /** Optional host proxy of an indexed URI from this exact playlist; no arbitrary URL parameter. */\n readonly media: (\n index: number,\n limits: DownloadLimits,\n ) => Stream.Stream<Uint8Array, ArtifactError>;\n}\n\n/** Media-playlist validation, not a player. Unsupported URI-bearing tags fail closed. */\nconst playlistUrls = (body: string, allowed: (url: string) => boolean): ReadonlyArray<string> => {\n const lines = body.split(/\\r?\\n/);\n\n if (lines[0] !== \"#EXTM3U\" || !lines.includes(\"#EXT-X-ENDLIST\") || lines.length > 32768) {\n throw failure(\"replay-playlist\", \"malformed\");\n }\n const urls: string[] = [];\n\n for (const raw of lines.slice(1)) {\n const line = raw.trim();\n\n if (line === \"\") continue;\n if (\n line.startsWith(\"#EXT-X-STREAM-INF\") ||\n line.startsWith(\"#EXT-X-MEDIA:\") ||\n (line.startsWith(\"#EXT-X-KEY:\") && line !== \"#EXT-X-KEY:METHOD=NONE\")\n ) {\n throw failure(\"replay-playlist\", \"unsupported\");\n }\n let url: string | undefined;\n\n if (!line.startsWith(\"#\")) url = line;\n else if (/URI\\s*=/.test(line)) {\n if (!line.startsWith(\"#EXT-X-MAP:\")) throw failure(\"replay-playlist\", \"unsupported\");\n const match = /(?:^|,)URI=\"([^\"]+)\"(?:,|$)/.exec(line.slice(\"#EXT-X-MAP:\".length));\n\n if (match === null) throw failure(\"replay-playlist\", \"malformed\");\n url = match[1];\n }\n if (url !== undefined) {\n if (!allowed(url) || urls.length >= 16384) throw failure(\"replay-playlist\", \"unsafe-url\");\n urls.push(url);\n }\n }\n if (urls.length === 0) throw failure(\"replay-playlist\", \"malformed\");\n\n return urls;\n};\n\nexport class BrowserbaseReplays extends Context.Service<\n BrowserbaseReplays,\n {\n readonly metadata: (\n reference: SessionReference,\n ) => Effect.Effect<ReadonlyArray<ReplayPage>, ArtifactError>;\n readonly openPage: (\n reference: RecordingPageReference,\n ) => Effect.Effect<ReplayAccess, ArtifactError>;\n }\n>()(\"effect-browserbase/Replays\") {\n static readonly layer: Layer.Layer<\n BrowserbaseReplays,\n never,\n BrowserbaseClient | BrowserbaseSessions\n > = Layer.effect(\n BrowserbaseReplays,\n Effect.gen(function* () {\n const client = yield* BrowserbaseClient;\n const sessions = yield* BrowserbaseSessions;\n\n const metadata = Effect.fnUntraced(function* (ref: SessionReference) {\n yield* requireTerminalSession(\n sessions,\n ref,\n () => failure(\"replay\", \"active\"),\n (error) => ArtifactError.make({ operation: \"replay\", reason: error.reason }),\n );\n\n const raw = yield* client\n .json(\"GET\", `/v1/sessions/${encodeURIComponent(ref.sessionId)}/replays`)\n .pipe(\n Effect.mapError(fromClient(\"replay-metadata\")),\n Effect.flatMap((value) =>\n Schema.decodeUnknownEffect(Metadata)(value).pipe(\n Effect.mapError(() => failure(\"replay-metadata\", \"malformed\")),\n ),\n ),\n );\n\n if (\n raw.pageCount !== raw.pages.length ||\n new Set(raw.pages.map((page) => page.pageId)).size !== raw.pages.length ||\n raw.pages.some((page) => page.startTimeMs < 0 || page.endTimeMs < page.startTimeMs)\n ) {\n return yield* failure(\"replay-metadata\", \"malformed\");\n }\n\n return raw.pages.map((page) =>\n ReplayPage.make({\n pageId: page.pageId,\n startTimeMs: page.startTimeMs,\n endTimeMs: page.endTimeMs,\n }),\n );\n }, Trace.span(\"BrowserbaseReplays.metadata\"));\n\n const openPage = Effect.fnUntraced(function* (ref: RecordingPageReference) {\n yield* Schema.decodeEffect(RecordingPageReference)(ref).pipe(\n Effect.mapError(() => failure(\"replay\", \"configuration\")),\n );\n\n const pages = yield* metadata(ref.session);\n\n if (!pages.some((page) => page.pageId === ref.pageId))\n return yield* failure(\"replay\", \"not-found\");\n\n const body = yield* client\n .text(\n `/v1/sessions/${encodeURIComponent(ref.session.sessionId)}/replays/${encodeURIComponent(ref.pageId)}`,\n 1024 * 1024,\n [\"application/vnd.apple.mpegurl\", \"application/x-mpegurl\"],\n )\n .pipe(Effect.mapError(fromClient(\"replay-playlist\")));\n\n // One sanitized rejection: an unsupported tag and an unapproved URI are both\n // refusals to interpret the playlist, and neither may echo its contents.\n const urls = yield* Effect.try({\n try: () => playlistUrls(body, client.validateMediaUrl),\n catch: () => failure(\"replay-playlist\", \"malformed\"),\n });\n\n return {\n reference: ref,\n playlist: Redacted.make(body),\n fetchedAtMillis: yield* Clock.currentTimeMillis,\n mediaCount: urls.length,\n media: (index: number, limits: DownloadLimits) => {\n const url = Number.isSafeInteger(index) ? urls[index] : undefined;\n\n return (\n url === undefined\n ? Stream.fail(failure(\"replay-media\", \"not-found\"))\n : Stream.unwrap(\n transferPolicy(\n {\n maxBytes: limits.maxBytes,\n ...(limits.timeoutMillis === undefined\n ? {}\n : { timeoutMillis: limits.timeoutMillis }),\n },\n () => failure(\"replay-media\", \"configuration\"),\n ).pipe(\n Effect.map(({ maxBytes, timeoutMillis }) =>\n client\n .media(\n Redacted.make(url),\n maxBytes,\n [\"video/mp4\", \"video/iso.segment\", \"application/octet-stream\"],\n timeoutMillis,\n )\n .pipe(Stream.mapError(fromClient(\"replay-media\"))),\n ),\n ),\n )\n ).pipe(Trace.stream(\"BrowserbaseReplays.media\"));\n },\n } satisfies ReplayAccess;\n }, Trace.span(\"BrowserbaseReplays.openPage\"));\n\n return BrowserbaseReplays.of({ metadata, openPage });\n }),\n );\n}\n"],"mappings":"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"}
@@ -1,54 +0,0 @@
1
- import { r as span } from "./Client-BEC4Q8ZS.mjs";
2
- import { Effect, Schema } from "effect";
3
- //#region src/internal/http/Resource.ts
4
- /**
5
- * The shared shape of every control-plane resource: strict input decoding, tolerant reply
6
- * decoding, and one mapping from transport failures into the resource's own error.
7
- */
8
- const resource = (client, make) => {
9
- const fromClient = (operation) => (error) => make({
10
- operation,
11
- reason: error.reason,
12
- ...error.outcome === void 0 ? {} : { outcome: error.outcome },
13
- ...error.status === void 0 ? {} : { status: error.status },
14
- ...error.retryAfterMillis === void 0 ? {} : { retryAfterMillis: error.retryAfterMillis }
15
- });
16
- const configuration = (operation) => make({
17
- operation,
18
- reason: "configuration",
19
- outcome: "undispatched"
20
- });
21
- const malformed = (operation, mutation) => make({
22
- operation,
23
- reason: "malformed",
24
- ...mutation ? { outcome: "unknown" } : {}
25
- });
26
- /** Rejects unknown or invalid caller input before any request is built. */
27
- const input = (schema, value, operation) => Schema.decodeUnknownEffect(schema)(value, { onExcessProperty: "error" }).pipe(Effect.mapError(() => configuration(operation)));
28
- const request = (method, path, reply, operation, body) => client.json(method, path, body).pipe(Effect.mapError(fromClient(operation)), Effect.flatMap((raw) => Schema.decodeEffect(reply)(raw).pipe(Effect.mapError(() => malformed(operation, method !== "GET")))), span("Browserbase.resource.request", { attributes: { "browser.operation": operation } }));
29
- const remove = (path, operation) => client.noContent("DELETE", path).pipe(Effect.mapError(fromClient(operation)), span("Browserbase.resource.remove", { attributes: {
30
- "browser.operation": operation,
31
- "http.request.method": "DELETE"
32
- } }));
33
- const segment = (id) => encodeURIComponent(id);
34
- const query = (entries) => {
35
- const search = new URLSearchParams();
36
- for (const [key, value] of Object.entries(entries)) if (value !== void 0) search.set(key, String(value));
37
- return search.size === 0 ? "" : `?${search}`;
38
- };
39
- return {
40
- fromClient,
41
- configuration,
42
- malformed,
43
- input,
44
- request,
45
- remove,
46
- segment,
47
- query,
48
- make
49
- };
50
- };
51
- //#endregion
52
- export { resource as t };
53
-
54
- //# sourceMappingURL=Resource-J7Kkk5mu.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Resource-J7Kkk5mu.mjs","names":["Trace.span"],"sources":["../src/internal/http/Resource.ts"],"sourcesContent":["import { Effect, Schema } from \"effect\";\n\nimport type { BrowserbaseClient, ClientMethod } from \"../../Client.ts\";\nimport type { ClientError } from \"../../Errors.ts\";\nimport * as Trace from \"../Trace.ts\";\n\ntype Reason = ClientError[\"reason\"];\ntype Outcome = NonNullable<ClientError[\"outcome\"]>;\n\nexport interface RequestFailure<Operation extends string> {\n readonly operation: Operation;\n readonly reason: Reason;\n readonly outcome?: Outcome;\n readonly status?: number;\n readonly retryAfterMillis?: number;\n}\n\n/**\n * The shared shape of every control-plane resource: strict input decoding, tolerant reply\n * decoding, and one mapping from transport failures into the resource's own error.\n */\nexport const resource = <E extends { readonly operation: string }>(\n client: BrowserbaseClient[\"Service\"],\n make: (failure: RequestFailure<E[\"operation\"]>) => E,\n) => {\n type Operation = E[\"operation\"];\n\n const fromClient = (operation: Operation) => (error: ClientError) =>\n make({\n operation,\n reason: error.reason,\n ...(error.outcome === undefined ? {} : { outcome: error.outcome }),\n ...(error.status === undefined ? {} : { status: error.status }),\n ...(error.retryAfterMillis === undefined ? {} : { retryAfterMillis: error.retryAfterMillis }),\n });\n\n const configuration = (operation: Operation) =>\n make({ operation, reason: \"configuration\", outcome: \"undispatched\" });\n\n const malformed = (operation: Operation, mutation: boolean) =>\n make({ operation, reason: \"malformed\", ...(mutation ? { outcome: \"unknown\" } : {}) });\n\n /** Rejects unknown or invalid caller input before any request is built. */\n const input = <A>(\n schema: Schema.Codec<A, unknown, never, never>,\n value: unknown,\n operation: Operation,\n ): Effect.Effect<A, E> =>\n Schema.decodeUnknownEffect(schema)(value, { onExcessProperty: \"error\" }).pipe(\n Effect.mapError(() => configuration(operation)),\n );\n\n const request = <A>(\n method: ClientMethod,\n path: string,\n reply: Schema.Codec<A, unknown, never, never>,\n operation: Operation,\n body?: Schema.Json,\n ): Effect.Effect<A, E> =>\n client.json(method, path, body).pipe(\n Effect.mapError(fromClient(operation)),\n Effect.flatMap((raw) =>\n Schema.decodeEffect(reply)(raw).pipe(\n Effect.mapError(() => malformed(operation, method !== \"GET\")),\n ),\n ),\n Trace.span(\"Browserbase.resource.request\", {\n attributes: { \"browser.operation\": operation },\n }),\n );\n\n const remove = (path: string, operation: Operation): Effect.Effect<void, E> =>\n client.noContent(\"DELETE\", path).pipe(\n Effect.mapError(fromClient(operation)),\n Trace.span(\"Browserbase.resource.remove\", {\n attributes: { \"browser.operation\": operation, \"http.request.method\": \"DELETE\" },\n }),\n );\n\n const segment = (id: string) => encodeURIComponent(id);\n\n const query = (entries: Record<string, string | number | boolean | undefined>) => {\n const search = new URLSearchParams();\n\n for (const [key, value] of Object.entries(entries))\n if (value !== undefined) search.set(key, String(value));\n\n return search.size === 0 ? \"\" : `?${search}`;\n };\n\n return { fromClient, configuration, malformed, input, request, remove, segment, query, make };\n};\n"],"mappings":";;;;;;;AAqBA,MAAa,YACX,QACA,SACG;CAGH,MAAM,cAAc,eAA0B,UAC5C,KAAK;EACH;EACA,QAAQ,MAAM;EACd,GAAI,MAAM,YAAY,KAAA,IAAY,CAAC,IAAI,EAAE,SAAS,MAAM,QAAQ;EAChE,GAAI,MAAM,WAAW,KAAA,IAAY,CAAC,IAAI,EAAE,QAAQ,MAAM,OAAO;EAC7D,GAAI,MAAM,qBAAqB,KAAA,IAAY,CAAC,IAAI,EAAE,kBAAkB,MAAM,iBAAiB;CAC7F,CAAC;CAEH,MAAM,iBAAiB,cACrB,KAAK;EAAE;EAAW,QAAQ;EAAiB,SAAS;CAAe,CAAC;CAEtE,MAAM,aAAa,WAAsB,aACvC,KAAK;EAAE;EAAW,QAAQ;EAAa,GAAI,WAAW,EAAE,SAAS,UAAU,IAAI,CAAC;CAAG,CAAC;;CAGtF,MAAM,SACJ,QACA,OACA,cAEA,OAAO,oBAAoB,MAAM,CAAC,CAAC,OAAO,EAAE,kBAAkB,QAAQ,CAAC,CAAC,CAAC,KACvE,OAAO,eAAe,cAAc,SAAS,CAAC,CAChD;CAEF,MAAM,WACJ,QACA,MACA,OACA,WACA,SAEA,OAAO,KAAK,QAAQ,MAAM,IAAI,CAAC,CAAC,KAC9B,OAAO,SAAS,WAAW,SAAS,CAAC,GACrC,OAAO,SAAS,QACd,OAAO,aAAa,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,KAC9B,OAAO,eAAe,UAAU,WAAW,WAAW,KAAK,CAAC,CAC9D,CACF,GACAA,KAAW,gCAAgC,EACzC,YAAY,EAAE,qBAAqB,UAAU,EAC/C,CAAC,CACH;CAEF,MAAM,UAAU,MAAc,cAC5B,OAAO,UAAU,UAAU,IAAI,CAAC,CAAC,KAC/B,OAAO,SAAS,WAAW,SAAS,CAAC,GACrCA,KAAW,+BAA+B,EACxC,YAAY;EAAE,qBAAqB;EAAW,uBAAuB;CAAS,EAChF,CAAC,CACH;CAEF,MAAM,WAAW,OAAe,mBAAmB,EAAE;CAErD,MAAM,SAAS,YAAmE;EAChF,MAAM,SAAS,IAAI,gBAAgB;EAEnC,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,OAAO,GAC/C,IAAI,UAAU,KAAA,GAAW,OAAO,IAAI,KAAK,OAAO,KAAK,CAAC;EAExD,OAAO,OAAO,SAAS,IAAI,KAAK,IAAI;CACtC;CAEA,OAAO;EAAE;EAAY;EAAe;EAAW;EAAO;EAAS;EAAQ;EAAS;EAAO;CAAK;AAC9F"}
@@ -1,37 +0,0 @@
1
- import { PlatformError } from "./Errors.mjs";
2
- import { t as BrowserbaseClient } from "./Client-B_f6bBLT.mjs";
3
- import { Context, Effect, Layer, Schema } from "effect";
4
- //#region src/Search.d.ts
5
- declare const SearchQuery: Schema.Struct<{
6
- readonly query: Schema.NonEmptyString;
7
- /** 1–25; the provider defaults to 10. */
8
- readonly numResults: Schema.optionalKey<Schema.Int>;
9
- }>;
10
- type SearchQuery = typeof SearchQuery.Type;
11
- declare const SearchResult_base: Schema.Class<SearchResult, Schema.Struct<{
12
- readonly id: Schema.String;
13
- readonly url: Schema.String;
14
- readonly title: Schema.String;
15
- readonly author: Schema.optionalKey<Schema.String>;
16
- readonly publishedDate: Schema.optionalKey<Schema.String>;
17
- readonly image: Schema.optionalKey<Schema.String>;
18
- readonly favicon: Schema.optionalKey<Schema.String>;
19
- }>, {}>;
20
- declare class SearchResult extends SearchResult_base {}
21
- declare const SearchResults_base: Schema.Class<SearchResults, Schema.Struct<{
22
- readonly requestId: Schema.String;
23
- readonly query: Schema.String;
24
- readonly results: Schema.$Array<typeof SearchResult>;
25
- }>, {}>;
26
- declare class SearchResults extends SearchResults_base {}
27
- declare const BrowserbaseSearch_base: Context.ServiceClass<BrowserbaseSearch, "effect-browserbase/Search", {
28
- readonly web: (query: SearchQuery) => Effect.Effect<SearchResults, PlatformError>;
29
- }>;
30
- /** Browserbase web search. The POST is never retried; billing of each outcome is provider-owned. */
31
- declare class BrowserbaseSearch extends BrowserbaseSearch_base {
32
- static readonly layer: Layer.Layer<BrowserbaseSearch, never, BrowserbaseClient>;
33
- }
34
- //#endregion
35
- export { SearchResults as i, SearchQuery as n, SearchResult as r, BrowserbaseSearch as t };
36
- export {};
37
- //# sourceMappingURL=Search-B64e7g-h.d.mts.map
package/dist/Search.d.mts DELETED
@@ -1,3 +0,0 @@
1
- import { i as SearchResults, n as SearchQuery, r as SearchResult, t as BrowserbaseSearch } from "./Search-B64e7g-h.mjs";
2
- export { BrowserbaseSearch, SearchQuery, SearchResult, SearchResults };
3
- export {};
package/dist/Search.mjs DELETED
@@ -1,46 +0,0 @@
1
- import { PlatformError } from "./Errors.mjs";
2
- import { r as span, t as BrowserbaseClient } from "./Client-BEC4Q8ZS.mjs";
3
- import { t as resource } from "./Resource-J7Kkk5mu.mjs";
4
- import { Context, Effect, Layer, Schema } from "effect";
5
- //#region src/Search.ts
6
- const Text = Schema.String.check(Schema.isMaxLength(16384));
7
- const SearchQuery = Schema.Struct({
8
- query: Schema.NonEmptyString.check(Schema.isMaxLength(2048)),
9
- /** 1–25; the provider defaults to 10. */
10
- numResults: Schema.optionalKey(Schema.Int.check(Schema.isBetween({
11
- minimum: 1,
12
- maximum: 25
13
- })))
14
- });
15
- var SearchResult = class extends Schema.Class("BrowserbaseSearchResult")({
16
- id: Text,
17
- url: Text,
18
- title: Text,
19
- author: Schema.optionalKey(Text),
20
- publishedDate: Schema.optionalKey(Text),
21
- image: Schema.optionalKey(Text),
22
- favicon: Schema.optionalKey(Text)
23
- }) {};
24
- var SearchResults = class extends Schema.Class("BrowserbaseSearchResults")({
25
- requestId: Text,
26
- query: Text,
27
- results: Schema.Array(SearchResult).check(Schema.isMaxLength(25))
28
- }) {};
29
- /** Browserbase web search. The POST is never retried; billing of each outcome is provider-owned. */
30
- var BrowserbaseSearch = class BrowserbaseSearch extends Context.Service()("effect-browserbase/Search") {
31
- static layer = Layer.effect(BrowserbaseSearch, Effect.gen(function* () {
32
- const api = resource(yield* BrowserbaseClient, (failure) => PlatformError.make({
33
- ...failure,
34
- service: "search"
35
- }));
36
- const web = Effect.fnUntraced(function* (query) {
37
- const value = yield* api.input(SearchQuery, query, "search-web");
38
- return yield* api.request("POST", "/v1/search", SearchResults, "search-web", value);
39
- }, span("BrowserbaseSearch.web"));
40
- return BrowserbaseSearch.of({ web });
41
- }));
42
- };
43
- //#endregion
44
- export { BrowserbaseSearch, SearchQuery, SearchResult, SearchResults };
45
-
46
- //# sourceMappingURL=Search.mjs.map