From 993965df9387a6b0a6b09796378673761081ed93 Mon Sep 17 00:00:00 2001 From: Denis Bykhov Date: Mon, 11 Nov 2024 16:59:25 +0500 Subject: [PATCH] Add rate limiting to push notification sending process (#7149) --- server-plugins/notification-resources/src/index.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/server-plugins/notification-resources/src/index.ts b/server-plugins/notification-resources/src/index.ts index 42b48c936e..20b78adcbd 100644 --- a/server-plugins/notification-resources/src/index.ts +++ b/server-plugins/notification-resources/src/index.ts @@ -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]) }