@oobe-protocol-labs/synapse-client-sdk 1.0.0-beta
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.
- package/LICENSE +21 -0
- package/README.md +1393 -0
- package/dist/cjs/advanced/circuit-breaker.d.ts +111 -0
- package/dist/cjs/advanced/circuit-breaker.d.ts.map +1 -0
- package/dist/cjs/advanced/circuit-breaker.js +278 -0
- package/dist/cjs/advanced/circuit-breaker.js.map +1 -0
- package/dist/cjs/advanced/index.d.ts +8 -0
- package/dist/cjs/advanced/index.d.ts.map +1 -0
- package/dist/cjs/advanced/index.js +13 -0
- package/dist/cjs/advanced/index.js.map +1 -0
- package/dist/cjs/advanced/load-balancer.d.ts +114 -0
- package/dist/cjs/advanced/load-balancer.d.ts.map +1 -0
- package/dist/cjs/advanced/load-balancer.js +354 -0
- package/dist/cjs/advanced/load-balancer.js.map +1 -0
- package/dist/cjs/advanced/smart-caching.d.ts +113 -0
- package/dist/cjs/advanced/smart-caching.d.ts.map +1 -0
- package/dist/cjs/advanced/smart-caching.js +461 -0
- package/dist/cjs/advanced/smart-caching.js.map +1 -0
- package/dist/cjs/advanced/types.d.ts +228 -0
- package/dist/cjs/advanced/types.d.ts.map +1 -0
- package/dist/cjs/advanced/types.js +7 -0
- package/dist/cjs/advanced/types.js.map +1 -0
- package/dist/cjs/ai/index.d.ts +15 -0
- package/dist/cjs/ai/index.d.ts.map +1 -0
- package/dist/cjs/ai/index.js +20 -0
- package/dist/cjs/ai/index.js.map +1 -0
- package/dist/cjs/ai/merkle-operation.d.ts +245 -0
- package/dist/cjs/ai/merkle-operation.d.ts.map +1 -0
- package/dist/cjs/ai/merkle-operation.js +522 -0
- package/dist/cjs/ai/merkle-operation.js.map +1 -0
- package/dist/cjs/ai/pda-manager.d.ts +134 -0
- package/dist/cjs/ai/pda-manager.d.ts.map +1 -0
- package/dist/cjs/ai/pda-manager.js +250 -0
- package/dist/cjs/ai/pda-manager.js.map +1 -0
- package/dist/cjs/ai/types.ai.d.ts +172 -0
- package/dist/cjs/ai/types.ai.d.ts.map +1 -0
- package/dist/cjs/ai/types.ai.js +14 -0
- package/dist/cjs/ai/types.ai.js.map +1 -0
- package/dist/cjs/ai/zero-combine-fetcher.d.ts +171 -0
- package/dist/cjs/ai/zero-combine-fetcher.d.ts.map +1 -0
- package/dist/cjs/ai/zero-combine-fetcher.js +412 -0
- package/dist/cjs/ai/zero-combine-fetcher.js.map +1 -0
- package/dist/cjs/client.d.ts +83 -0
- package/dist/cjs/client.d.ts.map +1 -0
- package/dist/cjs/client.js +287 -0
- package/dist/cjs/client.js.map +1 -0
- package/dist/cjs/defi/advanced-features.d.ts +207 -0
- package/dist/cjs/defi/advanced-features.d.ts.map +1 -0
- package/dist/cjs/defi/advanced-features.js +382 -0
- package/dist/cjs/defi/advanced-features.js.map +1 -0
- package/dist/cjs/defi/index.d.ts +29 -0
- package/dist/cjs/defi/index.d.ts.map +1 -0
- package/dist/cjs/defi/index.js +50 -0
- package/dist/cjs/defi/index.js.map +1 -0
- package/dist/cjs/defi/jito.d.ts +118 -0
- package/dist/cjs/defi/jito.d.ts.map +1 -0
- package/dist/cjs/defi/jito.js +291 -0
- package/dist/cjs/defi/jito.js.map +1 -0
- package/dist/cjs/defi/jupiter.d.ts +143 -0
- package/dist/cjs/defi/jupiter.d.ts.map +1 -0
- package/dist/cjs/defi/jupiter.js +219 -0
- package/dist/cjs/defi/jupiter.js.map +1 -0
- package/dist/cjs/defi/price-feed.d.ts +63 -0
- package/dist/cjs/defi/price-feed.d.ts.map +1 -0
- package/dist/cjs/defi/price-feed.js +153 -0
- package/dist/cjs/defi/price-feed.js.map +1 -0
- package/dist/cjs/defi/token-data.d.ts +83 -0
- package/dist/cjs/defi/token-data.d.ts.map +1 -0
- package/dist/cjs/defi/token-data.js +205 -0
- package/dist/cjs/defi/token-data.js.map +1 -0
- package/dist/cjs/defi/unstable-features.d.ts +207 -0
- package/dist/cjs/defi/unstable-features.d.ts.map +1 -0
- package/dist/cjs/defi/unstable-features.js +382 -0
- package/dist/cjs/defi/unstable-features.js.map +1 -0
- package/dist/cjs/defi/utils.d.ts +265 -0
- package/dist/cjs/defi/utils.d.ts.map +1 -0
- package/dist/cjs/defi/utils.js +619 -0
- package/dist/cjs/defi/utils.js.map +1 -0
- package/dist/cjs/index.d.ts +31 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +71 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/methods/solana-rpc.d.ts +362 -0
- package/dist/cjs/methods/solana-rpc.d.ts.map +1 -0
- package/dist/cjs/methods/solana-rpc.js +584 -0
- package/dist/cjs/methods/solana-rpc.js.map +1 -0
- package/dist/cjs/nft/advanced-features.d.ts +205 -0
- package/dist/cjs/nft/advanced-features.d.ts.map +1 -0
- package/dist/cjs/nft/advanced-features.js +529 -0
- package/dist/cjs/nft/advanced-features.js.map +1 -0
- package/dist/cjs/nft/clients/index.d.ts +8 -0
- package/dist/cjs/nft/clients/index.d.ts.map +1 -0
- package/dist/cjs/nft/clients/index.js +14 -0
- package/dist/cjs/nft/clients/index.js.map +1 -0
- package/dist/cjs/nft/clients/magic-eden-client.d.ts +101 -0
- package/dist/cjs/nft/clients/magic-eden-client.d.ts.map +1 -0
- package/dist/cjs/nft/clients/magic-eden-client.js +263 -0
- package/dist/cjs/nft/clients/magic-eden-client.js.map +1 -0
- package/dist/cjs/nft/clients/metaplex-onchain-client.d.ts +154 -0
- package/dist/cjs/nft/clients/metaplex-onchain-client.d.ts.map +1 -0
- package/dist/cjs/nft/clients/metaplex-onchain-client.js +408 -0
- package/dist/cjs/nft/clients/metaplex-onchain-client.js.map +1 -0
- package/dist/cjs/nft/clients/tensor-client.d.ts +79 -0
- package/dist/cjs/nft/clients/tensor-client.d.ts.map +1 -0
- package/dist/cjs/nft/clients/tensor-client.js +222 -0
- package/dist/cjs/nft/clients/tensor-client.js.map +1 -0
- package/dist/cjs/nft/index.d.ts +13 -0
- package/dist/cjs/nft/index.d.ts.map +1 -0
- package/dist/cjs/nft/index.js +37 -0
- package/dist/cjs/nft/index.js.map +1 -0
- package/dist/cjs/nft/types.nft.d.ts +342 -0
- package/dist/cjs/nft/types.nft.d.ts.map +1 -0
- package/dist/cjs/nft/types.nft.js +3 -0
- package/dist/cjs/nft/types.nft.js.map +1 -0
- package/dist/cjs/nft/utils.d.ts +46 -0
- package/dist/cjs/nft/utils.d.ts.map +1 -0
- package/dist/cjs/nft/utils.js +281 -0
- package/dist/cjs/nft/utils.js.map +1 -0
- package/dist/cjs/types.d.ts +525 -0
- package/dist/cjs/types.d.ts.map +1 -0
- package/dist/cjs/types.js +192 -0
- package/dist/cjs/types.js.map +1 -0
- package/dist/cjs/utils/constant.d.ts +8 -0
- package/dist/cjs/utils/constant.d.ts.map +1 -0
- package/dist/cjs/utils/constant.js +12 -0
- package/dist/cjs/utils/constant.js.map +1 -0
- package/dist/cjs/utils/helpers.d.ts +92 -0
- package/dist/cjs/utils/helpers.d.ts.map +1 -0
- package/dist/cjs/utils/helpers.js +248 -0
- package/dist/cjs/utils/helpers.js.map +1 -0
- package/dist/cjs/websocket/client.d.ts +182 -0
- package/dist/cjs/websocket/client.d.ts.map +1 -0
- package/dist/cjs/websocket/client.js +465 -0
- package/dist/cjs/websocket/client.js.map +1 -0
- package/dist/cjs/websocket/index.d.ts +6 -0
- package/dist/cjs/websocket/index.d.ts.map +1 -0
- package/dist/cjs/websocket/index.js +9 -0
- package/dist/cjs/websocket/index.js.map +1 -0
- package/dist/docs/.nojekyll +1 -0
- package/dist/docs/assets/highlight.css +113 -0
- package/dist/docs/assets/icons.js +18 -0
- package/dist/docs/assets/icons.svg +1 -0
- package/dist/docs/assets/main.js +60 -0
- package/dist/docs/assets/navigation.js +1 -0
- package/dist/docs/assets/search.js +1 -0
- package/dist/docs/assets/style.css +1493 -0
- package/dist/docs/classes/AIError.html +40 -0
- package/dist/docs/classes/AIInvestmentAdvisor.html +26 -0
- package/dist/docs/classes/AIRarityCalculator.html +28 -0
- package/dist/docs/classes/ArbitrageDetector.html +30 -0
- package/dist/docs/classes/BatchingError.html +40 -0
- package/dist/docs/classes/CacheError.html +40 -0
- package/dist/docs/classes/CircuitBreaker.html +38 -0
- package/dist/docs/classes/CircuitBreakerError.html +40 -0
- package/dist/docs/classes/CollectionAnalytics.html +30 -0
- package/dist/docs/classes/DeFiError.html +40 -0
- package/dist/docs/classes/FlashLoanSimulator.html +26 -0
- package/dist/docs/classes/JitoIntegration.html +53 -0
- package/dist/docs/classes/JupiterIntegration.html +43 -0
- package/dist/docs/classes/Keypair.html +28 -0
- package/dist/docs/classes/LoadBalancer.html +34 -0
- package/dist/docs/classes/MEVProtection.html +28 -0
- package/dist/docs/classes/MarketplaceAggregator.html +28 -0
- package/dist/docs/classes/MerkleOperation.html +74 -0
- package/dist/docs/classes/NFTEngine.html +29 -0
- package/dist/docs/classes/NFTError.html +40 -0
- package/dist/docs/classes/NetworkError.html +40 -0
- package/dist/docs/classes/PDAManager.html +46 -0
- package/dist/docs/classes/PortfolioAnalytics.html +26 -0
- package/dist/docs/classes/PriceFeedIntegration.html +37 -0
- package/dist/docs/classes/PublicKey.html +46 -0
- package/dist/docs/classes/RateLimitError.html +39 -0
- package/dist/docs/classes/SmartCaching.html +42 -0
- package/dist/docs/classes/Synapse.html +6 -0
- package/dist/docs/classes/SynapseClient.html +55 -0
- package/dist/docs/classes/SynapseError.html +37 -0
- package/dist/docs/classes/SynapseSolanaEngine.html +49 -0
- package/dist/docs/classes/SynapseUtils.html +25 -0
- package/dist/docs/classes/TokenDataIntegration.html +41 -0
- package/dist/docs/classes/Transaction.html +87 -0
- package/dist/docs/classes/TransactionInstruction.html +10 -0
- package/dist/docs/classes/UpstreamError.html +39 -0
- package/dist/docs/classes/WebSocketClient.html +47 -0
- package/dist/docs/classes/WebSocketError.html +40 -0
- package/dist/docs/classes/YieldFarmingFinder.html +26 -0
- package/dist/docs/classes/ZeroCombineFetcher.html +25 -0
- package/dist/docs/functions/createSynapseClient.html +2 -0
- package/dist/docs/hierarchy.html +1 -0
- package/dist/docs/index.html +776 -0
- package/dist/docs/interfaces/AIAgentConfig.html +11 -0
- package/dist/docs/interfaces/AIAgentContext.html +7 -0
- package/dist/docs/interfaces/AIContext.html +6 -0
- package/dist/docs/interfaces/AIMethodResult.html +6 -0
- package/dist/docs/interfaces/AIRarityAnalysis.html +3 -0
- package/dist/docs/interfaces/AIResponse.html +5 -0
- package/dist/docs/interfaces/AccountInfo.html +8 -0
- package/dist/docs/interfaces/AdvancedClientConfig.html +7 -0
- package/dist/docs/interfaces/AdvancedEvents.html +9 -0
- package/dist/docs/interfaces/AdvancedMetricsData.html +5 -0
- package/dist/docs/interfaces/AdvancedPerformanceMetrics.html +6 -0
- package/dist/docs/interfaces/AgentAdapter.html +6 -0
- package/dist/docs/interfaces/AgentRiskReport.html +6 -0
- package/dist/docs/interfaces/AgentTradeSuggestion.html +10 -0
- package/dist/docs/interfaces/AggregatedCollectionStats.html +36 -0
- package/dist/docs/interfaces/ArbitrageOpportunity.html +8 -0
- package/dist/docs/interfaces/AutoTradingStrategy.html +13 -0
- package/dist/docs/interfaces/BatchResponse.html +4 -0
- package/dist/docs/interfaces/BatchResult.html +6 -0
- package/dist/docs/interfaces/BatcherConfig.html +5 -0
- package/dist/docs/interfaces/BirdeyeTokenPrice.html +4 -0
- package/dist/docs/interfaces/BlockhashInfo.html +5 -0
- package/dist/docs/interfaces/BuildSwapTxResult.html +7 -0
- package/dist/docs/interfaces/CacheStats.html +9 -0
- package/dist/docs/interfaces/ChunkInfo.html +10 -0
- package/dist/docs/interfaces/CircuitBreakerConfig.html +6 -0
- package/dist/docs/interfaces/ClientStats.html +14 -0
- package/dist/docs/interfaces/CollectionStats.html +17 -0
- package/dist/docs/interfaces/CollectionTrends.html +7 -0
- package/dist/docs/interfaces/CompressedNFTInfo.html +13 -0
- package/dist/docs/interfaces/ConfirmedTransaction.html +6 -0
- package/dist/docs/interfaces/ConnectionEvents.html +11 -0
- package/dist/docs/interfaces/DeFiConfig.html +16 -0
- package/dist/docs/interfaces/DiagnosticsResult.html +6 -0
- package/dist/docs/interfaces/EpochInfo.html +9 -0
- package/dist/docs/interfaces/ExecuteSwapParams.html +10 -0
- package/dist/docs/interfaces/FetchConfig.html +7 -0
- package/dist/docs/interfaces/FlashLoanAction.html +6 -0
- package/dist/docs/interfaces/FlashLoanSimulation.html +9 -0
- package/dist/docs/interfaces/GatewayStats.html +7 -0
- package/dist/docs/interfaces/InscriptionResult.html +18 -0
- package/dist/docs/interfaces/InvestmentRecommendation.html +10 -0
- package/dist/docs/interfaces/JitoBundleParams.html +4 -0
- package/dist/docs/interfaces/JitoBundleResult.html +6 -0
- package/dist/docs/interfaces/JitoBundleStatus.html +6 -0
- package/dist/docs/interfaces/JitoTipAccount.html +3 -0
- package/dist/docs/interfaces/JupiterQuoteParams.html +10 -0
- package/dist/docs/interfaces/JupiterQuoteRequest.html +17 -0
- package/dist/docs/interfaces/JupiterQuoteResponse.html +13 -0
- package/dist/docs/interfaces/JupiterSwapOptions.html +8 -0
- package/dist/docs/interfaces/JupiterSwapResponse.html +4 -0
- package/dist/docs/interfaces/JupiterTokenPrice.html +5 -0
- package/dist/docs/interfaces/LoadBalancerConfig.html +5 -0
- package/dist/docs/interfaces/MEVProtectionConfig.html +11 -0
- package/dist/docs/interfaces/MEVProtectionResult.html +6 -0
- package/dist/docs/interfaces/MagicEdenActivity.html +22 -0
- package/dist/docs/interfaces/MagicEdenCollection.html +22 -0
- package/dist/docs/interfaces/MagicEdenCollectionStats.html +17 -0
- package/dist/docs/interfaces/MagicEdenErrorResponse.html +4 -0
- package/dist/docs/interfaces/MagicEdenListing.html +24 -0
- package/dist/docs/interfaces/MarketplaceClientConfig.html +14 -0
- package/dist/docs/interfaces/MarketplaceFloorPrices.html +7 -0
- package/dist/docs/interfaces/MarketplaceListing.html +9 -0
- package/dist/docs/interfaces/MerkleLeaf.html +6 -0
- package/dist/docs/interfaces/MerkleProof.html +8 -0
- package/dist/docs/interfaces/MerkleValidationResult.html +10 -0
- package/dist/docs/interfaces/MultiChainSignal.html +8 -0
- package/dist/docs/interfaces/NFTAttribute.html +4 -0
- package/dist/docs/interfaces/NFTConfig.html +6 -0
- package/dist/docs/interfaces/NFTInfo.html +10 -0
- package/dist/docs/interfaces/NFTMetadata.html +9 -0
- package/dist/docs/interfaces/NormalizedMarketplaceListing.html +18 -0
- package/dist/docs/interfaces/OOBECompatibleAgent.html +8 -0
- package/dist/docs/interfaces/PDAConfig.html +10 -0
- package/dist/docs/interfaces/ParsedAccountInfo.html +8 -0
- package/dist/docs/interfaces/PerformanceMetrics.html +9 -0
- package/dist/docs/interfaces/PortfolioMetrics.html +10 -0
- package/dist/docs/interfaces/PriceData.html +8 -0
- package/dist/docs/interfaces/ProofRecord.html +12 -0
- package/dist/docs/interfaces/QuoteRequestCommon.html +11 -0
- package/dist/docs/interfaces/QuoteResponse.html +6 -0
- package/dist/docs/interfaces/RarityAlgorithmConfig.html +3 -0
- package/dist/docs/interfaces/RarityScore.html +8 -0
- package/dist/docs/interfaces/RaydiumBuildSwapParams.html +14 -0
- package/dist/docs/interfaces/RaydiumQuoteRequest.html +14 -0
- package/dist/docs/interfaces/RequestOptions.html +12 -0
- package/dist/docs/interfaces/RetryAttempt.html +5 -0
- package/dist/docs/interfaces/RpcError.html +5 -0
- package/dist/docs/interfaces/RpcRequest.html +6 -0
- package/dist/docs/interfaces/RpcResponse.html +6 -0
- package/dist/docs/interfaces/SecurityThreat.html +6 -0
- package/dist/docs/interfaces/SignatureInfo.html +8 -0
- package/dist/docs/interfaces/Signer.html +4 -0
- package/dist/docs/interfaces/SmartCacheConfig.html +7 -0
- package/dist/docs/interfaces/SmartQueryOptions.html +10 -0
- package/dist/docs/interfaces/StressTestOptions.html +8 -0
- package/dist/docs/interfaces/StressTestResult.html +9 -0
- package/dist/docs/interfaces/SubscriptionConfig.html +9 -0
- package/dist/docs/interfaces/SubscriptionOptions.html +7 -0
- package/dist/docs/interfaces/SubscriptionResult.html +7 -0
- package/dist/docs/interfaces/SynapseConfig.html +13 -0
- package/dist/docs/interfaces/SynapseLikeClient.html +4 -0
- package/dist/docs/interfaces/TensorCollectionStats.html +33 -0
- package/dist/docs/interfaces/TensorErrorResponse.html +5 -0
- package/dist/docs/interfaces/TensorListing.html +16 -0
- package/dist/docs/interfaces/TensorSale.html +16 -0
- package/dist/docs/interfaces/TokenAccount.html +7 -0
- package/dist/docs/interfaces/TokenAccountInfo.html +12 -0
- package/dist/docs/interfaces/TokenHolding.html +8 -0
- package/dist/docs/interfaces/TokenInfo.html +7 -0
- package/dist/docs/interfaces/TokenLargestAccount.html +5 -0
- package/dist/docs/interfaces/TokenSupply.html +5 -0
- package/dist/docs/interfaces/TradeExecution.html +14 -0
- package/dist/docs/interfaces/TransactionSignature.html +8 -0
- package/dist/docs/interfaces/UpstreamHealth.html +8 -0
- package/dist/docs/interfaces/UserPDAs.html +10 -0
- package/dist/docs/interfaces/WebSocketConfig.html +12 -0
- package/dist/docs/interfaces/WebSocketMessage.html +6 -0
- package/dist/docs/interfaces/YieldOpportunity.html +8 -0
- package/dist/docs/interfaces/ZeroChunk.html +8 -0
- package/dist/docs/interfaces/ZeroCombineResult.html +3 -0
- package/dist/docs/media/LICENSE +21 -0
- package/dist/docs/media/README-1.md +778 -0
- package/dist/docs/media/README-2.md +1050 -0
- package/dist/docs/media/README-3.md +1522 -0
- package/dist/docs/media/README-4.md +869 -0
- package/dist/docs/media/README-5.md +857 -0
- package/dist/docs/media/README-6.md +727 -0
- package/dist/docs/media/README.md +766 -0
- package/dist/docs/modules.html +168 -0
- package/dist/docs/types/BlockhashWithExpiryBlockHeight.html +1 -0
- package/dist/docs/types/Commitment.html +3 -0
- package/dist/docs/types/RiskTolerance.html +1 -0
- package/dist/docs/types/SimulatedTransactionResponse.html +1 -0
- package/dist/esm/advanced/circuit-breaker.d.ts +111 -0
- package/dist/esm/advanced/circuit-breaker.d.ts.map +1 -0
- package/dist/esm/advanced/circuit-breaker.js +274 -0
- package/dist/esm/advanced/circuit-breaker.js.map +1 -0
- package/dist/esm/advanced/index.d.ts +8 -0
- package/dist/esm/advanced/index.d.ts.map +1 -0
- package/dist/esm/advanced/index.js +7 -0
- package/dist/esm/advanced/index.js.map +1 -0
- package/dist/esm/advanced/load-balancer.d.ts +114 -0
- package/dist/esm/advanced/load-balancer.d.ts.map +1 -0
- package/dist/esm/advanced/load-balancer.js +350 -0
- package/dist/esm/advanced/load-balancer.js.map +1 -0
- package/dist/esm/advanced/smart-caching.d.ts +113 -0
- package/dist/esm/advanced/smart-caching.d.ts.map +1 -0
- package/dist/esm/advanced/smart-caching.js +457 -0
- package/dist/esm/advanced/smart-caching.js.map +1 -0
- package/dist/esm/advanced/types.d.ts +228 -0
- package/dist/esm/advanced/types.d.ts.map +1 -0
- package/dist/esm/advanced/types.js +6 -0
- package/dist/esm/advanced/types.js.map +1 -0
- package/dist/esm/ai/index.d.ts +15 -0
- package/dist/esm/ai/index.d.ts.map +1 -0
- package/dist/esm/ai/index.js +14 -0
- package/dist/esm/ai/index.js.map +1 -0
- package/dist/esm/ai/merkle-operation.d.ts +245 -0
- package/dist/esm/ai/merkle-operation.d.ts.map +1 -0
- package/dist/esm/ai/merkle-operation.js +485 -0
- package/dist/esm/ai/merkle-operation.js.map +1 -0
- package/dist/esm/ai/pda-manager.d.ts +134 -0
- package/dist/esm/ai/pda-manager.d.ts.map +1 -0
- package/dist/esm/ai/pda-manager.js +213 -0
- package/dist/esm/ai/pda-manager.js.map +1 -0
- package/dist/esm/ai/types.ai.d.ts +172 -0
- package/dist/esm/ai/types.ai.d.ts.map +1 -0
- package/dist/esm/ai/types.ai.js +13 -0
- package/dist/esm/ai/types.ai.js.map +1 -0
- package/dist/esm/ai/zero-combine-fetcher.d.ts +171 -0
- package/dist/esm/ai/zero-combine-fetcher.d.ts.map +1 -0
- package/dist/esm/ai/zero-combine-fetcher.js +408 -0
- package/dist/esm/ai/zero-combine-fetcher.js.map +1 -0
- package/dist/esm/client.d.ts +83 -0
- package/dist/esm/client.d.ts.map +1 -0
- package/dist/esm/client.js +283 -0
- package/dist/esm/client.js.map +1 -0
- package/dist/esm/defi/advanced-features.d.ts +207 -0
- package/dist/esm/defi/advanced-features.d.ts.map +1 -0
- package/dist/esm/defi/advanced-features.js +374 -0
- package/dist/esm/defi/advanced-features.js.map +1 -0
- package/dist/esm/defi/index.d.ts +29 -0
- package/dist/esm/defi/index.d.ts.map +1 -0
- package/dist/esm/defi/index.js +37 -0
- package/dist/esm/defi/index.js.map +1 -0
- package/dist/esm/defi/jito.d.ts +118 -0
- package/dist/esm/defi/jito.d.ts.map +1 -0
- package/dist/esm/defi/jito.js +287 -0
- package/dist/esm/defi/jito.js.map +1 -0
- package/dist/esm/defi/jupiter.d.ts +143 -0
- package/dist/esm/defi/jupiter.d.ts.map +1 -0
- package/dist/esm/defi/jupiter.js +215 -0
- package/dist/esm/defi/jupiter.js.map +1 -0
- package/dist/esm/defi/price-feed.d.ts +63 -0
- package/dist/esm/defi/price-feed.d.ts.map +1 -0
- package/dist/esm/defi/price-feed.js +149 -0
- package/dist/esm/defi/price-feed.js.map +1 -0
- package/dist/esm/defi/token-data.d.ts +83 -0
- package/dist/esm/defi/token-data.d.ts.map +1 -0
- package/dist/esm/defi/token-data.js +201 -0
- package/dist/esm/defi/token-data.js.map +1 -0
- package/dist/esm/defi/unstable-features.d.ts +207 -0
- package/dist/esm/defi/unstable-features.d.ts.map +1 -0
- package/dist/esm/defi/unstable-features.js +374 -0
- package/dist/esm/defi/unstable-features.js.map +1 -0
- package/dist/esm/defi/utils.d.ts +265 -0
- package/dist/esm/defi/utils.d.ts.map +1 -0
- package/dist/esm/defi/utils.js +582 -0
- package/dist/esm/defi/utils.js.map +1 -0
- package/dist/esm/index.d.ts +31 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +47 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/methods/solana-rpc.d.ts +362 -0
- package/dist/esm/methods/solana-rpc.d.ts.map +1 -0
- package/dist/esm/methods/solana-rpc.js +532 -0
- package/dist/esm/methods/solana-rpc.js.map +1 -0
- package/dist/esm/nft/advanced-features.d.ts +205 -0
- package/dist/esm/nft/advanced-features.d.ts.map +1 -0
- package/dist/esm/nft/advanced-features.js +489 -0
- package/dist/esm/nft/advanced-features.js.map +1 -0
- package/dist/esm/nft/clients/index.d.ts +8 -0
- package/dist/esm/nft/clients/index.d.ts.map +1 -0
- package/dist/esm/nft/clients/index.js +8 -0
- package/dist/esm/nft/clients/index.js.map +1 -0
- package/dist/esm/nft/clients/magic-eden-client.d.ts +101 -0
- package/dist/esm/nft/clients/magic-eden-client.d.ts.map +1 -0
- package/dist/esm/nft/clients/magic-eden-client.js +259 -0
- package/dist/esm/nft/clients/magic-eden-client.js.map +1 -0
- package/dist/esm/nft/clients/metaplex-onchain-client.d.ts +154 -0
- package/dist/esm/nft/clients/metaplex-onchain-client.d.ts.map +1 -0
- package/dist/esm/nft/clients/metaplex-onchain-client.js +404 -0
- package/dist/esm/nft/clients/metaplex-onchain-client.js.map +1 -0
- package/dist/esm/nft/clients/tensor-client.d.ts +79 -0
- package/dist/esm/nft/clients/tensor-client.d.ts.map +1 -0
- package/dist/esm/nft/clients/tensor-client.js +218 -0
- package/dist/esm/nft/clients/tensor-client.js.map +1 -0
- package/dist/esm/nft/index.d.ts +13 -0
- package/dist/esm/nft/index.d.ts.map +1 -0
- package/dist/esm/nft/index.js +15 -0
- package/dist/esm/nft/index.js.map +1 -0
- package/dist/esm/nft/types.nft.d.ts +342 -0
- package/dist/esm/nft/types.nft.d.ts.map +1 -0
- package/dist/esm/nft/types.nft.js +2 -0
- package/dist/esm/nft/types.nft.js.map +1 -0
- package/dist/esm/nft/utils.d.ts +46 -0
- package/dist/esm/nft/utils.d.ts.map +1 -0
- package/dist/esm/nft/utils.js +276 -0
- package/dist/esm/nft/utils.js.map +1 -0
- package/dist/esm/types.d.ts +525 -0
- package/dist/esm/types.d.ts.map +1 -0
- package/dist/esm/types.js +178 -0
- package/dist/esm/types.js.map +1 -0
- package/dist/esm/utils/constant.d.ts +8 -0
- package/dist/esm/utils/constant.d.ts.map +1 -0
- package/dist/esm/utils/constant.js +8 -0
- package/dist/esm/utils/constant.js.map +1 -0
- package/dist/esm/utils/helpers.d.ts +92 -0
- package/dist/esm/utils/helpers.d.ts.map +1 -0
- package/dist/esm/utils/helpers.js +243 -0
- package/dist/esm/utils/helpers.js.map +1 -0
- package/dist/esm/websocket/client.d.ts +182 -0
- package/dist/esm/websocket/client.d.ts.map +1 -0
- package/dist/esm/websocket/client.js +458 -0
- package/dist/esm/websocket/client.js.map +1 -0
- package/dist/esm/websocket/index.d.ts +6 -0
- package/dist/esm/websocket/index.d.ts.map +1 -0
- package/dist/esm/websocket/index.js +5 -0
- package/dist/esm/websocket/index.js.map +1 -0
- package/package.json +160 -0
|
@@ -0,0 +1,778 @@
|
|
|
1
|
+
# WebSocket Client Module
|
|
2
|
+
|
|
3
|
+
Real-time Solana blockchain data streaming with intelligent reconnection, subscription management, and enterprise-grade reliability.
|
|
4
|
+
|
|
5
|
+
## Architecture
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
┌──────────────────────────────────────────────────────┐
|
|
9
|
+
│ WebSocket Client Architecture │
|
|
10
|
+
├──────────────────────────────────────────────────────┤
|
|
11
|
+
│ │
|
|
12
|
+
│ Application Layer │
|
|
13
|
+
│ ├─ Account Subscriptions │
|
|
14
|
+
│ ├─ Slot Subscriptions │
|
|
15
|
+
│ ├─ Program Subscriptions │
|
|
16
|
+
│ └─ Transaction Subscriptions │
|
|
17
|
+
│ │ │
|
|
18
|
+
│ ▼ │
|
|
19
|
+
│ Subscription Manager │
|
|
20
|
+
│ ├─ ID Mapping │
|
|
21
|
+
│ ├─ Callback Registry │
|
|
22
|
+
│ ├─ Filter Management │
|
|
23
|
+
│ └─ Priority Queue │
|
|
24
|
+
│ │ │
|
|
25
|
+
│ ▼ │
|
|
26
|
+
│ Connection Manager │
|
|
27
|
+
│ ├─ Auto-reconnect (exponential backoff) │
|
|
28
|
+
│ ├─ Heartbeat monitoring │
|
|
29
|
+
│ ├─ Message buffering │
|
|
30
|
+
│ └─ State tracking │
|
|
31
|
+
│ │ │
|
|
32
|
+
│ ▼ │
|
|
33
|
+
│ WebSocket Layer (ws) │
|
|
34
|
+
│ └─ Binary protocol with compression │
|
|
35
|
+
│ │
|
|
36
|
+
├──────────────────────────────────────────────────────┤
|
|
37
|
+
│ Solana RPC Gateway (WSS) │
|
|
38
|
+
└──────────────────────────────────────────────────────┘
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## Features
|
|
42
|
+
|
|
43
|
+
| Feature | Description | Status |
|
|
44
|
+
|---------|-------------|--------|
|
|
45
|
+
| **Auto-reconnect** | Exponential backoff with configurable max attempts | Production |
|
|
46
|
+
| **Subscription Management** | Track and restore subscriptions on reconnect | Production |
|
|
47
|
+
| **Message Buffering** | Queue messages during disconnection | Production |
|
|
48
|
+
| **Smart Filtering** | Client-side filtering with custom predicates | Production |
|
|
49
|
+
| **Circuit Breaker** | Automatic failure protection | Production |
|
|
50
|
+
| **Smart Caching** | Cache subscription data | Production |
|
|
51
|
+
| **Compression** | WebSocket compression support | Production |
|
|
52
|
+
| **Heartbeat** | Connection health monitoring | Production |
|
|
53
|
+
|
|
54
|
+
## Installation
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
npm install @synapse/client-sdk
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
## Quick Start
|
|
61
|
+
|
|
62
|
+
```typescript
|
|
63
|
+
import { WebSocketClient } from '@synapse/client-sdk/websocket';
|
|
64
|
+
|
|
65
|
+
const wsClient = new WebSocketClient({
|
|
66
|
+
endpoint: 'wss://your-synapse-gateway.com',
|
|
67
|
+
apiKey: process.env.SYNAPSE_API_KEY,
|
|
68
|
+
autoReconnect: true,
|
|
69
|
+
maxReconnectAttempts: 10,
|
|
70
|
+
reconnectDelay: 5000,
|
|
71
|
+
enableSmartCaching: true,
|
|
72
|
+
enableCircuitBreaker: true,
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
// Connect
|
|
76
|
+
await wsClient.connect();
|
|
77
|
+
|
|
78
|
+
// Subscribe to account changes
|
|
79
|
+
const subId = await wsClient.accountSubscribe(
|
|
80
|
+
'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v', // USDC mint
|
|
81
|
+
(accountInfo) => {
|
|
82
|
+
console.log('Account updated:', accountInfo);
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
commitment: 'confirmed',
|
|
86
|
+
encoding: 'jsonParsed',
|
|
87
|
+
}
|
|
88
|
+
);
|
|
89
|
+
|
|
90
|
+
// Unsubscribe
|
|
91
|
+
await wsClient.accountUnsubscribe(subId);
|
|
92
|
+
|
|
93
|
+
// Cleanup
|
|
94
|
+
await wsClient.disconnect();
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
## Configuration
|
|
98
|
+
|
|
99
|
+
```typescript
|
|
100
|
+
interface WebSocketConfig {
|
|
101
|
+
endpoint: string; // WSS endpoint URL
|
|
102
|
+
apiKey?: string; // Optional API key
|
|
103
|
+
autoReconnect?: boolean; // Enable auto-reconnect (default: true)
|
|
104
|
+
maxReconnectAttempts?: number; // Max reconnection attempts (default: 10)
|
|
105
|
+
reconnectDelay?: number; // Initial reconnect delay ms (default: 5000)
|
|
106
|
+
heartbeatInterval?: number; // Heartbeat interval ms (default: 30000)
|
|
107
|
+
enableCompression?: boolean; // Enable compression (default: true)
|
|
108
|
+
enableSmartCaching?: boolean; // Enable caching (default: true)
|
|
109
|
+
enableCircuitBreaker?: boolean; // Enable circuit breaker (default: true)
|
|
110
|
+
maxSubscriptions?: number; // Max concurrent subscriptions (default: 1000)
|
|
111
|
+
bufferSize?: number; // Message buffer size bytes (default: 16MB)
|
|
112
|
+
}
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
## Subscription Methods
|
|
116
|
+
|
|
117
|
+
### Account Subscribe
|
|
118
|
+
|
|
119
|
+
Monitor account changes in real-time.
|
|
120
|
+
|
|
121
|
+
```typescript
|
|
122
|
+
const subId = await wsClient.accountSubscribe(
|
|
123
|
+
accountAddress,
|
|
124
|
+
(accountInfo) => {
|
|
125
|
+
console.log('Account data:', accountInfo.data);
|
|
126
|
+
console.log('Lamports:', accountInfo.lamports);
|
|
127
|
+
console.log('Owner:', accountInfo.owner);
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
commitment: 'confirmed',
|
|
131
|
+
encoding: 'jsonParsed',
|
|
132
|
+
enableCache: true,
|
|
133
|
+
enableFiltering: false,
|
|
134
|
+
}
|
|
135
|
+
);
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
#### Options
|
|
139
|
+
|
|
140
|
+
```typescript
|
|
141
|
+
interface SubscriptionOptions {
|
|
142
|
+
commitment?: 'processed' | 'confirmed' | 'finalized';
|
|
143
|
+
encoding?: 'base58' | 'base64' | 'jsonParsed';
|
|
144
|
+
enableCache?: boolean; // Cache subscription data
|
|
145
|
+
enableFiltering?: boolean; // Apply custom filters
|
|
146
|
+
customFilters?: Record<string, any>;
|
|
147
|
+
priority?: 'low' | 'medium' | 'high';
|
|
148
|
+
resilient?: boolean; // Auto-restore on reconnect
|
|
149
|
+
}
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
### Program Subscribe
|
|
153
|
+
|
|
154
|
+
Subscribe to all accounts owned by a program.
|
|
155
|
+
|
|
156
|
+
```typescript
|
|
157
|
+
const subId = await wsClient.programSubscribe(
|
|
158
|
+
'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA', // SPL Token program
|
|
159
|
+
(accountInfo) => {
|
|
160
|
+
console.log('Token account updated:', accountInfo);
|
|
161
|
+
},
|
|
162
|
+
{
|
|
163
|
+
commitment: 'confirmed',
|
|
164
|
+
encoding: 'jsonParsed',
|
|
165
|
+
filters: [
|
|
166
|
+
{
|
|
167
|
+
memcmp: {
|
|
168
|
+
offset: 0,
|
|
169
|
+
bytes: 'mint_address_here',
|
|
170
|
+
},
|
|
171
|
+
},
|
|
172
|
+
],
|
|
173
|
+
}
|
|
174
|
+
);
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
### Slot Subscribe
|
|
178
|
+
|
|
179
|
+
Monitor slot changes for block production tracking.
|
|
180
|
+
|
|
181
|
+
```typescript
|
|
182
|
+
const subId = await wsClient.slotSubscribe((slotInfo) => {
|
|
183
|
+
console.log('Slot:', slotInfo.slot);
|
|
184
|
+
console.log('Parent:', slotInfo.parent);
|
|
185
|
+
console.log('Root:', slotInfo.root);
|
|
186
|
+
});
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
### Signature Subscribe
|
|
190
|
+
|
|
191
|
+
Track transaction confirmation status.
|
|
192
|
+
|
|
193
|
+
```typescript
|
|
194
|
+
const subId = await wsClient.signatureSubscribe(
|
|
195
|
+
transactionSignature,
|
|
196
|
+
(result) => {
|
|
197
|
+
if (result.err) {
|
|
198
|
+
console.error('Transaction failed:', result.err);
|
|
199
|
+
} else {
|
|
200
|
+
console.log('Transaction confirmed!');
|
|
201
|
+
}
|
|
202
|
+
},
|
|
203
|
+
{
|
|
204
|
+
commitment: 'confirmed',
|
|
205
|
+
}
|
|
206
|
+
);
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
### Logs Subscribe
|
|
210
|
+
|
|
211
|
+
Subscribe to transaction logs for specific accounts.
|
|
212
|
+
|
|
213
|
+
```typescript
|
|
214
|
+
const subId = await wsClient.logsSubscribe(
|
|
215
|
+
{
|
|
216
|
+
mentions: [accountAddress], // Filter by account
|
|
217
|
+
},
|
|
218
|
+
(logs) => {
|
|
219
|
+
console.log('Logs:', logs.logs);
|
|
220
|
+
console.log('Signature:', logs.signature);
|
|
221
|
+
},
|
|
222
|
+
{
|
|
223
|
+
commitment: 'confirmed',
|
|
224
|
+
}
|
|
225
|
+
);
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
## Advanced Features
|
|
229
|
+
|
|
230
|
+
### Smart Filtering
|
|
231
|
+
|
|
232
|
+
Apply custom filters on the client side to reduce callback overhead.
|
|
233
|
+
|
|
234
|
+
```typescript
|
|
235
|
+
const subId = await wsClient.accountSubscribe(
|
|
236
|
+
tokenMintAddress,
|
|
237
|
+
(accountInfo) => {
|
|
238
|
+
console.log('High-value account:', accountInfo);
|
|
239
|
+
},
|
|
240
|
+
{
|
|
241
|
+
commitment: 'confirmed',
|
|
242
|
+
enableFiltering: true,
|
|
243
|
+
customFilters: {
|
|
244
|
+
// Only trigger callback if lamports > 1 SOL
|
|
245
|
+
'account.lamports': { min: 1_000_000_000 },
|
|
246
|
+
// Only trigger if owner matches
|
|
247
|
+
'account.owner': { equals: 'specific_program_id' },
|
|
248
|
+
},
|
|
249
|
+
}
|
|
250
|
+
);
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
### Priority Subscriptions
|
|
254
|
+
|
|
255
|
+
Prioritize critical subscriptions for faster delivery.
|
|
256
|
+
|
|
257
|
+
```typescript
|
|
258
|
+
// High-priority subscription (processed first)
|
|
259
|
+
const criticalSub = await wsClient.accountSubscribe(
|
|
260
|
+
criticalAccountAddress,
|
|
261
|
+
handleCriticalUpdate,
|
|
262
|
+
{
|
|
263
|
+
priority: 'high',
|
|
264
|
+
resilient: true,
|
|
265
|
+
}
|
|
266
|
+
);
|
|
267
|
+
|
|
268
|
+
// Low-priority subscription
|
|
269
|
+
const monitorSub = await wsClient.accountSubscribe(
|
|
270
|
+
monitorAccountAddress,
|
|
271
|
+
handleMonitorUpdate,
|
|
272
|
+
{
|
|
273
|
+
priority: 'low',
|
|
274
|
+
}
|
|
275
|
+
);
|
|
276
|
+
```
|
|
277
|
+
|
|
278
|
+
### Resilient Subscriptions
|
|
279
|
+
|
|
280
|
+
Automatically restore subscriptions after reconnection.
|
|
281
|
+
|
|
282
|
+
```typescript
|
|
283
|
+
const subId = await wsClient.accountSubscribe(
|
|
284
|
+
accountAddress,
|
|
285
|
+
callback,
|
|
286
|
+
{
|
|
287
|
+
resilient: true, // Automatically resubscribe on reconnect
|
|
288
|
+
}
|
|
289
|
+
);
|
|
290
|
+
|
|
291
|
+
// On reconnection, subscription is automatically restored
|
|
292
|
+
wsClient.on('reconnected', () => {
|
|
293
|
+
console.log('All resilient subscriptions restored');
|
|
294
|
+
});
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
## Event System
|
|
298
|
+
|
|
299
|
+
```typescript
|
|
300
|
+
// Connection events
|
|
301
|
+
wsClient.on('connected', () => {
|
|
302
|
+
console.log('WebSocket connected');
|
|
303
|
+
});
|
|
304
|
+
|
|
305
|
+
wsClient.on('disconnected', ({ code, reason }) => {
|
|
306
|
+
console.log('WebSocket disconnected:', code, reason);
|
|
307
|
+
});
|
|
308
|
+
|
|
309
|
+
wsClient.on('reconnecting', ({ attempt, maxAttempts }) => {
|
|
310
|
+
console.log(`Reconnecting: ${attempt}/${maxAttempts}`);
|
|
311
|
+
});
|
|
312
|
+
|
|
313
|
+
wsClient.on('reconnected', () => {
|
|
314
|
+
console.log('WebSocket reconnected successfully');
|
|
315
|
+
});
|
|
316
|
+
|
|
317
|
+
wsClient.on('reconnect-failed', () => {
|
|
318
|
+
console.error('Reconnection failed after max attempts');
|
|
319
|
+
});
|
|
320
|
+
|
|
321
|
+
// Subscription events
|
|
322
|
+
wsClient.on('subscription-added', ({ id, method }) => {
|
|
323
|
+
console.log(`Subscription added: ${method} (${id})`);
|
|
324
|
+
});
|
|
325
|
+
|
|
326
|
+
wsClient.on('subscription-removed', ({ id }) => {
|
|
327
|
+
console.log(`Subscription removed: ${id}`);
|
|
328
|
+
});
|
|
329
|
+
|
|
330
|
+
wsClient.on('subscription-error', ({ id, error }) => {
|
|
331
|
+
console.error(`Subscription error: ${id}`, error);
|
|
332
|
+
});
|
|
333
|
+
|
|
334
|
+
// Error events
|
|
335
|
+
wsClient.on('error', (error) => {
|
|
336
|
+
console.error('WebSocket error:', error);
|
|
337
|
+
});
|
|
338
|
+
|
|
339
|
+
wsClient.on('message-error', ({ message, error }) => {
|
|
340
|
+
console.error('Message parsing error:', error);
|
|
341
|
+
});
|
|
342
|
+
|
|
343
|
+
// Metrics events
|
|
344
|
+
wsClient.on('metrics-update', (metrics) => {
|
|
345
|
+
console.log('WebSocket metrics:', metrics);
|
|
346
|
+
});
|
|
347
|
+
```
|
|
348
|
+
|
|
349
|
+
## Metrics
|
|
350
|
+
|
|
351
|
+
```typescript
|
|
352
|
+
const metrics = wsClient.getMetrics();
|
|
353
|
+
|
|
354
|
+
console.log('WebSocket Metrics:', {
|
|
355
|
+
messagesReceived: metrics.messagesReceived,
|
|
356
|
+
messagesSent: metrics.messagesSent,
|
|
357
|
+
subscriptionsActive: metrics.subscriptionsActive,
|
|
358
|
+
reconnectCount: metrics.reconnectCount,
|
|
359
|
+
lastLatency: metrics.lastLatency,
|
|
360
|
+
averageLatency: metrics.averageLatency,
|
|
361
|
+
});
|
|
362
|
+
```
|
|
363
|
+
|
|
364
|
+
## Best Practices
|
|
365
|
+
|
|
366
|
+
### 1. Connection Management
|
|
367
|
+
|
|
368
|
+
```typescript
|
|
369
|
+
// ✅ Good: Singleton pattern
|
|
370
|
+
class WebSocketService {
|
|
371
|
+
private static instance: WebSocketClient;
|
|
372
|
+
|
|
373
|
+
static getInstance(): WebSocketClient {
|
|
374
|
+
if (!this.instance) {
|
|
375
|
+
this.instance = new WebSocketClient({
|
|
376
|
+
endpoint: process.env.WS_ENDPOINT!,
|
|
377
|
+
apiKey: process.env.SYNAPSE_API_KEY,
|
|
378
|
+
autoReconnect: true,
|
|
379
|
+
});
|
|
380
|
+
}
|
|
381
|
+
return this.instance;
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
// ❌ Bad: Multiple connections
|
|
386
|
+
function subscribeToAccount(address: string) {
|
|
387
|
+
const ws = new WebSocketClient({ endpoint: '...' }); // Don't do this
|
|
388
|
+
ws.accountSubscribe(address, callback);
|
|
389
|
+
}
|
|
390
|
+
```
|
|
391
|
+
|
|
392
|
+
### 2. Subscription Cleanup
|
|
393
|
+
|
|
394
|
+
```typescript
|
|
395
|
+
// ✅ Good: Always unsubscribe
|
|
396
|
+
const subId = await wsClient.accountSubscribe(address, callback);
|
|
397
|
+
|
|
398
|
+
// When done
|
|
399
|
+
await wsClient.accountUnsubscribe(subId);
|
|
400
|
+
|
|
401
|
+
// Or unsubscribe all
|
|
402
|
+
await wsClient.unsubscribeAll();
|
|
403
|
+
|
|
404
|
+
// ❌ Bad: Leaving subscriptions open
|
|
405
|
+
wsClient.accountSubscribe(address, callback); // Memory leak
|
|
406
|
+
```
|
|
407
|
+
|
|
408
|
+
### 3. Error Handling
|
|
409
|
+
|
|
410
|
+
```typescript
|
|
411
|
+
// ✅ Good: Handle errors gracefully
|
|
412
|
+
wsClient.on('error', async (error) => {
|
|
413
|
+
console.error('WebSocket error:', error);
|
|
414
|
+
|
|
415
|
+
// Implement fallback
|
|
416
|
+
if (error.code === 'CONNECTION_FAILED') {
|
|
417
|
+
await useHttpFallback();
|
|
418
|
+
}
|
|
419
|
+
});
|
|
420
|
+
|
|
421
|
+
wsClient.on('subscription-error', async ({ id, error }) => {
|
|
422
|
+
console.error(`Subscription ${id} failed:`, error);
|
|
423
|
+
|
|
424
|
+
// Retry or cleanup
|
|
425
|
+
await wsClient.accountUnsubscribe(id);
|
|
426
|
+
});
|
|
427
|
+
```
|
|
428
|
+
|
|
429
|
+
### 4. Reconnection Strategy
|
|
430
|
+
|
|
431
|
+
```typescript
|
|
432
|
+
// ✅ Good: Exponential backoff with max attempts
|
|
433
|
+
const wsClient = new WebSocketClient({
|
|
434
|
+
endpoint: process.env.WS_ENDPOINT!,
|
|
435
|
+
autoReconnect: true,
|
|
436
|
+
maxReconnectAttempts: 10, // Limit attempts
|
|
437
|
+
reconnectDelay: 5000, // Start with 5s
|
|
438
|
+
});
|
|
439
|
+
|
|
440
|
+
// Monitor reconnection
|
|
441
|
+
wsClient.on('reconnecting', ({ attempt, maxAttempts }) => {
|
|
442
|
+
if (attempt > 5) {
|
|
443
|
+
console.warn('Multiple reconnection attempts');
|
|
444
|
+
// Alert monitoring system
|
|
445
|
+
}
|
|
446
|
+
});
|
|
447
|
+
|
|
448
|
+
wsClient.on('reconnect-failed', async () => {
|
|
449
|
+
console.error('Reconnection failed');
|
|
450
|
+
// Switch to HTTP fallback
|
|
451
|
+
await switchToHttpMode();
|
|
452
|
+
});
|
|
453
|
+
```
|
|
454
|
+
|
|
455
|
+
### 5. Subscription Limits
|
|
456
|
+
|
|
457
|
+
```typescript
|
|
458
|
+
// ✅ Good: Respect limits
|
|
459
|
+
const wsClient = new WebSocketClient({
|
|
460
|
+
endpoint: process.env.WS_ENDPOINT!,
|
|
461
|
+
maxSubscriptions: 1000,
|
|
462
|
+
});
|
|
463
|
+
|
|
464
|
+
// Track active subscriptions
|
|
465
|
+
const activeSubscriptions = new Set<number>();
|
|
466
|
+
|
|
467
|
+
async function subscribe(address: string) {
|
|
468
|
+
if (activeSubscriptions.size >= 1000) {
|
|
469
|
+
console.warn('Subscription limit reached');
|
|
470
|
+
// Unsubscribe oldest or least important
|
|
471
|
+
const oldestSub = activeSubscriptions.values().next().value;
|
|
472
|
+
await wsClient.accountUnsubscribe(oldestSub);
|
|
473
|
+
activeSubscriptions.delete(oldestSub);
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
const subId = await wsClient.accountSubscribe(address, callback);
|
|
477
|
+
activeSubscriptions.add(subId);
|
|
478
|
+
}
|
|
479
|
+
```
|
|
480
|
+
|
|
481
|
+
## Performance Optimization
|
|
482
|
+
|
|
483
|
+
### Batching Subscriptions
|
|
484
|
+
|
|
485
|
+
```typescript
|
|
486
|
+
// ✅ Efficient: Batch related subscriptions
|
|
487
|
+
const subscriptions = await Promise.all([
|
|
488
|
+
wsClient.accountSubscribe(addr1, callback1),
|
|
489
|
+
wsClient.accountSubscribe(addr2, callback2),
|
|
490
|
+
wsClient.accountSubscribe(addr3, callback3),
|
|
491
|
+
]);
|
|
492
|
+
|
|
493
|
+
// ❌ Inefficient: Sequential subscriptions
|
|
494
|
+
const sub1 = await wsClient.accountSubscribe(addr1, callback1);
|
|
495
|
+
const sub2 = await wsClient.accountSubscribe(addr2, callback2);
|
|
496
|
+
const sub3 = await wsClient.accountSubscribe(addr3, callback3);
|
|
497
|
+
```
|
|
498
|
+
|
|
499
|
+
### Enable Caching
|
|
500
|
+
|
|
501
|
+
```typescript
|
|
502
|
+
const wsClient = new WebSocketClient({
|
|
503
|
+
endpoint: process.env.WS_ENDPOINT!,
|
|
504
|
+
enableSmartCaching: true, // Cache subscription data
|
|
505
|
+
});
|
|
506
|
+
|
|
507
|
+
// Cached subscriptions reduce redundant updates
|
|
508
|
+
const subId = await wsClient.accountSubscribe(
|
|
509
|
+
address,
|
|
510
|
+
callback,
|
|
511
|
+
{
|
|
512
|
+
enableCache: true,
|
|
513
|
+
cacheTTL: 30000, // 30-second cache
|
|
514
|
+
}
|
|
515
|
+
);
|
|
516
|
+
```
|
|
517
|
+
|
|
518
|
+
### Use Filters Wisely
|
|
519
|
+
|
|
520
|
+
```typescript
|
|
521
|
+
// ✅ Efficient: Filter on server side (Solana RPC)
|
|
522
|
+
const subId = await wsClient.programSubscribe(
|
|
523
|
+
programId,
|
|
524
|
+
callback,
|
|
525
|
+
{
|
|
526
|
+
filters: [
|
|
527
|
+
{ dataSize: 165 }, // Only token accounts
|
|
528
|
+
{ memcmp: { offset: 0, bytes: mint } }, // Specific mint
|
|
529
|
+
],
|
|
530
|
+
}
|
|
531
|
+
);
|
|
532
|
+
|
|
533
|
+
// ❌ Inefficient: Filter on client side
|
|
534
|
+
const subId = await wsClient.programSubscribe(
|
|
535
|
+
programId,
|
|
536
|
+
(account) => {
|
|
537
|
+
if (account.data.length === 165 && account.mint === mint) {
|
|
538
|
+
callback(account);
|
|
539
|
+
}
|
|
540
|
+
}
|
|
541
|
+
);
|
|
542
|
+
```
|
|
543
|
+
|
|
544
|
+
## Troubleshooting
|
|
545
|
+
|
|
546
|
+
### Connection Timeout
|
|
547
|
+
|
|
548
|
+
**Problem:** WebSocket fails to connect
|
|
549
|
+
|
|
550
|
+
**Solution:**
|
|
551
|
+
```typescript
|
|
552
|
+
// Increase timeout
|
|
553
|
+
const wsClient = new WebSocketClient({
|
|
554
|
+
endpoint: process.env.WS_ENDPOINT!,
|
|
555
|
+
timeout: 30000, // 30 seconds
|
|
556
|
+
});
|
|
557
|
+
|
|
558
|
+
// Check endpoint
|
|
559
|
+
console.log('Connecting to:', wsClient.endpoint);
|
|
560
|
+
|
|
561
|
+
// Enable debug logging
|
|
562
|
+
wsClient.on('connecting', () => {
|
|
563
|
+
console.log('Connection attempt...');
|
|
564
|
+
});
|
|
565
|
+
```
|
|
566
|
+
|
|
567
|
+
### Frequent Disconnections
|
|
568
|
+
|
|
569
|
+
**Problem:** WebSocket disconnects frequently
|
|
570
|
+
|
|
571
|
+
**Solution:**
|
|
572
|
+
```typescript
|
|
573
|
+
// Reduce heartbeat interval
|
|
574
|
+
const wsClient = new WebSocketClient({
|
|
575
|
+
endpoint: process.env.WS_ENDPOINT!,
|
|
576
|
+
heartbeatInterval: 15000, // 15 seconds instead of 30
|
|
577
|
+
});
|
|
578
|
+
|
|
579
|
+
// Monitor connection state
|
|
580
|
+
wsClient.on('disconnected', ({ code, reason }) => {
|
|
581
|
+
console.log('Disconnect reason:', code, reason);
|
|
582
|
+
});
|
|
583
|
+
|
|
584
|
+
// Check network stability
|
|
585
|
+
setInterval(() => {
|
|
586
|
+
const metrics = wsClient.getMetrics();
|
|
587
|
+
if (metrics.reconnectCount > 5) {
|
|
588
|
+
console.warn('Unstable connection detected');
|
|
589
|
+
}
|
|
590
|
+
}, 60000);
|
|
591
|
+
```
|
|
592
|
+
|
|
593
|
+
### High Memory Usage
|
|
594
|
+
|
|
595
|
+
**Problem:** Memory consumption grows over time
|
|
596
|
+
|
|
597
|
+
**Solution:**
|
|
598
|
+
```typescript
|
|
599
|
+
// Limit subscriptions
|
|
600
|
+
const wsClient = new WebSocketClient({
|
|
601
|
+
endpoint: process.env.WS_ENDPOINT!,
|
|
602
|
+
maxSubscriptions: 500, // Reduce from default 1000
|
|
603
|
+
});
|
|
604
|
+
|
|
605
|
+
// Unsubscribe unused subscriptions
|
|
606
|
+
await wsClient.unsubscribeAll();
|
|
607
|
+
|
|
608
|
+
// Monitor memory
|
|
609
|
+
setInterval(() => {
|
|
610
|
+
const used = process.memoryUsage().heapUsed / 1024 / 1024;
|
|
611
|
+
console.log(`Memory usage: ${Math.round(used)} MB`);
|
|
612
|
+
}, 60000);
|
|
613
|
+
```
|
|
614
|
+
|
|
615
|
+
### Subscription Not Receiving Updates
|
|
616
|
+
|
|
617
|
+
**Problem:** Callback not triggered despite account changes
|
|
618
|
+
|
|
619
|
+
**Solution:**
|
|
620
|
+
```typescript
|
|
621
|
+
// Check subscription ID
|
|
622
|
+
const subId = await wsClient.accountSubscribe(address, callback);
|
|
623
|
+
console.log('Subscription ID:', subId);
|
|
624
|
+
|
|
625
|
+
// Verify subscription is active
|
|
626
|
+
wsClient.on('subscription-added', ({ id, method }) => {
|
|
627
|
+
console.log(`Active: ${method} (${id})`);
|
|
628
|
+
});
|
|
629
|
+
|
|
630
|
+
// Check filters
|
|
631
|
+
const subId = await wsClient.accountSubscribe(
|
|
632
|
+
address,
|
|
633
|
+
callback,
|
|
634
|
+
{
|
|
635
|
+
commitment: 'confirmed', // Try 'processed' for faster updates
|
|
636
|
+
enableFiltering: false, // Disable custom filters temporarily
|
|
637
|
+
}
|
|
638
|
+
);
|
|
639
|
+
|
|
640
|
+
// Monitor for errors
|
|
641
|
+
wsClient.on('subscription-error', ({ id, error }) => {
|
|
642
|
+
if (id === subId) {
|
|
643
|
+
console.error('Subscription error:', error);
|
|
644
|
+
}
|
|
645
|
+
});
|
|
646
|
+
```
|
|
647
|
+
|
|
648
|
+
## Integration Examples
|
|
649
|
+
|
|
650
|
+
### Track Token Transfers
|
|
651
|
+
|
|
652
|
+
```typescript
|
|
653
|
+
const wsClient = new WebSocketClient({
|
|
654
|
+
endpoint: process.env.WS_ENDPOINT!,
|
|
655
|
+
apiKey: process.env.SYNAPSE_API_KEY,
|
|
656
|
+
});
|
|
657
|
+
|
|
658
|
+
await wsClient.connect();
|
|
659
|
+
|
|
660
|
+
// Subscribe to token account
|
|
661
|
+
const subId = await wsClient.accountSubscribe(
|
|
662
|
+
tokenAccountAddress,
|
|
663
|
+
(accountInfo) => {
|
|
664
|
+
const tokenAmount = accountInfo.data.parsed.info.tokenAmount.uiAmount;
|
|
665
|
+
console.log('Token balance:', tokenAmount);
|
|
666
|
+
|
|
667
|
+
// Trigger notifications
|
|
668
|
+
if (tokenAmount < lowBalanceThreshold) {
|
|
669
|
+
sendLowBalanceAlert(tokenAmount);
|
|
670
|
+
}
|
|
671
|
+
},
|
|
672
|
+
{
|
|
673
|
+
commitment: 'confirmed',
|
|
674
|
+
encoding: 'jsonParsed',
|
|
675
|
+
}
|
|
676
|
+
);
|
|
677
|
+
```
|
|
678
|
+
|
|
679
|
+
### Monitor NFT Sales
|
|
680
|
+
|
|
681
|
+
```typescript
|
|
682
|
+
// Subscribe to marketplace program
|
|
683
|
+
const subId = await wsClient.programSubscribe(
|
|
684
|
+
magicEdenProgramId,
|
|
685
|
+
(accountInfo) => {
|
|
686
|
+
const listingData = parseListingData(accountInfo.data);
|
|
687
|
+
|
|
688
|
+
if (listingData.type === 'sale') {
|
|
689
|
+
console.log('NFT Sold:', {
|
|
690
|
+
mint: listingData.mint,
|
|
691
|
+
price: listingData.price,
|
|
692
|
+
buyer: listingData.buyer,
|
|
693
|
+
});
|
|
694
|
+
|
|
695
|
+
// Update database
|
|
696
|
+
updateNFTSaleHistory(listingData);
|
|
697
|
+
}
|
|
698
|
+
},
|
|
699
|
+
{
|
|
700
|
+
commitment: 'confirmed',
|
|
701
|
+
filters: [
|
|
702
|
+
{ dataSize: 200 }, // Listing account size
|
|
703
|
+
],
|
|
704
|
+
}
|
|
705
|
+
);
|
|
706
|
+
```
|
|
707
|
+
|
|
708
|
+
### Real-time Block Explorer
|
|
709
|
+
|
|
710
|
+
```typescript
|
|
711
|
+
// Subscribe to slots for block updates
|
|
712
|
+
const slotSub = await wsClient.slotSubscribe((slotInfo) => {
|
|
713
|
+
console.log(`New slot: ${slotInfo.slot}`);
|
|
714
|
+
updateBlockExplorer(slotInfo);
|
|
715
|
+
});
|
|
716
|
+
|
|
717
|
+
// Subscribe to logs for all transactions
|
|
718
|
+
const logsSub = await wsClient.logsSubscribe(
|
|
719
|
+
'all', // All transactions
|
|
720
|
+
(logs) => {
|
|
721
|
+
console.log(`Transaction: ${logs.signature}`);
|
|
722
|
+
addTransactionToExplorer(logs);
|
|
723
|
+
},
|
|
724
|
+
{
|
|
725
|
+
commitment: 'confirmed',
|
|
726
|
+
}
|
|
727
|
+
);
|
|
728
|
+
```
|
|
729
|
+
|
|
730
|
+
## API Reference
|
|
731
|
+
|
|
732
|
+
### Constructor
|
|
733
|
+
|
|
734
|
+
```typescript
|
|
735
|
+
new WebSocketClient(config: WebSocketConfig)
|
|
736
|
+
```
|
|
737
|
+
|
|
738
|
+
### Connection Methods
|
|
739
|
+
|
|
740
|
+
| Method | Parameters | Return | Description |
|
|
741
|
+
|--------|------------|--------|-------------|
|
|
742
|
+
| `connect()` | - | `Promise<void>` | Establish WebSocket connection |
|
|
743
|
+
| `disconnect()` | - | `Promise<void>` | Close connection and cleanup |
|
|
744
|
+
| `reconnect()` | - | `Promise<void>` | Force reconnection |
|
|
745
|
+
|
|
746
|
+
### Subscription Methods
|
|
747
|
+
|
|
748
|
+
| Method | Parameters | Return | Description |
|
|
749
|
+
|--------|------------|--------|-------------|
|
|
750
|
+
| `accountSubscribe` | `address, callback, options?` | `Promise<number>` | Subscribe to account |
|
|
751
|
+
| `accountUnsubscribe` | `subscriptionId` | `Promise<void>` | Unsubscribe from account |
|
|
752
|
+
| `programSubscribe` | `programId, callback, options?` | `Promise<number>` | Subscribe to program accounts |
|
|
753
|
+
| `programUnsubscribe` | `subscriptionId` | `Promise<void>` | Unsubscribe from program |
|
|
754
|
+
| `slotSubscribe` | `callback` | `Promise<number>` | Subscribe to slots |
|
|
755
|
+
| `slotUnsubscribe` | `subscriptionId` | `Promise<void>` | Unsubscribe from slots |
|
|
756
|
+
| `signatureSubscribe` | `signature, callback, options?` | `Promise<number>` | Subscribe to signature |
|
|
757
|
+
| `signatureUnsubscribe` | `subscriptionId` | `Promise<void>` | Unsubscribe from signature |
|
|
758
|
+
| `logsSubscribe` | `filter, callback, options?` | `Promise<number>` | Subscribe to logs |
|
|
759
|
+
| `logsUnsubscribe` | `subscriptionId` | `Promise<void>` | Unsubscribe from logs |
|
|
760
|
+
| `unsubscribeAll` | - | `Promise<void>` | Unsubscribe from all |
|
|
761
|
+
|
|
762
|
+
### Utility Methods
|
|
763
|
+
|
|
764
|
+
| Method | Return | Description |
|
|
765
|
+
|--------|--------|-------------|
|
|
766
|
+
| `getMetrics()` | `Metrics` | Get connection metrics |
|
|
767
|
+
| `isConnected()` | `boolean` | Check connection status |
|
|
768
|
+
| `getActiveSubscriptions()` | `number[]` | Get active subscription IDs |
|
|
769
|
+
|
|
770
|
+
---
|
|
771
|
+
|
|
772
|
+
## License
|
|
773
|
+
|
|
774
|
+
MIT License - See [LICENSE](../../LICENSE) for details.
|
|
775
|
+
|
|
776
|
+
---
|
|
777
|
+
|
|
778
|
+
**WebSocket Client Module** - Real-time Solana blockchain streaming
|