110 lines
2.2 KiB
JavaScript
110 lines
2.2 KiB
JavaScript
"use strict";
|
||
|
||
var redis = require('redis');
|
||
var Promise = require('bluebird');
|
||
var _ = require('lodash');
|
||
|
||
Promise.promisifyAll(redis);
|
||
|
||
/**
|
||
Instantiates a Redis Redbird backend.
|
||
|
||
opts: {
|
||
prefix: '',
|
||
port: 6739,
|
||
host: 'localhost',
|
||
opts: {}
|
||
}
|
||
*/
|
||
function RedisBackend(port, hostname, opts)
|
||
{
|
||
if(!(this instanceof RedisBackend)){
|
||
return new RedisBackend(port, hostname, opts);
|
||
}
|
||
|
||
opts = opts || {};
|
||
port = port || 6379;
|
||
hostname = hostname || 'localhost';
|
||
|
||
this.redis = redis.createClient(port, hostname, opts);
|
||
this.publish = redis.createClient(port, hostname, opts);
|
||
|
||
this.prefix = opts.prefix + '';
|
||
|
||
this.baseKey = baseKey(this.prefix);
|
||
}
|
||
|
||
/**
|
||
Returns a Promise that resolves to an array with all the
|
||
registered services and removes the expired ones.
|
||
*/
|
||
RedisBackend.prototype.getServices = function(){
|
||
var _this = this;
|
||
var redis = this.redis;
|
||
var baseKey = this.baseKey;
|
||
|
||
//
|
||
// Get all members in the service set.
|
||
//
|
||
return redis.smembersAsync(baseKey + 'ids').then(function(serviceIds){
|
||
return Promise.all(_.map(serviceIds, function(id){
|
||
return _this.getService(id);
|
||
}));
|
||
}).then(function(services){
|
||
// Clean expired services
|
||
return _.compact(services);
|
||
});
|
||
}
|
||
|
||
RedisBackend.prototype.getService = function(id){
|
||
var redis = this.redis;
|
||
//
|
||
// Get service hash
|
||
//
|
||
return redis.hgetallAsync(this.baseKey + id).then(function(service){
|
||
if(service){
|
||
return service;
|
||
}else{
|
||
//
|
||
// Service has expired, we must delete it from the service set.
|
||
//
|
||
return redis.sremAsync(id);
|
||
}
|
||
});
|
||
}
|
||
|
||
RedisBackend.prototype.register = function(service){
|
||
var redis = this.redis;
|
||
var publish = this.publish;
|
||
var baseKey = this.baseKey;
|
||
|
||
//
|
||
// Get unique service ID.
|
||
//
|
||
return redis.incrAsync(baseKey + 'counter').then(function(id){
|
||
// Store it
|
||
redis.hset(baseKey + id, service).then(function(){
|
||
return id;
|
||
})
|
||
}).then(function(id){
|
||
//
|
||
// // Publish a meesage so that the proxy can react faster to a new registration.
|
||
//
|
||
return publish.publishAsync(baseKey + 'registered', id).then(function(){
|
||
return id;
|
||
})
|
||
});
|
||
}
|
||
|
||
RedisBackend.prototype.ping = function(id){
|
||
return this.redis.pexpireAsync(id, 5000);
|
||
}
|
||
|
||
function baseKey(prefix){
|
||
return 'redbird-' + prefix + '-services-';
|
||
}
|
||
|
||
module.exports = RedisBackend;
|
||
|
||
|