Files
liberama/server/db/JembaDb/LockQueue.js
2021-11-24 14:15:09 +07:00

38 lines
899 B
JavaScript

class LockQueue {
constructor(queueSize) {
this.queueSize = queueSize;
this.freed = true;
this.waitingQueue = [];
}
ret() {
this.freed = true;
if (this.waitingQueue.length) {
this.waitingQueue.shift().onFreed();
}
}
get(take = true) {
return new Promise((resolve) => {
if (this.freed) {
if (take)
this.freed = false;
resolve();
return;
}
if (this.waitingQueue.length >= this.queueSize)
throw new Error('Lock queue is too long');
this.waitingQueue.push({
onFreed: () => {
if (take)
this.freed = false;
resolve();
},
});
});
}
}
module.exports = LockQueue;