Integrate Docker support into Archipelago and Neode UI
- Added StateManager and data_model modules to manage application state. - Updated ApiHandler to utilize StateManager for WebSocket connections. - Enhanced Server initialization to include StateManager. - Implemented Docker container querying in Neode UI to populate app data dynamically. - Removed temporary dummy app configurations in favor of real Docker-based applications. - Improved WebSocket reconnection logic and error handling in the UI. - Updated package.json and package-lock.json to include dockerode dependency.
This commit is contained in:
56
core/archipelago/src/state.rs
Normal file
56
core/archipelago/src/state.rs
Normal file
@@ -0,0 +1,56 @@
|
||||
use crate::data_model::{DataModel, WebSocketMessage};
|
||||
use std::sync::Arc;
|
||||
use tokio::sync::RwLock;
|
||||
use tracing::debug;
|
||||
|
||||
/// Manages the application state and broadcasts updates to WebSocket clients
|
||||
pub struct StateManager {
|
||||
data: Arc<RwLock<DataModel>>,
|
||||
revision: Arc<RwLock<u32>>,
|
||||
}
|
||||
|
||||
impl StateManager {
|
||||
pub fn new() -> Self {
|
||||
Self {
|
||||
data: Arc::new(RwLock::new(DataModel::new())),
|
||||
revision: Arc::new(RwLock::new(0)),
|
||||
}
|
||||
}
|
||||
|
||||
/// Get the current data model and revision
|
||||
pub async fn get_snapshot(&self) -> (DataModel, u32) {
|
||||
let data = self.data.read().await.clone();
|
||||
let rev = *self.revision.read().await;
|
||||
(data, rev)
|
||||
}
|
||||
|
||||
/// Update the data model (will broadcast patches in the future)
|
||||
pub async fn update_data(&self, new_data: DataModel) {
|
||||
let mut data = self.data.write().await;
|
||||
let mut rev = self.revision.write().await;
|
||||
|
||||
*data = new_data;
|
||||
*rev += 1;
|
||||
|
||||
debug!("Data model updated to revision {}", *rev);
|
||||
|
||||
// TODO: In the future, compute JSON patches and broadcast to all connected clients
|
||||
// For now, clients will need to reconnect to get updates
|
||||
}
|
||||
|
||||
/// Get a WebSocket message with the current state
|
||||
pub async fn get_initial_message(&self) -> WebSocketMessage {
|
||||
let (data, rev) = self.get_snapshot().await;
|
||||
WebSocketMessage {
|
||||
rev,
|
||||
data: Some(data),
|
||||
patch: None,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl Default for StateManager {
|
||||
fn default() -> Self {
|
||||
Self::new()
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user