@foxpage/foxpage-manager
Version:
foxpage resource manager
78 lines (77 loc) • 1.95 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.withLock = exports.unlock = exports.lock = void 0;
const fs_extra_1 = __importDefault(require("fs-extra"));
/**
* the locked cached
*/
const locked = {};
/**
* lock file
* @param dir mkdir value
* @param cb callback
*/
const lock = async (dir, cb) => {
if (locked[dir]) {
return cb(new Error('exists locked'));
}
try {
const splitIdx = dir.lastIndexOf(process.platform === 'win32' ? '\\' : '/');
if (splitIdx > -1) {
const rootDirStr = dir.substring(0, splitIdx);
if (rootDirStr) {
await fs_extra_1.default.ensureDir(rootDirStr);
}
}
await fs_extra_1.default.mkdir(dir);
locked[dir] = 1;
}
catch (e) {
const isExistError = e.code === 'EEXIST' || String(e).includes('exists');
if (isExistError) {
return cb(e);
}
throw e;
}
return cb();
};
exports.lock = lock;
/**
* unlock file
* @param dir mkdir value
*/
const unlock = async (dir) => {
await fs_extra_1.default.remove(dir);
if (locked[dir]) {
delete locked[dir];
}
};
exports.unlock = unlock;
/**
* lock & unlock
* @param dir dir
* @param cb lock callback
*/
const withLock = async (dir, cb) => {
await (0, exports.lock)(dir, async (error) => {
if (!error) {
try {
await cb();
await (0, exports.unlock)(dir);
}
catch (err) {
await (0, exports.unlock)(dir);
throw err;
}
}
});
};
exports.withLock = withLock;
process.on('exit', () => {
Object.keys(locked).forEach(dir => {
fs_extra_1.default.removeSync(dir);
});
});