open.js 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. var Gun = (typeof window !== "undefined")? window.Gun : require('../gun');
  2. Gun.chain.open = function(cb, opt, at){
  3. opt = opt || {};
  4. opt.doc = opt.doc || {};
  5. opt.ids = opt.ids || {};
  6. opt.any = opt.any || cb;
  7. opt.ev = opt.ev || {off: function(){
  8. Gun.obj.map(opt.ev.s, function(e){
  9. if(e){ e.off() }
  10. });
  11. opt.ev.s = {};
  12. }, s:{}}
  13. return this.on(function(data, key, ctx, ev){
  14. delete ((data = Gun.obj.copy(data))||{})._;
  15. clearTimeout(opt.to);
  16. opt.to = setTimeout(function(){
  17. if(!opt.any){ return }
  18. opt.any.call(opt.at.$, opt.doc, opt.key, opt, opt.ev);
  19. if(opt.off){
  20. opt.ev.off();
  21. opt.any = null;
  22. }
  23. }, opt.wait || 1);
  24. opt.at = opt.at || ctx;
  25. opt.key = opt.key || key;
  26. opt.ev.s[this._.id] = ev;
  27. if(Gun.val.is(data)){
  28. if(!at){
  29. opt.doc = data;
  30. } else {
  31. at[key] = data;
  32. }
  33. return;
  34. }
  35. var tmp = this, id;
  36. Gun.obj.map(data, function(val, key){
  37. if(!(id = Gun.val.link.is(val))){
  38. (at || opt.doc)[key] = val;
  39. return;
  40. }
  41. if(opt.ids[id]){
  42. (at || opt.doc)[key] = opt.ids[id];
  43. return;
  44. }
  45. tmp.get(key).open(opt.any, opt, opt.ids[id] = (at || opt.doc)[key] = {});
  46. });
  47. })
  48. }