atagen

matrix-rust-sdk

public
Star0
Watch0
ssh://brewery@pls.lobotomise.me:33/atagen/matrix-rust-sdk.git

Blame: bindings/matrix-sdk-crypto-ffi/src/responses.rs

7ff8adafe9e4atagen2026-10-22 12:30 UTC1
#![allow(missing_docs)]
7ff8adafe9e4atagen2026-10-22 12:30 UTC2
7ff8adafe9e4atagen2026-10-22 12:30 UTC3
use std::collections::HashMap;
7ff8adafe9e4atagen2026-10-22 12:30 UTC4
7ff8adafe9e4atagen2026-10-22 12:30 UTC5
use http::Response;
7ff8adafe9e4atagen2026-10-22 12:30 UTC6
use matrix_sdk_crypto::{
7ff8adafe9e4atagen2026-10-22 12:30 UTC7
    CrossSigningBootstrapRequests,
7ff8adafe9e4atagen2026-10-22 12:30 UTC8
    types::requests::{
7ff8adafe9e4atagen2026-10-22 12:30 UTC9
        AnyIncomingResponse, KeysBackupRequest, OutgoingRequest,
7ff8adafe9e4atagen2026-10-22 12:30 UTC10
        OutgoingVerificationRequest as SdkVerificationRequest, RoomMessageRequest, ToDeviceRequest,
7ff8adafe9e4atagen2026-10-22 12:30 UTC11
        UploadSigningKeysRequest as RustUploadSigningKeysRequest,
7ff8adafe9e4atagen2026-10-22 12:30 UTC12
    },
7ff8adafe9e4atagen2026-10-22 12:30 UTC13
};
7ff8adafe9e4atagen2026-10-22 12:30 UTC14
use ruma::{
7ff8adafe9e4atagen2026-10-22 12:30 UTC15
    OwnedTransactionId, UserId,
7ff8adafe9e4atagen2026-10-22 12:30 UTC16
    api::client::{
7ff8adafe9e4atagen2026-10-22 12:30 UTC17
        backup::add_backup_keys::v3::Response as KeysBackupResponse,
7ff8adafe9e4atagen2026-10-22 12:30 UTC18
        keys::{
7ff8adafe9e4atagen2026-10-22 12:30 UTC19
            claim_keys::v3::{Request as KeysClaimRequest, Response as KeysClaimResponse},
7ff8adafe9e4atagen2026-10-22 12:30 UTC20
            get_keys::v3::Response as KeysQueryResponse,
7ff8adafe9e4atagen2026-10-22 12:30 UTC21
            upload_keys::v3::Response as KeysUploadResponse,
7ff8adafe9e4atagen2026-10-22 12:30 UTC22
            upload_signatures::v3::{
7ff8adafe9e4atagen2026-10-22 12:30 UTC23
                Request as RustSignatureUploadRequest, Response as SignatureUploadResponse,
7ff8adafe9e4atagen2026-10-22 12:30 UTC24
            },
7ff8adafe9e4atagen2026-10-22 12:30 UTC25
        },
7ff8adafe9e4atagen2026-10-22 12:30 UTC26
        message::send_message_event::v3::Response as RoomMessageResponse,
7ff8adafe9e4atagen2026-10-22 12:30 UTC27
        sync::sync_events::DeviceLists as RumaDeviceLists,
7ff8adafe9e4atagen2026-10-22 12:30 UTC28
        to_device::send_event_to_device::v3::Response as ToDeviceResponse,
7ff8adafe9e4atagen2026-10-22 12:30 UTC29
    },
7ff8adafe9e4atagen2026-10-22 12:30 UTC30
    assign,
7ff8adafe9e4atagen2026-10-22 12:30 UTC31
    events::MessageLikeEventContent,
7ff8adafe9e4atagen2026-10-22 12:30 UTC32
};
7ff8adafe9e4atagen2026-10-22 12:30 UTC33
use serde_json::json;
7ff8adafe9e4atagen2026-10-22 12:30 UTC34
7ff8adafe9e4atagen2026-10-22 12:30 UTC35
#[derive(uniffi::Record)]
7ff8adafe9e4atagen2026-10-22 12:30 UTC36
pub struct SignatureUploadRequest {
7ff8adafe9e4atagen2026-10-22 12:30 UTC37
    pub body: String,
7ff8adafe9e4atagen2026-10-22 12:30 UTC38
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC39
7ff8adafe9e4atagen2026-10-22 12:30 UTC40
impl From<RustSignatureUploadRequest> for SignatureUploadRequest {
7ff8adafe9e4atagen2026-10-22 12:30 UTC41
    fn from(r: RustSignatureUploadRequest) -> Self {
7ff8adafe9e4atagen2026-10-22 12:30 UTC42
        Self {
7ff8adafe9e4atagen2026-10-22 12:30 UTC43
            body: serde_json::to_string(&r.signed_keys)
7ff8adafe9e4atagen2026-10-22 12:30 UTC44
                .expect("Can't serialize signature upload request"),
7ff8adafe9e4atagen2026-10-22 12:30 UTC45
        }
7ff8adafe9e4atagen2026-10-22 12:30 UTC46
    }
7ff8adafe9e4atagen2026-10-22 12:30 UTC47
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC48
7ff8adafe9e4atagen2026-10-22 12:30 UTC49
#[derive(uniffi::Record)]
7ff8adafe9e4atagen2026-10-22 12:30 UTC50
pub struct UploadSigningKeysRequest {
7ff8adafe9e4atagen2026-10-22 12:30 UTC51
    pub master_key: String,
7ff8adafe9e4atagen2026-10-22 12:30 UTC52
    pub self_signing_key: String,
7ff8adafe9e4atagen2026-10-22 12:30 UTC53
    pub user_signing_key: String,
7ff8adafe9e4atagen2026-10-22 12:30 UTC54
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC55
7ff8adafe9e4atagen2026-10-22 12:30 UTC56
impl From<RustUploadSigningKeysRequest> for UploadSigningKeysRequest {
7ff8adafe9e4atagen2026-10-22 12:30 UTC57
    fn from(r: RustUploadSigningKeysRequest) -> Self {
7ff8adafe9e4atagen2026-10-22 12:30 UTC58
        Self {
7ff8adafe9e4atagen2026-10-22 12:30 UTC59
            master_key: serde_json::to_string(
7ff8adafe9e4atagen2026-10-22 12:30 UTC60
                &r.master_key.expect("Request didn't contain a master key"),
7ff8adafe9e4atagen2026-10-22 12:30 UTC61
            )
7ff8adafe9e4atagen2026-10-22 12:30 UTC62
            .expect("Can't serialize cross signing master key"),
7ff8adafe9e4atagen2026-10-22 12:30 UTC63
            self_signing_key: serde_json::to_string(
7ff8adafe9e4atagen2026-10-22 12:30 UTC64
                &r.self_signing_key.expect("Request didn't contain a self-signing key"),
7ff8adafe9e4atagen2026-10-22 12:30 UTC65
            )
7ff8adafe9e4atagen2026-10-22 12:30 UTC66
            .expect("Can't serialize cross signing self-signing key"),
7ff8adafe9e4atagen2026-10-22 12:30 UTC67
            user_signing_key: serde_json::to_string(
7ff8adafe9e4atagen2026-10-22 12:30 UTC68
                &r.user_signing_key.expect("Request didn't contain a user-signing key"),
7ff8adafe9e4atagen2026-10-22 12:30 UTC69
            )
7ff8adafe9e4atagen2026-10-22 12:30 UTC70
            .expect("Can't serialize cross signing user-signing key"),
7ff8adafe9e4atagen2026-10-22 12:30 UTC71
        }
7ff8adafe9e4atagen2026-10-22 12:30 UTC72
    }
7ff8adafe9e4atagen2026-10-22 12:30 UTC73
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC74
7ff8adafe9e4atagen2026-10-22 12:30 UTC75
#[derive(uniffi::Record)]
7ff8adafe9e4atagen2026-10-22 12:30 UTC76
pub struct BootstrapCrossSigningResult {
7ff8adafe9e4atagen2026-10-22 12:30 UTC77
    /// Optional request to upload some device keys alongside.
7ff8adafe9e4atagen2026-10-22 12:30 UTC78
    ///
7ff8adafe9e4atagen2026-10-22 12:30 UTC79
    /// Must be sent first if present, and marked with `mark_request_as_sent`.
7ff8adafe9e4atagen2026-10-22 12:30 UTC80
    pub upload_keys_request: Option<Request>,
7ff8adafe9e4atagen2026-10-22 12:30 UTC81
    /// Request to upload the signing keys. Must be sent second.
7ff8adafe9e4atagen2026-10-22 12:30 UTC82
    pub upload_signing_keys_request: UploadSigningKeysRequest,
7ff8adafe9e4atagen2026-10-22 12:30 UTC83
    /// Request to upload the keys signatures, including for the signing keys
7ff8adafe9e4atagen2026-10-22 12:30 UTC84
    /// and optionally for the device keys. Must be sent last.
7ff8adafe9e4atagen2026-10-22 12:30 UTC85
    pub upload_signature_request: SignatureUploadRequest,
7ff8adafe9e4atagen2026-10-22 12:30 UTC86
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC87
7ff8adafe9e4atagen2026-10-22 12:30 UTC88
impl From<CrossSigningBootstrapRequests> for BootstrapCrossSigningResult {
7ff8adafe9e4atagen2026-10-22 12:30 UTC89
    fn from(requests: CrossSigningBootstrapRequests) -> Self {
7ff8adafe9e4atagen2026-10-22 12:30 UTC90
        Self {
7ff8adafe9e4atagen2026-10-22 12:30 UTC91
            upload_signing_keys_request: requests.upload_signing_keys_req.into(),
7ff8adafe9e4atagen2026-10-22 12:30 UTC92
            upload_keys_request: requests.upload_keys_req.map(Request::from),
7ff8adafe9e4atagen2026-10-22 12:30 UTC93
            upload_signature_request: requests.upload_signatures_req.into(),
7ff8adafe9e4atagen2026-10-22 12:30 UTC94
        }
7ff8adafe9e4atagen2026-10-22 12:30 UTC95
    }
7ff8adafe9e4atagen2026-10-22 12:30 UTC96
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC97
7ff8adafe9e4atagen2026-10-22 12:30 UTC98
#[derive(uniffi::Enum)]
7ff8adafe9e4atagen2026-10-22 12:30 UTC99
pub enum OutgoingVerificationRequest {
7ff8adafe9e4atagen2026-10-22 12:30 UTC100
    ToDevice { request_id: String, event_type: String, body: String },
7ff8adafe9e4atagen2026-10-22 12:30 UTC101
    InRoom { request_id: String, room_id: String, event_type: String, content: String },
7ff8adafe9e4atagen2026-10-22 12:30 UTC102
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC103
7ff8adafe9e4atagen2026-10-22 12:30 UTC104
impl From<SdkVerificationRequest> for OutgoingVerificationRequest {
7ff8adafe9e4atagen2026-10-22 12:30 UTC105
    fn from(r: SdkVerificationRequest) -> Self {
7ff8adafe9e4atagen2026-10-22 12:30 UTC106
        match r {
7ff8adafe9e4atagen2026-10-22 12:30 UTC107
            SdkVerificationRequest::ToDevice(r) => r.into(),
7ff8adafe9e4atagen2026-10-22 12:30 UTC108
            SdkVerificationRequest::InRoom(r) => Self::InRoom {
7ff8adafe9e4atagen2026-10-22 12:30 UTC109
                request_id: r.txn_id.to_string(),
7ff8adafe9e4atagen2026-10-22 12:30 UTC110
                room_id: r.room_id.to_string(),
7ff8adafe9e4atagen2026-10-22 12:30 UTC111
                content: serde_json::to_string(&r.content)
7ff8adafe9e4atagen2026-10-22 12:30 UTC112
                    .expect("Can't serialize message content"),
7ff8adafe9e4atagen2026-10-22 12:30 UTC113
                event_type: r.content.event_type().to_string(),
7ff8adafe9e4atagen2026-10-22 12:30 UTC114
            },
7ff8adafe9e4atagen2026-10-22 12:30 UTC115
        }
7ff8adafe9e4atagen2026-10-22 12:30 UTC116
    }
7ff8adafe9e4atagen2026-10-22 12:30 UTC117
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC118
7ff8adafe9e4atagen2026-10-22 12:30 UTC119
impl From<ToDeviceRequest> for OutgoingVerificationRequest {
7ff8adafe9e4atagen2026-10-22 12:30 UTC120
    fn from(r: ToDeviceRequest) -> Self {
7ff8adafe9e4atagen2026-10-22 12:30 UTC121
        Self::ToDevice {
7ff8adafe9e4atagen2026-10-22 12:30 UTC122
            request_id: r.txn_id.to_string(),
7ff8adafe9e4atagen2026-10-22 12:30 UTC123
            event_type: r.event_type.to_string(),
7ff8adafe9e4atagen2026-10-22 12:30 UTC124
            body: serde_json::to_string(&r.messages).expect("Can't serialize to-device body"),
7ff8adafe9e4atagen2026-10-22 12:30 UTC125
        }
7ff8adafe9e4atagen2026-10-22 12:30 UTC126
    }
7ff8adafe9e4atagen2026-10-22 12:30 UTC127
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC128
7ff8adafe9e4atagen2026-10-22 12:30 UTC129
#[derive(Debug, uniffi::Enum)]
7ff8adafe9e4atagen2026-10-22 12:30 UTC130
pub enum Request {
7ff8adafe9e4atagen2026-10-22 12:30 UTC131
    ToDevice { request_id: String, event_type: String, body: String },
7ff8adafe9e4atagen2026-10-22 12:30 UTC132
    KeysUpload { request_id: String, body: String },
7ff8adafe9e4atagen2026-10-22 12:30 UTC133
    KeysQuery { request_id: String, users: Vec<String> },
7ff8adafe9e4atagen2026-10-22 12:30 UTC134
    KeysClaim { request_id: String, one_time_keys: HashMap<String, HashMap<String, String>> },
7ff8adafe9e4atagen2026-10-22 12:30 UTC135
    KeysBackup { request_id: String, version: String, rooms: String },
7ff8adafe9e4atagen2026-10-22 12:30 UTC136
    RoomMessage { request_id: String, room_id: String, event_type: String, content: String },
7ff8adafe9e4atagen2026-10-22 12:30 UTC137
    SignatureUpload { request_id: String, body: String },
7ff8adafe9e4atagen2026-10-22 12:30 UTC138
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC139
7ff8adafe9e4atagen2026-10-22 12:30 UTC140
impl From<OutgoingRequest> for Request {
7ff8adafe9e4atagen2026-10-22 12:30 UTC141
    fn from(r: OutgoingRequest) -> Self {
7ff8adafe9e4atagen2026-10-22 12:30 UTC142
        use matrix_sdk_crypto::types::requests::AnyOutgoingRequest::*;
7ff8adafe9e4atagen2026-10-22 12:30 UTC143
7ff8adafe9e4atagen2026-10-22 12:30 UTC144
        match r.request() {
7ff8adafe9e4atagen2026-10-22 12:30 UTC145
            KeysUpload(u) => {
7ff8adafe9e4atagen2026-10-22 12:30 UTC146
                let body = json!({
7ff8adafe9e4atagen2026-10-22 12:30 UTC147
                    "device_keys": u.device_keys,
7ff8adafe9e4atagen2026-10-22 12:30 UTC148
                    "one_time_keys": u.one_time_keys,
7ff8adafe9e4atagen2026-10-22 12:30 UTC149
                    "fallback_keys": u.fallback_keys,
7ff8adafe9e4atagen2026-10-22 12:30 UTC150
                });
7ff8adafe9e4atagen2026-10-22 12:30 UTC151
7ff8adafe9e4atagen2026-10-22 12:30 UTC152
                Request::KeysUpload {
7ff8adafe9e4atagen2026-10-22 12:30 UTC153
                    request_id: r.request_id().to_string(),
7ff8adafe9e4atagen2026-10-22 12:30 UTC154
                    body: serde_json::to_string(&body)
7ff8adafe9e4atagen2026-10-22 12:30 UTC155
                        .expect("Can't serialize `/keys/upload` request"),
7ff8adafe9e4atagen2026-10-22 12:30 UTC156
                }
7ff8adafe9e4atagen2026-10-22 12:30 UTC157
            }
7ff8adafe9e4atagen2026-10-22 12:30 UTC158
            KeysQuery(k) => {
7ff8adafe9e4atagen2026-10-22 12:30 UTC159
                let users: Vec<String> = k.device_keys.keys().map(|u| u.to_string()).collect();
7ff8adafe9e4atagen2026-10-22 12:30 UTC160
                Request::KeysQuery { request_id: r.request_id().to_string(), users }
7ff8adafe9e4atagen2026-10-22 12:30 UTC161
            }
7ff8adafe9e4atagen2026-10-22 12:30 UTC162
            ToDeviceRequest(t) => Request::from(t),
7ff8adafe9e4atagen2026-10-22 12:30 UTC163
            SignatureUpload(t) => Request::SignatureUpload {
7ff8adafe9e4atagen2026-10-22 12:30 UTC164
                request_id: r.request_id().to_string(),
7ff8adafe9e4atagen2026-10-22 12:30 UTC165
                body: serde_json::to_string(&t.signed_keys)
7ff8adafe9e4atagen2026-10-22 12:30 UTC166
                    .expect("Can't serialize signature upload request"),
7ff8adafe9e4atagen2026-10-22 12:30 UTC167
            },
7ff8adafe9e4atagen2026-10-22 12:30 UTC168
            RoomMessage(r) => Request::from(r),
7ff8adafe9e4atagen2026-10-22 12:30 UTC169
            KeysClaim(c) => (r.request_id().to_owned(), c.clone()).into(),
7ff8adafe9e4atagen2026-10-22 12:30 UTC170
        }
7ff8adafe9e4atagen2026-10-22 12:30 UTC171
    }
7ff8adafe9e4atagen2026-10-22 12:30 UTC172
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC173
7ff8adafe9e4atagen2026-10-22 12:30 UTC174
impl From<ToDeviceRequest> for Request {
7ff8adafe9e4atagen2026-10-22 12:30 UTC175
    fn from(r: ToDeviceRequest) -> Self {
7ff8adafe9e4atagen2026-10-22 12:30 UTC176
        Request::ToDevice {
7ff8adafe9e4atagen2026-10-22 12:30 UTC177
            request_id: r.txn_id.to_string(),
7ff8adafe9e4atagen2026-10-22 12:30 UTC178
            event_type: r.event_type.to_string(),
7ff8adafe9e4atagen2026-10-22 12:30 UTC179
            body: serde_json::to_string(&r.messages).expect("Can't serialize to-device body"),
7ff8adafe9e4atagen2026-10-22 12:30 UTC180
        }
7ff8adafe9e4atagen2026-10-22 12:30 UTC181
    }
7ff8adafe9e4atagen2026-10-22 12:30 UTC182
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC183
7ff8adafe9e4atagen2026-10-22 12:30 UTC184
impl From<(OwnedTransactionId, KeysClaimRequest)> for Request {
7ff8adafe9e4atagen2026-10-22 12:30 UTC185
    fn from(request_tuple: (OwnedTransactionId, KeysClaimRequest)) -> Self {
7ff8adafe9e4atagen2026-10-22 12:30 UTC186
        let (request_id, request) = request_tuple;
7ff8adafe9e4atagen2026-10-22 12:30 UTC187
7ff8adafe9e4atagen2026-10-22 12:30 UTC188
        Request::KeysClaim {
7ff8adafe9e4atagen2026-10-22 12:30 UTC189
            request_id: request_id.to_string(),
7ff8adafe9e4atagen2026-10-22 12:30 UTC190
            one_time_keys: request
7ff8adafe9e4atagen2026-10-22 12:30 UTC191
                .one_time_keys
7ff8adafe9e4atagen2026-10-22 12:30 UTC192
                .into_iter()
7ff8adafe9e4atagen2026-10-22 12:30 UTC193
                .map(|(u, d)| {
7ff8adafe9e4atagen2026-10-22 12:30 UTC194
                    (
7ff8adafe9e4atagen2026-10-22 12:30 UTC195
                        u.to_string(),
7ff8adafe9e4atagen2026-10-22 12:30 UTC196
                        d.into_iter().map(|(k, v)| (k.to_string(), v.to_string())).collect(),
7ff8adafe9e4atagen2026-10-22 12:30 UTC197
                    )
7ff8adafe9e4atagen2026-10-22 12:30 UTC198
                })
7ff8adafe9e4atagen2026-10-22 12:30 UTC199
                .collect(),
7ff8adafe9e4atagen2026-10-22 12:30 UTC200
        }
7ff8adafe9e4atagen2026-10-22 12:30 UTC201
    }
7ff8adafe9e4atagen2026-10-22 12:30 UTC202
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC203
7ff8adafe9e4atagen2026-10-22 12:30 UTC204
impl From<(OwnedTransactionId, KeysBackupRequest)> for Request {
7ff8adafe9e4atagen2026-10-22 12:30 UTC205
    fn from(request_tuple: (OwnedTransactionId, KeysBackupRequest)) -> Self {
7ff8adafe9e4atagen2026-10-22 12:30 UTC206
        let (request_id, request) = request_tuple;
7ff8adafe9e4atagen2026-10-22 12:30 UTC207
7ff8adafe9e4atagen2026-10-22 12:30 UTC208
        Request::KeysBackup {
7ff8adafe9e4atagen2026-10-22 12:30 UTC209
            request_id: request_id.to_string(),
7ff8adafe9e4atagen2026-10-22 12:30 UTC210
            version: request.version.to_owned(),
7ff8adafe9e4atagen2026-10-22 12:30 UTC211
            rooms: serde_json::to_string(&request.rooms)
7ff8adafe9e4atagen2026-10-22 12:30 UTC212
                .expect("Can't serialize keys backup request"),
7ff8adafe9e4atagen2026-10-22 12:30 UTC213
        }
7ff8adafe9e4atagen2026-10-22 12:30 UTC214
    }
7ff8adafe9e4atagen2026-10-22 12:30 UTC215
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC216
7ff8adafe9e4atagen2026-10-22 12:30 UTC217
impl From<&ToDeviceRequest> for Request {
7ff8adafe9e4atagen2026-10-22 12:30 UTC218
    fn from(r: &ToDeviceRequest) -> Self {
7ff8adafe9e4atagen2026-10-22 12:30 UTC219
        Request::ToDevice {
7ff8adafe9e4atagen2026-10-22 12:30 UTC220
            request_id: r.txn_id.to_string(),
7ff8adafe9e4atagen2026-10-22 12:30 UTC221
            event_type: r.event_type.to_string(),
7ff8adafe9e4atagen2026-10-22 12:30 UTC222
            body: serde_json::to_string(&r.messages).expect("Can't serialize to-device body"),
7ff8adafe9e4atagen2026-10-22 12:30 UTC223
        }
7ff8adafe9e4atagen2026-10-22 12:30 UTC224
    }
7ff8adafe9e4atagen2026-10-22 12:30 UTC225
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC226
7ff8adafe9e4atagen2026-10-22 12:30 UTC227
impl From<&Box<RoomMessageRequest>> for Request {
7ff8adafe9e4atagen2026-10-22 12:30 UTC228
    fn from(r: &Box<RoomMessageRequest>) -> Self {
7ff8adafe9e4atagen2026-10-22 12:30 UTC229
        Self::RoomMessage {
7ff8adafe9e4atagen2026-10-22 12:30 UTC230
            request_id: r.txn_id.to_string(),
7ff8adafe9e4atagen2026-10-22 12:30 UTC231
            room_id: r.room_id.to_string(),
7ff8adafe9e4atagen2026-10-22 12:30 UTC232
            event_type: r.content.event_type().to_string(),
7ff8adafe9e4atagen2026-10-22 12:30 UTC233
            content: serde_json::to_string(&r.content).expect("Can't serialize message content"),
7ff8adafe9e4atagen2026-10-22 12:30 UTC234
        }
7ff8adafe9e4atagen2026-10-22 12:30 UTC235
    }
7ff8adafe9e4atagen2026-10-22 12:30 UTC236
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC237
7ff8adafe9e4atagen2026-10-22 12:30 UTC238
pub(crate) fn response_from_string(body: &str) -> Response<Vec<u8>> {
7ff8adafe9e4atagen2026-10-22 12:30 UTC239
    Response::builder()
7ff8adafe9e4atagen2026-10-22 12:30 UTC240
        .status(200)
7ff8adafe9e4atagen2026-10-22 12:30 UTC241
        .body(body.as_bytes().to_vec())
7ff8adafe9e4atagen2026-10-22 12:30 UTC242
        .expect("Can't create HTTP response")
7ff8adafe9e4atagen2026-10-22 12:30 UTC243
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC244
7ff8adafe9e4atagen2026-10-22 12:30 UTC245
#[derive(uniffi::Enum)]
7ff8adafe9e4atagen2026-10-22 12:30 UTC246
pub enum RequestType {
7ff8adafe9e4atagen2026-10-22 12:30 UTC247
    KeysQuery,
7ff8adafe9e4atagen2026-10-22 12:30 UTC248
    KeysClaim,
7ff8adafe9e4atagen2026-10-22 12:30 UTC249
    KeysUpload,
7ff8adafe9e4atagen2026-10-22 12:30 UTC250
    ToDevice,
7ff8adafe9e4atagen2026-10-22 12:30 UTC251
    SignatureUpload,
7ff8adafe9e4atagen2026-10-22 12:30 UTC252
    KeysBackup,
7ff8adafe9e4atagen2026-10-22 12:30 UTC253
    RoomMessage,
7ff8adafe9e4atagen2026-10-22 12:30 UTC254
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC255
7ff8adafe9e4atagen2026-10-22 12:30 UTC256
#[derive(uniffi::Record)]
7ff8adafe9e4atagen2026-10-22 12:30 UTC257
pub struct DeviceLists {
7ff8adafe9e4atagen2026-10-22 12:30 UTC258
    pub changed: Vec<String>,
7ff8adafe9e4atagen2026-10-22 12:30 UTC259
    pub left: Vec<String>,
7ff8adafe9e4atagen2026-10-22 12:30 UTC260
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC261
7ff8adafe9e4atagen2026-10-22 12:30 UTC262
impl From<DeviceLists> for RumaDeviceLists {
7ff8adafe9e4atagen2026-10-22 12:30 UTC263
    fn from(d: DeviceLists) -> Self {
7ff8adafe9e4atagen2026-10-22 12:30 UTC264
        assign!(RumaDeviceLists::new(), {
7ff8adafe9e4atagen2026-10-22 12:30 UTC265
            changed: d
7ff8adafe9e4atagen2026-10-22 12:30 UTC266
                .changed
7ff8adafe9e4atagen2026-10-22 12:30 UTC267
                .into_iter()
7ff8adafe9e4atagen2026-10-22 12:30 UTC268
                .filter_map(|u| UserId::parse(u).ok())
7ff8adafe9e4atagen2026-10-22 12:30 UTC269
                .collect(),
7ff8adafe9e4atagen2026-10-22 12:30 UTC270
            left: d
7ff8adafe9e4atagen2026-10-22 12:30 UTC271
                .left
7ff8adafe9e4atagen2026-10-22 12:30 UTC272
                .into_iter()
7ff8adafe9e4atagen2026-10-22 12:30 UTC273
                .filter_map(|u| UserId::parse(u).ok())
7ff8adafe9e4atagen2026-10-22 12:30 UTC274
                .collect(),
7ff8adafe9e4atagen2026-10-22 12:30 UTC275
        })
7ff8adafe9e4atagen2026-10-22 12:30 UTC276
    }
7ff8adafe9e4atagen2026-10-22 12:30 UTC277
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC278
7ff8adafe9e4atagen2026-10-22 12:30 UTC279
#[derive(uniffi::Record)]
7ff8adafe9e4atagen2026-10-22 12:30 UTC280
pub struct KeysImportResult {
7ff8adafe9e4atagen2026-10-22 12:30 UTC281
    /// The number of room keys that were imported.
7ff8adafe9e4atagen2026-10-22 12:30 UTC282
    pub imported: i64,
7ff8adafe9e4atagen2026-10-22 12:30 UTC283
    /// The total number of room keys that were found in the export.
7ff8adafe9e4atagen2026-10-22 12:30 UTC284
    pub total: i64,
7ff8adafe9e4atagen2026-10-22 12:30 UTC285
    /// The map of keys that were imported.
7ff8adafe9e4atagen2026-10-22 12:30 UTC286
    ///
7ff8adafe9e4atagen2026-10-22 12:30 UTC287
    /// It's a map from room id to a map of the sender key to a list of session
7ff8adafe9e4atagen2026-10-22 12:30 UTC288
    /// ids.
7ff8adafe9e4atagen2026-10-22 12:30 UTC289
    pub keys: HashMap<String, HashMap<String, Vec<String>>>,
7ff8adafe9e4atagen2026-10-22 12:30 UTC290
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC291
7ff8adafe9e4atagen2026-10-22 12:30 UTC292
pub(crate) enum OwnedResponse {
7ff8adafe9e4atagen2026-10-22 12:30 UTC293
    KeysClaim(KeysClaimResponse),
7ff8adafe9e4atagen2026-10-22 12:30 UTC294
    KeysUpload(KeysUploadResponse),
7ff8adafe9e4atagen2026-10-22 12:30 UTC295
    KeysQuery(KeysQueryResponse),
7ff8adafe9e4atagen2026-10-22 12:30 UTC296
    ToDevice(ToDeviceResponse),
7ff8adafe9e4atagen2026-10-22 12:30 UTC297
    SignatureUpload(SignatureUploadResponse),
7ff8adafe9e4atagen2026-10-22 12:30 UTC298
    KeysBackup(KeysBackupResponse),
7ff8adafe9e4atagen2026-10-22 12:30 UTC299
    RoomMessage(RoomMessageResponse),
7ff8adafe9e4atagen2026-10-22 12:30 UTC300
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC301
7ff8adafe9e4atagen2026-10-22 12:30 UTC302
impl From<KeysClaimResponse> for OwnedResponse {
7ff8adafe9e4atagen2026-10-22 12:30 UTC303
    fn from(response: KeysClaimResponse) -> Self {
7ff8adafe9e4atagen2026-10-22 12:30 UTC304
        OwnedResponse::KeysClaim(response)
7ff8adafe9e4atagen2026-10-22 12:30 UTC305
    }
7ff8adafe9e4atagen2026-10-22 12:30 UTC306
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC307
7ff8adafe9e4atagen2026-10-22 12:30 UTC308
impl From<KeysQueryResponse> for OwnedResponse {
7ff8adafe9e4atagen2026-10-22 12:30 UTC309
    fn from(response: KeysQueryResponse) -> Self {
7ff8adafe9e4atagen2026-10-22 12:30 UTC310
        OwnedResponse::KeysQuery(response)
7ff8adafe9e4atagen2026-10-22 12:30 UTC311
    }
7ff8adafe9e4atagen2026-10-22 12:30 UTC312
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC313
7ff8adafe9e4atagen2026-10-22 12:30 UTC314
impl From<KeysUploadResponse> for OwnedResponse {
7ff8adafe9e4atagen2026-10-22 12:30 UTC315
    fn from(response: KeysUploadResponse) -> Self {
7ff8adafe9e4atagen2026-10-22 12:30 UTC316
        OwnedResponse::KeysUpload(response)
7ff8adafe9e4atagen2026-10-22 12:30 UTC317
    }
7ff8adafe9e4atagen2026-10-22 12:30 UTC318
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC319
7ff8adafe9e4atagen2026-10-22 12:30 UTC320
impl From<ToDeviceResponse> for OwnedResponse {
7ff8adafe9e4atagen2026-10-22 12:30 UTC321
    fn from(response: ToDeviceResponse) -> Self {
7ff8adafe9e4atagen2026-10-22 12:30 UTC322
        OwnedResponse::ToDevice(response)
7ff8adafe9e4atagen2026-10-22 12:30 UTC323
    }
7ff8adafe9e4atagen2026-10-22 12:30 UTC324
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC325
7ff8adafe9e4atagen2026-10-22 12:30 UTC326
impl From<SignatureUploadResponse> for OwnedResponse {
7ff8adafe9e4atagen2026-10-22 12:30 UTC327
    fn from(response: SignatureUploadResponse) -> Self {
7ff8adafe9e4atagen2026-10-22 12:30 UTC328
        Self::SignatureUpload(response)
7ff8adafe9e4atagen2026-10-22 12:30 UTC329
    }
7ff8adafe9e4atagen2026-10-22 12:30 UTC330
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC331
7ff8adafe9e4atagen2026-10-22 12:30 UTC332
impl From<KeysBackupResponse> for OwnedResponse {
7ff8adafe9e4atagen2026-10-22 12:30 UTC333
    fn from(r: KeysBackupResponse) -> Self {
7ff8adafe9e4atagen2026-10-22 12:30 UTC334
        Self::KeysBackup(r)
7ff8adafe9e4atagen2026-10-22 12:30 UTC335
    }
7ff8adafe9e4atagen2026-10-22 12:30 UTC336
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC337
7ff8adafe9e4atagen2026-10-22 12:30 UTC338
impl From<RoomMessageResponse> for OwnedResponse {
7ff8adafe9e4atagen2026-10-22 12:30 UTC339
    fn from(response: RoomMessageResponse) -> Self {
7ff8adafe9e4atagen2026-10-22 12:30 UTC340
        OwnedResponse::RoomMessage(response)
7ff8adafe9e4atagen2026-10-22 12:30 UTC341
    }
7ff8adafe9e4atagen2026-10-22 12:30 UTC342
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC343
7ff8adafe9e4atagen2026-10-22 12:30 UTC344
impl<'a> From<&'a OwnedResponse> for AnyIncomingResponse<'a> {
7ff8adafe9e4atagen2026-10-22 12:30 UTC345
    fn from(r: &'a OwnedResponse) -> Self {
7ff8adafe9e4atagen2026-10-22 12:30 UTC346
        match r {
7ff8adafe9e4atagen2026-10-22 12:30 UTC347
            OwnedResponse::KeysClaim(r) => AnyIncomingResponse::KeysClaim(r),
7ff8adafe9e4atagen2026-10-22 12:30 UTC348
            OwnedResponse::KeysQuery(r) => AnyIncomingResponse::KeysQuery(r),
7ff8adafe9e4atagen2026-10-22 12:30 UTC349
            OwnedResponse::KeysUpload(r) => AnyIncomingResponse::KeysUpload(r),
7ff8adafe9e4atagen2026-10-22 12:30 UTC350
            OwnedResponse::ToDevice(r) => AnyIncomingResponse::ToDevice(r),
7ff8adafe9e4atagen2026-10-22 12:30 UTC351
            OwnedResponse::SignatureUpload(r) => AnyIncomingResponse::SignatureUpload(r),
7ff8adafe9e4atagen2026-10-22 12:30 UTC352
            OwnedResponse::KeysBackup(r) => AnyIncomingResponse::KeysBackup(r),
7ff8adafe9e4atagen2026-10-22 12:30 UTC353
            OwnedResponse::RoomMessage(r) => AnyIncomingResponse::RoomMessage(r),
7ff8adafe9e4atagen2026-10-22 12:30 UTC354
        }
7ff8adafe9e4atagen2026-10-22 12:30 UTC355
    }
7ff8adafe9e4atagen2026-10-22 12:30 UTC356
}