From ba0cfd6553b67b71261cbc62733060fd8514e1a8 Mon Sep 17 00:00:00 2001 From: Yordis Prieto Date: Thu, 26 Mar 2026 17:40:41 -0400 Subject: [PATCH] refactor: centralize constants into per-crate constants.rs files Signed-off-by: Yordis Prieto --- rsworkspace/Cargo.lock | 2 ++ .../crates/acp-nats-agent/src/connection.rs | 2 +- .../crates/acp-nats-agent/src/constants.rs | 3 ++ rsworkspace/crates/acp-nats-agent/src/lib.rs | 1 + rsworkspace/crates/acp-nats-ws/src/config.rs | 6 ++-- .../crates/acp-nats-ws/src/connection.rs | 2 +- .../crates/acp-nats-ws/src/constants.rs | 6 ++++ rsworkspace/crates/acp-nats-ws/src/main.rs | 3 +- rsworkspace/crates/acp-nats/src/acp_prefix.rs | 3 +- .../crates/acp-nats/src/agent/bridge.rs | 9 +----- .../crates/acp-nats/src/client/rpc_reply.rs | 4 +-- rsworkspace/crates/acp-nats/src/config.rs | 19 ++++-------- rsworkspace/crates/acp-nats/src/constants.rs | 30 +++++++++++++++++++ rsworkspace/crates/acp-nats/src/error.rs | 4 +-- .../crates/acp-nats/src/ext_method_name.rs | 3 +- rsworkspace/crates/acp-nats/src/lib.rs | 1 + .../crates/acp-nats/src/nats/parsing.rs | 10 +------ .../acp-nats/src/pending_prompt_waiters.rs | 3 +- rsworkspace/crates/acp-nats/src/session_id.rs | 3 +- .../crates/acp-telemetry/src/constants.rs | 3 ++ rsworkspace/crates/acp-telemetry/src/lib.rs | 1 + .../crates/acp-telemetry/src/metric.rs | 5 +--- rsworkspace/crates/trogon-nats/src/auth.rs | 12 +++----- rsworkspace/crates/trogon-nats/src/connect.rs | 3 +- .../crates/trogon-nats/src/constants.rs | 14 +++++++++ rsworkspace/crates/trogon-nats/src/lib.rs | 6 ++-- .../crates/trogon-nats/src/messaging.rs | 4 +-- 27 files changed, 93 insertions(+), 69 deletions(-) create mode 100644 rsworkspace/crates/acp-nats-agent/src/constants.rs create mode 100644 rsworkspace/crates/acp-nats-ws/src/constants.rs create mode 100644 rsworkspace/crates/acp-nats/src/constants.rs create mode 100644 rsworkspace/crates/acp-telemetry/src/constants.rs create mode 100644 rsworkspace/crates/trogon-nats/src/constants.rs diff --git a/rsworkspace/Cargo.lock b/rsworkspace/Cargo.lock index 3485dab79..76d8940e3 100644 --- a/rsworkspace/Cargo.lock +++ b/rsworkspace/Cargo.lock @@ -37,6 +37,7 @@ dependencies = [ "serde_json", "tokio", "tracing", + "tracing-subscriber", "trogon-nats", "trogon-std", ] @@ -2564,6 +2565,7 @@ dependencies = [ "tracing", "tracing-opentelemetry", "trogon-std", + "uuid", ] [[package]] diff --git a/rsworkspace/crates/acp-nats-agent/src/connection.rs b/rsworkspace/crates/acp-nats-agent/src/connection.rs index 5fb4c906a..89511dff5 100644 --- a/rsworkspace/crates/acp-nats-agent/src/connection.rs +++ b/rsworkspace/crates/acp-nats-agent/src/connection.rs @@ -61,7 +61,7 @@ impl std::fmt::Display for DispatchError { } } -const DEFAULT_OPERATION_TIMEOUT: Duration = Duration::from_secs(30); +use crate::constants::DEFAULT_OPERATION_TIMEOUT; pub struct AgentSideNatsConnection { nats: N, diff --git a/rsworkspace/crates/acp-nats-agent/src/constants.rs b/rsworkspace/crates/acp-nats-agent/src/constants.rs new file mode 100644 index 000000000..9b910b548 --- /dev/null +++ b/rsworkspace/crates/acp-nats-agent/src/constants.rs @@ -0,0 +1,3 @@ +use std::time::Duration; + +pub const DEFAULT_OPERATION_TIMEOUT: Duration = Duration::from_secs(30); diff --git a/rsworkspace/crates/acp-nats-agent/src/lib.rs b/rsworkspace/crates/acp-nats-agent/src/lib.rs index 57282f296..532cb1779 100644 --- a/rsworkspace/crates/acp-nats-agent/src/lib.rs +++ b/rsworkspace/crates/acp-nats-agent/src/lib.rs @@ -1,3 +1,4 @@ mod connection; +pub mod constants; pub use connection::{AgentSideNatsConnection, ConnectionError}; diff --git a/rsworkspace/crates/acp-nats-ws/src/config.rs b/rsworkspace/crates/acp-nats-ws/src/config.rs index 2cc68165c..77e222e5a 100644 --- a/rsworkspace/crates/acp-nats-ws/src/config.rs +++ b/rsworkspace/crates/acp-nats-ws/src/config.rs @@ -1,10 +1,9 @@ use acp_nats::{AcpPrefix, AcpPrefixError, Config, NatsConfig}; use clap::Parser; -use std::net::{IpAddr, Ipv4Addr}; +use std::net::IpAddr; use trogon_std::env::ReadEnv; -const DEFAULT_HOST: IpAddr = IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)); -const DEFAULT_PORT: u16 = 8080; +use crate::constants::{DEFAULT_HOST, DEFAULT_PORT}; #[derive(Parser, Debug)] #[command(name = "acp-nats-ws")] @@ -50,6 +49,7 @@ pub fn apply_timeout_overrides(mut ws: WsConfig, env_provider: &E) - #[cfg(test)] mod tests { use super::*; + use std::net::Ipv4Addr; use trogon_std::env::InMemoryEnv; fn config_from_env(env: &InMemoryEnv) -> WsConfig { diff --git a/rsworkspace/crates/acp-nats-ws/src/connection.rs b/rsworkspace/crates/acp-nats-ws/src/connection.rs index 146b15cc2..eaa0cf4ee 100644 --- a/rsworkspace/crates/acp-nats-ws/src/connection.rs +++ b/rsworkspace/crates/acp-nats-ws/src/connection.rs @@ -9,7 +9,7 @@ use tokio::sync::watch; use tracing::{error, info, warn}; use trogon_std::time::SystemClock; -const DUPLEX_BUFFER_SIZE: usize = 64 * 1024; +use crate::constants::DUPLEX_BUFFER_SIZE; /// Handles a single WebSocket connection by bridging it to NATS via ACP. pub async fn handle( diff --git a/rsworkspace/crates/acp-nats-ws/src/constants.rs b/rsworkspace/crates/acp-nats-ws/src/constants.rs new file mode 100644 index 000000000..f78fd678c --- /dev/null +++ b/rsworkspace/crates/acp-nats-ws/src/constants.rs @@ -0,0 +1,6 @@ +use std::net::{IpAddr, Ipv4Addr}; + +pub const DEFAULT_HOST: IpAddr = IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)); +pub const DEFAULT_PORT: u16 = 8080; +pub const DUPLEX_BUFFER_SIZE: usize = 64 * 1024; +pub const THREAD_NAME: &str = "acp-ws-local"; diff --git a/rsworkspace/crates/acp-nats-ws/src/main.rs b/rsworkspace/crates/acp-nats-ws/src/main.rs index 378d6d2f7..89ebc20e9 100644 --- a/rsworkspace/crates/acp-nats-ws/src/main.rs +++ b/rsworkspace/crates/acp-nats-ws/src/main.rs @@ -1,5 +1,6 @@ mod config; mod connection; +mod constants; mod upgrade; use tokio::sync::{mpsc, watch}; @@ -82,7 +83,7 @@ async fn main() -> Result<(), Box> { #[cfg(coverage)] fn main() {} -const THREAD_NAME: &str = "acp-ws-local"; +use constants::THREAD_NAME; /// Runs a single-threaded tokio runtime with a /// `LocalSet`. All WebSocket connections are processed here because the ACP diff --git a/rsworkspace/crates/acp-nats/src/acp_prefix.rs b/rsworkspace/crates/acp-nats/src/acp_prefix.rs index 0b52aad07..3d0eb0859 100644 --- a/rsworkspace/crates/acp-nats/src/acp_prefix.rs +++ b/rsworkspace/crates/acp-nats/src/acp_prefix.rs @@ -9,11 +9,10 @@ use std::sync::Arc; +use crate::constants::MAX_PREFIX_LENGTH; use crate::nats::token; use crate::subject_token_violation::SubjectTokenViolation; -const MAX_PREFIX_LENGTH: usize = 128; - /// Error returned when [`AcpPrefix`] validation fails. #[derive(Debug, Clone, PartialEq)] pub struct AcpPrefixError(pub SubjectTokenViolation); diff --git a/rsworkspace/crates/acp-nats/src/agent/bridge.rs b/rsworkspace/crates/acp-nats/src/agent/bridge.rs index 83594cdbf..9af819de9 100644 --- a/rsworkspace/crates/acp-nats/src/agent/bridge.rs +++ b/rsworkspace/crates/acp-nats/src/agent/bridge.rs @@ -1,5 +1,4 @@ use std::cell::RefCell; -use std::time::Duration; use crate::config::Config; use crate::nats::{ @@ -30,13 +29,7 @@ use super::{ set_session_mode, set_session_model, }; -/// Delay before publishing `session.ready` to NATS. -/// -/// The `Agent` trait returns the response value *before* the transport layer -/// serializes and writes it to the client. Without a delay the spawned task -/// could publish `session.ready` before the client has received the -/// `session/new` response, violating the ordering guarantee. -const SESSION_READY_DELAY: Duration = Duration::from_millis(100); +use crate::constants::SESSION_READY_DELAY; pub struct Bridge { pub(crate) nats: N, diff --git a/rsworkspace/crates/acp-nats/src/client/rpc_reply.rs b/rsworkspace/crates/acp-nats/src/client/rpc_reply.rs index caf28a5ea..e6b2e2f92 100644 --- a/rsworkspace/crates/acp-nats/src/client/rpc_reply.rs +++ b/rsworkspace/crates/acp-nats/src/client/rpc_reply.rs @@ -1,12 +1,10 @@ +pub use crate::constants::{CONTENT_TYPE_JSON, CONTENT_TYPE_PLAIN}; use crate::nats::{FlushClient, PublishClient, headers_with_trace_context}; use agent_client_protocol::{Error, ErrorCode, RequestId, Response}; use bytes::Bytes; use tracing::warn; use trogon_std::JsonSerialize; -pub const CONTENT_TYPE_JSON: &str = "application/json"; -pub const CONTENT_TYPE_PLAIN: &str = "text/plain"; - pub fn error_response_fallback_bytes(serializer: &S) -> (Bytes, &'static str) { match serializer.to_vec(&Response::<()>::Error { id: RequestId::Null, diff --git a/rsworkspace/crates/acp-nats/src/config.rs b/rsworkspace/crates/acp-nats/src/config.rs index 9b967dad7..4a74f9ad9 100644 --- a/rsworkspace/crates/acp-nats/src/config.rs +++ b/rsworkspace/crates/acp-nats/src/config.rs @@ -4,20 +4,13 @@ use trogon_nats::NatsConfig; use trogon_std::env::ReadEnv; use crate::acp_prefix::AcpPrefix; +use crate::constants::{ + DEFAULT_CONNECT_TIMEOUT_SECS, DEFAULT_MAX_CONCURRENT_CLIENT_TASKS, DEFAULT_OPERATION_TIMEOUT, + DEFAULT_PROMPT_TIMEOUT, ENV_CONNECT_TIMEOUT_SECS, ENV_OPERATION_TIMEOUT_SECS, + ENV_PROMPT_TIMEOUT_SECS, MIN_TIMEOUT_SECS, +}; -const DEFAULT_OPERATION_TIMEOUT: Duration = Duration::from_secs(30); -const DEFAULT_PROMPT_TIMEOUT: Duration = Duration::from_secs(7200); -const DEFAULT_MAX_CONCURRENT_CLIENT_TASKS: usize = 256; - -const MIN_TIMEOUT_SECS: u64 = 1; -const DEFAULT_CONNECT_TIMEOUT_SECS: u64 = 10; - -pub const ENV_ACP_PREFIX: &str = "ACP_PREFIX"; -pub const DEFAULT_ACP_PREFIX: &str = "acp"; - -const ENV_OPERATION_TIMEOUT_SECS: &str = "ACP_OPERATION_TIMEOUT_SECS"; -const ENV_PROMPT_TIMEOUT_SECS: &str = "ACP_PROMPT_TIMEOUT_SECS"; -const ENV_CONNECT_TIMEOUT_SECS: &str = "ACP_NATS_CONNECT_TIMEOUT_SECS"; +pub use crate::constants::{DEFAULT_ACP_PREFIX, ENV_ACP_PREFIX}; #[derive(Clone)] pub struct Config { diff --git a/rsworkspace/crates/acp-nats/src/constants.rs b/rsworkspace/crates/acp-nats/src/constants.rs new file mode 100644 index 000000000..714b894d1 --- /dev/null +++ b/rsworkspace/crates/acp-nats/src/constants.rs @@ -0,0 +1,30 @@ +use std::time::Duration; + +pub const ENV_ACP_PREFIX: &str = "ACP_PREFIX"; +pub const DEFAULT_ACP_PREFIX: &str = "acp"; + +pub const ENV_OPERATION_TIMEOUT_SECS: &str = "ACP_OPERATION_TIMEOUT_SECS"; +pub const ENV_PROMPT_TIMEOUT_SECS: &str = "ACP_PROMPT_TIMEOUT_SECS"; +pub const ENV_CONNECT_TIMEOUT_SECS: &str = "ACP_NATS_CONNECT_TIMEOUT_SECS"; + +pub const DEFAULT_OPERATION_TIMEOUT: Duration = Duration::from_secs(30); +pub const DEFAULT_PROMPT_TIMEOUT: Duration = Duration::from_secs(7200); +pub const DEFAULT_MAX_CONCURRENT_CLIENT_TASKS: usize = 256; +pub const DEFAULT_CONNECT_TIMEOUT_SECS: u64 = 10; +pub const MIN_TIMEOUT_SECS: u64 = 1; + +pub const SESSION_READY_DELAY: Duration = Duration::from_millis(100); +pub const PROMPT_TIMEOUT_WARNING_SUPPRESSION_WINDOW: Duration = Duration::from_secs(5); + +pub const MAX_PREFIX_LENGTH: usize = 128; +pub const MAX_SESSION_ID_LENGTH: usize = 128; +pub const MAX_METHOD_NAME_LENGTH: usize = 128; + +pub const AGENT_UNAVAILABLE: i32 = -32001; + +pub const AGENT_MARKER: &str = ".agent."; +pub const AGENT_EXT_PREFIX: &str = "agent.ext."; +pub const EXT_SUBJECT_PREFIX: &str = "client.ext."; + +pub const CONTENT_TYPE_JSON: &str = "application/json"; +pub const CONTENT_TYPE_PLAIN: &str = "text/plain"; diff --git a/rsworkspace/crates/acp-nats/src/error.rs b/rsworkspace/crates/acp-nats/src/error.rs index 03d7468d7..43e0627ec 100644 --- a/rsworkspace/crates/acp-nats/src/error.rs +++ b/rsworkspace/crates/acp-nats/src/error.rs @@ -2,9 +2,7 @@ use agent_client_protocol::{Error, ErrorCode}; use tracing::warn; use trogon_nats::NatsError; -/// JSON-RPC reserved range -32001: agent unavailable / overloaded (retryable). -/// Returned for timeout and request failures; clients should retry with backoff. -pub const AGENT_UNAVAILABLE: i32 = -32001; +pub use crate::constants::AGENT_UNAVAILABLE; pub fn map_nats_error(e: NatsError) -> Error { match &e { diff --git a/rsworkspace/crates/acp-nats/src/ext_method_name.rs b/rsworkspace/crates/acp-nats/src/ext_method_name.rs index 0d9b09cae..e6326cc68 100644 --- a/rsworkspace/crates/acp-nats/src/ext_method_name.rs +++ b/rsworkspace/crates/acp-nats/src/ext_method_name.rs @@ -7,11 +7,10 @@ use std::sync::Arc; +use crate::constants::MAX_METHOD_NAME_LENGTH; use crate::nats::token; use crate::subject_token_violation::SubjectTokenViolation; -const MAX_METHOD_NAME_LENGTH: usize = 128; - /// Error returned when [`ExtMethodName`] validation fails. #[derive(Debug, Clone, PartialEq)] pub struct ExtMethodNameError(pub SubjectTokenViolation); diff --git a/rsworkspace/crates/acp-nats/src/lib.rs b/rsworkspace/crates/acp-nats/src/lib.rs index d8f8f8924..98a650d15 100644 --- a/rsworkspace/crates/acp-nats/src/lib.rs +++ b/rsworkspace/crates/acp-nats/src/lib.rs @@ -3,6 +3,7 @@ pub mod agent; pub mod client; pub mod client_proxy; pub mod config; +pub mod constants; pub mod error; pub mod ext_method_name; pub(crate) mod in_flight_slot_guard; diff --git a/rsworkspace/crates/acp-nats/src/nats/parsing.rs b/rsworkspace/crates/acp-nats/src/nats/parsing.rs index d6934119d..5234e8fb8 100644 --- a/rsworkspace/crates/acp-nats/src/nats/parsing.rs +++ b/rsworkspace/crates/acp-nats/src/nats/parsing.rs @@ -1,9 +1,7 @@ +use crate::constants::{AGENT_EXT_PREFIX, AGENT_MARKER, EXT_SUBJECT_PREFIX}; use crate::ext_method_name::ExtMethodName; use crate::session_id::AcpSessionId; -const AGENT_MARKER: &str = ".agent."; -const AGENT_EXT_PREFIX: &str = "agent.ext."; - #[derive(Debug, Clone, PartialEq, Eq)] pub enum AgentMethod { Initialize, @@ -86,12 +84,6 @@ pub fn parse_agent_subject(subject: &str) -> Option { None } -/// NATS subject prefix for generic extension methods. -/// `client.ext.{name}` — the `ext` token makes extensions explicit in subjects. -/// `ExtSessionPromptResponse` is matched first as a specific ext, so it won't -/// collide with this catch-all. -const EXT_SUBJECT_PREFIX: &str = "client.ext."; - #[derive(Debug, Clone, PartialEq, Eq)] pub enum ClientMethod { FsReadTextFile, diff --git a/rsworkspace/crates/acp-nats/src/pending_prompt_waiters.rs b/rsworkspace/crates/acp-nats/src/pending_prompt_waiters.rs index c7fc63668..ef8469f6b 100644 --- a/rsworkspace/crates/acp-nats/src/pending_prompt_waiters.rs +++ b/rsworkspace/crates/acp-nats/src/pending_prompt_waiters.rs @@ -1,12 +1,11 @@ use std::collections::HashMap; use std::sync::Mutex; -use std::time::Duration; use agent_client_protocol::{PromptResponse, SessionId}; use tokio::sync::oneshot; use trogon_std::time::GetElapsed; -const PROMPT_TIMEOUT_WARNING_SUPPRESSION_WINDOW: Duration = Duration::from_secs(5); +use crate::constants::PROMPT_TIMEOUT_WARNING_SUPPRESSION_WINDOW; #[derive(Clone, Copy, Debug, Hash, Eq, PartialEq)] pub(crate) struct PromptToken(pub u64); diff --git a/rsworkspace/crates/acp-nats/src/session_id.rs b/rsworkspace/crates/acp-nats/src/session_id.rs index 8aa55ed34..63b8a9090 100644 --- a/rsworkspace/crates/acp-nats/src/session_id.rs +++ b/rsworkspace/crates/acp-nats/src/session_id.rs @@ -8,10 +8,9 @@ //! TODO: Consider extracting to `trogon-nats` as a generic `NatsSubject` (or `NatsToken`) type //! so prefix, session_id, and other subject tokens share the same validation. +use crate::constants::MAX_SESSION_ID_LENGTH; use crate::subject_token_violation::SubjectTokenViolation; -const MAX_SESSION_ID_LENGTH: usize = 128; - /// Error returned when [`AcpSessionId`] validation fails. #[derive(Debug, Clone, PartialEq)] pub struct SessionIdError(pub SubjectTokenViolation); diff --git a/rsworkspace/crates/acp-telemetry/src/constants.rs b/rsworkspace/crates/acp-telemetry/src/constants.rs new file mode 100644 index 000000000..d3b4060f1 --- /dev/null +++ b/rsworkspace/crates/acp-telemetry/src/constants.rs @@ -0,0 +1,3 @@ +use std::time::Duration; + +pub const METRIC_EXPORT_INTERVAL: Duration = Duration::from_secs(30); diff --git a/rsworkspace/crates/acp-telemetry/src/lib.rs b/rsworkspace/crates/acp-telemetry/src/lib.rs index 37c9eb142..ecfeb2210 100644 --- a/rsworkspace/crates/acp-telemetry/src/lib.rs +++ b/rsworkspace/crates/acp-telemetry/src/lib.rs @@ -1,3 +1,4 @@ +pub mod constants; mod log; mod metric; mod service_name; diff --git a/rsworkspace/crates/acp-telemetry/src/metric.rs b/rsworkspace/crates/acp-telemetry/src/metric.rs index 4b738600b..87f0cb4bd 100644 --- a/rsworkspace/crates/acp-telemetry/src/metric.rs +++ b/rsworkspace/crates/acp-telemetry/src/metric.rs @@ -2,11 +2,8 @@ use opentelemetry_otlp::MetricExporter; use opentelemetry_sdk::Resource; use opentelemetry_sdk::metrics::{PeriodicReader, SdkMeterProvider}; use std::sync::OnceLock; -use std::time::Duration; -/// OTLP periodic reader pushes accumulated metrics at this cadence. -/// 30 s keeps export volume low while still surfacing near-real-time data. -const METRIC_EXPORT_INTERVAL: Duration = Duration::from_secs(30); +use crate::constants::METRIC_EXPORT_INTERVAL; pub(crate) static METER_PROVIDER: OnceLock = OnceLock::new(); diff --git a/rsworkspace/crates/trogon-nats/src/auth.rs b/rsworkspace/crates/trogon-nats/src/auth.rs index 45c6f9645..b01ead32d 100644 --- a/rsworkspace/crates/trogon-nats/src/auth.rs +++ b/rsworkspace/crates/trogon-nats/src/auth.rs @@ -1,14 +1,10 @@ use std::path::PathBuf; use trogon_std::env::ReadEnv; -const ENV_NATS_URL: &str = "NATS_URL"; -const ENV_NATS_CREDS: &str = "NATS_CREDS"; -const ENV_NATS_NKEY: &str = "NATS_NKEY"; -const ENV_NATS_USER: &str = "NATS_USER"; -const ENV_NATS_PASSWORD: &str = "NATS_PASSWORD"; -const ENV_NATS_TOKEN: &str = "NATS_TOKEN"; - -const DEFAULT_NATS_URL: &str = "localhost:4222"; +use crate::constants::{ + DEFAULT_NATS_URL, ENV_NATS_CREDS, ENV_NATS_NKEY, ENV_NATS_PASSWORD, ENV_NATS_TOKEN, + ENV_NATS_URL, ENV_NATS_USER, +}; /// NATS authentication method. /// diff --git a/rsworkspace/crates/trogon-nats/src/connect.rs b/rsworkspace/crates/trogon-nats/src/connect.rs index 8af81fd58..a15eb3607 100644 --- a/rsworkspace/crates/trogon-nats/src/connect.rs +++ b/rsworkspace/crates/trogon-nats/src/connect.rs @@ -1,4 +1,5 @@ use crate::auth::{NatsAuth, NatsConfig}; +use crate::constants::MAX_RECONNECT_DELAY; use async_nats::{Client, ConnectOptions, Event}; use std::time::Duration; use tracing::{info, instrument, warn}; @@ -38,8 +39,6 @@ impl std::error::Error for ConnectError { } } -const MAX_RECONNECT_DELAY: Duration = Duration::from_secs(30); - fn reconnect_delay(attempts: usize) -> Duration { let delay = Duration::from_secs(std::cmp::min( MAX_RECONNECT_DELAY.as_secs(), diff --git a/rsworkspace/crates/trogon-nats/src/constants.rs b/rsworkspace/crates/trogon-nats/src/constants.rs new file mode 100644 index 000000000..8362ae940 --- /dev/null +++ b/rsworkspace/crates/trogon-nats/src/constants.rs @@ -0,0 +1,14 @@ +use std::time::Duration; + +pub const ENV_NATS_URL: &str = "NATS_URL"; +pub const ENV_NATS_CREDS: &str = "NATS_CREDS"; +pub const ENV_NATS_NKEY: &str = "NATS_NKEY"; +pub const ENV_NATS_USER: &str = "NATS_USER"; +pub const ENV_NATS_PASSWORD: &str = "NATS_PASSWORD"; +pub const ENV_NATS_TOKEN: &str = "NATS_TOKEN"; +pub const DEFAULT_NATS_URL: &str = "localhost:4222"; + +pub const DEFAULT_TIMEOUT: Duration = Duration::from_secs(30); +pub const MAX_RECONNECT_DELAY: Duration = Duration::from_secs(30); + +pub const REQ_ID_HEADER: &str = "X-Req-Id"; diff --git a/rsworkspace/crates/trogon-nats/src/lib.rs b/rsworkspace/crates/trogon-nats/src/lib.rs index 8ebd36c13..33ed5ea15 100644 --- a/rsworkspace/crates/trogon-nats/src/lib.rs +++ b/rsworkspace/crates/trogon-nats/src/lib.rs @@ -39,6 +39,7 @@ pub mod auth; pub mod client; pub mod connect; +pub mod constants; pub mod messaging; #[cfg(feature = "test-support")] @@ -48,10 +49,11 @@ pub use async_nats::subject::ToSubject; pub use auth::{NatsAuth, NatsConfig}; pub use client::{FlushClient, PublishClient, RequestClient, SubscribeClient}; pub use connect::{ConnectError, connect}; +pub use constants::REQ_ID_HEADER; pub use messaging::{ FlushPolicy, NatsError, PublishOperationError, PublishOptions, PublishOptionsBuilder, - REQ_ID_HEADER, RetryPolicy, build_request_headers, headers_with_trace_context, - inject_trace_context, publish, request, request_with_timeout, + RetryPolicy, build_request_headers, headers_with_trace_context, inject_trace_context, publish, + request, request_with_timeout, }; #[cfg(feature = "test-support")] diff --git a/rsworkspace/crates/trogon-nats/src/messaging.rs b/rsworkspace/crates/trogon-nats/src/messaging.rs index 54082ca17..908a2994c 100644 --- a/rsworkspace/crates/trogon-nats/src/messaging.rs +++ b/rsworkspace/crates/trogon-nats/src/messaging.rs @@ -6,7 +6,7 @@ use std::time::Duration; use tracing::Span; use tracing_opentelemetry::OpenTelemetrySpanExt; -const DEFAULT_TIMEOUT: Duration = Duration::from_secs(30); +use crate::constants::{DEFAULT_TIMEOUT, REQ_ID_HEADER}; struct HeaderMapCarrier<'a>(&'a mut HeaderMap); @@ -23,8 +23,6 @@ pub fn inject_trace_context(headers: &mut HeaderMap) { }); } -pub const REQ_ID_HEADER: &str = "X-Req-Id"; - pub fn headers_with_trace_context() -> HeaderMap { let mut headers = HeaderMap::new(); inject_trace_context(&mut headers);