Skip to main content

libsignal_service/websocket/
sender.rs

1use crate::{
2    push_service::response::error_mapper,
3    sender::{OutgoingPushMessages, SendMessageResponse},
4    unidentified_access::UnidentifiedAccess,
5    utils::BASE64_RELAXED,
6};
7
8use super::*;
9use base64::Engine;
10
11// Signal-Server: controllers/MessageController.java:198
12// (PUT /v1/messages/{destination})
13error_mapper! {
14    put_messages_errors:
15        // 409: mismatched devices, MessageController.java:426
16        CONFLICT => MismatchedDevicesException(crate::push_service::MismatchedDevices),
17        // 410: stale devices, MessageController.java:421
18        GONE => StaleDevices(crate::push_service::StaleDevices),
19        // 413: message too large, MessageController.java:433
20        PAYLOAD_TOO_LARGE => MessageTooLarge,
21        // 404: unregistered recipient, MessageController.java:316
22        NOT_FOUND => UnregisteredRecipient,
23        // 428: proof required, MessageController.java:365
24        PRECONDITION_REQUIRED => ProofRequiredError(crate::push_service::ProofRequired),
25}
26
27// Signal-Server: controllers/MessageController.java:466
28// (PUT /v1/messages/multi_recipient)
29error_mapper! {
30    #[allow(dead_code)]
31    put_multi_recipient_messages_errors:
32        // 409: mismatched devices, MessageController.java:670
33        CONFLICT => MultiRecipientMismatchedDevices(Vec<crate::push_service::AccountMismatchedDevices>),
34        // 410: stale devices, MessageController.java:685
35        GONE => MultiRecipientStaleDevices(Vec<crate::push_service::AccountStaleDevices>),
36        // 413: message too large, MessageController.java:660
37        PAYLOAD_TOO_LARGE => MessageTooLarge,
38        // 428: proof required, MessageController.java:638
39        PRECONDITION_REQUIRED => ProofRequiredError(crate::push_service::ProofRequired),
40}
41
42impl<C: WebSocketType> SignalWebSocket<C> {
43    pub async fn send_messages(
44        &mut self,
45        messages: OutgoingPushMessages,
46    ) -> Result<SendMessageResponse, ServiceError> {
47        let request = WebSocketRequestMessage::new(Method::PUT)
48            .path(format!(
49                "/v1/messages/{}",
50                messages.destination.service_id_string()
51            ))
52            .json(&messages)?;
53        self.request_json_with(request, put_messages_errors).await
54    }
55
56    pub async fn send_messages_unidentified(
57        &mut self,
58        messages: OutgoingPushMessages,
59        access: &UnidentifiedAccess,
60    ) -> Result<SendMessageResponse, ServiceError> {
61        let request = WebSocketRequestMessage::new(Method::PUT)
62            .path(format!(
63                "/v1/messages/{}",
64                messages.destination.service_id_string()
65            ))
66            .header(
67                "Unidentified-Access-Key",
68                BASE64_RELAXED.encode(&access.key),
69            )
70            .json(&messages)?;
71        self.request_json_with(request, put_messages_errors).await
72    }
73}