effect-browserbase 0.1.0-beta.102 → 0.2.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +61 -231
- package/dist/Account.d.mts +4 -6
- package/dist/Account.mjs +4 -9
- package/dist/Account.mjs.map +1 -1
- package/dist/{Acquisition-WBafHwXH.mjs → Acquisition-D8o4jtCg.mjs} +22 -68
- package/dist/Acquisition-D8o4jtCg.mjs.map +1 -0
- package/dist/Agents.d.mts +4 -6
- package/dist/Agents.mjs +3 -19
- package/dist/Agents.mjs.map +1 -1
- package/dist/Allocation.d.mts +9 -11
- package/dist/Allocation.mjs +2 -4
- package/dist/Allocation.mjs.map +1 -1
- package/dist/Browser.d.mts +25 -140
- package/dist/Browser.mjs +266 -1
- package/dist/Browser.mjs.map +1 -0
- package/dist/BrowserBinding.d.mts +7 -34
- package/dist/BrowserBinding.mjs +30 -1
- package/dist/BrowserBinding.mjs.map +1 -0
- package/dist/Certificates.d.mts +3 -5
- package/dist/Certificates.mjs +2 -7
- package/dist/Certificates.mjs.map +1 -1
- package/dist/{Cleanup-G2YpTCuU.d.mts → Cleanup-DMTDBir8.d.mts} +5 -6
- package/dist/Cleanup.d.mts +3 -2
- package/dist/Cleanup.mjs +1 -6
- package/dist/Cleanup.mjs.map +1 -1
- package/dist/{Client-D1_xYM9o.mjs → Client-BQteUePT.mjs} +2 -4
- package/dist/{Client-D1_xYM9o.mjs.map → Client-BQteUePT.mjs.map} +1 -1
- package/dist/Client.d.mts +51 -2
- package/dist/Client.mjs +1 -1
- package/dist/Connection-DcvJZEdc.mjs +65 -0
- package/dist/Connection-DcvJZEdc.mjs.map +1 -0
- package/dist/ContextCoordination.d.mts +5 -6
- package/dist/ContextCoordination.mjs +1 -8
- package/dist/ContextCoordination.mjs.map +1 -1
- package/dist/Contexts.d.mts +4 -6
- package/dist/Contexts.mjs +2 -8
- package/dist/Contexts.mjs.map +1 -1
- package/dist/Downloads.d.mts +6 -8
- package/dist/Downloads.mjs +3 -8
- package/dist/Downloads.mjs.map +1 -1
- package/dist/Errors.d.mts +3 -26
- package/dist/Errors.mjs +1 -137
- package/dist/Errors.mjs.map +1 -1
- package/dist/{Extensions-ClZbYb1H.mjs → Extensions-nMNMPGCc.mjs} +3 -9
- package/dist/{Extensions-ClZbYb1H.mjs.map → Extensions-nMNMPGCc.mjs.map} +1 -1
- package/dist/Extensions.d.mts +4 -6
- package/dist/Extensions.mjs +1 -1
- package/dist/Functions.d.mts +4 -6
- package/dist/Functions.mjs +3 -17
- package/dist/Functions.mjs.map +1 -1
- package/dist/{Launch-BHcAEq05.mjs → Launch-m0fxzJ49.mjs} +5 -5
- package/dist/Launch-m0fxzJ49.mjs.map +1 -0
- package/dist/Launch.d.mts +130 -2
- package/dist/Launch.mjs +4 -11
- package/dist/Launch.mjs.map +1 -1
- package/dist/PageFetch.d.mts +3 -5
- package/dist/PageFetch.mjs +2 -8
- package/dist/PageFetch.mjs.map +1 -1
- package/dist/Projects.d.mts +3 -5
- package/dist/Projects.mjs +2 -8
- package/dist/Projects.mjs.map +1 -1
- package/dist/Recordings.d.mts +6 -8
- package/dist/Recordings.mjs +3 -5
- package/dist/Recordings.mjs.map +1 -1
- package/dist/{References-URDAtapt.d.mts → References-DOH3Wu44.d.mts} +5 -6
- package/dist/References.d.mts +3 -2
- package/dist/References.mjs +10 -18
- package/dist/References.mjs.map +1 -1
- package/dist/Replays.d.mts +6 -8
- package/dist/Replays.mjs +3 -5
- package/dist/Replays.mjs.map +1 -1
- package/dist/Search.d.mts +3 -5
- package/dist/Search.mjs +2 -9
- package/dist/Search.mjs.map +1 -1
- package/dist/{SessionData-DRKcKCqw.d.mts → SessionData-5xYZDshJ.d.mts} +5 -6
- package/dist/SessionData.d.mts +3 -2
- package/dist/SessionData.mjs +1 -8
- package/dist/SessionData.mjs.map +1 -1
- package/dist/{Sessions-CtbseWEh.mjs → Sessions-DoQGg9nB.mjs} +34 -18
- package/dist/Sessions-DoQGg9nB.mjs.map +1 -0
- package/dist/{Sessions-B8E4kMxo.d.mts → Sessions-tFJYaXFq.d.mts} +8 -8
- package/dist/Sessions.d.mts +4 -3
- package/dist/Sessions.mjs +1 -1
- package/dist/{Transfers-Czv5IZzJ.d.mts → Transfers-GVqzrDWl.d.mts} +22 -9
- package/dist/Transfers.d.mts +3 -2
- package/dist/Transfers.mjs +12 -28
- package/dist/Transfers.mjs.map +1 -1
- package/dist/Uploads.d.mts +6 -8
- package/dist/Uploads.mjs +3 -5
- package/dist/Uploads.mjs.map +1 -1
- package/dist/Webhooks.d.mts +3 -5
- package/dist/Webhooks.mjs +2 -11
- package/dist/Webhooks.mjs.map +1 -1
- package/dist/{WriterFacts-osvYAsIx.d.mts → WriterFacts-5CPBGG1P.d.mts} +4 -3
- package/dist/index.d.mts +27 -30
- package/dist/index.mjs +26 -30
- package/package.json +3 -24
- 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-joE4Zgys.mjs +0 -1557
- package/dist/Browser-joE4Zgys.mjs.map +0 -1
- package/dist/BrowserBinding-qbQA6JhH.mjs +0 -2452
- package/dist/BrowserBinding-qbQA6JhH.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-CZJPuD7b.mjs +0 -532
- package/dist/Capture-CZJPuD7b.mjs.map +0 -1
- package/dist/Capture-Dr5MkIJb.d.mts +0 -125
- package/dist/Capture.d.mts +0 -2
- package/dist/Capture.mjs +0 -2
- package/dist/Client-Ca0zSg1n.d.mts +0 -53
- package/dist/Images-DgscEfSf.mjs +0 -127
- package/dist/Images-DgscEfSf.mjs.map +0 -1
- package/dist/Launch-BHcAEq05.mjs.map +0 -1
- package/dist/Launch-C8CfaYxb.d.mts +0 -132
- package/dist/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/Sessions-CtbseWEh.mjs.map +0 -1
- package/dist/rolldown-runtime-D7D4PA-g.mjs +0 -13
package/dist/PageFetch.d.mts
CHANGED
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
import { PlatformError } from "./Errors.mjs";
|
|
2
|
-
import {
|
|
2
|
+
import { BrowserbaseClient } from "./Client.mjs";
|
|
3
3
|
import { Context, Effect, Layer, Schema } from "effect";
|
|
4
|
-
|
|
5
|
-
export { BrowserbasePageFetch, PageFetchRequest, PageFetchResult };
|
|
6
|
-
}
|
|
4
|
+
//#region src/PageFetch.d.ts
|
|
7
5
|
export declare const PageFetchRequest: Schema.Struct<{
|
|
8
6
|
readonly url: Schema.NonEmptyString;
|
|
9
7
|
readonly allowRedirects: Schema.optionalKey<Schema.Boolean>;
|
|
@@ -36,5 +34,5 @@ export declare class BrowserbasePageFetch extends BrowserbasePageFetch_base {
|
|
|
36
34
|
static readonly layer: Layer.Layer<BrowserbasePageFetch, never, BrowserbaseClient>;
|
|
37
35
|
}
|
|
38
36
|
//#endregion
|
|
39
|
-
export {
|
|
37
|
+
export {};
|
|
40
38
|
//# sourceMappingURL=PageFetch.d.mts.map
|
package/dist/PageFetch.mjs
CHANGED
|
@@ -1,14 +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-
|
|
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/PageFetch.ts
|
|
7
|
-
var PageFetch_exports = /* @__PURE__ */ __exportAll({
|
|
8
|
-
BrowserbasePageFetch: () => BrowserbasePageFetch,
|
|
9
|
-
PageFetchRequest: () => PageFetchRequest,
|
|
10
|
-
PageFetchResult: () => PageFetchResult
|
|
11
|
-
});
|
|
12
6
|
const HttpUrl = Schema.NonEmptyString.check(Schema.isMaxLength(8192), Schema.makeFilter((value) => {
|
|
13
7
|
try {
|
|
14
8
|
const url = new URL(value);
|
|
@@ -59,6 +53,6 @@ var BrowserbasePageFetch = class BrowserbasePageFetch extends Context.Service()(
|
|
|
59
53
|
}));
|
|
60
54
|
};
|
|
61
55
|
//#endregion
|
|
62
|
-
export { BrowserbasePageFetch, PageFetchRequest, PageFetchResult
|
|
56
|
+
export { BrowserbasePageFetch, PageFetchRequest, PageFetchResult };
|
|
63
57
|
|
|
64
58
|
//# sourceMappingURL=PageFetch.mjs.map
|
package/dist/PageFetch.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PageFetch.mjs","names":[],"sources":["../src/PageFetch.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 HttpUrl = Schema.NonEmptyString.check(\n Schema.isMaxLength(8192),\n Schema.makeFilter((value) => {\n try {\n const url = new URL(value);\n\n return (\n (url.protocol === \"https:\" || url.protocol === \"http:\") && !url.username && !url.password\n );\n } catch {\n return false;\n }\n }),\n);\n\nexport const PageFetchRequest = Schema.Struct({\n url: HttpUrl,\n allowRedirects: Schema.optionalKey(Schema.Boolean),\n allowInsecureSsl: Schema.optionalKey(Schema.Boolean),\n proxies: Schema.optionalKey(Schema.Boolean),\n /** `raw` by default; `json` extracts with `schema`, `markdown` converts the page. */\n format: Schema.optionalKey(Schema.Literals([\"raw\", \"json\", \"markdown\"])),\n /** A JSON Schema describing the object to extract when `format` is `json`. */\n schema: Schema.optionalKey(Schema.Record(Schema.String, Schema.Json)),\n});\n\nexport type PageFetchRequest = typeof PageFetchRequest.Type;\n\nexport class PageFetchResult extends Schema.Class<PageFetchResult>(\"BrowserbasePageFetchResult\")({\n id: Schema.String.check(Schema.isMaxLength(256)),\n statusCode: Schema.Int,\n headers: Schema.Record(Schema.String, Schema.String),\n content: Schema.Union([Schema.String, Schema.Json]),\n contentType: Schema.String.check(Schema.isMaxLength(1024)),\n encoding: Schema.String.check(Schema.isMaxLength(64)),\n}) {}\n\n/**\n * Browserbase's Fetch API: one page retrieved by the provider without a browser session.\n * Replies are bounded by the 1 MiB control-plane limit (`reason: \"limit\"`); each call is\n * billed and never retried. `statusCode` is the target site's status, not the API's.\n */\nexport class BrowserbasePageFetch extends Context.Service<\n BrowserbasePageFetch,\n {\n readonly fetch: (request: PageFetchRequest) => Effect.Effect<PageFetchResult, PlatformError>;\n }\n>()(\"effect-browserbase/PageFetch\") {\n static readonly layer: Layer.Layer<BrowserbasePageFetch, never, BrowserbaseClient> = Layer.effect(\n BrowserbasePageFetch,\n Effect.gen(function* () {\n const api = resource<PlatformError>(yield* BrowserbaseClient, (failure) =>\n PlatformError.make({ ...failure, service: \"fetch\" }),\n );\n\n const fetch = Effect.fn(\"BrowserbasePageFetch.fetch\")(function* (request: PageFetchRequest) {\n const value = yield* api.input(PageFetchRequest, request, \"fetch\");\n\n if (value.schema !== undefined && value.format !== \"json\")\n return yield* api.configuration(\"fetch\");\n\n return yield* api.request(\"POST\", \"/v1/fetch\", PageFetchResult, \"fetch\", value);\n });\n\n return BrowserbasePageFetch.of({ fetch });\n }),\n );\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"PageFetch.mjs","names":[],"sources":["../src/PageFetch.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 HttpUrl = Schema.NonEmptyString.check(\n Schema.isMaxLength(8192),\n Schema.makeFilter((value) => {\n try {\n const url = new URL(value);\n\n return (\n (url.protocol === \"https:\" || url.protocol === \"http:\") && !url.username && !url.password\n );\n } catch {\n return false;\n }\n }),\n);\n\nexport const PageFetchRequest = Schema.Struct({\n url: HttpUrl,\n allowRedirects: Schema.optionalKey(Schema.Boolean),\n allowInsecureSsl: Schema.optionalKey(Schema.Boolean),\n proxies: Schema.optionalKey(Schema.Boolean),\n /** `raw` by default; `json` extracts with `schema`, `markdown` converts the page. */\n format: Schema.optionalKey(Schema.Literals([\"raw\", \"json\", \"markdown\"])),\n /** A JSON Schema describing the object to extract when `format` is `json`. */\n schema: Schema.optionalKey(Schema.Record(Schema.String, Schema.Json)),\n});\n\nexport type PageFetchRequest = typeof PageFetchRequest.Type;\n\nexport class PageFetchResult extends Schema.Class<PageFetchResult>(\"BrowserbasePageFetchResult\")({\n id: Schema.String.check(Schema.isMaxLength(256)),\n statusCode: Schema.Int,\n headers: Schema.Record(Schema.String, Schema.String),\n content: Schema.Union([Schema.String, Schema.Json]),\n contentType: Schema.String.check(Schema.isMaxLength(1024)),\n encoding: Schema.String.check(Schema.isMaxLength(64)),\n}) {}\n\n/**\n * Browserbase's Fetch API: one page retrieved by the provider without a browser session.\n * Replies are bounded by the 1 MiB control-plane limit (`reason: \"limit\"`); each call is\n * billed and never retried. `statusCode` is the target site's status, not the API's.\n */\nexport class BrowserbasePageFetch extends Context.Service<\n BrowserbasePageFetch,\n {\n readonly fetch: (request: PageFetchRequest) => Effect.Effect<PageFetchResult, PlatformError>;\n }\n>()(\"effect-browserbase/PageFetch\") {\n static readonly layer: Layer.Layer<BrowserbasePageFetch, never, BrowserbaseClient> = Layer.effect(\n BrowserbasePageFetch,\n Effect.gen(function* () {\n const api = resource<PlatformError>(yield* BrowserbaseClient, (failure) =>\n PlatformError.make({ ...failure, service: \"fetch\" }),\n );\n\n const fetch = Effect.fn(\"BrowserbasePageFetch.fetch\")(function* (request: PageFetchRequest) {\n const value = yield* api.input(PageFetchRequest, request, \"fetch\");\n\n if (value.schema !== undefined && value.format !== \"json\")\n return yield* api.configuration(\"fetch\");\n\n return yield* api.request(\"POST\", \"/v1/fetch\", PageFetchResult, \"fetch\", value);\n });\n\n return BrowserbasePageFetch.of({ fetch });\n }),\n );\n}\n"],"mappings":";;;;;AAMA,MAAM,UAAU,OAAO,eAAe,MACpC,OAAO,YAAY,IAAI,GACvB,OAAO,YAAY,UAAU;CAC3B,IAAI;EACF,MAAM,MAAM,IAAI,IAAI,KAAK;EAEzB,QACG,IAAI,aAAa,YAAY,IAAI,aAAa,YAAY,CAAC,IAAI,YAAY,CAAC,IAAI;CAErF,QAAQ;EACN,OAAO;CACT;AACF,CAAC,CACH;AAEA,MAAa,mBAAmB,OAAO,OAAO;CAC5C,KAAK;CACL,gBAAgB,OAAO,YAAY,OAAO,OAAO;CACjD,kBAAkB,OAAO,YAAY,OAAO,OAAO;CACnD,SAAS,OAAO,YAAY,OAAO,OAAO;;CAE1C,QAAQ,OAAO,YAAY,OAAO,SAAS;EAAC;EAAO;EAAQ;CAAU,CAAC,CAAC;;CAEvE,QAAQ,OAAO,YAAY,OAAO,OAAO,OAAO,QAAQ,OAAO,IAAI,CAAC;AACtE,CAAC;AAID,IAAa,kBAAb,cAAqC,OAAO,MAAuB,4BAA4B,CAAC,CAAC;CAC/F,IAAI,OAAO,OAAO,MAAM,OAAO,YAAY,GAAG,CAAC;CAC/C,YAAY,OAAO;CACnB,SAAS,OAAO,OAAO,OAAO,QAAQ,OAAO,MAAM;CACnD,SAAS,OAAO,MAAM,CAAC,OAAO,QAAQ,OAAO,IAAI,CAAC;CAClD,aAAa,OAAO,OAAO,MAAM,OAAO,YAAY,IAAI,CAAC;CACzD,UAAU,OAAO,OAAO,MAAM,OAAO,YAAY,EAAE,CAAC;AACtD,CAAC,CAAC,CAAC,CAAC;;;;;;AAOJ,IAAa,uBAAb,MAAa,6BAA6B,QAAQ,QAKhD,CAAC,CAAC,8BAA8B,CAAC,CAAC;CAClC,OAAgB,QAAqE,MAAM,OACzF,sBACA,OAAO,IAAI,aAAa;EACtB,MAAM,MAAM,SAAwB,OAAO,oBAAoB,YAC7D,cAAc,KAAK;GAAE,GAAG;GAAS,SAAS;EAAQ,CAAC,CACrD;EAEA,MAAM,QAAQ,OAAO,GAAG,4BAA4B,CAAC,CAAC,WAAW,SAA2B;GAC1F,MAAM,QAAQ,OAAO,IAAI,MAAM,kBAAkB,SAAS,OAAO;GAEjE,IAAI,MAAM,WAAW,KAAA,KAAa,MAAM,WAAW,QACjD,OAAO,OAAO,IAAI,cAAc,OAAO;GAEzC,OAAO,OAAO,IAAI,QAAQ,QAAQ,aAAa,iBAAiB,SAAS,KAAK;EAChF,CAAC;EAED,OAAO,qBAAqB,GAAG,EAAE,MAAM,CAAC;CAC1C,CAAC,CACH;AACF"}
|
package/dist/Projects.d.mts
CHANGED
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
import { ProjectError } from "./Errors.mjs";
|
|
2
|
-
import {
|
|
2
|
+
import { BrowserbaseClient } from "./Client.mjs";
|
|
3
3
|
import { Context, Effect, Layer, Schema } from "effect";
|
|
4
|
-
|
|
5
|
-
export { BrowserbaseProjects, ProjectMetadata, ProjectUsage };
|
|
6
|
-
}
|
|
4
|
+
//#region src/Projects.d.ts
|
|
7
5
|
declare const ProjectMetadata_base: Schema.Class<ProjectMetadata, Schema.Struct<{
|
|
8
6
|
readonly projectId: Schema.NonEmptyString;
|
|
9
7
|
readonly name: Schema.String;
|
|
@@ -35,5 +33,5 @@ export declare class BrowserbaseProjects extends BrowserbaseProjects_base {
|
|
|
35
33
|
static readonly layer: Layer.Layer<BrowserbaseProjects, never, BrowserbaseClient>;
|
|
36
34
|
}
|
|
37
35
|
//#endregion
|
|
38
|
-
export {
|
|
36
|
+
export {};
|
|
39
37
|
//# sourceMappingURL=Projects.d.mts.map
|
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-BQteUePT.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"}
|
package/dist/Recordings.d.mts
CHANGED
|
@@ -1,12 +1,10 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { a as SessionReference } from "./References-DOH3Wu44.mjs";
|
|
2
2
|
import { ArtifactError } from "./Errors.mjs";
|
|
3
|
-
import {
|
|
4
|
-
import { t as BrowserbaseSessions } from "./Sessions-
|
|
5
|
-
import {
|
|
3
|
+
import { BrowserbaseClient } from "./Client.mjs";
|
|
4
|
+
import { t as BrowserbaseSessions } from "./Sessions-tFJYaXFq.mjs";
|
|
5
|
+
import { c as RecordingPageReference, o as RecordingBatch, t as ArtifactTransferPolicy } from "./Transfers-GVqzrDWl.mjs";
|
|
6
6
|
import { Context, Effect, Layer, Stream } from "effect";
|
|
7
|
-
|
|
8
|
-
export { BrowserbaseRecordings, DownloadLimits, PollOptions };
|
|
9
|
-
}
|
|
7
|
+
//#region src/Recordings.d.ts
|
|
10
8
|
export interface PollOptions {
|
|
11
9
|
readonly timeoutMillis?: number;
|
|
12
10
|
readonly intervalMillis?: number;
|
|
@@ -24,5 +22,5 @@ export declare class BrowserbaseRecordings extends BrowserbaseRecordings_base {
|
|
|
24
22
|
static readonly layer: Layer.Layer<BrowserbaseRecordings, never, BrowserbaseClient | BrowserbaseSessions>;
|
|
25
23
|
}
|
|
26
24
|
//#endregion
|
|
27
|
-
export {
|
|
25
|
+
export {};
|
|
28
26
|
//# sourceMappingURL=Recordings.d.mts.map
|
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-BQteUePT.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-DoQGg9nB.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"}
|
package/dist/Replays.d.mts
CHANGED
|
@@ -1,12 +1,10 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { a as SessionReference } from "./References-DOH3Wu44.mjs";
|
|
2
2
|
import { ArtifactError } from "./Errors.mjs";
|
|
3
|
-
import {
|
|
4
|
-
import { t as BrowserbaseSessions } from "./Sessions-
|
|
5
|
-
import {
|
|
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
|
-
|
|
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 {
|
|
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-
|
|
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-
|
|
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
|
|
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":";;;;;;;;;;;AAcA,MAAM,WAAW,OAAO,OAAO;CAC7B,WAAW,OAAO;CAClB,OAAO,OAAO,MACZ,OAAO,OAAO;EACZ,QAAQ;EACR,aAAa,OAAO;EACpB,WAAW,OAAO;EAClB,KAAK,OAAO,OAAO,MAAM,OAAO,YAAY,KAAK,CAAC;CACpD,CAAC,CACH,CAAC,CAAC,MAAM,OAAO,YAAY,GAAG,CAAC;AACjC,CAAC;AAED,MAAM,WAAW,WAAuC,WACtD,cAAc,KAAK;CAAE;CAAW;AAAO,CAAC;AAE1C,MAAM,cAAc,eAA2C,UAC7D,cAAc,KAAK;CACjB;CACA,QAAQ,MAAM;CACd,GAAI,MAAM,YAAY,KAAA,IAAY,CAAC,IAAI,EAAE,SAAS,MAAM,QAAQ;CAChE,GAAI,MAAM,WAAW,KAAA,IAAY,CAAC,IAAI,EAAE,QAAQ,MAAM,OAAO;CAC7D,GAAI,MAAM,qBAAqB,KAAA,IAAY,CAAC,IAAI,EAAE,kBAAkB,MAAM,iBAAiB;AAC7F,CAAC;;AAgBH,MAAM,gBAAgB,MAAc,YAA6D;CAC/F,MAAM,QAAQ,KAAK,MAAM,OAAO;CAEhC,IAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS,gBAAgB,KAAK,MAAM,SAAS,OAChF,MAAM,QAAQ,mBAAmB,WAAW;CAE9C,MAAM,OAAiB,CAAC;CAExB,KAAK,MAAM,OAAO,MAAM,MAAM,CAAC,GAAG;EAChC,MAAM,OAAO,IAAI,KAAK;EAEtB,IAAI,SAAS,IAAI;EACjB,IACE,KAAK,WAAW,mBAAmB,KACnC,KAAK,WAAW,eAAe,KAC9B,KAAK,WAAW,aAAa,KAAK,SAAS,0BAE5C,MAAM,QAAQ,mBAAmB,aAAa;EAEhD,IAAI;EAEJ,IAAI,CAAC,KAAK,WAAW,GAAG,GAAG,MAAM;OAC5B,IAAI,UAAU,KAAK,IAAI,GAAG;GAC7B,IAAI,CAAC,KAAK,WAAW,aAAa,GAAG,MAAM,QAAQ,mBAAmB,aAAa;GACnF,MAAM,QAAQ,8BAA8B,KAAK,KAAK,MAAM,EAAoB,CAAC;GAEjF,IAAI,UAAU,MAAM,MAAM,QAAQ,mBAAmB,WAAW;GAChE,MAAM,MAAM;EACd;EACA,IAAI,QAAQ,KAAA,GAAW;GACrB,IAAI,CAAC,QAAQ,GAAG,KAAK,KAAK,UAAU,OAAO,MAAM,QAAQ,mBAAmB,YAAY;GACxF,KAAK,KAAK,GAAG;EACf;CACF;CACA,IAAI,KAAK,WAAW,GAAG,MAAM,QAAQ,mBAAmB,WAAW;CAEnE,OAAO;AACT;AAEA,IAAa,qBAAb,MAAa,2BAA2B,QAAQ,QAU9C,CAAC,CAAC,4BAA4B,CAAC,CAAC;CAChC,OAAgB,QAIZ,MAAM,OACR,oBACA,OAAO,IAAI,aAAa;EACtB,MAAM,SAAS,OAAO;EACtB,MAAM,WAAW,OAAO;EAExB,MAAM,WAAW,OAAO,WAAW,WAAW,KAAuB;GACnE,OAAO,uBACL,UACA,WACM,QAAQ,UAAU,QAAQ,IAC/B,UAAU,cAAc,KAAK;IAAE,WAAW;IAAU,QAAQ,MAAM;GAAO,CAAC,CAC7E;GAEA,MAAM,MAAM,OAAO,OAChB,KAAK,OAAO,gBAAgB,mBAAmB,IAAI,SAAS,EAAE,SAAS,CAAC,CACxE,KACC,OAAO,SAAS,WAAW,iBAAiB,CAAC,GAC7C,OAAO,SAAS,UACd,OAAO,oBAAoB,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,KAC1C,OAAO,eAAe,QAAQ,mBAAmB,WAAW,CAAC,CAC/D,CACF,CACF;GAEF,IACE,IAAI,cAAc,IAAI,MAAM,UAC5B,IAAI,IAAI,IAAI,MAAM,KAAK,SAAS,KAAK,MAAM,CAAC,CAAC,CAAC,SAAS,IAAI,MAAM,UACjE,IAAI,MAAM,MAAM,SAAS,KAAK,cAAc,KAAK,KAAK,YAAY,KAAK,WAAW,GAElF,OAAO,OAAO,QAAQ,mBAAmB,WAAW;GAGtD,OAAO,IAAI,MAAM,KAAK,SACpB,WAAW,KAAK;IACd,QAAQ,KAAK;IACb,aAAa,KAAK;IAClB,WAAW,KAAK;GAClB,CAAC,CACH;EACF,CAAC;EAED,MAAM,WAAW,OAAO,WAAW,WAAW,KAA6B;GACzE,OAAO,OAAO,aAAa,sBAAsB,CAAC,CAAC,GAAG,CAAC,CAAC,KACtD,OAAO,eAAe,QAAQ,UAAU,eAAe,CAAC,CAC1D;GAIA,IAAI,EAAC,OAFgB,SAAS,IAAI,OAAO,EAAA,CAE9B,MAAM,SAAS,KAAK,WAAW,IAAI,MAAM,GAClD,OAAO,OAAO,QAAQ,UAAU,WAAW;GAE7C,MAAM,OAAO,OAAO,OACjB,KACC,gBAAgB,mBAAmB,IAAI,QAAQ,SAAS,EAAE,WAAW,mBAAmB,IAAI,MAAM,KAClG,SACA,CAAC,iCAAiC,uBAAuB,CAC3D,CAAC,CACA,KAAK,OAAO,SAAS,WAAW,iBAAiB,CAAC,CAAC;GAItD,MAAM,OAAO,OAAO,OAAO,IAAI;IAC7B,WAAW,aAAa,MAAM,OAAO,gBAAgB;IACrD,aAAa,QAAQ,mBAAmB,WAAW;GACrD,CAAC;GAED,OAAO;IACL,WAAW;IACX,UAAU,SAAS,KAAK,IAAI;IAC5B,iBAAiB,OAAO,MAAM;IAC9B,YAAY,KAAK;IACjB,QAAQ,OAAe,WAA2B;KAChD,MAAM,MAAM,OAAO,cAAc,KAAK,IAAI,KAAK,SAAS,KAAA;KAExD,OAAO,QAAQ,KAAA,IACX,OAAO,KAAK,QAAQ,gBAAgB,WAAW,CAAC,IAChD,OAAO,OACL,eACE;MACE,UAAU,OAAO;MACjB,GAAI,OAAO,kBAAkB,KAAA,IACzB,CAAC,IACD,EAAE,eAAe,OAAO,cAAc;KAC5C,SACM,QAAQ,gBAAgB,eAAe,CAC/C,CAAC,CAAC,KACA,OAAO,KAAK,EAAE,UAAU,oBACtB,OACG,MACC,SAAS,KAAK,GAAG,GACjB,UACA;MAAC;MAAa;MAAqB;KAA0B,GAC7D,aACF,CAAC,CACA,KAAK,OAAO,SAAS,WAAW,cAAc,CAAC,CAAC,CACrD,CACF,CACF;IACN;GACF;EACF,CAAC;EAED,OAAO,mBAAmB,GAAG;GAAE;GAAU;EAAS,CAAC;CACrD,CAAC,CACH;AACF"}
|
|
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 {
|
|
2
|
+
import { BrowserbaseClient } from "./Client.mjs";
|
|
3
3
|
import { Context, Effect, Layer, Schema } from "effect";
|
|
4
|
-
|
|
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 {
|
|
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-
|
|
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
|
|
44
|
+
export { BrowserbaseSearch, SearchQuery, SearchResult, SearchResults };
|
|
52
45
|
|
|
53
46
|
//# sourceMappingURL=Search.mjs.map
|
package/dist/Search.mjs.map
CHANGED
|
@@ -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":"
|
|
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 {
|
|
1
|
+
import { a as SessionReference } from "./References-DOH3Wu44.mjs";
|
|
2
2
|
import { Schema } from "effect";
|
|
3
|
-
|
|
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
|
|
39
|
-
|
|
36
|
+
export { isTerminalSessionStatus as i, SessionMetadata as n, SessionStatus as r, ProviderSession as t };
|
|
37
|
+
export {};
|
|
38
|
+
//# sourceMappingURL=SessionData-5xYZDshJ.d.mts.map
|
package/dist/SessionData.d.mts
CHANGED
|
@@ -1,2 +1,3 @@
|
|
|
1
|
-
import {
|
|
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 {};
|
package/dist/SessionData.mjs
CHANGED
|
@@ -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
|
|
46
|
+
export { ProviderSession, SessionMetadata, SessionStatus, isTerminalSessionStatus };
|
|
54
47
|
|
|
55
48
|
//# sourceMappingURL=SessionData.mjs.map
|
package/dist/SessionData.mjs.map
CHANGED
|
@@ -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":"
|
|
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"}
|