1#![doc = include_str!("../README.md")]
16
17use std::io;
18
19use bincode::Options;
20
21#[cfg(test)]
22mod tests;
23
24mod duplex;
25mod read;
26mod write;
27
28pub use duplex::*;
29pub use read::*;
30pub use write::*;
31
32pub(crate) const U16_MARKER: u8 = 252;
33pub(crate) const U32_MARKER: u8 = 253;
34pub(crate) const U64_MARKER: u8 = 254;
35pub(crate) const ZST_MARKER: u8 = 255;
36
37pub(crate) const CHECKSUM_ENABLED: u8 = 2;
39pub(crate) const CHECKSUM_DISABLED: u8 = 3;
40
41pub(crate) const PROTOCOL_VERSION: u64 = 2;
43
44#[derive(Debug, thiserror::Error)]
46pub enum Error {
47 #[error("io error {0}")]
49 Io(#[from] io::Error),
50 #[error("bincode serialization/deserialization error {0}")]
52 Bincode(#[from] bincode::Error),
53 #[error("message sent exceeded configured length limit")]
55 SentMessageTooLarge,
56 #[error("message received exceeded configured length limit, terminating connection")]
58 ReceivedMessageTooLarge,
59 #[error("checksum mismatch, data corrupted or there was a protocol mismatch")]
62 ChecksumMismatch {
63 sent_checksum: u64,
64 computed_checksum: u64,
65 },
66 #[error("the peer is using an incompatible protocol version. Our version {our_version}, Their version {their_version}")]
68 ProtocolVersionMismatch {
69 our_version: u64,
70 their_version: u64,
71 },
72 #[error("checksum handshake failed, expected {CHECKSUM_ENABLED} or {CHECKSUM_DISABLED}, got {checksum_value}")]
74 ChecksumHandshakeFailed { checksum_value: u8 },
75}
76
77#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
78pub enum ChecksumEnabled {
79 Yes,
80 No,
81}
82
83impl From<bool> for ChecksumEnabled {
84 fn from(value: bool) -> Self {
85 if value {
86 ChecksumEnabled::Yes
87 } else {
88 ChecksumEnabled::No
89 }
90 }
91}
92
93impl From<ChecksumEnabled> for bool {
94 fn from(value: ChecksumEnabled) -> Self {
95 value == ChecksumEnabled::Yes
96 }
97}
98
99impl From<ChecksumEnabled> for ChecksumReadState {
100 fn from(value: ChecksumEnabled) -> Self {
101 match value {
102 ChecksumEnabled::Yes => ChecksumReadState::Yes,
103 ChecksumEnabled::No => ChecksumReadState::No,
104 }
105 }
106}
107
108fn bincode_options(size_limit: u64) -> impl Options {
109 bincode::DefaultOptions::new()
112 .with_limit(size_limit)
113 .with_little_endian()
114 .with_varint_encoding()
115 .reject_trailing_bytes()
116}