You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
103 lines
2.3 KiB
103 lines
2.3 KiB
'use strict'; |
|
|
|
var path = require('path'); |
|
|
|
var assign = require('object-assign'); |
|
var fs = require('graceful-fs'); |
|
var mkdirp = require('mkdirp'); |
|
var rimraf = require('rimraf'); |
|
var tmpDir = require('os').tmpdir(); |
|
|
|
function CacheSwap(options) { |
|
this.options = assign({ |
|
tmpDir: tmpDir, |
|
cacheDirName: 'defaultCacheSwap' |
|
}, options); |
|
} |
|
|
|
assign(CacheSwap.prototype, { |
|
clear: function(category, cb) { |
|
var dir = path.join(this.options.tmpDir, this.options.cacheDirName, category || ''); |
|
rimraf(dir, {disableGlob: true}, cb); |
|
}, |
|
|
|
hasCached: function(category, hash, cb) { |
|
var filePath = this.getCachedFilePath(category, hash); |
|
|
|
fs.exists(filePath, function(exists) { |
|
return cb(exists, exists ? filePath : null); |
|
}); |
|
}, |
|
|
|
getCached: function(category, hash, cb) { |
|
var filePath = this.getCachedFilePath(category, hash); |
|
|
|
fs.readFile(filePath, function(err, fileStream) { |
|
if (err) { |
|
if (err.code === 'ENOENT') { |
|
cb(); |
|
return; |
|
} |
|
|
|
cb(err); |
|
return; |
|
} |
|
|
|
cb(null, { |
|
contents: fileStream.toString(), |
|
path: filePath |
|
}); |
|
}); |
|
}, |
|
|
|
addCached: function(category, hash, contents, cb) { |
|
var filePath = this.getCachedFilePath(category, hash); |
|
|
|
mkdirp(path.dirname(filePath), {mode: parseInt('0777', 8)}, function(mkdirErr) { |
|
if (mkdirErr) { |
|
cb(mkdirErr); |
|
return; |
|
} |
|
|
|
fs.writeFile(filePath, contents, {mode: parseInt('0777', 8)}, function(writeErr) { |
|
if (writeErr) { |
|
cb(writeErr); |
|
return; |
|
} |
|
|
|
fs.chmod(filePath, parseInt('0777', 8), function(chmodErr) { |
|
if (chmodErr) { |
|
cb(chmodErr); |
|
return; |
|
} |
|
|
|
cb(null, filePath); |
|
}); |
|
}); |
|
}); |
|
}, |
|
|
|
removeCached: function(category, hash, cb) { |
|
var filePath = this.getCachedFilePath(category, hash); |
|
|
|
fs.unlink(filePath, function(err) { |
|
if (err) { |
|
if (err.code === 'ENOENT') { |
|
cb(); |
|
return; |
|
} |
|
|
|
cb(err); |
|
return; |
|
} |
|
|
|
cb(); |
|
}); |
|
}, |
|
|
|
getCachedFilePath: function(category, hash) { |
|
return path.join(this.options.tmpDir, this.options.cacheDirName, category, hash); |
|
} |
|
}); |
|
|
|
module.exports = CacheSwap;
|
|
|