| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193 | ;(function(){	/* UNBUILD */	var root;	if(typeof window !== "undefined"){ root = window }	if(typeof global !== "undefined"){ root = global }	root = root || {};	var console = root.console || {log: function(){}};	function USE(arg, req){		return req? require(arg) : arg.slice? USE[R(arg)] : function(mod, path){			arg(mod = {exports: {}});			USE[R(path)] = mod.exports;		}		function R(p){			return p.split('/').slice(-1).toString().replace('.js','');		}	}	if(typeof module !== "undefined"){ var common = module }	/* UNBUILD */	;USE(function(module){		if(typeof window !== "undefined"){ module.window = window }		var tmp = module.window || module;		var AXE = tmp.AXE || function(){};		if(AXE.window = module.window){ try{			AXE.window.AXE = AXE;			tmp = document.createEvent('CustomEvent');			tmp.initCustomEvent('extension', false, false, {type: "AXE"});			(window.dispatchEvent || window.fireEvent)(tmp);			window.postMessage({type: "AXE"}, '*');		} catch(e){} }		try{ if(typeof common !== "undefined"){ common.exports = AXE } }catch(e){}		module.exports = AXE;	})(USE, './root');  	;USE(function(module){		var AXE = USE('./root'), Gun = (AXE.window||{}).Gun || USE('./gun', 1);		(Gun.AXE = AXE).GUN = AXE.Gun = Gun;		Gun.on('opt', function(at){			if(!at.axe){				at.axe = {};				var peers = at.opt.peers, tmp;				// 1. If any remembered peers or from last cache or extension				// 2. Fallback to use hard coded peers from dApp				// 3. Or any offered peers.				//if(Gun.obj.empty(p)){				//  Gun.obj.map(['http://localhost:8765/gun'/*, 'https://guntest.herokuapp.com/gun'*/], function(url){				//    p[url] = {url: url, axe: {}};				//  });				//}				// Our current hypothesis is that it is most optimal				// to take peers in a common network, and align				// them in a line, where you only have left and right				// peers, so messages propagate left and right in				// a linear manner with reduced overlap, and				// with one common superpeer (with ready failovers)				// in case the p2p linear latency is high.				// Or there could be plenty of other better options.				console.log("axe");				function verify(dht, msg, send, at) {					var puts = Object.keys(msg.put);					var soul = puts[0]; /// TODO: verify all souls in puts. Copy the msg only with subscribed souls?					var subs = dht(soul);// 					console.log('[AXE] VERIFY soul: %s, subs: %s, Peers: %s, msg: ', soul, subs, Object.keys(peers), msg);					if (!subs) { return; }					var tmp = [];					Gun.obj.map(subs.split(','), function(pid) {						if (pid in peers) {							tmp.push(pid);// 							console.log('[AXE] SEND TO >>>>> ', pid, msg.put.bob || msg.put);							send(msg, peers[pid]);						}					});					/// Only connected peers in the tmp array.					if (at.on.opt.super) {						dht(soul, tmp.join(','));					}				}				var Rad = (Gun.window||{}).Radix || USE('./lib/radix', 1);				at.opt.dht = Rad();				at.on('in', input/*USE('./lib/super', 1)*/, at);// 				at.on('out', function(msg, a) {// 					this.to.next(msg);// 					console.log('[AXE] out:', msg, a);// 				}, at);				if(at.opt.super){					AXE.say = function(msg, send, at) {						if (msg.rtc) {// 							console.log('[AXE] MSG WEBRTC: ', msg.rtc);							if (msg.rtc.to) {								/// Send announce to one peer only if the msg have 'to' attr								var peer = (at.on.opt.peers) ? at.on.opt.peers[msg.rtc.to] : null;// 								if (peer) { at.on.opt.mesh.say(msg, peer); }								if (peer) { send(msg, peer); }								return;							}						}						if (!msg.put) { send(msg); return; }						//console.log('AXE HOOK!! ', msg);						verify(at.on.opt.dht, msg, send, at);					};				} else {					AXE.say = function(msg, send, at) {						if (msg.rtc) {// 							console.log('[AXE] MSG WEBRTC: ', msg.rtc);						}						if (!msg.put) { send(msg); return; }						verify(at.on.opt.dht, msg, send, at);						/// Always send to superpeers?						Gun.obj.map(at.on.opt.peers, function(peer) {							if (peer.url) {// 								console.log('SEND TO SUPERPEER', msg);								send(msg, peer);							}						});					};					var connections = 0;					at.on('hi', function(opt) {						this.to.next(opt);						//console.log('AXE PEER [HI]', new Date(), opt);						connections++;						/// The first connection don't need to resubscribe the nodes.						if (connections === 1) { return; }						/// Resubscribe all nodes.						setTimeout(function() {							var souls = Object.keys(at.graph);							for (var i=0; i < souls.length; ++i) {								//at.gun.get(souls[i]).off();								at.next[souls[i]].ack = 0;								at.gun.get(souls[i]).once(function(){});							}						//location.reload();						}, 500);					}, at);				}			}			this.to.next(at); // make sure to call the "next" middleware adapter.		});		function joindht(dht, soul, pids) {			if (!pids || !soul || !dht) { return; }			var subs = dht(soul);			var tmp = subs ? subs.split(',') : [];			Gun.obj.map(pids.split(','), function(pid) {				if (pid && tmp.indexOf(pid) === -1) { tmp.push(pid); }			});			tmp = tmp.join(',');			dht(soul, tmp);			return tmp;		}		function input(msg){// 			console.log('[AXE] input: ', msg);			var at = this.as, to = this.to, peer = (msg._||{}).via;			var opt = at.opt;			var dht = opt.dht;			var get = msg.get, soul, key;			if(peer && get){				if(soul = get['#']){					if(key = get['.']){					} else {					}					if (!peer.id) {console.log('[*** WARN] no peer.id %s', soul);}					var pids = joindht(dht, soul, peer.id);					if (pids) {							var dht = {};							dht[soul] = pids;							at.opt.mesh.say({dht:dht}, opt.peers[peer.id]);					}				}			}			to.next(msg);			if (opt.rtc && msg.dht) {				Gun.obj.map(msg.dht, function(pids, soul) {					dht(soul, pids);					Gun.obj.map(pids.split(','), function(pid) {						/// TODO: here we can put an algorithm of who must connect?						if (!pid || pid in opt.peers || pid === opt.pid || opt.announce[pid]) { return; }							opt.announce[pid] = true; /// To try only one connection to the same peer.							opt.announce(pid);					});				});			}		}		module.exports = AXE;	})(USE, './axe');}());
 |