github.com/prysmaticlabs/prysm@v1.4.4/beacon-chain/p2p/sender.go (about) 1 package p2p 2 3 import ( 4 "context" 5 6 "github.com/libp2p/go-libp2p-core/network" 7 "github.com/libp2p/go-libp2p-core/peer" 8 "github.com/libp2p/go-libp2p-core/protocol" 9 "github.com/prysmaticlabs/prysm/shared/traceutil" 10 "go.opencensus.io/trace" 11 ) 12 13 // Send a message to a specific peer. The returned stream may be used for reading, but has been 14 // closed for writing. 15 // 16 // When done, the caller must Close or Reset on the stream. 17 func (s *Service) Send(ctx context.Context, message interface{}, baseTopic string, pid peer.ID) (network.Stream, error) { 18 ctx, span := trace.StartSpan(ctx, "p2p.Send") 19 defer span.End() 20 if err := VerifyTopicMapping(baseTopic, message); err != nil { 21 return nil, err 22 } 23 topic := baseTopic + s.Encoding().ProtocolSuffix() 24 span.AddAttributes(trace.StringAttribute("topic", topic)) 25 26 // Apply max dial timeout when opening a new stream. 27 ctx, cancel := context.WithTimeout(ctx, maxDialTimeout) 28 defer cancel() 29 30 stream, err := s.host.NewStream(ctx, pid, protocol.ID(topic)) 31 if err != nil { 32 traceutil.AnnotateError(span, err) 33 return nil, err 34 } 35 // do not encode anything if we are sending a metadata request 36 if baseTopic != RPCMetaDataTopicV1 { 37 if _, err := s.Encoding().EncodeWithMaxLength(stream, message); err != nil { 38 traceutil.AnnotateError(span, err) 39 _err := stream.Reset() 40 _ = _err 41 return nil, err 42 } 43 } 44 45 // Close stream for writing. 46 if err := stream.CloseWrite(); err != nil { 47 traceutil.AnnotateError(span, err) 48 _err := stream.Reset() 49 _ = _err 50 return nil, err 51 } 52 53 return stream, nil 54 }