effect-browserbase 0.1.0-beta.104 → 0.2.0-beta.1
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 +106 -307
- package/dist/Account.d.mts +17 -19
- package/dist/Account.mjs +4 -9
- package/dist/Account.mjs.map +1 -1
- package/dist/{Acquisition-WBafHwXH.mjs → Acquisition-CAsTTXp4.mjs} +25 -70
- package/dist/Acquisition-CAsTTXp4.mjs.map +1 -0
- package/dist/Agents-5HpTp9YE.d.mts +155 -0
- package/dist/Agents.d.mts +3 -156
- package/dist/Agents.mjs +4 -20
- 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-DpSajNai.mjs +270 -0
- package/dist/Browser-DpSajNai.mjs.map +1 -0
- package/dist/Browser.d.mts +26 -143
- package/dist/Browser.mjs +3 -223
- package/dist/BrowserBinding.d.mts +7 -34
- package/dist/BrowserBinding.mjs +30 -1
- package/dist/BrowserBinding.mjs.map +1 -0
- package/dist/Certificates-D4NQmyeA.d.mts +34 -0
- package/dist/Certificates.d.mts +3 -35
- 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-4RMKIpL2.mjs} +12 -12
- package/dist/Client-4RMKIpL2.mjs.map +1 -0
- package/dist/{Client-Ca0zSg1n.d.mts → Client-B_f6bBLT.d.mts} +4 -5
- package/dist/Client.d.mts +3 -2
- package/dist/Client.mjs +1 -1
- package/dist/Connection-sxyxtwlk.mjs +56 -0
- package/dist/Connection-sxyxtwlk.mjs.map +1 -0
- package/dist/ContextCoordination.d.mts +5 -6
- package/dist/ContextCoordination.mjs +2 -9
- package/dist/ContextCoordination.mjs.map +1 -1
- package/dist/{ContextWriter-BrQmoXRg.mjs → ContextWriter-oKWFLHuP.mjs} +8 -12
- package/dist/ContextWriter-oKWFLHuP.mjs.map +1 -0
- package/dist/Contexts-DqdL7cyX.d.mts +31 -0
- package/dist/Contexts.d.mts +3 -32
- package/dist/Contexts.mjs +3 -9
- package/dist/Contexts.mjs.map +1 -1
- package/dist/Downloads-CdhiCO5X.d.mts +43 -0
- package/dist/Downloads.d.mts +3 -44
- 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-DBXuVM1f.d.mts +43 -0
- package/dist/{Extensions-ClZbYb1H.mjs → Extensions-Dg3jHOf0.mjs} +3 -9
- package/dist/Extensions-Dg3jHOf0.mjs.map +1 -0
- package/dist/Extensions.d.mts +3 -44
- package/dist/Extensions.mjs +1 -1
- package/dist/Functions-CsKMMUuZ.d.mts +226 -0
- package/dist/Functions.d.mts +3 -227
- package/dist/Functions.mjs +4 -18
- package/dist/Functions.mjs.map +1 -1
- package/dist/{Launch-BHcAEq05.mjs → Launch-cAdE2rrZ.mjs} +16 -12
- package/dist/Launch-cAdE2rrZ.mjs.map +1 -0
- package/dist/Launch.d.mts +127 -2
- package/dist/Launch.mjs +5 -13
- package/dist/Launch.mjs.map +1 -1
- package/dist/PageFetch-CAMqb5m8.d.mts +39 -0
- package/dist/PageFetch.d.mts +3 -40
- package/dist/PageFetch.mjs +2 -8
- package/dist/PageFetch.mjs.map +1 -1
- package/dist/Projects-tm5bTDH0.d.mts +38 -0
- package/dist/Projects.d.mts +3 -39
- package/dist/Projects.mjs +2 -8
- package/dist/Projects.mjs.map +1 -1
- package/dist/Recordings-bVI33sTq.d.mts +27 -0
- package/dist/Recordings.d.mts +3 -28
- 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-Bo-9xeLz.d.mts +27 -0
- package/dist/Replays.d.mts +3 -28
- package/dist/Replays.mjs +3 -5
- package/dist/Replays.mjs.map +1 -1
- package/dist/Search-1g6TUem7.d.mts +37 -0
- package/dist/Search.d.mts +3 -38
- 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-B8E4kMxo.d.mts → Sessions-BpZgjteE.d.mts} +8 -8
- package/dist/{Sessions-CtbseWEh.mjs → Sessions-suOLSym9.mjs} +34 -18
- package/dist/Sessions-suOLSym9.mjs.map +1 -0
- package/dist/Sessions.d.mts +4 -3
- package/dist/Sessions.mjs +1 -1
- package/dist/Testing.d.mts +119 -0
- package/dist/Testing.mjs +206 -0
- package/dist/Testing.mjs.map +1 -0
- 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-C2neBEpj.d.mts +28 -0
- package/dist/Uploads.d.mts +3 -29
- package/dist/Uploads.mjs +3 -5
- package/dist/Uploads.mjs.map +1 -1
- package/dist/Webhooks-BoeRAxzG.d.mts +59 -0
- package/dist/Webhooks.d.mts +3 -60
- package/dist/Webhooks.mjs +2 -11
- package/dist/Webhooks.mjs.map +1 -1
- package/dist/{WriterFacts-osvYAsIx.d.mts → WriterFacts-BBJRDZYY.d.mts} +8 -15
- package/dist/index.d.mts +27 -31
- package/dist/index.mjs +26 -31
- package/package.json +7 -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/Browser.mjs.map +0 -1
- 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-D1_xYM9o.mjs.map +0 -1
- package/dist/ContextWriter-BrQmoXRg.mjs.map +0 -1
- package/dist/Extensions-ClZbYb1H.mjs.map +0 -1
- 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
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { ProjectError } from "./Errors.mjs";
|
|
2
|
+
import { t as BrowserbaseClient } from "./Client-B_f6bBLT.mjs";
|
|
3
|
+
import { Context, Effect, Layer, Schema } from "effect";
|
|
4
|
+
//#region src/Projects.d.ts
|
|
5
|
+
declare const ProjectMetadata_base: Schema.Class<ProjectMetadata, Schema.Struct<{
|
|
6
|
+
readonly projectId: Schema.NonEmptyString;
|
|
7
|
+
readonly name: Schema.String;
|
|
8
|
+
readonly ownerId: Schema.String;
|
|
9
|
+
/** Default provider session lifetime in seconds. */
|
|
10
|
+
readonly defaultTimeout: Schema.Int;
|
|
11
|
+
/** Maximum concurrent sessions. */
|
|
12
|
+
readonly concurrency: Schema.Int;
|
|
13
|
+
readonly createdAt: Schema.String;
|
|
14
|
+
readonly updatedAt: Schema.String;
|
|
15
|
+
}>, {}>;
|
|
16
|
+
declare class ProjectMetadata extends ProjectMetadata_base {}
|
|
17
|
+
declare const ProjectUsage_base: Schema.Class<ProjectUsage, Schema.Struct<{
|
|
18
|
+
readonly projectId: Schema.NonEmptyString;
|
|
19
|
+
readonly browserMinutes: Schema.Natural;
|
|
20
|
+
readonly proxyBytes: Schema.Natural;
|
|
21
|
+
}>, {}>;
|
|
22
|
+
declare class ProjectUsage extends ProjectUsage_base {}
|
|
23
|
+
declare const BrowserbaseProjects_base: Context.ServiceClass<BrowserbaseProjects, "effect-browserbase/Projects", {
|
|
24
|
+
readonly list: Effect.Effect<ReadonlyArray<ProjectMetadata>, ProjectError>;
|
|
25
|
+
readonly retrieve: Effect.Effect<ProjectMetadata, ProjectError>;
|
|
26
|
+
readonly usage: Effect.Effect<ProjectUsage, ProjectError>;
|
|
27
|
+
}>;
|
|
28
|
+
/**
|
|
29
|
+
* Passive project inspection. `retrieve` and `usage` read the Client's own project; `list`
|
|
30
|
+
* reports every project the API key can see. Nothing here changes provider state.
|
|
31
|
+
*/
|
|
32
|
+
declare class BrowserbaseProjects extends BrowserbaseProjects_base {
|
|
33
|
+
static readonly layer: Layer.Layer<BrowserbaseProjects, never, BrowserbaseClient>;
|
|
34
|
+
}
|
|
35
|
+
//#endregion
|
|
36
|
+
export { ProjectMetadata as n, ProjectUsage as r, BrowserbaseProjects as t };
|
|
37
|
+
export {};
|
|
38
|
+
//# sourceMappingURL=Projects-tm5bTDH0.d.mts.map
|
package/dist/Projects.d.mts
CHANGED
|
@@ -1,39 +1,3 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
declare namespace Projects_d_exports {
|
|
5
|
-
export { BrowserbaseProjects, ProjectMetadata, ProjectUsage };
|
|
6
|
-
}
|
|
7
|
-
declare const ProjectMetadata_base: Schema.Class<ProjectMetadata, Schema.Struct<{
|
|
8
|
-
readonly projectId: Schema.NonEmptyString;
|
|
9
|
-
readonly name: Schema.String;
|
|
10
|
-
readonly ownerId: Schema.String;
|
|
11
|
-
/** Default provider session lifetime in seconds. */
|
|
12
|
-
readonly defaultTimeout: Schema.Int;
|
|
13
|
-
/** Maximum concurrent sessions. */
|
|
14
|
-
readonly concurrency: Schema.Int;
|
|
15
|
-
readonly createdAt: Schema.String;
|
|
16
|
-
readonly updatedAt: Schema.String;
|
|
17
|
-
}>, {}>;
|
|
18
|
-
export declare class ProjectMetadata extends ProjectMetadata_base {}
|
|
19
|
-
declare const ProjectUsage_base: Schema.Class<ProjectUsage, Schema.Struct<{
|
|
20
|
-
readonly projectId: Schema.NonEmptyString;
|
|
21
|
-
readonly browserMinutes: Schema.Natural;
|
|
22
|
-
readonly proxyBytes: Schema.Natural;
|
|
23
|
-
}>, {}>;
|
|
24
|
-
export declare class ProjectUsage extends ProjectUsage_base {}
|
|
25
|
-
declare const BrowserbaseProjects_base: Context.ServiceClass<BrowserbaseProjects, "effect-browserbase/Projects", {
|
|
26
|
-
readonly list: Effect.Effect<ReadonlyArray<ProjectMetadata>, ProjectError>;
|
|
27
|
-
readonly retrieve: Effect.Effect<ProjectMetadata, ProjectError>;
|
|
28
|
-
readonly usage: Effect.Effect<ProjectUsage, ProjectError>;
|
|
29
|
-
}>;
|
|
30
|
-
/**
|
|
31
|
-
* Passive project inspection. `retrieve` and `usage` read the Client's own project; `list`
|
|
32
|
-
* reports every project the API key can see. Nothing here changes provider state.
|
|
33
|
-
*/
|
|
34
|
-
export declare class BrowserbaseProjects extends BrowserbaseProjects_base {
|
|
35
|
-
static readonly layer: Layer.Layer<BrowserbaseProjects, never, BrowserbaseClient>;
|
|
36
|
-
}
|
|
37
|
-
//#endregion
|
|
38
|
-
export { Projects_d_exports as t };
|
|
39
|
-
//# sourceMappingURL=Projects.d.mts.map
|
|
1
|
+
import { n as ProjectMetadata, r as ProjectUsage, t as BrowserbaseProjects } from "./Projects-tm5bTDH0.mjs";
|
|
2
|
+
export { BrowserbaseProjects, ProjectMetadata, ProjectUsage };
|
|
3
|
+
export {};
|
package/dist/Projects.mjs
CHANGED
|
@@ -1,15 +1,9 @@
|
|
|
1
|
-
import { t as __exportAll } from "./rolldown-runtime-D7D4PA-g.mjs";
|
|
2
1
|
import { Identifier } from "./References.mjs";
|
|
3
2
|
import { ProjectError } from "./Errors.mjs";
|
|
4
|
-
import { t as BrowserbaseClient } from "./Client-
|
|
3
|
+
import { t as BrowserbaseClient } from "./Client-4RMKIpL2.mjs";
|
|
5
4
|
import { t as resource } from "./Resource-DBksC4zB.mjs";
|
|
6
5
|
import { Context, Effect, Layer, Schema } from "effect";
|
|
7
6
|
//#region src/Projects.ts
|
|
8
|
-
var Projects_exports = /* @__PURE__ */ __exportAll({
|
|
9
|
-
BrowserbaseProjects: () => BrowserbaseProjects,
|
|
10
|
-
ProjectMetadata: () => ProjectMetadata,
|
|
11
|
-
ProjectUsage: () => ProjectUsage
|
|
12
|
-
});
|
|
13
7
|
const Timestamp = Schema.String.check(Schema.isMaxLength(64));
|
|
14
8
|
var ProjectMetadata = class extends Schema.Class("BrowserbaseProjectMetadata")({
|
|
15
9
|
projectId: Identifier,
|
|
@@ -66,6 +60,6 @@ var BrowserbaseProjects = class BrowserbaseProjects extends Context.Service()("e
|
|
|
66
60
|
}));
|
|
67
61
|
};
|
|
68
62
|
//#endregion
|
|
69
|
-
export { BrowserbaseProjects, ProjectMetadata, ProjectUsage
|
|
63
|
+
export { BrowserbaseProjects, ProjectMetadata, ProjectUsage };
|
|
70
64
|
|
|
71
65
|
//# sourceMappingURL=Projects.mjs.map
|
package/dist/Projects.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Projects.mjs","names":[],"sources":["../src/Projects.ts"],"sourcesContent":["import { Context, Effect, Layer, Schema } from \"effect\";\n\nimport { BrowserbaseClient } from \"./Client.ts\";\nimport { ProjectError } from \"./Errors.ts\";\nimport { resource } from \"./internal/http/Resource.ts\";\nimport { Identifier } from \"./References.ts\";\n\nconst Timestamp = Schema.String.check(Schema.isMaxLength(64));\n\nexport class ProjectMetadata extends Schema.Class<ProjectMetadata>(\"BrowserbaseProjectMetadata\")({\n projectId: Identifier,\n name: Schema.String.check(Schema.isMaxLength(1024)),\n ownerId: Schema.String.check(Schema.isMaxLength(256)),\n /** Default provider session lifetime in seconds. */\n defaultTimeout: Schema.Int,\n /** Maximum concurrent sessions. */\n concurrency: Schema.Int,\n createdAt: Timestamp,\n updatedAt: Timestamp,\n}) {}\n\nexport class ProjectUsage extends Schema.Class<ProjectUsage>(\"BrowserbaseProjectUsage\")({\n projectId: Identifier,\n browserMinutes: Schema.Natural,\n proxyBytes: Schema.Natural,\n}) {}\n\nconst ProviderProject = Schema.Struct({\n id: Identifier,\n name: ProjectMetadata.fields.name,\n ownerId: ProjectMetadata.fields.ownerId,\n defaultTimeout: Schema.Int,\n concurrency: Schema.Int,\n createdAt: Timestamp,\n updatedAt: Timestamp,\n});\n\nconst project = ({ id, ...rest }: typeof ProviderProject.Type) =>\n ProjectMetadata.make({ projectId: id, ...rest });\n\n/**\n * Passive project inspection. `retrieve` and `usage` read the Client's own project; `list`\n * reports every project the API key can see. Nothing here changes provider state.\n */\nexport class BrowserbaseProjects extends Context.Service<\n BrowserbaseProjects,\n {\n readonly list: Effect.Effect<ReadonlyArray<ProjectMetadata>, ProjectError>;\n readonly retrieve: Effect.Effect<ProjectMetadata, ProjectError>;\n readonly usage: Effect.Effect<ProjectUsage, ProjectError>;\n }\n>()(\"effect-browserbase/Projects\") {\n static readonly layer: Layer.Layer<BrowserbaseProjects, never, BrowserbaseClient> = Layer.effect(\n BrowserbaseProjects,\n Effect.gen(function* () {\n const client = yield* BrowserbaseClient;\n const api = resource<ProjectError>(client, (failure) => ProjectError.make(failure));\n const own = `/v1/projects/${api.segment(client.projectId)}`;\n\n const list = api\n .request(\n \"GET\",\n \"/v1/projects\",\n Schema.Array(ProviderProject).check(Schema.isMaxLength(1024)),\n \"project-list\",\n )\n .pipe(\n Effect.map((rows) => rows.map(project)),\n Effect.withSpan(\"BrowserbaseProjects.list\"),\n );\n\n const retrieve = api.request(\"GET\", own, ProviderProject, \"project-retrieve\").pipe(\n Effect.flatMap((value) =>\n value.id === client.projectId\n ? Effect.succeed(project(value))\n : Effect.fail(api.malformed(\"project-retrieve\", false)),\n ),\n Effect.withSpan(\"BrowserbaseProjects.retrieve\"),\n );\n\n const usage = api\n .request(\n \"GET\",\n `${own}/usage`,\n Schema.Struct({ browserMinutes: Schema.Natural, proxyBytes: Schema.Natural }),\n \"project-usage\",\n )\n .pipe(\n Effect.map((value) => ProjectUsage.make({ projectId: client.projectId, ...value })),\n Effect.withSpan(\"BrowserbaseProjects.usage\"),\n );\n\n return BrowserbaseProjects.of({ list, retrieve, usage });\n }),\n );\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"Projects.mjs","names":[],"sources":["../src/Projects.ts"],"sourcesContent":["import { Context, Effect, Layer, Schema } from \"effect\";\n\nimport { BrowserbaseClient } from \"./Client.ts\";\nimport { ProjectError } from \"./Errors.ts\";\nimport { resource } from \"./internal/http/Resource.ts\";\nimport { Identifier } from \"./References.ts\";\n\nconst Timestamp = Schema.String.check(Schema.isMaxLength(64));\n\nexport class ProjectMetadata extends Schema.Class<ProjectMetadata>(\"BrowserbaseProjectMetadata\")({\n projectId: Identifier,\n name: Schema.String.check(Schema.isMaxLength(1024)),\n ownerId: Schema.String.check(Schema.isMaxLength(256)),\n /** Default provider session lifetime in seconds. */\n defaultTimeout: Schema.Int,\n /** Maximum concurrent sessions. */\n concurrency: Schema.Int,\n createdAt: Timestamp,\n updatedAt: Timestamp,\n}) {}\n\nexport class ProjectUsage extends Schema.Class<ProjectUsage>(\"BrowserbaseProjectUsage\")({\n projectId: Identifier,\n browserMinutes: Schema.Natural,\n proxyBytes: Schema.Natural,\n}) {}\n\nconst ProviderProject = Schema.Struct({\n id: Identifier,\n name: ProjectMetadata.fields.name,\n ownerId: ProjectMetadata.fields.ownerId,\n defaultTimeout: Schema.Int,\n concurrency: Schema.Int,\n createdAt: Timestamp,\n updatedAt: Timestamp,\n});\n\nconst project = ({ id, ...rest }: typeof ProviderProject.Type) =>\n ProjectMetadata.make({ projectId: id, ...rest });\n\n/**\n * Passive project inspection. `retrieve` and `usage` read the Client's own project; `list`\n * reports every project the API key can see. Nothing here changes provider state.\n */\nexport class BrowserbaseProjects extends Context.Service<\n BrowserbaseProjects,\n {\n readonly list: Effect.Effect<ReadonlyArray<ProjectMetadata>, ProjectError>;\n readonly retrieve: Effect.Effect<ProjectMetadata, ProjectError>;\n readonly usage: Effect.Effect<ProjectUsage, ProjectError>;\n }\n>()(\"effect-browserbase/Projects\") {\n static readonly layer: Layer.Layer<BrowserbaseProjects, never, BrowserbaseClient> = Layer.effect(\n BrowserbaseProjects,\n Effect.gen(function* () {\n const client = yield* BrowserbaseClient;\n const api = resource<ProjectError>(client, (failure) => ProjectError.make(failure));\n const own = `/v1/projects/${api.segment(client.projectId)}`;\n\n const list = api\n .request(\n \"GET\",\n \"/v1/projects\",\n Schema.Array(ProviderProject).check(Schema.isMaxLength(1024)),\n \"project-list\",\n )\n .pipe(\n Effect.map((rows) => rows.map(project)),\n Effect.withSpan(\"BrowserbaseProjects.list\"),\n );\n\n const retrieve = api.request(\"GET\", own, ProviderProject, \"project-retrieve\").pipe(\n Effect.flatMap((value) =>\n value.id === client.projectId\n ? Effect.succeed(project(value))\n : Effect.fail(api.malformed(\"project-retrieve\", false)),\n ),\n Effect.withSpan(\"BrowserbaseProjects.retrieve\"),\n );\n\n const usage = api\n .request(\n \"GET\",\n `${own}/usage`,\n Schema.Struct({ browserMinutes: Schema.Natural, proxyBytes: Schema.Natural }),\n \"project-usage\",\n )\n .pipe(\n Effect.map((value) => ProjectUsage.make({ projectId: client.projectId, ...value })),\n Effect.withSpan(\"BrowserbaseProjects.usage\"),\n );\n\n return BrowserbaseProjects.of({ list, retrieve, usage });\n }),\n );\n}\n"],"mappings":";;;;;;AAOA,MAAM,YAAY,OAAO,OAAO,MAAM,OAAO,YAAY,EAAE,CAAC;AAE5D,IAAa,kBAAb,cAAqC,OAAO,MAAuB,4BAA4B,CAAC,CAAC;CAC/F,WAAW;CACX,MAAM,OAAO,OAAO,MAAM,OAAO,YAAY,IAAI,CAAC;CAClD,SAAS,OAAO,OAAO,MAAM,OAAO,YAAY,GAAG,CAAC;;CAEpD,gBAAgB,OAAO;;CAEvB,aAAa,OAAO;CACpB,WAAW;CACX,WAAW;AACb,CAAC,CAAC,CAAC,CAAC;AAEJ,IAAa,eAAb,cAAkC,OAAO,MAAoB,yBAAyB,CAAC,CAAC;CACtF,WAAW;CACX,gBAAgB,OAAO;CACvB,YAAY,OAAO;AACrB,CAAC,CAAC,CAAC,CAAC;AAEJ,MAAM,kBAAkB,OAAO,OAAO;CACpC,IAAI;CACJ,MAAM,gBAAgB,OAAO;CAC7B,SAAS,gBAAgB,OAAO;CAChC,gBAAgB,OAAO;CACvB,aAAa,OAAO;CACpB,WAAW;CACX,WAAW;AACb,CAAC;AAED,MAAM,WAAW,EAAE,IAAI,GAAG,WACxB,gBAAgB,KAAK;CAAE,WAAW;CAAI,GAAG;AAAK,CAAC;;;;;AAMjD,IAAa,sBAAb,MAAa,4BAA4B,QAAQ,QAO/C,CAAC,CAAC,6BAA6B,CAAC,CAAC;CACjC,OAAgB,QAAoE,MAAM,OACxF,qBACA,OAAO,IAAI,aAAa;EACtB,MAAM,SAAS,OAAO;EACtB,MAAM,MAAM,SAAuB,SAAS,YAAY,aAAa,KAAK,OAAO,CAAC;EAClF,MAAM,MAAM,gBAAgB,IAAI,QAAQ,OAAO,SAAS;EAExD,MAAM,OAAO,IACV,QACC,OACA,gBACA,OAAO,MAAM,eAAe,CAAC,CAAC,MAAM,OAAO,YAAY,IAAI,CAAC,GAC5D,cACF,CAAC,CACA,KACC,OAAO,KAAK,SAAS,KAAK,IAAI,OAAO,CAAC,GACtC,OAAO,SAAS,0BAA0B,CAC5C;EAEF,MAAM,WAAW,IAAI,QAAQ,OAAO,KAAK,iBAAiB,kBAAkB,CAAC,CAAC,KAC5E,OAAO,SAAS,UACd,MAAM,OAAO,OAAO,YAChB,OAAO,QAAQ,QAAQ,KAAK,CAAC,IAC7B,OAAO,KAAK,IAAI,UAAU,oBAAoB,KAAK,CAAC,CAC1D,GACA,OAAO,SAAS,8BAA8B,CAChD;EAEA,MAAM,QAAQ,IACX,QACC,OACA,GAAG,IAAI,SACP,OAAO,OAAO;GAAE,gBAAgB,OAAO;GAAS,YAAY,OAAO;EAAQ,CAAC,GAC5E,eACF,CAAC,CACA,KACC,OAAO,KAAK,UAAU,aAAa,KAAK;GAAE,WAAW,OAAO;GAAW,GAAG;EAAM,CAAC,CAAC,GAClF,OAAO,SAAS,2BAA2B,CAC7C;EAEF,OAAO,oBAAoB,GAAG;GAAE;GAAM;GAAU;EAAM,CAAC;CACzD,CAAC,CACH;AACF"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { a as SessionReference } from "./References-DOH3Wu44.mjs";
|
|
2
|
+
import { ArtifactError } from "./Errors.mjs";
|
|
3
|
+
import { t as BrowserbaseClient } from "./Client-B_f6bBLT.mjs";
|
|
4
|
+
import { t as BrowserbaseSessions } from "./Sessions-BpZgjteE.mjs";
|
|
5
|
+
import { c as RecordingPageReference, o as RecordingBatch, t as ArtifactTransferPolicy } from "./Transfers-GVqzrDWl.mjs";
|
|
6
|
+
import { Context, Effect, Layer, Stream } from "effect";
|
|
7
|
+
//#region src/Recordings.d.ts
|
|
8
|
+
interface PollOptions {
|
|
9
|
+
readonly timeoutMillis?: number;
|
|
10
|
+
readonly intervalMillis?: number;
|
|
11
|
+
}
|
|
12
|
+
/** Recording transfers share the canonical artifact bounds. */
|
|
13
|
+
type DownloadLimits = ArtifactTransferPolicy;
|
|
14
|
+
declare const BrowserbaseRecordings_base: Context.ServiceClass<BrowserbaseRecordings, "effect-browserbase/Recordings", {
|
|
15
|
+
readonly request: (reference: SessionReference, mode?: "initial" | "retry-failed") => Effect.Effect<RecordingBatch, ArtifactError>;
|
|
16
|
+
readonly status: (reference: SessionReference) => Effect.Effect<RecordingBatch, ArtifactError>;
|
|
17
|
+
readonly wait: (reference: SessionReference, options?: PollOptions) => Effect.Effect<RecordingBatch, ArtifactError>;
|
|
18
|
+
readonly download: (reference: RecordingPageReference, limits: DownloadLimits) => Stream.Stream<Uint8Array, ArtifactError>;
|
|
19
|
+
}>;
|
|
20
|
+
/** Independent of a live browser. Merely building this Layer performs no provider calls. */
|
|
21
|
+
declare class BrowserbaseRecordings extends BrowserbaseRecordings_base {
|
|
22
|
+
static readonly layer: Layer.Layer<BrowserbaseRecordings, never, BrowserbaseClient | BrowserbaseSessions>;
|
|
23
|
+
}
|
|
24
|
+
//#endregion
|
|
25
|
+
export { DownloadLimits as n, PollOptions as r, BrowserbaseRecordings as t };
|
|
26
|
+
export {};
|
|
27
|
+
//# sourceMappingURL=Recordings-bVI33sTq.d.mts.map
|
package/dist/Recordings.d.mts
CHANGED
|
@@ -1,28 +1,3 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
import { t as BrowserbaseSessions } from "./Sessions-B8E4kMxo.mjs";
|
|
5
|
-
import { a as RecordingBatch, s as RecordingPageReference, t as ArtifactTransferPolicy } from "./Transfers-Czv5IZzJ.mjs";
|
|
6
|
-
import { Context, Effect, Layer, Stream } from "effect";
|
|
7
|
-
declare namespace Recordings_d_exports {
|
|
8
|
-
export { BrowserbaseRecordings, DownloadLimits, PollOptions };
|
|
9
|
-
}
|
|
10
|
-
export interface PollOptions {
|
|
11
|
-
readonly timeoutMillis?: number;
|
|
12
|
-
readonly intervalMillis?: number;
|
|
13
|
-
}
|
|
14
|
-
/** Recording transfers share the canonical artifact bounds. */
|
|
15
|
-
export type DownloadLimits = ArtifactTransferPolicy;
|
|
16
|
-
declare const BrowserbaseRecordings_base: Context.ServiceClass<BrowserbaseRecordings, "effect-browserbase/Recordings", {
|
|
17
|
-
readonly request: (reference: SessionReference, mode?: "initial" | "retry-failed") => Effect.Effect<RecordingBatch, ArtifactError>;
|
|
18
|
-
readonly status: (reference: SessionReference) => Effect.Effect<RecordingBatch, ArtifactError>;
|
|
19
|
-
readonly wait: (reference: SessionReference, options?: PollOptions) => Effect.Effect<RecordingBatch, ArtifactError>;
|
|
20
|
-
readonly download: (reference: RecordingPageReference, limits: DownloadLimits) => Stream.Stream<Uint8Array, ArtifactError>;
|
|
21
|
-
}>;
|
|
22
|
-
/** Independent of a live browser. Merely building this Layer performs no provider calls. */
|
|
23
|
-
export declare class BrowserbaseRecordings extends BrowserbaseRecordings_base {
|
|
24
|
-
static readonly layer: Layer.Layer<BrowserbaseRecordings, never, BrowserbaseClient | BrowserbaseSessions>;
|
|
25
|
-
}
|
|
26
|
-
//#endregion
|
|
27
|
-
export { Recordings_d_exports as t };
|
|
28
|
-
//# sourceMappingURL=Recordings.d.mts.map
|
|
1
|
+
import { n as DownloadLimits, r as PollOptions, t as BrowserbaseRecordings } from "./Recordings-bVI33sTq.mjs";
|
|
2
|
+
export { BrowserbaseRecordings, DownloadLimits, PollOptions };
|
|
3
|
+
export {};
|
package/dist/Recordings.mjs
CHANGED
|
@@ -1,15 +1,13 @@
|
|
|
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 { RecordingBatch, RecordingPage, RecordingPageReference } from "./Transfers.mjs";
|
|
5
|
-
import { t as BrowserbaseClient } from "./Client-
|
|
4
|
+
import { t as BrowserbaseClient } from "./Client-4RMKIpL2.mjs";
|
|
6
5
|
import { n as transferPolicy } 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-suOLSym9.mjs";
|
|
9
8
|
import { t as requireTerminalSession } from "./Authorization-Ll5f_XNM.mjs";
|
|
10
9
|
import { Context, Effect, Layer, Redacted, Schema, Semaphore, Stream } from "effect";
|
|
11
10
|
//#region src/Recordings.ts
|
|
12
|
-
var Recordings_exports = /* @__PURE__ */ __exportAll({ BrowserbaseRecordings: () => BrowserbaseRecordings });
|
|
13
11
|
const RawPage = Schema.Struct({
|
|
14
12
|
pageId: Identifier,
|
|
15
13
|
status: Schema.Literals([
|
|
@@ -126,6 +124,6 @@ var BrowserbaseRecordings = class BrowserbaseRecordings extends Context.Service(
|
|
|
126
124
|
}));
|
|
127
125
|
};
|
|
128
126
|
//#endregion
|
|
129
|
-
export { BrowserbaseRecordings
|
|
127
|
+
export { BrowserbaseRecordings };
|
|
130
128
|
|
|
131
129
|
//# sourceMappingURL=Recordings.mjs.map
|
package/dist/Recordings.mjs.map
CHANGED
|
@@ -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
|
-
|
|
3
|
-
|
|
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 {
|
|
35
|
-
|
|
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
|
package/dist/References.d.mts
CHANGED
|
@@ -1,2 +1,3 @@
|
|
|
1
|
-
import {
|
|
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 {};
|
package/dist/References.mjs
CHANGED
|
@@ -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
|
|
31
|
+
export { AllocationAttempt, ContextReference, ExtensionReference, Identifier, SessionReference };
|
|
40
32
|
|
|
41
33
|
//# sourceMappingURL=References.mjs.map
|
package/dist/References.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"References.mjs","names":[],"sources":["../src/References.ts"],"sourcesContent":["import { Schema } from \"effect\";\n\nexport
|
|
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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { a as SessionReference } from "./References-DOH3Wu44.mjs";
|
|
2
|
+
import { ArtifactError } from "./Errors.mjs";
|
|
3
|
+
import { t as BrowserbaseClient } from "./Client-B_f6bBLT.mjs";
|
|
4
|
+
import { t as BrowserbaseSessions } from "./Sessions-BpZgjteE.mjs";
|
|
5
|
+
import { c as RecordingPageReference, t as ArtifactTransferPolicy, u as ReplayPage } from "./Transfers-GVqzrDWl.mjs";
|
|
6
|
+
import { Context, Effect, Layer, Redacted, Stream } from "effect";
|
|
7
|
+
//#region src/Replays.d.ts
|
|
8
|
+
interface ReplayAccess {
|
|
9
|
+
readonly reference: RecordingPageReference;
|
|
10
|
+
/** Temporary playback material for an authorized host route; never includes the API key. */
|
|
11
|
+
readonly playlist: Redacted.Redacted<string>;
|
|
12
|
+
readonly fetchedAtMillis: number;
|
|
13
|
+
readonly mediaCount: number;
|
|
14
|
+
/** Optional host proxy of an indexed URI from this exact playlist; no arbitrary URL parameter. */
|
|
15
|
+
readonly media: (index: number, limits: ArtifactTransferPolicy) => Stream.Stream<Uint8Array, ArtifactError>;
|
|
16
|
+
}
|
|
17
|
+
declare const BrowserbaseReplays_base: Context.ServiceClass<BrowserbaseReplays, "effect-browserbase/Replays", {
|
|
18
|
+
readonly metadata: (reference: SessionReference) => Effect.Effect<ReadonlyArray<ReplayPage>, ArtifactError>;
|
|
19
|
+
readonly openPage: (reference: RecordingPageReference) => Effect.Effect<ReplayAccess, ArtifactError>;
|
|
20
|
+
}>;
|
|
21
|
+
declare class BrowserbaseReplays extends BrowserbaseReplays_base {
|
|
22
|
+
static readonly layer: Layer.Layer<BrowserbaseReplays, never, BrowserbaseClient | BrowserbaseSessions>;
|
|
23
|
+
}
|
|
24
|
+
//#endregion
|
|
25
|
+
export { ReplayAccess as n, BrowserbaseReplays as t };
|
|
26
|
+
export {};
|
|
27
|
+
//# sourceMappingURL=Replays-Bo-9xeLz.d.mts.map
|
package/dist/Replays.d.mts
CHANGED
|
@@ -1,28 +1,3 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
import { t as BrowserbaseSessions } from "./Sessions-B8E4kMxo.mjs";
|
|
5
|
-
import { l as ReplayPage, s as RecordingPageReference, t as ArtifactTransferPolicy } from "./Transfers-Czv5IZzJ.mjs";
|
|
6
|
-
import { Context, Effect, Layer, Redacted, Stream } from "effect";
|
|
7
|
-
declare namespace Replays_d_exports {
|
|
8
|
-
export { BrowserbaseReplays, ReplayAccess };
|
|
9
|
-
}
|
|
10
|
-
export interface ReplayAccess {
|
|
11
|
-
readonly reference: RecordingPageReference;
|
|
12
|
-
/** Temporary playback material for an authorized host route; never includes the API key. */
|
|
13
|
-
readonly playlist: Redacted.Redacted<string>;
|
|
14
|
-
readonly fetchedAtMillis: number;
|
|
15
|
-
readonly mediaCount: number;
|
|
16
|
-
/** Optional host proxy of an indexed URI from this exact playlist; no arbitrary URL parameter. */
|
|
17
|
-
readonly media: (index: number, limits: ArtifactTransferPolicy) => Stream.Stream<Uint8Array, ArtifactError>;
|
|
18
|
-
}
|
|
19
|
-
declare const BrowserbaseReplays_base: Context.ServiceClass<BrowserbaseReplays, "effect-browserbase/Replays", {
|
|
20
|
-
readonly metadata: (reference: SessionReference) => Effect.Effect<ReadonlyArray<ReplayPage>, ArtifactError>;
|
|
21
|
-
readonly openPage: (reference: RecordingPageReference) => Effect.Effect<ReplayAccess, ArtifactError>;
|
|
22
|
-
}>;
|
|
23
|
-
export declare class BrowserbaseReplays extends BrowserbaseReplays_base {
|
|
24
|
-
static readonly layer: Layer.Layer<BrowserbaseReplays, never, BrowserbaseClient | BrowserbaseSessions>;
|
|
25
|
-
}
|
|
26
|
-
//#endregion
|
|
27
|
-
export { Replays_d_exports as t };
|
|
28
|
-
//# sourceMappingURL=Replays.d.mts.map
|
|
1
|
+
import { n as ReplayAccess, t as BrowserbaseReplays } from "./Replays-Bo-9xeLz.mjs";
|
|
2
|
+
export { BrowserbaseReplays, ReplayAccess };
|
|
3
|
+
export {};
|
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-
|
|
4
|
+
import { t as BrowserbaseClient } from "./Client-4RMKIpL2.mjs";
|
|
6
5
|
import { n as transferPolicy } from "./TransferPolicy-DQ06i7SZ.mjs";
|
|
7
|
-
import { t as BrowserbaseSessions } from "./Sessions-
|
|
6
|
+
import { t as BrowserbaseSessions } from "./Sessions-suOLSym9.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
|
|
105
|
+
export { BrowserbaseReplays };
|
|
108
106
|
|
|
109
107
|
//# sourceMappingURL=Replays.mjs.map
|
package/dist/Replays.mjs.map
CHANGED
|
@@ -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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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { PlatformError } from "./Errors.mjs";
|
|
2
|
+
import { t as BrowserbaseClient } from "./Client-B_f6bBLT.mjs";
|
|
3
|
+
import { Context, Effect, Layer, Schema } from "effect";
|
|
4
|
+
//#region src/Search.d.ts
|
|
5
|
+
declare const SearchQuery: Schema.Struct<{
|
|
6
|
+
readonly query: Schema.NonEmptyString;
|
|
7
|
+
/** 1–25; the provider defaults to 10. */
|
|
8
|
+
readonly numResults: Schema.optionalKey<Schema.Int>;
|
|
9
|
+
}>;
|
|
10
|
+
type SearchQuery = typeof SearchQuery.Type;
|
|
11
|
+
declare const SearchResult_base: Schema.Class<SearchResult, Schema.Struct<{
|
|
12
|
+
readonly id: Schema.String;
|
|
13
|
+
readonly url: Schema.String;
|
|
14
|
+
readonly title: Schema.String;
|
|
15
|
+
readonly author: Schema.optionalKey<Schema.String>;
|
|
16
|
+
readonly publishedDate: Schema.optionalKey<Schema.String>;
|
|
17
|
+
readonly image: Schema.optionalKey<Schema.String>;
|
|
18
|
+
readonly favicon: Schema.optionalKey<Schema.String>;
|
|
19
|
+
}>, {}>;
|
|
20
|
+
declare class SearchResult extends SearchResult_base {}
|
|
21
|
+
declare const SearchResults_base: Schema.Class<SearchResults, Schema.Struct<{
|
|
22
|
+
readonly requestId: Schema.String;
|
|
23
|
+
readonly query: Schema.String;
|
|
24
|
+
readonly results: Schema.$Array<typeof SearchResult>;
|
|
25
|
+
}>, {}>;
|
|
26
|
+
declare class SearchResults extends SearchResults_base {}
|
|
27
|
+
declare const BrowserbaseSearch_base: Context.ServiceClass<BrowserbaseSearch, "effect-browserbase/Search", {
|
|
28
|
+
readonly web: (query: SearchQuery) => Effect.Effect<SearchResults, PlatformError>;
|
|
29
|
+
}>;
|
|
30
|
+
/** Browserbase web search. Each call is billed and is never retried. */
|
|
31
|
+
declare class BrowserbaseSearch extends BrowserbaseSearch_base {
|
|
32
|
+
static readonly layer: Layer.Layer<BrowserbaseSearch, never, BrowserbaseClient>;
|
|
33
|
+
}
|
|
34
|
+
//#endregion
|
|
35
|
+
export { SearchResults as i, SearchQuery as n, SearchResult as r, BrowserbaseSearch as t };
|
|
36
|
+
export {};
|
|
37
|
+
//# sourceMappingURL=Search-1g6TUem7.d.mts.map
|