1use web_time::SystemTime;
2
3use crate::{
4 BinPtr, EventId, ObjectId, Query, QueryId, Session, SessionRef, SessionToken, TypeId,
5 Updatedness,
6};
7use std::{
8 collections::{BTreeMap, HashMap, HashSet},
9 sync::Arc,
10};
11
12#[derive(
13 Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd, serde::Deserialize, serde::Serialize,
14)]
15pub struct RequestId(pub u64);
16
17#[derive(Debug, serde::Deserialize, serde::Serialize)]
19pub struct ClientMessage {
20 pub request_id: RequestId,
21 pub request: Arc<Request>,
22}
23
24#[derive(Debug, serde::Deserialize, serde::Serialize)]
25pub enum Request {
26 SetToken(SessionToken),
27 RenameSession(String),
28 CurrentSession,
29 ListSessions,
30 Logout,
31 DisconnectSession(SessionRef),
32 GetTime,
33 Get {
35 object_ids: HashMap<ObjectId, Option<Updatedness>>,
36 subscribe: bool,
37 },
38 AlreadyHave {
39 object_ids: HashMap<ObjectId, Updatedness>,
40 },
41 Query {
42 query_id: QueryId,
43 type_id: TypeId,
44 query: Arc<Query>,
45 only_updated_since: Option<Updatedness>,
46 subscribe: bool,
47 },
48 GetBinaries(HashSet<BinPtr>),
49 Unsubscribe(HashSet<ObjectId>),
50 UnsubscribeQuery(QueryId),
51 Upload(Upload),
52 UploadBinaries(usize), }
54
55#[derive(Clone, Debug, serde::Deserialize, serde::Serialize)]
56pub enum Upload {
57 Object {
58 object_id: ObjectId,
59 type_id: TypeId,
60 created_at: EventId,
61 snapshot_version: i32,
62 object: Arc<serde_json::Value>,
63 subscribe: bool,
64 },
65 Event {
66 object_id: ObjectId,
67 type_id: TypeId,
68 event_id: EventId,
69 event: Arc<serde_json::Value>,
70 subscribe: bool,
71 },
72}
73
74#[derive(Debug, serde::Deserialize, serde::Serialize)]
85pub enum ServerMessage {
86 Response {
87 request_id: RequestId,
88 response: ResponsePart,
89 last_response: bool,
90 },
91 Updates(Updates),
92}
93
94#[derive(Debug, serde::Deserialize, serde::Serialize)]
95pub struct Updates {
96 pub data: Vec<Arc<Update>>,
97 pub now_have_all_until: Updatedness,
99}
100
101#[derive(Debug, serde::Deserialize, serde::Serialize)]
102pub enum ResponsePart {
103 Success,
104 Error(crate::SerializableError),
105 Sessions(Vec<Session>),
106 CurrentTime(SystemTime),
107 Objects {
108 data: Vec<MaybeObject>,
109 now_have_all_until: Option<Updatedness>,
116 },
117 Binaries(usize),
118 }
121
122#[derive(Debug, serde::Deserialize, serde::Serialize)]
123pub enum MaybeObject {
124 AlreadySubscribed(ObjectId),
125 NotYetSubscribed(ObjectData),
126}
127
128#[derive(Debug, serde::Deserialize, serde::Serialize)]
129pub struct ObjectData {
130 pub object_id: ObjectId,
131 pub type_id: TypeId,
132 pub creation_snapshot: Option<(EventId, i32, Arc<serde_json::Value>)>,
135 pub events: BTreeMap<EventId, Arc<serde_json::Value>>,
136 pub now_have_all_until: Updatedness,
137}
138
139impl ObjectData {
140 pub fn into_updates(self) -> Vec<Arc<Update>> {
141 let mut res =
142 Vec::with_capacity(self.events.len() + self.creation_snapshot.is_some() as usize);
143 if let Some((created_at, snapshot_version, data)) = self.creation_snapshot {
144 res.push(Arc::new(Update {
145 object_id: self.object_id,
146 data: UpdateData::Creation {
147 type_id: self.type_id,
148 created_at,
149 snapshot_version,
150 data,
151 },
152 }));
153 }
154 for (event_id, data) in self.events.into_iter() {
155 res.push(Arc::new(Update {
156 object_id: self.object_id,
157 data: UpdateData::Event {
158 type_id: self.type_id,
159 event_id,
160 data,
161 },
162 }));
163 }
164 res
165 }
166}
167
168#[derive(Debug, serde::Deserialize, serde::Serialize)]
169pub struct Update {
170 pub object_id: ObjectId,
171 pub data: UpdateData,
172}
173
174#[derive(Debug, serde::Deserialize, serde::Serialize)]
175pub enum UpdateData {
176 Creation {
178 type_id: TypeId,
179 created_at: EventId,
180 snapshot_version: i32,
181 data: Arc<serde_json::Value>,
182 },
183 Event {
184 type_id: TypeId,
185 event_id: EventId,
186 data: Arc<serde_json::Value>,
187 },
188 LostReadRights,
189}