From 90117d1beb36950af4357dafcece55f1ef5d6f84 Mon Sep 17 00:00:00 2001 From: Warittorn Cheevachaipimol Date: Wed, 6 Nov 2024 17:12:50 +0700 Subject: [PATCH 1/3] add telemetry for binance --- Cargo.lock | 19 +- Cargo.toml | 1 + bothan-binance/Cargo.toml | 1 + bothan-binance/src/api/msgs.rs | 6 +- bothan-binance/src/api/websocket.rs | 16 +- bothan-binance/src/worker.rs | 2 +- bothan-binance/src/worker/asset_worker.rs | 277 +++++++++++++++------- bothan-binance/src/worker/builder.rs | 2 +- bothan-binance/src/worker/error.rs | 9 - bothan-binance/src/worker/types.rs | 2 + bothan-core/src/store/worker.rs | 25 ++ 11 files changed, 252 insertions(+), 108 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5e94ef39..b08ea03b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -121,9 +121,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.91" +version = "1.0.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c042108f3ed77fd83760a5fd79b53be043192bb3b9dba91d8c574c0ada7850c8" +checksum = "4c95c10ba0b00a02636238b814946408b1322d5ac4760326e6fb8ec956d85775" [[package]] name = "arraydeque" @@ -442,6 +442,7 @@ dependencies = [ "futures-channel", "futures-util", "humantime-serde", + "opentelemetry", "rand", "rust_decimal", "serde", @@ -2040,6 +2041,20 @@ dependencies = [ "vcpkg", ] +[[package]] +name = "opentelemetry" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "570074cc999d1a58184080966e5bd3bf3a9a4af650c3b05047c2621e7405cd17" +dependencies = [ + "futures-core", + "futures-sink", + "js-sys", + "once_cell", + "pin-project-lite", + "thiserror", +] + [[package]] name = "option-ext" version = "0.2.0" diff --git a/Cargo.toml b/Cargo.toml index b11f963a..d9a02759 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -33,6 +33,7 @@ futures = "0.3.30" humantime-serde = "1.1.1" itertools = "0.13.0" mockito = "1.4.0" +opentelemetry = { version = "0.26.0", features = ["metrics"] } prost = "0.13.1" protoc-gen-prost = "0.4.0" protoc-gen-tonic = "0.4.1" diff --git a/bothan-binance/Cargo.toml b/bothan-binance/Cargo.toml index 2eb13aff..4969a075 100644 --- a/bothan-binance/Cargo.toml +++ b/bothan-binance/Cargo.toml @@ -9,6 +9,7 @@ repository.workspace = true async-trait = { workspace = true } bothan-core = { workspace = true } humantime-serde = { workspace = true } +opentelemetry = { workspace = true } rand = { workspace = true } rust_decimal = { workspace = true } serde = { workspace = true } diff --git a/bothan-binance/src/api/msgs.rs b/bothan-binance/src/api/msgs.rs index 162e0422..d3ab4ed2 100644 --- a/bothan-binance/src/api/msgs.rs +++ b/bothan-binance/src/api/msgs.rs @@ -3,14 +3,14 @@ use serde::{Deserialize, Serialize}; #[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] pub struct SuccessResponse { pub result: Option, - pub id: u64, + pub id: i64, } #[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] pub struct ErrorResponse { - pub code: u16, + pub code: i16, pub msg: String, - pub id: u64, + pub id: i64, } #[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] diff --git a/bothan-binance/src/api/websocket.rs b/bothan-binance/src/api/websocket.rs index bd40f032..97cdd389 100644 --- a/bothan-binance/src/api/websocket.rs +++ b/bothan-binance/src/api/websocket.rs @@ -70,10 +70,11 @@ impl BinanceWebSocketConnection { /// ``` pub async fn subscribe_mini_ticker_stream>( &mut self, - ids: &[K], + id: i64, + tickers: &[K], ) -> Result<(), SendError> { // Format the stream IDs for subscription. - let stream_ids = ids + let tickers = tickers .iter() .map(|id| format!("{}@miniTicker", id.as_ref())) .collect::>(); @@ -81,8 +82,8 @@ impl BinanceWebSocketConnection { // Create the subscription payload. let payload = json!({ "method": "SUBSCRIBE", - "params": stream_ids, - "id": rand::random::() + "params": tickers, + "id": id, }); // Send the subscription message. @@ -101,10 +102,11 @@ impl BinanceWebSocketConnection { /// ``` pub async fn unsubscribe_mini_ticker_stream>( &mut self, - ids: &[K], + id: i64, + tickers: &[K], ) -> Result<(), SendError> { // Format the stream IDs for unsubscription. - let stream_ids = ids + let stream_ids = tickers .iter() .map(|id| format!("{}@miniTicker", id.as_ref())) .collect::>(); @@ -113,7 +115,7 @@ impl BinanceWebSocketConnection { let payload = json!({ "method": "UNSUBSCRIBE", "params": stream_ids, - "id": rand::random::() + "id":id, }); // Send the unsubscription message. diff --git a/bothan-binance/src/worker.rs b/bothan-binance/src/worker.rs index 8937e328..7dd53635 100644 --- a/bothan-binance/src/worker.rs +++ b/bothan-binance/src/worker.rs @@ -49,7 +49,7 @@ impl AssetWorker for BinanceWorker { async fn set_query_ids(&self, ids: Vec) -> Result<(), SetQueryIDError> { let (to_sub, to_unsub) = self .store - .set_query_ids(ids) + .compute_query_id_differences(ids) .await .map_err(|e| SetQueryIDError::new(e.to_string()))?; diff --git a/bothan-binance/src/worker/asset_worker.rs b/bothan-binance/src/worker/asset_worker.rs index bfb6582b..373ae348 100644 --- a/bothan-binance/src/worker/asset_worker.rs +++ b/bothan-binance/src/worker/asset_worker.rs @@ -1,5 +1,9 @@ +use std::collections::HashMap; use std::sync::Weak; +use opentelemetry::{global, KeyValue}; +use rand::random; +use rust_decimal::prelude::ToPrimitive; use rust_decimal::Decimal; use tokio::select; use tokio::sync::mpsc::Receiver; @@ -9,27 +13,33 @@ use tracing::{debug, error, info, warn}; use bothan_core::store::WorkerStore; use bothan_core::types::AssetInfo; -use crate::api::error::{MessageError, SendError}; -use crate::api::msgs::{BinanceResponse, Data}; +use crate::api::error::MessageError; +use crate::api::msgs::{BinanceResponse, Data, ErrorResponse, SuccessResponse}; use crate::api::{BinanceWebSocketConnection, BinanceWebSocketConnector}; -use crate::worker::error::WorkerError; -use crate::worker::types::{DEFAULT_TIMEOUT, RECONNECT_BUFFER}; +use crate::worker::types::{DEFAULT_TIMEOUT, METER_NAME, RECONNECT_BUFFER}; use crate::worker::BinanceWorker; +enum Event { + Subscribe(Vec), + Unsubscribe(Vec), +} + pub(crate) async fn start_asset_worker( worker: Weak, mut connection: BinanceWebSocketConnection, mut subscribe_rx: Receiver>, mut unsubscribe_rx: Receiver>, ) { + let mut subscription_map = HashMap::new(); while let Some(worker) = worker.upgrade() { select! { - Some(ids) = subscribe_rx.recv() => handle_subscribe_recv(ids, &worker.store, &mut connection).await, - Some(ids) = unsubscribe_rx.recv() => handle_unsubscribe_recv(ids, &worker.store, &mut connection).await, + Some(ids) = subscribe_rx.recv() => handle_subscribe_recv(ids, &mut connection, &mut subscription_map).await, + Some(ids) = unsubscribe_rx.recv() => handle_unsubscribe_recv(ids, &mut connection, &mut subscription_map).await, result = timeout(DEFAULT_TIMEOUT, connection.next()) => { match result { + // Assume that the connection has been closed on timeout and attempt to reconnect Err(_) => handle_reconnect(&worker.connector, &mut connection, &worker.store).await, - Ok(binance_result) => handle_connection_recv(binance_result, &worker.connector, &mut connection, &worker.store).await, + Ok(binance_result) => handle_connection_recv(binance_result, &worker.connector, &mut connection, &worker.store, &mut subscription_map).await, } } } @@ -45,60 +55,103 @@ pub(crate) async fn start_asset_worker( debug!("asset worker has been dropped, stopping asset worker"); } -async fn subscribe>( - ids: &[T], - connection: &mut BinanceWebSocketConnection, -) -> Result<(), SendError> { - if !ids.is_empty() { - connection - .subscribe_mini_ticker_stream(&ids.iter().map(|s| s.as_ref()).collect::>()) - .await? - } - - Ok(()) -} - async fn handle_subscribe_recv( ids: Vec, - worker_store: &WorkerStore, connection: &mut BinanceWebSocketConnection, + subscription_map: &mut HashMap, ) { - match subscribe(&ids, connection).await { - Ok(_) => info!("subscribed to ids {:?}", ids), + if ids.is_empty() { + return; + } + + let packet_id = random(); + let tickers = ids.iter().map(|s| s.as_ref()).collect::>(); + + let meter = global::meter(METER_NAME); + meter.u64_counter("subscribe_attempt").init().add( + 1, + &[ + KeyValue::new("subscription.id", packet_id), + KeyValue::new("subscription.tickers", tickers.join(",")), + ], + ); + + match connection + .subscribe_mini_ticker_stream(packet_id, &tickers) + .await + { + Ok(_) => { + info!("attempt to subscribe to ids {:?}", ids); + subscription_map.insert(packet_id, Event::Subscribe(ids)); + } Err(e) => { - error!("failed to subscribe to ids {:?}: {}", ids, e); - if worker_store.remove_query_ids(ids).await.is_err() { - error!("failed to remove query ids from store") - } + error!("failed attempt to subscribe to ids {:?}: {}", ids, e); + meter + .u64_counter("failed_subscribe_attempt") + .init() + .add(1, &[KeyValue::new("subscription.id", packet_id)]); } } } -async fn unsubscribe>( - ids: &[T], +async fn handle_unsubscribe_recv( + ids: Vec, connection: &mut BinanceWebSocketConnection, -) -> Result<(), SendError> { - if !ids.is_empty() { - connection - .unsubscribe_mini_ticker_stream(&ids.iter().map(|s| s.as_ref()).collect::>()) - .await? + subscription_map: &mut HashMap, +) { + if ids.is_empty() { + return; } - Ok(()) + let packet_id = random(); + let tickers = ids.iter().map(|s| s.as_ref()).collect::>(); + + let meter = global::meter(METER_NAME); + meter.u64_counter("unsubscribe_attempt").init().add( + 1, + &[ + KeyValue::new("subscription.id", packet_id), + KeyValue::new("subscription.tickers", tickers.join(",")), + ], + ); + + match connection + .unsubscribe_mini_ticker_stream(packet_id, &tickers) + .await + { + Ok(_) => { + info!("attempt to unsubscribe to ids {:?}", ids); + subscription_map.insert(packet_id, Event::Unsubscribe(ids)); + } + Err(e) => { + error!("failed attempt to unsubscribe to ids {:?}: {}", ids, e); + meter + .u64_counter("failed_unsubscribe_attempt") + .init() + .add(1, &[KeyValue::new("subscription.id", packet_id)]); + } + } } -async fn handle_unsubscribe_recv( - ids: Vec, - worker_store: &WorkerStore, +async fn handle_connection_recv( + recv_result: Result, + connector: &BinanceWebSocketConnector, connection: &mut BinanceWebSocketConnection, + store: &WorkerStore, + subscription_map: &mut HashMap, ) { - match unsubscribe(&ids, connection).await { - Ok(_) => info!("unsubscribed to ids {:?}", ids), - Err(e) => { - error!("failed to unsubscribe to ids {:?}: {}", ids, e); - if worker_store.add_query_ids(ids).await.is_err() { - error!("failed to add query ids to store") - } + match recv_result { + Ok(resp) => { + process_response(store, resp, subscription_map).await; + } + Err(MessageError::ChannelClosed) => { + handle_reconnect(connector, connection, store).await; + } + Err(MessageError::UnsupportedMessage) => { + error!("unsupported message received from binance"); + } + Err(MessageError::Parse(..)) => { + error!("unable to parse message from binance"); } } } @@ -110,6 +163,9 @@ async fn handle_reconnect( ) { let mut retry_count: usize = 1; loop { + let meter = global::meter(METER_NAME); + meter.u64_counter("reconnect-attempts").init().add(1, &[]); + warn!("reconnecting: attempt {}", retry_count); if let Ok(new_connection) = connector.connect().await { @@ -123,7 +179,18 @@ async fn handle_reconnect( let ids_vec = ids.into_iter().collect::>(); - if subscribe(&ids_vec, connection).await.is_ok() { + if ids_vec.is_empty() { + info!("no ids to resubscribe to"); + return; + } + + let packet_id = random(); + + if connection + .unsubscribe_mini_ticker_stream(packet_id, &ids_vec) + .await + .is_ok() + { info!("resubscribed to all ids"); } else { error!("failed to resubscribe to all ids"); @@ -137,58 +204,98 @@ async fn handle_reconnect( } } -async fn store_data(store: &WorkerStore, data: Data) -> Result<(), WorkerError> { +async fn process_response( + store: &WorkerStore, + resp: BinanceResponse, + subscription_map: &mut HashMap, +) { + match resp { + BinanceResponse::Stream(r) => store_data(store, r.data).await, + BinanceResponse::Success(r) => process_success(store, r, subscription_map).await, + BinanceResponse::Ping => process_ping(), + BinanceResponse::Error(e) => process_error(e), + } +} + +async fn store_data(store: &WorkerStore, data: Data) { match data { Data::MiniTicker(ticker) => { let id = ticker.symbol.to_lowercase(); - let price = Decimal::from_str_exact(&ticker.close_price)?; + let Ok(price) = Decimal::from_str_exact(&ticker.close_price) else { + error!("failed to parse price for id {}", id); + return; + }; + let timestamp = ticker.event_time / 1000; let asset_info = AssetInfo::new(id.clone(), price, timestamp); - store.set_asset(&id, asset_info).await?; - debug!("stored data for id {}", id); - } - } - - Ok(()) -} - -async fn process_response(store: &WorkerStore, resp: BinanceResponse) { - match resp { - BinanceResponse::Stream(resp) => match store_data(store, resp.data).await { - Ok(_) => debug!("saved data"), - Err(e) => error!("failed to save data: {}", e), - }, - BinanceResponse::Success(_) => { - info!("subscription success"); - } - BinanceResponse::Ping => { - debug!("received ping from binance"); - } - BinanceResponse::Error(e) => { - error!("error code {} received from binance: {}", e.code, e.msg); + match store.set_asset(&id, asset_info).await { + Ok(_) => { + info!("stored data for id {}", id); + global::meter(METER_NAME) + .f64_gauge("asset-prices") + .init() + .record( + price.to_f64().unwrap(), // Prices should never be NaN so unwrap here + &[KeyValue::new("asset.symbol", id)], + ); + } + Err(e) => error!("failed to store data for id {}: {}", id, e), + } } } } -async fn handle_connection_recv( - recv_result: Result, - connector: &BinanceWebSocketConnector, - connection: &mut BinanceWebSocketConnection, +async fn process_success( store: &WorkerStore, + success_response: SuccessResponse, + subscription_map: &mut HashMap, ) { - match recv_result { - Ok(resp) => { - process_response(store, resp).await; - } - Err(MessageError::ChannelClosed) => { - handle_reconnect(connector, connection, store).await; - } - Err(MessageError::UnsupportedMessage) => { - error!("unsupported message received from binance"); + let meter = global::meter(METER_NAME); + + match subscription_map.remove(&success_response.id) { + Some(Event::Subscribe(ids)) => { + info!("subscribed to ids {:?}", ids); + meter + .u64_counter("subscribe_success") + .init() + .add(1, &[KeyValue::new("id", success_response.id)]); + if store.add_query_ids(ids).await.is_err() { + error!("failed to add query ids to store"); + }; } - Err(MessageError::Parse(..)) => { - error!("unable to parse message from binance"); + Some(Event::Unsubscribe(ids)) => { + info!("unsubscribed to ids {:?}", ids); + meter + .u64_counter("unsubscribe_success") + .init() + .add(1, &[KeyValue::new("subscription.id", success_response.id)]); + if store.remove_query_ids(ids).await.is_err() { + error!("failed to remove query ids from store"); + }; } + None => error!("received response for unknown id: {}", success_response.id), } } + +fn process_ping() { + debug!("received ping from binance"); + global::meter(METER_NAME) + .u64_counter("pings") + .init() + .add(1, &[]); +} + +fn process_error(error: ErrorResponse) { + error!( + "error code {} received from binance: {}", + error.code, error.msg + ); + global::meter(METER_NAME).u64_counter("errors").init().add( + 1, + &[ + KeyValue::new("msg.code", error.code as i64), + KeyValue::new("msg.error", error.msg), + ], + ); +} diff --git a/bothan-binance/src/worker/builder.rs b/bothan-binance/src/worker/builder.rs index b987e1db..32333a7f 100644 --- a/bothan-binance/src/worker/builder.rs +++ b/bothan-binance/src/worker/builder.rs @@ -12,7 +12,7 @@ use crate::worker::opts::BinanceWorkerBuilderOpts; use crate::worker::BinanceWorker; /// Builds a `BinanceWorker` with custom options. -/// Methods can be chained to set the configuration values and the +/// Methods can be chained to set the configuration values, and the /// service is constructed by calling the [`build`](BinanceWorkerBuilder::build) method. pub struct BinanceWorkerBuilder { store: WorkerStore, diff --git a/bothan-binance/src/worker/error.rs b/bothan-binance/src/worker/error.rs index a0fe065f..8b75135c 100644 --- a/bothan-binance/src/worker/error.rs +++ b/bothan-binance/src/worker/error.rs @@ -2,15 +2,6 @@ use crate::api; use bothan_core::store; use thiserror::Error; -#[derive(Debug, Error)] -pub(crate) enum WorkerError { - #[error("value is not a valid decimal: {0}")] - InvalidDecimal(#[from] rust_decimal::Error), - - #[error("store error: {0}")] - StoreError(#[from] store::error::Error), -} - #[derive(Debug, Error)] pub enum BuildError { #[error("failed to connect: {0}")] diff --git a/bothan-binance/src/worker/types.rs b/bothan-binance/src/worker/types.rs index 285fad74..db4b7691 100644 --- a/bothan-binance/src/worker/types.rs +++ b/bothan-binance/src/worker/types.rs @@ -3,3 +3,5 @@ use tokio::time::Duration; pub const DEFAULT_CHANNEL_SIZE: usize = 1000; pub const DEFAULT_TIMEOUT: Duration = Duration::from_secs(720); pub const RECONNECT_BUFFER: Duration = Duration::from_secs(5); + +pub(crate) const METER_NAME: &str = "binance-worker"; diff --git a/bothan-core/src/store/worker.rs b/bothan-core/src/store/worker.rs index f0b82daf..e472eef3 100644 --- a/bothan-core/src/store/worker.rs +++ b/bothan-core/src/store/worker.rs @@ -46,6 +46,7 @@ impl WorkerStore { self.store.insert_asset_infos(&self.prefix, assets).await } + // TODO: Deprecate when the new query_id system is in place pub async fn set_query_ids(&self, ids: Vec) -> Result<(Vec, Vec), Error> where K: Into + Clone, @@ -67,6 +68,30 @@ impl WorkerStore { Ok((added, removed)) } + // Computes the signals to add and remove from the query set if the given IDs is to replace + // the current query_id set + pub async fn compute_query_id_differences( + &self, + ids: Vec, + ) -> Result<(Vec, Vec), Error> + where + K: Into + Clone, + { + let current_ids = self.get_query_ids().await?; + let new_ids: QueryIDs = HashSet::from_iter(ids.into_iter().map(Into::into)); + + let to_add = new_ids + .difference(¤t_ids) + .cloned() + .collect::>(); + let to_remove = current_ids + .difference(&new_ids) + .cloned() + .collect::>(); + + Ok((to_add, to_remove)) + } + pub async fn add_query_ids(&self, ids: Vec) -> Result, Error> where K: Into + Clone, From 709a4218c369c6254ad20f3dfa6dbf63238b5d58 Mon Sep 17 00:00:00 2001 From: Warittorn Cheevachaipimol Date: Thu, 2 Jan 2025 16:30:21 +0700 Subject: [PATCH 2/3] fix --- bothan-binance/src/worker/asset_worker.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bothan-binance/src/worker/asset_worker.rs b/bothan-binance/src/worker/asset_worker.rs index 373ae348..f37e1727 100644 --- a/bothan-binance/src/worker/asset_worker.rs +++ b/bothan-binance/src/worker/asset_worker.rs @@ -187,7 +187,7 @@ async fn handle_reconnect( let packet_id = random(); if connection - .unsubscribe_mini_ticker_stream(packet_id, &ids_vec) + .subscribe_mini_ticker_stream(packet_id, &ids_vec) .await .is_ok() { From 28caeb543690538b2868d2d7033c5cab6ac69729 Mon Sep 17 00:00:00 2001 From: Warittorn Cheevachaipimol Date: Fri, 3 Jan 2025 09:57:22 +0700 Subject: [PATCH 3/3] rebuild lock --- Cargo.lock | 493 ++++++++++++++++++++++++----------------------------- 1 file changed, 225 insertions(+), 268 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b08ea03b..a47d0e00 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -121,9 +121,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.93" +version = "1.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c95c10ba0b00a02636238b814946408b1322d5ac4760326e6fb8ec956d85775" +checksum = "34ac096ce696dc2fcabef30516bb13c0a68a11d30131d3df6f04711467681b04" [[package]] name = "arraydeque" @@ -166,7 +166,7 @@ checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.94", ] [[package]] @@ -177,7 +177,7 @@ checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.94", ] [[package]] @@ -297,7 +297,7 @@ version = "0.69.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "271383c67ccabffb7381723dea0672a673f292304fcb45c01cc648c7a8d58088" dependencies = [ - "bitflags", + "bitflags 2.6.0", "cexpr", "clang-sys", "itertools 0.12.1", @@ -308,9 +308,15 @@ dependencies = [ "regex", "rustc-hash", "shlex", - "syn 2.0.85", + "syn 2.0.94", ] +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + [[package]] name = "bitflags" version = "2.6.0" @@ -361,16 +367,14 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.94", "syn_derive", ] [[package]] name = "bothan-api" -version = "0.0.1-alpha.4" +version = "0.0.1-beta.1" dependencies = [ - "anyhow", - "async-trait", "bothan-binance", "bothan-bybit", "bothan-coinbase", @@ -381,33 +385,21 @@ dependencies = [ "bothan-htx", "bothan-kraken", "bothan-okx", - "chrono", "config", "dirs", - "glob", - "humantime-serde", - "itertools 0.13.0", "prost", - "protoc-gen-prost", - "protoc-gen-tonic", - "reqwest", "rust_decimal", "semver", "serde", - "serde_json", - "thiserror", - "tokio", "tonic", - "tonic-build", "tracing", ] [[package]] name = "bothan-api-cli" -version = "0.0.1-alpha.4" +version = "0.0.1-beta.1" dependencies = [ "anyhow", - "async-trait", "bothan-api", "bothan-binance", "bothan-bybit", @@ -422,7 +414,7 @@ dependencies = [ "bothan-okx", "clap", "dirs", - "log", + "inquire", "reqwest", "semver", "serde_json", @@ -435,11 +427,10 @@ dependencies = [ [[package]] name = "bothan-binance" -version = "0.0.1-alpha.4" +version = "0.0.1-beta.1" dependencies = [ "async-trait", "bothan-core", - "futures-channel", "futures-util", "humantime-serde", "opentelemetry", @@ -447,7 +438,7 @@ dependencies = [ "rust_decimal", "serde", "serde_json", - "thiserror", + "thiserror 2.0.9", "tokio", "tokio-tungstenite", "tracing", @@ -457,7 +448,7 @@ dependencies = [ [[package]] name = "bothan-bybit" -version = "0.0.1-alpha.4" +version = "0.0.1-beta.1" dependencies = [ "async-trait", "bothan-core", @@ -466,7 +457,7 @@ dependencies = [ "rust_decimal", "serde", "serde_json", - "thiserror", + "thiserror 2.0.9", "tokio", "tokio-tungstenite", "tracing", @@ -476,12 +467,10 @@ dependencies = [ [[package]] name = "bothan-client" -version = "0.0.1-alpha.4" +version = "0.0.1-beta.1" dependencies = [ "pbjson", "prost", - "protoc-gen-prost", - "protoc-gen-tonic", "reqwest", "serde", "serde_json", @@ -492,17 +481,16 @@ dependencies = [ [[package]] name = "bothan-coinbase" -version = "0.0.1-alpha.4" +version = "0.0.1-beta.1" dependencies = [ "async-trait", "bothan-core", "chrono", "futures-util", - "rand", "rust_decimal", "serde", "serde_json", - "thiserror", + "thiserror 2.0.9", "tokio", "tokio-tungstenite", "tracing", @@ -512,19 +500,18 @@ dependencies = [ [[package]] name = "bothan-coingecko" -version = "0.0.1-alpha.4" +version = "0.0.1-beta.1" dependencies = [ "async-trait", "bothan-core", "chrono", - "futures", "humantime-serde", "mockito", "reqwest", "rust_decimal", "serde", "serde_json", - "thiserror", + "thiserror 2.0.9", "tokio", "tracing", "tracing-subscriber", @@ -533,12 +520,11 @@ dependencies = [ [[package]] name = "bothan-coinmarketcap" -version = "0.0.1-alpha.4" +version = "0.0.1-beta.1" dependencies = [ "async-trait", "bothan-core", "chrono", - "futures", "humantime-serde", "itertools 0.13.0", "mockito", @@ -546,7 +532,7 @@ dependencies = [ "rust_decimal", "serde", "serde_json", - "thiserror", + "thiserror 2.0.9", "tokio", "tracing", "tracing-subscriber", @@ -555,24 +541,17 @@ dependencies = [ [[package]] name = "bothan-core" -version = "0.0.1-alpha.4" +version = "0.0.1-beta.1" dependencies = [ - "anyhow", "async-trait", "bincode", "chrono", - "clap", "derive_more", "ed25519", "ed25519-dalek", - "futures", "hex", - "itertools 0.13.0", - "log", "mini-moka", "num-traits", - "petgraph", - "prost", "rand", "reqwest", "rust-rocksdb", @@ -580,30 +559,22 @@ dependencies = [ "semver", "serde", "serde_json", - "thiserror", + "thiserror 2.0.9", "tokio", - "tokio-util", - "tonic", "tracing", - "uuid", ] [[package]] name = "bothan-cryptocompare" -version = "0.0.1-alpha.4" +version = "0.0.1-beta.1" dependencies = [ "async-trait", "bothan-core", - "chrono", - "futures", "futures-util", - "humantime-serde", - "mockito", - "reqwest", "rust_decimal", "serde", "serde_json", - "thiserror", + "thiserror 2.0.9", "tokio", "tokio-tungstenite", "tracing", @@ -613,17 +584,16 @@ dependencies = [ [[package]] name = "bothan-htx" -version = "0.0.1-alpha.4" +version = "0.0.1-beta.1" dependencies = [ "async-trait", "bothan-core", - "chrono", "flate2", "futures-util", "rust_decimal", "serde", "serde_json", - "thiserror", + "thiserror 2.0.9", "tokio", "tokio-tungstenite", "tracing", @@ -633,16 +603,17 @@ dependencies = [ [[package]] name = "bothan-kraken" -version = "0.0.1-alpha.4" +version = "0.0.1-beta.1" dependencies = [ "async-trait", "bothan-core", "chrono", "futures-util", + "humantime-serde", "rust_decimal", "serde", "serde_json", - "thiserror", + "thiserror 2.0.9", "tokio", "tokio-tungstenite", "tracing", @@ -652,17 +623,16 @@ dependencies = [ [[package]] name = "bothan-okx" -version = "0.0.1-alpha.4" +version = "0.0.1-beta.1" dependencies = [ "async-trait", "bothan-core", "chrono", "futures-util", - "rand", "rust_decimal", "serde", "serde_json", - "thiserror", + "thiserror 2.0.9", "tokio", "tokio-tungstenite", "tracing", @@ -792,9 +762,9 @@ checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" [[package]] name = "chrono" -version = "0.4.38" +version = "0.4.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" +checksum = "7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825" dependencies = [ "android-tzdata", "iana-time-zone", @@ -818,9 +788,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.20" +version = "4.5.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b97f376d85a664d5837dbae44bf546e6477a679ff6610010f17276f686d867e8" +checksum = "3135e7ec2ef7b10c6ed8950f0f792ed96ee093fa088608f1c76e569722700c84" dependencies = [ "clap_builder", "clap_derive", @@ -828,9 +798,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.20" +version = "4.5.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19bc80abd44e4bed93ca373a0704ccbd1b710dc5749406201bb018272808dc54" +checksum = "30582fc632330df2bd26877bde0c1f4470d57c582bbc070376afcd04d8cb4838" dependencies = [ "anstream", "anstyle", @@ -847,14 +817,14 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.94", ] [[package]] name = "clap_lex" -version = "0.7.2" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97" +checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" [[package]] name = "colorchoice" @@ -975,6 +945,31 @@ version = "0.8.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" +[[package]] +name = "crossterm" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e64e6c0fbe2c17357405f7c758c1ef960fce08bdfb2c03d88d2a18d7e09c4b67" +dependencies = [ + "bitflags 1.3.2", + "crossterm_winapi", + "libc", + "mio 0.8.11", + "parking_lot", + "signal-hook", + "signal-hook-mio", + "winapi", +] + +[[package]] +name = "crossterm_winapi" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acdd7c62a3665c7f6830a51635d9ac9b23ed385797f70a83bb8bafe9c572ab2b" +dependencies = [ + "winapi", +] + [[package]] name = "crunchy" version = "0.2.2" @@ -1015,7 +1010,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.94", ] [[package]] @@ -1039,7 +1034,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.85", + "syn 2.0.94", ] [[package]] @@ -1050,7 +1045,7 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core", "quote", - "syn 2.0.85", + "syn 2.0.94", ] [[package]] @@ -1110,7 +1105,7 @@ dependencies = [ "convert_case", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.94", "unicode-xid", ] @@ -1154,6 +1149,12 @@ dependencies = [ "const-random", ] +[[package]] +name = "dyn-clone" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d6ef0072f8a535281e4876be788938b528e9a1d43900b82c2569af7da799125" + [[package]] name = "ed25519" version = "2.2.3" @@ -1231,17 +1232,11 @@ version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" -[[package]] -name = "fixedbitset" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" - [[package]] name = "flate2" -version = "1.0.34" +version = "1.0.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1b589b4dc103969ad3cf85c950899926ec64300a1a46d76c03a6072957036f0" +checksum = "c936bfdafb507ebbf50b8074c54fa31c5be9a1e7e5f467dd659697041407d07c" dependencies = [ "crc32fast", "miniz_oxide", @@ -1283,21 +1278,6 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" -[[package]] -name = "futures" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" -dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] - [[package]] name = "futures-channel" version = "0.3.31" @@ -1305,7 +1285,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" dependencies = [ "futures-core", - "futures-sink", ] [[package]] @@ -1314,23 +1293,6 @@ version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" -[[package]] -name = "futures-executor" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-io" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" - [[package]] name = "futures-macro" version = "0.3.31" @@ -1339,7 +1301,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.94", ] [[package]] @@ -1360,18 +1322,33 @@ version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" dependencies = [ - "futures-channel", "futures-core", - "futures-io", "futures-macro", "futures-sink", "futures-task", - "memchr", "pin-project-lite", "pin-utils", "slab", ] +[[package]] +name = "fuzzy-matcher" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54614a3312934d066701a80f20f15fa3b56d67ac7722b39eea5b4c9dd1d66c94" +dependencies = [ + "thread_local", +] + +[[package]] +name = "fxhash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" +dependencies = [ + "byteorder", +] + [[package]] name = "generic-array" version = "0.14.7" @@ -1685,6 +1662,23 @@ dependencies = [ "serde", ] +[[package]] +name = "inquire" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fddf93031af70e75410a2511ec04d49e758ed2f26dad3404a934e0fb45cc12a" +dependencies = [ + "bitflags 2.6.0", + "crossterm", + "dyn-clone", + "fuzzy-matcher", + "fxhash", + "newline-converter", + "once_cell", + "unicode-segmentation", + "unicode-width", +] + [[package]] name = "ipnet" version = "2.10.1" @@ -1784,7 +1778,7 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" dependencies = [ - "bitflags", + "bitflags 2.6.0", "libc", ] @@ -1888,6 +1882,18 @@ dependencies = [ "adler2", ] +[[package]] +name = "mio" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" +dependencies = [ + "libc", + "log", + "wasi", + "windows-sys 0.48.0", +] + [[package]] name = "mio" version = "1.0.2" @@ -1924,12 +1930,6 @@ dependencies = [ "tokio", ] -[[package]] -name = "multimap" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "defc4c55412d89136f966bbb339008b474350e5e6e78d2714439c386b3137a03" - [[package]] name = "native-tls" version = "0.2.12" @@ -1947,6 +1947,15 @@ dependencies = [ "tempfile", ] +[[package]] +name = "newline-converter" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47b6b097ecb1cbfed438542d16e84fd7ad9b0c76c8a65b7f9039212a3d14dc7f" +dependencies = [ + "unicode-segmentation", +] + [[package]] name = "nom" version = "7.1.3" @@ -2003,7 +2012,7 @@ version = "0.10.68" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6174bc48f102d208783c2c84bf931bb75927a617866870de8a4ea85597f871f5" dependencies = [ - "bitflags", + "bitflags 2.6.0", "cfg-if", "foreign-types", "libc", @@ -2020,7 +2029,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.94", ] [[package]] @@ -2052,7 +2061,7 @@ dependencies = [ "js-sys", "once_cell", "pin-project-lite", - "thiserror", + "thiserror 1.0.65", ] [[package]] @@ -2129,7 +2138,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "879952a81a83930934cbf1786752d6dedc3b1f29e8f8fb2ad1d0a36f377cf442" dependencies = [ "memchr", - "thiserror", + "thiserror 1.0.65", "ucd-trie", ] @@ -2153,7 +2162,7 @@ dependencies = [ "pest_meta", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.94", ] [[package]] @@ -2167,16 +2176,6 @@ dependencies = [ "sha2", ] -[[package]] -name = "petgraph" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" -dependencies = [ - "fixedbitset", - "indexmap 2.6.0", -] - [[package]] name = "pin-project" version = "1.1.7" @@ -2194,7 +2193,7 @@ checksum = "3c0f5fad0874fc7abcd4d750e76917eaebbecaa2c20bde22e1dbeeba8beb758c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.94", ] [[package]] @@ -2240,16 +2239,6 @@ dependencies = [ "zerocopy", ] -[[package]] -name = "prettyplease" -version = "0.2.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64d1ec885c64d0457d564db4ec299b2dae3f9c02808b8ad9c3a089c591b18033" -dependencies = [ - "proc-macro2", - "syn 2.0.85", -] - [[package]] name = "proc-macro-crate" version = "3.2.0" @@ -2284,9 +2273,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.89" +version = "1.0.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f139b0662de085916d1fb67d2b4169d1addddda1919e696f3252b740b629986e" +checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" dependencies = [ "unicode-ident", ] @@ -2301,27 +2290,6 @@ dependencies = [ "prost-derive", ] -[[package]] -name = "prost-build" -version = "0.13.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c1318b19085f08681016926435853bbf7858f9c082d0999b80550ff5d9abe15" -dependencies = [ - "bytes", - "heck", - "itertools 0.13.0", - "log", - "multimap", - "once_cell", - "petgraph", - "prettyplease", - "prost", - "prost-types", - "regex", - "syn 2.0.85", - "tempfile", -] - [[package]] name = "prost-derive" version = "0.13.3" @@ -2332,48 +2300,7 @@ dependencies = [ "itertools 0.13.0", "proc-macro2", "quote", - "syn 2.0.85", -] - -[[package]] -name = "prost-types" -version = "0.13.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4759aa0d3a6232fb8dbdb97b61de2c20047c68aca932c7ed76da9d788508d670" -dependencies = [ - "prost", -] - -[[package]] -name = "protoc-gen-prost" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77eb17a7657a703f30cb9b7ba4d981e4037b8af2d819ab0077514b0bef537406" -dependencies = [ - "once_cell", - "prost", - "prost-build", - "prost-types", - "regex", -] - -[[package]] -name = "protoc-gen-tonic" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ab6a0d73a0914752ed8fd7cc51afe169e28da87be3efef292de5676cc527634" -dependencies = [ - "heck", - "prettyplease", - "proc-macro2", - "prost", - "prost-build", - "prost-types", - "protoc-gen-prost", - "quote", - "regex", - "syn 2.0.85", - "tonic-build", + "syn 2.0.94", ] [[package]] @@ -2402,7 +2329,7 @@ version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57206b407293d2bcd3af849ce869d52068623f19e1b5ff8e8778e3309439682b" dependencies = [ - "bitflags", + "bitflags 2.6.0", "memchr", "unicase", ] @@ -2458,7 +2385,7 @@ version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f" dependencies = [ - "bitflags", + "bitflags 2.6.0", ] [[package]] @@ -2469,7 +2396,7 @@ checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" dependencies = [ "getrandom", "libredox", - "thiserror", + "thiserror 1.0.65", ] [[package]] @@ -2619,7 +2546,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b91f7eff05f748767f183df4320a63d6936e9c6107d97c9e6bdd9784f4289c94" dependencies = [ "base64 0.21.7", - "bitflags", + "bitflags 2.6.0", "serde", "serde_derive", ] @@ -2636,9 +2563,9 @@ dependencies = [ [[package]] name = "rust-librocksdb-sys" -version = "0.28.0+9.7.3" +version = "0.30.0+9.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b91b2caa438327a23244d87d00ea8dacb160720f76c055e32c0a4d6d973394bf" +checksum = "a81bce962dd4113eae8a848ecb3598f25122cc6be675f815b71a4a2d0a523b85" dependencies = [ "bindgen", "bzip2-sys", @@ -2652,9 +2579,9 @@ dependencies = [ [[package]] name = "rust-rocksdb" -version = "0.32.0" +version = "0.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50c3129142ab81a9f878ca06b29481a4eec255c8e72617e0816228c1ea806658" +checksum = "16af4eac13d9b0025c84b4912cda7b5fa59f16c513a1b6ba65ae16cfb9ab10e3" dependencies = [ "libc", "rust-librocksdb-sys", @@ -2703,7 +2630,7 @@ version = "0.38.37" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8acb788b847c24f28525660c4d7758620a7210875711f79e7f663cc152726811" dependencies = [ - "bitflags", + "bitflags 2.6.0", "errno", "libc", "linux-raw-sys", @@ -2797,7 +2724,7 @@ version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ - "bitflags", + "bitflags 2.6.0", "core-foundation", "core-foundation-sys", "libc", @@ -2840,14 +2767,14 @@ checksum = "7e85ad2009c50b58e87caa8cd6dac16bdf511bbfb7af6c33df902396aa480fa5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.94", ] [[package]] name = "serde_json" -version = "1.0.132" +version = "1.0.134" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d726bfaff4b320266d395898905d0eba0345aae23b54aee3a737e260fd46db03" +checksum = "d00f4175c42ee48b15416f6193a959ba3a0d67fc699a0db9ad12df9f83991c7d" dependencies = [ "itoa", "memchr", @@ -2903,7 +2830,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.94", ] [[package]] @@ -2943,6 +2870,27 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" +[[package]] +name = "signal-hook" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8621587d4798caf8eb44879d42e56b9a93ea5dcd315a6487c357130095b62801" +dependencies = [ + "libc", + "signal-hook-registry", +] + +[[package]] +name = "signal-hook-mio" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34db1a06d485c9142248b7a054f034b349b212551f3dfd19c94d45a754a217cd" +dependencies = [ + "libc", + "mio 0.8.11", + "signal-hook", +] + [[package]] name = "signal-hook-registry" version = "1.4.2" @@ -3054,9 +3002,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.85" +version = "2.0.94" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5023162dfcd14ef8f32034d8bcd4cc5ddc61ef7a247c024a33e24e1f24d21b56" +checksum = "987bc0be1cdea8b10216bd06e2ca407d40b9543468fafd3ddfb02f36e77f71f3" dependencies = [ "proc-macro2", "quote", @@ -3072,7 +3020,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.94", ] [[package]] @@ -3096,7 +3044,7 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" dependencies = [ - "bitflags", + "bitflags 2.6.0", "core-foundation", "system-configuration-sys", ] @@ -3142,7 +3090,16 @@ version = "1.0.65" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5d11abd9594d9b38965ef50805c5e469ca9cc6f197f883f717e0269a3057b3d5" dependencies = [ - "thiserror-impl", + "thiserror-impl 1.0.65", +] + +[[package]] +name = "thiserror" +version = "2.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f072643fd0190df67a8bab670c20ef5d8737177d6ac6b2e9a236cb096206b2cc" +dependencies = [ + "thiserror-impl 2.0.9", ] [[package]] @@ -3153,7 +3110,18 @@ checksum = "ae71770322cbd277e69d762a16c444af02aa0575ac0d174f0b9562d3b37f8602" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.94", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b50fa271071aae2e6ee85f842e2e28ba8cd2c5fb67f11fcb1fd70b276f9e7d4" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.94", ] [[package]] @@ -3230,7 +3198,7 @@ dependencies = [ "backtrace", "bytes", "libc", - "mio", + "mio 1.0.2", "parking_lot", "pin-project-lite", "signal-hook-registry", @@ -3247,7 +3215,7 @@ checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.94", ] [[package]] @@ -3373,20 +3341,6 @@ dependencies = [ "tracing", ] -[[package]] -name = "tonic-build" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9557ce109ea773b399c9b9e5dca39294110b74f1f342cb347a80d1fce8c26a11" -dependencies = [ - "prettyplease", - "proc-macro2", - "prost-build", - "prost-types", - "quote", - "syn 2.0.85", -] - [[package]] name = "tower" version = "0.4.13" @@ -3452,7 +3406,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.94", ] [[package]] @@ -3521,7 +3475,7 @@ dependencies = [ "native-tls", "rand", "sha1", - "thiserror", + "thiserror 1.0.65", "utf-8", ] @@ -3570,6 +3524,12 @@ version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" +[[package]] +name = "unicode-width" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" + [[package]] name = "unicode-xid" version = "0.2.6" @@ -3610,9 +3570,6 @@ name = "uuid" version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8c5f0a0af699448548ad1a2fbf920fb4bee257eae39953ba95cb84891a0446a" -dependencies = [ - "getrandom", -] [[package]] name = "valuable" @@ -3685,7 +3642,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.94", "wasm-bindgen-shared", ] @@ -3719,7 +3676,7 @@ checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.94", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -4018,7 +3975,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.94", ] [[package]]