jsonbase-store
Version:
Simple file based data-store
61 lines (54 loc) • 2.03 kB
JavaScript
var fs = require('fs');
var es = require('event-stream');
const NEWLINE = '\n';
module.exports = function (store, key) {
const updatedFile = `${store}.updated`;
return new Promise((resolve, reject) => {
if(!store)
throw 'EEXIST';
var read = fs.createReadStream(store)
const stream = fs.createWriteStream(updatedFile, { encoding: 'utf8', autoClose: true });
var __discard = false;
var __removed = false;
read.pipe(es.split()).pipe(
es.mapSync(function (line) {
var __value__ = line.toString().trim().split('|');
if ((__value__[0].toString().trim() == key)) {
if ((__value__[2].toString() != 'null') && (moment(+__value__[2]).isBefore(moment()))) {
/**
* 1. Stop stream
* 2. Discard updated file
*/
__discard = true;
return reject('107');
}
__removed = true;
line = '';
}
stream.write((line.trim() == '') ? line : (line + NEWLINE));
}).on('error', function (err) {
console.debug('Error while reading file.', err);
return reject('108');
}).on('end', function () {
if (!read.destroyed)
read.destroy();
stream.end();
if (__removed && !__discard)
return resolve(true);
if (!__removed && !__discard)
return resolve(false)
})
);
stream.on('finish', async () => {
try {
if (__discard)
return fs.unlinkSync(updatedFile);
replace(store, updatedFile)
} catch (error) {
}
});
})
}
function replace(oldPath, newPath) {
fs.renameSync(newPath, oldPath);
}