Add rate limiting to push notification sending process (#7149)

This commit is contained in:
Denis Bykhov 2024-11-11 16:59:25 +05:00 committed by GitHub
parent afdbf5aed7
commit 993965df93
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -38,6 +38,7 @@ import core, {
generateId,
MeasureContext,
MixinUpdate,
RateLimiter,
Ref,
RefTo,
SortingOrder,
@ -602,9 +603,12 @@ export async function createPushNotification (
}
webpush.setVapidDetails(subject, publicKey, privateKey)
const limiter = new RateLimiter(5)
for (const subscription of userSubscriptions) {
void sendPushToSubscription(control, target, subscription, data)
await limiter.exec(async () => {
await sendPushToSubscription(control, target, subscription, data)
})
}
}
@ -621,7 +625,7 @@ async function sendPushToSubscription (
} catch (err) {
control.ctx.info('Cannot send push notification to', { user: targetUser, err })
if (err instanceof WebPushError) {
if (errorMessages.some((p) => (err as WebPushError).body.includes(p))) {
if (errorMessages.some((p) => JSON.stringify((err as WebPushError).body).includes(p))) {
const tx = control.txFactory.createTxRemoveDoc(subscription._class, subscription.space, subscription._id)
await control.apply(control.ctx, [tx])
}