Skip to content

Commit 53ef3a6

Browse files
Schwobalandflovilmart
authored andcommitted
correcting some errors
1 parent 78bc2f2 commit 53ef3a6

File tree

3 files changed

+76
-32
lines changed

3 files changed

+76
-32
lines changed

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,9 @@
3333
"nyc": "^10.1.2"
3434
},
3535
"dependencies": {
36-
"apn": "^2.1.2",
36+
"apn": "^2.1.3",
3737
"node-gcm": "^0.14.0",
38-
"npmlog": "^2.0.3",
38+
"npmlog": "^4.0.2",
3939
"parse": "^1.9.2"
4040
},
4141
"engines": {

spec/APNS.spec.js

Lines changed: 51 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@ describe('APNS', () => {
55

66
it('can initialize with cert', (done) => {
77
let args = {
8-
cert: new Buffer('testCert'),
8+
cert: '-----BEGIN CERTIFICATE-----fPEYJtQrEMXLC9JtFUJ6emXAWv2QdKu93QE+6o5htM+Eu/2oNFIEj2A71WUBu7kA-----END CERTIFICATE-----',
99
key: new Buffer('testKey'),
1010
production: true,
1111
topic: 'topic'
12-
}
12+
};
1313
let apns = new APNS(args);
1414

1515
expect(apns.providers.length).toBe(1);
@@ -99,6 +99,46 @@ describe('APNS', () => {
9999
done();
100100
});
101101

102+
it('can initialize with multiple certs', (done) => {
103+
let args = [
104+
{
105+
cert: '-----BEGIN CERTIFICATE-----fPEYJtQrEMXLC9JtFUJ6emXAWv2QdKu93QE+6o5htM+Eu/2oNFIEj2A71WUBu7kA-----END CERTIFICATE-----',
106+
key: new Buffer('testKey'),
107+
production: false,
108+
topic: 'topic'
109+
},
110+
{
111+
cert: '-----BEGIN CERTIFICATE-----fPEYJtQrEMXLC9JtFUJ6emXAWv2QdKu93QE+6o5htM+Eu/2oNFIEj2A71WUBu7kA-----END CERTIFICATE-----',
112+
key: new Buffer('testKey'),
113+
production: true,
114+
topic: 'topicAgain'
115+
}
116+
];
117+
118+
let apns = new APNS(args);
119+
120+
expect(apns.providers.length).toBe(2);
121+
let devApnsProvider = apns.providers[1];
122+
expect(devApnsProvider.index).toBe(1);
123+
expect(devApnsProvider.topic).toBe(args[0].topic);
124+
125+
let devApnsOptions = devApnsProvider.client.config;
126+
expect(devApnsOptions.cert).toBe(args[0].cert);
127+
expect(devApnsOptions.key).toBe(args[0].key);
128+
expect(devApnsOptions.production).toBe(args[0].production);
129+
130+
let prodApnsProvider = apns.providers[0];
131+
expect(prodApnsProvider.index).toBe(0);
132+
expect(prodApnsProvider.topic).toBe(args[1].topic);
133+
134+
// TODO: Remove this checking onec we inject APNS
135+
let prodApnsOptions = prodApnsProvider.client.config;
136+
expect(prodApnsOptions.cert).toBe(args[1].cert);
137+
expect(prodApnsOptions.key).toBe(args[1].key);
138+
expect(prodApnsOptions.production).toBe(args[1].production);
139+
done();
140+
});
141+
102142
it('can generate APNS notification', (done) => {
103143
//Mock request data
104144
let data = {
@@ -111,9 +151,9 @@ describe('APNS', () => {
111151
'key': 'value',
112152
'keyAgain': 'valueAgain'
113153
};
114-
let expirationTime = 1454571491354
154+
let expirationTime = 1454571491354;
115155

116-
let notification = APNS.prototype._generateNotification(data, expirationTime);
156+
let notification = APNS._generateNotification(data, expirationTime);
117157

118158
expect(notification.aps.alert).toEqual(data.alert);
119159
expect(notification.aps.badge).toEqual(data.badge);
@@ -141,7 +181,7 @@ describe('APNS', () => {
141181
}
142182
];
143183

144-
let qualifiedProviders = APNS.prototype._chooseProviders.call({ providers: providers }, appIdentifier);
184+
let qualifiedProviders = APNS.prototype._chooseProviders.call({providers: providers}, appIdentifier);
145185
expect(qualifiedProviders).toEqual([{
146186
topic: 'topic'
147187
}]);
@@ -160,7 +200,7 @@ describe('APNS', () => {
160200
}
161201
];
162202

163-
let qualifiedProviders = APNS.prototype._chooseProviders.call({ providers: providers }, appIdentifier);
203+
let qualifiedProviders = APNS.prototype._chooseProviders.call({providers: providers}, appIdentifier);
164204
expect(qualifiedProviders).toEqual([]);
165205
done();
166206
});
@@ -171,7 +211,7 @@ describe('APNS', () => {
171211
key: new Buffer('testKey'),
172212
production: true,
173213
topic: 'topic'
174-
}
214+
};
175215
let apns = new APNS(args);
176216
let provider = apns.providers[0];
177217
spyOn(provider, 'send').and.callFake((notification, devices) => {
@@ -181,13 +221,13 @@ describe('APNS', () => {
181221
})
182222
});
183223
// Mock data
184-
let expirationTime = 1454571491354
224+
let expirationTime = 1454571491354;
185225
let data = {
186226
'expiration_time': expirationTime,
187227
'data': {
188228
'alert': 'alert'
189229
}
190-
}
230+
};
191231
// Mock devices
192232
let mockedDevices = [
193233
{
@@ -248,13 +288,13 @@ describe('APNS', () => {
248288
});
249289
apns.providers = [provider, providerDev];
250290
// Mock data
251-
let expirationTime = 1454571491354
291+
let expirationTime = 1454571491354;
252292
let data = {
253293
'expiration_time': expirationTime,
254294
'data': {
255295
'alert': 'alert'
256296
}
257-
}
297+
};
258298
// Mock devices
259299
let mockedDevices = [
260300
{

src/APNS.js

Lines changed: 23 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ export class APNS {
2121
* @param {String} args.passphrase The passphrase for the provider key, if required
2222
* @param {Boolean} args.production Specifies which environment to connect to: Production (if true) or Sandbox
2323
* @param {String} args.topic Specififies an App-Id for this Provider
24+
* @param {String} args.bundleId DEPRECATED: Specifies an App-ID for this Provider
2425
* @param {Number} args.connectionRetryLimit The maximum number of connection failures that will be tolerated before apn.Provider will "give up". (Defaults to: 3)
2526
*/
2627
constructor(args = []) {
@@ -42,10 +43,11 @@ export class APNS {
4243

4344
// rewrite bundleId to topic for backward-compatibility
4445
if (apnsArgs.bundleId) {
46+
log.warn(LOG_PREFIX, 'bundleId is deprecated, use topic instead');
4547
apnsArgs.topic = apnsArgs.bundleId
4648
}
4749

48-
let provider = this._createProvider(apnsArgs);
50+
let provider = APNS._createProvider(apnsArgs);
4951
this.providers.push(provider);
5052
}
5153

@@ -62,9 +64,9 @@ export class APNS {
6264

6365
/**
6466
* Send apns request.
65-
*
67+
*
6668
* @param {Object} data The data we need to send, the format is the same with api request body
67-
* @param {Array} devices An array of devices
69+
* @param {Array} allDevices An array of devices
6870
* @returns {Object} A promise which is resolved immediately
6971
*/
7072
send(data, allDevices) {
@@ -88,28 +90,28 @@ export class APNS {
8890

8991
// No Providers found
9092
if (!providers || providers.length === 0) {
91-
let errorPromises = devices.map(device => this._createErrorPromise(device.deviceToken, 'No Provider found'));
93+
let errorPromises = devices.map(device => APNS._createErrorPromise(device.deviceToken, 'No Provider found'));
9294
allPromises = allPromises.concat(errorPromises);
9395
continue;
9496
}
9597

96-
let notification = this._generateNotification(coreData, expirationTime, appIdentifier);
98+
let notification = APNS._generateNotification(coreData, expirationTime, appIdentifier);
9799
let promise = providers[0]
98100
.send(notification, devices.map(device => device.deviceToken))
99101
.then(this._handlePromise.bind(this));
100102
allPromises.push(promise);
101-
};
103+
}
102104

103105
return Promise.all(allPromises);
104106
}
105107

106108
/**
107109
* Creates an Provider base on apnsArgs.
108110
*/
109-
_createProvider(apnsArgs) {
111+
static _createProvider(apnsArgs) {
110112
let provider = new apn.Provider(apnsArgs);
111113

112-
// if using certificate, then topic must be defined
114+
// if using certificate, then topic must be defined
113115
if ((apnsArgs.cert || apnsArgs.key || apnsArgs.pfx) && !apnsArgs.topic) {
114116
throw new Parse.Error(Parse.Error.PUSH_MISCONFIGURED, 'topic is mssing for %j', apnsArgs);
115117
}
@@ -134,7 +136,7 @@ export class APNS {
134136
* @param {String} topic Topic the Notification is sent to
135137
* @returns {Object} A apns Notification
136138
*/
137-
_generateNotification(coreData, expirationTime, topic) {
139+
static _generateNotification(coreData, expirationTime, topic) {
138140
let notification = new apn.Notification();
139141
let payload = {};
140142
for (let key in coreData) {
@@ -172,9 +174,9 @@ export class APNS {
172174

173175
/**
174176
* Choose appropriate providers based on device appIdentifier.
175-
*
177+
*
176178
* @param {String} appIdentifier appIdentifier for required provider
177-
* @returns Returns Array with appropriate providers
179+
* @returns {Array} Returns Array with appropriate providers
178180
*/
179181
_chooseProviders(appIdentifier) {
180182
// If the device we need to send to does not have appIdentifier, any provider could be a qualified provider
@@ -195,28 +197,30 @@ export class APNS {
195197
}
196198

197199
_handlePromise(response) {
200+
let promises = [];
198201
response.sent.forEach((token) => {
199-
log.verbose(LOG_PREFIX, 'APNS transmitted to %s', token);
200-
return this._createSuccesfullPromise(token);
202+
log.verbose(LOG_PREFIX, 'APNS transmitted to %s', token.device);
203+
promises.push(APNS._createSuccesfullPromise(token.device));
201204
});
202205
response.failed.forEach((failure) => {
203206
if (failure.error) {
204207
log.error(LOG_PREFIX, 'APNS error transmitting to device %s with error %s', failure.device, failure.error);
205-
return this._createErrorPromise(failure.device, failure.error);
208+
promises.push(PNS._createErrorPromise(failure.device, failure.error));
206209
} else if (failure.status && failure.response && failure.response.reason) {
207210
log.error(LOG_PREFIX, 'APNS error transmitting to device %s with status %s and reason %s', failure.device, failure.status, failure.response.reason);
208-
return this._createErrorPromise(failure.device, failure.response.reason);
211+
promises.push(APNS._createErrorPromise(failure.device, failure.response.reason));
209212
}
210213
});
214+
return Promise.all(promises);
211215
}
212216

213217
/**
214218
* Creates an errorPromise for return.
215-
*
219+
*
216220
* @param {String} token Device-Token
217221
* @param {String} errorMessage ErrrorMessage as string
218222
*/
219-
_createErrorPromise(token, errorMessage) {
223+
static _createErrorPromise(token, errorMessage) {
220224
return Promise.resolve({
221225
transmitted: false,
222226
device: {
@@ -229,10 +233,10 @@ export class APNS {
229233

230234
/**
231235
* Creates an successfulPromise for return.
232-
*
236+
*
233237
* @param {String} token Device-Token
234238
*/
235-
_createSuccesfullPromise(token) {
239+
static _createSuccesfullPromise(token) {
236240
return Promise.resolve({
237241
transmitted: true,
238242
device: {

0 commit comments

Comments
 (0)