disable a throttled alarms trigger if retries exhausted (#136)

diff --git a/provider/lib/utils.js b/provider/lib/utils.js
index 75125d8..ba38adf 100644
--- a/provider/lib/utils.js
+++ b/provider/lib/utils.js
@@ -79,7 +79,7 @@
         });
     };
 
-    this.postTrigger = function(dataTrigger, auth, retryCount) {
+    this.postTrigger = function(dataTrigger, auth, retryCount, throttleCount) {
         var method = 'postTrigger';
 
         return new Promise(function(resolve, reject) {
@@ -103,11 +103,14 @@
                     logger.info(method, triggerIdentifier, 'http post request, STATUS:', response ? response.statusCode : undefined);
 
                     if (error || response.statusCode >= 400) {
+                        logger.error(method, 'there was an error invoking', triggerIdentifier, response ? response.statusCode : error);
+                        var throttleCounter = throttleCount || 0;
+
                         // only manage trigger fires if they are not infinite
                         if (dataTrigger.maxTriggers && dataTrigger.maxTriggers !== -1) {
                             dataTrigger.triggersLeft++;
                         }
-                        logger.error(method, 'there was an error invoking', triggerIdentifier, response ? response.statusCode : error);
+
                         if (!error && utils.shouldDisableTrigger(response.statusCode)) {
                             //disable trigger
                             var message = 'Automatically disabled after receiving a ' + response.statusCode + ' status code when firing the trigger';
@@ -116,18 +119,26 @@
                         }
                         else {
                             if (retryCount < retryAttempts) {
+                                throttleCounter = response && response.statusCode === HttpStatus.TOO_MANY_REQUESTS ? throttleCounter + 1 : throttleCounter;
                                 logger.info(method, 'attempting to fire trigger again', triggerIdentifier, 'Retry Count:', (retryCount + 1));
                                 setTimeout(function () {
-                                    utils.postTrigger(dataTrigger, auth, (retryCount + 1))
+                                    utils.postTrigger(dataTrigger, auth, (retryCount + 1), throttleCounter)
                                     .then(triggerId => {
                                         resolve(triggerId);
                                     })
                                     .catch(err => {
                                         reject(err);
                                     });
-                                }, retryDelay);
+                                }, Math.max(retryDelay, 1000 * Math.pow(throttleCounter, 2)));
                             } else {
-                                reject('Unable to reach server to fire trigger ' + triggerIdentifier);
+                                if (throttleCounter === retryAttempts) {
+                                    var msg = 'Automatically disabled after continuously receiving a 429 status code when firing the trigger';
+                                    utils.disableTrigger(triggerIdentifier, 429, msg);
+                                    reject('Disabled trigger ' + triggerIdentifier + ' due to status code: 429');
+                                }
+                                else {
+                                    reject('Unable to reach server to fire trigger ' + triggerIdentifier);
+                                }
                             }
                         }
                     } else {