mirror of
https://github.com/kaspanet/kaspad.git
synced 2025-10-14 00:59:33 +00:00

* [NOD-1126] Implement block relay flow * [NOD-1126] Implement block relay flow * [NOD-1126] Add StartGetRelayBlocksListener * [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 * [NOD-1137] Implement handshake * [NOD-1137] Replace version's nonce with ID * [NOD-1137] Remove redundant function * [NOD-1137] Move handshake to a separate file * [NOD-1137] Add todo * [NOD-1137] Replace peer internal id with global peer ID * [NOD-1137] Add serializer/deserializer to ID * [NOD-1137] Remove validation from AddUserAgent * [NOD-1137] Add missing id package * [NOD-1137] Rename variables * [NOD-1137] Add comment * [NOD-1137] Implement GetBestLocalAddress * [NOD-1137] Implement TODOs * [NOD-1137] Rename variables * [NOD-1137] Move errors.Is inside err!=nil branch * [NOD-1137] Fix erroneous condition on Dequeue * [NOD-1137] Fix bug in GetReadyPeerIDs * [NOD-1137] Handle external IP on GetBestLocalAddress * [NOD-1137] Remove version and verack message types when handshake is over * [NOD-1137] Add FromBytes to id package * [NOD-1137] Add protocol error * [NOD-1137] Add ErrTimeout * [NOD-1137] Log error only if exists * [NOD-1137] Replace idFromBytes->id.FromBytes * [NOD-1137] Add comments * [NOD-1137] Remove ErrTimeout * [NOD-1137] Unremove ErrTimeout * [NOD-1137] Change comment * [NOD-1137] Use EnqueueWithTimeout everywhere in protocol
97 lines
2.3 KiB
Go
97 lines
2.3 KiB
Go
package router
|
|
|
|
import (
|
|
"github.com/kaspanet/kaspad/wire"
|
|
"github.com/pkg/errors"
|
|
"time"
|
|
)
|
|
|
|
const (
|
|
maxMessages = 100
|
|
)
|
|
|
|
// ErrTimeout signifies that one of the router functions had a timeout.
|
|
var ErrTimeout = errors.New("timeout expired")
|
|
|
|
// onCapacityReachedHandler is a function that is to be
|
|
// called when a route reaches capacity.
|
|
type onCapacityReachedHandler func()
|
|
|
|
// Route represents an incoming or outgoing Router route
|
|
type Route struct {
|
|
channel chan wire.Message
|
|
closed bool
|
|
|
|
onCapacityReachedHandler onCapacityReachedHandler
|
|
}
|
|
|
|
// NewRoute create a new Route
|
|
func NewRoute() *Route {
|
|
return &Route{
|
|
channel: make(chan wire.Message, maxMessages),
|
|
closed: false,
|
|
}
|
|
}
|
|
|
|
// Enqueue enqueues a message to the Route
|
|
func (r *Route) Enqueue(message wire.Message) (isOpen bool) {
|
|
if r.closed {
|
|
return false
|
|
}
|
|
if len(r.channel) == maxMessages {
|
|
r.onCapacityReachedHandler()
|
|
}
|
|
r.channel <- message
|
|
return true
|
|
}
|
|
|
|
// Dequeue dequeues a message from the Route
|
|
func (r *Route) Dequeue() (message wire.Message, isOpen bool) {
|
|
if r.closed {
|
|
return nil, false
|
|
}
|
|
return <-r.channel, true
|
|
}
|
|
|
|
// EnqueueWithTimeout attempts to enqueue a message to the Route
|
|
// and returns an error if the given timeout expires first.
|
|
func (r *Route) EnqueueWithTimeout(message wire.Message, timeout time.Duration) (isOpen bool, err error) {
|
|
if r.closed {
|
|
return false, nil
|
|
}
|
|
if len(r.channel) == maxMessages {
|
|
r.onCapacityReachedHandler()
|
|
}
|
|
select {
|
|
case <-time.After(timeout):
|
|
return false, errors.Wrapf(ErrTimeout, "got timeout after %s", timeout)
|
|
case r.channel <- message:
|
|
return true, nil
|
|
}
|
|
}
|
|
|
|
// DequeueWithTimeout attempts to dequeue a message from the Route
|
|
// and returns an error if the given timeout expires first.
|
|
func (r *Route) DequeueWithTimeout(timeout time.Duration) (message wire.Message, isOpen bool, err error) {
|
|
if r.closed {
|
|
return nil, false, nil
|
|
}
|
|
select {
|
|
case <-time.After(timeout):
|
|
return nil, false, errors.Wrapf(ErrTimeout, "got timeout after %s", timeout)
|
|
case message := <-r.channel:
|
|
return message, true, nil
|
|
}
|
|
}
|
|
|
|
func (r *Route) setOnCapacityReachedHandler(onCapacityReachedHandler onCapacityReachedHandler) {
|
|
r.onCapacityReachedHandler = onCapacityReachedHandler
|
|
}
|
|
|
|
// Close closes this route
|
|
func (r *Route) Close() error {
|
|
r.closed = true
|
|
close(r.channel)
|
|
return nil
|
|
}
|