private rover request fixes finally

This commit is contained in:
legop3
2026-06-01 19:53:17 -04:00
parent d205d3a05d
commit af5ddfb11d
9 changed files with 81 additions and 27 deletions
@@ -64,6 +64,10 @@ function applySocketGrantCache(socket) {
socket.data.privateClosedAccessRovers = listGrantedRoversForRequester(requesterKey);
}
function refreshAllSocketGrantCaches() {
io.sockets.sockets.forEach((socket) => applySocketGrantCache(socket));
}
function getGrantForRequester(requesterKey, roverId) {
if (!requesterKey || !roverId) return null;
return grants.get(buildGrantKey(requesterKey, roverId)) || null;
@@ -139,12 +143,19 @@ function tryAssignClosedPrivateRover(socket, roverId) {
if (!socket || !roverId) return false;
const record = roverManager.rovers.get(String(roverId));
if (!record) return false;
const access = roverManager.canRequestControl(roverId, socket, { allowUser: true });
const access = roverManager.canRequestControl(roverId, socket, {
allowUser: true,
allowClosedPrivateGrantInLockdown: true,
});
if (!access.ok) {
throw new Error(access.reason || 'Control denied');
}
const previousJoined = roverManager.getRoversForSocket(socket.id);
roverManager.requestControl(roverId, socket, { allowUser: true });
roverManager.requestControl(roverId, socket, {
allowUser: true,
allowClosedPrivateGrantInLockdown: true,
forceTurn: true,
});
previousJoined.forEach((rid) => {
if (rid !== roverId) roverManager.releaseControl(rid, socket);
});
@@ -156,6 +167,7 @@ function tryAssignClosedPrivateRover(socket, roverId) {
logger.warn('Failed to move assignment after private access grant', { socketId: socket.id, error: err.message });
}
socket.emit('controlGranted', { roverId: String(roverId) });
roverManager.broadcastRoster();
return true;
}
@@ -304,5 +316,6 @@ module.exports = {
approveRequest,
denyRequest,
applySocketGrantCache,
refreshAllSocketGrantCaches,
clearPendingForRover,
};
@@ -6,7 +6,7 @@ const roverManager = require('../roverManager');
const { requestEvents, grants } = require('./state');
function registerPrivateRoverAccessHooks(deps) {
const { applySocketGrantCache, createRequest, clearPendingForRover } = deps;
const { applySocketGrantCache, refreshAllSocketGrantCaches, createRequest, clearPendingForRover } = deps;
roverManager.managerEvents.on('private', ({ roverId, open } = {}) => {
if (!roverId) return;
@@ -17,6 +17,8 @@ function registerPrivateRoverAccessHooks(deps) {
grants.delete(key);
}
}
refreshAllSocketGrantCaches();
roverManager.broadcastRoster();
}
requestEvents.emit('change', { reason: 'private_state', roverId: String(roverId), open: Boolean(open) });
});
@@ -30,6 +32,8 @@ function registerPrivateRoverAccessHooks(deps) {
grants.delete(key);
}
}
refreshAllSocketGrantCaches();
roverManager.broadcastRoster();
}
requestEvents.emit('change', { reason: 'rover', roverId: String(roverId), action: action || null });
});
@@ -11,12 +11,14 @@ const {
approveRequest,
denyRequest,
applySocketGrantCache,
refreshAllSocketGrantCaches,
clearPendingForRover,
} = require('./core');
const { registerPrivateRoverAccessHooks } = require('./hooks');
registerPrivateRoverAccessHooks({
applySocketGrantCache,
refreshAllSocketGrantCaches,
createRequest,
clearPendingForRover,
});