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.
Files changed (135) hide show
  1. package/README.md +61 -305
  2. package/dist/Account.d.mts +4 -6
  3. package/dist/Account.mjs +4 -9
  4. package/dist/Account.mjs.map +1 -1
  5. package/dist/{Acquisition-WBafHwXH.mjs → Acquisition-D8o4jtCg.mjs} +22 -68
  6. package/dist/Acquisition-D8o4jtCg.mjs.map +1 -0
  7. package/dist/Agents.d.mts +4 -6
  8. package/dist/Agents.mjs +3 -19
  9. package/dist/Agents.mjs.map +1 -1
  10. package/dist/Allocation.d.mts +9 -11
  11. package/dist/Allocation.mjs +2 -4
  12. package/dist/Allocation.mjs.map +1 -1
  13. package/dist/Browser.d.mts +23 -141
  14. package/dist/Browser.mjs +208 -164
  15. package/dist/Browser.mjs.map +1 -1
  16. package/dist/BrowserBinding.d.mts +7 -34
  17. package/dist/BrowserBinding.mjs +30 -1
  18. package/dist/BrowserBinding.mjs.map +1 -0
  19. package/dist/Certificates.d.mts +3 -5
  20. package/dist/Certificates.mjs +2 -7
  21. package/dist/Certificates.mjs.map +1 -1
  22. package/dist/{Cleanup-G2YpTCuU.d.mts → Cleanup-DMTDBir8.d.mts} +5 -6
  23. package/dist/Cleanup.d.mts +3 -2
  24. package/dist/Cleanup.mjs +1 -6
  25. package/dist/Cleanup.mjs.map +1 -1
  26. package/dist/{Client-D1_xYM9o.mjs → Client-BQteUePT.mjs} +2 -4
  27. package/dist/{Client-D1_xYM9o.mjs.map → Client-BQteUePT.mjs.map} +1 -1
  28. package/dist/Client.d.mts +51 -2
  29. package/dist/Client.mjs +1 -1
  30. package/dist/Connection-DcvJZEdc.mjs +65 -0
  31. package/dist/Connection-DcvJZEdc.mjs.map +1 -0
  32. package/dist/ContextCoordination.d.mts +5 -6
  33. package/dist/ContextCoordination.mjs +1 -8
  34. package/dist/ContextCoordination.mjs.map +1 -1
  35. package/dist/Contexts.d.mts +4 -6
  36. package/dist/Contexts.mjs +2 -8
  37. package/dist/Contexts.mjs.map +1 -1
  38. package/dist/Downloads.d.mts +6 -8
  39. package/dist/Downloads.mjs +3 -8
  40. package/dist/Downloads.mjs.map +1 -1
  41. package/dist/Errors.d.mts +3 -26
  42. package/dist/Errors.mjs +1 -137
  43. package/dist/Errors.mjs.map +1 -1
  44. package/dist/{Extensions-ClZbYb1H.mjs → Extensions-nMNMPGCc.mjs} +3 -9
  45. package/dist/{Extensions-ClZbYb1H.mjs.map → Extensions-nMNMPGCc.mjs.map} +1 -1
  46. package/dist/Extensions.d.mts +4 -6
  47. package/dist/Extensions.mjs +1 -1
  48. package/dist/Functions.d.mts +4 -6
  49. package/dist/Functions.mjs +3 -17
  50. package/dist/Functions.mjs.map +1 -1
  51. package/dist/{Launch-BHcAEq05.mjs → Launch-m0fxzJ49.mjs} +5 -5
  52. package/dist/Launch-m0fxzJ49.mjs.map +1 -0
  53. package/dist/Launch.d.mts +130 -2
  54. package/dist/Launch.mjs +4 -11
  55. package/dist/Launch.mjs.map +1 -1
  56. package/dist/PageFetch.d.mts +3 -5
  57. package/dist/PageFetch.mjs +2 -8
  58. package/dist/PageFetch.mjs.map +1 -1
  59. package/dist/Projects.d.mts +3 -5
  60. package/dist/Projects.mjs +2 -8
  61. package/dist/Projects.mjs.map +1 -1
  62. package/dist/Recordings.d.mts +6 -8
  63. package/dist/Recordings.mjs +3 -5
  64. package/dist/Recordings.mjs.map +1 -1
  65. package/dist/{References-URDAtapt.d.mts → References-DOH3Wu44.d.mts} +5 -6
  66. package/dist/References.d.mts +3 -2
  67. package/dist/References.mjs +10 -18
  68. package/dist/References.mjs.map +1 -1
  69. package/dist/Replays.d.mts +6 -8
  70. package/dist/Replays.mjs +3 -5
  71. package/dist/Replays.mjs.map +1 -1
  72. package/dist/Search.d.mts +3 -5
  73. package/dist/Search.mjs +2 -9
  74. package/dist/Search.mjs.map +1 -1
  75. package/dist/{SessionData-DRKcKCqw.d.mts → SessionData-5xYZDshJ.d.mts} +5 -6
  76. package/dist/SessionData.d.mts +3 -2
  77. package/dist/SessionData.mjs +1 -8
  78. package/dist/SessionData.mjs.map +1 -1
  79. package/dist/{Sessions-CtbseWEh.mjs → Sessions-DoQGg9nB.mjs} +34 -18
  80. package/dist/Sessions-DoQGg9nB.mjs.map +1 -0
  81. package/dist/{Sessions-B8E4kMxo.d.mts → Sessions-tFJYaXFq.d.mts} +8 -8
  82. package/dist/Sessions.d.mts +4 -3
  83. package/dist/Sessions.mjs +1 -1
  84. package/dist/{Transfers-Czv5IZzJ.d.mts → Transfers-GVqzrDWl.d.mts} +22 -9
  85. package/dist/Transfers.d.mts +3 -2
  86. package/dist/Transfers.mjs +12 -28
  87. package/dist/Transfers.mjs.map +1 -1
  88. package/dist/Uploads.d.mts +6 -8
  89. package/dist/Uploads.mjs +3 -5
  90. package/dist/Uploads.mjs.map +1 -1
  91. package/dist/Webhooks.d.mts +3 -5
  92. package/dist/Webhooks.mjs +2 -11
  93. package/dist/Webhooks.mjs.map +1 -1
  94. package/dist/{WriterFacts-osvYAsIx.d.mts → WriterFacts-5CPBGG1P.d.mts} +4 -3
  95. package/dist/index.d.mts +27 -31
  96. package/dist/index.mjs +26 -31
  97. package/package.json +3 -28
  98. package/dist/Acquisition-WBafHwXH.mjs.map +0 -1
  99. package/dist/Association-CEps4hYP.mjs +0 -10
  100. package/dist/Association-CEps4hYP.mjs.map +0 -1
  101. package/dist/Bootstrap-BXuzZojd.mjs +0 -194
  102. package/dist/Bootstrap-BXuzZojd.mjs.map +0 -1
  103. package/dist/Bootstrap-m7lHgj0D.d.mts +0 -177
  104. package/dist/Bootstrap.d.mts +0 -2
  105. package/dist/Bootstrap.mjs +0 -2
  106. package/dist/BrowserBinding-DlJTGYZL.mjs +0 -2508
  107. package/dist/BrowserBinding-DlJTGYZL.mjs.map +0 -1
  108. package/dist/BrowserData-LpcAuAub.d.mts +0 -369
  109. package/dist/BrowserData.d.mts +0 -2
  110. package/dist/BrowserData.mjs +0 -442
  111. package/dist/BrowserData.mjs.map +0 -1
  112. package/dist/Capture-Bc0z9IAi.mjs +0 -571
  113. package/dist/Capture-Bc0z9IAi.mjs.map +0 -1
  114. package/dist/Capture-BvWI-l1A.d.mts +0 -168
  115. package/dist/Capture.d.mts +0 -2
  116. package/dist/Capture.mjs +0 -2
  117. package/dist/Client-Ca0zSg1n.d.mts +0 -53
  118. package/dist/Images-DgscEfSf.mjs +0 -127
  119. package/dist/Images-DgscEfSf.mjs.map +0 -1
  120. package/dist/Launch-BHcAEq05.mjs.map +0 -1
  121. package/dist/Launch-C8CfaYxb.d.mts +0 -132
  122. package/dist/LocalBrowser-BLancJ3R.d.mts +0 -79
  123. package/dist/LocalBrowser-DsQLWNL1.mjs +0 -439
  124. package/dist/LocalBrowser-DsQLWNL1.mjs.map +0 -1
  125. package/dist/LocalBrowser.d.mts +0 -2
  126. package/dist/LocalBrowser.mjs +0 -2
  127. package/dist/PageControl.d.mts +0 -16
  128. package/dist/PageControl.mjs +0 -36
  129. package/dist/PageControl.mjs.map +0 -1
  130. package/dist/PageControlAssociation-DabEg5AR.mjs +0 -10
  131. package/dist/PageControlAssociation-DabEg5AR.mjs.map +0 -1
  132. package/dist/Session-D4nT9hOO.mjs +0 -1379
  133. package/dist/Session-D4nT9hOO.mjs.map +0 -1
  134. package/dist/Sessions-CtbseWEh.mjs.map +0 -1
  135. package/dist/rolldown-runtime-D7D4PA-g.mjs +0 -13
