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::protocol::websocket::{WebSocketSerdeParser, 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
45pub type OkxWsStream<Transformer> = ExchangeWsStream<WebSocketSerdeParser, Transformer>;
47
48#[derive(
52 Copy,
53 Clone,
54 Eq,
55 PartialEq,
56 Ord,
57 PartialOrd,
58 Hash,
59 Debug,
60 Default,
61 Display,
62 DeExchange,
63 SerExchange,
64)]
65pub struct Okx;
66
67impl Connector for Okx {
68 const ID: ExchangeId = ExchangeId::Okx;
69 type Channel = OkxChannel;
70 type Market = OkxMarket;
71 type Subscriber = WebSocketSubscriber;
72 type SubValidator = WebSocketSubValidator;
73 type SubResponse = OkxSubResponse;
74
75 fn url() -> Result<Url, url::ParseError> {
76 Url::parse(BASE_URL_OKX)
77 }
78
79 fn ping_interval() -> Option<PingInterval> {
80 Some(PingInterval {
81 interval: tokio::time::interval(PING_INTERVAL_OKX),
82 ping: || WsMessage::text("ping"),
83 })
84 }
85
86 fn requests(exchange_subs: Vec<ExchangeSub<Self::Channel, Self::Market>>) -> Vec<WsMessage> {
87 vec![WsMessage::text(
88 json!({
89 "op": "subscribe",
90 "args": &exchange_subs,
91 })
92 .to_string(),
93 )]
94 }
95}
96
97impl<Instrument> StreamSelector<Instrument, PublicTrades> for Okx
98where
99 Instrument: InstrumentData,
100{
101 type SnapFetcher = NoInitialSnapshots;
102 type Stream = OkxWsStream<StatelessTransformer<Self, Instrument::Key, PublicTrades, OkxTrades>>;
103}