// Command routerd consumes alerts from NATS JetStream, resolves // recipients (companies → groups → individuals ∩ subscriptions), // and enqueues one delivery per (individual, channel) to // deliveries.. subjects. // // M0: connects to NATS, /health, /metrics. No business logic yet. package main import ( "context" "os" "os/signal" "syscall" "git3.techno-world.net/lrosales/broad-announce/internal/broker" "git3.techno-world.net/lrosales/broad-announce/internal/config" "git3.techno-world.net/lrosales/broad-announce/internal/httpserver" "git3.techno-world.net/lrosales/broad-announce/internal/observability" ) func main() { cfg, err := config.LoadCommon("routerd") if err != nil { os.Stderr.WriteString("config: " + err.Error() + "\n") os.Exit(1) } logger := observability.Init(cfg.Env, cfg.LogLevel, "routerd") logger.Info("starting", "env", cfg.Env, "addr", cfg.HTTPAddr) ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGTERM) defer stop() br, err := broker.Connect(ctx, cfg.NATSURL) if err != nil { logger.Error("nats connect", "err", err) os.Exit(1) } defer br.Close() logger.Info("nats connected") reg, _ := observability.NewRegistry("routerd") srv := httpserver.New(httpserver.Config{ Addr: cfg.HTTPAddr, ServiceName: "routerd", ShutdownGrace: cfg.ShutdownGrace, }, logger, observability.MetricsHandler(reg)) errCh := make(chan error, 1) go func() { errCh <- srv.Start() }() select { case <-ctx.Done(): logger.Info("shutdown signal received") case err := <-errCh: if err != nil { logger.Error("http server", "err", err) os.Exit(1) } } if err := srv.Shutdown(ctx); err != nil { logger.Warn("graceful shutdown", "err", err) } logger.Info("bye") }