Skip to main content

kalamdb_commons/
websocket_protocol.rs

1use serde::{Deserialize, Serialize};
2
3/// Wire-format serialization type negotiated during authentication.
4#[derive(Debug, Clone, Copy, PartialEq, Eq, Default, Serialize, Deserialize)]
5#[serde(rename_all = "snake_case")]
6pub enum SerializationType {
7    /// JSON text frames (default, backward-compatible).
8    #[default]
9    Json,
10    /// MessagePack binary frames.
11    #[serde(rename = "msgpack")]
12    MessagePack,
13}
14
15/// Wire-format compression negotiated during authentication.
16#[derive(Debug, Clone, Copy, PartialEq, Eq, Default, Serialize, Deserialize)]
17#[serde(rename_all = "snake_case")]
18pub enum CompressionType {
19    /// No compression.
20    None,
21    /// Gzip compression for payloads above threshold (default).
22    #[default]
23    Gzip,
24}
25
26/// Protocol options negotiated once per connection during authentication.
27#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
28pub struct ProtocolOptions {
29    /// Serialization format for messages after auth.
30    pub serialization: SerializationType,
31    /// Compression policy.
32    pub compression: CompressionType,
33}
34
35impl Default for ProtocolOptions {
36    fn default() -> Self {
37        Self {
38            serialization: SerializationType::Json,
39            compression: CompressionType::Gzip,
40        }
41    }
42}
43
44#[cfg(test)]
45mod tests {
46    use super::*;
47
48    #[test]
49    fn test_serialization_type_json_roundtrip() {
50        let ser = SerializationType::Json;
51        let json = serde_json::to_string(&ser).unwrap();
52        assert_eq!(json, "\"json\"");
53        let parsed: SerializationType = serde_json::from_str(&json).unwrap();
54        assert_eq!(parsed, SerializationType::Json);
55    }
56
57    #[test]
58    fn test_serialization_type_msgpack_roundtrip() {
59        let ser = SerializationType::MessagePack;
60        let json = serde_json::to_string(&ser).unwrap();
61        assert_eq!(json, "\"msgpack\"");
62        let parsed: SerializationType = serde_json::from_str(&json).unwrap();
63        assert_eq!(parsed, SerializationType::MessagePack);
64    }
65
66    #[test]
67    fn test_protocol_options_default() {
68        let opts = ProtocolOptions::default();
69        assert_eq!(opts.serialization, SerializationType::Json);
70        assert_eq!(opts.compression, CompressionType::Gzip);
71    }
72
73    #[test]
74    fn test_protocol_options_roundtrip() {
75        let opts = ProtocolOptions {
76            serialization: SerializationType::MessagePack,
77            compression: CompressionType::None,
78        };
79        let json = serde_json::to_string(&opts).unwrap();
80        let parsed: ProtocolOptions = serde_json::from_str(&json).unwrap();
81        assert_eq!(parsed, opts);
82    }
83}