kaspad/netadapter/router.go
Ori Newman 433cdb6006
[NOD-1126] implement block relay flow (#786)
* [NOD-1126] Implement block relay flow

* [NOD-1126] Add StartGetRelayBlocksListener

* [NOD-1126] Implement block relay flow

* [NOD-1126] Integrate with new interface

* [NOD-1126] Fix comments

* [NOD-1126] Refactor protocol.go

* [NOD-1126] Split long lines

* [NOD-1126] Fix comment

* [NOD-1126] move sharedRequestedBlocks to a separate file

* [NOD-1126] Fix error message

* [NOD-1126] Move handleInv to StartBlockRelay

* [NOD-1126] Create hashesQueueSet type

* [NOD-1126] Make deleteFromRequestedBlocks a method

* [NOD-1126] Fix comment

* [NOD-1126] Add block logger

* [NOD-1126] Rename advertisedProtoVer->advertisedProtocolVer

* [NOD-1126] Fix comment and an error message

* [NOD-1126] Remove redundant loop

* [NOD-1126] Move requestBlocks upper

* [NOD-1126] Remove exiting blocks in requestedBlocks from hashesToRequest

* [NOD-1126] Change comment

* [NOD-1126] Rename stallResponseTimeout->timeout

* [NOD-1126] Use switch inside readMsgBlock

* [NOD-1126] Fix error message and remove redundant log

* [NOD-1126] Rename pacakge names

* [NOD-1126] Fix comment

* [NOD-1126] Change file names

* [NOD-1126] Convert block to partial if needed

* [NOD-1126] Remove function redeclaration

* [NOD-1126] continue instead of return

* [NOD-1126] Rename LogBlockBlueScore->LogBlock

* [NOD-1126] Add minimum functions to utils

* [NOD-1126] Flip condition on readInv

* [NOD-1126] Rename utilMath->mathUtil

* [NOD-1126] Fix comment
2020-07-12 16:11:42 +03:00

97 lines
2.7 KiB
Go

package netadapter
import (
"github.com/kaspanet/kaspad/wire"
"github.com/pkg/errors"
)
// OnIDReceivedHandler is a function that is to be called
// once a new Connection sends us its ID.
type OnIDReceivedHandler func(id *ID)
// Router routes messages by type to their respective
// input channels
type Router struct {
incomingRoutes map[string]chan<- wire.Message
outgoingRoute chan wire.Message
onIDReceivedHandler OnIDReceivedHandler
}
// NewRouter creates a new empty router
func NewRouter() *Router {
return &Router{
incomingRoutes: make(map[string]chan<- wire.Message),
outgoingRoute: make(chan wire.Message),
}
}
// SetOnIDReceivedHandler sets the onIDReceivedHandler function for
// this router
func (r *Router) SetOnIDReceivedHandler(onIDReceivedHandler OnIDReceivedHandler) {
r.onIDReceivedHandler = onIDReceivedHandler
}
// AddRoute registers the messages of types `messageTypes` to
// be routed to the given `inputChannel`
func (r *Router) AddRoute(messageTypes []string, inputChannel chan<- wire.Message) error {
for _, messageType := range messageTypes {
if _, ok := r.incomingRoutes[messageType]; ok {
return errors.Errorf("a route for '%s' already exists", messageType)
}
r.incomingRoutes[messageType] = inputChannel
}
return nil
}
// RemoveRoute unregisters the messages of types `messageTypes` from
// the router
func (r *Router) RemoveRoute(messageTypes []string) error {
for _, messageType := range messageTypes {
if _, ok := r.incomingRoutes[messageType]; !ok {
return errors.Errorf("a route for '%s' does not exist", messageType)
}
delete(r.incomingRoutes, messageType)
}
return nil
}
// RouteIncomingMessage sends the given message to the correct input
// channel as registered with AddRoute
func (r *Router) RouteIncomingMessage(message wire.Message) error {
routeInChannel, ok := r.incomingRoutes[message.Command()]
if !ok {
return errors.Errorf("a route for '%s' does not exist", message.Command())
}
routeInChannel <- message
return nil
}
// ReadOutgoingMessage takes the next output message from
// the output channel
func (r *Router) ReadOutgoingMessage() wire.Message {
return <-r.outgoingRoute
}
// WriteOutgoingMessage pushes the given message to the output route
func (r *Router) WriteOutgoingMessage(message wire.Message) {
r.outgoingRoute <- message
}
// RegisterID registers the remote connection's ID
func (r *Router) RegisterID(id *ID) {
r.onIDReceivedHandler(id)
}
// Close shuts down the router by closing all registered
// input channels
func (r *Router) Close() error {
inChannels := make(map[chan<- wire.Message]struct{})
for _, inChannel := range r.incomingRoutes {
inChannels[inChannel] = struct{}{}
}
for inChannel := range inChannels {
close(inChannel)
}
return nil
}