From f53ecdbb052b5c437b0a33a69b2e86f860e878bb Mon Sep 17 00:00:00 2001 From: James Billingham Date: Mon, 8 Sep 2014 11:40:25 +0100 Subject: [PATCH] Initial basic implementation of trying each provider - nothing clever happening for now --- lib/resilient-mailer.js | 28 ++++++++++++++++++++++ package.json | 2 +- test/resilient-mailer.js | 51 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 80 insertions(+), 1 deletion(-) diff --git a/lib/resilient-mailer.js b/lib/resilient-mailer.js index 933c2ed..6011d22 100644 --- a/lib/resilient-mailer.js +++ b/lib/resilient-mailer.js @@ -7,6 +7,7 @@ module.exports = ResilientMailer; * @this {ResilientMailer} */ function ResilientMailer() { + this.providers = []; } /** @@ -16,6 +17,7 @@ function ResilientMailer() { * @param {Provider} provider The provider to register. */ ResilientMailer.prototype.registerProvider = function (provider) { + this.providers.push(provider); } /** @@ -32,4 +34,30 @@ ResilientMailer.prototype.registerProvider = function (provider) { * @param {ResilientMailer~onResult} [callback] Notified when the attempt fails or succeeds. */ ResilientMailer.prototype.mail = function (message, callback) { + this._attempt(0, message, callback); +} + +ResilientMailer.prototype._attempt = function (index, message, callback) { + var self = this; // any way around this? + var provider = this.providers[index]; + + provider.mail(message, function (error) { + if (!error) { + if (callback) + callback(); + + return; + } + + index++; + + if (self.providers.length == index) { + if (callback) + callback(error); + + return; + } + + self._attempt(index, message, callback); + }); } diff --git a/package.json b/package.json index 0617535..8283f76 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "resilient-mailer", - "version": "0.1.0", + "version": "0.1.1", "description": "Provides fault-tolerant email delivery", "license": "MIT", diff --git a/test/resilient-mailer.js b/test/resilient-mailer.js index 48149a1..9f93ec9 100644 --- a/test/resilient-mailer.js +++ b/test/resilient-mailer.js @@ -18,3 +18,54 @@ test('correct types after initialization', function (t) { t.end(); }); + +test('uses providers in correct order', function (t) { + t.plan(3); + + var mailer = new ResilientMailer(); + mailer.registerProvider(successProvider); + mailer.registerProvider(failureProvider); + + mailer.mail({}, function (error) { + t.equal(typeof error, 'undefined'); + }); + + var mailer2 = new ResilientMailer(); + mailer2.registerProvider(failureProvider); + mailer2.registerProvider(failureProvider2); + + mailer2.mail({}, function (error) { + t.notEqual(typeof error, 'undefined'); + t.equal(error.message, 'different generic failure'); + }); +}); + +test('uses secondary as backup', function (t) { + t.plan(1); + + var mailer = new ResilientMailer(); + mailer.registerProvider(failureProvider); + mailer.registerProvider(successProvider); + + mailer.mail({}, function (error) { + t.equal(typeof error, 'undefined'); + }); +}); + +var successProvider = { + mail: function (message, callback) { + callback(); + } +}; + +var failureProvider = { + mail: function (message, callback) { + callback(new Error('generic failure')); + } +}; + +var failureProvider2 = { + mail: function (message, callback) { + callback(new Error('different generic failure')); + } +};