up-or-txt
Version:
97 lines (78 loc) • 2.18 kB
JavaScript
process.env.NODE_TLS_REJECT_UNAUTHORIZED = 0;
var Twilio = require('twilio'),
log = require('debug')('up-or-txt'),
EventEmitter = require('events').EventEmitter,
request = require('superagent'),
_ = require('lodash');
var DEFAULTS = {
twilio: {
sid: process.env.TWILIO_ACCOUNT_SID,
token: process.env.TWILIO_AUTH_TOKEN,
},
phones: [],
checkInterval: 20 * 1000,
txtInterval: 5 * 60 * 1000,
maxFailureCount: 3,
url: '',
message: 'your site is down!'
};
var runIfDifferent = function(fn){
var lastArgs;
return function(){
var currentArgs = _.toArray(arguments);
if (_.isEqual(currentArgs, lastArgs)) return;
lastArgs = currentArgs;
fn.apply(null, currentArgs);
};
};
function Watcher(params){
params = _.extend({}, DEFAULTS, params);
var failureCount = 0;
var log = runIfDifferent(console.log.bind(console));
var emitter = new EventEmitter();
var twilio = new Twilio(params.twilio.sid, params.twilio.token);
var MESSAGE_DEFAULTS = {from: params.twilio.number, body: params.message};
var _createFailTxtMessage = function(toNumber){
return _.extend({}, MESSAGE_DEFAULTS, {to: toNumber});
};
var _sendTxtMessage = function(txtMessage){
twilio.sms.messages.create(txtMessage, function(err) {
if (err){
emitter.emit('txt-error', err);
console.error(err);
} else {
emitter.emit('txt-success', err);
}
});
};
var _sendFailureMessages = _.throttle(function(){
if (failureCount === 0) return;
console.log('sending txts');
params.phones
.map(_createFailTxtMessage)
.forEach(_sendTxtMessage);
}, params.txtInterval);
var _doCheck = function(){
request
.get(params.url)
.end(function(err, res){
if (err || !res.ok){
failureCount++;
if (failureCount <= params.maxFailureCount){
log('"'+params.url + '" failed to respond. ' + failureCount);
}
} else {
failureCount = 0;
log('"'+params.url + '" is up.');
}
if (failureCount > params.maxFailureCount){
log('"'+params.url + '" is down. ');
_sendFailureMessages();
}
return _.delay(_doCheck, params.checkInterval);
});
};
_doCheck();
return emitter;
}
module.exports = Watcher;