add config option for room camera interval
Container image / image (push) Failing after 1m5s

This commit is contained in:
legop3
2026-09-29 22:18:45 -04:00
parent b2bbaf2085
commit ea4af2ebb3
3 changed files with 8 additions and 4 deletions
@@ -1,7 +1,7 @@
// Room-Camera Configuration // Room-Camera Configuration
// Purpose: Defines the optional named snapshot and stream camera catalog. // Purpose: Defines the optional named snapshot and stream camera catalog.
// Scope: Contains configuration metadata only and never contacts a camera. // Scope: Contains configuration metadata only and never contacts a camera.
const { strictObject, string, boolean } = require('../../configuration/schemaHelpers'); const { strictObject, string, boolean, integer } = require('../../configuration/schemaHelpers');
module.exports = { module.exports = {
key: 'roomCameras', key: 'roomCameras',
@@ -10,6 +10,7 @@ module.exports = {
// initial configuration while the feature switch prevents network requests. // initial configuration while the feature switch prevents network requests.
defaultValue: { defaultValue: {
enabled: false, enabled: false,
streamIntervalMs: 2000,
cameras: [ cameras: [
{ {
id: 'lobby', id: 'lobby',
@@ -29,6 +30,7 @@ module.exports = {
}, },
schema: strictObject({ schema: strictObject({
enabled: boolean({ description: 'Immediately publishes the configured room-camera catalog and enables camera snapshots and streams.' }), enabled: boolean({ description: 'Immediately publishes the configured room-camera catalog and enables camera snapshots and streams.' }),
streamIntervalMs: integer({ title: 'Stream interval (ms)', description: 'Interval for sending room camera images to clients. Lowering this increases bandwidth usage FAST because it sends a full image each time.', minimum: 1 }),
cameras: { cameras: {
type: 'array', type: 'array',
description: 'Room cameras available to the web UI and replay system.', description: 'Room cameras available to the web UI and replay system.',
@@ -8,10 +8,12 @@ const replay = require('../replayEngineV2/roomCameraReplayBuilder');
const { loadConfig, registerConfigurationHandler } = require('../../configuration'); const { loadConfig, registerConfigurationHandler } = require('../../configuration');
let enabled = false; let enabled = false;
let streamIntervalMs = 2000;
const snapshotEngine = createSnapshotEngine({ getRoomCameras, roomCameraEvents }); const snapshotEngine = createSnapshotEngine({ getRoomCameras, roomCameraEvents });
function applyRoomCameraConfig(roomCameraConfig = {}) { function applyRoomCameraConfig(roomCameraConfig = {}) {
enabled = Boolean(roomCameraConfig.enabled); enabled = Boolean(roomCameraConfig.enabled);
streamIntervalMs = roomCameraConfig.streamIntervalMs ?? 2000;
// Loading an empty catalog on disable causes the snapshot engine's existing // Loading an empty catalog on disable causes the snapshot engine's existing
// update listener to close every stream and timer without unregistering the // update listener to close every stream and timer without unregistering the
// stable browser gateway. // stable browser gateway.
@@ -19,6 +21,7 @@ function applyRoomCameraConfig(roomCameraConfig = {}) {
} }
registerRoomCameraSocketGateway({ registerRoomCameraSocketGateway({
getStreamIntervalMs: () => streamIntervalMs,
getRoomCamera, getRoomCamera,
getRoomCameras, getRoomCameras,
getRoomCameraState: snapshotEngine.getRoomCameraState, getRoomCameraState: snapshotEngine.getRoomCameraState,
@@ -8,7 +8,6 @@ const { isAdmin, isLockdownAdmin, getRole } = require('../roleService');
const SUBSCRIBE_LIMIT = 50; const SUBSCRIBE_LIMIT = 50;
const SUBSCRIBE_WINDOW_MS = 10000; const SUBSCRIBE_WINDOW_MS = 10000;
const STREAM_INTERVAL_MS = 2000;
function passesMode(socket) { function passesMode(socket) {
const mode = getMode(); const mode = getMode();
@@ -20,7 +19,7 @@ function passesMode(socket) {
return true; return true;
} }
function registerRoomCameraSocketGateway({ getRoomCamera, getRoomCameras, getRoomCameraState, roomCameraStreamEvents }) { function registerRoomCameraSocketGateway({ getRoomCamera, getRoomCameras, getRoomCameraState, roomCameraStreamEvents, getStreamIntervalMs }) {
const cameraSubscribers = new Map(); const cameraSubscribers = new Map();
const socketSubscriptions = new Map(); const socketSubscriptions = new Map();
const subscribeBuckets = new Map(); const subscribeBuckets = new Map();
@@ -82,7 +81,7 @@ function registerRoomCameraSocketGateway({ getRoomCamera, getRoomCameras, getRoo
} }
const lastSent = lastMap.get(id) || 0; const lastSent = lastMap.get(id) || 0;
const now = ts || Date.now(); const now = ts || Date.now();
if (now - lastSent < STREAM_INTERVAL_MS) return; if (now - lastSent < getStreamIntervalMs()) return;
lastMap.set(id, now); lastMap.set(id, now);
sendFrame(socket, id, { ts }, buffer); sendFrame(socket, id, { ts }, buffer);
}); });