endpoint_libs/libs/ws/
basics.rs1use 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}