github.com/ava-labs/avalanchego@v1.11.11/vms/rpcchainvm/ghttp/gconn/conn_server.go (about)

     1  // Copyright (C) 2019-2024, Ava Labs, Inc. All rights reserved.
     2  // See the file LICENSE for licensing terms.
     3  
     4  package gconn
     5  
     6  import (
     7  	"context"
     8  	"net"
     9  	"time"
    10  
    11  	"google.golang.org/protobuf/types/known/emptypb"
    12  
    13  	"github.com/ava-labs/avalanchego/vms/rpcchainvm/grpcutils"
    14  
    15  	connpb "github.com/ava-labs/avalanchego/proto/pb/net/conn"
    16  )
    17  
    18  var _ connpb.ConnServer = (*Server)(nil)
    19  
    20  // Server is an http.Conn that is managed over RPC.
    21  type Server struct {
    22  	connpb.UnsafeConnServer
    23  	conn   net.Conn
    24  	closer *grpcutils.ServerCloser
    25  }
    26  
    27  // NewServer returns an http.Conn managed remotely
    28  func NewServer(conn net.Conn, closer *grpcutils.ServerCloser) *Server {
    29  	return &Server{
    30  		conn:   conn,
    31  		closer: closer,
    32  	}
    33  }
    34  
    35  func (s *Server) Read(_ context.Context, req *connpb.ReadRequest) (*connpb.ReadResponse, error) {
    36  	buf := make([]byte, int(req.Length))
    37  	n, err := s.conn.Read(buf)
    38  	resp := &connpb.ReadResponse{
    39  		Read: buf[:n],
    40  	}
    41  	if err != nil {
    42  		errStr := err.Error()
    43  		resp.Error = &errStr
    44  	}
    45  	return resp, nil
    46  }
    47  
    48  func (s *Server) Write(_ context.Context, req *connpb.WriteRequest) (*connpb.WriteResponse, error) {
    49  	n, err := s.conn.Write(req.Payload)
    50  	if err != nil {
    51  		return nil, err
    52  	}
    53  	return &connpb.WriteResponse{
    54  		Length: int32(n),
    55  	}, nil
    56  }
    57  
    58  func (s *Server) Close(context.Context, *emptypb.Empty) (*emptypb.Empty, error) {
    59  	err := s.conn.Close()
    60  	s.closer.Stop()
    61  	return &emptypb.Empty{}, err
    62  }
    63  
    64  func (s *Server) SetDeadline(_ context.Context, req *connpb.SetDeadlineRequest) (*emptypb.Empty, error) {
    65  	deadline := time.Time{}
    66  	err := deadline.UnmarshalBinary(req.Time)
    67  	if err != nil {
    68  		return nil, err
    69  	}
    70  	return &emptypb.Empty{}, s.conn.SetDeadline(deadline)
    71  }
    72  
    73  func (s *Server) SetReadDeadline(_ context.Context, req *connpb.SetDeadlineRequest) (*emptypb.Empty, error) {
    74  	deadline := time.Time{}
    75  	err := deadline.UnmarshalBinary(req.Time)
    76  	if err != nil {
    77  		return nil, err
    78  	}
    79  	return &emptypb.Empty{}, s.conn.SetReadDeadline(deadline)
    80  }
    81  
    82  func (s *Server) SetWriteDeadline(_ context.Context, req *connpb.SetDeadlineRequest) (*emptypb.Empty, error) {
    83  	deadline := time.Time{}
    84  	err := deadline.UnmarshalBinary(req.Time)
    85  	if err != nil {
    86  		return nil, err
    87  	}
    88  	return &emptypb.Empty{}, s.conn.SetWriteDeadline(deadline)
    89  }