@k256/sdk 0.1.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/base58.ts","../../src/ws/types.ts","../../src/ws/decoder.ts","../../src/ws/client.ts"],"names":[],"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 const bytes = [0];\n \n for (let i = 0; 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 // Leading '1's are leading zeros\n for (let i = 0; i < str.length && str[i] === '1'; i++) {\n bytes.push(0);\n }\n\n return new Uint8Array(bytes.reverse());\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\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 /** 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 isValid: boolean;\n bestBid?: { price: string; size: string };\n bestAsk?: { price: string; size: string };\n };\n}\n\n/**\n * Decoded priority fees from binary message\n * \n * All fields from K2 PriorityFeesWire\n */\nexport interface PriorityFeesMessage {\n type: 'priority_fees';\n data: {\n slot: number;\n timestampMs: number;\n /** Recommended priority fee in micro-lamports */\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 // Swap fee percentiles (for ≥50K CU transactions)\n swapP50: number;\n swapP75: number;\n swapP90: number;\n swapP99: number;\n /** Number of samples used for swap percentiles */\n swapSamples: number;\n // Landing probability fees (fee to land with X% probability)\n landingP50Fee: number;\n landingP75Fee: number;\n landingP90Fee: number;\n landingP99Fee: number;\n // Top fee tiers\n top10Fee: number;\n top25Fee: number;\n // Spike detection\n spikeDetected: boolean;\n spikeFee: number;\n };\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 | PriorityFeesMessage\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 { MessageType, type DecodedMessage, type PoolUpdateMessage } 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 // PriorityFeesWire bincode layout:\n // Offset 0: slot: u64\n // Offset 8: timestamp_ms: u64\n // Offset 16: recommended: u64\n // Offset 24: state: u8 (0=low, 1=normal, 2=high, 3=extreme)\n // Offset 25: is_stale: bool\n // Offset 26: swap_p50: u64\n // Offset 34: swap_p75: u64\n // Offset 42: swap_p90: u64\n // Offset 50: swap_p99: u64\n // Offset 58: swap_samples: u32\n // Offset 62: landing_p50_fee: u64\n // Offset 70: landing_p75_fee: u64\n // Offset 78: landing_p90_fee: u64\n // Offset 86: landing_p99_fee: u64\n // Offset 94: top_10_fee: u64\n // Offset 102: top_25_fee: u64\n // Offset 110: spike_detected: bool\n // Offset 111: spike_fee: u64\n // Total: 119 bytes\n if (payload.byteLength < 24) 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 = payload.byteLength > 24 ? payloadView.getUint8(24) : 1;\n const isStale = payload.byteLength > 25 ? payloadView.getUint8(25) !== 0 : false;\n\n // Swap percentiles (offset 26-57)\n let swapP50 = 0, swapP75 = 0, swapP90 = 0, swapP99 = 0;\n if (payload.byteLength >= 58) {\n swapP50 = Number(payloadView.getBigUint64(26, true));\n swapP75 = Number(payloadView.getBigUint64(34, true));\n swapP90 = Number(payloadView.getBigUint64(42, true));\n swapP99 = Number(payloadView.getBigUint64(50, true));\n }\n\n // Extended fields (offset 58+)\n let swapSamples = 0;\n let landingP50Fee = 0, landingP75Fee = 0, landingP90Fee = 0, landingP99Fee = 0;\n let top10Fee = 0, top25Fee = 0;\n let spikeDetected = false, spikeFee = 0;\n\n if (payload.byteLength >= 119) {\n swapSamples = payloadView.getUint32(58, true);\n landingP50Fee = Number(payloadView.getBigUint64(62, true));\n landingP75Fee = Number(payloadView.getBigUint64(70, true));\n landingP90Fee = Number(payloadView.getBigUint64(78, true));\n landingP99Fee = Number(payloadView.getBigUint64(86, true));\n top10Fee = Number(payloadView.getBigUint64(94, true));\n top25Fee = Number(payloadView.getBigUint64(102, true));\n spikeDetected = payloadView.getUint8(110) !== 0;\n spikeFee = Number(payloadView.getBigUint64(111, true));\n }\n\n return {\n type: 'priority_fees',\n data: {\n slot,\n timestampMs,\n recommended,\n state,\n isStale,\n swapP50,\n swapP75,\n swapP90,\n swapP99,\n swapSamples,\n landingP50Fee,\n landingP75Fee,\n landingP90Fee,\n landingP99Fee,\n top10Fee,\n top25Fee,\n spikeDetected,\n spikeFee,\n },\n };\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 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 // is_valid (bool)\n const isValid = offset < payload.byteLength ? payloadView.getUint8(offset) !== 0 : true;\n offset += 1;\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 isValid,\n },\n };\n } catch {\n return {\n type: 'pool_update',\n data: {\n sequence: 0,\n slot: 0,\n writeVersion: 0,\n protocol: 'unknown',\n poolAddress: '',\n tokenMints: [],\n tokenBalances: [],\n tokenDecimals: [],\n isValid: false,\n },\n };\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 {\n type: 'quote',\n data: {\n topicId: '',\n timestampMs: 0,\n sequence: 0,\n inputMint: '',\n outputMint: '',\n inAmount: '0',\n outAmount: '0',\n priceImpactBps: 0,\n contextSlot: 0,\n algorithm: '',\n isImprovement: false,\n isCached: false,\n isStale: false,\n routePlan: null,\n },\n };\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 } 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): 'Raydium AMM', 'Orca Whirlpool', 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 priority fees update */\n onPriorityFees?: (data: DecodedMessage & { type: 'priority_fees' }) => 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' | 'onPriorityFees' | \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 'priority_fees':\n this.config.onPriorityFees?.(decoded as DecodedMessage & { type: 'priority_fees' });\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"]}