@hyperbrowser/sdk 0.1.0 → 0.2.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, 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;
@@ -21,9 +22,8 @@ export declare class HyperbrowserClient {
21
22
  getSession(id: string): Promise<SessionDetail>;
22
23
  /**
23
24
  * Stop a running session
24
- * @returns true if the session was successfully stopped
25
25
  */
26
- stopSession(id: string): Promise<boolean>;
26
+ stopSession(id: string): Promise<BasicResponse>;
27
27
  /**
28
28
  * List all sessions with optional filtering
29
29
  */
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,118 @@ 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
58
77
  */
59
78
  async createSession() {
60
- return this.request("/session", { method: "POST" });
79
+ try {
80
+ return await this.request("/session", { method: "POST" });
81
+ }
82
+ catch (error) {
83
+ if (error instanceof HyperbrowserError) {
84
+ throw error;
85
+ }
86
+ throw new HyperbrowserError("Failed to create session", undefined, undefined, error instanceof Error ? error : undefined);
87
+ }
61
88
  }
62
89
  /**
63
90
  * Get details of an existing session
64
91
  */
65
92
  async getSession(id) {
66
- return this.request(`/session/${id}`);
93
+ try {
94
+ return await this.request(`/session/${id}`);
95
+ }
96
+ catch (error) {
97
+ if (error instanceof HyperbrowserError) {
98
+ throw error;
99
+ }
100
+ throw new HyperbrowserError(`Failed to get session ${id}`, undefined, undefined, error instanceof Error ? error : undefined);
101
+ }
67
102
  }
68
103
  /**
69
104
  * Stop a running session
70
- * @returns true if the session was successfully stopped
71
105
  */
72
106
  async stopSession(id) {
73
107
  try {
74
- await this.request(`/session/${id}/stop`, { method: "PUT" });
75
- return true;
108
+ return await this.request(`/session/${id}/stop`, {
109
+ method: "PUT",
110
+ });
76
111
  }
77
112
  catch (error) {
78
- if (error instanceof HyperbrowserError && error.statusCode && error.statusCode > 300) {
79
- return false;
113
+ if (error instanceof HyperbrowserError) {
114
+ throw error;
80
115
  }
81
- throw error;
116
+ throw new HyperbrowserError(`Failed to stop session ${id}`, undefined, undefined, error instanceof Error ? error : undefined);
82
117
  }
83
118
  }
84
119
  /**
85
120
  * List all sessions with optional filtering
86
121
  */
87
122
  async listSessions(params = {}) {
88
- return this.request("/sessions", undefined, {
89
- status: params.status,
90
- page: params.page,
91
- });
123
+ try {
124
+ return await this.request("/sessions", undefined, {
125
+ status: params.status,
126
+ page: params.page,
127
+ });
128
+ }
129
+ catch (error) {
130
+ if (error instanceof HyperbrowserError) {
131
+ throw error;
132
+ }
133
+ throw new HyperbrowserError("Failed to list sessions", undefined, undefined, error instanceof Error ? error : undefined);
134
+ }
92
135
  }
93
136
  }
94
137
  exports.HyperbrowserClient = HyperbrowserClient;
@@ -1,4 +1,7 @@
1
1
  export type SessionStatus = "active" | "closed" | "error";
2
+ export interface BasicResponse {
3
+ success: boolean;
4
+ }
2
5
  export interface Session {
3
6
  id: string;
4
7
  teamId: string;
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.2.0",
4
+ "description": "Node SDK for Hyperbrowser API",
5
5
  "author": "",
6
6
  "main": "dist/index.js",
7
7
  "types": "dist/index.d.ts",