@reactant/context
Version:
198 lines (151 loc) • 17.5 kB
JavaScript
"use strict";
require("core-js/modules/es.symbol");
require("core-js/modules/es.array.filter");
require("core-js/modules/es.array.find");
require("core-js/modules/es.array.for-each");
require("core-js/modules/es.array.includes");
require("core-js/modules/es.array.index-of");
require("core-js/modules/es.function.name");
require("core-js/modules/es.object.assign");
require("core-js/modules/es.object.get-own-property-descriptor");
require("core-js/modules/es.object.get-own-property-descriptors");
require("core-js/modules/es.object.keys");
require("core-js/modules/es.object.to-string");
require("core-js/modules/es.regexp.to-string");
require("core-js/modules/es.string.includes");
require("core-js/modules/web.dom-collections.for-each");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _nodeSigar = _interopRequireDefault(require("node-sigar"));
var _fsExtra = _interopRequireDefault(require("fs-extra"));
var _path = _interopRequireDefault(require("path"));
var _pkgDir = _interopRequireDefault(require("pkg-dir"));
var _nodePstree = _interopRequireDefault(require("node-pstree"));
var _flatted = require("flatted");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
var rootPath = _pkgDir.default.sync(process.cwd()) || process.cwd();
var sigar = new _nodeSigar.default();
var State = /*#__PURE__*/function () {
function State() {
var _this = this;
var name = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'state';
var postprocess = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function (state) {
return state;
};
_classCallCheck(this, State);
this.name = name;
this.postprocess = postprocess;
this._isMaster = void 0;
this._masterPid = void 0;
this._parentMasterPid = void 0;
this._state = void 0;
this.currentProcStarted = false;
this.projectName = 'reactant';
this.statePath = void 0;
this.stateDir = void 0;
process.on('SIGINT', function () {
return _this.finish();
});
process.on('SIGTERM', function () {
return _this.finish();
});
if (_fsExtra.default.pathExistsSync(_path.default.resolve(rootPath, 'package.json'))) {
this.stateDir = _path.default.resolve(rootPath, 'node_modules/.tmp', this.projectName, this.masterPid.toString());
} else {
this.stateDir = _path.default.resolve('/tmp', this.projectName, this.masterPid.toString());
}
this.statePath = _path.default.resolve(this.stateDir, 'state.json');
if (this.currentProcStarted) return this;
this.currentProcStarted = true;
if (this.isStarted) return this;
_fsExtra.default.mkdirsSync(this.stateDir);
_fsExtra.default.writeFile(this.statePath, (0, _flatted.stringify)({
master: {
pid: process.pid
}
}));
}
_createClass(State, [{
key: "getParentMasterPid",
value: function getParentMasterPid() {
var _psTree, _psTree$parents$find;
if (typeof this._parentMasterPid !== 'undefined') return this._parentMasterPid;
this._parentMasterPid = ((_psTree = (0, _nodePstree.default)(process.pid)) === null || _psTree === void 0 ? void 0 : (_psTree$parents$find = _psTree.parents.find(function (procNode) {
return procNode.args.find(function (arg) {
return arg.indexOf('@reactant/cli/bin.js') > -1;
});
})) === null || _psTree$parents$find === void 0 ? void 0 : _psTree$parents$find.pid) || null;
return this._parentMasterPid;
}
}, {
key: "processAlive",
value: function processAlive(pid) {
return sigar.procList.includes(pid);
}
}, {
key: "finish",
value: function finish() {
try {
_fsExtra.default.removeSync(this.statePath); // eslint-disable-next-line no-empty
} catch (err) {}
}
}, {
key: "masterPid",
get: function get() {
if (typeof this._masterPid !== 'undefined') return this._masterPid;
var masterPid = this.getParentMasterPid();
this._masterPid = typeof masterPid === 'number' ? masterPid : process.pid;
return this._masterPid;
}
}, {
key: "isMaster",
get: function get() {
if (typeof this._isMaster !== 'undefined') return this._isMaster;
this._isMaster = typeof this.getParentMasterPid() !== 'number';
return this._isMaster;
}
}, {
key: "isStarted",
get: function get() {
return _fsExtra.default.existsSync(this.statePath) && this.processAlive(this.masterPid);
}
}, {
key: "state",
get: function get() {
if (this.isMaster) return this._state;
if (!_fsExtra.default.pathExistsSync(this.statePath)) return undefined;
return this.postprocess((0, _flatted.parse)(_fsExtra.default.readFileSync(this.statePath).toString()).state);
},
set: function set(state) {
var _this2 = this;
state = _objectSpread({}, state || {});
if (this.isStarted && !this.isMaster) {
throw new Error('must be master to set state');
}
if (typeof this._state === 'undefined') this._state = {};
Object.keys(this._state).forEach(function (key) {
// @ts-ignore
delete _this2._state[key];
});
Object.assign(this._state, state);
if (typeof state === 'undefined') {
_fsExtra.default.unlinkSync(this.statePath);
} else {
_fsExtra.default.writeFileSync(this.statePath, (0, _flatted.stringify)({
state: state
}));
}
}
}]);
return State;
}();
exports.default = State;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9zdGF0ZS50cyJdLCJuYW1lcyI6WyJyb290UGF0aCIsInBrZ0RpciIsInN5bmMiLCJwcm9jZXNzIiwiY3dkIiwic2lnYXIiLCJTaWdhciIsIlN0YXRlIiwibmFtZSIsInBvc3Rwcm9jZXNzIiwic3RhdGUiLCJfaXNNYXN0ZXIiLCJfbWFzdGVyUGlkIiwiX3BhcmVudE1hc3RlclBpZCIsIl9zdGF0ZSIsImN1cnJlbnRQcm9jU3RhcnRlZCIsInByb2plY3ROYW1lIiwic3RhdGVQYXRoIiwic3RhdGVEaXIiLCJvbiIsImZpbmlzaCIsImZzIiwicGF0aEV4aXN0c1N5bmMiLCJwYXRoIiwicmVzb2x2ZSIsIm1hc3RlclBpZCIsInRvU3RyaW5nIiwiaXNTdGFydGVkIiwibWtkaXJzU3luYyIsIndyaXRlRmlsZSIsIm1hc3RlciIsInBpZCIsInBhcmVudHMiLCJmaW5kIiwicHJvY05vZGUiLCJhcmdzIiwiYXJnIiwiaW5kZXhPZiIsInByb2NMaXN0IiwiaW5jbHVkZXMiLCJyZW1vdmVTeW5jIiwiZXJyIiwiZ2V0UGFyZW50TWFzdGVyUGlkIiwiZXhpc3RzU3luYyIsInByb2Nlc3NBbGl2ZSIsImlzTWFzdGVyIiwidW5kZWZpbmVkIiwicmVhZEZpbGVTeW5jIiwiRXJyb3IiLCJPYmplY3QiLCJrZXlzIiwiZm9yRWFjaCIsImtleSIsImFzc2lnbiIsInVubGlua1N5bmMiLCJ3cml0ZUZpbGVTeW5jIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFQSxJQUFNQSxRQUFRLEdBQUdDLGdCQUFPQyxJQUFQLENBQVlDLE9BQU8sQ0FBQ0MsR0FBUixFQUFaLEtBQThCRCxPQUFPLENBQUNDLEdBQVIsRUFBL0M7QUFDQSxJQUFNQyxLQUFLLEdBQUcsSUFBSUMsa0JBQUosRUFBZDs7SUFFcUJDLEs7QUFxQm5CLG1CQUE2RTtBQUFB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LElBQVAsQ0FBWSxLQUFLcEMsTUFBakIsRUFBeUJxQyxPQUF6QixDQUFpQyxVQUFDQyxHQUFELEVBQWlCO0FBQ2hEO0FBQ0EsZUFBTyxNQUFJLENBQUN0QyxNQUFMLENBQVlzQyxHQUFaLENBQVA7QUFDRCxPQUhEO0FBSUFILE1BQUFBLE1BQU0sQ0FBQ0ksTUFBUCxDQUFjLEtBQUt2QyxNQUFuQixFQUEyQkosS0FBM0I7O0FBQ0EsVUFBSSxPQUFPQSxLQUFQLEtBQWlCLFdBQXJCLEVBQWtDO0FBQ2hDVyx5QkFBR2lDLFVBQUgsQ0FBYyxLQUFLckMsU0FBbkI7QUFDRCxPQUZELE1BRU87QUFDTEkseUJBQUdrQyxhQUFILENBQWlCLEtBQUt0QyxTQUF0QixFQUFpQyx3QkFBVTtBQUFFUCxVQUFBQSxLQUFLLEVBQUxBO0FBQUYsU0FBVixDQUFqQztBQUNEO0FBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgU2lnYXIgZnJvbSAnbm9kZS1zaWdhcic7XG5pbXBvcnQgZnMgZnJvbSAnZnMtZXh0cmEnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgcGtnRGlyIGZyb20gJ3BrZy1kaXInO1xuaW1wb3J0IHBzVHJlZSwgeyBQcm9jTm9kZSB9IGZyb20gJ25vZGUtcHN0cmVlJztcbmltcG9ydCB7IHBhcnNlLCBzdHJpbmdpZnkgfSBmcm9tICdmbGF0dGVkJztcblxuY29uc3Qgcm9vdFBhdGggPSBwa2dEaXIuc3luYyhwcm9jZXNzLmN3ZCgpKSB8fCBwcm9jZXNzLmN3ZCgpO1xuY29uc3Qgc2lnYXIgPSBuZXcgU2lnYXIoKTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3RhdGU8XG4gIFQgPSB7XG4gICAgW2tleTogc3RyaW5nXTogYW55O1xuICB9XG4+IHtcbiAgX2lzTWFzdGVyOiBib29sZWFuO1xuXG4gIF9tYXN0ZXJQaWQ6IG51bWJlcjtcblxuICBfcGFyZW50TWFzdGVyUGlkOiBudW1iZXIgfCBudWxsO1xuXG4gIF9zdGF0ZTogVDtcblxuICBjdXJyZW50UHJvY1N0YXJ0ZWQgPSBmYWxzZTtcblxuICBwcm9qZWN0TmFtZSA9ICdyZWFjdGFudCc7XG5cbiAgc3RhdGVQYXRoOiBzdHJpbmc7XG5cbiAgc3RhdGVEaXI6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZSA9ICdzdGF0ZScsIHB1YmxpYyBwb3N0cHJvY2VzcyA9IChzdGF0ZTogVCkgPT4gc3RhdGUpIHtcbiAgICBwcm9jZXNzLm9uKCdTSUdJTlQnLCAoKSA9PiB0aGlzLmZpbmlzaCgpKTtcbiAgICBwcm9jZXNzLm9uKCdTSUdURVJNJywgKCkgPT4gdGhpcy5maW5pc2goKSk7XG4gICAgaWYgKGZzLnBhdGhFeGlzdHNTeW5jKHBhdGgucmVzb2x2ZShyb290UGF0aCwgJ3BhY2thZ2UuanNvbicpKSkge1xuICAgICAgdGhpcy5zdGF0ZURpciA9IHBhdGgucmVzb2x2ZShcbiAgICAgICAgcm9vdFBhdGgsXG4gICAgICAgICdub2RlX21vZHVsZXMvLnRtcCcsXG4gICAgICAgIHRoaXMucHJvamVjdE5hbWUsXG4gICAgICAgIHRoaXMubWFzdGVyUGlkLnRvU3RyaW5nKClcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc3RhdGVEaXIgPSBwYXRoLnJlc29sdmUoXG4gICAgICAgICcvdG1wJyxcbiAgICAgICAgdGhpcy5wcm9qZWN0TmFtZSxcbiAgICAgICAgdGhpcy5tYXN0ZXJQaWQudG9TdHJpbmcoKVxuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy5zdGF0ZVBhdGggPSBwYXRoLnJlc29sdmUodGhpcy5zdGF0ZURpciwgJ3N0YXRlLmpzb24nKTtcbiAgICBpZiAodGhpcy5jdXJyZW50UHJvY1N0YXJ0ZWQpIHJldHVybiB0aGlzO1xuICAgIHRoaXMuY3VycmVudFByb2NTdGFydGVkID0gdHJ1ZTtcbiAgICBpZiAodGhpcy5pc1N0YXJ0ZWQpIHJldHVybiB0aGlzO1xuICAgIGZzLm1rZGlyc1N5bmModGhpcy5zdGF0ZURpcik7XG4gICAgZnMud3JpdGVGaWxlKHRoaXMuc3RhdGVQYXRoLCBzdHJpbmdpZnkoeyBtYXN0ZXI6IHsgcGlkOiBwcm9jZXNzLnBpZCB9IH0pKTtcbiAgfVxuXG4gIGdldFBhcmVudE1hc3RlclBpZCgpOiBudW1iZXIgfCBudWxsIHtcbiAgICBpZiAodHlwZW9mIHRoaXMuX3BhcmVudE1hc3RlclBpZCAhPT0gJ3VuZGVmaW5lZCcpXG4gICAgICByZXR1cm4gdGhpcy5fcGFyZW50TWFzdGVyUGlkO1xuICAgIHRoaXMuX3BhcmVudE1hc3RlclBpZCA9XG4gICAgICBwc1RyZWUocHJvY2Vzcy5waWQpPy5wYXJlbnRzLmZpbmQoKHByb2NOb2RlOiBQcm9jTm9kZSkgPT4ge1xuICAgICAgICByZXR1cm4gcHJvY05vZGUuYXJncy5maW5kKChhcmc6IHN0cmluZykgPT4ge1xuICAgICAgICAgIHJldHVybiBhcmcuaW5kZXhPZignQHJlYWN0YW50L2NsaS9iaW4uanMnKSA+IC0xO1xuICAgICAgICB9KTtcbiAgICAgIH0pPy5waWQgfHwgbnVsbDtcbiAgICByZXR1cm4gdGhpcy5fcGFyZW50TWFzdGVyUGlkO1xuICB9XG5cbiAgZ2V0IG1hc3RlclBpZCgpOiBudW1iZXIge1xuICAgIGlmICh0eXBlb2YgdGhpcy5fbWFzdGVyUGlkICE9PSAndW5kZWZpbmVkJykgcmV0dXJuIHRoaXMuX21hc3RlclBpZDtcbiAgICBjb25zdCBtYXN0ZXJQaWQgPSB0aGlzLmdldFBhcmVudE1hc3RlclBpZCgpO1xuICAgIHRoaXMuX21hc3RlclBpZCA9IHR5cGVvZiBtYXN0ZXJQaWQgPT09ICdudW1iZXInID8gbWFzdGVyUGlkIDogcHJvY2Vzcy5waWQ7XG4gICAgcmV0dXJuIHRoaXMuX21hc3RlclBpZDtcbiAgfVxuXG4gIGdldCBpc01hc3RlcigpOiBib29sZWFuIHtcbiAgICBpZiAodHlwZW9mIHRoaXMuX2lzTWFzdGVyICE9PSAndW5kZWZpbmVkJykgcmV0dXJuIHRoaXMuX2lzTWFzdGVyO1xuICAgIHRoaXMuX2lzTWFzdGVyID0gdHlwZW9mIHRoaXMuZ2V0UGFyZW50TWFzdGVyUGlkKCkgIT09ICdudW1iZXInO1xuICAgIHJldHVybiB0aGlzLl9pc01hc3RlcjtcbiAgfVxuXG4gIGdldCBpc1N0YXJ0ZWQoKSB7XG4gICAgcmV0dXJuIGZzLmV4aXN0c1N5bmModGhpcy5zdGF0ZVBhdGgpICYmIHRoaXMucHJvY2Vzc0FsaXZlKHRoaXMubWFzdGVyUGlkKTtcbiAgfVxuXG4gIGdldCBzdGF0ZSgpOiBUIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5pc01hc3RlcikgcmV0dXJuIHRoaXMuX3N0YXRlO1xuICAgIGlmICghZnMucGF0aEV4aXN0c1N5bmModGhpcy5zdGF0ZVBhdGgpKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiB0aGlzLnBvc3Rwcm9jZXNzKFxuICAgICAgcGFyc2UoZnMucmVhZEZpbGVTeW5jKHRoaXMuc3RhdGVQYXRoKS50b1N0cmluZygpKS5zdGF0ZVxuICAgICk7XG4gIH1cblxuICBzZXQgc3RhdGUoc3RhdGU6IFQgfCB1bmRlZmluZWQpIHtcbiAgICBzdGF0ZSA9IHsgLi4uKHN0YXRlIHx8ICh7fSBhcyBUKSkgfTtcbiAgICBpZiAodGhpcy5pc1N0YXJ0ZWQgJiYgIXRoaXMuaXNNYXN0ZXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbXVzdCBiZSBtYXN0ZXIgdG8gc2V0IHN0YXRlJyk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdGhpcy5fc3RhdGUgPT09ICd1bmRlZmluZWQnKSB0aGlzLl9zdGF0ZSA9IHt9IGFzIFQ7XG4gICAgT2JqZWN0LmtleXModGhpcy5fc3RhdGUpLmZvckVhY2goKGtleTogc3RyaW5nKSA9PiB7XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICBkZWxldGUgdGhpcy5fc3RhdGVba2V5XTtcbiAgICB9KTtcbiAgICBPYmplY3QuYXNzaWduKHRoaXMuX3N0YXRlLCBzdGF0ZSk7XG4gICAgaWYgKHR5cGVvZiBzdGF0ZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGZzLnVubGlua1N5bmModGhpcy5zdGF0ZVBhdGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBmcy53cml0ZUZpbGVTeW5jKHRoaXMuc3RhdGVQYXRoLCBzdHJpbmdpZnkoeyBzdGF0ZSB9KSk7XG4gICAgfVxuICB9XG5cbiAgcHJvY2Vzc0FsaXZlKHBpZDogbnVtYmVyKSB7XG4gICAgcmV0dXJuIHNpZ2FyLnByb2NMaXN0LmluY2x1ZGVzKHBpZCk7XG4gIH1cblxuICBmaW5pc2goKSB7XG4gICAgdHJ5IHtcbiAgICAgIGZzLnJlbW92ZVN5bmModGhpcy5zdGF0ZVBhdGgpO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWVtcHR5XG4gICAgfSBjYXRjaCAoZXJyKSB7fVxuICB9XG59XG4iXX0=