-
-
Notifications
You must be signed in to change notification settings - Fork 100
/
ParsePushAdapter.js
96 lines (87 loc) · 2.99 KB
/
ParsePushAdapter.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
'use strict';
import Parse from 'parse';
import log from 'npmlog';
import APNS from './APNS.js';
import GCM from './GCM.js';
import FCM from './FCM.js';
import WEB from './WEB.js';
import EXPO from './EXPO.js';
import { classifyInstallations } from './PushAdapterUtils.js';
const LOG_PREFIX = 'parse-server-push-adapter';
export default class ParsePushAdapter {
supportsPushTracking = true;
constructor(pushConfig = {}) {
this.validPushTypes = ['ios', 'osx', 'tvos', 'android', 'fcm', 'web', 'expo'];
this.senderMap = {};
// used in PushController for Dashboard Features
this.feature = {
immediatePush: true
};
const pushTypes = Object.keys(pushConfig);
for (const pushType of pushTypes) {
// adapter may be passed as part of the parse-server initialization
if (this.validPushTypes.indexOf(pushType) < 0 && pushType != 'adapter') {
throw new Parse.Error(Parse.Error.PUSH_MISCONFIGURED,
'Push to ' + pushType + ' is not supported');
}
switch (pushType) {
case 'ios':
case 'tvos':
case 'osx':
if (pushConfig[pushType].hasOwnProperty('firebaseServiceAccount')) {
this.senderMap[pushType] = new FCM(pushConfig[pushType], 'apple');
} else {
this.senderMap[pushType] = new APNS(pushConfig[pushType]);
}
break;
case 'web':
this.senderMap[pushType] = new WEB(pushConfig[pushType]);
break;
case 'expo':
this.senderMap[pushType] = new EXPO(pushConfig[pushType]);
break;
case 'android':
case 'fcm':
if (pushConfig[pushType].hasOwnProperty('firebaseServiceAccount')) {
this.senderMap[pushType] = new FCM(pushConfig[pushType], 'android');
} else {
this.senderMap[pushType] = new GCM(pushConfig[pushType]);
}
break;
}
}
}
getValidPushTypes() {
return this.validPushTypes;
}
static classifyInstallations(installations, validTypes) {
return classifyInstallations(installations, validTypes)
}
send(data, installations) {
const deviceMap = classifyInstallations(installations, this.validPushTypes);
const sendPromises = [];
for (const pushType in deviceMap) {
const sender = this.senderMap[pushType];
const devices = deviceMap[pushType];
if(Array.isArray(devices) && devices.length > 0) {
if (!sender) {
log.verbose(LOG_PREFIX, `Can not find sender for push type ${pushType}, ${data}`)
const results = devices.map((device) => {
return Promise.resolve({
device,
transmitted: false,
response: {'error': `Can not find sender for push type ${pushType}, ${data}`}
})
});
sendPromises.push(Promise.all(results));
} else {
sendPromises.push(sender.send(data, devices));
}
}
}
return Promise.all(sendPromises).then((promises) => {
// flatten all
return [].concat.apply([], promises);
})
}
}