mirror of
https://github.com/amark/gun.git
synced 2025-03-30 15:08:33 +00:00
69 lines
1.7 KiB
JavaScript
69 lines
1.7 KiB
JavaScript
// Take caution running this in production, it ONLY saves to disk what is in memory.
|
|
|
|
var Gun = require('../gun'),
|
|
fs = require('fs');
|
|
|
|
Gun.on('opt', function(ctx){
|
|
this.to.next(ctx);
|
|
var opt = ctx.opt;
|
|
if(ctx.once){ return }
|
|
opt.file = String(opt.file || 'data.json');
|
|
var graph = ctx.graph, acks = {}, count = 0, to;
|
|
var disk = Gun.obj.ify((fs.existsSync || require('path').existsSync)(opt.file)?
|
|
fs.readFileSync(opt.file).toString()
|
|
: null) || {};
|
|
|
|
ctx.on('put', function(at){
|
|
this.to.next(at);
|
|
Gun.graph.is(at.put, null, map);
|
|
if(!at['@']){ acks[at['#']] = true; } // only ack non-acks.
|
|
count += 1;
|
|
if(count >= (opt.batch || 10000)){
|
|
return flush();
|
|
}
|
|
if(to){ return }
|
|
to = setTimeout(flush, opt.wait || 1);
|
|
});
|
|
|
|
ctx.on('get', function(at){
|
|
this.to.next(at);
|
|
var lex = at.get, soul, data, opt, u;
|
|
//setTimeout(function(){
|
|
if(!lex || !(soul = lex['#'])){ return }
|
|
//if(0 >= at.cap){ return }
|
|
var field = lex['.'];
|
|
data = disk[soul] || u;
|
|
if(data && field){
|
|
data = Gun.state.to(data, field);
|
|
}
|
|
ctx.on('in', {'@': at['#'], put: Gun.graph.node(data)});
|
|
//},11);
|
|
});
|
|
|
|
var map = function(val, key, node, soul){
|
|
disk[soul] = Gun.state.to(node, key, disk[soul]);
|
|
}
|
|
|
|
var wait;
|
|
var flush = function(){
|
|
if(wait){ return }
|
|
wait = true;
|
|
clearTimeout(to);
|
|
to = false;
|
|
var ack = acks;
|
|
acks = {};
|
|
fs.writeFile(opt.file, JSON.stringify(disk, null, 2), function(err, ok){
|
|
wait = false;
|
|
var tmp = count;
|
|
count = 0;
|
|
Gun.obj.map(ack, function(yes, id){
|
|
ctx.on('in', {
|
|
'@': id,
|
|
err: err,
|
|
ok: 0 // memdisk should not be relied upon as permanent storage.
|
|
});
|
|
});
|
|
if(1 < tmp){ flush() }
|
|
});
|
|
}
|
|
}); |