kiteticker-async-manager 0.4.0

High-performance async WebSocket client for Kite Connect API with multi-connection support, dynamic subscription management, and optimized data processing.
Documentation
````markdown
# Ticker API Reference

Low-level WebSocket client for the Kite Connect ticker: `KiteTickerAsync`.

Use this when you want to manage a single connection yourself or when you need raw frames.

## Constructing a client

```rust
use kiteticker_async_manager::KiteTickerAsync;

#[tokio::main]
async fn main() -> Result<(), String> {
  let api_key = std::env::var("KITE_API_KEY").unwrap();
  let access_token = std::env::var("KITE_ACCESS_TOKEN").unwrap();

  // Normal parsed mode
  let mut ticker = KiteTickerAsync::connect(&api_key, &access_token).await?;

  // Or: raw-only (frames are forwarded without parsing)
  let mut raw_ticker = KiteTickerAsync::connect_with_options(&api_key, &access_token, true).await?;
  Ok(())
}
```

## Subscribing and receiving ticks

```rust
use kiteticker_async_manager::{KiteTickerAsync, Mode, TickerMessage};

#[tokio::main]
async fn main() -> Result<(), String> {
  let api_key = std::env::var("KITE_API_KEY").unwrap();
  let access_token = std::env::var("KITE_ACCESS_TOKEN").unwrap();
  let mut ticker = KiteTickerAsync::connect(&api_key, &access_token).await?;

  let symbols = vec![256265, 408065];
  let mut sub = ticker.subscribe(&symbols, Some(Mode::Quote)).await?;

  while let Ok(Some(msg)) = sub.next_message().await {
    match msg {
      TickerMessage::Ticks(ticks) => {
        for t in ticks { /* handle t.content */ }
      }
      TickerMessage::Error(e) => eprintln!("error: {}", e),
      TickerMessage::ClosingMessage(info) => eprintln!("closing: {}", info),
      TickerMessage::Raw(_) => { /* only in raw-only mode */ }
      TickerMessage::Message(v) => println!("message: {}", v),
      TickerMessage::OrderPostback(_) => { /* optional */ }
    }
  }
  Ok(())
}
```

## Receiving raw frames

Subscribe to a zero-copy raw feed regardless of `raw_only` using:

```rust
let mut raw_rx = ticker.subscribe_raw_frames(); // broadcast::Receiver<bytes::Bytes>
while let Ok(frame) = raw_rx.recv().await {
  // frame is the full WebSocket frame bytes
}
```

## Pinging

Keep the connection alive manually if needed:

```rust
ticker.ping().await?;
```

For multi-connection, prefer the manager and its builder (`KiteTickerManagerBuilder`) to configure `raw_only` globally.
````