UNPKG

@reactant/context

Version:
198 lines (151 loc) 17.5 kB
"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=