mirror of
https://github.com/binwiederhier/ntfy.git
synced 2025-06-24 13:28:19 +02:00
Truncate FCM messages if they are too long; This was trickier than expected; relates to #84
This commit is contained in:
parent
b4f71ce01a
commit
807d2b0d9d
2 changed files with 51 additions and 2 deletions
server
|
@ -138,6 +138,7 @@ var (
|
|||
const (
|
||||
firebaseControlTopic = "~control" // See Android if changed
|
||||
emptyMessageBody = "triggered"
|
||||
fcmMessageLimitReal = 4100 // see maybeTruncateFCMMessage for details
|
||||
)
|
||||
|
||||
// New instantiates a new Server. It creates the cache and adds a Firebase
|
||||
|
@ -219,15 +220,33 @@ func createFirebaseSubscriber(conf *Config) (subscriber, error) {
|
|||
Priority: "high",
|
||||
}
|
||||
}
|
||||
_, err := msg.Send(context.Background(), &messaging.Message{
|
||||
_, err := msg.Send(context.Background(), maybeTruncateFCMMessage(&messaging.Message{
|
||||
Topic: m.Topic,
|
||||
Data: data,
|
||||
Android: androidConfig,
|
||||
})
|
||||
}))
|
||||
return err
|
||||
}, nil
|
||||
}
|
||||
|
||||
// maybeTruncateFCMMessage performs best-effort truncation of FCM messages.
|
||||
// The docs says the limit is 4000 characters, but the real FCM message limit is 4100 of the
|
||||
// serialized payload; I tested this diligently.
|
||||
func maybeTruncateFCMMessage(m *messaging.Message) *messaging.Message {
|
||||
s, err := json.Marshal(m)
|
||||
if err != nil {
|
||||
return m
|
||||
}
|
||||
if len(s) > fcmMessageLimitReal {
|
||||
over := len(s) - fcmMessageLimitReal
|
||||
message, ok := m.Data["message"]
|
||||
if ok && len(message) > over {
|
||||
m.Data["message"] = message[:len(message)-over]
|
||||
}
|
||||
}
|
||||
return m
|
||||
}
|
||||
|
||||
// Run executes the main server. It listens on HTTP (+ HTTPS, if configured), and starts
|
||||
// a manager go routine to print stats and prune messages.
|
||||
func (s *Server) Run() error {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue