UNPKG

@foxpage/foxpage-manager

Version:

foxpage resource manager

78 lines (77 loc) 1.95 kB
"use strict"; 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); }); });