use std::env; use axum::{ extract::{Json}, }; use web_push::{ SubscriptionInfo, VapidSignatureBuilder, WebPushMessageBuilder, ContentEncoding, WebPushClient, IsahcWebPushClient, }; pub async fn vapid() -> String { let vapid_public_key = env::var("VAPID_PUBLIC_KEY").unwrap_or_default(); String::from(vapid_public_key) } pub async fn register() -> String { String::from("OK") } pub async fn unregister() -> String { String::from("OK") } async fn push_message( endpoint: String, keys: Keys, message: &String, ) -> Result<(), crate::error::Internal> { let content = message.as_bytes(); let subscription_info = SubscriptionInfo::new(endpoint, keys.p256dh, keys.auth); // This will need to come from the DB eventually: let private_key = String::from(env::var("VAPID_PRIVATE_KEY").unwrap_or_default()); let sig_builder = VapidSignatureBuilder::from_base64(&private_key, &subscription_info)?.build()?; let mut builder = WebPushMessageBuilder::new(&subscription_info); builder.set_payload(ContentEncoding::Aes128Gcm, content); builder.set_vapid_signature(sig_builder); let client = IsahcWebPushClient::new()?; client.send(builder.build()?).await?; Ok(()) } #[axum::debug_handler] pub async fn echo( Json(payload): Json, ) -> Result<(), crate::error::Internal> { push_message(payload.endpoint, payload.keys, &payload.msg).await?; Ok(()) } #[derive(serde::Deserialize)] pub struct Keys { pub p256dh: String, pub auth: String, } #[derive(serde::Deserialize)] pub struct PushPayload { pub msg: String, pub endpoint: String, pub keys: Keys, }