rsbit 0.5.4

This is a library for the Bybit API.
Documentation
use crate::{
    v5::ws::BybitWS,
    auth::Auth,
};
use anyhow::Result;
use tokio::net::TcpStream;
use chrono::Utc;
use tokio_tungstenite::{
    WebSocketStream,
    connect_async,
    MaybeTlsStream,
    tungstenite::Message,
};
use futures_util::{
    StreamExt,
    SinkExt,
    stream::{
        SplitSink,
        SplitStream,
    },
};
use serde_json::json;

impl BybitWS {
    // websocket connect
    pub async fn connect(&self, is_private: bool) -> Result<(
        SplitSink<WebSocketStream<MaybeTlsStream<TcpStream>>, Message>,
        SplitStream<WebSocketStream<MaybeTlsStream<TcpStream>>>
    )> {
        if is_private {
            self.connect_private().await
        } else {
            self.connect_public().await
        }
    }

    async fn connect_private(&self) -> Result<(
        SplitSink<WebSocketStream<MaybeTlsStream<TcpStream>>, Message>,
        SplitStream<WebSocketStream<MaybeTlsStream<TcpStream>>>
    )> {
        let (ws_stream, _) = connect_async(self.channel()).await?;
        let expires = (Utc::now().timestamp_millis() + 10000).to_string();
        let signature = self.create_signature(&expires)?;

        let auth = json!({
            "op": "auth",
            "args": [self.api_key(), expires.to_string(), signature]
        });
        let (mut write, read) = ws_stream.split();
        let auth_message = Message::Text(auth.to_string());
        write.send(auth_message).await?;
        Ok((write, read))
    }

    async fn connect_public(&self) -> Result<(
        SplitSink<WebSocketStream<MaybeTlsStream<TcpStream>>, Message>,
        SplitStream<WebSocketStream<MaybeTlsStream<TcpStream>>>
    )> {
        let (ws_stream, _) = connect_async(self.channel()).await?;
        let (write, read) = ws_stream.split();
        Ok((write, read))
    }
}