webpack/lib/Cache.js

66 lines
1.4 KiB
JavaScript

/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
var fs = require("fs");
function Cache(options) {
this.options = options = options || {};
this.map = {};
}
var $ = Cache.prototype;
module.exports = Cache;
$.get = function(request, callback) {
var self = this;
var item = self.map[request];
if(!item) return callback(new Error("No Entry"));
var count = item.files.length;
var invalid = false;
item.files.forEach(function(file) {
fs.stat(file.path, function(err, stat) {
if(err) return invalidate(err.toString());
if(!stat) return invalidate("Cannot read stat");
if(stat.mtime.getTime() !== file.time)
return invalidate("File " + file.path + " has changed");
valid();
});
});
if(item.files.length === 0) valid();
function invalidate(msg) {
if(invalid) return;
invalid = true;
callback(new Error(msg));
}
function valid() {
if(invalid) return;
count--;
if(count <= 0)
callback(null, item.value);
}
}
$.create = function(request) {
var self = this;
var item = {
files: []
};
var cacheEntry = {
add: function(path) {
item.files.push({
path: path,
// TODO do it asynchronly
time: fs.statSync(path).mtime.getTime()
});
},
clear: function() {
item.files.length = 0;
},
save: function(value) {
item.value = value;
self.map[request] = item;
cacheEntry.saved = true;
}
}
return cacheEntry;
}