feat: worker relays outbox to nats
This commit is contained in:
@@ -1,52 +1,41 @@
|
||||
mod config;
|
||||
mod consumer;
|
||||
mod payload;
|
||||
mod publisher;
|
||||
mod relay;
|
||||
mod subject;
|
||||
|
||||
pub use config::{NatsConfig, NatsMode};
|
||||
pub use consumer::{NatsCoreConsumer, NatsJetStreamConsumer};
|
||||
pub use publisher::NatsEventPublisher;
|
||||
pub use relay::NatsRelaySink;
|
||||
|
||||
use std::sync::Arc;
|
||||
|
||||
use domain::ports::{EventConsumer, EventPublisher};
|
||||
use domain::ports::{EventConsumer, EventRelaySink};
|
||||
|
||||
pub async fn create_publisher(cfg: NatsConfig) -> anyhow::Result<Arc<dyn EventPublisher>> {
|
||||
let client = async_nats::connect(&cfg.url).await?;
|
||||
let publisher: Arc<dyn EventPublisher> = match cfg.mode {
|
||||
NatsMode::Core => Arc::new(NatsEventPublisher::new_core(client, cfg.subject_prefix)),
|
||||
NatsMode::JetStream => Arc::new(NatsEventPublisher::new_jetstream(
|
||||
client,
|
||||
cfg.subject_prefix,
|
||||
)),
|
||||
};
|
||||
|
||||
tracing::info!("NATS publisher created (mode: {:?})", cfg.mode);
|
||||
Ok(publisher)
|
||||
}
|
||||
|
||||
pub async fn create_channel(
|
||||
/// 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<dyn EventPublisher>, Arc<dyn EventConsumer>)> {
|
||||
) -> anyhow::Result<(Arc<dyn EventConsumer>, Arc<dyn EventRelaySink>)> {
|
||||
let client = async_nats::connect(&cfg.url).await?;
|
||||
|
||||
let publisher: Arc<dyn EventPublisher> = match cfg.mode {
|
||||
NatsMode::Core => Arc::new(NatsEventPublisher::new_core(
|
||||
client.clone(),
|
||||
cfg.subject_prefix.clone(),
|
||||
)),
|
||||
NatsMode::JetStream => Arc::new(NatsEventPublisher::new_jetstream(
|
||||
client.clone(),
|
||||
cfg.subject_prefix.clone(),
|
||||
)),
|
||||
let (consumer, sink): (Arc<dyn EventConsumer>, Arc<dyn EventRelaySink>) = 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)),
|
||||
),
|
||||
};
|
||||
|
||||
let consumer: Arc<dyn EventConsumer> = match cfg.mode {
|
||||
NatsMode::Core => Arc::new(NatsCoreConsumer::create(&cfg, client).await?),
|
||||
NatsMode::JetStream => Arc::new(NatsJetStreamConsumer::create(&cfg, client).await?),
|
||||
};
|
||||
|
||||
tracing::info!("NATS channel created (mode: {:?})", cfg.mode);
|
||||
Ok((publisher, consumer))
|
||||
tracing::info!("NATS bus created (mode: {:?})", cfg.mode);
|
||||
Ok((consumer, sink))
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user