@hyperbrowser/sdk 0.10.0 → 0.12.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/README.md CHANGED
@@ -1,6 +1,6 @@
1
- # Hyperbrowser SDK
1
+ # Hyperbrowser Node SDK
2
2
 
3
- A TypeScript/JavaScript SDK for interacting with the Hyperbrowser API.
3
+ Checkout the full documentation [here](https://docs.hyperbrowser.ai/)
4
4
 
5
5
  ## Installation
6
6
 
package/dist/client.d.ts CHANGED
@@ -3,6 +3,7 @@ import { SessionsService } from "./services/sessions";
3
3
  import { ScrapeService } from "./services/scrape";
4
4
  import { CrawlService } from "./services/crawl";
5
5
  import { ProfilesService } from "./services/profiles";
6
+ import { ExtensionService } from "./services/extensions";
6
7
  export declare class HyperbrowserError extends Error {
7
8
  statusCode?: number | undefined;
8
9
  constructor(message: string, statusCode?: number | undefined);
@@ -12,5 +13,6 @@ export declare class HyperbrowserClient {
12
13
  readonly scrape: ScrapeService;
13
14
  readonly crawl: CrawlService;
14
15
  readonly profiles: ProfilesService;
16
+ readonly extensions: ExtensionService;
15
17
  constructor(config: HyperbrowserConfig);
16
18
  }
package/dist/client.js CHANGED
@@ -5,6 +5,7 @@ const sessions_1 = require("./services/sessions");
5
5
  const scrape_1 = require("./services/scrape");
6
6
  const crawl_1 = require("./services/crawl");
7
7
  const profiles_1 = require("./services/profiles");
8
+ const extensions_1 = require("./services/extensions");
8
9
  class HyperbrowserError extends Error {
9
10
  constructor(message, statusCode) {
10
11
  super(`[Hyperbrowser]: ${message}`);
@@ -25,6 +26,7 @@ class HyperbrowserClient {
25
26
  this.scrape = new scrape_1.ScrapeService(apiKey, baseUrl, timeout);
26
27
  this.crawl = new crawl_1.CrawlService(apiKey, baseUrl, timeout);
27
28
  this.profiles = new profiles_1.ProfilesService(apiKey, baseUrl, timeout);
29
+ this.extensions = new extensions_1.ExtensionService(apiKey, baseUrl, timeout);
28
30
  }
29
31
  }
30
32
  exports.HyperbrowserClient = HyperbrowserClient;
@@ -22,12 +22,16 @@ class BaseService {
22
22
  }
23
23
  });
24
24
  }
25
+ const headerKeys = Object.keys(init?.headers || {});
26
+ const contentTypeKey = headerKeys.find((key) => key.toLowerCase() === "content-type");
25
27
  const response = await (0, node_fetch_1.default)(url.toString(), {
26
28
  ...init,
27
29
  timeout: this.timeout,
28
30
  headers: {
29
31
  "x-api-key": this.apiKey,
30
- "Content-Type": "application/json",
32
+ ...(contentTypeKey && init?.headers
33
+ ? { "content-type": init.headers[contentTypeKey] }
34
+ : { "content-type": "application/json" }),
31
35
  ...init?.headers,
32
36
  },
33
37
  });
