108 lines
3.9 KiB
JavaScript
108 lines
3.9 KiB
JavaScript
|
'use strict';
|
||
|
exports.__esModule = true;
|
||
|
var fs = require("fs");
|
||
|
var path_1 = require("path");
|
||
|
var crypto_1 = require("crypto");
|
||
|
function jsonParse(data, cb) {
|
||
|
var result = null;
|
||
|
try {
|
||
|
result = JSON.parse(data);
|
||
|
}
|
||
|
catch (ex) {
|
||
|
return cb(ex);
|
||
|
}
|
||
|
cb(null, result);
|
||
|
}
|
||
|
var FileCache = /** @class */ (function () {
|
||
|
function FileCache(location) {
|
||
|
this._location = location;
|
||
|
}
|
||
|
FileCache.prototype.getResponse = function (url, callback) {
|
||
|
var key = path_1.resolve(this._location, this.getCacheKey(url));
|
||
|
fs.readFile(key + '.json', 'utf8', function (err, data) {
|
||
|
if (err && err.code === 'ENOENT')
|
||
|
return callback(null, null);
|
||
|
else if (err)
|
||
|
return callback(err, null);
|
||
|
jsonParse(data, function (err, response) {
|
||
|
if (err) {
|
||
|
return callback(err, null);
|
||
|
}
|
||
|
var body = fs.createReadStream(key + '.body');
|
||
|
response.body = body;
|
||
|
callback(null, response);
|
||
|
});
|
||
|
});
|
||
|
};
|
||
|
FileCache.prototype.setResponse = function (url, response) {
|
||
|
var key = path_1.resolve(this._location, this.getCacheKey(url));
|
||
|
var errored = false;
|
||
|
fs.mkdir(this._location, { recursive: true }, function (err) {
|
||
|
if (err && err.code !== 'EEXIST') {
|
||
|
console.warn('Error creating cache: ' + err.message);
|
||
|
return;
|
||
|
}
|
||
|
response.body.pipe(fs.createWriteStream(key + '.body')).on('error', function (err) {
|
||
|
errored = true;
|
||
|
console.warn('Error writing to cache: ' + err.message);
|
||
|
}).on('close', function () {
|
||
|
if (!errored) {
|
||
|
fs.writeFile(key + '.json', JSON.stringify({
|
||
|
statusCode: response.statusCode,
|
||
|
headers: response.headers,
|
||
|
requestHeaders: response.requestHeaders,
|
||
|
requestTimestamp: response.requestTimestamp
|
||
|
}, null, ' '), function (err) {
|
||
|
if (err) {
|
||
|
console.warn('Error writing to cache: ' + err.message);
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
});
|
||
|
});
|
||
|
};
|
||
|
FileCache.prototype.updateResponseHeaders = function (url, response) {
|
||
|
var key = path_1.resolve(this._location, this.getCacheKey(url));
|
||
|
fs.readFile(key + '.json', 'utf8', function (err, data) {
|
||
|
if (err) {
|
||
|
console.warn('Error writing to cache: ' + err.message);
|
||
|
return;
|
||
|
}
|
||
|
var parsed = null;
|
||
|
try {
|
||
|
parsed = JSON.parse(data);
|
||
|
}
|
||
|
catch (ex) {
|
||
|
console.warn('Error writing to cache: ' + ex.message);
|
||
|
return;
|
||
|
}
|
||
|
fs.writeFile(key + '.json', JSON.stringify({
|
||
|
statusCode: parsed.statusCode,
|
||
|
headers: response.headers,
|
||
|
requestHeaders: parsed.requestHeaders,
|
||
|
requestTimestamp: response.requestTimestamp
|
||
|
}, null, ' '), function (err) {
|
||
|
if (err) {
|
||
|
console.warn('Error writing to cache: ' + err.message);
|
||
|
}
|
||
|
});
|
||
|
});
|
||
|
};
|
||
|
FileCache.prototype.invalidateResponse = function (url, callback) {
|
||
|
var key = path_1.resolve(this._location, this.getCacheKey(url));
|
||
|
fs.unlink(key + '.json', function (err) {
|
||
|
if (err && err.code === 'ENOENT')
|
||
|
return callback(null);
|
||
|
else
|
||
|
callback(err || null);
|
||
|
});
|
||
|
};
|
||
|
FileCache.prototype.getCacheKey = function (url) {
|
||
|
var hash = crypto_1.createHash('sha512');
|
||
|
hash.update(url);
|
||
|
return hash.digest('hex');
|
||
|
};
|
||
|
return FileCache;
|
||
|
}());
|
||
|
exports["default"] = FileCache;
|