#[non_exhaustive]pub struct SyncFrame {
pub msg_type: SyncMessageType,
pub body: Vec<u8>,
}Expand description
Wire frame: wraps a message type + serialized body with format versioning and CRC32C integrity protection.
Layout: [version: 1B][msg_type: 1B][length: 4B LE][crc32c: 4B LE][body: N bytes]
Total header: 10 bytes.
Mirrors the WAL record header model: every frame carries a format version byte (enabling hard rejection of future incompatible formats) and a CRC32C checksum over the body for silent-corruption detection. There is no checksum-skip sentinel — CRC32C is always computed and always verified.
#[non_exhaustive] — additional header fields (e.g. compression flag,
session token) may be added without breaking downstream consumers.
Fields (Non-exhaustive)§
This struct is marked as non-exhaustive
Struct { .. } syntax; cannot be matched against without a wildcard ..; and struct update syntax will not work.msg_type: SyncMessageType§body: Vec<u8>Implementations§
Source§impl SyncFrame
impl SyncFrame
Sourcepub const FORMAT_VERSION: u8 = 1
pub const FORMAT_VERSION: u8 = 1
Current wire format version embedded in every frame header.
Sourcepub const HEADER_SIZE: usize = 10
pub const HEADER_SIZE: usize = 10
Total size of the frame header in bytes.
Layout: [version:1][msg_type:1][len:4 LE][crc32c:4 LE] = 10 bytes.
Sourcepub fn to_bytes(&self) -> Vec<u8> ⓘ
pub fn to_bytes(&self) -> Vec<u8> ⓘ
Serialize a frame to bytes.
Produces [FORMAT_VERSION][msg_type][body_len as u32 LE][crc32c(body) as u32 LE][body].
Sourcepub fn from_bytes(data: &[u8]) -> Option<Self>
pub fn from_bytes(data: &[u8]) -> Option<Self>
Deserialize a frame from bytes.
Returns None if:
- the buffer is shorter than
HEADER_SIZE, - the version byte does not match
FORMAT_VERSION(unknown future version), - the message type discriminant is unrecognised,
- the buffer is too short to contain the declared body length, or
- the CRC32C of the body does not match the header checksum (corrupt frame).
Sourcepub fn new_msgpack<T: ToMessagePack>(
msg_type: SyncMessageType,
value: &T,
) -> Option<Self>
pub fn new_msgpack<T: ToMessagePack>( msg_type: SyncMessageType, value: &T, ) -> Option<Self>
Create a frame with a MessagePack-serialized body.
Sourcepub fn try_encode<T: ToMessagePack>(
msg_type: SyncMessageType,
value: &T,
) -> Option<Self>
pub fn try_encode<T: ToMessagePack>( msg_type: SyncMessageType, value: &T, ) -> Option<Self>
Try to encode a value into a SyncFrame body.
Returns None and logs an error on serialization failure — callers
should propagate via ?. The protocol must never ship a frame
whose body did not serialize successfully.
Sourcepub fn decode_body<T: FromMessagePackOwned>(&self) -> Option<T>
pub fn decode_body<T: FromMessagePackOwned>(&self) -> Option<T>
Deserialize the body from MessagePack.
Trait Implementations§
Auto Trait Implementations§
impl Freeze for SyncFrame
impl RefUnwindSafe for SyncFrame
impl Send for SyncFrame
impl Sync for SyncFrame
impl Unpin for SyncFrame
impl UnsafeUnpin for SyncFrame
impl UnwindSafe for SyncFrame
Blanket Implementations§
Source§impl<T> ArchivePointee for T
impl<T> ArchivePointee for T
Source§type ArchivedMetadata = ()
type ArchivedMetadata = ()
Source§fn pointer_metadata(
_: &<T as ArchivePointee>::ArchivedMetadata,
) -> <T as Pointee>::Metadata
fn pointer_metadata( _: &<T as ArchivePointee>::ArchivedMetadata, ) -> <T as Pointee>::Metadata
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> LayoutRaw for T
impl<T> LayoutRaw for T
Source§fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>
fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>
Source§impl<T, N1, N2> Niching<NichedOption<T, N1>> for N2
impl<T, N1, N2> Niching<NichedOption<T, N1>> for N2
Source§unsafe fn is_niched(niched: *const NichedOption<T, N1>) -> bool
unsafe fn is_niched(niched: *const NichedOption<T, N1>) -> bool
Source§fn resolve_niched(out: Place<NichedOption<T, N1>>)
fn resolve_niched(out: Place<NichedOption<T, N1>>)
out indicating that a T is niched.impl<T> Read<Exclusive, BecauseExclusive> for Twhere
T: ?Sized,
Source§impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
Source§fn to_subset(&self) -> Option<SS>
fn to_subset(&self) -> Option<SS>
self from the equivalent element of its
superset. Read moreSource§fn is_in_subset(&self) -> bool
fn is_in_subset(&self) -> bool
self is actually part of its subset T (and can be converted to it).Source§fn to_subset_unchecked(&self) -> SS
fn to_subset_unchecked(&self) -> SS
self.to_subset but without any property checks. Always succeeds.Source§fn from_subset(element: &SS) -> SP
fn from_subset(element: &SS) -> SP
self to the equivalent element of its superset.