gun/lib/file.js
Thomas Kalka 61ded1b337 ws
2015-11-19 10:03:05 +01:00

106 lines
3.1 KiB
JavaScript

// This was written by the wonderful Forrest Tait
// modified by Mark to be part of core for convenience
// twas not designed for production use
// only simple local development.
var Gun = require('../gun'),
file = {};
Gun.on('opt').event(function(gun, opts) {
if ((opts.file === false) || (opts.s3 && opts.s3.key)) {
return; // don't use this plugin if S3 is being used.
}
console.log("WARNING! This `file.js` module for gun is intended only for local development testing!")
opts.file = opts.file || 'data.json';
var fs = require('fs');
file.raw = file.raw || (fs.existsSync || require('path').existsSync)(opts.file) ? fs.readFileSync(opts.file).toString() : null;
var all = file.all = file.all || Gun.obj.ify(file.raw || {
nodes: {},
keys: {}
});
all.keys = all.keys || {};
all.nodes = all.nodes || {};
// queue writes, adapted from https://github.com/toolness/jsondown/blob/master/jsondown.js
var isWriting = false, queuedWrites = [];
function writeFile(cb) {
if(isWriting) return queuedWrites.push(cb);
isWriting = true;
fs.writeFile(opts.file, Gun.text.ify(all), function(err) {
var batch = queuedWrites.splice(0);
isWriting = false;
cb(err);
if(batch.length)
writeFile( function(err) {
batch.forEach( function(cb) { cb(err); } )
});
});
}
gun.opt({hooks: {
get: function get(key, cb, o){
var graph, soul;
if(soul = Gun.is.soul(key)){
if(all.nodes[soul]){
(graph = {})[soul] = all.nodes[soul];
cb(null, graph);
(graph = {})[soul] = Gun.union.pseudo(soul);
cb(null, graph); // end.
}
return;
}
Gun.obj.map(all.keys[key], function(rel){
if(Gun.is.soul(rel)){ get(soul = rel, cb, o) }
});
return soul? cb(null, {}) : cb(null, null);
},
put: function(graph, cb, o){
for (key in gun.__.graph) all.nodes[key]=gun.__.graph[key];
writeFile(cb);
},
key: function(key, soul, cb, o){
var meta = {};
meta[Gun._.soul] = soul = Gun.is.soul(soul) || soul;
((all.keys = all.keys || {})[key] = all.keys[key] || {})[soul] = meta;
writeFile(cb);
},
all: function(list, opt, cb) {
opt = opt || {};
opt.from = opt.from || '';
opt.start = opt.from + (opt.start || '');
if(opt.end){ opt.end = opt.from + opt.end }
var match = {};
cb = cb || function(){};
Gun.obj.map(list, function(soul, key){
var end = opt.end || key;
if(key.indexOf(opt.from) === 0 && opt.start <= key && (key <= end || key.indexOf(end) === 0)){
if(opt.upto){
if(key.slice(opt.from.length).indexOf(opt.upto) === -1){
yes(soul, key);
}
} else {
yes(soul, key);
}
}
});
function yes(soul, key){
cb(key);
match[key] = {};
match[key][Gun._.soul] = soul;
}
return match;
}
}}, true);
gun.all = gun.all || function(url, cb) {
url = require('url').parse(url, true);
var r = gun.__.opt.hooks.all(all.keys, {
from: url.pathname,
upto: url.query['*'],
start: url.query['*>'],
end: url.query['*<']
});
console.log("All please", url.pathname, url.query['*'], r);
cb = cb || function() {};
cb(null, r);
}
});