56 lines
1.1 KiB
JavaScript
56 lines
1.1 KiB
JavaScript
function createBatchMutationGate() {
|
|
let activeLeaseCount = 0;
|
|
let sealed = false;
|
|
let activeAtSeal = false;
|
|
let drainPromise = null;
|
|
let resolveDrain = null;
|
|
|
|
function acquire() {
|
|
if (sealed) return null;
|
|
|
|
activeLeaseCount += 1;
|
|
let open = true;
|
|
|
|
return Object.freeze({
|
|
finish() {
|
|
if (!open) return false;
|
|
|
|
open = false;
|
|
activeLeaseCount -= 1;
|
|
|
|
if (sealed && activeLeaseCount === 0 && resolveDrain) {
|
|
const resolve = resolveDrain;
|
|
resolveDrain = null;
|
|
resolve(activeAtSeal);
|
|
}
|
|
|
|
return true;
|
|
},
|
|
isOpen() {
|
|
return open;
|
|
}
|
|
});
|
|
}
|
|
|
|
function sealAndDrain() {
|
|
if (drainPromise) return drainPromise;
|
|
|
|
sealed = true;
|
|
activeAtSeal = activeLeaseCount > 0;
|
|
|
|
if (!activeAtSeal) {
|
|
drainPromise = Promise.resolve(false);
|
|
return drainPromise;
|
|
}
|
|
|
|
drainPromise = new Promise((resolve) => {
|
|
resolveDrain = resolve;
|
|
});
|
|
return drainPromise;
|
|
}
|
|
|
|
return Object.freeze({ acquire, sealAndDrain });
|
|
}
|
|
|
|
module.exports = { createBatchMutationGate };
|