mover ranager

This commit is contained in:
legop3
2026-04-28 20:03:00 -04:00
parent 8deee70d4a
commit 50f6569b22
4 changed files with 105 additions and 40 deletions
+2 -1
View File
@@ -50,7 +50,7 @@
- [ ] private rover access request service - [ ] private rover access request service
- [ ] replay services (already partly split; reformat consistently) - [ ] replay services (already partly split; reformat consistently)
- [ ] room camera services (already partly split; reformat consistently) - [ ] room camera services (already partly split; reformat consistently)
- [ ] rover manager service - [ ] rover manager service (in progress: constants/state extracted)
- [x] session service - [x] session service
- [x] turn service - [x] turn service
- [ ] verification service - [ ] verification service
@@ -65,6 +65,7 @@
- Folderized all files in `server/src/services/` into per-service folders with `index.js` entrypoints and updated internal relative imports for new path depth. - Folderized all files in `server/src/services/` into per-service folders with `index.js` entrypoints and updated internal relative imports for new path depth.
- Split `server/src/services/turnService/index.js` by extracting constants, shared state helpers, and side-effect action helpers into `turnService/constants.js`, `turnService/state.js`, and `turnService/actions.js`. - Split `server/src/services/turnService/index.js` by extracting constants, shared state helpers, and side-effect action helpers into `turnService/constants.js`, `turnService/state.js`, and `turnService/actions.js`.
- Split `server/src/services/sessionService/index.js` by extracting config/timing constants, sync-throttle state storage, and visibility filter helpers into `sessionService/constants.js`, `sessionService/state.js`, and `sessionService/filters.js`. - Split `server/src/services/sessionService/index.js` by extracting config/timing constants, sync-throttle state storage, and visibility filter helpers into `sessionService/constants.js`, `sessionService/state.js`, and `sessionService/filters.js`.
- Began splitting `server/src/services/roverManager/index.js` by extracting immutable constants and shared state containers into `roverManager/constants.js` and `roverManager/state.js`.
## WebUI frontend ## WebUI frontend
### BIGGEST OFFENDERS ### BIGGEST OFFENDERS
@@ -0,0 +1,47 @@
// rover Manager constants
// Purpose: Defines rover-manager configuration constants and immutable default safety values.
// Scope: Keeps runtime behavior unchanged while isolating fixed thresholds and timing knobs.
const ALERT_COLOR = '#8bc34a';
const DOCK_GUARD_WINDOW_MS = 2 * 1000;
const IDLE_UNDOCKED_MS = 2 * 60 * 1000;
const PASSIVE_UNDOCKED_MS = 60 * 1000;
const DOCK_GUARD_RETRY_MS = 10 * 1000;
const DOCK_COMMAND_BASE64 = Buffer.from([143]).toString('base64');
const BACKOFF_MS = 500;
const BACKOFF_SPEED = 300;
const PRIVATE_BUTTON_HOLD_MS = 3000;
const PRIVATE_AUTO_CLOSE_IDLE_MS = 30 * 60 * 1000;
const PRIVATE_AUTO_CLOSE_TICK_MS = 30000;
const SAFETY_BACKOFF_MIN = -500;
const SAFETY_BACKOFF_MAX = 500;
const DEFAULT_PRIVATE_SAFETY = Object.freeze({
speedLimitEnabled: false,
speedLimitMaxWheelSpeed: 250,
hardOvercurrentEnabled: false,
overcurrentStopMs: 300,
hardBumpEnabled: false,
bumpBackoffSpeed: 250,
bumpBackoffMs: 350,
cliffEnabled: false,
cliffBackoffSpeed: 250,
cliffBackoffMs: 500,
triggerCooldownMs: 800,
});
module.exports = {
ALERT_COLOR,
DOCK_GUARD_WINDOW_MS,
IDLE_UNDOCKED_MS,
PASSIVE_UNDOCKED_MS,
DOCK_GUARD_RETRY_MS,
DOCK_COMMAND_BASE64,
BACKOFF_MS,
BACKOFF_SPEED,
PRIVATE_BUTTON_HOLD_MS,
PRIVATE_AUTO_CLOSE_IDLE_MS,
PRIVATE_AUTO_CLOSE_TICK_MS,
SAFETY_BACKOFF_MIN,
SAFETY_BACKOFF_MAX,
DEFAULT_PRIVATE_SAFETY,
};
+28 -39
View File
@@ -1,54 +1,43 @@
// rover Manager // rover Manager
// Purpose: Defines the rover Manager module and the helpers/state used by this service unit. // Purpose: Defines the rover Manager module and the helpers/state used by this service unit.
// Scope: Keeps runtime behavior unchanged while isolating responsibilities into a clear module boundary. // Scope: Keeps runtime behavior unchanged while isolating responsibilities into a clear module boundary.
const EventEmitter = require('events');
const io = require('../../globals/io'); const io = require('../../globals/io');
const logger = require('../../globals/logger').child('roverManager'); const logger = require('../../globals/logger').child('roverManager');
const { sendAlert } = require('../alertService'); const { sendAlert } = require('../alertService');
const ALERT_COLOR = '#8bc34a';
const { parseSensorFrame } = require('../../helpers/sensorDecoder'); const { parseSensorFrame } = require('../../helpers/sensorDecoder');
const { MODES, getMode } = require('../modeManager'); const { MODES, getMode } = require('../modeManager');
const { isAdmin, isLockdownAdmin, roleEvents } = require('../roleService'); const { isAdmin, isLockdownAdmin, roleEvents } = require('../roleService');
const { publishEvent } = require('../eventBus'); const { publishEvent } = require('../eventBus');
const videoSessions = require('../videoSessions'); const videoSessions = require('../videoSessions');
const {
const rovers = new Map(); // roverId -> record ALERT_COLOR,
const socketToRovers = new Map(); // socketId -> Set(roverId) DOCK_GUARD_WINDOW_MS,
const spectatorSockets = new Set(); IDLE_UNDOCKED_MS,
PASSIVE_UNDOCKED_MS,
DOCK_GUARD_RETRY_MS,
DOCK_COMMAND_BASE64,
BACKOFF_MS,
BACKOFF_SPEED,
PRIVATE_BUTTON_HOLD_MS,
PRIVATE_AUTO_CLOSE_IDLE_MS,
PRIVATE_AUTO_CLOSE_TICK_MS,
SAFETY_BACKOFF_MIN,
SAFETY_BACKOFF_MAX,
DEFAULT_PRIVATE_SAFETY,
} = require('./constants');
const {
rovers,
socketToRovers,
spectatorSockets,
managerEvents,
backoffTimers,
dockGuardStates,
privateButtonStates,
privateNoUsersSince,
privateSafetyTimers,
privateSafetyStates,
} = require('./state');
const turnService = require('../turnService'); const turnService = require('../turnService');
const managerEvents = new EventEmitter();
const DOCK_GUARD_WINDOW_MS = 2 * 1000;
const IDLE_UNDOCKED_MS = 2 * 60 * 1000;
const PASSIVE_UNDOCKED_MS = 60 * 1000;
const DOCK_GUARD_RETRY_MS = 10 * 1000;
const DOCK_COMMAND_BASE64 = Buffer.from([143]).toString('base64');
const BACKOFF_MS = 500;
const BACKOFF_SPEED = 300;
const PRIVATE_BUTTON_HOLD_MS = 3000;
const PRIVATE_AUTO_CLOSE_IDLE_MS = 30 * 60 * 1000;
const PRIVATE_AUTO_CLOSE_TICK_MS = 30000;
const SAFETY_BACKOFF_MIN = -500;
const SAFETY_BACKOFF_MAX = 500;
const backoffTimers = new Map(); // roverId -> Timeout
const dockGuardStates = new Map(); // roverId -> guard state
const privateButtonStates = new Map(); // roverId -> { pressedSince:number|null, latched:boolean }
const privateNoUsersSince = new Map(); // roverId -> timestamp|null
const privateSafetyTimers = new Map(); // roverId -> Timeout
const privateSafetyStates = new Map(); // roverId -> state
const DEFAULT_PRIVATE_SAFETY = Object.freeze({
speedLimitEnabled: false,
speedLimitMaxWheelSpeed: 250,
hardOvercurrentEnabled: false,
overcurrentStopMs: 300,
hardBumpEnabled: false,
bumpBackoffSpeed: 250,
bumpBackoffMs: 350,
cliffEnabled: false,
cliffBackoffSpeed: 250,
cliffBackoffMs: 500,
triggerCooldownMs: 800,
});
function parsePrivateMeta(meta = {}) { function parsePrivateMeta(meta = {}) {
const raw = meta?.private; const raw = meta?.private;
+28
View File
@@ -0,0 +1,28 @@
// rover Manager state
// Purpose: Defines shared mutable in-memory state containers used by rover-manager workflows.
// Scope: Keeps runtime behavior unchanged while centralizing service state maps/sets and events.
const EventEmitter = require('events');
const rovers = new Map();
const socketToRovers = new Map();
const spectatorSockets = new Set();
const managerEvents = new EventEmitter();
const backoffTimers = new Map();
const dockGuardStates = new Map();
const privateButtonStates = new Map();
const privateNoUsersSince = new Map();
const privateSafetyTimers = new Map();
const privateSafetyStates = new Map();
module.exports = {
rovers,
socketToRovers,
spectatorSockets,
managerEvents,
backoffTimers,
dockGuardStates,
privateButtonStates,
privateNoUsersSince,
privateSafetyTimers,
privateSafetyStates,
};