123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118 |
- ;(function(){
- var Gun = (typeof window !== "undefined")? window.Gun : require('../gun');
- var ify = Gun.node.ify, empty = {}, u;
- console.log("Index space is beta, API may change!");
- Gun.chain.space = function(key, data, opt){
- if(data instanceof Function){
- return travel(key, data, opt, this);
- }
- var gun = this;
- if(Gun.is(data)){
- data.get(function(soul){
- if(!soul){
- return cb && cb({err: "Indexspace cannot link `undefined`!"});
- }
- gun.space(key, Gun.val.link.ify(soul), opt);
- }, true);
- return gun;
- }
- var cb = (opt instanceof Function && opt), rank = (opt||empty).rank || opt, root = gun.back(-1), tmp;
- gun.get(function(soul){
- if(!soul){
- soul = (gun.back('opt.uuid') || Gun.text.random)(9);
- }
- /*var space = ify({}, soul), sub = space, l = 0, tmp;
- var atom = Gun.text.ify({get: key, put: data});
- Gun.list.map(index(0, key.length), function(i){
- sub[(tmp = key.slice(l, i))+'"'] = atom;
- sub = sub[tmp] = ify({}, soul+'"'+key.slice(0,i));
- l = i;
- });
- tmp = {}; tmp[key] = atom.put; tmp = ify(tmp, soul+'"');
- sub[key.slice(l, key.length)] = tmp;
- console.log('????', space);*/
- var shell = {}, l = 0, tmp;
- var atom = Gun.text.ify({get: key, put: data});
- tmp = {}; tmp[key] = data;
- shell.$ = ify(tmp, soul);
- tmp = {}; tmp[key.slice(0,l = 1)] = atom;
- shell[0] = ify(tmp, soul+'"');
- Gun.list.map(index(1, key.length), function(i){
- tmp = {}; tmp[key.slice(l,i)] = atom;
- shell[i] = ify(tmp, soul+'"'+key.slice(0,l));
- l = i;
- });
- tmp = {}; tmp[key.slice(l, key.length)] = atom;
- shell[l+1] = ify(tmp, soul+'"'+key.slice(0,l));
- //tmp = {}; tmp[key.slice(l, key.length)] = Gun.val.link.ify(soul); shell[l+1] = ify(tmp, soul+'"'+key.slice(0,l));
- //console.log('???', shell);
- gun.put(shell, cb, {soul: soul, shell: shell});
- },true);
- return gun;
- }
- function travel(key, cb, opt, ref){
- var root = ref.back(-1), tmp;
- opt = opt || {};
- opt.ack = opt.ack || {};
- ref.get(function(soul){
- ref.get(key).get(function(msg, eve){
- eve.off();
- opt.exact = true;
- opt.ack.key = key;
- opt.ack.data = msg.put;
- if(opt.match){ cb(opt.ack, key, msg, eve) }
- });
- //if(u !== msg.put){
- // cb(msg.put, msg.get, msg, eve);
- // return;
- //}
- opt.soul = soul;
- opt.start = soul+'"';
- opt.key = key;
- opt.top = index(0, opt.find);
- opt.low = opt.top.reverse();
- find(opt, cb, root);
- }, true);
- }
- function find(o, cb, root){
- var id = o.start+o.key.slice(0,o.low[0]);
- root.get(id).get(function(msg, eve){
- eve.off();
- o.ack.tree = {};
- if(u === msg.put){
- if(!o.exact){ return o.match = true }
- cb(o.ack, id, msg, eve);
- return;
- o.low = o.low.slice(1);
- if(!o.low.length){
- cb(u, o.key, msg, eve);
- return;
- }
- find(o, cb, root);
- return;
- }
- Gun.node.is(msg.put, function(v,k){
- if(!(k = Gun.obj.ify(v) || empty).get){ return }
- o.ack.tree[k.get] = k.put;
- });
- if(!o.exact){ return o.match = true }
- cb(o.ack, id, msg, eve);
- });
- }
- function index(n, m, l, k){
- l = l || [];
- if(!m){ return l }
- k = Math.ceil((n||1) / 10);
- if((n+k) >= m){ return l }
- l.push(n + k);
- return index(n + k, m, l);
- }
- }());
- /*
- gun.user('google').space('martti', "testing 123!");
- gun.user('google').get('search').space('ma', function(){
- // tree & index
- // UNFINISHED API!
- });
- */
|