Files
web/nats/nats.go

69 lines
1.1 KiB
Go

package nats
import (
"time"
"github.com/nats-io/nats-server/v2/server"
"github.com/nats-io/nats.go"
)
func New(opts ...Option) (*nats.Conn, func(), error) {
cfg := &config{
readyTimeout: 5 * time.Second,
}
for _, opt := range opts {
opt(cfg)
}
var nc *nats.Conn
var shutdown func()
if cfg.externalURL != "" {
var err error
nc, err = nats.Connect(cfg.externalURL, cfg.connectOpts...)
if err != nil {
return nil, nil, err
}
shutdown = func() { nc.Close() }
return nc, shutdown, nil
}
serverOpts := cfg.serverOpts
if serverOpts == nil {
serverOpts = &server.Options{
Host: "127.0.0.1",
Port: -1,
NoLog: true,
}
}
s, err := server.NewServer(serverOpts)
if err != nil {
return nil, nil, err
}
go s.Start()
if !s.ReadyForConnections(cfg.readyTimeout) {
s.Shutdown()
return nil, nil, ErrNotReady
}
nc, err = nats.Connect(
s.ClientURL(),
append(cfg.connectOpts, nats.InProcessServer(s), nats.Name("embedded-client"))...,
)
if err != nil {
s.Shutdown()
return nil, nil, err
}
shutdown = func() {
nc.Close()
s.Shutdown()
}
return nc, shutdown, nil
}