1
0
Fork 0
mirror of https://github.com/binwiederhier/ntfy.git synced 2025-06-13 16:13:18 +02:00

WIP: Firebase support

This commit is contained in:
Philipp Heckel 2021-10-28 23:50:38 -04:00
parent 28fb63b9ae
commit ad17be1683
5 changed files with 633 additions and 5 deletions
server

View file

@ -2,11 +2,15 @@ package server
import (
"bytes"
"context"
"embed"
_ "embed" // required for go:embed
"encoding/json"
firebase "firebase.google.com/go"
"firebase.google.com/go/messaging"
"fmt"
"golang.org/x/time/rate"
"google.golang.org/api/option"
"heckel.io/ntfy/config"
"io"
"log"
@ -23,6 +27,7 @@ type Server struct {
config *config.Config
topics map[string]*topic
visitors map[string]*visitor
firebase *messaging.Client
mu sync.Mutex
}
@ -64,12 +69,24 @@ var (
errHTTPTooManyRequests = &errHTTP{http.StatusTooManyRequests, http.StatusText(http.StatusTooManyRequests)}
)
func New(conf *config.Config) *Server {
func New(conf *config.Config) (*Server, error) {
var fcm *messaging.Client
if conf.FirebaseKeyFile != "" {
fb, err := firebase.NewApp(context.Background(), nil, option.WithCredentialsFile(conf.FirebaseKeyFile))
if err != nil {
return nil, err
}
fcm, err = fb.Messaging(context.Background())
if err != nil {
return nil, err
}
}
return &Server{
config: conf,
firebase: fcm,
topics: make(map[string]*topic),
visitors: make(map[string]*visitor),
}
}, nil
}
func (s *Server) Run() error {
@ -162,10 +179,29 @@ func (s *Server) handlePublishHTTP(w http.ResponseWriter, r *http.Request) error
if err := t.Publish(newDefaultMessage(string(b))); err != nil {
return err
}
if err := s.maybePublishFirebase(t.id, string(b)); err != nil {
return err
}
w.Header().Set("Access-Control-Allow-Origin", "*") // CORS, allow cross-origin requests
return nil
}
func (s *Server) maybePublishFirebase(topic, message string) error {
_, err := s.firebase.Send(context.Background(), &messaging.Message{
Data: map[string]string{
"topic": topic,
"message": message,
},
Notification: &messaging.Notification{
Title: "ntfy.sh/" + topic,
Body: message,
ImageURL: "",
},
Topic: topic,
})
return err
}
func (s *Server) handleSubscribeJSON(w http.ResponseWriter, r *http.Request) error {
encoder := func(msg *message) (string, error) {
var buf bytes.Buffer