Files
mvds/transport/channel_transport.go
Dean Eigenmann 4046fbed44 enhancement/node-stopping (#46)
* made node stoppable

* updated

* added todo

* comments

* remove/ecsda (#50)
2019-06-14 09:49:56 -04:00

54 lines
1.2 KiB
Go

package transport
import (
"errors"
math "math/rand"
"sync"
"time"
"github.com/status-im/mvds/protobuf"
"github.com/status-im/mvds/state"
)
// ChannelTransport implements a basic MVDS transport using channels for basic testing purposes.
type ChannelTransport struct {
sync.Mutex
offline int
in <-chan Packet
out map[state.PeerID]chan<- Packet
}
func NewChannelTransport(offline int, in <-chan Packet) *ChannelTransport {
return &ChannelTransport{
offline: offline,
in: in,
out: make(map[state.PeerID]chan<- Packet),
}
}
func (t *ChannelTransport) AddOutput(id state.PeerID, c chan<-Packet) {
t.out[id] = c
}
func (t *ChannelTransport) Watch() Packet {
return <-t.in
}
func (t *ChannelTransport) Send(group state.GroupID, sender state.PeerID, peer state.PeerID, payload protobuf.Payload) error {
// @todo we can do this better, we put node onlineness into a goroutine where we just stop the nodes for x seconds
// outside of this class
math.Seed(time.Now().UnixNano())
if math.Intn(100) < t.offline {
return nil
}
c, ok := t.out[peer]
if !ok {
return errors.New("peer unknown")
}
c <- Packet{Group: group, Sender: sender, Payload: payload}
return nil
}