Skip to main content

DevelopmentNodeEnvironment_MicrosoftVSCodeDependency_22NodeVersion_Bundle_Clean_Debug_ElectronProfile_EsbuildCompiler_Mountain/RunTime/Shutdown/
ShutdownWithRecovery.rs

1//! Robust shutdown that continues across individual service failures.
2//! Cocoon retry → terminal disposal → state save → flush. Errors collected
3//! into one summary instead of crashing.
4
5use CommonLibrary::Error::CommonError::CommonError;
6
7use crate::{RunTime::ApplicationRunTime::ApplicationRunTime, dev_log};
8
9impl ApplicationRunTime {
10	pub async fn ShutdownWithRecovery(&self) -> Result<(), CommonError> {
11		dev_log!("lifecycle", "[ApplicationRunTime] Initiating robust shutdown with recovery...");
12
13		let mut ShutdownErrors:Vec<String> = Vec::new();
14
15		match self.ShutdownCocoonWithRetry().await {
16			Ok(()) => dev_log!("lifecycle", "[ApplicationRunTime] Cocoon shutdown successful"),
17
18			Err(Error) => {
19				ShutdownErrors.push(format!("Cocoon shutdown failed: {}", Error));
20
21				dev_log!("lifecycle", "warn: [ApplicationRunTime] Cocoon shutdown failed, continuing...");
22			},
23		}
24
25		match self.DisposeTerminalsSafely().await {
26			Ok(()) => dev_log!("lifecycle", "[ApplicationRunTime] Terminal disposal successful"),
27
28			Err(Error) => {
29				ShutdownErrors.push(format!("Terminal disposal failed: {}", Error));
30
31				dev_log!(
32					"lifecycle",
33					"warn: [ApplicationRunTime] Terminal disposal failed, continuing..."
34				);
35			},
36		}
37
38		match self.SaveApplicationState().await {
39			Ok(()) => dev_log!("lifecycle", "[ApplicationRunTime] Application state saved"),
40
41			Err(Error) => {
42				ShutdownErrors.push(format!("State save failed: {}", Error));
43
44				dev_log!(
45					"lifecycle",
46					"warn: [ApplicationRunTime] Failed to save application state, continuing..."
47				);
48			},
49		}
50
51		self.FlushPendingOperations().await;
52
53		if !ShutdownErrors.is_empty() {
54			Err(CommonError::Unknown {
55				Description:format!("Shutdown completed with {} errors: {:?}", ShutdownErrors.len(), ShutdownErrors),
56			})
57		} else {
58			Ok(())
59		}
60	}
61}