UNPKG

@nevuamarkets/poly-websockets

Version:

Plug-and-play Polymarket WebSocket price alerts

192 lines (135 loc) 6.12 kB
# Poly-WebSockets A TypeScript library for **real-time Polymarket market price alerts** over **Websocket** with **automatic reconnections** and **easy subscription management**. Powering [Nevua Markets](https://nevua.markets) ## Installation ```bash npm install @nevuamarkets/poly-websockets ``` ## Features - 📊 **Real-time Market Updates**: Get `book` , `price_change`, `tick_size_change` and `last_trade_price` real-time market events from Polymarket WSS - 🎯 **Derived Future Price Event**: Implements Polymarket's [price calculation logic](https://docs.polymarket.com/polymarket-learn/trading/how-are-prices-calculated#future-price) (midpoint vs last trade price based on spread) - 🔗 **Group Management**: Efficiently manages multiple asset subscriptions across connection groups **without losing events** when subscribing / unsubscribing assets. - 🔄 **Automatic Connection Management**: Handles WebSocket connections, reconnections, and cleanup for grouped assetId (i.e. clobTokenId) subscriptions - 🚦 **Rate Limiting**: Built-in rate limiting to respect Polymarket API limits - 💪 **TypeScript Support**: Full TypeScript definitions for all events and handlers ## Quick Start ```typescript import { WSSubscriptionManager, WebSocketHandlers } from '@nevuamarkets/poly-websockets'; // Create the subscription manager with your own handlers const manager = new WSSubscriptionManager({ onBook: async (events: BookEvent[]) => { for (const event of events) { console.log('book event', JSON.stringify(event, null, 2)) } }, onPriceChange: async (events: PriceChangeEvent[]) => { for (const event of events) { console.log('price change event', JSON.stringify(event, null, 2)) } } }); // Subscribe to assets await manager.addSubscriptions(['asset-id-1', 'asset-id-2']); // Remove subscriptions await manager.removeSubscriptions(['asset-id-1']); // Clear all subscriptions and connections await manager.clearState(); ``` ## API Reference ### WSSubscriptionManager The main class that manages WebSocket connections and subscriptions. #### Constructor ```typescript new WSSubscriptionManager(handlers: WebSocketHandlers, options?: SubscriptionManagerOptions) ``` **Parameters:** - `handlers` - Event handlers for different WebSocket events - `options` - Optional configuration object: - `maxMarketsPerWS?: number` - Maximum assets per WebSocket connection (default: 100) - `reconnectAndCleanupIntervalMs?: number` - Interval for reconnection attempts (default: 10s) - `burstLimiter?: Bottleneck` - Custom rate limiter instance. If none is provided, one will be created and used internally in the component. #### Methods ##### `addSubscriptions(assetIds: string[]): Promise<void>` Adds new asset subscriptions. The manager will: - Filter out already subscribed assets - Find available connection groups or create new ones - Establish WebSocket connections as needed ##### `removeSubscriptions(assetIds: string[]): Promise<void>` Removes asset subscriptions. **Connections are kept alive to avoid missing events**, and unused groups are cleaned up during the next reconnection cycle. ##### `clearState(): Promise<void>` Clears all subscriptions and state: - Removes all asset subscriptions - Closes all WebSocket connections - Clears the internal order book cache ### WebSocketHandlers Interface defining event handlers for different WebSocket events. ```typescript interface WebSocketHandlers { // Core Polymarket WebSocket events onBook?: (events: BookEvent[]) => Promise<void>; onLastTradePrice?: (events: LastTradePriceEvent[]) => Promise<void>; onPriceChange?: (events: PriceChangeEvent[]) => Promise<void>; onTickSizeChange?: (events: TickSizeChangeEvent[]) => Promise<void>; // Derived polymarket price update event onPolymarketPriceUpdate?: (events: PolymarketPriceUpdateEvent[]) => Promise<void>; // Connection lifecycle events onWSOpen?: (groupId: string, assetIds: string[]) => Promise<void>; onWSClose?: (groupId: string, code: number, reason: string) => Promise<void>; onError?: (error: Error) => Promise<void>; } ``` #### Key Event Types **BookEvent** - See // https://docs.polymarket.com/developers/CLOB/websocket/market-channel#book-message **PriceChangeEvent** - See https://docs.polymarket.com/developers/CLOB/websocket/market-channel#price-change-message **onTickSizeChange** - See https://docs.polymarket.com/developers/CLOB/websocket/market-channel#tick-size-change-message **LastTradePriceEvent** - Currently undocumented, but is emitted when a trade occurs **PolymarketPriceUpdateEvent** - Derived price update following Polymarket's display logic - Uses midpoint when spread <= $0.10, otherwise uses last trade price - Includes full order book context ### Custom Rate Limiting ```typescript import Bottleneck from 'bottleneck'; const customLimiter = new Bottleneck({ reservoir: 10, reservoirRefreshAmount: 10, reservoirRefreshInterval: 1000, maxConcurrent: 10 }); const manager = new WSSubscriptionManager(handlers, { burstLimiter: customLimiter }); ``` ## Examples Check the [examples](./examples) folder for complete working examples ## Error Handling The library includes error handling: - Automatic reconnection on connection drops - User-defined error callbacks for custom handling ## Rate Limits Respects Polymarket's API rate limits: - Default: 5 requests per second burst limit - Configurable through custom Bottleneck instances ## License AGPL-3 ## Testing ```bash npm test ``` ## TypeScript Support Full TypeScript definitions included. ## Disclaimer This software is provided "as is", without warranty of any kind, express or implied. The author(s) are not responsible for: - Any financial losses incurred from using this software - Trading decisions made based on the data provided - Bugs, errors, or inaccuracies in the data - System failures or downtime - Any other damages arising from the use of this software Use at your own risk. Always verify data independently and never rely solely on automated systems for trading decisions.