use std::{collections::BTreeMap, sync::Arc, time::Duration};
use matrix_sdk_common::{
api::r0::{
keys::{
claim_keys::Response as KeysClaimResponse,
get_keys::Response as KeysQueryResponse,
upload_keys::{Request as KeysUploadRequest, Response as KeysUploadResponse},
upload_signatures::{
Request as SignatureUploadRequest, Response as SignatureUploadResponse,
},
upload_signing_keys::Response as SigningKeysUploadResponse,
CrossSigningKey,
},
to_device::{send_event_to_device::Response as ToDeviceResponse, DeviceIdOrAllDevices},
},
events::EventType,
identifiers::{DeviceIdBox, UserId},
uuid::Uuid,
};
use serde_json::value::RawValue as RawJsonValue;
#[derive(Clone, Debug)]
pub struct ToDeviceRequest {
pub event_type: EventType,
pub txn_id: Uuid,
pub messages: BTreeMap<UserId, BTreeMap<DeviceIdOrAllDevices, Box<RawJsonValue>>>,
}
impl ToDeviceRequest {
pub fn txn_id_string(&self) -> String {
self.txn_id.to_string()
}
}
#[derive(Debug, Clone)]
pub struct UploadSigningKeysRequest {
pub master_key: Option<CrossSigningKey>,
pub self_signing_key: Option<CrossSigningKey>,
pub user_signing_key: Option<CrossSigningKey>,
}
#[derive(Clone, Debug)]
pub struct KeysQueryRequest {
pub timeout: Option<Duration>,
pub device_keys: BTreeMap<UserId, Vec<DeviceIdBox>>,
pub token: Option<String>,
}
impl KeysQueryRequest {
pub(crate) fn new(device_keys: BTreeMap<UserId, Vec<DeviceIdBox>>) -> Self {
Self {
timeout: None,
device_keys,
token: None,
}
}
}
#[derive(Debug)]
pub enum OutgoingRequests {
KeysUpload(KeysUploadRequest),
KeysQuery(KeysQueryRequest),
ToDeviceRequest(ToDeviceRequest),
SignatureUpload(SignatureUploadRequest),
}
#[cfg(test)]
impl OutgoingRequests {
pub fn to_device(&self) -> Option<&ToDeviceRequest> {
match self {
OutgoingRequests::ToDeviceRequest(r) => Some(r),
_ => None,
}
}
}
impl From<KeysQueryRequest> for OutgoingRequests {
fn from(request: KeysQueryRequest) -> Self {
OutgoingRequests::KeysQuery(request)
}
}
impl From<KeysUploadRequest> for OutgoingRequests {
fn from(request: KeysUploadRequest) -> Self {
OutgoingRequests::KeysUpload(request)
}
}
impl From<ToDeviceRequest> for OutgoingRequests {
fn from(request: ToDeviceRequest) -> Self {
OutgoingRequests::ToDeviceRequest(request)
}
}
impl From<SignatureUploadRequest> for OutgoingRequests {
fn from(request: SignatureUploadRequest) -> Self {
OutgoingRequests::SignatureUpload(request)
}
}
#[derive(Debug)]
pub enum IncomingResponse<'a> {
KeysUpload(&'a KeysUploadResponse),
KeysQuery(&'a KeysQueryResponse),
ToDevice(&'a ToDeviceResponse),
KeysClaim(&'a KeysClaimResponse),
SigningKeysUpload(&'a SigningKeysUploadResponse),
SignatureUpload(&'a SignatureUploadResponse),
}
impl<'a> From<&'a KeysUploadResponse> for IncomingResponse<'a> {
fn from(response: &'a KeysUploadResponse) -> Self {
IncomingResponse::KeysUpload(response)
}
}
impl<'a> From<&'a KeysQueryResponse> for IncomingResponse<'a> {
fn from(response: &'a KeysQueryResponse) -> Self {
IncomingResponse::KeysQuery(response)
}
}
impl<'a> From<&'a ToDeviceResponse> for IncomingResponse<'a> {
fn from(response: &'a ToDeviceResponse) -> Self {
IncomingResponse::ToDevice(response)
}
}
impl<'a> From<&'a KeysClaimResponse> for IncomingResponse<'a> {
fn from(response: &'a KeysClaimResponse) -> Self {
IncomingResponse::KeysClaim(response)
}
}
impl<'a> From<&'a SignatureUploadResponse> for IncomingResponse<'a> {
fn from(response: &'a SignatureUploadResponse) -> Self {
IncomingResponse::SignatureUpload(response)
}
}
#[derive(Debug, Clone)]
pub struct OutgoingRequest {
pub(crate) request_id: Uuid,
pub(crate) request: Arc<OutgoingRequests>,
}
impl OutgoingRequest {
pub fn request_id(&self) -> &Uuid {
&self.request_id
}
pub fn request(&self) -> &OutgoingRequests {
&self.request
}
}