agent-ecosystem/agent-teams-controller/src/internal/boardLock.js

42 lines
1,012 B
JavaScript

const path = require('path');
const { withFileLockSync } = require('./fileLock.js');
const reentrantLockDepthByScope = new Map();
function getTeamBoardLockScope(paths) {
return path.join(paths.teamDir, 'board-state');
}
function withTeamBoardLock(paths, fn) {
const scope = getTeamBoardLockScope(paths);
const currentDepth = reentrantLockDepthByScope.get(scope) || 0;
if (currentDepth > 0) {
reentrantLockDepthByScope.set(scope, currentDepth + 1);
try {
return fn();
} finally {
const nextDepth = (reentrantLockDepthByScope.get(scope) || 1) - 1;
if (nextDepth <= 0) {
reentrantLockDepthByScope.delete(scope);
} else {
reentrantLockDepthByScope.set(scope, nextDepth);
}
}
}
return withFileLockSync(scope, () => {
reentrantLockDepthByScope.set(scope, 1);
try {
return fn();
} finally {
reentrantLockDepthByScope.delete(scope);
}
});
}
module.exports = {
getTeamBoardLockScope,
withTeamBoardLock,
};