Refactor ServeCommand to improve session management and error handling

- Removed the direct initialization of the Project within the ServeCommand's run method, replacing it with a more streamlined session management approach using ServeSession.
- Enhanced error handling by creating a new Vfs instance with error tracking for each session, ensuring better management of critical errors during server operation.
- Improved the overall flow of the run method by reducing redundancy in session creation and enhancing clarity.

These changes aim to optimize the server's session handling and improve error management during execution.
This commit is contained in:
Joe 2026-03-01 17:15:32 -06:00
parent a506b97e71
commit 8d54fff7df

View file

@ -12,7 +12,6 @@ use memofs::Vfs;
use rbx_dom_weak::{types::Ref, types::Variant, InstanceBuilder, WeakDom}; use rbx_dom_weak::{types::Ref, types::Variant, InstanceBuilder, WeakDom};
use crate::{ use crate::{
project::Project,
serve_session::ServeSession, serve_session::ServeSession,
syncback::syncback_loop, syncback::syncback_loop,
web::{ web::{
@ -47,16 +46,19 @@ impl ServeCommand {
pub fn run(self) -> anyhow::Result<()> { pub fn run(self) -> anyhow::Result<()> {
let project_path = resolve_path(&self.project); let project_path = resolve_path(&self.project);
let (ip, port) = { let (first_vfs, first_errors) = Vfs::new_default_with_errors();
let vfs = Vfs::new_oneshot(); let first_session = Arc::new(ServeSession::new(
let project = Project::load_initial_project(&vfs, &project_path)?; first_vfs,
let ip = self project_path.clone(),
.address Some(first_errors),
.or(project.serve_address) )?);
.unwrap_or(DEFAULT_BIND_ADDRESS.into());
let port = self.port.or(project.serve_port).unwrap_or(DEFAULT_PORT); let project = first_session.root_project();
(ip, port) let ip = self
}; .address
.or(project.serve_address)
.unwrap_or(DEFAULT_BIND_ADDRESS.into());
let port = self.port.or(project.serve_port).unwrap_or(DEFAULT_PORT);
let addr: SocketAddr = (ip, port).into(); let addr: SocketAddr = (ip, port).into();
let host = if ip.is_loopback() { let host = if ip.is_loopback() {
@ -65,13 +67,8 @@ impl ServeCommand {
ip.to_string() ip.to_string()
}; };
let mut session = first_session;
loop { loop {
let (vfs, critical_errors) = Vfs::new_default_with_errors();
let session = Arc::new(ServeSession::new(
vfs,
project_path.clone(),
Some(critical_errors),
)?);
let server = LiveServer::new(session); let server = LiveServer::new(session);
log::info!("Listening: http://{}:{}", host, port); log::info!("Listening: http://{}:{}", host, port);
@ -85,6 +82,12 @@ impl ServeCommand {
log::error!("Live syncback failed: {err:#}. Restarting serve...") log::error!("Live syncback failed: {err:#}. Restarting serve...")
} }
} }
let (vfs, critical_errors) = Vfs::new_default_with_errors();
session = Arc::new(ServeSession::new(
vfs,
project_path.clone(),
Some(critical_errors),
)?);
continue; continue;
} }
} }