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