123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 |
- // 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() }
- });
- }
- });
|