Skip to main content

slim_signal/
lib.rs

1// Copyright AGNTCY Contributors (https://github.com/agntcy)
2// SPDX-License-Identifier: Apache-2.0
3
4pub async fn shutdown() {
5    imp::shutdown().await
6}
7
8// TODO(wasm32): listen for `beforeunload`/`pagehide` via wasm-bindgen.
9#[cfg(target_arch = "wasm32")]
10mod imp {
11    pub(super) async fn shutdown() {
12        std::future::pending::<()>().await
13    }
14}
15
16#[cfg(all(unix, not(target_arch = "wasm32")))]
17mod imp {
18    use tokio::signal::unix::{SignalKind, signal};
19    use tracing::info;
20
21    pub(super) async fn shutdown() {
22        tokio::select! {
23            // this will handle interrupt signal by users
24            _ = sig(SignalKind::interrupt(), "SIGINT") => {}
25            // this will handle SIGTERM signal
26            // e.g. k8s send this signal to stop the container
27            _ = sig(SignalKind::terminate(), "SIGTERM") => {}
28        };
29    }
30
31    async fn sig(kind: SignalKind, name: &str) {
32        signal(kind)
33            .expect("Failed to register signal handler")
34            .recv()
35            .await;
36        info!(
37            target: "slim::signal",
38            signal = %name,
39            "received signal, starting shutdown",
40        );
41    }
42}
43
44#[cfg(all(not(unix), not(target_arch = "wasm32")))]
45mod imp {
46    use tracing::info;
47
48    pub(super) async fn shutdown() {
49        tokio::signal::windows::ctrl_c()
50            .expect("Failed to register signal handler")
51            .recv()
52            .await;
53        info!(
54            target: "slim::signal",
55            "received signal Ctrl-C, starting shutdown",
56        );
57    }
58}