var path = require('path');
var fs = require('fs');
var Keyv = require('keyv');
var utils = require('./utils');
var del = require('./del');
var writeJSON = utils.writeJSON;
var cache = {
load: function (docId, cacheDir) {
var me = this;
me.keyv = new Keyv();
me.__visited = {};
me.__persisted = {};
me._pathToFile = cacheDir ? path.resolve(cacheDir, docId) : path.resolve(__dirname, '../.cache/', docId);
if (fs.existsSync(me._pathToFile)) {
me._persisted = utils.tryParse(me._pathToFile, {});
}
},
get _persisted() {
return this.__persisted;
},
set _persisted(value) {
this.__persisted = value;
this.keyv.set('persisted', value);
},
get _visited() {
return this.__visited;
},
set _visited(value) {
this.__visited = value;
this.keyv.set('visited', value);
},
loadFile: function (pathToFile) {
var me = this;
var dir = path.dirname(pathToFile);
var fName = path.basename(pathToFile);
me.load(fName, dir);
},
all: function () {
return this._persisted;
},
keys: function () {
return Object.keys(this._persisted);
},
setKey: function (key, value) {
this._visited[key] = true;
this._persisted[key] = value;
},
removeKey: function (key) {
delete this._visited[key]; delete this._persisted[key]; },
getKey: function (key) {
this._visited[key] = true;
return this._persisted[key];
},
_prune: function () {
var me = this;
var obj = {};
var keys = Object.keys(me._visited);
if (keys.length === 0) {
return;
}
keys.forEach(function (key) {
obj[key] = me._persisted[key];
});
me._visited = {};
me._persisted = obj;
},
save: function (noPrune) {
var me = this;
!noPrune && me._prune();
writeJSON(me._pathToFile, me._persisted);
},
removeCacheFile: function () {
return del(this._pathToFile);
},
destroy: function () {
var me = this;
me._visited = {};
me._persisted = {};
me.removeCacheFile();
},
};
module.exports = {
load: function (docId, cacheDir) {
return this.create(docId, cacheDir);
},
create: function (docId, cacheDir) {
var obj = Object.create(cache);
obj.load(docId, cacheDir);
return obj;
},
createFromFile: function (filePath) {
var obj = Object.create(cache);
obj.loadFile(filePath);
return obj;
},
clearCacheById: function (docId, cacheDir) {
var filePath = cacheDir ? path.resolve(cacheDir, docId) : path.resolve(__dirname, '../.cache/', docId);
return del(filePath);
},
clearAll: function (cacheDir) {
var filePath = cacheDir ? path.resolve(cacheDir) : path.resolve(__dirname, '../.cache/');
return del(filePath);
},
};