diff --git a/services/tunnelbroker/rust-notifications/src/fcm.rs b/services/tunnelbroker/rust-notifications/src/fcm.rs new file mode 100644 --- /dev/null +++ b/services/tunnelbroker/rust-notifications/src/fcm.rs @@ -0,0 +1,24 @@ +use anyhow::{anyhow, Result}; +use fcm::{Client, MessageBuilder, NotificationBuilder}; + +pub async fn send_by_fcm_client( + fcm_api_key: &str, + device_registration_id: &str, + message_title: &str, + message_body: &str, +) -> Result { + let client = Client::new(); + let mut notification_builder = NotificationBuilder::new(); + notification_builder.title(message_title); + notification_builder.body(message_body); + + let notification = notification_builder.finalize(); + let mut message_builder = + MessageBuilder::new(fcm_api_key, device_registration_id); + message_builder.notification(notification); + let result = client.send(message_builder.finalize()).await?; + match result.message_id { + Some(message_id) => Ok(message_id), + None => Err(anyhow!("FCM client returned an empty message id")), + } +} diff --git a/services/tunnelbroker/rust-notifications/src/lib.rs b/services/tunnelbroker/rust-notifications/src/lib.rs --- a/services/tunnelbroker/rust-notifications/src/lib.rs +++ b/services/tunnelbroker/rust-notifications/src/lib.rs @@ -2,6 +2,7 @@ use lazy_static::lazy_static; use tokio::runtime::Runtime; pub mod apns; +pub mod fcm; #[cxx::bridge] mod ffi { @@ -14,6 +15,14 @@ message: &str, sandbox: bool, ) -> Result; + + #[cxx_name = "sendNotifToFCM"] + fn send_notif_to_fcm( + fcm_api_key: &str, + device_registration_id: &str, + message_title: &str, + message_body: &str, + ) -> Result; } } @@ -37,3 +46,17 @@ sandbox, )) } + +pub fn send_notif_to_fcm( + fcm_api_key: &str, + device_registration_id: &str, + message_title: &str, + message_body: &str, +) -> Result { + RUNTIME.block_on(fcm::send_by_fcm_client( + fcm_api_key, + device_registration_id, + message_title, + message_body, + )) +}