From cbd1b878b9a3d329c8be9f2d82cd86a971b20a36 Mon Sep 17 00:00:00 2001 From: wangmengyan95 Date: Wed, 23 Mar 2016 17:28:07 -0700 Subject: [PATCH] Add pushId back to GCM payload --- spec/GCM.spec.js | 16 ++++++++++++---- src/GCM.js | 7 +++++-- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/spec/GCM.spec.js b/spec/GCM.spec.js index ceb1536820..0ddfe27fa0 100644 --- a/spec/GCM.spec.js +++ b/spec/GCM.spec.js @@ -23,15 +23,17 @@ describe('GCM', () => { var data = { 'alert': 'alert' }; + var pushId = 'pushId'; var timeStamp = 1454538822113; var timeStampISOStr = new Date(timeStamp).toISOString(); - var payload = GCM.generateGCMPayload(data, timeStamp); + var payload = GCM.generateGCMPayload(data, pushId, timeStamp); expect(payload.priority).toEqual('normal'); expect(payload.timeToLive).toEqual(undefined); var dataFromPayload = payload.data; expect(dataFromPayload.time).toEqual(timeStampISOStr); + expect(dataFromPayload['push_id']).toEqual(pushId); var dataFromUser = JSON.parse(dataFromPayload.data); expect(dataFromUser).toEqual(data); done(); @@ -42,16 +44,18 @@ describe('GCM', () => { var data = { 'alert': 'alert' }; + var pushId = 'pushId'; var timeStamp = 1454538822113; var timeStampISOStr = new Date(timeStamp).toISOString(); var expirationTime = 1454538922113 - var payload = GCM.generateGCMPayload(data, timeStamp, expirationTime); + var payload = GCM.generateGCMPayload(data, pushId, timeStamp, expirationTime); expect(payload.priority).toEqual('normal'); expect(payload.timeToLive).toEqual(Math.floor((expirationTime - timeStamp) / 1000)); var dataFromPayload = payload.data; expect(dataFromPayload.time).toEqual(timeStampISOStr); + expect(dataFromPayload['push_id']).toEqual(pushId); var dataFromUser = JSON.parse(dataFromPayload.data); expect(dataFromUser).toEqual(data); done(); @@ -62,16 +66,18 @@ describe('GCM', () => { var data = { 'alert': 'alert' }; + var pushId = 'pushId'; var timeStamp = 1454538822113; var timeStampISOStr = new Date(timeStamp).toISOString(); var expirationTime = 1454538822112; - var payload = GCM.generateGCMPayload(data, timeStamp, expirationTime); + var payload = GCM.generateGCMPayload(data, pushId, timeStamp, expirationTime); expect(payload.priority).toEqual('normal'); expect(payload.timeToLive).toEqual(0); var dataFromPayload = payload.data; expect(dataFromPayload.time).toEqual(timeStampISOStr); + expect(dataFromPayload['push_id']).toEqual(pushId); var dataFromUser = JSON.parse(dataFromPayload.data); expect(dataFromUser).toEqual(data); done(); @@ -82,17 +88,19 @@ describe('GCM', () => { var data = { 'alert': 'alert' }; + var pushId = 'pushId'; var timeStamp = 1454538822113; var timeStampISOStr = new Date(timeStamp).toISOString(); var expirationTime = 2454538822113; - var payload = GCM.generateGCMPayload(data, timeStamp, expirationTime); + var payload = GCM.generateGCMPayload(data, pushId, timeStamp, expirationTime); expect(payload.priority).toEqual('normal'); // Four week in second expect(payload.timeToLive).toEqual(4 * 7 * 24 * 60 * 60); var dataFromPayload = payload.data; expect(dataFromPayload.time).toEqual(timeStampISOStr); + expect(dataFromPayload['push_id']).toEqual(pushId); var dataFromUser = JSON.parse(dataFromPayload.data); expect(dataFromUser).toEqual(data); done(); diff --git a/src/GCM.js b/src/GCM.js index e3df597976..8068f9d7dd 100644 --- a/src/GCM.js +++ b/src/GCM.js @@ -22,6 +22,7 @@ function GCM(args) { * @returns {Object} A promise which is resolved after we get results from gcm */ GCM.prototype.send = function(data, devices) { + let pushId = cryptoUtils.newObjectId(); // Make a new array devices = new Array(...devices); let timestamp = Date.now(); @@ -52,7 +53,8 @@ GCM.prototype.send = function(data, devices) { expirationTime = data['expiration_time']; } // Generate gcm payload - let gcmPayload = generateGCMPayload(data.data, timestamp, expirationTime); + // PushId is not a formal field of GCM, but Parse Android SDK uses this field to deduplicate push notifications + let gcmPayload = generateGCMPayload(data.data, pushId, timestamp, expirationTime); // Make and send gcm request let message = new gcm.Message(gcmPayload); @@ -107,9 +109,10 @@ GCM.prototype.send = function(data, devices) { * @param {Number|undefined} expirationTime A number whose format is the Unix Epoch or undefined * @returns {Object} A promise which is resolved after we get results from gcm */ -function generateGCMPayload(coreData, timeStamp, expirationTime) { +function generateGCMPayload(coreData, pushId, timeStamp, expirationTime) { let payloadData = { 'time': new Date(timeStamp).toISOString(), + 'push_id': pushId, 'data': JSON.stringify(coreData) } let payload = {