summaryrefslogtreecommitdiff
path: root/src/push/handlers
diff options
context:
space:
mode:
authorKit La Touche <kit@transneptune.net>2025-07-02 16:34:33 -0400
committerKit La Touche <kit@transneptune.net>2025-07-23 16:38:55 -0400
commitc21eb26c8d011932293aeec3afe4849740f7fdf8 (patch)
treed77c92b31dff49e6151d3b2ade851b12a88ad437 /src/push/handlers
parentaec3eaeebd37bce9ab4dad14e7e86ef0db8f0c2d (diff)
Rough in client and server side of web-push
Diffstat (limited to 'src/push/handlers')
-rw-r--r--src/push/handlers/mod.rs75
-rw-r--r--src/push/handlers/vapid.rs0
2 files changed, 75 insertions, 0 deletions
diff --git a/src/push/handlers/mod.rs b/src/push/handlers/mod.rs
new file mode 100644
index 0000000..f9ba612
--- /dev/null
+++ b/src/push/handlers/mod.rs
@@ -0,0 +1,75 @@
+use std::env;
+
+use axum::{
+ extract::{Json},
+};
+
+use web_push::{
+ SubscriptionInfo,
+ VapidSignatureBuilder,
+ WebPushMessageBuilder,
+ ContentEncoding,
+ IsahcWebPushClient,
+};
+
+#[derive(Debug, thiserror::Error)]
+pub enum Error {
+ #[error(transparent)]
+ Database(#[from] sqlx::Error),
+}
+
+
+
+pub async fn vapid() -> String {
+ let vapid_public_key = env::var("VAPID_PUBLIC_KEY").is_ok();
+ String::from(vapid_public_key)
+}
+
+
+pub async fn register() -> String {
+ String::from("OK")
+}
+
+
+pub async fn unregister() -> String {
+ String::from("OK")
+}
+
+
+#[axum::debug_handler]
+pub async fn echo(
+ Json(echo): Json<Echo>,
+) -> Result<(), Error> {
+ // Look this up from a subscription record? Or get it from the client and trust?
+ let endpoint = "https://updates.push.services.mozilla.com/wpush/v1/...";
+ // Get these from client:
+ let p256dh = "key_from_browser_as_base64";
+ let auth = "auth_from_browser_as_base64";
+
+ // You would likely get this by deserializing a browser `pushSubscription` object.
+ let subscription_info = SubscriptionInfo::new(endpoint, p256dh, auth);
+
+ // This will need to come from the DB eventually.
+ let private_key = String::from(env::var("VAPID_PRIVATE_KEY").is_ok());
+ let mut sig_builder = VapidSignatureBuilder::from_pem(private_key, &subscription_info)?.build()?;
+
+ // Now add payload and encrypt.
+ let mut builder = WebPushMessageBuilder::new(&subscription_info);
+ // Eventually, this message will be something other than an echo:
+ let content = echo.msg.as_bytes();
+ builder.set_payload(ContentEncoding::Aes128Gcm, content);
+ builder.set_vapid_signature(sig_builder);
+
+ let client = IsahcWebPushClient::new()?;
+
+ // Finally, send the notification!
+ client.send(builder.build()?).await?;
+ // Fix up return type?
+ Ok(())
+}
+
+
+#[derive(serde::Deserialize)]
+pub struct Echo {
+ pub msg: String,
+}
diff --git a/src/push/handlers/vapid.rs b/src/push/handlers/vapid.rs
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/push/handlers/vapid.rs