rust-sdk: Change the sync receiving API to make it a bit more type safe
This commit is contained in:
parent
a557c05890
commit
0b9be11d85
|
@ -9,7 +9,6 @@ crate-type = ["cdylib", "lib"]
|
|||
name = "matrix_crypto"
|
||||
|
||||
[dependencies]
|
||||
matrix-sdk-crypto = { git = "https://github.com/matrix-org/matrix-rust-sdk/", features = ["sled_cryptostore"] }
|
||||
matrix-sdk-common = { git = "https://github.com/matrix-org/matrix-rust-sdk/"}
|
||||
futures = { version = "0.3.12", default_features = false, features = ["executor"] }
|
||||
tokio = { version = "1.1.1", default_features = false, features = ["rt-multi-thread", "time"] }
|
||||
|
@ -18,6 +17,16 @@ thiserror = "1.0.23"
|
|||
http = "0.2.3"
|
||||
uniffi = "0.7.0"
|
||||
|
||||
[dependencies.matrix-sdk-crypto]
|
||||
git = "https://github.com/matrix-org/matrix-rust-sdk/"
|
||||
features = ["sled_cryptostore"]
|
||||
|
||||
[dependencies.ruma]
|
||||
version = "0.0.2"
|
||||
git = "https://github.com/ruma/ruma"
|
||||
rev = "d6aa37c848b7f682a98c25b346899e284ffc6df7"
|
||||
features = ["client-api", "compat", "unstable-pre-spec", "unstable-exhaustive-types"]
|
||||
|
||||
[build-dependencies]
|
||||
uniffi_build = "0.7.0"
|
||||
|
||||
|
|
|
@ -1,17 +1,18 @@
|
|||
use std::{collections::HashMap, convert::TryFrom, time::Duration};
|
||||
|
||||
use futures::{
|
||||
executor::block_on,
|
||||
future::{abortable, AbortHandle, Aborted},
|
||||
Future,
|
||||
use std::{
|
||||
collections::{BTreeMap, HashMap},
|
||||
convert::TryFrom,
|
||||
time::Duration,
|
||||
};
|
||||
use http::Response;
|
||||
|
||||
use futures::executor::block_on;
|
||||
use tokio::{runtime::Runtime, time::sleep};
|
||||
|
||||
use matrix_sdk_common::{
|
||||
api::r0::sync::sync_events::Response as SyncResponse,
|
||||
api::r0::to_device::send_event_to_device::METADATA,
|
||||
identifiers::{Error as RumaIdentifierError, UserId},
|
||||
api::r0::sync::sync_events::{
|
||||
DeviceLists as RumaDeviceLists, ToDevice,
|
||||
},
|
||||
identifiers::{DeviceKeyAlgorithm, Error as RumaIdentifierError, UserId},
|
||||
UInt,
|
||||
};
|
||||
use matrix_sdk_crypto::{
|
||||
store::CryptoStoreError as InnerStoreError, OlmMachine as InnerMachine, ToDeviceRequest,
|
||||
|
@ -22,6 +23,28 @@ pub struct OlmMachine {
|
|||
runtime: Runtime,
|
||||
}
|
||||
|
||||
pub struct DeviceLists {
|
||||
pub changed: Vec<String>,
|
||||
pub left: Vec<String>,
|
||||
}
|
||||
|
||||
impl Into<RumaDeviceLists> for DeviceLists {
|
||||
fn into(self) -> RumaDeviceLists {
|
||||
RumaDeviceLists {
|
||||
changed: self
|
||||
.changed
|
||||
.into_iter()
|
||||
.filter_map(|u| UserId::try_from(u).ok())
|
||||
.collect(),
|
||||
left: self
|
||||
.left
|
||||
.into_iter()
|
||||
.filter_map(|u| UserId::try_from(u).ok())
|
||||
.collect(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug, thiserror::Error)]
|
||||
pub enum MachineCreationError {
|
||||
#[error(transparent)]
|
||||
|
@ -71,12 +94,12 @@ impl From<ToDeviceRequest> for Request {
|
|||
}
|
||||
}
|
||||
|
||||
fn response_from_string(body: &str) -> Response<Vec<u8>> {
|
||||
Response::builder()
|
||||
.status(200)
|
||||
.body(body.as_bytes().to_vec())
|
||||
.expect("Can't create HTTP response")
|
||||
}
|
||||
// fn response_from_string(body: &str) -> Response<Vec<u8>> {
|
||||
// Response::builder()
|
||||
// .status(200)
|
||||
// .body(body.as_bytes().to_vec())
|
||||
// .expect("Can't create HTTP response")
|
||||
// }
|
||||
|
||||
impl OlmMachine {
|
||||
pub fn new(user_id: &str, device_id: &str, path: &str) -> Result<Self, MachineCreationError> {
|
||||
|
@ -167,11 +190,24 @@ impl OlmMachine {
|
|||
})
|
||||
}
|
||||
|
||||
pub fn receive_sync_response(&self, response: &str) {
|
||||
let response = response_from_string(response);
|
||||
let mut response = SyncResponse::try_from(response).expect("Can't parse response");
|
||||
pub fn receive_sync_changes(
|
||||
&self,
|
||||
events: &str,
|
||||
device_changes: DeviceLists,
|
||||
key_counts: HashMap<String, u32>,
|
||||
) {
|
||||
let events: ToDevice = serde_json::from_str(events).unwrap();
|
||||
let device_changes: RumaDeviceLists = device_changes.into();
|
||||
let key_counts: BTreeMap<DeviceKeyAlgorithm, UInt> = key_counts
|
||||
.into_iter()
|
||||
.map(|(k, v)| (DeviceKeyAlgorithm::from(k), v.into()))
|
||||
.collect();
|
||||
|
||||
block_on(self.inner.receive_sync_response(&mut response)).unwrap();
|
||||
block_on(
|
||||
self.inner
|
||||
.receive_sync_changes(&events, &device_changes, &key_counts),
|
||||
)
|
||||
.unwrap();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -11,6 +11,11 @@ enum CryptoStoreError {
|
|||
"CryptoStore",
|
||||
};
|
||||
|
||||
dictionary DeviceLists {
|
||||
sequence<string> changed;
|
||||
sequence<string> left;
|
||||
};
|
||||
|
||||
dictionary Device {
|
||||
string user_id;
|
||||
string device_id;
|
||||
|
@ -40,7 +45,9 @@ interface OlmMachine {
|
|||
[Throws=MachineCreationError]
|
||||
constructor([ByRef] string user_id, [ByRef] string device_id, [ByRef] string path);
|
||||
|
||||
void receive_sync_response([ByRef] string response);
|
||||
void receive_sync_changes([ByRef] string events,
|
||||
DeviceLists device_changes,
|
||||
record<DOMString, u32> key_counts);
|
||||
|
||||
record<DOMString, string> identity_keys();
|
||||
|
||||
|
|
Loading…
Reference in New Issue