nodedb_types/sync/wire/
shape.rs1use std::collections::HashMap;
6
7use serde::{Deserialize, Serialize};
8
9use crate::sync::shape::ShapeDefinition;
10
11#[derive(
13 Debug, Clone, Serialize, Deserialize, zerompk::ToMessagePack, zerompk::FromMessagePack,
14)]
15pub struct ShapeSubscribeMsg {
16 pub shape: ShapeDefinition,
18}
19
20#[derive(
22 Debug, Clone, Serialize, Deserialize, zerompk::ToMessagePack, zerompk::FromMessagePack,
23)]
24pub struct ShapeSnapshotMsg {
25 pub shape_id: String,
27 pub data: Vec<u8>,
29 pub snapshot_lsn: u64,
31 pub doc_count: usize,
33}
34
35#[derive(
37 Debug, Clone, Serialize, Deserialize, zerompk::ToMessagePack, zerompk::FromMessagePack,
38)]
39pub struct ShapeDeltaMsg {
40 pub shape_id: String,
42 pub collection: String,
44 pub document_id: String,
46 pub operation: String,
48 pub delta: Vec<u8>,
50 pub lsn: u64,
52}
53
54#[derive(
56 Debug, Clone, Serialize, Deserialize, zerompk::ToMessagePack, zerompk::FromMessagePack,
57)]
58pub struct ShapeUnsubscribeMsg {
59 pub shape_id: String,
60}
61
62#[derive(
64 Debug, Clone, Serialize, Deserialize, zerompk::ToMessagePack, zerompk::FromMessagePack,
65)]
66pub struct VectorClockSyncMsg {
67 pub clocks: HashMap<String, u64>,
69 pub sender_id: u64,
71}
72
73#[cfg(test)]
74mod tests {
75 use super::*;
76 use crate::sync::shape::ShapeType;
77 use crate::sync::wire::{SyncFrame, SyncMessageType};
78
79 #[test]
80 fn shape_subscribe_roundtrip() {
81 let msg = ShapeSubscribeMsg {
82 shape: ShapeDefinition {
83 shape_id: "s1".into(),
84 tenant_id: 1,
85 shape_type: ShapeType::Vector {
86 collection: "embeddings".into(),
87 field_name: None,
88 },
89 description: "all embeddings".into(),
90 field_filter: vec![],
91 },
92 };
93 let frame = SyncFrame::new_msgpack(SyncMessageType::ShapeSubscribe, &msg).unwrap();
94 let decoded: ShapeSubscribeMsg = SyncFrame::from_bytes(&frame.to_bytes())
95 .unwrap()
96 .decode_body()
97 .unwrap();
98 assert_eq!(decoded.shape.shape_id, "s1");
99 }
100}