cli-engine
Version:
Generic CLI Framework
67 lines (49 loc) • 1.54 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
require('cli-engine-config');
var _rwlockfile = require('rwlockfile');
var _rwlockfile2 = _interopRequireDefault(_rwlockfile);
var _path = require('path');
var _path2 = _interopRequireDefault(_path);
var _cliUx = require('cli-ux');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
class Lock {
constructor(config) {
this.config = config;
this.cli = new _cliUx.CLI({ mock: config.mock });
}
get updatelockfile() {
return _path2.default.join(this.config.cacheDir, 'update.lock');
}
// get read lock
async read() {
return _rwlockfile2.default.read(this.updatelockfile);
}
async unread() {
await _rwlockfile2.default.unread(this.updatelockfile);
}
async canRead() {
let hasWriter = await _rwlockfile2.default.hasWriter(this.updatelockfile);
return !hasWriter;
}
// upgrade to writer
async upgrade() {
// take off reader
await this.unread();
// check for other readers
if (await _rwlockfile2.default.hasReaders(this.updatelockfile)) {
this.cli.action.status = `Waiting for all commands to finish`;
}
// grab writer lock
let unlock = await _rwlockfile2.default.write(this.updatelockfile);
// return downgrade function
return async () => {
// turn back into reader when unlocking
await unlock();
return _rwlockfile2.default.read(this.updatelockfile);
};
}
}
exports.default = Lock;