Add batch mutation drain gate

This commit is contained in:
Sucukdeluxe
2026-08-13 21:06:00 +02:00
parent 4b7011131d
commit 07c81c0123
3 changed files with 155 additions and 0 deletions
+55
View File
@@ -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 };