github.com/MetalBlockchain/metalgo@v1.11.9/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/MetalBlockchain/metalgo/vms/rpcchainvm/grpcutils" 14 15 connpb "github.com/MetalBlockchain/metalgo/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 }