@liberfi.io/ui-predict 0.1.49 → 0.1.51
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/client/index.d.mts +1 -1
- package/dist/client/index.d.ts +1 -1
- package/dist/client/index.js +1 -1
- package/dist/client/index.js.map +1 -1
- package/dist/client/index.mjs +1 -1
- package/dist/client/index.mjs.map +1 -1
- package/dist/{index-B-NMsVEe.d.mts → index-D3Ek8yK4.d.mts} +187 -1
- package/dist/{index-B-NMsVEe.d.ts → index-D3Ek8yK4.d.ts} +187 -1
- package/dist/index.d.mts +278 -5
- package/dist/index.d.ts +278 -5
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +2 -2
- package/dist/index.mjs.map +1 -1
- package/package.json +9 -9
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/client/base.ts","../../src/client/dflow.ts","../../src/client/ws.ts"],"names":["buildQuery","params","provider","qs","key","value","str","toRecord","BasePredictClient","endpoint","path","query","url","httpGet","data","httpPost","parseSide","raw","sort","levels","priceStr","quantity","a","b","normalizeOrderbook","DflowPredictClient","eventId","withNestedMarkets","ticker","seriesTicker","rest","mintAddress","marketId","request","marketTicker","walletAddress","eventTicker","DflowPredictWsClient","config","event","error","options","onUpdate","removeListener","callback","listeners","index","channel","subscription","status","listener","message","type","dataMsg","delay","createDflowPredictWsClient"],"mappings":"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","file":"index.mjs","sourcesContent":["import { httpGet, httpPost } from \"@liberfi.io/utils\";\nimport type { ProviderType } from \"../types\";\n\n/**\n * Build a query string from a params object.\n * Skips `undefined` and `null` values.\n */\nexport function buildQuery(\n params: Record<string, unknown>,\n provider?: ProviderType,\n): string {\n const qs = new URLSearchParams();\n\n // Add provider if specified\n if (provider) {\n qs.set(\"provider\", provider);\n }\n\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined && value !== null) {\n if (typeof value === \"object\") {\n qs.set(key, JSON.stringify(value));\n } else {\n qs.set(key, String(value));\n }\n }\n }\n const str = qs.toString();\n return str ? `?${str}` : \"\";\n}\n\n/** Cast typed params to Record for buildQuery */\nexport function toRecord<T extends object>(params: T): Record<string, unknown> {\n return params as unknown as Record<string, unknown>;\n}\n\n/**\n * Base class for prediction market clients.\n * Provides common HTTP request utilities.\n */\nexport abstract class BasePredictClient {\n constructor(\n protected readonly endpoint: string,\n protected readonly provider: ProviderType,\n ) {}\n\n /**\n * Build URL with query parameters\n */\n protected buildUrl(path: string, params?: Record<string, unknown>): string {\n const query = buildQuery(params ?? {}, this.provider);\n return `${this.endpoint}${path}${query}`;\n }\n\n /**\n * Perform a GET request\n */\n protected async fetch<T>(\n path: string,\n params?: Record<string, unknown>,\n ): Promise<T> {\n const url = this.buildUrl(path, params);\n return await httpGet<T>(url);\n }\n\n /**\n * Perform a POST request\n */\n protected async postRequest<T, P = unknown>(\n path: string,\n data: P,\n params?: Record<string, unknown>,\n ): Promise<T> {\n const url = this.buildUrl(path, params);\n return await httpPost<T, P>(url, data);\n }\n}\n","import type {\n IPredictClient,\n StandardEventsResponse,\n StandardEvent,\n StandardMarketsResponse,\n StandardMarket,\n OrderbookResponse,\n OrderbookLevel,\n MultiTradeResponse,\n MultiOnchainTradeResponse,\n CandlesticksResponse,\n ForecastPercentileHistoryResponse,\n SeriesListResponse,\n SeriesResponse,\n TagsByCategoriesResponse,\n FiltersBySportsResponse,\n SearchResponse,\n OutcomeMintsResponse,\n FilterOutcomeMintsResponse,\n LiveDataResponse,\n QuoteResponse,\n SwapResponse,\n SwapInstructionsResponse,\n OrderResponse,\n OrderStatusResponse,\n IntentQuoteResponse,\n IntentSwapResponse,\n PredictionMarketInitResponse,\n TokenListResponse,\n TokenListWithDecimalsResponse,\n VenueListResponse,\n EventQueryParams,\n MarketQueryParams,\n MarketsBatchRequest,\n TradesQueryParams,\n TradesByMintQueryParams,\n OnchainTradesByWalletQueryParams,\n OnchainTradesByEventQueryParams,\n OnchainTradesByMarketQueryParams,\n CandlesticksQueryParams,\n ForecastPercentileHistoryQueryParams,\n ForecastPercentileHistoryByMintQueryParams,\n SeriesQueryParams,\n SearchQueryParams,\n LiveDataQueryParams,\n LiveDataByEventQueryParams,\n LiveDataByMintQueryParams,\n PositionsByWalletQueryParams,\n WalletPositionsResponse,\n OutcomeMintsQueryParams,\n FilterOutcomeMintsRequest,\n QuoteQueryParams,\n SwapRequestBody,\n OrderQueryParams,\n OrderStatusQueryParams,\n IntentQuoteQueryParams,\n IntentSwapRequestBody,\n PredictionMarketInitQueryParams,\n} from \"../types\";\nimport { BasePredictClient, toRecord } from \"./base\";\n\n// ---------------------------------------------------------------------------\n// DFlow-specific raw orderbook types (internal to this client)\n// ---------------------------------------------------------------------------\n\n/** Raw orderbook side as returned by the DFlow API: price string → quantity */\ntype DflowOrderbookSideRaw = Record<string, number>;\n\n/** Raw orderbook response shape from DFlow API */\ninterface DflowRawOrderbookResponse {\n yes_bids?: DflowOrderbookSideRaw;\n yes_asks?: DflowOrderbookSideRaw;\n no_bids?: DflowOrderbookSideRaw;\n no_asks?: DflowOrderbookSideRaw;\n sequence?: number;\n}\n\n/** Parse a raw orderbook side into sorted OrderbookLevel[] */\nfunction parseSide(\n raw: DflowOrderbookSideRaw | undefined,\n sort: \"asc\" | \"desc\",\n): OrderbookLevel[] {\n if (!raw) return [];\n const levels: OrderbookLevel[] = Object.entries(raw).map(\n ([priceStr, quantity]) => ({\n price: parseFloat(priceStr),\n quantity,\n }),\n );\n levels.sort((a, b) =>\n sort === \"desc\" ? b.price - a.price : a.price - b.price,\n );\n return levels;\n}\n\n/** Normalise DFlow raw orderbook response into public OrderbookResponse */\nfunction normalizeOrderbook(raw: DflowRawOrderbookResponse): OrderbookResponse {\n return {\n yesBids: parseSide(raw.yes_bids, \"desc\"),\n yesAsks: parseSide(raw.yes_asks, \"asc\"),\n noBids: parseSide(raw.no_bids, \"desc\"),\n noAsks: parseSide(raw.no_asks, \"asc\"),\n sequence: raw.sequence,\n };\n}\n\n// ---------------------------------------------------------------------------\n\n/**\n * DFlow Prediction Market Client.\n * Implements IPredictClient interface using the DFlow API.\n */\nexport class DflowPredictClient\n extends BasePredictClient\n implements IPredictClient\n{\n constructor(endpoint: string) {\n super(endpoint, \"dflow\");\n }\n\n // -- Events ----------------------------------------------------------------\n\n async getEvents(params?: EventQueryParams): Promise<StandardEventsResponse> {\n return await this.fetch<StandardEventsResponse>(\n \"/v2/event\",\n toRecord(params ?? {}),\n );\n }\n\n async getEventById(\n eventId: string,\n withNestedMarkets?: boolean,\n ): Promise<StandardEvent> {\n return await this.fetch<StandardEvent>(`/v2/event/${eventId}`, {\n withNestedMarkets,\n });\n }\n\n async getEventCandlesticks(\n ticker: string,\n params: CandlesticksQueryParams,\n ): Promise<CandlesticksResponse> {\n return await this.fetch<CandlesticksResponse>(\n `/v2/event/${ticker}/candlesticks`,\n toRecord(params),\n );\n }\n\n async getEventForecastPercentileHistory(\n params: ForecastPercentileHistoryQueryParams,\n ): Promise<ForecastPercentileHistoryResponse> {\n const { seriesTicker, eventId, ...rest } = params;\n return await this.fetch<ForecastPercentileHistoryResponse>(\n `/v2/event/${seriesTicker}/${eventId}/forecast_percentile_history`,\n toRecord(rest),\n );\n }\n\n async getEventForecastPercentileHistoryByMint(\n params: ForecastPercentileHistoryByMintQueryParams,\n ): Promise<ForecastPercentileHistoryResponse> {\n const { mintAddress, ...rest } = params;\n return await this.fetch<ForecastPercentileHistoryResponse>(\n `/v2/event/by-mint/${mintAddress}/forecast_percentile_history`,\n toRecord(rest),\n );\n }\n\n // -- Markets ---------------------------------------------------------------\n\n async getMarkets(\n params?: MarketQueryParams,\n ): Promise<StandardMarketsResponse> {\n return await this.fetch<StandardMarketsResponse>(\n \"/v2/market\",\n toRecord(params ?? {}),\n );\n }\n\n async getMarketById(marketId: string): Promise<StandardMarket> {\n return await this.fetch<StandardMarket>(`/v2/market/${marketId}`);\n }\n\n async getMarketByMint(mintAddress: string): Promise<StandardMarket> {\n return await this.fetch<StandardMarket>(\n `/v2/market/by-mint/${mintAddress}`,\n );\n }\n\n async getMarketsBatch(\n request: MarketsBatchRequest,\n ): Promise<StandardMarketsResponse> {\n return await this.postRequest<StandardMarketsResponse, MarketsBatchRequest>(\n \"/v2/market/batch\",\n request,\n );\n }\n\n async getMarketCandlesticks(\n ticker: string,\n params: CandlesticksQueryParams,\n ): Promise<CandlesticksResponse> {\n return await this.fetch<CandlesticksResponse>(\n `/v2/market/${ticker}/candlesticks`,\n toRecord(params),\n );\n }\n\n async getMarketCandlesticksByMint(\n mintAddress: string,\n params: CandlesticksQueryParams,\n ): Promise<CandlesticksResponse> {\n return await this.fetch<CandlesticksResponse>(\n `/v2/market/by-mint/${mintAddress}/candlesticks`,\n toRecord(params),\n );\n }\n\n // -- Orderbook -------------------------------------------------------------\n\n async getOrderbook(marketTicker: string): Promise<OrderbookResponse> {\n const raw = await this.fetch<DflowRawOrderbookResponse>(\n `/v2/orderbook/${marketTicker}`,\n );\n return normalizeOrderbook(raw);\n }\n\n async getOrderbookByMint(mintAddress: string): Promise<OrderbookResponse> {\n const raw = await this.fetch<DflowRawOrderbookResponse>(\n `/v2/orderbook/by-mint/${mintAddress}`,\n );\n return normalizeOrderbook(raw);\n }\n\n // -- Trades ----------------------------------------------------------------\n\n async getTrades(params?: TradesQueryParams): Promise<MultiTradeResponse> {\n return await this.fetch<MultiTradeResponse>(\n \"/v2/trades\",\n toRecord(params ?? {}),\n );\n }\n\n async getTradesByMint(\n params: TradesByMintQueryParams,\n ): Promise<MultiTradeResponse> {\n const { mintAddress, ...rest } = params;\n return await this.fetch<MultiTradeResponse>(\n `/v2/trades/by-mint/${mintAddress}`,\n toRecord(rest),\n );\n }\n\n // -- On-Chain Trades -------------------------------------------------------\n\n async getOnchainTradesByWallet(\n params: OnchainTradesByWalletQueryParams,\n ): Promise<MultiOnchainTradeResponse> {\n const { walletAddress, ...rest } = params;\n return await this.fetch<MultiOnchainTradeResponse>(\n `/v2/trades/onchain/by-wallet/${walletAddress}`,\n toRecord(rest),\n );\n }\n\n async getOnchainTradesByEvent(\n params: OnchainTradesByEventQueryParams,\n ): Promise<MultiOnchainTradeResponse> {\n const { eventTicker, ...rest } = params;\n return await this.fetch<MultiOnchainTradeResponse>(\n `/v2/trades/onchain/by-event/${eventTicker}`,\n toRecord(rest),\n );\n }\n\n async getOnchainTradesByMarket(\n params: OnchainTradesByMarketQueryParams,\n ): Promise<MultiOnchainTradeResponse> {\n const { marketTicker, ...rest } = params;\n return await this.fetch<MultiOnchainTradeResponse>(\n `/v2/trades/onchain/by-market/${marketTicker}`,\n toRecord(rest),\n );\n }\n\n // -- Live Data -------------------------------------------------------------\n\n async getLiveData(params: LiveDataQueryParams): Promise<LiveDataResponse> {\n return await this.fetch<LiveDataResponse>(\"/v2/live\", {\n milestoneIds: params.milestoneIds.join(\",\"),\n });\n }\n\n async getLiveDataByEvent(\n params: LiveDataByEventQueryParams,\n ): Promise<LiveDataResponse> {\n const { eventTicker, ...rest } = params;\n return await this.fetch<LiveDataResponse>(\n `/v2/live/event/${eventTicker}`,\n toRecord(rest),\n );\n }\n\n async getLiveDataByMint(\n params: LiveDataByMintQueryParams,\n ): Promise<LiveDataResponse> {\n const { mintAddress, ...rest } = params;\n return await this.fetch<LiveDataResponse>(\n `/v2/live/by-mint/${mintAddress}`,\n toRecord(rest),\n );\n }\n\n // -- Series ----------------------------------------------------------------\n\n async getSeries(params?: SeriesQueryParams): Promise<SeriesListResponse> {\n return await this.fetch<SeriesListResponse>(\n \"/v2/series\",\n toRecord(params ?? {}),\n );\n }\n\n async getSeriesByTicker(seriesTicker: string): Promise<SeriesResponse> {\n return await this.fetch<SeriesResponse>(`/v2/series/${seriesTicker}`);\n }\n\n // -- Tags & Sports ---------------------------------------------------------\n\n async getTagsByCategories(): Promise<TagsByCategoriesResponse> {\n return await this.fetch<TagsByCategoriesResponse>(\"/v2/tags/by_categories\");\n }\n\n async getFiltersBySports(): Promise<FiltersBySportsResponse> {\n return await this.fetch<FiltersBySportsResponse>(\"/v2/sports/filters\");\n }\n\n // -- Search ----------------------------------------------------------------\n\n async search(params: SearchQueryParams): Promise<SearchResponse> {\n return await this.fetch<SearchResponse>(\"/v2/search\", toRecord(params));\n }\n\n // -- Positions -------------------------------------------------------------\n\n async getPositionsByWallet(\n params: PositionsByWalletQueryParams,\n ): Promise<WalletPositionsResponse> {\n const { walletAddress } = params;\n return await this.fetch<WalletPositionsResponse>(\n `/v2/positions/by-wallet/${walletAddress}`,\n );\n }\n\n // -- Outcome Mints ---------------------------------------------------------\n\n async getOutcomeMints(\n params?: OutcomeMintsQueryParams,\n ): Promise<OutcomeMintsResponse> {\n return await this.fetch<OutcomeMintsResponse>(\n \"/v2/outcome_mints\",\n toRecord(params ?? {}),\n );\n }\n\n async filterOutcomeMints(\n request: FilterOutcomeMintsRequest,\n ): Promise<FilterOutcomeMintsResponse> {\n return await this.postRequest<\n FilterOutcomeMintsResponse,\n FilterOutcomeMintsRequest\n >(\"/v2/filter_outcome_mints\", request);\n }\n\n // -- Quote & Swap (Imperative) ---------------------------------------------\n\n async getQuote(params: QuoteQueryParams): Promise<QuoteResponse> {\n return await this.fetch<QuoteResponse>(\"/v2/swap/quote\", toRecord(params));\n }\n\n async createSwap(request: SwapRequestBody): Promise<SwapResponse> {\n return await this.postRequest<SwapResponse, SwapRequestBody>(\n \"/v2/swap\",\n request,\n );\n }\n\n async createSwapInstructions(\n request: SwapRequestBody,\n ): Promise<SwapInstructionsResponse> {\n return await this.postRequest<SwapInstructionsResponse, SwapRequestBody>(\n \"/v2/swap/instructions\",\n request,\n );\n }\n\n // -- Order API -------------------------------------------------------------\n\n async getOrder(params: OrderQueryParams): Promise<OrderResponse> {\n return await this.fetch<OrderResponse>(\"/v2/order\", toRecord(params));\n }\n\n async getOrderStatus(\n params: OrderStatusQueryParams,\n ): Promise<OrderStatusResponse> {\n return await this.fetch<OrderStatusResponse>(\n \"/v2/order/status\",\n toRecord(params),\n );\n }\n\n // -- Intent (Declarative Swap) ---------------------------------------------\n\n async getIntentQuote(\n params: IntentQuoteQueryParams,\n ): Promise<IntentQuoteResponse> {\n return await this.fetch<IntentQuoteResponse>(\n \"/v2/intent/quote\",\n toRecord(params),\n );\n }\n\n async submitIntentSwap(\n request: IntentSwapRequestBody,\n ): Promise<IntentSwapResponse> {\n return await this.postRequest<IntentSwapResponse, IntentSwapRequestBody>(\n \"/v2/intent/swap\",\n request,\n );\n }\n\n // -- Prediction Market Init ------------------------------------------------\n\n async initPredictionMarket(\n params: PredictionMarketInitQueryParams,\n ): Promise<PredictionMarketInitResponse> {\n return await this.fetch<PredictionMarketInitResponse>(\n \"/v2/prediction-market/init\",\n toRecord(params),\n );\n }\n\n // -- Token & Venue ---------------------------------------------------------\n\n async getTokens(): Promise<TokenListResponse> {\n return await this.fetch<TokenListResponse>(\"/v2/tokens\");\n }\n\n async getTokensWithDecimals(): Promise<TokenListWithDecimalsResponse> {\n return await this.fetch<TokenListWithDecimalsResponse>(\n \"/v2/tokens/decimals\",\n );\n }\n\n async getVenues(): Promise<VenueListResponse> {\n return await this.fetch<VenueListResponse>(\"/v2/venues\");\n }\n}\n","/**\n * DflowPredictWsClient - WebSocket client for real-time prediction market data\n *\n * Features:\n * - Auto-reconnect with exponential backoff\n * - Heartbeat (ping/pong) for connection health\n * - Subscription management for prices, trades, orderbook channels\n * - Event emitter pattern for message handling\n */\nimport type {\n WsConnectionStatus,\n WsSubscribeOptions,\n WsPriceUpdate,\n WsTradeUpdate,\n WsOrderbookUpdate,\n IPredictWsClient,\n} from \"../types\";\n\n// ---------------------------------------------------------------------------\n// Internal WebSocket Protocol Types\n// ---------------------------------------------------------------------------\n\n/** WebSocket channel types */\ntype WsChannel = \"prices\" | \"trades\" | \"orderbook\";\n\n/** Subscribe/Unsubscribe message */\ninterface WsSubscribeMessage {\n type: \"subscribe\" | \"unsubscribe\";\n channel: WsChannel;\n all?: boolean;\n tickers?: string[];\n}\n\n/** Ping message */\ninterface WsPingMessage {\n type: \"ping\";\n}\n\n/** Pong response */\ninterface WsPongMessage {\n type: \"pong\";\n timestamp: number;\n}\n\n/** Status request message */\ninterface WsStatusRequestMessage {\n type: \"status\";\n}\n\n/** Status response message */\ninterface WsStatusMessage {\n type: \"status\";\n status: WsConnectionStatus;\n message?: string;\n connected?: boolean;\n clientCount?: number;\n subscriptions?: {\n prices: { all: boolean; tickers: string[] };\n trades: { all: boolean; tickers: string[] };\n orderbook: { all: boolean; tickers: string[] };\n };\n}\n\n/** Subscription confirmation message */\ninterface WsSubscriptionConfirmation {\n type: \"subscribed\" | \"unsubscribed\";\n channel: WsChannel;\n all?: boolean;\n tickers?: string[];\n success: boolean;\n}\n\n/** Error message from server */\ninterface WsErrorMessage {\n type: \"error\";\n message: string;\n code?: string;\n}\n\n/** Union type for all data messages from server */\ntype WsDataMessage = WsPriceUpdate | WsTradeUpdate | WsOrderbookUpdate;\n\n/** Union type for all server messages */\ntype WsServerMessage =\n | WsDataMessage\n | WsStatusMessage\n | WsSubscriptionConfirmation\n | WsErrorMessage\n | WsPongMessage;\n\n/** Union type for all client messages */\ntype WsClientMessage =\n | WsSubscribeMessage\n | WsPingMessage\n | WsStatusRequestMessage;\n\n/** WebSocket event types for event emitter */\ntype WsEventType =\n | \"connect\"\n | \"disconnect\"\n | \"reconnecting\"\n | \"error\"\n | \"price\"\n | \"trade\"\n | \"orderbook\"\n | \"status\"\n | \"subscribed\"\n | \"unsubscribed\";\n\n/** WebSocket client configuration */\nexport interface WsClientConfig {\n /** WebSocket endpoint URL */\n wsUrl: string;\n /** Auto-connect on instantiation */\n autoConnect?: boolean;\n /** Auto-reconnect on disconnect */\n autoReconnect?: boolean;\n /** Reconnect interval base in ms (default: 1000) */\n reconnectIntervalBase?: number;\n /** Max reconnect interval in ms (default: 30000) */\n reconnectMaxInterval?: number;\n /** Ping interval in ms (default: 30000) */\n pingInterval?: number;\n}\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_RECONNECT_INTERVAL_BASE = 1000; // 1 second\nconst DEFAULT_RECONNECT_MAX_INTERVAL = 30000; // 30 seconds\nconst DEFAULT_PING_INTERVAL = 30000; // 30 seconds\n\n// ---------------------------------------------------------------------------\n// Event Emitter Types\n// ---------------------------------------------------------------------------\n\ntype EventCallback<T = unknown> = (data: T) => void;\n\ninterface EventListeners {\n connect: EventCallback<void>[];\n disconnect: EventCallback<{ code?: number; reason?: string }>[];\n reconnecting: EventCallback<{ attempt: number; delay: number }>[];\n error: EventCallback<Error>[];\n price: EventCallback<WsPriceUpdate>[];\n trade: EventCallback<WsTradeUpdate>[];\n orderbook: EventCallback<WsOrderbookUpdate>[];\n status: EventCallback<WsConnectionStatus>[];\n subscribed: EventCallback<{\n channel: WsChannel;\n all?: boolean;\n tickers?: string[];\n }>[];\n unsubscribed: EventCallback<{\n channel: WsChannel;\n all?: boolean;\n tickers?: string[];\n }>[];\n}\n\n// ---------------------------------------------------------------------------\n// Subscription State\n// ---------------------------------------------------------------------------\n\ninterface ChannelSubscription {\n all: boolean;\n tickers: Set<string>;\n}\n\ninterface SubscriptionState {\n prices: ChannelSubscription;\n trades: ChannelSubscription;\n orderbook: ChannelSubscription;\n}\n\n// ---------------------------------------------------------------------------\n// DflowPredictWsClient Class\n// ---------------------------------------------------------------------------\n\nexport class DflowPredictWsClient implements IPredictWsClient {\n private ws: WebSocket | null = null;\n private readonly wsUrl: string;\n private readonly autoReconnect: boolean;\n private readonly reconnectIntervalBase: number;\n private readonly reconnectMaxInterval: number;\n private readonly pingInterval: number;\n\n private status: WsConnectionStatus = \"disconnected\";\n private reconnectAttempts = 0;\n private reconnectTimeout: ReturnType<typeof setTimeout> | null = null;\n private pingIntervalId: ReturnType<typeof setInterval> | null = null;\n private shouldReconnect = true;\n\n // Event listeners\n private listeners: EventListeners = {\n connect: [],\n disconnect: [],\n reconnecting: [],\n error: [],\n price: [],\n trade: [],\n orderbook: [],\n status: [],\n subscribed: [],\n unsubscribed: [],\n };\n\n // Track current subscriptions for reconnection recovery\n private subscriptions: SubscriptionState = {\n prices: { all: false, tickers: new Set() },\n trades: { all: false, tickers: new Set() },\n orderbook: { all: false, tickers: new Set() },\n };\n\n constructor(config: WsClientConfig) {\n this.wsUrl = config.wsUrl;\n this.autoReconnect = config.autoReconnect ?? true;\n this.reconnectIntervalBase =\n config.reconnectIntervalBase ?? DEFAULT_RECONNECT_INTERVAL_BASE;\n this.reconnectMaxInterval =\n config.reconnectMaxInterval ?? DEFAULT_RECONNECT_MAX_INTERVAL;\n this.pingInterval = config.pingInterval ?? DEFAULT_PING_INTERVAL;\n\n if (config.autoConnect !== false) {\n this.connect();\n }\n }\n\n // ---------------------------------------------------------------------------\n // Connection Management\n // ---------------------------------------------------------------------------\n\n /**\n * Connect to the WebSocket server\n */\n connect(): void {\n if (\n this.ws &&\n (this.ws.readyState === WebSocket.OPEN ||\n this.ws.readyState === WebSocket.CONNECTING)\n ) {\n return;\n }\n\n this.shouldReconnect = true;\n this.setStatus(\"connecting\");\n\n try {\n this.ws = new WebSocket(this.wsUrl);\n\n this.ws.onopen = () => {\n this.reconnectAttempts = 0;\n this.setStatus(\"connected\");\n this.emit(\"connect\", undefined);\n\n // Restore subscriptions after reconnection\n this.restoreSubscriptions();\n\n // Start ping interval\n this.startPingInterval();\n };\n\n this.ws.onmessage = (event) => {\n this.handleMessage(event.data);\n };\n\n this.ws.onerror = (event) => {\n const error = new Error(\"WebSocket error\");\n console.error(\"[DflowPredictWsClient] WebSocket error:\", event);\n this.emit(\"error\", error);\n };\n\n this.ws.onclose = (event) => {\n this.stopPingInterval();\n this.setStatus(\"disconnected\");\n this.emit(\"disconnect\", { code: event.code, reason: event.reason });\n\n // Attempt reconnection\n if (this.shouldReconnect && this.autoReconnect) {\n this.scheduleReconnect();\n }\n };\n } catch (error) {\n console.error(\n \"[DflowPredictWsClient] Failed to create WebSocket:\",\n error,\n );\n this.emit(\n \"error\",\n error instanceof Error ? error : new Error(String(error)),\n );\n\n if (this.shouldReconnect && this.autoReconnect) {\n this.scheduleReconnect();\n }\n }\n }\n\n /**\n * Disconnect from the WebSocket server\n */\n disconnect(): void {\n this.shouldReconnect = false;\n this.stopPingInterval();\n\n if (this.reconnectTimeout) {\n clearTimeout(this.reconnectTimeout);\n this.reconnectTimeout = null;\n }\n\n if (this.ws) {\n this.ws.close();\n this.ws = null;\n }\n\n this.setStatus(\"disconnected\");\n }\n\n /**\n * Check if connected to the server\n */\n isConnected(): boolean {\n return this.ws !== null && this.ws.readyState === WebSocket.OPEN;\n }\n\n /**\n * Get current connection status\n */\n getStatus(): WsConnectionStatus {\n return this.status;\n }\n\n // ---------------------------------------------------------------------------\n // Business Subscription Methods (IPredictWsClient interface)\n // ---------------------------------------------------------------------------\n\n /** Subscribe to price updates, returns unsubscribe function */\n subscribePrices(\n options: WsSubscribeOptions,\n onUpdate: (update: WsPriceUpdate) => void,\n ): () => void {\n this.subscribeChannel(\"prices\", options);\n const removeListener = this.on(\"price\", onUpdate);\n return () => {\n removeListener();\n this.unsubscribeChannel(\"prices\", options);\n };\n }\n\n /** Subscribe to trade updates, returns unsubscribe function */\n subscribeTrades(\n options: WsSubscribeOptions,\n onUpdate: (update: WsTradeUpdate) => void,\n ): () => void {\n this.subscribeChannel(\"trades\", options);\n const removeListener = this.on(\"trade\", onUpdate);\n return () => {\n removeListener();\n this.unsubscribeChannel(\"trades\", options);\n };\n }\n\n /** Subscribe to orderbook updates, returns unsubscribe function */\n subscribeOrderbook(\n options: WsSubscribeOptions,\n onUpdate: (update: WsOrderbookUpdate) => void,\n ): () => void {\n this.subscribeChannel(\"orderbook\", options);\n const removeListener = this.on(\"orderbook\", onUpdate);\n return () => {\n removeListener();\n this.unsubscribeChannel(\"orderbook\", options);\n };\n }\n\n /** Subscribe to status changes, returns unsubscribe function */\n onStatusChange(callback: (status: WsConnectionStatus) => void): () => void {\n return this.on(\"status\", callback);\n }\n\n // ---------------------------------------------------------------------------\n // Event Emitter\n // ---------------------------------------------------------------------------\n\n /**\n * Add event listener\n */\n on<T extends WsEventType>(\n event: T,\n callback: EventListeners[T][number],\n ): () => void {\n const listeners = this.listeners[event] as EventCallback<unknown>[];\n listeners.push(callback as EventCallback<unknown>);\n\n // Return unsubscribe function\n return () => {\n this.off(event, callback);\n };\n }\n\n /**\n * Remove event listener\n */\n off<T extends WsEventType>(\n event: T,\n callback: EventListeners[T][number],\n ): void {\n const listeners = this.listeners[event] as EventCallback<unknown>[];\n const index = listeners.indexOf(callback as EventCallback<unknown>);\n if (index !== -1) {\n listeners.splice(index, 1);\n }\n }\n\n /**\n * Remove all listeners for an event (or all events)\n */\n removeAllListeners(event?: WsEventType): void {\n if (event) {\n (this.listeners[event] as unknown[]).length = 0;\n } else {\n for (const key of Object.keys(this.listeners)) {\n (this.listeners[key as WsEventType] as unknown[]).length = 0;\n }\n }\n }\n\n // ---------------------------------------------------------------------------\n // Private Methods\n // ---------------------------------------------------------------------------\n\n private subscribeChannel(\n channel: WsChannel,\n options: WsSubscribeOptions,\n ): void {\n const subscription = this.subscriptions[channel];\n\n if (options.all) {\n subscription.all = true;\n subscription.tickers.clear();\n } else if (options.tickers && options.tickers.length > 0) {\n subscription.all = false;\n for (const ticker of options.tickers) {\n subscription.tickers.add(ticker);\n }\n }\n\n this.sendSubscription(\"subscribe\", channel, options);\n }\n\n private unsubscribeChannel(\n channel: WsChannel,\n options: WsSubscribeOptions,\n ): void {\n const subscription = this.subscriptions[channel];\n\n if (options.all) {\n subscription.all = false;\n subscription.tickers.clear();\n } else if (options.tickers && options.tickers.length > 0) {\n for (const ticker of options.tickers) {\n subscription.tickers.delete(ticker);\n }\n }\n\n this.sendSubscription(\"unsubscribe\", channel, options);\n }\n\n private setStatus(status: WsConnectionStatus): void {\n if (this.status !== status) {\n this.status = status;\n this.emit(\"status\", status);\n }\n }\n\n private emit<T extends WsEventType>(\n event: T,\n data: Parameters<EventListeners[T][number]>[0],\n ): void {\n const listeners = this.listeners[event] as EventCallback<typeof data>[];\n for (const listener of listeners) {\n try {\n listener(data);\n } catch (error) {\n console.error(\n `[DflowPredictWsClient] Error in ${event} listener:`,\n error,\n );\n }\n }\n }\n\n private send(message: WsClientMessage): boolean {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n console.warn(\n \"[DflowPredictWsClient] Cannot send message, WebSocket not connected\",\n );\n return false;\n }\n\n try {\n this.ws.send(JSON.stringify(message));\n return true;\n } catch (error) {\n console.error(\"[DflowPredictWsClient] Failed to send message:\", error);\n return false;\n }\n }\n\n private sendSubscription(\n type: \"subscribe\" | \"unsubscribe\",\n channel: WsChannel,\n options: WsSubscribeOptions,\n ): void {\n this.send({\n type,\n channel,\n all: options.all,\n tickers: options.tickers,\n });\n }\n\n private handleMessage(data: string): void {\n try {\n const message = JSON.parse(data) as WsServerMessage;\n\n switch (message.type) {\n case \"ticker\":\n this.emit(\"price\", message as WsPriceUpdate);\n break;\n case \"trade\":\n this.emit(\"trade\", message as WsTradeUpdate);\n break;\n case \"orderbook\":\n this.emit(\"orderbook\", message as WsOrderbookUpdate);\n break;\n case \"status\":\n // Status message from server (different from connection status)\n break;\n case \"subscribed\":\n this.emit(\"subscribed\", {\n channel: message.channel,\n all: message.all,\n tickers: message.tickers,\n });\n break;\n case \"unsubscribed\":\n this.emit(\"unsubscribed\", {\n channel: message.channel,\n all: message.all,\n tickers: message.tickers,\n });\n break;\n case \"pong\":\n // Pong received, connection is alive\n break;\n case \"error\":\n console.error(\n \"[DflowPredictWsClient] Server error:\",\n message.message,\n );\n this.emit(\"error\", new Error(message.message));\n break;\n default:\n // Handle data messages without explicit type\n if (\"channel\" in message) {\n const dataMsg = message as WsDataMessage;\n switch (dataMsg.channel) {\n case \"prices\":\n this.emit(\"price\", dataMsg as WsPriceUpdate);\n break;\n case \"trades\":\n this.emit(\"trade\", dataMsg as WsTradeUpdate);\n break;\n case \"orderbook\":\n this.emit(\"orderbook\", dataMsg as WsOrderbookUpdate);\n break;\n }\n }\n }\n } catch (error) {\n console.error(\"[DflowPredictWsClient] Failed to parse message:\", error);\n }\n }\n\n private scheduleReconnect(): void {\n if (this.reconnectTimeout) {\n return;\n }\n\n const delay = Math.min(\n this.reconnectIntervalBase * Math.pow(2, this.reconnectAttempts),\n this.reconnectMaxInterval,\n );\n\n this.setStatus(\"reconnecting\");\n this.emit(\"reconnecting\", { attempt: this.reconnectAttempts + 1, delay });\n\n this.reconnectTimeout = setTimeout(() => {\n this.reconnectTimeout = null;\n this.reconnectAttempts++;\n this.connect();\n }, delay);\n }\n\n private restoreSubscriptions(): void {\n for (const channel of [\"prices\", \"trades\", \"orderbook\"] as WsChannel[]) {\n const subscription = this.subscriptions[channel];\n\n if (subscription.all) {\n this.sendSubscription(\"subscribe\", channel, { all: true });\n } else if (subscription.tickers.size > 0) {\n this.sendSubscription(\"subscribe\", channel, {\n tickers: Array.from(subscription.tickers),\n });\n }\n }\n }\n\n private startPingInterval(): void {\n this.stopPingInterval();\n\n this.pingIntervalId = setInterval(() => {\n this.send({ type: \"ping\" });\n }, this.pingInterval);\n }\n\n private stopPingInterval(): void {\n if (this.pingIntervalId) {\n clearInterval(this.pingIntervalId);\n this.pingIntervalId = null;\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Factory function\n// ---------------------------------------------------------------------------\n\n/**\n * Create a new DflowPredictWsClient instance\n */\nexport function createDflowPredictWsClient(\n config: WsClientConfig,\n): DflowPredictWsClient {\n return new DflowPredictWsClient(config);\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/client/base.ts","../../src/client/dflow.ts","../../src/client/ws.ts","../../src/client/v2/client.ts"],"names":["buildQuery","params","provider","qs","key","value","str","toRecord","BasePredictClient","endpoint","path","query","url","httpGet","data","httpPost","parseSide","raw","sort","levels","priceStr","quantity","a","b","normalizeOrderbook","DflowPredictClient","eventId","withNestedMarkets","ticker","seriesTicker","rest","mintAddress","marketId","request","marketTicker","walletAddress","eventTicker","err","DflowPredictWsClient","config","event","error","options","onUpdate","removeListener","callback","listeners","index","channel","subscription","status","listener","message","type","dataMsg","delay","createDflowPredictWsClient","buildV2Query","PredictClientV2","slug","createPredictClientV2"],"mappings":"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","file":"index.mjs","sourcesContent":["import { httpGet, httpPost } from \"@liberfi.io/utils\";\nimport type { ProviderType } from \"../types\";\n\n/**\n * Build a query string from a params object.\n * Skips `undefined` and `null` values.\n */\nexport function buildQuery(\n params: Record<string, unknown>,\n provider?: ProviderType,\n): string {\n const qs = new URLSearchParams();\n\n // Add provider if specified\n if (provider) {\n qs.set(\"provider\", provider);\n }\n\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined && value !== null) {\n if (typeof value === \"object\") {\n qs.set(key, JSON.stringify(value));\n } else {\n qs.set(key, String(value));\n }\n }\n }\n const str = qs.toString();\n return str ? `?${str}` : \"\";\n}\n\n/** Cast typed params to Record for buildQuery */\nexport function toRecord<T extends object>(params: T): Record<string, unknown> {\n return params as unknown as Record<string, unknown>;\n}\n\n/**\n * Base class for prediction market clients.\n * Provides common HTTP request utilities.\n */\nexport abstract class BasePredictClient {\n constructor(\n protected readonly endpoint: string,\n protected readonly provider: ProviderType,\n ) {}\n\n /**\n * Build URL with query parameters\n */\n protected buildUrl(path: string, params?: Record<string, unknown>): string {\n const query = buildQuery(params ?? {}, this.provider);\n return `${this.endpoint}${path}${query}`;\n }\n\n /**\n * Perform a GET request\n */\n protected async fetch<T>(\n path: string,\n params?: Record<string, unknown>,\n ): Promise<T> {\n const url = this.buildUrl(path, params);\n return await httpGet<T>(url);\n }\n\n /**\n * Perform a POST request\n */\n protected async postRequest<T, P = unknown>(\n path: string,\n data: P,\n params?: Record<string, unknown>,\n ): Promise<T> {\n const url = this.buildUrl(path, params);\n return await httpPost<T, P>(url, data);\n }\n}\n","import type {\n IPredictClient,\n StandardEventsResponse,\n StandardEvent,\n StandardMarketsResponse,\n StandardMarket,\n OrderbookResponse,\n OrderbookLevel,\n MultiTradeResponse,\n MultiOnchainTradeResponse,\n CandlesticksResponse,\n ForecastPercentileHistoryResponse,\n SeriesListResponse,\n SeriesResponse,\n TagsByCategoriesResponse,\n FiltersBySportsResponse,\n SearchResponse,\n OutcomeMintsResponse,\n FilterOutcomeMintsResponse,\n LiveDataResponse,\n QuoteResponse,\n SwapResponse,\n SwapInstructionsResponse,\n OrderResponse,\n OrderStatusResponse,\n IntentQuoteResponse,\n IntentSwapResponse,\n PredictionMarketInitResponse,\n TokenListResponse,\n TokenListWithDecimalsResponse,\n VenueListResponse,\n EventQueryParams,\n MarketQueryParams,\n MarketsBatchRequest,\n TradesQueryParams,\n TradesByMintQueryParams,\n OnchainTradesByWalletQueryParams,\n OnchainTradesByEventQueryParams,\n OnchainTradesByMarketQueryParams,\n CandlesticksQueryParams,\n ForecastPercentileHistoryQueryParams,\n ForecastPercentileHistoryByMintQueryParams,\n SeriesQueryParams,\n SearchQueryParams,\n LiveDataQueryParams,\n LiveDataByEventQueryParams,\n LiveDataByMintQueryParams,\n PositionsByWalletQueryParams,\n WalletPositionsResponse,\n OutcomeMintsQueryParams,\n FilterOutcomeMintsRequest,\n QuoteQueryParams,\n SwapRequestBody,\n OrderQueryParams,\n OrderStatusQueryParams,\n IntentQuoteQueryParams,\n IntentSwapRequestBody,\n PredictionMarketInitQueryParams,\n} from \"../types\";\nimport { BasePredictClient, toRecord } from \"./base\";\n\n// ---------------------------------------------------------------------------\n// DFlow-specific raw orderbook types (internal to this client)\n// ---------------------------------------------------------------------------\n\n/** Raw orderbook side as returned by the DFlow API: price string → quantity */\ntype DflowOrderbookSideRaw = Record<string, number>;\n\n/** Raw orderbook response shape from DFlow API */\ninterface DflowRawOrderbookResponse {\n yes_bids?: DflowOrderbookSideRaw;\n yes_asks?: DflowOrderbookSideRaw;\n no_bids?: DflowOrderbookSideRaw;\n no_asks?: DflowOrderbookSideRaw;\n sequence?: number;\n}\n\n/** Parse a raw orderbook side into sorted OrderbookLevel[] */\nfunction parseSide(\n raw: DflowOrderbookSideRaw | undefined,\n sort: \"asc\" | \"desc\",\n): OrderbookLevel[] {\n if (!raw) return [];\n const levels: OrderbookLevel[] = Object.entries(raw).map(\n ([priceStr, quantity]) => ({\n price: parseFloat(priceStr),\n quantity,\n }),\n );\n levels.sort((a, b) =>\n sort === \"desc\" ? b.price - a.price : a.price - b.price,\n );\n return levels;\n}\n\n/** Normalise DFlow raw orderbook response into public OrderbookResponse */\nfunction normalizeOrderbook(raw: DflowRawOrderbookResponse): OrderbookResponse {\n return {\n yesBids: parseSide(raw.yes_bids, \"desc\"),\n yesAsks: parseSide(raw.yes_asks, \"asc\"),\n noBids: parseSide(raw.no_bids, \"desc\"),\n noAsks: parseSide(raw.no_asks, \"asc\"),\n sequence: raw.sequence,\n };\n}\n\n// ---------------------------------------------------------------------------\n\n/**\n * DFlow Prediction Market Client.\n * Implements IPredictClient interface using the DFlow API.\n */\nexport class DflowPredictClient\n extends BasePredictClient\n implements IPredictClient\n{\n constructor(endpoint: string) {\n super(endpoint, \"dflow\");\n }\n\n // -- Events ----------------------------------------------------------------\n\n async getEvents(params?: EventQueryParams): Promise<StandardEventsResponse> {\n return await this.fetch<StandardEventsResponse>(\n \"/v2/event\",\n toRecord(params ?? {}),\n );\n }\n\n async getEventById(\n eventId: string,\n withNestedMarkets?: boolean,\n ): Promise<StandardEvent> {\n return await this.fetch<StandardEvent>(`/v2/event/${eventId}`, {\n withNestedMarkets,\n });\n }\n\n async getEventCandlesticks(\n ticker: string,\n params: CandlesticksQueryParams,\n ): Promise<CandlesticksResponse> {\n return await this.fetch<CandlesticksResponse>(\n `/v2/event/${ticker}/candlesticks`,\n toRecord(params),\n );\n }\n\n async getEventForecastPercentileHistory(\n params: ForecastPercentileHistoryQueryParams,\n ): Promise<ForecastPercentileHistoryResponse> {\n const { seriesTicker, eventId, ...rest } = params;\n return await this.fetch<ForecastPercentileHistoryResponse>(\n `/v2/event/${seriesTicker}/${eventId}/forecast_percentile_history`,\n toRecord(rest),\n );\n }\n\n async getEventForecastPercentileHistoryByMint(\n params: ForecastPercentileHistoryByMintQueryParams,\n ): Promise<ForecastPercentileHistoryResponse> {\n const { mintAddress, ...rest } = params;\n return await this.fetch<ForecastPercentileHistoryResponse>(\n `/v2/event/by-mint/${mintAddress}/forecast_percentile_history`,\n toRecord(rest),\n );\n }\n\n // -- Markets ---------------------------------------------------------------\n\n async getMarkets(\n params?: MarketQueryParams,\n ): Promise<StandardMarketsResponse> {\n return await this.fetch<StandardMarketsResponse>(\n \"/v2/market\",\n toRecord(params ?? {}),\n );\n }\n\n async getMarketById(marketId: string): Promise<StandardMarket> {\n return await this.fetch<StandardMarket>(`/v2/market/${marketId}`);\n }\n\n async getMarketByMint(mintAddress: string): Promise<StandardMarket> {\n return await this.fetch<StandardMarket>(\n `/v2/market/by-mint/${mintAddress}`,\n );\n }\n\n async getMarketsBatch(\n request: MarketsBatchRequest,\n ): Promise<StandardMarketsResponse> {\n return await this.postRequest<StandardMarketsResponse, MarketsBatchRequest>(\n \"/v2/market/batch\",\n request,\n );\n }\n\n async getMarketCandlesticks(\n ticker: string,\n params: CandlesticksQueryParams,\n ): Promise<CandlesticksResponse> {\n return await this.fetch<CandlesticksResponse>(\n `/v2/market/${ticker}/candlesticks`,\n toRecord(params),\n );\n }\n\n async getMarketCandlesticksByMint(\n mintAddress: string,\n params: CandlesticksQueryParams,\n ): Promise<CandlesticksResponse> {\n return await this.fetch<CandlesticksResponse>(\n `/v2/market/by-mint/${mintAddress}/candlesticks`,\n toRecord(params),\n );\n }\n\n // -- Orderbook -------------------------------------------------------------\n\n async getOrderbook(marketTicker: string): Promise<OrderbookResponse> {\n const raw = await this.fetch<DflowRawOrderbookResponse>(\n `/v2/orderbook/${marketTicker}`,\n );\n return normalizeOrderbook(raw);\n }\n\n async getOrderbookByMint(mintAddress: string): Promise<OrderbookResponse> {\n const raw = await this.fetch<DflowRawOrderbookResponse>(\n `/v2/orderbook/by-mint/${mintAddress}`,\n );\n return normalizeOrderbook(raw);\n }\n\n // -- Trades ----------------------------------------------------------------\n\n async getTrades(params?: TradesQueryParams): Promise<MultiTradeResponse> {\n return await this.fetch<MultiTradeResponse>(\n \"/v2/trades\",\n toRecord(params ?? {}),\n );\n }\n\n async getTradesByMint(\n params: TradesByMintQueryParams,\n ): Promise<MultiTradeResponse> {\n const { mintAddress, ...rest } = params;\n return await this.fetch<MultiTradeResponse>(\n `/v2/trades/by-mint/${mintAddress}`,\n toRecord(rest),\n );\n }\n\n // -- On-Chain Trades -------------------------------------------------------\n\n async getOnchainTradesByWallet(\n params: OnchainTradesByWalletQueryParams,\n ): Promise<MultiOnchainTradeResponse> {\n const { walletAddress, ...rest } = params;\n return await this.fetch<MultiOnchainTradeResponse>(\n `/v2/trades/onchain/by-wallet/${walletAddress}`,\n toRecord(rest),\n );\n }\n\n async getOnchainTradesByEvent(\n params: OnchainTradesByEventQueryParams,\n ): Promise<MultiOnchainTradeResponse> {\n const { eventTicker, ...rest } = params;\n return await this.fetch<MultiOnchainTradeResponse>(\n `/v2/trades/onchain/by-event/${eventTicker}`,\n toRecord(rest),\n );\n }\n\n async getOnchainTradesByMarket(\n params: OnchainTradesByMarketQueryParams,\n ): Promise<MultiOnchainTradeResponse> {\n const { marketTicker, ...rest } = params;\n return await this.fetch<MultiOnchainTradeResponse>(\n `/v2/trades/onchain/by-market/${marketTicker}`,\n toRecord(rest),\n );\n }\n\n // -- Live Data -------------------------------------------------------------\n\n async getLiveData(params: LiveDataQueryParams): Promise<LiveDataResponse> {\n return await this.fetch<LiveDataResponse>(\"/v2/live\", {\n milestoneIds: params.milestoneIds.join(\",\"),\n });\n }\n\n async getLiveDataByEvent(\n params: LiveDataByEventQueryParams,\n ): Promise<LiveDataResponse> {\n const { eventTicker, ...rest } = params;\n return await this.fetch<LiveDataResponse>(\n `/v2/live/event/${eventTicker}`,\n toRecord(rest),\n );\n }\n\n async getLiveDataByMint(\n params: LiveDataByMintQueryParams,\n ): Promise<LiveDataResponse> {\n const { mintAddress, ...rest } = params;\n return await this.fetch<LiveDataResponse>(\n `/v2/live/by-mint/${mintAddress}`,\n toRecord(rest),\n );\n }\n\n // -- Series ----------------------------------------------------------------\n\n async getSeries(params?: SeriesQueryParams): Promise<SeriesListResponse> {\n return await this.fetch<SeriesListResponse>(\n \"/v2/series\",\n toRecord(params ?? {}),\n );\n }\n\n async getSeriesByTicker(seriesTicker: string): Promise<SeriesResponse> {\n return await this.fetch<SeriesResponse>(`/v2/series/${seriesTicker}`);\n }\n\n // -- Tags & Sports ---------------------------------------------------------\n\n async getTagsByCategories(): Promise<TagsByCategoriesResponse> {\n return await this.fetch<TagsByCategoriesResponse>(\"/v2/tags/by_categories\");\n }\n\n async getFiltersBySports(): Promise<FiltersBySportsResponse> {\n return await this.fetch<FiltersBySportsResponse>(\"/v2/sports/filters\");\n }\n\n // -- Search ----------------------------------------------------------------\n\n async search(params: SearchQueryParams): Promise<SearchResponse> {\n return await this.fetch<SearchResponse>(\"/v2/search\", toRecord(params));\n }\n\n // -- Positions -------------------------------------------------------------\n\n async getPositionsByWallet(\n params: PositionsByWalletQueryParams,\n ): Promise<WalletPositionsResponse> {\n const { walletAddress } = params;\n return await this.fetch<WalletPositionsResponse>(\n `/v2/positions/by-wallet/${walletAddress}`,\n );\n }\n\n // -- Outcome Mints ---------------------------------------------------------\n\n async getOutcomeMints(\n params?: OutcomeMintsQueryParams,\n ): Promise<OutcomeMintsResponse> {\n return await this.fetch<OutcomeMintsResponse>(\n \"/v2/outcome_mints\",\n toRecord(params ?? {}),\n );\n }\n\n async filterOutcomeMints(\n request: FilterOutcomeMintsRequest,\n ): Promise<FilterOutcomeMintsResponse> {\n return await this.postRequest<\n FilterOutcomeMintsResponse,\n FilterOutcomeMintsRequest\n >(\"/v2/filter_outcome_mints\", request);\n }\n\n // -- Quote & Swap (Imperative) ---------------------------------------------\n\n async getQuote(params: QuoteQueryParams): Promise<QuoteResponse> {\n return await this.fetch<QuoteResponse>(\"/v2/swap/quote\", toRecord(params));\n }\n\n async createSwap(request: SwapRequestBody): Promise<SwapResponse> {\n return await this.postRequest<SwapResponse, SwapRequestBody>(\n \"/v2/swap\",\n request,\n );\n }\n\n async createSwapInstructions(\n request: SwapRequestBody,\n ): Promise<SwapInstructionsResponse> {\n return await this.postRequest<SwapInstructionsResponse, SwapRequestBody>(\n \"/v2/swap/instructions\",\n request,\n );\n }\n\n // -- Order API -------------------------------------------------------------\n\n async getOrder(params: OrderQueryParams): Promise<OrderResponse> {\n return await this.fetch<OrderResponse>(\"/v2/order\", toRecord(params));\n }\n\n async getOrderStatus(\n params: OrderStatusQueryParams,\n ): Promise<OrderStatusResponse> {\n try {\n return await this.fetch<OrderStatusResponse>(\n \"/v2/order/status\",\n toRecord(params),\n );\n } catch (err: unknown) {\n // 404 means the order hasn't been indexed yet — return pending so polling continues\n const is404 = err instanceof Error && /\\b404\\b/.test(err.message);\n if (is404) {\n return { status: \"pending\", inAmount: \"0\", outAmount: \"0\" };\n }\n throw err;\n }\n }\n\n // -- Intent (Declarative Swap) ---------------------------------------------\n\n async getIntentQuote(\n params: IntentQuoteQueryParams,\n ): Promise<IntentQuoteResponse> {\n return await this.fetch<IntentQuoteResponse>(\n \"/v2/intent/quote\",\n toRecord(params),\n );\n }\n\n async submitIntentSwap(\n request: IntentSwapRequestBody,\n ): Promise<IntentSwapResponse> {\n return await this.postRequest<IntentSwapResponse, IntentSwapRequestBody>(\n \"/v2/intent/swap\",\n request,\n );\n }\n\n // -- Prediction Market Init ------------------------------------------------\n\n async initPredictionMarket(\n params: PredictionMarketInitQueryParams,\n ): Promise<PredictionMarketInitResponse> {\n return await this.fetch<PredictionMarketInitResponse>(\n \"/v2/prediction-market/init\",\n toRecord(params),\n );\n }\n\n // -- Token & Venue ---------------------------------------------------------\n\n async getTokens(): Promise<TokenListResponse> {\n return await this.fetch<TokenListResponse>(\"/v2/tokens\");\n }\n\n async getTokensWithDecimals(): Promise<TokenListWithDecimalsResponse> {\n return await this.fetch<TokenListWithDecimalsResponse>(\n \"/v2/tokens/decimals\",\n );\n }\n\n async getVenues(): Promise<VenueListResponse> {\n return await this.fetch<VenueListResponse>(\"/v2/venues\");\n }\n}\n","/**\n * DflowPredictWsClient - WebSocket client for real-time prediction market data\n *\n * Features:\n * - Auto-reconnect with exponential backoff\n * - Heartbeat (ping/pong) for connection health\n * - Subscription management for prices, trades, orderbook channels\n * - Event emitter pattern for message handling\n */\nimport type {\n WsConnectionStatus,\n WsSubscribeOptions,\n WsPriceUpdate,\n WsTradeUpdate,\n WsOrderbookUpdate,\n IPredictWsClient,\n} from \"../types\";\n\n// ---------------------------------------------------------------------------\n// Internal WebSocket Protocol Types\n// ---------------------------------------------------------------------------\n\n/** WebSocket channel types */\ntype WsChannel = \"prices\" | \"trades\" | \"orderbook\";\n\n/** Subscribe/Unsubscribe message */\ninterface WsSubscribeMessage {\n type: \"subscribe\" | \"unsubscribe\";\n channel: WsChannel;\n all?: boolean;\n tickers?: string[];\n}\n\n/** Ping message */\ninterface WsPingMessage {\n type: \"ping\";\n}\n\n/** Pong response */\ninterface WsPongMessage {\n type: \"pong\";\n timestamp: number;\n}\n\n/** Status request message */\ninterface WsStatusRequestMessage {\n type: \"status\";\n}\n\n/** Status response message */\ninterface WsStatusMessage {\n type: \"status\";\n status: WsConnectionStatus;\n message?: string;\n connected?: boolean;\n clientCount?: number;\n subscriptions?: {\n prices: { all: boolean; tickers: string[] };\n trades: { all: boolean; tickers: string[] };\n orderbook: { all: boolean; tickers: string[] };\n };\n}\n\n/** Subscription confirmation message */\ninterface WsSubscriptionConfirmation {\n type: \"subscribed\" | \"unsubscribed\";\n channel: WsChannel;\n all?: boolean;\n tickers?: string[];\n success: boolean;\n}\n\n/** Error message from server */\ninterface WsErrorMessage {\n type: \"error\";\n message: string;\n code?: string;\n}\n\n/** Union type for all data messages from server */\ntype WsDataMessage = WsPriceUpdate | WsTradeUpdate | WsOrderbookUpdate;\n\n/** Union type for all server messages */\ntype WsServerMessage =\n | WsDataMessage\n | WsStatusMessage\n | WsSubscriptionConfirmation\n | WsErrorMessage\n | WsPongMessage;\n\n/** Union type for all client messages */\ntype WsClientMessage =\n | WsSubscribeMessage\n | WsPingMessage\n | WsStatusRequestMessage;\n\n/** WebSocket event types for event emitter */\ntype WsEventType =\n | \"connect\"\n | \"disconnect\"\n | \"reconnecting\"\n | \"error\"\n | \"price\"\n | \"trade\"\n | \"orderbook\"\n | \"status\"\n | \"subscribed\"\n | \"unsubscribed\";\n\n/** WebSocket client configuration */\nexport interface WsClientConfig {\n /** WebSocket endpoint URL */\n wsUrl: string;\n /** Auto-connect on instantiation */\n autoConnect?: boolean;\n /** Auto-reconnect on disconnect */\n autoReconnect?: boolean;\n /** Reconnect interval base in ms (default: 1000) */\n reconnectIntervalBase?: number;\n /** Max reconnect interval in ms (default: 30000) */\n reconnectMaxInterval?: number;\n /** Ping interval in ms (default: 30000) */\n pingInterval?: number;\n}\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_RECONNECT_INTERVAL_BASE = 1000; // 1 second\nconst DEFAULT_RECONNECT_MAX_INTERVAL = 30000; // 30 seconds\nconst DEFAULT_PING_INTERVAL = 30000; // 30 seconds\n\n// ---------------------------------------------------------------------------\n// Event Emitter Types\n// ---------------------------------------------------------------------------\n\ntype EventCallback<T = unknown> = (data: T) => void;\n\ninterface EventListeners {\n connect: EventCallback<void>[];\n disconnect: EventCallback<{ code?: number; reason?: string }>[];\n reconnecting: EventCallback<{ attempt: number; delay: number }>[];\n error: EventCallback<Error>[];\n price: EventCallback<WsPriceUpdate>[];\n trade: EventCallback<WsTradeUpdate>[];\n orderbook: EventCallback<WsOrderbookUpdate>[];\n status: EventCallback<WsConnectionStatus>[];\n subscribed: EventCallback<{\n channel: WsChannel;\n all?: boolean;\n tickers?: string[];\n }>[];\n unsubscribed: EventCallback<{\n channel: WsChannel;\n all?: boolean;\n tickers?: string[];\n }>[];\n}\n\n// ---------------------------------------------------------------------------\n// Subscription State\n// ---------------------------------------------------------------------------\n\ninterface ChannelSubscription {\n all: boolean;\n tickers: Set<string>;\n}\n\ninterface SubscriptionState {\n prices: ChannelSubscription;\n trades: ChannelSubscription;\n orderbook: ChannelSubscription;\n}\n\n// ---------------------------------------------------------------------------\n// DflowPredictWsClient Class\n// ---------------------------------------------------------------------------\n\nexport class DflowPredictWsClient implements IPredictWsClient {\n private ws: WebSocket | null = null;\n private readonly wsUrl: string;\n private readonly autoReconnect: boolean;\n private readonly reconnectIntervalBase: number;\n private readonly reconnectMaxInterval: number;\n private readonly pingInterval: number;\n\n private status: WsConnectionStatus = \"disconnected\";\n private reconnectAttempts = 0;\n private reconnectTimeout: ReturnType<typeof setTimeout> | null = null;\n private pingIntervalId: ReturnType<typeof setInterval> | null = null;\n private shouldReconnect = true;\n\n // Event listeners\n private listeners: EventListeners = {\n connect: [],\n disconnect: [],\n reconnecting: [],\n error: [],\n price: [],\n trade: [],\n orderbook: [],\n status: [],\n subscribed: [],\n unsubscribed: [],\n };\n\n // Track current subscriptions for reconnection recovery\n private subscriptions: SubscriptionState = {\n prices: { all: false, tickers: new Set() },\n trades: { all: false, tickers: new Set() },\n orderbook: { all: false, tickers: new Set() },\n };\n\n constructor(config: WsClientConfig) {\n this.wsUrl = config.wsUrl;\n this.autoReconnect = config.autoReconnect ?? true;\n this.reconnectIntervalBase =\n config.reconnectIntervalBase ?? DEFAULT_RECONNECT_INTERVAL_BASE;\n this.reconnectMaxInterval =\n config.reconnectMaxInterval ?? DEFAULT_RECONNECT_MAX_INTERVAL;\n this.pingInterval = config.pingInterval ?? DEFAULT_PING_INTERVAL;\n\n if (config.autoConnect !== false) {\n this.connect();\n }\n }\n\n // ---------------------------------------------------------------------------\n // Connection Management\n // ---------------------------------------------------------------------------\n\n /**\n * Connect to the WebSocket server\n */\n connect(): void {\n if (\n this.ws &&\n (this.ws.readyState === WebSocket.OPEN ||\n this.ws.readyState === WebSocket.CONNECTING)\n ) {\n return;\n }\n\n this.shouldReconnect = true;\n this.setStatus(\"connecting\");\n\n try {\n this.ws = new WebSocket(this.wsUrl);\n\n this.ws.onopen = () => {\n this.reconnectAttempts = 0;\n this.setStatus(\"connected\");\n this.emit(\"connect\", undefined);\n\n // Restore subscriptions after reconnection\n this.restoreSubscriptions();\n\n // Start ping interval\n this.startPingInterval();\n };\n\n this.ws.onmessage = (event) => {\n this.handleMessage(event.data);\n };\n\n this.ws.onerror = (event) => {\n const error = new Error(\"WebSocket error\");\n console.error(\"[DflowPredictWsClient] WebSocket error:\", event);\n this.emit(\"error\", error);\n };\n\n this.ws.onclose = (event) => {\n this.stopPingInterval();\n this.setStatus(\"disconnected\");\n this.emit(\"disconnect\", { code: event.code, reason: event.reason });\n\n // Attempt reconnection\n if (this.shouldReconnect && this.autoReconnect) {\n this.scheduleReconnect();\n }\n };\n } catch (error) {\n console.error(\n \"[DflowPredictWsClient] Failed to create WebSocket:\",\n error,\n );\n this.emit(\n \"error\",\n error instanceof Error ? error : new Error(String(error)),\n );\n\n if (this.shouldReconnect && this.autoReconnect) {\n this.scheduleReconnect();\n }\n }\n }\n\n /**\n * Disconnect from the WebSocket server\n */\n disconnect(): void {\n this.shouldReconnect = false;\n this.stopPingInterval();\n\n if (this.reconnectTimeout) {\n clearTimeout(this.reconnectTimeout);\n this.reconnectTimeout = null;\n }\n\n if (this.ws) {\n this.ws.close();\n this.ws = null;\n }\n\n this.setStatus(\"disconnected\");\n }\n\n /**\n * Check if connected to the server\n */\n isConnected(): boolean {\n return this.ws !== null && this.ws.readyState === WebSocket.OPEN;\n }\n\n /**\n * Get current connection status\n */\n getStatus(): WsConnectionStatus {\n return this.status;\n }\n\n // ---------------------------------------------------------------------------\n // Business Subscription Methods (IPredictWsClient interface)\n // ---------------------------------------------------------------------------\n\n /** Subscribe to price updates, returns unsubscribe function */\n subscribePrices(\n options: WsSubscribeOptions,\n onUpdate: (update: WsPriceUpdate) => void,\n ): () => void {\n this.subscribeChannel(\"prices\", options);\n const removeListener = this.on(\"price\", onUpdate);\n return () => {\n removeListener();\n this.unsubscribeChannel(\"prices\", options);\n };\n }\n\n /** Subscribe to trade updates, returns unsubscribe function */\n subscribeTrades(\n options: WsSubscribeOptions,\n onUpdate: (update: WsTradeUpdate) => void,\n ): () => void {\n this.subscribeChannel(\"trades\", options);\n const removeListener = this.on(\"trade\", onUpdate);\n return () => {\n removeListener();\n this.unsubscribeChannel(\"trades\", options);\n };\n }\n\n /** Subscribe to orderbook updates, returns unsubscribe function */\n subscribeOrderbook(\n options: WsSubscribeOptions,\n onUpdate: (update: WsOrderbookUpdate) => void,\n ): () => void {\n this.subscribeChannel(\"orderbook\", options);\n const removeListener = this.on(\"orderbook\", onUpdate);\n return () => {\n removeListener();\n this.unsubscribeChannel(\"orderbook\", options);\n };\n }\n\n /** Subscribe to status changes, returns unsubscribe function */\n onStatusChange(callback: (status: WsConnectionStatus) => void): () => void {\n return this.on(\"status\", callback);\n }\n\n // ---------------------------------------------------------------------------\n // Event Emitter\n // ---------------------------------------------------------------------------\n\n /**\n * Add event listener\n */\n on<T extends WsEventType>(\n event: T,\n callback: EventListeners[T][number],\n ): () => void {\n const listeners = this.listeners[event] as EventCallback<unknown>[];\n listeners.push(callback as EventCallback<unknown>);\n\n // Return unsubscribe function\n return () => {\n this.off(event, callback);\n };\n }\n\n /**\n * Remove event listener\n */\n off<T extends WsEventType>(\n event: T,\n callback: EventListeners[T][number],\n ): void {\n const listeners = this.listeners[event] as EventCallback<unknown>[];\n const index = listeners.indexOf(callback as EventCallback<unknown>);\n if (index !== -1) {\n listeners.splice(index, 1);\n }\n }\n\n /**\n * Remove all listeners for an event (or all events)\n */\n removeAllListeners(event?: WsEventType): void {\n if (event) {\n (this.listeners[event] as unknown[]).length = 0;\n } else {\n for (const key of Object.keys(this.listeners)) {\n (this.listeners[key as WsEventType] as unknown[]).length = 0;\n }\n }\n }\n\n // ---------------------------------------------------------------------------\n // Private Methods\n // ---------------------------------------------------------------------------\n\n private subscribeChannel(\n channel: WsChannel,\n options: WsSubscribeOptions,\n ): void {\n const subscription = this.subscriptions[channel];\n\n if (options.all) {\n subscription.all = true;\n subscription.tickers.clear();\n } else if (options.tickers && options.tickers.length > 0) {\n subscription.all = false;\n for (const ticker of options.tickers) {\n subscription.tickers.add(ticker);\n }\n }\n\n this.sendSubscription(\"subscribe\", channel, options);\n }\n\n private unsubscribeChannel(\n channel: WsChannel,\n options: WsSubscribeOptions,\n ): void {\n const subscription = this.subscriptions[channel];\n\n if (options.all) {\n subscription.all = false;\n subscription.tickers.clear();\n } else if (options.tickers && options.tickers.length > 0) {\n for (const ticker of options.tickers) {\n subscription.tickers.delete(ticker);\n }\n }\n\n this.sendSubscription(\"unsubscribe\", channel, options);\n }\n\n private setStatus(status: WsConnectionStatus): void {\n if (this.status !== status) {\n this.status = status;\n this.emit(\"status\", status);\n }\n }\n\n private emit<T extends WsEventType>(\n event: T,\n data: Parameters<EventListeners[T][number]>[0],\n ): void {\n const listeners = this.listeners[event] as EventCallback<typeof data>[];\n for (const listener of listeners) {\n try {\n listener(data);\n } catch (error) {\n console.error(\n `[DflowPredictWsClient] Error in ${event} listener:`,\n error,\n );\n }\n }\n }\n\n private send(message: WsClientMessage): boolean {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n console.warn(\n \"[DflowPredictWsClient] Cannot send message, WebSocket not connected\",\n );\n return false;\n }\n\n try {\n this.ws.send(JSON.stringify(message));\n return true;\n } catch (error) {\n console.error(\"[DflowPredictWsClient] Failed to send message:\", error);\n return false;\n }\n }\n\n private sendSubscription(\n type: \"subscribe\" | \"unsubscribe\",\n channel: WsChannel,\n options: WsSubscribeOptions,\n ): void {\n this.send({\n type,\n channel,\n all: options.all,\n tickers: options.tickers,\n });\n }\n\n private handleMessage(data: string): void {\n try {\n const message = JSON.parse(data) as WsServerMessage;\n\n switch (message.type) {\n case \"ticker\":\n this.emit(\"price\", message as WsPriceUpdate);\n break;\n case \"trade\":\n this.emit(\"trade\", message as WsTradeUpdate);\n break;\n case \"orderbook\":\n this.emit(\"orderbook\", message as WsOrderbookUpdate);\n break;\n case \"status\":\n // Status message from server (different from connection status)\n break;\n case \"subscribed\":\n this.emit(\"subscribed\", {\n channel: message.channel,\n all: message.all,\n tickers: message.tickers,\n });\n break;\n case \"unsubscribed\":\n this.emit(\"unsubscribed\", {\n channel: message.channel,\n all: message.all,\n tickers: message.tickers,\n });\n break;\n case \"pong\":\n // Pong received, connection is alive\n break;\n case \"error\":\n console.error(\n \"[DflowPredictWsClient] Server error:\",\n message.message,\n );\n this.emit(\"error\", new Error(message.message));\n break;\n default:\n // Handle data messages without explicit type\n if (\"channel\" in message) {\n const dataMsg = message as WsDataMessage;\n switch (dataMsg.channel) {\n case \"prices\":\n this.emit(\"price\", dataMsg as WsPriceUpdate);\n break;\n case \"trades\":\n this.emit(\"trade\", dataMsg as WsTradeUpdate);\n break;\n case \"orderbook\":\n this.emit(\"orderbook\", dataMsg as WsOrderbookUpdate);\n break;\n }\n }\n }\n } catch (error) {\n console.error(\"[DflowPredictWsClient] Failed to parse message:\", error);\n }\n }\n\n private scheduleReconnect(): void {\n if (this.reconnectTimeout) {\n return;\n }\n\n const delay = Math.min(\n this.reconnectIntervalBase * Math.pow(2, this.reconnectAttempts),\n this.reconnectMaxInterval,\n );\n\n this.setStatus(\"reconnecting\");\n this.emit(\"reconnecting\", { attempt: this.reconnectAttempts + 1, delay });\n\n this.reconnectTimeout = setTimeout(() => {\n this.reconnectTimeout = null;\n this.reconnectAttempts++;\n this.connect();\n }, delay);\n }\n\n private restoreSubscriptions(): void {\n for (const channel of [\"prices\", \"trades\", \"orderbook\"] as WsChannel[]) {\n const subscription = this.subscriptions[channel];\n\n if (subscription.all) {\n this.sendSubscription(\"subscribe\", channel, { all: true });\n } else if (subscription.tickers.size > 0) {\n this.sendSubscription(\"subscribe\", channel, {\n tickers: Array.from(subscription.tickers),\n });\n }\n }\n }\n\n private startPingInterval(): void {\n this.stopPingInterval();\n\n this.pingIntervalId = setInterval(() => {\n this.send({ type: \"ping\" });\n }, this.pingInterval);\n }\n\n private stopPingInterval(): void {\n if (this.pingIntervalId) {\n clearInterval(this.pingIntervalId);\n this.pingIntervalId = null;\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Factory function\n// ---------------------------------------------------------------------------\n\n/**\n * Create a new DflowPredictWsClient instance\n */\nexport function createDflowPredictWsClient(\n config: WsClientConfig,\n): DflowPredictWsClient {\n return new DflowPredictWsClient(config);\n}\n","import { httpGet } from \"@liberfi.io/utils\";\nimport type { V2Event, V2ListEventsParams, V2Page } from \"./types\";\n\n/**\n * Build a URL query string from a params object.\n * `undefined` and `null` values are omitted.\n * Boolean values are serialised as \"true\" / \"false\" strings.\n */\nfunction buildV2Query(params: Record<string, unknown>): string {\n const qs = new URLSearchParams();\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined && value !== null) {\n qs.set(key, String(value));\n }\n }\n const str = qs.toString();\n return str ? `?${str}` : \"\";\n}\n\n/**\n * HTTP client for the prediction-server REST API (v2 / prediction-server backend).\n *\n * Covers `GET /api/v1/events` (listEvents) and `GET /api/v1/events/:slug` (getEvent).\n *\n * This client is intentionally decoupled from the legacy `DflowPredictClient` so\n * that both can be used in parallel during the incremental migration from the old\n * DFlow-direct integration to the unified prediction-server backend.\n *\n * @example\n * ```ts\n * const client = new PredictClientV2(\"https://api.example.com\");\n * const page = await client.listEvents({ status: \"open\", limit: 20 });\n * const event = await client.getEvent(\"will-trump-win-2024\");\n * ```\n */\nexport class PredictClientV2 {\n constructor(private readonly endpoint: string) {}\n\n /**\n * List prediction events with optional filtering, sorting, and pagination.\n *\n * Maps to `GET /api/v1/events`.\n *\n * @param params - Optional query parameters (filter, sort, pagination).\n * @returns A paginated page of events.\n */\n async listEvents(params?: V2ListEventsParams): Promise<V2Page<V2Event>> {\n const query = buildV2Query((params ?? {}) as Record<string, unknown>);\n const url = `${this.endpoint}/api/v1/events${query}`;\n return await httpGet<V2Page<V2Event>>(url);\n }\n\n /**\n * Fetch a single prediction event by its slug.\n *\n * Maps to `GET /api/v1/events/:slug`.\n *\n * @param slug - Canonical event slug (e.g. \"will-trump-win-2024\" for Polymarket\n * or \"KXBTCD-25FEB-T68000\" for DFlow).\n * @returns The matching event.\n * @throws When the server responds with 404 or any other non-2xx status.\n */\n async getEvent(slug: string): Promise<V2Event> {\n const url = `${this.endpoint}/api/v1/events/${encodeURIComponent(slug)}`;\n return await httpGet<V2Event>(url);\n }\n}\n\n/**\n * Factory function for `PredictClientV2`.\n *\n * @param endpoint - Base URL of the prediction-server, without a trailing slash.\n */\nexport function createPredictClientV2(endpoint: string): PredictClientV2 {\n return new PredictClientV2(endpoint);\n}\n"]}
|
|
@@ -1214,6 +1214,192 @@ interface IPredictWsClient {
|
|
|
1214
1214
|
subscribeOrderbook(options: WsSubscribeOptions, onUpdate: (update: WsOrderbookUpdate) => void): () => void;
|
|
1215
1215
|
}
|
|
1216
1216
|
|
|
1217
|
+
/**
|
|
1218
|
+
* V2 types for the prediction-server REST API (/api/v1/events).
|
|
1219
|
+
*
|
|
1220
|
+
* These types are intentionally isolated from the legacy client types so that
|
|
1221
|
+
* the v1 (DFlow) and v2 (prediction-server) clients can coexist and be migrated
|
|
1222
|
+
* incrementally.
|
|
1223
|
+
*
|
|
1224
|
+
* Mirrors: github.com/liberfi-io/prediction-server/internal/domain
|
|
1225
|
+
*/
|
|
1226
|
+
/** Upstream data provider that produced a domain object. */
|
|
1227
|
+
type V2ProviderSource = "dflow" | "polymarket";
|
|
1228
|
+
/**
|
|
1229
|
+
* Provider-specific metadata attached to every domain aggregate.
|
|
1230
|
+
* Keys are namespaced field paths, e.g. "polymarket.conditionId" or "dflow.yesMint".
|
|
1231
|
+
* Values are raw JSON-decoded values.
|
|
1232
|
+
*/
|
|
1233
|
+
type V2ProviderMeta = Record<string, unknown>;
|
|
1234
|
+
/** Provider-sourced label attached to an Event. */
|
|
1235
|
+
interface V2Tag {
|
|
1236
|
+
slug: string;
|
|
1237
|
+
label: string;
|
|
1238
|
+
source: V2ProviderSource;
|
|
1239
|
+
provider_meta?: V2ProviderMeta;
|
|
1240
|
+
}
|
|
1241
|
+
/** Lifecycle status of a prediction event (normalised across all providers). */
|
|
1242
|
+
type V2EventStatus = "pending" | "open" | "closed" | "voided";
|
|
1243
|
+
/** Settlement / resolution data source for an event. */
|
|
1244
|
+
interface V2SettlementSource {
|
|
1245
|
+
url: string;
|
|
1246
|
+
name?: string;
|
|
1247
|
+
}
|
|
1248
|
+
/** Root aggregate for a prediction event from the prediction-server API. */
|
|
1249
|
+
interface V2Event {
|
|
1250
|
+
/** Internal database surrogate key (absent when not yet persisted). */
|
|
1251
|
+
id?: number;
|
|
1252
|
+
/**
|
|
1253
|
+
* Canonical business key shared across all providers.
|
|
1254
|
+
* - DFlow: ticker (e.g. "KXBTCD-25FEB-T68000")
|
|
1255
|
+
* - Polymarket: slug (e.g. "will-trump-win-2024")
|
|
1256
|
+
*/
|
|
1257
|
+
slug: string;
|
|
1258
|
+
title: string;
|
|
1259
|
+
subtitle?: string;
|
|
1260
|
+
description?: string;
|
|
1261
|
+
image_url?: string;
|
|
1262
|
+
status: V2EventStatus;
|
|
1263
|
+
/** ISO 8601 timestamp; absent if the provider does not supply it. */
|
|
1264
|
+
start_at?: string;
|
|
1265
|
+
end_at?: string;
|
|
1266
|
+
created_at?: string;
|
|
1267
|
+
updated_at?: string;
|
|
1268
|
+
/** Provider-sourced labels for display only. */
|
|
1269
|
+
tags?: V2Tag[];
|
|
1270
|
+
/** All values are USD amounts. */
|
|
1271
|
+
volume?: number;
|
|
1272
|
+
volume_24h?: number;
|
|
1273
|
+
liquidity?: number;
|
|
1274
|
+
open_interest?: number;
|
|
1275
|
+
settlement_sources?: V2SettlementSource[];
|
|
1276
|
+
/** Nested markets; omitted when the request used `with_markets=false`. */
|
|
1277
|
+
markets?: V2Market[];
|
|
1278
|
+
source: V2ProviderSource;
|
|
1279
|
+
provider_meta?: V2ProviderMeta;
|
|
1280
|
+
}
|
|
1281
|
+
/** Lifecycle status of a prediction market (normalised across all providers). */
|
|
1282
|
+
type V2MarketStatus = "pending" | "open" | "closed" | "voided";
|
|
1283
|
+
/** Final resolution of a closed market. Empty string means unresolved. */
|
|
1284
|
+
type V2MarketResult = "yes" | "no" | "voided" | "";
|
|
1285
|
+
/** One possible outcome in a binary (or multi-outcome) prediction market. */
|
|
1286
|
+
interface V2Outcome {
|
|
1287
|
+
/** Display name, e.g. "Yes" or "No". */
|
|
1288
|
+
label: string;
|
|
1289
|
+
/** Current implied probability [0, 1]. */
|
|
1290
|
+
price?: number;
|
|
1291
|
+
best_bid?: number;
|
|
1292
|
+
best_ask?: number;
|
|
1293
|
+
}
|
|
1294
|
+
/** Tradeable prediction outcome within an Event. */
|
|
1295
|
+
interface V2Market {
|
|
1296
|
+
id?: number;
|
|
1297
|
+
event_id?: number;
|
|
1298
|
+
slug: string;
|
|
1299
|
+
event_slug: string;
|
|
1300
|
+
question: string;
|
|
1301
|
+
description?: string;
|
|
1302
|
+
/** Resolution/settlement rules in order. */
|
|
1303
|
+
rules?: string[];
|
|
1304
|
+
status: V2MarketStatus;
|
|
1305
|
+
result?: V2MarketResult;
|
|
1306
|
+
start_at?: string;
|
|
1307
|
+
end_at?: string;
|
|
1308
|
+
expires_at?: string;
|
|
1309
|
+
created_at?: string;
|
|
1310
|
+
updated_at?: string;
|
|
1311
|
+
/** Always present; binary markets have exactly 2 outcomes (YES at [0], NO at [1]). */
|
|
1312
|
+
outcomes: V2Outcome[];
|
|
1313
|
+
volume?: number;
|
|
1314
|
+
volume_24h?: number;
|
|
1315
|
+
liquidity?: number;
|
|
1316
|
+
open_interest?: number;
|
|
1317
|
+
source: V2ProviderSource;
|
|
1318
|
+
provider_meta?: V2ProviderMeta;
|
|
1319
|
+
}
|
|
1320
|
+
/** Generic paginated result set returned by the prediction-server list endpoints. */
|
|
1321
|
+
interface V2Page<T> {
|
|
1322
|
+
items: T[];
|
|
1323
|
+
next_cursor?: string;
|
|
1324
|
+
has_more?: boolean;
|
|
1325
|
+
limit?: number;
|
|
1326
|
+
/** Not all backends support total count. */
|
|
1327
|
+
total?: number;
|
|
1328
|
+
}
|
|
1329
|
+
/** Valid sort fields accepted by `GET /api/v1/events`. */
|
|
1330
|
+
type V2EventSortField = "volume" | "volume_24h" | "liquidity" | "open_interest" | "end_at" | "start_at" | "created_at";
|
|
1331
|
+
/** Query parameters for `listEvents`. All fields are optional. */
|
|
1332
|
+
interface V2ListEventsParams {
|
|
1333
|
+
/** Page size. Server default: 20. */
|
|
1334
|
+
limit?: number;
|
|
1335
|
+
/** Opaque pagination cursor returned by the previous page's `next_cursor`. */
|
|
1336
|
+
cursor?: string;
|
|
1337
|
+
/** Filter by event lifecycle status. */
|
|
1338
|
+
status?: V2EventStatus;
|
|
1339
|
+
/** Filter by upstream provider. */
|
|
1340
|
+
source?: V2ProviderSource;
|
|
1341
|
+
/** Unified navigation tag slug (e.g. "politics", "sports"). */
|
|
1342
|
+
tag_slug?: string;
|
|
1343
|
+
/** Full-text search query. */
|
|
1344
|
+
search?: string;
|
|
1345
|
+
/** Field to sort by. */
|
|
1346
|
+
sort_by?: V2EventSortField;
|
|
1347
|
+
/** When `true`, sort ascending. Defaults to descending. */
|
|
1348
|
+
sort_asc?: boolean;
|
|
1349
|
+
/**
|
|
1350
|
+
* When `false`, markets are omitted from each event for lighter payloads.
|
|
1351
|
+
* Defaults to `true` on the server.
|
|
1352
|
+
*/
|
|
1353
|
+
with_markets?: boolean;
|
|
1354
|
+
}
|
|
1355
|
+
|
|
1356
|
+
/**
|
|
1357
|
+
* HTTP client for the prediction-server REST API (v2 / prediction-server backend).
|
|
1358
|
+
*
|
|
1359
|
+
* Covers `GET /api/v1/events` (listEvents) and `GET /api/v1/events/:slug` (getEvent).
|
|
1360
|
+
*
|
|
1361
|
+
* This client is intentionally decoupled from the legacy `DflowPredictClient` so
|
|
1362
|
+
* that both can be used in parallel during the incremental migration from the old
|
|
1363
|
+
* DFlow-direct integration to the unified prediction-server backend.
|
|
1364
|
+
*
|
|
1365
|
+
* @example
|
|
1366
|
+
* ```ts
|
|
1367
|
+
* const client = new PredictClientV2("https://api.example.com");
|
|
1368
|
+
* const page = await client.listEvents({ status: "open", limit: 20 });
|
|
1369
|
+
* const event = await client.getEvent("will-trump-win-2024");
|
|
1370
|
+
* ```
|
|
1371
|
+
*/
|
|
1372
|
+
declare class PredictClientV2 {
|
|
1373
|
+
private readonly endpoint;
|
|
1374
|
+
constructor(endpoint: string);
|
|
1375
|
+
/**
|
|
1376
|
+
* List prediction events with optional filtering, sorting, and pagination.
|
|
1377
|
+
*
|
|
1378
|
+
* Maps to `GET /api/v1/events`.
|
|
1379
|
+
*
|
|
1380
|
+
* @param params - Optional query parameters (filter, sort, pagination).
|
|
1381
|
+
* @returns A paginated page of events.
|
|
1382
|
+
*/
|
|
1383
|
+
listEvents(params?: V2ListEventsParams): Promise<V2Page<V2Event>>;
|
|
1384
|
+
/**
|
|
1385
|
+
* Fetch a single prediction event by its slug.
|
|
1386
|
+
*
|
|
1387
|
+
* Maps to `GET /api/v1/events/:slug`.
|
|
1388
|
+
*
|
|
1389
|
+
* @param slug - Canonical event slug (e.g. "will-trump-win-2024" for Polymarket
|
|
1390
|
+
* or "KXBTCD-25FEB-T68000" for DFlow).
|
|
1391
|
+
* @returns The matching event.
|
|
1392
|
+
* @throws When the server responds with 404 or any other non-2xx status.
|
|
1393
|
+
*/
|
|
1394
|
+
getEvent(slug: string): Promise<V2Event>;
|
|
1395
|
+
}
|
|
1396
|
+
/**
|
|
1397
|
+
* Factory function for `PredictClientV2`.
|
|
1398
|
+
*
|
|
1399
|
+
* @param endpoint - Base URL of the prediction-server, without a trailing slash.
|
|
1400
|
+
*/
|
|
1401
|
+
declare function createPredictClientV2(endpoint: string): PredictClientV2;
|
|
1402
|
+
|
|
1217
1403
|
/**
|
|
1218
1404
|
* Build a query string from a params object.
|
|
1219
1405
|
* Skips `undefined` and `null` values.
|
|
@@ -1415,4 +1601,4 @@ declare class DflowPredictWsClient implements IPredictWsClient {
|
|
|
1415
1601
|
*/
|
|
1416
1602
|
declare function createDflowPredictWsClient(config: WsClientConfig): DflowPredictWsClient;
|
|
1417
1603
|
|
|
1418
|
-
export { type
|
|
1604
|
+
export { type SwapRequestBody as $, type LiveDataByMintQueryParams as A, type SeriesQueryParams as B, type CandlesticksResponse as C, type SeriesListResponse as D, type EventQueryParams as E, type ForecastPercentileHistoryQueryParams as F, type TagsByCategoriesResponse as G, type FiltersBySportsResponse as H, type IPredictClient as I, type SearchQueryParams as J, type SearchResponse as K, type LiveDataQueryParams as L, type MarketQueryParams as M, type PositionsByWalletQueryParams as N, type OrderResponse as O, PredictClientV2 as P, type WalletPositionsResponse as Q, type OutcomeMintsQueryParams as R, type StandardEvent as S, type TradesQueryParams as T, type OutcomeMintsResponse as U, type V2Event as V, type WalletPositionItem as W, type FilterOutcomeMintsRequest as X, type FilterOutcomeMintsResponse as Y, type QuoteQueryParams as Z, type QuoteResponse as _, type StandardMarket as a, type V2ProviderMeta as a$, type SwapResponse as a0, type SwapInstructionsResponse as a1, type OrderQueryParams as a2, type OrderStatusQueryParams as a3, type IntentQuoteQueryParams as a4, type IntentQuoteResponse as a5, type IntentSwapRequestBody as a6, type IntentSwapResponse as a7, type PredictionMarketInitQueryParams as a8, type PredictionMarketInitResponse as a9, type PlatformFee as aA, type ComputeBudgetInfo as aB, type PrioritizationType as aC, type AccountMetaResponse as aD, type InstructionResponse as aE, type BlockhashWithMetadata as aF, type OrderFill as aG, type OrderRevert as aH, type IntentExpiry as aI, type TokenWithDecimals as aJ, type OrderbookQueryParams as aK, type PrioritizationFeeLamports as aL, type DestinationTokenAccountParam as aM, type CreateFeeAccountParams as aN, type PositiveSlippageParams as aO, type WsSubscribeOptions as aP, BasePredictClient as aQ, buildQuery as aR, toRecord as aS, DflowPredictClient as aT, DflowPredictWsClient as aU, createDflowPredictWsClient as aV, type WsClientConfig as aW, createPredictClientV2 as aX, type V2MarketResult as aY, type V2MarketStatus as aZ, type V2Outcome as a_, type TokenListResponse as aa, type TokenListWithDecimalsResponse as ab, type VenueListResponse as ac, type WsConnectionStatus as ad, type WsPriceUpdate as ae, type WsTradeUpdate as af, type WsOrderbookUpdate as ag, type ProviderType as ah, type MarketStatus as ai, type SortField as aj, type SortOrder as ak, type OrderStatus as al, type PlatformFeeMode as am, type SlippageTolerance as an, type PriorityLevel as ao, type ExecutionMode as ap, type SettlementSource as aq, type MarketAccountInfo as ar, type OnchainTrade as as, type OnchainTradeSortBy as at, type OnchainTradesBaseQueryParams as au, type CandlestickOHLC as av, type CandlestickDataPoint as aw, type ForecastPercentileDataPoint as ax, type SeriesSettlementSource as ay, type RoutePlanLeg as az, type V2Market as b, type V2ProviderSource as b0, type V2SettlementSource as b1, type V2Tag as b2, type V2EventStatus as c, type V2EventSortField as d, type OrderStatusResponse as e, type SeriesResponse as f, type OrderbookLevel as g, type SingleTradeResponse as h, type IPredictWsClient as i, type V2ListEventsParams as j, type V2Page as k, type StandardEventsResponse as l, type StandardMarketsResponse as m, type MarketsBatchRequest as n, type OrderbookResponse as o, type MultiTradeResponse as p, type TradesByMintQueryParams as q, type OnchainTradesByWalletQueryParams as r, type MultiOnchainTradeResponse as s, type OnchainTradesByEventQueryParams as t, type OnchainTradesByMarketQueryParams as u, type CandlesticksQueryParams as v, type ForecastPercentileHistoryResponse as w, type ForecastPercentileHistoryByMintQueryParams as x, type LiveDataResponse as y, type LiveDataByEventQueryParams as z };
|