barter_data/exchange/okx/
mod.rs1use self::{
2 channel::OkxChannel, market::OkxMarket, subscription::OkxSubResponse, trade::OkxTrades,
3};
4use crate::{
5 ExchangeWsStream, NoInitialSnapshots,
6 exchange::{Connector, ExchangeSub, PingInterval, StreamSelector},
7 instrument::InstrumentData,
8 subscriber::{WebSocketSubscriber, validator::WebSocketSubValidator},
9 subscription::trade::PublicTrades,
10 transformer::stateless::StatelessTransformer,
11};
12use barter_instrument::exchange::ExchangeId;
13use barter_integration::{error::SocketError, protocol::websocket::WsMessage};
14use barter_macro::{DeExchange, SerExchange};
15use derive_more::Display;
16use serde_json::json;
17use std::time::Duration;
18use url::Url;
19
20pub mod channel;
23
24pub mod market;
27
28pub mod subscription;
31
32pub mod trade;
34
35pub const BASE_URL_OKX: &str = "wss://ws.okx.com:8443/ws/v5/public";
39
40pub const PING_INTERVAL_OKX: Duration = Duration::from_secs(29);
44
45#[derive(
49 Copy,
50 Clone,
51 Eq,
52 PartialEq,
53 Ord,
54 PartialOrd,
55 Hash,
56 Debug,
57 Default,
58 Display,
59 DeExchange,
60 SerExchange,
61)]
62pub struct Okx;
63
64impl Connector for Okx {
65 const ID: ExchangeId = ExchangeId::Okx;
66 type Channel = OkxChannel;
67 type Market = OkxMarket;
68 type Subscriber = WebSocketSubscriber;
69 type SubValidator = WebSocketSubValidator;
70 type SubResponse = OkxSubResponse;
71
72 fn url() -> Result<Url, SocketError> {
73 Url::parse(BASE_URL_OKX).map_err(SocketError::UrlParse)
74 }
75
76 fn ping_interval() -> Option<PingInterval> {
77 Some(PingInterval {
78 interval: tokio::time::interval(PING_INTERVAL_OKX),
79 ping: || WsMessage::text("ping"),
80 })
81 }
82
83 fn requests(exchange_subs: Vec<ExchangeSub<Self::Channel, Self::Market>>) -> Vec<WsMessage> {
84 vec![WsMessage::text(
85 json!({
86 "op": "subscribe",
87 "args": &exchange_subs,
88 })
89 .to_string(),
90 )]
91 }
92}
93
94impl<Instrument> StreamSelector<Instrument, PublicTrades> for Okx
95where
96 Instrument: InstrumentData,
97{
98 type SnapFetcher = NoInitialSnapshots;
99 type Stream =
100 ExchangeWsStream<StatelessTransformer<Self, Instrument::Key, PublicTrades, OkxTrades>>;
101}