From 665e6b034f359a4a6552768f828556154023e2e5 Mon Sep 17 00:00:00 2001 From: Nova Date: Thu, 28 Sep 2023 10:31:23 -0400 Subject: [PATCH] feat(state): save state to ~/.local/state/stardust/ on graceful disconnect --- src/core/client.rs | 2 +- src/core/client_state.rs | 38 ++++++++++++++++++++++++++------------ 2 files changed, 27 insertions(+), 13 deletions(-) diff --git a/src/core/client.rs b/src/core/client.rs index 137d103..91de2f7 100644 --- a/src/core/client.rs +++ b/src/core/client.rs @@ -191,7 +191,7 @@ impl Client { } pub async fn save_state(&self) -> Option { let internal = self.root.get()?.save_state().await.ok()?; - Some(dbg!(ClientState::from_deserialized(self, internal))) + Some(ClientState::from_deserialized(self, internal)) } #[inline] diff --git a/src/core/client_state.rs b/src/core/client_state.rs index 4d7a823..dd7c22b 100644 --- a/src/core/client_state.rs +++ b/src/core/client_state.rs @@ -1,19 +1,34 @@ -use super::client::Client; +use super::client::{get_env, Client}; use crate::nodes::{spatial::Spatial, Node}; use glam::Mat4; use parking_lot::Mutex; use rustc_hash::FxHashMap; use serde::{Deserialize, Serialize}; -use std::{path::PathBuf, sync::Arc}; +use std::{io::Write, path::PathBuf, sync::Arc}; lazy_static::lazy_static! { pub static ref CLIENT_STATES: Mutex>> = Default::default(); } +#[derive(Debug, Serialize, Deserialize)] +pub struct LaunchInfo { + pub cmdline: Vec, + pub cwd: PathBuf, + pub env: FxHashMap, +} +impl LaunchInfo { + fn from_client(client: &Client) -> Option { + Some(LaunchInfo { + cmdline: client.get_cmdline()?, + cwd: client.get_cwd()?, + env: get_env(client.pid?).ok()?, + }) + } +} + #[derive(Debug, Serialize, Deserialize)] pub struct ClientState { - pub cmdline: Option>, - pub cwd: Option, + pub launch_info: Option, pub data: Option>, pub root: Mat4, pub spatial_anchors: FxHashMap, @@ -21,8 +36,7 @@ pub struct ClientState { impl ClientState { pub fn from_deserialized(client: &Client, state: ClientStateInternal) -> Self { ClientState { - cmdline: client.get_cmdline(), - cwd: client.get_cwd(), + launch_info: LaunchInfo::from_client(client), data: state.data, root: Self::spatial_transform(client, &state.root.unwrap_or_default()) .unwrap_or_default(), @@ -45,11 +59,12 @@ impl ClientState { token } pub fn to_file(self) { - let state_dir = directories::ProjectDirs::from("", "", "stardust") - .unwrap() - .state_dir() + let project_dirs = directories::ProjectDirs::from("", "", "stardust").unwrap(); + let state_dir = project_dirs.state_dir().unwrap(); + std::fs::create_dir_all(state_dir).unwrap(); + let mut file = std::fs::File::create(state_dir.join(nanoid::nanoid!())).unwrap(); + file.write_all(&stardust_xr::schemas::flex::flexbuffers::to_vec(self).unwrap()) .unwrap(); - // std::fs::File::create(state_dir.join("")) } pub fn apply_to(&self, client: &Arc) -> ClientStateInternal { if let Some(root) = client.root.get() { @@ -77,8 +92,7 @@ impl ClientState { impl Default for ClientState { fn default() -> Self { Self { - cmdline: None, - cwd: None, + launch_info: None, data: None, root: Mat4::IDENTITY, spatial_anchors: Default::default(),