@@ -20,7 +20,6 @@ use opencv::{
2020 videoio:: { VideoWriter , VideoWriterTrait } ,
2121} ;
2222use rust_embed:: RustEmbed ;
23- use serde:: { Deserialize , Serialize } ;
2423use sqlx:: { sqlite:: SqliteConnectOptions , SqlitePool } ;
2524use time:: { Duration , OffsetDateTime } ;
2625use tokio:: {
@@ -55,7 +54,7 @@ use crate::{
5554 User , Video ,
5655} ;
5756
58- use super :: MdnsChannelMessage ;
57+ use super :: { ImageContainer , MdnsChannelMessage } ;
5958
6059// TODO: Maybe use `std::future::pending::<()>();` instead of sleeping forever
6160
@@ -74,16 +73,6 @@ const EMPTY_TASK_SLEEP_DURATION: tokio::time::Duration = tokio::time::Duration::
7473#[ folder = "static/" ]
7574struct EmbeddedAssets ;
7675
77- // ? Maybe move this somewhere better
78- // TODO: Probably change to Protobuf or bincode instead of JSON
79- #[ derive( Serialize , Deserialize , Clone ) ]
80- pub struct ImageContainer {
81- pub camera_id : i64 ,
82- pub timestamp : i64 ,
83- #[ serde( with = "serde_bytes" ) ]
84- pub image_bytes : Vec < u8 > ,
85- }
86-
8776pub struct AppState {
8877 pub images_tx : watch:: Sender < ImageContainer > ,
8978 pub video_path : PathBuf ,
@@ -669,11 +658,11 @@ async fn handle_socket(
669658 } ) ;
670659
671660 let api_channel = state. api_channel . clone ( ) ;
661+ let sender_mutex_clone = sender_mutex. clone ( ) ;
672662 let mut first_received = false ;
673663
674664 let mut api_listener_task: JoinHandle < Result < ( ) , Box < dyn std:: error:: Error + Send + Sync > > > =
675665 if is_camera {
676- let sender_mutex_clone = sender_mutex. clone ( ) ;
677666 tokio:: spawn ( async move {
678667 if let Some ( some_camera_settings) = initial_camera_settings {
679668 let some_initial_camera_settings = CameraSettingNoMeta {
@@ -757,14 +746,23 @@ async fn handle_socket(
757746 #[ allow( clippy:: single_match) ] // will change in the future
758747 match api_msg {
759748 // TODO: every user task performing this is wasteful, global camera list mutex shared with api would be better
760- ApiChannelMessage :: CameraListChanged ( _ ) => {
749+ ApiChannelMessage :: CameraListChanged ( change ) => {
761750 info ! ( "API channel message received for camera list changed for {who}..." ) ;
762751
763752 let Some ( user_id_some) = user_id else {
764753 error ! ( "Camera list changed but user was not found in auth_session. How is this even possible?" ) ;
765754 break ;
766755 } ;
767756
757+ if let Err ( e) = sender_mutex_clone
758+ . lock ( )
759+ . await
760+ . send ( Message :: Text ( serde_json:: to_string ( & change) ?) )
761+ . await
762+ {
763+ error ! ( "Error sending API WebSocket message to {who}: {e:?}" ) ;
764+ }
765+
768766 let Ok ( new_cameras) = Camera :: list_accessible_to_user (
769767 & auth_session. backend . db ,
770768 user_id_some,
0 commit comments