Refactor Channel message handler management to use structured entries with IDs for easier identification. Update AddMessageHandler and RemoveMessageHandler methods accordingly, and adjust tests to validate new functionality.
This commit is contained in:
@@ -67,7 +67,13 @@ type Channel struct {
|
|||||||
maxTries int
|
maxTries int
|
||||||
fastRateRounds int
|
fastRateRounds int
|
||||||
medRateRounds int
|
medRateRounds int
|
||||||
messageHandlers []func(MessageBase) bool
|
messageHandlers []messageHandlerEntry
|
||||||
|
nextHandlerID int
|
||||||
|
}
|
||||||
|
|
||||||
|
type messageHandlerEntry struct {
|
||||||
|
id int
|
||||||
|
handler func(MessageBase) bool
|
||||||
}
|
}
|
||||||
|
|
||||||
// Envelope wraps a message with metadata for transmission
|
// Envelope wraps a message with metadata for transmission
|
||||||
@@ -84,7 +90,7 @@ type Envelope struct {
|
|||||||
func NewChannel(link transport.LinkInterface) *Channel {
|
func NewChannel(link transport.LinkInterface) *Channel {
|
||||||
return &Channel{
|
return &Channel{
|
||||||
link: link,
|
link: link,
|
||||||
messageHandlers: make([]func(MessageBase) bool, 0),
|
messageHandlers: make([]messageHandlerEntry, 0),
|
||||||
mutex: sync.RWMutex{},
|
mutex: sync.RWMutex{},
|
||||||
windowMax: WindowMaxSlow,
|
windowMax: WindowMaxSlow,
|
||||||
windowMin: WindowMinSlow,
|
windowMin: WindowMinSlow,
|
||||||
@@ -177,17 +183,20 @@ func (c *Channel) getPacketTimeout(tries int) time.Duration {
|
|||||||
return time.Duration(timeout * float64(time.Second))
|
return time.Duration(timeout * float64(time.Second))
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Channel) AddMessageHandler(handler func(MessageBase) bool) {
|
func (c *Channel) AddMessageHandler(handler func(MessageBase) bool) int {
|
||||||
c.mutex.Lock()
|
c.mutex.Lock()
|
||||||
defer c.mutex.Unlock()
|
defer c.mutex.Unlock()
|
||||||
c.messageHandlers = append(c.messageHandlers, handler)
|
id := c.nextHandlerID
|
||||||
|
c.nextHandlerID++
|
||||||
|
c.messageHandlers = append(c.messageHandlers, messageHandlerEntry{id: id, handler: handler})
|
||||||
|
return id
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Channel) RemoveMessageHandler(handler func(MessageBase) bool) {
|
func (c *Channel) RemoveMessageHandler(id int) {
|
||||||
c.mutex.Lock()
|
c.mutex.Lock()
|
||||||
defer c.mutex.Unlock()
|
defer c.mutex.Unlock()
|
||||||
for i, h := range c.messageHandlers {
|
for i, entry := range c.messageHandlers {
|
||||||
if &h == &handler {
|
if entry.id == id {
|
||||||
c.messageHandlers = append(c.messageHandlers[:i], c.messageHandlers[i+1:]...)
|
c.messageHandlers = append(c.messageHandlers[:i], c.messageHandlers[i+1:]...)
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
@@ -236,14 +245,14 @@ func (c *Channel) HandleInbound(data []byte) error {
|
|||||||
c.mutex.Lock()
|
c.mutex.Lock()
|
||||||
defer c.mutex.Unlock()
|
defer c.mutex.Unlock()
|
||||||
|
|
||||||
for _, handler := range c.messageHandlers {
|
for _, entry := range c.messageHandlers {
|
||||||
if handler != nil {
|
if entry.handler != nil {
|
||||||
msg := &GenericMessage{
|
msg := &GenericMessage{
|
||||||
Type: msgType,
|
Type: msgType,
|
||||||
Data: msgData,
|
Data: msgData,
|
||||||
Seq: sequence,
|
Seq: sequence,
|
||||||
}
|
}
|
||||||
if handler(msg) {
|
if entry.handler(msg) {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -95,19 +95,20 @@ func TestHandleInbound(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestMessageHandlers(t *testing.T) {
|
func TestMessageHandlers(t *testing.T) {
|
||||||
c := &Channel{}
|
c := &Channel{
|
||||||
|
messageHandlers: make([]messageHandlerEntry, 0),
|
||||||
|
}
|
||||||
h := func(m MessageBase) bool { return true }
|
h := func(m MessageBase) bool { return true }
|
||||||
|
|
||||||
c.AddMessageHandler(h)
|
id := c.AddMessageHandler(h)
|
||||||
if len(c.messageHandlers) != 1 {
|
if len(c.messageHandlers) != 1 {
|
||||||
t.Errorf("Expected 1 handler, got %d", len(c.messageHandlers))
|
t.Errorf("Expected 1 handler, got %d", len(c.messageHandlers))
|
||||||
}
|
}
|
||||||
|
|
||||||
// RemoveMessageHandler in channel.go uses &h == &handler which is tricky
|
c.RemoveMessageHandler(id)
|
||||||
// for function comparisons. Let's see if it works.
|
if len(c.messageHandlers) != 0 {
|
||||||
c.RemoveMessageHandler(h)
|
t.Errorf("Expected 0 handlers, got %d", len(c.messageHandlers))
|
||||||
// It likely won't work as expected because of how Go handles function pointers
|
}
|
||||||
// and closures in comparisons. But we're testing the code as is.
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestGenericMessage(t *testing.T) {
|
func TestGenericMessage(t *testing.T) {
|
||||||
|
|||||||
Reference in New Issue
Block a user