gun/shots.js
2014-03-17 05:42:30 -06:00

98 lines
2.8 KiB
JavaScript

module.exports = require('theory')
('shot',function(a){
var redis, client;
require('./redis').install('/tmp', function(path){
console.log('>>>>>>>>>>>>>>>>>>>>>>>> DONE <<<<<<<<<<<<<<<<<<<<');
redis = a.redis
, client = redis.createClient();
client.on('error', function(e){
if(!(/ECONNREFUSED/).test(e)){ return }
if(redis.none){ return }
redis.path = path || '/usr/local/bin/redis-server';
if(!(require('fs').existsSync||require('path').existsSync)(redis.path)){
redis.none = true;
return;
}
if(process.env.gun_redis_lock){ return }
process.env.gun_redis_lock = process.pid;
console.log('gun', process.pid, 'starting redis');
require('child_process').spawn(redis.path).on('exit',function(c,s){
if(process.env.gun_redis_lock == process.pid){
process.env.gun_redis_lock = ''; // 0 and false don't work, cause they are cast to strings!
}
});
});
client.set("string key", "string val", redis.print);
client.get("string key", redis.print);
});
return function(opt){
opt = opt || {};
opt.src = opt.src || '';
opt.path = opt.path || '.'
opt.batch = opt.batch || 0;
opt.throttle = opt.throttle || 0;
opt.redis = opt.redis || {};
var u, shot = {},
store = function(src, data){
if(data === u){ return store[src] }
return store[src] = data;
}
theory.on(a.gun.event).event(function(m, db){
console.log('shot', m, db);
shot.add(m, db, shot.batch);
if(a.time.now() - shot.last < opt.throttle
&& shot.batch.length < opt.batch){ return }
$.post(opt.src, shot.batch, function(e,r){
console.log('reply', e,r);
shot.del(m, db);
});
shot.batch = [];
});
shot.batch = [];
shot.last = a.time.now();
shot.list = function(m){
var g = store(a.gun.event) || {};
a.obj(g).each(function(l,db){
a.list(l).each(function(v,i,t){
theory.on(a.gun.event).emit(v, db);
});
});
}
shot.add = function(m, db, b){
if(a.list.is(b)) b.push(m);
var g = store(a.gun.event) || {};
g[db] = g[db] || [];
if(a.list(g[db]).each(function(v){
if(v && v.w === m.w){
return true;
}
})){ return g[db]; } // already added
g[db].push(m);
store(a.gun.event, g);
return g[db];
}
shot.del = function(m, db){
var g = store(a.gun.event) || {};
g[db] = g[db] || [];
g[db] = a.list(g[db]).each(function(v,i,t){
if(v && v.w === m.w){ // && a.test.is(m,v)){
return;
}
t(v);
});
store(a.gun.event, g);
}
shot.sort = function(A,B){
if(!A || !B){ return 0 }
A = A.w; B = B.w;
if(A < B){ return -1 }
else if(A > B){ return 1 }
else { return 0 }
}
shot.start = function(){
};
shot.start();
return {gun: a.gun};
}
},[__dirname+ '/gun', 'redis'])