50 lines
1.8 KiB
Go
50 lines
1.8 KiB
Go
// 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()
|
|
}
|
|
}
|