@monostate/browsernative-client
Version:
Browser Native client SDK for web scraping and content extraction API
372 lines (337 loc) • 9.94 kB
TypeScript
/**
* Browser Native Client SDK TypeScript Definitions
*/
export interface ClientOptions {
/** Base URL for the API (default: https://bnca-api.fly.dev) */
baseUrl?: string;
/** Request timeout in milliseconds (default: 30000) */
timeout?: number;
/** Number of retry attempts (default: 2) */
retries?: number;
/** Enable verbose logging (default: false) */
verbose?: boolean;
}
export interface ScrapeOptions {
/** Force a specific scraping method */
method?: 'auto' | 'direct' | 'lightpanda' | 'puppeteer';
/** Include screenshot in the response */
includeScreenshot?: boolean;
/** Wait for specific selector before extracting content */
waitForSelector?: string;
/** Custom user agent string */
userAgent?: string;
/** Viewport size for rendering */
viewport?: {
width: number;
height: number;
};
/** Additional metadata to extract */
extractMetadata?: boolean;
}
export interface BulkScrapeOptions extends ScrapeOptions {
/** Number of concurrent requests (default: 5) */
concurrency?: number;
/** Continue on error (default: true) */
continueOnError?: boolean;
/** Progress callback */
progressCallback?: (progress: { processed: number; total: number; percentage: number }) => void;
}
export interface BulkScrapeResult {
results: Array<ScrapeResult & { url: string }>;
stats: {
total: number;
successful: number;
failed: number;
totalTime: number;
averageTime: number;
};
}
export interface ScreenshotOptions extends ScrapeOptions {
/** Force full page screenshot */
fullPage?: boolean;
/** Image format (default: png) */
format?: 'png' | 'jpeg' | 'webp';
/** Image quality for JPEG (1-100) */
quality?: number;
}
export interface AnalyzeOptions extends ScrapeOptions {
/** Language for the AI response */
language?: 'en' | 'pt' | 'es' | 'fr' | 'de' | 'auto';
/** Response style */
style?: 'concise' | 'detailed' | 'technical';
}
export interface ScrapeResult {
/** Whether the request was successful */
success: boolean;
/** Extracted content data */
data?: {
title?: string;
description?: string;
content?: string;
metadata?: Record<string, any>;
links?: string[];
images?: string[];
};
/** Scraping method used */
method?: 'direct' | 'lightpanda' | 'puppeteer';
/** Performance information */
performance?: {
totalTime: number;
method: string;
};
/** Base64 encoded screenshot (if requested) */
screenshot?: string;
/** Error message (if failed) */
error?: string;
/** Response time in milliseconds */
responseTime: number;
/** Attempt number that succeeded */
attempt?: number;
}
export interface AnalyzeResult {
/** Whether the request was successful */
success: boolean;
/** API response data */
data?: {
/** Whether the inner request was successful */
success?: boolean;
/** The answer from AI analysis */
answer?: string;
/** Metadata about the request */
metadata?: {
url: string;
question: string;
method: string;
timestamp: string;
performance: {
totalTime: number;
};
screenshot?: string | null;
};
};
/** Error message (if failed) */
error?: string;
/** Response time in milliseconds */
responseTime: number;
/** Attempt number that succeeded */
attempt?: number;
}
export interface UsageResult {
success: boolean;
data?: {
/** Daily usage breakdown */
dailyUsage: Array<{
date: string;
requests: number;
scrapeRequests: number;
analyzeRequests: number;
}>;
/** Monthly totals */
monthlyTotal: {
totalRequests: number;
scrapeTotal: number;
analyzeTotal: number;
};
/** Current plan information */
currentUsage: number;
usageLimit: number;
planType: string;
subscriptionStatus: string;
currentPeriodEnd: string;
};
error?: string;
responseTime: number;
}
export interface HealthResult {
success: boolean;
data?: {
status: 'healthy' | 'degraded' | 'unhealthy';
version: string;
uptime: number;
services: {
scraping: boolean;
ai: boolean;
database: boolean;
};
};
error?: string;
responseTime: number;
}
export interface SessionOptions {
/** Browser mode (default: 'auto') */
mode?: 'auto' | 'headless' | 'visual' | 'computer-use';
/** Screen width for computer-use mode */
screenWidth?: number;
/** Screen height for computer-use mode */
screenHeight?: number;
}
export interface PageState {
url: string;
title: string;
content?: string;
screenshot?: string;
interactiveElements?: Array<{
tag: string;
text?: string;
selector: string;
type?: string;
href?: string;
}>;
}
export interface FallbackEvent {
type: 'fallback';
from: string;
to: string;
reason: string;
}
export interface ClosedEvent {
type: 'closed';
reason: string;
}
export interface Cookie {
name: string;
value: string;
domain?: string;
path?: string;
expires?: number;
httpOnly?: boolean;
secure?: boolean;
sameSite?: 'Strict' | 'Lax' | 'None';
}
/**
* Persistent browser session over WebSocket
*/
export declare class BrowserSession {
/** Session ID assigned by the server */
sessionId: string | null;
/** Current browser backend ('lightpanda', 'chrome', or 'computer-use') */
backend: string | null;
/** VNC URL for computer-use mode (null otherwise) */
vncUrl: string | null;
/** Navigate to a URL */
goto(url: string): Promise<any>;
/** Click an element */
click(selector: string, options?: { timeout?: number }): Promise<any>;
/** Type text into an element */
type(selector: string, text: string, options?: { clear?: boolean; delay?: number }): Promise<any>;
/** Scroll the page */
scroll(direction?: 'up' | 'down', amount?: number): Promise<any>;
/** Hover over an element */
hover(selector: string): Promise<any>;
/** Select option(s) in a dropdown */
select(selector: string, ...values: string[]): Promise<any>;
/** Press a keyboard key */
pressKey(key: string): Promise<any>;
/** Navigate back */
goBack(): Promise<any>;
/** Navigate forward */
goForward(): Promise<any>;
/** Take a screenshot */
screenshot(options?: { fullPage?: boolean; type?: 'png' | 'jpeg' | 'webp'; quality?: number }): Promise<any>;
/** Get current page state with interactive elements */
getPageState(options?: { includeScreenshot?: boolean }): Promise<PageState>;
/** Extract page content as structured data */
extractContent(): Promise<any>;
/** Wait for a selector to appear */
waitFor(selector: string, timeout?: number): Promise<any>;
/** Evaluate JavaScript in the page context */
evaluate(fn: string): Promise<any>;
/** Get all cookies */
getCookies(): Promise<Cookie[]>;
/** Set cookies */
setCookies(cookies: Cookie[]): Promise<any>;
/** Coordinate-based actions (computer-use mode) */
mouseMove(x: number, y: number): Promise<any>;
clickAt(x: number, y: number, button?: 'left' | 'right' | 'middle'): Promise<any>;
doubleClickAt(x: number, y: number, button?: 'left' | 'right' | 'middle'): Promise<any>;
drag(startX: number, startY: number, endX: number, endY: number): Promise<any>;
scrollAt(x: number, y: number, direction: 'up' | 'down', amount?: number): Promise<any>;
typeText(text: string): Promise<any>;
getCursorPosition(): Promise<{ x: number; y: number }>;
getScreenSize(): Promise<{ width: number; height: number }>;
/** Listen for session events */
on(event: 'fallback', handler: (event: FallbackEvent) => void): this;
on(event: 'closed', handler: (event: ClosedEvent) => void): this;
/** Close the session */
close(): void;
}
/**
* Browser Native API Client
*/
export declare class BrowserNativeClient {
constructor(apiKey: string, options?: ClientOptions);
/**
* Scrape a webpage and extract structured content
*/
scrape(url: string, options?: ScrapeOptions): Promise<ScrapeResult>;
/**
* Scrape a webpage and take a screenshot
*/
screenshot(url: string, options?: ScreenshotOptions): Promise<ScrapeResult>;
/**
* Quick screenshot capture - optimized for speed
*/
quickshot(url: string, options?: ScreenshotOptions): Promise<ScrapeResult>;
/**
* Extract content and answer questions using AI
*/
analyze(url: string, question: string, options?: AnalyzeOptions): Promise<AnalyzeResult>;
/**
* Scrape multiple URLs with concurrency control
*/
bulkScrape(urls: string[], options?: BulkScrapeOptions): Promise<BulkScrapeResult>;
/**
* Get account usage statistics
*/
getUsage(days?: number): Promise<UsageResult>;
/**
* Create a persistent browser session via WebSocket
*/
createSession(options?: SessionOptions): Promise<BrowserSession>;
/**
* Check API health and your account status
*/
healthCheck(): Promise<HealthResult>;
}
/**
* Convenience function for quick scraping without instantiating a client
*/
export declare function quickScrape(
url: string,
apiKey: string,
options?: ScrapeOptions
): Promise<ScrapeResult>;
/**
* Convenience function for taking screenshots
*/
export declare function quickScreenshot(
url: string,
apiKey: string,
options?: ScreenshotOptions
): Promise<ScrapeResult>;
/**
* Convenience function for AI analysis
*/
export declare function quickAnalyze(
url: string,
question: string,
apiKey: string,
options?: AnalyzeOptions
): Promise<AnalyzeResult>;
/**
* Convenience function for quick screenshot capture
*/
export declare function quickShot(
url: string,
apiKey: string,
options?: ScreenshotOptions
): Promise<ScrapeResult>;
/**
* Convenience function for bulk scraping multiple URLs
*/
export declare function bulkScrape(
urls: string[],
apiKey: string,
options?: BulkScrapeOptions
): Promise<BulkScrapeResult>;
export default BrowserNativeClient;