89 lines
2.7 KiB
JavaScript
89 lines
2.7 KiB
JavaScript
"use strict";
|
|
// ParsePushAdapter is the default implementation of
|
|
// PushAdapter, it uses GCM for android push and APNS
|
|
// for ios push.
|
|
|
|
const Parse = require('parse/node').Parse;
|
|
const GCM = require('../../GCM');
|
|
const APNS = require('../../APNS');
|
|
|
|
function ParsePushAdapter(pushConfig) {
|
|
this.validPushTypes = ['ios', 'android'];
|
|
this.senderMap = {};
|
|
|
|
pushConfig = pushConfig || {};
|
|
let pushTypes = Object.keys(pushConfig);
|
|
for (let pushType of pushTypes) {
|
|
if (this.validPushTypes.indexOf(pushType) < 0) {
|
|
throw new Parse.Error(Parse.Error.PUSH_MISCONFIGURED,
|
|
'Push to ' + pushTypes + ' is not supported');
|
|
}
|
|
switch (pushType) {
|
|
case 'ios':
|
|
this.senderMap[pushType] = new APNS(pushConfig[pushType]);
|
|
break;
|
|
case 'android':
|
|
this.senderMap[pushType] = new GCM(pushConfig[pushType]);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Get an array of valid push types.
|
|
* @returns {Array} An array of valid push types
|
|
*/
|
|
ParsePushAdapter.prototype.getValidPushTypes = function() {
|
|
return this.validPushTypes;
|
|
}
|
|
|
|
ParsePushAdapter.prototype.send = function(data, installations) {
|
|
let deviceMap = classifyInstallation(installations, this.validPushTypes);
|
|
let sendPromises = [];
|
|
for (let pushType in deviceMap) {
|
|
let sender = this.senderMap[pushType];
|
|
if (!sender) {
|
|
console.log('Can not find sender for push type %s, %j', pushType, data);
|
|
continue;
|
|
}
|
|
let devices = deviceMap[pushType];
|
|
sendPromises.push(sender.send(data, devices));
|
|
}
|
|
return Parse.Promise.when(sendPromises);
|
|
}
|
|
|
|
/**g
|
|
* Classify the device token of installations based on its device type.
|
|
* @param {Object} installations An array of installations
|
|
* @param {Array} validPushTypes An array of valid push types(string)
|
|
* @returns {Object} A map whose key is device type and value is an array of device
|
|
*/
|
|
function classifyInstallation(installations, validPushTypes) {
|
|
// Init deviceTokenMap, create a empty array for each valid pushType
|
|
let deviceMap = {};
|
|
for (let validPushType of validPushTypes) {
|
|
deviceMap[validPushType] = [];
|
|
}
|
|
for (let installation of installations) {
|
|
// No deviceToken, ignore
|
|
if (!installation.deviceToken) {
|
|
continue;
|
|
}
|
|
let pushType = installation.deviceType;
|
|
if (deviceMap[pushType]) {
|
|
deviceMap[pushType].push({
|
|
deviceToken: installation.deviceToken,
|
|
appIdentifier: installation.appIdentifier
|
|
});
|
|
} else {
|
|
console.log('Unknown push type from installation %j', installation);
|
|
}
|
|
}
|
|
return deviceMap;
|
|
}
|
|
|
|
if (typeof process !== 'undefined' && process.env.NODE_ENV === 'test') {
|
|
ParsePushAdapter.classifyInstallation = classifyInstallation;
|
|
}
|
|
module.exports = ParsePushAdapter;
|