Skip to main content

nodedb_types/sync/wire/
shape.rs

1//! Shape subscribe/snapshot/delta/unsubscribe + vector clock sync messages.
2
3use std::collections::HashMap;
4
5use serde::{Deserialize, Serialize};
6
7use crate::sync::shape::ShapeDefinition;
8
9/// Shape subscribe request (client → server, 0x20).
10#[derive(
11    Debug, Clone, Serialize, Deserialize, zerompk::ToMessagePack, zerompk::FromMessagePack,
12)]
13pub struct ShapeSubscribeMsg {
14    /// Shape definition to subscribe to.
15    pub shape: ShapeDefinition,
16}
17
18/// Shape snapshot response (server → client, 0x21).
19#[derive(
20    Debug, Clone, Serialize, Deserialize, zerompk::ToMessagePack, zerompk::FromMessagePack,
21)]
22pub struct ShapeSnapshotMsg {
23    /// Shape ID this snapshot belongs to.
24    pub shape_id: String,
25    /// Initial dataset: serialized document rows matching the shape.
26    pub data: Vec<u8>,
27    /// LSN at snapshot time — deltas after this LSN will follow.
28    pub snapshot_lsn: u64,
29    /// Number of documents in the snapshot.
30    pub doc_count: usize,
31}
32
33/// Shape delta message (server → client, 0x22).
34#[derive(
35    Debug, Clone, Serialize, Deserialize, zerompk::ToMessagePack, zerompk::FromMessagePack,
36)]
37pub struct ShapeDeltaMsg {
38    /// Shape ID this delta applies to.
39    pub shape_id: String,
40    /// Collection affected.
41    pub collection: String,
42    /// Document ID affected.
43    pub document_id: String,
44    /// Operation type: "INSERT", "UPDATE", "DELETE".
45    pub operation: String,
46    /// Delta payload (CRDT delta bytes or document value).
47    pub delta: Vec<u8>,
48    /// WAL LSN of this mutation.
49    pub lsn: u64,
50}
51
52/// Shape unsubscribe request (client → server, 0x23).
53#[derive(
54    Debug, Clone, Serialize, Deserialize, zerompk::ToMessagePack, zerompk::FromMessagePack,
55)]
56pub struct ShapeUnsubscribeMsg {
57    pub shape_id: String,
58}
59
60/// Vector clock sync message (bidirectional, 0x30).
61#[derive(
62    Debug, Clone, Serialize, Deserialize, zerompk::ToMessagePack, zerompk::FromMessagePack,
63)]
64pub struct VectorClockSyncMsg {
65    /// Per-collection clock: `{ collection: max_lsn }`.
66    pub clocks: HashMap<String, u64>,
67    /// Sender's node/peer ID.
68    pub sender_id: u64,
69}