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  }