github.com/argoproj/argo-events@v1.9.1/eventbus/stan/base/stan.go (about) 1 package base 2 3 import ( 4 "fmt" 5 6 eventbuscommon "github.com/argoproj/argo-events/eventbus/common" 7 eventbusv1alpha1 "github.com/argoproj/argo-events/pkg/apis/eventbus/v1alpha1" 8 nats "github.com/nats-io/nats.go" 9 "github.com/nats-io/stan.go" 10 "go.uber.org/zap" 11 ) 12 13 type STAN struct { 14 url string 15 auth *eventbuscommon.Auth 16 clusterID string 17 18 logger *zap.SugaredLogger 19 } 20 21 // NewSTAN returns a nats streaming driver 22 func NewSTAN(url string, clusterID string, auth *eventbuscommon.Auth, logger *zap.SugaredLogger) *STAN { 23 return &STAN{ 24 url: url, 25 clusterID: clusterID, 26 auth: auth, 27 logger: logger, 28 } 29 } 30 31 func (n *STAN) MakeConnection(clientID string) (*STANConnection, error) { 32 log := n.logger.With("clientID", clientID) 33 conn := &STANConnection{ClientID: clientID, Logger: n.logger} 34 opts := []nats.Option{ 35 // Do not reconnect here but handle reconnction outside 36 nats.NoReconnect(), 37 nats.DisconnectErrHandler(func(nc *nats.Conn, err error) { 38 conn.NATSConnected = false 39 log.Errorw("NATS connection lost", zap.Error(err)) 40 }), 41 nats.ReconnectHandler(func(nnc *nats.Conn) { 42 conn.NATSConnected = true 43 log.Info("Reconnected to NATS server") 44 }), 45 } 46 switch n.auth.Strategy { 47 case eventbusv1alpha1.AuthStrategyToken: 48 log.Info("NATS auth strategy: Token") 49 opts = append(opts, nats.Token(n.auth.Credential.Token)) 50 case eventbusv1alpha1.AuthStrategyNone: 51 log.Info("NATS auth strategy: None") 52 default: 53 return nil, fmt.Errorf("unsupported auth strategy") 54 } 55 nc, err := nats.Connect(n.url, opts...) 56 if err != nil { 57 log.Errorw("Failed to connect to NATS server", zap.Error(err)) 58 return nil, err 59 } 60 log.Info("Connected to NATS server.") 61 conn.NATSConn = nc 62 conn.NATSConnected = true 63 64 sc, err := stan.Connect(n.clusterID, clientID, stan.NatsConn(nc), stan.Pings(5, 60), 65 stan.SetConnectionLostHandler(func(_ stan.Conn, reason error) { 66 conn.STANConnected = false 67 log.Errorw("NATS streaming connection lost", zap.Error(err)) 68 })) 69 if err != nil { 70 log.Errorw("Failed to connect to NATS streaming server", zap.Error(err)) 71 return nil, err 72 } 73 log.Info("Connected to NATS streaming server.") 74 conn.STANConn = sc 75 conn.STANConnected = true 76 return conn, nil 77 }