UNPKG

p-lock

Version:

Simple promise lock

40 lines (39 loc) 1.42 kB
export function getLock(options = {}) { const queues = {}; function startNext(key) { var _queues_key, _queues_key_; const releaseFn = ()=>{ var _queues_key; (_queues_key = queues[key]) === null || _queues_key === void 0 ? void 0 : _queues_key.shift(); startNext(key); }; (_queues_key = queues[key]) === null || _queues_key === void 0 ? void 0 : (_queues_key_ = _queues_key[0]) === null || _queues_key_ === void 0 ? void 0 : _queues_key_.start(releaseFn); } return async (key = "")=>{ var _queues_key; const queue = (_queues_key = queues[key]) !== null && _queues_key !== void 0 ? _queues_key : []; if (queues[key] === undefined) { queues[key] = queue; } return new Promise((start, reject)=>{ if (options.replace && queue.length > 1) { var _queue_; (_queue_ = queue[1]) === null || _queue_ === void 0 ? void 0 : _queue_.reject(); queue[1] = { start, reject }; } else { queue.push({ start, reject }); } if (queue.length === 1) { return startNext(key); } else { return undefined; } }); }; }