Add batch mutation drain gate
This commit is contained in:
@@ -0,0 +1,55 @@
|
||||
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 };
|
||||
Reference in New Issue
Block a user