wait-for-redis
Version:
Wait for a Redis connection to become available
89 lines (79 loc) • 3.35 kB
JavaScript
// Generated by CoffeeScript 1.9.3
(function() {
var Q, Redis, durations, program, runScript, waitForRedis;
Q = require('q');
Redis = require('ioredis');
program = require('commander');
durations = require('durations');
waitForRedis = function(config) {
var attempts, connectTimeout, connectWatch, connected, deferred, options, quiet, redis, ref, ref1, ref2, totalTimeout, watch, wrapup;
deferred = Q.defer();
connectTimeout = config.connectTimeout;
totalTimeout = config.totalTimeout;
quiet = config.quiet;
attempts = 1;
watch = durations.stopwatch().start();
connectWatch = durations.stopwatch();
wrapup = function(code) {
if (connected) {
redis.disconnect();
}
return deferred.resolve(code);
};
options = {
port: (ref = program.port) != null ? ref : 6379,
host: (ref1 = program.host) != null ? ref1 : 'localhost',
password: (ref2 = program.password) != null ? ref2 : null,
lazyConnect: true,
connectTimeout: connectTimeout,
retryStrategy: function(times) {
attempts = times + 1;
if (!quiet) {
console.log("Attempt " + times + " timed out. Time elapsed: " + watch);
}
if (watch.duration().millis() > totalTimeout) {
console.log("Could not connect to Redis.");
wrapUp(1);
}
return Math.min(connectTimeout, Math.max(0, totalTimeout - watch.duration().millis()));
}
};
redis = new Redis(options);
connected = false;
redis.info('server').then(function(result) {
connected = true;
watch.stop();
if (!quiet) {
console.log("Connected. " + attempts + " attempt(s) over " + watch);
}
return wrapup(0);
})["catch"](function(error) {
console.log("Error:", error, "\nStack:\n", error.stack);
return wrapup(1);
});
return deferred.promise;
};
runScript = function() {
var config, ref, ref1, ref2, ref3, ref4, ref5, ref6;
program.option('-D, --database <db_number>', 'Redis database (default is 0)').option('-h, --host <hostname>', 'Redis host (default is localhost)').option('-p, --port <port>', 'Redis port (default is 6379)', parseInt).option('-P, --password <password>', 'Redis auth password (default is empty)').option('-q, --quiet', 'Silence non-error output (default is false)').option('-t, --connect-timeout <milliseconds>', 'Individual connection attempt timeout (default is 250)', parseInt).option('-T, --total-timeout <milliseconds>', 'Total timeout across all connect attempts (dfault is 15000)', parseInt).parse(process.argv);
config = {
host: (ref = program.host) != null ? ref : 'localhost',
port: (ref1 = program.port) != null ? ref1 : 6379,
password: (ref2 = program.password) != null ? ref2 : null,
database: (ref3 = program.database) != null ? ref3 : 0,
connectTimeout: (ref4 = program.connectTimeout) != null ? ref4 : 250,
totalTimeout: (ref5 = program.totalTimeout) != null ? ref5 : 15000,
quiet: (ref6 = program.quiet) != null ? ref6 : false
};
return waitForRedis(config).then(function(code) {
return process.exit(code);
});
};
module.exports = {
await: waitForRedis,
run: runScript
};
if (require.main === module) {
runScript();
}
}).call(this);