@@ -1 +1 @@
1
- {"version":3,"file":"Recordings.mjs","names":[],"sources":["../src/Recordings.ts"],"sourcesContent":["import { Context, Effect, Layer, Redacted, Schema, Semaphore, Stream } from \"effect\";\n\nimport { BrowserbaseClient } from \"./Client.ts\";\nimport { ArtifactError, type ClientError } from \"./Errors.ts\";\nimport { requireTerminalSession } from \"./internal/artifact/Authorization.ts\";\nimport { transferPolicy } from \"./internal/artifact/TransferPolicy.ts\";\nimport { deadlineAfter, nowMillis, until } from \"./internal/Deadline.ts\";\nimport { Identifier, type SessionReference } from \"./References.ts\";\nimport { BrowserbaseSessions } from \"./Sessions.ts\";\nimport {\n type ArtifactTransferPolicy,\n RecordingBatch,\n RecordingPage,\n RecordingPageReference,\n} from \"./Transfers.ts\";\n\nconst RawPage = Schema.Struct({\n pageId: Identifier,\n status: Schema.Literals([\"NOT_REQUESTED\", \"PENDING\", \"COMPLETED\", \"FAILED\"]),\n completedAt: Schema.optionalKey(Schema.String.check(Schema.isMaxLength(64))),\n downloadUrl: Schema.optionalKey(Schema.String.check(Schema.isMaxLength(16384))),\n});\n\nconst RawBatch = Schema.Struct({ downloads: Schema.Array(RawPage).check(Schema.isMaxLength(256)) });\n\nexport interface PollOptions {\n readonly timeoutMillis?: number;\n readonly intervalMillis?: number;\n}\n\n/** Recording transfers share the canonical artifact bounds. */\nexport type DownloadLimits = ArtifactTransferPolicy;\n\nconst failure = (operation: ArtifactError[\"operation\"], reason: ArtifactError[\"reason\"]) =>\n ArtifactError.make({ operation, reason });\n\nconst fromClient = (operation: ArtifactError[\"operation\"]) => (error: ClientError) =>\n ArtifactError.make({\n operation,\n reason: error.reason,\n ...(error.outcome === undefined ? {} : { outcome: error.outcome }),\n ...(error.status === undefined ? {} : { status: error.status }),\n ...(error.retryAfterMillis === undefined ? {} : { retryAfterMillis: error.retryAfterMillis }),\n });\n\nconst within = <A, E, R>(\n effect: Effect.Effect<A, E, R>,\n deadline: number,\n operation: ArtifactError[\"operation\"],\n) => until(effect, deadline, () => failure(operation, \"timeout\"));\n\n/** Independent of a live browser. Merely building this Layer performs no provider calls. */\nexport class BrowserbaseRecordings extends Context.Service<\n BrowserbaseRecordings,\n {\n readonly request: (\n reference: SessionReference,\n mode?: \"initial\" | \"retry-failed\",\n ) => Effect.Effect<RecordingBatch, ArtifactError>;\n readonly status: (reference: SessionReference) => Effect.Effect<RecordingBatch, ArtifactError>;\n readonly wait: (\n reference: SessionReference,\n options?: PollOptions,\n ) => Effect.Effect<RecordingBatch, ArtifactError>;\n readonly download: (\n reference: RecordingPageReference,\n limits: DownloadLimits,\n ) => Stream.Stream<Uint8Array, ArtifactError>;\n }\n>()(\"effect-browserbase/Recordings\") {\n static readonly layer: Layer.Layer<\n BrowserbaseRecordings,\n never,\n BrowserbaseClient | BrowserbaseSessions\n > = Layer.effect(\n BrowserbaseRecordings,\n Effect.gen(function* () {\n const client = yield* BrowserbaseClient;\n const sessions = yield* BrowserbaseSessions;\n const requests = yield* Semaphore.make(1);\n\n const path = (ref: SessionReference) =>\n `/v1/sessions/${encodeURIComponent(ref.sessionId)}/recording/downloads`;\n\n const read = (ref: SessionReference, deadline?: number) =>\n client.json(\"GET\", path(ref), undefined, deadline).pipe(\n Effect.mapError(fromClient(\"recording-status\")),\n Effect.flatMap((raw) =>\n Schema.decodeUnknownEffect(RawBatch)(raw).pipe(\n Effect.mapError(() => failure(\"recording-status\", \"malformed\")),\n ),\n ),\n Effect.filterOrFail(\n (raw) =>\n new Set(raw.downloads.map((page) => page.pageId)).size === raw.downloads.length,\n () => failure(\"recording-status\", \"malformed\"),\n ),\n );\n\n const project = (ref: SessionReference, raw: typeof RawBatch.Type, timedOut = false) =>\n RecordingBatch.make({\n reference: ref,\n timedOut,\n pages: raw.downloads.map((page) =>\n RecordingPage.make({\n pageId: page.pageId,\n status: page.status,\n delivery:\n page.status !== \"COMPLETED\"\n ? \"not-ready\"\n : page.downloadUrl === undefined\n ? \"external-storage\"\n : \"download\",\n ...(page.completedAt === undefined ? {} : { completedAt: page.completedAt }),\n }),\n ),\n });\n\n const authorize = (ref: SessionReference) =>\n requireTerminalSession(\n sessions,\n ref,\n () => failure(\"recording\", \"active\"),\n (error) => ArtifactError.make({ operation: \"recording\", reason: error.reason }),\n );\n\n const status = Effect.fnUntraced(function* (ref: SessionReference) {\n yield* authorize(ref);\n\n return project(ref, yield* read(ref));\n });\n\n const request = (ref: SessionReference, mode: \"initial\" | \"retry-failed\" = \"initial\") =>\n requests.withPermits(1)(\n Effect.gen(function* () {\n if (mode !== \"initial\" && mode !== \"retry-failed\")\n return yield* ArtifactError.make({\n operation: \"recording-request\",\n reason: \"configuration\",\n outcome: \"undispatched\",\n });\n yield* authorize(ref);\n // A prior uncertain POST is reconciled by this GET before any resubmission.\n const before = yield* read(ref);\n\n const needed =\n mode === \"retry-failed\"\n ? before.downloads.some((page) => page.status === \"FAILED\")\n : before.downloads.every((page) => page.status === \"NOT_REQUESTED\");\n\n if (!needed) return project(ref, before);\n\n const raw = yield* client.json(\"POST\", path(ref)).pipe(\n Effect.mapError((error) =>\n ArtifactError.make({\n operation: \"recording-request\",\n reason:\n error.status !== undefined && error.status >= 400 && error.status < 500\n ? error.reason\n : \"assembly-unknown\",\n outcome:\n error.status !== undefined && error.status >= 400 && error.status < 500\n ? \"rejected\"\n : \"unknown\",\n ...(error.status === undefined ? {} : { status: error.status }),\n ...(error.retryAfterMillis === undefined\n ? {}\n : { retryAfterMillis: error.retryAfterMillis }),\n }),\n ),\n Effect.flatMap((value) =>\n Schema.decodeUnknownEffect(RawBatch)(value).pipe(\n Effect.mapError(() =>\n ArtifactError.make({\n operation: \"recording-request\",\n reason: \"malformed\",\n outcome: \"unknown\",\n }),\n ),\n ),\n ),\n );\n\n return project(ref, raw);\n }),\n );\n\n const wait = Effect.fnUntraced(function* (ref: SessionReference, options: PollOptions = {}) {\n const timeout = options.timeoutMillis ?? 120_000;\n const interval = options.intervalMillis ?? 3000;\n\n if (\n !Number.isSafeInteger(timeout) ||\n timeout < 1 ||\n timeout > 600_000 ||\n !Number.isSafeInteger(interval) ||\n interval < 10 ||\n interval > 30_000\n ) {\n return yield* failure(\"recording-wait\", \"configuration\");\n }\n const deadline = yield* deadlineAfter(timeout);\n\n yield* within(authorize(ref), deadline, \"recording-wait\");\n let latest: typeof RawBatch.Type = { downloads: [] };\n\n for (;;) {\n const result = yield* within(read(ref, deadline), deadline, \"recording-wait\").pipe(\n Effect.result,\n );\n\n if (result._tag === \"Success\") {\n latest = result.success;\n if (\n latest.downloads.every(\n (page) => page.status === \"COMPLETED\" || page.status === \"FAILED\",\n )\n )\n return project(ref, latest);\n } else if (\n ![\"timeout\", \"rate-limited\", \"provider\", \"transport\"].includes(result.failure.reason)\n ) {\n return yield* result.failure;\n }\n const remaining = deadline - (yield* nowMillis);\n\n if (remaining <= 0) return project(ref, latest, true);\n yield* Effect.sleep(Math.min(interval, remaining));\n }\n });\n\n const download = (ref: RecordingPageReference, limits: DownloadLimits) =>\n Stream.unwrap(\n Effect.gen(function* () {\n yield* Schema.decodeEffect(RecordingPageReference)(ref).pipe(\n Effect.mapError(() => failure(\"recording-download\", \"configuration\")),\n );\n\n const { maxBytes, timeoutMillis } = yield* transferPolicy(limits, () =>\n failure(\"recording-download\", \"configuration\"),\n );\n\n const deadline = yield* deadlineAfter(timeoutMillis);\n\n yield* within(authorize(ref.session), deadline, \"recording-download\");\n\n const latest = yield* within(\n read(ref.session, deadline),\n deadline,\n \"recording-download\",\n );\n\n const page = latest.downloads.find((entry) => entry.pageId === ref.pageId);\n\n if (page === undefined) return yield* failure(\"recording-download\", \"not-found\");\n if (page.status === \"FAILED\") return yield* failure(\"recording-download\", \"failed\");\n if (page.status !== \"COMPLETED\") return yield* failure(\"recording-download\", \"active\");\n if (page.downloadUrl === undefined) return yield* failure(\"recording-download\", \"byos\");\n\n // A fresh GET mints access for this subscription. No URL is persisted in the reference.\n return client\n .media(\n Redacted.make(page.downloadUrl),\n maxBytes,\n [\"video/mp4\", \"application/octet-stream\"],\n timeoutMillis,\n deadline,\n )\n .pipe(Stream.mapError(fromClient(\"recording-download\")));\n }),\n );\n\n return BrowserbaseRecordings.of({ request, status, wait, download });\n }),\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"Recordings.mjs","names":[],"sources":["../src/Recordings.ts"],"sourcesContent":["import { Context, Effect, Layer, Redacted, Schema, Semaphore, Stream } from \"effect\";\n\nimport { BrowserbaseClient } from \"./Client.ts\";\nimport { ArtifactError, type ClientError } from \"./Errors.ts\";\nimport { requireTerminalSession } from \"./internal/artifact/Authorization.ts\";\nimport { transferPolicy } from \"./internal/artifact/TransferPolicy.ts\";\nimport { deadlineAfter, nowMillis, until } from \"./internal/Deadline.ts\";\nimport { Identifier, type SessionReference } from \"./References.ts\";\nimport { BrowserbaseSessions } from \"./Sessions.ts\";\nimport {\n type ArtifactTransferPolicy,\n RecordingBatch,\n RecordingPage,\n RecordingPageReference,\n} from \"./Transfers.ts\";\n\nconst RawPage = Schema.Struct({\n pageId: Identifier,\n status: Schema.Literals([\"NOT_REQUESTED\", \"PENDING\", \"COMPLETED\", \"FAILED\"]),\n completedAt: Schema.optionalKey(Schema.String.check(Schema.isMaxLength(64))),\n downloadUrl: Schema.optionalKey(Schema.String.check(Schema.isMaxLength(16384))),\n});\n\nconst RawBatch = Schema.Struct({ downloads: Schema.Array(RawPage).check(Schema.isMaxLength(256)) });\n\nexport interface PollOptions {\n readonly timeoutMillis?: number;\n readonly intervalMillis?: number;\n}\n\n/** Recording transfers share the canonical artifact bounds. */\nexport type DownloadLimits = ArtifactTransferPolicy;\n\nconst failure = (operation: ArtifactError[\"operation\"], reason: ArtifactError[\"reason\"]) =>\n ArtifactError.make({ operation, reason });\n\nconst fromClient = (operation: ArtifactError[\"operation\"]) => (error: ClientError) =>\n ArtifactError.make({\n operation,\n reason: error.reason,\n ...(error.outcome === undefined ? {} : { outcome: error.outcome }),\n ...(error.status === undefined ? {} : { status: error.status }),\n ...(error.retryAfterMillis === undefined ? {} : { retryAfterMillis: error.retryAfterMillis }),\n });\n\nconst within = <A, E, R>(\n effect: Effect.Effect<A, E, R>,\n deadline: number,\n operation: ArtifactError[\"operation\"],\n) => until(effect, deadline, () => failure(operation, \"timeout\"));\n\n/** Independent of a live browser. Merely building this Layer performs no provider calls. */\nexport class BrowserbaseRecordings extends Context.Service<\n BrowserbaseRecordings,\n {\n readonly request: (\n reference: SessionReference,\n mode?: \"initial\" | \"retry-failed\",\n ) => Effect.Effect<RecordingBatch, ArtifactError>;\n readonly status: (reference: SessionReference) => Effect.Effect<RecordingBatch, ArtifactError>;\n readonly wait: (\n reference: SessionReference,\n options?: PollOptions,\n ) => Effect.Effect<RecordingBatch, ArtifactError>;\n readonly download: (\n reference: RecordingPageReference,\n limits: DownloadLimits,\n ) => Stream.Stream<Uint8Array, ArtifactError>;\n }\n>()(\"effect-browserbase/Recordings\") {\n static readonly layer: Layer.Layer<\n BrowserbaseRecordings,\n never,\n BrowserbaseClient | BrowserbaseSessions\n > = Layer.effect(\n BrowserbaseRecordings,\n Effect.gen(function* () {\n const client = yield* BrowserbaseClient;\n const sessions = yield* BrowserbaseSessions;\n const requests = yield* Semaphore.make(1);\n\n const path = (ref: SessionReference) =>\n `/v1/sessions/${encodeURIComponent(ref.sessionId)}/recording/downloads`;\n\n const read = (ref: SessionReference, deadline?: number) =>\n client.json(\"GET\", path(ref), undefined, deadline).pipe(\n Effect.mapError(fromClient(\"recording-status\")),\n Effect.flatMap((raw) =>\n Schema.decodeUnknownEffect(RawBatch)(raw).pipe(\n Effect.mapError(() => failure(\"recording-status\", \"malformed\")),\n ),\n ),\n Effect.filterOrFail(\n (raw) =>\n new Set(raw.downloads.map((page) => page.pageId)).size === raw.downloads.length,\n () => failure(\"recording-status\", \"malformed\"),\n ),\n );\n\n const project = (ref: SessionReference, raw: typeof RawBatch.Type, timedOut = false) =>\n RecordingBatch.make({\n reference: ref,\n timedOut,\n pages: raw.downloads.map((page) =>\n RecordingPage.make({\n pageId: page.pageId,\n status: page.status,\n delivery:\n page.status !== \"COMPLETED\"\n ? \"not-ready\"\n : page.downloadUrl === undefined\n ? \"external-storage\"\n : \"download\",\n ...(page.completedAt === undefined ? {} : { completedAt: page.completedAt }),\n }),\n ),\n });\n\n const authorize = (ref: SessionReference) =>\n requireTerminalSession(\n sessions,\n ref,\n () => failure(\"recording\", \"active\"),\n (error) => ArtifactError.make({ operation: \"recording\", reason: error.reason }),\n );\n\n const status = Effect.fnUntraced(function* (ref: SessionReference) {\n yield* authorize(ref);\n\n return project(ref, yield* read(ref));\n });\n\n const request = (ref: SessionReference, mode: \"initial\" | \"retry-failed\" = \"initial\") =>\n requests.withPermits(1)(\n Effect.gen(function* () {\n if (mode !== \"initial\" && mode !== \"retry-failed\")\n return yield* ArtifactError.make({\n operation: \"recording-request\",\n reason: \"configuration\",\n outcome: \"undispatched\",\n });\n yield* authorize(ref);\n // A prior uncertain POST is reconciled by this GET before any resubmission.\n const before = yield* read(ref);\n\n const needed =\n mode === \"retry-failed\"\n ? before.downloads.some((page) => page.status === \"FAILED\")\n : before.downloads.every((page) => page.status === \"NOT_REQUESTED\");\n\n if (!needed) return project(ref, before);\n\n const raw = yield* client.json(\"POST\", path(ref)).pipe(\n Effect.mapError((error) =>\n ArtifactError.make({\n operation: \"recording-request\",\n reason:\n error.status !== undefined && error.status >= 400 && error.status < 500\n ? error.reason\n : \"assembly-unknown\",\n outcome:\n error.status !== undefined && error.status >= 400 && error.status < 500\n ? \"rejected\"\n : \"unknown\",\n ...(error.status === undefined ? {} : { status: error.status }),\n ...(error.retryAfterMillis === undefined\n ? {}\n : { retryAfterMillis: error.retryAfterMillis }),\n }),\n ),\n Effect.flatMap((value) =>\n Schema.decodeUnknownEffect(RawBatch)(value).pipe(\n Effect.mapError(() =>\n ArtifactError.make({\n operation: \"recording-request\",\n reason: \"malformed\",\n outcome: \"unknown\",\n }),\n ),\n ),\n ),\n );\n\n return project(ref, raw);\n }),\n );\n\n const wait = Effect.fnUntraced(function* (ref: SessionReference, options: PollOptions = {}) {\n const timeout = options.timeoutMillis ?? 120_000;\n const interval = options.intervalMillis ?? 3000;\n\n if (\n !Number.isSafeInteger(timeout) ||\n timeout < 1 ||\n timeout > 600_000 ||\n !Number.isSafeInteger(interval) ||\n interval < 10 ||\n interval > 30_000\n ) {\n return yield* failure(\"recording-wait\", \"configuration\");\n }\n const deadline = yield* deadlineAfter(timeout);\n\n yield* within(authorize(ref), deadline, \"recording-wait\");\n let latest: typeof RawBatch.Type = { downloads: [] };\n\n for (;;) {\n const result = yield* within(read(ref, deadline), deadline, \"recording-wait\").pipe(\n Effect.result,\n );\n\n if (result._tag === \"Success\") {\n latest = result.success;\n if (\n latest.downloads.every(\n (page) => page.status === \"COMPLETED\" || page.status === \"FAILED\",\n )\n )\n return project(ref, latest);\n } else if (\n ![\"timeout\", \"rate-limited\", \"provider\", \"transport\"].includes(result.failure.reason)\n ) {\n return yield* result.failure;\n }\n const remaining = deadline - (yield* nowMillis);\n\n if (remaining <= 0) return project(ref, latest, true);\n yield* Effect.sleep(Math.min(interval, remaining));\n }\n });\n\n const download = (ref: RecordingPageReference, limits: DownloadLimits) =>\n Stream.unwrap(\n Effect.gen(function* () {\n yield* Schema.decodeEffect(RecordingPageReference)(ref).pipe(\n Effect.mapError(() => failure(\"recording-download\", \"configuration\")),\n );\n\n const { maxBytes, timeoutMillis } = yield* transferPolicy(limits, () =>\n failure(\"recording-download\", \"configuration\"),\n );\n\n const deadline = yield* deadlineAfter(timeoutMillis);\n\n yield* within(authorize(ref.session), deadline, \"recording-download\");\n\n const latest = yield* within(\n read(ref.session, deadline),\n deadline,\n \"recording-download\",\n );\n\n const page = latest.downloads.find((entry) => entry.pageId === ref.pageId);\n\n if (page === undefined) return yield* failure(\"recording-download\", \"not-found\");\n if (page.status === \"FAILED\") return yield* failure(\"recording-download\", \"failed\");\n if (page.status !== \"COMPLETED\") return yield* failure(\"recording-download\", \"active\");\n if (page.downloadUrl === undefined) return yield* failure(\"recording-download\", \"byos\");\n\n // A fresh GET mints access for this subscription. No URL is persisted in the reference.\n return client\n .media(\n Redacted.make(page.downloadUrl),\n maxBytes,\n [\"video/mp4\", \"application/octet-stream\"],\n timeoutMillis,\n deadline,\n )\n .pipe(Stream.mapError(fromClient(\"recording-download\")));\n }),\n );\n\n return BrowserbaseRecordings.of({ request, status, wait, download });\n }),\n );\n}\n"],"mappings":"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"}
@@ -1,8 +1,6 @@
1
1
  import { Schema } from "effect";
