sparkles_core/protocol/
packets.rs

1use sha2_const_stable::Sha256;
2use crate::protocol::headers::{LocalPacketHeader, SparklesMachineInfo};
3use crate::protocol::sender::Sender;
4
5#[derive(Copy, Clone, Debug, PartialEq)]
6#[repr(u8)]
7pub enum PacketType {
8    MachineInfo,
9    DataBytes,
10    FailedPages,
11    TimestampFreq,
12    GracefulShutdown,
13    ConnectionAccepted,
14}
15
16impl PacketType {
17    /// This string is used to calculate hash of the packet type
18    pub const fn get_str(&self) -> &str {
19        match self {
20            PacketType::MachineInfo => "MachineInfo",
21            PacketType::DataBytes => "DataBytes",
22            PacketType::FailedPages => "FailedPages",
23            PacketType::TimestampFreq => "TimestampFreq",
24            PacketType::GracefulShutdown => "GracefulShutdown",
25            PacketType::ConnectionAccepted => "ConnectionAccepted",
26        }
27    }
28    pub const fn pattern(&self) -> [u8; 32] {
29        let str = self.get_str();
30        Sha256::new().update(str.as_bytes()).finalize()
31    }
32    
33    pub fn try_from_pattern(pattern: &[u8]) -> Option<Self> {
34        if pattern == Self::MachineInfo.pattern() {
35            Some(Self::MachineInfo)
36        }
37        else if pattern == Self::DataBytes.pattern() {
38            Some(Self::DataBytes)
39        }
40        else if pattern == Self::FailedPages.pattern() {
41            Some(Self::FailedPages)
42        }
43        else if pattern == Self::TimestampFreq.pattern() {
44            Some(Self::TimestampFreq)
45        }
46        else if pattern == Self::GracefulShutdown.pattern() {
47            Some(Self::GracefulShutdown)
48        }
49        else if pattern == Self::ConnectionAccepted.pattern() {
50            Some(Self::ConnectionAccepted)
51        }
52        else {
53            None
54        }
55    }
56}
57
58#[derive(Copy, Clone, Debug)]
59#[repr(u8)]
60pub enum RequestPacketType {
61    Subscribe,
62}
63impl RequestPacketType {
64    pub const fn get_str(&self) -> &str {
65        match self {
66            RequestPacketType::Subscribe => "Subscribe",
67        }
68    }
69    pub const fn pattern(&self) -> [u8; 32] {
70        let str = self.get_str();
71        Sha256::new().update(str.as_bytes()).finalize()
72    }
73}
74pub fn send_machine_info(sender: &mut impl Sender, sparkles_encoder_info: SparklesMachineInfo) {
75    let encoded_info = bincode::encode_to_vec(&sparkles_encoder_info, bincode::config::standard()).unwrap();
76    sender.send_packet(PacketType::MachineInfo, &[&encoded_info]);
77}
78pub fn send_trace_data(sender: &mut impl Sender, slice1: &[u8], slice2: &[u8]) {
79    sender.send_packet(PacketType::DataBytes, &[slice1, slice2]);
80}
81
82pub fn send_failed_pages(sender: &mut impl Sender, failed_pages: &[LocalPacketHeader]) {
83    let header = bincode::encode_to_vec(failed_pages, bincode::config::standard()).unwrap();
84    sender.send_packet(PacketType::FailedPages, &[&header]);
85}
86pub fn send_timestamp_freq(sender: &mut impl Sender, ticks_per_sec: u64, cur_tm: u64) {
87    let freq_bytes = ticks_per_sec.to_be_bytes();
88    let tm_bytes = cur_tm.to_be_bytes();
89    sender.send_packet(PacketType::TimestampFreq, &[&freq_bytes, &tm_bytes]);
90}
91pub fn send_graceful_shutdown(sender: &mut impl Sender) {
92    sender.send_packet(PacketType::GracefulShutdown, &[]);
93}