better camera snapshot service

This commit is contained in:
legop3
2026-01-13 19:57:29 -05:00
parent 399c077c7a
commit c2ca951fe8
@@ -59,6 +59,14 @@ function scheduleStreamReconnect(camera) {
streamState.set(id, entry); streamState.set(id, entry);
} }
function clearStreamRequest(id, req) {
const entry = streamState.get(id);
if (!entry) return;
if (entry.req !== req) return;
entry.req = null;
streamState.set(id, entry);
}
function handleStreamError(camera, err) { function handleStreamError(camera, err) {
const state = cameraState.get(camera.id) || {}; const state = cameraState.get(camera.id) || {};
const failures = (state.failures || 0) + 1; const failures = (state.failures || 0) + 1;
@@ -83,6 +91,7 @@ function startStream(camera) {
(res) => { (res) => {
if (res.statusCode !== 200) { if (res.statusCode !== 200) {
res.resume(); res.resume();
clearStreamRequest(camera.id, req);
handleStreamError(camera, new Error(`HTTP ${res.statusCode}`)); handleStreamError(camera, new Error(`HTTP ${res.statusCode}`));
scheduleStreamReconnect(camera); scheduleStreamReconnect(camera);
return; return;
@@ -112,19 +121,23 @@ function startStream(camera) {
} }
}); });
res.on('end', () => { res.on('end', () => {
clearStreamRequest(camera.id, req);
scheduleStreamReconnect(camera); scheduleStreamReconnect(camera);
}); });
res.on('aborted', () => { res.on('aborted', () => {
clearStreamRequest(camera.id, req);
handleStreamError(camera, new Error('stream aborted')); handleStreamError(camera, new Error('stream aborted'));
scheduleStreamReconnect(camera); scheduleStreamReconnect(camera);
}); });
res.on('error', (err) => { res.on('error', (err) => {
clearStreamRequest(camera.id, req);
handleStreamError(camera, err); handleStreamError(camera, err);
scheduleStreamReconnect(camera); scheduleStreamReconnect(camera);
}); });
}, },
); );
req.on('error', (err) => { req.on('error', (err) => {
clearStreamRequest(camera.id, req);
handleStreamError(camera, err); handleStreamError(camera, err);
scheduleStreamReconnect(camera); scheduleStreamReconnect(camera);
}); });