github.com/status-im/status-go@v1.1.0/protocol/datasync/datasync.go (about)

     1  package datasync
     2  
     3  import (
     4  	"crypto/ecdsa"
     5  	"errors"
     6  
     7  	"github.com/golang/protobuf/proto"
     8  	datasyncnode "github.com/status-im/mvds/node"
     9  	"github.com/status-im/mvds/protobuf"
    10  	datasyncproto "github.com/status-im/mvds/protobuf"
    11  	datasynctransport "github.com/status-im/mvds/transport"
    12  	"go.uber.org/zap"
    13  
    14  	datasyncpeer "github.com/status-im/status-go/protocol/datasync/peer"
    15  )
    16  
    17  type DataSync struct {
    18  	*datasyncnode.Node
    19  	// NodeTransport is the implementation of the datasync transport interface.
    20  	*NodeTransport
    21  	logger         *zap.Logger
    22  	sendingEnabled bool
    23  }
    24  
    25  func New(node *datasyncnode.Node, transport *NodeTransport, sendingEnabled bool, logger *zap.Logger) *DataSync {
    26  	return &DataSync{Node: node, NodeTransport: transport, sendingEnabled: sendingEnabled, logger: logger}
    27  }
    28  
    29  // Unwrap tries to unwrap datasync message and passes back the message to datasync in order to acknowledge any potential message and mark messages as acknowledged
    30  func (d *DataSync) Unwrap(sender *ecdsa.PublicKey, payload []byte) (*protobuf.Payload, error) {
    31  	logger := d.logger.With(zap.String("site", "Handle"))
    32  
    33  	datasyncMessage, err := unwrap(payload)
    34  	// If it failed to decode is not a protobuf message, if it successfully decoded but body is empty, is likedly a protobuf wrapped message
    35  	if err != nil {
    36  		logger.Debug("Unwrapping datasync message failed", zap.Error(err))
    37  		return nil, err
    38  	} else if !datasyncMessage.IsValid() {
    39  		return nil, errors.New("handling non-datasync message")
    40  	} else {
    41  		logger.Debug("handling datasync message")
    42  		if d.sendingEnabled {
    43  			d.add(sender, &datasyncMessage)
    44  		}
    45  	}
    46  
    47  	return &datasyncMessage, nil
    48  }
    49  
    50  func (d *DataSync) Stop() {
    51  	d.Node.Stop()
    52  }
    53  
    54  func (d *DataSync) add(publicKey *ecdsa.PublicKey, datasyncMessage *datasyncproto.Payload) {
    55  	packet := datasynctransport.Packet{
    56  		Sender:  datasyncpeer.PublicKeyToPeerID(*publicKey),
    57  		Payload: datasyncMessage,
    58  	}
    59  	d.NodeTransport.AddPacket(packet)
    60  }
    61  
    62  func unwrap(payload []byte) (datasyncPayload datasyncproto.Payload, err error) {
    63  	err = proto.Unmarshal(payload, &datasyncPayload)
    64  	return
    65  }