Skip to content

Commit dc4cbf2

Browse files
authored
Merge pull request #81 from HyperloopUPV-H8/backend/client-broker
[backend] [PR 1] Broker with data and connection topics
2 parents 843dc1c + 9375242 commit dc4cbf2

28 files changed

Lines changed: 1187 additions & 83 deletions

File tree

backend/cmd/main.go

Lines changed: 41 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import (
1313
"runtime"
1414
"runtime/pprof"
1515
"strings"
16+
"time"
1617

1718
blcuPackage "github.com/HyperloopUPV-H8/h9-backend/internal/blcu"
1819
"github.com/HyperloopUPV-H8/h9-backend/internal/common"
@@ -30,6 +31,9 @@ import (
3031
vehicle_models "github.com/HyperloopUPV-H8/h9-backend/internal/vehicle/models"
3132
"github.com/HyperloopUPV-H8/h9-backend/internal/ws_handle"
3233
"github.com/HyperloopUPV-H8/h9-backend/pkg/abstraction"
34+
"github.com/HyperloopUPV-H8/h9-backend/pkg/broker"
35+
connection_topic "github.com/HyperloopUPV-H8/h9-backend/pkg/broker/topics/connection"
36+
data_topic "github.com/HyperloopUPV-H8/h9-backend/pkg/broker/topics/data"
3337
"github.com/HyperloopUPV-H8/h9-backend/pkg/transport"
3438
"github.com/HyperloopUPV-H8/h9-backend/pkg/transport/network/sniffer"
3539
"github.com/HyperloopUPV-H8/h9-backend/pkg/transport/network/tcp"
@@ -40,6 +44,7 @@ import (
4044
"github.com/HyperloopUPV-H8/h9-backend/pkg/transport/packet/protection"
4145
"github.com/HyperloopUPV-H8/h9-backend/pkg/transport/packet/state"
4246
"github.com/HyperloopUPV-H8/h9-backend/pkg/transport/presentation"
47+
"github.com/HyperloopUPV-H8/h9-backend/pkg/websocket"
4348
"github.com/fatih/color"
4449
"github.com/google/gopacket/layers"
4550
"github.com/google/gopacket/pcap"
@@ -147,6 +152,24 @@ func main() {
147152
var blcu blcuPackage.BLCU
148153
blcuAddr, useBlcu := info.Addresses.Boards["BLCU"]
149154

155+
// <--- broker --->
156+
broker := broker.New()
157+
broker.SetAPI(&brokerAPI{
158+
OnUserPush: func(push abstraction.BrokerPush) {},
159+
})
160+
161+
dataTopic := data_topic.NewUpdateTopic(time.Second / 10)
162+
defer dataTopic.Stop()
163+
connectionTopic := connection_topic.NewUpdateTopic()
164+
165+
broker.AddTopic(data_topic.UpdateName, dataTopic)
166+
broker.AddTopic(connection_topic.UpdateName, connectionTopic)
167+
168+
connections := make(chan *websocket.Client)
169+
upgrader := websocket.NewUpgrader(connections)
170+
pool := websocket.NewPool(connections)
171+
broker.SetPool(pool)
172+
150173
// <--- transport --->
151174
orders := make(map[abstraction.PacketId]struct{})
152175
for _, board := range podData.Boards {
@@ -159,14 +182,17 @@ func main() {
159182

160183
transp := transport.NewTransport()
161184

162-
transp.SetAPI(&TransportAPI{
185+
transp.SetAPI(&transportAPI{
163186
OnNotification: func(notification abstraction.TransportNotification) {
164187
packet := notification.(transport.PacketNotification)
165188

166189
switch p := packet.Packet.(type) {
167190
case *data.Packet:
168191
update := updateFactory.NewUpdate(p)
169-
dataTransfer.Update(update)
192+
err := broker.Push(data_topic.NewPush(&update))
193+
if err != nil {
194+
fmt.Println(err)
195+
}
170196

171197
err = loggerHandler.PushRecord(&data_logger.Record{
172198
Packet: p,
@@ -226,7 +252,7 @@ func main() {
226252
},
227253

228254
OnConnectionUpdate: func(target abstraction.TransportTarget, isConnected bool) {
229-
connectionTransfer.Update(string(target), isConnected)
255+
connectionTopic.Push(connection_topic.NewConnection(string(target), isConnected))
230256
},
231257
})
232258

@@ -327,7 +353,7 @@ func main() {
327353
ProgramableBoards: uploadableBords,
328354
}
329355

330-
serverHandler, err := server.New(&websocketBroker, endpointData, config.Server)
356+
serverHandler, err := server.New(upgrader, endpointData, config.Server)
331357
if err != nil {
332358
trace.Fatal().Err(err).Msg("Error creating server")
333359
panic(err)
@@ -542,16 +568,16 @@ func getOps(units utils.Units) data.ConversionDescriptor {
542568
return output
543569
}
544570

545-
type TransportAPI struct {
571+
type transportAPI struct {
546572
OnNotification func(abstraction.TransportNotification)
547573
OnConnectionUpdate func(abstraction.TransportTarget, bool)
548574
}
549575

550-
func (api *TransportAPI) Notification(notification abstraction.TransportNotification) {
576+
func (api *transportAPI) Notification(notification abstraction.TransportNotification) {
551577
api.OnNotification(notification)
552578
}
553579

554-
func (api *TransportAPI) ConnectionUpdate(target abstraction.TransportTarget, isConnected bool) {
580+
func (api *transportAPI) ConnectionUpdate(target abstraction.TransportTarget, isConnected bool) {
555581
api.OnConnectionUpdate(target, isConnected)
556582
}
557583

@@ -605,3 +631,11 @@ func getTCPFilter(addrs []net.IP, serverPort uint16, clientPort uint16) string {
605631
filter := fmt.Sprintf("(%s) and (%s) and (%s) and (%s) and (%s) and (%s)", ports, notSynFinRst, notJustAck, nonZeroPayload, srcAddressesStr, dstAddressesStr)
606632
return filter
607633
}
634+
635+
type brokerAPI struct {
636+
OnUserPush func(abstraction.BrokerPush)
637+
}
638+
639+
func (api *brokerAPI) UserPush(push abstraction.BrokerPush) {
640+
api.OnUserPush(push)
641+
}

backend/internal/server/handler.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ package server
33
import (
44
"fmt"
55
"sync"
6+
7+
"github.com/HyperloopUPV-H8/h9-backend/pkg/websocket"
68
)
79

810
type Handler struct {
@@ -11,15 +13,15 @@ type Handler struct {
1113
servers map[string]*WebServer
1214
}
1315

14-
func New(connections ConnectionHandler, data EndpointData, config Config) (*Handler, error) {
16+
func New(upgrader *websocket.Upgrader, data EndpointData, config Config) (*Handler, error) {
1517
handler := &Handler{
1618
config: config,
1719
serverMx: &sync.Mutex{},
1820
servers: make(map[string]*WebServer, len(config)),
1921
}
2022

2123
for name, serverConfig := range config {
22-
server, err := NewWebServer(name, connections, data, serverConfig)
24+
server, err := NewWebServer(name, upgrader, data, serverConfig)
2325
if err != nil {
2426
return nil, err
2527
}

backend/internal/server/server.go

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,16 @@ import (
55
"net/http"
66
"sync/atomic"
77

8+
"github.com/HyperloopUPV-H8/h9-backend/pkg/websocket"
89
"github.com/gorilla/mux"
9-
"github.com/gorilla/websocket"
1010
)
1111

1212
type WebServer struct {
13-
name string
14-
router *mux.Router
15-
connHandler ConnectionHandler
16-
connected *atomic.Int32
17-
config ServerConfig
13+
name string
14+
router *mux.Router
15+
upgrader *websocket.Upgrader
16+
connected *atomic.Int32
17+
config ServerConfig
1818
}
1919

2020
func NoCacheMiddleware(next http.Handler) http.Handler {
@@ -25,13 +25,13 @@ func NoCacheMiddleware(next http.Handler) http.Handler {
2525
})
2626
}
2727

28-
func NewWebServer(name string, connectionHandle ConnectionHandler, staticData EndpointData, config ServerConfig) (*WebServer, error) {
28+
func NewWebServer(name string, upgrader *websocket.Upgrader, staticData EndpointData, config ServerConfig) (*WebServer, error) {
2929
server := &WebServer{
30-
name: name,
31-
router: mux.NewRouter(),
32-
connHandler: connectionHandle,
33-
connected: &atomic.Int32{},
34-
config: config,
30+
name: name,
31+
router: mux.NewRouter(),
32+
upgrader: upgrader,
33+
connected: &atomic.Int32{},
34+
config: config,
3535
}
3636

3737
headers := map[string]string{
@@ -53,10 +53,7 @@ func NewWebServer(name string, connectionHandle ConnectionHandler, staticData En
5353
return nil, err
5454
}
5555

56-
upgrader := &websocket.Upgrader{
57-
CheckOrigin: func(r *http.Request) bool { return true },
58-
}
59-
server.serveWebsocket(config.Endpoints.Connections, upgrader, headers)
56+
server.router.Handle(config.Endpoints.Connections, server.upgrader)
6057
server.serveFiles(config.Endpoints.Files, config.StaticPath)
6158

6259
if err != nil {

backend/internal/server/websocket.go

Lines changed: 0 additions & 47 deletions
This file was deleted.

backend/pkg/broker/broker.go

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
package broker
2+
3+
import (
4+
"github.com/HyperloopUPV-H8/h9-backend/pkg/abstraction"
5+
"github.com/HyperloopUPV-H8/h9-backend/pkg/broker/topics"
6+
"github.com/HyperloopUPV-H8/h9-backend/pkg/websocket"
7+
)
8+
9+
var _ abstraction.Broker = &Broker{}
10+
11+
type Broker struct {
12+
topics map[abstraction.BrokerTopic]topics.Handler
13+
clients *websocket.Pool
14+
api abstraction.BrokerAPI
15+
}
16+
17+
func New() *Broker {
18+
return &Broker{
19+
topics: make(map[abstraction.BrokerTopic]topics.Handler),
20+
}
21+
}
22+
23+
func (broker *Broker) Push(push abstraction.BrokerPush) error {
24+
topic, ok := broker.topics[push.Topic()]
25+
if !ok {
26+
return ErrTopicNotFound{
27+
Topic: push.Topic(),
28+
}
29+
}
30+
31+
return topic.Push(push)
32+
}
33+
34+
func (broker *Broker) Pull(request abstraction.BrokerRequest) (abstraction.BrokerResponse, error) {
35+
topic, ok := broker.topics[request.Topic()]
36+
if !ok {
37+
return nil, ErrTopicNotFound{
38+
Topic: request.Topic(),
39+
}
40+
}
41+
42+
return topic.Pull(request)
43+
}
44+
45+
func (broker *Broker) SetAPI(api abstraction.BrokerAPI) {
46+
broker.api = api
47+
for _, topic := range broker.topics {
48+
topic.SetAPI(broker)
49+
}
50+
}
51+
52+
func (broker *Broker) SetPool(pool *websocket.Pool) {
53+
broker.clients = pool
54+
pool.SetOnMessage(broker.onMessage)
55+
for _, topic := range broker.topics {
56+
topic.SetPool(pool)
57+
}
58+
}
59+
60+
func (broker *Broker) AddTopic(topic abstraction.BrokerTopic, handler topics.Handler) {
61+
handler.SetAPI(broker)
62+
handler.SetPool(broker.clients)
63+
broker.topics[topic] = handler
64+
}
65+
66+
func (broker *Broker) onMessage(id websocket.ClientId, message *websocket.Message) {
67+
topic, ok := broker.topics[message.Topic]
68+
if !ok {
69+
return //TODO: handle error
70+
}
71+
72+
topic.ClientMessage(id, message)
73+
}
74+
75+
func (broker *Broker) UserPush(push abstraction.BrokerPush) {
76+
broker.api.UserPush(push)
77+
}

backend/pkg/broker/errors.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package broker
2+
3+
import (
4+
"github.com/HyperloopUPV-H8/h9-backend/pkg/abstraction"
5+
)
6+
7+
type ErrTopicNotFound struct {
8+
Topic abstraction.BrokerTopic
9+
}
10+
11+
func (err ErrTopicNotFound) Error() string {
12+
return "topic not found"
13+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package blcu
2+
3+
import (
4+
"github.com/HyperloopUPV-H8/h9-backend/pkg/abstraction"
5+
"github.com/HyperloopUPV-H8/h9-backend/pkg/websocket"
6+
)
7+
8+
const DownloadName abstraction.BrokerTopic = "blcu/download"
9+
10+
type Download struct {
11+
pool *websocket.Pool
12+
api abstraction.BrokerAPI
13+
}
14+
15+
func (download *Download) Topic() abstraction.BrokerTopic {
16+
return DownloadName
17+
}
18+
19+
func (download *Download) Push(push abstraction.BrokerPush) error {
20+
return nil
21+
}
22+
23+
func (download *Download) Pull(request abstraction.BrokerRequest) (abstraction.BrokerResponse, error) {
24+
return nil, nil
25+
}
26+
27+
func (download *Download) SetPool(pool *websocket.Pool) {
28+
download.pool = pool
29+
}
30+
31+
func (download *Download) SetAPI(api abstraction.BrokerAPI) {
32+
download.api = api
33+
}

0 commit comments

Comments
 (0)