surrealcs_kernel/messages/serialization/bincode_processes/
message.rs

1//! Defines the functions performing serialization and deserialization of messages using bincode.
2use 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
10/// Serializes a server message into bytes using bincode.
11///
12/// # Arguments
13/// * `wrapped_message`: the message to be serialized
14///
15/// # Returns
16/// a vector of bytes representing the serialized message
17pub 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
36/// Deserializes a server message from a stream of bytes.
37///
38/// # Arguments
39/// * `reader`: the stream of bytes to be deserialized
40///
41/// # Returns
42/// the deserialized server message
43pub 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}