diff --git a/package.json b/package.json index de0f351..5fbb47e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@parse/push-adapter", - "version": "2.0.2", + "version": "2.0.3-alpha-1", "description": "Base parse-server-push-adapter", "main": "lib/index.js", "files": [ diff --git a/spec/ParsePushAdapter.spec.js b/spec/ParsePushAdapter.spec.js index 5c60081..0c8a40d 100644 --- a/spec/ParsePushAdapter.spec.js +++ b/spec/ParsePushAdapter.spec.js @@ -50,9 +50,14 @@ describe('ParsePushAdapter', () => { // Check ios var iosSender = parsePushAdapter.senderMap['ios']; expect(iosSender instanceof APNS).toBe(true); + var senderAgain = parsePushAdapter.senderMap['ios']; + // A new instance should be generated at every calls + expect(senderAgain).toEqual(iosSender); // Check android var androidSender = parsePushAdapter.senderMap['android']; expect(androidSender instanceof GCM).toBe(true); + var androidSenderAgain = parsePushAdapter.senderMap['android']; + expect(androidSenderAgain).toEqual(androidSender); done(); }); diff --git a/src/APNS.js b/src/APNS.js index 0757024..2707f58 100644 --- a/src/APNS.js +++ b/src/APNS.js @@ -38,28 +38,18 @@ export class APNS { throw new Parse.Error(Parse.Error.PUSH_MISCONFIGURED, 'APNS Configuration is invalid'); } - // Create Provider from each arg-object - for (let apnsArgs of apnsArgsList) { - - // rewrite bundleId to topic for backward-compatibility - if (apnsArgs.bundleId) { - log.warn(LOG_PREFIX, 'bundleId is deprecated, use topic instead'); - apnsArgs.topic = apnsArgs.bundleId - } - - let provider = APNS._createProvider(apnsArgs); - this.providers.push(provider); - } - - // Sort the providers based on priority ascending, high pri first - this.providers.sort((s1, s2) => { - return s1.priority - s2.priority; - }); - - // Set index-property of providers - for (let index = 0; index < this.providers.length; index++) { - this.providers[index].index = index; + let restartInterval = 30*60*1000; // refresh the providers every 30 minutes + if (process.env.PARSE_SERVER_PUSH_ADAPTER_APNS_REFRESH) { + restartInterval = parseInt(process.env.PARSE_SERVER_PUSH_ADAPTER_APNS_REFRESH); } + this._createProviders(apnsArgsList); + setInterval(() => { + this.providers.forEach((provider) => { + provider.shutdown(); + }); + log.info(LOG_PREFIX, 're-creating providers'); + this._createProviders(apnsArgsList); + }, restartInterval); } /** @@ -139,6 +129,30 @@ export class APNS { return !(apnsArgs.cert || apnsArgs.key || apnsArgs.pfx); } + _createProviders(apnsArgsList) { + // Create Provider from each arg-object + for (let apnsArgs of apnsArgsList) { + // rewrite bundleId to topic for backward-compatibility + if (apnsArgs.bundleId) { + log.warn(LOG_PREFIX, 'bundleId is deprecated, use topic instead'); + apnsArgs.topic = apnsArgs.bundleId + } + + let provider = APNS._createProvider(apnsArgs); + this.providers.push(provider); + } + + // Sort the providers based on priority ascending, high pri first + this.providers.sort((s1, s2) => { + return s1.priority - s2.priority; + }); + + // Set index-property of providers + for (let index = 0; index < this.providers.length; index++) { + this.providers[index].index = index; + } + } + /** * Creates an Provider base on apnsArgs. */