sparkles_core/protocol/
packets.rs1use 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 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}