mirror of
https://github.com/R0m1k3/Loki.git
synced 2026-10-16 19:59:56 +02:00
La façade sert la clé VAPID et les (dés)abonnements, et pousse elle-même les notifications « réponse prête » quand LOKI_PUSH=rust (expérimental ; le Go reste le défaut) : chiffrement RFC 8291 (aes128gcm, enregistrement complété à 4096 octets comme webpush-go), signature VAPID RFC 8292 (JWT ES256), abonnements purgés sur 404/410, par ring déjà présent via rustls. Mêmes clés en base que le Go. Côté Go : facade_push.go remet les routes du tunnel à la façade, et sendPushToAll (fin de tour, fin de tâche) lui délègue l'envoi. Parité : parity_push_test.go tire du Go les durées et onze appels de route avec la liste des abonnements en base, rejoués par tests/push.rs ; le chiffrement reproduit l'exemple de la RFC 8291 à l'octet près, et un envoi de bout en bout est déchiffré côté navigateur. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016tcGfJWefW5kUGoC2wL8cv
44 lines
1.4 KiB
Go
44 lines
1.4 KiB
Go
package loki
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"strings"
|
|
)
|
|
|
|
// facade_push.go — notifications Web Push tenues par la façade Rust
|
|
// (LOKI_PUSH=rust, lot 12 de la migration ; expérimental, le Go reste le
|
|
// défaut).
|
|
//
|
|
// La façade sert la clé VAPID et les (dés)abonnements, et pousse elle-même
|
|
// les notifications : les envois de ce process (fin de tour, fin de tâche) lui
|
|
// sont délégués par /internal/facade/v1/push/send. Clés et abonnements restent
|
|
// en base aux mêmes clés : hasPushSubs les lit toujours ici.
|
|
|
|
const facadePushEnv = "LOKI_PUSH"
|
|
|
|
// facadePush : la façade tient-elle les notifications ?
|
|
func facadePush() bool {
|
|
return strings.EqualFold(strings.TrimSpace(os.Getenv(facadePushEnv)), "rust") &&
|
|
facadeAddr() != "" && internalToken() != ""
|
|
}
|
|
|
|
// facadePushRoutes : les routes que la façade sert alors (push.rs).
|
|
var facadePushRoutes = map[string]bool{
|
|
"/api/push/key": true,
|
|
"/api/push/subscribe": true,
|
|
"/api/push/unsubscribe": true,
|
|
}
|
|
|
|
// facadePushSend délègue un envoi à la façade ; false quand elle ne tient pas
|
|
// les notifications (l'appelant envoie alors lui-même).
|
|
func facadePushSend(title, body string) bool {
|
|
if !facadePush() {
|
|
return false
|
|
}
|
|
if err := facadePost("/internal/facade/v1/push/send", map[string]any{"title": title, "body": body}); err != nil {
|
|
fmt.Printf("[push] envoi délégué à la façade : %v\n", err)
|
|
}
|
|
return true
|
|
}
|