use std::{ sync::{Arc, Mutex}, io, }; use crate::{ message_queue::MessageQueue, project::Project, imfs::Imfs, session_id::SessionId, rbx_session::RbxSession, snapshot_reconciler::InstanceChanges, fs_watcher::FsWatcher, }; /// Contains all of the state for a Rojo live-sync session. pub struct LiveSession { pub project: Arc, pub session_id: SessionId, pub message_queue: Arc>, pub rbx_session: Arc>, pub imfs: Arc>, _fs_watcher: FsWatcher, } impl LiveSession { pub fn new(project: Arc) -> io::Result { let imfs = { let mut imfs = Imfs::new(); imfs.add_roots_from_project(&project)?; Arc::new(Mutex::new(imfs)) }; let message_queue = Arc::new(MessageQueue::new()); let rbx_session = Arc::new(Mutex::new(RbxSession::new( Arc::clone(&project), Arc::clone(&imfs), Arc::clone(&message_queue), ))); let fs_watcher = FsWatcher::start( Arc::clone(&imfs), Arc::clone(&rbx_session), ); let session_id = SessionId::new(); Ok(LiveSession { project, session_id, message_queue, rbx_session, imfs, _fs_watcher: fs_watcher, }) } pub fn get_project(&self) -> &Project { &self.project } }