diff --git a/waku/common/envelope.go b/waku/common/envelope.go new file mode 100644 index 0000000..dbf80cb --- /dev/null +++ b/waku/common/envelope.go @@ -0,0 +1,79 @@ +package common + +import ( + "encoding/json" + + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/waku-org/go-waku/waku/v2/protocol/pb" +) + +// Envelope contains information about the pubsub topic of a WakuMessage +// and a hash used to identify a message based on the bytes of a WakuMessage +// protobuffer +type Envelope interface { + Message() *pb.WakuMessage + PubsubTopic() string + Hash() pb.MessageHash +} + +type envelopeImpl struct { + msg *pb.WakuMessage + topic string + hash pb.MessageHash +} + +type tmpWakuMessageJson struct { + Payload []byte `json:"payload,omitempty"` + ContentTopic string `json:"contentTopic,omitempty"` + Version *uint32 `json:"version,omitempty"` + Timestamp *int64 `json:"timestamp,omitempty"` + Meta []byte `json:"meta,omitempty"` + Ephemeral *bool `json:"ephemeral,omitempty"` + RateLimitProof []byte `json:"proof,omitempty"` +} + +type tmpEnvelopeStruct struct { + WakuMessage tmpWakuMessageJson `json:"wakuMessage"` + PubsubTopic string `json:"pubsubTopic"` + MessageHash string `json:"messageHash"` +} + +// NewEnvelope creates a new Envelope from a json string generated in nwaku +func NewEnvelope(jsonEventStr string) (Envelope, error) { + tmpEnvelopeStruct := tmpEnvelopeStruct{} + err := json.Unmarshal([]byte(jsonEventStr), &tmpEnvelopeStruct) + if err != nil { + return nil, err + } + + hash, err := hexutil.Decode(tmpEnvelopeStruct.MessageHash) + if err != nil { + return nil, err + } + + return &envelopeImpl{ + msg: &pb.WakuMessage{ + Payload: tmpEnvelopeStruct.WakuMessage.Payload, + ContentTopic: tmpEnvelopeStruct.WakuMessage.ContentTopic, + Version: tmpEnvelopeStruct.WakuMessage.Version, + Timestamp: tmpEnvelopeStruct.WakuMessage.Timestamp, + Meta: tmpEnvelopeStruct.WakuMessage.Meta, + Ephemeral: tmpEnvelopeStruct.WakuMessage.Ephemeral, + RateLimitProof: tmpEnvelopeStruct.WakuMessage.RateLimitProof, + }, + topic: tmpEnvelopeStruct.PubsubTopic, + hash: pb.ToMessageHash(hash), + }, nil +} + +func (e *envelopeImpl) Message() *pb.WakuMessage { + return e.msg +} + +func (e *envelopeImpl) PubsubTopic() string { + return e.topic +} + +func (e *envelopeImpl) Hash() pb.MessageHash { + return e.hash +} diff --git a/waku/nwaku.go b/waku/nwaku.go index 23552d9..f1a2885 100644 --- a/waku/nwaku.go +++ b/waku/nwaku.go @@ -322,6 +322,7 @@ import ( "github.com/waku-org/go-waku/waku/v2/protocol/pb" storepb "github.com/waku-org/go-waku/waku/v2/protocol/store/pb" "github.com/waku-org/go-waku/waku/v2/utils" + "github.com/waku-org/waku-go-bindings/waku/common" "go.uber.org/zap" ) @@ -444,17 +445,12 @@ func GoCallback(ret C.int, msg *C.char, len C.size_t, resp unsafe.Pointer) { } } -type MessageData struct { - Msg pb.WakuMessage - PubsubTopic string -} - // WakuNode represents an instance of an nwaku node type WakuNode struct { wakuCtx unsafe.Pointer logger *zap.Logger cancel context.CancelFunc - MsgChan chan MessageData + MsgChan chan common.Envelope } func newWakuNode(ctx context.Context, config *WakuConfig, logger *zap.Logger) (*WakuNode, error) { @@ -498,7 +494,7 @@ func newWakuNode(ctx context.Context, config *WakuConfig, logger *zap.Logger) (* wg.Add(1) n.wakuCtx = C.cGoWakuNew(cJsonConfig, resp) - n.MsgChan = make(chan MessageData, 100) + n.MsgChan = make(chan common.Envelope, 100) n.logger = logger.Named("nwaku") wg.Wait()