Files
Igor Sirotin 5e5e66a969 fix: decode the kernel wire shapes the library actually sends
Three bugs the kernel suite never caught, because CI only compiles it.

A peer's addresses were comma-joined into one argument, but the library
inits that argument as a single multiaddress, so StoreQuery and PingPeer
failed against any peer advertising more than one address.

StoreQueryResponse could decode neither the Opt[T] wrapper objects the
library renders results.Opt as, nor the integer arrays it renders
seq[byte] as, so every store reply failed to unmarshal. Both shapes now
decode, and the bare value still does.

A context without a deadline sent timeoutMs=0, which chronos' withTimeout
expires on immediately rather than treating as unbounded. StoreQuery with
context.Background() could never have succeeded.
2026-08-24 18:04:40 +01:00

68 lines
1.8 KiB
Go

package common
import (
"encoding/json"
"github.com/logos-messaging/logos-delivery-go-bindings/pkg/kernel/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 struct {
msg *pb.WakuMessage
topic string
hash MessageHash
}
type wakuMessage struct {
Payload wireBytes `json:"payload,omitempty"`
ContentTopic string `json:"contentTopic,omitempty"`
Version *uint32 `json:"version,omitempty"`
Timestamp *int64 `json:"timestamp,omitempty"`
Meta wireBytes `json:"meta,omitempty"`
Ephemeral *bool `json:"ephemeral,omitempty"`
RateLimitProof wireBytes `json:"proof,omitempty"`
}
type wakuEnvelope struct {
WakuMessage wakuMessage `json:"wakuMessage"`
PubsubTopic string `json:"pubsubTopic"`
MessageHash MessageHash `json:"messageHash"`
}
// UnmarshalJSON implements the json.Unmarshaler interface
func (e *Envelope) UnmarshalJSON(input []byte) error {
wakuEnvelope := wakuEnvelope{}
err := json.Unmarshal(input, &wakuEnvelope)
if err != nil {
return err
}
e.msg = &pb.WakuMessage{
Payload: wakuEnvelope.WakuMessage.Payload,
ContentTopic: wakuEnvelope.WakuMessage.ContentTopic,
Version: wakuEnvelope.WakuMessage.Version,
Timestamp: wakuEnvelope.WakuMessage.Timestamp,
Meta: wakuEnvelope.WakuMessage.Meta,
Ephemeral: wakuEnvelope.WakuMessage.Ephemeral,
RateLimitProof: wakuEnvelope.WakuMessage.RateLimitProof,
}
e.topic = wakuEnvelope.PubsubTopic
e.hash = wakuEnvelope.MessageHash
return nil
}
func (e *Envelope) Message() *pb.WakuMessage {
return e.msg
}
func (e *Envelope) PubsubTopic() string {
return e.topic
}
func (e *Envelope) Hash() MessageHash {
return e.hash
}