diff --git a/common/bandwidth-controller/src/event.rs b/common/bandwidth-controller/src/event.rs index d9b1ffbc8d..ee968dfd93 100644 --- a/common/bandwidth-controller/src/event.rs +++ b/common/bandwidth-controller/src/event.rs @@ -18,7 +18,7 @@ impl std::fmt::Display for BandwidthStatusMessage { } } -impl nym_task::manager::TaskStatusEvent for BandwidthStatusMessage { +impl nym_task::TaskStatusEvent for BandwidthStatusMessage { fn as_any(&self) -> &dyn std::any::Any { self } diff --git a/common/client-core/src/error.rs b/common/client-core/src/error.rs index c1c5991b37..236c33b450 100644 --- a/common/client-core/src/error.rs +++ b/common/client-core/src/error.rs @@ -234,7 +234,7 @@ impl std::fmt::Display for ClientCoreStatusMessage { } } -impl nym_task::manager::TaskStatusEvent for ClientCoreStatusMessage { +impl nym_task::TaskStatusEvent for ClientCoreStatusMessage { fn as_any(&self) -> &dyn std::any::Any { self } diff --git a/common/socks5-client-core/src/error.rs b/common/socks5-client-core/src/error.rs index 6ce7d018ba..a7365b6d95 100644 --- a/common/socks5-client-core/src/error.rs +++ b/common/socks5-client-core/src/error.rs @@ -29,7 +29,7 @@ impl From for Socks5ClientCoreError { } } -impl nym_task::manager::TaskStatusEvent for Socks5ClientCoreError { +impl nym_task::TaskStatusEvent for Socks5ClientCoreError { fn as_any(&self) -> &dyn std::any::Any { self } diff --git a/common/socks5-client-core/src/lib.rs b/common/socks5-client-core/src/lib.rs index 939333f2ab..fd2b0803da 100644 --- a/common/socks5-client-core/src/lib.rs +++ b/common/socks5-client-core/src/lib.rs @@ -23,8 +23,7 @@ use nym_client_core::init::types::GatewaySetup; use nym_credential_storage::storage::Storage as CredentialStorage; use nym_sphinx::addressing::clients::Recipient; use nym_sphinx::params::PacketType; -use nym_task::manager::TaskStatus; -use nym_task::{TaskClient, TaskHandle}; +use nym_task::{TaskClient, TaskHandle, TaskStatus}; use anyhow::anyhow; use nym_validator_client::UserAgent; diff --git a/common/task/src/event.rs b/common/task/src/event.rs new file mode 100644 index 0000000000..d234286edd --- /dev/null +++ b/common/task/src/event.rs @@ -0,0 +1,35 @@ +// Copyright 2024 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +use std::{any::Any, fmt}; + +pub type SentStatus = Box; +pub type StatusSender = futures::channel::mpsc::Sender; +pub type StatusReceiver = futures::channel::mpsc::Receiver; + +pub trait TaskStatusEvent: Send + Sync + Any + fmt::Display { + fn as_any(&self) -> &dyn Any; +} + +#[derive(Debug, PartialEq, Eq)] +pub enum TaskStatus { + Ready, + ReadyWithGateway(String), +} + +impl fmt::Display for TaskStatus { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + TaskStatus::Ready => write!(f, "Ready"), + TaskStatus::ReadyWithGateway(gateway) => { + write!(f, "Ready and connected to gateway: {gateway}") + } + } + } +} + +impl TaskStatusEvent for TaskStatus { + fn as_any(&self) -> &dyn Any { + self + } +} diff --git a/common/task/src/lib.rs b/common/task/src/lib.rs index 6615bc86e0..0ed54166d4 100644 --- a/common/task/src/lib.rs +++ b/common/task/src/lib.rs @@ -2,12 +2,14 @@ // SPDX-License-Identifier: Apache-2.0 pub mod connections; +pub mod event; pub mod manager; #[cfg(not(target_arch = "wasm32"))] pub mod signal; pub mod spawn; -pub use manager::{StatusReceiver, StatusSender, TaskClient, TaskHandle, TaskManager}; +pub use event::{StatusReceiver, StatusSender, TaskStatus, TaskStatusEvent}; +pub use manager::{TaskClient, TaskHandle, TaskManager}; #[cfg(not(target_arch = "wasm32"))] pub use signal::wait_for_signal_and_error; diff --git a/common/task/src/manager.rs b/common/task/src/manager.rs index a55c213813..b3bc6e0232 100644 --- a/common/task/src/manager.rs +++ b/common/task/src/manager.rs @@ -1,16 +1,21 @@ // Copyright 2022 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 +use std::{ + error::Error, + sync::atomic::{AtomicBool, Ordering}, + time::Duration, +}; + use futures::{future::pending, FutureExt, SinkExt, StreamExt}; use log::{log, Level}; -use std::any::Any; -use std::sync::atomic::{AtomicBool, Ordering}; -use std::{error::Error, time::Duration}; use tokio::sync::{ mpsc, watch::{self, error::SendError}, }; +use crate::event::{SentStatus, StatusReceiver, StatusSender, TaskStatus}; + #[cfg(not(target_arch = "wasm32"))] use tokio::time::{sleep, timeout}; @@ -23,10 +28,6 @@ pub(crate) type SentError = Box; type ErrorSender = mpsc::UnboundedSender; type ErrorReceiver = mpsc::UnboundedReceiver; -pub type SentStatus = Box; -pub type StatusSender = futures::channel::mpsc::Sender; -pub type StatusReceiver = futures::channel::mpsc::Receiver; - fn try_recover_name(name: &Option) -> String { if let Some(name) = name { name.clone() @@ -41,33 +42,6 @@ enum TaskError { UnexpectedHalt { shutdown_name: Option }, } -pub trait TaskStatusEvent: Send + Sync + Any + std::fmt::Display { - fn as_any(&self) -> &dyn Any; -} - -#[derive(Debug, PartialEq, Eq)] -pub enum TaskStatus { - Ready, - ReadyWithGateway(String), -} - -impl std::fmt::Display for TaskStatus { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - match self { - TaskStatus::Ready => write!(f, "Ready"), - TaskStatus::ReadyWithGateway(gateway) => { - write!(f, "Ready and connected to gateway: {gateway}") - } - } - } -} - -impl TaskStatusEvent for TaskStatus { - fn as_any(&self) -> &dyn Any { - self - } -} - /// Listens to status and error messages from tasks, as well as notifying them to gracefully /// shutdown. Keeps track of if task stop unexpectedly, such as in a panic. #[derive(Debug)] diff --git a/sdk/rust/nym-sdk/src/mixnet/client.rs b/sdk/rust/nym-sdk/src/mixnet/client.rs index 8f4b6caa28..edf299904d 100644 --- a/sdk/rust/nym-sdk/src/mixnet/client.rs +++ b/sdk/rust/nym-sdk/src/mixnet/client.rs @@ -30,8 +30,7 @@ use nym_client_core::init::setup_gateway; use nym_client_core::init::types::{GatewaySelectionSpecification, GatewaySetup}; use nym_credentials_interface::TicketType; use nym_socks5_client_core::config::Socks5; -use nym_task::manager::TaskStatus; -use nym_task::{TaskClient, TaskHandle}; +use nym_task::{TaskClient, TaskHandle, TaskStatus}; use nym_topology::provider_trait::TopologyProvider; use nym_validator_client::{nyxd, QueryHttpRpcNyxdClient, UserAgent}; use rand::rngs::OsRng;