From 50f6569b22ab8e1ab559eb9a37b2c4714664f260 Mon Sep 17 00:00:00 2001 From: legop3 Date: Tue, 28 Apr 2026 20:03:00 -0400 Subject: [PATCH] mover ranager --- rulesdocs/refector_rules_and_tracking.md | 3 +- server/src/services/roverManager/constants.js | 47 +++++++++++++ server/src/services/roverManager/index.js | 67 ++++++++----------- server/src/services/roverManager/state.js | 28 ++++++++ 4 files changed, 105 insertions(+), 40 deletions(-) create mode 100644 server/src/services/roverManager/constants.js create mode 100644 server/src/services/roverManager/state.js diff --git a/rulesdocs/refector_rules_and_tracking.md b/rulesdocs/refector_rules_and_tracking.md index 9dfb2785..9cecc12c 100644 --- a/rulesdocs/refector_rules_and_tracking.md +++ b/rulesdocs/refector_rules_and_tracking.md @@ -50,7 +50,7 @@ - [ ] private rover access request service - [ ] replay 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] turn 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. - 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`. +- 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 ### BIGGEST OFFENDERS diff --git a/server/src/services/roverManager/constants.js b/server/src/services/roverManager/constants.js new file mode 100644 index 00000000..bda4086d --- /dev/null +++ b/server/src/services/roverManager/constants.js @@ -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, +}; diff --git a/server/src/services/roverManager/index.js b/server/src/services/roverManager/index.js index c31e6987..71d586ff 100644 --- a/server/src/services/roverManager/index.js +++ b/server/src/services/roverManager/index.js @@ -1,54 +1,43 @@ // rover Manager // 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. -const EventEmitter = require('events'); const io = require('../../globals/io'); const logger = require('../../globals/logger').child('roverManager'); const { sendAlert } = require('../alertService'); -const ALERT_COLOR = '#8bc34a'; const { parseSensorFrame } = require('../../helpers/sensorDecoder'); const { MODES, getMode } = require('../modeManager'); const { isAdmin, isLockdownAdmin, roleEvents } = require('../roleService'); const { publishEvent } = require('../eventBus'); const videoSessions = require('../videoSessions'); - -const rovers = new Map(); // roverId -> record -const socketToRovers = new Map(); // socketId -> Set(roverId) -const spectatorSockets = new Set(); +const { + 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, +} = require('./constants'); +const { + rovers, + socketToRovers, + spectatorSockets, + managerEvents, + backoffTimers, + dockGuardStates, + privateButtonStates, + privateNoUsersSince, + privateSafetyTimers, + privateSafetyStates, +} = require('./state'); 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 = {}) { const raw = meta?.private; diff --git a/server/src/services/roverManager/state.js b/server/src/services/roverManager/state.js new file mode 100644 index 00000000..dcde2903 --- /dev/null +++ b/server/src/services/roverManager/state.js @@ -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, +};