2
- declare namespace References_d_exports {
3
- export { AllocationAttempt, ContextReference, ExtensionReference, Identifier, SessionReference };
4
- }
5
- declare const Identifier: Schema.NonEmptyString;
2
+ import { Identifier as Identifier$1 } from "effect-browser/browser-data";
3
+ //#region src/References.d.ts
6
4
  declare const SessionReference_base: Schema.Class<SessionReference, Schema.Struct<{
7
5
  readonly provider: Schema.Literal<"browserbase">;
8
6
  readonly projectId: Schema.NonEmptyString;
@@ -31,5 +29,6 @@ declare const ExtensionReference_base: Schema.Class<ExtensionReference, Schema.S
31
29
  }>, {}>;
32
30
  declare class ExtensionReference extends ExtensionReference_base {}
33
31
  //#endregion
34
- export { References_d_exports as a, Identifier as i, ContextReference as n, SessionReference as o, ExtensionReference as r, AllocationAttempt as t };
35
- //# sourceMappingURL=References-URDAtapt.d.mts.map
32
+ export { SessionReference as a, Identifier$1 as i, ContextReference as n, ExtensionReference as r, AllocationAttempt as t };
33
+ export {};
34
+ //# sourceMappingURL=References-DOH3Wu44.d.mts.map
@@ -1,2 +1,3 @@
1
- import { i as Identifier, n as ContextReference, o as SessionReference, r as ExtensionReference, t as AllocationAttempt } from "./References-URDAtapt.mjs";
2
- export { AllocationAttempt, ContextReference, ExtensionReference, Identifier, SessionReference };
1
+ import { a as SessionReference, i as Identifier, n as ContextReference, r as ExtensionReference, t as AllocationAttempt } from "./References-DOH3Wu44.mjs";
2
+ export { AllocationAttempt, ContextReference, ExtensionReference, Identifier, SessionReference };
3
+ export {};
@@ -1,23 +1,15 @@
1
- import { t as __exportAll } from "./rolldown-runtime-D7D4PA-g.mjs";
2
1
  import { Schema } from "effect";
2
+ import { Identifier, Identifier as Identifier$1 } from "effect-browser/browser-data";
3
3
  //#region src/References.ts
4
- var References_exports = /* @__PURE__ */ __exportAll({
5
- AllocationAttempt: () => AllocationAttempt,
6
- ContextReference: () => ContextReference,
7
- ExtensionReference: () => ExtensionReference,
8
- Identifier: () => Identifier,
9
- SessionReference: () => SessionReference
10
- });
11
- const Identifier = Schema.NonEmptyString.check(Schema.isMaxLength(256), Schema.isPattern(/^[A-Za-z0-9_-]+$/));
12
4
  var SessionReference = class extends Schema.Class("BrowserbaseSessionReference")({
13
5
  provider: Schema.Literal("browserbase"),
14
- projectId: Identifier,
15
- sessionId: Identifier
6
+ projectId: Identifier$1,
7
+ sessionId: Identifier$1
16
8
  }) {};
17
9
  /** The nonce is reconciliation metadata, not provider idempotency. */
