use std::path::Path;
use std::process::{Command, Stdio};
use std::time::{Duration, Instant};
use anyhow::{Context as _, Result};
#[must_use]
pub fn daemon_binary() -> std::path::PathBuf {
if let Ok(p) = std::env::var("VS_DAEMON_BIN") {
return p.into();
}
if let Ok(self_exe) = std::env::current_exe() {
return self_exe;
}
"vs".into()
}
pub fn spawn_daemon(extra_args: &[&str]) -> Result<()> {
let bin = daemon_binary();
Command::new(&bin)
.arg("serve")
.args(extra_args)
.stdin(Stdio::null())
.stdout(Stdio::null())
.stderr(Stdio::null())
.spawn()
.with_context(|| format!("spawn {} serve", bin.display()))?;
Ok(())
}
pub fn wait_for_socket(socket: impl AsRef<Path>, timeout: Duration) -> Result<()> {
let socket = socket.as_ref();
let deadline = Instant::now() + timeout;
while Instant::now() < deadline {
if vs_daemon::transport::is_listening(socket) {
return Ok(());
}
std::thread::sleep(Duration::from_millis(50));
}
anyhow::bail!(
"daemon socket {} did not appear within {:?}",
socket.display(),
timeout
)
}