This repository has no description
0

Configure Feed

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

feat: handle deleting invalid/expired subscriptions

+39 -10
+18 -6
firebase.go
··· 36 36 37 37 for _, tokensChunk := range chunkBy(tokens, MaxTokensPerRequest) { 38 38 go func(tokens []string) { 39 + if len(tokens) == 0 { 40 + return 41 + } 39 42 message.Tokens = tokens 40 43 resp, err := fcm.SendEachForMulticast(firebaseCtx, &message) 41 44 if err != nil { ··· 44 47 fcmErrors := make([]string, 0, resp.FailureCount) 45 48 for i, result := range resp.Responses { 46 49 if !result.Success { 47 - fcmErrors = append(fcmErrors, fmt.Sprintf("%s: %s", tokens[i], result.Error)) 50 + if result.Error.Error() == "Requested entity was not found." { 51 + if sub, found := FindSubscriptionByNativeToken(tokens[i], subs); found { 52 + ll.Log("Deleting", "yellow", "invalid native subscription %s", tokens[i]) 53 + sub.Destroy() 54 + } 55 + } else { 56 + fcmErrors = append(fcmErrors, fmt.Sprintf("%s: %s", tokens[i], result.Error)) 57 + } 48 58 } 49 59 } 50 - ll.ErrorDisplay( 51 - "some FCM messages failed for %d tokens", 52 - fmt.Errorf("- %s", strings.Join(fcmErrors, "\n- ")), 53 - resp.FailureCount, 54 - ) 60 + if len(fcmErrors) > 0 { 61 + ll.ErrorDisplay( 62 + "some FCM messages failed for %d tokens", 63 + fmt.Errorf("- %s", strings.Join(fcmErrors, "\n- ")), 64 + resp.FailureCount, 65 + ) 66 + } 55 67 } 56 68 }(tokensChunk) 57 69 }
+16
subscriptions.go
··· 52 52 53 53 return subscriptions, nil 54 54 } 55 + 56 + func (sub Subscription) Destroy() error { 57 + _, err := prisma.NotificationSubscription.FindUnique( 58 + db.NotificationSubscription.Endpoint.Equals(sub.Webpush.Endpoint), 59 + ).Delete().Exec(context.Background()) 60 + return err 61 + } 62 + 63 + func FindSubscriptionByNativeToken(token string, subs []Subscription) (Subscription, bool) { 64 + for _, sub := range subs { 65 + if sub.FirebaseToken() == token { 66 + return sub, true 67 + } 68 + } 69 + return Subscription{}, false 70 + }
+5 -4
webpush.go
··· 86 86 87 87 if err != nil { 88 88 ll.ErrorDisplay("could not send notification to %s", err, sub.Owner.Uid) 89 - } 90 - 91 - if resp.StatusCode >= 400 { 92 - ll.ErrorDisplay("could not send notification to %s", err, sub.Owner.Uid) 89 + } else if resp.StatusCode == 410 { 90 + ll.Log("Deleting", "yellow", "invalid webpush subscription %s", sub.Webpush.Endpoint) 91 + sub.Destroy() 92 + } else if resp.StatusCode >= 400 { 93 + ll.Error("could not send notification to %s: HTTP %d", sub.Owner.Uid, resp.StatusCode) 93 94 } 94 95 95 96 }(&wg, sub)