@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 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
- constructor(message: string, statusCode?: number | undefined, response?: Response | undefined);
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<boolean>;
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 Error("API key is required");
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
- return (await response.json());
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
- throw new HyperbrowserError("Failed to parse JSON response", response.status, response);
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
- return this.request("/session", { method: "POST" });
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
- return this.request(`/session/${id}`);
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`, { method: "PUT" });
75
- return true;
112
+ return await this.request(`/session/${id}/stop`, {
113
+ method: "PUT",
114
+ });
76
115
  }
77
116
  catch (error) {
78
- if (error instanceof HyperbrowserError && error.statusCode && error.statusCode > 300) {
79
- return false;
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
- return this.request("/sessions", undefined, {
89
- status: params.status,
90
- page: params.page,
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";
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -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
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@hyperbrowser/sdk",
3
- "version": "0.1.0",
4
- "description": "Javascript SDK for Hyperbrowser API",
3
+ "version": "0.3.0",
4
+ "description": "Node SDK for Hyperbrowser API",
5
5
  "author": "",
6
6
  "main": "dist/index.js",
7
7
  "types": "dist/index.d.ts",