endpoint_libs/libs/ws/
basics.rs

1use serde::*;
2use serde_json::Value;
3use std::fmt::Debug;
4use std::net::SocketAddr;
5use std::sync::atomic::{AtomicI64, AtomicU32};
6use std::sync::Arc;
7
8use crate::libs::error_code::ErrorCode;
9use crate::libs::handler::RequestHandlerErased;
10use crate::libs::log::LogLevel;
11use crate::libs::toolbox::RequestContext;
12use crate::model::EndpointSchema;
13
14pub type ConnectionId = u32;
15#[derive(Debug, Serialize, Deserialize, Default, Clone)]
16pub struct WsRequestGeneric<Req> {
17    pub method: u32,
18    pub seq: u32,
19    pub params: Req,
20}
21pub type WsRequestValue = WsRequestGeneric<Value>;
22
23#[derive(Debug, Serialize, Deserialize, Default, Clone)]
24pub struct WsResponseError {
25    pub method: u32,
26    pub code: u32,
27    pub seq: u32,
28    pub log_id: String,
29    pub params: Value,
30}
31
32#[derive(Debug)]
33pub struct WsConnection {
34    pub connection_id: ConnectionId,
35    pub user_id: AtomicI64,
36    pub role: AtomicU32,
37    pub address: SocketAddr,
38    pub log_id: u64,
39}
40impl WsConnection {
41    pub fn get_user_id(&self) -> i64 {
42        self.user_id.load(std::sync::atomic::Ordering::Relaxed)
43    }
44}
45
46pub type WsSuccessResponse = WsSuccessResponseGeneric<Value>;
47pub type WsStreamResponse = WsStreamResponseGeneric<Value>;
48
49#[derive(Debug, Serialize, Deserialize, Clone)]
50pub struct WsForwardedResponse {
51    pub method: u32,
52    pub seq: u32,
53}
54#[derive(Debug, Serialize, Deserialize, Clone)]
55pub struct WsSuccessResponseGeneric<Params> {
56    pub method: u32,
57    pub seq: u32,
58    pub params: Params,
59}
60
61#[derive(Debug, Serialize, Deserialize, Clone)]
62pub struct WsStreamResponseGeneric<Params> {
63    pub original_seq: u32,
64    pub method: u32,
65    pub stream_seq: u32,
66    pub stream_code: u32,
67    pub data: Params,
68}
69#[derive(Debug, Serialize, Deserialize, Clone)]
70pub struct WsLogResponse {
71    pub seq: u32,
72    pub log_id: u64,
73    pub level: LogLevel,
74    pub message: String,
75}
76
77#[derive(Debug, Serialize, Deserialize, Clone)]
78#[serde(tag = "type")]
79pub enum WsResponseGeneric<Resp> {
80    Immediate(WsSuccessResponseGeneric<Resp>),
81    Stream(WsStreamResponseGeneric<Resp>),
82    Error(WsResponseError),
83    Log(WsLogResponse),
84    Forwarded(WsForwardedResponse),
85    Close,
86}
87
88pub type WsResponseValue = WsResponseGeneric<Value>;
89
90pub struct WsEndpoint {
91    pub schema: EndpointSchema,
92    pub handler: Arc<dyn RequestHandlerErased>,
93}
94
95pub fn internal_error_to_resp(
96    ctx: &RequestContext,
97    code: ErrorCode,
98    err0: eyre::Error,
99) -> WsResponseValue {
100    let log_id = ctx.log_id.to_string();
101    let err = WsResponseError {
102        method: ctx.method,
103        code: code.to_u32(),
104        seq: ctx.seq,
105        log_id,
106        params: Value::Null,
107    };
108    tracing::error!("Internal error: {:?} {:?}", err, err0);
109    WsResponseValue::Error(err)
110}
111
112pub fn request_error_to_resp(
113    ctx: &RequestContext,
114    code: ErrorCode,
115    params: impl Into<Value>,
116) -> WsResponseValue {
117    let log_id = ctx.log_id.to_string();
118    let params = params.into();
119    let err = WsResponseError {
120        method: ctx.method,
121        code: code.to_u32(),
122        seq: ctx.seq,
123        log_id,
124        params,
125    };
126    tracing::warn!("Request error: {:?}", err);
127    WsResponseValue::Error(err)
128}