@pokertools/sdk 1.0.15 → 1.0.17

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/types.ts","../../src/client.ts","../../src/socket.ts","../../src/react/index.tsx"],"names":["safeParseServerMessage","createContext","useState","useRef","useEffect","useCallback","useMemo","jsx","useContext"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * SDK-specific types and configuration\n */\n\n/**\n * SDK configuration options\n */\nexport interface PokerSDKConfig {\n /** Base URL of the PokerTools API (e.g., \"https://api.poker.example.com\") */\n baseUrl: string;\n\n /** WebSocket URL (defaults to baseUrl with ws:// protocol) */\n wsUrl?: string;\n\n /** JWT token for authentication */\n token?: string;\n\n /** Request timeout in milliseconds (default: 30000) */\n timeout?: number;\n\n /** Retry configuration */\n retry?: {\n /** Number of retries for failed requests (default: 3) */\n count?: number;\n /** Delay between retries in ms (default: 1000) */\n delay?: number;\n /** Exponential backoff multiplier (default: 2) */\n backoff?: number;\n };\n\n /** Custom fetch implementation (for React Native or custom environments) */\n fetch?: typeof fetch;\n\n /** Custom WebSocket implementation (for React Native or Node.js) */\n WebSocket?: typeof WebSocket;\n\n /** Enable debug logging */\n debug?: boolean;\n}\n\n/**\n * User balance information\n */\nexport interface UserBalances {\n main: number;\n inPlay: number;\n pendingWithdrawal: number;\n}\n\n/**\n * User profile with balances\n */\nexport interface UserProfile {\n id: string;\n username: string;\n address: string;\n role: \"PLAYER\" | \"ADMIN\" | \"BOT\";\n createdAt: string;\n balances: UserBalances;\n}\n\n/**\n * Blockchain configuration\n */\nexport interface BlockchainInfo {\n id: string;\n name: string;\n chainId: number;\n tokens: TokenInfo[];\n}\n\n/**\n * Token configuration\n */\nexport interface TokenInfo {\n id: string;\n symbol: string;\n name: string;\n decimals: number;\n minDeposit: string;\n}\n\n/**\n * Deposit session info\n */\nexport interface DepositSession {\n address: string;\n expiresAt: string;\n message: string;\n}\n\n/**\n * Deposit record\n */\nexport interface DepositRecord {\n id: string;\n txHash: string | null;\n chain: string;\n token: string;\n amountRaw: string;\n amountCredit: number;\n status: \"PENDING\" | \"PROCESSING\" | \"CONFIRMED\" | \"FAILED\";\n createdAt: string;\n confirmedAt: string | null;\n explorerUrl: string;\n}\n\n/**\n * Withdrawal request\n */\nexport interface WithdrawalRequest {\n amount: number;\n blockchainId: string;\n tokenId: string;\n address: string;\n message: string;\n signature: `0x${string}`;\n idempotencyKey?: string;\n}\n\n/**\n * Withdrawal record\n */\nexport interface WithdrawalRecord {\n id: string;\n txHash: string | null;\n chain: string;\n token: string;\n address: string;\n amountRaw: string;\n amountUSD: number;\n status: \"PENDING\" | \"PROCESSING\" | \"CONFIRMED\" | \"FAILED\" | \"REJECTED\" | \"CANCELLED\";\n createdAt: string;\n confirmedAt: string | null;\n explorerUrl: string | null;\n}\n\n/**\n * Hand history entry (simplified)\n */\nexport interface HandHistoryEntry {\n id: string;\n amount: number;\n type: \"HAND_WIN\" | \"HAND_LOSS\";\n referenceId: string | null;\n createdAt: string;\n}\n\n/**\n * Player note\n */\nexport interface PlayerNote {\n id: string;\n targetId: string;\n content: string;\n label: string | null;\n createdAt: string;\n updatedAt: string;\n target?: {\n id: string;\n username: string;\n };\n}\n\n/**\n * SDK error class\n */\nexport class PokerSDKError extends Error {\n constructor(\n message: string,\n public readonly code: string,\n public readonly statusCode?: number,\n public readonly details?: unknown\n ) {\n super(message);\n this.name = \"PokerSDKError\";\n }\n}\n\n/**\n * WebSocket connection state\n */\nexport type ConnectionState = \"disconnected\" | \"connecting\" | \"connected\" | \"reconnecting\";\n\n/**\n * Event emitter types\n */\nexport interface PokerSocketEvents {\n connect: () => void;\n disconnect: (reason?: string) => void;\n reconnect: (attempt: number) => void;\n error: (error: Error) => void;\n stateUpdate: (tableId: string, state: import(\"@pokertools/types\").PublicState) => void;\n snapshot: (tableId: string, state: import(\"@pokertools/types\").PublicState) => void;\n action: (tableId: string, playerId: string, actionType: string, amount?: number) => void;\n}\n\n/**\n * Type-safe event listener\n */\nexport type EventListener<T extends keyof PokerSocketEvents> = PokerSocketEvents[T];\n","/**\n * PokerClient - HTTP client for PokerTools REST API\n *\n * Provides type-safe methods for all API endpoints with automatic\n * retry, authentication, and error handling.\n */\n\nimport type {\n PublicState,\n CreateTableRequest,\n BuyInRequest,\n AddChipsRequest,\n GameActionRequest,\n LoginRequest,\n LoginResponse,\n NonceResponse,\n TableListItem,\n TournamentDetails,\n TournamentListItem,\n CreateTournamentRequest,\n RegisterTournamentRequest,\n StartTournamentResponse,\n ReconcileTournamentResponse,\n SettleTournamentResponse,\n} from \"@pokertools/types\";\n\nimport {\n PokerSDKConfig,\n PokerSDKError,\n UserProfile,\n BlockchainInfo,\n DepositSession,\n DepositRecord,\n WithdrawalRequest,\n WithdrawalRecord,\n HandHistoryEntry,\n PlayerNote,\n} from \"./types\";\n\n/**\n * Default configuration values\n */\nconst DEFAULT_CONFIG = {\n timeout: 30000,\n retry: {\n count: 3,\n delay: 1000,\n backoff: 2,\n },\n};\n\n/**\n * PokerClient - Main HTTP client for PokerTools API\n *\n * @example\n * ```typescript\n * const client = new PokerClient({\n * baseUrl: \"https://api.poker.example.com\",\n * token: \"jwt-token\",\n * });\n *\n * // Get tables\n * const tables = await client.getTables();\n *\n * // Create a table\n * const tableId = await client.createTable({\n * name: \"My Table\",\n * mode: \"CASH\",\n * smallBlind: 5,\n * bigBlind: 10,\n * maxPlayers: 6,\n * });\n *\n * // Buy in\n * await client.buyIn(tableId, {\n * amount: 500,\n * seat: 3,\n * idempotencyKey: crypto.randomUUID(),\n * });\n * ```\n */\nexport class PokerClient {\n private readonly baseUrl: string;\n private readonly timeout: number;\n private readonly retry: Required<NonNullable<PokerSDKConfig[\"retry\"]>>;\n private readonly fetchFn: typeof fetch;\n private readonly debug: boolean;\n\n private token: string | null;\n\n constructor(config: PokerSDKConfig) {\n this.baseUrl = config.baseUrl.replace(/\\/$/, \"\");\n this.timeout = config.timeout ?? DEFAULT_CONFIG.timeout;\n this.retry = {\n count: config.retry?.count ?? DEFAULT_CONFIG.retry.count,\n delay: config.retry?.delay ?? DEFAULT_CONFIG.retry.delay,\n backoff: config.retry?.backoff ?? DEFAULT_CONFIG.retry.backoff,\n };\n this.fetchFn = config.fetch ?? globalThis.fetch.bind(globalThis);\n this.debug = config.debug ?? false;\n this.token = config.token ?? null;\n }\n\n // ============================================================================\n // Configuration\n // ============================================================================\n\n /**\n * Set the authentication token\n */\n setToken(token: string | null): void {\n this.token = token;\n }\n\n /**\n * Get current token\n */\n getToken(): string | null {\n return this.token;\n }\n\n /**\n * Check if client is authenticated\n */\n isAuthenticated(): boolean {\n return this.token !== null;\n }\n\n // ============================================================================\n // Authentication\n // ============================================================================\n\n /**\n * Get a nonce for SIWE authentication\n */\n async getNonce(): Promise<string> {\n const response = await this.request<NonceResponse>(\"POST\", \"/auth/nonce\");\n return response.nonce;\n }\n\n /**\n * Login with SIWE signature\n */\n async login(request: LoginRequest): Promise<LoginResponse> {\n const response = await this.request<LoginResponse>(\"POST\", \"/auth/login\", request);\n this.token = response.token;\n return response;\n }\n\n /**\n * Logout and revoke session\n */\n async logout(): Promise<void> {\n await this.request(\"POST\", \"/auth/logout\");\n this.token = null;\n }\n\n // ============================================================================\n // Tables\n // ============================================================================\n\n /**\n * Get list of active tables\n */\n async getTables(): Promise<TableListItem[]> {\n const response = await this.request<{ tables: TableListItem[] }>(\"GET\", \"/tables\");\n return response.tables;\n }\n\n /**\n * Create a new table\n */\n async createTable(config: CreateTableRequest): Promise<string> {\n const response = await this.request<{ tableId: string }>(\"POST\", \"/tables\", config);\n return response.tableId;\n }\n\n /**\n * Get table state\n * @param tableId - Table ID\n * @param since - Optional version for conditional fetch (returns null if unchanged)\n */\n async getTableState(tableId: string, since?: number): Promise<PublicState | null> {\n const query = since !== undefined ? `?since=${since}` : \"\";\n try {\n const response = await this.request<{ state: PublicState }>(\n \"GET\",\n `/tables/${tableId}${query}`\n );\n return response.state;\n } catch (error) {\n if (error instanceof PokerSDKError && error.statusCode === 304) {\n return null;\n }\n throw error;\n }\n }\n\n /**\n * Buy in to a table\n */\n async buyIn(tableId: string, request: BuyInRequest): Promise<void> {\n await this.request(\"POST\", `/tables/${tableId}/buy-in`, request);\n }\n\n /**\n * Execute a game action\n */\n async action(tableId: string, request: GameActionRequest): Promise<PublicState> {\n const response = await this.request<{ state: PublicState }>(\n \"POST\",\n `/tables/${tableId}/action`,\n request\n );\n return response.state;\n }\n\n /**\n * Add chips to stack (rebuy/top-up)\n */\n async addChips(tableId: string, request: AddChipsRequest): Promise<void> {\n await this.request(\"POST\", `/tables/${tableId}/add-chips`, request);\n }\n\n /**\n * Stand from table (leave and cash out)\n */\n async stand(tableId: string): Promise<void> {\n await this.request(\"POST\", `/tables/${tableId}/stand`);\n }\n\n /**\n * Get active and registering tournaments.\n */\n async getTournaments(): Promise<TournamentListItem[]> {\n const response = await this.request<{ tournaments: TournamentListItem[] }>(\n \"GET\",\n \"/tournaments\"\n );\n return response.tournaments;\n }\n\n /**\n * Create a tournament lobby and backing tournament table.\n */\n async createTournament(request: CreateTournamentRequest): Promise<{\n tournamentId: string;\n tableId: string;\n }> {\n return this.request(\"POST\", \"/tournaments\", request);\n }\n\n /**\n * Get tournament lobby details, entries, prize pool, and table reference.\n */\n async getTournament(tournamentId: string): Promise<TournamentDetails> {\n const response = await this.request<{ tournament: TournamentDetails }>(\n \"GET\",\n `/tournaments/${tournamentId}`\n );\n return response.tournament;\n }\n\n /**\n * Register for a tournament. Debits buy-in and fee from MAIN balance.\n */\n async registerTournament(\n tournamentId: string,\n request: RegisterTournamentRequest\n ): Promise<{ success: boolean }> {\n return this.request(\"POST\", `/tournaments/${tournamentId}/register`, request);\n }\n\n /**\n * Start a tournament once at least two players are registered.\n */\n async startTournament(tournamentId: string): Promise<StartTournamentResponse> {\n return this.request(\"POST\", `/tournaments/${tournamentId}/start`);\n }\n\n /**\n * Reconcile a running multi-table tournament after completed hands.\n */\n async reconcileTournament(tournamentId: string): Promise<ReconcileTournamentResponse> {\n return this.request(\"POST\", `/tournaments/${tournamentId}/reconcile`);\n }\n\n /**\n * Manually advance tournament blind level.\n */\n async advanceTournamentBlinds(tournamentId: string): Promise<{\n results: Record<string, { blindLevel?: number; error?: string }>;\n }> {\n return this.request(\"POST\", `/tournaments/${tournamentId}/advance-blinds`);\n }\n\n /**\n * Settle a completed tournament and pay the configured prize distribution.\n */\n async settleTournament(tournamentId: string): Promise<SettleTournamentResponse> {\n return this.request(\"POST\", `/tournaments/${tournamentId}/settle`);\n }\n\n // ============================================================================\n // Convenience Action Methods\n // ============================================================================\n\n /**\n * Fold hand\n */\n async fold(tableId: string): Promise<PublicState> {\n return this.action(tableId, { type: \"FOLD\" });\n }\n\n /**\n * Check (pass action)\n */\n async check(tableId: string): Promise<PublicState> {\n return this.action(tableId, { type: \"CHECK\" });\n }\n\n /**\n * Call current bet\n */\n async call(tableId: string): Promise<PublicState> {\n return this.action(tableId, { type: \"CALL\" });\n }\n\n /**\n * Place a bet\n */\n async bet(tableId: string, amount: number): Promise<PublicState> {\n return this.action(tableId, { type: \"BET\", amount });\n }\n\n /**\n * Raise the current bet\n */\n async raise(tableId: string, amount: number): Promise<PublicState> {\n return this.action(tableId, { type: \"RAISE\", amount });\n }\n\n /**\n * Deal new hand\n */\n async deal(tableId: string): Promise<PublicState> {\n return this.action(tableId, { type: \"DEAL\" });\n }\n\n /**\n * Show cards at showdown\n */\n async show(tableId: string, cardIndices?: number[]): Promise<PublicState> {\n return this.action(tableId, { type: \"SHOW\", cardIndices });\n }\n\n /**\n * Muck cards at showdown\n */\n async muck(tableId: string): Promise<PublicState> {\n return this.action(tableId, { type: \"MUCK\" });\n }\n\n /**\n * Use time bank\n */\n async timeBank(tableId: string): Promise<PublicState> {\n return this.action(tableId, { type: \"TIME_BANK\" });\n }\n\n // ============================================================================\n // User\n // ============================================================================\n\n /**\n * Get current user profile and balances\n */\n async getProfile(): Promise<UserProfile> {\n return this.request<UserProfile>(\"GET\", \"/user/me\");\n }\n\n /**\n * Get hand history\n */\n async getHandHistory(): Promise<HandHistoryEntry[]> {\n const response = await this.request<{ history: HandHistoryEntry[] }>(\"GET\", \"/user/history\");\n return response.history;\n }\n\n /**\n * Request a withdrawal\n */\n async withdraw(request: WithdrawalRequest): Promise<{\n id: string;\n status: string;\n amount: number;\n destination: string;\n blockchain: string;\n token: string;\n }> {\n return this.request(\"POST\", \"/user/withdraw\", request);\n }\n\n /**\n * Get withdrawal history\n */\n async getWithdrawals(): Promise<WithdrawalRecord[]> {\n const response = await this.request<{ withdrawals: WithdrawalRecord[] }>(\n \"GET\",\n \"/user/withdrawals\"\n );\n return response.withdrawals;\n }\n\n // ============================================================================\n // Finance\n // ============================================================================\n\n /**\n * Get supported blockchains and tokens\n */\n async getChains(): Promise<BlockchainInfo[]> {\n return this.request<BlockchainInfo[]>(\"GET\", \"/finance/chains\");\n }\n\n /**\n * Start deposit monitoring session\n */\n async startDeposit(): Promise<DepositSession> {\n return this.request<DepositSession>(\"POST\", \"/finance/deposit/start\");\n }\n\n /**\n * Get deposit address\n */\n async getDepositAddress(): Promise<string> {\n const response = await this.request<{ address: string }>(\"GET\", \"/finance/deposit/address\");\n return response.address;\n }\n\n /**\n * Get deposit history\n */\n async getDeposits(): Promise<DepositRecord[]> {\n const response = await this.request<{ deposits: DepositRecord[] }>(\"GET\", \"/finance/deposits\");\n return response.deposits;\n }\n\n // ============================================================================\n // Notes\n // ============================================================================\n\n /**\n * Get all notes by current user\n */\n async getNotes(): Promise<PlayerNote[]> {\n const response = await this.request<{ notes: PlayerNote[] }>(\"GET\", \"/notes\");\n return response.notes;\n }\n\n /**\n * Get note for specific player\n */\n async getNote(targetId: string): Promise<PlayerNote | null> {\n const response = await this.request<{ note: PlayerNote | null }>(\"GET\", `/notes/${targetId}`);\n return response.note;\n }\n\n /**\n * Save or update note\n */\n async saveNote(targetId: string, content: string, label?: string): Promise<PlayerNote> {\n const response = await this.request<{ note: PlayerNote }>(\"POST\", \"/notes\", {\n targetId,\n content,\n label,\n });\n return response.note;\n }\n\n /**\n * Delete note\n */\n async deleteNote(targetId: string): Promise<void> {\n await this.request(\"DELETE\", `/notes/${targetId}`);\n }\n\n // ============================================================================\n // Health\n // ============================================================================\n\n /**\n * Health check\n */\n async health(): Promise<{ status: string; timestamp: number }> {\n return this.request(\"GET\", \"/health\");\n }\n\n // ============================================================================\n // Private Methods\n // ============================================================================\n\n /**\n * Make HTTP request with retry logic\n */\n private async request<T>(method: string, path: string, body?: unknown): Promise<T> {\n const url = `${this.baseUrl}${path}`;\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n\n if (this.token) {\n headers.Authorization = `Bearer ${this.token}`;\n }\n\n let lastError: Error | null = null;\n\n for (let attempt = 0; attempt <= this.retry.count; attempt++) {\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n if (this.debug) {\n console.log(`[PokerSDK] ${method} ${path}`, body);\n }\n\n const response = await this.fetchFn(url, {\n method,\n headers,\n body: body ? JSON.stringify(body) : undefined,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n // Handle 304 Not Modified\n if (response.status === 304) {\n throw new PokerSDKError(\"Not Modified\", \"NOT_MODIFIED\", 304);\n }\n\n // Handle non-2xx responses\n if (!response.ok) {\n const errorData = (await response.json().catch(() => ({}))) as {\n message?: string;\n error?: string;\n code?: string;\n };\n\n throw new PokerSDKError(\n errorData.message ?? errorData.error ?? `HTTP ${response.status}`,\n errorData.code ?? errorData.error ?? \"HTTP_ERROR\",\n response.status,\n errorData\n );\n }\n\n const data = (await response.json()) as T;\n\n if (this.debug) {\n console.log(`[PokerSDK] Response:`, data);\n }\n\n return data;\n } catch (error) {\n lastError = error as Error;\n\n // Don't retry client errors (4xx) except rate limiting\n if (error instanceof PokerSDKError) {\n if (\n error.statusCode &&\n error.statusCode >= 400 &&\n error.statusCode < 500 &&\n error.statusCode !== 429\n ) {\n throw error;\n }\n }\n\n // Don't retry on abort\n if (error instanceof Error && error.name === \"AbortError\") {\n throw new PokerSDKError(\"Request timeout\", \"TIMEOUT\", undefined, {\n timeout: this.timeout,\n });\n }\n\n // Retry with backoff\n if (attempt < this.retry.count) {\n const delay = this.retry.delay * Math.pow(this.retry.backoff, attempt);\n if (this.debug) {\n console.log(`[PokerSDK] Retry ${attempt + 1}/${this.retry.count} in ${delay}ms`);\n }\n await this.sleep(delay);\n }\n }\n }\n\n throw lastError ?? new PokerSDKError(\"Request failed\", \"REQUEST_FAILED\");\n }\n\n /**\n * Sleep helper\n */\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n}\n","/**\n * PokerSocket - WebSocket client for real-time game updates\n *\n * Provides automatic reconnection, heartbeat, and typed event handling\n * for real-time poker game state synchronization.\n */\n\nimport type {\n PublicState,\n ClientMessage,\n JoinTableMessage,\n LeaveTableMessage,\n PingMessage,\n} from \"@pokertools/types\";\n\nimport { safeParseServerMessage } from \"@pokertools/types\";\n\nimport {\n PokerSDKConfig,\n PokerSDKError,\n ConnectionState,\n PokerSocketEvents,\n EventListener,\n} from \"./types\";\n\n/**\n * WebSocket configuration\n */\ninterface SocketConfig {\n /** WebSocket URL */\n url: string;\n /** JWT token for authentication. Sent as a WebSocket subprotocol, never in the URL. */\n token: string;\n /** Heartbeat interval in ms (default: 25000) */\n heartbeatInterval?: number;\n /** Reconnection attempts (default: 10) */\n reconnectAttempts?: number;\n /** Base reconnection delay in ms (default: 1000) */\n reconnectDelay?: number;\n /** Max reconnection delay in ms (default: 30000) */\n maxReconnectDelay?: number;\n /** Custom WebSocket implementation */\n WebSocket?: typeof WebSocket;\n /** Enable debug logging */\n debug?: boolean;\n}\n\n/**\n * Default socket configuration\n */\nconst DEFAULT_SOCKET_CONFIG = {\n heartbeatInterval: 25000,\n reconnectAttempts: 10,\n reconnectDelay: 1000,\n maxReconnectDelay: 30000,\n};\n\n/**\n * PokerSocket - Real-time WebSocket client\n *\n * @example\n * ```typescript\n * const socket = new PokerSocket({\n * url: \"wss://api.poker.example.com/ws/play\",\n * token: \"jwt-token\",\n * });\n *\n * // Listen for events\n * socket.on(\"connect\", () => console.log(\"Connected!\"));\n * socket.on(\"stateUpdate\", (tableId, state) => {\n * console.log(\"State updated:\", state);\n * });\n *\n * // Connect\n * await socket.connect();\n *\n * // Join a table\n * await socket.join(\"table-123\");\n *\n * // Later: disconnect\n * socket.disconnect();\n * ```\n */\nexport class PokerSocket {\n private readonly url: string;\n private readonly token: string;\n private readonly protocolToken: string;\n private readonly heartbeatInterval: number;\n private readonly reconnectAttempts: number;\n private readonly reconnectDelay: number;\n private readonly maxReconnectDelay: number;\n private readonly WebSocketImpl: typeof WebSocket;\n private readonly debug: boolean;\n\n private ws: WebSocket | null = null;\n private connectionState: ConnectionState = \"disconnected\";\n private reconnectCount = 0;\n private heartbeatTimer: ReturnType<typeof setInterval> | null = null;\n private pendingRequests = new Map<\n string,\n {\n resolve: (value: unknown) => void;\n reject: (error: Error) => void;\n timeout: ReturnType<typeof setTimeout>;\n }\n >();\n private joinedTables = new Set<string>();\n private listeners = new Map<\n keyof PokerSocketEvents,\n Set<EventListener<keyof PokerSocketEvents>>\n >();\n private shouldReconnect = true;\n\n // Latest state cache for each table\n private stateCache = new Map<string, PublicState>();\n\n // Version metadata per table (exposed safely via getTableVersion)\n private tableVersions = new Map<string, number>();\n\n constructor(config: SocketConfig) {\n // Keep authentication material out of URLs so it is not captured by\n // access logs, proxy logs, or browser history.\n const wsUrl = new URL(config.url);\n this.url = wsUrl.toString();\n this.token = config.token;\n this.protocolToken = `jwt.${config.token}`;\n\n this.heartbeatInterval = config.heartbeatInterval ?? DEFAULT_SOCKET_CONFIG.heartbeatInterval;\n this.reconnectAttempts = config.reconnectAttempts ?? DEFAULT_SOCKET_CONFIG.reconnectAttempts;\n this.reconnectDelay = config.reconnectDelay ?? DEFAULT_SOCKET_CONFIG.reconnectDelay;\n this.maxReconnectDelay = config.maxReconnectDelay ?? DEFAULT_SOCKET_CONFIG.maxReconnectDelay;\n this.WebSocketImpl = config.WebSocket ?? globalThis.WebSocket;\n this.debug = config.debug ?? false;\n }\n\n /**\n * Create a PokerSocket from SDK config\n */\n static fromConfig(config: PokerSDKConfig): PokerSocket {\n if (!config.token) {\n throw new PokerSDKError(\"Token is required for WebSocket connection\", \"AUTH_REQUIRED\");\n }\n\n const baseUrl = config.baseUrl.replace(/\\/$/, \"\");\n const wsUrl = config.wsUrl ?? baseUrl.replace(/^http/, \"ws\") + \"/ws/play\";\n\n return new PokerSocket({\n url: wsUrl,\n token: config.token,\n WebSocket: config.WebSocket,\n debug: config.debug,\n });\n }\n\n // ============================================================================\n // Connection Management\n // ============================================================================\n\n /**\n * Connect to the WebSocket server\n */\n connect(): Promise<void> {\n return new Promise((resolve, reject) => {\n if (this.connectionState === \"connected\") {\n resolve();\n return;\n }\n\n if (this.connectionState === \"connecting\") {\n // Wait for existing connection attempt\n const checkConnection = () => {\n if (this.connectionState === \"connected\") {\n resolve();\n } else if (this.connectionState === \"disconnected\") {\n reject(new PokerSDKError(\"Connection failed\", \"CONNECTION_FAILED\"));\n } else {\n setTimeout(checkConnection, 100);\n }\n };\n checkConnection();\n return;\n }\n\n this.shouldReconnect = true;\n this.connectionState = \"connecting\";\n this.log(\"Connecting to\", this.url);\n\n try {\n this.ws = new this.WebSocketImpl(this.url, [\"pokertools\", this.protocolToken]);\n\n this.ws.onopen = () => {\n this.connectionState = \"connected\";\n this.reconnectCount = 0;\n this.startHeartbeat();\n this.emit(\"connect\");\n this.log(\"Connected\");\n\n // Rejoin previously joined tables\n void this.rejoinTables();\n\n resolve();\n };\n\n this.ws.onclose = (event) => {\n this.handleDisconnect(event.reason || \"Connection closed\");\n };\n\n this.ws.onerror = (event) => {\n this.log(\"WebSocket error:\", event);\n if (this.connectionState === \"connecting\") {\n reject(new PokerSDKError(\"Connection failed\", \"CONNECTION_FAILED\"));\n }\n };\n\n this.ws.onmessage = (event) => {\n this.handleMessage(event.data as string);\n };\n } catch (error) {\n this.connectionState = \"disconnected\";\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors\n reject(error);\n }\n });\n }\n\n /**\n * Disconnect from the WebSocket server\n */\n disconnect(): void {\n this.shouldReconnect = false;\n this.stopHeartbeat();\n this.clearPendingRequests(\"Connection closed\");\n\n if (this.ws) {\n this.ws.close(1000, \"Client disconnect\");\n this.ws = null;\n }\n\n this.connectionState = \"disconnected\";\n this.emit(\"disconnect\", \"Client disconnect\");\n this.log(\"Disconnected\");\n }\n\n /**\n * Get current connection state\n */\n getState(): ConnectionState {\n return this.connectionState;\n }\n\n /**\n * Check if connected\n */\n isConnected(): boolean {\n return this.connectionState === \"connected\";\n }\n\n // ============================================================================\n // Table Subscription\n // ============================================================================\n\n /**\n * Join a table to receive real-time updates\n */\n async join(tableId: string): Promise<PublicState> {\n if (this.connectionState !== \"connected\") {\n throw new PokerSDKError(\"Not connected\", \"NOT_CONNECTED\");\n }\n\n const requestId = this.generateRequestId();\n const message: JoinTableMessage = {\n type: \"JOIN\",\n tableId,\n requestId,\n };\n\n this.joinedTables.add(tableId);\n this.send(message);\n\n // Wait for snapshot response\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n this.pendingRequests.delete(requestId);\n reject(new PokerSDKError(\"Join timeout\", \"TIMEOUT\"));\n }, 10000);\n\n // Store resolver for snapshot message\n this.pendingRequests.set(`snapshot:${tableId}`, {\n resolve: (state) => {\n clearTimeout(timeout);\n resolve(state as PublicState);\n },\n reject,\n timeout,\n });\n });\n }\n\n /**\n * Leave a table\n */\n leave(tableId: string): void {\n if (this.connectionState !== \"connected\") {\n return;\n }\n\n this.joinedTables.delete(tableId);\n this.stateCache.delete(tableId);\n this.tableVersions.delete(tableId);\n\n const message: LeaveTableMessage = {\n type: \"LEAVE\",\n tableId,\n };\n\n this.send(message);\n }\n\n /**\n * Get currently joined tables\n */\n getJoinedTables(): string[] {\n return Array.from(this.joinedTables);\n }\n\n /**\n * Get cached state for a table\n */\n getCachedState(tableId: string): PublicState | undefined {\n return this.stateCache.get(tableId);\n }\n\n /**\n * Get latest known version for a table\n * Returns undefined if no version has been received\n */\n getTableVersion(tableId: string): number | undefined {\n return this.tableVersions.get(tableId);\n }\n\n // ============================================================================\n // Event Handling\n // ============================================================================\n\n /**\n * Subscribe to an event\n */\n on<E extends keyof PokerSocketEvents>(event: E, listener: PokerSocketEvents[E]): () => void {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, new Set());\n }\n this.listeners.get(event)!.add(listener);\n\n // Return unsubscribe function\n return () => {\n this.off(event, listener);\n };\n }\n\n /**\n * Unsubscribe from an event\n */\n off<E extends keyof PokerSocketEvents>(event: E, listener: PokerSocketEvents[E]): void {\n const listeners = this.listeners.get(event);\n if (listeners) {\n listeners.delete(listener);\n }\n }\n\n /**\n * Subscribe to an event (once)\n */\n once<E extends keyof PokerSocketEvents>(event: E, listener: PokerSocketEvents[E]): () => void {\n const onceWrapper = ((...args: Parameters<PokerSocketEvents[E]>) => {\n this.off(event, onceWrapper);\n (listener as (...args: unknown[]) => void)(...args);\n }) as PokerSocketEvents[E];\n\n return this.on(event, onceWrapper);\n }\n\n // ============================================================================\n // Ping\n // ============================================================================\n\n /**\n * Send application-level ping (not WebSocket ping)\n */\n async ping(): Promise<number> {\n if (this.connectionState !== \"connected\") {\n throw new PokerSDKError(\"Not connected\", \"NOT_CONNECTED\");\n }\n\n const requestId = this.generateRequestId();\n const startTime = Date.now();\n\n const message: PingMessage = {\n type: \"PING\",\n requestId,\n timestamp: startTime,\n };\n\n this.send(message);\n\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n this.pendingRequests.delete(requestId);\n reject(new PokerSDKError(\"Ping timeout\", \"TIMEOUT\"));\n }, 5000);\n\n this.pendingRequests.set(requestId, {\n resolve: () => {\n resolve(Date.now() - startTime);\n },\n reject,\n timeout,\n });\n });\n }\n\n // ============================================================================\n // Private Methods\n // ============================================================================\n\n /**\n * Send a message to the server\n */\n private send(message: ClientMessage): void {\n if (this.ws?.readyState !== this.WebSocketImpl.OPEN) {\n throw new PokerSDKError(\"WebSocket not open\", \"NOT_CONNECTED\");\n }\n\n this.log(\"Sending:\", message);\n this.ws.send(JSON.stringify(message));\n }\n\n /**\n * Handle incoming message\n */\n private handleMessage(data: string): void {\n try {\n const parsed: unknown = JSON.parse(data);\n const result = safeParseServerMessage(parsed);\n if (!result.success) {\n this.log(\"Invalid server message:\", result.error);\n return;\n }\n const message = result.data;\n this.log(\"Received:\", message);\n\n switch (message.type) {\n case \"SNAPSHOT\": {\n // Cache state and track version\n this.stateCache.set(message.tableId, message.state);\n this.tableVersions.set(message.tableId, message.version);\n\n // Resolve pending join request\n const pending = this.pendingRequests.get(`snapshot:${message.tableId}`);\n if (pending) {\n this.pendingRequests.delete(`snapshot:${message.tableId}`);\n pending.resolve(message.state);\n }\n\n this.emit(\"snapshot\", message.tableId, message.state);\n break;\n }\n\n case \"STATE_UPDATE\": {\n // Track version metadata (always available)\n this.tableVersions.set(message.tableId, message.version);\n\n // Only emit if we have a cached state (from a prior SNAPSHOT)\n // Never emit a phantom partial PublicState\n const cachedState = this.stateCache.get(message.tableId);\n if (cachedState) {\n // Update version in cache to keep it consistent\n const updatedState = { ...cachedState, version: message.version };\n this.stateCache.set(message.tableId, updatedState);\n this.emit(\"stateUpdate\", message.tableId, updatedState);\n }\n // If no cached state, consumer should fetch via REST\n // Version is still available via getTableVersion()\n break;\n }\n\n case \"ACTION\": {\n this.emit(\n \"action\",\n message.tableId,\n message.playerId,\n message.actionType,\n message.amount\n );\n break;\n }\n\n case \"ACK\": {\n const pending = this.pendingRequests.get(message.requestId);\n if (pending) {\n clearTimeout(pending.timeout);\n this.pendingRequests.delete(message.requestId);\n pending.resolve(undefined);\n }\n break;\n }\n\n case \"PONG\": {\n const pending = this.pendingRequests.get(message.requestId);\n if (pending) {\n clearTimeout(pending.timeout);\n this.pendingRequests.delete(message.requestId);\n pending.resolve(message.timestamp);\n }\n break;\n }\n\n case \"ERROR\": {\n this.log(\"Server error:\", message);\n if (message.requestId) {\n const pending = this.pendingRequests.get(message.requestId);\n if (pending) {\n clearTimeout(pending.timeout);\n this.pendingRequests.delete(message.requestId);\n pending.reject(new PokerSDKError(message.message, message.code));\n }\n }\n this.emit(\"error\", new PokerSDKError(message.message, message.code));\n break;\n }\n }\n } catch (error) {\n this.log(\"Failed to parse message:\", error);\n }\n }\n\n /**\n * Handle disconnect\n */\n private handleDisconnect(reason: string): void {\n this.stopHeartbeat();\n this.ws = null;\n\n const wasConnected = this.connectionState === \"connected\";\n this.connectionState = \"disconnected\";\n\n if (wasConnected) {\n this.emit(\"disconnect\", reason);\n }\n\n // Attempt reconnection if enabled\n if (this.shouldReconnect && this.reconnectCount < this.reconnectAttempts) {\n void this.reconnect();\n }\n }\n\n /**\n * Attempt to reconnect\n */\n private async reconnect(): Promise<void> {\n this.reconnectCount++;\n this.connectionState = \"reconnecting\";\n\n const delay = Math.min(\n this.reconnectDelay * Math.pow(2, this.reconnectCount - 1),\n this.maxReconnectDelay\n );\n\n this.log(\n `Reconnecting in ${delay}ms (attempt ${this.reconnectCount}/${this.reconnectAttempts})`\n );\n this.emit(\"reconnect\", this.reconnectCount);\n\n await this.sleep(delay);\n\n if (!this.shouldReconnect) {\n return;\n }\n\n try {\n await this.connect();\n } catch {\n // connect() handles its own errors\n }\n }\n\n /**\n * Rejoin previously joined tables\n */\n private async rejoinTables(): Promise<void> {\n for (const tableId of this.joinedTables) {\n try {\n await this.join(tableId);\n } catch (error) {\n this.log(\"Failed to rejoin table:\", tableId, error);\n }\n }\n }\n\n /**\n * Start heartbeat timer\n */\n private startHeartbeat(): void {\n this.stopHeartbeat();\n this.heartbeatTimer = setInterval(() => {\n if (this.connectionState === \"connected\") {\n void this.ping().catch(() => {\n // Ping failed, connection might be dead\n this.log(\"Heartbeat failed\");\n });\n }\n }, this.heartbeatInterval);\n }\n\n /**\n * Stop heartbeat timer\n */\n private stopHeartbeat(): void {\n if (this.heartbeatTimer) {\n clearInterval(this.heartbeatTimer);\n this.heartbeatTimer = null;\n }\n }\n\n /**\n * Clear all pending requests\n */\n private clearPendingRequests(reason: string): void {\n for (const pending of this.pendingRequests.values()) {\n clearTimeout(pending.timeout);\n\n pending.reject(new PokerSDKError(reason, \"CONNECTION_CLOSED\"));\n }\n this.pendingRequests.clear();\n }\n\n /**\n * Emit event to listeners\n */\n private emit<E extends keyof PokerSocketEvents>(\n event: E,\n ...args: Parameters<PokerSocketEvents[E]>\n ): void {\n const listeners = this.listeners.get(event);\n if (listeners) {\n for (const listener of listeners) {\n try {\n (listener as (...args: unknown[]) => void)(...args);\n } catch (error) {\n this.log(\"Listener error:\", error);\n }\n }\n }\n }\n\n /**\n * Generate unique request ID\n */\n private generateRequestId(): string {\n return `${Date.now()}-${Math.random().toString(36).slice(2, 11)}`;\n }\n\n /**\n * Sleep helper\n */\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n /**\n * Debug logger\n */\n private log(...args: unknown[]): void {\n if (this.debug) {\n console.log(\"[PokerSocket]\", ...args);\n }\n }\n}\n","/**\n * React hooks for PokerTools SDK\n *\n * Provides React-friendly hooks for managing poker game state,\n * WebSocket connections, and authentication.\n */\n\nimport { useState, useEffect, useCallback, useRef, useMemo, createContext, useContext } from \"react\";\nimport type { ReactNode } from \"react\";\nimport type { PublicState, TournamentDetails, TournamentListItem } from \"@pokertools/types\";\nimport { PokerClient } from \"../client\";\nimport { PokerSocket } from \"../socket\";\nimport type { PokerSDKConfig, ConnectionState, UserProfile, UserBalances } from \"../types\";\n\n// ============================================================================\n// Context\n// ============================================================================\n\ninterface PokerContextValue {\n client: PokerClient;\n socket: PokerSocket | null;\n isAuthenticated: boolean;\n connectionState: ConnectionState;\n connect: () => Promise<void>;\n disconnect: () => void;\n}\n\nconst PokerContext = createContext<PokerContextValue | null>(null);\n\n/**\n * Props for PokerProvider\n */\nexport interface PokerProviderProps {\n /** SDK configuration */\n config: PokerSDKConfig;\n /** Children to render */\n children: ReactNode;\n /** Auto-connect WebSocket when authenticated (default: true) */\n autoConnect?: boolean;\n}\n\n/**\n * PokerProvider - Context provider for PokerTools SDK\n *\n * @example\n * ```tsx\n * import { PokerProvider } from \"@pokertools/sdk/react\";\n *\n * function App() {\n * return (\n * <PokerProvider config={{ baseUrl: \"https://api.poker.example.com\", token }}>\n * <Game />\n * </PokerProvider>\n * );\n * }\n * ```\n */\nexport function PokerProvider({ config, children, autoConnect = true }: PokerProviderProps) {\n const [connectionState, setConnectionState] = useState<ConnectionState>(\"disconnected\");\n const clientRef = useRef<PokerClient | null>(null);\n const socketRef = useRef<PokerSocket | null>(null);\n const configRef = useRef(config);\n const connectPromiseRef = useRef<Promise<void> | null>(null);\n\n // Initialize client\n clientRef.current ??= new PokerClient(config);\n\n useEffect(() => {\n configRef.current = config;\n }, [config]);\n\n // Update token when config changes\n useEffect(() => {\n if (clientRef.current) {\n clientRef.current.setToken(config.token ?? null);\n }\n }, [config.token]);\n\n const ensureSocket = useCallback(() => {\n if (!socketRef.current) {\n socketRef.current = PokerSocket.fromConfig(configRef.current);\n socketRef.current.on(\"connect\", () => setConnectionState(\"connected\"));\n socketRef.current.on(\"disconnect\", () => setConnectionState(\"disconnected\"));\n socketRef.current.on(\"reconnect\", () => setConnectionState(\"reconnecting\"));\n }\n return socketRef.current;\n }, []);\n\n const connect = useCallback(async () => {\n if (!configRef.current.token) {\n throw new Error(\"Token required to connect\");\n }\n if (connectPromiseRef.current) return connectPromiseRef.current;\n const socket = ensureSocket();\n setConnectionState(\"connecting\");\n connectPromiseRef.current = socket.connect().finally(() => {\n connectPromiseRef.current = null;\n });\n await connectPromiseRef.current;\n }, [ensureSocket]);\n\n // Auto-connect when a token is present, without recreating sockets for inline\n // config object identity changes.\n useEffect(() => {\n if (config.token && autoConnect) {\n void connect().catch(console.error);\n } else if (!config.token && socketRef.current) {\n socketRef.current.disconnect();\n socketRef.current = null;\n }\n }, [config.token, autoConnect, connect]);\n\n useEffect(() => {\n return () => {\n if (socketRef.current) {\n socketRef.current.disconnect();\n socketRef.current = null;\n }\n };\n }, []);\n\n const disconnect = useCallback(() => {\n if (socketRef.current) {\n socketRef.current.disconnect();\n }\n }, []);\n\n const value = useMemo(\n () => ({\n client: clientRef.current!,\n socket: socketRef.current,\n isAuthenticated: !!config.token,\n connectionState,\n connect,\n disconnect,\n }),\n [config.token, connectionState, connect, disconnect]\n );\n\n return <PokerContext.Provider value={value}>{children}</PokerContext.Provider>;\n}\n\n/**\n * Hook to access PokerTools context\n */\nexport function usePoker(): PokerContextValue {\n const context = useContext(PokerContext);\n if (!context) {\n throw new Error(\"usePoker must be used within a PokerProvider\");\n }\n return context;\n}\n\n/**\n * Hook to get the PokerClient instance\n */\nexport function usePokerClient(): PokerClient {\n return usePoker().client;\n}\n\n/**\n * Hook to get the PokerSocket instance\n */\nexport function usePokerSocket(): PokerSocket | null {\n return usePoker().socket;\n}\n\n// ============================================================================\n// Table Hook\n// ============================================================================\n\ninterface UseTableOptions {\n /** Polling interval for state updates (ms, default: disabled) */\n pollInterval?: number;\n /** Auto-join via WebSocket (default: true) */\n autoJoin?: boolean;\n}\n\ninterface UseTableResult {\n /** Current table state */\n state: PublicState | null;\n /** Loading state */\n isLoading: boolean;\n /** Error if any */\n error: Error | null;\n /** Refresh state from server */\n refresh: () => Promise<void>;\n /** Execute an action */\n action: (type: string, amount?: number) => Promise<void>;\n /** Leave the table */\n leave: () => Promise<void>;\n}\n\n/**\n * Hook to manage a poker table\n *\n * @example\n * ```tsx\n * function Table({ tableId }: { tableId: string }) {\n * const { state, isLoading, error, action } = useTable(tableId);\n *\n * if (isLoading) return <div>Loading...</div>;\n * if (error) return <div>Error: {error.message}</div>;\n * if (!state) return <div>Table not found</div>;\n *\n * return (\n * <div>\n * <div>Pot: {state.pot}</div>\n * <button onClick={() => action(\"FOLD\")}>Fold</button>\n * <button onClick={() => action(\"CALL\")}>Call</button>\n * </div>\n * );\n * }\n * ```\n */\nexport function useTable(tableId: string, options: UseTableOptions = {}): UseTableResult {\n const { pollInterval, autoJoin = true } = options;\n const { client, socket } = usePoker();\n\n const [state, setState] = useState<PublicState | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n const versionRef = useRef<number>(0);\n\n // Fetch initial state\n const refresh = useCallback(async () => {\n try {\n setIsLoading(true);\n const newState = await client.getTableState(tableId);\n if (newState) {\n setState(newState);\n versionRef.current = newState.version;\n }\n setError(null);\n } catch (err) {\n setError(err as Error);\n } finally {\n setIsLoading(false);\n }\n }, [client, tableId]);\n\n // Initial load\n useEffect(() => {\n void refresh();\n }, [refresh]);\n\n // WebSocket subscription\n useEffect(() => {\n if (!socket || !autoJoin) return;\n\n const handleStateUpdate = (id: string, newState: PublicState) => {\n if (id === tableId) {\n setState(newState);\n versionRef.current = newState.version;\n }\n };\n\n const handleSnapshot = (id: string, newState: PublicState) => {\n if (id === tableId) {\n setState(newState);\n versionRef.current = newState.version;\n setIsLoading(false);\n }\n };\n\n socket.on(\"stateUpdate\", handleStateUpdate);\n socket.on(\"snapshot\", handleSnapshot);\n\n // Join table if connected\n if (socket.isConnected()) {\n void socket.join(tableId).catch(console.error);\n }\n\n return () => {\n socket.off(\"stateUpdate\", handleStateUpdate);\n socket.off(\"snapshot\", handleSnapshot);\n socket.leave(tableId);\n };\n }, [socket, tableId, autoJoin]);\n\n // Polling (if configured)\n useEffect(() => {\n if (!pollInterval) return;\n\n const interval = setInterval(() => {\n void (async () => {\n const newState = await client.getTableState(tableId, versionRef.current);\n if (newState) {\n setState(newState);\n versionRef.current = newState.version;\n }\n })();\n }, pollInterval);\n\n return () => clearInterval(interval);\n }, [client, tableId, pollInterval]);\n\n // Action helper\n const action = useCallback(\n async (type: string, amount?: number) => {\n const newState = await client.action(tableId, { type: type as Parameters<typeof client.action>[1][\"type\"], amount });\n setState(newState);\n versionRef.current = newState.version;\n },\n [client, tableId]\n );\n\n // Leave table\n const leave = useCallback(async () => {\n await client.stand(tableId);\n if (socket) {\n socket.leave(tableId);\n }\n }, [client, socket, tableId]);\n\n return { state, isLoading, error, refresh, action, leave };\n}\n\n// ============================================================================\n// User Hooks\n// ============================================================================\n\ninterface UseUserResult {\n /** User profile */\n profile: UserProfile | null;\n /** User balances */\n balances: UserBalances | null;\n /** Loading state */\n isLoading: boolean;\n /** Error if any */\n error: Error | null;\n /** Refresh profile */\n refresh: () => Promise<void>;\n}\n\n/**\n * Hook to get current user profile and balances\n */\nexport function useUser(): UseUserResult {\n const { client, isAuthenticated } = usePoker();\n const [profile, setProfile] = useState<UserProfile | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const refresh = useCallback(async () => {\n if (!isAuthenticated) return;\n try {\n setIsLoading(true);\n const data = await client.getProfile();\n setProfile(data);\n setError(null);\n } catch (err) {\n setError(err as Error);\n } finally {\n setIsLoading(false);\n }\n }, [client, isAuthenticated]);\n\n useEffect(() => {\n if (isAuthenticated) {\n void refresh();\n } else {\n setProfile(null);\n }\n }, [isAuthenticated, refresh]);\n\n return {\n profile,\n balances: profile?.balances ?? null,\n isLoading,\n error,\n refresh,\n };\n}\n\n// ============================================================================\n// Tables List Hook\n// ============================================================================\n\ninterface UseTablesResult {\n /** List of tables */\n tables: Awaited<ReturnType<PokerClient[\"getTables\"]>>;\n /** Loading state */\n isLoading: boolean;\n /** Error if any */\n error: Error | null;\n /** Refresh tables list */\n refresh: () => Promise<void>;\n}\n\n/**\n * Hook to get list of active tables\n */\nexport function useTables(): UseTablesResult {\n const { client } = usePoker();\n const [tables, setTables] = useState<Awaited<ReturnType<PokerClient[\"getTables\"]>>>([]);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n const refresh = useCallback(async () => {\n try {\n setIsLoading(true);\n const data = await client.getTables();\n setTables(data);\n setError(null);\n } catch (err) {\n setError(err as Error);\n } finally {\n setIsLoading(false);\n }\n }, [client]);\n\n useEffect(() => {\n void refresh();\n }, [refresh]);\n\n return { tables, isLoading, error, refresh };\n}\n\n// ============================================================================\n// Tournament Hooks\n// ============================================================================\n\ninterface UseTournamentsResult {\n /** Active and registering tournament lobbies */\n tournaments: TournamentListItem[];\n /** Loading state */\n isLoading: boolean;\n /** Error if any */\n error: Error | null;\n /** Refresh tournament list */\n refresh: () => Promise<void>;\n}\n\n/**\n * Hook to get active and registering tournaments.\n */\nexport function useTournaments(): UseTournamentsResult {\n const { client } = usePoker();\n const [tournaments, setTournaments] = useState<TournamentListItem[]>([]);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n const refresh = useCallback(async () => {\n try {\n setIsLoading(true);\n const data = await client.getTournaments();\n setTournaments(data);\n setError(null);\n } catch (err) {\n setError(err as Error);\n } finally {\n setIsLoading(false);\n }\n }, [client]);\n\n useEffect(() => {\n void refresh();\n }, [refresh]);\n\n return { tournaments, isLoading, error, refresh };\n}\n\ninterface UseTournamentResult {\n /** Tournament lobby details */\n tournament: TournamentDetails | null;\n /** Loading state */\n isLoading: boolean;\n /** Error if any */\n error: Error | null;\n /** Refresh tournament details */\n refresh: () => Promise<void>;\n}\n\n/**\n * Hook to get a tournament lobby and its entries/tables.\n */\nexport function useTournament(tournamentId: string | null): UseTournamentResult {\n const { client } = usePoker();\n const [tournament, setTournament] = useState<TournamentDetails | null>(null);\n const [isLoading, setIsLoading] = useState(Boolean(tournamentId));\n const [error, setError] = useState<Error | null>(null);\n\n const refresh = useCallback(async () => {\n if (!tournamentId) {\n setTournament(null);\n setIsLoading(false);\n return;\n }\n\n try {\n setIsLoading(true);\n const data = await client.getTournament(tournamentId);\n setTournament(data);\n setError(null);\n } catch (err) {\n setError(err as Error);\n } finally {\n setIsLoading(false);\n }\n }, [client, tournamentId]);\n\n useEffect(() => {\n void refresh();\n }, [refresh]);\n\n return { tournament, isLoading, error, refresh };\n}\n\n// ============================================================================\n// Connection Hook\n// ============================================================================\n\n/**\n * Hook to manage WebSocket connection\n */\nexport function useConnection() {\n const { socket, connectionState, connect, disconnect } = usePoker();\n\n const [latency, setLatency] = useState<number | null>(null);\n\n // Ping for latency measurement\n const ping = useCallback(async () => {\n if (!socket?.isConnected()) return null;\n try {\n const ms = await socket.ping();\n setLatency(ms);\n return ms;\n } catch {\n return null;\n }\n }, [socket]);\n\n return {\n state: connectionState,\n isConnected: connectionState === \"connected\",\n isConnecting: connectionState === \"connecting\",\n isReconnecting: connectionState === \"reconnecting\",\n latency,\n connect,\n disconnect,\n ping,\n };\n}\n\n// ============================================================================\n// Export Types\n// ============================================================================\n\nexport type {\n UseTableOptions,\n UseTableResult,\n UseUserResult,\n UseTablesResult,\n UseTournamentsResult,\n UseTournamentResult,\n PokerContextValue,\n};\n"]}
1
+ {"version":3,"sources":["../../src/types.ts","../../src/client.ts","../../src/socket.ts","../../src/react/index.tsx"],"names":["safeParseServerMessage","createContext","useState","useRef","useEffect","useCallback","useMemo","jsx","useContext"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * SDK-specific types and configuration\n */\n\n/**\n * SDK configuration options\n */\nexport interface PokerSDKConfig {\n /** Base URL of the PokerTools API (e.g., \"https://api.poker.example.com\") */\n baseUrl: string;\n\n /** WebSocket URL (defaults to baseUrl with ws:// protocol) */\n wsUrl?: string;\n\n /** JWT token for authentication */\n token?: string;\n\n /** Request timeout in milliseconds (default: 30000) */\n timeout?: number;\n\n /** Retry configuration */\n retry?: {\n /** Number of retries for failed requests (default: 3) */\n count?: number;\n /** Delay between retries in ms (default: 1000) */\n delay?: number;\n /** Exponential backoff multiplier (default: 2) */\n backoff?: number;\n };\n\n /** Custom fetch implementation (for React Native or custom environments) */\n fetch?: typeof fetch;\n\n /** Custom WebSocket implementation (for React Native or Node.js) */\n WebSocket?: typeof WebSocket;\n\n /** Enable debug logging */\n debug?: boolean;\n}\n\n/**\n * User balance information\n */\nexport interface UserBalances {\n main: number;\n inPlay: number;\n pendingWithdrawal: number;\n}\n\n/**\n * User profile with balances\n */\nexport interface UserProfile {\n id: string;\n username: string;\n address: string;\n role: \"PLAYER\" | \"ADMIN\" | \"BOT\";\n createdAt: string;\n balances: UserBalances;\n}\n\n/**\n * Blockchain configuration\n */\nexport interface BlockchainInfo {\n id: string;\n name: string;\n chainId: number;\n tokens: TokenInfo[];\n}\n\n/**\n * Token configuration\n */\nexport interface TokenInfo {\n id: string;\n symbol: string;\n name: string;\n decimals: number;\n minDeposit: string;\n}\n\n/**\n * Deposit session info\n */\nexport interface DepositSession {\n address: string;\n expiresAt: string;\n message: string;\n}\n\n/**\n * Deposit record\n */\nexport interface DepositRecord {\n id: string;\n txHash: string | null;\n chain: string;\n token: string;\n amountRaw: string;\n amountCredit: number;\n status: \"PENDING\" | \"PROCESSING\" | \"CONFIRMED\" | \"FAILED\";\n createdAt: string;\n confirmedAt: string | null;\n explorerUrl: string;\n}\n\n/**\n * Withdrawal request\n */\nexport interface WithdrawalRequest {\n amount: number;\n blockchainId: string;\n tokenId: string;\n address: string;\n message: string;\n signature: `0x${string}`;\n idempotencyKey?: string;\n}\n\n/**\n * Withdrawal record\n */\nexport interface WithdrawalRecord {\n id: string;\n txHash: string | null;\n chain: string;\n token: string;\n address: string;\n amountRaw: string;\n amountUSD: number;\n status: \"PENDING\" | \"PROCESSING\" | \"CONFIRMED\" | \"FAILED\" | \"REJECTED\" | \"CANCELLED\";\n createdAt: string;\n confirmedAt: string | null;\n explorerUrl: string | null;\n}\n\n/**\n * Hand history entry (simplified)\n */\nexport interface HandHistoryEntry {\n id: string;\n amount: number;\n type: \"HAND_WIN\" | \"HAND_LOSS\";\n referenceId: string | null;\n createdAt: string;\n}\n\n/**\n * Player note\n */\nexport interface PlayerNote {\n id: string;\n targetId: string;\n content: string;\n label: string | null;\n createdAt: string;\n updatedAt: string;\n target?: {\n id: string;\n username: string;\n };\n}\n\n/**\n * SDK error class\n */\nexport class PokerSDKError extends Error {\n constructor(\n message: string,\n public readonly code: string,\n public readonly statusCode?: number,\n public readonly details?: unknown\n ) {\n super(message);\n this.name = \"PokerSDKError\";\n }\n}\n\n/**\n * WebSocket connection state\n */\nexport type ConnectionState = \"disconnected\" | \"connecting\" | \"connected\" | \"reconnecting\";\n\n/**\n * Event emitter types\n */\nexport interface PokerSocketEvents {\n connect: () => void;\n disconnect: (reason?: string) => void;\n reconnect: (attempt: number) => void;\n error: (error: Error) => void;\n stateUpdate: (tableId: string, state: import(\"@pokertools/types\").PublicState) => void;\n snapshot: (tableId: string, state: import(\"@pokertools/types\").PublicState) => void;\n action: (tableId: string, playerId: string, actionType: string, amount?: number) => void;\n}\n\n/**\n * Type-safe event listener\n */\nexport type EventListener<T extends keyof PokerSocketEvents> = PokerSocketEvents[T];\n","/**\n * PokerClient - HTTP client for PokerTools REST API\n *\n * Provides type-safe methods for all API endpoints with automatic\n * retry, authentication, and error handling.\n */\n\nimport type {\n PublicState,\n CreateTableRequest,\n BuyInRequest,\n AddChipsRequest,\n GameActionRequest,\n LoginRequest,\n LoginResponse,\n NonceResponse,\n TableListItem,\n TournamentDetails,\n TournamentListItem,\n CreateTournamentRequest,\n RegisterTournamentRequest,\n StartTournamentResponse,\n ReconcileTournamentResponse,\n SettleTournamentResponse,\n} from \"@pokertools/types\";\n\nimport {\n PokerSDKConfig,\n PokerSDKError,\n UserProfile,\n BlockchainInfo,\n DepositSession,\n DepositRecord,\n WithdrawalRequest,\n WithdrawalRecord,\n HandHistoryEntry,\n PlayerNote,\n} from \"./types\";\n\n/**\n * Default configuration values\n */\nconst DEFAULT_CONFIG = {\n timeout: 30000,\n retry: {\n count: 3,\n delay: 1000,\n backoff: 2,\n },\n};\n\n/**\n * PokerClient - Main HTTP client for PokerTools API\n *\n * @example\n * ```typescript\n * const client = new PokerClient({\n * baseUrl: \"https://api.poker.example.com\",\n * token: \"jwt-token\",\n * });\n *\n * // Get tables\n * const tables = await client.getTables();\n *\n * // Create a table\n * const tableId = await client.createTable({\n * name: \"My Table\",\n * mode: \"CASH\",\n * smallBlind: 5,\n * bigBlind: 10,\n * maxPlayers: 6,\n * });\n *\n * // Buy in\n * await client.buyIn(tableId, {\n * amount: 500,\n * seat: 3,\n * idempotencyKey: crypto.randomUUID(),\n * });\n * ```\n */\nexport class PokerClient {\n private readonly baseUrl: string;\n private readonly timeout: number;\n private readonly retry: Required<NonNullable<PokerSDKConfig[\"retry\"]>>;\n private readonly fetchFn: typeof fetch;\n private readonly debug: boolean;\n\n private token: string | null;\n\n constructor(config: PokerSDKConfig) {\n this.baseUrl = config.baseUrl.replace(/\\/$/, \"\");\n this.timeout = config.timeout ?? DEFAULT_CONFIG.timeout;\n this.retry = {\n count: config.retry?.count ?? DEFAULT_CONFIG.retry.count,\n delay: config.retry?.delay ?? DEFAULT_CONFIG.retry.delay,\n backoff: config.retry?.backoff ?? DEFAULT_CONFIG.retry.backoff,\n };\n this.fetchFn = config.fetch ?? globalThis.fetch.bind(globalThis);\n this.debug = config.debug ?? false;\n this.token = config.token ?? null;\n }\n\n // ============================================================================\n // Configuration\n // ============================================================================\n\n /**\n * Set the authentication token\n */\n setToken(token: string | null): void {\n this.token = token;\n }\n\n /**\n * Get current token\n */\n getToken(): string | null {\n return this.token;\n }\n\n /**\n * Check if client is authenticated\n */\n isAuthenticated(): boolean {\n return this.token !== null;\n }\n\n // ============================================================================\n // Authentication\n // ============================================================================\n\n /**\n * Get a nonce for SIWE authentication\n */\n async getNonce(): Promise<string> {\n const response = await this.request<NonceResponse>(\"POST\", \"/auth/nonce\");\n return response.nonce;\n }\n\n /**\n * Login with SIWE signature\n */\n async login(request: LoginRequest): Promise<LoginResponse> {\n const response = await this.request<LoginResponse>(\"POST\", \"/auth/login\", request);\n this.token = response.token;\n return response;\n }\n\n /**\n * Logout and revoke session\n */\n async logout(): Promise<void> {\n await this.request(\"POST\", \"/auth/logout\");\n this.token = null;\n }\n\n // ============================================================================\n // Tables\n // ============================================================================\n\n /**\n * Get list of active tables\n */\n async getTables(): Promise<TableListItem[]> {\n const response = await this.request<{ tables: TableListItem[] }>(\"GET\", \"/tables\");\n return response.tables;\n }\n\n /**\n * Create a new table\n */\n async createTable(config: CreateTableRequest): Promise<string> {\n const response = await this.request<{ tableId: string }>(\"POST\", \"/tables\", config);\n return response.tableId;\n }\n\n /**\n * Get table state\n * @param tableId - Table ID\n * @param since - Optional version for conditional fetch (returns null if unchanged)\n */\n async getTableState(tableId: string, since?: number): Promise<PublicState | null> {\n const query = since !== undefined ? `?since=${since}` : \"\";\n try {\n const response = await this.request<{ state: PublicState }>(\n \"GET\",\n `/tables/${tableId}${query}`\n );\n return response.state;\n } catch (error) {\n if (error instanceof PokerSDKError && error.statusCode === 304) {\n return null;\n }\n throw error;\n }\n }\n\n /**\n * Buy in to a table\n */\n async buyIn(tableId: string, request: BuyInRequest): Promise<void> {\n await this.request(\"POST\", `/tables/${tableId}/buy-in`, request);\n }\n\n /**\n * Execute a game action\n */\n async action(tableId: string, request: GameActionRequest): Promise<PublicState> {\n const response = await this.request<{ state: PublicState }>(\n \"POST\",\n `/tables/${tableId}/action`,\n request\n );\n return response.state;\n }\n\n /**\n * Add chips to stack (rebuy/top-up)\n */\n async addChips(tableId: string, request: AddChipsRequest): Promise<void> {\n await this.request(\"POST\", `/tables/${tableId}/add-chips`, request);\n }\n\n /**\n * Stand from table (leave and cash out)\n */\n async stand(tableId: string): Promise<void> {\n await this.request(\"POST\", `/tables/${tableId}/stand`);\n }\n\n /**\n * Get active and registering tournaments.\n */\n async getTournaments(): Promise<TournamentListItem[]> {\n const response = await this.request<{ tournaments: TournamentListItem[] }>(\n \"GET\",\n \"/tournaments\"\n );\n return response.tournaments;\n }\n\n /**\n * Create a tournament lobby and backing tournament table.\n */\n async createTournament(request: CreateTournamentRequest): Promise<{\n tournamentId: string;\n tableId: string;\n }> {\n return this.request(\"POST\", \"/tournaments\", request);\n }\n\n /**\n * Get tournament lobby details, entries, prize pool, and table reference.\n */\n async getTournament(tournamentId: string): Promise<TournamentDetails> {\n const response = await this.request<{ tournament: TournamentDetails }>(\n \"GET\",\n `/tournaments/${tournamentId}`\n );\n return response.tournament;\n }\n\n /**\n * Register for a tournament. Debits buy-in and fee from MAIN balance.\n */\n async registerTournament(\n tournamentId: string,\n request: RegisterTournamentRequest\n ): Promise<{ success: boolean }> {\n return this.request(\"POST\", `/tournaments/${tournamentId}/register`, request);\n }\n\n /**\n * Start a tournament once at least two players are registered.\n */\n async startTournament(tournamentId: string): Promise<StartTournamentResponse> {\n return this.request(\"POST\", `/tournaments/${tournamentId}/start`);\n }\n\n /**\n * Reconcile a running multi-table tournament after completed hands.\n */\n async reconcileTournament(tournamentId: string): Promise<ReconcileTournamentResponse> {\n return this.request(\"POST\", `/tournaments/${tournamentId}/reconcile`);\n }\n\n /**\n * Manually advance tournament blind level.\n */\n async advanceTournamentBlinds(tournamentId: string): Promise<{\n results: Record<string, { blindLevel?: number; error?: string }>;\n }> {\n return this.request(\"POST\", `/tournaments/${tournamentId}/advance-blinds`);\n }\n\n /**\n * Settle a completed tournament and pay the configured prize distribution.\n */\n async settleTournament(tournamentId: string): Promise<SettleTournamentResponse> {\n return this.request(\"POST\", `/tournaments/${tournamentId}/settle`);\n }\n\n // ============================================================================\n // Convenience Action Methods\n // ============================================================================\n\n /**\n * Fold hand\n */\n async fold(tableId: string): Promise<PublicState> {\n return this.action(tableId, { type: \"FOLD\" });\n }\n\n /**\n * Check (pass action)\n */\n async check(tableId: string): Promise<PublicState> {\n return this.action(tableId, { type: \"CHECK\" });\n }\n\n /**\n * Call current bet\n */\n async call(tableId: string): Promise<PublicState> {\n return this.action(tableId, { type: \"CALL\" });\n }\n\n /**\n * Place a bet\n */\n async bet(tableId: string, amount: number): Promise<PublicState> {\n return this.action(tableId, { type: \"BET\", amount });\n }\n\n /**\n * Raise the current bet\n */\n async raise(tableId: string, amount: number): Promise<PublicState> {\n return this.action(tableId, { type: \"RAISE\", amount });\n }\n\n /**\n * Deal new hand\n */\n async deal(tableId: string): Promise<PublicState> {\n return this.action(tableId, { type: \"DEAL\" });\n }\n\n /**\n * Show cards at showdown\n */\n async show(tableId: string, cardIndices?: number[]): Promise<PublicState> {\n return this.action(tableId, { type: \"SHOW\", cardIndices });\n }\n\n /**\n * Muck cards at showdown\n */\n async muck(tableId: string): Promise<PublicState> {\n return this.action(tableId, { type: \"MUCK\" });\n }\n\n /**\n * Use time bank\n */\n async timeBank(tableId: string): Promise<PublicState> {\n return this.action(tableId, { type: \"TIME_BANK\" });\n }\n\n // ============================================================================\n // User\n // ============================================================================\n\n /**\n * Get current user profile and balances\n */\n async getProfile(): Promise<UserProfile> {\n return this.request<UserProfile>(\"GET\", \"/user/me\");\n }\n\n /**\n * Get hand history\n */\n async getHandHistory(): Promise<HandHistoryEntry[]> {\n const response = await this.request<{ history: HandHistoryEntry[] }>(\"GET\", \"/user/history\");\n return response.history;\n }\n\n /**\n * Request a withdrawal\n */\n async withdraw(request: WithdrawalRequest): Promise<{\n id: string;\n status: string;\n amount: number;\n destination: string;\n blockchain: string;\n token: string;\n }> {\n return this.request(\"POST\", \"/user/withdraw\", request);\n }\n\n /**\n * Get withdrawal history\n */\n async getWithdrawals(): Promise<WithdrawalRecord[]> {\n const response = await this.request<{ withdrawals: WithdrawalRecord[] }>(\n \"GET\",\n \"/user/withdrawals\"\n );\n return response.withdrawals;\n }\n\n // ============================================================================\n // Finance\n // ============================================================================\n\n /**\n * Get supported blockchains and tokens\n */\n async getChains(): Promise<BlockchainInfo[]> {\n return this.request<BlockchainInfo[]>(\"GET\", \"/finance/chains\");\n }\n\n /**\n * Start deposit monitoring session\n */\n async startDeposit(): Promise<DepositSession> {\n return this.request<DepositSession>(\"POST\", \"/finance/deposit/start\");\n }\n\n /**\n * Get deposit address\n */\n async getDepositAddress(): Promise<string> {\n const response = await this.request<{ address: string }>(\"GET\", \"/finance/deposit/address\");\n return response.address;\n }\n\n /**\n * Get deposit history\n */\n async getDeposits(): Promise<DepositRecord[]> {\n const response = await this.request<{ deposits: DepositRecord[] }>(\"GET\", \"/finance/deposits\");\n return response.deposits;\n }\n\n // ============================================================================\n // Notes\n // ============================================================================\n\n /**\n * Get all notes by current user\n */\n async getNotes(): Promise<PlayerNote[]> {\n const response = await this.request<{ notes: PlayerNote[] }>(\"GET\", \"/notes\");\n return response.notes;\n }\n\n /**\n * Get note for specific player\n */\n async getNote(targetId: string): Promise<PlayerNote | null> {\n const response = await this.request<{ note: PlayerNote | null }>(\"GET\", `/notes/${targetId}`);\n return response.note;\n }\n\n /**\n * Save or update note\n */\n async saveNote(targetId: string, content: string, label?: string): Promise<PlayerNote> {\n const response = await this.request<{ note: PlayerNote }>(\"POST\", \"/notes\", {\n targetId,\n content,\n label,\n });\n return response.note;\n }\n\n /**\n * Delete note\n */\n async deleteNote(targetId: string): Promise<void> {\n await this.request(\"DELETE\", `/notes/${targetId}`);\n }\n\n // ============================================================================\n // Health\n // ============================================================================\n\n /**\n * Health check\n */\n async health(): Promise<{ status: string; timestamp: number }> {\n return this.request(\"GET\", \"/health\");\n }\n\n // ============================================================================\n // Private Methods\n // ============================================================================\n\n /**\n * Make HTTP request with retry logic\n */\n private async request<T>(method: string, path: string, body?: unknown): Promise<T> {\n const url = `${this.baseUrl}${path}`;\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n\n if (this.token) {\n headers.Authorization = `Bearer ${this.token}`;\n }\n\n // Only replay reads or writes protected by the API's idempotency key.\n const canRetry =\n method === \"GET\" ||\n (typeof body === \"object\" &&\n body !== null &&\n \"idempotencyKey\" in body &&\n typeof body.idempotencyKey === \"string\" &&\n body.idempotencyKey.length > 0);\n const retryCount = canRetry ? this.retry.count : 0;\n let lastError: Error | null = null;\n\n for (let attempt = 0; attempt <= retryCount; attempt++) {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n try {\n if (this.debug) {\n console.log(`[PokerSDK] ${method} ${path}`, body);\n }\n\n const response = await this.fetchFn(url, {\n method,\n headers,\n body: body ? JSON.stringify(body) : undefined,\n signal: controller.signal,\n });\n\n // Handle 304 Not Modified\n if (response.status === 304) {\n throw new PokerSDKError(\"Not Modified\", \"NOT_MODIFIED\", 304);\n }\n\n // Handle non-2xx responses\n if (!response.ok) {\n const errorData = (await response.json().catch(() => ({}))) as {\n message?: string;\n error?: string;\n code?: string;\n };\n\n throw new PokerSDKError(\n errorData.message ?? errorData.error ?? `HTTP ${response.status}`,\n errorData.code ?? errorData.error ?? \"HTTP_ERROR\",\n response.status,\n errorData\n );\n }\n\n if (response.status === 204 || response.status === 205) return undefined as T;\n const data = (await response.json()) as T;\n\n if (this.debug) {\n console.log(`[PokerSDK] Response:`, data);\n }\n\n return data;\n } catch (error) {\n clearTimeout(timeoutId);\n lastError = error as Error;\n if (error instanceof PokerSDKError && error.statusCode === 304) throw error;\n\n // Don't retry client errors (4xx) except rate limiting\n if (error instanceof PokerSDKError) {\n if (\n error.statusCode &&\n error.statusCode >= 400 &&\n error.statusCode < 500 &&\n error.statusCode !== 429\n ) {\n throw error;\n }\n }\n\n // Don't retry on abort\n if (controller.signal.aborted || (error instanceof Error && error.name === \"AbortError\")) {\n throw new PokerSDKError(\"Request timeout\", \"TIMEOUT\", undefined, {\n timeout: this.timeout,\n });\n }\n\n // Retry with backoff\n if (attempt < retryCount) {\n const delay = this.retry.delay * Math.pow(this.retry.backoff, attempt);\n if (this.debug) {\n console.log(`[PokerSDK] Retry ${attempt + 1}/${this.retry.count} in ${delay}ms`);\n }\n await this.sleep(delay);\n }\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n throw lastError ?? new PokerSDKError(\"Request failed\", \"REQUEST_FAILED\");\n }\n\n /**\n * Sleep helper\n */\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n}\n","/**\n * PokerSocket - WebSocket client for real-time game updates\n *\n * Provides automatic reconnection, heartbeat, and typed event handling\n * for real-time poker game state synchronization.\n */\n\nimport type {\n PublicState,\n ClientMessage,\n JoinTableMessage,\n LeaveTableMessage,\n PingMessage,\n} from \"@pokertools/types\";\n\nimport { safeParseServerMessage } from \"@pokertools/types\";\n\nimport {\n PokerSDKConfig,\n PokerSDKError,\n ConnectionState,\n PokerSocketEvents,\n EventListener,\n} from \"./types\";\n\n/**\n * WebSocket configuration\n */\ninterface SocketConfig {\n /** WebSocket URL */\n url: string;\n /** JWT token for authentication. Sent as a WebSocket subprotocol, never in the URL. */\n token: string;\n /** Heartbeat interval in ms (default: 25000) */\n heartbeatInterval?: number;\n /** Reconnection attempts (default: 10) */\n reconnectAttempts?: number;\n /** Base reconnection delay in ms (default: 1000) */\n reconnectDelay?: number;\n /** Max reconnection delay in ms (default: 30000) */\n maxReconnectDelay?: number;\n /** Custom WebSocket implementation */\n WebSocket?: typeof WebSocket;\n /** Enable debug logging */\n debug?: boolean;\n}\n\n/**\n * Default socket configuration\n */\nconst DEFAULT_SOCKET_CONFIG = {\n heartbeatInterval: 25000,\n reconnectAttempts: 10,\n reconnectDelay: 1000,\n maxReconnectDelay: 30000,\n};\n\n/**\n * PokerSocket - Real-time WebSocket client\n *\n * @example\n * ```typescript\n * const socket = new PokerSocket({\n * url: \"wss://api.poker.example.com/ws/play\",\n * token: \"jwt-token\",\n * });\n *\n * // Listen for events\n * socket.on(\"connect\", () => console.log(\"Connected!\"));\n * socket.on(\"stateUpdate\", (tableId, state) => {\n * console.log(\"State updated:\", state);\n * });\n *\n * // Connect\n * await socket.connect();\n *\n * // Join a table\n * await socket.join(\"table-123\");\n *\n * // Later: disconnect\n * socket.disconnect();\n * ```\n */\nexport class PokerSocket {\n private readonly url: string;\n private readonly token: string;\n private readonly protocolToken: string;\n private readonly heartbeatInterval: number;\n private readonly reconnectAttempts: number;\n private readonly reconnectDelay: number;\n private readonly maxReconnectDelay: number;\n private readonly WebSocketImpl: typeof WebSocket;\n private readonly debug: boolean;\n\n private ws: WebSocket | null = null;\n private connectionState: ConnectionState = \"disconnected\";\n private reconnectCount = 0;\n private heartbeatTimer: ReturnType<typeof setInterval> | null = null;\n private pendingRequests = new Map<\n string,\n {\n resolve: (value: unknown) => void;\n reject: (error: Error) => void;\n timeout: ReturnType<typeof setTimeout>;\n }\n >();\n private joinedTables = new Set<string>();\n private listeners = new Map<\n keyof PokerSocketEvents,\n Set<EventListener<keyof PokerSocketEvents>>\n >();\n private shouldReconnect = true;\n\n // Latest state cache for each table\n private stateCache = new Map<string, PublicState>();\n\n // Version metadata per table (exposed safely via getTableVersion)\n private tableVersions = new Map<string, number>();\n\n constructor(config: SocketConfig) {\n // Keep authentication material out of URLs so it is not captured by\n // access logs, proxy logs, or browser history.\n const wsUrl = new URL(config.url);\n this.url = wsUrl.toString();\n this.token = config.token;\n this.protocolToken = `jwt.${config.token}`;\n\n this.heartbeatInterval = config.heartbeatInterval ?? DEFAULT_SOCKET_CONFIG.heartbeatInterval;\n this.reconnectAttempts = config.reconnectAttempts ?? DEFAULT_SOCKET_CONFIG.reconnectAttempts;\n this.reconnectDelay = config.reconnectDelay ?? DEFAULT_SOCKET_CONFIG.reconnectDelay;\n this.maxReconnectDelay = config.maxReconnectDelay ?? DEFAULT_SOCKET_CONFIG.maxReconnectDelay;\n this.WebSocketImpl = config.WebSocket ?? globalThis.WebSocket;\n this.debug = config.debug ?? false;\n }\n\n /**\n * Create a PokerSocket from SDK config\n */\n static fromConfig(config: PokerSDKConfig): PokerSocket {\n if (!config.token) {\n throw new PokerSDKError(\"Token is required for WebSocket connection\", \"AUTH_REQUIRED\");\n }\n\n const baseUrl = config.baseUrl.replace(/\\/$/, \"\");\n const wsUrl = config.wsUrl ?? baseUrl.replace(/^http/, \"ws\") + \"/ws/play\";\n\n return new PokerSocket({\n url: wsUrl,\n token: config.token,\n WebSocket: config.WebSocket,\n debug: config.debug,\n });\n }\n\n // ============================================================================\n // Connection Management\n // ============================================================================\n\n /**\n * Connect to the WebSocket server\n */\n connect(): Promise<void> {\n return new Promise((resolve, reject) => {\n if (this.connectionState === \"connected\") {\n resolve();\n return;\n }\n\n if (this.connectionState === \"connecting\") {\n // Wait for existing connection attempt\n const checkConnection = () => {\n if (this.connectionState === \"connected\") {\n resolve();\n } else if (this.connectionState === \"disconnected\") {\n reject(new PokerSDKError(\"Connection failed\", \"CONNECTION_FAILED\"));\n } else {\n setTimeout(checkConnection, 100);\n }\n };\n checkConnection();\n return;\n }\n\n this.shouldReconnect = true;\n this.connectionState = \"connecting\";\n this.log(\"Connecting to\", this.url);\n\n try {\n this.ws = new this.WebSocketImpl(this.url, [\"pokertools\", this.protocolToken]);\n\n this.ws.onopen = () => {\n this.connectionState = \"connected\";\n this.reconnectCount = 0;\n this.startHeartbeat();\n this.emit(\"connect\");\n this.log(\"Connected\");\n\n // Rejoin previously joined tables\n void this.rejoinTables();\n\n resolve();\n };\n\n this.ws.onclose = (event) => {\n this.handleDisconnect(event.reason || \"Connection closed\");\n };\n\n this.ws.onerror = (event) => {\n this.log(\"WebSocket error:\", event);\n if (this.connectionState === \"connecting\") {\n reject(new PokerSDKError(\"Connection failed\", \"CONNECTION_FAILED\"));\n }\n };\n\n this.ws.onmessage = (event) => {\n this.handleMessage(event.data as string);\n };\n } catch (error) {\n this.connectionState = \"disconnected\";\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors\n reject(error);\n }\n });\n }\n\n /**\n * Disconnect from the WebSocket server\n */\n disconnect(): void {\n this.shouldReconnect = false;\n this.stopHeartbeat();\n this.clearPendingRequests(\"Connection closed\");\n\n if (this.ws) {\n this.ws.close(1000, \"Client disconnect\");\n this.ws = null;\n }\n\n this.connectionState = \"disconnected\";\n this.emit(\"disconnect\", \"Client disconnect\");\n this.log(\"Disconnected\");\n }\n\n /**\n * Get current connection state\n */\n getState(): ConnectionState {\n return this.connectionState;\n }\n\n /**\n * Check if connected\n */\n isConnected(): boolean {\n return this.connectionState === \"connected\";\n }\n\n // ============================================================================\n // Table Subscription\n // ============================================================================\n\n /**\n * Join a table to receive real-time updates\n */\n async join(tableId: string): Promise<PublicState> {\n if (this.connectionState !== \"connected\") {\n throw new PokerSDKError(\"Not connected\", \"NOT_CONNECTED\");\n }\n\n const requestId = this.generateRequestId();\n const message: JoinTableMessage = {\n type: \"JOIN\",\n tableId,\n requestId,\n };\n\n this.joinedTables.add(tableId);\n this.send(message);\n\n // Wait for snapshot response\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n this.pendingRequests.delete(requestId);\n reject(new PokerSDKError(\"Join timeout\", \"TIMEOUT\"));\n }, 10000);\n\n // Store resolver for snapshot message\n this.pendingRequests.set(`snapshot:${tableId}`, {\n resolve: (state) => {\n clearTimeout(timeout);\n resolve(state as PublicState);\n },\n reject,\n timeout,\n });\n });\n }\n\n /**\n * Leave a table\n */\n leave(tableId: string): void {\n if (this.connectionState !== \"connected\") {\n return;\n }\n\n this.joinedTables.delete(tableId);\n this.stateCache.delete(tableId);\n this.tableVersions.delete(tableId);\n\n const message: LeaveTableMessage = {\n type: \"LEAVE\",\n tableId,\n };\n\n this.send(message);\n }\n\n /**\n * Get currently joined tables\n */\n getJoinedTables(): string[] {\n return Array.from(this.joinedTables);\n }\n\n /**\n * Get cached state for a table\n */\n getCachedState(tableId: string): PublicState | undefined {\n return this.stateCache.get(tableId);\n }\n\n /**\n * Get latest known version for a table\n * Returns undefined if no version has been received\n */\n getTableVersion(tableId: string): number | undefined {\n return this.tableVersions.get(tableId);\n }\n\n // ============================================================================\n // Event Handling\n // ============================================================================\n\n /**\n * Subscribe to an event\n */\n on<E extends keyof PokerSocketEvents>(event: E, listener: PokerSocketEvents[E]): () => void {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, new Set());\n }\n this.listeners.get(event)!.add(listener);\n\n // Return unsubscribe function\n return () => {\n this.off(event, listener);\n };\n }\n\n /**\n * Unsubscribe from an event\n */\n off<E extends keyof PokerSocketEvents>(event: E, listener: PokerSocketEvents[E]): void {\n const listeners = this.listeners.get(event);\n if (listeners) {\n listeners.delete(listener);\n }\n }\n\n /**\n * Subscribe to an event (once)\n */\n once<E extends keyof PokerSocketEvents>(event: E, listener: PokerSocketEvents[E]): () => void {\n const onceWrapper = ((...args: Parameters<PokerSocketEvents[E]>) => {\n this.off(event, onceWrapper);\n (listener as (...args: unknown[]) => void)(...args);\n }) as PokerSocketEvents[E];\n\n return this.on(event, onceWrapper);\n }\n\n // ============================================================================\n // Ping\n // ============================================================================\n\n /**\n * Send application-level ping (not WebSocket ping)\n */\n async ping(): Promise<number> {\n if (this.connectionState !== \"connected\") {\n throw new PokerSDKError(\"Not connected\", \"NOT_CONNECTED\");\n }\n\n const requestId = this.generateRequestId();\n const startTime = Date.now();\n\n const message: PingMessage = {\n type: \"PING\",\n requestId,\n timestamp: startTime,\n };\n\n this.send(message);\n\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n this.pendingRequests.delete(requestId);\n reject(new PokerSDKError(\"Ping timeout\", \"TIMEOUT\"));\n }, 5000);\n\n this.pendingRequests.set(requestId, {\n resolve: () => {\n resolve(Date.now() - startTime);\n },\n reject,\n timeout,\n });\n });\n }\n\n // ============================================================================\n // Private Methods\n // ============================================================================\n\n /**\n * Send a message to the server\n */\n private send(message: ClientMessage): void {\n if (this.ws?.readyState !== this.WebSocketImpl.OPEN) {\n throw new PokerSDKError(\"WebSocket not open\", \"NOT_CONNECTED\");\n }\n\n this.log(\"Sending:\", message);\n this.ws.send(JSON.stringify(message));\n }\n\n /**\n * Handle incoming message\n */\n private handleMessage(data: string): void {\n try {\n const parsed: unknown = JSON.parse(data);\n const result = safeParseServerMessage(parsed);\n if (!result.success) {\n this.log(\"Invalid server message:\", result.error);\n return;\n }\n const message = result.data;\n this.log(\"Received:\", message);\n\n switch (message.type) {\n case \"SNAPSHOT\": {\n // Cache state and track version\n this.stateCache.set(message.tableId, message.state);\n this.tableVersions.set(message.tableId, message.version);\n\n // Resolve pending join request\n const pending = this.pendingRequests.get(`snapshot:${message.tableId}`);\n if (pending) {\n this.pendingRequests.delete(`snapshot:${message.tableId}`);\n pending.resolve(message.state);\n }\n\n this.emit(\"snapshot\", message.tableId, message.state);\n break;\n }\n\n case \"STATE_UPDATE\": {\n // Track version metadata (always available)\n this.tableVersions.set(message.tableId, message.version);\n\n // Only emit if we have a cached state (from a prior SNAPSHOT)\n // Never emit a phantom partial PublicState\n const cachedState = this.stateCache.get(message.tableId);\n if (cachedState) {\n // Update version in cache to keep it consistent\n const updatedState = { ...cachedState, version: message.version };\n this.stateCache.set(message.tableId, updatedState);\n this.emit(\"stateUpdate\", message.tableId, updatedState);\n }\n // If no cached state, consumer should fetch via REST\n // Version is still available via getTableVersion()\n break;\n }\n\n case \"ACTION\": {\n this.emit(\n \"action\",\n message.tableId,\n message.playerId,\n message.actionType,\n message.amount\n );\n break;\n }\n\n case \"ACK\": {\n const pending = this.pendingRequests.get(message.requestId);\n if (pending) {\n clearTimeout(pending.timeout);\n this.pendingRequests.delete(message.requestId);\n pending.resolve(undefined);\n }\n break;\n }\n\n case \"PONG\": {\n const pending = this.pendingRequests.get(message.requestId);\n if (pending) {\n clearTimeout(pending.timeout);\n this.pendingRequests.delete(message.requestId);\n pending.resolve(message.timestamp);\n }\n break;\n }\n\n case \"ERROR\": {\n this.log(\"Server error:\", message);\n if (message.requestId) {\n const pending = this.pendingRequests.get(message.requestId);\n if (pending) {\n clearTimeout(pending.timeout);\n this.pendingRequests.delete(message.requestId);\n pending.reject(new PokerSDKError(message.message, message.code));\n }\n }\n this.emit(\"error\", new PokerSDKError(message.message, message.code));\n break;\n }\n }\n } catch (error) {\n this.log(\"Failed to parse message:\", error);\n }\n }\n\n /**\n * Handle disconnect\n */\n private handleDisconnect(reason: string): void {\n this.stopHeartbeat();\n this.ws = null;\n\n const wasConnected = this.connectionState === \"connected\";\n this.connectionState = \"disconnected\";\n\n if (wasConnected) {\n this.emit(\"disconnect\", reason);\n }\n\n // Attempt reconnection if enabled\n if (this.shouldReconnect && this.reconnectCount < this.reconnectAttempts) {\n void this.reconnect();\n }\n }\n\n /**\n * Attempt to reconnect\n */\n private async reconnect(): Promise<void> {\n this.reconnectCount++;\n this.connectionState = \"reconnecting\";\n\n const delay = Math.min(\n this.reconnectDelay * Math.pow(2, this.reconnectCount - 1),\n this.maxReconnectDelay\n );\n\n this.log(\n `Reconnecting in ${delay}ms (attempt ${this.reconnectCount}/${this.reconnectAttempts})`\n );\n this.emit(\"reconnect\", this.reconnectCount);\n\n await this.sleep(delay);\n\n if (!this.shouldReconnect) {\n return;\n }\n\n try {\n await this.connect();\n } catch {\n // connect() handles its own errors\n }\n }\n\n /**\n * Rejoin previously joined tables\n */\n private async rejoinTables(): Promise<void> {\n for (const tableId of this.joinedTables) {\n try {\n await this.join(tableId);\n } catch (error) {\n this.log(\"Failed to rejoin table:\", tableId, error);\n }\n }\n }\n\n /**\n * Start heartbeat timer\n */\n private startHeartbeat(): void {\n this.stopHeartbeat();\n this.heartbeatTimer = setInterval(() => {\n if (this.connectionState === \"connected\") {\n void this.ping().catch(() => {\n // Ping failed, connection might be dead\n this.log(\"Heartbeat failed\");\n });\n }\n }, this.heartbeatInterval);\n }\n\n /**\n * Stop heartbeat timer\n */\n private stopHeartbeat(): void {\n if (this.heartbeatTimer) {\n clearInterval(this.heartbeatTimer);\n this.heartbeatTimer = null;\n }\n }\n\n /**\n * Clear all pending requests\n */\n private clearPendingRequests(reason: string): void {\n for (const pending of this.pendingRequests.values()) {\n clearTimeout(pending.timeout);\n\n pending.reject(new PokerSDKError(reason, \"CONNECTION_CLOSED\"));\n }\n this.pendingRequests.clear();\n }\n\n /**\n * Emit event to listeners\n */\n private emit<E extends keyof PokerSocketEvents>(\n event: E,\n ...args: Parameters<PokerSocketEvents[E]>\n ): void {\n const listeners = this.listeners.get(event);\n if (listeners) {\n for (const listener of listeners) {\n try {\n (listener as (...args: unknown[]) => void)(...args);\n } catch (error) {\n this.log(\"Listener error:\", error);\n }\n }\n }\n }\n\n /**\n * Generate unique request ID\n */\n private generateRequestId(): string {\n return `${Date.now()}-${Math.random().toString(36).slice(2, 11)}`;\n }\n\n /**\n * Sleep helper\n */\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n /**\n * Debug logger\n */\n private log(...args: unknown[]): void {\n if (this.debug) {\n console.log(\"[PokerSocket]\", ...args);\n }\n }\n}\n","/**\n * React hooks for PokerTools SDK\n *\n * Provides React-friendly hooks for managing poker game state,\n * WebSocket connections, and authentication.\n */\n\nimport {\n useState,\n useEffect,\n useCallback,\n useRef,\n useMemo,\n createContext,\n useContext,\n} from \"react\";\nimport type { ReactNode } from \"react\";\nimport type { PublicState, TournamentDetails, TournamentListItem } from \"@pokertools/types\";\nimport { PokerClient } from \"../client\";\nimport { PokerSocket } from \"../socket\";\nimport type { PokerSDKConfig, ConnectionState, UserProfile, UserBalances } from \"../types\";\n\n// ============================================================================\n// Context\n// ============================================================================\n\ninterface PokerContextValue {\n client: PokerClient;\n socket: PokerSocket | null;\n isAuthenticated: boolean;\n connectionState: ConnectionState;\n connect: () => Promise<void>;\n disconnect: () => void;\n}\n\nconst PokerContext = createContext<PokerContextValue | null>(null);\n\n/**\n * Props for PokerProvider\n */\nexport interface PokerProviderProps {\n /** SDK configuration */\n config: PokerSDKConfig;\n /** Children to render */\n children: ReactNode;\n /** Auto-connect WebSocket when authenticated (default: true) */\n autoConnect?: boolean;\n}\n\n/**\n * PokerProvider - Context provider for PokerTools SDK\n *\n * @example\n * ```tsx\n * import { PokerProvider } from \"@pokertools/sdk/react\";\n *\n * function App() {\n * return (\n * <PokerProvider config={{ baseUrl: \"https://api.poker.example.com\", token }}>\n * <Game />\n * </PokerProvider>\n * );\n * }\n * ```\n */\nexport function PokerProvider({ config, children, autoConnect = true }: PokerProviderProps) {\n const [connectionState, setConnectionState] = useState<ConnectionState>(\"disconnected\");\n const clientRef = useRef<PokerClient | null>(null);\n const socketRef = useRef<PokerSocket | null>(null);\n const configRef = useRef(config);\n const connectPromiseRef = useRef<Promise<void> | null>(null);\n\n // Initialize client\n clientRef.current ??= new PokerClient(config);\n\n useEffect(() => {\n configRef.current = config;\n }, [config]);\n\n // Update token when config changes\n useEffect(() => {\n if (clientRef.current) {\n clientRef.current.setToken(config.token ?? null);\n }\n }, [config.token]);\n\n const ensureSocket = useCallback(() => {\n if (!socketRef.current) {\n socketRef.current = PokerSocket.fromConfig(configRef.current);\n socketRef.current.on(\"connect\", () => setConnectionState(\"connected\"));\n socketRef.current.on(\"disconnect\", () => setConnectionState(\"disconnected\"));\n socketRef.current.on(\"reconnect\", () => setConnectionState(\"reconnecting\"));\n }\n return socketRef.current;\n }, []);\n\n const connect = useCallback(async () => {\n if (!configRef.current.token) {\n throw new Error(\"Token required to connect\");\n }\n if (connectPromiseRef.current) return connectPromiseRef.current;\n const socket = ensureSocket();\n setConnectionState(\"connecting\");\n const pending = socket.connect().finally(() => {\n if (connectPromiseRef.current === pending) connectPromiseRef.current = null;\n });\n connectPromiseRef.current = pending;\n await pending;\n }, [ensureSocket]);\n\n // A socket authenticates once at construction. Replacing the token must\n // replace the socket too, including its cached private table state.\n useEffect(() => {\n return () => {\n socketRef.current?.disconnect();\n socketRef.current = null;\n connectPromiseRef.current = null;\n };\n }, [config.token]);\n\n // Auto-connect when a token is present, without recreating sockets for inline\n // config object identity changes.\n useEffect(() => {\n if (config.token && autoConnect) {\n void connect().catch(console.error);\n } else if (!config.token && socketRef.current) {\n socketRef.current.disconnect();\n socketRef.current = null;\n }\n }, [config.token, autoConnect, connect]);\n\n const disconnect = useCallback(() => {\n if (socketRef.current) {\n socketRef.current.disconnect();\n }\n }, []);\n\n const value = useMemo(\n () => ({\n client: clientRef.current!,\n socket: socketRef.current,\n isAuthenticated: !!config.token,\n connectionState,\n connect,\n disconnect,\n }),\n [config.token, connectionState, connect, disconnect]\n );\n\n return <PokerContext.Provider value={value}>{children}</PokerContext.Provider>;\n}\n\n/**\n * Hook to access PokerTools context\n */\nexport function usePoker(): PokerContextValue {\n const context = useContext(PokerContext);\n if (!context) {\n throw new Error(\"usePoker must be used within a PokerProvider\");\n }\n return context;\n}\n\n/**\n * Hook to get the PokerClient instance\n */\nexport function usePokerClient(): PokerClient {\n return usePoker().client;\n}\n\n/**\n * Hook to get the PokerSocket instance\n */\nexport function usePokerSocket(): PokerSocket | null {\n return usePoker().socket;\n}\n\n// ============================================================================\n// Table Hook\n// ============================================================================\n\ninterface UseTableOptions {\n /** Polling interval for state updates (ms, default: disabled) */\n pollInterval?: number;\n /** Auto-join via WebSocket (default: true) */\n autoJoin?: boolean;\n}\n\ninterface UseTableResult {\n /** Current table state */\n state: PublicState | null;\n /** Loading state */\n isLoading: boolean;\n /** Error if any */\n error: Error | null;\n /** Refresh state from server */\n refresh: () => Promise<void>;\n /** Execute an action */\n action: (type: string, amount?: number) => Promise<void>;\n /** Leave the table */\n leave: () => Promise<void>;\n}\n\n/**\n * Hook to manage a poker table\n *\n * @example\n * ```tsx\n * function Table({ tableId }: { tableId: string }) {\n * const { state, isLoading, error, action } = useTable(tableId);\n *\n * if (isLoading) return <div>Loading...</div>;\n * if (error) return <div>Error: {error.message}</div>;\n * if (!state) return <div>Table not found</div>;\n *\n * return (\n * <div>\n * <div>Pot: {state.pot}</div>\n * <button onClick={() => action(\"FOLD\")}>Fold</button>\n * <button onClick={() => action(\"CALL\")}>Call</button>\n * </div>\n * );\n * }\n * ```\n */\nexport function useTable(tableId: string, options: UseTableOptions = {}): UseTableResult {\n const { pollInterval, autoJoin = true } = options;\n const { client, socket } = usePoker();\n\n const [state, setState] = useState<PublicState | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n const versionRef = useRef<number>(0);\n\n // Fetch initial state\n const refresh = useCallback(async () => {\n try {\n setIsLoading(true);\n const newState = await client.getTableState(tableId);\n if (newState) {\n setState(newState);\n versionRef.current = newState.version;\n }\n setError(null);\n } catch (err) {\n setError(err as Error);\n } finally {\n setIsLoading(false);\n }\n }, [client, tableId]);\n\n // Initial load\n useEffect(() => {\n void refresh();\n }, [refresh]);\n\n // WebSocket subscription\n useEffect(() => {\n if (!socket || !autoJoin) return;\n\n const handleStateUpdate = (id: string, newState: PublicState) => {\n if (id === tableId) {\n setState(newState);\n versionRef.current = newState.version;\n }\n };\n\n const handleSnapshot = (id: string, newState: PublicState) => {\n if (id === tableId) {\n setState(newState);\n versionRef.current = newState.version;\n setIsLoading(false);\n }\n };\n\n socket.on(\"stateUpdate\", handleStateUpdate);\n socket.on(\"snapshot\", handleSnapshot);\n\n // Join table if connected\n if (socket.isConnected()) {\n void socket.join(tableId).catch(console.error);\n }\n\n return () => {\n socket.off(\"stateUpdate\", handleStateUpdate);\n socket.off(\"snapshot\", handleSnapshot);\n socket.leave(tableId);\n };\n }, [socket, tableId, autoJoin]);\n\n // Polling (if configured)\n useEffect(() => {\n if (!pollInterval) return;\n\n const interval = setInterval(() => {\n void (async () => {\n const newState = await client.getTableState(tableId, versionRef.current);\n if (newState) {\n setState(newState);\n versionRef.current = newState.version;\n }\n })();\n }, pollInterval);\n\n return () => clearInterval(interval);\n }, [client, tableId, pollInterval]);\n\n // Action helper\n const action = useCallback(\n async (type: string, amount?: number) => {\n const newState = await client.action(tableId, {\n type: type as Parameters<typeof client.action>[1][\"type\"],\n amount,\n });\n setState(newState);\n versionRef.current = newState.version;\n },\n [client, tableId]\n );\n\n // Leave table\n const leave = useCallback(async () => {\n await client.stand(tableId);\n if (socket) {\n socket.leave(tableId);\n }\n }, [client, socket, tableId]);\n\n return { state, isLoading, error, refresh, action, leave };\n}\n\n// ============================================================================\n// User Hooks\n// ============================================================================\n\ninterface UseUserResult {\n /** User profile */\n profile: UserProfile | null;\n /** User balances */\n balances: UserBalances | null;\n /** Loading state */\n isLoading: boolean;\n /** Error if any */\n error: Error | null;\n /** Refresh profile */\n refresh: () => Promise<void>;\n}\n\n/**\n * Hook to get current user profile and balances\n */\nexport function useUser(): UseUserResult {\n const { client, isAuthenticated } = usePoker();\n const [profile, setProfile] = useState<UserProfile | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const refresh = useCallback(async () => {\n if (!isAuthenticated) return;\n try {\n setIsLoading(true);\n const data = await client.getProfile();\n setProfile(data);\n setError(null);\n } catch (err) {\n setError(err as Error);\n } finally {\n setIsLoading(false);\n }\n }, [client, isAuthenticated]);\n\n useEffect(() => {\n if (isAuthenticated) {\n void refresh();\n } else {\n setProfile(null);\n }\n }, [isAuthenticated, refresh]);\n\n return {\n profile,\n balances: profile?.balances ?? null,\n isLoading,\n error,\n refresh,\n };\n}\n\n// ============================================================================\n// Tables List Hook\n// ============================================================================\n\ninterface UseTablesResult {\n /** List of tables */\n tables: Awaited<ReturnType<PokerClient[\"getTables\"]>>;\n /** Loading state */\n isLoading: boolean;\n /** Error if any */\n error: Error | null;\n /** Refresh tables list */\n refresh: () => Promise<void>;\n}\n\n/**\n * Hook to get list of active tables\n */\nexport function useTables(): UseTablesResult {\n const { client } = usePoker();\n const [tables, setTables] = useState<Awaited<ReturnType<PokerClient[\"getTables\"]>>>([]);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n const refresh = useCallback(async () => {\n try {\n setIsLoading(true);\n const data = await client.getTables();\n setTables(data);\n setError(null);\n } catch (err) {\n setError(err as Error);\n } finally {\n setIsLoading(false);\n }\n }, [client]);\n\n useEffect(() => {\n void refresh();\n }, [refresh]);\n\n return { tables, isLoading, error, refresh };\n}\n\n// ============================================================================\n// Tournament Hooks\n// ============================================================================\n\ninterface UseTournamentsResult {\n /** Active and registering tournament lobbies */\n tournaments: TournamentListItem[];\n /** Loading state */\n isLoading: boolean;\n /** Error if any */\n error: Error | null;\n /** Refresh tournament list */\n refresh: () => Promise<void>;\n}\n\n/**\n * Hook to get active and registering tournaments.\n */\nexport function useTournaments(): UseTournamentsResult {\n const { client } = usePoker();\n const [tournaments, setTournaments] = useState<TournamentListItem[]>([]);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n const refresh = useCallback(async () => {\n try {\n setIsLoading(true);\n const data = await client.getTournaments();\n setTournaments(data);\n setError(null);\n } catch (err) {\n setError(err as Error);\n } finally {\n setIsLoading(false);\n }\n }, [client]);\n\n useEffect(() => {\n void refresh();\n }, [refresh]);\n\n return { tournaments, isLoading, error, refresh };\n}\n\ninterface UseTournamentResult {\n /** Tournament lobby details */\n tournament: TournamentDetails | null;\n /** Loading state */\n isLoading: boolean;\n /** Error if any */\n error: Error | null;\n /** Refresh tournament details */\n refresh: () => Promise<void>;\n}\n\n/**\n * Hook to get a tournament lobby and its entries/tables.\n */\nexport function useTournament(tournamentId: string | null): UseTournamentResult {\n const { client } = usePoker();\n const [tournament, setTournament] = useState<TournamentDetails | null>(null);\n const [isLoading, setIsLoading] = useState(Boolean(tournamentId));\n const [error, setError] = useState<Error | null>(null);\n\n const refresh = useCallback(async () => {\n if (!tournamentId) {\n setTournament(null);\n setIsLoading(false);\n return;\n }\n\n try {\n setIsLoading(true);\n const data = await client.getTournament(tournamentId);\n setTournament(data);\n setError(null);\n } catch (err) {\n setError(err as Error);\n } finally {\n setIsLoading(false);\n }\n }, [client, tournamentId]);\n\n useEffect(() => {\n void refresh();\n }, [refresh]);\n\n return { tournament, isLoading, error, refresh };\n}\n\n// ============================================================================\n// Connection Hook\n// ============================================================================\n\n/**\n * Hook to manage WebSocket connection\n */\nexport function useConnection() {\n const { socket, connectionState, connect, disconnect } = usePoker();\n\n const [latency, setLatency] = useState<number | null>(null);\n\n // Ping for latency measurement\n const ping = useCallback(async () => {\n if (!socket?.isConnected()) return null;\n try {\n const ms = await socket.ping();\n setLatency(ms);\n return ms;\n } catch {\n return null;\n }\n }, [socket]);\n\n return {\n state: connectionState,\n isConnected: connectionState === \"connected\",\n isConnecting: connectionState === \"connecting\",\n isReconnecting: connectionState === \"reconnecting\",\n latency,\n connect,\n disconnect,\n ping,\n };\n}\n\n// ============================================================================\n// Export Types\n// ============================================================================\n\nexport type {\n UseTableOptions,\n UseTableResult,\n UseUserResult,\n UseTablesResult,\n UseTournamentsResult,\n UseTournamentResult,\n PokerContextValue,\n};\n"]}
@@ -389,11 +389,13 @@ var PokerClient = class {
389
389
  if (this.token) {
390
390
  headers.Authorization = `Bearer ${this.token}`;
391
391
  }
392
+ const canRetry = method === "GET" || typeof body === "object" && body !== null && "idempotencyKey" in body && typeof body.idempotencyKey === "string" && body.idempotencyKey.length > 0;
393
+ const retryCount = canRetry ? this.retry.count : 0;
392
394
  let lastError = null;
393
- for (let attempt = 0; attempt <= this.retry.count; attempt++) {
395
+ for (let attempt = 0; attempt <= retryCount; attempt++) {
396
+ const controller = new AbortController();
397
+ const timeoutId = setTimeout(() => controller.abort(), this.timeout);
394
398
  try {
395
- const controller = new AbortController();
396
- const timeoutId = setTimeout(() => controller.abort(), this.timeout);
397
399
  if (this.debug) {
398
400
  console.log(`[PokerSDK] ${method} ${path}`, body);
399
401
  }
@@ -403,7 +405,6 @@ var PokerClient = class {
403
405
  body: body ? JSON.stringify(body) : void 0,
404
406
  signal: controller.signal
405
407
  });
406
- clearTimeout(timeoutId);
407
408
  if (response.status === 304) {
408
409
  throw new PokerSDKError("Not Modified", "NOT_MODIFIED", 304);
409
410
  }
@@ -416,30 +417,35 @@ var PokerClient = class {
416
417
  errorData
417
418
  );
418
419
  }
420
+ if (response.status === 204 || response.status === 205) return void 0;
419
421
  const data = await response.json();
420
422
  if (this.debug) {
421
423
  console.log(`[PokerSDK] Response:`, data);
422
424
  }
423
425
  return data;
424
426
  } catch (error) {
427
+ clearTimeout(timeoutId);
425
428
  lastError = error;
429
+ if (error instanceof PokerSDKError && error.statusCode === 304) throw error;
426
430
  if (error instanceof PokerSDKError) {
427
431
  if (error.statusCode && error.statusCode >= 400 && error.statusCode < 500 && error.statusCode !== 429) {
428
432
  throw error;
429
433
  }
430
434
  }
431
- if (error instanceof Error && error.name === "AbortError") {
435
+ if (controller.signal.aborted || error instanceof Error && error.name === "AbortError") {
432
436
  throw new PokerSDKError("Request timeout", "TIMEOUT", void 0, {
433
437
  timeout: this.timeout
434
438
  });
435
439
  }
436
- if (attempt < this.retry.count) {
440
+ if (attempt < retryCount) {
437
441
  const delay = this.retry.delay * Math.pow(this.retry.backoff, attempt);
438
442
  if (this.debug) {
439
443
  console.log(`[PokerSDK] Retry ${attempt + 1}/${this.retry.count} in ${delay}ms`);
440
444
  }
441
445
  await this.sleep(delay);
442
446
  }
447
+ } finally {
448
+ clearTimeout(timeoutId);
443
449
  }
444
450
  }
445
451
  throw lastError ?? new PokerSDKError("Request failed", "REQUEST_FAILED");
@@ -969,11 +975,19 @@ function PokerProvider({ config, children, autoConnect = true }) {
969
975
  if (connectPromiseRef.current) return connectPromiseRef.current;
970
976
  const socket = ensureSocket();
971
977
  setConnectionState("connecting");
972
- connectPromiseRef.current = socket.connect().finally(() => {
973
- connectPromiseRef.current = null;
978
+ const pending = socket.connect().finally(() => {
979
+ if (connectPromiseRef.current === pending) connectPromiseRef.current = null;
974
980
  });
975
- await connectPromiseRef.current;
981
+ connectPromiseRef.current = pending;
982
+ await pending;
976
983
  }, [ensureSocket]);
984
+ useEffect(() => {
985
+ return () => {
986
+ socketRef.current?.disconnect();
987
+ socketRef.current = null;
988
+ connectPromiseRef.current = null;
989
+ };
990
+ }, [config.token]);
977
991
  useEffect(() => {
978
992
  if (config.token && autoConnect) {
979
993
  void connect().catch(console.error);
@@ -982,14 +996,6 @@ function PokerProvider({ config, children, autoConnect = true }) {
982
996
  socketRef.current = null;
983
997
  }
984
998
  }, [config.token, autoConnect, connect]);
985
- useEffect(() => {
986
- return () => {
987
- if (socketRef.current) {
988
- socketRef.current.disconnect();
989
- socketRef.current = null;
990
- }
991
- };
992
- }, []);
993
999
  const disconnect = useCallback(() => {
994
1000
  if (socketRef.current) {
995
1001
  socketRef.current.disconnect();
@@ -1087,7 +1093,10 @@ function useTable(tableId, options = {}) {
1087
1093
  }, [client, tableId, pollInterval]);
1088
1094
  const action = useCallback(
1089
1095
  async (type, amount) => {
1090
- const newState = await client.action(tableId, { type, amount });
1096
+ const newState = await client.action(tableId, {
1097
+ type,
1098
+ amount
1099
+ });
1091
1100
  setState(newState);
1092
1101
  versionRef.current = newState.version;
1093
1102
  },