Skip to content

Commit cf4b59f

Browse files
authored
refactor: remove NATs deprecated features (#441)
1 parent 1c29b18 commit cf4b59f

File tree

1 file changed

+48
-32
lines changed

1 file changed

+48
-32
lines changed

discovery/nats/discovery.go

+48-32
Original file line numberDiff line numberDiff line change
@@ -25,18 +25,19 @@
2525
package nats
2626

2727
import (
28+
"errors"
2829
"net"
2930
"strconv"
3031
"sync"
3132
"time"
3233

3334
"github.com/flowchartsman/retry"
3435
"github.com/nats-io/nats.go"
35-
"github.com/nats-io/nats.go/encoders/protobuf"
3636
"go.uber.org/atomic"
37+
"google.golang.org/protobuf/proto"
3738

3839
"github.com/tochemey/goakt/v2/discovery"
39-
internalpb "github.com/tochemey/goakt/v2/internal/internalpb"
40+
"github.com/tochemey/goakt/v2/internal/internalpb"
4041
"github.com/tochemey/goakt/v2/log"
4142
)
4243

@@ -49,7 +50,7 @@ type Discovery struct {
4950
registered *atomic.Bool
5051

5152
// define the nats connection
52-
natsConnection *nats.EncodedConn
53+
connection *nats.Conn
5354
// define a slice of subscriptions
5455
subscriptions []*nats.Subscription
5556

@@ -132,12 +133,8 @@ func (d *Discovery) Initialize() error {
132133
return nil
133134
})
134135

135-
// create the NATs connection encoder
136-
encodedConn, err := nats.NewEncodedConn(connection, protobuf.PROTOBUF_ENCODER)
137-
if err != nil {
138-
return err
139-
}
140-
d.natsConnection = encodedConn
136+
// create the NATs connection
137+
d.connection = connection
141138
d.initialized = atomic.NewBool(true)
142139
return nil
143140
}
@@ -152,33 +149,41 @@ func (d *Discovery) Register() error {
152149
}
153150

154151
// create the subscription handler
155-
subscriptionHandler := func(_, reply string, msg *internalpb.NatsMessage) {
156-
switch msg.GetMessageType() {
152+
handler := func(msg *nats.Msg) {
153+
message := new(internalpb.NatsMessage)
154+
if err := proto.Unmarshal(msg.Data, message); err != nil {
155+
// TODO: need to read more and see how to propagate the error
156+
d.connection.Opts.AsyncErrorCB(d.connection, msg.Sub, errors.New("nats: Got an error trying to unmarshal: "+err.Error()))
157+
return
158+
}
159+
160+
switch message.GetMessageType() {
157161
case internalpb.NatsMessageType_NATS_MESSAGE_TYPE_DEREGISTER:
158162
d.logger.Infof("received an de-registration request from peer[name=%s, host=%s, port=%d]",
159-
msg.GetName(), msg.GetHost(), msg.GetPort())
163+
message.GetName(), message.GetHost(), message.GetPort())
160164
case internalpb.NatsMessageType_NATS_MESSAGE_TYPE_REGISTER:
161165
d.logger.Infof("received an registration request from peer[name=%s, host=%s, port=%d]",
162-
msg.GetName(), msg.GetHost(), msg.GetPort())
166+
message.GetName(), message.GetHost(), message.GetPort())
163167
case internalpb.NatsMessageType_NATS_MESSAGE_TYPE_REQUEST:
164168
d.logger.Infof("received an identification request from peer[name=%s, host=%s, port=%d]",
165-
msg.GetName(), msg.GetHost(), msg.GetPort())
169+
message.GetName(), message.GetHost(), message.GetPort())
166170

167-
replyMessage := &internalpb.NatsMessage{
171+
response := &internalpb.NatsMessage{
168172
Host: d.hostNode.Host,
169173
Port: int32(d.hostNode.GossipPort),
170174
Name: d.hostNode.Name,
171175
MessageType: internalpb.NatsMessageType_NATS_MESSAGE_TYPE_RESPONSE,
172176
}
173177

174-
if err := d.natsConnection.Publish(reply, replyMessage); err != nil {
178+
bytea, _ := proto.Marshal(response)
179+
if err := d.connection.Publish(msg.Reply, bytea); err != nil {
175180
d.logger.Errorf("failed to reply for identification request from peer[name=%s, host=%s, port=%d]",
176-
msg.GetName(), msg.GetHost(), msg.GetPort())
181+
message.GetName(), message.GetHost(), message.GetPort())
177182
}
178183
}
179184
}
180185

