// Package runtime composes the locally owned Sendico durable messaging adapters. // SXCHNGE does not include Sendico's discovery or business-event registries. package runtime import ( merrors "git.sendico.io/tech/sxchnge/shared/errors" mlogger "git.sendico.io/tech/sxchnge/shared/logging" msg "git.sendico.io/tech/sxchnge/shared/messaging" "git.sendico.io/tech/sxchnge/shared/messaging/internal/natsb" config "git.sendico.io/tech/sxchnge/shared/messaging/internal/natsb/config" "git.sendico.io/tech/sxchnge/shared/messaging/internal/natscap" "git.sendico.io/tech/sxchnge/shared/messaging/reliable" "github.com/go-viper/mapstructure/v2" ) type Runtime struct { Durable reliable.Transport DurableAdmin reliable.Admin broker *natsb.NatsBroker } func New(logger mlogger.Logger, c *msg.Config) (*Runtime, error) { if c == nil || c.Driver != msg.BBNats { return nil, merrors.InvalidArgument("NATS messaging configuration required") } var settings config.Settings decoder, err := mapstructure.NewDecoder(&mapstructure.DecoderConfig{Result: &settings, ErrorUnused: true, TagName: "mapstructure"}) if err != nil { return nil, merrors.InternalWrap(err, "create messaging settings decoder") } if err = decoder.Decode(c.Settings); err != nil { return nil, merrors.InvalidArgument("invalid messaging settings") } broker, err := natsb.NewNatsBroker(mlogger.Named(logger, "messaging"), &settings) if err != nil { return nil, merrors.OpaqueWrap(merrors.ErrServiceUnavailable, err, "connect messaging broker") } adapter := natscap.NewDurableAdapter(broker) if adapter == nil { broker.Close() return nil, merrors.FailedPrecondition("durable messaging unavailable") } return &Runtime{Durable: adapter, DurableAdmin: adapter, broker: broker}, nil } func (r *Runtime) Close() { if r != nil { r.broker.Close() } }