diff --git a/keyserver/src/push/send.js b/keyserver/src/push/send.js --- a/keyserver/src/push/send.js +++ b/keyserver/src/push/send.js @@ -40,7 +40,13 @@ import { fetchUserInfos } from '../fetchers/user-fetchers'; import type { Viewer } from '../session/viewer'; import { getAPNsNotificationTopic } from './providers'; -import { apnPush, fcmPush, getUnreadCounts } from './utils'; +import { + apnPush, + fcmPush, + getUnreadCounts, + apnMaxMessagePayloadByteSize, + fcmMaxMessagePayloadByteSize, +} from './utils'; type Device = { +deviceType: DeviceType, @@ -167,6 +173,7 @@ unreadCounts[userID], codeVersion, ); + validateIOSNotificationByteSize(notification); deliveryPromises.push( sendIOSNotification(notification, [...deviceTokens], { ...notificationInfo, @@ -193,6 +200,7 @@ dbID, codeVersion, ); + validateAndroidNotificationByteSize(notification); deliveryPromises.push( sendAndroidNotification(notification, [...deviceTokens], { ...notificationInfo, @@ -502,6 +510,15 @@ return notification; } +function validateIOSNotificationByteSize(notification: apn.Notification) { + if ( + Buffer.byteLength(JSON.stringify(notification)) > + apnMaxMessagePayloadByteSize + ) { + delete notification.payload.messageInfos; + } +} + function prepareAndroidNotification( allMessageInfos: MessageInfo[], newRawMessageInfos: RawMessageInfo[], @@ -565,6 +582,20 @@ }; } +function validateAndroidNotificationByteSize(notification: Object) { + const notificationByteSizeExceeded = + Buffer.byteLength(JSON.stringify(notification)) > + fcmMaxMessagePayloadByteSize; + if ( + notificationByteSizeExceeded && + 'custom_notification' in notification.data + ) { + delete notification.data.custom_notification.messageInfos; + } else if (notificationByteSizeExceeded) { + delete notification.data.messageInfos; + } +} + type NotificationInfo = | { +source: 'new_message',