o_sfu_protocol/signaling/
codec.rs1use super::{
2 ClientMessage, ClientRequest, ClientResponse, Envelope, EnvelopeDecodeError, RequestId,
3 ServerMessage, ServerRequest, ServerResponse, envelope::EnvelopeRoute,
4};
5
6#[derive(Debug, Clone, PartialEq, Eq)]
7pub enum ClientEnvelope {
8 Message(ClientMessage),
9 Request {
10 request_id: RequestId,
11 request: ClientRequest,
12 },
13 Response {
14 response_to: RequestId,
15 response: ClientResponse,
16 },
17}
18
19#[derive(Debug, Clone, PartialEq, Eq)]
20pub enum ServerEnvelope {
21 Message(ServerMessage),
22 Request {
23 request_id: RequestId,
24 request: ServerRequest,
25 },
26 Response {
27 response_to: RequestId,
28 response: ServerResponse,
29 },
30}
31
32impl ClientEnvelope {
33 pub fn into_envelope(self) -> Result<Envelope, serde_json::Error> {
40 match self {
41 Self::Message(message) => message.into_envelope(),
42 Self::Request {
43 request_id,
44 request,
45 } => request.into_envelope(request_id),
46 Self::Response {
47 response_to,
48 response,
49 } => response.into_envelope(response_to),
50 }
51 }
52
53 pub fn decode(envelope: Envelope) -> Result<Self, EnvelopeDecodeError> {
62 let (tag, payload, route) = envelope.into_parts();
63 match route {
64 EnvelopeRoute::Message => {
65 ClientMessage::decode(&tag, payload).map(ClientEnvelope::Message)
66 }
67 EnvelopeRoute::Request(request_id) => {
68 ClientRequest::decode(&tag, payload).map(|request| Self::Request {
69 request_id,
70 request,
71 })
72 }
73 EnvelopeRoute::Response(response_to) => {
74 ClientResponse::decode(&tag, payload).map(|response| Self::Response {
75 response_to,
76 response,
77 })
78 }
79 }
80 }
81}
82
83impl ServerEnvelope {
84 pub fn into_envelope(self) -> Result<Envelope, serde_json::Error> {
91 match self {
92 Self::Message(message) => message.into_envelope(),
93 Self::Request {
94 request_id,
95 request,
96 } => request.into_envelope(request_id),
97 Self::Response {
98 response_to,
99 response,
100 } => response.into_envelope(response_to),
101 }
102 }
103
104 pub fn decode(envelope: Envelope) -> Result<Self, EnvelopeDecodeError> {
112 let (tag, payload, route) = envelope.into_parts();
113 match route {
114 EnvelopeRoute::Message => {
115 ServerMessage::decode(&tag, payload).map(ServerEnvelope::Message)
116 }
117 EnvelopeRoute::Request(request_id) => {
118 ServerRequest::decode(&tag, payload).map(|request| Self::Request {
119 request_id,
120 request,
121 })
122 }
123 EnvelopeRoute::Response(response_to) => {
124 ServerResponse::decode(&tag, payload).map(|response| Self::Response {
125 response_to,
126 response,
127 })
128 }
129 }
130 }
131}