@0xarchive/sdk 0.1.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/types.ts","../src/http.ts","../src/resources/orderbook.ts","../src/resources/trades.ts","../src/resources/candles.ts","../src/resources/instruments.ts","../src/resources/funding.ts","../src/resources/openinterest.ts","../src/client.ts","../src/websocket.ts"],"sourcesContent":["/**\r\n * Configuration options for the 0xarchive client\r\n */\r\nexport interface ClientOptions {\r\n /** Your 0xarchive API key */\r\n apiKey: string;\r\n /** Base URL for the API (defaults to https://api.0xarchive.io) */\r\n baseUrl?: string;\r\n /** Request timeout in milliseconds (defaults to 30000) */\r\n timeout?: number;\r\n}\r\n\r\n/**\r\n * Standard API response wrapper\r\n */\r\nexport interface ApiResponse<T> {\r\n success: boolean;\r\n data: T;\r\n count: number;\r\n request_id: string;\r\n}\r\n\r\n/**\r\n * Pagination parameters for list endpoints\r\n */\r\nexport interface PaginationParams {\r\n /** Maximum number of results to return */\r\n limit?: number;\r\n /** Number of results to skip */\r\n offset?: number;\r\n}\r\n\r\n/**\r\n * Time range parameters for historical queries\r\n */\r\nexport interface TimeRangeParams extends PaginationParams {\r\n /** Start timestamp (Unix ms or ISO string) */\r\n start?: number | string;\r\n /** End timestamp (Unix ms or ISO string) */\r\n end?: number | string;\r\n}\r\n\r\n// =============================================================================\r\n// Order Book Types\r\n// =============================================================================\r\n\r\n/** A price level in the order book [price, size] */\r\nexport type PriceLevel = [string, string];\r\n\r\n/**\r\n * Order book snapshot\r\n */\r\nexport interface OrderBook {\r\n coin: string;\r\n timestamp: number;\r\n bids: PriceLevel[];\r\n asks: PriceLevel[];\r\n mid_price: string;\r\n spread: string;\r\n spread_bps: string;\r\n}\r\n\r\nexport interface GetOrderBookParams {\r\n /** Timestamp to get order book at (Unix ms or ISO string) */\r\n timestamp?: number | string;\r\n /** Number of price levels to return per side */\r\n depth?: number;\r\n}\r\n\r\nexport interface OrderBookHistoryParams extends TimeRangeParams {\r\n /** Number of price levels to return per side */\r\n depth?: number;\r\n}\r\n\r\n// =============================================================================\r\n// Trades Types\r\n// =============================================================================\r\n\r\n/**\r\n * Trade/fill record\r\n */\r\nexport interface Trade {\r\n id: string;\r\n coin: string;\r\n side: 'buy' | 'sell';\r\n price: string;\r\n size: string;\r\n value: string;\r\n timestamp: number;\r\n trade_type: string;\r\n}\r\n\r\nexport interface GetTradesParams extends TimeRangeParams {\r\n /** Filter by side */\r\n side?: 'buy' | 'sell';\r\n}\r\n\r\n// =============================================================================\r\n// Candles Types\r\n// =============================================================================\r\n\r\n/**\r\n * OHLCV candle\r\n */\r\nexport interface Candle {\r\n coin: string;\r\n interval: string;\r\n timestamp: number;\r\n open: string;\r\n high: string;\r\n low: string;\r\n close: string;\r\n volume: string;\r\n trades: number;\r\n}\r\n\r\nexport type CandleInterval = '1m' | '5m' | '15m' | '1h' | '4h' | '1d';\r\n\r\nexport interface GetCandlesParams extends TimeRangeParams {\r\n /** Candle interval */\r\n interval?: CandleInterval;\r\n}\r\n\r\n// =============================================================================\r\n// Instruments Types\r\n// =============================================================================\r\n\r\n/**\r\n * Trading instrument metadata\r\n */\r\nexport interface Instrument {\r\n coin: string;\r\n name: string;\r\n sz_decimals: number;\r\n max_leverage: number;\r\n only_isolated: boolean;\r\n is_active: boolean;\r\n}\r\n\r\n// =============================================================================\r\n// Funding Types\r\n// =============================================================================\r\n\r\n/**\r\n * Funding rate record\r\n */\r\nexport interface FundingRate {\r\n coin: string;\r\n funding_rate: string;\r\n premium: string;\r\n timestamp: number;\r\n}\r\n\r\n// =============================================================================\r\n// Open Interest Types\r\n// =============================================================================\r\n\r\n/**\r\n * Open interest record\r\n */\r\nexport interface OpenInterest {\r\n coin: string;\r\n open_interest: string;\r\n timestamp: number;\r\n}\r\n\r\n// =============================================================================\r\n// WebSocket Types\r\n// =============================================================================\r\n\r\n/** WebSocket channel types */\r\nexport type WsChannel = 'orderbook' | 'trades' | 'ticker' | 'all_tickers' | 'candles' | 'funding' | 'openinterest';\r\n\r\n/** Subscribe message from client */\r\nexport interface WsSubscribe {\r\n op: 'subscribe';\r\n channel: WsChannel;\r\n coin?: string;\r\n}\r\n\r\n/** Unsubscribe message from client */\r\nexport interface WsUnsubscribe {\r\n op: 'unsubscribe';\r\n channel: WsChannel;\r\n coin?: string;\r\n}\r\n\r\n/** Ping message from client */\r\nexport interface WsPing {\r\n op: 'ping';\r\n}\r\n\r\n/** Replay message from client - replays historical data with timing preserved */\r\nexport interface WsReplay {\r\n op: 'replay';\r\n channel: WsChannel;\r\n coin?: string;\r\n /** Start timestamp (Unix ms) */\r\n start: number;\r\n /** End timestamp (Unix ms, defaults to now) */\r\n end?: number;\r\n /** Playback speed multiplier (1 = real-time, 10 = 10x faster) */\r\n speed?: number;\r\n}\r\n\r\n/** Replay control messages */\r\nexport interface WsReplayPause { op: 'replay.pause'; }\r\nexport interface WsReplayResume { op: 'replay.resume'; }\r\nexport interface WsReplaySeek { op: 'replay.seek'; timestamp: number; }\r\nexport interface WsReplayStop { op: 'replay.stop'; }\r\n\r\n/** Stream message from client - bulk download historical data */\r\nexport interface WsStream {\r\n op: 'stream';\r\n channel: WsChannel;\r\n coin?: string;\r\n /** Start timestamp (Unix ms) */\r\n start: number;\r\n /** End timestamp (Unix ms) */\r\n end: number;\r\n /** Batch size (records per message) */\r\n batch_size?: number;\r\n}\r\n\r\n/** Stream control messages */\r\nexport interface WsStreamStop { op: 'stream.stop'; }\r\n\r\n/** Client message union type */\r\nexport type WsClientMessage =\r\n | WsSubscribe\r\n | WsUnsubscribe\r\n | WsPing\r\n | WsReplay\r\n | WsReplayPause\r\n | WsReplayResume\r\n | WsReplaySeek\r\n | WsReplayStop\r\n | WsStream\r\n | WsStreamStop;\r\n\r\n/** Subscription confirmed from server */\r\nexport interface WsSubscribed {\r\n type: 'subscribed';\r\n channel: WsChannel;\r\n coin?: string;\r\n}\r\n\r\n/** Unsubscription confirmed from server */\r\nexport interface WsUnsubscribed {\r\n type: 'unsubscribed';\r\n channel: WsChannel;\r\n coin?: string;\r\n}\r\n\r\n/** Pong response from server */\r\nexport interface WsPong {\r\n type: 'pong';\r\n}\r\n\r\n/** Error from server */\r\nexport interface WsError {\r\n type: 'error';\r\n message: string;\r\n}\r\n\r\n/** Data message from server */\r\nexport interface WsData<T = unknown> {\r\n type: 'data';\r\n channel: WsChannel;\r\n coin: string;\r\n data: T;\r\n}\r\n\r\n/** Replay started response */\r\nexport interface WsReplayStarted {\r\n type: 'replay_started';\r\n channel: WsChannel;\r\n coin: string;\r\n start: number;\r\n end: number;\r\n speed: number;\r\n total_records: number;\r\n}\r\n\r\n/** Replay paused response */\r\nexport interface WsReplayPaused {\r\n type: 'replay_paused';\r\n current_timestamp: number;\r\n}\r\n\r\n/** Replay resumed response */\r\nexport interface WsReplayResumed {\r\n type: 'replay_resumed';\r\n current_timestamp: number;\r\n}\r\n\r\n/** Replay completed response */\r\nexport interface WsReplayCompleted {\r\n type: 'replay_completed';\r\n channel: WsChannel;\r\n coin: string;\r\n records_sent: number;\r\n}\r\n\r\n/** Replay stopped response */\r\nexport interface WsReplayStopped {\r\n type: 'replay_stopped';\r\n}\r\n\r\n/** Historical data point (replay mode) */\r\nexport interface WsHistoricalData<T = unknown> {\r\n type: 'historical_data';\r\n channel: WsChannel;\r\n coin: string;\r\n timestamp: number;\r\n data: T;\r\n}\r\n\r\n/** Stream started response */\r\nexport interface WsStreamStarted {\r\n type: 'stream_started';\r\n channel: WsChannel;\r\n coin: string;\r\n start: number;\r\n end: number;\r\n batch_size: number;\r\n total_records: number;\r\n}\r\n\r\n/** Stream progress response */\r\nexport interface WsStreamProgress {\r\n type: 'stream_progress';\r\n records_sent: number;\r\n total_records: number;\r\n progress_pct: number;\r\n}\r\n\r\n/** Stream batch (bulk data) */\r\nexport interface WsHistoricalBatch<T = unknown> {\r\n type: 'historical_batch';\r\n channel: WsChannel;\r\n coin: string;\r\n batch_index: number;\r\n records: Array<{ timestamp: number; data: T }>;\r\n}\r\n\r\n/** Stream completed response */\r\nexport interface WsStreamCompleted {\r\n type: 'stream_completed';\r\n channel: WsChannel;\r\n coin: string;\r\n records_sent: number;\r\n}\r\n\r\n/** Stream stopped response */\r\nexport interface WsStreamStopped {\r\n type: 'stream_stopped';\r\n}\r\n\r\n/** Server message union type */\r\nexport type WsServerMessage =\r\n | WsSubscribed\r\n | WsUnsubscribed\r\n | WsPong\r\n | WsError\r\n | WsData\r\n | WsReplayStarted\r\n | WsReplayPaused\r\n | WsReplayResumed\r\n | WsReplayCompleted\r\n | WsReplayStopped\r\n | WsHistoricalData\r\n | WsStreamStarted\r\n | WsStreamProgress\r\n | WsHistoricalBatch\r\n | WsStreamCompleted\r\n | WsStreamStopped;\r\n\r\n/** WebSocket connection options */\r\nexport interface WsOptions {\r\n /** API key for authentication */\r\n apiKey: string;\r\n /** WebSocket URL (defaults to wss://ws.0xarchive.io) */\r\n wsUrl?: string;\r\n /** Auto-reconnect on disconnect (defaults to true) */\r\n autoReconnect?: boolean;\r\n /** Reconnect delay in ms (defaults to 1000) */\r\n reconnectDelay?: number;\r\n /** Maximum reconnect attempts (defaults to 10) */\r\n maxReconnectAttempts?: number;\r\n /** Ping interval in ms (defaults to 30000) */\r\n pingInterval?: number;\r\n}\r\n\r\n/** WebSocket connection state */\r\nexport type WsConnectionState = 'connecting' | 'connected' | 'disconnected' | 'reconnecting';\r\n\r\n/** WebSocket event handlers */\r\nexport interface WsEventHandlers {\r\n onOpen?: () => void;\r\n onClose?: (code: number, reason: string) => void;\r\n onError?: (error: Error) => void;\r\n onMessage?: (message: WsServerMessage) => void;\r\n onStateChange?: (state: WsConnectionState) => void;\r\n}\r\n\r\n// =============================================================================\r\n// Error Types\r\n// =============================================================================\r\n\r\n/**\r\n * API error response\r\n */\r\nexport interface ApiError {\r\n code: number;\r\n error: string;\r\n}\r\n\r\n/**\r\n * SDK error class\r\n */\r\nexport class OxArchiveError extends Error {\r\n code: number;\r\n requestId?: string;\r\n\r\n constructor(message: string, code: number, requestId?: string) {\r\n super(message);\r\n this.name = 'OxArchiveError';\r\n this.code = code;\r\n this.requestId = requestId;\r\n }\r\n}\r\n","import type { ApiResponse, ApiError } from './types';\r\nimport { OxArchiveError } from './types';\r\n\r\nexport interface HttpClientOptions {\r\n baseUrl: string;\r\n apiKey: string;\r\n timeout: number;\r\n}\r\n\r\n/**\r\n * Internal HTTP client for making API requests\r\n */\r\nexport class HttpClient {\r\n private baseUrl: string;\r\n private apiKey: string;\r\n private timeout: number;\r\n\r\n constructor(options: HttpClientOptions) {\r\n this.baseUrl = options.baseUrl.replace(/\\/$/, '');\r\n this.apiKey = options.apiKey;\r\n this.timeout = options.timeout;\r\n }\r\n\r\n /**\r\n * Make a GET request to the API\r\n */\r\n async get<T>(path: string, params?: Record<string, unknown>): Promise<T> {\r\n const url = new URL(`${this.baseUrl}${path}`);\r\n\r\n if (params) {\r\n for (const [key, value] of Object.entries(params)) {\r\n if (value !== undefined && value !== null) {\r\n url.searchParams.set(key, String(value));\r\n }\r\n }\r\n }\r\n\r\n const controller = new AbortController();\r\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\r\n\r\n try {\r\n const response = await fetch(url.toString(), {\r\n method: 'GET',\r\n headers: {\r\n 'X-API-Key': this.apiKey,\r\n 'Content-Type': 'application/json',\r\n },\r\n signal: controller.signal,\r\n });\r\n\r\n clearTimeout(timeoutId);\r\n\r\n const data = await response.json();\r\n\r\n if (!response.ok) {\r\n const error = data as ApiError;\r\n throw new OxArchiveError(\r\n error.error || `Request failed with status ${response.status}`,\r\n response.status,\r\n (data as ApiResponse<unknown>).request_id\r\n );\r\n }\r\n\r\n return data as T;\r\n } catch (error) {\r\n clearTimeout(timeoutId);\r\n\r\n if (error instanceof OxArchiveError) {\r\n throw error;\r\n }\r\n\r\n if (error instanceof Error && error.name === 'AbortError') {\r\n throw new OxArchiveError(`Request timeout after ${this.timeout}ms`, 408);\r\n }\r\n\r\n throw new OxArchiveError(\r\n error instanceof Error ? error.message : 'Unknown error',\r\n 500\r\n );\r\n }\r\n }\r\n}\r\n","import type { HttpClient } from '../http';\r\nimport type {\r\n ApiResponse,\r\n OrderBook,\r\n GetOrderBookParams,\r\n OrderBookHistoryParams,\r\n} from '../types';\r\n\r\n/**\r\n * Order book API resource\r\n *\r\n * @example\r\n * ```typescript\r\n * // Get current order book\r\n * const orderbook = await client.orderbook.get('BTC');\r\n *\r\n * // Get order book at specific timestamp\r\n * const historical = await client.orderbook.get('ETH', {\r\n * timestamp: 1704067200000,\r\n * depth: 10\r\n * });\r\n *\r\n * // Get order book history\r\n * const history = await client.orderbook.history('BTC', {\r\n * start: Date.now() - 86400000,\r\n * end: Date.now(),\r\n * limit: 100\r\n * });\r\n * ```\r\n */\r\nexport class OrderBookResource {\r\n constructor(private http: HttpClient) {}\r\n\r\n /**\r\n * Get order book snapshot for a coin\r\n *\r\n * @param coin - The coin symbol (e.g., 'BTC', 'ETH')\r\n * @param params - Optional parameters\r\n * @returns Order book snapshot\r\n */\r\n async get(coin: string, params?: GetOrderBookParams): Promise<OrderBook> {\r\n const response = await this.http.get<ApiResponse<OrderBook>>(\r\n `/v1/orderbook/${coin.toUpperCase()}`,\r\n params as Record<string, unknown>\r\n );\r\n return response.data;\r\n }\r\n\r\n /**\r\n * Get historical order book snapshots\r\n *\r\n * @param coin - The coin symbol (e.g., 'BTC', 'ETH')\r\n * @param params - Time range and pagination parameters\r\n * @returns Array of order book snapshots\r\n */\r\n async history(\r\n coin: string,\r\n params?: OrderBookHistoryParams\r\n ): Promise<OrderBook[]> {\r\n const response = await this.http.get<ApiResponse<OrderBook[]>>(\r\n `/v1/orderbook/${coin.toUpperCase()}/history`,\r\n params as Record<string, unknown>\r\n );\r\n return response.data;\r\n }\r\n}\r\n","import type { HttpClient } from '../http';\r\nimport type { ApiResponse, Trade, GetTradesParams } from '../types';\r\n\r\n/**\r\n * Trades API resource\r\n *\r\n * @example\r\n * ```typescript\r\n * // Get recent trades\r\n * const trades = await client.trades.recent('BTC');\r\n *\r\n * // Get trade history with time range\r\n * const history = await client.trades.list('ETH', {\r\n * start: Date.now() - 3600000,\r\n * end: Date.now(),\r\n * limit: 500\r\n * });\r\n * ```\r\n */\r\nexport class TradesResource {\r\n constructor(private http: HttpClient) {}\r\n\r\n /**\r\n * Get trade history for a coin\r\n *\r\n * @param coin - The coin symbol (e.g., 'BTC', 'ETH')\r\n * @param params - Time range and pagination parameters\r\n * @returns Array of trades\r\n */\r\n async list(coin: string, params?: GetTradesParams): Promise<Trade[]> {\r\n const response = await this.http.get<ApiResponse<Trade[]>>(\r\n `/v1/trades/${coin.toUpperCase()}`,\r\n params as Record<string, unknown>\r\n );\r\n return response.data;\r\n }\r\n\r\n /**\r\n * Get most recent trades for a coin\r\n *\r\n * @param coin - The coin symbol (e.g., 'BTC', 'ETH')\r\n * @param limit - Number of trades to return (default: 100)\r\n * @returns Array of recent trades\r\n */\r\n async recent(coin: string, limit?: number): Promise<Trade[]> {\r\n const response = await this.http.get<ApiResponse<Trade[]>>(\r\n `/v1/trades/${coin.toUpperCase()}/recent`,\r\n { limit }\r\n );\r\n return response.data;\r\n }\r\n}\r\n","import type { HttpClient } from '../http';\r\nimport type { ApiResponse, Candle, GetCandlesParams } from '../types';\r\n\r\n/**\r\n * Candles (OHLCV) API resource\r\n *\r\n * @example\r\n * ```typescript\r\n * // Get hourly candles\r\n * const candles = await client.candles.list('BTC', {\r\n * interval: '1h',\r\n * start: Date.now() - 86400000,\r\n * end: Date.now()\r\n * });\r\n *\r\n * // Get daily candles\r\n * const daily = await client.candles.list('ETH', {\r\n * interval: '1d',\r\n * limit: 30\r\n * });\r\n * ```\r\n */\r\nexport class CandlesResource {\r\n constructor(private http: HttpClient) {}\r\n\r\n /**\r\n * Get OHLCV candles for a coin\r\n *\r\n * @param coin - The coin symbol (e.g., 'BTC', 'ETH')\r\n * @param params - Interval, time range, and pagination parameters\r\n * @returns Array of candles\r\n */\r\n async list(coin: string, params?: GetCandlesParams): Promise<Candle[]> {\r\n const response = await this.http.get<ApiResponse<Candle[]>>(\r\n `/v1/candles/${coin.toUpperCase()}`,\r\n params as Record<string, unknown>\r\n );\r\n return response.data;\r\n }\r\n}\r\n","import type { HttpClient } from '../http';\r\nimport type { ApiResponse, Instrument } from '../types';\r\n\r\n/**\r\n * Instruments API resource\r\n *\r\n * @example\r\n * ```typescript\r\n * // List all instruments\r\n * const instruments = await client.instruments.list();\r\n *\r\n * // Get specific instrument\r\n * const btc = await client.instruments.get('BTC');\r\n * ```\r\n */\r\nexport class InstrumentsResource {\r\n constructor(private http: HttpClient) {}\r\n\r\n /**\r\n * List all available trading instruments\r\n *\r\n * @returns Array of instruments\r\n */\r\n async list(): Promise<Instrument[]> {\r\n const response = await this.http.get<ApiResponse<Instrument[]>>(\r\n '/v1/instruments'\r\n );\r\n return response.data;\r\n }\r\n\r\n /**\r\n * Get a specific instrument by coin symbol\r\n *\r\n * @param coin - The coin symbol (e.g., 'BTC', 'ETH')\r\n * @returns Instrument details\r\n */\r\n async get(coin: string): Promise<Instrument> {\r\n const response = await this.http.get<ApiResponse<Instrument>>(\r\n `/v1/instruments/${coin.toUpperCase()}`\r\n );\r\n return response.data;\r\n }\r\n}\r\n","import type { HttpClient } from '../http';\r\nimport type { ApiResponse, FundingRate, TimeRangeParams } from '../types';\r\n\r\n/**\r\n * Funding rates API resource\r\n *\r\n * @example\r\n * ```typescript\r\n * // Get current funding rate\r\n * const current = await client.funding.current('BTC');\r\n *\r\n * // Get funding rate history\r\n * const history = await client.funding.history('ETH', {\r\n * start: Date.now() - 86400000 * 7,\r\n * end: Date.now()\r\n * });\r\n * ```\r\n */\r\nexport class FundingResource {\r\n constructor(private http: HttpClient) {}\r\n\r\n /**\r\n * Get funding rate history for a coin\r\n *\r\n * @param coin - The coin symbol (e.g., 'BTC', 'ETH')\r\n * @param params - Time range and pagination parameters\r\n * @returns Array of funding rate records\r\n */\r\n async history(coin: string, params?: TimeRangeParams): Promise<FundingRate[]> {\r\n const response = await this.http.get<ApiResponse<FundingRate[]>>(\r\n `/v1/funding/${coin.toUpperCase()}`,\r\n params as Record<string, unknown>\r\n );\r\n return response.data;\r\n }\r\n\r\n /**\r\n * Get current funding rate for a coin\r\n *\r\n * @param coin - The coin symbol (e.g., 'BTC', 'ETH')\r\n * @returns Current funding rate\r\n */\r\n async current(coin: string): Promise<FundingRate> {\r\n const response = await this.http.get<ApiResponse<FundingRate>>(\r\n `/v1/funding/${coin.toUpperCase()}/current`\r\n );\r\n return response.data;\r\n }\r\n}\r\n","import type { HttpClient } from '../http';\r\nimport type { ApiResponse, OpenInterest, TimeRangeParams } from '../types';\r\n\r\n/**\r\n * Open interest API resource\r\n *\r\n * @example\r\n * ```typescript\r\n * // Get current open interest\r\n * const current = await client.openInterest.current('BTC');\r\n *\r\n * // Get open interest history\r\n * const history = await client.openInterest.history('ETH', {\r\n * start: Date.now() - 86400000,\r\n * end: Date.now(),\r\n * limit: 100\r\n * });\r\n * ```\r\n */\r\nexport class OpenInterestResource {\r\n constructor(private http: HttpClient) {}\r\n\r\n /**\r\n * Get open interest history for a coin\r\n *\r\n * @param coin - The coin symbol (e.g., 'BTC', 'ETH')\r\n * @param params - Time range and pagination parameters\r\n * @returns Array of open interest records\r\n */\r\n async history(coin: string, params?: TimeRangeParams): Promise<OpenInterest[]> {\r\n const response = await this.http.get<ApiResponse<OpenInterest[]>>(\r\n `/v1/openinterest/${coin.toUpperCase()}`,\r\n params as Record<string, unknown>\r\n );\r\n return response.data;\r\n }\r\n\r\n /**\r\n * Get current open interest for a coin\r\n *\r\n * @param coin - The coin symbol (e.g., 'BTC', 'ETH')\r\n * @returns Current open interest\r\n */\r\n async current(coin: string): Promise<OpenInterest> {\r\n const response = await this.http.get<ApiResponse<OpenInterest>>(\r\n `/v1/openinterest/${coin.toUpperCase()}/current`\r\n );\r\n return response.data;\r\n }\r\n}\r\n","import type { ClientOptions } from './types';\r\nimport { HttpClient } from './http';\r\nimport {\r\n OrderBookResource,\r\n TradesResource,\r\n CandlesResource,\r\n InstrumentsResource,\r\n FundingResource,\r\n OpenInterestResource,\r\n} from './resources';\r\n\r\nconst DEFAULT_BASE_URL = 'https://api.0xarchive.io';\r\nconst DEFAULT_TIMEOUT = 30000;\r\n\r\n/**\r\n * 0xarchive API client\r\n *\r\n * @example\r\n * ```typescript\r\n * import { OxArchive } from '@0xarchive/sdk';\r\n *\r\n * const client = new OxArchive({ apiKey: 'ox_your_api_key' });\r\n *\r\n * // Get current order book\r\n * const orderbook = await client.orderbook.get('BTC');\r\n * console.log(`BTC mid price: ${orderbook.mid_price}`);\r\n *\r\n * // Get historical data\r\n * const history = await client.orderbook.history('ETH', {\r\n * start: Date.now() - 86400000,\r\n * end: Date.now(),\r\n * limit: 100\r\n * });\r\n *\r\n * // List all instruments\r\n * const instruments = await client.instruments.list();\r\n * ```\r\n */\r\nexport class OxArchive {\r\n private http: HttpClient;\r\n\r\n /**\r\n * Order book data (L2 snapshots from April 2023)\r\n */\r\n public readonly orderbook: OrderBookResource;\r\n\r\n /**\r\n * Trade/fill history\r\n */\r\n public readonly trades: TradesResource;\r\n\r\n /**\r\n * OHLCV candles\r\n */\r\n public readonly candles: CandlesResource;\r\n\r\n /**\r\n * Trading instruments metadata\r\n */\r\n public readonly instruments: InstrumentsResource;\r\n\r\n /**\r\n * Funding rates\r\n */\r\n public readonly funding: FundingResource;\r\n\r\n /**\r\n * Open interest\r\n */\r\n public readonly openInterest: OpenInterestResource;\r\n\r\n /**\r\n * Create a new 0xarchive client\r\n *\r\n * @param options - Client configuration options\r\n */\r\n constructor(options: ClientOptions) {\r\n if (!options.apiKey) {\r\n throw new Error('API key is required. Get one at https://0xarchive.io/signup');\r\n }\r\n\r\n this.http = new HttpClient({\r\n baseUrl: options.baseUrl ?? DEFAULT_BASE_URL,\r\n apiKey: options.apiKey,\r\n timeout: options.timeout ?? DEFAULT_TIMEOUT,\r\n });\r\n\r\n // Initialize resource namespaces\r\n this.orderbook = new OrderBookResource(this.http);\r\n this.trades = new TradesResource(this.http);\r\n this.candles = new CandlesResource(this.http);\r\n this.instruments = new InstrumentsResource(this.http);\r\n this.funding = new FundingResource(this.http);\r\n this.openInterest = new OpenInterestResource(this.http);\r\n }\r\n}\r\n","/**\r\n * WebSocket client for 0xarchive real-time streaming, replay, and bulk download\r\n *\r\n * @example Real-time streaming\r\n * ```typescript\r\n * const ws = new OxArchiveWs({ apiKey: 'ox_...' });\r\n * ws.connect({\r\n * onMessage: (msg) => console.log(msg)\r\n * });\r\n * ws.subscribeOrderbook('BTC');\r\n * ```\r\n *\r\n * @example Historical replay (like Tardis.dev)\r\n * ```typescript\r\n * const ws = new OxArchiveWs({ apiKey: 'ox_...' });\r\n * ws.connect();\r\n * ws.onHistoricalData((coin, timestamp, data) => {\r\n * console.log(`${new Date(timestamp)}: ${data.mid_price}`);\r\n * });\r\n * ws.replay('orderbook', 'BTC', {\r\n * start: Date.now() - 86400000,\r\n * speed: 10 // 10x speed\r\n * });\r\n * ```\r\n *\r\n * @example Bulk streaming (like Databento)\r\n * ```typescript\r\n * const ws = new OxArchiveWs({ apiKey: 'ox_...' });\r\n * ws.connect();\r\n * const batches: OrderBook[] = [];\r\n * ws.onBatch((coin, records) => {\r\n * batches.push(...records.map(r => r.data));\r\n * });\r\n * ws.onStreamComplete((channel, coin, count) => {\r\n * console.log(`Downloaded ${count} records`);\r\n * });\r\n * ws.stream('orderbook', 'ETH', {\r\n * start: Date.now() - 3600000,\r\n * end: Date.now(),\r\n * batchSize: 1000\r\n * });\r\n * ```\r\n */\r\n\r\nimport type {\r\n WsOptions,\r\n WsChannel,\r\n WsClientMessage,\r\n WsServerMessage,\r\n WsConnectionState,\r\n WsEventHandlers,\r\n OrderBook,\r\n Trade,\r\n WsHistoricalData,\r\n WsHistoricalBatch,\r\n WsReplayStarted,\r\n WsReplayCompleted,\r\n WsStreamStarted,\r\n WsStreamCompleted,\r\n WsStreamProgress,\r\n} from './types';\r\n\r\nconst DEFAULT_WS_URL = 'wss://ws.0xarchive.io';\r\nconst DEFAULT_PING_INTERVAL = 30000;\r\nconst DEFAULT_RECONNECT_DELAY = 1000;\r\nconst DEFAULT_MAX_RECONNECT_ATTEMPTS = 10;\r\n\r\n/**\r\n * WebSocket client for real-time data streaming\r\n */\r\nexport class OxArchiveWs {\r\n private ws: WebSocket | null = null;\r\n private options: Required<WsOptions>;\r\n private handlers: WsEventHandlers = {};\r\n private subscriptions: Set<string> = new Set();\r\n private state: WsConnectionState = 'disconnected';\r\n private reconnectAttempts = 0;\r\n private pingTimer: ReturnType<typeof setInterval> | null = null;\r\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\r\n\r\n constructor(options: WsOptions) {\r\n this.options = {\r\n apiKey: options.apiKey,\r\n wsUrl: options.wsUrl ?? DEFAULT_WS_URL,\r\n autoReconnect: options.autoReconnect ?? true,\r\n reconnectDelay: options.reconnectDelay ?? DEFAULT_RECONNECT_DELAY,\r\n maxReconnectAttempts: options.maxReconnectAttempts ?? DEFAULT_MAX_RECONNECT_ATTEMPTS,\r\n pingInterval: options.pingInterval ?? DEFAULT_PING_INTERVAL,\r\n };\r\n }\r\n\r\n /**\r\n * Connect to the WebSocket server\r\n */\r\n connect(handlers?: WsEventHandlers): void {\r\n if (handlers) {\r\n this.handlers = handlers;\r\n }\r\n\r\n this.setState('connecting');\r\n\r\n const url = `${this.options.wsUrl}?apiKey=${encodeURIComponent(this.options.apiKey)}`;\r\n this.ws = new WebSocket(url);\r\n\r\n this.ws.onopen = () => {\r\n this.reconnectAttempts = 0;\r\n this.setState('connected');\r\n this.startPing();\r\n this.resubscribe();\r\n this.handlers.onOpen?.();\r\n };\r\n\r\n this.ws.onclose = (event) => {\r\n this.stopPing();\r\n this.handlers.onClose?.(event.code, event.reason);\r\n\r\n if (this.options.autoReconnect && this.state !== 'disconnected') {\r\n this.scheduleReconnect();\r\n } else {\r\n this.setState('disconnected');\r\n }\r\n };\r\n\r\n this.ws.onerror = () => {\r\n const error = new Error('WebSocket connection error');\r\n this.handlers.onError?.(error);\r\n };\r\n\r\n this.ws.onmessage = (event) => {\r\n try {\r\n const message = JSON.parse(event.data) as WsServerMessage;\r\n this.handlers.onMessage?.(message);\r\n } catch {\r\n // Ignore parse errors for malformed messages\r\n }\r\n };\r\n }\r\n\r\n /**\r\n * Disconnect from the WebSocket server\r\n */\r\n disconnect(): void {\r\n this.setState('disconnected');\r\n this.stopPing();\r\n this.clearReconnectTimer();\r\n\r\n if (this.ws) {\r\n this.ws.close(1000, 'Client disconnect');\r\n this.ws = null;\r\n }\r\n }\r\n\r\n /**\r\n * Subscribe to a channel\r\n */\r\n subscribe(channel: WsChannel, coin?: string): void {\r\n const key = this.subscriptionKey(channel, coin);\r\n this.subscriptions.add(key);\r\n\r\n if (this.isConnected()) {\r\n this.send({ op: 'subscribe', channel, coin });\r\n }\r\n }\r\n\r\n /**\r\n * Subscribe to order book updates for a coin\r\n */\r\n subscribeOrderbook(coin: string): void {\r\n this.subscribe('orderbook', coin);\r\n }\r\n\r\n /**\r\n * Subscribe to trades for a coin\r\n */\r\n subscribeTrades(coin: string): void {\r\n this.subscribe('trades', coin);\r\n }\r\n\r\n /**\r\n * Subscribe to ticker updates for a coin\r\n */\r\n subscribeTicker(coin: string): void {\r\n this.subscribe('ticker', coin);\r\n }\r\n\r\n /**\r\n * Subscribe to all tickers\r\n */\r\n subscribeAllTickers(): void {\r\n this.subscribe('all_tickers');\r\n }\r\n\r\n /**\r\n * Unsubscribe from a channel\r\n */\r\n unsubscribe(channel: WsChannel, coin?: string): void {\r\n const key = this.subscriptionKey(channel, coin);\r\n this.subscriptions.delete(key);\r\n\r\n if (this.isConnected()) {\r\n this.send({ op: 'unsubscribe', channel, coin });\r\n }\r\n }\r\n\r\n /**\r\n * Unsubscribe from order book updates for a coin\r\n */\r\n unsubscribeOrderbook(coin: string): void {\r\n this.unsubscribe('orderbook', coin);\r\n }\r\n\r\n /**\r\n * Unsubscribe from trades for a coin\r\n */\r\n unsubscribeTrades(coin: string): void {\r\n this.unsubscribe('trades', coin);\r\n }\r\n\r\n /**\r\n * Unsubscribe from ticker updates for a coin\r\n */\r\n unsubscribeTicker(coin: string): void {\r\n this.unsubscribe('ticker', coin);\r\n }\r\n\r\n /**\r\n * Unsubscribe from all tickers\r\n */\r\n unsubscribeAllTickers(): void {\r\n this.unsubscribe('all_tickers');\r\n }\r\n\r\n // ==========================================================================\r\n // Historical Replay (Option B) - Like Tardis.dev\r\n // ==========================================================================\r\n\r\n /**\r\n * Start historical replay with timing preserved\r\n *\r\n * @param channel - Data channel to replay\r\n * @param coin - Trading pair (e.g., 'BTC', 'ETH')\r\n * @param options - Replay options\r\n *\r\n * @example\r\n * ```typescript\r\n * ws.replay('orderbook', 'BTC', {\r\n * start: Date.now() - 86400000, // 24 hours ago\r\n * speed: 10 // 10x faster than real-time\r\n * });\r\n * ```\r\n */\r\n replay(\r\n channel: WsChannel,\r\n coin: string,\r\n options: {\r\n start: number;\r\n end?: number;\r\n speed?: number;\r\n }\r\n ): void {\r\n this.send({\r\n op: 'replay',\r\n channel,\r\n coin,\r\n start: options.start,\r\n end: options.end,\r\n speed: options.speed ?? 1,\r\n });\r\n }\r\n\r\n /**\r\n * Pause the current replay\r\n */\r\n replayPause(): void {\r\n this.send({ op: 'replay.pause' });\r\n }\r\n\r\n /**\r\n * Resume a paused replay\r\n */\r\n replayResume(): void {\r\n this.send({ op: 'replay.resume' });\r\n }\r\n\r\n /**\r\n * Seek to a specific timestamp in the replay\r\n * @param timestamp - Unix timestamp in milliseconds\r\n */\r\n replaySeek(timestamp: number): void {\r\n this.send({ op: 'replay.seek', timestamp });\r\n }\r\n\r\n /**\r\n * Stop the current replay\r\n */\r\n replayStop(): void {\r\n this.send({ op: 'replay.stop' });\r\n }\r\n\r\n // ==========================================================================\r\n // Bulk Streaming (Option D) - Like Databento\r\n // ==========================================================================\r\n\r\n /**\r\n * Start bulk streaming for fast data download\r\n *\r\n * @param channel - Data channel to stream\r\n * @param coin - Trading pair (e.g., 'BTC', 'ETH')\r\n * @param options - Stream options\r\n *\r\n * @example\r\n * ```typescript\r\n * ws.stream('orderbook', 'ETH', {\r\n * start: Date.now() - 3600000, // 1 hour ago\r\n * end: Date.now(),\r\n * batchSize: 1000\r\n * });\r\n * ```\r\n */\r\n stream(\r\n channel: WsChannel,\r\n coin: string,\r\n options: {\r\n start: number;\r\n end: number;\r\n batchSize?: number;\r\n }\r\n ): void {\r\n this.send({\r\n op: 'stream',\r\n channel,\r\n coin,\r\n start: options.start,\r\n end: options.end,\r\n batch_size: options.batchSize ?? 1000,\r\n });\r\n }\r\n\r\n /**\r\n * Stop the current bulk stream\r\n */\r\n streamStop(): void {\r\n this.send({ op: 'stream.stop' });\r\n }\r\n\r\n // ==========================================================================\r\n // Event Handlers for Replay/Stream\r\n // ==========================================================================\r\n\r\n /**\r\n * Handle historical data points (replay mode)\r\n */\r\n onHistoricalData<T = unknown>(\r\n handler: (coin: string, timestamp: number, data: T) => void\r\n ): void {\r\n const originalHandler = this.handlers.onMessage;\r\n this.handlers.onMessage = (message) => {\r\n if (message.type === 'historical_data') {\r\n const msg = message as WsHistoricalData<T>;\r\n handler(msg.coin, msg.timestamp, msg.data);\r\n }\r\n originalHandler?.(message);\r\n };\r\n }\r\n\r\n /**\r\n * Handle batched data (bulk stream mode)\r\n */\r\n onBatch<T = unknown>(\r\n handler: (coin: string, records: Array<{ timestamp: number; data: T }>) => void\r\n ): void {\r\n const originalHandler = this.handlers.onMessage;\r\n this.handlers.onMessage = (message) => {\r\n if (message.type === 'historical_batch') {\r\n const msg = message as WsHistoricalBatch<T>;\r\n handler(msg.coin, msg.records as Array<{ timestamp: number; data: T }>);\r\n }\r\n originalHandler?.(message);\r\n };\r\n }\r\n\r\n /**\r\n * Handle replay started event\r\n */\r\n onReplayStart(\r\n handler: (channel: WsChannel, coin: string, totalRecords: number, speed: number) => void\r\n ): void {\r\n const originalHandler = this.handlers.onMessage;\r\n this.handlers.onMessage = (message) => {\r\n if (message.type === 'replay_started') {\r\n const msg = message as WsReplayStarted;\r\n handler(msg.channel, msg.coin, msg.total_records, msg.speed);\r\n }\r\n originalHandler?.(message);\r\n };\r\n }\r\n\r\n /**\r\n * Handle replay completed event\r\n */\r\n onReplayComplete(\r\n handler: (channel: WsChannel, coin: string, recordsSent: number) => void\r\n ): void {\r\n const originalHandler = this.handlers.onMessage;\r\n this.handlers.onMessage = (message) => {\r\n if (message.type === 'replay_completed') {\r\n const msg = message as WsReplayCompleted;\r\n handler(msg.channel, msg.coin, msg.records_sent);\r\n }\r\n originalHandler?.(message);\r\n };\r\n }\r\n\r\n /**\r\n * Handle stream started event\r\n */\r\n onStreamStart(\r\n handler: (channel: WsChannel, coin: string, totalRecords: number) => void\r\n ): void {\r\n const originalHandler = this.handlers.onMessage;\r\n this.handlers.onMessage = (message) => {\r\n if (message.type === 'stream_started') {\r\n const msg = message as WsStreamStarted;\r\n handler(msg.channel, msg.coin, msg.total_records);\r\n }\r\n originalHandler?.(message);\r\n };\r\n }\r\n\r\n /**\r\n * Handle stream progress event\r\n */\r\n onStreamProgress(\r\n handler: (recordsSent: number, totalRecords: number, progressPct: number) => void\r\n ): void {\r\n const originalHandler = this.handlers.onMessage;\r\n this.handlers.onMessage = (message) => {\r\n if (message.type === 'stream_progress') {\r\n const msg = message as WsStreamProgress;\r\n handler(msg.records_sent, msg.total_records, msg.progress_pct);\r\n }\r\n originalHandler?.(message);\r\n };\r\n }\r\n\r\n /**\r\n * Handle stream completed event\r\n */\r\n onStreamComplete(\r\n handler: (channel: WsChannel, coin: string, recordsSent: number) => void\r\n ): void {\r\n const originalHandler = this.handlers.onMessage;\r\n this.handlers.onMessage = (message) => {\r\n if (message.type === 'stream_completed') {\r\n const msg = message as WsStreamCompleted;\r\n handler(msg.channel, msg.coin, msg.records_sent);\r\n }\r\n originalHandler?.(message);\r\n };\r\n }\r\n\r\n /**\r\n * Get current connection state\r\n */\r\n getState(): WsConnectionState {\r\n return this.state;\r\n }\r\n\r\n /**\r\n * Check if connected\r\n */\r\n isConnected(): boolean {\r\n return this.ws?.readyState === WebSocket.OPEN;\r\n }\r\n\r\n /**\r\n * Set event handlers after construction\r\n */\r\n on<K extends keyof WsEventHandlers>(event: K, handler: WsEventHandlers[K]): void {\r\n this.handlers[event] = handler;\r\n }\r\n\r\n /**\r\n * Helper to handle typed orderbook data\r\n */\r\n onOrderbook(handler: (coin: string, data: OrderBook) => void): void {\r\n const originalHandler = this.handlers.onMessage;\r\n this.handlers.onMessage = (message) => {\r\n if (message.type === 'data' && message.channel === 'orderbook') {\r\n handler(message.coin, message.data as OrderBook);\r\n }\r\n originalHandler?.(message);\r\n };\r\n }\r\n\r\n /**\r\n * Helper to handle typed trade data\r\n */\r\n onTrades(handler: (coin: string, data: Trade[]) => void): void {\r\n const originalHandler = this.handlers.onMessage;\r\n this.handlers.onMessage = (message) => {\r\n if (message.type === 'data' && message.channel === 'trades') {\r\n handler(message.coin, message.data as Trade[]);\r\n }\r\n originalHandler?.(message);\r\n };\r\n }\r\n\r\n // Private methods\r\n\r\n private send(message: WsClientMessage): void {\r\n if (this.ws?.readyState === WebSocket.OPEN) {\r\n this.ws.send(JSON.stringify(message));\r\n }\r\n }\r\n\r\n private setState(state: WsConnectionState): void {\r\n this.state = state;\r\n this.handlers.onStateChange?.(state);\r\n }\r\n\r\n private startPing(): void {\r\n this.stopPing();\r\n this.pingTimer = setInterval(() => {\r\n this.send({ op: 'ping' });\r\n }, this.options.pingInterval);\r\n }\r\n\r\n private stopPing(): void {\r\n if (this.pingTimer) {\r\n clearInterval(this.pingTimer);\r\n this.pingTimer = null;\r\n }\r\n }\r\n\r\n private subscriptionKey(channel: WsChannel, coin?: string): string {\r\n return coin ? `${channel}:${coin}` : channel;\r\n }\r\n\r\n private resubscribe(): void {\r\n for (const key of this.subscriptions) {\r\n const [channel, coin] = key.split(':') as [WsChannel, string | undefined];\r\n this.send({ op: 'subscribe', channel, coin });\r\n }\r\n }\r\n\r\n private scheduleReconnect(): void {\r\n if (this.reconnectAttempts >= this.options.maxReconnectAttempts) {\r\n this.setState('disconnected');\r\n return;\r\n }\r\n\r\n this.setState('reconnecting');\r\n this.reconnectAttempts++;\r\n\r\n const delay = this.options.reconnectDelay * Math.pow(2, this.reconnectAttempts - 1);\r\n\r\n this.reconnectTimer = setTimeout(() => {\r\n this.connect();\r\n }, delay);\r\n }\r\n\r\n private clearReconnectTimer(): void {\r\n if (this.reconnectTimer) {\r\n clearTimeout(this.reconnectTimer);\r\n this.reconnectTimer = null;\r\n }\r\n }\r\n}\r\n"],"mappings":"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","names":[]}
package/package.json ADDED
@@ -0,0 +1,59 @@
1
+ {
2
+ "name": "@0xarchive/sdk",
3
+ "version": "0.1.0",
4
+ "description": "Official TypeScript SDK for 0xarchive - Hyperliquid Historical Data API",
5
+ "main": "dist/index.js",
6
+ "module": "dist/index.mjs",
7
+ "types": "dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.mjs",
12
+ "require": "./dist/index.js"
13
+ }
14
+ },
15
+ "files": [
16
+ "dist",
17
+ "README.md"
18
+ ],
19
+ "scripts": {
20
+ "build": "tsup",
21
+ "dev": "tsup --watch",
22
+ "lint": "eslint src/",
23
+ "typecheck": "tsc --noEmit",
24
+ "test": "vitest",
25
+ "prepublishOnly": "npm run build"
26
+ },
27
+ "keywords": [
28
+ "0xarchive",
29
+ "hyperliquid",
30
+ "trading",
31
+ "orderbook",
32
+ "historical-data",
33
+ "api",
34
+ "sdk"
35
+ ],
36
+ "author": "0xarchive",
37
+ "license": "MIT",
38
+ "repository": {
39
+ "type": "git",
40
+ "url": "https://github.com/0xarchiveIO/sdk-typescript"
41
+ },
42
+ "homepage": "https://0xarchive.io/docs/sdks",
43
+ "bugs": {
44
+ "url": "https://github.com/0xarchiveIO/sdk-typescript/issues"
45
+ },
46
+ "engines": {
47
+ "node": ">=18"
48
+ },
49
+ "dependencies": {
50
+ "ws": "^8.18.0"
51
+ },
52
+ "devDependencies": {
53
+ "@types/ws": "^8.5.13",
54
+ "@types/node": "^22.0.0",
55
+ "tsup": "^8.0.0",
56
+ "typescript": "^5.4.0",
57
+ "vitest": "^2.0.0"
58
+ }
59
+ }