Skip to content

Commit

Permalink
Initial basic implementation of trying each provider - nothing clever…
Browse files Browse the repository at this point in the history
… happening for now
  • Loading branch information
billinghamj committed Sep 8, 2014
1 parent 96ce4f6 commit f53ecdb
Show file tree
Hide file tree
Showing 3 changed files with 80 additions and 1 deletion.
28 changes: 28 additions & 0 deletions lib/resilient-mailer.js
Expand Up @@ -7,6 +7,7 @@ module.exports = ResilientMailer;
* @this {ResilientMailer}
*/
function ResilientMailer() {
this.providers = [];
}

/**
Expand All @@ -16,6 +17,7 @@ function ResilientMailer() {
* @param {Provider} provider The provider to register.
*/
ResilientMailer.prototype.registerProvider = function (provider) {
this.providers.push(provider);
}

/**
Expand All @@ -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);
});
}
2 changes: 1 addition & 1 deletion 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",
Expand Down
51 changes: 51 additions & 0 deletions test/resilient-mailer.js
Expand Up @@ -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'));
}
};

0 comments on commit f53ecdb

Please sign in to comment.