mirror of
https://github.com/status-im/whisper.git
synced 2025-02-22 23:48:09 +00:00
63 lines
1.1 KiB
Go
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
|
|
}
|