61 lines
1.2 KiB
Go
61 lines
1.2 KiB
Go
package shell
|
|
|
|
import (
|
|
"encoding/json"
|
|
"io"
|
|
|
|
"github.com/libp2p/go-libp2p-core/peer"
|
|
)
|
|
|
|
// Message is a pubsub message.
|
|
type Message struct {
|
|
From peer.ID
|
|
Data []byte
|
|
Seqno []byte
|
|
TopicIDs []string
|
|
}
|
|
|
|
// PubSubSubscription allow you to receive pubsub records that where published on the network.
|
|
type PubSubSubscription struct {
|
|
resp io.Closer
|
|
dec *json.Decoder
|
|
}
|
|
|
|
func newPubSubSubscription(resp io.ReadCloser) *PubSubSubscription {
|
|
return &PubSubSubscription{
|
|
resp: resp,
|
|
dec: json.NewDecoder(resp),
|
|
}
|
|
}
|
|
|
|
// Next waits for the next record and returns that.
|
|
func (s *PubSubSubscription) Next() (*Message, error) {
|
|
var r struct {
|
|
From []byte `json:"from,omitempty"`
|
|
Data []byte `json:"data,omitempty"`
|
|
Seqno []byte `json:"seqno,omitempty"`
|
|
TopicIDs []string `json:"topicIDs,omitempty"`
|
|
}
|
|
|
|
err := s.dec.Decode(&r)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
from, err := peer.IDFromBytes(r.From)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return &Message{
|
|
From: from,
|
|
Data: r.Data,
|
|
Seqno: r.Seqno,
|
|
TopicIDs: r.TopicIDs,
|
|
}, nil
|
|
}
|
|
|
|
// Cancel cancels the given subscription.
|
|
func (s *PubSubSubscription) Cancel() error {
|
|
return s.resp.Close()
|
|
}
|