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 @@ -46,6 +46,7 @@ fcmPush, getUnreadCounts, apnMaxNotificationPayloadByteSize, + fcmMaxNotificationPayloadByteSize, } from './utils'; type Device = { @@ -531,52 +532,40 @@ allMessageInfos, threadInfo, ); - const messageInfos = JSON.stringify(newRawMessageInfos); - - if (badgeOnly && codeVersion < 69) { + const notification = { + data: { + badge: unreadCount.toString(), + ...rest, + threadID: threadInfo.id, + }, + }; + if (!badgeOnly || codeVersion >= 69) { // Older Android clients don't look at badgeOnly, so if we sent them the // full payload they would treat it as a normal notif. Instead we will // send them this payload that is missing an ID, which will prevent the // system notif from being generated, but still allow for in-app notifs // and badge updating. - return { - data: { - badge: unreadCount.toString(), - ...rest, - threadID: threadInfo.id, - messageInfos, - }, - }; - } else if (codeVersion < 31) { - return { - data: { - badge: unreadCount.toString(), - custom_notification: JSON.stringify({ - channel: 'default', - body: merged, - badgeCount: unreadCount, - id: notifID, - priority: 'high', - sound: 'default', - icon: 'notif_icon', - threadID: threadInfo.id, - messageInfos, - click_action: 'fcm.ACTION.HELLO', - }), - }, + notification.data = { + ...notification.data, + id: notifID, + badgeOnly: badgeOnly ? '1' : '0', }; } - return { - data: { - badge: unreadCount.toString(), - ...rest, - id: notifID, - threadID: threadInfo.id, - messageInfos, - badgeOnly: badgeOnly ? '1' : '0', - }, + const messageInfos = JSON.stringify(newRawMessageInfos); + const copyWithMessageInfos = _cloneDeep(notification); + copyWithMessageInfos.data = { + ...copyWithMessageInfos.data, + messageInfos, }; + + if ( + Buffer.byteLength(JSON.stringify(copyWithMessageInfos)) <= + fcmMaxNotificationPayloadByteSize + ) { + return copyWithMessageInfos; + } + return notification; } type NotificationInfo =