@hyperbrowser/sdk 0.1.0 → 0.3.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/dist/client.d.ts +6 -5
- package/dist/client.js +88 -41
- package/dist/types/constants.d.ts +4 -0
- package/dist/types/constants.js +2 -0
- package/dist/types/session.d.ts +21 -0
- package/package.json +2 -2
package/dist/client.d.ts
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { Response } from "node-fetch";
|
|
2
2
|
import { HyperbrowserConfig } from "./types/config";
|
|
3
|
-
import { SessionDetail, SessionListParams, SessionListResponse } from "./types/session";
|
|
3
|
+
import { BasicResponse, CreateSessionParams, SessionDetail, SessionListParams, SessionListResponse } from "./types/session";
|
|
4
4
|
export declare class HyperbrowserError extends Error {
|
|
5
5
|
statusCode?: number | undefined;
|
|
6
6
|
response?: Response | undefined;
|
|
7
|
-
|
|
7
|
+
originalError?: Error | undefined;
|
|
8
|
+
constructor(message: string, statusCode?: number | undefined, response?: Response | undefined, originalError?: Error | undefined);
|
|
8
9
|
}
|
|
9
10
|
export declare class HyperbrowserClient {
|
|
10
11
|
private readonly apiKey;
|
|
@@ -13,17 +14,17 @@ export declare class HyperbrowserClient {
|
|
|
13
14
|
private request;
|
|
14
15
|
/**
|
|
15
16
|
* Create a new browser session
|
|
17
|
+
* @param params Configuration parameters for the new session
|
|
16
18
|
*/
|
|
17
|
-
createSession(): Promise<SessionDetail>;
|
|
19
|
+
createSession(params?: CreateSessionParams): Promise<SessionDetail>;
|
|
18
20
|
/**
|
|
19
21
|
* Get details of an existing session
|
|
20
22
|
*/
|
|
21
23
|
getSession(id: string): Promise<SessionDetail>;
|
|
22
24
|
/**
|
|
23
25
|
* Stop a running session
|
|
24
|
-
* @returns true if the session was successfully stopped
|
|
25
26
|
*/
|
|
26
|
-
stopSession(id: string): Promise<
|
|
27
|
+
stopSession(id: string): Promise<BasicResponse>;
|
|
27
28
|
/**
|
|
28
29
|
* List all sessions with optional filtering
|
|
29
30
|
*/
|
package/dist/client.js
CHANGED
|
@@ -6,10 +6,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
exports.HyperbrowserClient = exports.HyperbrowserError = void 0;
|
|
7
7
|
const node_fetch_1 = __importDefault(require("node-fetch"));
|
|
8
8
|
class HyperbrowserError extends Error {
|
|
9
|
-
constructor(message, statusCode, response) {
|
|
10
|
-
super(message);
|
|
9
|
+
constructor(message, statusCode, response, originalError) {
|
|
10
|
+
super(`[Hyperbrowser]: ${message}`);
|
|
11
11
|
this.statusCode = statusCode;
|
|
12
12
|
this.response = response;
|
|
13
|
+
this.originalError = originalError;
|
|
13
14
|
this.name = "HyperbrowserError";
|
|
14
15
|
}
|
|
15
16
|
}
|
|
@@ -19,76 +20,122 @@ class HyperbrowserClient {
|
|
|
19
20
|
this.apiKey = config.apiKey;
|
|
20
21
|
this.baseUrl = config.baseUrl || "https://app.hyperbrowser.ai";
|
|
21
22
|
if (!this.apiKey) {
|
|
22
|
-
throw new
|
|
23
|
+
throw new HyperbrowserError("API key is required");
|
|
23
24
|
}
|
|
24
25
|
}
|
|
25
26
|
async request(path, init, params) {
|
|
26
|
-
const url = new URL(`${this.baseUrl}/api${path}`);
|
|
27
|
-
if (params) {
|
|
28
|
-
Object.entries(params).forEach(([key, value]) => {
|
|
29
|
-
if (value !== undefined) {
|
|
30
|
-
url.searchParams.append(key, value.toString());
|
|
31
|
-
}
|
|
32
|
-
});
|
|
33
|
-
}
|
|
34
|
-
const response = await (0, node_fetch_1.default)(url.toString(), {
|
|
35
|
-
...init,
|
|
36
|
-
headers: {
|
|
37
|
-
"x-api-key": this.apiKey,
|
|
38
|
-
"Content-Type": "application/json",
|
|
39
|
-
...init?.headers,
|
|
40
|
-
},
|
|
41
|
-
});
|
|
42
|
-
if (!response.ok) {
|
|
43
|
-
throw new HyperbrowserError(`HTTP error! status: ${response.status}`, response.status, response);
|
|
44
|
-
}
|
|
45
|
-
// Handle empty responses (like for stop session)
|
|
46
|
-
if (response.headers.get("content-length") === "0") {
|
|
47
|
-
return {};
|
|
48
|
-
}
|
|
49
27
|
try {
|
|
50
|
-
|
|
28
|
+
const url = new URL(`${this.baseUrl}/api${path}`);
|
|
29
|
+
if (params) {
|
|
30
|
+
Object.entries(params).forEach(([key, value]) => {
|
|
31
|
+
if (value !== undefined) {
|
|
32
|
+
url.searchParams.append(key, value.toString());
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
const response = await (0, node_fetch_1.default)(url.toString(), {
|
|
37
|
+
...init,
|
|
38
|
+
headers: {
|
|
39
|
+
"x-api-key": this.apiKey,
|
|
40
|
+
"Content-Type": "application/json",
|
|
41
|
+
...init?.headers,
|
|
42
|
+
},
|
|
43
|
+
});
|
|
44
|
+
if (!response.ok) {
|
|
45
|
+
let errorMessage;
|
|
46
|
+
try {
|
|
47
|
+
const errorData = await response.json();
|
|
48
|
+
errorMessage =
|
|
49
|
+
errorData.message || errorData.error || `HTTP error! status: ${response.status}`;
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
errorMessage = `HTTP error! status: ${response.status}`;
|
|
53
|
+
}
|
|
54
|
+
throw new HyperbrowserError(errorMessage, response.status, response);
|
|
55
|
+
}
|
|
56
|
+
if (response.headers.get("content-length") === "0") {
|
|
57
|
+
return {};
|
|
58
|
+
}
|
|
59
|
+
try {
|
|
60
|
+
return (await response.json());
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
throw new HyperbrowserError("Failed to parse JSON response", response.status, response, error instanceof Error ? error : undefined);
|
|
64
|
+
}
|
|
51
65
|
}
|
|
52
66
|
catch (error) {
|
|
53
|
-
|
|
67
|
+
// If it's already a HyperbrowserError, rethrow it
|
|
68
|
+
if (error instanceof HyperbrowserError) {
|
|
69
|
+
throw error;
|
|
70
|
+
}
|
|
71
|
+
// Convert other errors to HyperbrowserError
|
|
72
|
+
throw new HyperbrowserError(error instanceof Error ? error.message : "Unknown error occurred", undefined, undefined, error instanceof Error ? error : undefined);
|
|
54
73
|
}
|
|
55
74
|
}
|
|
56
75
|
/**
|
|
57
76
|
* Create a new browser session
|
|
77
|
+
* @param params Configuration parameters for the new session
|
|
58
78
|
*/
|
|
59
|
-
async createSession() {
|
|
60
|
-
|
|
79
|
+
async createSession(params) {
|
|
80
|
+
try {
|
|
81
|
+
return await this.request("/session", {
|
|
82
|
+
method: "POST",
|
|
83
|
+
body: params ? JSON.stringify(params) : undefined,
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
catch (error) {
|
|
87
|
+
if (error instanceof HyperbrowserError) {
|
|
88
|
+
throw error;
|
|
89
|
+
}
|
|
90
|
+
throw new HyperbrowserError("Failed to create session", undefined, undefined, error instanceof Error ? error : undefined);
|
|
91
|
+
}
|
|
61
92
|
}
|
|
62
93
|
/**
|
|
63
94
|
* Get details of an existing session
|
|
64
95
|
*/
|
|
65
96
|
async getSession(id) {
|
|
66
|
-
|
|
97
|
+
try {
|
|
98
|
+
return await this.request(`/session/${id}`);
|
|
99
|
+
}
|
|
100
|
+
catch (error) {
|
|
101
|
+
if (error instanceof HyperbrowserError) {
|
|
102
|
+
throw error;
|
|
103
|
+
}
|
|
104
|
+
throw new HyperbrowserError(`Failed to get session ${id}`, undefined, undefined, error instanceof Error ? error : undefined);
|
|
105
|
+
}
|
|
67
106
|
}
|
|
68
107
|
/**
|
|
69
108
|
* Stop a running session
|
|
70
|
-
* @returns true if the session was successfully stopped
|
|
71
109
|
*/
|
|
72
110
|
async stopSession(id) {
|
|
73
111
|
try {
|
|
74
|
-
await this.request(`/session/${id}/stop`, {
|
|
75
|
-
|
|
112
|
+
return await this.request(`/session/${id}/stop`, {
|
|
113
|
+
method: "PUT",
|
|
114
|
+
});
|
|
76
115
|
}
|
|
77
116
|
catch (error) {
|
|
78
|
-
if (error instanceof HyperbrowserError
|
|
79
|
-
|
|
117
|
+
if (error instanceof HyperbrowserError) {
|
|
118
|
+
throw error;
|
|
80
119
|
}
|
|
81
|
-
throw error;
|
|
120
|
+
throw new HyperbrowserError(`Failed to stop session ${id}`, undefined, undefined, error instanceof Error ? error : undefined);
|
|
82
121
|
}
|
|
83
122
|
}
|
|
84
123
|
/**
|
|
85
124
|
* List all sessions with optional filtering
|
|
86
125
|
*/
|
|
87
126
|
async listSessions(params = {}) {
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
127
|
+
try {
|
|
128
|
+
return await this.request("/sessions", undefined, {
|
|
129
|
+
status: params.status,
|
|
130
|
+
page: params.page,
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
catch (error) {
|
|
134
|
+
if (error instanceof HyperbrowserError) {
|
|
135
|
+
throw error;
|
|
136
|
+
}
|
|
137
|
+
throw new HyperbrowserError("Failed to list sessions", undefined, undefined, error instanceof Error ? error : undefined);
|
|
138
|
+
}
|
|
92
139
|
}
|
|
93
140
|
}
|
|
94
141
|
exports.HyperbrowserClient = HyperbrowserClient;
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export type Country = "AD" | "AE" | "AF" | "AL" | "AM" | "AO" | "AR" | "AT" | "AU" | "AW" | "AZ" | "BA" | "BD" | "BE" | "BG" | "BH" | "BJ" | "BO" | "BR" | "BS" | "BT" | "BY" | "BZ" | "CA" | "CF" | "CH" | "CI" | "CL" | "CM" | "CN" | "CO" | "CR" | "CU" | "CY" | "CZ" | "DE" | "DJ" | "DK" | "DM" | "EC" | "EE" | "EG" | "ES" | "ET" | "EU" | "FI" | "FJ" | "FR" | "GB" | "GE" | "GH" | "GM" | "GR" | "HK" | "HN" | "HR" | "HT" | "HU" | "ID" | "IE" | "IL" | "IN" | "IQ" | "IR" | "IS" | "IT" | "JM" | "JO" | "JP" | "KE" | "KH" | "KR" | "KW" | "KZ" | "LB" | "LI" | "LR" | "LT" | "LU" | "LV" | "MA" | "MC" | "MD" | "ME" | "MG" | "MK" | "ML" | "MM" | "MN" | "MR" | "MT" | "MU" | "MV" | "MX" | "MY" | "MZ" | "NG" | "NL" | "NO" | "NZ" | "OM" | "PA" | "PE" | "PH" | "PK" | "PL" | "PR" | "PT" | "PY" | "QA" | "RANDOM_COUNTRY" | "RO" | "RS" | "RU" | "SA" | "SC" | "SD" | "SE" | "SG" | "SI" | "SK" | "SN" | "SS" | "TD" | "TG" | "TH" | "TM" | "TN" | "TR" | "TT" | "TW" | "UA" | "UG" | "US" | "UY" | "UZ" | "VE" | "VG" | "VN" | "YE" | "ZA" | "ZM" | "ZW" | "ad" | "ae" | "af" | "al" | "am" | "ao" | "ar" | "at" | "au" | "aw" | "az" | "ba" | "bd" | "be" | "bg" | "bh" | "bj" | "bo" | "br" | "bs" | "bt" | "by" | "bz" | "ca" | "cf" | "ch" | "ci" | "cl" | "cm" | "cn" | "co" | "cr" | "cu" | "cy" | "cz" | "de" | "dj" | "dk" | "dm" | "ec" | "ee" | "eg" | "es" | "et" | "eu" | "fi" | "fj" | "fr" | "gb" | "ge" | "gh" | "gm" | "gr" | "hk" | "hn" | "hr" | "ht" | "hu" | "id" | "ie" | "il" | "in" | "iq" | "ir" | "is" | "it" | "jm" | "jo" | "jp" | "ke" | "kh" | "kr" | "kw" | "kz" | "lb" | "li" | "lr" | "lt" | "lu" | "lv" | "ma" | "mc" | "md" | "me" | "mg" | "mk" | "ml" | "mm" | "mn" | "mr" | "mt" | "mu" | "mv" | "mx" | "my" | "mz" | "ng" | "nl" | "no" | "nz" | "om" | "pa" | "pe" | "ph" | "pk" | "pl" | "pr" | "pt" | "py" | "qa" | "ro" | "rs" | "ru" | "sa" | "sc" | "sd" | "se" | "sg" | "si" | "sk" | "sn" | "ss" | "td" | "tg" | "th" | "tm" | "tn" | "tr" | "tt" | "tw" | "ua" | "ug" | "us" | "uy" | "uz" | "ve" | "vg" | "vn" | "ye" | "za" | "zm" | "zw";
|
|
2
|
+
export type OperatingSystem = "windows" | "android" | "macos" | "linux" | "ios";
|
|
3
|
+
export type Platform = "chrome" | "firefox" | "safari" | "edge";
|
|
4
|
+
export type ISO639_1 = "aa" | "ab" | "ae" | "af" | "ak" | "am" | "an" | "ar" | "as" | "av" | "ay" | "az" | "ba" | "be" | "bg" | "bh" | "bi" | "bm" | "bn" | "bo" | "br" | "bs" | "ca" | "ce" | "ch" | "co" | "cr" | "cs" | "cu" | "cv" | "cy" | "da" | "de" | "dv" | "dz" | "ee" | "el" | "en" | "eo" | "es" | "et" | "eu" | "fa" | "ff" | "fi" | "fj" | "fo" | "fr" | "fy" | "ga" | "gd" | "gl" | "gn" | "gu" | "gv" | "ha" | "he" | "hi" | "ho" | "hr" | "ht" | "hu" | "hy" | "hz" | "ia" | "id" | "ie" | "ig" | "ii" | "ik" | "io" | "is" | "it" | "iu" | "ja" | "jv" | "ka" | "kg" | "ki" | "kj" | "kk" | "kl" | "km" | "kn" | "ko" | "kr" | "ks" | "ku" | "kv" | "kw" | "ky" | "la" | "lb" | "lg" | "li" | "ln" | "lo" | "lt" | "lu" | "lv" | "mg" | "mh" | "mi" | "mk" | "ml" | "mn" | "mo" | "mr" | "ms" | "mt" | "my" | "na" | "nb" | "nd" | "ne" | "ng" | "nl" | "nn" | "no" | "nr" | "nv" | "ny" | "oc" | "oj" | "om" | "or" | "os" | "pa" | "pi" | "pl" | "ps" | "pt" | "qu" | "rm" | "rn" | "ro" | "ru" | "rw" | "sa" | "sc" | "sd" | "se" | "sg" | "si" | "sk" | "sl" | "sm" | "sn" | "so" | "sq" | "sr" | "ss" | "st" | "su" | "sv" | "sw" | "ta" | "te" | "tg" | "th" | "ti" | "tk" | "tl" | "tn" | "to" | "tr" | "ts" | "tt" | "tw" | "ty" | "ug" | "uk" | "ur" | "uz" | "ve" | "vi" | "vo" | "wa" | "wo" | "xh" | "yi" | "yo" | "za" | "zh" | "zu";
|
package/dist/types/session.d.ts
CHANGED
|
@@ -1,4 +1,8 @@
|
|
|
1
|
+
import { Country, ISO639_1, OperatingSystem, Platform } from "./constants";
|
|
1
2
|
export type SessionStatus = "active" | "closed" | "error";
|
|
3
|
+
export interface BasicResponse {
|
|
4
|
+
success: boolean;
|
|
5
|
+
}
|
|
2
6
|
export interface Session {
|
|
3
7
|
id: string;
|
|
4
8
|
teamId: string;
|
|
@@ -22,3 +26,20 @@ export interface SessionListResponse {
|
|
|
22
26
|
page: number;
|
|
23
27
|
perPage: number;
|
|
24
28
|
}
|
|
29
|
+
export interface ScreenConfig {
|
|
30
|
+
maxWidth: number;
|
|
31
|
+
maxHeight: number;
|
|
32
|
+
minWidth: number;
|
|
33
|
+
minHeight: number;
|
|
34
|
+
}
|
|
35
|
+
export interface CreateSessionParams {
|
|
36
|
+
proxyServer?: string;
|
|
37
|
+
proxyServerPassword?: string;
|
|
38
|
+
proxyServerUsername?: string;
|
|
39
|
+
proxyCountry?: Country;
|
|
40
|
+
operatingSystems?: OperatingSystem[];
|
|
41
|
+
device?: ("desktop" | "mobile")[];
|
|
42
|
+
platform?: Platform[];
|
|
43
|
+
locales?: ISO639_1[];
|
|
44
|
+
screen?: ScreenConfig;
|
|
45
|
+
}
|
package/package.json
CHANGED