@chaindex/priorityfee 0.1.0 → 0.1.2

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/index.cjs CHANGED
@@ -48,7 +48,7 @@ var ApiError = class extends SdkError {
48
48
  // src/transport/http.ts
49
49
  var HttpTransport = class {
50
50
  constructor(options) {
51
- this.baseUrl = options.baseUrl.replace(/\/+$/, "");
51
+ this.baseUrl = (options.baseUrl ?? "https://api.priorityfee.com").replace(/\/+$/, "");
52
52
  this.apiKey = options.apiKey;
53
53
  this.token = options.token;
54
54
  this.fetch = options.fetch ?? globalThis.fetch.bind(globalThis);
@@ -297,7 +297,7 @@ var WsTransport = class {
297
297
  this.pingTimer = null;
298
298
  this.pongTimer = null;
299
299
  this.listeners = /* @__PURE__ */ new Map();
300
- const base = options.baseUrl.replace(/^http/, "ws").replace(/\/+$/, "");
300
+ const base = (options.baseUrl ?? "wss://api.priorityfee.com").replace(/^http/, "ws").replace(/\/+$/, "");
301
301
  this.url = `${base}/v1/ws?api_key=${encodeURIComponent(options.apiKey)}`;
302
302
  this.reconnect = options.reconnect ?? true;
303
303
  this.maxReconnectAttempts = options.maxReconnectAttempts ?? 10;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/types/errors.ts","../src/transport/http.ts","../src/resources/block.ts","../src/resources/rolling.ts","../src/resources/tumbling.ts","../src/resources/demo.ts","../src/resources/auth.ts","../src/resources/keys.ts","../src/resources/usage.ts","../src/resources/health.ts","../src/http-client.ts","../src/transport/ws.ts","../src/ws-client.ts"],"sourcesContent":["export { HttpClient } from './http-client'\nexport type { HttpClientOptions } from './http-client'\n\nexport { HttpTransport } from './transport/http'\nexport type { HttpTransportOptions } from './transport/http'\n\nexport { WsClient } from './ws-client'\nexport type { WsClientOptions } from './types/ws'\n\nexport { WsTransport } from './transport/ws'\n\n// Types\nexport type {\n Duration,\n DetailLevel,\n Percentile,\n Metric,\n TimeResolution,\n Percentiles,\n BlockModel,\n BlockListResponse,\n BlockQueryParams,\n RollingModel,\n RollingResponse,\n RollingQueryParams,\n TumblingModel,\n TumblingResponse,\n TumblingQueryParams,\n DemoModel,\n DemoResponse,\n SiwsVerifyRequest,\n VerifyResponse,\n MeResponse,\n ApiKey,\n ApiKeyWithSecret,\n ListKeysResponse,\n Endpoint,\n UsageEntry,\n UsageResponse,\n DetailedUsageEntry,\n DetailedUsageResponse,\n DetailedUsageParams,\n HealthResponse,\n WsChannel,\n BlockSubscribeParams,\n RollingSubscribeParams,\n DemoSubscribeParams,\n SubscribeParams,\n Subscription,\n SubscriptionHandlers,\n ChannelPayloadMap,\n WsTransportState,\n WsTransportEvents,\n WsErrorMessage,\n} from './types'\n\n// Errors\nexport { SdkError, ApiError } from './types/errors'\n","export class SdkError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'SdkError'\n }\n}\n\nexport class ApiError extends SdkError {\n readonly status: number\n readonly body?: unknown\n\n constructor(status: number, message: string, body?: unknown) {\n super(message)\n this.name = 'ApiError'\n this.status = status\n this.body = body\n }\n}\n","import { ApiError, SdkError } from '../types/errors'\n\nexport interface HttpTransportOptions {\n baseUrl: string\n apiKey?: string\n token?: string\n fetch?: typeof globalThis.fetch\n}\n\nexport class HttpTransport {\n private readonly baseUrl: string\n private apiKey?: string\n private token?: string\n private readonly fetch: typeof globalThis.fetch\n\n constructor(options: HttpTransportOptions) {\n this.baseUrl = options.baseUrl.replace(/\\/+$/, '')\n this.apiKey = options.apiKey\n this.token = options.token\n this.fetch = options.fetch ?? globalThis.fetch.bind(globalThis)\n }\n\n setToken(token: string): void {\n this.token = token\n }\n\n clearToken(): void {\n this.token = undefined\n }\n\n async get<T>(path: string, params?: Record<string, string | undefined>): Promise<T> {\n const url = this.buildUrl(path, params)\n return this.request<T>(url, { method: 'GET' })\n }\n\n async post<T>(path: string, body?: unknown): Promise<T> {\n const url = this.buildUrl(path)\n return this.request<T>(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: body !== undefined ? JSON.stringify(body) : undefined,\n })\n }\n\n async delete<T>(path: string): Promise<T> {\n const url = this.buildUrl(path)\n return this.request<T>(url, { method: 'DELETE' })\n }\n\n private buildUrl(path: string, params?: Record<string, string | undefined>): string {\n const url = new URL(`${this.baseUrl}${path}`)\n if (params) {\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined) {\n url.searchParams.set(key, value)\n }\n }\n }\n return url.toString()\n }\n\n private async request<T>(url: string, init: RequestInit): Promise<T> {\n const headers = new Headers(init.headers)\n\n if (this.token) {\n headers.set('Authorization', `Bearer ${this.token}`)\n }\n if (this.apiKey) {\n headers.set('X-API-Key', this.apiKey)\n }\n\n let response: Response\n try {\n response = await this.fetch(url, { ...init, headers })\n } catch (err) {\n throw new SdkError(\n `Network error: ${err instanceof Error ? err.message : String(err)}`\n )\n }\n\n if (!response.ok) {\n let body: unknown\n try {\n body = await response.json()\n } catch {\n body = await response.text().catch(() => undefined)\n }\n const message =\n body && typeof body === 'object' && 'error' in body\n ? String((body as Record<string, unknown>).error)\n : `HTTP ${response.status}`\n throw new ApiError(response.status, message, body)\n }\n\n return (await response.json()) as T\n }\n}\n","import type { HttpTransport } from '../transport/http'\nimport type { BlockListResponse, BlockQueryParams } from '../types/block'\n\nexport class BlockResource {\n constructor(private readonly transport: HttpTransport) {}\n\n async get(params?: BlockQueryParams): Promise<BlockListResponse> {\n return this.transport.get('/v1/block', serializeBlockParams(params))\n }\n\n async getFee(params?: BlockQueryParams): Promise<BlockListResponse> {\n return this.transport.get('/v1/block/fee', serializeBlockParams(params))\n }\n\n async getPrice(params?: BlockQueryParams): Promise<BlockListResponse> {\n return this.transport.get('/v1/block/price', serializeBlockParams(params))\n }\n\n async getLimit(params?: BlockQueryParams): Promise<BlockListResponse> {\n return this.transport.get('/v1/block/limit', serializeBlockParams(params))\n }\n}\n\nfunction serializeBlockParams(\n params?: BlockQueryParams\n): Record<string, string | undefined> | undefined {\n if (!params) return undefined\n return {\n limit: params.limit?.toString(),\n detail: params.detail,\n percentiles: params.percentiles?.join(','),\n }\n}\n","import type { HttpTransport } from '../transport/http'\nimport type { RollingResponse, RollingQueryParams } from '../types/rolling'\n\nexport class RollingResource {\n constructor(private readonly transport: HttpTransport) {}\n\n async get(params?: RollingQueryParams): Promise<RollingResponse> {\n return this.transport.get('/v1/rolling', serializeRollingParams(params))\n }\n\n async getFee(params?: RollingQueryParams): Promise<RollingResponse> {\n return this.transport.get('/v1/rolling/fee', serializeRollingParams(params))\n }\n\n async getPrice(params?: RollingQueryParams): Promise<RollingResponse> {\n return this.transport.get('/v1/rolling/price', serializeRollingParams(params))\n }\n\n async getLimit(params?: RollingQueryParams): Promise<RollingResponse> {\n return this.transport.get('/v1/rolling/limit', serializeRollingParams(params))\n }\n}\n\nfunction serializeRollingParams(\n params?: RollingQueryParams\n): Record<string, string | undefined> | undefined {\n if (!params) return undefined\n return {\n duration: params.duration,\n detail: params.detail,\n percentiles: params.percentiles?.join(','),\n }\n}\n","import type { HttpTransport } from '../transport/http'\nimport type { TumblingResponse, TumblingQueryParams } from '../types/tumbling'\n\nexport class TumblingResource {\n constructor(private readonly transport: HttpTransport) {}\n\n async get(params?: TumblingQueryParams): Promise<TumblingResponse> {\n return this.transport.get('/v1/tumbling', serializeTumblingParams(params))\n }\n\n async getFee(params?: TumblingQueryParams): Promise<TumblingResponse> {\n return this.transport.get('/v1/tumbling/fee', serializeTumblingParams(params))\n }\n\n async getPrice(params?: TumblingQueryParams): Promise<TumblingResponse> {\n return this.transport.get('/v1/tumbling/price', serializeTumblingParams(params))\n }\n\n async getLimit(params?: TumblingQueryParams): Promise<TumblingResponse> {\n return this.transport.get('/v1/tumbling/limit', serializeTumblingParams(params))\n }\n}\n\nfunction serializeTumblingParams(\n params?: TumblingQueryParams\n): Record<string, string | undefined> | undefined {\n if (!params) return undefined\n return {\n duration: params.duration,\n limit: params.limit?.toString(),\n detail: params.detail,\n percentiles: params.percentiles?.join(','),\n }\n}\n","import type { HttpTransport } from '../transport/http'\nimport type { DemoResponse } from '../types/demo'\n\nexport class DemoResource {\n constructor(private readonly transport: HttpTransport) {}\n\n async get(): Promise<DemoResponse> {\n return this.transport.get('/v1/demo')\n }\n}\n","import type { HttpTransport } from '../transport/http'\nimport type { SiwsVerifyRequest, VerifyResponse, MeResponse } from '../types/auth'\n\nexport class AuthResource {\n constructor(private readonly transport: HttpTransport) {}\n\n async verify(request: SiwsVerifyRequest): Promise<VerifyResponse> {\n return this.transport.post('/v1/auth/siws/verify', request)\n }\n\n async me(): Promise<MeResponse> {\n return this.transport.get('/v1/auth/me')\n }\n}\n","import type { HttpTransport } from '../transport/http'\nimport type { ApiKeyWithSecret, ListKeysResponse } from '../types/keys'\n\nexport class KeysResource {\n constructor(private readonly transport: HttpTransport) {}\n\n async create(name: string): Promise<ApiKeyWithSecret> {\n return this.transport.post('/v1/keys', { name })\n }\n\n async list(): Promise<ListKeysResponse> {\n return this.transport.get('/v1/keys')\n }\n\n async delete(id: string): Promise<{ disabled: boolean }> {\n return this.transport.delete(`/v1/keys/${encodeURIComponent(id)}`)\n }\n}\n","import type { HttpTransport } from '../transport/http'\nimport type { UsageResponse, DetailedUsageResponse, DetailedUsageParams } from '../types/usage'\n\nexport class UsageResource {\n constructor(private readonly transport: HttpTransport) {}\n\n async get(): Promise<UsageResponse> {\n return this.transport.get('/v1/usage')\n }\n\n async getDetailed(params: DetailedUsageParams): Promise<DetailedUsageResponse> {\n return this.transport.get('/v1/usage/detailed', {\n resolution: params.resolution,\n start: params.start?.toString(),\n end: params.end?.toString(),\n api_key_id: params.api_key_id,\n })\n }\n}\n","import type { HttpTransport } from '../transport/http'\nimport type { HealthResponse } from '../types/health'\n\nexport class HealthResource {\n constructor(private readonly transport: HttpTransport) {}\n\n async check(): Promise<HealthResponse> {\n return this.transport.get('/v1/health')\n }\n}\n","import { HttpTransport } from './transport/http'\nimport { BlockResource } from './resources/block'\nimport { RollingResource } from './resources/rolling'\nimport { TumblingResource } from './resources/tumbling'\nimport { DemoResource } from './resources/demo'\nimport { AuthResource } from './resources/auth'\nimport { KeysResource } from './resources/keys'\nimport { UsageResource } from './resources/usage'\nimport { HealthResource } from './resources/health'\n\nexport interface HttpClientOptions {\n baseUrl: string\n apiKey?: string\n token?: string\n fetch?: typeof globalThis.fetch\n}\n\nexport class HttpClient {\n readonly block: BlockResource\n readonly rolling: RollingResource\n readonly tumbling: TumblingResource\n readonly demo: DemoResource\n readonly auth: AuthResource\n readonly keys: KeysResource\n readonly usage: UsageResource\n readonly health: HealthResource\n\n private readonly transport: HttpTransport\n\n constructor(options: HttpClientOptions) {\n this.transport = new HttpTransport(options)\n this.block = new BlockResource(this.transport)\n this.rolling = new RollingResource(this.transport)\n this.tumbling = new TumblingResource(this.transport)\n this.demo = new DemoResource(this.transport)\n this.auth = new AuthResource(this.transport)\n this.keys = new KeysResource(this.transport)\n this.usage = new UsageResource(this.transport)\n this.health = new HealthResource(this.transport)\n }\n\n setToken(token: string): void {\n this.transport.setToken(token)\n }\n\n clearToken(): void {\n this.transport.clearToken()\n }\n}\n","import type {\n ClientMessage,\n ServerMessage,\n WsClientOptions,\n WsTransportState,\n WsTransportEvents,\n} from '../types/ws'\n\ntype EventName = keyof WsTransportEvents\ntype Listener<E extends EventName> = WsTransportEvents[E]\n\nexport class WsTransport {\n private ws: WebSocket | null = null\n private _state: WsTransportState = 'disconnected'\n private disposed = false\n private reconnectAttempt = 0\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null\n private pingTimer: ReturnType<typeof setInterval> | null = null\n private pongTimer: ReturnType<typeof setTimeout> | null = null\n private listeners = new Map<EventName, Set<Listener<any>>>()\n\n private readonly url: string\n private readonly reconnect: boolean\n private readonly maxReconnectAttempts: number\n private readonly reconnectDelay: number\n private readonly pingInterval: number\n private readonly WsCtor: typeof WebSocket\n\n constructor(options: WsClientOptions) {\n const base = options.baseUrl.replace(/^http/, 'ws').replace(/\\/+$/, '')\n this.url = `${base}/v1/ws?api_key=${encodeURIComponent(options.apiKey)}`\n this.reconnect = options.reconnect ?? true\n this.maxReconnectAttempts = options.maxReconnectAttempts ?? 10\n this.reconnectDelay = options.reconnectDelay ?? 1000\n this.pingInterval = options.pingInterval ?? 30_000\n this.WsCtor = (options.WebSocket ?? WebSocket) as typeof WebSocket\n }\n\n get state(): WsTransportState {\n return this._state\n }\n\n connect(): void {\n this.disposed = false\n if (this.ws) return\n\n this.setState('connecting')\n const ws = new this.WsCtor(this.url)\n\n ws.onopen = () => {\n this.reconnectAttempt = 0\n this.setState('connected')\n this.startPing()\n this.emit('open')\n }\n\n ws.onclose = (e: CloseEvent) => {\n this.stopPing()\n this.ws = null\n this.emit('close', e.code, e.reason)\n\n if (!this.disposed && this.reconnect) {\n this.scheduleReconnect()\n } else {\n this.setState('disconnected')\n }\n }\n\n ws.onerror = (e: Event) => {\n this.emit('error', e)\n }\n\n ws.onmessage = (e: MessageEvent) => {\n this.handleMessage(e.data as string)\n }\n\n this.ws = ws\n }\n\n disconnect(): void {\n this.disposed = true\n this.clearReconnectTimer()\n this.stopPing()\n if (this.ws) {\n this.ws.onclose = null\n this.ws.onerror = null\n this.ws.onmessage = null\n this.ws.onopen = null\n this.ws.close(1000)\n this.ws = null\n }\n this.setState('disconnected')\n }\n\n send(msg: ClientMessage): void {\n if (this.ws && this.ws.readyState === WebSocket.OPEN) {\n this.ws.send(JSON.stringify(msg))\n }\n }\n\n on<E extends EventName>(event: E, fn: Listener<E>): void {\n let set = this.listeners.get(event)\n if (!set) {\n set = new Set()\n this.listeners.set(event, set)\n }\n set.add(fn)\n }\n\n off<E extends EventName>(event: E, fn: Listener<E>): void {\n this.listeners.get(event)?.delete(fn)\n }\n\n // --- Private ---\n\n private emit<E extends EventName>(event: E, ...args: Parameters<WsTransportEvents[E]>): void {\n const set = this.listeners.get(event)\n if (!set) return\n for (const fn of set) {\n (fn as (...a: unknown[]) => void)(...args)\n }\n }\n\n private setState(s: WsTransportState): void {\n if (this._state === s) return\n this._state = s\n this.emit('stateChange', s)\n }\n\n private handleMessage(raw: string): void {\n let msg: ServerMessage\n try {\n msg = JSON.parse(raw) as ServerMessage\n } catch {\n return\n }\n\n if (msg.type === 'pong') {\n this.clearPongTimer()\n }\n\n this.emit('message', msg)\n }\n\n private startPing(): void {\n this.stopPing()\n this.pingTimer = setInterval(() => {\n this.send({ type: 'ping' })\n this.pongTimer = setTimeout(() => {\n // No pong received — force close to trigger reconnect\n if (this.ws) {\n this.ws.close(4000, 'pong timeout')\n }\n }, 10_000)\n }, this.pingInterval)\n }\n\n private stopPing(): void {\n if (this.pingTimer !== null) {\n clearInterval(this.pingTimer)\n this.pingTimer = null\n }\n this.clearPongTimer()\n }\n\n private clearPongTimer(): void {\n if (this.pongTimer !== null) {\n clearTimeout(this.pongTimer)\n this.pongTimer = null\n }\n }\n\n private scheduleReconnect(): void {\n if (this.reconnectAttempt >= this.maxReconnectAttempts) {\n this.setState('disconnected')\n return\n }\n\n this.setState('reconnecting')\n const delay = Math.min(this.reconnectDelay * Math.pow(2, this.reconnectAttempt), 30_000)\n const jitter = Math.random() * delay * 0.2\n this.reconnectAttempt++\n\n this.reconnectTimer = setTimeout(() => {\n this.reconnectTimer = null\n this.connect()\n }, delay + jitter)\n }\n\n private clearReconnectTimer(): void {\n if (this.reconnectTimer !== null) {\n clearTimeout(this.reconnectTimer)\n this.reconnectTimer = null\n }\n }\n}\n","import { WsTransport } from './transport/ws'\nimport type {\n WsChannel,\n WsClientOptions,\n WsTransportState,\n WsTransportEvents,\n BlockSubscribeParams,\n RollingSubscribeParams,\n Subscription,\n SubscriptionHandlers,\n SubscribedMessage,\n DataMessage,\n WsErrorMessage,\n ChannelPayloadMap,\n SubscribeParams,\n} from './types/ws'\n\ntype ClientEventName = 'open' | 'close' | 'error' | 'stateChange'\ntype ClientListener<E extends ClientEventName> = WsTransportEvents[E]\n\ninterface ActiveSubscription {\n channel: WsChannel\n params: SubscribeParams\n onData: (data: unknown) => void\n onError?: (error: WsErrorMessage) => void\n /** Mutable — gets updated on reconnect re-subscribe */\n currentId: string\n}\n\ninterface PendingSubscription {\n resolve: (sub: Subscription) => void\n reject: (err: Error) => void\n channel: WsChannel\n params: SubscribeParams\n onData: (data: unknown) => void\n onError?: (error: WsErrorMessage) => void\n}\n\nexport class WsClient {\n private readonly transport: WsTransport\n private readonly active = new Map<string, ActiveSubscription>()\n private readonly pending: PendingSubscription[] = []\n\n constructor(options: WsClientOptions) {\n this.transport = new WsTransport(options)\n this.transport.on('message', (msg) => this.handleMessage(msg))\n this.transport.on('open', () => this.handleReconnect())\n\n if (options.autoConnect !== false) {\n this.transport.connect()\n }\n }\n\n get state(): WsTransportState {\n return this.transport.state\n }\n\n connect(): void {\n this.transport.connect()\n }\n\n disconnect(): void {\n this.transport.disconnect()\n // Reject any pending subscriptions\n for (const p of this.pending) {\n p.reject(new Error('Client disconnected'))\n }\n this.pending.length = 0\n this.active.clear()\n }\n\n on<E extends ClientEventName>(event: E, fn: ClientListener<E>): void {\n this.transport.on(event, fn as WsTransportEvents[typeof event])\n }\n\n off<E extends ClientEventName>(event: E, fn: ClientListener<E>): void {\n this.transport.off(event, fn as WsTransportEvents[typeof event])\n }\n\n subscribeBlock(\n params: BlockSubscribeParams,\n handlers: SubscriptionHandlers<'block'>,\n ): Promise<Subscription> {\n return this.subscribe({ channel: { type: 'block', ...params } }, 'block', handlers)\n }\n\n subscribeRolling(\n params: RollingSubscribeParams,\n handlers: SubscriptionHandlers<'rolling'>,\n ): Promise<Subscription> {\n return this.subscribe({ channel: { type: 'rolling', ...params } }, 'rolling', handlers)\n }\n\n subscribeDemo(handlers: SubscriptionHandlers<'demo'>): Promise<Subscription> {\n return this.subscribe({ channel: { type: 'demo' } }, 'demo', handlers)\n }\n\n private subscribe<C extends WsChannel>(\n params: SubscribeParams,\n channel: C,\n handlers: SubscriptionHandlers<C>,\n ): Promise<Subscription> {\n return new Promise<Subscription>((resolve, reject) => {\n this.pending.push({\n resolve,\n reject,\n channel,\n params,\n onData: handlers.onData as (data: unknown) => void,\n onError: handlers.onError,\n })\n this.transport.send({ type: 'subscribe', channel: params.channel })\n })\n }\n\n private handleMessage(msg: import('./types/ws').ServerMessage): void {\n switch (msg.type) {\n case 'subscribed':\n this.handleSubscribed(msg)\n break\n case 'data':\n this.handleData(msg)\n break\n case 'unsubscribed':\n this.active.delete(msg.id)\n break\n case 'error':\n this.handleError(msg)\n break\n }\n }\n\n private handleSubscribed(msg: SubscribedMessage): void {\n const p = this.pending.shift()\n if (!p) return\n\n const entry: ActiveSubscription = {\n channel: p.channel,\n params: p.params,\n onData: p.onData,\n onError: p.onError,\n currentId: msg.id,\n }\n\n this.active.set(msg.id, entry)\n\n const subscription: Subscription = {\n get id() {\n return entry.currentId\n },\n channel: p.channel,\n unsubscribe: () => {\n this.transport.send({ type: 'unsubscribe', id: entry.currentId })\n this.active.delete(entry.currentId)\n },\n }\n\n p.resolve(subscription)\n }\n\n private handleData(msg: DataMessage): void {\n const entry = this.active.get(msg.id)\n if (entry) {\n entry.onData(msg.payload)\n }\n }\n\n private handleError(msg: WsErrorMessage): void {\n if (msg.id) {\n const entry = this.active.get(msg.id)\n if (entry?.onError) {\n entry.onError(msg)\n }\n } else {\n // Error without id — reject the oldest pending subscription\n const p = this.pending.shift()\n if (p) {\n p.reject(new Error(`${msg.code}: ${msg.message}`))\n }\n }\n }\n\n private handleReconnect(): void {\n if (this.active.size > 0) {\n const entries = Array.from(this.active.values())\n this.active.clear()\n\n for (const entry of entries) {\n this.pending.push({\n resolve: (sub) => { entry.currentId = sub.id },\n reject: () => {},\n channel: entry.channel,\n params: entry.params,\n onData: entry.onData,\n onError: entry.onError,\n })\n }\n }\n\n for (const p of this.pending) {\n this.transport.send({ type: 'subscribe', channel: p.params.channel })\n }\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/index.ts","../src/types/errors.ts","../src/transport/http.ts","../src/resources/block.ts","../src/resources/rolling.ts","../src/resources/tumbling.ts","../src/resources/demo.ts","../src/resources/auth.ts","../src/resources/keys.ts","../src/resources/usage.ts","../src/resources/health.ts","../src/http-client.ts","../src/transport/ws.ts","../src/ws-client.ts"],"sourcesContent":["export { HttpClient } from './http-client'\nexport type { HttpClientOptions } from './http-client'\n\nexport { HttpTransport } from './transport/http'\nexport type { HttpTransportOptions } from './transport/http'\n\nexport { WsClient } from './ws-client'\nexport type { WsClientOptions } from './types/ws'\n\nexport { WsTransport } from './transport/ws'\n\n// Types\nexport type {\n Duration,\n DetailLevel,\n Percentile,\n Metric,\n TimeResolution,\n Percentiles,\n BlockModel,\n BlockListResponse,\n BlockQueryParams,\n RollingModel,\n RollingResponse,\n RollingQueryParams,\n TumblingModel,\n TumblingResponse,\n TumblingQueryParams,\n DemoModel,\n DemoResponse,\n SiwsVerifyRequest,\n VerifyResponse,\n MeResponse,\n ApiKey,\n ApiKeyWithSecret,\n ListKeysResponse,\n Endpoint,\n UsageEntry,\n UsageResponse,\n DetailedUsageEntry,\n DetailedUsageResponse,\n DetailedUsageParams,\n HealthResponse,\n WsChannel,\n BlockSubscribeParams,\n RollingSubscribeParams,\n DemoSubscribeParams,\n SubscribeParams,\n Subscription,\n SubscriptionHandlers,\n ChannelPayloadMap,\n WsTransportState,\n WsTransportEvents,\n WsErrorMessage,\n} from './types'\n\n// Errors\nexport { SdkError, ApiError } from './types/errors'\n","export class SdkError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'SdkError'\n }\n}\n\nexport class ApiError extends SdkError {\n readonly status: number\n readonly body?: unknown\n\n constructor(status: number, message: string, body?: unknown) {\n super(message)\n this.name = 'ApiError'\n this.status = status\n this.body = body\n }\n}\n","import { ApiError, SdkError } from '../types/errors'\n\nexport interface HttpTransportOptions {\n baseUrl?: string\n apiKey?: string\n token?: string\n fetch?: typeof globalThis.fetch\n}\n\nexport class HttpTransport {\n private readonly baseUrl: string\n private apiKey?: string\n private token?: string\n private readonly fetch: typeof globalThis.fetch\n\n constructor(options: HttpTransportOptions) {\n this.baseUrl = (options.baseUrl ?? 'https://api.priorityfee.com').replace(/\\/+$/, '')\n this.apiKey = options.apiKey\n this.token = options.token\n this.fetch = options.fetch ?? globalThis.fetch.bind(globalThis)\n }\n\n setToken(token: string): void {\n this.token = token\n }\n\n clearToken(): void {\n this.token = undefined\n }\n\n async get<T>(path: string, params?: Record<string, string | undefined>): Promise<T> {\n const url = this.buildUrl(path, params)\n return this.request<T>(url, { method: 'GET' })\n }\n\n async post<T>(path: string, body?: unknown): Promise<T> {\n const url = this.buildUrl(path)\n return this.request<T>(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: body !== undefined ? JSON.stringify(body) : undefined,\n })\n }\n\n async delete<T>(path: string): Promise<T> {\n const url = this.buildUrl(path)\n return this.request<T>(url, { method: 'DELETE' })\n }\n\n private buildUrl(path: string, params?: Record<string, string | undefined>): string {\n const url = new URL(`${this.baseUrl}${path}`)\n if (params) {\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined) {\n url.searchParams.set(key, value)\n }\n }\n }\n return url.toString()\n }\n\n private async request<T>(url: string, init: RequestInit): Promise<T> {\n const headers = new Headers(init.headers)\n\n if (this.token) {\n headers.set('Authorization', `Bearer ${this.token}`)\n }\n if (this.apiKey) {\n headers.set('X-API-Key', this.apiKey)\n }\n\n let response: Response\n try {\n response = await this.fetch(url, { ...init, headers })\n } catch (err) {\n throw new SdkError(\n `Network error: ${err instanceof Error ? err.message : String(err)}`\n )\n }\n\n if (!response.ok) {\n let body: unknown\n try {\n body = await response.json()\n } catch {\n body = await response.text().catch(() => undefined)\n }\n const message =\n body && typeof body === 'object' && 'error' in body\n ? String((body as Record<string, unknown>).error)\n : `HTTP ${response.status}`\n throw new ApiError(response.status, message, body)\n }\n\n return (await response.json()) as T\n }\n}\n","import type { HttpTransport } from '../transport/http'\nimport type { BlockListResponse, BlockQueryParams } from '../types/block'\n\nexport class BlockResource {\n constructor(private readonly transport: HttpTransport) {}\n\n async get(params?: BlockQueryParams): Promise<BlockListResponse> {\n return this.transport.get('/v1/block', serializeBlockParams(params))\n }\n\n async getFee(params?: BlockQueryParams): Promise<BlockListResponse> {\n return this.transport.get('/v1/block/fee', serializeBlockParams(params))\n }\n\n async getPrice(params?: BlockQueryParams): Promise<BlockListResponse> {\n return this.transport.get('/v1/block/price', serializeBlockParams(params))\n }\n\n async getLimit(params?: BlockQueryParams): Promise<BlockListResponse> {\n return this.transport.get('/v1/block/limit', serializeBlockParams(params))\n }\n}\n\nfunction serializeBlockParams(\n params?: BlockQueryParams\n): Record<string, string | undefined> | undefined {\n if (!params) return undefined\n return {\n limit: params.limit?.toString(),\n detail: params.detail,\n percentiles: params.percentiles?.join(','),\n }\n}\n","import type { HttpTransport } from '../transport/http'\nimport type { RollingResponse, RollingQueryParams } from '../types/rolling'\n\nexport class RollingResource {\n constructor(private readonly transport: HttpTransport) {}\n\n async get(params?: RollingQueryParams): Promise<RollingResponse> {\n return this.transport.get('/v1/rolling', serializeRollingParams(params))\n }\n\n async getFee(params?: RollingQueryParams): Promise<RollingResponse> {\n return this.transport.get('/v1/rolling/fee', serializeRollingParams(params))\n }\n\n async getPrice(params?: RollingQueryParams): Promise<RollingResponse> {\n return this.transport.get('/v1/rolling/price', serializeRollingParams(params))\n }\n\n async getLimit(params?: RollingQueryParams): Promise<RollingResponse> {\n return this.transport.get('/v1/rolling/limit', serializeRollingParams(params))\n }\n}\n\nfunction serializeRollingParams(\n params?: RollingQueryParams\n): Record<string, string | undefined> | undefined {\n if (!params) return undefined\n return {\n duration: params.duration,\n detail: params.detail,\n percentiles: params.percentiles?.join(','),\n }\n}\n","import type { HttpTransport } from '../transport/http'\nimport type { TumblingResponse, TumblingQueryParams } from '../types/tumbling'\n\nexport class TumblingResource {\n constructor(private readonly transport: HttpTransport) {}\n\n async get(params?: TumblingQueryParams): Promise<TumblingResponse> {\n return this.transport.get('/v1/tumbling', serializeTumblingParams(params))\n }\n\n async getFee(params?: TumblingQueryParams): Promise<TumblingResponse> {\n return this.transport.get('/v1/tumbling/fee', serializeTumblingParams(params))\n }\n\n async getPrice(params?: TumblingQueryParams): Promise<TumblingResponse> {\n return this.transport.get('/v1/tumbling/price', serializeTumblingParams(params))\n }\n\n async getLimit(params?: TumblingQueryParams): Promise<TumblingResponse> {\n return this.transport.get('/v1/tumbling/limit', serializeTumblingParams(params))\n }\n}\n\nfunction serializeTumblingParams(\n params?: TumblingQueryParams\n): Record<string, string | undefined> | undefined {\n if (!params) return undefined\n return {\n duration: params.duration,\n limit: params.limit?.toString(),\n detail: params.detail,\n percentiles: params.percentiles?.join(','),\n }\n}\n","import type { HttpTransport } from '../transport/http'\nimport type { DemoResponse } from '../types/demo'\n\nexport class DemoResource {\n constructor(private readonly transport: HttpTransport) {}\n\n async get(): Promise<DemoResponse> {\n return this.transport.get('/v1/demo')\n }\n}\n","import type { HttpTransport } from '../transport/http'\nimport type { SiwsVerifyRequest, VerifyResponse, MeResponse } from '../types/auth'\n\nexport class AuthResource {\n constructor(private readonly transport: HttpTransport) {}\n\n async verify(request: SiwsVerifyRequest): Promise<VerifyResponse> {\n return this.transport.post('/v1/auth/siws/verify', request)\n }\n\n async me(): Promise<MeResponse> {\n return this.transport.get('/v1/auth/me')\n }\n}\n","import type { HttpTransport } from '../transport/http'\nimport type { ApiKeyWithSecret, ListKeysResponse } from '../types/keys'\n\nexport class KeysResource {\n constructor(private readonly transport: HttpTransport) {}\n\n async create(name: string): Promise<ApiKeyWithSecret> {\n return this.transport.post('/v1/keys', { name })\n }\n\n async list(): Promise<ListKeysResponse> {\n return this.transport.get('/v1/keys')\n }\n\n async delete(id: string): Promise<{ disabled: boolean }> {\n return this.transport.delete(`/v1/keys/${encodeURIComponent(id)}`)\n }\n}\n","import type { HttpTransport } from '../transport/http'\nimport type { UsageResponse, DetailedUsageResponse, DetailedUsageParams } from '../types/usage'\n\nexport class UsageResource {\n constructor(private readonly transport: HttpTransport) {}\n\n async get(): Promise<UsageResponse> {\n return this.transport.get('/v1/usage')\n }\n\n async getDetailed(params: DetailedUsageParams): Promise<DetailedUsageResponse> {\n return this.transport.get('/v1/usage/detailed', {\n resolution: params.resolution,\n start: params.start?.toString(),\n end: params.end?.toString(),\n api_key_id: params.api_key_id,\n })\n }\n}\n","import type { HttpTransport } from '../transport/http'\nimport type { HealthResponse } from '../types/health'\n\nexport class HealthResource {\n constructor(private readonly transport: HttpTransport) {}\n\n async check(): Promise<HealthResponse> {\n return this.transport.get('/v1/health')\n }\n}\n","import { HttpTransport } from './transport/http'\nimport { BlockResource } from './resources/block'\nimport { RollingResource } from './resources/rolling'\nimport { TumblingResource } from './resources/tumbling'\nimport { DemoResource } from './resources/demo'\nimport { AuthResource } from './resources/auth'\nimport { KeysResource } from './resources/keys'\nimport { UsageResource } from './resources/usage'\nimport { HealthResource } from './resources/health'\n\nexport interface HttpClientOptions {\n baseUrl?: string\n apiKey?: string\n token?: string\n fetch?: typeof globalThis.fetch\n}\n\nexport class HttpClient {\n readonly block: BlockResource\n readonly rolling: RollingResource\n readonly tumbling: TumblingResource\n readonly demo: DemoResource\n readonly auth: AuthResource\n readonly keys: KeysResource\n readonly usage: UsageResource\n readonly health: HealthResource\n\n private readonly transport: HttpTransport\n\n constructor(options: HttpClientOptions) {\n this.transport = new HttpTransport(options)\n this.block = new BlockResource(this.transport)\n this.rolling = new RollingResource(this.transport)\n this.tumbling = new TumblingResource(this.transport)\n this.demo = new DemoResource(this.transport)\n this.auth = new AuthResource(this.transport)\n this.keys = new KeysResource(this.transport)\n this.usage = new UsageResource(this.transport)\n this.health = new HealthResource(this.transport)\n }\n\n setToken(token: string): void {\n this.transport.setToken(token)\n }\n\n clearToken(): void {\n this.transport.clearToken()\n }\n}\n","import type {\n ClientMessage,\n ServerMessage,\n WsClientOptions,\n WsTransportState,\n WsTransportEvents,\n} from '../types/ws'\n\ntype EventName = keyof WsTransportEvents\ntype Listener<E extends EventName> = WsTransportEvents[E]\n\nexport class WsTransport {\n private ws: WebSocket | null = null\n private _state: WsTransportState = 'disconnected'\n private disposed = false\n private reconnectAttempt = 0\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null\n private pingTimer: ReturnType<typeof setInterval> | null = null\n private pongTimer: ReturnType<typeof setTimeout> | null = null\n private listeners = new Map<EventName, Set<Listener<any>>>()\n\n private readonly url: string\n private readonly reconnect: boolean\n private readonly maxReconnectAttempts: number\n private readonly reconnectDelay: number\n private readonly pingInterval: number\n private readonly WsCtor: typeof WebSocket\n\n constructor(options: WsClientOptions) {\n const base = (options.baseUrl ?? 'wss://api.priorityfee.com').replace(/^http/, 'ws').replace(/\\/+$/, '')\n this.url = `${base}/v1/ws?api_key=${encodeURIComponent(options.apiKey)}`\n this.reconnect = options.reconnect ?? true\n this.maxReconnectAttempts = options.maxReconnectAttempts ?? 10\n this.reconnectDelay = options.reconnectDelay ?? 1000\n this.pingInterval = options.pingInterval ?? 30_000\n this.WsCtor = (options.WebSocket ?? WebSocket) as typeof WebSocket\n }\n\n get state(): WsTransportState {\n return this._state\n }\n\n connect(): void {\n this.disposed = false\n if (this.ws) return\n\n this.setState('connecting')\n const ws = new this.WsCtor(this.url)\n\n ws.onopen = () => {\n this.reconnectAttempt = 0\n this.setState('connected')\n this.startPing()\n this.emit('open')\n }\n\n ws.onclose = (e: CloseEvent) => {\n this.stopPing()\n this.ws = null\n this.emit('close', e.code, e.reason)\n\n if (!this.disposed && this.reconnect) {\n this.scheduleReconnect()\n } else {\n this.setState('disconnected')\n }\n }\n\n ws.onerror = (e: Event) => {\n this.emit('error', e)\n }\n\n ws.onmessage = (e: MessageEvent) => {\n this.handleMessage(e.data as string)\n }\n\n this.ws = ws\n }\n\n disconnect(): void {\n this.disposed = true\n this.clearReconnectTimer()\n this.stopPing()\n if (this.ws) {\n this.ws.onclose = null\n this.ws.onerror = null\n this.ws.onmessage = null\n this.ws.onopen = null\n this.ws.close(1000)\n this.ws = null\n }\n this.setState('disconnected')\n }\n\n send(msg: ClientMessage): void {\n if (this.ws && this.ws.readyState === WebSocket.OPEN) {\n this.ws.send(JSON.stringify(msg))\n }\n }\n\n on<E extends EventName>(event: E, fn: Listener<E>): void {\n let set = this.listeners.get(event)\n if (!set) {\n set = new Set()\n this.listeners.set(event, set)\n }\n set.add(fn)\n }\n\n off<E extends EventName>(event: E, fn: Listener<E>): void {\n this.listeners.get(event)?.delete(fn)\n }\n\n // --- Private ---\n\n private emit<E extends EventName>(event: E, ...args: Parameters<WsTransportEvents[E]>): void {\n const set = this.listeners.get(event)\n if (!set) return\n for (const fn of set) {\n (fn as (...a: unknown[]) => void)(...args)\n }\n }\n\n private setState(s: WsTransportState): void {\n if (this._state === s) return\n this._state = s\n this.emit('stateChange', s)\n }\n\n private handleMessage(raw: string): void {\n let msg: ServerMessage\n try {\n msg = JSON.parse(raw) as ServerMessage\n } catch {\n return\n }\n\n if (msg.type === 'pong') {\n this.clearPongTimer()\n }\n\n this.emit('message', msg)\n }\n\n private startPing(): void {\n this.stopPing()\n this.pingTimer = setInterval(() => {\n this.send({ type: 'ping' })\n this.pongTimer = setTimeout(() => {\n // No pong received — force close to trigger reconnect\n if (this.ws) {\n this.ws.close(4000, 'pong timeout')\n }\n }, 10_000)\n }, this.pingInterval)\n }\n\n private stopPing(): void {\n if (this.pingTimer !== null) {\n clearInterval(this.pingTimer)\n this.pingTimer = null\n }\n this.clearPongTimer()\n }\n\n private clearPongTimer(): void {\n if (this.pongTimer !== null) {\n clearTimeout(this.pongTimer)\n this.pongTimer = null\n }\n }\n\n private scheduleReconnect(): void {\n if (this.reconnectAttempt >= this.maxReconnectAttempts) {\n this.setState('disconnected')\n return\n }\n\n this.setState('reconnecting')\n const delay = Math.min(this.reconnectDelay * Math.pow(2, this.reconnectAttempt), 30_000)\n const jitter = Math.random() * delay * 0.2\n this.reconnectAttempt++\n\n this.reconnectTimer = setTimeout(() => {\n this.reconnectTimer = null\n this.connect()\n }, delay + jitter)\n }\n\n private clearReconnectTimer(): void {\n if (this.reconnectTimer !== null) {\n clearTimeout(this.reconnectTimer)\n this.reconnectTimer = null\n }\n }\n}\n","import { WsTransport } from './transport/ws'\nimport type {\n WsChannel,\n WsClientOptions,\n WsTransportState,\n WsTransportEvents,\n BlockSubscribeParams,\n RollingSubscribeParams,\n Subscription,\n SubscriptionHandlers,\n SubscribedMessage,\n DataMessage,\n WsErrorMessage,\n ChannelPayloadMap,\n SubscribeParams,\n} from './types/ws'\n\ntype ClientEventName = 'open' | 'close' | 'error' | 'stateChange'\ntype ClientListener<E extends ClientEventName> = WsTransportEvents[E]\n\ninterface ActiveSubscription {\n channel: WsChannel\n params: SubscribeParams\n onData: (data: unknown) => void\n onError?: (error: WsErrorMessage) => void\n /** Mutable — gets updated on reconnect re-subscribe */\n currentId: string\n}\n\ninterface PendingSubscription {\n resolve: (sub: Subscription) => void\n reject: (err: Error) => void\n channel: WsChannel\n params: SubscribeParams\n onData: (data: unknown) => void\n onError?: (error: WsErrorMessage) => void\n}\n\nexport class WsClient {\n private readonly transport: WsTransport\n private readonly active = new Map<string, ActiveSubscription>()\n private readonly pending: PendingSubscription[] = []\n\n constructor(options: WsClientOptions) {\n this.transport = new WsTransport(options)\n this.transport.on('message', (msg) => this.handleMessage(msg))\n this.transport.on('open', () => this.handleReconnect())\n\n if (options.autoConnect !== false) {\n this.transport.connect()\n }\n }\n\n get state(): WsTransportState {\n return this.transport.state\n }\n\n connect(): void {\n this.transport.connect()\n }\n\n disconnect(): void {\n this.transport.disconnect()\n // Reject any pending subscriptions\n for (const p of this.pending) {\n p.reject(new Error('Client disconnected'))\n }\n this.pending.length = 0\n this.active.clear()\n }\n\n on<E extends ClientEventName>(event: E, fn: ClientListener<E>): void {\n this.transport.on(event, fn as WsTransportEvents[typeof event])\n }\n\n off<E extends ClientEventName>(event: E, fn: ClientListener<E>): void {\n this.transport.off(event, fn as WsTransportEvents[typeof event])\n }\n\n subscribeBlock(\n params: BlockSubscribeParams,\n handlers: SubscriptionHandlers<'block'>,\n ): Promise<Subscription> {\n return this.subscribe({ channel: { type: 'block', ...params } }, 'block', handlers)\n }\n\n subscribeRolling(\n params: RollingSubscribeParams,\n handlers: SubscriptionHandlers<'rolling'>,\n ): Promise<Subscription> {\n return this.subscribe({ channel: { type: 'rolling', ...params } }, 'rolling', handlers)\n }\n\n subscribeDemo(handlers: SubscriptionHandlers<'demo'>): Promise<Subscription> {\n return this.subscribe({ channel: { type: 'demo' } }, 'demo', handlers)\n }\n\n private subscribe<C extends WsChannel>(\n params: SubscribeParams,\n channel: C,\n handlers: SubscriptionHandlers<C>,\n ): Promise<Subscription> {\n return new Promise<Subscription>((resolve, reject) => {\n this.pending.push({\n resolve,\n reject,\n channel,\n params,\n onData: handlers.onData as (data: unknown) => void,\n onError: handlers.onError,\n })\n this.transport.send({ type: 'subscribe', channel: params.channel })\n })\n }\n\n private handleMessage(msg: import('./types/ws').ServerMessage): void {\n switch (msg.type) {\n case 'subscribed':\n this.handleSubscribed(msg)\n break\n case 'data':\n this.handleData(msg)\n break\n case 'unsubscribed':\n this.active.delete(msg.id)\n break\n case 'error':\n this.handleError(msg)\n break\n }\n }\n\n private handleSubscribed(msg: SubscribedMessage): void {\n const p = this.pending.shift()\n if (!p) return\n\n const entry: ActiveSubscription = {\n channel: p.channel,\n params: p.params,\n onData: p.onData,\n onError: p.onError,\n currentId: msg.id,\n }\n\n this.active.set(msg.id, entry)\n\n const subscription: Subscription = {\n get id() {\n return entry.currentId\n },\n channel: p.channel,\n unsubscribe: () => {\n this.transport.send({ type: 'unsubscribe', id: entry.currentId })\n this.active.delete(entry.currentId)\n },\n }\n\n p.resolve(subscription)\n }\n\n private handleData(msg: DataMessage): void {\n const entry = this.active.get(msg.id)\n if (entry) {\n entry.onData(msg.payload)\n }\n }\n\n private handleError(msg: WsErrorMessage): void {\n if (msg.id) {\n const entry = this.active.get(msg.id)\n if (entry?.onError) {\n entry.onError(msg)\n }\n } else {\n // Error without id — reject the oldest pending subscription\n const p = this.pending.shift()\n if (p) {\n p.reject(new Error(`${msg.code}: ${msg.message}`))\n }\n }\n }\n\n private handleReconnect(): void {\n if (this.active.size > 0) {\n const entries = Array.from(this.active.values())\n this.active.clear()\n\n for (const entry of entries) {\n this.pending.push({\n resolve: (sub) => { entry.currentId = sub.id },\n reject: () => {},\n channel: entry.channel,\n params: entry.params,\n onData: entry.onData,\n onError: entry.onError,\n })\n }\n }\n\n for (const p of this.pending) {\n this.transport.send({ type: 'subscribe', channel: p.params.channel })\n }\n }\n}\n"],"mappings":"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","names":[]}
package/dist/index.d.cts CHANGED
@@ -1,5 +1,5 @@
1
1
  interface HttpTransportOptions {
2
- baseUrl: string;
2
+ baseUrl?: string;
3
3
  apiKey?: string;
4
4
  token?: string;
5
5
  fetch?: typeof globalThis.fetch;
@@ -321,7 +321,7 @@ declare class HealthResource {
321
321
  }
322
322
 
323
323
  interface HttpClientOptions {
324
- baseUrl: string;
324
+ baseUrl?: string;
325
325
  apiKey?: string;
326
326
  token?: string;
327
327
  fetch?: typeof globalThis.fetch;
@@ -418,7 +418,7 @@ interface SubscriptionHandlers<C extends WsChannel> {
418
418
  onError?: (error: WsErrorMessage) => void;
419
419
  }
420
420
  interface WsClientOptions {
421
- baseUrl: string;
421
+ baseUrl?: string;
422
422
  apiKey: string;
423
423
  autoConnect?: boolean;
424
424
  reconnect?: boolean;
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  interface HttpTransportOptions {
2
- baseUrl: string;
2
+ baseUrl?: string;
3
3
  apiKey?: string;
4
4
  token?: string;
5
5
  fetch?: typeof globalThis.fetch;
@@ -321,7 +321,7 @@ declare class HealthResource {
321
321
  }
322
322
 
323
323
  interface HttpClientOptions {
324
- baseUrl: string;
324
+ baseUrl?: string;
325
325
  apiKey?: string;
326
326
  token?: string;
327
327
  fetch?: typeof globalThis.fetch;
@@ -418,7 +418,7 @@ interface SubscriptionHandlers<C extends WsChannel> {
418
418
  onError?: (error: WsErrorMessage) => void;
419
419
  }
420
420
  interface WsClientOptions {
421
- baseUrl: string;
421
+ baseUrl?: string;
422
422
  apiKey: string;
423
423
  autoConnect?: boolean;
424
424
  reconnect?: boolean;
package/dist/index.mjs CHANGED
@@ -17,7 +17,7 @@ var ApiError = class extends SdkError {
17
17
  // src/transport/http.ts
18
18
  var HttpTransport = class {
19
19
  constructor(options) {
20
- this.baseUrl = options.baseUrl.replace(/\/+$/, "");
20
+ this.baseUrl = (options.baseUrl ?? "https://api.priorityfee.com").replace(/\/+$/, "");
21
21
  this.apiKey = options.apiKey;
22
22
  this.token = options.token;
23
23
  this.fetch = options.fetch ?? globalThis.fetch.bind(globalThis);
@@ -266,7 +266,7 @@ var WsTransport = class {
266
266
  this.pingTimer = null;
267
267
  this.pongTimer = null;
268
268
  this.listeners = /* @__PURE__ */ new Map();
269
- const base = options.baseUrl.replace(/^http/, "ws").replace(/\/+$/, "");
269
+ const base = (options.baseUrl ?? "wss://api.priorityfee.com").replace(/^http/, "ws").replace(/\/+$/, "");
270
270
  this.url = `${base}/v1/ws?api_key=${encodeURIComponent(options.apiKey)}`;
271
271
  this.reconnect = options.reconnect ?? true;
272
272
  this.maxReconnectAttempts = options.maxReconnectAttempts ?? 10;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/types/errors.ts","../src/transport/http.ts","../src/resources/block.ts","../src/resources/rolling.ts","../src/resources/tumbling.ts","../src/resources/demo.ts","../src/resources/auth.ts","../src/resources/keys.ts","../src/resources/usage.ts","../src/resources/health.ts","../src/http-client.ts","../src/transport/ws.ts","../src/ws-client.ts"],"sourcesContent":["export class SdkError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'SdkError'\n }\n}\n\nexport class ApiError extends SdkError {\n readonly status: number\n readonly body?: unknown\n\n constructor(status: number, message: string, body?: unknown) {\n super(message)\n this.name = 'ApiError'\n this.status = status\n this.body = body\n }\n}\n","import { ApiError, SdkError } from '../types/errors'\n\nexport interface HttpTransportOptions {\n baseUrl: string\n apiKey?: string\n token?: string\n fetch?: typeof globalThis.fetch\n}\n\nexport class HttpTransport {\n private readonly baseUrl: string\n private apiKey?: string\n private token?: string\n private readonly fetch: typeof globalThis.fetch\n\n constructor(options: HttpTransportOptions) {\n this.baseUrl = options.baseUrl.replace(/\\/+$/, '')\n this.apiKey = options.apiKey\n this.token = options.token\n this.fetch = options.fetch ?? globalThis.fetch.bind(globalThis)\n }\n\n setToken(token: string): void {\n this.token = token\n }\n\n clearToken(): void {\n this.token = undefined\n }\n\n async get<T>(path: string, params?: Record<string, string | undefined>): Promise<T> {\n const url = this.buildUrl(path, params)\n return this.request<T>(url, { method: 'GET' })\n }\n\n async post<T>(path: string, body?: unknown): Promise<T> {\n const url = this.buildUrl(path)\n return this.request<T>(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: body !== undefined ? JSON.stringify(body) : undefined,\n })\n }\n\n async delete<T>(path: string): Promise<T> {\n const url = this.buildUrl(path)\n return this.request<T>(url, { method: 'DELETE' })\n }\n\n private buildUrl(path: string, params?: Record<string, string | undefined>): string {\n const url = new URL(`${this.baseUrl}${path}`)\n if (params) {\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined) {\n url.searchParams.set(key, value)\n }\n }\n }\n return url.toString()\n }\n\n private async request<T>(url: string, init: RequestInit): Promise<T> {\n const headers = new Headers(init.headers)\n\n if (this.token) {\n headers.set('Authorization', `Bearer ${this.token}`)\n }\n if (this.apiKey) {\n headers.set('X-API-Key', this.apiKey)\n }\n\n let response: Response\n try {\n response = await this.fetch(url, { ...init, headers })\n } catch (err) {\n throw new SdkError(\n `Network error: ${err instanceof Error ? err.message : String(err)}`\n )\n }\n\n if (!response.ok) {\n let body: unknown\n try {\n body = await response.json()\n } catch {\n body = await response.text().catch(() => undefined)\n }\n const message =\n body && typeof body === 'object' && 'error' in body\n ? String((body as Record<string, unknown>).error)\n : `HTTP ${response.status}`\n throw new ApiError(response.status, message, body)\n }\n\n return (await response.json()) as T\n }\n}\n","import type { HttpTransport } from '../transport/http'\nimport type { BlockListResponse, BlockQueryParams } from '../types/block'\n\nexport class BlockResource {\n constructor(private readonly transport: HttpTransport) {}\n\n async get(params?: BlockQueryParams): Promise<BlockListResponse> {\n return this.transport.get('/v1/block', serializeBlockParams(params))\n }\n\n async getFee(params?: BlockQueryParams): Promise<BlockListResponse> {\n return this.transport.get('/v1/block/fee', serializeBlockParams(params))\n }\n\n async getPrice(params?: BlockQueryParams): Promise<BlockListResponse> {\n return this.transport.get('/v1/block/price', serializeBlockParams(params))\n }\n\n async getLimit(params?: BlockQueryParams): Promise<BlockListResponse> {\n return this.transport.get('/v1/block/limit', serializeBlockParams(params))\n }\n}\n\nfunction serializeBlockParams(\n params?: BlockQueryParams\n): Record<string, string | undefined> | undefined {\n if (!params) return undefined\n return {\n limit: params.limit?.toString(),\n detail: params.detail,\n percentiles: params.percentiles?.join(','),\n }\n}\n","import type { HttpTransport } from '../transport/http'\nimport type { RollingResponse, RollingQueryParams } from '../types/rolling'\n\nexport class RollingResource {\n constructor(private readonly transport: HttpTransport) {}\n\n async get(params?: RollingQueryParams): Promise<RollingResponse> {\n return this.transport.get('/v1/rolling', serializeRollingParams(params))\n }\n\n async getFee(params?: RollingQueryParams): Promise<RollingResponse> {\n return this.transport.get('/v1/rolling/fee', serializeRollingParams(params))\n }\n\n async getPrice(params?: RollingQueryParams): Promise<RollingResponse> {\n return this.transport.get('/v1/rolling/price', serializeRollingParams(params))\n }\n\n async getLimit(params?: RollingQueryParams): Promise<RollingResponse> {\n return this.transport.get('/v1/rolling/limit', serializeRollingParams(params))\n }\n}\n\nfunction serializeRollingParams(\n params?: RollingQueryParams\n): Record<string, string | undefined> | undefined {\n if (!params) return undefined\n return {\n duration: params.duration,\n detail: params.detail,\n percentiles: params.percentiles?.join(','),\n }\n}\n","import type { HttpTransport } from '../transport/http'\nimport type { TumblingResponse, TumblingQueryParams } from '../types/tumbling'\n\nexport class TumblingResource {\n constructor(private readonly transport: HttpTransport) {}\n\n async get(params?: TumblingQueryParams): Promise<TumblingResponse> {\n return this.transport.get('/v1/tumbling', serializeTumblingParams(params))\n }\n\n async getFee(params?: TumblingQueryParams): Promise<TumblingResponse> {\n return this.transport.get('/v1/tumbling/fee', serializeTumblingParams(params))\n }\n\n async getPrice(params?: TumblingQueryParams): Promise<TumblingResponse> {\n return this.transport.get('/v1/tumbling/price', serializeTumblingParams(params))\n }\n\n async getLimit(params?: TumblingQueryParams): Promise<TumblingResponse> {\n return this.transport.get('/v1/tumbling/limit', serializeTumblingParams(params))\n }\n}\n\nfunction serializeTumblingParams(\n params?: TumblingQueryParams\n): Record<string, string | undefined> | undefined {\n if (!params) return undefined\n return {\n duration: params.duration,\n limit: params.limit?.toString(),\n detail: params.detail,\n percentiles: params.percentiles?.join(','),\n }\n}\n","import type { HttpTransport } from '../transport/http'\nimport type { DemoResponse } from '../types/demo'\n\nexport class DemoResource {\n constructor(private readonly transport: HttpTransport) {}\n\n async get(): Promise<DemoResponse> {\n return this.transport.get('/v1/demo')\n }\n}\n","import type { HttpTransport } from '../transport/http'\nimport type { SiwsVerifyRequest, VerifyResponse, MeResponse } from '../types/auth'\n\nexport class AuthResource {\n constructor(private readonly transport: HttpTransport) {}\n\n async verify(request: SiwsVerifyRequest): Promise<VerifyResponse> {\n return this.transport.post('/v1/auth/siws/verify', request)\n }\n\n async me(): Promise<MeResponse> {\n return this.transport.get('/v1/auth/me')\n }\n}\n","import type { HttpTransport } from '../transport/http'\nimport type { ApiKeyWithSecret, ListKeysResponse } from '../types/keys'\n\nexport class KeysResource {\n constructor(private readonly transport: HttpTransport) {}\n\n async create(name: string): Promise<ApiKeyWithSecret> {\n return this.transport.post('/v1/keys', { name })\n }\n\n async list(): Promise<ListKeysResponse> {\n return this.transport.get('/v1/keys')\n }\n\n async delete(id: string): Promise<{ disabled: boolean }> {\n return this.transport.delete(`/v1/keys/${encodeURIComponent(id)}`)\n }\n}\n","import type { HttpTransport } from '../transport/http'\nimport type { UsageResponse, DetailedUsageResponse, DetailedUsageParams } from '../types/usage'\n\nexport class UsageResource {\n constructor(private readonly transport: HttpTransport) {}\n\n async get(): Promise<UsageResponse> {\n return this.transport.get('/v1/usage')\n }\n\n async getDetailed(params: DetailedUsageParams): Promise<DetailedUsageResponse> {\n return this.transport.get('/v1/usage/detailed', {\n resolution: params.resolution,\n start: params.start?.toString(),\n end: params.end?.toString(),\n api_key_id: params.api_key_id,\n })\n }\n}\n","import type { HttpTransport } from '../transport/http'\nimport type { HealthResponse } from '../types/health'\n\nexport class HealthResource {\n constructor(private readonly transport: HttpTransport) {}\n\n async check(): Promise<HealthResponse> {\n return this.transport.get('/v1/health')\n }\n}\n","import { HttpTransport } from './transport/http'\nimport { BlockResource } from './resources/block'\nimport { RollingResource } from './resources/rolling'\nimport { TumblingResource } from './resources/tumbling'\nimport { DemoResource } from './resources/demo'\nimport { AuthResource } from './resources/auth'\nimport { KeysResource } from './resources/keys'\nimport { UsageResource } from './resources/usage'\nimport { HealthResource } from './resources/health'\n\nexport interface HttpClientOptions {\n baseUrl: string\n apiKey?: string\n token?: string\n fetch?: typeof globalThis.fetch\n}\n\nexport class HttpClient {\n readonly block: BlockResource\n readonly rolling: RollingResource\n readonly tumbling: TumblingResource\n readonly demo: DemoResource\n readonly auth: AuthResource\n readonly keys: KeysResource\n readonly usage: UsageResource\n readonly health: HealthResource\n\n private readonly transport: HttpTransport\n\n constructor(options: HttpClientOptions) {\n this.transport = new HttpTransport(options)\n this.block = new BlockResource(this.transport)\n this.rolling = new RollingResource(this.transport)\n this.tumbling = new TumblingResource(this.transport)\n this.demo = new DemoResource(this.transport)\n this.auth = new AuthResource(this.transport)\n this.keys = new KeysResource(this.transport)\n this.usage = new UsageResource(this.transport)\n this.health = new HealthResource(this.transport)\n }\n\n setToken(token: string): void {\n this.transport.setToken(token)\n }\n\n clearToken(): void {\n this.transport.clearToken()\n }\n}\n","import type {\n ClientMessage,\n ServerMessage,\n WsClientOptions,\n WsTransportState,\n WsTransportEvents,\n} from '../types/ws'\n\ntype EventName = keyof WsTransportEvents\ntype Listener<E extends EventName> = WsTransportEvents[E]\n\nexport class WsTransport {\n private ws: WebSocket | null = null\n private _state: WsTransportState = 'disconnected'\n private disposed = false\n private reconnectAttempt = 0\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null\n private pingTimer: ReturnType<typeof setInterval> | null = null\n private pongTimer: ReturnType<typeof setTimeout> | null = null\n private listeners = new Map<EventName, Set<Listener<any>>>()\n\n private readonly url: string\n private readonly reconnect: boolean\n private readonly maxReconnectAttempts: number\n private readonly reconnectDelay: number\n private readonly pingInterval: number\n private readonly WsCtor: typeof WebSocket\n\n constructor(options: WsClientOptions) {\n const base = options.baseUrl.replace(/^http/, 'ws').replace(/\\/+$/, '')\n this.url = `${base}/v1/ws?api_key=${encodeURIComponent(options.apiKey)}`\n this.reconnect = options.reconnect ?? true\n this.maxReconnectAttempts = options.maxReconnectAttempts ?? 10\n this.reconnectDelay = options.reconnectDelay ?? 1000\n this.pingInterval = options.pingInterval ?? 30_000\n this.WsCtor = (options.WebSocket ?? WebSocket) as typeof WebSocket\n }\n\n get state(): WsTransportState {\n return this._state\n }\n\n connect(): void {\n this.disposed = false\n if (this.ws) return\n\n this.setState('connecting')\n const ws = new this.WsCtor(this.url)\n\n ws.onopen = () => {\n this.reconnectAttempt = 0\n this.setState('connected')\n this.startPing()\n this.emit('open')\n }\n\n ws.onclose = (e: CloseEvent) => {\n this.stopPing()\n this.ws = null\n this.emit('close', e.code, e.reason)\n\n if (!this.disposed && this.reconnect) {\n this.scheduleReconnect()\n } else {\n this.setState('disconnected')\n }\n }\n\n ws.onerror = (e: Event) => {\n this.emit('error', e)\n }\n\n ws.onmessage = (e: MessageEvent) => {\n this.handleMessage(e.data as string)\n }\n\n this.ws = ws\n }\n\n disconnect(): void {\n this.disposed = true\n this.clearReconnectTimer()\n this.stopPing()\n if (this.ws) {\n this.ws.onclose = null\n this.ws.onerror = null\n this.ws.onmessage = null\n this.ws.onopen = null\n this.ws.close(1000)\n this.ws = null\n }\n this.setState('disconnected')\n }\n\n send(msg: ClientMessage): void {\n if (this.ws && this.ws.readyState === WebSocket.OPEN) {\n this.ws.send(JSON.stringify(msg))\n }\n }\n\n on<E extends EventName>(event: E, fn: Listener<E>): void {\n let set = this.listeners.get(event)\n if (!set) {\n set = new Set()\n this.listeners.set(event, set)\n }\n set.add(fn)\n }\n\n off<E extends EventName>(event: E, fn: Listener<E>): void {\n this.listeners.get(event)?.delete(fn)\n }\n\n // --- Private ---\n\n private emit<E extends EventName>(event: E, ...args: Parameters<WsTransportEvents[E]>): void {\n const set = this.listeners.get(event)\n if (!set) return\n for (const fn of set) {\n (fn as (...a: unknown[]) => void)(...args)\n }\n }\n\n private setState(s: WsTransportState): void {\n if (this._state === s) return\n this._state = s\n this.emit('stateChange', s)\n }\n\n private handleMessage(raw: string): void {\n let msg: ServerMessage\n try {\n msg = JSON.parse(raw) as ServerMessage\n } catch {\n return\n }\n\n if (msg.type === 'pong') {\n this.clearPongTimer()\n }\n\n this.emit('message', msg)\n }\n\n private startPing(): void {\n this.stopPing()\n this.pingTimer = setInterval(() => {\n this.send({ type: 'ping' })\n this.pongTimer = setTimeout(() => {\n // No pong received — force close to trigger reconnect\n if (this.ws) {\n this.ws.close(4000, 'pong timeout')\n }\n }, 10_000)\n }, this.pingInterval)\n }\n\n private stopPing(): void {\n if (this.pingTimer !== null) {\n clearInterval(this.pingTimer)\n this.pingTimer = null\n }\n this.clearPongTimer()\n }\n\n private clearPongTimer(): void {\n if (this.pongTimer !== null) {\n clearTimeout(this.pongTimer)\n this.pongTimer = null\n }\n }\n\n private scheduleReconnect(): void {\n if (this.reconnectAttempt >= this.maxReconnectAttempts) {\n this.setState('disconnected')\n return\n }\n\n this.setState('reconnecting')\n const delay = Math.min(this.reconnectDelay * Math.pow(2, this.reconnectAttempt), 30_000)\n const jitter = Math.random() * delay * 0.2\n this.reconnectAttempt++\n\n this.reconnectTimer = setTimeout(() => {\n this.reconnectTimer = null\n this.connect()\n }, delay + jitter)\n }\n\n private clearReconnectTimer(): void {\n if (this.reconnectTimer !== null) {\n clearTimeout(this.reconnectTimer)\n this.reconnectTimer = null\n }\n }\n}\n","import { WsTransport } from './transport/ws'\nimport type {\n WsChannel,\n WsClientOptions,\n WsTransportState,\n WsTransportEvents,\n BlockSubscribeParams,\n RollingSubscribeParams,\n Subscription,\n SubscriptionHandlers,\n SubscribedMessage,\n DataMessage,\n WsErrorMessage,\n ChannelPayloadMap,\n SubscribeParams,\n} from './types/ws'\n\ntype ClientEventName = 'open' | 'close' | 'error' | 'stateChange'\ntype ClientListener<E extends ClientEventName> = WsTransportEvents[E]\n\ninterface ActiveSubscription {\n channel: WsChannel\n params: SubscribeParams\n onData: (data: unknown) => void\n onError?: (error: WsErrorMessage) => void\n /** Mutable — gets updated on reconnect re-subscribe */\n currentId: string\n}\n\ninterface PendingSubscription {\n resolve: (sub: Subscription) => void\n reject: (err: Error) => void\n channel: WsChannel\n params: SubscribeParams\n onData: (data: unknown) => void\n onError?: (error: WsErrorMessage) => void\n}\n\nexport class WsClient {\n private readonly transport: WsTransport\n private readonly active = new Map<string, ActiveSubscription>()\n private readonly pending: PendingSubscription[] = []\n\n constructor(options: WsClientOptions) {\n this.transport = new WsTransport(options)\n this.transport.on('message', (msg) => this.handleMessage(msg))\n this.transport.on('open', () => this.handleReconnect())\n\n if (options.autoConnect !== false) {\n this.transport.connect()\n }\n }\n\n get state(): WsTransportState {\n return this.transport.state\n }\n\n connect(): void {\n this.transport.connect()\n }\n\n disconnect(): void {\n this.transport.disconnect()\n // Reject any pending subscriptions\n for (const p of this.pending) {\n p.reject(new Error('Client disconnected'))\n }\n this.pending.length = 0\n this.active.clear()\n }\n\n on<E extends ClientEventName>(event: E, fn: ClientListener<E>): void {\n this.transport.on(event, fn as WsTransportEvents[typeof event])\n }\n\n off<E extends ClientEventName>(event: E, fn: ClientListener<E>): void {\n this.transport.off(event, fn as WsTransportEvents[typeof event])\n }\n\n subscribeBlock(\n params: BlockSubscribeParams,\n handlers: SubscriptionHandlers<'block'>,\n ): Promise<Subscription> {\n return this.subscribe({ channel: { type: 'block', ...params } }, 'block', handlers)\n }\n\n subscribeRolling(\n params: RollingSubscribeParams,\n handlers: SubscriptionHandlers<'rolling'>,\n ): Promise<Subscription> {\n return this.subscribe({ channel: { type: 'rolling', ...params } }, 'rolling', handlers)\n }\n\n subscribeDemo(handlers: SubscriptionHandlers<'demo'>): Promise<Subscription> {\n return this.subscribe({ channel: { type: 'demo' } }, 'demo', handlers)\n }\n\n private subscribe<C extends WsChannel>(\n params: SubscribeParams,\n channel: C,\n handlers: SubscriptionHandlers<C>,\n ): Promise<Subscription> {\n return new Promise<Subscription>((resolve, reject) => {\n this.pending.push({\n resolve,\n reject,\n channel,\n params,\n onData: handlers.onData as (data: unknown) => void,\n onError: handlers.onError,\n })\n this.transport.send({ type: 'subscribe', channel: params.channel })\n })\n }\n\n private handleMessage(msg: import('./types/ws').ServerMessage): void {\n switch (msg.type) {\n case 'subscribed':\n this.handleSubscribed(msg)\n break\n case 'data':\n this.handleData(msg)\n break\n case 'unsubscribed':\n this.active.delete(msg.id)\n break\n case 'error':\n this.handleError(msg)\n break\n }\n }\n\n private handleSubscribed(msg: SubscribedMessage): void {\n const p = this.pending.shift()\n if (!p) return\n\n const entry: ActiveSubscription = {\n channel: p.channel,\n params: p.params,\n onData: p.onData,\n onError: p.onError,\n currentId: msg.id,\n }\n\n this.active.set(msg.id, entry)\n\n const subscription: Subscription = {\n get id() {\n return entry.currentId\n },\n channel: p.channel,\n unsubscribe: () => {\n this.transport.send({ type: 'unsubscribe', id: entry.currentId })\n this.active.delete(entry.currentId)\n },\n }\n\n p.resolve(subscription)\n }\n\n private handleData(msg: DataMessage): void {\n const entry = this.active.get(msg.id)\n if (entry) {\n entry.onData(msg.payload)\n }\n }\n\n private handleError(msg: WsErrorMessage): void {\n if (msg.id) {\n const entry = this.active.get(msg.id)\n if (entry?.onError) {\n entry.onError(msg)\n }\n } else {\n // Error without id — reject the oldest pending subscription\n const p = this.pending.shift()\n if (p) {\n p.reject(new Error(`${msg.code}: ${msg.message}`))\n }\n }\n }\n\n private handleReconnect(): void {\n if (this.active.size > 0) {\n const entries = Array.from(this.active.values())\n this.active.clear()\n\n for (const entry of entries) {\n this.pending.push({\n resolve: (sub) => { entry.currentId = sub.id },\n reject: () => {},\n channel: entry.channel,\n params: entry.params,\n onData: entry.onData,\n onError: entry.onError,\n })\n }\n }\n\n for (const p of this.pending) {\n this.transport.send({ type: 'subscribe', channel: p.params.channel })\n }\n }\n}\n"],"mappings":";AAAO,IAAM,WAAN,cAAuB,MAAM;AAAA,EAClC,YAAY,SAAiB;AAC3B,UAAM,OAAO;AACb,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,WAAN,cAAuB,SAAS;AAAA,EAIrC,YAAY,QAAgB,SAAiB,MAAgB;AAC3D,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,SAAS;AACd,SAAK,OAAO;AAAA,EACd;AACF;;;ACRO,IAAM,gBAAN,MAAoB;AAAA,EAMzB,YAAY,SAA+B;AACzC,SAAK,UAAU,QAAQ,QAAQ,QAAQ,QAAQ,EAAE;AACjD,SAAK,SAAS,QAAQ;AACtB,SAAK,QAAQ,QAAQ;AACrB,SAAK,QAAQ,QAAQ,SAAS,WAAW,MAAM,KAAK,UAAU;AAAA,EAChE;AAAA,EAEA,SAAS,OAAqB;AAC5B,SAAK,QAAQ;AAAA,EACf;AAAA,EAEA,aAAmB;AACjB,SAAK,QAAQ;AAAA,EACf;AAAA,EAEA,MAAM,IAAO,MAAc,QAAyD;AAClF,UAAM,MAAM,KAAK,SAAS,MAAM,MAAM;AACtC,WAAO,KAAK,QAAW,KAAK,EAAE,QAAQ,MAAM,CAAC;AAAA,EAC/C;AAAA,EAEA,MAAM,KAAQ,MAAc,MAA4B;AACtD,UAAM,MAAM,KAAK,SAAS,IAAI;AAC9B,WAAO,KAAK,QAAW,KAAK;AAAA,MAC1B,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,MAC9C,MAAM,SAAS,SAAY,KAAK,UAAU,IAAI,IAAI;AAAA,IACpD,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,OAAU,MAA0B;AACxC,UAAM,MAAM,KAAK,SAAS,IAAI;AAC9B,WAAO,KAAK,QAAW,KAAK,EAAE,QAAQ,SAAS,CAAC;AAAA,EAClD;AAAA,EAEQ,SAAS,MAAc,QAAqD;AAClF,UAAM,MAAM,IAAI,IAAI,GAAG,KAAK,OAAO,GAAG,IAAI,EAAE;AAC5C,QAAI,QAAQ;AACV,iBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AACjD,YAAI,UAAU,QAAW;AACvB,cAAI,aAAa,IAAI,KAAK,KAAK;AAAA,QACjC;AAAA,MACF;AAAA,IACF;AACA,WAAO,IAAI,SAAS;AAAA,EACtB;AAAA,EAEA,MAAc,QAAW,KAAa,MAA+B;AACnE,UAAM,UAAU,IAAI,QAAQ,KAAK,OAAO;AAExC,QAAI,KAAK,OAAO;AACd,cAAQ,IAAI,iBAAiB,UAAU,KAAK,KAAK,EAAE;AAAA,IACrD;AACA,QAAI,KAAK,QAAQ;AACf,cAAQ,IAAI,aAAa,KAAK,MAAM;AAAA,IACtC;AAEA,QAAI;AACJ,QAAI;AACF,iBAAW,MAAM,KAAK,MAAM,KAAK,EAAE,GAAG,MAAM,QAAQ,CAAC;AAAA,IACvD,SAAS,KAAK;AACZ,YAAM,IAAI;AAAA,QACR,kBAAkB,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,MACpE;AAAA,IACF;AAEA,QAAI,CAAC,SAAS,IAAI;AAChB,UAAI;AACJ,UAAI;AACF,eAAO,MAAM,SAAS,KAAK;AAAA,MAC7B,QAAQ;AACN,eAAO,MAAM,SAAS,KAAK,EAAE,MAAM,MAAM,MAAS;AAAA,MACpD;AACA,YAAM,UACJ,QAAQ,OAAO,SAAS,YAAY,WAAW,OAC3C,OAAQ,KAAiC,KAAK,IAC9C,QAAQ,SAAS,MAAM;AAC7B,YAAM,IAAI,SAAS,SAAS,QAAQ,SAAS,IAAI;AAAA,IACnD;AAEA,WAAQ,MAAM,SAAS,KAAK;AAAA,EAC9B;AACF;;;AC7FO,IAAM,gBAAN,MAAoB;AAAA,EACzB,YAA6B,WAA0B;AAA1B;AAAA,EAA2B;AAAA,EAExD,MAAM,IAAI,QAAuD;AAC/D,WAAO,KAAK,UAAU,IAAI,aAAa,qBAAqB,MAAM,CAAC;AAAA,EACrE;AAAA,EAEA,MAAM,OAAO,QAAuD;AAClE,WAAO,KAAK,UAAU,IAAI,iBAAiB,qBAAqB,MAAM,CAAC;AAAA,EACzE;AAAA,EAEA,MAAM,SAAS,QAAuD;AACpE,WAAO,KAAK,UAAU,IAAI,mBAAmB,qBAAqB,MAAM,CAAC;AAAA,EAC3E;AAAA,EAEA,MAAM,SAAS,QAAuD;AACpE,WAAO,KAAK,UAAU,IAAI,mBAAmB,qBAAqB,MAAM,CAAC;AAAA,EAC3E;AACF;AAEA,SAAS,qBACP,QACgD;AAChD,MAAI,CAAC,OAAQ,QAAO;AACpB,SAAO;AAAA,IACL,OAAO,OAAO,OAAO,SAAS;AAAA,IAC9B,QAAQ,OAAO;AAAA,IACf,aAAa,OAAO,aAAa,KAAK,GAAG;AAAA,EAC3C;AACF;;;AC7BO,IAAM,kBAAN,MAAsB;AAAA,EAC3B,YAA6B,WAA0B;AAA1B;AAAA,EAA2B;AAAA,EAExD,MAAM,IAAI,QAAuD;AAC/D,WAAO,KAAK,UAAU,IAAI,eAAe,uBAAuB,MAAM,CAAC;AAAA,EACzE;AAAA,EAEA,MAAM,OAAO,QAAuD;AAClE,WAAO,KAAK,UAAU,IAAI,mBAAmB,uBAAuB,MAAM,CAAC;AAAA,EAC7E;AAAA,EAEA,MAAM,SAAS,QAAuD;AACpE,WAAO,KAAK,UAAU,IAAI,qBAAqB,uBAAuB,MAAM,CAAC;AAAA,EAC/E;AAAA,EAEA,MAAM,SAAS,QAAuD;AACpE,WAAO,KAAK,UAAU,IAAI,qBAAqB,uBAAuB,MAAM,CAAC;AAAA,EAC/E;AACF;AAEA,SAAS,uBACP,QACgD;AAChD,MAAI,CAAC,OAAQ,QAAO;AACpB,SAAO;AAAA,IACL,UAAU,OAAO;AAAA,IACjB,QAAQ,OAAO;AAAA,IACf,aAAa,OAAO,aAAa,KAAK,GAAG;AAAA,EAC3C;AACF;;;AC7BO,IAAM,mBAAN,MAAuB;AAAA,EAC5B,YAA6B,WAA0B;AAA1B;AAAA,EAA2B;AAAA,EAExD,MAAM,IAAI,QAAyD;AACjE,WAAO,KAAK,UAAU,IAAI,gBAAgB,wBAAwB,MAAM,CAAC;AAAA,EAC3E;AAAA,EAEA,MAAM,OAAO,QAAyD;AACpE,WAAO,KAAK,UAAU,IAAI,oBAAoB,wBAAwB,MAAM,CAAC;AAAA,EAC/E;AAAA,EAEA,MAAM,SAAS,QAAyD;AACtE,WAAO,KAAK,UAAU,IAAI,sBAAsB,wBAAwB,MAAM,CAAC;AAAA,EACjF;AAAA,EAEA,MAAM,SAAS,QAAyD;AACtE,WAAO,KAAK,UAAU,IAAI,sBAAsB,wBAAwB,MAAM,CAAC;AAAA,EACjF;AACF;AAEA,SAAS,wBACP,QACgD;AAChD,MAAI,CAAC,OAAQ,QAAO;AACpB,SAAO;AAAA,IACL,UAAU,OAAO;AAAA,IACjB,OAAO,OAAO,OAAO,SAAS;AAAA,IAC9B,QAAQ,OAAO;AAAA,IACf,aAAa,OAAO,aAAa,KAAK,GAAG;AAAA,EAC3C;AACF;;;AC9BO,IAAM,eAAN,MAAmB;AAAA,EACxB,YAA6B,WAA0B;AAA1B;AAAA,EAA2B;AAAA,EAExD,MAAM,MAA6B;AACjC,WAAO,KAAK,UAAU,IAAI,UAAU;AAAA,EACtC;AACF;;;ACNO,IAAM,eAAN,MAAmB;AAAA,EACxB,YAA6B,WAA0B;AAA1B;AAAA,EAA2B;AAAA,EAExD,MAAM,OAAO,SAAqD;AAChE,WAAO,KAAK,UAAU,KAAK,wBAAwB,OAAO;AAAA,EAC5D;AAAA,EAEA,MAAM,KAA0B;AAC9B,WAAO,KAAK,UAAU,IAAI,aAAa;AAAA,EACzC;AACF;;;ACVO,IAAM,eAAN,MAAmB;AAAA,EACxB,YAA6B,WAA0B;AAA1B;AAAA,EAA2B;AAAA,EAExD,MAAM,OAAO,MAAyC;AACpD,WAAO,KAAK,UAAU,KAAK,YAAY,EAAE,KAAK,CAAC;AAAA,EACjD;AAAA,EAEA,MAAM,OAAkC;AACtC,WAAO,KAAK,UAAU,IAAI,UAAU;AAAA,EACtC;AAAA,EAEA,MAAM,OAAO,IAA4C;AACvD,WAAO,KAAK,UAAU,OAAO,YAAY,mBAAmB,EAAE,CAAC,EAAE;AAAA,EACnE;AACF;;;ACdO,IAAM,gBAAN,MAAoB;AAAA,EACzB,YAA6B,WAA0B;AAA1B;AAAA,EAA2B;AAAA,EAExD,MAAM,MAA8B;AAClC,WAAO,KAAK,UAAU,IAAI,WAAW;AAAA,EACvC;AAAA,EAEA,MAAM,YAAY,QAA6D;AAC7E,WAAO,KAAK,UAAU,IAAI,sBAAsB;AAAA,MAC9C,YAAY,OAAO;AAAA,MACnB,OAAO,OAAO,OAAO,SAAS;AAAA,MAC9B,KAAK,OAAO,KAAK,SAAS;AAAA,MAC1B,YAAY,OAAO;AAAA,IACrB,CAAC;AAAA,EACH;AACF;;;ACfO,IAAM,iBAAN,MAAqB;AAAA,EAC1B,YAA6B,WAA0B;AAA1B;AAAA,EAA2B;AAAA,EAExD,MAAM,QAAiC;AACrC,WAAO,KAAK,UAAU,IAAI,YAAY;AAAA,EACxC;AACF;;;ACQO,IAAM,aAAN,MAAiB;AAAA,EAYtB,YAAY,SAA4B;AACtC,SAAK,YAAY,IAAI,cAAc,OAAO;AAC1C,SAAK,QAAQ,IAAI,cAAc,KAAK,SAAS;AAC7C,SAAK,UAAU,IAAI,gBAAgB,KAAK,SAAS;AACjD,SAAK,WAAW,IAAI,iBAAiB,KAAK,SAAS;AACnD,SAAK,OAAO,IAAI,aAAa,KAAK,SAAS;AAC3C,SAAK,OAAO,IAAI,aAAa,KAAK,SAAS;AAC3C,SAAK,OAAO,IAAI,aAAa,KAAK,SAAS;AAC3C,SAAK,QAAQ,IAAI,cAAc,KAAK,SAAS;AAC7C,SAAK,SAAS,IAAI,eAAe,KAAK,SAAS;AAAA,EACjD;AAAA,EAEA,SAAS,OAAqB;AAC5B,SAAK,UAAU,SAAS,KAAK;AAAA,EAC/B;AAAA,EAEA,aAAmB;AACjB,SAAK,UAAU,WAAW;AAAA,EAC5B;AACF;;;ACrCO,IAAM,cAAN,MAAkB;AAAA,EAiBvB,YAAY,SAA0B;AAhBtC,SAAQ,KAAuB;AAC/B,SAAQ,SAA2B;AACnC,SAAQ,WAAW;AACnB,SAAQ,mBAAmB;AAC3B,SAAQ,iBAAuD;AAC/D,SAAQ,YAAmD;AAC3D,SAAQ,YAAkD;AAC1D,SAAQ,YAAY,oBAAI,IAAmC;AAUzD,UAAM,OAAO,QAAQ,QAAQ,QAAQ,SAAS,IAAI,EAAE,QAAQ,QAAQ,EAAE;AACtE,SAAK,MAAM,GAAG,IAAI,kBAAkB,mBAAmB,QAAQ,MAAM,CAAC;AACtE,SAAK,YAAY,QAAQ,aAAa;AACtC,SAAK,uBAAuB,QAAQ,wBAAwB;AAC5D,SAAK,iBAAiB,QAAQ,kBAAkB;AAChD,SAAK,eAAe,QAAQ,gBAAgB;AAC5C,SAAK,SAAU,QAAQ,aAAa;AAAA,EACtC;AAAA,EAEA,IAAI,QAA0B;AAC5B,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,UAAgB;AACd,SAAK,WAAW;AAChB,QAAI,KAAK,GAAI;AAEb,SAAK,SAAS,YAAY;AAC1B,UAAM,KAAK,IAAI,KAAK,OAAO,KAAK,GAAG;AAEnC,OAAG,SAAS,MAAM;AAChB,WAAK,mBAAmB;AACxB,WAAK,SAAS,WAAW;AACzB,WAAK,UAAU;AACf,WAAK,KAAK,MAAM;AAAA,IAClB;AAEA,OAAG,UAAU,CAAC,MAAkB;AAC9B,WAAK,SAAS;AACd,WAAK,KAAK;AACV,WAAK,KAAK,SAAS,EAAE,MAAM,EAAE,MAAM;AAEnC,UAAI,CAAC,KAAK,YAAY,KAAK,WAAW;AACpC,aAAK,kBAAkB;AAAA,MACzB,OAAO;AACL,aAAK,SAAS,cAAc;AAAA,MAC9B;AAAA,IACF;AAEA,OAAG,UAAU,CAAC,MAAa;AACzB,WAAK,KAAK,SAAS,CAAC;AAAA,IACtB;AAEA,OAAG,YAAY,CAAC,MAAoB;AAClC,WAAK,cAAc,EAAE,IAAc;AAAA,IACrC;AAEA,SAAK,KAAK;AAAA,EACZ;AAAA,EAEA,aAAmB;AACjB,SAAK,WAAW;AAChB,SAAK,oBAAoB;AACzB,SAAK,SAAS;AACd,QAAI,KAAK,IAAI;AACX,WAAK,GAAG,UAAU;AAClB,WAAK,GAAG,UAAU;AAClB,WAAK,GAAG,YAAY;AACpB,WAAK,GAAG,SAAS;AACjB,WAAK,GAAG,MAAM,GAAI;AAClB,WAAK,KAAK;AAAA,IACZ;AACA,SAAK,SAAS,cAAc;AAAA,EAC9B;AAAA,EAEA,KAAK,KAA0B;AAC7B,QAAI,KAAK,MAAM,KAAK,GAAG,eAAe,UAAU,MAAM;AACpD,WAAK,GAAG,KAAK,KAAK,UAAU,GAAG,CAAC;AAAA,IAClC;AAAA,EACF;AAAA,EAEA,GAAwB,OAAU,IAAuB;AACvD,QAAI,MAAM,KAAK,UAAU,IAAI,KAAK;AAClC,QAAI,CAAC,KAAK;AACR,YAAM,oBAAI,IAAI;AACd,WAAK,UAAU,IAAI,OAAO,GAAG;AAAA,IAC/B;AACA,QAAI,IAAI,EAAE;AAAA,EACZ;AAAA,EAEA,IAAyB,OAAU,IAAuB;AACxD,SAAK,UAAU,IAAI,KAAK,GAAG,OAAO,EAAE;AAAA,EACtC;AAAA;AAAA,EAIQ,KAA0B,UAAa,MAA8C;AAC3F,UAAM,MAAM,KAAK,UAAU,IAAI,KAAK;AACpC,QAAI,CAAC,IAAK;AACV,eAAW,MAAM,KAAK;AACpB,MAAC,GAAiC,GAAG,IAAI;AAAA,IAC3C;AAAA,EACF;AAAA,EAEQ,SAAS,GAA2B;AAC1C,QAAI,KAAK,WAAW,EAAG;AACvB,SAAK,SAAS;AACd,SAAK,KAAK,eAAe,CAAC;AAAA,EAC5B;AAAA,EAEQ,cAAc,KAAmB;AACvC,QAAI;AACJ,QAAI;AACF,YAAM,KAAK,MAAM,GAAG;AAAA,IACtB,QAAQ;AACN;AAAA,IACF;AAEA,QAAI,IAAI,SAAS,QAAQ;AACvB,WAAK,eAAe;AAAA,IACtB;AAEA,SAAK,KAAK,WAAW,GAAG;AAAA,EAC1B;AAAA,EAEQ,YAAkB;AACxB,SAAK,SAAS;AACd,SAAK,YAAY,YAAY,MAAM;AACjC,WAAK,KAAK,EAAE,MAAM,OAAO,CAAC;AAC1B,WAAK,YAAY,WAAW,MAAM;AAEhC,YAAI,KAAK,IAAI;AACX,eAAK,GAAG,MAAM,KAAM,cAAc;AAAA,QACpC;AAAA,MACF,GAAG,GAAM;AAAA,IACX,GAAG,KAAK,YAAY;AAAA,EACtB;AAAA,EAEQ,WAAiB;AACvB,QAAI,KAAK,cAAc,MAAM;AAC3B,oBAAc,KAAK,SAAS;AAC5B,WAAK,YAAY;AAAA,IACnB;AACA,SAAK,eAAe;AAAA,EACtB;AAAA,EAEQ,iBAAuB;AAC7B,QAAI,KAAK,cAAc,MAAM;AAC3B,mBAAa,KAAK,SAAS;AAC3B,WAAK,YAAY;AAAA,IACnB;AAAA,EACF;AAAA,EAEQ,oBAA0B;AAChC,QAAI,KAAK,oBAAoB,KAAK,sBAAsB;AACtD,WAAK,SAAS,cAAc;AAC5B;AAAA,IACF;AAEA,SAAK,SAAS,cAAc;AAC5B,UAAM,QAAQ,KAAK,IAAI,KAAK,iBAAiB,KAAK,IAAI,GAAG,KAAK,gBAAgB,GAAG,GAAM;AACvF,UAAM,SAAS,KAAK,OAAO,IAAI,QAAQ;AACvC,SAAK;AAEL,SAAK,iBAAiB,WAAW,MAAM;AACrC,WAAK,iBAAiB;AACtB,WAAK,QAAQ;AAAA,IACf,GAAG,QAAQ,MAAM;AAAA,EACnB;AAAA,EAEQ,sBAA4B;AAClC,QAAI,KAAK,mBAAmB,MAAM;AAChC,mBAAa,KAAK,cAAc;AAChC,WAAK,iBAAiB;AAAA,IACxB;AAAA,EACF;AACF;;;AC7JO,IAAM,WAAN,MAAe;AAAA,EAKpB,YAAY,SAA0B;AAHtC,SAAiB,SAAS,oBAAI,IAAgC;AAC9D,SAAiB,UAAiC,CAAC;AAGjD,SAAK,YAAY,IAAI,YAAY,OAAO;AACxC,SAAK,UAAU,GAAG,WAAW,CAAC,QAAQ,KAAK,cAAc,GAAG,CAAC;AAC7D,SAAK,UAAU,GAAG,QAAQ,MAAM,KAAK,gBAAgB,CAAC;AAEtD,QAAI,QAAQ,gBAAgB,OAAO;AACjC,WAAK,UAAU,QAAQ;AAAA,IACzB;AAAA,EACF;AAAA,EAEA,IAAI,QAA0B;AAC5B,WAAO,KAAK,UAAU;AAAA,EACxB;AAAA,EAEA,UAAgB;AACd,SAAK,UAAU,QAAQ;AAAA,EACzB;AAAA,EAEA,aAAmB;AACjB,SAAK,UAAU,WAAW;AAE1B,eAAW,KAAK,KAAK,SAAS;AAC5B,QAAE,OAAO,IAAI,MAAM,qBAAqB,CAAC;AAAA,IAC3C;AACA,SAAK,QAAQ,SAAS;AACtB,SAAK,OAAO,MAAM;AAAA,EACpB;AAAA,EAEA,GAA8B,OAAU,IAA6B;AACnE,SAAK,UAAU,GAAG,OAAO,EAAqC;AAAA,EAChE;AAAA,EAEA,IAA+B,OAAU,IAA6B;AACpE,SAAK,UAAU,IAAI,OAAO,EAAqC;AAAA,EACjE;AAAA,EAEA,eACE,QACA,UACuB;AACvB,WAAO,KAAK,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,GAAG,OAAO,EAAE,GAAG,SAAS,QAAQ;AAAA,EACpF;AAAA,EAEA,iBACE,QACA,UACuB;AACvB,WAAO,KAAK,UAAU,EAAE,SAAS,EAAE,MAAM,WAAW,GAAG,OAAO,EAAE,GAAG,WAAW,QAAQ;AAAA,EACxF;AAAA,EAEA,cAAc,UAA+D;AAC3E,WAAO,KAAK,UAAU,EAAE,SAAS,EAAE,MAAM,OAAO,EAAE,GAAG,QAAQ,QAAQ;AAAA,EACvE;AAAA,EAEQ,UACN,QACA,SACA,UACuB;AACvB,WAAO,IAAI,QAAsB,CAAC,SAAS,WAAW;AACpD,WAAK,QAAQ,KAAK;AAAA,QAChB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,QAAQ,SAAS;AAAA,QACjB,SAAS,SAAS;AAAA,MACpB,CAAC;AACD,WAAK,UAAU,KAAK,EAAE,MAAM,aAAa,SAAS,OAAO,QAAQ,CAAC;AAAA,IACpE,CAAC;AAAA,EACH;AAAA,EAEQ,cAAc,KAA+C;AACnE,YAAQ,IAAI,MAAM;AAAA,MAChB,KAAK;AACH,aAAK,iBAAiB,GAAG;AACzB;AAAA,MACF,KAAK;AACH,aAAK,WAAW,GAAG;AACnB;AAAA,MACF,KAAK;AACH,aAAK,OAAO,OAAO,IAAI,EAAE;AACzB;AAAA,MACF,KAAK;AACH,aAAK,YAAY,GAAG;AACpB;AAAA,IACJ;AAAA,EACF;AAAA,EAEQ,iBAAiB,KAA8B;AACrD,UAAM,IAAI,KAAK,QAAQ,MAAM;AAC7B,QAAI,CAAC,EAAG;AAER,UAAM,QAA4B;AAAA,MAChC,SAAS,EAAE;AAAA,MACX,QAAQ,EAAE;AAAA,MACV,QAAQ,EAAE;AAAA,MACV,SAAS,EAAE;AAAA,MACX,WAAW,IAAI;AAAA,IACjB;AAEA,SAAK,OAAO,IAAI,IAAI,IAAI,KAAK;AAE7B,UAAM,eAA6B;AAAA,MACjC,IAAI,KAAK;AACP,eAAO,MAAM;AAAA,MACf;AAAA,MACA,SAAS,EAAE;AAAA,MACX,aAAa,MAAM;AACjB,aAAK,UAAU,KAAK,EAAE,MAAM,eAAe,IAAI,MAAM,UAAU,CAAC;AAChE,aAAK,OAAO,OAAO,MAAM,SAAS;AAAA,MACpC;AAAA,IACF;AAEA,MAAE,QAAQ,YAAY;AAAA,EACxB;AAAA,EAEQ,WAAW,KAAwB;AACzC,UAAM,QAAQ,KAAK,OAAO,IAAI,IAAI,EAAE;AACpC,QAAI,OAAO;AACT,YAAM,OAAO,IAAI,OAAO;AAAA,IAC1B;AAAA,EACF;AAAA,EAEQ,YAAY,KAA2B;AAC7C,QAAI,IAAI,IAAI;AACV,YAAM,QAAQ,KAAK,OAAO,IAAI,IAAI,EAAE;AACpC,UAAI,OAAO,SAAS;AAClB,cAAM,QAAQ,GAAG;AAAA,MACnB;AAAA,IACF,OAAO;AAEL,YAAM,IAAI,KAAK,QAAQ,MAAM;AAC7B,UAAI,GAAG;AACL,UAAE,OAAO,IAAI,MAAM,GAAG,IAAI,IAAI,KAAK,IAAI,OAAO,EAAE,CAAC;AAAA,MACnD;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,kBAAwB;AAC9B,QAAI,KAAK,OAAO,OAAO,GAAG;AACxB,YAAM,UAAU,MAAM,KAAK,KAAK,OAAO,OAAO,CAAC;AAC/C,WAAK,OAAO,MAAM;AAElB,iBAAW,SAAS,SAAS;AAC3B,aAAK,QAAQ,KAAK;AAAA,UAChB,SAAS,CAAC,QAAQ;AAAE,kBAAM,YAAY,IAAI;AAAA,UAAG;AAAA,UAC7C,QAAQ,MAAM;AAAA,UAAC;AAAA,UACf,SAAS,MAAM;AAAA,UACf,QAAQ,MAAM;AAAA,UACd,QAAQ,MAAM;AAAA,UACd,SAAS,MAAM;AAAA,QACjB,CAAC;AAAA,MACH;AAAA,IACF;AAEA,eAAW,KAAK,KAAK,SAAS;AAC5B,WAAK,UAAU,KAAK,EAAE,MAAM,aAAa,SAAS,EAAE,OAAO,QAAQ,CAAC;AAAA,IACtE;AAAA,EACF;AACF;","names":[]}
1
+ {"version":3,"sources":["../src/types/errors.ts","../src/transport/http.ts","../src/resources/block.ts","../src/resources/rolling.ts","../src/resources/tumbling.ts","../src/resources/demo.ts","../src/resources/auth.ts","../src/resources/keys.ts","../src/resources/usage.ts","../src/resources/health.ts","../src/http-client.ts","../src/transport/ws.ts","../src/ws-client.ts"],"sourcesContent":["export class SdkError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'SdkError'\n }\n}\n\nexport class ApiError extends SdkError {\n readonly status: number\n readonly body?: unknown\n\n constructor(status: number, message: string, body?: unknown) {\n super(message)\n this.name = 'ApiError'\n this.status = status\n this.body = body\n }\n}\n","import { ApiError, SdkError } from '../types/errors'\n\nexport interface HttpTransportOptions {\n baseUrl?: string\n apiKey?: string\n token?: string\n fetch?: typeof globalThis.fetch\n}\n\nexport class HttpTransport {\n private readonly baseUrl: string\n private apiKey?: string\n private token?: string\n private readonly fetch: typeof globalThis.fetch\n\n constructor(options: HttpTransportOptions) {\n this.baseUrl = (options.baseUrl ?? 'https://api.priorityfee.com').replace(/\\/+$/, '')\n this.apiKey = options.apiKey\n this.token = options.token\n this.fetch = options.fetch ?? globalThis.fetch.bind(globalThis)\n }\n\n setToken(token: string): void {\n this.token = token\n }\n\n clearToken(): void {\n this.token = undefined\n }\n\n async get<T>(path: string, params?: Record<string, string | undefined>): Promise<T> {\n const url = this.buildUrl(path, params)\n return this.request<T>(url, { method: 'GET' })\n }\n\n async post<T>(path: string, body?: unknown): Promise<T> {\n const url = this.buildUrl(path)\n return this.request<T>(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: body !== undefined ? JSON.stringify(body) : undefined,\n })\n }\n\n async delete<T>(path: string): Promise<T> {\n const url = this.buildUrl(path)\n return this.request<T>(url, { method: 'DELETE' })\n }\n\n private buildUrl(path: string, params?: Record<string, string | undefined>): string {\n const url = new URL(`${this.baseUrl}${path}`)\n if (params) {\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined) {\n url.searchParams.set(key, value)\n }\n }\n }\n return url.toString()\n }\n\n private async request<T>(url: string, init: RequestInit): Promise<T> {\n const headers = new Headers(init.headers)\n\n if (this.token) {\n headers.set('Authorization', `Bearer ${this.token}`)\n }\n if (this.apiKey) {\n headers.set('X-API-Key', this.apiKey)\n }\n\n let response: Response\n try {\n response = await this.fetch(url, { ...init, headers })\n } catch (err) {\n throw new SdkError(\n `Network error: ${err instanceof Error ? err.message : String(err)}`\n )\n }\n\n if (!response.ok) {\n let body: unknown\n try {\n body = await response.json()\n } catch {\n body = await response.text().catch(() => undefined)\n }\n const message =\n body && typeof body === 'object' && 'error' in body\n ? String((body as Record<string, unknown>).error)\n : `HTTP ${response.status}`\n throw new ApiError(response.status, message, body)\n }\n\n return (await response.json()) as T\n }\n}\n","import type { HttpTransport } from '../transport/http'\nimport type { BlockListResponse, BlockQueryParams } from '../types/block'\n\nexport class BlockResource {\n constructor(private readonly transport: HttpTransport) {}\n\n async get(params?: BlockQueryParams): Promise<BlockListResponse> {\n return this.transport.get('/v1/block', serializeBlockParams(params))\n }\n\n async getFee(params?: BlockQueryParams): Promise<BlockListResponse> {\n return this.transport.get('/v1/block/fee', serializeBlockParams(params))\n }\n\n async getPrice(params?: BlockQueryParams): Promise<BlockListResponse> {\n return this.transport.get('/v1/block/price', serializeBlockParams(params))\n }\n\n async getLimit(params?: BlockQueryParams): Promise<BlockListResponse> {\n return this.transport.get('/v1/block/limit', serializeBlockParams(params))\n }\n}\n\nfunction serializeBlockParams(\n params?: BlockQueryParams\n): Record<string, string | undefined> | undefined {\n if (!params) return undefined\n return {\n limit: params.limit?.toString(),\n detail: params.detail,\n percentiles: params.percentiles?.join(','),\n }\n}\n","import type { HttpTransport } from '../transport/http'\nimport type { RollingResponse, RollingQueryParams } from '../types/rolling'\n\nexport class RollingResource {\n constructor(private readonly transport: HttpTransport) {}\n\n async get(params?: RollingQueryParams): Promise<RollingResponse> {\n return this.transport.get('/v1/rolling', serializeRollingParams(params))\n }\n\n async getFee(params?: RollingQueryParams): Promise<RollingResponse> {\n return this.transport.get('/v1/rolling/fee', serializeRollingParams(params))\n }\n\n async getPrice(params?: RollingQueryParams): Promise<RollingResponse> {\n return this.transport.get('/v1/rolling/price', serializeRollingParams(params))\n }\n\n async getLimit(params?: RollingQueryParams): Promise<RollingResponse> {\n return this.transport.get('/v1/rolling/limit', serializeRollingParams(params))\n }\n}\n\nfunction serializeRollingParams(\n params?: RollingQueryParams\n): Record<string, string | undefined> | undefined {\n if (!params) return undefined\n return {\n duration: params.duration,\n detail: params.detail,\n percentiles: params.percentiles?.join(','),\n }\n}\n","import type { HttpTransport } from '../transport/http'\nimport type { TumblingResponse, TumblingQueryParams } from '../types/tumbling'\n\nexport class TumblingResource {\n constructor(private readonly transport: HttpTransport) {}\n\n async get(params?: TumblingQueryParams): Promise<TumblingResponse> {\n return this.transport.get('/v1/tumbling', serializeTumblingParams(params))\n }\n\n async getFee(params?: TumblingQueryParams): Promise<TumblingResponse> {\n return this.transport.get('/v1/tumbling/fee', serializeTumblingParams(params))\n }\n\n async getPrice(params?: TumblingQueryParams): Promise<TumblingResponse> {\n return this.transport.get('/v1/tumbling/price', serializeTumblingParams(params))\n }\n\n async getLimit(params?: TumblingQueryParams): Promise<TumblingResponse> {\n return this.transport.get('/v1/tumbling/limit', serializeTumblingParams(params))\n }\n}\n\nfunction serializeTumblingParams(\n params?: TumblingQueryParams\n): Record<string, string | undefined> | undefined {\n if (!params) return undefined\n return {\n duration: params.duration,\n limit: params.limit?.toString(),\n detail: params.detail,\n percentiles: params.percentiles?.join(','),\n }\n}\n","import type { HttpTransport } from '../transport/http'\nimport type { DemoResponse } from '../types/demo'\n\nexport class DemoResource {\n constructor(private readonly transport: HttpTransport) {}\n\n async get(): Promise<DemoResponse> {\n return this.transport.get('/v1/demo')\n }\n}\n","import type { HttpTransport } from '../transport/http'\nimport type { SiwsVerifyRequest, VerifyResponse, MeResponse } from '../types/auth'\n\nexport class AuthResource {\n constructor(private readonly transport: HttpTransport) {}\n\n async verify(request: SiwsVerifyRequest): Promise<VerifyResponse> {\n return this.transport.post('/v1/auth/siws/verify', request)\n }\n\n async me(): Promise<MeResponse> {\n return this.transport.get('/v1/auth/me')\n }\n}\n","import type { HttpTransport } from '../transport/http'\nimport type { ApiKeyWithSecret, ListKeysResponse } from '../types/keys'\n\nexport class KeysResource {\n constructor(private readonly transport: HttpTransport) {}\n\n async create(name: string): Promise<ApiKeyWithSecret> {\n return this.transport.post('/v1/keys', { name })\n }\n\n async list(): Promise<ListKeysResponse> {\n return this.transport.get('/v1/keys')\n }\n\n async delete(id: string): Promise<{ disabled: boolean }> {\n return this.transport.delete(`/v1/keys/${encodeURIComponent(id)}`)\n }\n}\n","import type { HttpTransport } from '../transport/http'\nimport type { UsageResponse, DetailedUsageResponse, DetailedUsageParams } from '../types/usage'\n\nexport class UsageResource {\n constructor(private readonly transport: HttpTransport) {}\n\n async get(): Promise<UsageResponse> {\n return this.transport.get('/v1/usage')\n }\n\n async getDetailed(params: DetailedUsageParams): Promise<DetailedUsageResponse> {\n return this.transport.get('/v1/usage/detailed', {\n resolution: params.resolution,\n start: params.start?.toString(),\n end: params.end?.toString(),\n api_key_id: params.api_key_id,\n })\n }\n}\n","import type { HttpTransport } from '../transport/http'\nimport type { HealthResponse } from '../types/health'\n\nexport class HealthResource {\n constructor(private readonly transport: HttpTransport) {}\n\n async check(): Promise<HealthResponse> {\n return this.transport.get('/v1/health')\n }\n}\n","import { HttpTransport } from './transport/http'\nimport { BlockResource } from './resources/block'\nimport { RollingResource } from './resources/rolling'\nimport { TumblingResource } from './resources/tumbling'\nimport { DemoResource } from './resources/demo'\nimport { AuthResource } from './resources/auth'\nimport { KeysResource } from './resources/keys'\nimport { UsageResource } from './resources/usage'\nimport { HealthResource } from './resources/health'\n\nexport interface HttpClientOptions {\n baseUrl?: string\n apiKey?: string\n token?: string\n fetch?: typeof globalThis.fetch\n}\n\nexport class HttpClient {\n readonly block: BlockResource\n readonly rolling: RollingResource\n readonly tumbling: TumblingResource\n readonly demo: DemoResource\n readonly auth: AuthResource\n readonly keys: KeysResource\n readonly usage: UsageResource\n readonly health: HealthResource\n\n private readonly transport: HttpTransport\n\n constructor(options: HttpClientOptions) {\n this.transport = new HttpTransport(options)\n this.block = new BlockResource(this.transport)\n this.rolling = new RollingResource(this.transport)\n this.tumbling = new TumblingResource(this.transport)\n this.demo = new DemoResource(this.transport)\n this.auth = new AuthResource(this.transport)\n this.keys = new KeysResource(this.transport)\n this.usage = new UsageResource(this.transport)\n this.health = new HealthResource(this.transport)\n }\n\n setToken(token: string): void {\n this.transport.setToken(token)\n }\n\n clearToken(): void {\n this.transport.clearToken()\n }\n}\n","import type {\n ClientMessage,\n ServerMessage,\n WsClientOptions,\n WsTransportState,\n WsTransportEvents,\n} from '../types/ws'\n\ntype EventName = keyof WsTransportEvents\ntype Listener<E extends EventName> = WsTransportEvents[E]\n\nexport class WsTransport {\n private ws: WebSocket | null = null\n private _state: WsTransportState = 'disconnected'\n private disposed = false\n private reconnectAttempt = 0\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null\n private pingTimer: ReturnType<typeof setInterval> | null = null\n private pongTimer: ReturnType<typeof setTimeout> | null = null\n private listeners = new Map<EventName, Set<Listener<any>>>()\n\n private readonly url: string\n private readonly reconnect: boolean\n private readonly maxReconnectAttempts: number\n private readonly reconnectDelay: number\n private readonly pingInterval: number\n private readonly WsCtor: typeof WebSocket\n\n constructor(options: WsClientOptions) {\n const base = (options.baseUrl ?? 'wss://api.priorityfee.com').replace(/^http/, 'ws').replace(/\\/+$/, '')\n this.url = `${base}/v1/ws?api_key=${encodeURIComponent(options.apiKey)}`\n this.reconnect = options.reconnect ?? true\n this.maxReconnectAttempts = options.maxReconnectAttempts ?? 10\n this.reconnectDelay = options.reconnectDelay ?? 1000\n this.pingInterval = options.pingInterval ?? 30_000\n this.WsCtor = (options.WebSocket ?? WebSocket) as typeof WebSocket\n }\n\n get state(): WsTransportState {\n return this._state\n }\n\n connect(): void {\n this.disposed = false\n if (this.ws) return\n\n this.setState('connecting')\n const ws = new this.WsCtor(this.url)\n\n ws.onopen = () => {\n this.reconnectAttempt = 0\n this.setState('connected')\n this.startPing()\n this.emit('open')\n }\n\n ws.onclose = (e: CloseEvent) => {\n this.stopPing()\n this.ws = null\n this.emit('close', e.code, e.reason)\n\n if (!this.disposed && this.reconnect) {\n this.scheduleReconnect()\n } else {\n this.setState('disconnected')\n }\n }\n\n ws.onerror = (e: Event) => {\n this.emit('error', e)\n }\n\n ws.onmessage = (e: MessageEvent) => {\n this.handleMessage(e.data as string)\n }\n\n this.ws = ws\n }\n\n disconnect(): void {\n this.disposed = true\n this.clearReconnectTimer()\n this.stopPing()\n if (this.ws) {\n this.ws.onclose = null\n this.ws.onerror = null\n this.ws.onmessage = null\n this.ws.onopen = null\n this.ws.close(1000)\n this.ws = null\n }\n this.setState('disconnected')\n }\n\n send(msg: ClientMessage): void {\n if (this.ws && this.ws.readyState === WebSocket.OPEN) {\n this.ws.send(JSON.stringify(msg))\n }\n }\n\n on<E extends EventName>(event: E, fn: Listener<E>): void {\n let set = this.listeners.get(event)\n if (!set) {\n set = new Set()\n this.listeners.set(event, set)\n }\n set.add(fn)\n }\n\n off<E extends EventName>(event: E, fn: Listener<E>): void {\n this.listeners.get(event)?.delete(fn)\n }\n\n // --- Private ---\n\n private emit<E extends EventName>(event: E, ...args: Parameters<WsTransportEvents[E]>): void {\n const set = this.listeners.get(event)\n if (!set) return\n for (const fn of set) {\n (fn as (...a: unknown[]) => void)(...args)\n }\n }\n\n private setState(s: WsTransportState): void {\n if (this._state === s) return\n this._state = s\n this.emit('stateChange', s)\n }\n\n private handleMessage(raw: string): void {\n let msg: ServerMessage\n try {\n msg = JSON.parse(raw) as ServerMessage\n } catch {\n return\n }\n\n if (msg.type === 'pong') {\n this.clearPongTimer()\n }\n\n this.emit('message', msg)\n }\n\n private startPing(): void {\n this.stopPing()\n this.pingTimer = setInterval(() => {\n this.send({ type: 'ping' })\n this.pongTimer = setTimeout(() => {\n // No pong received — force close to trigger reconnect\n if (this.ws) {\n this.ws.close(4000, 'pong timeout')\n }\n }, 10_000)\n }, this.pingInterval)\n }\n\n private stopPing(): void {\n if (this.pingTimer !== null) {\n clearInterval(this.pingTimer)\n this.pingTimer = null\n }\n this.clearPongTimer()\n }\n\n private clearPongTimer(): void {\n if (this.pongTimer !== null) {\n clearTimeout(this.pongTimer)\n this.pongTimer = null\n }\n }\n\n private scheduleReconnect(): void {\n if (this.reconnectAttempt >= this.maxReconnectAttempts) {\n this.setState('disconnected')\n return\n }\n\n this.setState('reconnecting')\n const delay = Math.min(this.reconnectDelay * Math.pow(2, this.reconnectAttempt), 30_000)\n const jitter = Math.random() * delay * 0.2\n this.reconnectAttempt++\n\n this.reconnectTimer = setTimeout(() => {\n this.reconnectTimer = null\n this.connect()\n }, delay + jitter)\n }\n\n private clearReconnectTimer(): void {\n if (this.reconnectTimer !== null) {\n clearTimeout(this.reconnectTimer)\n this.reconnectTimer = null\n }\n }\n}\n","import { WsTransport } from './transport/ws'\nimport type {\n WsChannel,\n WsClientOptions,\n WsTransportState,\n WsTransportEvents,\n BlockSubscribeParams,\n RollingSubscribeParams,\n Subscription,\n SubscriptionHandlers,\n SubscribedMessage,\n DataMessage,\n WsErrorMessage,\n ChannelPayloadMap,\n SubscribeParams,\n} from './types/ws'\n\ntype ClientEventName = 'open' | 'close' | 'error' | 'stateChange'\ntype ClientListener<E extends ClientEventName> = WsTransportEvents[E]\n\ninterface ActiveSubscription {\n channel: WsChannel\n params: SubscribeParams\n onData: (data: unknown) => void\n onError?: (error: WsErrorMessage) => void\n /** Mutable — gets updated on reconnect re-subscribe */\n currentId: string\n}\n\ninterface PendingSubscription {\n resolve: (sub: Subscription) => void\n reject: (err: Error) => void\n channel: WsChannel\n params: SubscribeParams\n onData: (data: unknown) => void\n onError?: (error: WsErrorMessage) => void\n}\n\nexport class WsClient {\n private readonly transport: WsTransport\n private readonly active = new Map<string, ActiveSubscription>()\n private readonly pending: PendingSubscription[] = []\n\n constructor(options: WsClientOptions) {\n this.transport = new WsTransport(options)\n this.transport.on('message', (msg) => this.handleMessage(msg))\n this.transport.on('open', () => this.handleReconnect())\n\n if (options.autoConnect !== false) {\n this.transport.connect()\n }\n }\n\n get state(): WsTransportState {\n return this.transport.state\n }\n\n connect(): void {\n this.transport.connect()\n }\n\n disconnect(): void {\n this.transport.disconnect()\n // Reject any pending subscriptions\n for (const p of this.pending) {\n p.reject(new Error('Client disconnected'))\n }\n this.pending.length = 0\n this.active.clear()\n }\n\n on<E extends ClientEventName>(event: E, fn: ClientListener<E>): void {\n this.transport.on(event, fn as WsTransportEvents[typeof event])\n }\n\n off<E extends ClientEventName>(event: E, fn: ClientListener<E>): void {\n this.transport.off(event, fn as WsTransportEvents[typeof event])\n }\n\n subscribeBlock(\n params: BlockSubscribeParams,\n handlers: SubscriptionHandlers<'block'>,\n ): Promise<Subscription> {\n return this.subscribe({ channel: { type: 'block', ...params } }, 'block', handlers)\n }\n\n subscribeRolling(\n params: RollingSubscribeParams,\n handlers: SubscriptionHandlers<'rolling'>,\n ): Promise<Subscription> {\n return this.subscribe({ channel: { type: 'rolling', ...params } }, 'rolling', handlers)\n }\n\n subscribeDemo(handlers: SubscriptionHandlers<'demo'>): Promise<Subscription> {\n return this.subscribe({ channel: { type: 'demo' } }, 'demo', handlers)\n }\n\n private subscribe<C extends WsChannel>(\n params: SubscribeParams,\n channel: C,\n handlers: SubscriptionHandlers<C>,\n ): Promise<Subscription> {\n return new Promise<Subscription>((resolve, reject) => {\n this.pending.push({\n resolve,\n reject,\n channel,\n params,\n onData: handlers.onData as (data: unknown) => void,\n onError: handlers.onError,\n })\n this.transport.send({ type: 'subscribe', channel: params.channel })\n })\n }\n\n private handleMessage(msg: import('./types/ws').ServerMessage): void {\n switch (msg.type) {\n case 'subscribed':\n this.handleSubscribed(msg)\n break\n case 'data':\n this.handleData(msg)\n break\n case 'unsubscribed':\n this.active.delete(msg.id)\n break\n case 'error':\n this.handleError(msg)\n break\n }\n }\n\n private handleSubscribed(msg: SubscribedMessage): void {\n const p = this.pending.shift()\n if (!p) return\n\n const entry: ActiveSubscription = {\n channel: p.channel,\n params: p.params,\n onData: p.onData,\n onError: p.onError,\n currentId: msg.id,\n }\n\n this.active.set(msg.id, entry)\n\n const subscription: Subscription = {\n get id() {\n return entry.currentId\n },\n channel: p.channel,\n unsubscribe: () => {\n this.transport.send({ type: 'unsubscribe', id: entry.currentId })\n this.active.delete(entry.currentId)\n },\n }\n\n p.resolve(subscription)\n }\n\n private handleData(msg: DataMessage): void {\n const entry = this.active.get(msg.id)\n if (entry) {\n entry.onData(msg.payload)\n }\n }\n\n private handleError(msg: WsErrorMessage): void {\n if (msg.id) {\n const entry = this.active.get(msg.id)\n if (entry?.onError) {\n entry.onError(msg)\n }\n } else {\n // Error without id — reject the oldest pending subscription\n const p = this.pending.shift()\n if (p) {\n p.reject(new Error(`${msg.code}: ${msg.message}`))\n }\n }\n }\n\n private handleReconnect(): void {\n if (this.active.size > 0) {\n const entries = Array.from(this.active.values())\n this.active.clear()\n\n for (const entry of entries) {\n this.pending.push({\n resolve: (sub) => { entry.currentId = sub.id },\n reject: () => {},\n channel: entry.channel,\n params: entry.params,\n onData: entry.onData,\n onError: entry.onError,\n })\n }\n }\n\n for (const p of this.pending) {\n this.transport.send({ type: 'subscribe', channel: p.params.channel })\n }\n }\n}\n"],"mappings":"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","names":[]}
package/license.md ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Chaindex
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@chaindex/priorityfee",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "description": "TypeScript SDK for the Chaindex Priority Fee API",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
package/readme.md ADDED
@@ -0,0 +1,60 @@
1
+ # @chaindex/priorityfee
2
+
3
+ TypeScript SDK for the Chaindex Priority Fee API.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ npm install @chaindex/priorityfee
9
+ # or
10
+ pnpm add @chaindex/priorityfee
11
+ ```
12
+
13
+ ## Quick Start
14
+
15
+ ```ts
16
+ import { HttpClient } from '@chaindex/priorityfee'
17
+
18
+ const client = new HttpClient({ apiKey: 'your-api-key' })
19
+
20
+ const rolling = await client.rolling.get({ duration: '15m', detail: 'full' })
21
+ console.log(rolling)
22
+ ```
23
+
24
+ ## WebSocket
25
+
26
+ ```ts
27
+ import { WsClient } from '@chaindex/priorityfee'
28
+
29
+ const ws = new WsClient({ apiKey: 'your-api-key' })
30
+
31
+ const sub = await ws.subscribeRolling(
32
+ { duration: '15m', detail: 'full' },
33
+ {
34
+ onData: (data) => console.log(data),
35
+ onError: (err) => console.error(err),
36
+ },
37
+ )
38
+
39
+ // Later: sub.unsubscribe()
40
+ ```
41
+
42
+ ## API Overview
43
+
44
+ The `HttpClient` exposes the following resources:
45
+
46
+ | Resource | Description |
47
+ | ----------------- | ------------------------------ |
48
+ | `client.block` | Per-block priority fee data |
49
+ | `client.rolling` | Rolling window aggregations |
50
+ | `client.tumbling` | Tumbling window aggregations |
51
+
52
+ The `WsClient` supports real-time subscriptions via `subscribeBlock`, `subscribeRolling`, and `subscribeDemo`.
53
+
54
+ ## Requirements
55
+
56
+ - Node.js >= 22
57
+
58
+ ## License
59
+
60
+ [MIT](./license.md)