diff --git a/src/app.rs b/src/app.rs --- a/src/app.rs +++ b/src/app.rs @@ -157,31 +157,36 @@ } pub async fn create_invite(&self, folder_path: &Path) -> AppResult { + let node = self.load_node().await?; + let result = self.create_invite_with_node(folder_path, &node).await; + node.shutdown().await?; + result + } + + pub(crate) async fn create_invite_with_node( + &self, + folder_path: &Path, + node: &NodeHost, + ) -> AppResult { let folder = self.require_folder(folder_path)?; let roster = self .state_store .load_roster(folder.id)? .ok_or_else(|| anyhow::anyhow!("folder has no signed roster"))?; - let node = self.load_node().await?; - let result = async { - node.wait_until_online().await?; - let mut invite = Invite { - protocol_version: PROTOCOL_VERSION, - folder_id: folder.id, - folder_name: folder.name.clone(), - inviter_device_id: node.endpoint_address().id.to_string(), - inviter_endpoint: node.endpoint_address(), - capability: folder.capability.clone(), - roster, - expires_at: OffsetDateTime::now_utc() + INVITE_TTL, - signature: None, - }; - invite.sign(&self.paths.load_identity()?)?; - encode_invite(&invite) - } - .await; - node.shutdown().await?; - result + node.wait_until_online().await?; + let mut invite = Invite { + protocol_version: PROTOCOL_VERSION, + folder_id: folder.id, + folder_name: folder.name.clone(), + inviter_device_id: node.endpoint_address().id.to_string(), + inviter_endpoint: node.endpoint_address(), + capability: folder.capability.clone(), + roster, + expires_at: OffsetDateTime::now_utc() + INVITE_TTL, + signature: None, + }; + invite.sign(&self.paths.load_identity()?)?; + encode_invite(&invite) } pub fn join_folder(&self, folder_path: &Path, ticket: &str) -> AppResult { diff --git a/src/daemon.rs b/src/daemon.rs --- a/src/daemon.rs +++ b/src/daemon.rs @@ -44,7 +44,7 @@ } => result?, accepted = listener.accept() => { let (mut stream, _) = accepted?; - handle_connection(&service, &mut stream).await; + handle_connection(&service, &sync_runner, &mut stream).await; } } } @@ -52,10 +52,14 @@ remove_stale_socket(&socket_path) } -async fn handle_connection(service: &AppaService, stream: &mut UnixStream) { +async fn handle_connection( + service: &AppaService, + sync_runner: &SyncRunner, + stream: &mut UnixStream, +) { let response = match ipc::read_message::(stream).await { Ok(request) if request.protocol_version == PROTOCOL_VERSION => { - handle_command(service, request.command).await + handle_command(service, sync_runner, request.command).await } Ok(request) => Response::Error(format!( "unsupported Appa daemon protocol version {}; expected {PROTOCOL_VERSION}", @@ -68,7 +72,11 @@ } } -async fn handle_command(service: &AppaService, command: Command) -> Response { +async fn handle_command( + service: &AppaService, + sync_runner: &SyncRunner, + command: Command, +) -> Response { let result = match command { Command::Dashboard => service_dashboard(service).map(Response::Dashboard), Command::FolderDetails { folder_path } => { @@ -84,7 +92,7 @@ .join_folder(&folder_path, &invitation) .map(|_| Response::Success), Command::CreateInvite { folder_path } => service - .create_invite(&folder_path) + .create_invite_with_node(&folder_path, sync_runner.node()) .await .map(Response::Invitation), Command::RevokeMember { diff --git a/src/app/run.rs b/src/app/run.rs --- a/src/app/run.rs +++ b/src/app/run.rs @@ -84,6 +84,10 @@ pub(crate) async fn shutdown(self) -> AppResult<()> { self.node.shutdown().await } + + pub(crate) fn node(&self) -> &NodeHost { + &self.node + } } impl AppaService {