0.5 BETA TESTING

This commit is contained in:
Mark Nadal 2016-09-25 13:06:29 -07:00
parent acc085a8ed
commit fa3d3eeff4
6 changed files with 1129 additions and 558 deletions

1018
gun.js

File diff suppressed because it is too large Load Diff

View File

@ -14,25 +14,31 @@ function writeFile(path, disk, at){
fs.writeFile(String(path), Gun.text.ify(disk), function(err) {
var batch = queuedWrites.splice(0);
isWriting = false;
at.cb(err);
//at.cb(err);
at.gun.Back(-1).on('in', {'@': at['#'], err: err, ok: err? false : 1});
if(batch.length){
writeFile(path, disk, {cb: function(err) {
batch.forEach( function(at) { at.cb(err); } )
batch.forEach( function(at) {
at.gun.Back(-1).on('in', {'@': at['#'], err: err, ok: err? false : 1});
} )
}});
}
});
}
Gun.on('put', function(at){
var gun = at.gun, graph = at.graph, opt = at.opt;
Gun.obj.map(gun.__.graph, function(node, soul){
file.disk.graph[soul] = gun.__.graph[soul] || graph[soul];
var gun = at.gun, graph = at.put, opt = at.opt || {};
var __ = gun._.root._;
Gun.obj.map(graph, function(node, soul){
file.disk.graph[soul] = __.graph[soul] || graph[soul];
});
writeFile(opt.file || file.file, file.disk, at);
});
Gun.on('get', function(at){
var gun = at.gun, lex = at.lex, opt = at.opt;
at.cb(null, file.disk.graph[lex.soul]);
var gun = at.gun, lex = at.get, opt = at.opt;
if(!lex){return}
gun.Back(-1).on('in', {'@': at['#'], put: Gun.graph.node(file.disk.graph[lex['#']])});
//at.cb(null, file.disk.graph[lex['#']]);
});
Gun.on('opt', function(at){

View File

@ -18,7 +18,7 @@ module.exports = function(wss, server, opt){
msg.method = msg.method || msg.body? 'put' : 'get';
msg.headers = msg.headers || {};
Gun.obj.map(opt.headers || req.headers, function(val, i){
msg.headers[i] = msg.headers[i] || val; // reattach headers
msg.headers[i] = msg.headers[i]; // reattach headers
});
server.call(ws, msg, function(reply){
if(!ws || !ws.send || !ws._socket || !ws._socket.writable){ return }

View File

@ -20,6 +20,7 @@
, url = require('url');
Gun.on('opt', function(at){
var gun = at.gun, opt = at.opt;
gun.__ = at.root._;
gun.__.opt.ws = opt.ws = gun.__.opt.ws || opt.ws || {};
function start(server, port, app){
if(app && app.use){ app.use(gun.wsp.server) }
@ -138,15 +139,16 @@
if(gun.wsp.msg(msg['#'])){ return }
gun.wsp.on('network', Gun.obj.copy(req));
if(msg['@']){ return } // no need to process.
if(Gun.is.lex(msg['$'])){ return tran.get(req, res) }
if(msg['$'] && msg['$']['#']){ return tran.get(req, res) }
//if(Gun.is.lex(msg['$'])){ return tran.get(req, res) }
else { return tran.put(req, res) }
cb({body: {hello: 'world'}});
// TODO: BUG! server put should push.
}
tran.get = function(req, cb){
var body = req.body, lex = body['$'], reply = {headers: {'Content-Type': tran.json}}, opt;
Gun.get(gun, lex, function(err, node){
//console.log("tran.get", lex, err, node);
gun.get(lex, function(err, node, key, at, ev){
ev.off();
return cb({headers: reply.headers, body: {
'#': gun.wsp.msg(),
'@': body['#'],
@ -185,14 +187,16 @@
// NOTE: It is highly recommended you do your own PUT/POSTs through your own API that then saves to gun manually.
// This will give you much more fine-grain control over security, transactions, and what not.
var body = req.body, graph = body['$'], reply = {headers: {'Content-Type': tran.json}}, opt;
Gun.put(gun, graph, function(err, ok){
gun.on('out', {gun: gun, put: graph, '#': Gun.on.ask(function(ack, ev){
//Gun.on('put', {gun: gun, put: graph, '#': Gun.on.ask(function(ack, ev){
ev.off();
return cb({headers: reply.headers, body: {
'#': gun.wsp.msg(),
'@': body['#'],
'$': ok,
'!': err
'$': ack,
'!': ack.err
}});
}, opt);
})});
return;
if(Gun.is.graph(req.body)){
if(req.err = Gun.union(gun, req.body, function(err, ctx){ // TODO: BUG? Probably should give me ctx.graph

View File

@ -1453,6 +1453,634 @@ describe('Gun', function(){
});
describe('plural chains', function(){
it.only("get before put in memory", function(done){
var gun = Gun();
var check = {};
gun.get('g/n/m/f/l/n/r').map().on(function(v,f){
check[f] = v;
console.log("***********", f,v);
if(check.alice && check.bob && check.alice.PhD){
expect(check.alice.age).to.be(24);
expect(check.bob.age).to.be(26);
done();
}
});
console.debug.i=1;console.log("-------------------");
gun.put({_:{'#':'g/n/m/f/l/n/r'},
alice: {_:{'#':'GALICE'},
name: "alice",
age: 24,
spouse: {
name: "carl",
age: 25,
work: {
name: "GUN INC"
}
},
bout: {huh:1}
},
bob: {
name: "bob",
age: 26,
spouse: {
name: "diana",
age: 27,
work: {
name: "ACME INC"
}
}
}
});
setTimeout(function(){
console.log("~~~~~~~~~~~~~~~~~~");
gun.get('GALICE').put({PhD: true});
},300);
});
it("in memory get after", function(done){
var gun = Gun();
gun.put({_:{'#':'g/n/m/f/l/n'},
alice: {
name: "alice",
age: 24,
spouse: {
name: "carl",
age: 25,
work: {
name: "GUN INC"
}
},
bout: {huh:1}
},
bob: {
name: "bob",
age: 26,
spouse: {
name: "diana",
age: 27,
work: {
name: "ACME INC"
}
}
}
});
var check = {};
gun.get('g/n/m/f/l/n').map().on(function(v,f){
check[f] = v;
if(check.alice && check.bob){
expect(check.alice.age).to.be(24);
expect(check.bob.age).to.be(26);
done();
}
});
});
return;
it("in memory get before map path", function(done){
var gun = Gun();
var check = {};
gun.get('g/n/m/f/l/n/b/p').map().path('name').on(function(v,f){
check[v] = f;
if(check.alice && check.bob){
expect(check.alice).to.be('name');
expect(check.bob).to.be('name');
done();
}
});
gun.put({_:{'#':'g/n/m/f/l/n/b/p'},
alice: {
name: "alice",
age: 24,
spouse: {
name: "carl",
age: 25,
work: {
name: "GUN INC"
}
},
bout: {huh:1}
},
bob: {
name: "bob",
age: 26,
spouse: {
name: "diana",
age: 27,
work: {
name: "ACME INC"
}
}
}
});
});
it("in memory get after map path", function(done){
var gun = Gun();
gun.put({_:{'#':'g/n/m/f/l/n/m/p'},
alice: {
name: "alice",
age: 24,
spouse: {
name: "carl",
age: 25,
work: {
name: "GUN INC"
}
},
bout: {huh:1}
},
bob: {
name: "bob",
age: 26,
spouse: {
name: "diana",
age: 27,
work: {
name: "ACME INC"
}
}
}
});
var check = {};
gun.get('g/n/m/f/l/n/m/p').map().path('name').on(function(v,f){
check[v] = f;
if(check.alice && check.bob){
expect(check.alice).to.be('name');
expect(check.bob).to.be('name');
done();
}
});
});
it("in memory get before map path path", function(done){
var gun = Gun();
var check = {};
gun.get('g/n/m/f/l/n/b/p/p/p').map().path('spouse').path('work').on(function(v,f){
check[v.name] = f;
if(check['GUN INC'] && check['ACME INC']){
expect(check['GUN INC']).to.be('work');
expect(check['ACME INC']).to.be('work');
done();
}
});
gun.put({_:{'#':'g/n/m/f/l/n/b/p/p/p'},
alice: {
name: "alice",
age: 24,
spouse: {
name: "carl",
age: 25,
work: {
name: "GUN INC"
}
},
bout: {huh:1}
},
bob: {
name: "bob",
age: 26,
spouse: {
name: "diana",
age: 27,
work: {
name: "ACME INC"
}
}
}
});
});
it("in memory get after map path path", function(done){
var gun = Gun();
gun.put({_:{'#':'g/n/m/f/l/n/b/p/p/p/a'},
alice: {
name: "alice",
age: 24,
spouse: {
name: "carl",
age: 25,
work: {
name: "GUN INC"
}
},
bout: {huh:1}
},
bob: {
name: "bob",
age: 26,
spouse: {
name: "diana",
age: 27,
work: {
name: "ACME INC"
}
}
}
});
var check = {};
gun.get('g/n/m/f/l/n/b/p/p/p/a').map().path('spouse').path('work').on(function(v,f){
check[v.name] = f;
if(check['GUN INC'] && check['ACME INC']){
expect(check['GUN INC']).to.be('work');
expect(check['ACME INC']).to.be('work');
done();
}
});
});
it("in memory get before map map", function(done){
var gun = Gun();
var check = {};
gun.get('g/n/m/f/l/n/b/a/m/m').map().map().on(function(v,f){
check[f] = v;
if(check.alice && check.bob && check.GUN && check.ACME){
expect(check.alice.name).to.be('alice');
expect(check.alice.age).to.be(24);
expect(Gun.val.rel.is(check.alice.spouse)).to.be.ok();
expect(check.bob.name).to.be('bob');
expect(check.bob.age).to.be(26);
expect(Gun.val.rel.is(check.bob.spouse)).to.be.ok();
expect(check.GUN.name).to.be('GUN');
expect(check.ACME.name).to.be('ACME');
done();
}
});
gun.put({_:{'#':'g/n/m/f/l/n/b/a/m/m'},
users: {
alice: {
name: "alice",
age: 24,
spouse: {
name: "carl",
age: 25
},
bout: {huh:1}
},
bob: {
name: "bob",
age: 26,
spouse: {
name: "diana",
age: 27
}
}
},
companies: {
GUN: {
name: "GUN"
},
ACME: {
name: "ACME"
}
}
});
});
it("in memory get after map map", function(done){
var gun = Gun();
gun.put({_:{'#':'g/n/m/f/l/n/b/m/m'},
users: {
alice: {
name: "alice",
age: 24,
spouse: {
name: "carl",
age: 25
},
bout: {huh:1}
},
bob: {
name: "bob",
age: 26,
spouse: {
name: "diana",
age: 27
}
}
},
companies: {
GUN: {
name: "GUN"
},
ACME: {
name: "ACME"
}
}
});
var check = {};
gun.get('g/n/m/f/l/n/b/m/m').map().map().on(function(v,f){
check[f] = v;
if(check.alice && check.bob && check.GUN && check.ACME){
expect(check.alice.name).to.be('alice');
expect(check.alice.age).to.be(24);
expect(Gun.val.rel.is(check.alice.spouse)).to.be.ok();
expect(check.bob.name).to.be('bob');
expect(check.bob.age).to.be(26);
expect(Gun.val.rel.is(check.bob.spouse)).to.be.ok();
expect(check.GUN.name).to.be('GUN');
expect(check.ACME.name).to.be('ACME');
done();
}
});
});
it("in memory get before map map path", function(done){
var gun = Gun();
var check = {};
gun.get('g/n/m/f/l/n/b/m/m/p').map().map().path('name').on(function(v,f){
check[v] = f;
if(check.alice && check.bob && check.GUN && check.ACME){
expect(check.alice).to.be('name');
expect(check.bob).to.be('name');
expect(check.GUN).to.be('name');
expect(check.ACME).to.be('name');
done();
}
});
gun.put({_:{'#':'g/n/m/f/l/n/b/m/m/p'},
users: {
alice: {
name: "alice",
age: 24,
spouse: {
name: "carl",
age: 25
},
bout: {huh:1}
},
bob: {
name: "bob",
age: 26,
spouse: {
name: "diana",
age: 27
}
}
},
companies: {
GUN: {
name: "GUN"
},
ACME: {
name: "ACME"
}
}
});
});
it("in memory get after map map path", function(done){
var gun = Gun();
var check = {};
gun.put({_:{'#':'g/n/m/f/l/n/b/a/m/m/p'},
users: {
alice: {
name: "alice",
age: 24,
spouse: {
name: "carl",
age: 25
},
bout: {huh:1}
},
bob: {
name: "bob",
age: 26,
spouse: {
name: "diana",
age: 27
}
}
},
companies: {
GUN: {
name: "GUN"
},
ACME: {
name: "ACME"
}
}
});
gun.get('g/n/m/f/l/n/b/a/m/m/p').map().map().path('name').on(function(v,f){
check[v] = f;
if(check.alice && check.bob && check.GUN && check.ACME){
expect(check.alice).to.be('name');
expect(check.bob).to.be('name');
expect(check.GUN).to.be('name');
expect(check.ACME).to.be('name');
done();
}
});
});
it("in memory get before map map path path", function(done){
var gun = Gun();
var check = {};
gun.get('g/n/m/f/l/n/b/m/m/p/p').map().map().path('address').path('state').on(function(v,f){
check[v] = f;
if(check.QR && check.NY && check.CA && check.TX && check.MA){
expect(check.QR).to.be('state');
expect(check.NY).to.be('state');
expect(check.CA).to.be('state');
expect(check.TX).to.be('state');
expect(check.MA).to.be('state');
done();
}
});
gun.put({_:{'#':'g/n/m/f/l/n/b/m/m/p/p'},
users: {
alice: {
name: "alice",
age: 24,
address: {_:{'#':'QUANGO'},
state: "MA"
},
spouse: {
name: "carl",
age: 25
},
bout: {huh:1}
},
bob: {
name: "bob",
age: 26,
address: {_:{'#': 'DANDAO'},
state: "TX"
},
spouse: {
name: "diana",
age: 27
}
}
},
companies: {
GUN: {
name: "GUN",
address: {
state: "CA"
}
},
ACME: {
name: "ACME",
address: {
state: "NY"
}
}
}
});
setTimeout(function(){
gun.get('QUANGO').put({state: 'QR'});
},300);
});
it("in memory get after map map path path", function(done){
var gun = Gun();
gun.put({_:{'#':'g/n/m/f/l/n/b/a/m/m/p/p'},
users: {
alice: {
name: "alice",
age: 24,
address: {_:{'#':'QUANGO'},
state: "MA"
},
spouse: {
name: "carl",
age: 25
},
bout: {huh:1}
},
bob: {
name: "bob",
age: 26,
address: {_:{'#': 'DANDAO'},
state: "TX"
},
spouse: {
name: "diana",
age: 27
}
}
},
companies: {
GUN: {
name: "GUN",
address: {
state: "CA"
}
},
ACME: {
name: "ACME",
address: {
state: "NY"
}
}
}
});
var check = {};
gun.get('g/n/m/f/l/n/b/a/m/m/p/p').map().map().path('address').path('state').on(function(v,f){
console.log("**********", f,v);
check[v] = f;
if(check.QR && check.NY && check.CA && check.TX && check.MA){
expect(check.QR).to.be('state');
expect(check.NY).to.be('state');
expect(check.CA).to.be('state');
expect(check.TX).to.be('state');
expect(check.MA).to.be('state');
done();
}
});
setTimeout(function(){
gun.get('QUANGO').put({state: 'QR'});
},300);
});
it("in memory get before map map path path path", function(done){
var gun = Gun();
var check = {};
(window.STATE = gun.get('g/n/m/f/l/n/b/m/m/p/p/p').path('users').path('alice').path('address').path('state')).on(function(v,f){console.log("* * * * * * * *", f,v)});
gun.get('g/n/m/f/l/n/b/m/m/p/p/p').map().map().path('address').path('state')
//.path('code')
.on(function(v,f){
check[v.code] = f;
console.log("************", f,v);//return;
if(check.QR && check.NY && check.CA && check.TX && check.MA){
expect(check.QR).to.be('state');
expect(check.NY).to.be('state');
expect(check.CA).to.be('state');
expect(check.TX).to.be('state');
expect(check.MA).to.be('state');
done();
}
});
gun.put({_:{'#':'g/n/m/f/l/n/b/m/m/p/p/p'},
users: {
alice: {
name: "alice",
age: 24,
address: {_:{'#':'QUANGO'},
state: {_:{'#':'HIPPOM'},
code: "MA",
county: {
MA1: "First"
}
}
},
spouse: {
name: "carl",
age: 25
},
bout: {huh:1}
},
bob: {
name: "bob",
age: 26,
address: {_:{'#': 'DANDAO'},
state: {
code: "TX",
county: {
TX1: "First"
}
}
},
spouse: {
name: "diana",
age: 27
}
}
},
companies: {
GUN: {
name: "GUN",
address: {
state: {
code: "CA",
county: {
CA1: "First"
}
}
}
},
ACME: {
name: "ACME",
address: {
state: {
code: "NY",
county: {
NY1: "First"
}
}
}
}
}
});
setTimeout(function(){
console.debug.i=1;console.log("-------------------");
gun.get('HIPPOM').put({code: 'QR'});
},300);
});
});
return;
it('get get get any parallel', function(done){
var s = Gun.state.map();s.soul = 'parallel';
Gun.on('put', {gun: gun, put: Gun.graph.ify({

View File

@ -32,7 +32,6 @@
<script src="benchmark.js"></script>
<script src="ptsd.js"></script>
<script src="../../gun.js"></script>
<script src="file:///Users/mark/Desktop/bigJSON.js"></script>
<script src="perf.js"></script>
</body>
</html>