surrealcs_kernel/messages/serialization/bincode_processes/
message.rs1use nanoservices_utils::errors::{NanoServiceError, NanoServiceErrorStatus};
3use revision::Revisioned;
4use tokio::io::AsyncReadExt;
5use tokio::net::tcp::OwnedReadHalf;
6
7use crate::messages::serialization::header::MessageHeader;
8use crate::messages::server::wrapper::WrappedServerMessage;
9
10pub fn serialize_server_message(
18 wrapped_message: &WrappedServerMessage,
19) -> Result<Vec<u8>, NanoServiceError> {
20 let mut serialized_message = Vec::new();
21 wrapped_message.serialize_revisioned(&mut serialized_message).map_err(|e| {
22 NanoServiceError::new(
23 format!("Failed to serialize message metadata: {}", e),
24 NanoServiceErrorStatus::BadRequest,
25 )
26 })?;
27 let length = serialized_message.len();
28 let mut message_header = MessageHeader {
29 value: length,
30 }
31 .to_bytes();
32 message_header.extend(serialized_message);
33 Ok(message_header)
34}
35
36pub async fn deserialize_from_stream(
44 reader: &mut OwnedReadHalf,
45) -> Result<WrappedServerMessage, NanoServiceError> {
46 let mut header_bytes = [0u8; 8];
47 reader.read_exact(&mut header_bytes).await.map_err(|e| {
48 NanoServiceError::new(
49 format!("Failed to read message header: {}", e),
50 NanoServiceErrorStatus::BadRequest,
51 )
52 })?;
53 let message_header = MessageHeader::from_bytes(&header_bytes);
54 let mut message_bytes = vec![0u8; message_header.value];
55 reader.read_exact(&mut message_bytes).await.map_err(|e| {
56 NanoServiceError::new(
57 format!("Failed to read message header: {}", e),
58 NanoServiceErrorStatus::BadRequest,
59 )
60 })?;
61 let wrapped_message = WrappedServerMessage::deserialize_revisioned(
62 &mut message_bytes.as_slice(),
63 )
64 .map_err(|e| {
65 NanoServiceError::new(
66 format!("Failed to deserialize message metadata: {}", e),
67 NanoServiceErrorStatus::BadRequest,
68 )
69 })?;
70 Ok(wrapped_message)
71}
72
73#[cfg(test)]
74mod tests {
75
76 use crate::messages::server::interface::ServerMessage;
77
78 use super::*;
79 static CONNECTION_ID: &str = "1-1234567890";
80
81 #[test]
82 fn test_serialize_server_message() {
83 let wrapped_message =
84 WrappedServerMessage::new(2, ServerMessage::Ping(5), CONNECTION_ID.into());
85 let serialized = serialize_server_message(&wrapped_message).unwrap();
86 let message = &mut serialized.as_slice()[8..].to_owned();
87 let deserialized =
88 WrappedServerMessage::deserialize_revisioned(&mut message.as_slice()).unwrap();
89 assert_eq!(wrapped_message, deserialized);
90 }
91}