1
1
package controller
2
2
3
3
import (
4
+ "crypto/sha256"
5
+ "encoding/json"
4
6
"fmt"
7
+ "os"
5
8
6
9
"github.com/nats-io/jsm.go"
7
10
"github.com/nats-io/nats.go"
8
11
"github.com/nats-io/nats.go/jetstream"
9
12
)
10
13
11
14
type NatsConfig struct {
12
- ClientName string
13
- ServerURL string
14
- Certificate string
15
- Key string
16
- TLSFirst bool
17
- CAs []string
18
- Credentials string
19
- NKey string
20
- Token string
21
- User string
22
- Password string
15
+ ClientName string `json:"name,omitempty"`
16
+ ServerURL string `json:"url,omitempty"`
17
+ Certificate string `json:"tls_cert,omitempty"`
18
+ Key string `json:"tls_key,omitempty"`
19
+ TLSFirst bool `json:"tls_first,omitempty"`
20
+ CAs []string `json:"tls_ca,omitempty"`
21
+ Credentials string `json:"credential,omitempty"`
22
+ NKey string `json:"nkey,omitempty"`
23
+ Token string `json:"token,omitempty"`
24
+ User string `json:"username,omitempty"`
25
+ Password string `json:"password,omitempty"`
26
+ }
27
+
28
+ func (o * NatsConfig ) Copy () * NatsConfig {
29
+ if o == nil {
30
+ return nil
31
+ }
32
+
33
+ cp := * o
34
+ return & cp
35
+ }
36
+
37
+ func (o * NatsConfig ) Hash () (string , error ) {
38
+ b , err := json .Marshal (o )
39
+ if err != nil {
40
+ return "" , fmt .Errorf ("error marshaling config to json: %v" , err )
41
+ }
42
+
43
+ if o .NKey != "" {
44
+ fb , err := os .ReadFile (o .NKey )
45
+ if err != nil {
46
+ return "" , fmt .Errorf ("error opening nkey file %s: %v" , o .NKey , err )
47
+ }
48
+ b = append (b , fb ... )
49
+ }
50
+
51
+ if o .Credentials != "" {
52
+ fb , err := os .ReadFile (o .Credentials )
53
+ if err != nil {
54
+ return "" , fmt .Errorf ("error opening creds file %s: %v" , o .Credentials , err )
55
+ }
56
+ b = append (b , fb ... )
57
+ }
58
+
59
+ if len (o .CAs ) > 0 {
60
+ for _ , cert := range o .CAs {
61
+ fb , err := os .ReadFile (cert )
62
+ if err != nil {
63
+ return "" , fmt .Errorf ("error opening ca file %s: %v" , cert , err )
64
+ }
65
+ b = append (b , fb ... )
66
+ }
67
+ }
68
+
69
+ if o .Certificate != "" {
70
+ fb , err := os .ReadFile (o .Certificate )
71
+ if err != nil {
72
+ return "" , fmt .Errorf ("error opening cert file %s: %v" , o .Certificate , err )
73
+ }
74
+ b = append (b , fb ... )
75
+ }
76
+
77
+ if o .Key != "" {
78
+ fb , err := os .ReadFile (o .Key )
79
+ if err != nil {
80
+ return "" , fmt .Errorf ("error opening key file %s: %v" , o .Key , err )
81
+ }
82
+ b = append (b , fb ... )
83
+ }
84
+
85
+ hash := sha256 .New ()
86
+ hash .Write (b )
87
+ return fmt .Sprintf ("%x" , hash .Sum (nil )), nil
23
88
}
24
89
25
90
func (o * NatsConfig ) Overlay (overlay * NatsConfig ) {
@@ -125,15 +190,10 @@ type Closable interface {
125
190
Close ()
126
191
}
127
192
128
- func CreateJSMClient (cfg * NatsConfig , pedantic bool ) (* jsm.Manager , Closable , error ) {
129
- nc , err := createNatsConn ( cfg , pedantic )
193
+ func CreateJSMClient (conn * pooledConnection , pedantic bool ) (* jsm.Manager , error ) {
194
+ major , minor , _ , err := versionComponents ( conn . nc . ConnectedServerVersion () )
130
195
if err != nil {
131
- return nil , nil , fmt .Errorf ("create nats connection: %w" , err )
132
- }
133
-
134
- major , minor , _ , err := versionComponents (nc .ConnectedServerVersion ())
135
- if err != nil {
136
- return nil , nil , fmt .Errorf ("parse server version: %w" , err )
196
+ return nil , fmt .Errorf ("parse server version: %w" , err )
137
197
}
138
198
139
199
// JetStream pedantic mode unsupported prior to NATS Server 2.11
@@ -146,28 +206,23 @@ func CreateJSMClient(cfg *NatsConfig, pedantic bool) (*jsm.Manager, Closable, er
146
206
jsmOpts = append (jsmOpts , jsm .WithPedanticRequests ())
147
207
}
148
208
149
- jsmClient , err := jsm .New (nc , jsmOpts ... )
209
+ jsmClient , err := jsm .New (conn . nc , jsmOpts ... )
150
210
if err != nil {
151
- return nil , nil , fmt .Errorf ("new jsm client: %w" , err )
211
+ return nil , fmt .Errorf ("new jsm client: %w" , err )
152
212
}
153
213
154
- return jsmClient , nc , nil
214
+ return jsmClient , nil
155
215
}
156
216
157
217
// CreateJetStreamClient creates new Jetstream client with a connection based on the given NatsConfig.
158
218
// Returns a jetstream.Jetstream client and the Closable of the underlying connection.
159
219
// Close should be called when the client is no longer used.
160
- func CreateJetStreamClient (cfg * NatsConfig , pedantic bool ) (jetstream.JetStream , Closable , error ) {
161
- nc , err := createNatsConn (cfg , pedantic )
162
- if err != nil {
163
- return nil , nil , fmt .Errorf ("create nats connection: %w" , err )
164
- }
165
-
166
- js , err := jetstream .New (nc )
220
+ func CreateJetStreamClient (conn * pooledConnection , pedantic bool ) (jetstream.JetStream , error ) {
221
+ js , err := jetstream .New (conn .nc )
167
222
if err != nil {
168
- return nil , nil , fmt .Errorf ("new jetstream: %w" , err )
223
+ return nil , fmt .Errorf ("new jetstream: %w" , err )
169
224
}
170
- return js , nc , nil
225
+ return js , nil
171
226
}
172
227
173
228
func createNatsConn (cfg * NatsConfig , pedantic bool ) (* nats.Conn , error ) {
0 commit comments