@@ -0,0 +1,13 @@
1
+ import { CreateExtensionParams, CreateExtensionResponse, ListExtensionsResponse } from "../types/extension";
2
+ import { BaseService } from "./base";
3
+ export declare class ExtensionService extends BaseService {
4
+ /**
5
+ * Upload an extension to hyperbrowser
6
+ * @param params Configuration parameters for the new extension
7
+ */
8
+ create(params: CreateExtensionParams): Promise<CreateExtensionResponse>;
9
+ /**
10
+ * List all uploaded extensions for the account
11
+ */
12
+ list(): Promise<ListExtensionsResponse>;
13
+ }
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.ExtensionService = void 0;
7
+ const client_1 = require("../client");
8
+ const base_1 = require("./base");
9
+ const form_data_1 = __importDefault(require("form-data"));
10
+ const promises_1 = __importDefault(require("node:fs/promises"));
11
+ const node_path_1 = __importDefault(require("node:path"));
12
+ async function checkFileExists(filePath) {
13
+ try {
14
+ await promises_1.default.access(filePath, promises_1.default.constants.R_OK);
15
+ const extension = node_path_1.default.extname(filePath);
16
+ if (extension !== ".zip") {
17
+ throw new client_1.HyperbrowserError("Extension file provided is not zipped", undefined);
18
+ }
19
+ }
20
+ catch (err) {
21
+ if (err instanceof client_1.HyperbrowserError) {
22
+ throw err;
23
+ }
24
+ throw new client_1.HyperbrowserError("Could not find extension file", undefined);
25
+ }
26
+ }
27
+ class ExtensionService extends base_1.BaseService {
28
+ /**
29
+ * Upload an extension to hyperbrowser
30
+ * @param params Configuration parameters for the new extension
31
+ */
32
+ async create(params) {
33
+ try {
34
+ await checkFileExists(params.filePath);
35
+ const form = new form_data_1.default();
36
+ form.append("file", await promises_1.default.readFile(params.filePath), {
37
+ filename: node_path_1.default.basename(params.filePath),
38
+ contentType: "application/zip",
39
+ });
40
+ if (params.name) {
41
+ form.append("name", params.name);
42
+ }
43
+ const response = await this.request("/extensions/add", {
44
+ method: "POST",
45
+ body: form,
46
+ headers: form.getHeaders(),
47
+ });
48
+ return response;
49
+ }
50
+ catch (error) {
51
+ if (error instanceof client_1.HyperbrowserError) {
52
+ throw error;
53
+ }
54
+ throw new client_1.HyperbrowserError("Failed to upload extension", undefined);
55
+ }
56
+ }
57
+ /**
58
+ * List all uploaded extensions for the account
59
+ */
60
+ async list() {
61
+ try {
62
+ return await this.request("/extensions/list", { method: "GET" });
63
+ }
64
+ catch (err) {
65
+ if (err instanceof client_1.HyperbrowserError) {
66
+ throw err;
67
+ }
68
+ else {
69
+ throw new client_1.HyperbrowserError("Could not list extensions", undefined);
70
+ }
71
+ }
72
+ }
73
+ }
74
+ exports.ExtensionService = ExtensionService;
@@ -1,4 +1,4 @@
1
- export type ScrapeFormat = "markdown" | "html" | "links";
1
+ export type ScrapeFormat = "markdown" | "html" | "links" | "screenshot";
2
2
  export type ScrapeJobStatus = "pending" | "running" | "completed" | "failed";
3
3
  export type CrawlJobStatus = "pending" | "running" | "completed" | "failed";
4
4
  export type CrawlPageStatus = "completed" | "failed";
@@ -0,0 +1,13 @@
1
+ export interface CreateExtensionParams {
2
+ filePath: string;
3
+ name?: string;
4
+ }
5
+ interface ExtensionResponse {
6
+ name: string;
7
+ id: string;
8
+ createdAt: string;
9
+ updatedAt: string;
10
+ }
11
+ export type CreateExtensionResponse = ExtensionResponse;
12
+ export type ListExtensionsResponse = Array<ExtensionResponse>;
13
+ export {};
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -3,4 +3,5 @@ export { StartCrawlJobParams, StartCrawlJobResponse, CrawledPage, CrawlJobRespon
3
3
  export { StartScrapeJobParams, StartScrapeJobResponse, ScrapeJobData, ScrapeJobResponse, } from "./scrape";
4
4
  export { BasicResponse, SessionStatus, Session, SessionDetail, SessionListParams, SessionListResponse, ScreenConfig, CreateSessionParams, } from "./session";
5
5
  export { ProfileResponse, CreateProfileResponse } from "./profile";
6
+ export { CreateExtensionParams, CreateExtensionResponse, ListExtensionsResponse, } from "./extension";
6
7
  export { ScrapeJobStatus, CrawlJobStatus, Country, ISO639_1, OperatingSystem, Platform, } from "./constants";
@@ -53,6 +53,7 @@ export interface CreateSessionParams {
53
53
  annoyances?: boolean;
54
54
  enableWebRecording?: boolean;
55
55
  profile?: CreateSessionProfile;
56
+ extensionIds: Array<string>;
56
57
  }
57
58
  export interface SessionRecording {
58
59
  type: number;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hyperbrowser/sdk",
3
- "version": "0.10.0",
3
+ "version": "0.12.0",
4
4
  "description": "Node SDK for Hyperbrowser API",
5
5
  "author": "",
6
6
  "main": "dist/index.js",
@@ -25,7 +25,8 @@
25
25
  "automation"
26
26
  ],
27
27
  "dependencies": {
28
- "node-fetch": "^2.6.7"
28
+ "form-data": "^4.0.1",
29
+ "node-fetch": "2.7.0"
29
30
  },
30
31
  "devDependencies": {
31
32
  "@types/node": "^22.9.1",