kiteticker_async_manager/lib.rs
1#![allow(
2 clippy::cognitive_complexity,
3 clippy::large_enum_variant,
4 clippy::needless_doctest_main
5)]
6#![warn(missing_debug_implementations, rust_2018_idioms, unreachable_pub)]
7#![doc(test(
8 no_crate_inject,
9 attr(deny(warnings, rust_2018_idioms), allow(dead_code, unused_variables))
10))]
11
12//! # KiteTicker Async Manager
13//!
14//! High-performance async WebSocket client for the [Kite Connect API](https://kite.trade/docs/connect/v3/websocket/#websocket-streaming)
15//! with multi-connection support and dynamic subscription management.
16//!
17//! ## Features
18//!
19//! - **๐ Multi-Connection Support** - Utilize all 3 allowed WebSocket connections (9,000 symbol capacity)
20//! - **โก High Performance** - Dedicated parser tasks, optimized buffers, sub-microsecond latency
21//! - **๐ Dynamic Subscriptions** - Add/remove symbols at runtime without reconnection
22//! - **๐ Load Balancing** - Automatic symbol distribution across connections
23//! - **๐ช Production Ready** - Comprehensive error handling, health monitoring, reconnection
24//! - **๐ง Async-First Design** - Built with Tokio, follows Rust async best practices
25//!
26//! ## Quick Start
27//!
28//! ### Multi-Connection Manager (Recommended)
29//!
30//! ```rust,no_run
31//! use kiteticker_async_manager::{KiteTickerManager, KiteManagerConfig, Mode, TickerMessage};
32//!
33//! #[tokio::main]
34//! async fn main() -> Result<(), String> {
35//! // Setup credentials
36//! let api_key = std::env::var("KITE_API_KEY").unwrap();
37//! let access_token = std::env::var("KITE_ACCESS_TOKEN").unwrap();
38//!
39//! // Create high-performance manager
40//! let config = KiteManagerConfig {
41//! max_connections: 3,
42//! max_symbols_per_connection: 3000,
43//! enable_dedicated_parsers: true,
44//! default_mode: Mode::LTP,
45//! ..Default::default()
46//! };
47//!
48//! // Start manager
49//! let mut manager = KiteTickerManager::new(api_key, access_token, config);
50//! manager.start().await?;
51//!
52//! // Subscribe to symbols (automatically distributed)
53//! let symbols = vec![256265, 408065, 738561]; // NIFTY 50, HDFC Bank, Reliance
54//! manager.subscribe_symbols(&symbols, Some(Mode::Quote)).await?;
55//!
56//! // Process data from independent channels
57//! let channels = manager.get_all_channels();
58//! for (channel_id, mut receiver) in channels {
59//! tokio::spawn(async move {
60//! while let Ok(message) = receiver.recv().await {
61//! if let TickerMessage::Ticks(ticks) = message {
62//! for tick in ticks {
63//! println!("Channel {:?}: {} @ โน{:.2}",
64//! channel_id,
65//! tick.instrument_token,
66//! tick.content.last_price.unwrap_or(0.0));
67//! }
68//! }
69//! }
70//! });
71//! }
72//!
73//! // Dynamic operations
74//! manager.subscribe_symbols(&[5633, 884737], Some(Mode::Full)).await?; // Add
75//! manager.unsubscribe_symbols(&[408065]).await?; // Remove
76//! manager.change_mode(&[256265], Mode::Full).await?; // Change mode
77//!
78//! Ok(())
79//! }
80//! ```
81//!
82//! ### Single Connection Usage
83//!
84//! ```rust,no_run
85//! use kiteticker_async_manager::{KiteTickerAsync, Mode, TickerMessage};
86//!
87//! #[tokio::main]
88//! async fn main() -> Result<(), String> {
89//! let api_key = std::env::var("KITE_API_KEY").unwrap();
90//! let access_token = std::env::var("KITE_ACCESS_TOKEN").unwrap();
91//!
92//! // Connect to WebSocket
93//! let ticker = KiteTickerAsync::connect(&api_key, &access_token).await?;
94//!
95//! // Subscribe to symbols
96//! let symbols = vec![256265, 408065]; // NIFTY 50, HDFC Bank
97//! let mut subscriber = ticker.subscribe(&symbols, Some(Mode::LTP)).await?;
98//!
99//! // Receive data
100//! while let Ok(Some(message)) = subscriber.next_message().await {
101//! if let TickerMessage::Ticks(ticks) = message {
102//! for tick in ticks {
103//! println!("Symbol {}: โน{:.2}",
104//! tick.instrument_token,
105//! tick.content.last_price.unwrap_or(0.0));
106//! }
107//! }
108//! }
109//!
110//! Ok(())
111//! }
112//! ```
113//!
114//! ## Performance Comparison
115//!
116//! | Feature | Single Connection | Multi-Connection Manager | Improvement |
117//! |---------|------------------|---------------------------|-------------|
118//! | **Max Symbols** | 3,000 | 9,000 | **3x capacity** |
119//! | **Throughput** | Limited by 1 connection | 3 parallel connections | **3x throughput** |
120//! | **Latency** | ~5-10ยตs | ~1-2ยตs | **5x faster** |
121//! | **Resilience** | Single point of failure | 3 independent connections | **High availability** |
122//! | **Dynamic Ops** | Manual reconnection | Runtime add/remove | **Zero downtime** |
123//!
124//! ## Architecture
125//!
126//! The library provides two main components:
127//!
128//! ### 1. `KiteTickerAsync` - Single WebSocket Connection
129//! - Direct WebSocket client for simple use cases
130//! - Up to 3,000 symbols per connection
131//! - Manual connection management
132//!
133//! ### 2. `KiteTickerManager` - Multi-Connection Manager (Recommended)
134//! - Manages up to 3 WebSocket connections automatically
135//! - Supports up to 9,000 symbols total
136//! - Dynamic subscription management
137//! - Load balancing and health monitoring
138//! - High-performance optimizations
139//!
140//! ## Subscription Modes
141//!
142//! The library supports three subscription modes:
143//!
144//! - **`Mode::LTP`** - Last traded price only (minimal bandwidth)
145//! - **`Mode::Quote`** - Price + volume + OHLC (standard data)
146//! - **`Mode::Full`** - Complete market depth (maximum data)
147//!
148//! ## Examples
149//!
150//! See the [examples directory](https://github.com/kaychaks/kiteticker-async/tree/master/examples) for:
151//!
152//! - **Basic Examples** - Simple usage patterns
153//! - **Advanced Examples** - Complex multi-connection scenarios
154//! - **Performance Examples** - Optimization and benchmarking
155//!
156//! ## Documentation
157//!
158//! - [Getting Started Guide](https://github.com/kaychaks/kiteticker-async/blob/master/docs/guides/getting-started.md)
159//! - [API Reference](https://github.com/kaychaks/kiteticker-async/blob/master/docs/api/)
160//! - [Dynamic Subscriptions](https://github.com/kaychaks/kiteticker-async/blob/master/docs/guides/DYNAMIC_SUBSCRIPTION_GUIDE.md)
161//! - [Performance Guide](https://github.com/kaychaks/kiteticker-async/blob/master/docs/guides/PERFORMANCE_IMPROVEMENTS.md)
162mod errors;
163pub mod manager;
164mod models;
165mod parser;
166pub use errors::ParseTickError;
167pub use models::{
168 Depth, DepthItem, Exchange, Mode, Order, OrderStatus, OrderTransactionType,
169 OrderValidity, Request, TextMessage, Tick, TickMessage, TickerMessage, OHLC,
170};
171
172pub mod ticker;
173pub use manager::{
174 ChannelId, HealthSummary, KiteManagerConfig, KiteTickerManager, ManagerStats,
175};
176pub use ticker::{KiteTickerAsync, KiteTickerSubscriber};