libkazv
client-model.hpp
Go to the documentation of this file.
1 /*
2  * This file is part of libkazv.
3  * SPDX-FileCopyrightText: 2020-2024 tusooa <tusooa@kazv.moe>
4  * SPDX-License-Identifier: AGPL-3.0-or-later
5  */
6 
7 
8 #pragma once
9 #include <libkazv-config.hpp>
10 
11 #include <tuple>
12 #include <variant>
13 #include <string>
14 #include <optional>
15 
16 #include <lager/context.hpp>
17 #include <boost/hana.hpp>
19 
20 
21 #include <csapi/sync.hpp>
22 
23 #include <file-desc.hpp>
24 #include <crypto.hpp>
25 
30 
31 #include "clientfwd.hpp"
32 #include "device-list-tracker.hpp"
33 #include "room/room-model.hpp"
34 
35 namespace Kazv
36 {
37  inline const std::string DEFTXNID{"0"};
38 
40  {
43  };
44 
46  {
50  };
51 
53  {
56  };
57 
58  struct ClientModel
59  {
60  std::string serverUrl;
61  std::string userId;
62  std::string token;
63  std::string deviceId;
64  bool loggedIn{false};
65 
66  bool syncing{false};
67  bool shouldSync{true};
68  int firstRetryMs{1000};
70  int maxRetryMs{30 * 1000};
71  int syncTimeoutMs{20000};
72  std::string initialSyncFilterId;
74  std::optional<std::string> syncToken;
75 
77  immer::map<std::string /* sender */, Event> presence;
78  immer::map<std::string /* type */, Event> accountData;
79 
80  std::string nextTxnId{DEFTXNID};
81  immer::flex_vector<BaseJob> nextJobs;
82  immer::flex_vector<KazvEvent> nextTriggers;
83 
85  std::optional<immer::box<Crypto>> crypto;
86  bool identityKeysUploaded{false};
87 
90 
91  immer::array<std::string /* version */> versions;
92 
93  immer::flex_vector<std::string /* deviceId */> devicesToSendKeys(std::string userId) const;
94 
97  void maybeRotateSessions(ClientModel oldClient);
98 
99  std::pair<Event, std::optional<std::string> /* sessionKey */>
100  megOlmEncrypt(Event e, std::string roomId, Timestamp timeMs, RandomData random);
101 
104  immer::map<std::string, immer::map<std::string, Event>> olmEncryptSplit(Event e, immer::map<std::string, immer::flex_vector<std::string>> userIdToDeviceIdMap, RandomData random);
105 
107  std::size_t numOneTimeKeysNeeded() const;
108 
110  auto directRoomMap() const -> immer::map<std::string, std::string>;
111 
112  auto roomIdsUnderTag(std::string tagId) const -> immer::map<std::string, double>;
113 
114  auto roomIdsByTagId() const -> immer::map<std::string, immer::map<std::string, double>>;
115 
119  const Crypto &constCrypto() const;
120 
124  template<class Func>
125  auto withCrypto(Func &&func) -> std::decay_t<std::invoke_result_t<Func &&, Crypto &>>
126  {
127  using ResT = std::decay_t<std::invoke_result_t<Func &&, Crypto &>>;
128  if constexpr (std::is_same_v<ResT, void>) {
129  crypto = std::move(crypto).value()
130  .update([f=std::forward<Func>(func)](Crypto c) mutable {
131  std::forward<Func>(f)(c);
132  return c;
133  });
134  } else {
135  std::optional<ResT> res;
136  crypto = std::move(crypto).value()
137  .update([f=std::forward<Func>(func), &res](Crypto c) mutable {
138  res = std::forward<Func>(f)(c);
139  return c;
140  });
141  return std::move(res).value();
142  }
143  }
144 
145  // helpers
146  template<class Job>
147  struct MakeJobT
148  {
149  template<class ...Args>
150  constexpr auto make(Args &&...args) const {
151  if constexpr (Job::needsAuth()) {
152  return Job(
153  serverUrl,
154  token,
155  std::forward<Args>(args)...);
156  } else {
157  return Job(
158  serverUrl,
159  std::forward<Args>(args)...);
160  }
161  }
162 
163  std::string serverUrl;
164  std::string token;
165  };
166 
167  template<class Job>
168  constexpr auto job() const {
169  return MakeJobT<Job>{serverUrl, token};
170  }
171 
172  inline void addJob(BaseJob j) {
173  nextJobs = std::move(nextJobs).push_back(std::move(j));
174  }
175 
176  inline auto popAllJobs() {
177  auto jobs = std::move(nextJobs);
178  nextJobs = DEFVAL;
179  return jobs;
180  };
181 
182  inline void addTrigger(KazvEvent t) {
183  addTriggers({t});
184  }
185 
186  inline void addTriggers(immer::flex_vector<KazvEvent> c) {
187  nextTriggers = std::move(nextTriggers) + c;
188  }
189 
190  inline auto popAllTriggers() {
191  auto triggers = std::move(nextTriggers);
193  return triggers;
194  }
195 
199 
200  static Result update(ClientModel m, Action a);
201  };
202 
203  // actions:
204  struct LoginAction {
205  std::string serverUrl;
206  std::string username;
207  std::string password;
208  std::optional<std::string> deviceName;
209  };
210 
212  {
213  std::string serverUrl;
214  std::string username;
215  std::string token;
216  std::string deviceId;
217  };
218 
219  struct LogoutAction {};
220  struct HardLogoutAction {};
221 
223  {
224  std::string userId;
225  };
226 
228  {
229  std::string serverUrl;
230  };
231 
232  struct SyncAction {};
233 
235  {
237  };
238 
240  {
241  std::string roomId;
243  std::string fromEventId;
244  std::optional<int> limit;
245  };
246 
248  {
249  std::string roomId;
251  std::optional<std::string> txnId{std::nullopt};
252  };
253 
255  {
256  std::string roomId;
258  };
259 
268  {
270  std::string roomId;
274  std::optional<std::string> txnId{std::nullopt};
275  };
276 
284  {
286  std::string roomId;
288  std::string txnId;
291  };
292 
294  {
295  std::string roomId;
296  std::string eventId;
297  std::optional<std::string> reason;
298  };
299 
301  {
305  std::optional<std::string> roomAliasName;
306  std::optional<std::string> name;
307  std::optional<std::string> topic;
308  immer::array<std::string> invite;
309  //immer::array<Invite3pid> invite3pid;
310  std::optional<std::string> roomVersion;
312  immer::array<Event> initialState;
313  std::optional<Preset> preset;
314  std::optional<bool> isDirect;
316  };
317 
319  {
320  std::string roomId;
321  };
322 
324  {
325  std::string roomId;
326  std::string type;
327  std::string stateKey;
328  };
329 
331  {
332  std::string roomId;
333  std::string userId;
334  };
335 
337  {
338  std::string roomId;
339  };
340 
342  {
343  std::string roomIdOrAlias;
344  immer::array<std::string> serverName;
345  };
346 
348  {
349  std::string roomId;
350  };
351 
353  {
354  std::string roomId;
355  };
356 
357  struct KickAction
358  {
359  std::string roomId;
360  std::string userId;
361  std::optional<std::string> reason;
362  };
363 
364  struct BanAction
365  {
366  std::string roomId;
367  std::string userId;
368  std::optional<std::string> reason;
369  };
370 
371  struct UnbanAction
372  {
373  std::string roomId;
374  std::string userId;
375  };
376 
378  {
379  std::string roomId;
381  };
382 
384  {
385  std::string roomId;
386  bool typing;
387  std::optional<int> timeoutMs;
388  };
389 
391  {
392  std::string roomId;
393  std::string eventId;
394  };
395 
397  {
398  std::string roomId;
399  std::string eventId;
400  };
401 
403  {
405  std::optional<std::string> filename;
406  std::optional<std::string> contentType;
407  std::string uploadId; // to be used by library users
408  };
409 
411  {
412  std::string mxcUri;
413  std::optional<FileDesc> downloadTo;
414  };
415 
417  {
418  std::string mxcUri;
419  int width;
420  int height;
421  std::optional<ThumbnailResizingMethod> method;
422  std::optional<bool> allowRemote;
423  std::optional<FileDesc> downloadTo;
424  };
425 
427  {
429  };
430 
432  {
434  };
435 
437  {
438  };
439 
441  {
443  };
444 
446  {
448  immer::map<std::string, immer::flex_vector<std::string>> devicesToSend;
449  std::optional<std::string> txnId{std::nullopt};
450  };
451 
458  {
460  immer::map<std::string, immer::map<std::string, Event>> userToDeviceToEventMap;
462  std::optional<std::string> txnId{std::nullopt};
463  };
464 
466  {
467  };
468 
477  {
480  static std::size_t randomSize(std::size_t numToGen);
482  std::size_t numToGen;
485  };
486 
488  {
490  };
491 
493  {
494  static std::size_t randomSize(immer::map<std::string, immer::flex_vector<std::string>> devicesToSend);
495  std::string roomId;
496  std::string sessionId;
497  std::string sessionKey;
498  immer::map<std::string, immer::flex_vector<std::string>> devicesToSend;
500  };
501 
521  {
522  static std::size_t maxRandomSize();
523  static std::size_t minRandomSize();
524 
526  std::string roomId;
535  };
536 
538  {
539  std::string userId;
540  std::string deviceId;
542  };
543 
545  {
547  };
548 
553  {
554  using UserIdToDeviceIdMap = immer::map<std::string, immer::flex_vector<std::string>>;
555  static std::size_t randomSize(UserIdToDeviceIdMap devices);
556 
558  std::string roomId;
566  };
567 
569  {
570  std::string userId;
571  };
572 
574  {
575  std::optional<std::string> avatarUrl;
576  };
577 
579  {
580  std::optional<std::string> displayName;
581  };
582 
583  template<class Archive>
584  void serialize(Archive &ar, ClientModel &m, std::uint32_t const version)
585  {
586  bool dummySyncing{false};
587  ar
588  & m.serverUrl
589  & m.userId
590  & m.token
591  & m.deviceId
592  & m.loggedIn
593 
594  & dummySyncing
595  & m.firstRetryMs
596  & m.retryTimeFactor
597  & m.maxRetryMs
598  & m.syncTimeoutMs
601  & m.syncToken
602 
603  & m.roomList
604  & m.presence
605  & m.accountData
606 
607  & m.nextTxnId
608 
609  & m.toDevice;
610  // version <= 1 uses std::optional<Crypto>
611  // while version >= 2 uses std::optional<immer::box<Crypto>>
612  if (version >= 2) {
613  ar & m.crypto;
614  } else {
615  if constexpr (typename Archive::is_loading()) {
616  std::optional<Crypto> crypto;
617  ar >> crypto;
618  if (crypto.has_value()) {
619  m.crypto = immer::box<Crypto>(std::move(crypto).value());
620  }
621  }
622  // otherwise is_saving, which will always use the latest version
623  // this is unreachable
624  }
625 
626  ar
628 
629  & m.deviceLists
630  ;
631 
632  if (version >= 1) { ar & m.trustLevelNeededToSendKeys; }
633  }
634 }
635 
636 BOOST_CLASS_VERSION(Kazv::ClientModel, 2)
Definition: basejob.hpp:77
Definition: crypto.hpp:36
Definition: context.hpp:205
Definition: event.hpp:21
Definition: file-desc.hpp:225
Definition: jsonwrap.hpp:23
Definition: location.hpp:10
std::variant< RoomListAction, LoginAction, TokenLoginAction, LogoutAction, HardLogoutAction, GetWellknownAction, GetVersionsAction, SyncAction, SetShouldSyncAction, PostInitialFiltersAction, SetAccountDataAction, PaginateTimelineAction, SendMessageAction, SendStateEventAction, SaveLocalEchoAction, UpdateLocalEchoStatusAction, RedactEventAction, CreateRoomAction, GetRoomStatesAction, GetStateEventAction, InviteToRoomAction, JoinRoomByIdAction, JoinRoomAction, LeaveRoomAction, ForgetRoomAction, KickAction, BanAction, UnbanAction, SetAccountDataPerRoomAction, ProcessResponseAction, SetTypingAction, PostReceiptAction, SetReadMarkerAction, UploadContentAction, DownloadContentAction, DownloadThumbnailAction, SendToDeviceMessageAction, SendMultipleToDeviceMessagesAction, UploadIdentityKeysAction, GenerateAndUploadOneTimeKeysAction, QueryKeysAction, ClaimKeysAction, EncryptMegOlmEventAction, SetDeviceTrustLevelAction, SetTrustLevelNeededToSendKeysAction, PrepareForSharingRoomKeyAction, GetUserProfileAction, SetAvatarUrlAction, SetDisplayNameAction, ResubmitJobAction > ClientAction
Definition: clientfwd.hpp:145
CreateRoomPreset
Definition: client-model.hpp:46
@ TrustedPrivateChat
Definition: client-model.hpp:49
@ PublicChat
Definition: client-model.hpp:48
@ PrivateChat
Definition: client-model.hpp:47
RoomVisibility
Definition: client-model.hpp:40
@ Public
Definition: client-model.hpp:42
@ Private
Definition: client-model.hpp:41
Effect< ClientAction, lager::deps<> > ClientEffect
Definition: clientfwd.hpp:147
DeviceTrustLevel
Definition: device-list-tracker.hpp:27
@ Unseen
Definition: device-list-tracker.hpp:29
std::string RandomData
Definition: crypto-util.hpp:34
std::variant< std::monostate, ReceivingPresenceEvent, ReceivingAccountDataEvent, ReceivingRoomTimelineEvent, ReceivingRoomStateEvent, RoomMembershipChanged, ReceivingRoomAccountDataEvent, ReceivingToDeviceMessage, LoginSuccessful, LoginFailed, SyncSuccessful, SyncFailed, PostInitialFiltersSuccessful, PostInitialFiltersFailed, PaginateSuccessful, PaginateFailed, CreateRoomSuccessful, CreateRoomFailed, InviteUserSuccessful, InviteUserFailed, JoinRoomSuccessful, JoinRoomFailed, LeaveRoomSuccessful, LeaveRoomFailed, ForgetRoomSuccessful, ForgetRoomFailed, SendMessageSuccessful, SendMessageFailed, SendToDeviceMessageSuccessful, SendToDeviceMessageFailed, InvalidMessageFormat, GetRoomStatesSuccessful, GetRoomStatesFailed, GetStateEventSuccessful, GetStateEventFailed, SendStateEventSuccessful, SendStateEventFailed, SetTypingSuccessful, SetTypingFailed, PostReceiptSuccessful, PostReceiptFailed, SetReadMarkerSuccessful, SetReadMarkerFailed, UploadContentSuccessful, UploadContentFailed, DownloadContentSuccessful, DownloadContentFailed, DownloadThumbnailSuccessful, DownloadThumbnailFailed, UploadIdentityKeysSuccessful, UploadIdentityKeysFailed, UploadOneTimeKeysSuccessful, UploadOneTimeKeysFailed, ClaimKeysSuccessful, ClaimKeysFailed, UnrecognizedResponse, ShouldQueryKeys > KazvEvent
Definition: kazvevents.hpp:390
const std::string DEFTXNID
Definition: client-model.hpp:37
std::int_fast64_t Timestamp
Definition: event.hpp:18
ThumbnailResizingMethod
Definition: client-model.hpp:53
@ Crop
Definition: client-model.hpp:54
@ Scale
Definition: client-model.hpp:55
constexpr detail::DefaultValT DEFVAL
Definition: types.hpp:125
std::pair< ClientModel, ClientEffect > ClientResult
Definition: clientfwd.hpp:149
immer::flex_vector< Event > EventList
Definition: types.hpp:107
void serialize(Archive &ar, ClientModel &m, std::uint32_t const version)
Definition: client-model.hpp:584
Definition: clientutil.hpp:217
Definition: client-model.hpp:365
std::optional< std::string > reason
Definition: client-model.hpp:368
std::string roomId
Definition: client-model.hpp:366
std::string userId
Definition: client-model.hpp:367
Definition: client-model.hpp:493
std::string roomId
Definition: client-model.hpp:495
immer::map< std::string, immer::flex_vector< std::string > > devicesToSend
Definition: client-model.hpp:498
RandomData random
Definition: client-model.hpp:499
static std::size_t randomSize(immer::map< std::string, immer::flex_vector< std::string >> devicesToSend)
Definition: client-model.cpp:299
std::string sessionId
Definition: client-model.hpp:496
std::string sessionKey
Definition: client-model.hpp:497
Definition: client-model.hpp:148
constexpr auto make(Args &&...args) const
Definition: client-model.hpp:150
std::string serverUrl
Definition: client-model.hpp:163
std::string token
Definition: client-model.hpp:164
Definition: client-model.hpp:59
auto popAllTriggers()
Definition: client-model.hpp:190
RoomListModel roomList
Definition: client-model.hpp:76
auto withCrypto(Func &&func) -> std::decay_t< std::invoke_result_t< Func &&, Crypto & >>
Do func with crypto, returning its return value.
Definition: client-model.hpp:125
std::string userId
Definition: client-model.hpp:61
int syncTimeoutMs
Definition: client-model.hpp:71
const Crypto & constCrypto() const
Get the const reference of crypto of this client.
Definition: client-model.cpp:421
immer::flex_vector< std::string > devicesToSendKeys(std::string userId) const
Definition: client-model.cpp:233
int firstRetryMs
Definition: client-model.hpp:68
DeviceListTracker deviceLists
Definition: client-model.hpp:88
bool identityKeysUploaded
Definition: client-model.hpp:86
int maxRetryMs
Definition: client-model.hpp:70
ClientAction Action
Definition: client-model.hpp:196
std::optional< immer::box< Crypto > > crypto
Definition: client-model.hpp:85
auto popAllJobs()
Definition: client-model.hpp:176
immer::map< std::string, Event > presence
Definition: client-model.hpp:77
std::size_t numOneTimeKeysNeeded() const
Definition: client-model.cpp:257
auto roomIdsByTagId() const -> immer::map< std::string, immer::map< std::string, double >>
Definition: client-model.cpp:401
std::string serverUrl
Definition: client-model.hpp:60
immer::map< std::string, Event > accountData
Definition: client-model.hpp:78
static Result update(ClientModel m, Action a)
Definition: client-model.cpp:40
bool shouldSync
Definition: client-model.hpp:67
void addTrigger(KazvEvent t)
Definition: client-model.hpp:182
std::string incrementalSyncFilterId
Definition: client-model.hpp:73
ClientResult Result
Definition: client-model.hpp:198
void addTriggers(immer::flex_vector< KazvEvent > c)
Definition: client-model.hpp:186
void addJob(BaseJob j)
Definition: client-model.hpp:172
immer::flex_vector< BaseJob > nextJobs
Definition: client-model.hpp:81
auto directRoomMap() const -> immer::map< std::string, std::string >
Definition: client-model.cpp:362
int retryTimeFactor
Definition: client-model.hpp:69
DeviceTrustLevel trustLevelNeededToSendKeys
Definition: client-model.hpp:89
void maybeRotateSessions(ClientModel oldClient)
rotate sessions for a room if there is a user in the room with devicesToSendKeys changes
Definition: client-model.cpp:307
std::string initialSyncFilterId
Definition: client-model.hpp:72
bool syncing
Definition: client-model.hpp:66
immer::flex_vector< KazvEvent > nextTriggers
Definition: client-model.hpp:82
std::string token
Definition: client-model.hpp:62
std::string nextTxnId
Definition: client-model.hpp:80
constexpr auto job() const
Definition: client-model.hpp:168
immer::array< std::string > versions
Definition: client-model.hpp:91
bool loggedIn
Definition: client-model.hpp:64
EventList toDevice
Definition: client-model.hpp:84
std::pair< Event, std::optional< std::string > > megOlmEncrypt(Event e, std::string roomId, Timestamp timeMs, RandomData random)
Definition: client-model.cpp:125
immer::map< std::string, immer::map< std::string, Event > > olmEncryptSplit(Event e, immer::map< std::string, immer::flex_vector< std::string >> userIdToDeviceIdMap, RandomData random)
precondition: the one-time keys for those devices must already be claimed
Definition: client-model.cpp:177
auto roomIdsUnderTag(std::string tagId) const -> immer::map< std::string, double >
Definition: client-model.cpp:385
std::optional< std::string > syncToken
Definition: client-model.hpp:74
std::string deviceId
Definition: client-model.hpp:63
Definition: client-model.hpp:301
std::optional< std::string > name
Definition: client-model.hpp:306
JsonWrap creationContent
Definition: client-model.hpp:311
immer::array< std::string > invite
Definition: client-model.hpp:308
std::optional< Preset > preset
Definition: client-model.hpp:313
std::optional< std::string > roomVersion
Definition: client-model.hpp:310
std::optional< std::string > roomAliasName
Definition: client-model.hpp:305
std::optional< bool > isDirect
Definition: client-model.hpp:314
JsonWrap powerLevelContentOverride
Definition: client-model.hpp:315
Visibility visibility
Definition: client-model.hpp:304
immer::array< Event > initialState
Definition: client-model.hpp:312
std::optional< std::string > topic
Definition: client-model.hpp:307
Definition: device-list-tracker.hpp:59
Definition: client-model.hpp:411
std::string mxcUri
Definition: client-model.hpp:412
std::optional< FileDesc > downloadTo
Definition: client-model.hpp:413
Definition: client-model.hpp:417
std::string mxcUri
Definition: client-model.hpp:418
std::optional< FileDesc > downloadTo
Definition: client-model.hpp:423
std::optional< ThumbnailResizingMethod > method
Definition: client-model.hpp:421
std::optional< bool > allowRemote
Definition: client-model.hpp:422
int width
Definition: client-model.hpp:419
int height
Definition: client-model.hpp:420
The action to encrypt an megolm event for a room.
Definition: client-model.hpp:521
static std::size_t maxRandomSize()
Definition: client-model.cpp:276
static std::size_t minRandomSize()
Definition: client-model.cpp:281
Event e
The event to encrypt.
Definition: client-model.hpp:528
RandomData random
Random data for the operation.
Definition: client-model.hpp:534
Timestamp timeMs
The timestamp, to determine whether the session should expire.
Definition: client-model.hpp:530
std::string roomId
The id of the room to encrypt for.
Definition: client-model.hpp:526
Definition: client-model.hpp:353
std::string roomId
Definition: client-model.hpp:354
The action to generate one-time keys.
Definition: client-model.hpp:477
static std::size_t randomSize(std::size_t numToGen)
Definition: client-model.cpp:294
RandomData random
The random data used to generate keys.
Definition: client-model.hpp:484
std::size_t numToGen
The number of keys to generate.
Definition: client-model.hpp:482
Definition: client-model.hpp:319
std::string roomId
Definition: client-model.hpp:320
Definition: client-model.hpp:324
std::string stateKey
Definition: client-model.hpp:327
std::string type
Definition: client-model.hpp:326
std::string roomId
Definition: client-model.hpp:325
Definition: client-model.hpp:569
std::string userId
Definition: client-model.hpp:570
Definition: client-model.hpp:228
std::string serverUrl
Definition: client-model.hpp:229
Definition: client-model.hpp:223
std::string userId
Definition: client-model.hpp:224
Definition: client-model.hpp:220
Definition: client-model.hpp:331
std::string userId
Definition: client-model.hpp:333
std::string roomId
Definition: client-model.hpp:332
Definition: client-model.hpp:342
immer::array< std::string > serverName
Definition: client-model.hpp:344
std::string roomIdOrAlias
Definition: client-model.hpp:343
Definition: client-model.hpp:337
std::string roomId
Definition: client-model.hpp:338
Definition: client-model.hpp:358
std::string roomId
Definition: client-model.hpp:359
std::string userId
Definition: client-model.hpp:360
std::optional< std::string > reason
Definition: client-model.hpp:361
Definition: client-model.hpp:348
std::string roomId
Definition: client-model.hpp:349
Status
Definition: local-echo.hpp:21
Definition: client-model.hpp:204
std::string password
Definition: client-model.hpp:207
std::string serverUrl
Definition: client-model.hpp:205
std::string username
Definition: client-model.hpp:206
std::optional< std::string > deviceName
Definition: client-model.hpp:208
Definition: client-model.hpp:219
Definition: client-model.hpp:240
std::string fromEventId
Must be where the Gap is.
Definition: client-model.hpp:243
std::optional< int > limit
Definition: client-model.hpp:244
std::string roomId
Definition: client-model.hpp:241
Definition: client-model.hpp:437
Definition: client-model.hpp:391
std::string eventId
Definition: client-model.hpp:393
std::string roomId
Definition: client-model.hpp:392
Encrypt room key as olm and add it to the room's pending keyshare slots.
Definition: client-model.hpp:553
immer::map< std::string, immer::flex_vector< std::string > > UserIdToDeviceIdMap
Definition: client-model.hpp:554
Event e
The key event to encrypt.
Definition: client-model.hpp:562
UserIdToDeviceIdMap devices
Devices to encrypt for.
Definition: client-model.hpp:560
std::string roomId
The room to share the key event in.
Definition: client-model.hpp:558
RandomData random
The random data for the encryption.
Definition: client-model.hpp:565
static std::size_t randomSize(UserIdToDeviceIdMap devices)
Definition: client-model.cpp:286
Definition: client-model.hpp:432
Response response
Definition: client-model.hpp:433
Definition: client-model.hpp:488
bool isInitialSync
Definition: client-model.hpp:489
Definition: client-model.hpp:294
std::string eventId
Definition: client-model.hpp:296
std::optional< std::string > reason
Definition: client-model.hpp:297
std::string roomId
Definition: client-model.hpp:295
Definition: basejob.hpp:50
Definition: client-model.hpp:427
BaseJob job
Definition: client-model.hpp:428
Definition: room-model.hpp:398
Saves an local echo.
Definition: client-model.hpp:268
std::string roomId
The room id.
Definition: client-model.hpp:270
std::optional< std::string > txnId
The chosen txnId for this event. If not specified, generate from the current ClientModel.
Definition: client-model.hpp:274
Event event
The event to send.
Definition: client-model.hpp:272
Definition: client-model.hpp:248
std::optional< std::string > txnId
Definition: client-model.hpp:251
std::string roomId
Definition: client-model.hpp:249
Event event
Definition: client-model.hpp:250
Send multiple to device messages.
Definition: client-model.hpp:458
std::optional< std::string > txnId
An optional transaction id. Will be generated if not provided.
Definition: client-model.hpp:462
immer::map< std::string, immer::map< std::string, Event > > userToDeviceToEventMap
A map from user id to device id to the event.
Definition: client-model.hpp:460
Definition: client-model.hpp:255
Event event
Definition: client-model.hpp:257
std::string roomId
Definition: client-model.hpp:256
Definition: client-model.hpp:446
immer::map< std::string, immer::flex_vector< std::string > > devicesToSend
Definition: client-model.hpp:448
std::optional< std::string > txnId
Definition: client-model.hpp:449
Event event
Definition: client-model.hpp:447
Definition: client-model.hpp:441
Event accountDataEvent
Definition: client-model.hpp:442
Definition: client-model.hpp:378
std::string roomId
Definition: client-model.hpp:379
Event accountDataEvent
Definition: client-model.hpp:380
Definition: client-model.hpp:574
std::optional< std::string > avatarUrl
Definition: client-model.hpp:575
Definition: client-model.hpp:538
std::string userId
Definition: client-model.hpp:539
DeviceTrustLevel trustLevel
Definition: client-model.hpp:541
std::string deviceId
Definition: client-model.hpp:540
Definition: client-model.hpp:579
std::optional< std::string > displayName
Definition: client-model.hpp:580
Definition: client-model.hpp:397
std::string eventId
Definition: client-model.hpp:399
std::string roomId
Definition: client-model.hpp:398
Definition: client-model.hpp:235
bool shouldSync
Definition: client-model.hpp:236
Definition: client-model.hpp:545
DeviceTrustLevel trustLevel
Definition: client-model.hpp:546
Definition: client-model.hpp:384
bool typing
Definition: client-model.hpp:386
std::optional< int > timeoutMs
Definition: client-model.hpp:387
std::string roomId
Definition: client-model.hpp:385
Definition: client-model.hpp:232
Definition: client-model.hpp:212
std::string username
Definition: client-model.hpp:214
std::string serverUrl
Definition: client-model.hpp:213
std::string deviceId
Definition: client-model.hpp:216
std::string token
Definition: client-model.hpp:215
Definition: client-model.hpp:372
std::string roomId
Definition: client-model.hpp:373
std::string userId
Definition: client-model.hpp:374
Updates the status of an local echo.
Definition: client-model.hpp:284
std::string roomId
The room id.
Definition: client-model.hpp:286
LocalEchoDesc::Status status
The updated status of this local echo.
Definition: client-model.hpp:290
std::string txnId
The chosen txnId for this event.
Definition: client-model.hpp:288
Definition: client-model.hpp:403
std::string uploadId
Definition: client-model.hpp:407
std::optional< std::string > contentType
Definition: client-model.hpp:406
std::optional< std::string > filename
Definition: client-model.hpp:405
FileDesc content
Definition: client-model.hpp:404
Definition: client-model.hpp:466