@hyperbrowser/sdk
Advanced tools
Comparing version 0.1.0 to 0.2.0
import { Response } from "node-fetch"; | ||
import { HyperbrowserConfig } from "./types/config"; | ||
import { SessionDetail, SessionListParams, SessionListResponse } from "./types/session"; | ||
import { BasicResponse, SessionDetail, SessionListParams, SessionListResponse } from "./types/session"; | ||
export declare class HyperbrowserError extends Error { | ||
statusCode?: number | undefined; | ||
response?: Response | undefined; | ||
constructor(message: string, statusCode?: number | undefined, response?: Response | undefined); | ||
originalError?: Error | undefined; | ||
constructor(message: string, statusCode?: number | undefined, response?: Response | undefined, originalError?: Error | undefined); | ||
} | ||
@@ -24,5 +25,4 @@ export declare class HyperbrowserClient { | ||
* Stop a running session | ||
* @returns true if the session was successfully stopped | ||
*/ | ||
stopSession(id: string): Promise<boolean>; | ||
stopSession(id: string): Promise<BasicResponse>; | ||
/** | ||
@@ -29,0 +29,0 @@ * List all sessions with optional filtering |
@@ -9,6 +9,7 @@ "use strict"; | ||
class HyperbrowserError extends Error { | ||
constructor(message, statusCode, response) { | ||
super(message); | ||
constructor(message, statusCode, response, originalError) { | ||
super(`[Hyperbrowser]: ${message}`); | ||
this.statusCode = statusCode; | ||
this.response = response; | ||
this.originalError = originalError; | ||
this.name = "HyperbrowserError"; | ||
@@ -23,34 +24,52 @@ } | ||
if (!this.apiKey) { | ||
throw new Error("API key is required"); | ||
throw new HyperbrowserError("API key is required"); | ||
} | ||
} | ||
async request(path, init, params) { | ||
const url = new URL(`${this.baseUrl}/api${path}`); | ||
if (params) { | ||
Object.entries(params).forEach(([key, value]) => { | ||
if (value !== undefined) { | ||
url.searchParams.append(key, value.toString()); | ||
try { | ||
const url = new URL(`${this.baseUrl}/api${path}`); | ||
if (params) { | ||
Object.entries(params).forEach(([key, value]) => { | ||
if (value !== undefined) { | ||
url.searchParams.append(key, value.toString()); | ||
} | ||
}); | ||
} | ||
const response = await (0, node_fetch_1.default)(url.toString(), { | ||
...init, | ||
headers: { | ||
"x-api-key": this.apiKey, | ||
"Content-Type": "application/json", | ||
...init?.headers, | ||
}, | ||
}); | ||
if (!response.ok) { | ||
let errorMessage; | ||
try { | ||
const errorData = await response.json(); | ||
errorMessage = | ||
errorData.message || errorData.error || `HTTP error! status: ${response.status}`; | ||
} | ||
}); | ||
catch { | ||
errorMessage = `HTTP error! status: ${response.status}`; | ||
} | ||
throw new HyperbrowserError(errorMessage, response.status, response); | ||
} | ||
if (response.headers.get("content-length") === "0") { | ||
return {}; | ||
} | ||
try { | ||
return (await response.json()); | ||
} | ||
catch (error) { | ||
throw new HyperbrowserError("Failed to parse JSON response", response.status, response, error instanceof Error ? error : undefined); | ||
} | ||
} | ||
const response = await (0, node_fetch_1.default)(url.toString(), { | ||
...init, | ||
headers: { | ||
"x-api-key": this.apiKey, | ||
"Content-Type": "application/json", | ||
...init?.headers, | ||
}, | ||
}); | ||
if (!response.ok) { | ||
throw new HyperbrowserError(`HTTP error! status: ${response.status}`, response.status, response); | ||
} | ||
// Handle empty responses (like for stop session) | ||
if (response.headers.get("content-length") === "0") { | ||
return {}; | ||
} | ||
try { | ||
return (await response.json()); | ||
} | ||
catch (error) { | ||
throw new HyperbrowserError("Failed to parse JSON response", response.status, response); | ||
// If it's already a HyperbrowserError, rethrow it | ||
if (error instanceof HyperbrowserError) { | ||
throw error; | ||
} | ||
// Convert other errors to HyperbrowserError | ||
throw new HyperbrowserError(error instanceof Error ? error.message : "Unknown error occurred", undefined, undefined, error instanceof Error ? error : undefined); | ||
} | ||
@@ -62,3 +81,11 @@ } | ||
async createSession() { | ||
return this.request("/session", { method: "POST" }); | ||
try { | ||
return await this.request("/session", { method: "POST" }); | ||
} | ||
catch (error) { | ||
if (error instanceof HyperbrowserError) { | ||
throw error; | ||
} | ||
throw new HyperbrowserError("Failed to create session", undefined, undefined, error instanceof Error ? error : undefined); | ||
} | ||
} | ||
@@ -69,18 +96,26 @@ /** | ||
async getSession(id) { | ||
return this.request(`/session/${id}`); | ||
try { | ||
return await this.request(`/session/${id}`); | ||
} | ||
catch (error) { | ||
if (error instanceof HyperbrowserError) { | ||
throw error; | ||
} | ||
throw new HyperbrowserError(`Failed to get session ${id}`, undefined, undefined, error instanceof Error ? error : undefined); | ||
} | ||
} | ||
/** | ||
* Stop a running session | ||
* @returns true if the session was successfully stopped | ||
*/ | ||
async stopSession(id) { | ||
try { | ||
await this.request(`/session/${id}/stop`, { method: "PUT" }); | ||
return true; | ||
return await this.request(`/session/${id}/stop`, { | ||
method: "PUT", | ||
}); | ||
} | ||
catch (error) { | ||
if (error instanceof HyperbrowserError && error.statusCode && error.statusCode > 300) { | ||
return false; | ||
if (error instanceof HyperbrowserError) { | ||
throw error; | ||
} | ||
throw error; | ||
throw new HyperbrowserError(`Failed to stop session ${id}`, undefined, undefined, error instanceof Error ? error : undefined); | ||
} | ||
@@ -92,8 +127,16 @@ } | ||
async listSessions(params = {}) { | ||
return this.request("/sessions", undefined, { | ||
status: params.status, | ||
page: params.page, | ||
}); | ||
try { | ||
return await this.request("/sessions", undefined, { | ||
status: params.status, | ||
page: params.page, | ||
}); | ||
} | ||
catch (error) { | ||
if (error instanceof HyperbrowserError) { | ||
throw error; | ||
} | ||
throw new HyperbrowserError("Failed to list sessions", undefined, undefined, error instanceof Error ? error : undefined); | ||
} | ||
} | ||
} | ||
exports.HyperbrowserClient = HyperbrowserClient; |
export type SessionStatus = "active" | "closed" | "error"; | ||
export interface BasicResponse { | ||
success: boolean; | ||
} | ||
export interface Session { | ||
@@ -3,0 +6,0 @@ id: string; |
{ | ||
"name": "@hyperbrowser/sdk", | ||
"version": "0.1.0", | ||
"description": "Javascript SDK for Hyperbrowser API", | ||
"version": "0.2.0", | ||
"description": "Node SDK for Hyperbrowser API", | ||
"author": "", | ||
@@ -6,0 +6,0 @@ "main": "dist/index.js", |
11154
248