pub use crate::context::{
Context, InfrastructureConfig, MinioConfig, MlflowConfig, PostgresConfig, Receiver, RedisConfig,
};
#[cfg(feature = "messaging")]
pub use crate::stream::ReceiverExt;
#[cfg(feature = "messaging")]
pub use crate::publish::ContextPublishExt;
#[cfg(feature = "messaging")]
pub use crate::rpc::{Request, Response, RpcExt};
#[cfg(feature = "messaging")]
pub use crate::rpc_streaming::{
StreamError, StreamMessage, StreamPayload, StreamReceiver, StreamSender, StreamingRpcExt,
};
#[cfg(feature = "messaging")]
pub use crate::discovery::DiscoveryExt;
pub use crate::discovery::{NodeMetadata, NodeStatus};
pub use crate::schema::{
CompatibilityCheck, CompatibilityMode, MessageSchema, MessageVersionInfo, SchemaEvolution, SchemaField,
SchemaRegistryExt, SchemaVersioningExt,
};
pub use crate::auth::{AuthExt, Permission, Policy, Rule};
pub use crate::secrets::{
EnvironmentBackend, RedisBackend, SecretBackend, SecretsConfig, SecretsManager, VaultBackend,
};
#[cfg(feature = "messaging")]
pub use crate::health::{
HealthMonitor, HealthReport, HealthReporter, HealthReportingExt, NodeHealthInfo, SystemHealth,
};
#[cfg(feature = "messaging")]
pub use crate::behavior_interrupt::{
BehaviorControl, BehaviorInterruptConfig, BehaviorInterruptTrigger, InterruptMode,
};
pub use crate::metrics::{Counter, Gauge, Histogram, MetricsRegistry, NodeMetrics};
pub use crate::rate_limit::{MultiKeyRateLimiter, RateLimit, RateLimiter, RateLimiterManager};
pub use crate::circuit_breaker::{CircuitBreaker, CircuitBreakerConfig, CircuitState};
#[cfg(feature = "messaging")]
pub use crate::dead_letter::{DeadLetterConfig, DeadLetterQueue, FailedMessage};
#[cfg(feature = "schema-validation")]
pub use crate::schema_validation::{
export_project_schema, get_project_schema, load_and_validate_project, validate_config_file,
validate_node_config_file, validate_node_config_json, validate_project_config, validate_project_json,
};
pub use crate::dependency::{create_graph, DependencyGraph, ShutdownPlan, StartupPlan};
#[cfg(feature = "messaging")]
pub use crate::lifecycle::{
get_timestamp_ms, topic_node_lifecycle, topic_node_status, topic_node_trigger, ModeChanged, ModeError, ModeRequest,
NodeLifecycleAction, NodeLifecycleEvent, NodeLifecycleStatus, NodeStatusEvent, NodeTriggerEvent,
TOPIC_MODE_CHANGED, TOPIC_MODE_ERROR, TOPIC_MODE_REQUEST,
};
pub use crate::topic_registry::{TopicInfo, TopicRegistry, TopologyStats};
pub use crate::topic_utils::{extract_category, format_elapsed_time, TopicMetadata, Topics};
pub use crate::state::{
FilesystemStateManager, MemoryStateManager, StateManager, StateOptions, StateSnapshot, VersionedState,
};
pub use crate::recovery::{
BackoffStrategy, DegradationMode, RecoveryAction, RecoveryAttempt, RecoveryHistory, RecoveryManager,
RecoveryPolicy, RecoveryPolicyBuilder, RecoveryStats,
};
#[cfg(feature = "messaging")]
pub use crate::tracing_otel::{
JaegerExporter, SpanBuilder, SpanData, TraceContext, TraceExporter, TracedMessage, TracingConfig, TracingExt,
TracingHandle, ZipkinExporter,
};
pub use crate::profiling::{
measure_latency, ExecutionStats, LatencyStats, MemoryStats, PerformanceMetrics, PerformanceReport, ProfilingExt,
ThroughputStats, TimerGuard,
};
pub use crate::service::Service;
#[cfg(feature = "messaging")]
pub use crate::service_manager::ServiceManager;
pub use crate::node::{
fmt_node_with_controller, run_node, HealthPriority, HealthReportingConfig, HealthStatusExt, Node, NodeImpl,
NodeTag, NodeType, RateConfig,
};
pub use crate::config::{
env_or_default, load_and_validate, load_config, load_config_from_env, substitute_env_vars, Validate,
};
pub use crate::model::{load_labels, load_model_config, CustomLabelsConfig, ModelConfig, PreprocessingConfig};
pub use crate::builder_setter;
pub use crate::enum_str_method;
pub use crate::messages::Message;
pub use crate::messages::Timestamped;
pub use crate::types::*;
pub use crate::error::{Mecha10Error, Result};
pub use async_trait::async_trait;
pub use tokio::{
self, select,
time::{interval, sleep, timeout, Duration, Instant},
};
pub use tokio::task::JoinHandle;
pub use serde::{Deserialize, Serialize};
pub use serde_json::{self, json, Value as JsonValue};
pub use schemars::JsonSchema;
pub use tracing::{debug, error, info, instrument, trace, warn, Level};
#[cfg(feature = "macros")]
pub use mecha10_macros::Node;
#[cfg(feature = "macros")]
pub use mecha10_macros::Config;
#[cfg(feature = "macros")]
pub use mecha10_macros::ConfigDefaults;
fn since_epoch() -> std::time::Duration {
std::time::SystemTime::now()
.duration_since(std::time::UNIX_EPOCH)
.expect("Time went backwards")
}
pub fn now_micros() -> u64 {
since_epoch().as_micros() as u64
}
pub fn now_secs() -> u64 {
since_epoch().as_secs()
}
pub fn interval_at_hz(hz: f32) -> tokio::time::Interval {
let duration = std::time::Duration::from_secs_f32(1.0 / hz);
tokio::time::interval(duration)
}
pub fn init_logging() {
use tracing_subscriber::EnvFilter;
let base = std::env::var("RUST_LOG").unwrap_or_else(|_| "info".to_string());
let curated = format!("{base},ort=warn,rtc_dtls=error,rtc_ice=error,rtc::peer_connection::handler=error");
let env_filter = EnvFilter::try_new(&curated).unwrap_or_else(|_| {
EnvFilter::new("info,ort=warn,rtc_dtls=error,rtc_ice=error,rtc::peer_connection::handler=error")
});
#[cfg(feature = "messaging")]
{
use tracing_subscriber::prelude::*;
let _ = tracing_subscriber::registry()
.with(env_filter)
.with(tracing_subscriber::fmt::layer())
.with(crate::log_publisher::RedisLogLayer::new())
.try_init();
}
#[cfg(not(feature = "messaging"))]
{
let _ = tracing_subscriber::fmt().with_env_filter(env_filter).try_init();
}
}
#[macro_export]
macro_rules! in_node_context {
($ctx:expr, $body:block) => {{
let _span = tracing::info_span!("node", node_id = $ctx.node_id()).entered();
$body
}};
}
pub use in_node_context;
#[macro_export]
macro_rules! node_binary_main {
($node_crate:ident) => {
#[tokio::main]
async fn main() -> anyhow::Result<()> {
$crate::prelude::init_logging();
$node_crate::run().await.map_err(|e| anyhow::anyhow!(e))
}
};
}
pub use node_binary_main;
pub fn now_millis() -> u64 {
since_epoch().as_millis() as u64
}
pub fn elapsed_micros(timestamp_micros: u64) -> u64 {
now_micros().saturating_sub(timestamp_micros)
}
pub fn timestamp_as_secs(timestamp_micros: u64) -> f64 {
timestamp_micros as f64 / 1_000_000.0
}
pub fn duration_from_hz(hz: f32) -> Duration {
Duration::from_secs_f32(1.0 / hz)
}
pub fn normalize_angle(angle: f32) -> f32 {
use std::f32::consts::PI;
let mut normalized = angle;
while normalized > PI {
normalized -= 2.0 * PI;
}
while normalized < -PI {
normalized += 2.0 * PI;
}
normalized
}
pub fn normalize_angle_degrees(angle: f32) -> f32 {
let mut normalized = angle;
while normalized > 180.0 {
normalized -= 360.0;
}
while normalized < -180.0 {
normalized += 360.0;
}
normalized
}
pub fn angle_difference(from: f32, to: f32) -> f32 {
normalize_angle(to - from)
}
pub fn degrees_to_radians(degrees: f32) -> f32 {
degrees * std::f32::consts::PI / 180.0
}
pub fn radians_to_degrees(radians: f32) -> f32 {
radians * 180.0 / std::f32::consts::PI
}
pub fn safe_divide(numerator: f32, denominator: f32, default: f32) -> f32 {
if denominator.abs() < f32::EPSILON {
default
} else {
numerator / denominator
}
}
pub fn clamp<T: PartialOrd>(value: T, min: T, max: T) -> T {
if value < min {
min
} else if value > max {
max
} else {
value
}
}
pub fn lerp(a: f32, b: f32, t: f32) -> f32 {
a + (b - a) * t
}
pub use std::collections::{HashMap, HashSet};
pub use std::sync::{Arc, Mutex};
pub use std::path::{Path, PathBuf};
pub type Shared<T> = Arc<T>;
pub type SharedMut<T> = Arc<Mutex<T>>;