Start the server and process tasks
(&self)
| 82 | |
| 83 | /// Start the server and process tasks |
| 84 | pub async fn run(&self) -> Result<(), Box<dyn std::error::Error + Send + Sync>> { |
| 85 | // Check if server is already running |
| 86 | if self.lifecycle.is_server_running() { |
| 87 | return Err("Server is already running".into()); |
| 88 | } |
| 89 | |
| 90 | // Write PID file |
| 91 | self.lifecycle.write_pid()?; |
| 92 | |
| 93 | self.emit(ServerEvent::StatusMessage(format!( |
| 94 | "tsk server started (PID {})", |
| 95 | std::process::id() |
| 96 | ))); |
| 97 | |
| 98 | // Start the task scheduler in the background |
| 99 | let scheduler = self.scheduler.clone(); |
| 100 | let workers = self.workers; |
| 101 | let event_sender_clone = self.event_sender.clone(); |
| 102 | let scheduler_handle = tokio::spawn(async move { |
| 103 | if let Err(e) = scheduler.lock().await.start(workers).await { |
| 104 | crate::tui::events::emit_or_print( |
| 105 | &event_sender_clone, |
| 106 | ServerEvent::WarningMessage(format!("Scheduler error: {e}")), |
| 107 | ); |
| 108 | } |
| 109 | }); |
| 110 | *self.scheduler_handle.lock().await = Some(scheduler_handle); |
| 111 | |
| 112 | // Wait for the quit signal from the scheduler (quit-when-done mode) |
| 113 | self.quit_signal.notified().await; |
| 114 | self.emit(ServerEvent::StatusMessage( |
| 115 | "Received quit signal from scheduler...".to_string(), |
| 116 | )); |
| 117 | |
| 118 | // Wait for the scheduler task to finish its cleanup |
| 119 | if let Some(handle) = self.scheduler_handle.lock().await.take() { |
| 120 | let _ = handle.await; |
| 121 | } |
| 122 | |
| 123 | // Clean up server resources |
| 124 | self.lifecycle.cleanup()?; |
| 125 | |
| 126 | // Ensure terminal title is restored |
| 127 | self.app_context.terminal_operations().restore_title(); |
| 128 | |
| 129 | Ok(()) |
| 130 | } |
| 131 | |
| 132 | /// Perform graceful shutdown: kill managed containers, drain pool, mark tasks cancelled, cleanup. |
| 133 | /// |
nothing calls this directly
no test coverage detected