p-lock
Version:
Simple promise lock
40 lines (39 loc) • 1.42 kB
JavaScript
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;
}
});
};
}