@liberfi.io/ui-predict 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.
@@ -1,21 +1 @@
1
- import { I as IPredictClient, c as MarketQueryOptions, M as Market, d as MarketTag, S as SearchQueryOptions, e as SearchResult, f as MarketPriceQuery, g as MarketPrice, h as MultipleMarketPrices, i as MarketPriceRequestItem, j as PriceHistoryQuery, P as PriceHistory, a as EventQueryOptions, E as Event } from '../index-CT0nyuNQ.mjs';
2
-
3
- declare class PredictClient implements IPredictClient {
4
- private readonly endpoint;
5
- constructor(endpoint: string);
6
- getMarkets(options?: MarketQueryOptions): Promise<Market[]>;
7
- getMarketById(id: string, includeTag?: boolean): Promise<Market>;
8
- getMarketBySlug(slug: string, includeTag?: boolean): Promise<Market>;
9
- getMarketTagsById(id: string): Promise<MarketTag[]>;
10
- search(options: SearchQueryOptions): Promise<SearchResult>;
11
- getMarketPrice(query: MarketPriceQuery): Promise<MarketPrice>;
12
- getMultipleMarketPrices(): Promise<MultipleMarketPrices>;
13
- getMultipleMarketPricesByRequest(requests: MarketPriceRequestItem[]): Promise<MultipleMarketPrices>;
14
- getPriceHistory(query: PriceHistoryQuery): Promise<PriceHistory>;
15
- getEvents(options?: EventQueryOptions): Promise<Event[]>;
16
- getEventById(id: string, includeChat?: boolean, includeTemplate?: boolean): Promise<Event>;
17
- getEventTagsById(id: string): Promise<MarketTag[]>;
18
- getEventBySlug(slug: string): Promise<Event>;
19
- }
20
-
21
- export { PredictClient };
1
+ export { az as BasePredictClient, aC as DflowPredictClient, aD as DflowPredictWsClient, aC as PredictClient, aD as PredictWsClient, aF as WsClientConfig, aA as buildQuery, aE as createDflowPredictWsClient, aE as createPredictWsClient, aB as toRecord } from '../index-BcVbsRbS.mjs';
@@ -1,21 +1 @@
1
- import { I as IPredictClient, c as MarketQueryOptions, M as Market, d as MarketTag, S as SearchQueryOptions, e as SearchResult, f as MarketPriceQuery, g as MarketPrice, h as MultipleMarketPrices, i as MarketPriceRequestItem, j as PriceHistoryQuery, P as PriceHistory, a as EventQueryOptions, E as Event } from '../index-CT0nyuNQ.js';
2
-
3
- declare class PredictClient implements IPredictClient {
4
- private readonly endpoint;
5
- constructor(endpoint: string);
6
- getMarkets(options?: MarketQueryOptions): Promise<Market[]>;
7
- getMarketById(id: string, includeTag?: boolean): Promise<Market>;
8
- getMarketBySlug(slug: string, includeTag?: boolean): Promise<Market>;
9
- getMarketTagsById(id: string): Promise<MarketTag[]>;
10
- search(options: SearchQueryOptions): Promise<SearchResult>;
11
- getMarketPrice(query: MarketPriceQuery): Promise<MarketPrice>;
12
- getMultipleMarketPrices(): Promise<MultipleMarketPrices>;
13
- getMultipleMarketPricesByRequest(requests: MarketPriceRequestItem[]): Promise<MultipleMarketPrices>;
14
- getPriceHistory(query: PriceHistoryQuery): Promise<PriceHistory>;
15
- getEvents(options?: EventQueryOptions): Promise<Event[]>;
16
- getEventById(id: string, includeChat?: boolean, includeTemplate?: boolean): Promise<Event>;
17
- getEventTagsById(id: string): Promise<MarketTag[]>;
18
- getEventBySlug(slug: string): Promise<Event>;
19
- }
20
-
21
- export { PredictClient };
1
+ export { az as BasePredictClient, aC as DflowPredictClient, aD as DflowPredictWsClient, aC as PredictClient, aD as PredictWsClient, aF as WsClientConfig, aA as buildQuery, aE as createDflowPredictWsClient, aE as createPredictWsClient, aB as toRecord } from '../index-BcVbsRbS.js';
@@ -1,2 +1,2 @@
1
- 'use strict';var utils=require('@liberfi.io/utils');var s=class{constructor(e){this.endpoint=e;}async getMarkets(e){let t=new URLSearchParams;for(let[i,r]of Object.entries(e||{}))t.set(i,r.toString());return await utils.get(`${this.endpoint}/markets${e?`?${t.toString()}`:""}`)}async getMarketById(e,t){return await utils.get(`${this.endpoint}/markets/${e}${t?"?includeTag=true":""}`)}async getMarketBySlug(e,t){return await utils.get(`${this.endpoint}/markets/slug/${e}${t?"?includeTag=true":""}`)}async getMarketTagsById(e){return await utils.get(`${this.endpoint}/markets/${e}/tags`)}async search(e){let t=new URLSearchParams;for(let[i,r]of Object.entries(e||{}))t.set(i,r.toString());return await utils.get(`${this.endpoint}/search${e?`?${t.toString()}`:""}`)}async getMarketPrice(e){let t=new URLSearchParams;for(let[i,r]of Object.entries(e||{}))t.set(i,r.toString());return await utils.get(`${this.endpoint}/price${e?`?${t.toString()}`:""}`)}async getMultipleMarketPrices(){return await utils.get(`${this.endpoint}/prices`)}async getMultipleMarketPricesByRequest(e){return await utils.post(`${this.endpoint}/prices`,{requests:e})}async getPriceHistory(e){let t=new URLSearchParams;for(let[i,r]of Object.entries(e||{}))t.set(i,r.toString());return await utils.get(`${this.endpoint}/price-history${e?`?${t.toString()}`:""}`)}async getEvents(e){let t=new URLSearchParams;for(let[i,r]of Object.entries(e||{}))t.set(i,r.toString());return await utils.get(`${this.endpoint}/events${e?`?${t.toString()}`:""}`)}async getEventById(e,t,i){let r=new URLSearchParams;return t&&r.set("includeChat","true"),i&&r.set("includeTemplate","true"),await utils.get(`${this.endpoint}/events/${e}${r.size>0?`?${r.toString()}`:""}`)}async getEventTagsById(e){return await utils.get(`${this.endpoint}/events/${e}/tags`)}async getEventBySlug(e){return await utils.get(`${this.endpoint}/events/slug/${e}`)}};exports.PredictClient=s;//# sourceMappingURL=index.js.map
1
+ 'use strict';var utils=require('@liberfi.io/utils');function u(n,e){let t=new URLSearchParams;e&&t.set("provider",e);for(let[r,i]of Object.entries(n))i!=null&&(typeof i=="object"?t.set(r,JSON.stringify(i)):t.set(r,String(i)));let s=t.toString();return s?`?${s}`:""}function d(n){return n}var a=class{constructor(e,t){this.endpoint=e;this.provider=t;}buildUrl(e,t){let s=u(t??{},this.provider);return `${this.endpoint}${e}${s}`}async fetch(e,t){let s=this.buildUrl(e,t);return await utils.get(s)}async postRequest(e,t,s){let r=this.buildUrl(e,s);return await utils.post(r,t)}};function c(n,e){if(!n)return [];let t=Object.entries(n).map(([s,r])=>({price:parseFloat(s),quantity:r}));return t.sort((s,r)=>e==="desc"?r.price-s.price:s.price-r.price),t}function p(n){return {yesBids:c(n.yes_bids,"desc"),yesAsks:c(n.yes_asks,"asc"),noBids:c(n.no_bids,"desc"),noAsks:c(n.no_asks,"asc"),sequence:n.sequence}}var l=class extends a{constructor(e){super(e,"dflow");}async getEvents(e){return await this.fetch("/v2/event",e??{})}async getEventById(e,t){return await this.fetch(`/v2/event/${e}`,{withNestedMarkets:t})}async getEventCandlesticks(e,t){return await this.fetch(`/v2/event/${e}/candlesticks`,t)}async getEventForecastPercentileHistory(e){let{seriesTicker:t,eventId:s,...r}=e;return await this.fetch(`/v2/event/${t}/${s}/forecast_percentile_history`,r)}async getEventForecastPercentileHistoryByMint(e){let{mintAddress:t,...s}=e;return await this.fetch(`/v2/event/by-mint/${t}/forecast_percentile_history`,s)}async getMarkets(e){return await this.fetch("/v2/market",e??{})}async getMarketById(e){return await this.fetch(`/v2/market/${e}`)}async getMarketByMint(e){return await this.fetch(`/v2/market/by-mint/${e}`)}async getMarketsBatch(e){return await this.postRequest("/v2/market/batch",e)}async getMarketCandlesticks(e,t){return await this.fetch(`/v2/market/${e}/candlesticks`,t)}async getMarketCandlesticksByMint(e,t){return await this.fetch(`/v2/market/by-mint/${e}/candlesticks`,t)}async getOrderbook(e){let t=await this.fetch(`/v2/orderbook/${e}`);return p(t)}async getOrderbookByMint(e){let t=await this.fetch(`/v2/orderbook/by-mint/${e}`);return p(t)}async getTrades(e){return await this.fetch("/v2/trades",e??{})}async getTradesByMint(e){let{mintAddress:t,...s}=e;return await this.fetch(`/v2/trades/by-mint/${t}`,s)}async getLiveData(e){return await this.fetch("/v2/live",{milestoneIds:e.milestoneIds.join(",")})}async getLiveDataByEvent(e){let{eventTicker:t,...s}=e;return await this.fetch(`/v2/live/event/${t}`,s)}async getLiveDataByMint(e){let{mintAddress:t,...s}=e;return await this.fetch(`/v2/live/by-mint/${t}`,s)}async getSeries(e){return await this.fetch("/v2/series",e??{})}async getSeriesByTicker(e){return await this.fetch(`/v2/series/${e}`)}async getTagsByCategories(){return await this.fetch("/v2/tags/by-categories")}async getFiltersBySports(){return await this.fetch("/v2/sports/filters")}async search(e){return await this.fetch("/v2/search",e)}async getOutcomeMints(e){return await this.fetch("/v2/outcome_mints",e??{})}async filterOutcomeMints(e){return await this.postRequest("/v2/filter_outcome_mints",e)}async getQuote(e){return await this.fetch("/v2/swap/quote",e)}async createSwap(e){return await this.postRequest("/v2/swap",e)}async createSwapInstructions(e){return await this.postRequest("/v2/swap/instructions",e)}async getOrder(e){return await this.fetch("/v2/order",e)}async getOrderStatus(e){return await this.fetch("/v2/order/status",e)}async getIntentQuote(e){return await this.fetch("/v2/intent/quote",e)}async submitIntentSwap(e){return await this.postRequest("/v2/intent/swap",e)}async initPredictionMarket(e){return await this.fetch("/v2/prediction-market/init",e)}async getTokens(){return await this.fetch("/v2/tokens")}async getTokensWithDecimals(){return await this.fetch("/v2/tokens/decimals")}async getVenues(){return await this.fetch("/v2/venues")}};var o=class{ws=null;wsUrl;autoReconnect;reconnectIntervalBase;reconnectMaxInterval;pingInterval;status="disconnected";reconnectAttempts=0;reconnectTimeout=null;pingIntervalId=null;shouldReconnect=true;listeners={connect:[],disconnect:[],reconnecting:[],error:[],price:[],trade:[],orderbook:[],status:[],subscribed:[],unsubscribed:[]};subscriptions={prices:{all:false,tickers:new Set},trades:{all:false,tickers:new Set},orderbook:{all:false,tickers:new Set}};constructor(e){this.wsUrl=e.wsUrl,this.autoReconnect=e.autoReconnect??true,this.reconnectIntervalBase=e.reconnectIntervalBase??1e3,this.reconnectMaxInterval=e.reconnectMaxInterval??3e4,this.pingInterval=e.pingInterval??3e4,e.autoConnect!==false&&this.connect();}connect(){if(!(this.ws&&(this.ws.readyState===WebSocket.OPEN||this.ws.readyState===WebSocket.CONNECTING))){this.shouldReconnect=true,this.setStatus("connecting");try{this.ws=new WebSocket(this.wsUrl),this.ws.onopen=()=>{this.reconnectAttempts=0,this.setStatus("connected"),this.emit("connect",void 0),this.restoreSubscriptions(),this.startPingInterval();},this.ws.onmessage=e=>{this.handleMessage(e.data);},this.ws.onerror=e=>{let t=new Error("WebSocket error");this.emit("error",t);},this.ws.onclose=e=>{this.stopPingInterval(),this.setStatus("disconnected"),this.emit("disconnect",{code:e.code,reason:e.reason}),this.shouldReconnect&&this.autoReconnect&&this.scheduleReconnect();};}catch(e){this.emit("error",e instanceof Error?e:new Error(String(e))),this.shouldReconnect&&this.autoReconnect&&this.scheduleReconnect();}}}disconnect(){this.shouldReconnect=false,this.stopPingInterval(),this.reconnectTimeout&&(clearTimeout(this.reconnectTimeout),this.reconnectTimeout=null),this.ws&&(this.ws.close(),this.ws=null),this.setStatus("disconnected");}isConnected(){return this.ws!==null&&this.ws.readyState===WebSocket.OPEN}getStatus(){return this.status}subscribePrices(e,t){this.subscribeChannel("prices",e);let s=this.on("price",t);return ()=>{s(),this.unsubscribeChannel("prices",e);}}subscribeTrades(e,t){this.subscribeChannel("trades",e);let s=this.on("trade",t);return ()=>{s(),this.unsubscribeChannel("trades",e);}}subscribeOrderbook(e,t){this.subscribeChannel("orderbook",e);let s=this.on("orderbook",t);return ()=>{s(),this.unsubscribeChannel("orderbook",e);}}onStatusChange(e){return this.on("status",e)}on(e,t){return this.listeners[e].push(t),()=>{this.off(e,t);}}off(e,t){let s=this.listeners[e],r=s.indexOf(t);r!==-1&&s.splice(r,1);}removeAllListeners(e){if(e)this.listeners[e].length=0;else for(let t of Object.keys(this.listeners))this.listeners[t].length=0;}subscribeChannel(e,t){let s=this.subscriptions[e];if(t.all)s.all=true,s.tickers.clear();else if(t.tickers&&t.tickers.length>0){s.all=false;for(let r of t.tickers)s.tickers.add(r);}this.sendSubscription("subscribe",e,t);}unsubscribeChannel(e,t){let s=this.subscriptions[e];if(t.all)s.all=false,s.tickers.clear();else if(t.tickers&&t.tickers.length>0)for(let r of t.tickers)s.tickers.delete(r);this.sendSubscription("unsubscribe",e,t);}setStatus(e){this.status!==e&&(this.status=e,this.emit("status",e));}emit(e,t){let s=this.listeners[e];for(let r of s)try{r(t);}catch{}}send(e){if(!this.ws||this.ws.readyState!==WebSocket.OPEN)return false;try{return this.ws.send(JSON.stringify(e)),!0}catch{return false}}sendSubscription(e,t,s){this.send({type:e,channel:t,all:s.all,tickers:s.tickers});}handleMessage(e){try{let t=JSON.parse(e);switch(t.type){case "ticker":this.emit("price",t);break;case "trade":this.emit("trade",t);break;case "orderbook":this.emit("orderbook",t);break;case "status":break;case "subscribed":this.emit("subscribed",{channel:t.channel,all:t.all,tickers:t.tickers});break;case "unsubscribed":this.emit("unsubscribed",{channel:t.channel,all:t.all,tickers:t.tickers});break;case "pong":break;case "error":this.emit("error",new Error(t.message));break;default:if("channel"in t){let s=t;switch(s.channel){case "prices":this.emit("price",s);break;case "trades":this.emit("trade",s);break;case "orderbook":this.emit("orderbook",s);break}}}}catch{}}scheduleReconnect(){if(this.reconnectTimeout)return;let e=Math.min(this.reconnectIntervalBase*Math.pow(2,this.reconnectAttempts),this.reconnectMaxInterval);this.setStatus("reconnecting"),this.emit("reconnecting",{attempt:this.reconnectAttempts+1,delay:e}),this.reconnectTimeout=setTimeout(()=>{this.reconnectTimeout=null,this.reconnectAttempts++,this.connect();},e);}restoreSubscriptions(){for(let e of ["prices","trades","orderbook"]){let t=this.subscriptions[e];t.all?this.sendSubscription("subscribe",e,{all:true}):t.tickers.size>0&&this.sendSubscription("subscribe",e,{tickers:Array.from(t.tickers)});}}startPingInterval(){this.stopPingInterval(),this.pingIntervalId=setInterval(()=>{this.send({type:"ping"});},this.pingInterval);}stopPingInterval(){this.pingIntervalId&&(clearInterval(this.pingIntervalId),this.pingIntervalId=null);}};function h(n){return new o(n)}exports.BasePredictClient=a;exports.DflowPredictClient=l;exports.DflowPredictWsClient=o;exports.PredictClient=l;exports.PredictWsClient=o;exports.buildQuery=u;exports.createDflowPredictWsClient=h;exports.createPredictWsClient=h;exports.toRecord=d;//# sourceMappingURL=index.js.map
2
2
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/client/index.ts"],"names":["PredictClient","endpoint","options","queryParams","key","value","get","id","includeTag","slug","query","requests","post","includeChat","includeTemplate"],"mappings":"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","file":"index.js","sourcesContent":["import { get, post } from \"@liberfi.io/utils\";\nimport {\n Event,\n EventQueryOptions,\n IPredictClient,\n Market,\n MarketPrice,\n MarketPriceQuery,\n MarketPriceRequestItem,\n MarketQueryOptions,\n MarketTag,\n MultipleMarketPrices,\n PriceHistory,\n PriceHistoryQuery,\n SearchQueryOptions,\n SearchResult,\n} from \"../types\";\n\nexport class PredictClient implements IPredictClient {\n constructor(private readonly endpoint: string) {}\n\n async getMarkets(options?: MarketQueryOptions): Promise<Market[]> {\n const queryParams = new URLSearchParams();\n for (const [key, value] of Object.entries(options || {})) {\n queryParams.set(key, value.toString());\n }\n return await get<Market[]>(\n `${this.endpoint}/markets${options ? `?${queryParams.toString()}` : \"\"}`,\n );\n }\n\n async getMarketById(id: string, includeTag?: boolean): Promise<Market> {\n return await get<Market>(\n `${this.endpoint}/markets/${id}${includeTag ? \"?includeTag=true\" : \"\"}`,\n );\n }\n\n async getMarketBySlug(slug: string, includeTag?: boolean): Promise<Market> {\n return await get<Market>(\n `${this.endpoint}/markets/slug/${slug}${includeTag ? \"?includeTag=true\" : \"\"}`,\n );\n }\n\n async getMarketTagsById(id: string): Promise<MarketTag[]> {\n return await get<MarketTag[]>(`${this.endpoint}/markets/${id}/tags`);\n }\n\n async search(options: SearchQueryOptions): Promise<SearchResult> {\n const queryParams = new URLSearchParams();\n for (const [key, value] of Object.entries(options || {})) {\n queryParams.set(key, value.toString());\n }\n return await get<SearchResult>(\n `${this.endpoint}/search${options ? `?${queryParams.toString()}` : \"\"}`,\n );\n }\n\n async getMarketPrice(query: MarketPriceQuery): Promise<MarketPrice> {\n const queryParams = new URLSearchParams();\n for (const [key, value] of Object.entries(query || {})) {\n queryParams.set(key, value.toString());\n }\n return await get<MarketPrice>(\n `${this.endpoint}/price${query ? `?${queryParams.toString()}` : \"\"}`,\n );\n }\n\n async getMultipleMarketPrices(): Promise<MultipleMarketPrices> {\n return await get<MultipleMarketPrices>(`${this.endpoint}/prices`);\n }\n\n async getMultipleMarketPricesByRequest(\n requests: MarketPriceRequestItem[],\n ): Promise<MultipleMarketPrices> {\n return await post<MultipleMarketPrices>(`${this.endpoint}/prices`, {\n requests,\n });\n }\n\n async getPriceHistory(query: PriceHistoryQuery): Promise<PriceHistory> {\n const queryParams = new URLSearchParams();\n for (const [key, value] of Object.entries(query || {})) {\n queryParams.set(key, value.toString());\n }\n return await get<PriceHistory>(\n `${this.endpoint}/price-history${query ? `?${queryParams.toString()}` : \"\"}`,\n );\n }\n\n async getEvents(options?: EventQueryOptions): Promise<Event[]> {\n const queryParams = new URLSearchParams();\n for (const [key, value] of Object.entries(options || {})) {\n queryParams.set(key, value.toString());\n }\n return await get<Event[]>(\n `${this.endpoint}/events${options ? `?${queryParams.toString()}` : \"\"}`,\n );\n }\n\n async getEventById(\n id: string,\n includeChat?: boolean,\n includeTemplate?: boolean,\n ): Promise<Event> {\n const queryParams = new URLSearchParams();\n if (includeChat) {\n queryParams.set(\"includeChat\", \"true\");\n }\n if (includeTemplate) {\n queryParams.set(\"includeTemplate\", \"true\");\n }\n return await get<Event>(\n `${this.endpoint}/events/${id}${queryParams.size > 0 ? `?${queryParams.toString()}` : \"\"}`,\n );\n }\n\n async getEventTagsById(id: string): Promise<MarketTag[]> {\n return await get<MarketTag[]>(`${this.endpoint}/events/${id}/tags`);\n }\n\n async getEventBySlug(slug: string): Promise<Event> {\n return await get<Event>(`${this.endpoint}/events/slug/${slug}`);\n }\n}\n"]}
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","get","data","post","parseSide","raw","sort","levels","priceStr","quantity","a","b","normalizeOrderbook","DflowPredictClient","eventId","withNestedMarkets","ticker","seriesTicker","rest","mintAddress","marketId","request","marketTicker","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.js","sourcesContent":["import { get, post } 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 get<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 post<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 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 CandlesticksQueryParams,\n ForecastPercentileHistoryQueryParams,\n ForecastPercentileHistoryByMintQueryParams,\n SeriesQueryParams,\n SearchQueryParams,\n LiveDataQueryParams,\n LiveDataByEventQueryParams,\n LiveDataByMintQueryParams,\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 // -- 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 // -- 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,2 +1,2 @@
1
- import {get,post}from'@liberfi.io/utils';var s=class{constructor(e){this.endpoint=e;}async getMarkets(e){let t=new URLSearchParams;for(let[i,r]of Object.entries(e||{}))t.set(i,r.toString());return await get(`${this.endpoint}/markets${e?`?${t.toString()}`:""}`)}async getMarketById(e,t){return await get(`${this.endpoint}/markets/${e}${t?"?includeTag=true":""}`)}async getMarketBySlug(e,t){return await get(`${this.endpoint}/markets/slug/${e}${t?"?includeTag=true":""}`)}async getMarketTagsById(e){return await get(`${this.endpoint}/markets/${e}/tags`)}async search(e){let t=new URLSearchParams;for(let[i,r]of Object.entries(e||{}))t.set(i,r.toString());return await get(`${this.endpoint}/search${e?`?${t.toString()}`:""}`)}async getMarketPrice(e){let t=new URLSearchParams;for(let[i,r]of Object.entries(e||{}))t.set(i,r.toString());return await get(`${this.endpoint}/price${e?`?${t.toString()}`:""}`)}async getMultipleMarketPrices(){return await get(`${this.endpoint}/prices`)}async getMultipleMarketPricesByRequest(e){return await post(`${this.endpoint}/prices`,{requests:e})}async getPriceHistory(e){let t=new URLSearchParams;for(let[i,r]of Object.entries(e||{}))t.set(i,r.toString());return await get(`${this.endpoint}/price-history${e?`?${t.toString()}`:""}`)}async getEvents(e){let t=new URLSearchParams;for(let[i,r]of Object.entries(e||{}))t.set(i,r.toString());return await get(`${this.endpoint}/events${e?`?${t.toString()}`:""}`)}async getEventById(e,t,i){let r=new URLSearchParams;return t&&r.set("includeChat","true"),i&&r.set("includeTemplate","true"),await get(`${this.endpoint}/events/${e}${r.size>0?`?${r.toString()}`:""}`)}async getEventTagsById(e){return await get(`${this.endpoint}/events/${e}/tags`)}async getEventBySlug(e){return await get(`${this.endpoint}/events/slug/${e}`)}};export{s as PredictClient};//# sourceMappingURL=index.mjs.map
1
+ import {get,post}from'@liberfi.io/utils';function u(n,e){let t=new URLSearchParams;e&&t.set("provider",e);for(let[r,i]of Object.entries(n))i!=null&&(typeof i=="object"?t.set(r,JSON.stringify(i)):t.set(r,String(i)));let s=t.toString();return s?`?${s}`:""}function d(n){return n}var a=class{constructor(e,t){this.endpoint=e;this.provider=t;}buildUrl(e,t){let s=u(t??{},this.provider);return `${this.endpoint}${e}${s}`}async fetch(e,t){let s=this.buildUrl(e,t);return await get(s)}async postRequest(e,t,s){let r=this.buildUrl(e,s);return await post(r,t)}};function c(n,e){if(!n)return [];let t=Object.entries(n).map(([s,r])=>({price:parseFloat(s),quantity:r}));return t.sort((s,r)=>e==="desc"?r.price-s.price:s.price-r.price),t}function p(n){return {yesBids:c(n.yes_bids,"desc"),yesAsks:c(n.yes_asks,"asc"),noBids:c(n.no_bids,"desc"),noAsks:c(n.no_asks,"asc"),sequence:n.sequence}}var l=class extends a{constructor(e){super(e,"dflow");}async getEvents(e){return await this.fetch("/v2/event",e??{})}async getEventById(e,t){return await this.fetch(`/v2/event/${e}`,{withNestedMarkets:t})}async getEventCandlesticks(e,t){return await this.fetch(`/v2/event/${e}/candlesticks`,t)}async getEventForecastPercentileHistory(e){let{seriesTicker:t,eventId:s,...r}=e;return await this.fetch(`/v2/event/${t}/${s}/forecast_percentile_history`,r)}async getEventForecastPercentileHistoryByMint(e){let{mintAddress:t,...s}=e;return await this.fetch(`/v2/event/by-mint/${t}/forecast_percentile_history`,s)}async getMarkets(e){return await this.fetch("/v2/market",e??{})}async getMarketById(e){return await this.fetch(`/v2/market/${e}`)}async getMarketByMint(e){return await this.fetch(`/v2/market/by-mint/${e}`)}async getMarketsBatch(e){return await this.postRequest("/v2/market/batch",e)}async getMarketCandlesticks(e,t){return await this.fetch(`/v2/market/${e}/candlesticks`,t)}async getMarketCandlesticksByMint(e,t){return await this.fetch(`/v2/market/by-mint/${e}/candlesticks`,t)}async getOrderbook(e){let t=await this.fetch(`/v2/orderbook/${e}`);return p(t)}async getOrderbookByMint(e){let t=await this.fetch(`/v2/orderbook/by-mint/${e}`);return p(t)}async getTrades(e){return await this.fetch("/v2/trades",e??{})}async getTradesByMint(e){let{mintAddress:t,...s}=e;return await this.fetch(`/v2/trades/by-mint/${t}`,s)}async getLiveData(e){return await this.fetch("/v2/live",{milestoneIds:e.milestoneIds.join(",")})}async getLiveDataByEvent(e){let{eventTicker:t,...s}=e;return await this.fetch(`/v2/live/event/${t}`,s)}async getLiveDataByMint(e){let{mintAddress:t,...s}=e;return await this.fetch(`/v2/live/by-mint/${t}`,s)}async getSeries(e){return await this.fetch("/v2/series",e??{})}async getSeriesByTicker(e){return await this.fetch(`/v2/series/${e}`)}async getTagsByCategories(){return await this.fetch("/v2/tags/by-categories")}async getFiltersBySports(){return await this.fetch("/v2/sports/filters")}async search(e){return await this.fetch("/v2/search",e)}async getOutcomeMints(e){return await this.fetch("/v2/outcome_mints",e??{})}async filterOutcomeMints(e){return await this.postRequest("/v2/filter_outcome_mints",e)}async getQuote(e){return await this.fetch("/v2/swap/quote",e)}async createSwap(e){return await this.postRequest("/v2/swap",e)}async createSwapInstructions(e){return await this.postRequest("/v2/swap/instructions",e)}async getOrder(e){return await this.fetch("/v2/order",e)}async getOrderStatus(e){return await this.fetch("/v2/order/status",e)}async getIntentQuote(e){return await this.fetch("/v2/intent/quote",e)}async submitIntentSwap(e){return await this.postRequest("/v2/intent/swap",e)}async initPredictionMarket(e){return await this.fetch("/v2/prediction-market/init",e)}async getTokens(){return await this.fetch("/v2/tokens")}async getTokensWithDecimals(){return await this.fetch("/v2/tokens/decimals")}async getVenues(){return await this.fetch("/v2/venues")}};var o=class{ws=null;wsUrl;autoReconnect;reconnectIntervalBase;reconnectMaxInterval;pingInterval;status="disconnected";reconnectAttempts=0;reconnectTimeout=null;pingIntervalId=null;shouldReconnect=true;listeners={connect:[],disconnect:[],reconnecting:[],error:[],price:[],trade:[],orderbook:[],status:[],subscribed:[],unsubscribed:[]};subscriptions={prices:{all:false,tickers:new Set},trades:{all:false,tickers:new Set},orderbook:{all:false,tickers:new Set}};constructor(e){this.wsUrl=e.wsUrl,this.autoReconnect=e.autoReconnect??true,this.reconnectIntervalBase=e.reconnectIntervalBase??1e3,this.reconnectMaxInterval=e.reconnectMaxInterval??3e4,this.pingInterval=e.pingInterval??3e4,e.autoConnect!==false&&this.connect();}connect(){if(!(this.ws&&(this.ws.readyState===WebSocket.OPEN||this.ws.readyState===WebSocket.CONNECTING))){this.shouldReconnect=true,this.setStatus("connecting");try{this.ws=new WebSocket(this.wsUrl),this.ws.onopen=()=>{this.reconnectAttempts=0,this.setStatus("connected"),this.emit("connect",void 0),this.restoreSubscriptions(),this.startPingInterval();},this.ws.onmessage=e=>{this.handleMessage(e.data);},this.ws.onerror=e=>{let t=new Error("WebSocket error");this.emit("error",t);},this.ws.onclose=e=>{this.stopPingInterval(),this.setStatus("disconnected"),this.emit("disconnect",{code:e.code,reason:e.reason}),this.shouldReconnect&&this.autoReconnect&&this.scheduleReconnect();};}catch(e){this.emit("error",e instanceof Error?e:new Error(String(e))),this.shouldReconnect&&this.autoReconnect&&this.scheduleReconnect();}}}disconnect(){this.shouldReconnect=false,this.stopPingInterval(),this.reconnectTimeout&&(clearTimeout(this.reconnectTimeout),this.reconnectTimeout=null),this.ws&&(this.ws.close(),this.ws=null),this.setStatus("disconnected");}isConnected(){return this.ws!==null&&this.ws.readyState===WebSocket.OPEN}getStatus(){return this.status}subscribePrices(e,t){this.subscribeChannel("prices",e);let s=this.on("price",t);return ()=>{s(),this.unsubscribeChannel("prices",e);}}subscribeTrades(e,t){this.subscribeChannel("trades",e);let s=this.on("trade",t);return ()=>{s(),this.unsubscribeChannel("trades",e);}}subscribeOrderbook(e,t){this.subscribeChannel("orderbook",e);let s=this.on("orderbook",t);return ()=>{s(),this.unsubscribeChannel("orderbook",e);}}onStatusChange(e){return this.on("status",e)}on(e,t){return this.listeners[e].push(t),()=>{this.off(e,t);}}off(e,t){let s=this.listeners[e],r=s.indexOf(t);r!==-1&&s.splice(r,1);}removeAllListeners(e){if(e)this.listeners[e].length=0;else for(let t of Object.keys(this.listeners))this.listeners[t].length=0;}subscribeChannel(e,t){let s=this.subscriptions[e];if(t.all)s.all=true,s.tickers.clear();else if(t.tickers&&t.tickers.length>0){s.all=false;for(let r of t.tickers)s.tickers.add(r);}this.sendSubscription("subscribe",e,t);}unsubscribeChannel(e,t){let s=this.subscriptions[e];if(t.all)s.all=false,s.tickers.clear();else if(t.tickers&&t.tickers.length>0)for(let r of t.tickers)s.tickers.delete(r);this.sendSubscription("unsubscribe",e,t);}setStatus(e){this.status!==e&&(this.status=e,this.emit("status",e));}emit(e,t){let s=this.listeners[e];for(let r of s)try{r(t);}catch{}}send(e){if(!this.ws||this.ws.readyState!==WebSocket.OPEN)return false;try{return this.ws.send(JSON.stringify(e)),!0}catch{return false}}sendSubscription(e,t,s){this.send({type:e,channel:t,all:s.all,tickers:s.tickers});}handleMessage(e){try{let t=JSON.parse(e);switch(t.type){case "ticker":this.emit("price",t);break;case "trade":this.emit("trade",t);break;case "orderbook":this.emit("orderbook",t);break;case "status":break;case "subscribed":this.emit("subscribed",{channel:t.channel,all:t.all,tickers:t.tickers});break;case "unsubscribed":this.emit("unsubscribed",{channel:t.channel,all:t.all,tickers:t.tickers});break;case "pong":break;case "error":this.emit("error",new Error(t.message));break;default:if("channel"in t){let s=t;switch(s.channel){case "prices":this.emit("price",s);break;case "trades":this.emit("trade",s);break;case "orderbook":this.emit("orderbook",s);break}}}}catch{}}scheduleReconnect(){if(this.reconnectTimeout)return;let e=Math.min(this.reconnectIntervalBase*Math.pow(2,this.reconnectAttempts),this.reconnectMaxInterval);this.setStatus("reconnecting"),this.emit("reconnecting",{attempt:this.reconnectAttempts+1,delay:e}),this.reconnectTimeout=setTimeout(()=>{this.reconnectTimeout=null,this.reconnectAttempts++,this.connect();},e);}restoreSubscriptions(){for(let e of ["prices","trades","orderbook"]){let t=this.subscriptions[e];t.all?this.sendSubscription("subscribe",e,{all:true}):t.tickers.size>0&&this.sendSubscription("subscribe",e,{tickers:Array.from(t.tickers)});}}startPingInterval(){this.stopPingInterval(),this.pingIntervalId=setInterval(()=>{this.send({type:"ping"});},this.pingInterval);}stopPingInterval(){this.pingIntervalId&&(clearInterval(this.pingIntervalId),this.pingIntervalId=null);}};function h(n){return new o(n)}export{a as BasePredictClient,l as DflowPredictClient,o as DflowPredictWsClient,l as PredictClient,o as PredictWsClient,u as buildQuery,h as createDflowPredictWsClient,h as createPredictWsClient,d as toRecord};//# sourceMappingURL=index.mjs.map
2
2
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/client/index.ts"],"names":["PredictClient","endpoint","options","queryParams","key","value","get","id","includeTag","slug","query","requests","post","includeChat","includeTemplate"],"mappings":"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","file":"index.mjs","sourcesContent":["import { get, post } from \"@liberfi.io/utils\";\nimport {\n Event,\n EventQueryOptions,\n IPredictClient,\n Market,\n MarketPrice,\n MarketPriceQuery,\n MarketPriceRequestItem,\n MarketQueryOptions,\n MarketTag,\n MultipleMarketPrices,\n PriceHistory,\n PriceHistoryQuery,\n SearchQueryOptions,\n SearchResult,\n} from \"../types\";\n\nexport class PredictClient implements IPredictClient {\n constructor(private readonly endpoint: string) {}\n\n async getMarkets(options?: MarketQueryOptions): Promise<Market[]> {\n const queryParams = new URLSearchParams();\n for (const [key, value] of Object.entries(options || {})) {\n queryParams.set(key, value.toString());\n }\n return await get<Market[]>(\n `${this.endpoint}/markets${options ? `?${queryParams.toString()}` : \"\"}`,\n );\n }\n\n async getMarketById(id: string, includeTag?: boolean): Promise<Market> {\n return await get<Market>(\n `${this.endpoint}/markets/${id}${includeTag ? \"?includeTag=true\" : \"\"}`,\n );\n }\n\n async getMarketBySlug(slug: string, includeTag?: boolean): Promise<Market> {\n return await get<Market>(\n `${this.endpoint}/markets/slug/${slug}${includeTag ? \"?includeTag=true\" : \"\"}`,\n );\n }\n\n async getMarketTagsById(id: string): Promise<MarketTag[]> {\n return await get<MarketTag[]>(`${this.endpoint}/markets/${id}/tags`);\n }\n\n async search(options: SearchQueryOptions): Promise<SearchResult> {\n const queryParams = new URLSearchParams();\n for (const [key, value] of Object.entries(options || {})) {\n queryParams.set(key, value.toString());\n }\n return await get<SearchResult>(\n `${this.endpoint}/search${options ? `?${queryParams.toString()}` : \"\"}`,\n );\n }\n\n async getMarketPrice(query: MarketPriceQuery): Promise<MarketPrice> {\n const queryParams = new URLSearchParams();\n for (const [key, value] of Object.entries(query || {})) {\n queryParams.set(key, value.toString());\n }\n return await get<MarketPrice>(\n `${this.endpoint}/price${query ? `?${queryParams.toString()}` : \"\"}`,\n );\n }\n\n async getMultipleMarketPrices(): Promise<MultipleMarketPrices> {\n return await get<MultipleMarketPrices>(`${this.endpoint}/prices`);\n }\n\n async getMultipleMarketPricesByRequest(\n requests: MarketPriceRequestItem[],\n ): Promise<MultipleMarketPrices> {\n return await post<MultipleMarketPrices>(`${this.endpoint}/prices`, {\n requests,\n });\n }\n\n async getPriceHistory(query: PriceHistoryQuery): Promise<PriceHistory> {\n const queryParams = new URLSearchParams();\n for (const [key, value] of Object.entries(query || {})) {\n queryParams.set(key, value.toString());\n }\n return await get<PriceHistory>(\n `${this.endpoint}/price-history${query ? `?${queryParams.toString()}` : \"\"}`,\n );\n }\n\n async getEvents(options?: EventQueryOptions): Promise<Event[]> {\n const queryParams = new URLSearchParams();\n for (const [key, value] of Object.entries(options || {})) {\n queryParams.set(key, value.toString());\n }\n return await get<Event[]>(\n `${this.endpoint}/events${options ? `?${queryParams.toString()}` : \"\"}`,\n );\n }\n\n async getEventById(\n id: string,\n includeChat?: boolean,\n includeTemplate?: boolean,\n ): Promise<Event> {\n const queryParams = new URLSearchParams();\n if (includeChat) {\n queryParams.set(\"includeChat\", \"true\");\n }\n if (includeTemplate) {\n queryParams.set(\"includeTemplate\", \"true\");\n }\n return await get<Event>(\n `${this.endpoint}/events/${id}${queryParams.size > 0 ? `?${queryParams.toString()}` : \"\"}`,\n );\n }\n\n async getEventTagsById(id: string): Promise<MarketTag[]> {\n return await get<MarketTag[]>(`${this.endpoint}/events/${id}/tags`);\n }\n\n async getEventBySlug(slug: string): Promise<Event> {\n return await get<Event>(`${this.endpoint}/events/slug/${slug}`);\n }\n}\n"]}
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","get","data","post","parseSide","raw","sort","levels","priceStr","quantity","a","b","normalizeOrderbook","DflowPredictClient","eventId","withNestedMarkets","ticker","seriesTicker","rest","mintAddress","marketId","request","marketTicker","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 { get, post } 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 get<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 post<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 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 CandlesticksQueryParams,\n ForecastPercentileHistoryQueryParams,\n ForecastPercentileHistoryByMintQueryParams,\n SeriesQueryParams,\n SearchQueryParams,\n LiveDataQueryParams,\n LiveDataByEventQueryParams,\n LiveDataByMintQueryParams,\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 // -- 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 // -- 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"]}