181-
subscription, err := d.natsConnection.Subscribe(d.config.NatsSubject, subscriptionHandler)
186+
subscription, err := d.connection.Subscribe(d.config.NatsSubject, handler)
182187
if err != nil {
183188
return err
184189
}
@@ -215,14 +220,17 @@ func (d *Discovery) Deregister() error {
215220
}
216221

217222
// send the de-registration message to notify peers
218-
if d.natsConnection != nil {
223+
if d.connection != nil {
219224
// send a message to deregister stating we are out
220-
return d.natsConnection.Publish(d.config.NatsSubject, &internalpb.NatsMessage{
225+
message := &internalpb.NatsMessage{
221226
Host: d.hostNode.Host,
222227
Port: int32(d.hostNode.GossipPort),
223228
Name: d.hostNode.Name,
224229
MessageType: internalpb.NatsMessageType_NATS_MESSAGE_TYPE_DEREGISTER,
225-
})
230+
}
231+
232+
bytea, _ := proto.Marshal(message)
233+
return d.connection.Publish(d.config.NatsSubject, bytea)
226234
}
227235

228236
d.registered.Store(false)
@@ -246,37 +254,45 @@ func (d *Discovery) DiscoverPeers() ([]string, error) {
246254
// report their presence.
247255
// collect as many responses as possible in the given timeout.
248256
inbox := nats.NewInbox()
249-
recv := make(chan *internalpb.NatsMessage)
257+
recv := make(chan *nats.Msg, 1)
250258

251259
// bind to receive messages
252-
sub, err := d.natsConnection.BindRecvChan(inbox, recv)
260+
sub, err := d.connection.ChanSubscribe(inbox, recv)
253261
if err != nil {
254262
return nil, err
255263
}
256264

257-
if err = d.natsConnection.PublishRequest(d.config.NatsSubject, inbox, &internalpb.NatsMessage{
265+
request := &internalpb.NatsMessage{
258266
Host: d.hostNode.Host,
259267
Port: int32(d.hostNode.GossipPort),
260268
Name: d.hostNode.Name,
261269
MessageType: internalpb.NatsMessageType_NATS_MESSAGE_TYPE_REQUEST,
262-
}); err != nil {
270+
}
271+
272+
bytea, _ := proto.Marshal(request)
273+
if err = d.connection.PublishRequest(d.config.NatsSubject, inbox, bytea); err != nil {
263274
return nil, err
264275
}
265276

266277
var peers []string
267278
timeout := time.After(d.config.Timeout)
268279
me := d.hostNode.GossipAddress()
269-
270280
for {
271281
select {
272-
case m, ok := <-recv:
282+
case msg, ok := <-recv:
273283
if !ok {
274284
// Subscription is closed
275285
return peers, nil
276286
}
277287

288+
message := new(internalpb.NatsMessage)
289+
if err := proto.Unmarshal(msg.Data, message); err != nil {
290+
d.logger.Errorf("failed to unmarshal nats message: %v", err)
291+
return nil, err
292+
}
293+
278294
// get the found peer address
279-
addr := net.JoinHostPort(m.GetHost(), strconv.Itoa(int(m.GetPort())))
295+
addr := net.JoinHostPort(message.GetHost(), strconv.Itoa(int(message.GetPort())))
280296
if addr == me {
281297
continue
282298
}
@@ -297,10 +313,10 @@ func (d *Discovery) Close() error {
297313

298314
d.initialized.Store(false)
299315

300-
if d.natsConnection != nil {
316+
if d.connection != nil {
301317
defer func() {
302-
d.natsConnection.Close()
303-
d.natsConnection = nil
318+
d.connection.Close()
319+
d.connection = nil
304320
}()
305321

306322
for _, subscription := range d.subscriptions {
@@ -313,7 +329,7 @@ func (d *Discovery) Close() error {
313329
}
314330
}
315331

316-
return d.natsConnection.Flush()
332+
return d.connection.Flush()
317333
}
318334
return nil
319335
}

0 commit comments

Comments
 (0)