98 lines
2.4 KiB
JavaScript
98 lines
2.4 KiB
JavaScript
/**
|
|
* Copyright (c) Facebook, Inc. and its affiliates.
|
|
*
|
|
* This source code is licensed under the MIT license found in the
|
|
* LICENSE file in the root directory of this source tree.
|
|
*
|
|
* strict-local
|
|
* @format
|
|
*/
|
|
'use strict';
|
|
|
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
|
|
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
|
|
var Profiler = require("./GraphQLCompilerProfiler");
|
|
|
|
var crypto = require("crypto");
|
|
|
|
var fs = require("fs");
|
|
|
|
var os = require("os");
|
|
|
|
var path = require("path");
|
|
/**
|
|
* A file backed cache. Values are JSON encoded on disk, so only JSON
|
|
* serializable values should be used.
|
|
*/
|
|
|
|
|
|
var RelayCompilerCache =
|
|
/*#__PURE__*/
|
|
function () {
|
|
/**
|
|
* @param name Human readable identifier for the cache
|
|
* @param cacheBreaker This should be changed in order to invalidate existing
|
|
* caches.
|
|
*/
|
|
function RelayCompilerCache(name, cacheBreaker) {
|
|
(0, _defineProperty2["default"])(this, "_dir", null);
|
|
this._name = name;
|
|
this._cacheBreaker = cacheBreaker;
|
|
}
|
|
|
|
var _proto = RelayCompilerCache.prototype;
|
|
|
|
_proto._getFile = function _getFile(key) {
|
|
if (this._dir == null) {
|
|
// Include username in the cache dir to avoid issues with directories being
|
|
// owned by a different user.
|
|
var username = os.userInfo().username;
|
|
var cacheID = crypto.createHash('md5').update(this._cacheBreaker).update(username).digest('hex');
|
|
var dir = path.join(os.tmpdir(), "".concat(this._name, "-").concat(cacheID));
|
|
|
|
if (!fs.existsSync(dir)) {
|
|
try {
|
|
fs.mkdirSync(dir);
|
|
} catch (error) {
|
|
if (error.code !== 'EEXIST') {
|
|
throw error;
|
|
}
|
|
}
|
|
}
|
|
|
|
this._dir = dir;
|
|
}
|
|
|
|
return path.join(this._dir, key);
|
|
};
|
|
|
|
_proto.getOrCompute = function getOrCompute(key, compute) {
|
|
var _this = this;
|
|
|
|
return Profiler.run('RelayCompilerCache.getOrCompute', function () {
|
|
var cacheFile = _this._getFile(key);
|
|
|
|
if (fs.existsSync(cacheFile)) {
|
|
try {
|
|
return JSON.parse(fs.readFileSync(cacheFile, 'utf8'));
|
|
} catch (_unused) {// ignore
|
|
}
|
|
}
|
|
|
|
var value = compute();
|
|
|
|
try {
|
|
fs.writeFileSync(cacheFile, JSON.stringify(value), 'utf8');
|
|
} catch (_unused2) {// ignore
|
|
}
|
|
|
|
return value;
|
|
});
|
|
};
|
|
|
|
return RelayCompilerCache;
|
|
}();
|
|
|
|
module.exports = RelayCompilerCache; |