18
10
  var AllocationAttempt = class extends Schema.Class("BrowserbaseAllocationAttempt")({
19
- projectId: Identifier,
20
- attemptId: Identifier,
11
+ projectId: Identifier$1,
12
+ attemptId: Identifier$1,
21
13
  requestedAtMillis: Schema.Finite,
22
14
  timeoutSeconds: Schema.Int.check(Schema.isBetween({
23
15
  minimum: 60,
@@ -27,15 +19,15 @@ var AllocationAttempt = class extends Schema.Class("BrowserbaseAllocationAttempt
27
19
  /** Project-qualified durable identity; no browser connection or credential is retained. */
28
20
  var ContextReference = class extends Schema.Class("BrowserbaseContextReference")({
29
21
  provider: Schema.Literal("browserbase"),
30
- projectId: Identifier,
31
- contextId: Identifier
22
+ projectId: Identifier$1,
23
+ contextId: Identifier$1
32
24
  }) {};
33
25
  var ExtensionReference = class extends Schema.Class("BrowserbaseExtensionReference")({
34
26
  provider: Schema.Literal("browserbase"),
35
- projectId: Identifier,
36
- extensionId: Identifier
27
+ projectId: Identifier$1,
28
+ extensionId: Identifier$1
37
29
  }) {};
38
30
  //#endregion
39
- export { AllocationAttempt, ContextReference, ExtensionReference, Identifier, SessionReference, References_exports as t };
31
+ export { AllocationAttempt, ContextReference, ExtensionReference, Identifier, SessionReference };
40
32
 
41
33
  //# sourceMappingURL=References.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"References.mjs","names":[],"sources":["../src/References.ts"],"sourcesContent":["import { Schema } from \"effect\";\n\nexport const Identifier = Schema.NonEmptyString.check(\n Schema.isMaxLength(256),\n Schema.isPattern(/^[A-Za-z0-9_-]+$/),\n);\n\nexport class SessionReference extends Schema.Class<SessionReference>(\"BrowserbaseSessionReference\")(\n {\n provider: Schema.Literal(\"browserbase\"),\n projectId: Identifier,\n sessionId: Identifier,\n },\n) {}\n\n/** The nonce is reconciliation metadata, not provider idempotency. */\nexport class AllocationAttempt extends Schema.Class<AllocationAttempt>(\n \"BrowserbaseAllocationAttempt\",\n)({\n projectId: Identifier,\n attemptId: Identifier,\n requestedAtMillis: Schema.Finite,\n timeoutSeconds: Schema.Int.check(Schema.isBetween({ minimum: 60, maximum: 21600 })),\n}) {}\n\n/** Project-qualified durable identity; no browser connection or credential is retained. */\nexport class ContextReference extends Schema.Class<ContextReference>(\"BrowserbaseContextReference\")(\n {\n provider: Schema.Literal(\"browserbase\"),\n projectId: Identifier,\n contextId: Identifier,\n },\n) {}\n\nexport class ExtensionReference extends Schema.Class<ExtensionReference>(\n \"BrowserbaseExtensionReference\",\n)({\n provider: Schema.Literal(\"browserbase\"),\n projectId: Identifier,\n extensionId: Identifier,\n}) {}\n"],"mappings":";;;;;;;;;;AAEA,MAAa,aAAa,OAAO,eAAe,MAC9C,OAAO,YAAY,GAAG,GACtB,OAAO,UAAU,kBAAkB,CACrC;AAEA,IAAa,mBAAb,cAAsC,OAAO,MAAwB,6BAA6B,CAAC,CACjG;CACE,UAAU,OAAO,QAAQ,aAAa;CACtC,WAAW;CACX,WAAW;AACb,CACF,CAAC,CAAC,CAAC;;AAGH,IAAa,oBAAb,cAAuC,OAAO,MAC5C,8BACF,CAAC,CAAC;CACA,WAAW;CACX,WAAW;CACX,mBAAmB,OAAO;CAC1B,gBAAgB,OAAO,IAAI,MAAM,OAAO,UAAU;EAAE,SAAS;EAAI,SAAS;CAAM,CAAC,CAAC;AACpF,CAAC,CAAC,CAAC,CAAC;;AAGJ,IAAa,mBAAb,cAAsC,OAAO,MAAwB,6BAA6B,CAAC,CACjG;CACE,UAAU,OAAO,QAAQ,aAAa;CACtC,WAAW;CACX,WAAW;AACb,CACF,CAAC,CAAC,CAAC;AAEH,IAAa,qBAAb,cAAwC,OAAO,MAC7C,+BACF,CAAC,CAAC;CACA,UAAU,OAAO,QAAQ,aAAa;CACtC,WAAW;CACX,aAAa;AACf,CAAC,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"References.mjs","names":["Identifier"],"sources":["../src/References.ts"],"sourcesContent":["import { Schema } from \"effect\";\nimport { Identifier } from \"effect-browser/browser-data\";\n\nexport { Identifier } from \"effect-browser/browser-data\";\n\nexport class SessionReference extends Schema.Class<SessionReference>(\"BrowserbaseSessionReference\")(\n {\n provider: Schema.Literal(\"browserbase\"),\n projectId: Identifier,\n sessionId: Identifier,\n },\n) {}\n\n/** The nonce is reconciliation metadata, not provider idempotency. */\nexport class AllocationAttempt extends Schema.Class<AllocationAttempt>(\n \"BrowserbaseAllocationAttempt\",\n)({\n projectId: Identifier,\n attemptId: Identifier,\n requestedAtMillis: Schema.Finite,\n timeoutSeconds: Schema.Int.check(Schema.isBetween({ minimum: 60, maximum: 21600 })),\n}) {}\n\n/** Project-qualified durable identity; no browser connection or credential is retained. */\nexport class ContextReference extends Schema.Class<ContextReference>(\"BrowserbaseContextReference\")(\n {\n provider: Schema.Literal(\"browserbase\"),\n projectId: Identifier,\n contextId: Identifier,\n },\n) {}\n\nexport class ExtensionReference extends Schema.Class<ExtensionReference>(\n \"BrowserbaseExtensionReference\",\n)({\n provider: Schema.Literal(\"browserbase\"),\n projectId: Identifier,\n extensionId: Identifier,\n}) {}\n"],"mappings":";;;AAKA,IAAa,mBAAb,cAAsC,OAAO,MAAwB,6BAA6B,CAAC,CACjG;CACE,UAAU,OAAO,QAAQ,aAAa;CACtC,WAAWA;CACX,WAAWA;AACb,CACF,CAAC,CAAC,CAAC;;AAGH,IAAa,oBAAb,cAAuC,OAAO,MAC5C,8BACF,CAAC,CAAC;CACA,WAAWA;CACX,WAAWA;CACX,mBAAmB,OAAO;CAC1B,gBAAgB,OAAO,IAAI,MAAM,OAAO,UAAU;EAAE,SAAS;EAAI,SAAS;CAAM,CAAC,CAAC;AACpF,CAAC,CAAC,CAAC,CAAC;;AAGJ,IAAa,mBAAb,cAAsC,OAAO,MAAwB,6BAA6B,CAAC,CACjG;CACE,UAAU,OAAO,QAAQ,aAAa;CACtC,WAAWA;CACX,WAAWA;AACb,CACF,CAAC,CAAC,CAAC;AAEH,IAAa,qBAAb,cAAwC,OAAO,MAC7C,+BACF,CAAC,CAAC;CACA,UAAU,OAAO,QAAQ,aAAa;CACtC,WAAWA;CACX,aAAaA;AACf,CAAC,CAAC,CAAC,CAAC"}
@@ -1,12 +1,10 @@
1
- import { o as SessionReference } from "./References-URDAtapt.mjs";
1
+ import { a as SessionReference } from "./References-DOH3Wu44.mjs";
2
2
  import { ArtifactError } from "./Errors.mjs";
3
- import { t as BrowserbaseClient } from "./Client-Ca0zSg1n.mjs";
4
- import { t as BrowserbaseSessions } from "./Sessions-B8E4kMxo.mjs";
5
- import { l as ReplayPage, s as RecordingPageReference, t as ArtifactTransferPolicy } from "./Transfers-Czv5IZzJ.mjs";
3
+ import { BrowserbaseClient } from "./Client.mjs";
4
+ import { t as BrowserbaseSessions } from "./Sessions-tFJYaXFq.mjs";
5
+ import { c as RecordingPageReference, t as ArtifactTransferPolicy, u as ReplayPage } from "./Transfers-GVqzrDWl.mjs";
6
6
  import { Context, Effect, Layer, Redacted, Stream } from "effect";
7
- declare namespace Replays_d_exports {
8
- export { BrowserbaseReplays, ReplayAccess };
9
- }
7
+ //#region src/Replays.d.ts
10
8
  export interface ReplayAccess {
11
9
  readonly reference: RecordingPageReference;
12
10
  /** Temporary playback material for an authorized host route; never includes the API key. */
@@ -24,5 +22,5 @@ export declare class BrowserbaseReplays extends BrowserbaseReplays_base {
24
22
  static readonly layer: Layer.Layer<BrowserbaseReplays, never, BrowserbaseClient | BrowserbaseSessions>;
25
23
  }
26
24
  //#endregion
27
- export { Replays_d_exports as t };
25
+ export {};
28
26
  //# sourceMappingURL=Replays.d.mts.map
package/dist/Replays.mjs CHANGED
@@ -1,14 +1,12 @@
1
- import { t as __exportAll } from "./rolldown-runtime-D7D4PA-g.mjs";
2
1
  import { Identifier } from "./References.mjs";
3
2
  import { ArtifactError } from "./Errors.mjs";
4
3
  import { RecordingPageReference, ReplayPage } from "./Transfers.mjs";
5
- import { t as BrowserbaseClient } from "./Client-D1_xYM9o.mjs";
4
+ import { t as BrowserbaseClient } from "./Client-BQteUePT.mjs";
6
5
  import { n as transferPolicy } from "./TransferPolicy-DQ06i7SZ.mjs";
7
- import { t as BrowserbaseSessions } from "./Sessions-CtbseWEh.mjs";
6
+ import { t as BrowserbaseSessions } from "./Sessions-DoQGg9nB.mjs";
8
7
  import { t as requireTerminalSession } from "./Authorization-Ll5f_XNM.mjs";
9
8
  import { Clock, Context, Effect, Layer, Redacted, Schema, Stream } from "effect";
10
9
  //#region src/Replays.ts
11
- var Replays_exports = /* @__PURE__ */ __exportAll({ BrowserbaseReplays: () => BrowserbaseReplays });
12
10
  const Metadata = Schema.Struct({
13
11
  pageCount: Schema.Natural,
14
12
  pages: Schema.Array(Schema.Struct({
@@ -104,6 +102,6 @@ var BrowserbaseReplays = class BrowserbaseReplays extends Context.Service()("eff
104
102
  }));
105
103
  };
106
104
  //#endregion
107
- export { BrowserbaseReplays, Replays_exports as t };
105
+ export { BrowserbaseReplays };
108
106
 
109
107
  //# sourceMappingURL=Replays.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"Replays.mjs","names":[],"sources":["../src/Replays.ts"],"sourcesContent":["import { Clock, Context, Effect, Layer, Redacted, Schema, Stream } from \"effect\";\n\nimport { BrowserbaseClient } from \"./Client.ts\";\nimport { ArtifactError, type ClientError } from \"./Errors.ts\";\nimport { requireTerminalSession } from \"./internal/artifact/Authorization.ts\";\nimport { transferPolicy } from \"./internal/artifact/TransferPolicy.ts\";\nimport { Identifier, type SessionReference } from \"./References.ts\";\nimport { BrowserbaseSessions } from \"./Sessions.ts\";\nimport {\n type ArtifactTransferPolicy as DownloadLimits,\n RecordingPageReference,\n ReplayPage,\n} from \"./Transfers.ts\";\n\nconst Metadata = Schema.Struct({\n pageCount: Schema.Natural,\n pages: Schema.Array(\n Schema.Struct({\n pageId: Identifier,\n startTimeMs: Schema.Finite,\n endTimeMs: Schema.Finite,\n url: Schema.String.check(Schema.isMaxLength(16384)),\n }),\n ).check(Schema.isMaxLength(256)),\n});\n\nconst failure = (operation: ArtifactError[\"operation\"], reason: ArtifactError[\"reason\"]) =>\n ArtifactError.make({ operation, reason });\n\nconst fromClient = (operation: ArtifactError[\"operation\"]) => (error: ClientError) =>\n ArtifactError.make({\n operation,\n reason: error.reason,\n ...(error.outcome === undefined ? {} : { outcome: error.outcome }),\n ...(error.status === undefined ? {} : { status: error.status }),\n ...(error.retryAfterMillis === undefined ? {} : { retryAfterMillis: error.retryAfterMillis }),\n });\n\nexport interface ReplayAccess {\n readonly reference: RecordingPageReference;\n /** Temporary playback material for an authorized host route; never includes the API key. */\n readonly playlist: Redacted.Redacted<string>;\n readonly fetchedAtMillis: number;\n readonly mediaCount: number;\n /** Optional host proxy of an indexed URI from this exact playlist; no arbitrary URL parameter. */\n readonly media: (\n index: number,\n limits: DownloadLimits,\n ) => Stream.Stream<Uint8Array, ArtifactError>;\n}\n\n/** Media-playlist validation, not a player. Unsupported URI-bearing tags fail closed. */\nconst playlistUrls = (body: string, allowed: (url: string) => boolean): ReadonlyArray<string> => {\n const lines = body.split(/\\r?\\n/);\n\n if (lines[0] !== \"#EXTM3U\" || !lines.includes(\"#EXT-X-ENDLIST\") || lines.length > 32768) {\n throw failure(\"replay-playlist\", \"malformed\");\n }\n const urls: string[] = [];\n\n for (const raw of lines.slice(1)) {\n const line = raw.trim();\n\n if (line === \"\") continue;\n if (\n line.startsWith(\"#EXT-X-STREAM-INF\") ||\n line.startsWith(\"#EXT-X-MEDIA:\") ||\n (line.startsWith(\"#EXT-X-KEY:\") && line !== \"#EXT-X-KEY:METHOD=NONE\")\n ) {\n throw failure(\"replay-playlist\", \"unsupported\");\n }\n let url: string | undefined;\n\n if (!line.startsWith(\"#\")) url = line;\n else if (/URI\\s*=/.test(line)) {\n if (!line.startsWith(\"#EXT-X-MAP:\")) throw failure(\"replay-playlist\", \"unsupported\");\n const match = /(?:^|,)URI=\"([^\"]+)\"(?:,|$)/.exec(line.slice(\"#EXT-X-MAP:\".length));\n\n if (match === null) throw failure(\"replay-playlist\", \"malformed\");\n url = match[1];\n }\n if (url !== undefined) {\n if (!allowed(url) || urls.length >= 16384) throw failure(\"replay-playlist\", \"unsafe-url\");\n urls.push(url);\n }\n }\n if (urls.length === 0) throw failure(\"replay-playlist\", \"malformed\");\n\n return urls;\n};\n\nexport class BrowserbaseReplays extends Context.Service<\n BrowserbaseReplays,\n {\n readonly metadata: (\n reference: SessionReference,\n ) => Effect.Effect<ReadonlyArray<ReplayPage>, ArtifactError>;\n readonly openPage: (\n reference: RecordingPageReference,\n ) => Effect.Effect<ReplayAccess, ArtifactError>;\n }\n>()(\"effect-browserbase/Replays\") {\n static readonly layer: Layer.Layer<\n BrowserbaseReplays,\n never,\n BrowserbaseClient | BrowserbaseSessions\n > = Layer.effect(\n BrowserbaseReplays,\n Effect.gen(function* () {\n const client = yield* BrowserbaseClient;\n const sessions = yield* BrowserbaseSessions;\n\n const metadata = Effect.fnUntraced(function* (ref: SessionReference) {\n yield* requireTerminalSession(\n sessions,\n ref,\n () => failure(\"replay\", \"active\"),\n (error) => ArtifactError.make({ operation: \"replay\", reason: error.reason }),\n );\n\n const raw = yield* client\n .json(\"GET\", `/v1/sessions/${encodeURIComponent(ref.sessionId)}/replays`)\n .pipe(\n Effect.mapError(fromClient(\"replay-metadata\")),\n Effect.flatMap((value) =>\n Schema.decodeUnknownEffect(Metadata)(value).pipe(\n Effect.mapError(() => failure(\"replay-metadata\", \"malformed\")),\n ),\n ),\n );\n\n if (\n raw.pageCount !== raw.pages.length ||\n new Set(raw.pages.map((page) => page.pageId)).size !== raw.pages.length ||\n raw.pages.some((page) => page.startTimeMs < 0 || page.endTimeMs < page.startTimeMs)\n ) {\n return yield* failure(\"replay-metadata\", \"malformed\");\n }\n\n return raw.pages.map((page) =>\n ReplayPage.make({\n pageId: page.pageId,\n startTimeMs: page.startTimeMs,\n endTimeMs: page.endTimeMs,\n }),\n );\n });\n\n const openPage = Effect.fnUntraced(function* (ref: RecordingPageReference) {\n yield* Schema.decodeEffect(RecordingPageReference)(ref).pipe(\n Effect.mapError(() => failure(\"replay\", \"configuration\")),\n );\n\n const pages = yield* metadata(ref.session);\n\n if (!pages.some((page) => page.pageId === ref.pageId))\n return yield* failure(\"replay\", \"not-found\");\n\n const body = yield* client\n .text(\n `/v1/sessions/${encodeURIComponent(ref.session.sessionId)}/replays/${encodeURIComponent(ref.pageId)}`,\n 1024 * 1024,\n [\"application/vnd.apple.mpegurl\", \"application/x-mpegurl\"],\n )\n .pipe(Effect.mapError(fromClient(\"replay-playlist\")));\n\n // One sanitized rejection: an unsupported tag and an unapproved URI are both\n // refusals to interpret the playlist, and neither may echo its contents.\n const urls = yield* Effect.try({\n try: () => playlistUrls(body, client.validateMediaUrl),\n catch: () => failure(\"replay-playlist\", \"malformed\"),\n });\n\n return {\n reference: ref,\n playlist: Redacted.make(body),\n fetchedAtMillis: yield* Clock.currentTimeMillis,\n mediaCount: urls.length,\n media: (index: number, limits: DownloadLimits) => {\n const url = Number.isSafeInteger(index) ? urls[index] : undefined;\n\n return url === undefined\n ? Stream.fail(failure(\"replay-media\", \"not-found\"))\n : Stream.unwrap(\n transferPolicy(\n {\n maxBytes: limits.maxBytes,\n ...(limits.timeoutMillis === undefined\n ? {}\n : { timeoutMillis: limits.timeoutMillis }),\n },\n () => failure(\"replay-media\", \"configuration\"),\n ).pipe(\n Effect.map(({ maxBytes, timeoutMillis }) =>\n client\n .media(\n Redacted.make(url),\n maxBytes,\n [\"video/mp4\", \"video/iso.segment\", \"application/octet-stream\"],\n timeoutMillis,\n )\n .pipe(Stream.mapError(fromClient(\"replay-media\"))),\n ),\n ),\n );\n },\n } satisfies ReplayAccess;\n });\n\n return BrowserbaseReplays.of({ metadata, openPage });\n }),\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"Replays.mjs","names":[],"sources":["../src/Replays.ts"],"sourcesContent":["import { Clock, Context, Effect, Layer, Redacted, Schema, Stream } from \"effect\";\n\nimport { BrowserbaseClient } from \"./Client.ts\";\nimport { ArtifactError, type ClientError } from \"./Errors.ts\";\nimport { requireTerminalSession } from \"./internal/artifact/Authorization.ts\";\nimport { transferPolicy } from \"./internal/artifact/TransferPolicy.ts\";\nimport { Identifier, type SessionReference } from \"./References.ts\";\nimport { BrowserbaseSessions } from \"./Sessions.ts\";\nimport {\n type ArtifactTransferPolicy as DownloadLimits,\n RecordingPageReference,\n ReplayPage,\n} from \"./Transfers.ts\";\n\nconst Metadata = Schema.Struct({\n pageCount: Schema.Natural,\n pages: Schema.Array(\n Schema.Struct({\n pageId: Identifier,\n startTimeMs: Schema.Finite,\n endTimeMs: Schema.Finite,\n url: Schema.String.check(Schema.isMaxLength(16384)),\n }),\n ).check(Schema.isMaxLength(256)),\n});\n\nconst failure = (operation: ArtifactError[\"operation\"], reason: ArtifactError[\"reason\"]) =>\n ArtifactError.make({ operation, reason });\n\nconst fromClient = (operation: ArtifactError[\"operation\"]) => (error: ClientError) =>\n ArtifactError.make({\n operation,\n reason: error.reason,\n ...(error.outcome === undefined ? {} : { outcome: error.outcome }),\n ...(error.status === undefined ? {} : { status: error.status }),\n ...(error.retryAfterMillis === undefined ? {} : { retryAfterMillis: error.retryAfterMillis }),\n });\n\nexport interface ReplayAccess {\n readonly reference: RecordingPageReference;\n /** Temporary playback material for an authorized host route; never includes the API key. */\n readonly playlist: Redacted.Redacted<string>;\n readonly fetchedAtMillis: number;\n readonly mediaCount: number;\n /** Optional host proxy of an indexed URI from this exact playlist; no arbitrary URL parameter. */\n readonly media: (\n index: number,\n limits: DownloadLimits,\n ) => Stream.Stream<Uint8Array, ArtifactError>;\n}\n\n/** Media-playlist validation, not a player. Unsupported URI-bearing tags fail closed. */\nconst playlistUrls = (body: string, allowed: (url: string) => boolean): ReadonlyArray<string> => {\n const lines = body.split(/\\r?\\n/);\n\n if (lines[0] !== \"#EXTM3U\" || !lines.includes(\"#EXT-X-ENDLIST\") || lines.length > 32768) {\n throw failure(\"replay-playlist\", \"malformed\");\n }\n const urls: string[] = [];\n\n for (const raw of lines.slice(1)) {\n const line = raw.trim();\n\n if (line === \"\") continue;\n if (\n line.startsWith(\"#EXT-X-STREAM-INF\") ||\n line.startsWith(\"#EXT-X-MEDIA:\") ||\n (line.startsWith(\"#EXT-X-KEY:\") && line !== \"#EXT-X-KEY:METHOD=NONE\")\n ) {\n throw failure(\"replay-playlist\", \"unsupported\");\n }\n let url: string | undefined;\n\n if (!line.startsWith(\"#\")) url = line;\n else if (/URI\\s*=/.test(line)) {\n if (!line.startsWith(\"#EXT-X-MAP:\")) throw failure(\"replay-playlist\", \"unsupported\");\n const match = /(?:^|,)URI=\"([^\"]+)\"(?:,|$)/.exec(line.slice(\"#EXT-X-MAP:\".length));\n\n if (match === null) throw failure(\"replay-playlist\", \"malformed\");\n url = match[1];\n }\n if (url !== undefined) {\n if (!allowed(url) || urls.length >= 16384) throw failure(\"replay-playlist\", \"unsafe-url\");\n urls.push(url);\n }\n }\n if (urls.length === 0) throw failure(\"replay-playlist\", \"malformed\");\n\n return urls;\n};\n\nexport class BrowserbaseReplays extends Context.Service<\n BrowserbaseReplays,\n {\n readonly metadata: (\n reference: SessionReference,\n ) => Effect.Effect<ReadonlyArray<ReplayPage>, ArtifactError>;\n readonly openPage: (\n reference: RecordingPageReference,\n ) => Effect.Effect<ReplayAccess, ArtifactError>;\n }\n>()(\"effect-browserbase/Replays\") {\n static readonly layer: Layer.Layer<\n BrowserbaseReplays,\n never,\n BrowserbaseClient | BrowserbaseSessions\n > = Layer.effect(\n BrowserbaseReplays,\n Effect.gen(function* () {\n const client = yield* BrowserbaseClient;\n const sessions = yield* BrowserbaseSessions;\n\n const metadata = Effect.fnUntraced(function* (ref: SessionReference) {\n yield* requireTerminalSession(\n sessions,\n ref,\n () => failure(\"replay\", \"active\"),\n (error) => ArtifactError.make({ operation: \"replay\", reason: error.reason }),\n );\n\n const raw = yield* client\n .json(\"GET\", `/v1/sessions/${encodeURIComponent(ref.sessionId)}/replays`)\n .pipe(\n Effect.mapError(fromClient(\"replay-metadata\")),\n Effect.flatMap((value) =>\n Schema.decodeUnknownEffect(Metadata)(value).pipe(\n Effect.mapError(() => failure(\"replay-metadata\", \"malformed\")),\n ),\n ),\n );\n\n if (\n raw.pageCount !== raw.pages.length ||\n new Set(raw.pages.map((page) => page.pageId)).size !== raw.pages.length ||\n raw.pages.some((page) => page.startTimeMs < 0 || page.endTimeMs < page.startTimeMs)\n ) {\n return yield* failure(\"replay-metadata\", \"malformed\");\n }\n\n return raw.pages.map((page) =>\n ReplayPage.make({\n pageId: page.pageId,\n startTimeMs: page.startTimeMs,\n endTimeMs: page.endTimeMs,\n }),\n );\n });\n\n const openPage = Effect.fnUntraced(function* (ref: RecordingPageReference) {\n yield* Schema.decodeEffect(RecordingPageReference)(ref).pipe(\n Effect.mapError(() => failure(\"replay\", \"configuration\")),\n );\n\n const pages = yield* metadata(ref.session);\n\n if (!pages.some((page) => page.pageId === ref.pageId))\n return yield* failure(\"replay\", \"not-found\");\n\n const body = yield* client\n .text(\n `/v1/sessions/${encodeURIComponent(ref.session.sessionId)}/replays/${encodeURIComponent(ref.pageId)}`,\n 1024 * 1024,\n [\"application/vnd.apple.mpegurl\", \"application/x-mpegurl\"],\n )\n .pipe(Effect.mapError(fromClient(\"replay-playlist\")));\n\n // One sanitized rejection: an unsupported tag and an unapproved URI are both\n // refusals to interpret the playlist, and neither may echo its contents.\n const urls = yield* Effect.try({\n try: () => playlistUrls(body, client.validateMediaUrl),\n catch: () => failure(\"replay-playlist\", \"malformed\"),\n });\n\n return {\n reference: ref,\n playlist: Redacted.make(body),\n fetchedAtMillis: yield* Clock.currentTimeMillis,\n mediaCount: urls.length,\n media: (index: number, limits: DownloadLimits) => {\n const url = Number.isSafeInteger(index) ? urls[index] : undefined;\n\n return url === undefined\n ? Stream.fail(failure(\"replay-media\", \"not-found\"))\n : Stream.unwrap(\n transferPolicy(\n {\n maxBytes: limits.maxBytes,\n ...(limits.timeoutMillis === undefined\n ? {}\n : { timeoutMillis: limits.timeoutMillis }),\n },\n () => failure(\"replay-media\", \"configuration\"),\n ).pipe(\n Effect.map(({ maxBytes, timeoutMillis }) =>\n client\n .media(\n Redacted.make(url),\n maxBytes,\n [\"video/mp4\", \"video/iso.segment\", \"application/octet-stream\"],\n timeoutMillis,\n )\n .pipe(Stream.mapError(fromClient(\"replay-media\"))),\n ),\n ),\n );\n },\n } satisfies ReplayAccess;\n });\n\n return BrowserbaseReplays.of({ metadata, openPage });\n }),\n );\n}\n"],"mappings":"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"}
package/dist/Search.d.mts CHANGED
@@ -1,9 +1,7 @@
1
1
  import { PlatformError } from "./Errors.mjs";
2
- import { t as BrowserbaseClient } from "./Client-Ca0zSg1n.mjs";
2
+ import { BrowserbaseClient } from "./Client.mjs";
3
3
  import { Context, Effect, Layer, Schema } from "effect";
4
- declare namespace Search_d_exports {
5
- export { BrowserbaseSearch, SearchQuery, SearchResult, SearchResults };
6
- }
4
+ //#region src/Search.d.ts
7
5
  export declare const SearchQuery: Schema.Struct<{
8
6
  readonly query: Schema.NonEmptyString;
9
7
  /** 1–25; the provider defaults to 10. */
@@ -34,5 +32,5 @@ export declare class BrowserbaseSearch extends BrowserbaseSearch_base {
34
32
  static readonly layer: Layer.Layer<BrowserbaseSearch, never, BrowserbaseClient>;
35
33
  }
36
34
  //#endregion
37
- export { Search_d_exports as t };
35
+ export {};
38
36
  //# sourceMappingURL=Search.d.mts.map
package/dist/Search.mjs CHANGED
@@ -1,15 +1,8 @@
1
- import { t as __exportAll } from "./rolldown-runtime-D7D4PA-g.mjs";
2
1
  import { PlatformError } from "./Errors.mjs";
3
- import { t as BrowserbaseClient } from "./Client-D1_xYM9o.mjs";
2
+ import { t as BrowserbaseClient } from "./Client-BQteUePT.mjs";
4
3
  import { t as resource } from "./Resource-DBksC4zB.mjs";
5
4
  import { Context, Effect, Layer, Schema } from "effect";
6
5
  //#region src/Search.ts
7
- var Search_exports = /* @__PURE__ */ __exportAll({
8
- BrowserbaseSearch: () => BrowserbaseSearch,
9
- SearchQuery: () => SearchQuery,
10
- SearchResult: () => SearchResult,
11
- SearchResults: () => SearchResults
12
- });
13
6
  const Text = Schema.String.check(Schema.isMaxLength(16384));
14
7
  const SearchQuery = Schema.Struct({
15
8
  query: Schema.NonEmptyString.check(Schema.isMaxLength(2048)),
@@ -48,6 +41,6 @@ var BrowserbaseSearch = class BrowserbaseSearch extends Context.Service()("effec
48
41
  }));
49
42
  };
50
43
  //#endregion
51
- export { BrowserbaseSearch, SearchQuery, SearchResult, SearchResults, Search_exports as t };
44
+ export { BrowserbaseSearch, SearchQuery, SearchResult, SearchResults };
52
45
 
53
46
  //# sourceMappingURL=Search.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"Search.mjs","names":[],"sources":["../src/Search.ts"],"sourcesContent":["import { Context, Effect, Layer, Schema } from \"effect\";\n\nimport { BrowserbaseClient } from \"./Client.ts\";\nimport { PlatformError } from \"./Errors.ts\";\nimport { resource } from \"./internal/http/Resource.ts\";\n\nconst Text = Schema.String.check(Schema.isMaxLength(16_384));\n\nexport const SearchQuery = Schema.Struct({\n query: Schema.NonEmptyString.check(Schema.isMaxLength(2048)),\n /** 1–25; the provider defaults to 10. */\n numResults: Schema.optionalKey(Schema.Int.check(Schema.isBetween({ minimum: 1, maximum: 25 }))),\n});\n\nexport type SearchQuery = typeof SearchQuery.Type;\n\nexport class SearchResult extends Schema.Class<SearchResult>(\"BrowserbaseSearchResult\")({\n id: Text,\n url: Text,\n title: Text,\n author: Schema.optionalKey(Text),\n publishedDate: Schema.optionalKey(Text),\n image: Schema.optionalKey(Text),\n favicon: Schema.optionalKey(Text),\n}) {}\n\nexport class SearchResults extends Schema.Class<SearchResults>(\"BrowserbaseSearchResults\")({\n requestId: Text,\n query: Text,\n results: Schema.Array(SearchResult).check(Schema.isMaxLength(25)),\n}) {}\n\n/** Browserbase web search. Each call is billed and is never retried. */\nexport class BrowserbaseSearch extends Context.Service<\n BrowserbaseSearch,\n {\n readonly web: (query: SearchQuery) => Effect.Effect<SearchResults, PlatformError>;\n }\n>()(\"effect-browserbase/Search\") {\n static readonly layer: Layer.Layer<BrowserbaseSearch, never, BrowserbaseClient> = Layer.effect(\n BrowserbaseSearch,\n Effect.gen(function* () {\n const api = resource<PlatformError>(yield* BrowserbaseClient, (failure) =>\n PlatformError.make({ ...failure, service: \"search\" }),\n );\n\n const web = Effect.fn(\"BrowserbaseSearch.web\")(function* (query: SearchQuery) {\n const value = yield* api.input(SearchQuery, query, \"search-web\");\n\n return yield* api.request(\"POST\", \"/v1/search\", SearchResults, \"search-web\", value);\n });\n\n return BrowserbaseSearch.of({ web });\n }),\n );\n}\n"],"mappings":";;;;;;;;;;;;AAMA,MAAM,OAAO,OAAO,OAAO,MAAM,OAAO,YAAY,KAAM,CAAC;AAE3D,MAAa,cAAc,OAAO,OAAO;CACvC,OAAO,OAAO,eAAe,MAAM,OAAO,YAAY,IAAI,CAAC;;CAE3D,YAAY,OAAO,YAAY,OAAO,IAAI,MAAM,OAAO,UAAU;EAAE,SAAS;EAAG,SAAS;CAAG,CAAC,CAAC,CAAC;AAChG,CAAC;AAID,IAAa,eAAb,cAAkC,OAAO,MAAoB,yBAAyB,CAAC,CAAC;CACtF,IAAI;CACJ,KAAK;CACL,OAAO;CACP,QAAQ,OAAO,YAAY,IAAI;CAC/B,eAAe,OAAO,YAAY,IAAI;CACtC,OAAO,OAAO,YAAY,IAAI;CAC9B,SAAS,OAAO,YAAY,IAAI;AAClC,CAAC,CAAC,CAAC,CAAC;AAEJ,IAAa,gBAAb,cAAmC,OAAO,MAAqB,0BAA0B,CAAC,CAAC;CACzF,WAAW;CACX,OAAO;CACP,SAAS,OAAO,MAAM,YAAY,CAAC,CAAC,MAAM,OAAO,YAAY,EAAE,CAAC;AAClE,CAAC,CAAC,CAAC,CAAC;;AAGJ,IAAa,oBAAb,MAAa,0BAA0B,QAAQ,QAK7C,CAAC,CAAC,2BAA2B,CAAC,CAAC;CAC/B,OAAgB,QAAkE,MAAM,OACtF,mBACA,OAAO,IAAI,aAAa;EACtB,MAAM,MAAM,SAAwB,OAAO,oBAAoB,YAC7D,cAAc,KAAK;GAAE,GAAG;GAAS,SAAS;EAAS,CAAC,CACtD;EAEA,MAAM,MAAM,OAAO,GAAG,uBAAuB,CAAC,CAAC,WAAW,OAAoB;GAC5E,MAAM,QAAQ,OAAO,IAAI,MAAM,aAAa,OAAO,YAAY;GAE/D,OAAO,OAAO,IAAI,QAAQ,QAAQ,cAAc,eAAe,cAAc,KAAK;EACpF,CAAC;EAED,OAAO,kBAAkB,GAAG,EAAE,IAAI,CAAC;CACrC,CAAC,CACH;AACF"}
1
+ {"version":3,"file":"Search.mjs","names":[],"sources":["../src/Search.ts"],"sourcesContent":["import { Context, Effect, Layer, Schema } from \"effect\";\n\nimport { BrowserbaseClient } from \"./Client.ts\";\nimport { PlatformError } from \"./Errors.ts\";\nimport { resource } from \"./internal/http/Resource.ts\";\n\nconst Text = Schema.String.check(Schema.isMaxLength(16_384));\n\nexport const SearchQuery = Schema.Struct({\n query: Schema.NonEmptyString.check(Schema.isMaxLength(2048)),\n /** 1–25; the provider defaults to 10. */\n numResults: Schema.optionalKey(Schema.Int.check(Schema.isBetween({ minimum: 1, maximum: 25 }))),\n});\n\nexport type SearchQuery = typeof SearchQuery.Type;\n\nexport class SearchResult extends Schema.Class<SearchResult>(\"BrowserbaseSearchResult\")({\n id: Text,\n url: Text,\n title: Text,\n author: Schema.optionalKey(Text),\n publishedDate: Schema.optionalKey(Text),\n image: Schema.optionalKey(Text),\n favicon: Schema.optionalKey(Text),\n}) {}\n\nexport class SearchResults extends Schema.Class<SearchResults>(\"BrowserbaseSearchResults\")({\n requestId: Text,\n query: Text,\n results: Schema.Array(SearchResult).check(Schema.isMaxLength(25)),\n}) {}\n\n/** Browserbase web search. Each call is billed and is never retried. */\nexport class BrowserbaseSearch extends Context.Service<\n BrowserbaseSearch,\n {\n readonly web: (query: SearchQuery) => Effect.Effect<SearchResults, PlatformError>;\n }\n>()(\"effect-browserbase/Search\") {\n static readonly layer: Layer.Layer<BrowserbaseSearch, never, BrowserbaseClient> = Layer.effect(\n BrowserbaseSearch,\n Effect.gen(function* () {\n const api = resource<PlatformError>(yield* BrowserbaseClient, (failure) =>\n PlatformError.make({ ...failure, service: \"search\" }),\n );\n\n const web = Effect.fn(\"BrowserbaseSearch.web\")(function* (query: SearchQuery) {\n const value = yield* api.input(SearchQuery, query, \"search-web\");\n\n return yield* api.request(\"POST\", \"/v1/search\", SearchResults, \"search-web\", value);\n });\n\n return BrowserbaseSearch.of({ web });\n }),\n );\n}\n"],"mappings":";;;;;AAMA,MAAM,OAAO,OAAO,OAAO,MAAM,OAAO,YAAY,KAAM,CAAC;AAE3D,MAAa,cAAc,OAAO,OAAO;CACvC,OAAO,OAAO,eAAe,MAAM,OAAO,YAAY,IAAI,CAAC;;CAE3D,YAAY,OAAO,YAAY,OAAO,IAAI,MAAM,OAAO,UAAU;EAAE,SAAS;EAAG,SAAS;CAAG,CAAC,CAAC,CAAC;AAChG,CAAC;AAID,IAAa,eAAb,cAAkC,OAAO,MAAoB,yBAAyB,CAAC,CAAC;CACtF,IAAI;CACJ,KAAK;CACL,OAAO;CACP,QAAQ,OAAO,YAAY,IAAI;CAC/B,eAAe,OAAO,YAAY,IAAI;CACtC,OAAO,OAAO,YAAY,IAAI;CAC9B,SAAS,OAAO,YAAY,IAAI;AAClC,CAAC,CAAC,CAAC,CAAC;AAEJ,IAAa,gBAAb,cAAmC,OAAO,MAAqB,0BAA0B,CAAC,CAAC;CACzF,WAAW;CACX,OAAO;CACP,SAAS,OAAO,MAAM,YAAY,CAAC,CAAC,MAAM,OAAO,YAAY,EAAE,CAAC;AAClE,CAAC,CAAC,CAAC,CAAC;;AAGJ,IAAa,oBAAb,MAAa,0BAA0B,QAAQ,QAK7C,CAAC,CAAC,2BAA2B,CAAC,CAAC;CAC/B,OAAgB,QAAkE,MAAM,OACtF,mBACA,OAAO,IAAI,aAAa;EACtB,MAAM,MAAM,SAAwB,OAAO,oBAAoB,YAC7D,cAAc,KAAK;GAAE,GAAG;GAAS,SAAS;EAAS,CAAC,CACtD;EAEA,MAAM,MAAM,OAAO,GAAG,uBAAuB,CAAC,CAAC,WAAW,OAAoB;GAC5E,MAAM,QAAQ,OAAO,IAAI,MAAM,aAAa,OAAO,YAAY;GAE/D,OAAO,OAAO,IAAI,QAAQ,QAAQ,cAAc,eAAe,cAAc,KAAK;EACpF,CAAC;EAED,OAAO,kBAAkB,GAAG,EAAE,IAAI,CAAC;CACrC,CAAC,CACH;AACF"}
@@ -1,8 +1,6 @@
1
- import { o as SessionReference } from "./References-URDAtapt.mjs";
1
+ import { a as SessionReference } from "./References-DOH3Wu44.mjs";
2
2
  import { Schema } from "effect";
3
- declare namespace SessionData_d_exports {
4
- export { ProviderSession, SessionMetadata, SessionStatus, isTerminalSessionStatus };
5
- }
3
+ //#region src/SessionData.d.ts
6
4
  declare const SessionStatus: Schema.Literals<readonly ["PENDING", "RUNNING", "ERROR", "TIMED_OUT", "COMPLETED"]>;
7
5
  type SessionStatus = typeof SessionStatus.Type;
8
6
  declare const isTerminalSessionStatus: (status: SessionStatus) => boolean;
@@ -35,5 +33,6 @@ declare const SessionMetadata_base: Schema.Class<SessionMetadata, Schema.Struct<
35
33
  }>, {}>;
36
34
  declare class SessionMetadata extends SessionMetadata_base {}
37
35
  //#endregion
38
- export { isTerminalSessionStatus as a, SessionStatus as i, SessionData_d_exports as n, SessionMetadata as r, ProviderSession as t };
39
- //# sourceMappingURL=SessionData-DRKcKCqw.d.mts.map
36
+ export { isTerminalSessionStatus as i, SessionMetadata as n, SessionStatus as r, ProviderSession as t };
37
+ export {};
38
+ //# sourceMappingURL=SessionData-5xYZDshJ.d.mts.map
@@ -1,2 +1,3 @@
1
- import { a as isTerminalSessionStatus, i as SessionStatus, r as SessionMetadata, t as ProviderSession } from "./SessionData-DRKcKCqw.mjs";
2
- export { ProviderSession, SessionMetadata, SessionStatus, isTerminalSessionStatus };
1
+ import { i as isTerminalSessionStatus, n as SessionMetadata, r as SessionStatus, t as ProviderSession } from "./SessionData-5xYZDshJ.mjs";
2
+ export { ProviderSession, SessionMetadata, SessionStatus, isTerminalSessionStatus };
3
+ export {};
@@ -1,13 +1,6 @@
1
- import { t as __exportAll } from "./rolldown-runtime-D7D4PA-g.mjs";
2
1
  import { Identifier, SessionReference } from "./References.mjs";
3
2
  import { Schema } from "effect";
4
3
  //#region src/SessionData.ts
5
- var SessionData_exports = /* @__PURE__ */ __exportAll({
6
- ProviderSession: () => ProviderSession,
7
- SessionMetadata: () => SessionMetadata,
8
- SessionStatus: () => SessionStatus,
9
- isTerminalSessionStatus: () => isTerminalSessionStatus
10
- });
11
4
  const SessionStatus = Schema.Literals([
12
5
  "PENDING",
13
6
  "RUNNING",
@@ -50,6 +43,6 @@ var SessionMetadata = class extends Schema.Class("BrowserbaseSessionMetadata")({
50
43
  contextId: Schema.optionalKey(Identifier)
51
44
  }) {};
52
45
  //#endregion
53
- export { ProviderSession, SessionMetadata, SessionStatus, isTerminalSessionStatus, SessionData_exports as t };
46
+ export { ProviderSession, SessionMetadata, SessionStatus, isTerminalSessionStatus };
54
47
 
55
48
  //# sourceMappingURL=SessionData.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"SessionData.mjs","names":[],"sources":["../src/SessionData.ts"],"sourcesContent":["import { Schema } from \"effect\";\n\nimport { Identifier, SessionReference } from \"./References.ts\";\n\nexport const SessionStatus = Schema.Literals([\n \"PENDING\",\n \"RUNNING\",\n \"ERROR\",\n \"TIMED_OUT\",\n \"COMPLETED\",\n]);\n\nexport type SessionStatus = typeof SessionStatus.Type;\n\nexport const isTerminalSessionStatus = (status: SessionStatus): boolean =>\n status === \"COMPLETED\" || status === \"ERROR\" || status === \"TIMED_OUT\";\n\nconst Timestamp = Schema.String.check(Schema.isMaxLength(64));\n\nexport const ProviderSession = Schema.Struct({\n id: Identifier,\n projectId: Identifier,\n status: SessionStatus,\n createdAt: Timestamp,\n updatedAt: Timestamp,\n expiresAt: Timestamp,\n startedAt: Timestamp,\n endedAt: Schema.optionalKey(Timestamp),\n keepAlive: Schema.Boolean,\n proxyBytes: Schema.Finite,\n region: Schema.Literals([\"us-west-2\", \"us-east-1\", \"eu-central-1\", \"ap-southeast-1\"]),\n contextId: Schema.optionalKey(Identifier),\n});\n\nexport class SessionMetadata extends Schema.Class<SessionMetadata>(\"BrowserbaseSessionMetadata\")({\n reference: SessionReference,\n status: SessionStatus,\n createdAt: Timestamp,\n updatedAt: Timestamp,\n expiresAt: Timestamp,\n startedAt: Timestamp,\n endedAt: Schema.optionalKey(Timestamp),\n keepAlive: Schema.Boolean,\n proxyBytes: Schema.Finite,\n region: ProviderSession.fields.region,\n contextId: Schema.optionalKey(Identifier),\n}) {}\n"],"mappings":";;;;;;;;;;AAIA,MAAa,gBAAgB,OAAO,SAAS;CAC3C;CACA;CACA;CACA;CACA;AACF,CAAC;AAID,MAAa,2BAA2B,WACtC,WAAW,eAAe,WAAW,WAAW,WAAW;AAE7D,MAAM,YAAY,OAAO,OAAO,MAAM,OAAO,YAAY,EAAE,CAAC;AAE5D,MAAa,kBAAkB,OAAO,OAAO;CAC3C,IAAI;CACJ,WAAW;CACX,QAAQ;CACR,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,SAAS,OAAO,YAAY,SAAS;CACrC,WAAW,OAAO;CAClB,YAAY,OAAO;CACnB,QAAQ,OAAO,SAAS;EAAC;EAAa;EAAa;EAAgB;CAAgB,CAAC;CACpF,WAAW,OAAO,YAAY,UAAU;AAC1C,CAAC;AAED,IAAa,kBAAb,cAAqC,OAAO,MAAuB,4BAA4B,CAAC,CAAC;CAC/F,WAAW;CACX,QAAQ;CACR,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,SAAS,OAAO,YAAY,SAAS;CACrC,WAAW,OAAO;CAClB,YAAY,OAAO;CACnB,QAAQ,gBAAgB,OAAO;CAC/B,WAAW,OAAO,YAAY,UAAU;AAC1C,CAAC,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"SessionData.mjs","names":[],"sources":["../src/SessionData.ts"],"sourcesContent":["import { Schema } from \"effect\";\n\nimport { Identifier, SessionReference } from \"./References.ts\";\n\nexport const SessionStatus = Schema.Literals([\n \"PENDING\",\n \"RUNNING\",\n \"ERROR\",\n \"TIMED_OUT\",\n \"COMPLETED\",\n]);\n\nexport type SessionStatus = typeof SessionStatus.Type;\n\nexport const isTerminalSessionStatus = (status: SessionStatus): boolean =>\n status === \"COMPLETED\" || status === \"ERROR\" || status === \"TIMED_OUT\";\n\nconst Timestamp = Schema.String.check(Schema.isMaxLength(64));\n\nexport const ProviderSession = Schema.Struct({\n id: Identifier,\n projectId: Identifier,\n status: SessionStatus,\n createdAt: Timestamp,\n updatedAt: Timestamp,\n expiresAt: Timestamp,\n startedAt: Timestamp,\n endedAt: Schema.optionalKey(Timestamp),\n keepAlive: Schema.Boolean,\n proxyBytes: Schema.Finite,\n region: Schema.Literals([\"us-west-2\", \"us-east-1\", \"eu-central-1\", \"ap-southeast-1\"]),\n contextId: Schema.optionalKey(Identifier),\n});\n\nexport class SessionMetadata extends Schema.Class<SessionMetadata>(\"BrowserbaseSessionMetadata\")({\n reference: SessionReference,\n status: SessionStatus,\n createdAt: Timestamp,\n updatedAt: Timestamp,\n expiresAt: Timestamp,\n startedAt: Timestamp,\n endedAt: Schema.optionalKey(Timestamp),\n keepAlive: Schema.Boolean,\n proxyBytes: Schema.Finite,\n region: ProviderSession.fields.region,\n contextId: Schema.optionalKey(Identifier),\n}) {}\n"],"mappings":";;;AAIA,MAAa,gBAAgB,OAAO,SAAS;CAC3C;CACA;CACA;CACA;CACA;AACF,CAAC;AAID,MAAa,2BAA2B,WACtC,WAAW,eAAe,WAAW,WAAW,WAAW;AAE7D,MAAM,YAAY,OAAO,OAAO,MAAM,OAAO,YAAY,EAAE,CAAC;AAE5D,MAAa,kBAAkB,OAAO,OAAO;CAC3C,IAAI;CACJ,WAAW;CACX,QAAQ;CACR,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,SAAS,OAAO,YAAY,SAAS;CACrC,WAAW,OAAO;CAClB,YAAY,OAAO;CACnB,QAAQ,OAAO,SAAS;EAAC;EAAa;EAAa;EAAgB;CAAgB,CAAC;CACpF,WAAW,OAAO,YAAY,UAAU;AAC1C,CAAC;AAED,IAAa,kBAAb,cAAqC,OAAO,MAAuB,4BAA4B,CAAC,CAAC;CAC/F,WAAW;CACX,QAAQ;CACR,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,SAAS,OAAO,YAAY,SAAS;CACrC,WAAW,OAAO;CAClB,YAAY,OAAO;CACnB,QAAQ,gBAAgB,OAAO;CAC/B,WAAW,OAAO,YAAY,UAAU;AAC1C,CAAC,CAAC,CAAC,CAAC"}
@@ -1,9 +1,37 @@
1
- import { t as __exportAll } from "./rolldown-runtime-D7D4PA-g.mjs";
2
1
  import { Identifier, SessionReference } from "./References.mjs";
3
- import { BrowserError, ClientError, SessionError } from "./Errors.mjs";
4
- import { t as BrowserbaseClient } from "./Client-D1_xYM9o.mjs";
2
+ import { ClientError, SessionError } from "./Errors.mjs";
3
+ import { t as BrowserbaseClient } from "./Client-BQteUePT.mjs";
5
4
  import { ProviderSession, SessionMetadata, SessionStatus, isTerminalSessionStatus } from "./SessionData.mjs";
6
5
  import { Clock, Context, Effect, Layer, Redacted, Schema } from "effect";
6
+ import { BrowserError, Reasons } from "effect-browser/errors";
7
+ //#region src/internal/browser/RequestFailure.ts
8
+ /** Only control-plane reads reach this bridge, before a modeled browser action dispatches. */
9
+ const browserRequestFailure = (operation, error) => {
10
+ const reason = () => {
11
+ switch (error.reason) {
12
+ case "configuration": return Reasons.Configuration.make({});
13
+ case "authorization": return Reasons.Authorization.make({});
14
+ case "rate-limited": return Reasons.RateLimited.make(error.retryAfterMillis === void 0 ? {} : { retryAfterMillis: error.retryAfterMillis });
15
+ case "not-found": return Reasons.NotFound.make({});
16
+ case "active": return Reasons.Active.make({});
17
+ case "disabled": return Reasons.Disabled.make({});
18
+ case "expired": return Reasons.Expired.make({});
19
+ case "transport": return Reasons.Transport.make(error.status === void 0 ? {} : { status: error.status });
20
+ case "timeout": return Reasons.Timeout.make({});
21
+ case "malformed": return Reasons.Malformed.make({});
22
+ case "unsafe-url": return Reasons.UnsafeUrl.make({});
23
+ case "content-type": return Reasons.ContentType.make({});
24
+ case "limit":
25
+ case "provider": return Reasons.Provider.make(error.status === void 0 ? {} : { status: error.status });
26
+ }
27
+ };
28
+ return BrowserError.make({
29
+ operation,
30
+ reason: reason(),
31
+ outcome: error.outcome ?? "undispatched"
32
+ });
33
+ };
34
+ //#endregion
7
35
  //#region src/internal/browser/LiveView.ts
8
36
  const LiveUrl = Schema.String.check(Schema.isMaxLength(16384), Schema.makeFilter((value) => {
9
37
  try {
@@ -49,21 +77,9 @@ const issueLiveUrls = Effect.fnUntraced(function* (client, reference, expiresInS
49
77
  requestedTtlSeconds: expiresInSeconds
50
78
  };
51
79
  });
52
- const issueLiveView = (client, reference, expiresInSeconds) => issueLiveUrls(client, reference, expiresInSeconds).pipe(Effect.mapError((error) => BrowserError.make({
53
- operation: "live-view",
54
- reason: error.reason
55
- })));
80
+ const issueLiveView = (client, reference, expiresInSeconds) => issueLiveUrls(client, reference, expiresInSeconds).pipe(Effect.mapError((error) => browserRequestFailure("live-view", error)));
56
81
  //#endregion
57
82
  //#region src/Sessions.ts
58
- var Sessions_exports = /* @__PURE__ */ __exportAll({
59
- BrowserbaseSessions: () => BrowserbaseSessions,
60
- SessionListQuery: () => SessionListQuery,
61
- SessionLogEntry: () => SessionLogEntry,
62
- SessionMetadata: () => SessionMetadata,
63
- SessionStatus: () => SessionStatus,
64
- SessionWaitOptions: () => SessionWaitOptions,
65
- isTerminalSessionStatus: () => isTerminalSessionStatus
66
- });
67
83
  const SessionListQuery = Schema.Struct({
68
84
  status: Schema.optionalKey(SessionStatus),
69
85
  q: Schema.optionalKey(Schema.NonEmptyString.check(Schema.isMaxLength(2048)))
@@ -239,6 +255,6 @@ var BrowserbaseSessions = class BrowserbaseSessions extends Context.Service()("e
239
255
  }));
240
256
  };
241
257
  //#endregion
242
- export { Sessions_exports as a, SessionWaitOptions as i, SessionListQuery as n, issueLiveView as o, SessionLogEntry as r, BrowserbaseSessions as t };
258
+ export { issueLiveView as a, SessionWaitOptions as i, SessionListQuery as n, browserRequestFailure as o, SessionLogEntry as r, BrowserbaseSessions as t };
243
259
 
244
- //# sourceMappingURL=Sessions-CtbseWEh.mjs.map
260
+ //# sourceMappingURL=Sessions-DoQGg9nB.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Sessions-DoQGg9nB.mjs","names":[],"sources":["../src/internal/browser/RequestFailure.ts","../src/internal/browser/LiveView.ts","../src/Sessions.ts"],"sourcesContent":["import { BrowserError, Reasons, type BrowserReason } from \"effect-browser/errors\";\n\nimport type { ClientError } from \"../../Errors.ts\";\n\ntype RequestFailure = Pick<ClientError, \"reason\" | \"outcome\" | \"status\" | \"retryAfterMillis\">;\n\n/** Only control-plane reads reach this bridge, before a modeled browser action dispatches. */\nexport const browserRequestFailure = (\n operation: \"connect\" | \"reconnect\" | \"live-view\",\n error: RequestFailure,\n): BrowserError => {\n const reason = (): BrowserReason => {\n switch (error.reason) {\n case \"configuration\":\n return Reasons.Configuration.make({});\n case \"authorization\":\n return Reasons.Authorization.make({});\n case \"rate-limited\":\n return Reasons.RateLimited.make(\n error.retryAfterMillis === undefined ? {} : { retryAfterMillis: error.retryAfterMillis },\n );\n case \"not-found\":\n return Reasons.NotFound.make({});\n case \"active\":\n return Reasons.Active.make({});\n case \"disabled\":\n return Reasons.Disabled.make({});\n case \"expired\":\n return Reasons.Expired.make({});\n case \"transport\":\n return Reasons.Transport.make(error.status === undefined ? {} : { status: error.status });\n case \"timeout\":\n return Reasons.Timeout.make({});\n case \"malformed\":\n return Reasons.Malformed.make({});\n case \"unsafe-url\":\n return Reasons.UnsafeUrl.make({});\n case \"content-type\":\n return Reasons.ContentType.make({});\n // A control-plane limit carries no measured bound. Do not invent native Limit facts.\n case \"limit\":\n case \"provider\":\n return Reasons.Provider.make(error.status === undefined ? {} : { status: error.status });\n }\n };\n\n return BrowserError.make({\n operation,\n reason: reason(),\n outcome: error.outcome ?? \"undispatched\",\n });\n};\n","import { Effect, Redacted, Schema } from \"effect\";\n\nimport type { BrowserbaseClient } from \"../../Client.ts\";\nimport { ClientError } from \"../../Errors.ts\";\nimport { Identifier, type SessionReference } from \"../../References.ts\";\nimport { browserRequestFailure } from \"./RequestFailure.ts\";\n\nconst LiveUrl = 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 === \"https:\" &&\n !url.username &&\n !url.password &&\n (url.hostname === \"browserbase.com\" || url.hostname.endsWith(\".browserbase.com\"))\n );\n } catch {\n return false;\n }\n }),\n);\n\nconst Live = Schema.Struct({\n debuggerFullscreenUrl: LiveUrl,\n pages: Schema.Array(Schema.Struct({ id: Identifier, debuggerFullscreenUrl: LiveUrl })).check(\n Schema.isMaxLength(64),\n ),\n});\n\nexport interface LiveView {\n readonly session: Redacted.Redacted<string>;\n readonly pages: ReadonlyArray<{\n readonly liveViewPageId: string;\n readonly url: Redacted.Redacted<string>;\n }>;\n readonly requestedTtlSeconds: number;\n}\n\n/**\n * Issuing a debugger URL is an authorization step, not proof that an operator took control.\n * The URL is redacted here so it cannot be logged or returned as an ordinary model value.\n */\nexport const issueLiveUrls = Effect.fnUntraced(function* (\n client: BrowserbaseClient[\"Service\"],\n reference: SessionReference,\n expiresInSeconds: number,\n) {\n if (!Number.isSafeInteger(expiresInSeconds) || expiresInSeconds < 1 || expiresInSeconds > 21600)\n return yield* ClientError.make({\n operation: \"provider-read\",\n reason: \"configuration\",\n outcome: \"undispatched\",\n });\n if (reference.projectId !== client.projectId)\n return yield* ClientError.make({\n operation: \"provider-read\",\n reason: \"authorization\",\n outcome: \"undispatched\",\n });\n\n const raw = yield* client.json(\n \"GET\",\n `/v1/sessions/${encodeURIComponent(reference.sessionId)}/debug?expiresIn=${expiresInSeconds}`,\n );\n\n const value = yield* Schema.decodeUnknownEffect(Live)(raw).pipe(\n Effect.mapError(() => ClientError.make({ operation: \"provider-read\", reason: \"malformed\" })),\n );\n\n return {\n session: Redacted.make(value.debuggerFullscreenUrl),\n pages: value.pages.map((page) => ({\n liveViewPageId: page.id,\n url: Redacted.make(page.debuggerFullscreenUrl),\n })),\n requestedTtlSeconds: expiresInSeconds,\n } satisfies LiveView;\n});\n\nexport const issueLiveView = (\n client: BrowserbaseClient[\"Service\"],\n reference: SessionReference,\n expiresInSeconds: number,\n) =>\n issueLiveUrls(client, reference, expiresInSeconds).pipe(\n Effect.mapError((error) => browserRequestFailure(\"live-view\", error)),\n );\n","import { Clock, Context, Effect, Layer, Schema } from \"effect\";\n\nimport { BrowserbaseClient } from \"./Client.ts\";\nimport type { ClientError } from \"./Errors.ts\";\nimport { SessionError } from \"./Errors.ts\";\nimport { issueLiveUrls, type LiveView } from \"./internal/browser/LiveView.ts\";\nexport type { LiveView } from \"./internal/browser/LiveView.ts\";\nimport { SessionReference } from \"./References.ts\";\nimport {\n ProviderSession,\n SessionMetadata,\n SessionStatus,\n isTerminalSessionStatus,\n} from \"./SessionData.ts\";\nexport { SessionMetadata, SessionStatus, isTerminalSessionStatus } from \"./SessionData.ts\";\n\nexport const SessionListQuery = Schema.Struct({\n status: Schema.optionalKey(SessionStatus),\n q: Schema.optionalKey(Schema.NonEmptyString.check(Schema.isMaxLength(2048))),\n});\n\nexport type SessionListQuery = typeof SessionListQuery.Type;\n\nexport const SessionWaitOptions = Schema.Struct({\n timeoutMillis: Schema.Int.check(Schema.isBetween({ minimum: 1, maximum: 600000 })),\n pollIntervalMillis: Schema.optionalKey(\n Schema.Int.check(Schema.isBetween({ minimum: 25, maximum: 5000 })),\n ),\n});\n\nexport type SessionWaitOptions = typeof SessionWaitOptions.Type;\n\nconst Millis = Schema.Finite;\n\n/**\n * One CDP-level log entry. Protocol payloads are present only when requested: they carry\n * page content, cookies and typed input, so they are host evidence, never model input.\n */\nexport class SessionLogEntry extends Schema.Class<SessionLogEntry>(\"BrowserbaseSessionLogEntry\")({\n method: Schema.String.check(Schema.isMaxLength(256)),\n pageId: Schema.Int,\n frameId: Schema.optionalKey(Schema.String.check(Schema.isMaxLength(256))),\n loaderId: Schema.optionalKey(Schema.String.check(Schema.isMaxLength(256))),\n timestamp: Schema.optionalKey(Millis),\n requestTimestamp: Schema.optionalKey(Millis),\n responseTimestamp: Schema.optionalKey(Millis),\n params: Schema.optionalKey(Schema.Json),\n result: Schema.optionalKey(Schema.Json),\n}) {}\n\nconst ProviderLog = Schema.Struct({\n method: SessionLogEntry.fields.method,\n pageId: Schema.Int,\n sessionId: Schema.String,\n frameId: SessionLogEntry.fields.frameId,\n loaderId: SessionLogEntry.fields.loaderId,\n timestamp: Schema.optionalKey(Millis),\n request: Schema.optionalKey(\n Schema.Struct({\n params: Schema.optionalKey(Schema.Json),\n timestamp: Schema.optionalKey(Millis),\n }),\n ),\n response: Schema.optionalKey(\n Schema.Struct({\n result: Schema.optionalKey(Schema.Json),\n timestamp: Schema.optionalKey(Millis),\n }),\n ),\n});\n\nexport interface SessionLogOptions {\n /** Include CDP `params`/`result` payloads. Off by default; see `SessionLogEntry`. */\n readonly includePayloads?: boolean;\n}\n\nconst now = Clock.monotonicTimeNanos.pipe(Effect.map((value) => Number(value) / 1000000));\n\nconst fromClient = (operation: SessionError[\"operation\"], error: ClientError): SessionError =>\n SessionError.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 malformed = (operation: SessionError[\"operation\"], mutation = false) =>\n SessionError.make({\n operation,\n reason: \"malformed\",\n ...(mutation ? { outcome: \"unknown\" as const } : {}),\n });\n\nconst configuration = (operation: SessionError[\"operation\"]) =>\n SessionError.make({ operation, reason: \"configuration\", outcome: \"undispatched\" });\n\n/** Passive inspection never releases a remote session. Release is a separate explicit mutation. */\nexport class BrowserbaseSessions extends Context.Service<\n BrowserbaseSessions,\n {\n readonly retrieve: (\n reference: SessionReference,\n ) => Effect.Effect<SessionMetadata, SessionError>;\n readonly list: (\n query?: SessionListQuery,\n ) => Effect.Effect<ReadonlyArray<SessionMetadata>, SessionError>;\n readonly requestRelease: (\n reference: SessionReference,\n ) => Effect.Effect<SessionMetadata, SessionError>;\n readonly waitForTerminal: (\n reference: SessionReference,\n options: SessionWaitOptions,\n ) => Effect.Effect<SessionMetadata, SessionError>;\n readonly waitUntilRunning: (\n reference: SessionReference,\n options: SessionWaitOptions,\n ) => Effect.Effect<SessionMetadata, SessionError>;\n /** Session logs, bounded by the 1 MiB control-plane reply limit (`reason: \"limit\"`). */\n readonly logs: (\n reference: SessionReference,\n options?: SessionLogOptions,\n ) => Effect.Effect<ReadonlyArray<SessionLogEntry>, SessionError>;\n /**\n * Redacted Live View URLs for any session in the project, owned or not. Issuing a URL\n * grants view and input access to whoever holds it; it does not pause automation.\n */\n readonly liveUrls: (\n reference: SessionReference,\n expiresInSeconds?: number,\n ) => Effect.Effect<LiveView, SessionError>;\n }\n>()(\"effect-browserbase/Sessions\") {\n static readonly layer: Layer.Layer<BrowserbaseSessions, never, BrowserbaseClient> = Layer.effect(\n BrowserbaseSessions,\n Effect.gen(function* () {\n const client = yield* BrowserbaseClient;\n\n const validate = Effect.fnUntraced(function* (\n reference: SessionReference,\n operation: SessionError[\"operation\"],\n ) {\n const ref = yield* Schema.decodeEffect(SessionReference)(reference, {\n onExcessProperty: \"error\",\n }).pipe(Effect.mapError(() => configuration(operation)));\n\n if (ref.projectId !== client.projectId)\n return yield* SessionError.make({\n operation,\n reason: \"authorization\",\n outcome: \"undispatched\",\n });\n\n return ref;\n });\n\n const decode = Effect.fnUntraced(function* (\n raw: unknown,\n operation: SessionError[\"operation\"],\n expected?: SessionReference,\n mutation = false,\n ) {\n const value = yield* Schema.decodeUnknownEffect(ProviderSession)(raw).pipe(\n Effect.mapError(() => malformed(operation, mutation)),\n );\n\n if (\n value.projectId !== client.projectId ||\n (expected !== undefined &&\n (value.id !== expected.sessionId || value.projectId !== expected.projectId))\n )\n return yield* malformed(operation, mutation);\n const { id, projectId, ...metadata } = value;\n\n return SessionMetadata.make({\n reference: SessionReference.make({ provider: \"browserbase\", projectId, sessionId: id }),\n ...metadata,\n });\n });\n\n const read = Effect.fnUntraced(function* (reference: SessionReference, deadline?: number) {\n const ref = yield* validate(reference, \"session-retrieve\");\n\n const raw = yield* client\n .json(\"GET\", `/v1/sessions/${encodeURIComponent(ref.sessionId)}`, undefined, deadline)\n .pipe(Effect.mapError((error) => fromClient(\"session-retrieve\", error)));\n\n return yield* decode(raw, \"session-retrieve\", ref);\n });\n\n const retrieve = Effect.fn(\"BrowserbaseSessions.retrieve\")(function* (\n reference: SessionReference,\n ) {\n return yield* read(reference);\n });\n\n const list = Effect.fn(\"BrowserbaseSessions.list\")(function* (query: SessionListQuery = {}) {\n const checked = yield* Schema.decodeEffect(SessionListQuery)(query, {\n onExcessProperty: \"error\",\n }).pipe(Effect.mapError(() => configuration(\"session-list\")));\n\n const search = new URLSearchParams();\n\n if (checked.status !== undefined) search.set(\"status\", checked.status);\n if (checked.q !== undefined) search.set(\"q\", checked.q);\n\n const raw = yield* client\n .json(\"GET\", `/v1/sessions${search.size === 0 ? \"\" : `?${search}`}`)\n .pipe(Effect.mapError((error) => fromClient(\"session-list\", error)));\n\n const rows = yield* Schema.decodeUnknownEffect(\n Schema.Array(ProviderSession).check(Schema.isMaxLength(1024)),\n )(raw).pipe(Effect.mapError(() => malformed(\"session-list\")));\n\n if (new Set(rows.map((row) => row.id)).size !== rows.length)\n return yield* malformed(\"session-list\");\n const output: SessionMetadata[] = [];\n\n for (const row of rows) output.push(yield* decode(row, \"session-list\"));\n\n return output;\n });\n\n const requestRelease = Effect.fn(\"BrowserbaseSessions.requestRelease\")(function* (\n reference: SessionReference,\n ) {\n const ref = yield* validate(reference, \"session-release\");\n\n const raw = yield* client\n .json(\"POST\", `/v1/sessions/${encodeURIComponent(ref.sessionId)}`, {\n projectId: ref.projectId,\n status: \"REQUEST_RELEASE\",\n })\n .pipe(Effect.mapError((error) => fromClient(\"session-release\", error)));\n\n return yield* decode(raw, \"session-release\", ref, true);\n });\n\n const wait = Effect.fnUntraced(function* (\n reference: SessionReference,\n options: SessionWaitOptions,\n untilRunning: boolean,\n ) {\n const bounds = yield* Schema.decodeEffect(SessionWaitOptions)(options, {\n onExcessProperty: \"error\",\n }).pipe(Effect.mapError(() => configuration(\"session-wait\")));\n\n const deadline = (yield* now) + bounds.timeoutMillis;\n\n for (;;) {\n const remaining = deadline - (yield* now);\n\n if (remaining <= 0)\n return yield* SessionError.make({ operation: \"session-wait\", reason: \"timeout\" });\n\n // The deadline bounds the provider read too, not just sleeps between reads.\n const metadata = yield* read(reference, deadline).pipe(\n Effect.timeoutOrElse({\n duration: remaining,\n orElse: () =>\n Effect.fail(SessionError.make({ operation: \"session-wait\", reason: \"timeout\" })),\n }),\n );\n\n if (\n untilRunning ? metadata.status === \"RUNNING\" : isTerminalSessionStatus(metadata.status)\n )\n return metadata;\n if (untilRunning && isTerminalSessionStatus(metadata.status))\n return yield* SessionError.make({ operation: \"session-wait\", reason: \"expired\" });\n yield* Effect.sleep(\n Math.max(0, Math.min(bounds.pollIntervalMillis ?? 250, deadline - (yield* now))),\n );\n }\n });\n\n const logs = Effect.fn(\"BrowserbaseSessions.logs\")(function* (\n reference: SessionReference,\n options: SessionLogOptions = {},\n ) {\n const ref = yield* validate(reference, \"session-logs\");\n\n const raw = yield* client\n .json(\"GET\", `/v1/sessions/${encodeURIComponent(ref.sessionId)}/logs`)\n .pipe(Effect.mapError((error) => fromClient(\"session-logs\", error)));\n\n const rows = yield* Schema.decodeUnknownEffect(\n Schema.Array(ProviderLog).check(Schema.isMaxLength(100_000)),\n )(raw).pipe(Effect.mapError(() => malformed(\"session-logs\")));\n\n if (rows.some((row) => row.sessionId !== ref.sessionId))\n return yield* malformed(\"session-logs\");\n\n return rows.map((row) =>\n SessionLogEntry.make({\n method: row.method,\n pageId: row.pageId,\n ...(row.frameId === undefined ? {} : { frameId: row.frameId }),\n ...(row.loaderId === undefined ? {} : { loaderId: row.loaderId }),\n ...(row.timestamp === undefined ? {} : { timestamp: row.timestamp }),\n ...(row.request?.timestamp === undefined\n ? {}\n : { requestTimestamp: row.request.timestamp }),\n ...(row.response?.timestamp === undefined\n ? {}\n : { responseTimestamp: row.response.timestamp }),\n ...(options.includePayloads === true && row.request?.params !== undefined\n ? { params: row.request.params }\n : {}),\n ...(options.includePayloads === true && row.response?.result !== undefined\n ? { result: row.response.result }\n : {}),\n }),\n );\n });\n\n const liveUrls = Effect.fn(\"BrowserbaseSessions.liveUrls\")(function* (\n reference: SessionReference,\n expiresInSeconds = 300,\n ) {\n const ref = yield* validate(reference, \"session-live-view\");\n\n return yield* issueLiveUrls(client, ref, expiresInSeconds).pipe(\n Effect.mapError((error) => fromClient(\"session-live-view\", error)),\n );\n });\n\n return BrowserbaseSessions.of({\n logs,\n liveUrls,\n retrieve,\n list,\n requestRelease,\n waitForTerminal: (ref, options) => wait(ref, options, false),\n waitUntilRunning: (ref, options) => wait(ref, options, true),\n });\n }),\n );\n}\n"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
- import { o as SessionReference } from "./References-URDAtapt.mjs";
1
+ import { a as SessionReference } from "./References-DOH3Wu44.mjs";
2
2
  import { SessionError } from "./Errors.mjs";
3
- import { t as BrowserbaseClient } from "./Client-Ca0zSg1n.mjs";
4
- import { a as isTerminalSessionStatus, i as SessionStatus, r as SessionMetadata } from "./SessionData-DRKcKCqw.mjs";
3
+ import { BrowserbaseClient } from "./Client.mjs";
4
+ import { n as SessionMetadata } from "./SessionData-5xYZDshJ.mjs";
5
5
  import { Context, Effect, Layer, Redacted, Schema } from "effect";
6
6
  //#region src/internal/browser/LiveView.d.ts
7
7
  interface LiveView {
@@ -12,9 +12,8 @@ interface LiveView {
12
12
  }>;
13
13
  readonly requestedTtlSeconds: number;
14
14
  }
15
- declare namespace Sessions_d_exports {
16
- export { BrowserbaseSessions, LiveView, SessionListQuery, SessionLogEntry, SessionLogOptions, SessionMetadata, SessionStatus, SessionWaitOptions, isTerminalSessionStatus };
17
- }
15
+ //#endregion
16
+ //#region src/Sessions.d.ts
18
17
  declare const SessionListQuery: Schema.Struct<{
19
18
  readonly status: Schema.optionalKey<Schema.Literals<readonly ["PENDING", "RUNNING", "ERROR", "TIMED_OUT", "COMPLETED"]>>;
20
19
  readonly q: Schema.optionalKey<Schema.NonEmptyString>;
@@ -64,5 +63,6 @@ declare class BrowserbaseSessions extends BrowserbaseSessions_base {
64
63
  static readonly layer: Layer.Layer<BrowserbaseSessions, never, BrowserbaseClient>;
65
64
  }
66
65
  //#endregion
67
- export { SessionWaitOptions as a, SessionLogOptions as i, SessionListQuery as n, Sessions_d_exports as o, SessionLogEntry as r, LiveView as s, BrowserbaseSessions as t };
68
- //# sourceMappingURL=Sessions-B8E4kMxo.d.mts.map
66
+ export { SessionWaitOptions as a, SessionLogOptions as i, SessionListQuery as n, LiveView as o, SessionLogEntry as r, BrowserbaseSessions as t };
67
+ export {};
68
+ //# sourceMappingURL=Sessions-tFJYaXFq.d.mts.map
@@ -1,3 +1,4 @@
1
- import { a as SessionWaitOptions, i as SessionLogOptions, n as SessionListQuery, r as SessionLogEntry, s as LiveView, t as BrowserbaseSessions } from "./Sessions-B8E4kMxo.mjs";
2
- import { a as isTerminalSessionStatus, i as SessionStatus, r as SessionMetadata } from "./SessionData-DRKcKCqw.mjs";
3
- export { BrowserbaseSessions, type LiveView, SessionListQuery, SessionLogEntry, SessionLogOptions, SessionMetadata, SessionStatus, SessionWaitOptions, isTerminalSessionStatus };
1
+ import { a as SessionWaitOptions, i as SessionLogOptions, n as SessionListQuery, o as LiveView, r as SessionLogEntry, t as BrowserbaseSessions } from "./Sessions-tFJYaXFq.mjs";
2
+ import { i as isTerminalSessionStatus, n as SessionMetadata, r as SessionStatus } from "./SessionData-5xYZDshJ.mjs";
3
+ export { BrowserbaseSessions, type LiveView, SessionListQuery, SessionLogEntry, SessionLogOptions, SessionMetadata, SessionStatus, SessionWaitOptions, isTerminalSessionStatus };
4
+ export {};
package/dist/Sessions.mjs CHANGED
@@ -1,3 +1,3 @@
1
1
  import { SessionMetadata, SessionStatus, isTerminalSessionStatus } from "./SessionData.mjs";
2
- import { i as SessionWaitOptions, n as SessionListQuery, r as SessionLogEntry, t as BrowserbaseSessions } from "./Sessions-CtbseWEh.mjs";
2
+ import { i as SessionWaitOptions, n as SessionListQuery, r as SessionLogEntry, t as BrowserbaseSessions } from "./Sessions-DoQGg9nB.mjs";
3
3
  export { BrowserbaseSessions, SessionListQuery, SessionLogEntry, SessionMetadata, SessionStatus, SessionWaitOptions, isTerminalSessionStatus };