@chaindex/priorityfee 0.1.0 → 0.1.1
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 +2 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +3 -3
- package/dist/index.d.ts +3 -3
- package/dist/index.mjs +2 -2
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
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;
|
package/dist/index.cjs.map
CHANGED
|
@@ -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":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAO,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/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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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;
|
package/dist/index.mjs.map
CHANGED
|
@@ -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":"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","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":[]}
|