/
routes.go
75 lines (66 loc) · 2.03 KB
/
routes.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
package service
import (
"context"
"encoding/json"
"github.com/cenkalti/backoff"
etp "github.com/integration-system/isp-etp-go"
"github.com/integration-system/isp-lib/structure"
"github.com/integration-system/isp-lib/utils"
log "github.com/integration-system/isp-log"
"isp-config-service/codes"
"isp-config-service/holder"
"isp-config-service/store/state"
"time"
)
const (
RoutesSubscribersRoom = "__routesSubscribers"
)
var RoutesService routesService
type routesService struct{}
func (rs *routesService) HandleDisconnect(connID string) {
holder.EtpServer.Rooms().LeaveByConnId(connID, RoutesSubscribersRoom)
}
func (rs *routesService) SubscribeRoutes(conn etp.Conn, mesh state.ReadonlyMesh) {
holder.EtpServer.Rooms().Join(conn, RoutesSubscribersRoom)
routes := mesh.GetRoutes()
go func(conn etp.Conn, routes structure.RoutingConfig) {
err := rs.sendRoutes(conn, utils.ConfigSendRoutesWhenConnected, routes)
if err != nil {
log.Errorf(codes.RoutesServiceSendRoutesError, "send routes %v", err)
}
}(conn, routes)
}
func (rs *routesService) BroadcastRoutes(mesh state.ReadonlyMesh) {
routes := mesh.GetRoutes()
go func(routes structure.RoutingConfig) {
err := rs.broadcastRoutes(utils.ConfigSendRoutesChanged, routes)
if err != nil {
log.Errorf(codes.RoutesServiceSendRoutesError, "broadcast routes %v", err)
}
}(routes)
}
func (rs *routesService) broadcastRoutes(event string, routes structure.RoutingConfig) error {
bytes, err := json.Marshal(routes)
if err != nil {
return err
}
err = holder.EtpServer.BroadcastToRoom(RoutesSubscribersRoom, event, bytes)
if err != nil {
return err
}
return nil
}
func (rs *routesService) sendRoutes(conn etp.Conn, event string, routes structure.RoutingConfig) error {
if bytes, err := json.Marshal(routes); err != nil {
return err
} else {
bf := backoff.WithMaxRetries(backoff.NewConstantBackOff(100*time.Millisecond), 3)
err := backoff.Retry(func() error {
return conn.Emit(context.Background(), event, bytes)
}, bf)
if err != nil {
return err
}
}
return nil
}