enb
Version:
Faster BEM/BEViS assembler
152 lines (136 loc) • 4.44 kB
JavaScript
/**
* Cache
* =====
*/
var fs = require('fs');
var path = require('path');
/**
* Cache — интерфейс для кэширования.
* @name Cache
* @param {CacheStorage} storage Хранилище.
* @param {String} prefix Префикс для данного кэша в рамках хранилища.
* @constructor
*/
function Cache(storage, prefix) {
this._storage = storage;
this._prefix = prefix;
}
Cache.prototype = {
/**
* Возвращает данные из кэша по ключу.
* @param {String} key
* @returns {Object}
*/
get: function (key) {
return this._storage.get(this._prefix, key);
},
/**
* Устанавливает данные в кэше по ключу.
* @param {String} key
* @param {Object} value
*/
set: function (key, value) {
this._storage.set(this._prefix, key, value);
},
/**
* Удаляет данные кэша по ключу.
* @param {String} key
*/
invalidate: function (key) {
this._storage.invalidate(this._prefix, key);
},
/**
* Очищает кэш.
*/
drop: function () {
this._storage.dropPrefix(this._prefix);
},
/**
* Возвращает новый интерфейс к хранилищу кэша с дополненным префиксом.
* @param {String} name
* @returns {Cache}
*/
subCache: function (name) {
return new Cache(this._storage, this._prefix + '/' + name);
},
/**
* Возвращает информацию о файле по полному пути.
* @param {String} fullname
* @returns {{name: *, fullname: *, suffix: string, mtime: null}}
* @private
*/
_getFileInfo: function (fullname) {
var filename = path.basename(fullname);
var mtime = null;
if (fs.existsSync(fullname)) {
mtime = fs.statSync(fullname).mtime.getTime();
}
return {
name: filename,
fullname: fullname,
suffix: filename.split('.').slice(1).join('.'),
mtime: mtime
};
},
/**
* Возвращает true, если время изменения для файла изменилиась по данному ключу.
* В противном случае возвращает false.
* @param {String} cacheKey
* @param {String} filename
* @returns {Boolean}
*/
needRebuildFile: function (cacheKey, filename) {
var cachedFile = this.get(cacheKey);
if (cachedFile) {
return cachedFile.mtime !== this._getFileInfo(filename).mtime;
} else {
return true;
}
},
/**
* Кэширует информацию о файле для последующего сравнения.
* @param {String} cacheKey
* @param {String} filename
*/
cacheFileInfo: function (cacheKey, filename) {
this.set(cacheKey, this._getFileInfo(filename));
},
/**
* Возвращает true, если время изменения для файлов изменились по данному ключу.
* В противном случае возвращает false.
* @param {String} cacheKey
* @param {Object[]} files
* @returns {Boolean}
*/
needRebuildFileList: function (cacheKey, files) {
var cachedFiles = this.get(cacheKey);
if (cachedFiles && Array.isArray(cachedFiles)) {
var l = files.length;
if (l !== cachedFiles.length) {
return true;
}
for (var i = 0; i < l; i++) {
var cf = cachedFiles[i];
var fileInfo = files[i];
if (cf.mtime !== fileInfo.mtime || cf.fullname !== fileInfo.fullname) {
return true;
}
}
return false;
} else {
return true;
}
},
/**
* Кэширует информацию о списке файлов для последующего сравнения.
* @param {String} cacheKey
* @param {Object[]} filelist
*/
cacheFileList: function (cacheKey, filelist) {
this.set(cacheKey, filelist);
},
destruct: function () {
delete this._storage;
}
};
module.exports = Cache;