mirror of
https://github.com/chatmail/core.git
synced 2026-05-09 09:56:31 +03:00
move stdio implementation into own method
This commit is contained in:
@@ -81,10 +81,47 @@ async fn main_impl() -> Result<()> {
|
|||||||
let accounts = Arc::new(RwLock::new(accounts));
|
let accounts = Arc::new(RwLock::new(accounts));
|
||||||
let state = CommandApi::from_arc(accounts.clone()).await;
|
let state = CommandApi::from_arc(accounts.clone()).await;
|
||||||
|
|
||||||
let (client, mut out_receiver) = RpcClient::new();
|
|
||||||
let session = RpcSession::new(client.clone(), state.clone());
|
|
||||||
let main_cancel = CancellationToken::new();
|
let main_cancel = CancellationToken::new();
|
||||||
|
|
||||||
|
let cancel = main_cancel.clone();
|
||||||
|
let sigterm_task: JoinHandle<anyhow::Result<()>> = tokio::spawn(async move {
|
||||||
|
#[cfg(target_family = "unix")]
|
||||||
|
{
|
||||||
|
let _cancel_guard = cancel.clone().drop_guard();
|
||||||
|
tokio::select! {
|
||||||
|
_ = cancel.cancelled() => (),
|
||||||
|
_ = sigterm.recv() => {
|
||||||
|
log::info!("got SIGTERM");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let _ = cancel;
|
||||||
|
Ok(())
|
||||||
|
});
|
||||||
|
|
||||||
|
let (send_task, recv_task) = stdio_impl(state, main_cancel.clone()).await?;
|
||||||
|
|
||||||
|
main_cancel.cancelled().await;
|
||||||
|
accounts.read().await.stop_io().await;
|
||||||
|
drop(accounts);
|
||||||
|
send_task.await??;
|
||||||
|
sigterm_task.await??;
|
||||||
|
recv_task.await??;
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn stdio_impl(
|
||||||
|
state: CommandApi,
|
||||||
|
main_cancel: CancellationToken,
|
||||||
|
) -> Result<(
|
||||||
|
JoinHandle<anyhow::Result<()>>,
|
||||||
|
JoinHandle<anyhow::Result<()>>,
|
||||||
|
)> {
|
||||||
|
let (client, mut out_receiver) = RpcClient::new();
|
||||||
|
|
||||||
|
let session = RpcSession::new(client.clone(), state.clone());
|
||||||
|
|
||||||
// Send task prints JSON responses to stdout.
|
// Send task prints JSON responses to stdout.
|
||||||
let cancel = main_cancel.clone();
|
let cancel = main_cancel.clone();
|
||||||
let send_task: JoinHandle<anyhow::Result<()>> = tokio::spawn(async move {
|
let send_task: JoinHandle<anyhow::Result<()>> = tokio::spawn(async move {
|
||||||
@@ -103,22 +140,6 @@ async fn main_impl() -> Result<()> {
|
|||||||
Ok(())
|
Ok(())
|
||||||
});
|
});
|
||||||
|
|
||||||
let cancel = main_cancel.clone();
|
|
||||||
let sigterm_task: JoinHandle<anyhow::Result<()>> = tokio::spawn(async move {
|
|
||||||
#[cfg(target_family = "unix")]
|
|
||||||
{
|
|
||||||
let _cancel_guard = cancel.clone().drop_guard();
|
|
||||||
tokio::select! {
|
|
||||||
_ = cancel.cancelled() => (),
|
|
||||||
_ = sigterm.recv() => {
|
|
||||||
log::info!("got SIGTERM");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
let _ = cancel;
|
|
||||||
Ok(())
|
|
||||||
});
|
|
||||||
|
|
||||||
// Receiver task reads JSON requests from stdin.
|
// Receiver task reads JSON requests from stdin.
|
||||||
let cancel = main_cancel.clone();
|
let cancel = main_cancel.clone();
|
||||||
let recv_task: JoinHandle<anyhow::Result<()>> = tokio::spawn(async move {
|
let recv_task: JoinHandle<anyhow::Result<()>> = tokio::spawn(async move {
|
||||||
@@ -150,13 +171,5 @@ async fn main_impl() -> Result<()> {
|
|||||||
Ok(())
|
Ok(())
|
||||||
});
|
});
|
||||||
|
|
||||||
main_cancel.cancelled().await;
|
Ok((send_task, recv_task))
|
||||||
accounts.read().await.stop_io().await;
|
|
||||||
drop(accounts);
|
|
||||||
drop(state);
|
|
||||||
send_task.await??;
|
|
||||||
sigterm_task.await??;
|
|
||||||
recv_task.await??;
|
|
||||||
|
|
||||||
Ok(())
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user