libsignal_service/websocket/
sender.rs1use 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
11error_mapper! {
14 put_messages_errors:
15 CONFLICT => MismatchedDevicesException(crate::push_service::MismatchedDevices),
17 GONE => StaleDevices(crate::push_service::StaleDevices),
19 PAYLOAD_TOO_LARGE => MessageTooLarge,
21 NOT_FOUND => UnregisteredRecipient,
23 PRECONDITION_REQUIRED => ProofRequiredError(crate::push_service::ProofRequired),
25}
26
27error_mapper! {
30 #[allow(dead_code)]
31 put_multi_recipient_messages_errors:
32 CONFLICT => MultiRecipientMismatchedDevices(Vec<crate::push_service::AccountMismatchedDevices>),
34 GONE => MultiRecipientStaleDevices(Vec<crate::push_service::AccountStaleDevices>),
36 PAYLOAD_TOO_LARGE => MessageTooLarge,
38 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}