whisper/libp2p/stream.go
2018-11-01 08:51:06 +02:00

63 lines
1.1 KiB
Go

package libp2p
import (
"bytes"
"io"
"time"
"github.com/ethereum/go-ethereum/p2p"
"github.com/ethereum/go-ethereum/rlp"
net "github.com/libp2p/go-libp2p-net"
)
func NewStream(s net.Stream, r, w time.Duration) Stream {
return Stream{
s: s,
rlp: rlp.NewStream(s, 0),
readTimeout: r,
writeTimeout: w,
}
}
type Stream struct {
readTimeout, writeTimeout time.Duration
rlp *rlp.Stream
s net.Stream
}
func (s Stream) ReadMsg() (msg p2p.Msg, err error) {
if s.readTimeout != 0 {
if err = s.s.SetReadDeadline(time.Now().Add(s.readTimeout)); err != nil {
return
}
}
code, err := s.rlp.Uint()
if err != nil {
return
}
payload, err := s.rlp.Raw()
if err != nil {
return
}
return p2p.Msg{
Code: code,
Size: uint32(len(payload)),
Payload: bytes.NewReader(payload),
ReceivedAt: time.Now(),
}, nil
}
func (s Stream) WriteMsg(msg p2p.Msg) (err error) {
if s.writeTimeout != 0 {
if err = s.s.SetWriteDeadline(time.Now().Add(s.writeTimeout)); err != nil {
return
}
}
if err = rlp.Encode(s.s, msg.Code); err != nil {
return
}
_, err = io.Copy(s.s, msg.Payload)
return
}