sprntrl 0.1.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/LICENSE +21 -0
- package/README.md +128 -0
- package/dist/client.d.ts +33 -0
- package/dist/client.js +57 -0
- package/dist/client.js.map +1 -0
- package/dist/core/error.d.ts +46 -0
- package/dist/core/error.js +72 -0
- package/dist/core/error.js.map +1 -0
- package/dist/core/request.d.ts +24 -0
- package/dist/core/request.js +107 -0
- package/dist/core/request.js.map +1 -0
- package/dist/core/resource.d.ts +5 -0
- package/dist/core/resource.js +7 -0
- package/dist/core/resource.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/browser.d.ts +7 -0
- package/dist/lib/browser.js +56 -0
- package/dist/lib/browser.js.map +1 -0
- package/dist/resources/api-keys.d.ts +11 -0
- package/dist/resources/api-keys.js +28 -0
- package/dist/resources/api-keys.js.map +1 -0
- package/dist/resources/ip-whitelist.d.ts +10 -0
- package/dist/resources/ip-whitelist.js +28 -0
- package/dist/resources/ip-whitelist.js.map +1 -0
- package/dist/resources/profiles.d.ts +19 -0
- package/dist/resources/profiles.js +51 -0
- package/dist/resources/profiles.js.map +1 -0
- package/dist/resources/session-files.d.ts +10 -0
- package/dist/resources/session-files.js +36 -0
- package/dist/resources/session-files.js.map +1 -0
- package/dist/resources/sessions.d.ts +72 -0
- package/dist/resources/sessions.js +195 -0
- package/dist/resources/sessions.js.map +1 -0
- package/dist/resources/templates.d.ts +5 -0
- package/dist/resources/templates.js +11 -0
- package/dist/resources/templates.js.map +1 -0
- package/dist/resources/usage.d.ts +6 -0
- package/dist/resources/usage.js +17 -0
- package/dist/resources/usage.js.map +1 -0
- package/dist/resources/user.d.ts +26 -0
- package/dist/resources/user.js +38 -0
- package/dist/resources/user.js.map +1 -0
- package/dist/types.d.ts +148 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +61 -0
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { APIResource } from "../core/resource.js";
|
|
2
|
+
export class APIKeys extends APIResource {
|
|
3
|
+
async list() {
|
|
4
|
+
const r = await this._client.request({
|
|
5
|
+
method: "GET",
|
|
6
|
+
path: "/api/v1/apikeys",
|
|
7
|
+
});
|
|
8
|
+
return r.api_keys ?? [];
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Create an API key. The full `key` field is returned ONLY on creation —
|
|
12
|
+
* store it immediately; the server cannot show it again.
|
|
13
|
+
*/
|
|
14
|
+
create(name) {
|
|
15
|
+
return this._client.request({
|
|
16
|
+
method: "POST",
|
|
17
|
+
path: "/api/v1/apikeys",
|
|
18
|
+
body: { name },
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
async revoke(keyId) {
|
|
22
|
+
await this._client.request({
|
|
23
|
+
method: "DELETE",
|
|
24
|
+
path: `/api/v1/apikeys/${encodeURIComponent(keyId)}`,
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=api-keys.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-keys.js","sourceRoot":"","sources":["../../src/resources/api-keys.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAGlD,MAAM,OAAO,OAAQ,SAAQ,WAAW;IACtC,KAAK,CAAC,IAAI;QACR,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAyB;YAC3D,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,iBAAiB;SACxB,CAAC,CAAC;QACH,OAAO,CAAC,CAAC,QAAQ,IAAI,EAAE,CAAC;IAC1B,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,IAAY;QACjB,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAgB;YACzC,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,iBAAiB;YACvB,IAAI,EAAE,EAAE,IAAI,EAAE;SACf,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAAa;QACxB,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;YACzB,MAAM,EAAE,QAAQ;YAChB,IAAI,EAAE,mBAAmB,kBAAkB,CAAC,KAAK,CAAC,EAAE;SACrD,CAAC,CAAC;IACL,CAAC;CACF"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { APIResource } from "../core/resource.js";
|
|
2
|
+
import type { IPWhitelistEntry } from "../types.js";
|
|
3
|
+
export declare class IPWhitelist extends APIResource {
|
|
4
|
+
list(): Promise<IPWhitelistEntry[]>;
|
|
5
|
+
/** Pass ip='current' to register the caller's public IP (as Cloudflare sees it). */
|
|
6
|
+
add(ip?: string, opts?: {
|
|
7
|
+
label?: string;
|
|
8
|
+
}): Promise<IPWhitelistEntry>;
|
|
9
|
+
remove(entryId: string): Promise<void>;
|
|
10
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { APIResource } from "../core/resource.js";
|
|
2
|
+
export class IPWhitelist extends APIResource {
|
|
3
|
+
async list() {
|
|
4
|
+
const r = await this._client.request({
|
|
5
|
+
method: "GET",
|
|
6
|
+
path: "/api/v1/settings/ip-whitelist",
|
|
7
|
+
});
|
|
8
|
+
return r.entries ?? [];
|
|
9
|
+
}
|
|
10
|
+
/** Pass ip='current' to register the caller's public IP (as Cloudflare sees it). */
|
|
11
|
+
add(ip = "current", opts = {}) {
|
|
12
|
+
const body = { ip };
|
|
13
|
+
if (opts.label !== undefined)
|
|
14
|
+
body.label = opts.label;
|
|
15
|
+
return this._client.request({
|
|
16
|
+
method: "POST",
|
|
17
|
+
path: "/api/v1/settings/ip-whitelist",
|
|
18
|
+
body,
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
async remove(entryId) {
|
|
22
|
+
await this._client.request({
|
|
23
|
+
method: "DELETE",
|
|
24
|
+
path: `/api/v1/settings/ip-whitelist/${encodeURIComponent(entryId)}`,
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=ip-whitelist.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ip-whitelist.js","sourceRoot":"","sources":["../../src/resources/ip-whitelist.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAGlD,MAAM,OAAO,WAAY,SAAQ,WAAW;IAC1C,KAAK,CAAC,IAAI;QACR,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAkC;YACpE,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,+BAA+B;SACtC,CAAC,CAAC;QACH,OAAO,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC;IACzB,CAAC;IAED,oFAAoF;IACpF,GAAG,CAAC,KAAa,SAAS,EAAE,OAA2B,EAAE;QACvD,MAAM,IAAI,GAA4B,EAAE,EAAE,EAAE,CAAC;QAC7C,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS;YAAE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACtD,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAmB;YAC5C,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,+BAA+B;YACrC,IAAI;SACL,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,OAAe;QAC1B,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;YACzB,MAAM,EAAE,QAAQ;YAChB,IAAI,EAAE,iCAAiC,kBAAkB,CAAC,OAAO,CAAC,EAAE;SACrE,CAAC,CAAC;IACL,CAAC;CACF"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { APIResource } from "../core/resource.js";
|
|
2
|
+
import type { Profile } from "../types.js";
|
|
3
|
+
export interface ProfileCreateParams {
|
|
4
|
+
name: string;
|
|
5
|
+
template_id?: string;
|
|
6
|
+
config?: unknown;
|
|
7
|
+
description?: string;
|
|
8
|
+
os?: string;
|
|
9
|
+
location?: string;
|
|
10
|
+
persona?: string;
|
|
11
|
+
}
|
|
12
|
+
export declare class Profiles extends APIResource {
|
|
13
|
+
create(params: ProfileCreateParams): Promise<Profile>;
|
|
14
|
+
list(): Promise<Profile[]>;
|
|
15
|
+
get(profileId: string): Promise<Profile>;
|
|
16
|
+
update(profileId: string, fields: Partial<ProfileCreateParams>): Promise<Profile>;
|
|
17
|
+
duplicate(profileId: string): Promise<Profile>;
|
|
18
|
+
delete(profileId: string): Promise<void>;
|
|
19
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { APIResource } from "../core/resource.js";
|
|
2
|
+
export class Profiles extends APIResource {
|
|
3
|
+
create(params) {
|
|
4
|
+
const { config, ...rest } = params;
|
|
5
|
+
const body = { ...rest };
|
|
6
|
+
if (config !== undefined)
|
|
7
|
+
body.config_json = config;
|
|
8
|
+
return this._client.request({
|
|
9
|
+
method: "POST",
|
|
10
|
+
path: "/api/v1/profiles",
|
|
11
|
+
body,
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
async list() {
|
|
15
|
+
const r = await this._client.request({
|
|
16
|
+
method: "GET",
|
|
17
|
+
path: "/api/v1/profiles",
|
|
18
|
+
});
|
|
19
|
+
return r.profiles ?? [];
|
|
20
|
+
}
|
|
21
|
+
get(profileId) {
|
|
22
|
+
return this._client.request({
|
|
23
|
+
method: "GET",
|
|
24
|
+
path: `/api/v1/profiles/${encodeURIComponent(profileId)}`,
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
update(profileId, fields) {
|
|
28
|
+
const { config, ...rest } = fields;
|
|
29
|
+
const body = { ...rest };
|
|
30
|
+
if (config !== undefined)
|
|
31
|
+
body.config_json = config;
|
|
32
|
+
return this._client.request({
|
|
33
|
+
method: "PUT",
|
|
34
|
+
path: `/api/v1/profiles/${encodeURIComponent(profileId)}`,
|
|
35
|
+
body,
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
duplicate(profileId) {
|
|
39
|
+
return this._client.request({
|
|
40
|
+
method: "POST",
|
|
41
|
+
path: `/api/v1/profiles/${encodeURIComponent(profileId)}/duplicate`,
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
async delete(profileId) {
|
|
45
|
+
await this._client.request({
|
|
46
|
+
method: "DELETE",
|
|
47
|
+
path: `/api/v1/profiles/${encodeURIComponent(profileId)}`,
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=profiles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profiles.js","sourceRoot":"","sources":["../../src/resources/profiles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAalD,MAAM,OAAO,QAAS,SAAQ,WAAW;IACvC,MAAM,CAAC,MAA2B;QAChC,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,MAAM,CAAC;QACnC,MAAM,IAAI,GAA4B,EAAE,GAAG,IAAI,EAAE,CAAC;QAClD,IAAI,MAAM,KAAK,SAAS;YAAE,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC;QACpD,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAU;YACnC,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,kBAAkB;YACxB,IAAI;SACL,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,IAAI;QACR,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAA0B;YAC5D,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,kBAAkB;SACzB,CAAC,CAAC;QACH,OAAO,CAAC,CAAC,QAAQ,IAAI,EAAE,CAAC;IAC1B,CAAC;IAED,GAAG,CAAC,SAAiB;QACnB,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAU;YACnC,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,oBAAoB,kBAAkB,CAAC,SAAS,CAAC,EAAE;SAC1D,CAAC,CAAC;IACL,CAAC;IAED,MAAM,CAAC,SAAiB,EAAE,MAAoC;QAC5D,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,MAAM,CAAC;QACnC,MAAM,IAAI,GAA4B,EAAE,GAAG,IAAI,EAAE,CAAC;QAClD,IAAI,MAAM,KAAK,SAAS;YAAE,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC;QACpD,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAU;YACnC,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,oBAAoB,kBAAkB,CAAC,SAAS,CAAC,EAAE;YACzD,IAAI;SACL,CAAC,CAAC;IACL,CAAC;IAED,SAAS,CAAC,SAAiB;QACzB,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAU;YACnC,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,oBAAoB,kBAAkB,CAAC,SAAS,CAAC,YAAY;SACpE,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,SAAiB;QAC5B,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;YACzB,MAAM,EAAE,QAAQ;YAChB,IAAI,EAAE,oBAAoB,kBAAkB,CAAC,SAAS,CAAC,EAAE;SAC1D,CAAC,CAAC;IACL,CAAC;CACF"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { APIResource } from "../core/resource.js";
|
|
2
|
+
import type { FileInfo } from "../types.js";
|
|
3
|
+
export type FileContent = Uint8Array | ArrayBuffer | Blob | string;
|
|
4
|
+
export declare class SessionFiles extends APIResource {
|
|
5
|
+
list(sessionId: string): Promise<FileInfo[]>;
|
|
6
|
+
download(sessionId: string, filename: string): Promise<ArrayBuffer>;
|
|
7
|
+
upload(sessionId: string, filename: string, content: FileContent, opts?: {
|
|
8
|
+
contentType?: string;
|
|
9
|
+
}): Promise<void>;
|
|
10
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { APIResource } from "../core/resource.js";
|
|
2
|
+
export class SessionFiles extends APIResource {
|
|
3
|
+
async list(sessionId) {
|
|
4
|
+
const r = await this._client.request({
|
|
5
|
+
method: "GET",
|
|
6
|
+
path: `/api/v1/sessions/${encodeURIComponent(sessionId)}/files`,
|
|
7
|
+
});
|
|
8
|
+
if (Array.isArray(r))
|
|
9
|
+
return r;
|
|
10
|
+
return r.files ?? [];
|
|
11
|
+
}
|
|
12
|
+
async download(sessionId, filename) {
|
|
13
|
+
const response = await this._client.request({
|
|
14
|
+
method: "GET",
|
|
15
|
+
path: `/api/v1/sessions/${encodeURIComponent(sessionId)}/files/${encodeURIComponent(filename)}`,
|
|
16
|
+
stream: true,
|
|
17
|
+
});
|
|
18
|
+
return response.arrayBuffer();
|
|
19
|
+
}
|
|
20
|
+
async upload(sessionId, filename, content, opts = {}) {
|
|
21
|
+
const form = new FormData();
|
|
22
|
+
const blob = content instanceof Blob
|
|
23
|
+
? content
|
|
24
|
+
: new Blob([content], {
|
|
25
|
+
type: opts.contentType ?? "application/octet-stream",
|
|
26
|
+
});
|
|
27
|
+
form.append("file", blob, filename);
|
|
28
|
+
await this._client.request({
|
|
29
|
+
method: "POST",
|
|
30
|
+
path: `/api/v1/sessions/${encodeURIComponent(sessionId)}/files`,
|
|
31
|
+
body: form,
|
|
32
|
+
rawBody: true,
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=session-files.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-files.js","sourceRoot":"","sources":["../../src/resources/session-files.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAKlD,MAAM,OAAO,YAAa,SAAQ,WAAW;IAC3C,KAAK,CAAC,IAAI,CAAC,SAAiB;QAC1B,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAqC;YACvE,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,oBAAoB,kBAAkB,CAAC,SAAS,CAAC,QAAQ;SAChE,CAAC,CAAC;QACH,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;YAAE,OAAO,CAAC,CAAC;QAC/B,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,SAAiB,EAAE,QAAgB;QAChD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAW;YACpD,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,oBAAoB,kBAAkB,CAAC,SAAS,CAAC,UAAU,kBAAkB,CAAC,QAAQ,CAAC,EAAE;YAC/F,MAAM,EAAE,IAAI;SACb,CAAC,CAAC;QACH,OAAO,QAAQ,CAAC,WAAW,EAAE,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,MAAM,CACV,SAAiB,EACjB,QAAgB,EAChB,OAAoB,EACpB,OAAiC,EAAE;QAEnC,MAAM,IAAI,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC5B,MAAM,IAAI,GACR,OAAO,YAAY,IAAI;YACrB,CAAC,CAAC,OAAO;YACT,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,OAAmB,CAAC,EAAE;gBAC9B,IAAI,EAAE,IAAI,CAAC,WAAW,IAAI,0BAA0B;aACrD,CAAC,CAAC;QACT,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;QACpC,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;YACzB,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,oBAAoB,kBAAkB,CAAC,SAAS,CAAC,QAAQ;YAC/D,IAAI,EAAE,IAAI;YACV,OAAO,EAAE,IAAI;SACd,CAAC,CAAC;IACL,CAAC;CACF"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { APIResource } from "../core/resource.js";
|
|
2
|
+
import { SessionFiles } from "./session-files.js";
|
|
3
|
+
import type { OS, PaginatedSessions, ProxyConfig, Session } from "../types.js";
|
|
4
|
+
import type { Sprntrl } from "../client.js";
|
|
5
|
+
export interface SessionCreateParams {
|
|
6
|
+
os: OS;
|
|
7
|
+
location: string;
|
|
8
|
+
persistent?: boolean;
|
|
9
|
+
captcha_solver?: boolean;
|
|
10
|
+
session_name?: string;
|
|
11
|
+
proxy?: string | ProxyConfig;
|
|
12
|
+
}
|
|
13
|
+
export interface ConnectOptions {
|
|
14
|
+
/** Currently 'playwright' or 'puppeteer'. */
|
|
15
|
+
framework?: "playwright" | "puppeteer";
|
|
16
|
+
/** Add the caller's current IP to the account whitelist before connecting. */
|
|
17
|
+
autoWhitelist?: boolean;
|
|
18
|
+
/** Wait for session status 'running' before connecting (default true). */
|
|
19
|
+
wait?: boolean;
|
|
20
|
+
/** Timeout in ms for wait_until_ready (default 60000). */
|
|
21
|
+
waitTimeout?: number;
|
|
22
|
+
}
|
|
23
|
+
export declare class Sessions extends APIResource {
|
|
24
|
+
files: SessionFiles;
|
|
25
|
+
constructor(client: Sprntrl);
|
|
26
|
+
create(params: SessionCreateParams): Promise<Session>;
|
|
27
|
+
list(): Promise<Session[]>;
|
|
28
|
+
listActive(): Promise<Session[]>;
|
|
29
|
+
listHistory(params?: {
|
|
30
|
+
page?: number;
|
|
31
|
+
perPage?: number;
|
|
32
|
+
}): Promise<PaginatedSessions>;
|
|
33
|
+
listResumable(params?: {
|
|
34
|
+
limit?: number;
|
|
35
|
+
}): Promise<Session[]>;
|
|
36
|
+
/** Persistent sessions (those created with `persistent: true`), whether
|
|
37
|
+
* currently running or stopped-but-resumable. */
|
|
38
|
+
listPersistent(): Promise<Session[]>;
|
|
39
|
+
listLocations(): Promise<string[]>;
|
|
40
|
+
get(sessionId: string): Promise<Session>;
|
|
41
|
+
stop(sessionId: string): Promise<void>;
|
|
42
|
+
resume(sessionId: string): Promise<Session>;
|
|
43
|
+
deletePersistent(sessionId: string): Promise<void>;
|
|
44
|
+
waitUntilReady(sessionId: string, opts?: {
|
|
45
|
+
timeout?: number;
|
|
46
|
+
pollInterval?: number;
|
|
47
|
+
}): Promise<Session>;
|
|
48
|
+
connect(sessionId: string, opts?: ConnectOptions): Promise<unknown>;
|
|
49
|
+
/**
|
|
50
|
+
* Build the CDP WebSocket URL for a session. Useful for handing off to any
|
|
51
|
+
* CDP client (chrome-remote-interface, raw ws, etc.) — Playwright and
|
|
52
|
+
* Puppeteer users should use `connect()` or `browserSession()` instead.
|
|
53
|
+
*/
|
|
54
|
+
cdpUrl(sessionId: string): string;
|
|
55
|
+
/**
|
|
56
|
+
* Connect a browser, hand back a disposable handle. Exit cleanup closes the
|
|
57
|
+
* browser (does not stop the session — caller owns that).
|
|
58
|
+
*
|
|
59
|
+
* await using handle = await client.sessions.browserSession(id, { autoWhitelist: true });
|
|
60
|
+
* const page = await handle.browser.newPage();
|
|
61
|
+
*
|
|
62
|
+
* Without `await using` (Node <20.11 or TS <5.2):
|
|
63
|
+
* const handle = await client.sessions.browserSession(id);
|
|
64
|
+
* try { ... } finally { await handle.close(); }
|
|
65
|
+
*/
|
|
66
|
+
browserSession(sessionId: string, opts?: ConnectOptions): Promise<BrowserHandle>;
|
|
67
|
+
}
|
|
68
|
+
export interface BrowserHandle {
|
|
69
|
+
readonly browser: unknown;
|
|
70
|
+
close(): Promise<void>;
|
|
71
|
+
[Symbol.asyncDispose](): Promise<void>;
|
|
72
|
+
}
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
import { APIResource } from "../core/resource.js";
|
|
2
|
+
import { SprntrlError } from "../core/error.js";
|
|
3
|
+
import { SessionFiles } from "./session-files.js";
|
|
4
|
+
function normalizeProxy(proxy) {
|
|
5
|
+
if (!proxy)
|
|
6
|
+
return {};
|
|
7
|
+
if (typeof proxy === "string") {
|
|
8
|
+
const url = new URL(proxy);
|
|
9
|
+
const out = {
|
|
10
|
+
proxy_protocol: url.protocol.replace(":", "").toUpperCase(),
|
|
11
|
+
proxy_host: url.hostname,
|
|
12
|
+
};
|
|
13
|
+
if (url.port)
|
|
14
|
+
out.proxy_port = Number(url.port);
|
|
15
|
+
if (url.username)
|
|
16
|
+
out.proxy_username = decodeURIComponent(url.username);
|
|
17
|
+
if (url.password)
|
|
18
|
+
out.proxy_password = decodeURIComponent(url.password);
|
|
19
|
+
return out;
|
|
20
|
+
}
|
|
21
|
+
const out = {};
|
|
22
|
+
if (proxy.protocol)
|
|
23
|
+
out.proxy_protocol = proxy.protocol.toUpperCase();
|
|
24
|
+
if (proxy.host)
|
|
25
|
+
out.proxy_host = proxy.host;
|
|
26
|
+
if (proxy.port !== undefined)
|
|
27
|
+
out.proxy_port = proxy.port;
|
|
28
|
+
if (proxy.username !== undefined)
|
|
29
|
+
out.proxy_username = proxy.username;
|
|
30
|
+
if (proxy.password !== undefined)
|
|
31
|
+
out.proxy_password = proxy.password;
|
|
32
|
+
return out;
|
|
33
|
+
}
|
|
34
|
+
export class Sessions extends APIResource {
|
|
35
|
+
files;
|
|
36
|
+
constructor(client) {
|
|
37
|
+
super(client);
|
|
38
|
+
this.files = new SessionFiles(client);
|
|
39
|
+
}
|
|
40
|
+
create(params) {
|
|
41
|
+
const { os, location, persistent = false, captcha_solver, session_name, proxy } = params;
|
|
42
|
+
const body = { os, location, persistent };
|
|
43
|
+
if (captcha_solver)
|
|
44
|
+
body.captcha_solver = true;
|
|
45
|
+
if (session_name !== undefined)
|
|
46
|
+
body.session_name = session_name;
|
|
47
|
+
Object.assign(body, normalizeProxy(proxy));
|
|
48
|
+
return this._client.request({
|
|
49
|
+
method: "POST",
|
|
50
|
+
path: "/api/v1/sessions",
|
|
51
|
+
body,
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
async list() {
|
|
55
|
+
const r = await this._client.request({
|
|
56
|
+
method: "GET",
|
|
57
|
+
path: "/api/v1/sessions",
|
|
58
|
+
});
|
|
59
|
+
return r.sessions ?? [];
|
|
60
|
+
}
|
|
61
|
+
async listActive() {
|
|
62
|
+
const r = await this._client.request({
|
|
63
|
+
method: "GET",
|
|
64
|
+
path: "/api/v1/sessions/active",
|
|
65
|
+
});
|
|
66
|
+
return r.sessions ?? [];
|
|
67
|
+
}
|
|
68
|
+
listHistory(params = {}) {
|
|
69
|
+
return this._client.request({
|
|
70
|
+
method: "GET",
|
|
71
|
+
path: "/api/v1/sessions/history",
|
|
72
|
+
query: { page: params.page ?? 1, per_page: params.perPage ?? 25 },
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
async listResumable(params = {}) {
|
|
76
|
+
const r = await this._client.request({
|
|
77
|
+
method: "GET",
|
|
78
|
+
path: "/api/v1/sessions/resumable",
|
|
79
|
+
query: { limit: params.limit ?? 10 },
|
|
80
|
+
});
|
|
81
|
+
return r.sessions ?? [];
|
|
82
|
+
}
|
|
83
|
+
/** Persistent sessions (those created with `persistent: true`), whether
|
|
84
|
+
* currently running or stopped-but-resumable. */
|
|
85
|
+
async listPersistent() {
|
|
86
|
+
const r = await this._client.request({
|
|
87
|
+
method: "GET",
|
|
88
|
+
path: "/api/v1/sessions/persistent",
|
|
89
|
+
});
|
|
90
|
+
return r.sessions ?? [];
|
|
91
|
+
}
|
|
92
|
+
async listLocations() {
|
|
93
|
+
const r = await this._client.request({
|
|
94
|
+
method: "GET",
|
|
95
|
+
path: "/api/v1/sessions/locations",
|
|
96
|
+
});
|
|
97
|
+
return r.locations ?? [];
|
|
98
|
+
}
|
|
99
|
+
get(sessionId) {
|
|
100
|
+
return this._client.request({
|
|
101
|
+
method: "GET",
|
|
102
|
+
path: `/api/v1/sessions/${encodeURIComponent(sessionId)}`,
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
async stop(sessionId) {
|
|
106
|
+
await this._client.request({
|
|
107
|
+
method: "DELETE",
|
|
108
|
+
path: `/api/v1/sessions/${encodeURIComponent(sessionId)}`,
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
resume(sessionId) {
|
|
112
|
+
return this._client.request({
|
|
113
|
+
method: "POST",
|
|
114
|
+
path: `/api/v1/sessions/${encodeURIComponent(sessionId)}/resume`,
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
async deletePersistent(sessionId) {
|
|
118
|
+
await this._client.request({
|
|
119
|
+
method: "DELETE",
|
|
120
|
+
path: `/api/v1/sessions/${encodeURIComponent(sessionId)}/persist`,
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
async waitUntilReady(sessionId, opts = {}) {
|
|
124
|
+
const timeout = opts.timeout ?? 60_000;
|
|
125
|
+
const pollInterval = opts.pollInterval ?? 500;
|
|
126
|
+
const deadline = Date.now() + timeout;
|
|
127
|
+
while (true) {
|
|
128
|
+
const session = await this.get(sessionId);
|
|
129
|
+
if (session.status === "running")
|
|
130
|
+
return session;
|
|
131
|
+
if (session.status === "failed" ||
|
|
132
|
+
session.status === "stopped" ||
|
|
133
|
+
session.status === "stopping") {
|
|
134
|
+
throw new SprntrlError(`Session ${sessionId} entered status '${session.status}' while waiting`);
|
|
135
|
+
}
|
|
136
|
+
if (Date.now() >= deadline) {
|
|
137
|
+
throw new SprntrlError(`Session ${sessionId} not ready after ${timeout}ms (status='${session.status}')`);
|
|
138
|
+
}
|
|
139
|
+
await new Promise((r) => setTimeout(r, pollInterval));
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
async connect(sessionId, opts = {}) {
|
|
143
|
+
const { connect } = await import("../lib/browser.js");
|
|
144
|
+
const session = opts.wait !== false
|
|
145
|
+
? await this.waitUntilReady(sessionId, { timeout: opts.waitTimeout })
|
|
146
|
+
: await this.get(sessionId);
|
|
147
|
+
return connect(this._client, session, {
|
|
148
|
+
framework: opts.framework ?? "playwright",
|
|
149
|
+
autoWhitelist: opts.autoWhitelist ?? false,
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Build the CDP WebSocket URL for a session. Useful for handing off to any
|
|
154
|
+
* CDP client (chrome-remote-interface, raw ws, etc.) — Playwright and
|
|
155
|
+
* Puppeteer users should use `connect()` or `browserSession()` instead.
|
|
156
|
+
*/
|
|
157
|
+
cdpUrl(sessionId) {
|
|
158
|
+
const base = new URL(this._client.baseURL);
|
|
159
|
+
const scheme = base.protocol === "https:" ? "wss:" : "ws:";
|
|
160
|
+
return `${scheme}//${base.host}/api/v1/sessions/${encodeURIComponent(sessionId)}/cdp`;
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Connect a browser, hand back a disposable handle. Exit cleanup closes the
|
|
164
|
+
* browser (does not stop the session — caller owns that).
|
|
165
|
+
*
|
|
166
|
+
* await using handle = await client.sessions.browserSession(id, { autoWhitelist: true });
|
|
167
|
+
* const page = await handle.browser.newPage();
|
|
168
|
+
*
|
|
169
|
+
* Without `await using` (Node <20.11 or TS <5.2):
|
|
170
|
+
* const handle = await client.sessions.browserSession(id);
|
|
171
|
+
* try { ... } finally { await handle.close(); }
|
|
172
|
+
*/
|
|
173
|
+
async browserSession(sessionId, opts = {}) {
|
|
174
|
+
const browser = (await this.connect(sessionId, opts));
|
|
175
|
+
let closed = false;
|
|
176
|
+
const close = async () => {
|
|
177
|
+
if (closed)
|
|
178
|
+
return;
|
|
179
|
+
closed = true;
|
|
180
|
+
try {
|
|
181
|
+
await browser.close();
|
|
182
|
+
}
|
|
183
|
+
catch {
|
|
184
|
+
// best-effort
|
|
185
|
+
}
|
|
186
|
+
};
|
|
187
|
+
const handle = {
|
|
188
|
+
browser,
|
|
189
|
+
close,
|
|
190
|
+
[Symbol.asyncDispose]: close,
|
|
191
|
+
};
|
|
192
|
+
return handle;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
//# sourceMappingURL=sessions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessions.js","sourceRoot":"","sources":["../../src/resources/sessions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { APIResource } from "../core/resource.js";
|
|
2
|
+
export class Templates extends APIResource {
|
|
3
|
+
async list() {
|
|
4
|
+
const r = await this._client.request({
|
|
5
|
+
method: "GET",
|
|
6
|
+
path: "/api/v1/templates",
|
|
7
|
+
});
|
|
8
|
+
return r.templates ?? [];
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=templates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/resources/templates.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAGlD,MAAM,OAAO,SAAU,SAAQ,WAAW;IACxC,KAAK,CAAC,IAAI;QACR,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAA4B;YAC9D,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,mBAAmB;SAC1B,CAAC,CAAC;QACH,OAAO,CAAC,CAAC,SAAS,IAAI,EAAE,CAAC;IAC3B,CAAC;CACF"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { APIResource } from "../core/resource.js";
|
|
2
|
+
export class Usage extends APIResource {
|
|
3
|
+
current() {
|
|
4
|
+
return this._client.request({
|
|
5
|
+
method: "GET",
|
|
6
|
+
path: "/api/v1/usage",
|
|
7
|
+
});
|
|
8
|
+
}
|
|
9
|
+
async history() {
|
|
10
|
+
const r = await this._client.request({
|
|
11
|
+
method: "GET",
|
|
12
|
+
path: "/api/v1/usage/history",
|
|
13
|
+
});
|
|
14
|
+
return r.months ?? [];
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=usage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usage.js","sourceRoot":"","sources":["../../src/resources/usage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAGlD,MAAM,OAAO,KAAM,SAAQ,WAAW;IACpC,OAAO;QACL,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAa;YACtC,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,eAAe;SACtB,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,OAAO;QACX,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAA2B;YAC7D,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,uBAAuB;SAC9B,CAAC,CAAC;QACH,OAAO,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC;IACxB,CAAC;CACF"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { APIResource } from "../core/resource.js";
|
|
2
|
+
import type { User as UserModel } from "../types.js";
|
|
3
|
+
export interface UserSettings {
|
|
4
|
+
/** Allow accruing hours-overage charges past the plan allowance. */
|
|
5
|
+
allow_hours_overage?: boolean;
|
|
6
|
+
/** Restrict the account to BYO proxies only (no pool proxy). */
|
|
7
|
+
byo_proxy_only?: boolean;
|
|
8
|
+
}
|
|
9
|
+
export interface ChangePasswordResult {
|
|
10
|
+
message: string;
|
|
11
|
+
/** Fresh tokens — issued so a programmatic client can swap credentials
|
|
12
|
+
* without a re-login. Absent for cookie/session-only flows. */
|
|
13
|
+
access_token?: string;
|
|
14
|
+
refresh_token?: string;
|
|
15
|
+
token_type?: string;
|
|
16
|
+
}
|
|
17
|
+
export declare class User extends APIResource {
|
|
18
|
+
me(): Promise<UserModel>;
|
|
19
|
+
update(fields: {
|
|
20
|
+
name?: string;
|
|
21
|
+
}): Promise<UserModel>;
|
|
22
|
+
/** Read the account settings (same shape as `me()`). */
|
|
23
|
+
getSettings(): Promise<UserModel>;
|
|
24
|
+
updateSettings(fields: UserSettings): Promise<UserModel>;
|
|
25
|
+
changePassword(currentPassword: string, newPassword: string): Promise<ChangePasswordResult>;
|
|
26
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { APIResource } from "../core/resource.js";
|
|
2
|
+
export class User extends APIResource {
|
|
3
|
+
me() {
|
|
4
|
+
return this._client.request({
|
|
5
|
+
method: "GET",
|
|
6
|
+
path: "/api/v1/user/me",
|
|
7
|
+
});
|
|
8
|
+
}
|
|
9
|
+
update(fields) {
|
|
10
|
+
return this._client.request({
|
|
11
|
+
method: "PUT",
|
|
12
|
+
path: "/api/v1/user/me",
|
|
13
|
+
body: fields,
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
/** Read the account settings (same shape as `me()`). */
|
|
17
|
+
getSettings() {
|
|
18
|
+
return this._client.request({
|
|
19
|
+
method: "GET",
|
|
20
|
+
path: "/api/v1/user/me/settings",
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
updateSettings(fields) {
|
|
24
|
+
return this._client.request({
|
|
25
|
+
method: "PUT",
|
|
26
|
+
path: "/api/v1/user/me/settings",
|
|
27
|
+
body: fields,
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
changePassword(currentPassword, newPassword) {
|
|
31
|
+
return this._client.request({
|
|
32
|
+
method: "PUT",
|
|
33
|
+
path: "/api/v1/user/change-password",
|
|
34
|
+
body: { current_password: currentPassword, new_password: newPassword },
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=user.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user.js","sourceRoot":"","sources":["../../src/resources/user.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAmBlD,MAAM,OAAO,IAAK,SAAQ,WAAW;IACnC,EAAE;QACA,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAY;YACrC,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,iBAAiB;SACxB,CAAC,CAAC;IACL,CAAC;IAED,MAAM,CAAC,MAAyB;QAC9B,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAY;YACrC,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,iBAAiB;YACvB,IAAI,EAAE,MAAM;SACb,CAAC,CAAC;IACL,CAAC;IAED,wDAAwD;IACxD,WAAW;QACT,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAY;YACrC,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,0BAA0B;SACjC,CAAC,CAAC;IACL,CAAC;IAED,cAAc,CAAC,MAAoB;QACjC,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAY;YACrC,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,0BAA0B;YAChC,IAAI,EAAE,MAAM;SACb,CAAC,CAAC;IACL,CAAC;IAED,cAAc,CACZ,eAAuB,EACvB,WAAmB;QAEnB,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAuB;YAChD,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,8BAA8B;YACpC,IAAI,EAAE,EAAE,gBAAgB,EAAE,eAAe,EAAE,YAAY,EAAE,WAAW,EAAE;SACvE,CAAC,CAAC;IACL,CAAC;CACF"}
|