Add retry backoff support for 429s (#90)

diff --git a/provider/lib/utils.js b/provider/lib/utils.js
index 94af602..46afe73 100644
--- a/provider/lib/utils.js
+++ b/provider/lib/utils.js
@@ -324,7 +324,7 @@
         var uri = host + '/api/v1/namespaces/' + triggerObj.namespace + '/triggers/' + triggerObj.name;
         var auth = apikey.split(':');
 
-        that.postTrigger(dataTrigger, form, uri, auth, that.retryAttempts)
+        that.postTrigger(dataTrigger, form, uri, auth, 0)
          .then(triggerId => {
              logger.info(method, 'Trigger', triggerId, 'was successfully fired');
              if (dataTrigger.triggersLeft === 0) {
@@ -361,16 +361,20 @@
                             reject('Disabled trigger ' + dataTrigger.id + ' due to status code: ' + response.statusCode);
                         }
                         else {
-                            if (retryCount > 0) {
-                                logger.info(method, 'attempting to fire trigger again', dataTrigger.id, 'Retry Count:', (retryCount - 1));
+                            if (retryCount < that.retryAttempts ) {
+                                var timeout = that.retryDelay;
+                                if (response && response.statusCode === 429) {
+                                    timeout = retryCount === 0 ? 60000 : 1000 * Math.pow(retryCount, 2);
+                                }
+                                logger.info(method, 'attempting to fire trigger again', dataTrigger.id, 'Retry Count:', (retryCount + 1));
                                 setTimeout(function () {
-                                    that.postTrigger(dataTrigger, form, uri, auth, (retryCount - 1))
+                                    that.postTrigger(dataTrigger, form, uri, auth, (retryCount + 1))
                                     .then(triggerId => {
                                         resolve(triggerId);
                                     }).catch(err => {
                                         reject(err);
                                     });
-                                }, that.retryDelay);
+                                }, timeout);
                             } else {
                                 reject('Unable to reach server to fire trigger ' + dataTrigger.id);
                             }