@k256/sdk 0.2.0 → 0.3.0

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 +1 @@
1
- {"version":3,"sources":["../src/utils/base58.ts","../src/ws/types.ts","../src/ws/decoder.ts","../src/ws/client.ts","../src/types/index.ts"],"names":["NetworkState"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Base58 encoding utilities for Solana addresses\n * \n * Solana uses Base58 encoding (Bitcoin-style) for public keys and signatures.\n */\n\nconst BASE58_ALPHABET = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';\n\n/**\n * Encode bytes to Base58 string (Solana address format)\n * \n * @param bytes - Uint8Array to encode\n * @returns Base58 encoded string\n * \n * @example\n * ```typescript\n * const pubkey = new Uint8Array([1, 2, 3, ...]);\n * const address = base58Encode(pubkey);\n * // \"EPjFWdd5...\"\n * ```\n */\nexport function base58Encode(bytes: Uint8Array): string {\n const digits = [0];\n \n for (let i = 0; i < bytes.length; i++) {\n let carry = bytes[i];\n for (let j = 0; j < digits.length; j++) {\n carry += digits[j] << 8;\n digits[j] = carry % 58;\n carry = (carry / 58) | 0;\n }\n while (carry > 0) {\n digits.push(carry % 58);\n carry = (carry / 58) | 0;\n }\n }\n\n // Leading zeros\n let leadingZeros = '';\n for (let i = 0; i < bytes.length && bytes[i] === 0; i++) {\n leadingZeros += '1';\n }\n\n return leadingZeros + digits.reverse().map(d => BASE58_ALPHABET[d]).join('');\n}\n\n/**\n * Decode Base58 string to bytes\n * \n * @param str - Base58 encoded string\n * @returns Uint8Array of decoded bytes\n * @throws Error if string contains invalid characters\n * \n * @example\n * ```typescript\n * const bytes = base58Decode(\"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v\");\n * // Uint8Array(32) [...]\n * ```\n */\nexport function base58Decode(str: string): Uint8Array {\n if (str.length === 0) {\n return new Uint8Array(0);\n }\n\n // Count leading '1's (they represent leading zero bytes)\n let leadingZeros = 0;\n for (let i = 0; i < str.length && str[i] === '1'; i++) {\n leadingZeros++;\n }\n\n // Process remaining characters through base conversion\n const bytes = [0];\n for (let i = leadingZeros; i < str.length; i++) {\n const char = str[i];\n const value = BASE58_ALPHABET.indexOf(char);\n \n if (value === -1) {\n throw new Error(`Invalid Base58 character: ${char}`);\n }\n \n let carry = value;\n for (let j = 0; j < bytes.length; j++) {\n carry += bytes[j] * 58;\n bytes[j] = carry & 0xff;\n carry >>= 8;\n }\n while (carry > 0) {\n bytes.push(carry & 0xff);\n carry >>= 8;\n }\n }\n\n // Build result: leading zeros + converted bytes (reversed)\n bytes.reverse();\n \n // Handle case where input was all '1's (all leading zeros, no data to convert)\n // In this case, bytes is just [0] from initialization, which we should ignore\n if (leadingZeros > 0 && bytes.length === 1 && bytes[0] === 0) {\n // Input was all '1's, return that many zero bytes\n return new Uint8Array(leadingZeros);\n }\n \n // Remove leading zero from conversion if present (artifact of starting with [0])\n const startIdx = bytes.length > 1 && bytes[0] === 0 ? 1 : 0;\n \n const result = new Uint8Array(leadingZeros + bytes.length - startIdx);\n // Fill leading zeros\n for (let i = 0; i < leadingZeros; i++) {\n result[i] = 0;\n }\n // Copy converted bytes\n for (let i = startIdx; i < bytes.length; i++) {\n result[leadingZeros + i - startIdx] = bytes[i];\n }\n \n return result;\n}\n\n/**\n * Check if a string is a valid Solana public key (Base58, 32-44 chars)\n * \n * @param address - String to validate\n * @returns true if valid Solana pubkey format\n * \n * @example\n * ```typescript\n * isValidPubkey(\"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v\") // true\n * isValidPubkey(\"invalid\") // false\n * ```\n */\nexport function isValidPubkey(address: string): boolean {\n // Solana pubkeys are 32-44 characters in Base58\n if (address.length < 32 || address.length > 44) {\n return false;\n }\n\n // Check all characters are valid Base58\n for (const char of address) {\n if (!BASE58_ALPHABET.includes(char)) {\n return false;\n }\n }\n\n // Try to decode and verify length\n try {\n const bytes = base58Decode(address);\n return bytes.length === 32;\n } catch {\n return false;\n }\n}\n","/**\n * WebSocket message types and interfaces\n * \n * Message type constants MUST match the K2 server values.\n * See: https://github.com/k256-xyz for protocol documentation\n */\n\nimport type { BlockMiniStats, TrendDirection, BlockStats } from '../types';\n\n/**\n * WebSocket message type constants\n * \n * These are the byte prefixes used in the binary protocol.\n * All SDKs across all languages MUST use these exact values.\n */\nexport const MessageType = {\n /** Single pool state update (bincode) */\n PoolUpdate: 0x01,\n /** Subscribe request (JSON) - Client → Server */\n Subscribe: 0x02,\n /** Subscription confirmed (JSON) - Server → Client */\n Subscribed: 0x03,\n /** Unsubscribe all - Client → Server */\n Unsubscribe: 0x04,\n /** Priority fee update (bincode) */\n PriorityFees: 0x05,\n /** Recent blockhash (bincode) */\n Blockhash: 0x06,\n /** Streaming quote update (bincode) */\n Quote: 0x07,\n /** Quote subscription confirmed (JSON) */\n QuoteSubscribed: 0x08,\n /** Subscribe to quote stream (JSON) - Client → Server */\n SubscribeQuote: 0x09,\n /** Unsubscribe from quote (JSON) - Client → Server */\n UnsubscribeQuote: 0x0a,\n /** Ping keepalive - Client → Server */\n Ping: 0x0b,\n /** Pong response (bincode u64 timestamp) */\n Pong: 0x0c,\n /** Connection heartbeat with stats (JSON) */\n Heartbeat: 0x0d,\n /** Batched pool updates for high throughput */\n PoolUpdateBatch: 0x0e,\n /** Block-level statistics (v3) */\n BlockStats: 0x0f,\n /** Error message (UTF-8 string) */\n Error: 0xff,\n} as const;\n\nexport type MessageTypeValue = typeof MessageType[keyof typeof MessageType];\n\n/**\n * Decoded pool update from binary message\n */\nexport interface PoolUpdateMessage {\n type: 'pool_update';\n data: {\n sequence: number;\n slot: number;\n writeVersion: number;\n protocol: string;\n poolAddress: string;\n tokenMints: string[];\n tokenBalances: string[];\n tokenDecimals: number[];\n bestBid?: { price: string; size: string };\n bestAsk?: { price: string; size: string };\n };\n}\n\n/**\n * Decoded fee market from binary message (per-writable-account model)\n *\n * All fields from K2 FeeMarketWire\n */\nexport interface FeeMarketMessage {\n type: 'fee_market';\n data: {\n slot: number;\n timestampMs: number;\n /** Recommended priority fee in microlamports/CU (max p75 across hottest accounts) */\n recommended: number;\n /** Fee state: 0=low, 1=normal, 2=high, 3=extreme */\n state: number;\n /** True if data is stale (no recent samples) */\n isStale: boolean;\n /** Block utilization percentage (0-100) */\n blockUtilizationPct: number;\n /** Number of blocks in the observation window */\n blocksInWindow: number;\n /** Per-writable-account fee data */\n accounts: {\n /** Account public key (Base58) */\n pubkey: string;\n /** Total transactions touching this account */\n totalTxs: number;\n /** Active slots for this account */\n activeSlots: number;\n /** Total CU consumed */\n cuConsumed: number;\n /** Utilization percentage (0-100) of 12M CU limit */\n utilizationPct: number;\n /** Fee percentiles in microlamports/CU */\n p25: number;\n p50: number;\n p75: number;\n p90: number;\n /** Minimum non-zero fee observed */\n minNonzeroPrice: number;\n }[];\n /** Recent block mini-stats (v3) */\n recentBlocks: BlockMiniStats[];\n /** Fee trend direction (v3) */\n trend: TrendDirection;\n };\n}\n\n/**\n * Decoded block stats from binary message (v3)\n */\nexport interface BlockStatsMessage {\n type: 'block_stats';\n data: BlockStats;\n receivedAt: number;\n}\n\n/**\n * Decoded blockhash from binary message\n */\nexport interface BlockhashMessage {\n type: 'blockhash';\n data: {\n slot: number;\n timestampMs: number;\n blockhash: string;\n blockHeight: number;\n lastValidBlockHeight: number;\n isStale: boolean;\n };\n}\n\n/**\n * Decoded quote from binary message\n */\nexport interface QuoteMessage {\n type: 'quote';\n data: {\n topicId: string;\n timestampMs: number;\n sequence: number;\n inputMint: string;\n outputMint: string;\n inAmount: string;\n outAmount: string;\n priceImpactBps: number;\n contextSlot: number;\n algorithm: string;\n isImprovement: boolean;\n isCached: boolean;\n isStale: boolean;\n routePlan: unknown | null;\n };\n}\n\n/**\n * Decoded heartbeat from JSON message\n */\nexport interface HeartbeatMessage {\n type: 'heartbeat';\n data: {\n timestampMs: number;\n uptimeSecs: number;\n messagesSent: number;\n poolUpdatesSent: number;\n messagesDropped: number;\n poolUpdatesEnabled: boolean;\n subscribedChannels: string[];\n serverSequence: number;\n };\n}\n\n/**\n * Subscription confirmed message\n */\nexport interface SubscribedMessage {\n type: 'subscribed';\n data: {\n channelCount: number;\n channels: string[];\n poolCount: number;\n tokenPairCount: number;\n protocolCount: number;\n poolUpdatesEnabled: boolean;\n timestampMs: number;\n summary: string;\n format?: 'binary' | 'json';\n };\n}\n\n/**\n * Quote subscription confirmed message\n */\nexport interface QuoteSubscribedMessage {\n type: 'quote_subscribed';\n data: {\n topicId: string;\n inputMint: string;\n outputMint: string;\n amount: string;\n slippageBps: number;\n refreshIntervalMs: number;\n timestampMs: number;\n };\n}\n\n/**\n * Error message from server\n */\nexport interface ErrorMessage {\n type: 'error';\n data: {\n message: string;\n };\n}\n\n/**\n * Pong response message\n */\nexport interface PongMessage {\n type: 'pong';\n data: {\n timestampMs: number;\n };\n}\n\n/**\n * Union of all decoded message types\n */\nexport type DecodedMessage =\n | PoolUpdateMessage\n | FeeMarketMessage\n | BlockStatsMessage\n | BlockhashMessage\n | QuoteMessage\n | HeartbeatMessage\n | SubscribedMessage\n | QuoteSubscribedMessage\n | ErrorMessage\n | PongMessage;\n","/**\n * Binary message decoder for K256 WebSocket protocol\n * \n * Decodes binary messages from K2 server into typed JavaScript objects.\n * Supports both single messages and batched pool updates.\n * \n * Wire format: [1 byte MessageType][N bytes Payload]\n */\n\nimport { base58Encode } from '../utils/base58';\nimport type { BlockMiniStats, TrendDirection } from '../types';\nimport { MessageType, type DecodedMessage, type PoolUpdateMessage, type FeeMarketMessage } from './types';\n\n/**\n * Decode a binary WebSocket message from K2\n * \n * @param data - Raw binary data from WebSocket\n * @returns Decoded message or null if unrecognized type\n * \n * @example\n * ```typescript\n * ws.onmessage = (event) => {\n * if (event.data instanceof ArrayBuffer) {\n * const message = decodeMessage(event.data);\n * if (message?.type === 'pool_update') {\n * console.log(message.data.poolAddress);\n * }\n * }\n * };\n * ```\n */\nexport function decodeMessage(data: ArrayBuffer): DecodedMessage | null {\n const view = new DataView(data);\n if (data.byteLength < 1) return null;\n\n const msgType = view.getUint8(0);\n const payload = data.slice(1);\n const payloadView = new DataView(payload);\n\n switch (msgType) {\n case MessageType.Subscribed:\n case MessageType.QuoteSubscribed:\n case MessageType.Heartbeat: {\n // JSON payload\n const decoder = new TextDecoder();\n const text = decoder.decode(payload);\n try {\n let type: string;\n if (msgType === MessageType.QuoteSubscribed) {\n type = 'quote_subscribed';\n } else if (msgType === MessageType.Heartbeat) {\n type = 'heartbeat';\n } else {\n type = 'subscribed';\n }\n return {\n type,\n data: JSON.parse(text),\n } as DecodedMessage;\n } catch {\n return { type: 'error', data: { message: text } };\n }\n }\n\n case MessageType.Error: {\n // UTF-8 string payload\n const decoder = new TextDecoder();\n const text = decoder.decode(payload);\n return { type: 'error', data: { message: text } };\n }\n\n case MessageType.PriorityFees: {\n // FeeMarketWire bincode layout (per-writable-account model):\n // Header (42 bytes):\n // Offset 0: slot: u64 (8 bytes)\n // Offset 8: timestamp_ms: u64 (8 bytes)\n // Offset 16: recommended: u64 (8 bytes)\n // Offset 24: state: u8 (1 byte)\n // Offset 25: is_stale: bool (1 byte)\n // Offset 26: block_utilization_pct: f32 (4 bytes)\n // Offset 30: blocks_in_window: u32 (4 bytes)\n // Offset 34: account_count: u64 (8 bytes) [bincode Vec length]\n // Per account (92 bytes each):\n // pubkey: [u8; 32], total_txs: u32, active_slots: u32,\n // cu_consumed: u64, utilization_pct: f32,\n // p25: u64, p50: u64, p75: u64, p90: u64, min_nonzero_price: u64\n if (payload.byteLength < 42) return null;\n\n const slot = Number(payloadView.getBigUint64(0, true));\n const timestampMs = Number(payloadView.getBigUint64(8, true));\n const recommended = Number(payloadView.getBigUint64(16, true));\n const state = payloadView.getUint8(24);\n const isStale = payloadView.getUint8(25) !== 0;\n const blockUtilizationPct = payloadView.getFloat32(26, true);\n const blocksInWindow = payloadView.getUint32(30, true);\n const accountCount = Number(payloadView.getBigUint64(34, true));\n\n const accounts: FeeMarketMessage['data']['accounts'] = [];\n let offset = 42;\n for (let i = 0; i < accountCount && offset + 92 <= payload.byteLength; i++) {\n const pubkeyBytes = new Uint8Array(payload, offset, 32);\n const pubkey = base58Encode(pubkeyBytes);\n const totalTxs = payloadView.getUint32(offset + 32, true);\n const activeSlots = payloadView.getUint32(offset + 36, true);\n const cuConsumed = Number(payloadView.getBigUint64(offset + 40, true));\n const utilizationPct = payloadView.getFloat32(offset + 48, true);\n const p25 = Number(payloadView.getBigUint64(offset + 52, true));\n const p50 = Number(payloadView.getBigUint64(offset + 60, true));\n const p75 = Number(payloadView.getBigUint64(offset + 68, true));\n const p90 = Number(payloadView.getBigUint64(offset + 76, true));\n const minNonzeroPrice = Number(payloadView.getBigUint64(offset + 84, true));\n\n accounts.push({\n pubkey, totalTxs, activeSlots, cuConsumed, utilizationPct,\n p25, p50, p75, p90, minNonzeroPrice,\n });\n offset += 92;\n }\n\n // Decode recent_blocks (Vec<BlockMiniStats>) — v3\n const recentBlocksCount = Number(payloadView.getBigUint64(offset, true));\n offset += 8;\n const recentBlocks: BlockMiniStats[] = [];\n for (let i = 0; i < recentBlocksCount; i++) {\n const rbSlot = Number(payloadView.getBigUint64(offset, true)); offset += 8;\n const rbCuConsumed = Number(payloadView.getBigUint64(offset, true)); offset += 8;\n const rbTxCount = payloadView.getUint32(offset, true); offset += 4;\n const rbUtilizationPct = payloadView.getFloat32(offset, true); offset += 4;\n const rbAvgCuPrice = Number(payloadView.getBigUint64(offset, true)); offset += 8;\n recentBlocks.push({ slot: rbSlot, cuConsumed: rbCuConsumed, txCount: rbTxCount, utilizationPct: rbUtilizationPct, avgCuPrice: rbAvgCuPrice });\n }\n\n // Decode trend (u8) — v3\n const trendByte = payloadView.getUint8(offset); offset += 1;\n const trend: TrendDirection = trendByte === 0 ? 'rising' : trendByte === 1 ? 'falling' : 'stable';\n\n return {\n type: 'fee_market',\n data: {\n slot, timestampMs, recommended, state, isStale,\n blockUtilizationPct, blocksInWindow, accounts,\n recentBlocks, trend,\n },\n } as FeeMarketMessage;\n }\n\n case MessageType.Blockhash: {\n // BlockhashWire bincode layout\n if (payload.byteLength < 65) return null;\n\n const slot = Number(payloadView.getBigUint64(0, true));\n const timestampMs = Number(payloadView.getBigUint64(8, true));\n const blockhashBytes = new Uint8Array(payload, 16, 32);\n const blockHeight = Number(payloadView.getBigUint64(48, true));\n const lastValidBlockHeight = Number(payloadView.getBigUint64(56, true));\n const isStale = payloadView.getUint8(64) !== 0;\n\n return {\n type: 'blockhash',\n data: {\n slot,\n timestampMs,\n blockhash: base58Encode(blockhashBytes),\n blockHeight,\n lastValidBlockHeight,\n isStale,\n },\n };\n }\n\n case MessageType.PoolUpdate: {\n return decodePoolUpdate(payload, payloadView);\n }\n\n case MessageType.PoolUpdateBatch: {\n // Batched pool updates: [u16 count][u32 len][payload]...\n // Returns array of individual updates\n if (payload.byteLength < 2) return null;\n\n const updates = decodePoolUpdateBatch(payload);\n if (updates.length === 0) return null;\n\n // Return first update for single-message interface\n // Use decodePoolUpdateBatch() directly for batch handling\n return updates[0];\n }\n\n case MessageType.Quote: {\n return decodeQuote(payload, payloadView);\n }\n\n case MessageType.Pong: {\n if (payload.byteLength < 8) return null;\n return {\n type: 'pong',\n data: {\n timestampMs: Number(payloadView.getBigUint64(0, true)),\n },\n };\n }\n\n case MessageType.BlockStats: {\n // BlockStats (0x0F) — v3\n // Layout: slot(u64) + cu_consumed(u64) + execution_cu(u64) + cu_limit(u64) + cu_remaining(u64)\n // + utilization_pct(f32) + tx_count(u32) + avg_cu_per_tx(u32) + avg_cu_price(u64)\n // + min_cu_price(u64) + max_cu_price(u64) + timestamp_ms(u64)\n let offset = 0; // payload already has type byte stripped\n const slot = Number(payloadView.getBigUint64(offset, true)); offset += 8;\n const cuConsumed = Number(payloadView.getBigUint64(offset, true)); offset += 8;\n const executionCu = Number(payloadView.getBigUint64(offset, true)); offset += 8;\n const cuLimit = Number(payloadView.getBigUint64(offset, true)); offset += 8;\n const cuRemaining = Number(payloadView.getBigUint64(offset, true)); offset += 8;\n const utilizationPct = payloadView.getFloat32(offset, true); offset += 4;\n const txCount = payloadView.getUint32(offset, true); offset += 4;\n const avgCuPerTx = payloadView.getUint32(offset, true); offset += 4;\n const avgCuPrice = Number(payloadView.getBigUint64(offset, true)); offset += 8;\n const minCuPrice = Number(payloadView.getBigUint64(offset, true)); offset += 8;\n const maxCuPrice = Number(payloadView.getBigUint64(offset, true)); offset += 8;\n const timestampMs = Number(payloadView.getBigUint64(offset, true)); offset += 8;\n\n return {\n type: 'block_stats',\n data: {\n slot, cuConsumed, executionCu, cuLimit, cuRemaining, utilizationPct,\n txCount, avgCuPerTx, avgCuPrice, minCuPrice, maxCuPrice, timestampMs,\n },\n receivedAt: Date.now(),\n };\n }\n\n default:\n return null;\n }\n}\n\n/**\n * Decode a batch of pool updates\n * \n * Use this when you need to process all updates in a batch.\n * For high-throughput scenarios, batches can contain 50-200 updates.\n * \n * @param data - Raw payload (without the 0x0E type prefix)\n * @returns Array of decoded pool updates\n * \n * @example\n * ```typescript\n * if (msgType === MessageType.PoolUpdateBatch) {\n * const updates = decodePoolUpdateBatch(payload);\n * for (const update of updates) {\n * console.log(update.data.poolAddress);\n * }\n * }\n * ```\n */\nexport function decodePoolUpdateBatch(payload: ArrayBuffer): PoolUpdateMessage[] {\n const view = new DataView(payload);\n if (payload.byteLength < 2) return [];\n\n const count = view.getUint16(0, true);\n const updates: PoolUpdateMessage[] = [];\n let offset = 2;\n\n for (let i = 0; i < count && offset + 4 <= payload.byteLength; i++) {\n const payloadLen = view.getUint32(offset, true);\n offset += 4;\n\n if (offset + payloadLen > payload.byteLength) break;\n\n // Decode individual pool update (payload is WITHOUT the 0x01 type prefix)\n const updatePayload = payload.slice(offset, offset + payloadLen);\n const updateView = new DataView(updatePayload);\n const decoded = decodePoolUpdate(updatePayload, updateView);\n\n if (decoded) {\n updates.push(decoded);\n }\n\n offset += payloadLen;\n }\n\n return updates;\n}\n\n/**\n * Decode a single pool update payload\n */\nfunction decodePoolUpdate(payload: ArrayBuffer, payloadView: DataView): PoolUpdateMessage | null {\n if (payload.byteLength < 50) return null;\n\n try {\n let offset = 0;\n const decoder = new TextDecoder();\n\n // Skip serialized_state (Bytes: u64 len + bytes)\n const serializedStateLen = Number(payloadView.getBigUint64(offset, true));\n offset += 8 + serializedStateLen;\n\n if (payload.byteLength < offset + 24) return null;\n\n // sequence (u64)\n const sequence = Number(payloadView.getBigUint64(offset, true));\n offset += 8;\n\n // slot (u64)\n const slot = Number(payloadView.getBigUint64(offset, true));\n offset += 8;\n\n // write_version (u64)\n const writeVersion = Number(payloadView.getBigUint64(offset, true));\n offset += 8;\n\n // protocol_name (String: u64 len + utf8 bytes)\n const protocolLen = Number(payloadView.getBigUint64(offset, true));\n offset += 8;\n const protocolBytes = new Uint8Array(payload, offset, protocolLen);\n const protocol = decoder.decode(protocolBytes);\n offset += protocolLen;\n\n // pool_address ([u8; 32])\n const poolAddr = new Uint8Array(payload, offset, 32);\n offset += 32;\n\n // all_token_mints (Vec<[u8; 32]>)\n const tokenMintCount = Number(payloadView.getBigUint64(offset, true));\n offset += 8;\n const tokenMints: string[] = [];\n for (let i = 0; i < tokenMintCount && offset + 32 <= payload.byteLength; i++) {\n const mint = new Uint8Array(payload, offset, 32);\n tokenMints.push(base58Encode(mint));\n offset += 32;\n }\n\n // all_token_balances (Vec<u64>)\n const balanceCount = Number(payloadView.getBigUint64(offset, true));\n offset += 8;\n const tokenBalances: string[] = [];\n for (let i = 0; i < balanceCount && offset + 8 <= payload.byteLength; i++) {\n tokenBalances.push(payloadView.getBigUint64(offset, true).toString());\n offset += 8;\n }\n\n // all_token_decimals (Vec<i32>)\n const decimalsCount = Number(payloadView.getBigUint64(offset, true));\n offset += 8;\n const tokenDecimals: number[] = [];\n for (let i = 0; i < decimalsCount && offset + 4 <= payload.byteLength; i++) {\n tokenDecimals.push(payloadView.getInt32(offset, true));\n offset += 4;\n }\n\n // best_bid and best_ask (Option<OrderLevel>) - skip for now\n // They use bincode Option encoding: 0 = None, 1 + data = Some\n\n return {\n type: 'pool_update',\n data: {\n sequence,\n slot,\n writeVersion,\n protocol,\n poolAddress: base58Encode(poolAddr),\n tokenMints,\n tokenBalances,\n tokenDecimals,\n },\n };\n } catch {\n return null;\n }\n}\n\n/**\n * Decode a quote message payload\n */\nfunction decodeQuote(payload: ArrayBuffer, payloadView: DataView): DecodedMessage | null {\n if (payload.byteLength < 8) return null;\n\n try {\n let offset = 0;\n const decoder = new TextDecoder();\n\n // Helper to read bincode String (u64 len + UTF-8 bytes)\n const readString = (): string => {\n const len = Number(payloadView.getBigUint64(offset, true));\n offset += 8;\n const bytes = new Uint8Array(payload, offset, len);\n offset += len;\n return decoder.decode(bytes);\n };\n\n // topic_id (String)\n const topicId = readString();\n\n // timestamp_ms (u64)\n const timestampMs = Number(payloadView.getBigUint64(offset, true));\n offset += 8;\n\n // sequence (u64)\n const sequence = Number(payloadView.getBigUint64(offset, true));\n offset += 8;\n\n // input_mint ([u8; 32])\n const inputMintBytes = new Uint8Array(payload, offset, 32);\n offset += 32;\n\n // output_mint ([u8; 32])\n const outputMintBytes = new Uint8Array(payload, offset, 32);\n offset += 32;\n\n // in_amount (u64)\n const inAmount = payloadView.getBigUint64(offset, true).toString();\n offset += 8;\n\n // out_amount (u64)\n const outAmount = payloadView.getBigUint64(offset, true).toString();\n offset += 8;\n\n // price_impact_bps (i32)\n const priceImpactBps = payloadView.getInt32(offset, true);\n offset += 4;\n\n // context_slot (u64)\n const contextSlot = Number(payloadView.getBigUint64(offset, true));\n offset += 8;\n\n // algorithm (String)\n const algorithm = readString();\n\n // is_improvement (bool)\n const isImprovement = payloadView.getUint8(offset) !== 0;\n offset += 1;\n\n // is_cached (bool)\n const isCached = payloadView.getUint8(offset) !== 0;\n offset += 1;\n\n // is_stale (bool)\n const isStale = payloadView.getUint8(offset) !== 0;\n offset += 1;\n\n // route_plan_json (Vec<u8> - bincode: u64 len + bytes)\n let routePlan = null;\n if (offset + 8 <= payload.byteLength) {\n const routePlanLen = Number(payloadView.getBigUint64(offset, true));\n offset += 8;\n if (routePlanLen > 0 && offset + routePlanLen <= payload.byteLength) {\n const routePlanBytes = new Uint8Array(payload, offset, routePlanLen);\n try {\n routePlan = JSON.parse(decoder.decode(routePlanBytes));\n } catch {\n // Route plan JSON parsing failed, leave as null\n }\n }\n }\n\n return {\n type: 'quote',\n data: {\n topicId,\n timestampMs,\n sequence,\n inputMint: base58Encode(inputMintBytes),\n outputMint: base58Encode(outputMintBytes),\n inAmount,\n outAmount,\n priceImpactBps,\n contextSlot,\n algorithm,\n isImprovement,\n isCached,\n isStale,\n routePlan,\n },\n };\n } catch {\n return null;\n }\n}\n","/**\n * K256 WebSocket Client\n * \n * Production-grade WebSocket client with:\n * - Automatic reconnection with exponential backoff\n * - Binary and JSON mode support\n * - Ping/pong keepalive\n * - Heartbeat monitoring\n * - Full error handling with RFC 6455 close codes\n * - Type-safe event emitters\n * \n * @example\n * ```typescript\n * const client = new K256WebSocketClient({\n * apiKey: 'your-api-key',\n * mode: 'binary', // or 'json'\n * onPoolUpdate: (update) => console.log(update),\n * onError: (error) => console.error(error),\n * });\n * \n * await client.connect();\n * client.subscribe({ channels: ['pools', 'priority_fees'] });\n * ```\n */\n\nimport { decodeMessage, decodePoolUpdateBatch } from './decoder';\nimport { MessageType, type DecodedMessage, type PoolUpdateMessage, type BlockStatsMessage } from './types';\n\n/**\n * RFC 6455 WebSocket Close Codes\n * @see https://www.rfc-editor.org/rfc/rfc6455#section-7.4.1\n */\nexport const CloseCode = {\n /** 1000: Normal closure - connection completed successfully */\n NORMAL: 1000,\n /** 1001: Going away - server/client shutting down. Client: reconnect immediately */\n GOING_AWAY: 1001,\n /** 1002: Protocol error - invalid frame format. Client: fix client code */\n PROTOCOL_ERROR: 1002,\n /** 1003: Unsupported data - message type not supported */\n UNSUPPORTED_DATA: 1003,\n /** 1005: No status received (reserved, not sent over wire) */\n NO_STATUS: 1005,\n /** 1006: Abnormal closure - connection dropped without close frame */\n ABNORMAL: 1006,\n /** 1007: Invalid payload - malformed UTF-8 or data. Client: fix message format */\n INVALID_PAYLOAD: 1007,\n /** 1008: Policy violation - rate limit exceeded, auth failed. Client: check credentials/limits */\n POLICY_VIOLATION: 1008,\n /** 1009: Message too big - message exceeds size limits */\n MESSAGE_TOO_BIG: 1009,\n /** 1010: Missing extension - required extension not negotiated */\n MISSING_EXTENSION: 1010,\n /** 1011: Internal error - unexpected server error. Client: retry with backoff */\n INTERNAL_ERROR: 1011,\n /** 1012: Service restart - server is restarting. Client: reconnect after brief delay */\n SERVICE_RESTART: 1012,\n /** 1013: Try again later - server overloaded. Client: retry with backoff */\n TRY_AGAIN_LATER: 1013,\n /** 1014: Bad gateway - upstream connection failed */\n BAD_GATEWAY: 1014,\n /** 1015: TLS handshake failed (reserved, not sent over wire) */\n TLS_HANDSHAKE: 1015,\n} as const;\n\nexport type CloseCodeValue = typeof CloseCode[keyof typeof CloseCode];\n\n/**\n * Connection state\n */\nexport type ConnectionState = \n | 'disconnected'\n | 'connecting'\n | 'connected'\n | 'reconnecting'\n | 'closed';\n\n/**\n * Subscribe request options\n */\nexport interface SubscribeOptions {\n /** Channels to subscribe to: 'pools', 'priority_fees', 'blockhash' */\n channels: string[];\n /** Pool address filters (optional) */\n pools?: string[];\n /** Protocol filters (optional): 'RaydiumAmm', 'Whirlpool', 'MeteoraDlmm', etc. */\n protocols?: string[];\n /** Token pair filters (optional): [['mint1', 'mint2'], ...] */\n tokenPairs?: string[][];\n}\n\n/**\n * Quote subscription options\n */\nexport interface SubscribeQuoteOptions {\n /** Input token mint address */\n inputMint: string;\n /** Output token mint address */\n outputMint: string;\n /** Amount in base units (lamports/smallest unit) */\n amount: number | string;\n /** Slippage tolerance in basis points */\n slippageBps: number;\n /** How often to refresh the quote (ms) */\n refreshIntervalMs?: number;\n}\n\n/**\n * WebSocket client configuration\n */\nexport interface K256WebSocketClientConfig {\n /** API key for authentication */\n apiKey: string;\n /** Gateway URL (default: wss://gateway.k256.xyz/v1/ws) */\n url?: string;\n /** Message format: 'binary' (default, efficient) or 'json' (debugging) */\n mode?: 'binary' | 'json';\n \n // Reconnection settings\n /** Enable automatic reconnection (default: true) */\n autoReconnect?: boolean;\n /** Initial reconnect delay in ms (default: 1000) */\n reconnectDelayMs?: number;\n /** Max reconnect delay in ms (default: 30000) */\n maxReconnectDelayMs?: number;\n /** Max reconnect attempts (default: Infinity) */\n maxReconnectAttempts?: number;\n \n // Keepalive settings\n /** Ping interval in ms (default: 30000) */\n pingIntervalMs?: number;\n /** Pong timeout in ms - disconnect if no pong (default: 10000) */\n pongTimeoutMs?: number;\n /** Heartbeat timeout in ms - warn if no heartbeat (default: 15000) */\n heartbeatTimeoutMs?: number;\n \n // Event callbacks\n /** Called when connection state changes */\n onStateChange?: (state: ConnectionState, prevState: ConnectionState) => void;\n /** Called on successful connection */\n onConnect?: () => void;\n /** Called on disconnection */\n onDisconnect?: (code: number, reason: string, wasClean: boolean) => void;\n /** Called on reconnection attempt */\n onReconnecting?: (attempt: number, delayMs: number) => void;\n /** Called on any error */\n onError?: (error: K256WebSocketError) => void;\n \n // Message callbacks\n /** Called on subscription confirmed */\n onSubscribed?: (data: DecodedMessage & { type: 'subscribed' }) => void;\n /** Called on pool update */\n onPoolUpdate?: (update: PoolUpdateMessage) => void;\n /** Called on batched pool updates (for efficiency) */\n onPoolUpdateBatch?: (updates: PoolUpdateMessage[]) => void;\n /** Called on fee market update (per-writable-account fees) */\n onFeeMarket?: (data: DecodedMessage & { type: 'fee_market' }) => void;\n /** Called on block stats update (v3) */\n onBlockStats?: (message: BlockStatsMessage) => void;\n /** Called on blockhash update */\n onBlockhash?: (data: DecodedMessage & { type: 'blockhash' }) => void;\n /** Called on quote update */\n onQuote?: (data: DecodedMessage & { type: 'quote' }) => void;\n /** Called on quote subscription confirmed */\n onQuoteSubscribed?: (data: DecodedMessage & { type: 'quote_subscribed' }) => void;\n /** Called on heartbeat */\n onHeartbeat?: (data: DecodedMessage & { type: 'heartbeat' }) => void;\n /** Called on pong response (with round-trip latency) */\n onPong?: (latencyMs: number) => void;\n /** Called on any message (raw) */\n onMessage?: (message: DecodedMessage) => void;\n /** Called on raw binary message (for debugging) */\n onRawMessage?: (data: ArrayBuffer | string) => void;\n}\n\n/**\n * Error types for K256 WebSocket\n */\nexport type K256ErrorCode =\n | 'CONNECTION_FAILED'\n | 'CONNECTION_LOST'\n | 'PROTOCOL_ERROR'\n | 'AUTH_FAILED'\n | 'RATE_LIMITED'\n | 'SERVER_ERROR'\n | 'PING_TIMEOUT'\n | 'HEARTBEAT_TIMEOUT'\n | 'INVALID_MESSAGE'\n | 'RECONNECT_FAILED';\n\n/**\n * WebSocket error with context\n */\nexport class K256WebSocketError extends Error {\n constructor(\n public readonly code: K256ErrorCode,\n message: string,\n public readonly closeCode?: number,\n public readonly closeReason?: string,\n public readonly cause?: unknown\n ) {\n super(message);\n this.name = 'K256WebSocketError';\n }\n\n /** Check if error is recoverable (should trigger reconnect) */\n get isRecoverable(): boolean {\n switch (this.code) {\n case 'AUTH_FAILED':\n case 'RATE_LIMITED':\n return false;\n default:\n return true;\n }\n }\n\n /** Check if error is an auth failure */\n get isAuthError(): boolean {\n return this.code === 'AUTH_FAILED' || this.closeCode === CloseCode.POLICY_VIOLATION;\n }\n}\n\n/**\n * Production-grade K256 WebSocket Client\n */\nexport class K256WebSocketClient {\n private ws: WebSocket | null = null;\n private config: Required<Omit<K256WebSocketClientConfig, \n 'onStateChange' | 'onConnect' | 'onDisconnect' | 'onReconnecting' | 'onError' |\n 'onSubscribed' | 'onPoolUpdate' | 'onPoolUpdateBatch' | 'onFeeMarket' | 'onBlockStats' |\n 'onBlockhash' | 'onQuote' | 'onQuoteSubscribed' | 'onHeartbeat' | 'onPong' | \n 'onMessage' | 'onRawMessage'\n >> & K256WebSocketClientConfig;\n \n private _state: ConnectionState = 'disconnected';\n private reconnectAttempts = 0;\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n private pingTimer: ReturnType<typeof setInterval> | null = null;\n private pongTimer: ReturnType<typeof setTimeout> | null = null;\n private heartbeatTimer: ReturnType<typeof setTimeout> | null = null;\n private lastPingTime = 0;\n private lastHeartbeatTime = 0;\n private pendingSubscription: SubscribeOptions | null = null;\n private pendingQuoteSubscription: SubscribeQuoteOptions | null = null;\n private isIntentionallyClosed = false;\n\n /** Current connection state */\n get state(): ConnectionState {\n return this._state;\n }\n\n /** Whether currently connected */\n get isConnected(): boolean {\n return this._state === 'connected' && this.ws?.readyState === WebSocket.OPEN;\n }\n\n /** Time since last heartbeat (ms) or null if no heartbeat received */\n get timeSinceHeartbeat(): number | null {\n return this.lastHeartbeatTime ? Date.now() - this.lastHeartbeatTime : null;\n }\n\n /** Current reconnect attempt number */\n get currentReconnectAttempt(): number {\n return this.reconnectAttempts;\n }\n\n constructor(config: K256WebSocketClientConfig) {\n this.config = {\n url: 'wss://gateway.k256.xyz/v1/ws',\n mode: 'binary',\n autoReconnect: true,\n reconnectDelayMs: 1000,\n maxReconnectDelayMs: 30000,\n maxReconnectAttempts: Infinity,\n pingIntervalMs: 30000,\n pongTimeoutMs: 10000,\n heartbeatTimeoutMs: 15000,\n ...config,\n };\n }\n\n /**\n * Connect to the WebSocket server\n * @returns Promise that resolves when connected\n */\n async connect(): Promise<void> {\n if (this._state === 'connected' || this._state === 'connecting') {\n return;\n }\n\n this.isIntentionallyClosed = false;\n return this.doConnect();\n }\n\n /**\n * Disconnect from the WebSocket server\n * @param code - Close code (default: 1000 NORMAL)\n * @param reason - Close reason\n */\n disconnect(code: number = CloseCode.NORMAL, reason: string = 'Client disconnect'): void {\n this.isIntentionallyClosed = true;\n this.cleanup();\n \n if (this.ws) {\n try {\n this.ws.close(code, reason);\n } catch {\n // Ignore errors during close\n }\n this.ws = null;\n }\n \n this.setState('closed');\n }\n\n /**\n * Subscribe to channels\n */\n subscribe(options: SubscribeOptions): void {\n this.pendingSubscription = options;\n \n if (!this.isConnected) {\n // Will be sent on connect\n return;\n }\n\n this.sendSubscription(options);\n }\n\n /**\n * Subscribe to a quote stream\n */\n subscribeQuote(options: SubscribeQuoteOptions): void {\n this.pendingQuoteSubscription = options;\n \n if (!this.isConnected) {\n return;\n }\n\n this.sendQuoteSubscription(options);\n }\n\n /**\n * Unsubscribe from a quote stream\n * @param topicId - Topic ID from quote_subscribed response\n */\n unsubscribeQuote(topicId: string): void {\n if (!this.isConnected) return;\n \n const msg = JSON.stringify({ type: 'unsubscribe_quote', topicId });\n this.ws?.send(msg);\n }\n\n /**\n * Unsubscribe from all channels\n */\n unsubscribe(): void {\n this.pendingSubscription = null;\n this.pendingQuoteSubscription = null;\n \n if (!this.isConnected) return;\n \n this.ws?.send(JSON.stringify({ type: 'unsubscribe' }));\n }\n\n /**\n * Send a ping to measure latency\n */\n ping(): void {\n if (!this.isConnected) return;\n \n // Binary ping: [0x0B]\n const pingData = new Uint8Array([MessageType.Ping]);\n this.lastPingTime = Date.now();\n this.ws?.send(pingData);\n \n // Start pong timeout\n this.startPongTimeout();\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Private methods\n // ─────────────────────────────────────────────────────────────────────────────\n\n private async doConnect(): Promise<void> {\n return new Promise((resolve, reject) => {\n this.setState('connecting');\n\n const url = new URL(this.config.url);\n url.searchParams.set('apiKey', this.config.apiKey);\n\n try {\n this.ws = new WebSocket(url.toString());\n \n // Set binary mode\n if (this.config.mode === 'binary') {\n this.ws.binaryType = 'arraybuffer';\n }\n\n // Connection timeout\n const connectTimeout = setTimeout(() => {\n if (this.ws?.readyState !== WebSocket.OPEN) {\n this.ws?.close();\n const error = new K256WebSocketError(\n 'CONNECTION_FAILED',\n 'Connection timeout'\n );\n this.handleError(error);\n reject(error);\n }\n }, 10000);\n\n this.ws.onopen = () => {\n clearTimeout(connectTimeout);\n this.setState('connected');\n this.reconnectAttempts = 0;\n this.lastHeartbeatTime = Date.now();\n \n // Start keepalive\n this.startPingInterval();\n this.startHeartbeatTimeout();\n \n // Restore subscriptions\n if (this.pendingSubscription) {\n this.sendSubscription(this.pendingSubscription);\n }\n if (this.pendingQuoteSubscription) {\n this.sendQuoteSubscription(this.pendingQuoteSubscription);\n }\n \n this.config.onConnect?.();\n resolve();\n };\n\n this.ws.onclose = (event) => {\n clearTimeout(connectTimeout);\n this.cleanup();\n \n const wasClean = event.wasClean;\n const code = event.code;\n const reason = event.reason || this.getCloseReason(code);\n\n this.config.onDisconnect?.(code, reason, wasClean);\n\n // Determine if we should reconnect\n if (!this.isIntentionallyClosed && this.config.autoReconnect) {\n if (this.shouldReconnect(code)) {\n this.scheduleReconnect();\n } else {\n const error = new K256WebSocketError(\n this.getErrorCodeFromClose(code),\n reason,\n code,\n reason\n );\n this.handleError(error);\n this.setState('closed');\n }\n } else {\n this.setState('disconnected');\n }\n };\n\n this.ws.onerror = () => {\n // WebSocket errors don't provide details - wait for onclose\n };\n\n this.ws.onmessage = (event) => {\n this.handleMessage(event.data);\n };\n\n } catch (error) {\n const wsError = new K256WebSocketError(\n 'CONNECTION_FAILED',\n 'Failed to create WebSocket',\n undefined,\n undefined,\n error\n );\n this.handleError(wsError);\n reject(wsError);\n }\n });\n }\n\n private handleMessage(data: ArrayBuffer | string): void {\n this.config.onRawMessage?.(data);\n\n try {\n let decoded: DecodedMessage | null = null;\n\n if (data instanceof ArrayBuffer) {\n // Binary message\n decoded = decodeMessage(data);\n \n // Handle batch specially\n if (decoded === null) {\n // Check if it's a batch\n const view = new DataView(data);\n if (view.byteLength > 0 && view.getUint8(0) === MessageType.PoolUpdateBatch) {\n const payload = data.slice(1);\n const updates = decodePoolUpdateBatch(payload);\n \n // Emit batch callback\n if (this.config.onPoolUpdateBatch) {\n this.config.onPoolUpdateBatch(updates);\n }\n \n // Also emit individual updates\n for (const update of updates) {\n this.config.onPoolUpdate?.(update);\n this.config.onMessage?.(update);\n }\n return;\n }\n }\n } else {\n // JSON string (when mode is 'json')\n const parsed = JSON.parse(data);\n decoded = {\n type: parsed.type,\n data: parsed.data || parsed,\n } as DecodedMessage;\n }\n\n if (!decoded) {\n return;\n }\n\n // Emit message callback\n this.config.onMessage?.(decoded);\n\n // Emit type-specific callbacks\n switch (decoded.type) {\n case 'subscribed':\n this.config.onSubscribed?.(decoded as DecodedMessage & { type: 'subscribed' });\n break;\n case 'pool_update':\n this.config.onPoolUpdate?.(decoded as PoolUpdateMessage);\n break;\n case 'fee_market':\n this.config.onFeeMarket?.(decoded as DecodedMessage & { type: 'fee_market' });\n break;\n case 'block_stats':\n this.config.onBlockStats?.(decoded as BlockStatsMessage);\n break;\n case 'blockhash':\n this.config.onBlockhash?.(decoded as DecodedMessage & { type: 'blockhash' });\n break;\n case 'quote':\n this.config.onQuote?.(decoded as DecodedMessage & { type: 'quote' });\n break;\n case 'quote_subscribed':\n this.config.onQuoteSubscribed?.(decoded as DecodedMessage & { type: 'quote_subscribed' });\n break;\n case 'heartbeat':\n this.lastHeartbeatTime = Date.now();\n this.resetHeartbeatTimeout();\n this.config.onHeartbeat?.(decoded as DecodedMessage & { type: 'heartbeat' });\n break;\n case 'pong':\n this.clearPongTimeout();\n const latencyMs = this.lastPingTime ? Date.now() - this.lastPingTime : 0;\n this.config.onPong?.(latencyMs);\n break;\n case 'error':\n const errorData = (decoded as DecodedMessage & { type: 'error' }).data;\n const error = new K256WebSocketError(\n 'SERVER_ERROR',\n errorData.message\n );\n this.handleError(error);\n break;\n }\n } catch (error) {\n const wsError = new K256WebSocketError(\n 'INVALID_MESSAGE',\n 'Failed to decode message',\n undefined,\n undefined,\n error\n );\n this.handleError(wsError);\n }\n }\n\n private sendSubscription(options: SubscribeOptions): void {\n const msg: Record<string, unknown> = {\n type: 'subscribe',\n channels: options.channels,\n };\n\n // Add format for JSON mode\n if (this.config.mode === 'json') {\n msg.format = 'json';\n }\n\n // Add filters\n if (options.pools?.length) {\n msg.pools = options.pools;\n }\n if (options.protocols?.length) {\n msg.protocols = options.protocols;\n }\n if (options.tokenPairs?.length) {\n msg.token_pairs = options.tokenPairs;\n }\n\n this.ws?.send(JSON.stringify(msg));\n }\n\n private sendQuoteSubscription(options: SubscribeQuoteOptions): void {\n const msg = {\n type: 'subscribe_quote',\n inputMint: options.inputMint,\n outputMint: options.outputMint,\n amount: typeof options.amount === 'string' ? parseInt(options.amount, 10) : options.amount,\n slippageBps: options.slippageBps,\n refreshIntervalMs: options.refreshIntervalMs ?? 1000,\n };\n\n this.ws?.send(JSON.stringify(msg));\n }\n\n private setState(state: ConnectionState): void {\n if (this._state !== state) {\n const prevState = this._state;\n this._state = state;\n this.config.onStateChange?.(state, prevState);\n }\n }\n\n private handleError(error: K256WebSocketError): void {\n this.config.onError?.(error);\n }\n\n private cleanup(): void {\n if (this.pingTimer) {\n clearInterval(this.pingTimer);\n this.pingTimer = null;\n }\n if (this.pongTimer) {\n clearTimeout(this.pongTimer);\n this.pongTimer = null;\n }\n if (this.heartbeatTimer) {\n clearTimeout(this.heartbeatTimer);\n this.heartbeatTimer = null;\n }\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n }\n\n private startPingInterval(): void {\n if (this.pingTimer) {\n clearInterval(this.pingTimer);\n }\n \n this.pingTimer = setInterval(() => {\n this.ping();\n }, this.config.pingIntervalMs);\n }\n\n private startPongTimeout(): void {\n this.clearPongTimeout();\n \n this.pongTimer = setTimeout(() => {\n const error = new K256WebSocketError(\n 'PING_TIMEOUT',\n 'Server did not respond to ping'\n );\n this.handleError(error);\n \n // Force reconnect\n this.ws?.close(CloseCode.GOING_AWAY, 'Ping timeout');\n }, this.config.pongTimeoutMs);\n }\n\n private clearPongTimeout(): void {\n if (this.pongTimer) {\n clearTimeout(this.pongTimer);\n this.pongTimer = null;\n }\n }\n\n private startHeartbeatTimeout(): void {\n this.resetHeartbeatTimeout();\n }\n\n private resetHeartbeatTimeout(): void {\n if (this.heartbeatTimer) {\n clearTimeout(this.heartbeatTimer);\n }\n \n this.heartbeatTimer = setTimeout(() => {\n const error = new K256WebSocketError(\n 'HEARTBEAT_TIMEOUT',\n 'No heartbeat received from server'\n );\n this.handleError(error);\n // Don't disconnect - heartbeat is informational\n }, this.config.heartbeatTimeoutMs);\n }\n\n private shouldReconnect(closeCode: number): boolean {\n // Don't reconnect on auth failures or policy violations\n if (closeCode === CloseCode.POLICY_VIOLATION) {\n return false;\n }\n \n // Check max attempts\n if (this.reconnectAttempts >= this.config.maxReconnectAttempts) {\n return false;\n }\n \n return true;\n }\n\n private scheduleReconnect(): void {\n this.setState('reconnecting');\n this.reconnectAttempts++;\n \n // Exponential backoff with jitter\n const baseDelay = Math.min(\n this.config.reconnectDelayMs * Math.pow(2, this.reconnectAttempts - 1),\n this.config.maxReconnectDelayMs\n );\n const jitter = Math.random() * 0.3 * baseDelay;\n const delay = Math.floor(baseDelay + jitter);\n \n this.config.onReconnecting?.(this.reconnectAttempts, delay);\n \n this.reconnectTimer = setTimeout(async () => {\n try {\n await this.doConnect();\n } catch {\n // Error already handled in doConnect\n }\n }, delay);\n }\n\n private getCloseReason(code: number): string {\n switch (code) {\n case CloseCode.NORMAL:\n return 'Normal closure';\n case CloseCode.GOING_AWAY:\n return 'Server shutting down';\n case CloseCode.PROTOCOL_ERROR:\n return 'Protocol error';\n case CloseCode.UNSUPPORTED_DATA:\n return 'Unsupported message type';\n case CloseCode.ABNORMAL:\n return 'Connection lost unexpectedly';\n case CloseCode.INVALID_PAYLOAD:\n return 'Invalid message data';\n case CloseCode.POLICY_VIOLATION:\n return 'Authentication failed or rate limited';\n case CloseCode.MESSAGE_TOO_BIG:\n return 'Message too large';\n case CloseCode.INTERNAL_ERROR:\n return 'Server error';\n case CloseCode.SERVICE_RESTART:\n return 'Server is restarting';\n case CloseCode.TRY_AGAIN_LATER:\n return 'Server overloaded';\n default:\n return `Unknown close code: ${code}`;\n }\n }\n\n private getErrorCodeFromClose(code: number): K256ErrorCode {\n switch (code) {\n case CloseCode.POLICY_VIOLATION:\n return 'AUTH_FAILED';\n case CloseCode.INTERNAL_ERROR:\n case CloseCode.SERVICE_RESTART:\n case CloseCode.TRY_AGAIN_LATER:\n return 'SERVER_ERROR';\n case CloseCode.PROTOCOL_ERROR:\n case CloseCode.UNSUPPORTED_DATA:\n case CloseCode.INVALID_PAYLOAD:\n return 'PROTOCOL_ERROR';\n default:\n return 'CONNECTION_LOST';\n }\n }\n}\n\nexport default K256WebSocketClient;\n","/**\n * Shared type definitions for K256 SDK\n *\n * These types are used across WebSocket and REST API modules.\n *\n * @module @k256/sdk/types\n */\n\n/**\n * Pool state from DEX\n */\nexport interface Pool {\n /** Pool address (Base58) */\n address: string;\n /** Protocol/DEX name */\n protocol: string;\n /** Token mints in the pool (Base58) */\n tokenMints: string[];\n /** Token balances (as strings for precision) */\n tokenBalances: string[];\n /** Token decimals */\n tokenDecimals: number[];\n}\n\n/**\n * Real-time pool state update\n */\nexport interface PoolUpdate extends Pool {\n /** Global sequence number (monotonically increasing) */\n sequence: number;\n /** Solana slot when updated */\n slot: number;\n /** Write version within slot */\n writeVersion: number;\n /** Best bid price/size (orderbook pools only) */\n bestBid?: OrderLevel;\n /** Best ask price/size (orderbook pools only) */\n bestAsk?: OrderLevel;\n}\n\n/**\n * Order book level (bid or ask)\n */\nexport interface OrderLevel {\n /** Price in base units (as string for precision) */\n price: string;\n /** Size in base units (as string for precision) */\n size: string;\n}\n\n/**\n * Token metadata\n */\nexport interface Token {\n /** Token mint address (Base58) */\n mint: string;\n /** Token symbol (e.g., \"SOL\", \"USDC\") */\n symbol: string;\n /** Token name */\n name: string;\n /** Decimal places */\n decimals: number;\n /** Logo URL (optional) */\n logoUri?: string;\n /** Coingecko ID (optional) */\n coingeckoId?: string;\n}\n\n/**\n * Swap quote from aggregator\n */\nexport interface Quote {\n /** Input token mint (Base58) */\n inputMint: string;\n /** Output token mint (Base58) */\n outputMint: string;\n /** Input amount (as string for precision) */\n inAmount: string;\n /** Output amount (as string for precision) */\n outAmount: string;\n /** Price impact in basis points */\n priceImpactBps: number;\n /** Slippage in basis points */\n slippageBps: number;\n /** Route plan (DEXes used) */\n routePlan: RoutePlanStep[];\n /** Context slot */\n contextSlot: number;\n /** Algorithm used for routing */\n algorithm: string;\n}\n\n/**\n * Step in a swap route\n */\nexport interface RoutePlanStep {\n /** DEX/protocol name */\n protocol: string;\n /** Pool address (Base58) */\n poolAddress: string;\n /** Input mint for this step */\n inputMint: string;\n /** Output mint for this step */\n outputMint: string;\n /** Percentage of input for this step (0-100) */\n percent: number;\n}\n\n/**\n * Mini block statistics (compact form used in FeeMarket.recentBlocks)\n */\nexport interface BlockMiniStats {\n slot: number\n cuConsumed: number\n txCount: number\n utilizationPct: number\n avgCuPrice: number\n}\n\n/**\n * Direction of the fee trend\n */\nexport type TrendDirection = 'rising' | 'falling' | 'stable'\n\n/**\n * Full block-level statistics (standalone message 0x0F)\n */\nexport interface BlockStats {\n slot: number\n cuConsumed: number\n executionCu: number\n cuLimit: number\n cuRemaining: number\n utilizationPct: number\n txCount: number\n avgCuPerTx: number\n avgCuPrice: number\n minCuPrice: number\n maxCuPrice: number\n timestampMs: number\n}\n\n/**\n * Per-writable-account fee data\n *\n * Solana's scheduler limits each writable account to 12M CU per block.\n * Fee pricing is per-account: the fee you pay should be\n * max(p75(account) for account in your writable accounts).\n */\nexport interface AccountFee {\n /** Account public key (Base58) */\n pubkey: string;\n /** Total transactions touching this account in the window */\n totalTxs: number;\n /** Number of slots where this account was active */\n activeSlots: number;\n /** Total CU consumed by transactions touching this account */\n cuConsumed: number;\n /** Account utilization percentage (0-100) of 12M CU limit */\n utilizationPct: number;\n /** 25th percentile fee in microlamports/CU */\n p25: number;\n /** 50th percentile fee in microlamports/CU */\n p50: number;\n /** 75th percentile fee in microlamports/CU */\n p75: number;\n /** 90th percentile fee in microlamports/CU */\n p90: number;\n /** Minimum non-zero fee observed */\n minNonzeroPrice: number;\n}\n\n/**\n * Fee market update (per-writable-account model)\n *\n * Replaces the old flat PriorityFees struct. Now provides per-account\n * fee data so clients can price transactions based on the specific\n * writable accounts they touch.\n */\nexport interface FeeMarket {\n /** Current slot */\n slot: number;\n /** Timestamp in milliseconds */\n timestampMs: number;\n /** Recommended fee in microlamports/CU (max p75 across hottest accounts) */\n recommended: number;\n /** Network state (0=low, 1=normal, 2=high, 3=extreme) */\n state: NetworkState;\n /** Whether data is stale */\n isStale: boolean;\n /** Block utilization percentage (0-100) */\n blockUtilizationPct: number;\n /** Number of blocks in the observation window */\n blocksInWindow: number;\n /** Per-account fee data */\n accounts: AccountFee[];\n /** Recent block mini-stats (v3) */\n recentBlocks: BlockMiniStats[];\n /** Fee trend direction (v3) */\n trend: TrendDirection;\n}\n\n/**\n * Network congestion state\n */\nexport enum NetworkState {\n Low = 0,\n Normal = 1,\n High = 2,\n Congested = 3,\n}\n\n/**\n * Recent blockhash for transactions\n */\nexport interface Blockhash {\n /** Slot of blockhash */\n slot: number;\n /** Timestamp in milliseconds */\n timestampMs: number;\n /** Recent blockhash (Base58) */\n blockhash: string;\n /** Block height */\n blockHeight: number;\n /** Last valid block height for transactions */\n lastValidBlockHeight: number;\n /** Whether data is stale */\n isStale: boolean;\n}\n\n/**\n * WebSocket connection heartbeat\n */\nexport interface Heartbeat {\n /** Server timestamp in milliseconds */\n timestampMs: number;\n /** Connection uptime in seconds */\n uptimeSecs: number;\n /** Total messages sent */\n messagesSent: number;\n /** Pool updates sent */\n poolUpdatesSent: number;\n /** Messages dropped (slow client) */\n messagesDropped: number;\n /** Whether pool updates are enabled */\n poolUpdatesEnabled: boolean;\n /** Subscribed channels */\n subscribedChannels: string[];\n /** Server sequence number */\n serverSequence: number;\n}\n\n/**\n * Subscribe request for WebSocket\n */\nexport interface SubscribeRequest {\n /** Channels to subscribe to */\n channels: ('pools' | 'priority_fees' | 'blockhash')[];\n /** Response format (default: binary) */\n format?: 'binary' | 'json';\n /** Filter by protocol names */\n protocols?: string[];\n /** Filter by pool addresses (Base58) */\n pools?: string[];\n /** Filter by token pairs [[mintA, mintB], ...] */\n tokenPairs?: [string, string][];\n}\n\n/**\n * Quote subscription request\n */\nexport interface SubscribeQuoteRequest {\n /** Input token mint (Base58) */\n inputMint: string;\n /** Output token mint (Base58) */\n outputMint: string;\n /** Amount in base units */\n amount: number;\n /** Slippage tolerance in basis points */\n slippageBps?: number;\n /** Refresh interval in milliseconds */\n refreshIntervalMs?: number;\n}\n"]}
1
+ {"version":3,"sources":["../src/utils/base58.ts","../src/ws/types.ts","../src/ws/decoder.ts","../src/ws/client.ts","../src/leader-ws/decoder.ts","../src/leader-ws/types.ts","../src/leader-ws/client.ts","../src/types/index.ts"],"names":["NetworkState"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Base58 encoding utilities for Solana addresses\n * \n * Solana uses Base58 encoding (Bitcoin-style) for public keys and signatures.\n */\n\nconst BASE58_ALPHABET = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';\n\n/**\n * Encode bytes to Base58 string (Solana address format)\n * \n * @param bytes - Uint8Array to encode\n * @returns Base58 encoded string\n * \n * @example\n * ```typescript\n * const pubkey = new Uint8Array([1, 2, 3, ...]);\n * const address = base58Encode(pubkey);\n * // \"EPjFWdd5...\"\n * ```\n */\nexport function base58Encode(bytes: Uint8Array): string {\n const digits = [0];\n \n for (let i = 0; i < bytes.length; i++) {\n let carry = bytes[i];\n for (let j = 0; j < digits.length; j++) {\n carry += digits[j] << 8;\n digits[j] = carry % 58;\n carry = (carry / 58) | 0;\n }\n while (carry > 0) {\n digits.push(carry % 58);\n carry = (carry / 58) | 0;\n }\n }\n\n // Leading zeros\n let leadingZeros = '';\n for (let i = 0; i < bytes.length && bytes[i] === 0; i++) {\n leadingZeros += '1';\n }\n\n return leadingZeros + digits.reverse().map(d => BASE58_ALPHABET[d]).join('');\n}\n\n/**\n * Decode Base58 string to bytes\n * \n * @param str - Base58 encoded string\n * @returns Uint8Array of decoded bytes\n * @throws Error if string contains invalid characters\n * \n * @example\n * ```typescript\n * const bytes = base58Decode(\"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v\");\n * // Uint8Array(32) [...]\n * ```\n */\nexport function base58Decode(str: string): Uint8Array {\n if (str.length === 0) {\n return new Uint8Array(0);\n }\n\n // Count leading '1's (they represent leading zero bytes)\n let leadingZeros = 0;\n for (let i = 0; i < str.length && str[i] === '1'; i++) {\n leadingZeros++;\n }\n\n // Process remaining characters through base conversion\n const bytes = [0];\n for (let i = leadingZeros; i < str.length; i++) {\n const char = str[i];\n const value = BASE58_ALPHABET.indexOf(char);\n \n if (value === -1) {\n throw new Error(`Invalid Base58 character: ${char}`);\n }\n \n let carry = value;\n for (let j = 0; j < bytes.length; j++) {\n carry += bytes[j] * 58;\n bytes[j] = carry & 0xff;\n carry >>= 8;\n }\n while (carry > 0) {\n bytes.push(carry & 0xff);\n carry >>= 8;\n }\n }\n\n // Build result: leading zeros + converted bytes (reversed)\n bytes.reverse();\n \n // Handle case where input was all '1's (all leading zeros, no data to convert)\n // In this case, bytes is just [0] from initialization, which we should ignore\n if (leadingZeros > 0 && bytes.length === 1 && bytes[0] === 0) {\n // Input was all '1's, return that many zero bytes\n return new Uint8Array(leadingZeros);\n }\n \n // Remove leading zero from conversion if present (artifact of starting with [0])\n const startIdx = bytes.length > 1 && bytes[0] === 0 ? 1 : 0;\n \n const result = new Uint8Array(leadingZeros + bytes.length - startIdx);\n // Fill leading zeros\n for (let i = 0; i < leadingZeros; i++) {\n result[i] = 0;\n }\n // Copy converted bytes\n for (let i = startIdx; i < bytes.length; i++) {\n result[leadingZeros + i - startIdx] = bytes[i];\n }\n \n return result;\n}\n\n/**\n * Check if a string is a valid Solana public key (Base58, 32-44 chars)\n * \n * @param address - String to validate\n * @returns true if valid Solana pubkey format\n * \n * @example\n * ```typescript\n * isValidPubkey(\"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v\") // true\n * isValidPubkey(\"invalid\") // false\n * ```\n */\nexport function isValidPubkey(address: string): boolean {\n // Solana pubkeys are 32-44 characters in Base58\n if (address.length < 32 || address.length > 44) {\n return false;\n }\n\n // Check all characters are valid Base58\n for (const char of address) {\n if (!BASE58_ALPHABET.includes(char)) {\n return false;\n }\n }\n\n // Try to decode and verify length\n try {\n const bytes = base58Decode(address);\n return bytes.length === 32;\n } catch {\n return false;\n }\n}\n","/**\n * WebSocket message types and interfaces\n * \n * Message type constants MUST match the K2 server values.\n * See: https://github.com/k256-xyz for protocol documentation\n */\n\nimport type { BlockMiniStats, TrendDirection, BlockStats } from '../types';\n\n/**\n * WebSocket message type constants\n * \n * These are the byte prefixes used in the binary protocol.\n * All SDKs across all languages MUST use these exact values.\n */\nexport const MessageType = {\n /** Single pool state update (bincode) */\n PoolUpdate: 0x01,\n /** Subscribe request (JSON) - Client → Server */\n Subscribe: 0x02,\n /** Subscription confirmed (JSON) - Server → Client */\n Subscribed: 0x03,\n /** Unsubscribe all - Client → Server */\n Unsubscribe: 0x04,\n /** Priority fee update (bincode) */\n PriorityFees: 0x05,\n /** Recent blockhash (bincode) */\n Blockhash: 0x06,\n /** Streaming quote update (bincode) */\n Quote: 0x07,\n /** Quote subscription confirmed (JSON) */\n QuoteSubscribed: 0x08,\n /** Subscribe to quote stream (JSON) - Client → Server */\n SubscribeQuote: 0x09,\n /** Unsubscribe from quote (JSON) - Client → Server */\n UnsubscribeQuote: 0x0a,\n /** Ping keepalive - Client → Server */\n Ping: 0x0b,\n /** Pong response (bincode u64 timestamp) */\n Pong: 0x0c,\n /** Connection heartbeat with stats (JSON) */\n Heartbeat: 0x0d,\n /** Batched pool updates for high throughput */\n PoolUpdateBatch: 0x0e,\n /** Block-level statistics (v3) */\n BlockStats: 0x0f,\n /** Error message (UTF-8 string) */\n Error: 0xff,\n} as const;\n\nexport type MessageTypeValue = typeof MessageType[keyof typeof MessageType];\n\n/**\n * Decoded pool update from binary message\n */\nexport interface PoolUpdateMessage {\n type: 'pool_update';\n data: {\n sequence: number;\n slot: number;\n writeVersion: number;\n protocol: string;\n poolAddress: string;\n tokenMints: string[];\n tokenBalances: string[];\n tokenDecimals: number[];\n bestBid?: { price: string; size: string };\n bestAsk?: { price: string; size: string };\n };\n}\n\n/**\n * Decoded fee market from binary message (per-writable-account model)\n *\n * All fields from K2 FeeMarketWire\n */\nexport interface FeeMarketMessage {\n type: 'fee_market';\n data: {\n slot: number;\n timestampMs: number;\n /** Recommended priority fee in microlamports/CU (max p75 across hottest accounts) */\n recommended: number;\n /** Fee state: 0=low, 1=normal, 2=high, 3=extreme */\n state: number;\n /** True if data is stale (no recent samples) */\n isStale: boolean;\n /** Block utilization percentage (0-100) */\n blockUtilizationPct: number;\n /** Number of blocks in the observation window */\n blocksInWindow: number;\n /** Per-writable-account fee data */\n accounts: {\n /** Account public key (Base58) */\n pubkey: string;\n /** Total transactions touching this account */\n totalTxs: number;\n /** Active slots for this account */\n activeSlots: number;\n /** Total CU consumed */\n cuConsumed: number;\n /** Utilization percentage (0-100) of 12M CU limit */\n utilizationPct: number;\n /** Fee percentiles in microlamports/CU */\n p25: number;\n p50: number;\n p75: number;\n p90: number;\n /** Minimum non-zero fee observed */\n minNonzeroPrice: number;\n }[];\n /** Recent block mini-stats (v3) */\n recentBlocks: BlockMiniStats[];\n /** Fee trend direction (v3) */\n trend: TrendDirection;\n };\n}\n\n/**\n * Decoded block stats from binary message (v3)\n */\nexport interface BlockStatsMessage {\n type: 'block_stats';\n data: BlockStats;\n receivedAt: number;\n}\n\n/**\n * Decoded blockhash from binary message\n */\nexport interface BlockhashMessage {\n type: 'blockhash';\n data: {\n slot: number;\n timestampMs: number;\n blockhash: string;\n blockHeight: number;\n lastValidBlockHeight: number;\n isStale: boolean;\n };\n}\n\n/**\n * Decoded quote from binary message\n */\nexport interface QuoteMessage {\n type: 'quote';\n data: {\n topicId: string;\n timestampMs: number;\n sequence: number;\n inputMint: string;\n outputMint: string;\n inAmount: string;\n outAmount: string;\n priceImpactBps: number;\n contextSlot: number;\n algorithm: string;\n isImprovement: boolean;\n isCached: boolean;\n isStale: boolean;\n routePlan: unknown | null;\n };\n}\n\n/**\n * Decoded heartbeat from JSON message\n */\nexport interface HeartbeatMessage {\n type: 'heartbeat';\n data: {\n timestampMs: number;\n uptimeSecs: number;\n messagesSent: number;\n poolUpdatesSent: number;\n messagesDropped: number;\n poolUpdatesEnabled: boolean;\n subscribedChannels: string[];\n serverSequence: number;\n };\n}\n\n/**\n * Subscription confirmed message\n */\nexport interface SubscribedMessage {\n type: 'subscribed';\n data: {\n channelCount: number;\n channels: string[];\n poolCount: number;\n tokenPairCount: number;\n protocolCount: number;\n poolUpdatesEnabled: boolean;\n timestampMs: number;\n summary: string;\n format?: 'binary' | 'json';\n };\n}\n\n/**\n * Quote subscription confirmed message\n */\nexport interface QuoteSubscribedMessage {\n type: 'quote_subscribed';\n data: {\n topicId: string;\n inputMint: string;\n outputMint: string;\n amount: string;\n slippageBps: number;\n refreshIntervalMs: number;\n timestampMs: number;\n };\n}\n\n/**\n * Error message from server\n */\nexport interface ErrorMessage {\n type: 'error';\n data: {\n message: string;\n };\n}\n\n/**\n * Pong response message\n */\nexport interface PongMessage {\n type: 'pong';\n data: {\n timestampMs: number;\n };\n}\n\n/**\n * Union of all decoded message types\n */\nexport type DecodedMessage =\n | PoolUpdateMessage\n | FeeMarketMessage\n | BlockStatsMessage\n | BlockhashMessage\n | QuoteMessage\n | HeartbeatMessage\n | SubscribedMessage\n | QuoteSubscribedMessage\n | ErrorMessage\n | PongMessage;\n","/**\n * Binary message decoder for K256 WebSocket protocol\n * \n * Decodes binary messages from K2 server into typed JavaScript objects.\n * Supports both single messages and batched pool updates.\n * \n * Wire format: [1 byte MessageType][N bytes Payload]\n */\n\nimport { base58Encode } from '../utils/base58';\nimport type { BlockMiniStats, TrendDirection } from '../types';\nimport { MessageType, type DecodedMessage, type PoolUpdateMessage, type FeeMarketMessage } from './types';\n\n/**\n * Decode a binary WebSocket message from K2\n * \n * @param data - Raw binary data from WebSocket\n * @returns Decoded message or null if unrecognized type\n * \n * @example\n * ```typescript\n * ws.onmessage = (event) => {\n * if (event.data instanceof ArrayBuffer) {\n * const message = decodeMessage(event.data);\n * if (message?.type === 'pool_update') {\n * console.log(message.data.poolAddress);\n * }\n * }\n * };\n * ```\n */\nexport function decodeMessage(data: ArrayBuffer): DecodedMessage | null {\n const view = new DataView(data);\n if (data.byteLength < 1) return null;\n\n const msgType = view.getUint8(0);\n const payload = data.slice(1);\n const payloadView = new DataView(payload);\n\n switch (msgType) {\n case MessageType.Subscribed:\n case MessageType.QuoteSubscribed:\n case MessageType.Heartbeat: {\n // JSON payload\n const decoder = new TextDecoder();\n const text = decoder.decode(payload);\n try {\n let type: string;\n if (msgType === MessageType.QuoteSubscribed) {\n type = 'quote_subscribed';\n } else if (msgType === MessageType.Heartbeat) {\n type = 'heartbeat';\n } else {\n type = 'subscribed';\n }\n return {\n type,\n data: JSON.parse(text),\n } as DecodedMessage;\n } catch {\n return { type: 'error', data: { message: text } };\n }\n }\n\n case MessageType.Error: {\n // UTF-8 string payload\n const decoder = new TextDecoder();\n const text = decoder.decode(payload);\n return { type: 'error', data: { message: text } };\n }\n\n case MessageType.PriorityFees: {\n // FeeMarketWire bincode layout (per-writable-account model):\n // Header (42 bytes):\n // Offset 0: slot: u64 (8 bytes)\n // Offset 8: timestamp_ms: u64 (8 bytes)\n // Offset 16: recommended: u64 (8 bytes)\n // Offset 24: state: u8 (1 byte)\n // Offset 25: is_stale: bool (1 byte)\n // Offset 26: block_utilization_pct: f32 (4 bytes)\n // Offset 30: blocks_in_window: u32 (4 bytes)\n // Offset 34: account_count: u64 (8 bytes) [bincode Vec length]\n // Per account (92 bytes each):\n // pubkey: [u8; 32], total_txs: u32, active_slots: u32,\n // cu_consumed: u64, utilization_pct: f32,\n // p25: u64, p50: u64, p75: u64, p90: u64, min_nonzero_price: u64\n if (payload.byteLength < 42) return null;\n\n const slot = Number(payloadView.getBigUint64(0, true));\n const timestampMs = Number(payloadView.getBigUint64(8, true));\n const recommended = Number(payloadView.getBigUint64(16, true));\n const state = payloadView.getUint8(24);\n const isStale = payloadView.getUint8(25) !== 0;\n const blockUtilizationPct = payloadView.getFloat32(26, true);\n const blocksInWindow = payloadView.getUint32(30, true);\n const accountCount = Number(payloadView.getBigUint64(34, true));\n\n const accounts: FeeMarketMessage['data']['accounts'] = [];\n let offset = 42;\n for (let i = 0; i < accountCount && offset + 92 <= payload.byteLength; i++) {\n const pubkeyBytes = new Uint8Array(payload, offset, 32);\n const pubkey = base58Encode(pubkeyBytes);\n const totalTxs = payloadView.getUint32(offset + 32, true);\n const activeSlots = payloadView.getUint32(offset + 36, true);\n const cuConsumed = Number(payloadView.getBigUint64(offset + 40, true));\n const utilizationPct = payloadView.getFloat32(offset + 48, true);\n const p25 = Number(payloadView.getBigUint64(offset + 52, true));\n const p50 = Number(payloadView.getBigUint64(offset + 60, true));\n const p75 = Number(payloadView.getBigUint64(offset + 68, true));\n const p90 = Number(payloadView.getBigUint64(offset + 76, true));\n const minNonzeroPrice = Number(payloadView.getBigUint64(offset + 84, true));\n\n accounts.push({\n pubkey, totalTxs, activeSlots, cuConsumed, utilizationPct,\n p25, p50, p75, p90, minNonzeroPrice,\n });\n offset += 92;\n }\n\n // Decode recent_blocks (Vec<BlockMiniStats>) — v3\n // Guard: need at least 8 bytes for count + 1 byte for trend after\n const recentBlocksCount = offset + 8 <= payload.byteLength\n ? Number(payloadView.getBigUint64(offset, true))\n : 0;\n offset += 8;\n const recentBlocks: BlockMiniStats[] = [];\n for (let i = 0; i < recentBlocksCount && offset + 32 <= payload.byteLength; i++) {\n const rbSlot = Number(payloadView.getBigUint64(offset, true)); offset += 8;\n const rbCuConsumed = Number(payloadView.getBigUint64(offset, true)); offset += 8;\n const rbTxCount = payloadView.getUint32(offset, true); offset += 4;\n const rbUtilizationPct = payloadView.getFloat32(offset, true); offset += 4;\n const rbAvgCuPrice = Number(payloadView.getBigUint64(offset, true)); offset += 8;\n recentBlocks.push({ slot: rbSlot, cuConsumed: rbCuConsumed, txCount: rbTxCount, utilizationPct: rbUtilizationPct, avgCuPrice: rbAvgCuPrice });\n }\n\n // Decode trend (u8) — v3\n const trendByte = offset < payload.byteLength ? payloadView.getUint8(offset) : 2;\n offset += 1;\n const trend: TrendDirection = trendByte === 0 ? 'rising' : trendByte === 1 ? 'falling' : 'stable';\n\n return {\n type: 'fee_market',\n data: {\n slot, timestampMs, recommended, state, isStale,\n blockUtilizationPct, blocksInWindow, accounts,\n recentBlocks, trend,\n },\n } as FeeMarketMessage;\n }\n\n case MessageType.Blockhash: {\n // BlockhashWire bincode layout\n if (payload.byteLength < 65) return null;\n\n const slot = Number(payloadView.getBigUint64(0, true));\n const timestampMs = Number(payloadView.getBigUint64(8, true));\n const blockhashBytes = new Uint8Array(payload, 16, 32);\n const blockHeight = Number(payloadView.getBigUint64(48, true));\n const lastValidBlockHeight = Number(payloadView.getBigUint64(56, true));\n const isStale = payloadView.getUint8(64) !== 0;\n\n return {\n type: 'blockhash',\n data: {\n slot,\n timestampMs,\n blockhash: base58Encode(blockhashBytes),\n blockHeight,\n lastValidBlockHeight,\n isStale,\n },\n };\n }\n\n case MessageType.PoolUpdate: {\n return decodePoolUpdate(payload, payloadView);\n }\n\n case MessageType.PoolUpdateBatch: {\n // Batched pool updates: [u16 count][u32 len][payload]...\n // Returns array of individual updates\n if (payload.byteLength < 2) return null;\n\n const updates = decodePoolUpdateBatch(payload);\n if (updates.length === 0) return null;\n\n // Return first update for single-message interface\n // Use decodePoolUpdateBatch() directly for batch handling\n return updates[0];\n }\n\n case MessageType.Quote: {\n return decodeQuote(payload, payloadView);\n }\n\n case MessageType.Pong: {\n if (payload.byteLength < 8) return null;\n return {\n type: 'pong',\n data: {\n timestampMs: Number(payloadView.getBigUint64(0, true)),\n },\n };\n }\n\n case MessageType.BlockStats: {\n // BlockStats (0x0F) — v3\n // Layout: slot(u64) + cu_consumed(u64) + execution_cu(u64) + cu_limit(u64) + cu_remaining(u64)\n // + utilization_pct(f32) + tx_count(u32) + avg_cu_per_tx(u32) + avg_cu_price(u64)\n // + min_cu_price(u64) + max_cu_price(u64) + timestamp_ms(u64)\n let offset = 0; // payload already has type byte stripped\n const slot = Number(payloadView.getBigUint64(offset, true)); offset += 8;\n const cuConsumed = Number(payloadView.getBigUint64(offset, true)); offset += 8;\n const executionCu = Number(payloadView.getBigUint64(offset, true)); offset += 8;\n const cuLimit = Number(payloadView.getBigUint64(offset, true)); offset += 8;\n const cuRemaining = Number(payloadView.getBigUint64(offset, true)); offset += 8;\n const utilizationPct = payloadView.getFloat32(offset, true); offset += 4;\n const txCount = payloadView.getUint32(offset, true); offset += 4;\n const avgCuPerTx = payloadView.getUint32(offset, true); offset += 4;\n const avgCuPrice = Number(payloadView.getBigUint64(offset, true)); offset += 8;\n const minCuPrice = Number(payloadView.getBigUint64(offset, true)); offset += 8;\n const maxCuPrice = Number(payloadView.getBigUint64(offset, true)); offset += 8;\n const timestampMs = Number(payloadView.getBigUint64(offset, true)); offset += 8;\n\n return {\n type: 'block_stats',\n data: {\n slot, cuConsumed, executionCu, cuLimit, cuRemaining, utilizationPct,\n txCount, avgCuPerTx, avgCuPrice, minCuPrice, maxCuPrice, timestampMs,\n },\n receivedAt: Date.now(),\n };\n }\n\n default:\n return null;\n }\n}\n\n/**\n * Decode a batch of pool updates\n * \n * Use this when you need to process all updates in a batch.\n * For high-throughput scenarios, batches can contain 50-200 updates.\n * \n * @param data - Raw payload (without the 0x0E type prefix)\n * @returns Array of decoded pool updates\n * \n * @example\n * ```typescript\n * if (msgType === MessageType.PoolUpdateBatch) {\n * const updates = decodePoolUpdateBatch(payload);\n * for (const update of updates) {\n * console.log(update.data.poolAddress);\n * }\n * }\n * ```\n */\nexport function decodePoolUpdateBatch(payload: ArrayBuffer): PoolUpdateMessage[] {\n const view = new DataView(payload);\n if (payload.byteLength < 2) return [];\n\n const count = view.getUint16(0, true);\n const updates: PoolUpdateMessage[] = [];\n let offset = 2;\n\n for (let i = 0; i < count && offset + 4 <= payload.byteLength; i++) {\n const payloadLen = view.getUint32(offset, true);\n offset += 4;\n\n if (offset + payloadLen > payload.byteLength) break;\n\n // Decode individual pool update (payload is WITHOUT the 0x01 type prefix)\n const updatePayload = payload.slice(offset, offset + payloadLen);\n const updateView = new DataView(updatePayload);\n const decoded = decodePoolUpdate(updatePayload, updateView);\n\n if (decoded) {\n updates.push(decoded);\n }\n\n offset += payloadLen;\n }\n\n return updates;\n}\n\n/**\n * Decode a single pool update payload\n */\nfunction decodePoolUpdate(payload: ArrayBuffer, payloadView: DataView): PoolUpdateMessage | null {\n if (payload.byteLength < 50) return null;\n\n try {\n let offset = 0;\n const decoder = new TextDecoder();\n\n // Skip serialized_state (Bytes: u64 len + bytes)\n const serializedStateLen = Number(payloadView.getBigUint64(offset, true));\n offset += 8 + serializedStateLen;\n\n if (payload.byteLength < offset + 24) return null;\n\n // sequence (u64)\n const sequence = Number(payloadView.getBigUint64(offset, true));\n offset += 8;\n\n // slot (u64)\n const slot = Number(payloadView.getBigUint64(offset, true));\n offset += 8;\n\n // write_version (u64)\n const writeVersion = Number(payloadView.getBigUint64(offset, true));\n offset += 8;\n\n // protocol_name (String: u64 len + utf8 bytes)\n const protocolLen = Number(payloadView.getBigUint64(offset, true));\n offset += 8;\n const protocolBytes = new Uint8Array(payload, offset, protocolLen);\n const protocol = decoder.decode(protocolBytes);\n offset += protocolLen;\n\n // pool_address ([u8; 32])\n const poolAddr = new Uint8Array(payload, offset, 32);\n offset += 32;\n\n // all_token_mints (Vec<[u8; 32]>)\n const tokenMintCount = Number(payloadView.getBigUint64(offset, true));\n offset += 8;\n const tokenMints: string[] = [];\n for (let i = 0; i < tokenMintCount && offset + 32 <= payload.byteLength; i++) {\n const mint = new Uint8Array(payload, offset, 32);\n tokenMints.push(base58Encode(mint));\n offset += 32;\n }\n\n // all_token_balances (Vec<u64>)\n const balanceCount = Number(payloadView.getBigUint64(offset, true));\n offset += 8;\n const tokenBalances: string[] = [];\n for (let i = 0; i < balanceCount && offset + 8 <= payload.byteLength; i++) {\n tokenBalances.push(payloadView.getBigUint64(offset, true).toString());\n offset += 8;\n }\n\n // all_token_decimals (Vec<i32>)\n const decimalsCount = Number(payloadView.getBigUint64(offset, true));\n offset += 8;\n const tokenDecimals: number[] = [];\n for (let i = 0; i < decimalsCount && offset + 4 <= payload.byteLength; i++) {\n tokenDecimals.push(payloadView.getInt32(offset, true));\n offset += 4;\n }\n\n // best_bid and best_ask (Option<OrderLevel>) - skip for now\n // They use bincode Option encoding: 0 = None, 1 + data = Some\n\n return {\n type: 'pool_update',\n data: {\n sequence,\n slot,\n writeVersion,\n protocol,\n poolAddress: base58Encode(poolAddr),\n tokenMints,\n tokenBalances,\n tokenDecimals,\n },\n };\n } catch {\n return null;\n }\n}\n\n/**\n * Decode a quote message payload\n */\nfunction decodeQuote(payload: ArrayBuffer, payloadView: DataView): DecodedMessage | null {\n if (payload.byteLength < 8) return null;\n\n try {\n let offset = 0;\n const decoder = new TextDecoder();\n\n // Helper to read bincode String (u64 len + UTF-8 bytes)\n const readString = (): string => {\n const len = Number(payloadView.getBigUint64(offset, true));\n offset += 8;\n const bytes = new Uint8Array(payload, offset, len);\n offset += len;\n return decoder.decode(bytes);\n };\n\n // topic_id (String)\n const topicId = readString();\n\n // timestamp_ms (u64)\n const timestampMs = Number(payloadView.getBigUint64(offset, true));\n offset += 8;\n\n // sequence (u64)\n const sequence = Number(payloadView.getBigUint64(offset, true));\n offset += 8;\n\n // input_mint ([u8; 32])\n const inputMintBytes = new Uint8Array(payload, offset, 32);\n offset += 32;\n\n // output_mint ([u8; 32])\n const outputMintBytes = new Uint8Array(payload, offset, 32);\n offset += 32;\n\n // in_amount (u64)\n const inAmount = payloadView.getBigUint64(offset, true).toString();\n offset += 8;\n\n // out_amount (u64)\n const outAmount = payloadView.getBigUint64(offset, true).toString();\n offset += 8;\n\n // price_impact_bps (i32)\n const priceImpactBps = payloadView.getInt32(offset, true);\n offset += 4;\n\n // context_slot (u64)\n const contextSlot = Number(payloadView.getBigUint64(offset, true));\n offset += 8;\n\n // algorithm (String)\n const algorithm = readString();\n\n // is_improvement (bool)\n const isImprovement = payloadView.getUint8(offset) !== 0;\n offset += 1;\n\n // is_cached (bool)\n const isCached = payloadView.getUint8(offset) !== 0;\n offset += 1;\n\n // is_stale (bool)\n const isStale = payloadView.getUint8(offset) !== 0;\n offset += 1;\n\n // route_plan_json (Vec<u8> - bincode: u64 len + bytes)\n let routePlan = null;\n if (offset + 8 <= payload.byteLength) {\n const routePlanLen = Number(payloadView.getBigUint64(offset, true));\n offset += 8;\n if (routePlanLen > 0 && offset + routePlanLen <= payload.byteLength) {\n const routePlanBytes = new Uint8Array(payload, offset, routePlanLen);\n try {\n routePlan = JSON.parse(decoder.decode(routePlanBytes));\n } catch {\n // Route plan JSON parsing failed, leave as null\n }\n }\n }\n\n return {\n type: 'quote',\n data: {\n topicId,\n timestampMs,\n sequence,\n inputMint: base58Encode(inputMintBytes),\n outputMint: base58Encode(outputMintBytes),\n inAmount,\n outAmount,\n priceImpactBps,\n contextSlot,\n algorithm,\n isImprovement,\n isCached,\n isStale,\n routePlan,\n },\n };\n } catch {\n return null;\n }\n}\n","/**\n * K256 WebSocket Client\n * \n * Production-grade WebSocket client with:\n * - Automatic reconnection with exponential backoff\n * - Binary and JSON mode support\n * - Ping/pong keepalive\n * - Heartbeat monitoring\n * - Full error handling with RFC 6455 close codes\n * - Type-safe event emitters\n * \n * @example\n * ```typescript\n * const client = new K256WebSocketClient({\n * apiKey: 'your-api-key',\n * mode: 'binary', // or 'json'\n * onPoolUpdate: (update) => console.log(update),\n * onError: (error) => console.error(error),\n * });\n * \n * await client.connect();\n * client.subscribe({ channels: ['pools', 'priority_fees'] });\n * ```\n */\n\nimport { decodeMessage, decodePoolUpdateBatch } from './decoder';\nimport { MessageType, type DecodedMessage, type PoolUpdateMessage, type BlockStatsMessage } from './types';\n\n/**\n * RFC 6455 WebSocket Close Codes\n * @see https://www.rfc-editor.org/rfc/rfc6455#section-7.4.1\n */\nexport const CloseCode = {\n /** 1000: Normal closure - connection completed successfully */\n NORMAL: 1000,\n /** 1001: Going away - server/client shutting down. Client: reconnect immediately */\n GOING_AWAY: 1001,\n /** 1002: Protocol error - invalid frame format. Client: fix client code */\n PROTOCOL_ERROR: 1002,\n /** 1003: Unsupported data - message type not supported */\n UNSUPPORTED_DATA: 1003,\n /** 1005: No status received (reserved, not sent over wire) */\n NO_STATUS: 1005,\n /** 1006: Abnormal closure - connection dropped without close frame */\n ABNORMAL: 1006,\n /** 1007: Invalid payload - malformed UTF-8 or data. Client: fix message format */\n INVALID_PAYLOAD: 1007,\n /** 1008: Policy violation - rate limit exceeded, auth failed. Client: check credentials/limits */\n POLICY_VIOLATION: 1008,\n /** 1009: Message too big - message exceeds size limits */\n MESSAGE_TOO_BIG: 1009,\n /** 1010: Missing extension - required extension not negotiated */\n MISSING_EXTENSION: 1010,\n /** 1011: Internal error - unexpected server error. Client: retry with backoff */\n INTERNAL_ERROR: 1011,\n /** 1012: Service restart - server is restarting. Client: reconnect after brief delay */\n SERVICE_RESTART: 1012,\n /** 1013: Try again later - server overloaded. Client: retry with backoff */\n TRY_AGAIN_LATER: 1013,\n /** 1014: Bad gateway - upstream connection failed */\n BAD_GATEWAY: 1014,\n /** 1015: TLS handshake failed (reserved, not sent over wire) */\n TLS_HANDSHAKE: 1015,\n} as const;\n\nexport type CloseCodeValue = typeof CloseCode[keyof typeof CloseCode];\n\n/**\n * Connection state\n */\nexport type ConnectionState = \n | 'disconnected'\n | 'connecting'\n | 'connected'\n | 'reconnecting'\n | 'closed';\n\n/**\n * Subscribe request options\n */\nexport interface SubscribeOptions {\n /** Channels to subscribe to: 'pools', 'priority_fees', 'blockhash' */\n channels: string[];\n /** Pool address filters (optional) */\n pools?: string[];\n /** Protocol filters (optional): 'RaydiumAmm', 'Whirlpool', 'MeteoraDlmm', etc. */\n protocols?: string[];\n /** Token pair filters (optional): [['mint1', 'mint2'], ...] */\n tokenPairs?: string[][];\n}\n\n/**\n * Quote subscription options\n */\nexport interface SubscribeQuoteOptions {\n /** Input token mint address */\n inputMint: string;\n /** Output token mint address */\n outputMint: string;\n /** Amount in base units (lamports/smallest unit) */\n amount: number | string;\n /** Slippage tolerance in basis points */\n slippageBps: number;\n /** How often to refresh the quote (ms) */\n refreshIntervalMs?: number;\n}\n\n/**\n * WebSocket client configuration\n */\nexport interface K256WebSocketClientConfig {\n /** API key for authentication */\n apiKey: string;\n /** Gateway URL (default: wss://gateway.k256.xyz/v1/ws) */\n url?: string;\n /** Message format: 'binary' (default, efficient) or 'json' (debugging) */\n mode?: 'binary' | 'json';\n \n // Reconnection settings\n /** Enable automatic reconnection (default: true) */\n autoReconnect?: boolean;\n /** Initial reconnect delay in ms (default: 1000) */\n reconnectDelayMs?: number;\n /** Max reconnect delay in ms (default: 30000) */\n maxReconnectDelayMs?: number;\n /** Max reconnect attempts (default: Infinity) */\n maxReconnectAttempts?: number;\n \n // Keepalive settings\n /** Ping interval in ms (default: 30000) */\n pingIntervalMs?: number;\n /** Pong timeout in ms - disconnect if no pong (default: 10000) */\n pongTimeoutMs?: number;\n /** Heartbeat timeout in ms - warn if no heartbeat (default: 45000, K2 sends every 30s) */\n heartbeatTimeoutMs?: number;\n \n // Event callbacks\n /** Called when connection state changes */\n onStateChange?: (state: ConnectionState, prevState: ConnectionState) => void;\n /** Called on successful connection */\n onConnect?: () => void;\n /** Called on disconnection */\n onDisconnect?: (code: number, reason: string, wasClean: boolean) => void;\n /** Called on reconnection attempt */\n onReconnecting?: (attempt: number, delayMs: number) => void;\n /** Called on any error */\n onError?: (error: K256WebSocketError) => void;\n \n // Message callbacks\n /** Called on subscription confirmed */\n onSubscribed?: (data: DecodedMessage & { type: 'subscribed' }) => void;\n /** Called on pool update */\n onPoolUpdate?: (update: PoolUpdateMessage) => void;\n /** Called on batched pool updates (for efficiency) */\n onPoolUpdateBatch?: (updates: PoolUpdateMessage[]) => void;\n /** Called on fee market update (per-writable-account fees) */\n onFeeMarket?: (data: DecodedMessage & { type: 'fee_market' }) => void;\n /** Called on block stats update (v3) */\n onBlockStats?: (message: BlockStatsMessage) => void;\n /** Called on blockhash update */\n onBlockhash?: (data: DecodedMessage & { type: 'blockhash' }) => void;\n /** Called on quote update */\n onQuote?: (data: DecodedMessage & { type: 'quote' }) => void;\n /** Called on quote subscription confirmed */\n onQuoteSubscribed?: (data: DecodedMessage & { type: 'quote_subscribed' }) => void;\n /** Called on heartbeat */\n onHeartbeat?: (data: DecodedMessage & { type: 'heartbeat' }) => void;\n /** Called on pong response (with round-trip latency) */\n onPong?: (latencyMs: number) => void;\n /** Called on any message (raw) */\n onMessage?: (message: DecodedMessage) => void;\n /** Called on raw binary message (for debugging) */\n onRawMessage?: (data: ArrayBuffer | string) => void;\n}\n\n/**\n * Error types for K256 WebSocket\n */\nexport type K256ErrorCode =\n | 'CONNECTION_FAILED'\n | 'CONNECTION_LOST'\n | 'PROTOCOL_ERROR'\n | 'AUTH_FAILED'\n | 'RATE_LIMITED'\n | 'SERVER_ERROR'\n | 'PING_TIMEOUT'\n | 'HEARTBEAT_TIMEOUT'\n | 'INVALID_MESSAGE'\n | 'RECONNECT_FAILED';\n\n/**\n * WebSocket error with context\n */\nexport class K256WebSocketError extends Error {\n constructor(\n public readonly code: K256ErrorCode,\n message: string,\n public readonly closeCode?: number,\n public readonly closeReason?: string,\n public readonly cause?: unknown\n ) {\n super(message);\n this.name = 'K256WebSocketError';\n }\n\n /** Check if error is recoverable (should trigger reconnect) */\n get isRecoverable(): boolean {\n switch (this.code) {\n case 'AUTH_FAILED':\n case 'RATE_LIMITED':\n return false;\n default:\n return true;\n }\n }\n\n /** Check if error is an auth failure */\n get isAuthError(): boolean {\n return this.code === 'AUTH_FAILED' || this.closeCode === CloseCode.POLICY_VIOLATION;\n }\n}\n\n/**\n * Production-grade K256 WebSocket Client\n */\nexport class K256WebSocketClient {\n private ws: WebSocket | null = null;\n private config: Required<Omit<K256WebSocketClientConfig, \n 'onStateChange' | 'onConnect' | 'onDisconnect' | 'onReconnecting' | 'onError' |\n 'onSubscribed' | 'onPoolUpdate' | 'onPoolUpdateBatch' | 'onFeeMarket' | 'onBlockStats' |\n 'onBlockhash' | 'onQuote' | 'onQuoteSubscribed' | 'onHeartbeat' | 'onPong' | \n 'onMessage' | 'onRawMessage'\n >> & K256WebSocketClientConfig;\n \n private _state: ConnectionState = 'disconnected';\n private reconnectAttempts = 0;\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n private pingTimer: ReturnType<typeof setInterval> | null = null;\n private pongTimer: ReturnType<typeof setTimeout> | null = null;\n private heartbeatTimer: ReturnType<typeof setTimeout> | null = null;\n private lastPingTime = 0;\n private lastHeartbeatTime = 0;\n private pendingSubscription: SubscribeOptions | null = null;\n private pendingQuoteSubscription: SubscribeQuoteOptions | null = null;\n private isIntentionallyClosed = false;\n\n /** Current connection state */\n get state(): ConnectionState {\n return this._state;\n }\n\n /** Whether currently connected */\n get isConnected(): boolean {\n return this._state === 'connected' && this.ws?.readyState === WebSocket.OPEN;\n }\n\n /** Time since last heartbeat (ms) or null if no heartbeat received */\n get timeSinceHeartbeat(): number | null {\n return this.lastHeartbeatTime ? Date.now() - this.lastHeartbeatTime : null;\n }\n\n /** Current reconnect attempt number */\n get currentReconnectAttempt(): number {\n return this.reconnectAttempts;\n }\n\n constructor(config: K256WebSocketClientConfig) {\n this.config = {\n url: 'wss://gateway.k256.xyz/v1/ws',\n mode: 'binary',\n autoReconnect: true,\n reconnectDelayMs: 1000,\n maxReconnectDelayMs: 30000,\n maxReconnectAttempts: Infinity,\n pingIntervalMs: 30000,\n pongTimeoutMs: 10000,\n heartbeatTimeoutMs: 45000, // K2 sends heartbeats every 30s; allow 45s before warning\n ...config,\n };\n }\n\n /**\n * Connect to the WebSocket server\n * @returns Promise that resolves when connected\n */\n async connect(): Promise<void> {\n if (this._state === 'connected' || this._state === 'connecting') {\n return;\n }\n\n this.isIntentionallyClosed = false;\n return this.doConnect();\n }\n\n /**\n * Disconnect from the WebSocket server\n * @param code - Close code (default: 1000 NORMAL)\n * @param reason - Close reason\n */\n disconnect(code: number = CloseCode.NORMAL, reason: string = 'Client disconnect'): void {\n this.isIntentionallyClosed = true;\n this.cleanup();\n \n if (this.ws) {\n try {\n this.ws.close(code, reason);\n } catch {\n // Ignore errors during close\n }\n this.ws = null;\n }\n \n this.setState('closed');\n }\n\n /**\n * Subscribe to channels\n */\n subscribe(options: SubscribeOptions): void {\n this.pendingSubscription = options;\n \n if (!this.isConnected) {\n // Will be sent on connect\n return;\n }\n\n this.sendSubscription(options);\n }\n\n /**\n * Subscribe to a quote stream\n */\n subscribeQuote(options: SubscribeQuoteOptions): void {\n this.pendingQuoteSubscription = options;\n \n if (!this.isConnected) {\n return;\n }\n\n this.sendQuoteSubscription(options);\n }\n\n /**\n * Unsubscribe from a quote stream\n * @param topicId - Topic ID from quote_subscribed response\n */\n unsubscribeQuote(topicId: string): void {\n if (!this.isConnected) return;\n \n const msg = JSON.stringify({ type: 'unsubscribe_quote', topicId });\n this.ws?.send(msg);\n }\n\n /**\n * Unsubscribe from all channels\n */\n unsubscribe(): void {\n this.pendingSubscription = null;\n this.pendingQuoteSubscription = null;\n \n if (!this.isConnected) return;\n \n this.ws?.send(JSON.stringify({ type: 'unsubscribe' }));\n }\n\n /**\n * Send a ping to measure latency\n */\n ping(): void {\n if (!this.isConnected) return;\n \n // Binary ping: [0x0B]\n const pingData = new Uint8Array([MessageType.Ping]);\n this.lastPingTime = Date.now();\n this.ws?.send(pingData);\n \n // Start pong timeout\n this.startPongTimeout();\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Private methods\n // ─────────────────────────────────────────────────────────────────────────────\n\n private async doConnect(): Promise<void> {\n return new Promise((resolve, reject) => {\n this.setState('connecting');\n\n const url = new URL(this.config.url);\n url.searchParams.set('apiKey', this.config.apiKey);\n\n try {\n this.ws = new WebSocket(url.toString());\n \n // Set binary mode\n if (this.config.mode === 'binary') {\n this.ws.binaryType = 'arraybuffer';\n }\n\n // Connection timeout\n const connectTimeout = setTimeout(() => {\n if (this.ws?.readyState !== WebSocket.OPEN) {\n this.ws?.close();\n const error = new K256WebSocketError(\n 'CONNECTION_FAILED',\n 'Connection timeout'\n );\n this.handleError(error);\n reject(error);\n }\n }, 10000);\n\n this.ws.onopen = () => {\n clearTimeout(connectTimeout);\n this.setState('connected');\n this.reconnectAttempts = 0;\n this.lastHeartbeatTime = Date.now();\n \n // Start keepalive\n this.startPingInterval();\n this.startHeartbeatTimeout();\n \n // Restore subscriptions\n if (this.pendingSubscription) {\n this.sendSubscription(this.pendingSubscription);\n }\n if (this.pendingQuoteSubscription) {\n this.sendQuoteSubscription(this.pendingQuoteSubscription);\n }\n \n this.config.onConnect?.();\n resolve();\n };\n\n this.ws.onclose = (event) => {\n clearTimeout(connectTimeout);\n this.cleanup();\n \n const wasClean = event.wasClean;\n const code = event.code;\n const reason = event.reason || this.getCloseReason(code);\n\n this.config.onDisconnect?.(code, reason, wasClean);\n\n // Determine if we should reconnect\n if (!this.isIntentionallyClosed && this.config.autoReconnect) {\n if (this.shouldReconnect(code)) {\n this.scheduleReconnect();\n } else {\n const error = new K256WebSocketError(\n this.getErrorCodeFromClose(code),\n reason,\n code,\n reason\n );\n this.handleError(error);\n this.setState('closed');\n }\n } else {\n this.setState('disconnected');\n }\n };\n\n this.ws.onerror = () => {\n // WebSocket errors don't provide details - wait for onclose\n };\n\n this.ws.onmessage = (event) => {\n this.handleMessage(event.data);\n };\n\n } catch (error) {\n const wsError = new K256WebSocketError(\n 'CONNECTION_FAILED',\n 'Failed to create WebSocket',\n undefined,\n undefined,\n error\n );\n this.handleError(wsError);\n reject(wsError);\n }\n });\n }\n\n private handleMessage(data: ArrayBuffer | string): void {\n this.config.onRawMessage?.(data);\n\n try {\n let decoded: DecodedMessage | null = null;\n\n if (data instanceof ArrayBuffer) {\n // Binary message\n decoded = decodeMessage(data);\n \n // Handle batch specially\n if (decoded === null) {\n // Check if it's a batch\n const view = new DataView(data);\n if (view.byteLength > 0 && view.getUint8(0) === MessageType.PoolUpdateBatch) {\n const payload = data.slice(1);\n const updates = decodePoolUpdateBatch(payload);\n \n // Emit batch callback\n if (this.config.onPoolUpdateBatch) {\n this.config.onPoolUpdateBatch(updates);\n }\n \n // Also emit individual updates\n for (const update of updates) {\n this.config.onPoolUpdate?.(update);\n this.config.onMessage?.(update);\n }\n return;\n }\n }\n } else {\n // JSON string (when mode is 'json')\n const parsed = JSON.parse(data);\n decoded = {\n type: parsed.type,\n data: parsed.data || parsed,\n } as DecodedMessage;\n }\n\n if (!decoded) {\n return;\n }\n\n // Emit message callback\n this.config.onMessage?.(decoded);\n\n // Emit type-specific callbacks\n switch (decoded.type) {\n case 'subscribed':\n this.config.onSubscribed?.(decoded as DecodedMessage & { type: 'subscribed' });\n break;\n case 'pool_update':\n this.config.onPoolUpdate?.(decoded as PoolUpdateMessage);\n break;\n case 'fee_market':\n this.config.onFeeMarket?.(decoded as DecodedMessage & { type: 'fee_market' });\n break;\n case 'block_stats':\n this.config.onBlockStats?.(decoded as BlockStatsMessage);\n break;\n case 'blockhash':\n this.config.onBlockhash?.(decoded as DecodedMessage & { type: 'blockhash' });\n break;\n case 'quote':\n this.config.onQuote?.(decoded as DecodedMessage & { type: 'quote' });\n break;\n case 'quote_subscribed':\n this.config.onQuoteSubscribed?.(decoded as DecodedMessage & { type: 'quote_subscribed' });\n break;\n case 'heartbeat':\n this.lastHeartbeatTime = Date.now();\n this.resetHeartbeatTimeout();\n this.config.onHeartbeat?.(decoded as DecodedMessage & { type: 'heartbeat' });\n break;\n case 'pong':\n this.clearPongTimeout();\n const latencyMs = this.lastPingTime ? Date.now() - this.lastPingTime : 0;\n this.config.onPong?.(latencyMs);\n break;\n case 'error':\n const errorData = (decoded as DecodedMessage & { type: 'error' }).data;\n const error = new K256WebSocketError(\n 'SERVER_ERROR',\n errorData.message\n );\n this.handleError(error);\n break;\n }\n } catch (error) {\n const wsError = new K256WebSocketError(\n 'INVALID_MESSAGE',\n 'Failed to decode message',\n undefined,\n undefined,\n error\n );\n this.handleError(wsError);\n }\n }\n\n private sendSubscription(options: SubscribeOptions): void {\n const msg: Record<string, unknown> = {\n type: 'subscribe',\n channels: options.channels,\n };\n\n // Add format for JSON mode\n if (this.config.mode === 'json') {\n msg.format = 'json';\n }\n\n // Add filters\n if (options.pools?.length) {\n msg.pools = options.pools;\n }\n if (options.protocols?.length) {\n msg.protocols = options.protocols;\n }\n if (options.tokenPairs?.length) {\n msg.token_pairs = options.tokenPairs;\n }\n\n this.ws?.send(JSON.stringify(msg));\n }\n\n private sendQuoteSubscription(options: SubscribeQuoteOptions): void {\n const msg = {\n type: 'subscribe_quote',\n inputMint: options.inputMint,\n outputMint: options.outputMint,\n amount: typeof options.amount === 'string' ? parseInt(options.amount, 10) : options.amount,\n slippageBps: options.slippageBps,\n refreshIntervalMs: options.refreshIntervalMs ?? 1000,\n };\n\n this.ws?.send(JSON.stringify(msg));\n }\n\n private setState(state: ConnectionState): void {\n if (this._state !== state) {\n const prevState = this._state;\n this._state = state;\n this.config.onStateChange?.(state, prevState);\n }\n }\n\n private handleError(error: K256WebSocketError): void {\n this.config.onError?.(error);\n }\n\n private cleanup(): void {\n if (this.pingTimer) {\n clearInterval(this.pingTimer);\n this.pingTimer = null;\n }\n if (this.pongTimer) {\n clearTimeout(this.pongTimer);\n this.pongTimer = null;\n }\n if (this.heartbeatTimer) {\n clearTimeout(this.heartbeatTimer);\n this.heartbeatTimer = null;\n }\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n }\n\n private startPingInterval(): void {\n if (this.pingTimer) {\n clearInterval(this.pingTimer);\n }\n \n this.pingTimer = setInterval(() => {\n this.ping();\n }, this.config.pingIntervalMs);\n }\n\n private startPongTimeout(): void {\n this.clearPongTimeout();\n \n this.pongTimer = setTimeout(() => {\n const error = new K256WebSocketError(\n 'PING_TIMEOUT',\n 'Server did not respond to ping'\n );\n this.handleError(error);\n \n // Force reconnect\n this.ws?.close(CloseCode.GOING_AWAY, 'Ping timeout');\n }, this.config.pongTimeoutMs);\n }\n\n private clearPongTimeout(): void {\n if (this.pongTimer) {\n clearTimeout(this.pongTimer);\n this.pongTimer = null;\n }\n }\n\n private startHeartbeatTimeout(): void {\n this.resetHeartbeatTimeout();\n }\n\n private resetHeartbeatTimeout(): void {\n if (this.heartbeatTimer) {\n clearTimeout(this.heartbeatTimer);\n }\n \n this.heartbeatTimer = setTimeout(() => {\n const error = new K256WebSocketError(\n 'HEARTBEAT_TIMEOUT',\n 'No heartbeat received from server'\n );\n this.handleError(error);\n // Don't disconnect - heartbeat is informational\n }, this.config.heartbeatTimeoutMs);\n }\n\n private shouldReconnect(closeCode: number): boolean {\n // Don't reconnect on auth failures or policy violations\n if (closeCode === CloseCode.POLICY_VIOLATION) {\n return false;\n }\n \n // Check max attempts\n if (this.reconnectAttempts >= this.config.maxReconnectAttempts) {\n return false;\n }\n \n return true;\n }\n\n private scheduleReconnect(): void {\n this.setState('reconnecting');\n this.reconnectAttempts++;\n \n // Exponential backoff with jitter\n const baseDelay = Math.min(\n this.config.reconnectDelayMs * Math.pow(2, this.reconnectAttempts - 1),\n this.config.maxReconnectDelayMs\n );\n const jitter = Math.random() * 0.3 * baseDelay;\n const delay = Math.floor(baseDelay + jitter);\n \n this.config.onReconnecting?.(this.reconnectAttempts, delay);\n \n this.reconnectTimer = setTimeout(async () => {\n try {\n await this.doConnect();\n } catch {\n // Error already handled in doConnect\n }\n }, delay);\n }\n\n private getCloseReason(code: number): string {\n switch (code) {\n case CloseCode.NORMAL:\n return 'Normal closure';\n case CloseCode.GOING_AWAY:\n return 'Server shutting down';\n case CloseCode.PROTOCOL_ERROR:\n return 'Protocol error';\n case CloseCode.UNSUPPORTED_DATA:\n return 'Unsupported message type';\n case CloseCode.ABNORMAL:\n return 'Connection lost unexpectedly';\n case CloseCode.INVALID_PAYLOAD:\n return 'Invalid message data';\n case CloseCode.POLICY_VIOLATION:\n return 'Authentication failed or rate limited';\n case CloseCode.MESSAGE_TOO_BIG:\n return 'Message too large';\n case CloseCode.INTERNAL_ERROR:\n return 'Server error';\n case CloseCode.SERVICE_RESTART:\n return 'Server is restarting';\n case CloseCode.TRY_AGAIN_LATER:\n return 'Server overloaded';\n default:\n return `Unknown close code: ${code}`;\n }\n }\n\n private getErrorCodeFromClose(code: number): K256ErrorCode {\n switch (code) {\n case CloseCode.POLICY_VIOLATION:\n return 'AUTH_FAILED';\n case CloseCode.INTERNAL_ERROR:\n case CloseCode.SERVICE_RESTART:\n case CloseCode.TRY_AGAIN_LATER:\n return 'SERVER_ERROR';\n case CloseCode.PROTOCOL_ERROR:\n case CloseCode.UNSUPPORTED_DATA:\n case CloseCode.INVALID_PAYLOAD:\n return 'PROTOCOL_ERROR';\n default:\n return 'CONNECTION_LOST';\n }\n }\n}\n\nexport default K256WebSocketClient;\n","/**\n * Binary message decoder for Leader Schedule WebSocket protocol\n * \n * Decodes wincode messages from the leader-schedule server into typed objects.\n * Matches K2 decoder pattern: manual DataView offset walking, little-endian.\n * \n * Wire format: [1 byte MessageType][N bytes wincode payload]\n */\n\nimport { base58Encode } from '../utils/base58';\nimport type {\n LeaderDecodedMessage,\n GossipPeer,\n} from './types';\n\n/** Message type tag constants (must match leader-schedule server protocol.rs) */\nexport const LeaderMessageTag = {\n Subscribe: 0x01,\n Subscribed: 0x02,\n LeaderSchedule: 0x10,\n GossipSnapshot: 0x11,\n GossipDiff: 0x12,\n SlotUpdate: 0x13,\n RoutingHealth: 0x14,\n SkipEvent: 0x15,\n IpChange: 0x16,\n Heartbeat: 0xFD,\n Ping: 0xFE,\n Error: 0xFF,\n} as const;\n\n/** Mutable offset tracker for sequential reading */\ntype Offset = { v: number };\n\n/** Read a wincode u64 (little-endian) */\nfunction readU64(view: DataView, o: Offset): number {\n const val = Number(view.getBigUint64(o.v, true));\n o.v += 8;\n return val;\n}\n\n/** Read a wincode u32 (little-endian) */\nfunction readU32(view: DataView, o: Offset): number {\n const val = view.getUint32(o.v, true);\n o.v += 4;\n return val;\n}\n\n/** Read a wincode u16 (little-endian) */\nfunction readU16(view: DataView, o: Offset): number {\n const val = view.getUint16(o.v, true);\n o.v += 2;\n return val;\n}\n\n/** Read a wincode u8 */\nfunction readU8(view: DataView, o: Offset): number {\n const val = view.getUint8(o.v);\n o.v += 1;\n return val;\n}\n\n/** Read a wincode bool */\nfunction readBool(view: DataView, o: Offset): boolean {\n return readU8(view, o) !== 0;\n}\n\n/** Read a [u8; 32] pubkey as base58 string */\nfunction readPubkey(data: ArrayBuffer, o: Offset): string {\n const bytes = new Uint8Array(data, o.v, 32);\n o.v += 32;\n return base58Encode(bytes);\n}\n\n/** Read a wincode Vec<u8> as string */\nfunction readVecU8AsString(view: DataView, data: ArrayBuffer, o: Offset): string {\n const len = readU64(view, o);\n const bytes = new Uint8Array(data, o.v, len);\n o.v += len;\n return new TextDecoder().decode(bytes);\n}\n\n/** Read a wincode Option<SocketAddrWire>: tag + ip[16] + port:u16 + is_ipv4:bool */\nfunction readOptSocketAddr(view: DataView, o: Offset): string | null {\n const tag = readU8(view, o);\n if (tag === 0) return null;\n const ipBytes = new Uint8Array(view.buffer, view.byteOffset + o.v, 16);\n o.v += 16;\n const port = readU16(view, o);\n const isIpv4 = readBool(view, o);\n if (isIpv4) {\n return `${ipBytes[12]}.${ipBytes[13]}.${ipBytes[14]}.${ipBytes[15]}:${port}`;\n }\n return `[ipv6]:${port}`;\n}\n\n/** Read a wincode Vec<[u8;32]> as base58 string array */\nfunction readPubkeyVec(view: DataView, data: ArrayBuffer, o: Offset): string[] {\n const count = readU64(view, o);\n const keys: string[] = [];\n for (let i = 0; i < count; i++) {\n keys.push(readPubkey(data, o));\n }\n return keys;\n}\n\n/** Read a single GossipPeer from wincode */\nfunction readGossipPeer(view: DataView, data: ArrayBuffer, o: Offset): GossipPeer {\n return {\n identity: readPubkey(data, o),\n tpuQuic: readOptSocketAddr(view, o),\n tpuUdp: readOptSocketAddr(view, o),\n tpuForwardsQuic: readOptSocketAddr(view, o),\n tpuForwardsUdp: readOptSocketAddr(view, o),\n tpuVote: readOptSocketAddr(view, o),\n tpuVoteQuic: readOptSocketAddr(view, o),\n gossipAddr: readOptSocketAddr(view, o),\n shredVersion: readU16(view, o),\n version: readVecU8AsString(view, data, o),\n activatedStake: readU64(view, o),\n commission: readU8(view, o),\n isDelinquent: readBool(view, o),\n votePubkey: readPubkey(data, o),\n lastVote: readU64(view, o),\n rootSlot: readU64(view, o),\n wallclock: readU64(view, o),\n };\n}\n\n/** Read a wincode Vec<GossipPeer> */\nfunction readGossipPeerVec(view: DataView, data: ArrayBuffer, o: Offset): GossipPeer[] {\n const count = readU64(view, o);\n const peers: GossipPeer[] = [];\n for (let i = 0; i < count; i++) {\n peers.push(readGossipPeer(view, data, o));\n }\n return peers;\n}\n\n/**\n * Decode a binary WebSocket message from the leader-schedule server.\n * \n * @param data - Raw binary data from WebSocket\n * @returns Decoded message or null if unrecognized type\n */\nexport function decodeLeaderMessage(data: ArrayBuffer): LeaderDecodedMessage | null {\n const view = new DataView(data);\n if (data.byteLength < 1) return null;\n\n const msgType = view.getUint8(0);\n const payload = data.slice(1);\n const pv = new DataView(payload);\n\n switch (msgType) {\n case LeaderMessageTag.Subscribed: {\n const text = new TextDecoder().decode(payload);\n try {\n return { type: 'subscribed', data: JSON.parse(text) };\n } catch {\n return null;\n }\n }\n\n case LeaderMessageTag.Error: {\n return { type: 'error', data: { message: new TextDecoder().decode(payload) } };\n }\n\n case LeaderMessageTag.SlotUpdate: {\n if (payload.byteLength < 48) return null;\n const o: Offset = { v: 0 };\n return {\n type: 'slot_update',\n kind: 'snapshot',\n data: {\n slot: readU64(pv, o),\n leader: readPubkey(payload, o),\n blockHeight: readU64(pv, o),\n },\n };\n }\n\n case LeaderMessageTag.Heartbeat: {\n if (payload.byteLength < 24) return null;\n const o: Offset = { v: 0 };\n return {\n type: 'heartbeat',\n kind: 'snapshot',\n data: {\n timestampMs: readU64(pv, o),\n currentSlot: readU64(pv, o),\n connectedClients: readU32(pv, o),\n gossipPeers: readU32(pv, o),\n },\n };\n }\n\n case LeaderMessageTag.SkipEvent: {\n if (payload.byteLength < 48) return null;\n const o: Offset = { v: 0 };\n return {\n type: 'skip_event',\n kind: 'event',\n key: 'leader',\n data: {\n slot: readU64(pv, o),\n leader: readPubkey(payload, o),\n assigned: readU32(pv, o),\n produced: readU32(pv, o),\n },\n };\n }\n\n case LeaderMessageTag.RoutingHealth: {\n if (payload.byteLength < 8) return null;\n try {\n const o: Offset = { v: 0 };\n const leadersTotal = readU32(pv, o);\n const leadersInGossip = readU32(pv, o);\n const leadersMissingGossip = readPubkeyVec(pv, payload, o);\n const leadersWithoutTpuQuic = readPubkeyVec(pv, payload, o);\n const leadersDelinquent = readPubkeyVec(pv, payload, o);\n return {\n type: 'routing_health',\n kind: 'snapshot',\n data: {\n leadersTotal,\n leadersInGossip,\n leadersMissingGossip,\n leadersWithoutTpuQuic,\n leadersDelinquent,\n coverage: `${leadersTotal > 0 ? (leadersInGossip / leadersTotal * 100).toFixed(1) : 0}%`,\n },\n };\n } catch { return null; }\n }\n\n case LeaderMessageTag.IpChange: {\n if (payload.byteLength < 32) return null;\n try {\n const o: Offset = { v: 0 };\n const identity = readPubkey(payload, o);\n const oldIp = readVecU8AsString(pv, payload, o);\n const newIp = readVecU8AsString(pv, payload, o);\n const timestampMs = readU64(pv, o);\n return {\n type: 'ip_change',\n kind: 'event',\n key: 'identity',\n data: { identity, oldIp, newIp, timestampMs },\n };\n } catch { return null; }\n }\n\n case LeaderMessageTag.GossipSnapshot: {\n if (payload.byteLength < 8) return null;\n try {\n const o: Offset = { v: 0 };\n const timestampMs = readU64(pv, o);\n const peers = readGossipPeerVec(pv, payload, o);\n return {\n type: 'gossip_snapshot',\n kind: 'snapshot',\n key: 'identity',\n data: { timestampMs, count: peers.length, peers },\n };\n } catch { return null; }\n }\n\n case LeaderMessageTag.GossipDiff: {\n if (payload.byteLength < 8) return null;\n try {\n const o: Offset = { v: 0 };\n const timestampMs = readU64(pv, o);\n const added = readGossipPeerVec(pv, payload, o);\n const removed = readPubkeyVec(pv, payload, o);\n const updated = readGossipPeerVec(pv, payload, o);\n return {\n type: 'gossip_diff',\n kind: 'diff',\n key: 'identity',\n data: { timestampMs, added, removed, updated },\n };\n } catch { return null; }\n }\n\n case LeaderMessageTag.LeaderSchedule: {\n if (payload.byteLength < 16) return null;\n try {\n const o: Offset = { v: 0 };\n const epoch = readU64(pv, o);\n const slotsInEpoch = readU64(pv, o);\n const validatorCount = readU64(pv, o);\n const schedule: Array<{ identity: string; slots: number; slotIndices: number[] }> = [];\n for (let i = 0; i < validatorCount; i++) {\n const identity = readPubkey(payload, o);\n const slotCount = readU64(pv, o);\n const slotIndices: number[] = [];\n for (let j = 0; j < slotCount; j++) {\n slotIndices.push(readU32(pv, o));\n }\n schedule.push({ identity, slots: slotIndices.length, slotIndices });\n }\n return {\n type: 'leader_schedule',\n kind: 'snapshot',\n data: { epoch, slotsInEpoch, validators: schedule.length, schedule },\n };\n } catch { return null; }\n }\n\n default:\n return null;\n }\n}\n","/**\n * Leader Schedule WebSocket message types and interfaces\n * \n * The leader-schedule WS uses wincode binary protocol (matching K2 pattern).\n * Wire format: [1-byte tag][wincode payload]\n * Every decoded message has:\n * - type: message type name\n * - kind: \"snapshot\" (full state) | \"diff\" (merge into snapshot) | \"event\" (append-only)\n * - key: primary key field for merging (on diff/event types)\n * - data: typed payload\n * \n * @see https://k256.xyz/docs/leader-schedule\n */\n\n/**\n * Leader Schedule WebSocket channels\n */\nexport const LeaderChannel = {\n /** Full epoch leader schedule (on connect + epoch change) */\n LeaderSchedule: 'leader_schedule',\n /** Gossip peers (snapshot on connect, then diffs) */\n Gossip: 'gossip',\n /** Real-time slot updates with current leader */\n Slots: 'slots',\n /** Skip events, IP changes, routing health */\n Alerts: 'alerts',\n} as const;\n\nexport type LeaderChannelValue = typeof LeaderChannel[keyof typeof LeaderChannel];\n\n/** All available channels */\nexport const ALL_LEADER_CHANNELS: LeaderChannelValue[] = [\n LeaderChannel.LeaderSchedule,\n LeaderChannel.Gossip,\n LeaderChannel.Slots,\n LeaderChannel.Alerts,\n];\n\n/**\n * Message kind — tells you how to consume the message\n */\nexport type MessageKind = 'snapshot' | 'diff' | 'event';\n\n// ═══════════════════════════════════════════════════════════════════════\n// Message Interfaces\n// ═══════════════════════════════════════════════════════════════════════\n\n/** Protocol schema entry (included in subscribed handshake) */\nexport interface MessageSchemaEntry {\n type: string;\n tag: string;\n kind: MessageKind;\n key?: string;\n description: string;\n}\n\n/** Subscribed response — connection handshake */\nexport interface LeaderSubscribedMessage {\n type: 'subscribed';\n data: {\n channels: string[];\n currentSlot: number;\n epoch: number;\n schema: MessageSchemaEntry[];\n };\n}\n\n/** Full epoch leader schedule (snapshot — replaces previous) */\nexport interface LeaderScheduleMessage {\n type: 'leader_schedule';\n kind: 'snapshot';\n data: {\n epoch: number;\n slotsInEpoch: number;\n validators: number;\n schedule: Array<{\n identity: string;\n slots: number;\n slotIndices: number[];\n }>;\n };\n}\n\n/** Gossip peer data */\nexport interface GossipPeer {\n identity: string;\n tpuQuic: string | null;\n tpuUdp: string | null;\n tpuForwardsQuic: string | null;\n tpuForwardsUdp: string | null;\n tpuVote: string | null;\n tpuVoteQuic: string | null;\n gossipAddr: string | null;\n shredVersion: number;\n version: string;\n activatedStake: number;\n commission: number;\n isDelinquent: boolean;\n votePubkey: string;\n lastVote: number;\n rootSlot: number;\n wallclock: number;\n}\n\n/** Full gossip peer list (snapshot — apply gossip_diff to keep current) */\nexport interface GossipSnapshotMessage {\n type: 'gossip_snapshot';\n kind: 'snapshot';\n key: 'identity';\n data: {\n timestampMs: number;\n count: number;\n peers: GossipPeer[];\n };\n}\n\n/** Incremental gossip changes (diff — merge into snapshot using identity) */\nexport interface GossipDiffMessage {\n type: 'gossip_diff';\n kind: 'diff';\n key: 'identity';\n data: {\n timestampMs: number;\n added: GossipPeer[];\n removed: string[];\n updated: GossipPeer[];\n };\n}\n\n/** Current slot with leader identity (snapshot — each replaces previous) */\nexport interface SlotUpdateMessage {\n type: 'slot_update';\n kind: 'snapshot';\n data: {\n slot: number;\n leader: string;\n blockHeight: number;\n };\n}\n\n/** Routing health summary (snapshot — each replaces previous) */\nexport interface RoutingHealthMessage {\n type: 'routing_health';\n kind: 'snapshot';\n data: {\n leadersTotal: number;\n leadersInGossip: number;\n leadersMissingGossip: string[];\n leadersWithoutTpuQuic: string[];\n leadersDelinquent: string[];\n coverage: string;\n };\n}\n\n/** Block production stats per validator (event — cumulative) */\nexport interface SkipEventMessage {\n type: 'skip_event';\n kind: 'event';\n key: 'leader';\n data: {\n slot: number;\n leader: string;\n assigned: number;\n produced: number;\n };\n}\n\n/** Validator IP address change (event) */\nexport interface IpChangeMessage {\n type: 'ip_change';\n kind: 'event';\n key: 'identity';\n data: {\n identity: string;\n oldIp: string;\n newIp: string;\n timestampMs: number;\n };\n}\n\n/** Server heartbeat (snapshot — each replaces previous) */\nexport interface LeaderHeartbeatMessage {\n type: 'heartbeat';\n kind: 'snapshot';\n data: {\n timestampMs: number;\n currentSlot: number;\n connectedClients: number;\n gossipPeers: number;\n };\n}\n\n/** Error from server */\nexport interface LeaderErrorMessage {\n type: 'error';\n data: {\n message: string;\n };\n}\n\n/** Union of all leader-schedule message types */\nexport type LeaderDecodedMessage =\n | LeaderSubscribedMessage\n | LeaderScheduleMessage\n | GossipSnapshotMessage\n | GossipDiffMessage\n | SlotUpdateMessage\n | RoutingHealthMessage\n | SkipEventMessage\n | IpChangeMessage\n | LeaderHeartbeatMessage\n | LeaderErrorMessage;\n","/**\n * Leader Schedule WebSocket Client\n * \n * Connects to the K256 leader-schedule service via the Gateway.\n * Binary mode by default (wincode protocol, matching K2 pattern).\n * JSON mode opt-in via mode: 'json' (gateway decodes wincode to JSON).\n * \n * @example\n * ```typescript\n * import { LeaderWebSocketClient } from '@k256/sdk/leader-ws';\n * \n * const client = new LeaderWebSocketClient({\n * apiKey: 'your-api-key',\n * onSlotUpdate: (msg) => console.log('Slot:', msg.data.slot, 'Leader:', msg.data.leader),\n * onRoutingHealth: (msg) => console.log('Coverage:', msg.data.coverage),\n * onGossipDiff: (msg) => console.log('Peers changed:', msg.data.added.length, 'added'),\n * });\n * \n * await client.connect();\n * ```\n */\n\nimport { decodeLeaderMessage } from './decoder';\nimport {\n ALL_LEADER_CHANNELS,\n type LeaderChannelValue,\n type LeaderDecodedMessage,\n type LeaderSubscribedMessage,\n type LeaderScheduleMessage,\n type GossipSnapshotMessage,\n type GossipDiffMessage,\n type SlotUpdateMessage,\n type RoutingHealthMessage,\n type SkipEventMessage,\n type IpChangeMessage,\n type LeaderHeartbeatMessage,\n type LeaderErrorMessage,\n} from './types';\n\n/**\n * Connection state\n */\nexport type ConnectionState = \n | 'disconnected'\n | 'connecting'\n | 'connected'\n | 'reconnecting'\n | 'closed';\n\n/**\n * Leader WebSocket client configuration\n */\nexport interface LeaderWebSocketClientConfig {\n /** API key for authentication */\n apiKey: string;\n /** Gateway URL (default: wss://gateway.k256.xyz/v1/leader-ws) */\n url?: string;\n /** Message format: 'binary' (default, efficient) or 'json' (debugging via gateway) */\n mode?: 'binary' | 'json';\n /** Channels to subscribe to (default: all channels) */\n channels?: LeaderChannelValue[];\n \n // Reconnection settings\n /** Enable automatic reconnection (default: true) */\n autoReconnect?: boolean;\n /** Initial reconnect delay in ms (default: 1000) */\n reconnectDelayMs?: number;\n /** Max reconnect delay in ms (default: 30000) */\n maxReconnectDelayMs?: number;\n /** Max reconnect attempts (default: Infinity) */\n maxReconnectAttempts?: number;\n \n // Event callbacks\n /** Called when connection state changes */\n onStateChange?: (state: ConnectionState, prevState: ConnectionState) => void;\n /** Called on successful connection */\n onConnect?: () => void;\n /** Called on disconnection */\n onDisconnect?: (code: number, reason: string, wasClean: boolean) => void;\n /** Called on reconnection attempt */\n onReconnecting?: (attempt: number, delayMs: number) => void;\n /** Called on any error */\n onError?: (error: LeaderWebSocketError) => void;\n \n // Message callbacks\n /** Called on subscription confirmed (includes protocol schema) */\n onSubscribed?: (msg: LeaderSubscribedMessage) => void;\n /** Called on full leader schedule (snapshot — replaces previous) */\n onLeaderSchedule?: (msg: LeaderScheduleMessage) => void;\n /** Called on full gossip peer snapshot (snapshot — key: identity) */\n onGossipSnapshot?: (msg: GossipSnapshotMessage) => void;\n /** Called on gossip diff (diff — merge into snapshot using identity) */\n onGossipDiff?: (msg: GossipDiffMessage) => void;\n /** Called on slot update (snapshot — each replaces previous) */\n onSlotUpdate?: (msg: SlotUpdateMessage) => void;\n /** Called on routing health (snapshot — each replaces previous) */\n onRoutingHealth?: (msg: RoutingHealthMessage) => void;\n /** Called on skip event (event — block production stats) */\n onSkipEvent?: (msg: SkipEventMessage) => void;\n /** Called on IP change event */\n onIpChange?: (msg: IpChangeMessage) => void;\n /** Called on heartbeat (every 10s) */\n onHeartbeat?: (msg: LeaderHeartbeatMessage) => void;\n /** Called on any message (raw) */\n onMessage?: (msg: LeaderDecodedMessage) => void;\n}\n\n/**\n * Error codes for leader WebSocket\n */\nexport type LeaderErrorCode =\n | 'CONNECTION_FAILED'\n | 'CONNECTION_LOST'\n | 'AUTH_FAILED'\n | 'SERVER_ERROR'\n | 'INVALID_MESSAGE'\n | 'RECONNECT_FAILED';\n\n/**\n * WebSocket error with context\n */\nexport class LeaderWebSocketError extends Error {\n constructor(\n public readonly code: LeaderErrorCode,\n message: string,\n public readonly closeCode?: number,\n public readonly closeReason?: string,\n ) {\n super(message);\n this.name = 'LeaderWebSocketError';\n }\n\n get isRecoverable(): boolean {\n return this.code !== 'AUTH_FAILED';\n }\n}\n\n/**\n * Leader Schedule WebSocket Client\n * \n * Connects to the leader-schedule service via the Gateway.\n * Binary mode by default (wincode protocol). JSON mode opt-in via gateway.\n * Automatically subscribes to configured channels on connect/reconnect.\n */\nexport class LeaderWebSocketClient {\n private ws: WebSocket | null = null;\n private readonly config: Required<Pick<LeaderWebSocketClientConfig,\n 'apiKey' | 'url' | 'mode' | 'channels' | 'autoReconnect' | 'reconnectDelayMs' | 'maxReconnectDelayMs' | 'maxReconnectAttempts'\n >> & LeaderWebSocketClientConfig;\n \n private _state: ConnectionState = 'disconnected';\n private reconnectAttempts = 0;\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n private isIntentionallyClosed = false;\n\n /** Current connection state */\n get state(): ConnectionState { return this._state; }\n\n /** Whether currently connected */\n get isConnected(): boolean {\n return this._state === 'connected' && this.ws?.readyState === WebSocket.OPEN;\n }\n\n constructor(config: LeaderWebSocketClientConfig) {\n this.config = {\n url: 'wss://gateway.k256.xyz/v1/leader-ws',\n mode: 'binary',\n channels: ALL_LEADER_CHANNELS,\n autoReconnect: true,\n reconnectDelayMs: 1000,\n maxReconnectDelayMs: 30000,\n maxReconnectAttempts: Infinity,\n ...config,\n };\n }\n\n /**\n * Connect to the leader-schedule WebSocket\n */\n async connect(): Promise<void> {\n if (this._state === 'connected' || this._state === 'connecting') return;\n \n this.isIntentionallyClosed = false;\n this.setState('connecting');\n\n return new Promise((resolve, reject) => {\n try {\n const url = `${this.config.url}?apiKey=${encodeURIComponent(this.config.apiKey)}`;\n this.ws = new WebSocket(url);\n \n // Binary mode needs arraybuffer\n if (this.config.mode === 'binary') {\n this.ws.binaryType = 'arraybuffer';\n }\n\n this.ws.onopen = () => {\n this.setState('connected');\n this.reconnectAttempts = 0;\n \n if (this.config.mode === 'binary') {\n // Binary mode: send 0x01 tag + JSON payload\n const payload = JSON.stringify({ channels: this.config.channels });\n const bytes = new TextEncoder().encode(payload);\n const msg = new Uint8Array(1 + bytes.length);\n msg[0] = 0x01; // MSG_SUBSCRIBE\n msg.set(bytes, 1);\n this.ws!.send(msg.buffer);\n } else {\n // JSON mode: send text (gateway decodes wincode to JSON)\n this.ws!.send(JSON.stringify({\n type: 'subscribe',\n channels: this.config.channels,\n format: 'json',\n }));\n }\n \n this.config.onConnect?.();\n resolve();\n };\n\n this.ws.onmessage = (event) => {\n if (this.config.mode === 'binary' && event.data instanceof ArrayBuffer) {\n // Binary mode: decode wincode with SDK decoder\n const decoded = decodeLeaderMessage(event.data);\n if (decoded) {\n this.dispatchMessage(decoded);\n }\n } else if (typeof event.data === 'string') {\n // JSON mode: parse text frames from gateway\n this.handleJsonMessage(event.data);\n }\n };\n\n this.ws.onclose = (event) => {\n const wasConnected = this._state === 'connected';\n this.ws = null;\n \n if (this.isIntentionallyClosed) {\n this.setState('closed');\n this.config.onDisconnect?.(event.code, event.reason, event.wasClean);\n return;\n }\n \n this.config.onDisconnect?.(event.code, event.reason, event.wasClean);\n \n // Check for auth failure (don't reconnect)\n if (event.code === 1008 || event.code === 4001 || event.code === 4003) {\n this.setState('closed');\n this.config.onError?.(new LeaderWebSocketError(\n 'AUTH_FAILED', `Authentication failed: ${event.reason}`, event.code, event.reason\n ));\n if (!wasConnected) reject(new LeaderWebSocketError('AUTH_FAILED', event.reason, event.code));\n return;\n }\n \n // Auto-reconnect\n if (this.config.autoReconnect && this.reconnectAttempts < this.config.maxReconnectAttempts) {\n this.scheduleReconnect();\n } else {\n this.setState('disconnected');\n }\n \n if (!wasConnected) reject(new LeaderWebSocketError('CONNECTION_FAILED', 'WebSocket closed before connect'));\n };\n\n this.ws.onerror = () => {\n this.config.onError?.(new LeaderWebSocketError('CONNECTION_FAILED', 'WebSocket connection error'));\n };\n } catch (err) {\n this.setState('disconnected');\n reject(err);\n }\n });\n }\n\n /**\n * Disconnect from the WebSocket\n */\n disconnect(): void {\n this.isIntentionallyClosed = true;\n this.clearTimers();\n \n if (this.ws) {\n if (this.ws.readyState === WebSocket.OPEN || this.ws.readyState === WebSocket.CONNECTING) {\n this.ws.close(1000, 'Client disconnect');\n }\n this.ws = null;\n }\n \n this.setState('closed');\n }\n\n // ── Private ──\n\n /** Handle JSON text frame (from gateway JSON mode) */\n private handleJsonMessage(raw: string): void {\n try {\n const msg = JSON.parse(raw) as LeaderDecodedMessage;\n this.dispatchMessage(msg);\n } catch {\n this.config.onError?.(new LeaderWebSocketError('INVALID_MESSAGE', 'Failed to parse message'));\n }\n }\n\n /** Dispatch a decoded message to typed callbacks */\n private dispatchMessage(msg: LeaderDecodedMessage): void {\n switch (msg.type) {\n case 'subscribed':\n this.config.onSubscribed?.(msg as LeaderSubscribedMessage);\n break;\n case 'leader_schedule':\n this.config.onLeaderSchedule?.(msg as LeaderScheduleMessage);\n break;\n case 'gossip_snapshot':\n this.config.onGossipSnapshot?.(msg as GossipSnapshotMessage);\n break;\n case 'gossip_diff':\n this.config.onGossipDiff?.(msg as GossipDiffMessage);\n break;\n case 'slot_update':\n this.config.onSlotUpdate?.(msg as SlotUpdateMessage);\n break;\n case 'routing_health':\n this.config.onRoutingHealth?.(msg as RoutingHealthMessage);\n break;\n case 'skip_event':\n this.config.onSkipEvent?.(msg as SkipEventMessage);\n break;\n case 'ip_change':\n this.config.onIpChange?.(msg as IpChangeMessage);\n break;\n case 'heartbeat':\n this.config.onHeartbeat?.(msg as LeaderHeartbeatMessage);\n break;\n case 'error':\n this.config.onError?.(new LeaderWebSocketError(\n 'SERVER_ERROR', (msg as LeaderErrorMessage).data.message\n ));\n break;\n }\n \n // Generic handler\n this.config.onMessage?.(msg);\n }\n\n private setState(state: ConnectionState): void {\n const prev = this._state;\n if (prev === state) return;\n this._state = state;\n this.config.onStateChange?.(state, prev);\n }\n\n private scheduleReconnect(): void {\n this.setState('reconnecting');\n this.reconnectAttempts++;\n \n const delay = Math.min(\n this.config.reconnectDelayMs * Math.pow(2, this.reconnectAttempts - 1),\n this.config.maxReconnectDelayMs\n );\n \n this.config.onReconnecting?.(this.reconnectAttempts, delay);\n \n this.reconnectTimer = setTimeout(() => {\n this.connect().catch(() => {\n // Error handled in onclose/onerror\n });\n }, delay);\n }\n\n private clearTimers(): void {\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n }\n}\n","/**\n * Shared type definitions for K256 SDK\n *\n * These types are used across WebSocket and REST API modules.\n *\n * @module @k256/sdk/types\n */\n\n/**\n * Pool state from DEX\n */\nexport interface Pool {\n /** Pool address (Base58) */\n address: string;\n /** Protocol/DEX name */\n protocol: string;\n /** Token mints in the pool (Base58) */\n tokenMints: string[];\n /** Token balances (as strings for precision) */\n tokenBalances: string[];\n /** Token decimals */\n tokenDecimals: number[];\n}\n\n/**\n * Real-time pool state update\n */\nexport interface PoolUpdate extends Pool {\n /** Global sequence number (monotonically increasing) */\n sequence: number;\n /** Solana slot when updated */\n slot: number;\n /** Write version within slot */\n writeVersion: number;\n /** Best bid price/size (orderbook pools only) */\n bestBid?: OrderLevel;\n /** Best ask price/size (orderbook pools only) */\n bestAsk?: OrderLevel;\n}\n\n/**\n * Order book level (bid or ask)\n */\nexport interface OrderLevel {\n /** Price in base units (as string for precision) */\n price: string;\n /** Size in base units (as string for precision) */\n size: string;\n}\n\n/**\n * Token metadata\n */\nexport interface Token {\n /** Token mint address (Base58) */\n mint: string;\n /** Token symbol (e.g., \"SOL\", \"USDC\") */\n symbol: string;\n /** Token name */\n name: string;\n /** Decimal places */\n decimals: number;\n /** Logo URL (optional) */\n logoUri?: string;\n /** Coingecko ID (optional) */\n coingeckoId?: string;\n}\n\n/**\n * Swap quote from aggregator\n */\nexport interface Quote {\n /** Input token mint (Base58) */\n inputMint: string;\n /** Output token mint (Base58) */\n outputMint: string;\n /** Input amount (as string for precision) */\n inAmount: string;\n /** Output amount (as string for precision) */\n outAmount: string;\n /** Price impact in basis points */\n priceImpactBps: number;\n /** Slippage in basis points */\n slippageBps: number;\n /** Route plan (DEXes used) */\n routePlan: RoutePlanStep[];\n /** Context slot */\n contextSlot: number;\n /** Algorithm used for routing */\n algorithm: string;\n}\n\n/**\n * Step in a swap route\n */\nexport interface RoutePlanStep {\n /** DEX/protocol name */\n protocol: string;\n /** Pool address (Base58) */\n poolAddress: string;\n /** Input mint for this step */\n inputMint: string;\n /** Output mint for this step */\n outputMint: string;\n /** Percentage of input for this step (0-100) */\n percent: number;\n}\n\n/**\n * Mini block statistics (compact form used in FeeMarket.recentBlocks)\n */\nexport interface BlockMiniStats {\n slot: number\n cuConsumed: number\n txCount: number\n utilizationPct: number\n avgCuPrice: number\n}\n\n/**\n * Direction of the fee trend\n */\nexport type TrendDirection = 'rising' | 'falling' | 'stable'\n\n/**\n * Full block-level statistics (standalone message 0x0F)\n */\nexport interface BlockStats {\n slot: number\n cuConsumed: number\n executionCu: number\n cuLimit: number\n cuRemaining: number\n utilizationPct: number\n txCount: number\n avgCuPerTx: number\n avgCuPrice: number\n minCuPrice: number\n maxCuPrice: number\n timestampMs: number\n}\n\n/**\n * Per-writable-account fee data\n *\n * Solana's scheduler limits each writable account to 12M CU per block.\n * Fee pricing is per-account: the fee you pay should be\n * max(p75(account) for account in your writable accounts).\n */\nexport interface AccountFee {\n /** Account public key (Base58) */\n pubkey: string;\n /** Total transactions touching this account in the window */\n totalTxs: number;\n /** Number of slots where this account was active */\n activeSlots: number;\n /** Total CU consumed by transactions touching this account */\n cuConsumed: number;\n /** Account utilization percentage (0-100) of 12M CU limit */\n utilizationPct: number;\n /** 25th percentile fee in microlamports/CU */\n p25: number;\n /** 50th percentile fee in microlamports/CU */\n p50: number;\n /** 75th percentile fee in microlamports/CU */\n p75: number;\n /** 90th percentile fee in microlamports/CU */\n p90: number;\n /** Minimum non-zero fee observed */\n minNonzeroPrice: number;\n}\n\n/**\n * Fee market update (per-writable-account model)\n *\n * Replaces the old flat PriorityFees struct. Now provides per-account\n * fee data so clients can price transactions based on the specific\n * writable accounts they touch.\n */\nexport interface FeeMarket {\n /** Current slot */\n slot: number;\n /** Timestamp in milliseconds */\n timestampMs: number;\n /** Recommended fee in microlamports/CU (max p75 across hottest accounts) */\n recommended: number;\n /** Network state (0=low, 1=normal, 2=high, 3=extreme) */\n state: NetworkState;\n /** Whether data is stale */\n isStale: boolean;\n /** Block utilization percentage (0-100) */\n blockUtilizationPct: number;\n /** Number of blocks in the observation window */\n blocksInWindow: number;\n /** Per-account fee data */\n accounts: AccountFee[];\n /** Recent block mini-stats (v3) */\n recentBlocks: BlockMiniStats[];\n /** Fee trend direction (v3) */\n trend: TrendDirection;\n}\n\n/**\n * Network congestion state\n */\nexport enum NetworkState {\n Low = 0,\n Normal = 1,\n High = 2,\n Congested = 3,\n}\n\n/**\n * Recent blockhash for transactions\n */\nexport interface Blockhash {\n /** Slot of blockhash */\n slot: number;\n /** Timestamp in milliseconds */\n timestampMs: number;\n /** Recent blockhash (Base58) */\n blockhash: string;\n /** Block height */\n blockHeight: number;\n /** Last valid block height for transactions */\n lastValidBlockHeight: number;\n /** Whether data is stale */\n isStale: boolean;\n}\n\n/**\n * WebSocket connection heartbeat\n */\nexport interface Heartbeat {\n /** Server timestamp in milliseconds */\n timestampMs: number;\n /** Connection uptime in seconds */\n uptimeSecs: number;\n /** Total messages sent */\n messagesSent: number;\n /** Pool updates sent */\n poolUpdatesSent: number;\n /** Messages dropped (slow client) */\n messagesDropped: number;\n /** Whether pool updates are enabled */\n poolUpdatesEnabled: boolean;\n /** Subscribed channels */\n subscribedChannels: string[];\n /** Server sequence number */\n serverSequence: number;\n}\n\n/**\n * Subscribe request for WebSocket\n */\nexport interface SubscribeRequest {\n /** Channels to subscribe to */\n channels: ('pools' | 'priority_fees' | 'blockhash')[];\n /** Response format (default: binary) */\n format?: 'binary' | 'json';\n /** Filter by protocol names */\n protocols?: string[];\n /** Filter by pool addresses (Base58) */\n pools?: string[];\n /** Filter by token pairs [[mintA, mintB], ...] */\n tokenPairs?: [string, string][];\n}\n\n/**\n * Quote subscription request\n */\nexport interface SubscribeQuoteRequest {\n /** Input token mint (Base58) */\n inputMint: string;\n /** Output token mint (Base58) */\n outputMint: string;\n /** Amount in base units */\n amount: number;\n /** Slippage tolerance in basis points */\n slippageBps?: number;\n /** Refresh interval in milliseconds */\n refreshIntervalMs?: number;\n}\n"]}
package/dist/index.d.cts CHANGED
@@ -1,3 +1,4 @@
1
1
  export { BlockStatsMessage, BlockhashMessage, CloseCode, CloseCodeValue, ConnectionState, DecodedMessage, ErrorMessage, FeeMarketMessage, HeartbeatMessage, K256ErrorCode, K256WebSocketClient, K256WebSocketClientConfig, K256WebSocketError, MessageType, MessageTypeValue, PongMessage, PoolUpdateMessage, QuoteMessage, QuoteSubscribedMessage, SubscribeOptions, SubscribeQuoteOptions, SubscribedMessage, decodeMessage, decodePoolUpdateBatch } from './ws/index.cjs';
2
+ export { ALL_LEADER_CHANNELS, GossipDiffMessage, GossipPeer, GossipSnapshotMessage, IpChangeMessage, LeaderChannel, LeaderChannelValue, ConnectionState as LeaderConnectionState, LeaderDecodedMessage, LeaderErrorCode, LeaderErrorMessage, LeaderHeartbeatMessage, LeaderMessageTag, LeaderScheduleMessage, LeaderSubscribedMessage, LeaderWebSocketClient, LeaderWebSocketClientConfig, LeaderWebSocketError, MessageKind, MessageSchemaEntry, RoutingHealthMessage, SkipEventMessage, SlotUpdateMessage, decodeLeaderMessage } from './leader-ws/index.cjs';
2
3
  export { AccountFee, BlockMiniStats, BlockStats, Blockhash, FeeMarket, Heartbeat, NetworkState, OrderLevel, Pool, PoolUpdate, Quote, RoutePlanStep, SubscribeQuoteRequest, SubscribeRequest, Token, TrendDirection } from './types/index.cjs';
3
4
  export { base58Decode, base58Encode, isValidPubkey } from './utils/index.cjs';
package/dist/index.d.ts CHANGED
@@ -1,3 +1,4 @@
1
1
  export { BlockStatsMessage, BlockhashMessage, CloseCode, CloseCodeValue, ConnectionState, DecodedMessage, ErrorMessage, FeeMarketMessage, HeartbeatMessage, K256ErrorCode, K256WebSocketClient, K256WebSocketClientConfig, K256WebSocketError, MessageType, MessageTypeValue, PongMessage, PoolUpdateMessage, QuoteMessage, QuoteSubscribedMessage, SubscribeOptions, SubscribeQuoteOptions, SubscribedMessage, decodeMessage, decodePoolUpdateBatch } from './ws/index.js';
2
+ export { ALL_LEADER_CHANNELS, GossipDiffMessage, GossipPeer, GossipSnapshotMessage, IpChangeMessage, LeaderChannel, LeaderChannelValue, ConnectionState as LeaderConnectionState, LeaderDecodedMessage, LeaderErrorCode, LeaderErrorMessage, LeaderHeartbeatMessage, LeaderMessageTag, LeaderScheduleMessage, LeaderSubscribedMessage, LeaderWebSocketClient, LeaderWebSocketClientConfig, LeaderWebSocketError, MessageKind, MessageSchemaEntry, RoutingHealthMessage, SkipEventMessage, SlotUpdateMessage, decodeLeaderMessage } from './leader-ws/index.js';
2
3
  export { AccountFee, BlockMiniStats, BlockStats, Blockhash, FeeMarket, Heartbeat, NetworkState, OrderLevel, Pool, PoolUpdate, Quote, RoutePlanStep, SubscribeQuoteRequest, SubscribeRequest, Token, TrendDirection } from './types/index.js';
3
4
  export { base58Decode, base58Encode, isValidPubkey } from './utils/index.js';