mirror of
https://github.com/vacp2p/mvds.git
synced 2026-01-08 19:48:03 -05:00
This commits changes the behavior so that we don't rely on the presence of GroupID in the payload. Adds some tests to verify the basic functionalities of BATCH and INTERACTIVE mode, but more are required to ensure the correct functioning. Error handling and state management is probably also to be inspected more carefully.
94 lines
1.8 KiB
Go
94 lines
1.8 KiB
Go
package node
|
|
|
|
import (
|
|
"sync"
|
|
|
|
"github.com/vacp2p/mvds/protobuf"
|
|
"github.com/vacp2p/mvds/state"
|
|
)
|
|
|
|
type payloads struct {
|
|
sync.Mutex
|
|
|
|
payloads map[state.PeerID]protobuf.Payload
|
|
}
|
|
|
|
// @todo check in all the functions below that we aren't duplicating stuff
|
|
|
|
func newPayloads() payloads {
|
|
return payloads{
|
|
payloads: make(map[state.PeerID]protobuf.Payload),
|
|
}
|
|
}
|
|
|
|
func (p *payloads) AddOffers(peer state.PeerID, offers ...[]byte) {
|
|
p.Lock()
|
|
defer p.Unlock()
|
|
|
|
payload := p.get(peer)
|
|
|
|
payload.Offers = append(payload.Offers, offers...)
|
|
|
|
p.set(peer, payload)
|
|
}
|
|
|
|
func (p *payloads) AddAcks(peer state.PeerID, acks [][]byte) {
|
|
p.Lock()
|
|
defer p.Unlock()
|
|
|
|
payload := p.get(peer)
|
|
|
|
payload.Acks = append(payload.Acks, acks...)
|
|
|
|
p.set(peer, payload)
|
|
}
|
|
|
|
func (p *payloads) AddRequests(peer state.PeerID, request ...[]byte) {
|
|
p.Lock()
|
|
defer p.Unlock()
|
|
|
|
payload := p.get(peer)
|
|
|
|
payload.Requests = append(payload.Requests, request...)
|
|
|
|
p.set(peer, payload)
|
|
}
|
|
|
|
func (p *payloads) AddMessages(peer state.PeerID, messages ...*protobuf.Message) {
|
|
p.Lock()
|
|
defer p.Unlock()
|
|
|
|
payload := p.get(peer)
|
|
if payload.Messages == nil {
|
|
payload.Messages = make([]*protobuf.Message, 0)
|
|
}
|
|
|
|
payload.Messages = append(payload.Messages, messages...)
|
|
p.set(peer, payload)
|
|
}
|
|
|
|
func (p *payloads) MapAndClear(f func(state.PeerID, protobuf.Payload) error) error {
|
|
p.Lock()
|
|
defer p.Unlock()
|
|
|
|
for peer, payload := range p.payloads {
|
|
err := f(peer, payload)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
// TODO: this should only be called upon confirmation that the message has been sent
|
|
p.payloads = make(map[state.PeerID]protobuf.Payload)
|
|
return nil
|
|
}
|
|
|
|
func (p *payloads) get(peer state.PeerID) protobuf.Payload {
|
|
payload, _ := p.payloads[peer]
|
|
return payload
|
|
}
|
|
|
|
func (p *payloads) set(peer state.PeerID, payload protobuf.Payload) {
|
|
p.payloads[peer] = payload
|
|
}
|