mod config; mod consumer; mod payload; mod relay; mod subject; pub use config::{NatsConfig, NatsMode}; pub use consumer::{NatsCoreConsumer, NatsJetStreamConsumer}; pub use relay::NatsRelaySink; use std::sync::Arc; use domain::ports::{EventConsumer, EventRelaySink}; /// The worker's NATS side: where handlers read events from, and where the /// outbox relay writes them to. pub async fn create_bus( cfg: NatsConfig, ) -> anyhow::Result<(Arc, Arc)> { let client = async_nats::connect(&cfg.url).await?; let (consumer, sink): (Arc, Arc) = match cfg.mode { NatsMode::Core => { tracing::info!( "core NATS mode: no broker-side dedup or redelivery; relying on consumer ledger" ); ( Arc::new(NatsCoreConsumer::create(&cfg, client.clone()).await?), Arc::new(NatsRelaySink::new_core(client, cfg.subject_prefix)), ) } // The consumer creates the stream the relay publishes into. NatsMode::JetStream => ( Arc::new(NatsJetStreamConsumer::create(&cfg, client.clone()).await?), Arc::new(NatsRelaySink::new_jetstream(client, cfg.subject_prefix)), ), }; tracing::info!("NATS bus created (mode: {:?})", cfg.mode); Ok((consumer, sink)) }