gun/lib/open.js

57 lines
1.2 KiB
JavaScript

var Gun = (typeof window !== "undefined")? window.Gun : require('../gun');
Gun.chain.open = function(cb, opt, at){
opt = opt || {};
opt.doc = opt.doc || {};
opt.ids = opt.ids || {};
opt.any = opt.any || cb;
opt.meta = opt.meta || false;
opt.ev = opt.ev || {off: function(){
Gun.obj.map(opt.ev.s, function(e){
if(e){ e.off() }
});
opt.ev.s = {};
}, s:{}}
return this.on(function(data, key, ctx, ev){
if(opt.meta !== true){
delete ((data = Gun.obj.copy(data))||{})._;
}
clearTimeout(opt.to);
opt.to = setTimeout(function(){
if(!opt.any){ return }
opt.any.call(opt.at.$, opt.doc, opt.key, opt, opt.ev);
if(opt.off){
opt.ev.off();
opt.any = null;
}
}, opt.wait || 1);
opt.at = opt.at || ctx;
opt.key = opt.key || key;
opt.ev.s[this._.id] = ev;
if(Gun.val.is(data)){
if(!at){
opt.doc = data;
} else {
at[key] = data;
}
return;
}
var tmp = this, id;
Gun.obj.map(data, function(val, key){
var doc = at || opt.doc;
if (!doc) {
return;
}
if(!(id = Gun.val.link.is(val))){
doc[key] = val;
return;
}
if(opt.ids[id]){
doc[key] = opt.ids[id];
return;
}
tmp.get(key).open(opt.any, opt, opt.ids[id] = doc[key] = {});
});
})
}