ttproxy/
util.rs

1//!
2//! # Commiuncation With Client
3//!
4
5use crate::SOCK;
6use async_std::{net::SocketAddr, task};
7use flate2::{write::ZlibEncoder, Compression};
8use myutil::{err::*, *};
9use serde::Serialize;
10use std::{io::Write, time::Duration};
11use ttserver_def::*;
12
13/// 回送成功信息
14#[macro_export(crate)]
15macro_rules! send_ok {
16    ($uuid: expr, $msg: expr, $peeraddr: expr) => {
17        $crate::util::send_back(
18            $crate::util::gen_resp_ok($uuid, $msg),
19            $peeraddr,
20        )
21    };
22}
23
24/// 生成标志'成功'的回复体
25pub(crate) fn gen_resp_ok(uuid: u64, msg: impl Serialize) -> Resp {
26    Resp {
27        uuid,
28        status: RetStatus::Success,
29        msg: info!(serde_json::to_vec(&msg)).unwrap_or_default(),
30    }
31}
32
33/// 回送失败信息
34#[macro_export(crate)]
35macro_rules! send_err {
36    ($uuid: expr, $err: expr, $peeraddr: expr) => {{
37        let log = genlog($err);
38        $crate::util::send_back(
39            $crate::util::gen_resp_err($uuid, &log),
40            $peeraddr,
41        )
42        .c(d!(&log))
43        .map(|_| p(eg!(log)))
44    }};
45}
46
47/// 生成标志'出错'的回复体
48pub(crate) fn gen_resp_err(uuid: u64, msg: &str) -> Resp {
49    Resp {
50        uuid,
51        status: RetStatus::Fail,
52        msg: msg.as_bytes().to_vec(),
53    }
54}
55
56/// 回送信息
57#[inline(always)]
58pub(crate) fn send_back(resp: Resp, peeraddr: SocketAddr) -> Result<()> {
59    serde_json::to_vec(&resp)
60        .c(d!())
61        .and_then(|resp| {
62            let mut en = ZlibEncoder::new(vct![], Compression::default());
63            en.write_all(&resp[..]).c(d!())?;
64            en.finish().c(d!())
65        })
66        .map(|resp_compressed| {
67            task::spawn(async move {
68                info_omit!(SOCK.send_to(&resp_compressed, peeraddr).await);
69            });
70        })
71}
72
73#[inline(always)]
74pub(crate) async fn asleep(secs: u64) {
75    task::sleep(Duration::from_secs(secs)).await
76}