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 }