39 lines
1.0 KiB
Go
39 lines
1.0 KiB
Go
package consensus
|
|
|
|
import (
|
|
"sync"
|
|
)
|
|
|
|
// MessageHandler é a função chamada quando uma mensagem é recebida.
|
|
type MessageHandler func(msg ConsensusMessage)
|
|
|
|
// Transport simula o envio e recebimento de mensagens de consenso entre nós.
|
|
type Transport struct {
|
|
handlersMu sync.RWMutex
|
|
handlers map[MessageType][]MessageHandler
|
|
}
|
|
|
|
// NewTransport cria um novo transporte de mensagens de consenso.
|
|
func NewTransport() *Transport {
|
|
return &Transport{
|
|
handlers: make(map[MessageType][]MessageHandler),
|
|
}
|
|
}
|
|
|
|
// Register adiciona um handler para um tipo de mensagem.
|
|
func (t *Transport) Register(msgType MessageType, handler MessageHandler) {
|
|
t.handlersMu.Lock()
|
|
defer t.handlersMu.Unlock()
|
|
t.handlers[msgType] = append(t.handlers[msgType], handler)
|
|
}
|
|
|
|
// Broadcast envia uma mensagem para todos os handlers registrados daquele tipo.
|
|
func (t *Transport) Broadcast(msg ConsensusMessage) {
|
|
t.handlersMu.RLock()
|
|
handlers := t.handlers[msg.Type()]
|
|
t.handlersMu.RUnlock()
|
|
|
|
for _, h := range handlers {
|
|
go h(msg) // Envia de forma assíncrona
|
|
}
|
|
} |