effect-browserbase 0.1.0-beta.104 → 0.2.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +61 -305
- package/dist/Account.d.mts +4 -6
- package/dist/Account.mjs +4 -9
- package/dist/Account.mjs.map +1 -1
- package/dist/{Acquisition-WBafHwXH.mjs → Acquisition-D8o4jtCg.mjs} +22 -68
- package/dist/Acquisition-D8o4jtCg.mjs.map +1 -0
- package/dist/Agents.d.mts +4 -6
- package/dist/Agents.mjs +3 -19
- package/dist/Agents.mjs.map +1 -1
- package/dist/Allocation.d.mts +9 -11
- package/dist/Allocation.mjs +2 -4
- package/dist/Allocation.mjs.map +1 -1
- package/dist/Browser.d.mts +23 -141
- package/dist/Browser.mjs +208 -164
- package/dist/Browser.mjs.map +1 -1
- package/dist/BrowserBinding.d.mts +7 -34
- package/dist/BrowserBinding.mjs +30 -1
- package/dist/BrowserBinding.mjs.map +1 -0
- package/dist/Certificates.d.mts +3 -5
- package/dist/Certificates.mjs +2 -7
- package/dist/Certificates.mjs.map +1 -1
- package/dist/{Cleanup-G2YpTCuU.d.mts → Cleanup-DMTDBir8.d.mts} +5 -6
- package/dist/Cleanup.d.mts +3 -2
- package/dist/Cleanup.mjs +1 -6
- package/dist/Cleanup.mjs.map +1 -1
- package/dist/{Client-D1_xYM9o.mjs → Client-BQteUePT.mjs} +2 -4
- package/dist/{Client-D1_xYM9o.mjs.map → Client-BQteUePT.mjs.map} +1 -1
- package/dist/Client.d.mts +51 -2
- package/dist/Client.mjs +1 -1
- package/dist/Connection-DcvJZEdc.mjs +65 -0
- package/dist/Connection-DcvJZEdc.mjs.map +1 -0
- package/dist/ContextCoordination.d.mts +5 -6
- package/dist/ContextCoordination.mjs +1 -8
- package/dist/ContextCoordination.mjs.map +1 -1
- package/dist/Contexts.d.mts +4 -6
- package/dist/Contexts.mjs +2 -8
- package/dist/Contexts.mjs.map +1 -1
- package/dist/Downloads.d.mts +6 -8
- package/dist/Downloads.mjs +3 -8
- package/dist/Downloads.mjs.map +1 -1
- package/dist/Errors.d.mts +3 -26
- package/dist/Errors.mjs +1 -137
- package/dist/Errors.mjs.map +1 -1
- package/dist/{Extensions-ClZbYb1H.mjs → Extensions-nMNMPGCc.mjs} +3 -9
- package/dist/{Extensions-ClZbYb1H.mjs.map → Extensions-nMNMPGCc.mjs.map} +1 -1
- package/dist/Extensions.d.mts +4 -6
- package/dist/Extensions.mjs +1 -1
- package/dist/Functions.d.mts +4 -6
- package/dist/Functions.mjs +3 -17
- package/dist/Functions.mjs.map +1 -1
- package/dist/{Launch-BHcAEq05.mjs → Launch-m0fxzJ49.mjs} +5 -5
- package/dist/Launch-m0fxzJ49.mjs.map +1 -0
- package/dist/Launch.d.mts +130 -2
- package/dist/Launch.mjs +4 -11
- package/dist/Launch.mjs.map +1 -1
- package/dist/PageFetch.d.mts +3 -5
- package/dist/PageFetch.mjs +2 -8
- package/dist/PageFetch.mjs.map +1 -1
- package/dist/Projects.d.mts +3 -5
- package/dist/Projects.mjs +2 -8
- package/dist/Projects.mjs.map +1 -1
- package/dist/Recordings.d.mts +6 -8
- package/dist/Recordings.mjs +3 -5
- package/dist/Recordings.mjs.map +1 -1
- package/dist/{References-URDAtapt.d.mts → References-DOH3Wu44.d.mts} +5 -6
- package/dist/References.d.mts +3 -2
- package/dist/References.mjs +10 -18
- package/dist/References.mjs.map +1 -1
- package/dist/Replays.d.mts +6 -8
- package/dist/Replays.mjs +3 -5
- package/dist/Replays.mjs.map +1 -1
- package/dist/Search.d.mts +3 -5
- package/dist/Search.mjs +2 -9
- package/dist/Search.mjs.map +1 -1
- package/dist/{SessionData-DRKcKCqw.d.mts → SessionData-5xYZDshJ.d.mts} +5 -6
- package/dist/SessionData.d.mts +3 -2
- package/dist/SessionData.mjs +1 -8
- package/dist/SessionData.mjs.map +1 -1
- package/dist/{Sessions-CtbseWEh.mjs → Sessions-DoQGg9nB.mjs} +34 -18
- package/dist/Sessions-DoQGg9nB.mjs.map +1 -0
- package/dist/{Sessions-B8E4kMxo.d.mts → Sessions-tFJYaXFq.d.mts} +8 -8
- package/dist/Sessions.d.mts +4 -3
- package/dist/Sessions.mjs +1 -1
- package/dist/{Transfers-Czv5IZzJ.d.mts → Transfers-GVqzrDWl.d.mts} +22 -9
- package/dist/Transfers.d.mts +3 -2
- package/dist/Transfers.mjs +12 -28
- package/dist/Transfers.mjs.map +1 -1
- package/dist/Uploads.d.mts +6 -8
- package/dist/Uploads.mjs +3 -5
- package/dist/Uploads.mjs.map +1 -1
- package/dist/Webhooks.d.mts +3 -5
- package/dist/Webhooks.mjs +2 -11
- package/dist/Webhooks.mjs.map +1 -1
- package/dist/{WriterFacts-osvYAsIx.d.mts → WriterFacts-5CPBGG1P.d.mts} +4 -3
- package/dist/index.d.mts +27 -31
- package/dist/index.mjs +26 -31
- package/package.json +3 -28
- package/dist/Acquisition-WBafHwXH.mjs.map +0 -1
- package/dist/Association-CEps4hYP.mjs +0 -10
- package/dist/Association-CEps4hYP.mjs.map +0 -1
- package/dist/Bootstrap-BXuzZojd.mjs +0 -194
- package/dist/Bootstrap-BXuzZojd.mjs.map +0 -1
- package/dist/Bootstrap-m7lHgj0D.d.mts +0 -177
- package/dist/Bootstrap.d.mts +0 -2
- package/dist/Bootstrap.mjs +0 -2
- package/dist/BrowserBinding-DlJTGYZL.mjs +0 -2508
- package/dist/BrowserBinding-DlJTGYZL.mjs.map +0 -1
- package/dist/BrowserData-LpcAuAub.d.mts +0 -369
- package/dist/BrowserData.d.mts +0 -2
- package/dist/BrowserData.mjs +0 -442
- package/dist/BrowserData.mjs.map +0 -1
- package/dist/Capture-Bc0z9IAi.mjs +0 -571
- package/dist/Capture-Bc0z9IAi.mjs.map +0 -1
- package/dist/Capture-BvWI-l1A.d.mts +0 -168
- package/dist/Capture.d.mts +0 -2
- package/dist/Capture.mjs +0 -2
- package/dist/Client-Ca0zSg1n.d.mts +0 -53
- package/dist/Images-DgscEfSf.mjs +0 -127
- package/dist/Images-DgscEfSf.mjs.map +0 -1
- package/dist/Launch-BHcAEq05.mjs.map +0 -1
- package/dist/Launch-C8CfaYxb.d.mts +0 -132
- package/dist/LocalBrowser-BLancJ3R.d.mts +0 -79
- package/dist/LocalBrowser-DsQLWNL1.mjs +0 -439
- package/dist/LocalBrowser-DsQLWNL1.mjs.map +0 -1
- package/dist/LocalBrowser.d.mts +0 -2
- package/dist/LocalBrowser.mjs +0 -2
- package/dist/PageControl.d.mts +0 -16
- package/dist/PageControl.mjs +0 -36
- package/dist/PageControl.mjs.map +0 -1
- package/dist/PageControlAssociation-DabEg5AR.mjs +0 -10
- package/dist/PageControlAssociation-DabEg5AR.mjs.map +0 -1
- package/dist/Session-D4nT9hOO.mjs +0 -1379
- package/dist/Session-D4nT9hOO.mjs.map +0 -1
- package/dist/Sessions-CtbseWEh.mjs.map +0 -1
- package/dist/rolldown-runtime-D7D4PA-g.mjs +0 -13
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Client-D1_xYM9o.mjs","names":[],"sources":["../src/internal/http/Multipart.ts","../src/internal/http/Transport.ts","../src/Client.ts"],"sourcesContent":["import { Schema } from \"effect\";\n\nimport type { MultipartFile } from \"../../Client.ts\";\nimport { SafeFilename } from \"../../Transfers.ts\";\n\n/** One file part is the only multipart shape this transport produces. */\nexport type MultipartResult =\n | {\n readonly _tag: \"Encoded\";\n readonly contentType: string;\n readonly body: Uint8Array;\n }\n | { readonly _tag: \"Rejected\"; readonly reason: \"configuration\" | \"limit\" };\n\nconst FIELD = /^[a-z][a-z0-9_]{0,31}$/;\nconst MEDIA_TYPE = /^[a-z0-9][a-z0-9!#$&^_+.-]{0,63}\\/[a-z0-9][a-z0-9!#$&^_+.-]{0,63}$/;\nconst PRINTABLE_ASCII = /^[\\x20-\\x7e]+$/;\n\nconst isSafeFilename = Schema.is(SafeFilename);\n\n/** Quoting is only safe for a portable, printable, quote-free basename. */\nconst quotable = (value: string): boolean =>\n isSafeFilename(value) && PRINTABLE_ASCII.test(value) && !value.includes('\"');\n\nconst randomBoundary = (): string => {\n const bytes = globalThis.crypto.getRandomValues(new Uint8Array(16));\n\n return `effect-agent-browserbase-${[...bytes].map((byte) => byte.toString(16).padStart(2, \"0\")).join(\"\")}`;\n};\n\nconst contains = (haystack: Uint8Array, needle: Uint8Array): boolean => {\n const first = needle[0];\n\n if (first === undefined || needle.length > haystack.length) return false;\n\n outer: for (let i = 0; i <= haystack.length - needle.length; i++) {\n if (haystack[i] !== first) continue;\n for (let j = 1; j < needle.length; j++) {\n const expected = needle[j];\n\n if (expected === undefined || haystack[i + j] !== expected) continue outer;\n }\n\n return true;\n }\n\n return false;\n};\n\n/**\n * A deliberately small RFC 7578 encoder: one file part, an ASCII-quotable name and a\n * delimiter proven absent from the content. It performs no filesystem or stream work.\n */\nexport const encodeFilePart = (\n part: MultipartFile,\n maxBytes: number,\n boundaries: () => string = randomBoundary,\n): MultipartResult => {\n if (\n !FIELD.test(part.field) ||\n !quotable(part.filename) ||\n !MEDIA_TYPE.test(part.mediaType) ||\n !Number.isSafeInteger(maxBytes) ||\n maxBytes < 1 ||\n maxBytes > 2 ** 31 - 1\n ) {\n return { _tag: \"Rejected\", reason: \"configuration\" };\n }\n if (part.bytes.byteLength > maxBytes) return { _tag: \"Rejected\", reason: \"limit\" };\n const encoder = new TextEncoder();\n\n for (let attempt = 0; attempt < 4; attempt++) {\n const boundary = boundaries();\n\n if (!/^[A-Za-z0-9-]{1,70}$/.test(boundary)) continue;\n const delimiter = encoder.encode(boundary);\n\n if (contains(part.bytes, delimiter)) continue;\n\n const head = encoder.encode(\n `--${boundary}\\r\\nContent-Disposition: form-data; name=\"${part.field}\"; filename=\"${part.filename}\"\\r\\nContent-Type: ${part.mediaType}\\r\\n\\r\\n`,\n );\n\n const tail = encoder.encode(`\\r\\n--${boundary}--\\r\\n`);\n const body = new Uint8Array(head.byteLength + part.bytes.byteLength + tail.byteLength);\n\n body.set(head, 0);\n body.set(part.bytes, head.byteLength);\n body.set(tail, head.byteLength + part.bytes.byteLength);\n\n return {\n _tag: \"Encoded\",\n contentType: `multipart/form-data; boundary=${boundary}`,\n body,\n };\n }\n\n return { _tag: \"Rejected\", reason: \"configuration\" };\n};\n","import { Clock, Duration, Effect, Redacted, Schema, Stream } from \"effect\";\nimport {\n FetchHttpClient,\n HttpClient,\n HttpClientRequest,\n type HttpClientResponse,\n} from \"effect/unstable/http\";\n\nimport type { ClientMethod, ClientOptions, MultipartFile, UploadLimits } from \"../../Client.ts\";\nimport { ClientError } from \"../../Errors.ts\";\nimport { Identifier } from \"../../References.ts\";\nimport { encodeFilePart } from \"./Multipart.ts\";\n\nconst API_ORIGIN = \"https://api.browserbase.com\";\nconst MAX_JSON_BYTES = 1024 * 1024;\nconst MAX_JSON_DEPTH = 64;\n\nconst Options = Schema.Struct({\n projectId: Identifier,\n apiKey: Schema.Redacted(\n Schema.NonEmptyString.check(Schema.isMaxLength(8192), Schema.isPattern(/^[\\x21-\\x7e]+$/)),\n ),\n artifactOrigins: Schema.optionalKey(\n Schema.Array(Schema.String.check(Schema.isMaxLength(8192))).check(\n Schema.isMaxLength(32),\n Schema.isUnique(),\n ),\n ),\n requestTimeoutMillis: Schema.optionalKey(\n Schema.Int.check(Schema.isBetween({ minimum: 1, maximum: 60_000 })),\n ),\n});\n\nconst nowMillis = Clock.monotonicTimeNanos.pipe(Effect.map((value) => Number(value) / 1_000_000));\n\nconst deadlineAfter = (millis: number) => nowMillis.pipe(Effect.map((now) => now + millis));\n\nconst within = <A, E, R>(\n effect: Effect.Effect<A, E, R>,\n deadline: number,\n operation: ClientError[\"operation\"],\n outcome?: \"undispatched\" | \"unknown\",\n): Effect.Effect<A, E | ClientError, R> =>\n Effect.suspend(() =>\n nowMillis.pipe(\n Effect.flatMap((now) => {\n const remaining = deadline - now;\n\n const timeout = () =>\n Effect.fail(\n ClientError.make({\n operation,\n reason: \"timeout\",\n ...(outcome === undefined ? {} : { outcome }),\n }),\n );\n\n return remaining <= 0\n ? timeout()\n : effect.pipe(\n Effect.timeoutOrElse({\n duration: Duration.millis(remaining),\n orElse: timeout,\n }),\n );\n }),\n ),\n );\n\nconst withinJsonDepth = (text: string): boolean => {\n let depth = 0;\n let quoted = false;\n let escaped = false;\n\n for (const character of text) {\n if (quoted) {\n if (escaped) escaped = false;\n else if (character === \"\\\\\") escaped = true;\n else if (character === '\"') quoted = false;\n } else if (character === '\"') quoted = true;\n else if (character === \"{\" || character === \"[\") {\n if (++depth > MAX_JSON_DEPTH) return false;\n } else if (character === \"}\" || character === \"]\") depth--;\n }\n\n return true;\n};\n\nconst mediaType = (value: string | undefined): string =>\n value?.split(\";\", 1)[0]?.trim().toLowerCase() ?? \"\";\n\nconst retryAfter = (value: string | undefined, now: number): number | undefined => {\n if (value === undefined || value.length > 128) return undefined;\n const seconds = Number(value);\n\n if (Number.isFinite(seconds) && seconds >= 0) return Math.min(60_000, seconds * 1000);\n const date = Date.parse(value);\n\n return Number.isFinite(date) ? Math.min(60_000, Math.max(0, date - now)) : undefined;\n};\n\nconst mutationOutcome = (\n method: ClientMethod,\n status?: number,\n): \"rejected\" | \"unknown\" | undefined => {\n if (method === \"GET\") return undefined;\n if (status !== undefined && [400, 401, 403, 404, 409, 410, 422, 429].includes(status)) {\n return \"rejected\";\n }\n\n return \"unknown\";\n};\n\nconst statusError = (\n method: ClientMethod,\n status: number,\n operation: ClientError[\"operation\"],\n after?: number,\n) =>\n ClientError.make({\n operation,\n reason:\n status === 401 || status === 403\n ? \"authorization\"\n : status === 429\n ? \"rate-limited\"\n : status === 409\n ? \"active\"\n : status === 410\n ? \"expired\"\n : status === 422\n ? \"disabled\"\n : status === 404\n ? \"not-found\"\n : \"provider\",\n status,\n ...(mutationOutcome(method, status) === undefined\n ? {}\n : { outcome: mutationOutcome(method, status) }),\n ...(after === undefined ? {} : { retryAfterMillis: after }),\n });\n\nconst collect = (\n stream: Stream.Stream<Uint8Array, ClientError>,\n maximum: number,\n operation: ClientError[\"operation\"],\n) =>\n Effect.gen(function* () {\n const chunks: Uint8Array[] = [];\n let total = 0;\n\n yield* Stream.runForEach(stream, (chunk) =>\n Effect.suspend(() => {\n if (chunk.byteLength > maximum - total) {\n return Effect.fail(ClientError.make({ operation, reason: \"limit\" }));\n }\n total += chunk.byteLength;\n chunks.push(chunk);\n\n return Effect.void;\n }),\n );\n\n const body = new Uint8Array(total);\n let offset = 0;\n\n for (const chunk of chunks) {\n body.set(chunk, offset);\n offset += chunk.byteLength;\n }\n\n return body;\n });\n\nconst validApiPath = (path: string): boolean =>\n path.startsWith(\"/v1/\") && !path.includes(\"\\\\\") && !path.includes(\"#\") && path.length <= 16_384;\n\nexport const makeTransport = Effect.fnUntraced(function* (options: ClientOptions) {\n const configured = yield* Schema.decodeEffect(Options)(options, {\n onExcessProperty: \"error\",\n }).pipe(\n Effect.mapError(() =>\n ClientError.make({\n operation: \"configure\",\n reason: \"configuration\",\n outcome: \"undispatched\",\n }),\n ),\n );\n\n const apiKey = Redacted.value(configured.apiKey);\n const requestTimeoutMillis = configured.requestTimeoutMillis ?? 10_000;\n const artifactOrigins = new Set<string>();\n\n for (const origin of configured.artifactOrigins ?? []) {\n const url = yield* Effect.try({\n try: () => new URL(origin),\n catch: () =>\n ClientError.make({\n operation: \"configure\",\n reason: \"configuration\",\n outcome: \"undispatched\",\n }),\n });\n\n if (url.protocol !== \"https:\" || url.origin !== origin || url.username || url.password) {\n return yield* ClientError.make({\n operation: \"configure\",\n reason: \"configuration\",\n outcome: \"undispatched\",\n });\n }\n artifactOrigins.add(origin);\n }\n\n const fetch = yield* FetchHttpClient.Fetch;\n const client = yield* HttpClient.HttpClient.pipe(Effect.provide(FetchHttpClient.layer));\n const scoped = HttpClient.withScope(client);\n\n const execute = (\n request: HttpClientRequest.HttpClientRequest,\n operation: ClientError[\"operation\"],\n outcome?: \"undispatched\" | \"unknown\",\n ) =>\n scoped.execute(request).pipe(\n Effect.provideService(FetchHttpClient.Fetch, fetch),\n Effect.provideService(FetchHttpClient.RequestInit, {\n redirect: \"manual\",\n credentials: \"omit\",\n cache: \"no-store\",\n referrerPolicy: \"no-referrer\",\n }),\n Effect.provideService(HttpClient.TracerDisabledWhen, () => true),\n Effect.provideService(HttpClient.TracerPropagationEnabled, false),\n Effect.withTracerEnabled(false),\n Effect.mapError(() =>\n ClientError.make({\n operation,\n reason: \"transport\",\n ...(outcome === undefined ? {} : { outcome }),\n }),\n ),\n );\n\n /** A rejected path is a typed, undispatched configuration failure, never a defect. */\n const apiRequest = (\n method: ClientMethod,\n path: string,\n accept: string,\n operation: ClientError[\"operation\"],\n ) =>\n validApiPath(path)\n ? Effect.succeed(\n HttpClientRequest.make(method)(`${API_ORIGIN}${path}`).pipe(\n HttpClientRequest.setHeader(\"x-bb-api-key\", apiKey),\n HttpClientRequest.setHeader(\"accept\", accept),\n ),\n )\n : Effect.fail(\n ClientError.make({ operation, reason: \"configuration\", outcome: \"undispatched\" }),\n );\n\n const inspectJson = Effect.fnUntraced(function* (\n method: ClientMethod,\n response: HttpClientResponse.HttpClientResponse,\n operation: ClientError[\"operation\"],\n ) {\n if (response.status !== 200 && response.status !== 201 && response.status !== 202) {\n return yield* statusError(\n method,\n response.status,\n operation,\n retryAfter(response.headers[\"retry-after\"], yield* Clock.currentTimeMillis),\n );\n }\n if (mediaType(response.headers[\"content-type\"]) !== \"application/json\") {\n return yield* ClientError.make({\n operation,\n reason: \"content-type\",\n ...(mutationOutcome(method) === undefined ? {} : { outcome: mutationOutcome(method) }),\n });\n }\n const length = response.headers[\"content-length\"];\n\n if (length !== undefined && (!/^\\d+$/.test(length) || Number(length) > MAX_JSON_BYTES)) {\n return yield* ClientError.make({\n operation,\n reason: \"limit\",\n ...(mutationOutcome(method) === undefined ? {} : { outcome: mutationOutcome(method) }),\n });\n }\n let received = 0;\n\n return response.stream.pipe(\n Stream.mapError(() =>\n ClientError.make({\n operation,\n reason: \"transport\",\n ...(mutationOutcome(method) === undefined ? {} : { outcome: mutationOutcome(method) }),\n }),\n ),\n Stream.mapEffect((chunk) =>\n Effect.suspend(() => {\n if (chunk.byteLength > MAX_JSON_BYTES - received) {\n return Effect.fail(\n ClientError.make({\n operation,\n reason: \"limit\",\n ...(mutationOutcome(method) === undefined\n ? {}\n : { outcome: mutationOutcome(method) }),\n }),\n );\n }\n received += chunk.byteLength;\n\n return Effect.succeed(new Uint8Array(chunk));\n }),\n ),\n );\n });\n\n const readJson = Effect.fnUntraced(function* (\n method: ClientMethod,\n response: HttpClientResponse.HttpClientResponse,\n operation: ClientError[\"operation\"],\n ) {\n const stream = yield* inspectJson(method, response, operation);\n const bytes = yield* collect(stream, MAX_JSON_BYTES, operation);\n\n const text = yield* Effect.try({\n try: () => new TextDecoder(\"utf-8\", { fatal: true }).decode(bytes),\n catch: () =>\n ClientError.make({\n operation,\n reason: \"malformed\",\n ...(mutationOutcome(method) === undefined ? {} : { outcome: mutationOutcome(method) }),\n }),\n });\n\n if (!withinJsonDepth(text)) {\n return yield* ClientError.make({\n operation,\n reason: \"limit\",\n ...(mutationOutcome(method) === undefined ? {} : { outcome: mutationOutcome(method) }),\n });\n }\n\n return yield* Schema.decodeEffect(Schema.fromJsonString(Schema.Json))(text).pipe(\n Effect.mapError(() =>\n ClientError.make({\n operation,\n reason: \"malformed\",\n ...(mutationOutcome(method) === undefined ? {} : { outcome: mutationOutcome(method) }),\n }),\n ),\n );\n });\n\n const jsonOnce = Effect.fnUntraced(function* (\n method: ClientMethod,\n path: string,\n body?: Schema.Json,\n ) {\n const operation = method === \"GET\" ? \"provider-read\" : \"provider-mutation\";\n let request = yield* apiRequest(method, path, \"application/json\", operation);\n\n if (body !== undefined) {\n request = yield* HttpClientRequest.bodyJson(request, body).pipe(\n Effect.mapError(() =>\n ClientError.make({\n operation,\n reason: \"configuration\",\n outcome: \"undispatched\",\n }),\n ),\n );\n }\n const response = yield* execute(request, operation, method === \"GET\" ? undefined : \"unknown\");\n\n return yield* readJson(method, response, operation);\n });\n\n /**\n * One bounded in-memory file part. The encoder proves its delimiter absent from the\n * content, and an accepted multipart mutation is never retried: a lost reply is unknown.\n */\n const upload = Effect.fnUntraced(function* (\n path: string,\n part: MultipartFile,\n limits: UploadLimits,\n outerDeadline?: number,\n ) {\n const operation = \"provider-upload\";\n const timeoutMillis = limits.timeoutMillis ?? 60_000;\n\n if (!Number.isSafeInteger(timeoutMillis) || timeoutMillis < 1 || timeoutMillis > 600_000) {\n return yield* ClientError.make({\n operation,\n reason: \"configuration\",\n outcome: \"undispatched\",\n });\n }\n\n const encoded = encodeFilePart(part, limits.maxBytes);\n\n if (encoded._tag === \"Rejected\") {\n return yield* ClientError.make({\n operation,\n reason: encoded.reason,\n outcome: \"undispatched\",\n });\n }\n\n const request = HttpClientRequest.bodyUint8Array(\n yield* apiRequest(\"POST\", path, \"application/json\", operation),\n encoded.body,\n encoded.contentType,\n );\n\n const deadline = Math.min(yield* deadlineAfter(timeoutMillis), outerDeadline ?? Infinity);\n\n return yield* within(\n Effect.scoped(\n execute(request, operation, \"unknown\").pipe(\n Effect.flatMap((response) => readJson(\"POST\", response, operation)),\n ),\n ),\n deadline,\n operation,\n \"unknown\",\n );\n });\n\n const json = Effect.fnUntraced(function* (\n method: ClientMethod,\n path: string,\n body?: Schema.Json,\n outerDeadline?: number,\n ) {\n const deadline = Math.min(\n yield* deadlineAfter(requestTimeoutMillis),\n outerDeadline ?? Infinity,\n );\n\n for (let attempt = 0; ; attempt++) {\n const result = yield* within(\n Effect.scoped(jsonOnce(method, path, body)),\n deadline,\n // A request that times out is labelled like the same request failing any other way.\n method === \"GET\" ? \"provider-read\" : \"provider-mutation\",\n method === \"GET\" ? undefined : \"unknown\",\n ).pipe(Effect.result);\n\n if (result._tag === \"Success\") return result.success;\n const error = result.failure;\n\n const retryable =\n error.reason === \"transport\" ||\n error.reason === \"rate-limited\" ||\n (error.reason === \"provider\" && (error.status ?? 0) >= 500);\n\n if (method !== \"GET\" || !retryable || attempt >= 2) return yield* error;\n const delay = error.retryAfterMillis ?? (attempt + 1) * 150;\n\n if ((yield* nowMillis) + delay >= deadline) return yield* error;\n yield* Effect.sleep(delay);\n }\n });\n\n const noContent = Effect.fnUntraced(function* (\n method: Exclude<ClientMethod, \"GET\">,\n path: string,\n body?: Schema.Json,\n outerDeadline?: number,\n ) {\n const operation = \"provider-mutation\";\n let request = yield* apiRequest(method, path, \"*/*\", operation);\n\n if (body !== undefined) {\n request = yield* HttpClientRequest.bodyJson(request, body).pipe(\n Effect.mapError(() =>\n ClientError.make({\n operation,\n reason: \"configuration\",\n outcome: \"undispatched\",\n }),\n ),\n );\n }\n\n const deadline = Math.min(\n yield* deadlineAfter(requestTimeoutMillis),\n outerDeadline ?? Infinity,\n );\n\n const response = yield* within(\n Effect.scoped(execute(request, operation, \"unknown\")),\n deadline,\n operation,\n \"unknown\",\n );\n\n if (![200, 202, 204].includes(response.status)) {\n return yield* statusError(\n method,\n response.status,\n operation,\n retryAfter(response.headers[\"retry-after\"], yield* Clock.currentTimeMillis),\n );\n }\n });\n\n const inspectBytes = Effect.fnUntraced(function* (\n response: HttpClientResponse.HttpClientResponse,\n operation: ClientError[\"operation\"],\n types: ReadonlyArray<string>,\n maximum: number,\n ) {\n if (response.status !== 200 && response.status !== 206) {\n return yield* statusError(\n \"GET\",\n response.status,\n operation,\n retryAfter(response.headers[\"retry-after\"], yield* Clock.currentTimeMillis),\n );\n }\n if (!types.includes(mediaType(response.headers[\"content-type\"]))) {\n return yield* ClientError.make({ operation, reason: \"content-type\" });\n }\n const length = response.headers[\"content-length\"];\n\n if (length !== undefined && (!/^\\d+$/.test(length) || Number(length) > maximum)) {\n return yield* ClientError.make({ operation, reason: \"limit\" });\n }\n let received = 0;\n\n return response.stream.pipe(\n Stream.mapError(() => ClientError.make({ operation, reason: \"transport\" })),\n Stream.mapEffect((chunk) =>\n Effect.suspend(() => {\n if (chunk.byteLength > maximum - received) {\n return Effect.fail(ClientError.make({ operation, reason: \"limit\" }));\n }\n received += chunk.byteLength;\n\n return Effect.succeed(new Uint8Array(chunk));\n }),\n ),\n );\n });\n\n const bytes = (\n path: string,\n maximum: number,\n types: ReadonlyArray<string>,\n timeoutMillis = requestTimeoutMillis,\n outerDeadline?: number,\n ) =>\n Stream.unwrap(\n Effect.gen(function* () {\n // A bounded authenticated read. Resource services relabel it with their own operation.\n const operation = \"provider-read\";\n\n if (\n !Number.isSafeInteger(maximum) ||\n maximum < 1 ||\n maximum > 2 ** 31 - 1 ||\n !Number.isSafeInteger(timeoutMillis) ||\n timeoutMillis < 1 ||\n timeoutMillis > 600_000\n ) {\n return yield* ClientError.make({ operation, reason: \"configuration\" });\n }\n const deadline = Math.min(yield* deadlineAfter(timeoutMillis), outerDeadline ?? Infinity);\n\n const request = yield* apiRequest(\n \"GET\",\n path,\n types[0] ?? \"application/octet-stream\",\n operation,\n );\n\n const response = yield* within(execute(request, operation), deadline, operation);\n\n const stream = yield* inspectBytes(response, operation, types, maximum);\n\n return Stream.transformPull(stream, (pull) =>\n Effect.succeed(within(pull, deadline, operation)),\n );\n }),\n ).pipe(Stream.scoped);\n\n const text = (path: string, maximum: number, types: ReadonlyArray<string>) =>\n collect(bytes(path, maximum, types), maximum, \"provider-read\").pipe(\n Effect.flatMap((body) =>\n Effect.try({\n try: () => new TextDecoder(\"utf-8\", { fatal: true }).decode(body),\n catch: () => ClientError.make({ operation: \"provider-read\", reason: \"malformed\" }),\n }),\n ),\n Effect.timeoutOrElse({\n duration: Duration.millis(requestTimeoutMillis),\n orElse: () =>\n Effect.fail(ClientError.make({ operation: \"provider-read\", reason: \"timeout\" })),\n }),\n );\n\n const validateMediaUrl = (value: string): boolean => {\n try {\n const url = new URL(value);\n\n return (\n url.protocol === \"https:\" &&\n !url.username &&\n !url.password &&\n !url.hash &&\n artifactOrigins.has(url.origin) &&\n value.length <= 16_384\n );\n } catch {\n return false;\n }\n };\n\n const media = (\n url: Redacted.Redacted<string>,\n maximum: number,\n types: ReadonlyArray<string>,\n timeoutMillis = 60_000,\n outerDeadline?: number,\n ) =>\n Stream.unwrap(\n Effect.gen(function* () {\n const value = Redacted.value(url);\n\n if (\n !validateMediaUrl(value) ||\n !Number.isSafeInteger(maximum) ||\n maximum < 1 ||\n maximum > 2 ** 31 - 1 ||\n !Number.isSafeInteger(timeoutMillis) ||\n timeoutMillis < 1 ||\n timeoutMillis > 600_000\n ) {\n return yield* ClientError.make({ operation: \"media-download\", reason: \"unsafe-url\" });\n }\n const deadline = Math.min(yield* deadlineAfter(timeoutMillis), outerDeadline ?? Infinity);\n\n const response = yield* within(\n execute(HttpClientRequest.get(value), \"media-download\"),\n deadline,\n \"media-download\",\n );\n\n const stream = yield* inspectBytes(response, \"media-download\", types, maximum);\n\n return Stream.transformPull(stream, (pull) =>\n Effect.succeed(within(pull, deadline, \"media-download\")),\n );\n }),\n ).pipe(Stream.scoped);\n\n return {\n projectId: configured.projectId,\n json,\n noContent,\n upload,\n text,\n bytes,\n media,\n validateMediaUrl,\n };\n});\n","import { Config, Context, Effect, Layer, type Redacted, type Schema, type Stream } from \"effect\";\n\nimport type { ClientError } from \"./Errors.ts\";\nimport { makeTransport } from \"./internal/http/Transport.ts\";\n\n/** Account authority only. Launch recipes and browser-operation policy do not belong here. */\nexport interface ClientOptions {\n readonly projectId: string;\n readonly apiKey: Redacted.Redacted<string>;\n /** Exact HTTPS origins approved for credential-free media/artifact transfers. */\n readonly artifactOrigins?: ReadonlyArray<string>;\n readonly requestTimeoutMillis?: number;\n}\n\nexport type ClientMethod = \"GET\" | \"POST\" | \"PUT\" | \"PATCH\" | \"DELETE\";\n\n/** One bounded in-memory file part. A filesystem path is never a transport input. */\nexport interface MultipartFile {\n readonly field: string;\n readonly filename: string;\n readonly mediaType: string;\n readonly bytes: Uint8Array;\n}\n\n/** Upload bounds are caller-owned; an omitted timeout keeps the 60-second default. */\nexport interface UploadLimits {\n readonly maxBytes: number;\n readonly timeoutMillis?: number;\n}\n\n/**\n * One immutable Browserbase account and approved transport, shared by every resource Layer.\n * Constructing the Layer performs no request and never loads the native browser peer.\n */\nexport class BrowserbaseClient extends Context.Service<\n BrowserbaseClient,\n {\n readonly projectId: string;\n readonly json: (\n method: ClientMethod,\n path: string,\n body?: Schema.Json,\n outerDeadline?: number,\n ) => Effect.Effect<Schema.Json, ClientError>;\n readonly noContent: (\n method: Exclude<ClientMethod, \"GET\">,\n path: string,\n body?: Schema.Json,\n outerDeadline?: number,\n ) => Effect.Effect<void, ClientError>;\n /** One bounded multipart mutation. A lost reply stays unknown and is never retried. */\n readonly upload: (\n path: string,\n part: MultipartFile,\n limits: UploadLimits,\n outerDeadline?: number,\n ) => Effect.Effect<Schema.Json, ClientError>;\n readonly text: (\n path: string,\n maximum: number,\n types: ReadonlyArray<string>,\n ) => Effect.Effect<string, ClientError>;\n readonly bytes: (\n path: string,\n maximum: number,\n types: ReadonlyArray<string>,\n timeoutMillis?: number,\n outerDeadline?: number,\n ) => Stream.Stream<Uint8Array, ClientError>;\n readonly media: (\n url: Redacted.Redacted<string>,\n maximum: number,\n types: ReadonlyArray<string>,\n timeoutMillis?: number,\n outerDeadline?: number,\n ) => Stream.Stream<Uint8Array, ClientError>;\n readonly validateMediaUrl: (value: string) => boolean;\n }\n>()(\"effect-browserbase/Client\") {\n static layer(options: ClientOptions): Layer.Layer<BrowserbaseClient, ClientError> {\n return Layer.effect(\n BrowserbaseClient,\n makeTransport(options).pipe(\n Effect.map((client) => BrowserbaseClient.of(Object.freeze(client))),\n ),\n );\n }\n\n /**\n * Account authority from the application's `ConfigProvider` (the environment by default):\n * `BROWSERBASE_PROJECT_ID` and a redacted `BROWSERBASE_API_KEY`. Transport options stay\n * explicit. Configuration is read when the Layer is built, never at import.\n */\n static layerConfig(\n options: Omit<ClientOptions, \"projectId\" | \"apiKey\"> = {},\n ): Layer.Layer<BrowserbaseClient, ClientError | Config.ConfigError> {\n return Layer.unwrap(\n Effect.gen(function* () {\n const projectId = yield* Config.String(\"BROWSERBASE_PROJECT_ID\");\n const apiKey = yield* Config.Redacted(\"BROWSERBASE_API_KEY\");\n\n return BrowserbaseClient.layer({ ...options, projectId, apiKey });\n }),\n );\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Client-BQteUePT.mjs","names":[],"sources":["../src/internal/http/Multipart.ts","../src/internal/http/Transport.ts","../src/Client.ts"],"sourcesContent":["import { Schema } from \"effect\";\n\nimport type { MultipartFile } from \"../../Client.ts\";\nimport { SafeFilename } from \"../../Transfers.ts\";\n\n/** One file part is the only multipart shape this transport produces. */\nexport type MultipartResult =\n | {\n readonly _tag: \"Encoded\";\n readonly contentType: string;\n readonly body: Uint8Array;\n }\n | { readonly _tag: \"Rejected\"; readonly reason: \"configuration\" | \"limit\" };\n\nconst FIELD = /^[a-z][a-z0-9_]{0,31}$/;\nconst MEDIA_TYPE = /^[a-z0-9][a-z0-9!#$&^_+.-]{0,63}\\/[a-z0-9][a-z0-9!#$&^_+.-]{0,63}$/;\nconst PRINTABLE_ASCII = /^[\\x20-\\x7e]+$/;\n\nconst isSafeFilename = Schema.is(SafeFilename);\n\n/** Quoting is only safe for a portable, printable, quote-free basename. */\nconst quotable = (value: string): boolean =>\n isSafeFilename(value) && PRINTABLE_ASCII.test(value) && !value.includes('\"');\n\nconst randomBoundary = (): string => {\n const bytes = globalThis.crypto.getRandomValues(new Uint8Array(16));\n\n return `effect-agent-browserbase-${[...bytes].map((byte) => byte.toString(16).padStart(2, \"0\")).join(\"\")}`;\n};\n\nconst contains = (haystack: Uint8Array, needle: Uint8Array): boolean => {\n const first = needle[0];\n\n if (first === undefined || needle.length > haystack.length) return false;\n\n outer: for (let i = 0; i <= haystack.length - needle.length; i++) {\n if (haystack[i] !== first) continue;\n for (let j = 1; j < needle.length; j++) {\n const expected = needle[j];\n\n if (expected === undefined || haystack[i + j] !== expected) continue outer;\n }\n\n return true;\n }\n\n return false;\n};\n\n/**\n * A deliberately small RFC 7578 encoder: one file part, an ASCII-quotable name and a\n * delimiter proven absent from the content. It performs no filesystem or stream work.\n */\nexport const encodeFilePart = (\n part: MultipartFile,\n maxBytes: number,\n boundaries: () => string = randomBoundary,\n): MultipartResult => {\n if (\n !FIELD.test(part.field) ||\n !quotable(part.filename) ||\n !MEDIA_TYPE.test(part.mediaType) ||\n !Number.isSafeInteger(maxBytes) ||\n maxBytes < 1 ||\n maxBytes > 2 ** 31 - 1\n ) {\n return { _tag: \"Rejected\", reason: \"configuration\" };\n }\n if (part.bytes.byteLength > maxBytes) return { _tag: \"Rejected\", reason: \"limit\" };\n const encoder = new TextEncoder();\n\n for (let attempt = 0; attempt < 4; attempt++) {\n const boundary = boundaries();\n\n if (!/^[A-Za-z0-9-]{1,70}$/.test(boundary)) continue;\n const delimiter = encoder.encode(boundary);\n\n if (contains(part.bytes, delimiter)) continue;\n\n const head = encoder.encode(\n `--${boundary}\\r\\nContent-Disposition: form-data; name=\"${part.field}\"; filename=\"${part.filename}\"\\r\\nContent-Type: ${part.mediaType}\\r\\n\\r\\n`,\n );\n\n const tail = encoder.encode(`\\r\\n--${boundary}--\\r\\n`);\n const body = new Uint8Array(head.byteLength + part.bytes.byteLength + tail.byteLength);\n\n body.set(head, 0);\n body.set(part.bytes, head.byteLength);\n body.set(tail, head.byteLength + part.bytes.byteLength);\n\n return {\n _tag: \"Encoded\",\n contentType: `multipart/form-data; boundary=${boundary}`,\n body,\n };\n }\n\n return { _tag: \"Rejected\", reason: \"configuration\" };\n};\n","import { Clock, Duration, Effect, Redacted, Schema, Stream } from \"effect\";\nimport {\n FetchHttpClient,\n HttpClient,\n HttpClientRequest,\n type HttpClientResponse,\n} from \"effect/unstable/http\";\n\nimport type { ClientMethod, ClientOptions, MultipartFile, UploadLimits } from \"../../Client.ts\";\nimport { ClientError } from \"../../Errors.ts\";\nimport { Identifier } from \"../../References.ts\";\nimport { encodeFilePart } from \"./Multipart.ts\";\n\nconst API_ORIGIN = \"https://api.browserbase.com\";\nconst MAX_JSON_BYTES = 1024 * 1024;\nconst MAX_JSON_DEPTH = 64;\n\nconst Options = Schema.Struct({\n projectId: Identifier,\n apiKey: Schema.Redacted(\n Schema.NonEmptyString.check(Schema.isMaxLength(8192), Schema.isPattern(/^[\\x21-\\x7e]+$/)),\n ),\n artifactOrigins: Schema.optionalKey(\n Schema.Array(Schema.String.check(Schema.isMaxLength(8192))).check(\n Schema.isMaxLength(32),\n Schema.isUnique(),\n ),\n ),\n requestTimeoutMillis: Schema.optionalKey(\n Schema.Int.check(Schema.isBetween({ minimum: 1, maximum: 60_000 })),\n ),\n});\n\nconst nowMillis = Clock.monotonicTimeNanos.pipe(Effect.map((value) => Number(value) / 1_000_000));\n\nconst deadlineAfter = (millis: number) => nowMillis.pipe(Effect.map((now) => now + millis));\n\nconst within = <A, E, R>(\n effect: Effect.Effect<A, E, R>,\n deadline: number,\n operation: ClientError[\"operation\"],\n outcome?: \"undispatched\" | \"unknown\",\n): Effect.Effect<A, E | ClientError, R> =>\n Effect.suspend(() =>\n nowMillis.pipe(\n Effect.flatMap((now) => {\n const remaining = deadline - now;\n\n const timeout = () =>\n Effect.fail(\n ClientError.make({\n operation,\n reason: \"timeout\",\n ...(outcome === undefined ? {} : { outcome }),\n }),\n );\n\n return remaining <= 0\n ? timeout()\n : effect.pipe(\n Effect.timeoutOrElse({\n duration: Duration.millis(remaining),\n orElse: timeout,\n }),\n );\n }),\n ),\n );\n\nconst withinJsonDepth = (text: string): boolean => {\n let depth = 0;\n let quoted = false;\n let escaped = false;\n\n for (const character of text) {\n if (quoted) {\n if (escaped) escaped = false;\n else if (character === \"\\\\\") escaped = true;\n else if (character === '\"') quoted = false;\n } else if (character === '\"') quoted = true;\n else if (character === \"{\" || character === \"[\") {\n if (++depth > MAX_JSON_DEPTH) return false;\n } else if (character === \"}\" || character === \"]\") depth--;\n }\n\n return true;\n};\n\nconst mediaType = (value: string | undefined): string =>\n value?.split(\";\", 1)[0]?.trim().toLowerCase() ?? \"\";\n\nconst retryAfter = (value: string | undefined, now: number): number | undefined => {\n if (value === undefined || value.length > 128) return undefined;\n const seconds = Number(value);\n\n if (Number.isFinite(seconds) && seconds >= 0) return Math.min(60_000, seconds * 1000);\n const date = Date.parse(value);\n\n return Number.isFinite(date) ? Math.min(60_000, Math.max(0, date - now)) : undefined;\n};\n\nconst mutationOutcome = (\n method: ClientMethod,\n status?: number,\n): \"rejected\" | \"unknown\" | undefined => {\n if (method === \"GET\") return undefined;\n if (status !== undefined && [400, 401, 403, 404, 409, 410, 422, 429].includes(status)) {\n return \"rejected\";\n }\n\n return \"unknown\";\n};\n\nconst statusError = (\n method: ClientMethod,\n status: number,\n operation: ClientError[\"operation\"],\n after?: number,\n) =>\n ClientError.make({\n operation,\n reason:\n status === 401 || status === 403\n ? \"authorization\"\n : status === 429\n ? \"rate-limited\"\n : status === 409\n ? \"active\"\n : status === 410\n ? \"expired\"\n : status === 422\n ? \"disabled\"\n : status === 404\n ? \"not-found\"\n : \"provider\",\n status,\n ...(mutationOutcome(method, status) === undefined\n ? {}\n : { outcome: mutationOutcome(method, status) }),\n ...(after === undefined ? {} : { retryAfterMillis: after }),\n });\n\nconst collect = (\n stream: Stream.Stream<Uint8Array, ClientError>,\n maximum: number,\n operation: ClientError[\"operation\"],\n) =>\n Effect.gen(function* () {\n const chunks: Uint8Array[] = [];\n let total = 0;\n\n yield* Stream.runForEach(stream, (chunk) =>\n Effect.suspend(() => {\n if (chunk.byteLength > maximum - total) {\n return Effect.fail(ClientError.make({ operation, reason: \"limit\" }));\n }\n total += chunk.byteLength;\n chunks.push(chunk);\n\n return Effect.void;\n }),\n );\n\n const body = new Uint8Array(total);\n let offset = 0;\n\n for (const chunk of chunks) {\n body.set(chunk, offset);\n offset += chunk.byteLength;\n }\n\n return body;\n });\n\nconst validApiPath = (path: string): boolean =>\n path.startsWith(\"/v1/\") && !path.includes(\"\\\\\") && !path.includes(\"#\") && path.length <= 16_384;\n\nexport const makeTransport = Effect.fnUntraced(function* (options: ClientOptions) {\n const configured = yield* Schema.decodeEffect(Options)(options, {\n onExcessProperty: \"error\",\n }).pipe(\n Effect.mapError(() =>\n ClientError.make({\n operation: \"configure\",\n reason: \"configuration\",\n outcome: \"undispatched\",\n }),\n ),\n );\n\n const apiKey = Redacted.value(configured.apiKey);\n const requestTimeoutMillis = configured.requestTimeoutMillis ?? 10_000;\n const artifactOrigins = new Set<string>();\n\n for (const origin of configured.artifactOrigins ?? []) {\n const url = yield* Effect.try({\n try: () => new URL(origin),\n catch: () =>\n ClientError.make({\n operation: \"configure\",\n reason: \"configuration\",\n outcome: \"undispatched\",\n }),\n });\n\n if (url.protocol !== \"https:\" || url.origin !== origin || url.username || url.password) {\n return yield* ClientError.make({\n operation: \"configure\",\n reason: \"configuration\",\n outcome: \"undispatched\",\n });\n }\n artifactOrigins.add(origin);\n }\n\n const fetch = yield* FetchHttpClient.Fetch;\n const client = yield* HttpClient.HttpClient.pipe(Effect.provide(FetchHttpClient.layer));\n const scoped = HttpClient.withScope(client);\n\n const execute = (\n request: HttpClientRequest.HttpClientRequest,\n operation: ClientError[\"operation\"],\n outcome?: \"undispatched\" | \"unknown\",\n ) =>\n scoped.execute(request).pipe(\n Effect.provideService(FetchHttpClient.Fetch, fetch),\n Effect.provideService(FetchHttpClient.RequestInit, {\n redirect: \"manual\",\n credentials: \"omit\",\n cache: \"no-store\",\n referrerPolicy: \"no-referrer\",\n }),\n Effect.provideService(HttpClient.TracerDisabledWhen, () => true),\n Effect.provideService(HttpClient.TracerPropagationEnabled, false),\n Effect.withTracerEnabled(false),\n Effect.mapError(() =>\n ClientError.make({\n operation,\n reason: \"transport\",\n ...(outcome === undefined ? {} : { outcome }),\n }),\n ),\n );\n\n /** A rejected path is a typed, undispatched configuration failure, never a defect. */\n const apiRequest = (\n method: ClientMethod,\n path: string,\n accept: string,\n operation: ClientError[\"operation\"],\n ) =>\n validApiPath(path)\n ? Effect.succeed(\n HttpClientRequest.make(method)(`${API_ORIGIN}${path}`).pipe(\n HttpClientRequest.setHeader(\"x-bb-api-key\", apiKey),\n HttpClientRequest.setHeader(\"accept\", accept),\n ),\n )\n : Effect.fail(\n ClientError.make({ operation, reason: \"configuration\", outcome: \"undispatched\" }),\n );\n\n const inspectJson = Effect.fnUntraced(function* (\n method: ClientMethod,\n response: HttpClientResponse.HttpClientResponse,\n operation: ClientError[\"operation\"],\n ) {\n if (response.status !== 200 && response.status !== 201 && response.status !== 202) {\n return yield* statusError(\n method,\n response.status,\n operation,\n retryAfter(response.headers[\"retry-after\"], yield* Clock.currentTimeMillis),\n );\n }\n if (mediaType(response.headers[\"content-type\"]) !== \"application/json\") {\n return yield* ClientError.make({\n operation,\n reason: \"content-type\",\n ...(mutationOutcome(method) === undefined ? {} : { outcome: mutationOutcome(method) }),\n });\n }\n const length = response.headers[\"content-length\"];\n\n if (length !== undefined && (!/^\\d+$/.test(length) || Number(length) > MAX_JSON_BYTES)) {\n return yield* ClientError.make({\n operation,\n reason: \"limit\",\n ...(mutationOutcome(method) === undefined ? {} : { outcome: mutationOutcome(method) }),\n });\n }\n let received = 0;\n\n return response.stream.pipe(\n Stream.mapError(() =>\n ClientError.make({\n operation,\n reason: \"transport\",\n ...(mutationOutcome(method) === undefined ? {} : { outcome: mutationOutcome(method) }),\n }),\n ),\n Stream.mapEffect((chunk) =>\n Effect.suspend(() => {\n if (chunk.byteLength > MAX_JSON_BYTES - received) {\n return Effect.fail(\n ClientError.make({\n operation,\n reason: \"limit\",\n ...(mutationOutcome(method) === undefined\n ? {}\n : { outcome: mutationOutcome(method) }),\n }),\n );\n }\n received += chunk.byteLength;\n\n return Effect.succeed(new Uint8Array(chunk));\n }),\n ),\n );\n });\n\n const readJson = Effect.fnUntraced(function* (\n method: ClientMethod,\n response: HttpClientResponse.HttpClientResponse,\n operation: ClientError[\"operation\"],\n ) {\n const stream = yield* inspectJson(method, response, operation);\n const bytes = yield* collect(stream, MAX_JSON_BYTES, operation);\n\n const text = yield* Effect.try({\n try: () => new TextDecoder(\"utf-8\", { fatal: true }).decode(bytes),\n catch: () =>\n ClientError.make({\n operation,\n reason: \"malformed\",\n ...(mutationOutcome(method) === undefined ? {} : { outcome: mutationOutcome(method) }),\n }),\n });\n\n if (!withinJsonDepth(text)) {\n return yield* ClientError.make({\n operation,\n reason: \"limit\",\n ...(mutationOutcome(method) === undefined ? {} : { outcome: mutationOutcome(method) }),\n });\n }\n\n return yield* Schema.decodeEffect(Schema.fromJsonString(Schema.Json))(text).pipe(\n Effect.mapError(() =>\n ClientError.make({\n operation,\n reason: \"malformed\",\n ...(mutationOutcome(method) === undefined ? {} : { outcome: mutationOutcome(method) }),\n }),\n ),\n );\n });\n\n const jsonOnce = Effect.fnUntraced(function* (\n method: ClientMethod,\n path: string,\n body?: Schema.Json,\n ) {\n const operation = method === \"GET\" ? \"provider-read\" : \"provider-mutation\";\n let request = yield* apiRequest(method, path, \"application/json\", operation);\n\n if (body !== undefined) {\n request = yield* HttpClientRequest.bodyJson(request, body).pipe(\n Effect.mapError(() =>\n ClientError.make({\n operation,\n reason: \"configuration\",\n outcome: \"undispatched\",\n }),\n ),\n );\n }\n const response = yield* execute(request, operation, method === \"GET\" ? undefined : \"unknown\");\n\n return yield* readJson(method, response, operation);\n });\n\n /**\n * One bounded in-memory file part. The encoder proves its delimiter absent from the\n * content, and an accepted multipart mutation is never retried: a lost reply is unknown.\n */\n const upload = Effect.fnUntraced(function* (\n path: string,\n part: MultipartFile,\n limits: UploadLimits,\n outerDeadline?: number,\n ) {\n const operation = \"provider-upload\";\n const timeoutMillis = limits.timeoutMillis ?? 60_000;\n\n if (!Number.isSafeInteger(timeoutMillis) || timeoutMillis < 1 || timeoutMillis > 600_000) {\n return yield* ClientError.make({\n operation,\n reason: \"configuration\",\n outcome: \"undispatched\",\n });\n }\n\n const encoded = encodeFilePart(part, limits.maxBytes);\n\n if (encoded._tag === \"Rejected\") {\n return yield* ClientError.make({\n operation,\n reason: encoded.reason,\n outcome: \"undispatched\",\n });\n }\n\n const request = HttpClientRequest.bodyUint8Array(\n yield* apiRequest(\"POST\", path, \"application/json\", operation),\n encoded.body,\n encoded.contentType,\n );\n\n const deadline = Math.min(yield* deadlineAfter(timeoutMillis), outerDeadline ?? Infinity);\n\n return yield* within(\n Effect.scoped(\n execute(request, operation, \"unknown\").pipe(\n Effect.flatMap((response) => readJson(\"POST\", response, operation)),\n ),\n ),\n deadline,\n operation,\n \"unknown\",\n );\n });\n\n const json = Effect.fnUntraced(function* (\n method: ClientMethod,\n path: string,\n body?: Schema.Json,\n outerDeadline?: number,\n ) {\n const deadline = Math.min(\n yield* deadlineAfter(requestTimeoutMillis),\n outerDeadline ?? Infinity,\n );\n\n for (let attempt = 0; ; attempt++) {\n const result = yield* within(\n Effect.scoped(jsonOnce(method, path, body)),\n deadline,\n // A request that times out is labelled like the same request failing any other way.\n method === \"GET\" ? \"provider-read\" : \"provider-mutation\",\n method === \"GET\" ? undefined : \"unknown\",\n ).pipe(Effect.result);\n\n if (result._tag === \"Success\") return result.success;\n const error = result.failure;\n\n const retryable =\n error.reason === \"transport\" ||\n error.reason === \"rate-limited\" ||\n (error.reason === \"provider\" && (error.status ?? 0) >= 500);\n\n if (method !== \"GET\" || !retryable || attempt >= 2) return yield* error;\n const delay = error.retryAfterMillis ?? (attempt + 1) * 150;\n\n if ((yield* nowMillis) + delay >= deadline) return yield* error;\n yield* Effect.sleep(delay);\n }\n });\n\n const noContent = Effect.fnUntraced(function* (\n method: Exclude<ClientMethod, \"GET\">,\n path: string,\n body?: Schema.Json,\n outerDeadline?: number,\n ) {\n const operation = \"provider-mutation\";\n let request = yield* apiRequest(method, path, \"*/*\", operation);\n\n if (body !== undefined) {\n request = yield* HttpClientRequest.bodyJson(request, body).pipe(\n Effect.mapError(() =>\n ClientError.make({\n operation,\n reason: \"configuration\",\n outcome: \"undispatched\",\n }),\n ),\n );\n }\n\n const deadline = Math.min(\n yield* deadlineAfter(requestTimeoutMillis),\n outerDeadline ?? Infinity,\n );\n\n const response = yield* within(\n Effect.scoped(execute(request, operation, \"unknown\")),\n deadline,\n operation,\n \"unknown\",\n );\n\n if (![200, 202, 204].includes(response.status)) {\n return yield* statusError(\n method,\n response.status,\n operation,\n retryAfter(response.headers[\"retry-after\"], yield* Clock.currentTimeMillis),\n );\n }\n });\n\n const inspectBytes = Effect.fnUntraced(function* (\n response: HttpClientResponse.HttpClientResponse,\n operation: ClientError[\"operation\"],\n types: ReadonlyArray<string>,\n maximum: number,\n ) {\n if (response.status !== 200 && response.status !== 206) {\n return yield* statusError(\n \"GET\",\n response.status,\n operation,\n retryAfter(response.headers[\"retry-after\"], yield* Clock.currentTimeMillis),\n );\n }\n if (!types.includes(mediaType(response.headers[\"content-type\"]))) {\n return yield* ClientError.make({ operation, reason: \"content-type\" });\n }\n const length = response.headers[\"content-length\"];\n\n if (length !== undefined && (!/^\\d+$/.test(length) || Number(length) > maximum)) {\n return yield* ClientError.make({ operation, reason: \"limit\" });\n }\n let received = 0;\n\n return response.stream.pipe(\n Stream.mapError(() => ClientError.make({ operation, reason: \"transport\" })),\n Stream.mapEffect((chunk) =>\n Effect.suspend(() => {\n if (chunk.byteLength > maximum - received) {\n return Effect.fail(ClientError.make({ operation, reason: \"limit\" }));\n }\n received += chunk.byteLength;\n\n return Effect.succeed(new Uint8Array(chunk));\n }),\n ),\n );\n });\n\n const bytes = (\n path: string,\n maximum: number,\n types: ReadonlyArray<string>,\n timeoutMillis = requestTimeoutMillis,\n outerDeadline?: number,\n ) =>\n Stream.unwrap(\n Effect.gen(function* () {\n // A bounded authenticated read. Resource services relabel it with their own operation.\n const operation = \"provider-read\";\n\n if (\n !Number.isSafeInteger(maximum) ||\n maximum < 1 ||\n maximum > 2 ** 31 - 1 ||\n !Number.isSafeInteger(timeoutMillis) ||\n timeoutMillis < 1 ||\n timeoutMillis > 600_000\n ) {\n return yield* ClientError.make({ operation, reason: \"configuration\" });\n }\n const deadline = Math.min(yield* deadlineAfter(timeoutMillis), outerDeadline ?? Infinity);\n\n const request = yield* apiRequest(\n \"GET\",\n path,\n types[0] ?? \"application/octet-stream\",\n operation,\n );\n\n const response = yield* within(execute(request, operation), deadline, operation);\n\n const stream = yield* inspectBytes(response, operation, types, maximum);\n\n return Stream.transformPull(stream, (pull) =>\n Effect.succeed(within(pull, deadline, operation)),\n );\n }),\n ).pipe(Stream.scoped);\n\n const text = (path: string, maximum: number, types: ReadonlyArray<string>) =>\n collect(bytes(path, maximum, types), maximum, \"provider-read\").pipe(\n Effect.flatMap((body) =>\n Effect.try({\n try: () => new TextDecoder(\"utf-8\", { fatal: true }).decode(body),\n catch: () => ClientError.make({ operation: \"provider-read\", reason: \"malformed\" }),\n }),\n ),\n Effect.timeoutOrElse({\n duration: Duration.millis(requestTimeoutMillis),\n orElse: () =>\n Effect.fail(ClientError.make({ operation: \"provider-read\", reason: \"timeout\" })),\n }),\n );\n\n const validateMediaUrl = (value: string): boolean => {\n try {\n const url = new URL(value);\n\n return (\n url.protocol === \"https:\" &&\n !url.username &&\n !url.password &&\n !url.hash &&\n artifactOrigins.has(url.origin) &&\n value.length <= 16_384\n );\n } catch {\n return false;\n }\n };\n\n const media = (\n url: Redacted.Redacted<string>,\n maximum: number,\n types: ReadonlyArray<string>,\n timeoutMillis = 60_000,\n outerDeadline?: number,\n ) =>\n Stream.unwrap(\n Effect.gen(function* () {\n const value = Redacted.value(url);\n\n if (\n !validateMediaUrl(value) ||\n !Number.isSafeInteger(maximum) ||\n maximum < 1 ||\n maximum > 2 ** 31 - 1 ||\n !Number.isSafeInteger(timeoutMillis) ||\n timeoutMillis < 1 ||\n timeoutMillis > 600_000\n ) {\n return yield* ClientError.make({ operation: \"media-download\", reason: \"unsafe-url\" });\n }\n const deadline = Math.min(yield* deadlineAfter(timeoutMillis), outerDeadline ?? Infinity);\n\n const response = yield* within(\n execute(HttpClientRequest.get(value), \"media-download\"),\n deadline,\n \"media-download\",\n );\n\n const stream = yield* inspectBytes(response, \"media-download\", types, maximum);\n\n return Stream.transformPull(stream, (pull) =>\n Effect.succeed(within(pull, deadline, \"media-download\")),\n );\n }),\n ).pipe(Stream.scoped);\n\n return {\n projectId: configured.projectId,\n json,\n noContent,\n upload,\n text,\n bytes,\n media,\n validateMediaUrl,\n };\n});\n","import { Config, Context, Effect, Layer, type Redacted, type Schema, type Stream } from \"effect\";\n\nimport type { ClientError } from \"./Errors.ts\";\nimport { makeTransport } from \"./internal/http/Transport.ts\";\n\n/** Account authority only. Launch recipes and browser-operation policy do not belong here. */\nexport interface ClientOptions {\n readonly projectId: string;\n readonly apiKey: Redacted.Redacted<string>;\n /** Exact HTTPS origins approved for credential-free media/artifact transfers. */\n readonly artifactOrigins?: ReadonlyArray<string>;\n readonly requestTimeoutMillis?: number;\n}\n\nexport type ClientMethod = \"GET\" | \"POST\" | \"PUT\" | \"PATCH\" | \"DELETE\";\n\n/** One bounded in-memory file part. A filesystem path is never a transport input. */\nexport interface MultipartFile {\n readonly field: string;\n readonly filename: string;\n readonly mediaType: string;\n readonly bytes: Uint8Array;\n}\n\n/** Upload bounds are caller-owned; an omitted timeout keeps the 60-second default. */\nexport interface UploadLimits {\n readonly maxBytes: number;\n readonly timeoutMillis?: number;\n}\n\n/**\n * One immutable Browserbase account and approved transport, shared by every resource Layer.\n * Constructing the Layer performs no request and never loads the native browser peer.\n */\nexport class BrowserbaseClient extends Context.Service<\n BrowserbaseClient,\n {\n readonly projectId: string;\n readonly json: (\n method: ClientMethod,\n path: string,\n body?: Schema.Json,\n outerDeadline?: number,\n ) => Effect.Effect<Schema.Json, ClientError>;\n readonly noContent: (\n method: Exclude<ClientMethod, \"GET\">,\n path: string,\n body?: Schema.Json,\n outerDeadline?: number,\n ) => Effect.Effect<void, ClientError>;\n /** One bounded multipart mutation. A lost reply stays unknown and is never retried. */\n readonly upload: (\n path: string,\n part: MultipartFile,\n limits: UploadLimits,\n outerDeadline?: number,\n ) => Effect.Effect<Schema.Json, ClientError>;\n readonly text: (\n path: string,\n maximum: number,\n types: ReadonlyArray<string>,\n ) => Effect.Effect<string, ClientError>;\n readonly bytes: (\n path: string,\n maximum: number,\n types: ReadonlyArray<string>,\n timeoutMillis?: number,\n outerDeadline?: number,\n ) => Stream.Stream<Uint8Array, ClientError>;\n readonly media: (\n url: Redacted.Redacted<string>,\n maximum: number,\n types: ReadonlyArray<string>,\n timeoutMillis?: number,\n outerDeadline?: number,\n ) => Stream.Stream<Uint8Array, ClientError>;\n readonly validateMediaUrl: (value: string) => boolean;\n }\n>()(\"effect-browserbase/Client\") {\n static layer(options: ClientOptions): Layer.Layer<BrowserbaseClient, ClientError> {\n return Layer.effect(\n BrowserbaseClient,\n makeTransport(options).pipe(\n Effect.map((client) => BrowserbaseClient.of(Object.freeze(client))),\n ),\n );\n }\n\n /**\n * Account authority from the application's `ConfigProvider` (the environment by default):\n * `BROWSERBASE_PROJECT_ID` and a redacted `BROWSERBASE_API_KEY`. Transport options stay\n * explicit. Configuration is read when the Layer is built, never at import.\n */\n static layerConfig(\n options: Omit<ClientOptions, \"projectId\" | \"apiKey\"> = {},\n ): Layer.Layer<BrowserbaseClient, ClientError | Config.ConfigError> {\n return Layer.unwrap(\n Effect.gen(function* () {\n const projectId = yield* Config.String(\"BROWSERBASE_PROJECT_ID\");\n const apiKey = yield* Config.Redacted(\"BROWSERBASE_API_KEY\");\n\n return BrowserbaseClient.layer({ ...options, projectId, apiKey });\n }),\n );\n }\n}\n"],"mappings":"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"}
|
package/dist/Client.d.mts
CHANGED
|
@@ -1,2 +1,51 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
1
|
+
import { ClientError } from "./Errors.mjs";
|
|
2
|
+
import { Config, Context, Effect, Layer, Redacted, Schema, Stream } from "effect";
|
|
3
|
+
//#region src/Client.d.ts
|
|
4
|
+
/** Account authority only. Launch recipes and browser-operation policy do not belong here. */
|
|
5
|
+
export interface ClientOptions {
|
|
6
|
+
readonly projectId: string;
|
|
7
|
+
readonly apiKey: Redacted.Redacted<string>;
|
|
8
|
+
/** Exact HTTPS origins approved for credential-free media/artifact transfers. */
|
|
9
|
+
readonly artifactOrigins?: ReadonlyArray<string>;
|
|
10
|
+
readonly requestTimeoutMillis?: number;
|
|
11
|
+
}
|
|
12
|
+
export type ClientMethod = "GET" | "POST" | "PUT" | "PATCH" | "DELETE";
|
|
13
|
+
/** One bounded in-memory file part. A filesystem path is never a transport input. */
|
|
14
|
+
export interface MultipartFile {
|
|
15
|
+
readonly field: string;
|
|
16
|
+
readonly filename: string;
|
|
17
|
+
readonly mediaType: string;
|
|
18
|
+
readonly bytes: Uint8Array;
|
|
19
|
+
}
|
|
20
|
+
/** Upload bounds are caller-owned; an omitted timeout keeps the 60-second default. */
|
|
21
|
+
export interface UploadLimits {
|
|
22
|
+
readonly maxBytes: number;
|
|
23
|
+
readonly timeoutMillis?: number;
|
|
24
|
+
}
|
|
25
|
+
declare const BrowserbaseClient_base: Context.ServiceClass<BrowserbaseClient, "effect-browserbase/Client", {
|
|
26
|
+
readonly projectId: string;
|
|
27
|
+
readonly json: (method: ClientMethod, path: string, body?: Schema.Json, outerDeadline?: number) => Effect.Effect<Schema.Json, ClientError>;
|
|
28
|
+
readonly noContent: (method: Exclude<ClientMethod, "GET">, path: string, body?: Schema.Json, outerDeadline?: number) => Effect.Effect<void, ClientError>;
|
|
29
|
+
/** One bounded multipart mutation. A lost reply stays unknown and is never retried. */
|
|
30
|
+
readonly upload: (path: string, part: MultipartFile, limits: UploadLimits, outerDeadline?: number) => Effect.Effect<Schema.Json, ClientError>;
|
|
31
|
+
readonly text: (path: string, maximum: number, types: ReadonlyArray<string>) => Effect.Effect<string, ClientError>;
|
|
32
|
+
readonly bytes: (path: string, maximum: number, types: ReadonlyArray<string>, timeoutMillis?: number, outerDeadline?: number) => Stream.Stream<Uint8Array, ClientError>;
|
|
33
|
+
readonly media: (url: Redacted.Redacted<string>, maximum: number, types: ReadonlyArray<string>, timeoutMillis?: number, outerDeadline?: number) => Stream.Stream<Uint8Array, ClientError>;
|
|
34
|
+
readonly validateMediaUrl: (value: string) => boolean;
|
|
35
|
+
}>;
|
|
36
|
+
/**
|
|
37
|
+
* One immutable Browserbase account and approved transport, shared by every resource Layer.
|
|
38
|
+
* Constructing the Layer performs no request and never loads the native browser peer.
|
|
39
|
+
*/
|
|
40
|
+
export declare class BrowserbaseClient extends BrowserbaseClient_base {
|
|
41
|
+
static layer(options: ClientOptions): Layer.Layer<BrowserbaseClient, ClientError>;
|
|
42
|
+
/**
|
|
43
|
+
* Account authority from the application's `ConfigProvider` (the environment by default):
|
|
44
|
+
* `BROWSERBASE_PROJECT_ID` and a redacted `BROWSERBASE_API_KEY`. Transport options stay
|
|
45
|
+
* explicit. Configuration is read when the Layer is built, never at import.
|
|
46
|
+
*/
|
|
47
|
+
static layerConfig(options?: Omit<ClientOptions, "projectId" | "apiKey">): Layer.Layer<BrowserbaseClient, ClientError | Config.ConfigError>;
|
|
48
|
+
}
|
|
49
|
+
//#endregion
|
|
50
|
+
export {};
|
|
51
|
+
//# sourceMappingURL=Client.d.mts.map
|
package/dist/Client.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { t as BrowserbaseClient } from "./Client-
|
|
1
|
+
import { t as BrowserbaseClient } from "./Client-BQteUePT.mjs";
|
|
2
2
|
export { BrowserbaseClient };
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { SessionReference } from "./References.mjs";
|
|
2
|
+
import { SessionError } from "./Errors.mjs";
|
|
3
|
+
import { ProviderSession } from "./SessionData.mjs";
|
|
4
|
+
import { n as nowMillis, r as until, t as deadlineAfter } from "./Deadline-CrViaogr.mjs";
|
|
5
|
+
import { Effect, Redacted, Schema } from "effect";
|
|
6
|
+
import { BrowserError, Reasons } from "effect-browser/errors";
|
|
7
|
+
//#region src/internal/provider/Connection.ts
|
|
8
|
+
const Connection = Schema.Struct({
|
|
9
|
+
...ProviderSession.fields,
|
|
10
|
+
connectUrl: Schema.String.check(Schema.isMaxLength(16384))
|
|
11
|
+
});
|
|
12
|
+
/** A provider-issued endpoint is authority, not a persisted session identifier. */
|
|
13
|
+
const connectionUrl = Schema.String.check(Schema.isMaxLength(16384), Schema.makeFilter((value) => {
|
|
14
|
+
try {
|
|
15
|
+
const url = new URL(value);
|
|
16
|
+
return url.protocol === "wss:" && !url.username && !url.password && !url.port && !url.hash && url.hostname.endsWith(".browserbase.com");
|
|
17
|
+
} catch {
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
}));
|
|
21
|
+
/** The provider endpoint is validated before any custom routing gets to observe it. */
|
|
22
|
+
const validateConnection = (connection) => {
|
|
23
|
+
if (typeof connection !== "string" || connection.length > 16384) throw BrowserError.make({
|
|
24
|
+
operation: "connect",
|
|
25
|
+
reason: Reasons.Malformed.make({}),
|
|
26
|
+
outcome: "undispatched"
|
|
27
|
+
});
|
|
28
|
+
try {
|
|
29
|
+
new URL(connection);
|
|
30
|
+
} catch {
|
|
31
|
+
throw BrowserError.make({
|
|
32
|
+
operation: "connect",
|
|
33
|
+
reason: Reasons.Malformed.make({}),
|
|
34
|
+
outcome: "undispatched"
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
if (!Schema.is(connectionUrl)(connection)) throw BrowserError.make({
|
|
38
|
+
operation: "connect",
|
|
39
|
+
reason: Reasons.UnsafeUrl.make({}),
|
|
40
|
+
outcome: "undispatched"
|
|
41
|
+
});
|
|
42
|
+
return connection;
|
|
43
|
+
};
|
|
44
|
+
const connectionAddress = Effect.fnUntraced(function* (client, sessions, reference, remainingMillis) {
|
|
45
|
+
const timeoutMillis = Math.min(6e5, remainingMillis);
|
|
46
|
+
const fail = (reason) => SessionError.make({
|
|
47
|
+
operation: "session-connect",
|
|
48
|
+
reason
|
|
49
|
+
});
|
|
50
|
+
const ref = yield* Schema.decodeEffect(SessionReference)(reference).pipe(Effect.mapError(() => fail("configuration")));
|
|
51
|
+
if (ref.projectId !== client.projectId) return yield* fail("authorization");
|
|
52
|
+
const deadline = yield* deadlineAfter(timeoutMillis);
|
|
53
|
+
yield* sessions.waitUntilRunning(ref, { timeoutMillis });
|
|
54
|
+
if ((yield* nowMillis) >= deadline) return yield* fail("timeout");
|
|
55
|
+
const raw = yield* until(client.json("GET", `/v1/sessions/${encodeURIComponent(ref.sessionId)}`, void 0, deadline), deadline, () => fail("timeout")).pipe(Effect.mapError((error) => fail(error.reason)));
|
|
56
|
+
const value = yield* Schema.decodeUnknownEffect(Connection)(raw).pipe(Effect.mapError(() => fail("malformed")));
|
|
57
|
+
if (value.id !== ref.sessionId || value.projectId !== ref.projectId) return yield* fail("malformed");
|
|
58
|
+
if (value.status !== "RUNNING") return yield* fail("expired");
|
|
59
|
+
const url = yield* Schema.decodeEffect(connectionUrl)(value.connectUrl).pipe(Effect.mapError(() => fail("unsafe-url")));
|
|
60
|
+
return Redacted.make(url);
|
|
61
|
+
});
|
|
62
|
+
//#endregion
|
|
63
|
+
export { validateConnection as n, connectionAddress as t };
|
|
64
|
+
|
|
65
|
+
//# sourceMappingURL=Connection-DcvJZEdc.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Connection-DcvJZEdc.mjs","names":[],"sources":["../src/internal/provider/Connection.ts"],"sourcesContent":["import { Effect, Redacted, Schema } from \"effect\";\nimport { BrowserError, Reasons } from \"effect-browser/errors\";\n\nimport type { BrowserbaseClient } from \"../../Client.ts\";\nimport { SessionError } from \"../../Errors.ts\";\nimport { SessionReference } from \"../../References.ts\";\nimport { ProviderSession } from \"../../SessionData.ts\";\nimport type { BrowserbaseSessions } from \"../../Sessions.ts\";\nimport { deadlineAfter, nowMillis, until } from \"../Deadline.ts\";\n\nconst Connection = Schema.Struct({\n ...ProviderSession.fields,\n connectUrl: Schema.String.check(Schema.isMaxLength(16384)),\n});\n\n/** A provider-issued endpoint is authority, not a persisted session identifier. */\nexport const connectionUrl = Schema.String.check(\n Schema.isMaxLength(16384),\n Schema.makeFilter((value) => {\n try {\n const url = new URL(value);\n\n return (\n url.protocol === \"wss:\" &&\n !url.username &&\n !url.password &&\n !url.port &&\n !url.hash &&\n url.hostname.endsWith(\".browserbase.com\")\n );\n } catch {\n return false;\n }\n }),\n);\n\n/** The provider endpoint is validated before any custom routing gets to observe it. */\nexport const validateConnection = (connection: unknown): string => {\n if (typeof connection !== \"string\" || connection.length > 16384)\n throw BrowserError.make({\n operation: \"connect\",\n reason: Reasons.Malformed.make({}),\n outcome: \"undispatched\",\n });\n try {\n new URL(connection);\n } catch {\n throw BrowserError.make({\n operation: \"connect\",\n reason: Reasons.Malformed.make({}),\n outcome: \"undispatched\",\n });\n }\n if (!Schema.is(connectionUrl)(connection))\n throw BrowserError.make({\n operation: \"connect\",\n reason: Reasons.UnsafeUrl.make({}),\n outcome: \"undispatched\",\n });\n\n return connection;\n};\n\nexport const connectionAddress = Effect.fnUntraced(function* (\n client: BrowserbaseClient[\"Service\"],\n sessions: BrowserbaseSessions[\"Service\"],\n reference: SessionReference,\n remainingMillis: number,\n) {\n const timeoutMillis = Math.min(600_000, remainingMillis);\n\n const fail = (reason: SessionError[\"reason\"]) =>\n SessionError.make({ operation: \"session-connect\", reason });\n\n const ref = yield* Schema.decodeEffect(SessionReference)(reference).pipe(\n Effect.mapError(() => fail(\"configuration\")),\n );\n\n if (ref.projectId !== client.projectId) return yield* fail(\"authorization\");\n const deadline = yield* deadlineAfter(timeoutMillis);\n\n yield* sessions.waitUntilRunning(ref, { timeoutMillis });\n if ((yield* nowMillis) >= deadline) return yield* fail(\"timeout\");\n\n const raw = yield* until(\n client.json(\"GET\", `/v1/sessions/${encodeURIComponent(ref.sessionId)}`, undefined, deadline),\n deadline,\n () => fail(\"timeout\"),\n ).pipe(Effect.mapError((error) => fail(error.reason)));\n\n const value = yield* Schema.decodeUnknownEffect(Connection)(raw).pipe(\n Effect.mapError(() => fail(\"malformed\")),\n );\n\n if (value.id !== ref.sessionId || value.projectId !== ref.projectId)\n return yield* fail(\"malformed\");\n if (value.status !== \"RUNNING\") return yield* fail(\"expired\");\n\n const url = yield* Schema.decodeEffect(connectionUrl)(value.connectUrl).pipe(\n Effect.mapError(() => fail(\"unsafe-url\")),\n );\n\n return Redacted.make(url);\n});\n"],"mappings":";;;;;;;AAUA,MAAM,aAAa,OAAO,OAAO;CAC/B,GAAG,gBAAgB;CACnB,YAAY,OAAO,OAAO,MAAM,OAAO,YAAY,KAAK,CAAC;AAC3D,CAAC;;AAGD,MAAa,gBAAgB,OAAO,OAAO,MACzC,OAAO,YAAY,KAAK,GACxB,OAAO,YAAY,UAAU;CAC3B,IAAI;EACF,MAAM,MAAM,IAAI,IAAI,KAAK;EAEzB,OACE,IAAI,aAAa,UACjB,CAAC,IAAI,YACL,CAAC,IAAI,YACL,CAAC,IAAI,QACL,CAAC,IAAI,QACL,IAAI,SAAS,SAAS,kBAAkB;CAE5C,QAAQ;EACN,OAAO;CACT;AACF,CAAC,CACH;;AAGA,MAAa,sBAAsB,eAAgC;CACjE,IAAI,OAAO,eAAe,YAAY,WAAW,SAAS,OACxD,MAAM,aAAa,KAAK;EACtB,WAAW;EACX,QAAQ,QAAQ,UAAU,KAAK,CAAC,CAAC;EACjC,SAAS;CACX,CAAC;CACH,IAAI;EACF,IAAI,IAAI,UAAU;CACpB,QAAQ;EACN,MAAM,aAAa,KAAK;GACtB,WAAW;GACX,QAAQ,QAAQ,UAAU,KAAK,CAAC,CAAC;GACjC,SAAS;EACX,CAAC;CACH;CACA,IAAI,CAAC,OAAO,GAAG,aAAa,CAAC,CAAC,UAAU,GACtC,MAAM,aAAa,KAAK;EACtB,WAAW;EACX,QAAQ,QAAQ,UAAU,KAAK,CAAC,CAAC;EACjC,SAAS;CACX,CAAC;CAEH,OAAO;AACT;AAEA,MAAa,oBAAoB,OAAO,WAAW,WACjD,QACA,UACA,WACA,iBACA;CACA,MAAM,gBAAgB,KAAK,IAAI,KAAS,eAAe;CAEvD,MAAM,QAAQ,WACZ,aAAa,KAAK;EAAE,WAAW;EAAmB;CAAO,CAAC;CAE5D,MAAM,MAAM,OAAO,OAAO,aAAa,gBAAgB,CAAC,CAAC,SAAS,CAAC,CAAC,KAClE,OAAO,eAAe,KAAK,eAAe,CAAC,CAC7C;CAEA,IAAI,IAAI,cAAc,OAAO,WAAW,OAAO,OAAO,KAAK,eAAe;CAC1E,MAAM,WAAW,OAAO,cAAc,aAAa;CAEnD,OAAO,SAAS,iBAAiB,KAAK,EAAE,cAAc,CAAC;CACvD,KAAK,OAAO,cAAc,UAAU,OAAO,OAAO,KAAK,SAAS;CAEhE,MAAM,MAAM,OAAO,MACjB,OAAO,KAAK,OAAO,gBAAgB,mBAAmB,IAAI,SAAS,KAAK,KAAA,GAAW,QAAQ,GAC3F,gBACM,KAAK,SAAS,CACtB,CAAC,CAAC,KAAK,OAAO,UAAU,UAAU,KAAK,MAAM,MAAM,CAAC,CAAC;CAErD,MAAM,QAAQ,OAAO,OAAO,oBAAoB,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,KAC/D,OAAO,eAAe,KAAK,WAAW,CAAC,CACzC;CAEA,IAAI,MAAM,OAAO,IAAI,aAAa,MAAM,cAAc,IAAI,WACxD,OAAO,OAAO,KAAK,WAAW;CAChC,IAAI,MAAM,WAAW,WAAW,OAAO,OAAO,KAAK,SAAS;CAE5D,MAAM,MAAM,OAAO,OAAO,aAAa,aAAa,CAAC,CAAC,MAAM,UAAU,CAAC,CAAC,KACtE,OAAO,eAAe,KAAK,YAAY,CAAC,CAC1C;CAEA,OAAO,SAAS,KAAK,GAAG;AAC1B,CAAC"}
|
|
@@ -1,10 +1,8 @@
|
|
|
1
|
-
import { n as ContextReference } from "./References-
|
|
1
|
+
import { n as ContextReference } from "./References-DOH3Wu44.mjs";
|
|
2
2
|
import { ContextError } from "./Errors.mjs";
|
|
3
|
-
import { a as WriterLease, i as WriterAttemptFacts, n as ContextWriterPermit, o as WriterOptions, r as PersistenceEvidence, s as WriterSettlementFacts, t as ContextWriterBackend } from "./WriterFacts-
|
|
3
|
+
import { a as WriterLease, i as WriterAttemptFacts, n as ContextWriterPermit, o as WriterOptions, r as PersistenceEvidence, s as WriterSettlementFacts, t as ContextWriterBackend } from "./WriterFacts-5CPBGG1P.mjs";
|
|
4
4
|
import { Effect, Scope } from "effect";
|
|
5
|
-
|
|
6
|
-
export { ContextWriterBackend, ContextWriterPermit, PersistenceEvidence, WriterAttemptFacts, WriterLease, WriterOptions, WriterSettlementFacts, withWriter };
|
|
7
|
-
}
|
|
5
|
+
//#region src/ContextCoordination.d.ts
|
|
8
6
|
/**
|
|
9
7
|
* Owns the backend lease, child browser scopes, and exact attempt evidence. The backend must
|
|
10
8
|
* handle uncertain distributed lease acquisition itself. It must persist quarantine facts;
|
|
@@ -12,5 +10,6 @@ declare namespace ContextCoordination_d_exports {
|
|
|
12
10
|
*/
|
|
13
11
|
export declare const withWriter: <A, E, R, LeaseE, LeaseR, VerifyE = never, VerifyR = never>(backend: ContextWriterBackend<LeaseE, LeaseR>, reference: ContextReference, use: (permit: ContextWriterPermit) => Effect.Effect<A, E, R>, options?: WriterOptions<A, VerifyE, VerifyR>) => Effect.Effect<A, E | LeaseE | VerifyE | ContextError, Exclude<R | LeaseR | VerifyR, Scope.Scope>>;
|
|
14
12
|
//#endregion
|
|
15
|
-
export { type ContextWriterBackend, type ContextWriterPermit, PersistenceEvidence, WriterAttemptFacts, type WriterLease, type WriterOptions, WriterSettlementFacts
|
|
13
|
+
export { type ContextWriterBackend, type ContextWriterPermit, PersistenceEvidence, WriterAttemptFacts, type WriterLease, type WriterOptions, WriterSettlementFacts };
|
|
14
|
+
export {};
|
|
16
15
|
//# sourceMappingURL=ContextCoordination.d.mts.map
|
|
@@ -1,15 +1,8 @@
|
|
|
1
|
-
import { t as __exportAll } from "./rolldown-runtime-D7D4PA-g.mjs";
|
|
2
1
|
import { ContextReference } from "./References.mjs";
|
|
3
2
|
import { ContextError } from "./Errors.mjs";
|
|
4
3
|
import { a as PersistenceEvidence, n as isContextWriterBusy, o as WriterAttemptFacts, r as makeContextWriterPermit, s as WriterSettlementFacts, t as closeContextWriterPermit } from "./ContextWriter-BrQmoXRg.mjs";
|
|
5
4
|
import { Clock, Effect, Exit, Schema } from "effect";
|
|
6
5
|
//#region src/ContextCoordination.ts
|
|
7
|
-
var ContextCoordination_exports = /* @__PURE__ */ __exportAll({
|
|
8
|
-
PersistenceEvidence: () => PersistenceEvidence,
|
|
9
|
-
WriterAttemptFacts: () => WriterAttemptFacts,
|
|
10
|
-
WriterSettlementFacts: () => WriterSettlementFacts,
|
|
11
|
-
withWriter: () => withWriter
|
|
12
|
-
});
|
|
13
6
|
/**
|
|
14
7
|
* Owns the backend lease, child browser scopes, and exact attempt evidence. The backend must
|
|
15
8
|
* handle uncertain distributed lease acquisition itself. It must persist quarantine facts;
|
|
@@ -62,6 +55,6 @@ const withWriter = (backend, reference, use, options = {}) => Effect.scoped(Effe
|
|
|
62
55
|
return body.value;
|
|
63
56
|
})));
|
|
64
57
|
//#endregion
|
|
65
|
-
export { PersistenceEvidence, WriterAttemptFacts, WriterSettlementFacts,
|
|
58
|
+
export { PersistenceEvidence, WriterAttemptFacts, WriterSettlementFacts, withWriter };
|
|
66
59
|
|
|
67
60
|
//# sourceMappingURL=ContextCoordination.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ContextCoordination.mjs","names":[],"sources":["../src/ContextCoordination.ts"],"sourcesContent":["import type { Scope } from \"effect\";\nimport { Clock, Effect, Exit, Schema } from \"effect\";\n\nimport { ContextError } from \"./Errors.ts\";\nimport {\n makeContextWriterPermit,\n closeContextWriterPermit,\n isContextWriterBusy,\n} from \"./internal/session/ContextWriter.ts\";\nimport type {\n ContextWriterBackend,\n ContextWriterPermit,\n WriterOptions,\n} from \"./internal/session/WriterFacts.ts\";\nimport { ContextReference } from \"./References.ts\";\n\nexport {\n PersistenceEvidence,\n WriterAttemptFacts,\n WriterSettlementFacts,\n type ContextWriterBackend,\n type ContextWriterPermit,\n type WriterLease,\n type WriterOptions,\n} from \"./internal/session/WriterFacts.ts\";\n\n/**\n * Owns the backend lease, child browser scopes, and exact attempt evidence. The backend must\n * handle uncertain distributed lease acquisition itself. It must persist quarantine facts;\n * a local Scope closing is never permission to admit another remote writer.\n */\nexport const withWriter = <A, E, R, LeaseE, LeaseR, VerifyE = never, VerifyR = never>(\n backend: ContextWriterBackend<LeaseE, LeaseR>,\n reference: ContextReference,\n use: (permit: ContextWriterPermit) => Effect.Effect<A, E, R>,\n options: WriterOptions<A, VerifyE, VerifyR> = {},\n): Effect.Effect<\n A,\n E | LeaseE | VerifyE | ContextError,\n Exclude<R | LeaseR | VerifyR, Scope.Scope>\n> =>\n Effect.scoped(\n Effect.uninterruptibleMask((restore) =>\n Effect.gen(function* () {\n const ref = yield* Schema.decodeEffect(ContextReference)(reference, {\n onExcessProperty: \"error\",\n }).pipe(\n Effect.mapError(() =>\n ContextError.make({\n operation: \"writer\",\n reason: \"configuration\",\n outcome: \"undispatched\",\n }),\n ),\n );\n\n const timeout = options.settlementTimeoutMillis ?? 5000;\n\n if (\n !Number.isSafeInteger(timeout) ||\n timeout < 1 ||\n timeout > 60000 ||\n isContextWriterBusy(ref)\n ) {\n return yield* ContextError.make({\n operation: \"writer\",\n reason: isContextWriterBusy(ref) ? \"active\" : \"configuration\",\n outcome: \"undispatched\",\n });\n }\n const permit = yield* makeContextWriterPermit(ref);\n const acquired = yield* restore(backend.acquire(ref)).pipe(Effect.exit);\n\n if (Exit.isFailure(acquired)) {\n closeContextWriterPermit(permit, false);\n\n return yield* Effect.failCause(acquired.cause);\n }\n const lease = acquired.value;\n\n const body = yield* restore(Effect.scoped(Effect.suspend(() => use(permit)))).pipe(\n Effect.exit,\n );\n\n // Every remote-resource finalizer in use() has run before any settlement/readback below.\n if (Exit.isFailure(body)) yield* permit.quarantine;\n let verification: Exit.Exit<void, VerifyE | ContextError> = Exit.void;\n\n if (Exit.isSuccess(body) && options.verify !== undefined) {\n verification = yield* restore(Effect.scoped(options.verify(body.value))).pipe(\n Effect.exit,\n );\n if (Exit.isSuccess(verification)) {\n verification = yield* permit\n .confirmReadback(yield* Clock.currentTimeMillis)\n .pipe(Effect.exit);\n } else yield* permit.quarantine;\n }\n const facts = yield* permit.snapshot;\n\n const settlement = yield* restore(lease.settle(facts)).pipe(\n Effect.timeoutOrElse({\n duration: timeout,\n orElse: () =>\n Effect.fail(\n ContextError.make({\n operation: \"writer-settle\",\n reason: \"timeout\",\n outcome: \"unknown\",\n }),\n ),\n }),\n Effect.exit,\n );\n\n if (Exit.isFailure(settlement)) yield* permit.quarantine;\n closeContextWriterPermit(\n permit,\n Exit.isSuccess(settlement) && facts.disposition === \"release\",\n );\n // Preserve the primary cause; secondary failure is visible in the retained quarantine and\n // a content-free diagnostic. Never serialize arbitrary consumer/database error values.\n if (Exit.isFailure(body)) {\n if (Exit.isFailure(settlement))\n yield* Effect.logError(\"Browserbase writer settlement remained unconfirmed\");\n\n return yield* Effect.failCause(body.cause);\n }\n if (Exit.isFailure(verification)) return yield* Effect.failCause(verification.cause);\n if (Exit.isFailure(settlement)) return yield* Effect.failCause(settlement.cause);\n\n return body.value;\n }),\n ),\n );\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"ContextCoordination.mjs","names":[],"sources":["../src/ContextCoordination.ts"],"sourcesContent":["import type { Scope } from \"effect\";\nimport { Clock, Effect, Exit, Schema } from \"effect\";\n\nimport { ContextError } from \"./Errors.ts\";\nimport {\n makeContextWriterPermit,\n closeContextWriterPermit,\n isContextWriterBusy,\n} from \"./internal/session/ContextWriter.ts\";\nimport type {\n ContextWriterBackend,\n ContextWriterPermit,\n WriterOptions,\n} from \"./internal/session/WriterFacts.ts\";\nimport { ContextReference } from \"./References.ts\";\n\nexport {\n PersistenceEvidence,\n WriterAttemptFacts,\n WriterSettlementFacts,\n type ContextWriterBackend,\n type ContextWriterPermit,\n type WriterLease,\n type WriterOptions,\n} from \"./internal/session/WriterFacts.ts\";\n\n/**\n * Owns the backend lease, child browser scopes, and exact attempt evidence. The backend must\n * handle uncertain distributed lease acquisition itself. It must persist quarantine facts;\n * a local Scope closing is never permission to admit another remote writer.\n */\nexport const withWriter = <A, E, R, LeaseE, LeaseR, VerifyE = never, VerifyR = never>(\n backend: ContextWriterBackend<LeaseE, LeaseR>,\n reference: ContextReference,\n use: (permit: ContextWriterPermit) => Effect.Effect<A, E, R>,\n options: WriterOptions<A, VerifyE, VerifyR> = {},\n): Effect.Effect<\n A,\n E | LeaseE | VerifyE | ContextError,\n Exclude<R | LeaseR | VerifyR, Scope.Scope>\n> =>\n Effect.scoped(\n Effect.uninterruptibleMask((restore) =>\n Effect.gen(function* () {\n const ref = yield* Schema.decodeEffect(ContextReference)(reference, {\n onExcessProperty: \"error\",\n }).pipe(\n Effect.mapError(() =>\n ContextError.make({\n operation: \"writer\",\n reason: \"configuration\",\n outcome: \"undispatched\",\n }),\n ),\n );\n\n const timeout = options.settlementTimeoutMillis ?? 5000;\n\n if (\n !Number.isSafeInteger(timeout) ||\n timeout < 1 ||\n timeout > 60000 ||\n isContextWriterBusy(ref)\n ) {\n return yield* ContextError.make({\n operation: \"writer\",\n reason: isContextWriterBusy(ref) ? \"active\" : \"configuration\",\n outcome: \"undispatched\",\n });\n }\n const permit = yield* makeContextWriterPermit(ref);\n const acquired = yield* restore(backend.acquire(ref)).pipe(Effect.exit);\n\n if (Exit.isFailure(acquired)) {\n closeContextWriterPermit(permit, false);\n\n return yield* Effect.failCause(acquired.cause);\n }\n const lease = acquired.value;\n\n const body = yield* restore(Effect.scoped(Effect.suspend(() => use(permit)))).pipe(\n Effect.exit,\n );\n\n // Every remote-resource finalizer in use() has run before any settlement/readback below.\n if (Exit.isFailure(body)) yield* permit.quarantine;\n let verification: Exit.Exit<void, VerifyE | ContextError> = Exit.void;\n\n if (Exit.isSuccess(body) && options.verify !== undefined) {\n verification = yield* restore(Effect.scoped(options.verify(body.value))).pipe(\n Effect.exit,\n );\n if (Exit.isSuccess(verification)) {\n verification = yield* permit\n .confirmReadback(yield* Clock.currentTimeMillis)\n .pipe(Effect.exit);\n } else yield* permit.quarantine;\n }\n const facts = yield* permit.snapshot;\n\n const settlement = yield* restore(lease.settle(facts)).pipe(\n Effect.timeoutOrElse({\n duration: timeout,\n orElse: () =>\n Effect.fail(\n ContextError.make({\n operation: \"writer-settle\",\n reason: \"timeout\",\n outcome: \"unknown\",\n }),\n ),\n }),\n Effect.exit,\n );\n\n if (Exit.isFailure(settlement)) yield* permit.quarantine;\n closeContextWriterPermit(\n permit,\n Exit.isSuccess(settlement) && facts.disposition === \"release\",\n );\n // Preserve the primary cause; secondary failure is visible in the retained quarantine and\n // a content-free diagnostic. Never serialize arbitrary consumer/database error values.\n if (Exit.isFailure(body)) {\n if (Exit.isFailure(settlement))\n yield* Effect.logError(\"Browserbase writer settlement remained unconfirmed\");\n\n return yield* Effect.failCause(body.cause);\n }\n if (Exit.isFailure(verification)) return yield* Effect.failCause(verification.cause);\n if (Exit.isFailure(settlement)) return yield* Effect.failCause(settlement.cause);\n\n return body.value;\n }),\n ),\n );\n"],"mappings":";;;;;;;;;;AA+BA,MAAa,cACX,SACA,WACA,KACA,UAA8C,CAAC,MAM/C,OAAO,OACL,OAAO,qBAAqB,YAC1B,OAAO,IAAI,aAAa;CACtB,MAAM,MAAM,OAAO,OAAO,aAAa,gBAAgB,CAAC,CAAC,WAAW,EAClE,kBAAkB,QACpB,CAAC,CAAC,CAAC,KACD,OAAO,eACL,aAAa,KAAK;EAChB,WAAW;EACX,QAAQ;EACR,SAAS;CACX,CAAC,CACH,CACF;CAEA,MAAM,UAAU,QAAQ,2BAA2B;CAEnD,IACE,CAAC,OAAO,cAAc,OAAO,KAC7B,UAAU,KACV,UAAU,OACV,oBAAoB,GAAG,GAEvB,OAAO,OAAO,aAAa,KAAK;EAC9B,WAAW;EACX,QAAQ,oBAAoB,GAAG,IAAI,WAAW;EAC9C,SAAS;CACX,CAAC;CAEH,MAAM,SAAS,OAAO,wBAAwB,GAAG;CACjD,MAAM,WAAW,OAAO,QAAQ,QAAQ,QAAQ,GAAG,CAAC,CAAC,CAAC,KAAK,OAAO,IAAI;CAEtE,IAAI,KAAK,UAAU,QAAQ,GAAG;EAC5B,yBAAyB,QAAQ,KAAK;EAEtC,OAAO,OAAO,OAAO,UAAU,SAAS,KAAK;CAC/C;CACA,MAAM,QAAQ,SAAS;CAEvB,MAAM,OAAO,OAAO,QAAQ,OAAO,OAAO,OAAO,cAAc,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,KAC5E,OAAO,IACT;CAGA,IAAI,KAAK,UAAU,IAAI,GAAG,OAAO,OAAO;CACxC,IAAI,eAAwD,KAAK;CAEjE,IAAI,KAAK,UAAU,IAAI,KAAK,QAAQ,WAAW,KAAA,GAAW;EACxD,eAAe,OAAO,QAAQ,OAAO,OAAO,QAAQ,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,KACvE,OAAO,IACT;EACA,IAAI,KAAK,UAAU,YAAY,GAC7B,eAAe,OAAO,OACnB,gBAAgB,OAAO,MAAM,iBAAiB,CAAC,CAC/C,KAAK,OAAO,IAAI;OACd,OAAO,OAAO;CACvB;CACA,MAAM,QAAQ,OAAO,OAAO;CAE5B,MAAM,aAAa,OAAO,QAAQ,MAAM,OAAO,KAAK,CAAC,CAAC,CAAC,KACrD,OAAO,cAAc;EACnB,UAAU;EACV,cACE,OAAO,KACL,aAAa,KAAK;GAChB,WAAW;GACX,QAAQ;GACR,SAAS;EACX,CAAC,CACH;CACJ,CAAC,GACD,OAAO,IACT;CAEA,IAAI,KAAK,UAAU,UAAU,GAAG,OAAO,OAAO;CAC9C,yBACE,QACA,KAAK,UAAU,UAAU,KAAK,MAAM,gBAAgB,SACtD;CAGA,IAAI,KAAK,UAAU,IAAI,GAAG;EACxB,IAAI,KAAK,UAAU,UAAU,GAC3B,OAAO,OAAO,SAAS,oDAAoD;EAE7E,OAAO,OAAO,OAAO,UAAU,KAAK,KAAK;CAC3C;CACA,IAAI,KAAK,UAAU,YAAY,GAAG,OAAO,OAAO,OAAO,UAAU,aAAa,KAAK;CACnF,IAAI,KAAK,UAAU,UAAU,GAAG,OAAO,OAAO,OAAO,UAAU,WAAW,KAAK;CAE/E,OAAO,KAAK;AACd,CAAC,CACH,CACF"}
|
package/dist/Contexts.d.mts
CHANGED
|
@@ -1,10 +1,8 @@
|
|
|
1
|
-
import { n as ContextReference } from "./References-
|
|
1
|
+
import { n as ContextReference } from "./References-DOH3Wu44.mjs";
|
|
2
2
|
import { ContextError } from "./Errors.mjs";
|
|
3
|
-
import {
|
|
3
|
+
import { BrowserbaseClient } from "./Client.mjs";
|
|
4
4
|
import { Context, Effect, Layer, Schema } from "effect";
|
|
5
|
-
|
|
6
|
-
export { BrowserbaseContexts, ContextCreation, ContextMetadata };
|
|
7
|
-
}
|
|
5
|
+
//#region src/Contexts.d.ts
|
|
8
6
|
declare const ContextMetadata_base: Schema.Class<ContextMetadata, Schema.Struct<{
|
|
9
7
|
readonly reference: typeof ContextReference;
|
|
10
8
|
readonly createdAt: Schema.String;
|
|
@@ -28,5 +26,5 @@ export declare class BrowserbaseContexts extends BrowserbaseContexts_base {
|
|
|
28
26
|
static readonly layer: Layer.Layer<BrowserbaseContexts, never, BrowserbaseClient>;
|
|
29
27
|
}
|
|
30
28
|
//#endregion
|
|
31
|
-
export {
|
|
29
|
+
export {};
|
|
32
30
|
//# sourceMappingURL=Contexts.d.mts.map
|
package/dist/Contexts.mjs
CHANGED
|
@@ -1,15 +1,9 @@
|
|
|
1
|
-
import { t as __exportAll } from "./rolldown-runtime-D7D4PA-g.mjs";
|
|
2
1
|
import { ContextReference, Identifier } from "./References.mjs";
|
|
3
2
|
import { ContextError } from "./Errors.mjs";
|
|
4
|
-
import { t as BrowserbaseClient } from "./Client-
|
|
3
|
+
import { t as BrowserbaseClient } from "./Client-BQteUePT.mjs";
|
|
5
4
|
import { n as isContextWriterBusy } from "./ContextWriter-BrQmoXRg.mjs";
|
|
6
5
|
import { Context, Effect, Layer, Schema } from "effect";
|
|
7
6
|
//#region src/Contexts.ts
|
|
8
|
-
var Contexts_exports = /* @__PURE__ */ __exportAll({
|
|
9
|
-
BrowserbaseContexts: () => BrowserbaseContexts,
|
|
10
|
-
ContextCreation: () => ContextCreation,
|
|
11
|
-
ContextMetadata: () => ContextMetadata
|
|
12
|
-
});
|
|
13
7
|
const Timestamp = Schema.String.check(Schema.isMaxLength(64));
|
|
14
8
|
const ContextName = Schema.NonEmptyString.check(Schema.isMaxLength(1024), Schema.makeFilter((value) => value.trim().length > 0));
|
|
15
9
|
const ProviderContext = Schema.Struct({
|
|
@@ -98,6 +92,6 @@ var BrowserbaseContexts = class BrowserbaseContexts extends Context.Service()("e
|
|
|
98
92
|
}));
|
|
99
93
|
};
|
|
100
94
|
//#endregion
|
|
101
|
-
export { BrowserbaseContexts, ContextCreation, ContextMetadata
|
|
95
|
+
export { BrowserbaseContexts, ContextCreation, ContextMetadata };
|
|
102
96
|
|
|
103
97
|
//# sourceMappingURL=Contexts.mjs.map
|
package/dist/Contexts.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Contexts.mjs","names":[],"sources":["../src/Contexts.ts"],"sourcesContent":["import { Context, Effect, Layer, Schema } from \"effect\";\n\nimport { BrowserbaseClient } from \"./Client.ts\";\nimport type { ClientError } from \"./Errors.ts\";\nimport { ContextError } from \"./Errors.ts\";\nimport { isContextWriterBusy } from \"./internal/session/ContextWriter.ts\";\nimport { ContextReference, Identifier } from \"./References.ts\";\n\nconst Timestamp = Schema.String.check(Schema.isMaxLength(64));\n\nconst ContextName = Schema.NonEmptyString.check(\n Schema.isMaxLength(1024),\n Schema.makeFilter((value) => value.trim().length > 0),\n);\n\nconst ProviderContext = Schema.Struct({\n id: Identifier,\n projectId: Identifier,\n createdAt: Timestamp,\n updatedAt: Timestamp,\n name: Schema.optionalKey(Schema.String.check(Schema.isMaxLength(1024))),\n});\n\nexport class ContextMetadata extends Schema.Class<ContextMetadata>(\"BrowserbaseContextMetadata\")({\n reference: ContextReference,\n createdAt: Timestamp,\n updatedAt: Timestamp,\n name: Schema.optionalKey(Schema.String.check(Schema.isMaxLength(1024))),\n}) {}\n\nexport class ContextCreation extends Schema.Class<ContextCreation>(\"BrowserbaseContextCreation\")({\n reference: ContextReference,\n}) {}\n\nconst fromClient = (operation: ContextError[\"operation\"], error: ClientError): ContextError =>\n ContextError.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 configuration = (operation: ContextError[\"operation\"]) =>\n ContextError.make({ operation, reason: \"configuration\", outcome: \"undispatched\" });\n\nconst malformed = (operation: ContextError[\"operation\"], mutation = false) =>\n ContextError.make({\n operation,\n reason: \"malformed\",\n ...(mutation ? { outcome: \"unknown\" as const } : {}),\n });\n\n/** Context administration is independent of any live browser connection. */\nexport class BrowserbaseContexts extends Context.Service<\n BrowserbaseContexts,\n {\n readonly create: (options?: {\n readonly name?: string;\n }) => Effect.Effect<ContextCreation, ContextError>;\n readonly retrieve: (\n reference: ContextReference,\n ) => Effect.Effect<ContextMetadata, ContextError>;\n readonly delete: (reference: ContextReference) => Effect.Effect<void, ContextError>;\n }\n>()(\"effect-browserbase/Contexts\") {\n static readonly layer: Layer.Layer<BrowserbaseContexts, never, BrowserbaseClient> = Layer.effect(\n BrowserbaseContexts,\n Effect.gen(function* () {\n const client = yield* BrowserbaseClient;\n\n const validate = Effect.fnUntraced(function* (\n reference: ContextReference,\n operation: ContextError[\"operation\"],\n ) {\n const ref = yield* Schema.decodeEffect(ContextReference)(reference, {\n onExcessProperty: \"error\",\n }).pipe(Effect.mapError(() => configuration(operation)));\n\n if (ref.projectId !== client.projectId)\n return yield* ContextError.make({\n operation,\n reason: \"authorization\",\n outcome: \"undispatched\",\n });\n\n return ref;\n });\n\n const create = Effect.fn(\"BrowserbaseContexts.create\")(function* (\n options: { readonly name?: string } = {},\n ) {\n const value = yield* Schema.decodeEffect(\n Schema.Struct({ name: Schema.optionalKey(ContextName) }),\n )(options, { onExcessProperty: \"error\" }).pipe(\n Effect.mapError(() => configuration(\"context-create\")),\n );\n\n const raw = yield* client\n .json(\"POST\", \"/v1/contexts\", {\n projectId: client.projectId,\n ...(value.name === undefined ? {} : { name: value.name.trim() }),\n })\n .pipe(Effect.mapError((error) => fromClient(\"context-create\", error)));\n\n const created = yield* Schema.decodeUnknownEffect(Schema.Struct({ id: Identifier }))(\n raw,\n ).pipe(Effect.mapError(() => malformed(\"context-create\", true)));\n\n return ContextCreation.make({\n reference: ContextReference.make({\n provider: \"browserbase\",\n projectId: client.projectId,\n contextId: created.id,\n }),\n });\n });\n\n const retrieve = Effect.fn(\"BrowserbaseContexts.retrieve\")(function* (\n reference: ContextReference,\n ) {\n const ref = yield* validate(reference, \"context-retrieve\");\n\n const raw = yield* client\n .json(\"GET\", `/v1/contexts/${encodeURIComponent(ref.contextId)}`)\n .pipe(Effect.mapError((error) => fromClient(\"context-retrieve\", error)));\n\n const value = yield* Schema.decodeUnknownEffect(ProviderContext)(raw).pipe(\n Effect.mapError(() => malformed(\"context-retrieve\")),\n );\n\n if (value.id !== ref.contextId || value.projectId !== ref.projectId)\n return yield* malformed(\"context-retrieve\");\n\n return ContextMetadata.make({\n reference: ref,\n createdAt: value.createdAt,\n updatedAt: value.updatedAt,\n ...(value.name === undefined ? {} : { name: value.name }),\n });\n });\n\n const remove = Effect.fn(\"BrowserbaseContexts.delete\")(function* (\n reference: ContextReference,\n ) {\n const ref = yield* validate(reference, \"context-delete\");\n\n if (isContextWriterBusy(ref))\n return yield* ContextError.make({\n operation: \"context-delete\",\n reason: \"active\",\n outcome: \"undispatched\",\n });\n yield* client\n .noContent(\"DELETE\", `/v1/contexts/${encodeURIComponent(ref.contextId)}`)\n .pipe(Effect.mapError((error) => fromClient(\"context-delete\", error)));\n });\n\n return BrowserbaseContexts.of({ create, retrieve, delete: remove });\n }),\n );\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"Contexts.mjs","names":[],"sources":["../src/Contexts.ts"],"sourcesContent":["import { Context, Effect, Layer, Schema } from \"effect\";\n\nimport { BrowserbaseClient } from \"./Client.ts\";\nimport type { ClientError } from \"./Errors.ts\";\nimport { ContextError } from \"./Errors.ts\";\nimport { isContextWriterBusy } from \"./internal/session/ContextWriter.ts\";\nimport { ContextReference, Identifier } from \"./References.ts\";\n\nconst Timestamp = Schema.String.check(Schema.isMaxLength(64));\n\nconst ContextName = Schema.NonEmptyString.check(\n Schema.isMaxLength(1024),\n Schema.makeFilter((value) => value.trim().length > 0),\n);\n\nconst ProviderContext = Schema.Struct({\n id: Identifier,\n projectId: Identifier,\n createdAt: Timestamp,\n updatedAt: Timestamp,\n name: Schema.optionalKey(Schema.String.check(Schema.isMaxLength(1024))),\n});\n\nexport class ContextMetadata extends Schema.Class<ContextMetadata>(\"BrowserbaseContextMetadata\")({\n reference: ContextReference,\n createdAt: Timestamp,\n updatedAt: Timestamp,\n name: Schema.optionalKey(Schema.String.check(Schema.isMaxLength(1024))),\n}) {}\n\nexport class ContextCreation extends Schema.Class<ContextCreation>(\"BrowserbaseContextCreation\")({\n reference: ContextReference,\n}) {}\n\nconst fromClient = (operation: ContextError[\"operation\"], error: ClientError): ContextError =>\n ContextError.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 configuration = (operation: ContextError[\"operation\"]) =>\n ContextError.make({ operation, reason: \"configuration\", outcome: \"undispatched\" });\n\nconst malformed = (operation: ContextError[\"operation\"], mutation = false) =>\n ContextError.make({\n operation,\n reason: \"malformed\",\n ...(mutation ? { outcome: \"unknown\" as const } : {}),\n });\n\n/** Context administration is independent of any live browser connection. */\nexport class BrowserbaseContexts extends Context.Service<\n BrowserbaseContexts,\n {\n readonly create: (options?: {\n readonly name?: string;\n }) => Effect.Effect<ContextCreation, ContextError>;\n readonly retrieve: (\n reference: ContextReference,\n ) => Effect.Effect<ContextMetadata, ContextError>;\n readonly delete: (reference: ContextReference) => Effect.Effect<void, ContextError>;\n }\n>()(\"effect-browserbase/Contexts\") {\n static readonly layer: Layer.Layer<BrowserbaseContexts, never, BrowserbaseClient> = Layer.effect(\n BrowserbaseContexts,\n Effect.gen(function* () {\n const client = yield* BrowserbaseClient;\n\n const validate = Effect.fnUntraced(function* (\n reference: ContextReference,\n operation: ContextError[\"operation\"],\n ) {\n const ref = yield* Schema.decodeEffect(ContextReference)(reference, {\n onExcessProperty: \"error\",\n }).pipe(Effect.mapError(() => configuration(operation)));\n\n if (ref.projectId !== client.projectId)\n return yield* ContextError.make({\n operation,\n reason: \"authorization\",\n outcome: \"undispatched\",\n });\n\n return ref;\n });\n\n const create = Effect.fn(\"BrowserbaseContexts.create\")(function* (\n options: { readonly name?: string } = {},\n ) {\n const value = yield* Schema.decodeEffect(\n Schema.Struct({ name: Schema.optionalKey(ContextName) }),\n )(options, { onExcessProperty: \"error\" }).pipe(\n Effect.mapError(() => configuration(\"context-create\")),\n );\n\n const raw = yield* client\n .json(\"POST\", \"/v1/contexts\", {\n projectId: client.projectId,\n ...(value.name === undefined ? {} : { name: value.name.trim() }),\n })\n .pipe(Effect.mapError((error) => fromClient(\"context-create\", error)));\n\n const created = yield* Schema.decodeUnknownEffect(Schema.Struct({ id: Identifier }))(\n raw,\n ).pipe(Effect.mapError(() => malformed(\"context-create\", true)));\n\n return ContextCreation.make({\n reference: ContextReference.make({\n provider: \"browserbase\",\n projectId: client.projectId,\n contextId: created.id,\n }),\n });\n });\n\n const retrieve = Effect.fn(\"BrowserbaseContexts.retrieve\")(function* (\n reference: ContextReference,\n ) {\n const ref = yield* validate(reference, \"context-retrieve\");\n\n const raw = yield* client\n .json(\"GET\", `/v1/contexts/${encodeURIComponent(ref.contextId)}`)\n .pipe(Effect.mapError((error) => fromClient(\"context-retrieve\", error)));\n\n const value = yield* Schema.decodeUnknownEffect(ProviderContext)(raw).pipe(\n Effect.mapError(() => malformed(\"context-retrieve\")),\n );\n\n if (value.id !== ref.contextId || value.projectId !== ref.projectId)\n return yield* malformed(\"context-retrieve\");\n\n return ContextMetadata.make({\n reference: ref,\n createdAt: value.createdAt,\n updatedAt: value.updatedAt,\n ...(value.name === undefined ? {} : { name: value.name }),\n });\n });\n\n const remove = Effect.fn(\"BrowserbaseContexts.delete\")(function* (\n reference: ContextReference,\n ) {\n const ref = yield* validate(reference, \"context-delete\");\n\n if (isContextWriterBusy(ref))\n return yield* ContextError.make({\n operation: \"context-delete\",\n reason: \"active\",\n outcome: \"undispatched\",\n });\n yield* client\n .noContent(\"DELETE\", `/v1/contexts/${encodeURIComponent(ref.contextId)}`)\n .pipe(Effect.mapError((error) => fromClient(\"context-delete\", error)));\n });\n\n return BrowserbaseContexts.of({ create, retrieve, delete: remove });\n }),\n );\n}\n"],"mappings":";;;;;;AAQA,MAAM,YAAY,OAAO,OAAO,MAAM,OAAO,YAAY,EAAE,CAAC;AAE5D,MAAM,cAAc,OAAO,eAAe,MACxC,OAAO,YAAY,IAAI,GACvB,OAAO,YAAY,UAAU,MAAM,KAAK,CAAC,CAAC,SAAS,CAAC,CACtD;AAEA,MAAM,kBAAkB,OAAO,OAAO;CACpC,IAAI;CACJ,WAAW;CACX,WAAW;CACX,WAAW;CACX,MAAM,OAAO,YAAY,OAAO,OAAO,MAAM,OAAO,YAAY,IAAI,CAAC,CAAC;AACxE,CAAC;AAED,IAAa,kBAAb,cAAqC,OAAO,MAAuB,4BAA4B,CAAC,CAAC;CAC/F,WAAW;CACX,WAAW;CACX,WAAW;CACX,MAAM,OAAO,YAAY,OAAO,OAAO,MAAM,OAAO,YAAY,IAAI,CAAC,CAAC;AACxE,CAAC,CAAC,CAAC,CAAC;AAEJ,IAAa,kBAAb,cAAqC,OAAO,MAAuB,4BAA4B,CAAC,CAAC,EAC/F,WAAW,iBACb,CAAC,CAAC,CAAC,CAAC;AAEJ,MAAM,cAAc,WAAsC,UACxD,aAAa,KAAK;CAChB;CACA,QAAQ,MAAM;CACd,GAAI,MAAM,YAAY,KAAA,IAAY,CAAC,IAAI,EAAE,SAAS,MAAM,QAAQ;CAChE,GAAI,MAAM,WAAW,KAAA,IAAY,CAAC,IAAI,EAAE,QAAQ,MAAM,OAAO;CAC7D,GAAI,MAAM,qBAAqB,KAAA,IAAY,CAAC,IAAI,EAAE,kBAAkB,MAAM,iBAAiB;AAC7F,CAAC;AAEH,MAAM,iBAAiB,cACrB,aAAa,KAAK;CAAE;CAAW,QAAQ;CAAiB,SAAS;AAAe,CAAC;AAEnF,MAAM,aAAa,WAAsC,WAAW,UAClE,aAAa,KAAK;CAChB;CACA,QAAQ;CACR,GAAI,WAAW,EAAE,SAAS,UAAmB,IAAI,CAAC;AACpD,CAAC;;AAGH,IAAa,sBAAb,MAAa,4BAA4B,QAAQ,QAW/C,CAAC,CAAC,6BAA6B,CAAC,CAAC;CACjC,OAAgB,QAAoE,MAAM,OACxF,qBACA,OAAO,IAAI,aAAa;EACtB,MAAM,SAAS,OAAO;EAEtB,MAAM,WAAW,OAAO,WAAW,WACjC,WACA,WACA;GACA,MAAM,MAAM,OAAO,OAAO,aAAa,gBAAgB,CAAC,CAAC,WAAW,EAClE,kBAAkB,QACpB,CAAC,CAAC,CAAC,KAAK,OAAO,eAAe,cAAc,SAAS,CAAC,CAAC;GAEvD,IAAI,IAAI,cAAc,OAAO,WAC3B,OAAO,OAAO,aAAa,KAAK;IAC9B;IACA,QAAQ;IACR,SAAS;GACX,CAAC;GAEH,OAAO;EACT,CAAC;EAED,MAAM,SAAS,OAAO,GAAG,4BAA4B,CAAC,CAAC,WACrD,UAAsC,CAAC,GACvC;GACA,MAAM,QAAQ,OAAO,OAAO,aAC1B,OAAO,OAAO,EAAE,MAAM,OAAO,YAAY,WAAW,EAAE,CAAC,CACzD,CAAC,CAAC,SAAS,EAAE,kBAAkB,QAAQ,CAAC,CAAC,CAAC,KACxC,OAAO,eAAe,cAAc,gBAAgB,CAAC,CACvD;GAEA,MAAM,MAAM,OAAO,OAChB,KAAK,QAAQ,gBAAgB;IAC5B,WAAW,OAAO;IAClB,GAAI,MAAM,SAAS,KAAA,IAAY,CAAC,IAAI,EAAE,MAAM,MAAM,KAAK,KAAK,EAAE;GAChE,CAAC,CAAC,CACD,KAAK,OAAO,UAAU,UAAU,WAAW,kBAAkB,KAAK,CAAC,CAAC;GAEvE,MAAM,UAAU,OAAO,OAAO,oBAAoB,OAAO,OAAO,EAAE,IAAI,WAAW,CAAC,CAAC,CAAC,CAClF,GACF,CAAC,CAAC,KAAK,OAAO,eAAe,UAAU,kBAAkB,IAAI,CAAC,CAAC;GAE/D,OAAO,gBAAgB,KAAK,EAC1B,WAAW,iBAAiB,KAAK;IAC/B,UAAU;IACV,WAAW,OAAO;IAClB,WAAW,QAAQ;GACrB,CAAC,EACH,CAAC;EACH,CAAC;EAED,MAAM,WAAW,OAAO,GAAG,8BAA8B,CAAC,CAAC,WACzD,WACA;GACA,MAAM,MAAM,OAAO,SAAS,WAAW,kBAAkB;GAEzD,MAAM,MAAM,OAAO,OAChB,KAAK,OAAO,gBAAgB,mBAAmB,IAAI,SAAS,GAAG,CAAC,CAChE,KAAK,OAAO,UAAU,UAAU,WAAW,oBAAoB,KAAK,CAAC,CAAC;GAEzE,MAAM,QAAQ,OAAO,OAAO,oBAAoB,eAAe,CAAC,CAAC,GAAG,CAAC,CAAC,KACpE,OAAO,eAAe,UAAU,kBAAkB,CAAC,CACrD;GAEA,IAAI,MAAM,OAAO,IAAI,aAAa,MAAM,cAAc,IAAI,WACxD,OAAO,OAAO,UAAU,kBAAkB;GAE5C,OAAO,gBAAgB,KAAK;IAC1B,WAAW;IACX,WAAW,MAAM;IACjB,WAAW,MAAM;IACjB,GAAI,MAAM,SAAS,KAAA,IAAY,CAAC,IAAI,EAAE,MAAM,MAAM,KAAK;GACzD,CAAC;EACH,CAAC;EAED,MAAM,SAAS,OAAO,GAAG,4BAA4B,CAAC,CAAC,WACrD,WACA;GACA,MAAM,MAAM,OAAO,SAAS,WAAW,gBAAgB;GAEvD,IAAI,oBAAoB,GAAG,GACzB,OAAO,OAAO,aAAa,KAAK;IAC9B,WAAW;IACX,QAAQ;IACR,SAAS;GACX,CAAC;GACH,OAAO,OACJ,UAAU,UAAU,gBAAgB,mBAAmB,IAAI,SAAS,GAAG,CAAC,CACxE,KAAK,OAAO,UAAU,UAAU,WAAW,kBAAkB,KAAK,CAAC,CAAC;EACzE,CAAC;EAED,OAAO,oBAAoB,GAAG;GAAE;GAAQ;GAAU,QAAQ;EAAO,CAAC;CACpE,CAAC,CACH;AACF"}
|
package/dist/Downloads.d.mts
CHANGED
|
@@ -1,12 +1,10 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { a as SessionReference } from "./References-DOH3Wu44.mjs";
|
|
2
2
|
import { FileError } from "./Errors.mjs";
|
|
3
|
-
import {
|
|
4
|
-
import { t as BrowserbaseSessions } from "./Sessions-
|
|
5
|
-
import { n as DownloadMetadata, t as ArtifactTransferPolicy } from "./Transfers-
|
|
3
|
+
import { BrowserbaseClient } from "./Client.mjs";
|
|
4
|
+
import { t as BrowserbaseSessions } from "./Sessions-tFJYaXFq.mjs";
|
|
5
|
+
import { n as DownloadMetadata, t as ArtifactTransferPolicy } from "./Transfers-GVqzrDWl.mjs";
|
|
6
6
|
import { Context, Effect, Layer, Schema, Stream } from "effect";
|
|
7
|
-
|
|
8
|
-
export { BrowserbaseDownloads, DownloadListing, DownloadPolicy, DownloadQuery };
|
|
9
|
-
}
|
|
7
|
+
//#region src/Downloads.d.ts
|
|
10
8
|
export interface DownloadPolicy extends ArtifactTransferPolicy {
|
|
11
9
|
readonly mimeTypes: ReadonlyArray<string>;
|
|
12
10
|
}
|
|
@@ -40,5 +38,5 @@ export declare class BrowserbaseDownloads extends BrowserbaseDownloads_base {
|
|
|
40
38
|
static readonly layer: Layer.Layer<BrowserbaseDownloads, never, BrowserbaseClient | BrowserbaseSessions>;
|
|
41
39
|
}
|
|
42
40
|
//#endregion
|
|
43
|
-
export {
|
|
41
|
+
export {};
|
|
44
42
|
//# sourceMappingURL=Downloads.d.mts.map
|
package/dist/Downloads.mjs
CHANGED
|
@@ -1,17 +1,12 @@
|
|
|
1
|
-
import { t as __exportAll } from "./rolldown-runtime-D7D4PA-g.mjs";
|
|
2
1
|
import { Identifier } from "./References.mjs";
|
|
3
2
|
import { FileError } from "./Errors.mjs";
|
|
4
3
|
import { DownloadMetadata } from "./Transfers.mjs";
|
|
5
|
-
import { t as BrowserbaseClient } from "./Client-
|
|
4
|
+
import { t as BrowserbaseClient } from "./Client-BQteUePT.mjs";
|
|
6
5
|
import { t as downloadTransferPolicy } from "./TransferPolicy-DQ06i7SZ.mjs";
|
|
7
6
|
import { n as nowMillis, r as until, t as deadlineAfter } from "./Deadline-CrViaogr.mjs";
|
|
8
|
-
import { t as BrowserbaseSessions } from "./Sessions-
|
|
7
|
+
import { t as BrowserbaseSessions } from "./Sessions-DoQGg9nB.mjs";
|
|
9
8
|
import { Context, Effect, Layer, Schema, Stream } from "effect";
|
|
10
9
|
//#region src/Downloads.ts
|
|
11
|
-
var Downloads_exports = /* @__PURE__ */ __exportAll({
|
|
12
|
-
BrowserbaseDownloads: () => BrowserbaseDownloads,
|
|
13
|
-
DownloadQuery: () => DownloadQuery
|
|
14
|
-
});
|
|
15
10
|
const Timestamp = Schema.String.check(Schema.isMaxLength(64));
|
|
16
11
|
/** Provider-side filters over one session's files; every bound is optional. */
|
|
17
12
|
const DownloadQuery = Schema.Struct({
|
|
@@ -137,6 +132,6 @@ var BrowserbaseDownloads = class BrowserbaseDownloads extends Context.Service()(
|
|
|
137
132
|
}));
|
|
138
133
|
};
|
|
139
134
|
//#endregion
|
|
140
|
-
export { BrowserbaseDownloads, DownloadQuery
|
|
135
|
+
export { BrowserbaseDownloads, DownloadQuery };
|
|
141
136
|
|
|
142
137
|
//# sourceMappingURL=Downloads.mjs.map
|