This repository has no description
0

Configure Feed

Select the types of activity you want to include in your feed.

feat: handle >500 subscriptions for FCM

+37 -4
+28 -4
firebase.go
··· 11 11 12 12 firebase "firebase.google.com/go/v4" 13 13 "firebase.google.com/go/v4/messaging" 14 + ll "github.com/ewen-lbh/label-logger-go" 14 15 "golang.org/x/oauth2" 15 16 "golang.org/x/oauth2/google" 16 17 "google.golang.org/api/option" ··· 19 20 var firebaseClient *firebase.App 20 21 var firebaseCtx = context.Background() 21 22 23 + const MaxTokensPerRequest = 490 24 + 22 25 func (msg Message) SendToFirebase(groupId string, subs []Subscription) error { 23 26 fcm, err := firebaseClient.Messaging(firebaseCtx) 24 27 if err != nil { ··· 26 29 } 27 30 28 31 message := msg.FirebaseMessage(groupId) 29 - message.Tokens = make([]string, len(subs)) 32 + tokens := make([]string, len(subs)) 30 33 for i, sub := range subs { 31 - message.Tokens[i] = sub.FirebaseToken() 34 + tokens[i] = sub.FirebaseToken() 32 35 } 33 36 34 - _, err = fcm.SendEachForMulticast(firebaseCtx, &message) 35 - return err 37 + for _, tokensChunk := range chunkBy(tokens, MaxTokensPerRequest) { 38 + go func(tokens []string) { 39 + message.Tokens = tokens 40 + resp, err := fcm.SendEachForMulticast(firebaseCtx, &message) 41 + if err != nil { 42 + ll.ErrorDisplay("while sending FCM message", err) 43 + } else if resp.FailureCount > 0 { 44 + fcmErrors := make([]string, 0, resp.FailureCount) 45 + for i, result := range resp.Responses { 46 + if !result.Success { 47 + fcmErrors = append(fcmErrors, fmt.Sprintf("%s: %s", tokens[i], result.Error)) 48 + } 49 + } 50 + ll.ErrorDisplay( 51 + "some FCM messages failed for %d tokens", 52 + fmt.Errorf("- %s", strings.Join(fcmErrors, "\n- ")), 53 + resp.FailureCount, 54 + ) 55 + } 56 + }(tokensChunk) 57 + } 58 + 59 + return nil 36 60 } 37 61 38 62 func (msg Message) FirebaseMessage(groupId string) messaging.MulticastMessage {
+9
utils.go
··· 1 + package notella 2 + 3 + func chunkBy[T any](items []T, chunkSize int) (chunks [][]T) { 4 + for chunkSize < len(items) { 5 + items, chunks = items[chunkSize:], append(chunks, items[0:chunkSize:chunkSize]) 6 + } 7 + 8 + return append(chunks, items) 9 + }