frigate/web/src/utils/wsUtil.ts

54 lines
1.3 KiB
TypeScript
Raw Normal View History

import { WsFeedMessage } from "@/api/ws";
const EVENT_TOPICS = new Set([
"events",
"reviews",
"tracked_object_update",
"triggers",
]);
const SYSTEM_TOPICS = new Set([
"stats",
"model_state",
"job_state",
"embeddings_reindex_progress",
"audio_transcription_state",
"birdseye_layout",
]);
export function extractCameraName(message: WsFeedMessage): string | null {
// Try extracting from topic pattern: {camera}/motion, {camera}/audio/rms, etc.
const topicParts = message.topic.split("/");
if (
topicParts.length >= 2 &&
!EVENT_TOPICS.has(message.topic) &&
!SYSTEM_TOPICS.has(message.topic) &&
message.topic !== "camera_activity" &&
message.topic !== "audio_detections" &&
message.topic !== "restart" &&
message.topic !== "notification_test"
) {
return topicParts[0];
}
// Try extracting from payload
try {
const data =
typeof message.payload === "string"
? JSON.parse(message.payload)
: message.payload;
if (typeof data === "object" && data !== null) {
if ("camera" in data) return data.camera as string;
if ("after" in data && data.after?.camera)
return data.after.camera as string;
if ("before" in data && data.before?.camera)
return data.before.camera as string;
}
} catch {
// ignore parse errors
}
return null;
}