|
|
@@ -33,7 +33,7 @@ pub enum HeartbeatType {
|
|
|
pub struct AbstractWsMode {}
|
|
|
|
|
|
impl AbstractWsMode {
|
|
|
- pub async fn ws_connected<T, PI, PO, F, Future>(write_to_socket_rx_arc: Arc<Mutex<UnboundedReceiver<Message>>>,
|
|
|
+ pub async fn ws_connected<T, PI, PO, F, B, Future>(write_to_socket_rx_arc: Arc<Mutex<UnboundedReceiver<Message>>>,
|
|
|
is_first_login: bool,
|
|
|
label: String,
|
|
|
is_shutdown_arc: Arc<AtomicBool>,
|
|
|
@@ -42,11 +42,13 @@ impl AbstractWsMode {
|
|
|
ws_stream: WebSocketStream<MaybeTlsStream<TcpStream>>,
|
|
|
message_text: T,
|
|
|
message_ping: PI,
|
|
|
- message_pong: PO)
|
|
|
+ message_pong: PO,
|
|
|
+ message_binary: B)
|
|
|
where T: Fn(String) -> Option<ResponseData> + Copy,
|
|
|
PI: Fn(Vec<u8>) -> Option<ResponseData> + Copy,
|
|
|
PO: Fn(Vec<u8>) -> Option<ResponseData> + Copy,
|
|
|
F: Fn(ResponseData) -> Future + Clone,
|
|
|
+ B: Fn(Vec<u8>) -> Option<ResponseData> + Copy,
|
|
|
Future: future::Future<Output=()> + Send + 'static,
|
|
|
{
|
|
|
let (ws_write, mut ws_read) = ws_stream.split();
|
|
|
@@ -80,7 +82,7 @@ impl AbstractWsMode {
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
- let response_data = AbstractWsMode::analysis_message(message, message_text, message_ping, message_pong);
|
|
|
+ let response_data = AbstractWsMode::analysis_message(message, message_text, message_ping, message_pong, message_binary);
|
|
|
// let response_data = func(message);
|
|
|
if response_data.is_some() {
|
|
|
let mut data = response_data.unwrap();
|
|
|
@@ -106,32 +108,14 @@ impl AbstractWsMode {
|
|
|
*/
|
|
|
match code {
|
|
|
-200 => {
|
|
|
- let mut is_sub = false;
|
|
|
- match data.channel.as_str() {
|
|
|
- "server.sign" => { // coinex
|
|
|
- let mut login_data = crate::coinex_swap_ws::LOGIN_DATA.lock().await;
|
|
|
- if login_data.0 && !login_data.1 {
|
|
|
- login_data.1 = true;
|
|
|
- is_sub = true;
|
|
|
- }
|
|
|
- },
|
|
|
- "login" => { // bitget
|
|
|
- is_sub = true;
|
|
|
- },
|
|
|
- _ => {
|
|
|
- is_sub = false;
|
|
|
- }
|
|
|
- }
|
|
|
- if is_sub {
|
|
|
- //登录成功
|
|
|
- info!("ws登录成功:{:?}", data);
|
|
|
- info!("订阅内容:{:?}", subscribe_array.clone());
|
|
|
- for s in &subscribe_array {
|
|
|
- let mut write_lock = ws_write_arc.lock().await;
|
|
|
- write_lock.send(Message::Text(s.parse().unwrap())).await.expect("订阅消息失败");
|
|
|
- }
|
|
|
- info!("订阅完成!");
|
|
|
+ //登录成功
|
|
|
+ info!("ws登录成功:{:?}", data);
|
|
|
+ info!("订阅内容:{:?}", subscribe_array.clone());
|
|
|
+ for s in &subscribe_array {
|
|
|
+ let mut write_lock = ws_write_arc.lock().await;
|
|
|
+ write_lock.send(Message::Text(s.parse().unwrap())).await.expect("订阅消息失败");
|
|
|
}
|
|
|
+ info!("订阅完成!");
|
|
|
}
|
|
|
-201 => {
|
|
|
//订阅成功
|
|
|
@@ -177,7 +161,7 @@ impl AbstractWsMode {
|
|
|
}
|
|
|
|
|
|
//创建链接
|
|
|
- pub async fn ws_connect_async<T, PI, PO, F, Future>(is_shutdown_arc: Arc<AtomicBool>,
|
|
|
+ pub async fn ws_connect_async<T, PI, PO, F, B, Future>(is_shutdown_arc: Arc<AtomicBool>,
|
|
|
handle_function: F,
|
|
|
address_url: String,
|
|
|
is_first_login: bool,
|
|
|
@@ -186,10 +170,12 @@ impl AbstractWsMode {
|
|
|
write_to_socket_rx_arc: Arc<Mutex<UnboundedReceiver<Message>>>,
|
|
|
message_text: T,
|
|
|
message_ping: PI,
|
|
|
- message_pong: PO)
|
|
|
+ message_pong: PO,
|
|
|
+ message_binary: B)
|
|
|
where T: Fn(String) -> Option<ResponseData> + Copy,
|
|
|
PI: Fn(Vec<u8>) -> Option<ResponseData> + Copy,
|
|
|
PO: Fn(Vec<u8>) -> Option<ResponseData> + Copy,
|
|
|
+ B: Fn(Vec<u8>) -> Option<ResponseData> + Copy,
|
|
|
F: Fn(ResponseData) -> Future + Clone,
|
|
|
Future: future::Future<Output=()> + Send + 'static,
|
|
|
{
|
|
|
@@ -219,7 +205,8 @@ impl AbstractWsMode {
|
|
|
ws_stream,
|
|
|
message_text,
|
|
|
message_ping,
|
|
|
- message_pong).await;
|
|
|
+ message_pong,
|
|
|
+ message_binary).await;
|
|
|
}
|
|
|
Err(e) => {
|
|
|
error!("WebSocket 握手失败:{:?}", e);
|
|
|
@@ -249,19 +236,21 @@ impl AbstractWsMode {
|
|
|
}
|
|
|
}
|
|
|
//数据解析
|
|
|
- pub fn analysis_message<T, PI, PO>(message: Result<Message, Error>,
|
|
|
+ pub fn analysis_message<T, PI, PO, B>(message: Result<Message, Error>,
|
|
|
message_text: T,
|
|
|
message_ping: PI,
|
|
|
- message_pong: PO) -> Option<ResponseData>
|
|
|
+ message_pong: PO,
|
|
|
+ message_binary: B) -> Option<ResponseData>
|
|
|
where T: Fn(String) -> Option<ResponseData>,
|
|
|
PI: Fn(Vec<u8>) -> Option<ResponseData>,
|
|
|
- PO: Fn(Vec<u8>) -> Option<ResponseData>
|
|
|
+ PO: Fn(Vec<u8>) -> Option<ResponseData>,
|
|
|
+ B: Fn(Vec<u8>) -> Option<ResponseData>
|
|
|
{
|
|
|
match message {
|
|
|
Ok(Message::Text(text)) => message_text(text),
|
|
|
Ok(Message::Ping(pi)) => message_ping(pi),
|
|
|
Ok(Message::Pong(po)) => message_pong(po),
|
|
|
- Ok(Message::Binary(s)) => message_text(parse_zip_data(s.clone())), // 二进制压缩 解析
|
|
|
+ Ok(Message::Binary(s)) => message_binary(s), //二进制WebSocket消息
|
|
|
Ok(Message::Close(c)) => {
|
|
|
let message_str = format!("关闭指令:{:?}", c);
|
|
|
trace!("{:?}",message_str);
|
|
|
@@ -289,22 +278,6 @@ impl AbstractWsMode {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-fn parse_zip_data(p0: Vec<u8>) -> String{
|
|
|
- // 创建一个GzDecoder的实例,将压缩数据作为输入
|
|
|
- let mut decoder = GzDecoder::new(&p0[..]);
|
|
|
-
|
|
|
- // 创建一个缓冲区来存放解压缩后的数据
|
|
|
- let mut decompressed_data = Vec::new();
|
|
|
-
|
|
|
- // 读取解压缩的数据到缓冲区中
|
|
|
- decoder.read_to_end(&mut decompressed_data).expect("解压缩失败");
|
|
|
- let result = from_utf8(&decompressed_data)
|
|
|
- .expect("解压缩后的数据不是有效的UTF-8");
|
|
|
-
|
|
|
- // info!("解压缩数据 {:?}", result);
|
|
|
- result.to_string()
|
|
|
-}
|
|
|
-
|
|
|
//创建链接
|
|
|
pub async fn ws_connect_async(address_url: String) -> (SplitSink<WebSocketStream<MaybeTlsStream<TcpStream>>, Message>,
|
|
|
SplitStream<WebSocketStream<MaybeTlsStream<TcpStream>>>) {
|