blob: 5aadb93501084d46ee7c4d24ad4097e233bbb227 [file] [log] [blame]
use std::{
collections::HashMap,
sync::{Arc, Mutex},
};
use avm_analyzer_common::{AvmStreamInfo, AvmStreamList, DecodeState};
use log::info;
use super::server_decode::PendingServerDecode;
pub struct HttpStreamManager {
pub streams: Arc<Mutex<Vec<AvmStreamInfo>>>,
}
impl HttpStreamManager {
pub fn new() -> Self {
Self {
streams: Arc::new(Mutex::new(Vec::new())),
}
}
pub fn load_stream_list(&self) {
let request = ehttp::Request::get("/stream_list");
let streams = self.streams.clone();
ehttp::fetch(request, move |response| {
if let Ok(response) = response {
if let Some(json) = response.text() {
if let Ok(response) = serde_json::from_str::<AvmStreamList>(json) {
info!("Found: {} existing streams on server.", response.streams.len());
let mut streams = streams.lock().unwrap();
*streams.as_mut() = response.streams;
}
}
}
});
}
pub fn update_pending_decodes(&mut self, pending_decodes: &HashMap<String, PendingServerDecode>) {
for pending_decode in pending_decodes.values() {
if let DecodeState::Complete(_) = pending_decode.state {
let streams = self.streams.lock().unwrap();
// TODO(comc): Make streams a hashmap instead.
let already_exists = streams
.iter()
.any(|stream| stream.stream_name == pending_decode.stream_info.stream_name);
if !already_exists {
self.load_stream_list();
}
}
}
}
}