2022-10-07 11:04:48 +03:00

67 lines
1.3 KiB
Go

package consensusclient
import (
"github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/consensusproto"
"github.com/cheggaaa/mb/v2"
)
type Stream interface {
WatchIds(logIds [][]byte) (err error)
UnwatchIds(logIds [][]byte) (err error)
WaitLogs() []*consensusproto.Log
Close() error
}
func runStream(rpcStream consensusproto.DRPCConsensus_WatchLogClient) Stream {
st := &stream{
rpcStream: rpcStream,
mb: mb.New((*consensusproto.Log)(nil), 100),
}
go st.readStream()
return st
}
type stream struct {
rpcStream consensusproto.DRPCConsensus_WatchLogClient
mb *mb.MB[*consensusproto.Log]
}
func (s *stream) WatchIds(logIds [][]byte) (err error) {
return s.rpcStream.Send(&consensusproto.WatchLogRequest{
WatchIds: logIds,
})
}
func (s *stream) UnwatchIds(logIds [][]byte) (err error) {
return s.rpcStream.Send(&consensusproto.WatchLogRequest{
UnwatchIds: logIds,
})
}
func (s *stream) WaitLogs() []*consensusproto.Log {
return s.mb.Wait()
}
func (s *stream) readStream() {
defer s.Close()
for {
event, err := s.rpcStream.Recv()
if err != nil {
return
}
if err = s.mb.Add(&consensusproto.Log{
Id: event.LogId,
Records: event.Records,
}); err != nil {
return
}
}
}
func (s *stream) Close() error {
if err := s.mb.Close(); err == nil {
return s.rpcStream.Close()
}
return nil
}