go-micro.dev/v5@v5.12.0/transport/grpc/handler.go (about)

     1  package grpc
     2  
     3  import (
     4  	"runtime/debug"
     5  
     6  	"go-micro.dev/v5/errors"
     7  	"go-micro.dev/v5/logger"
     8  	"go-micro.dev/v5/transport"
     9  	pb "go-micro.dev/v5/transport/grpc/proto"
    10  	"google.golang.org/grpc/peer"
    11  )
    12  
    13  // microTransport satisfies the pb.TransportServer inteface.
    14  type microTransport struct {
    15  	addr string
    16  	fn   func(transport.Socket)
    17  }
    18  
    19  func (m *microTransport) Stream(ts pb.Transport_StreamServer) (err error) {
    20  	sock := &grpcTransportSocket{
    21  		stream: ts,
    22  		local:  m.addr,
    23  	}
    24  
    25  	p, ok := peer.FromContext(ts.Context())
    26  	if ok {
    27  		sock.remote = p.Addr.String()
    28  	}
    29  
    30  	defer func() {
    31  		if r := recover(); r != nil {
    32  			logger.Error(r, string(debug.Stack()))
    33  			sock.Close()
    34  			err = errors.InternalServerError("go.micro.transport", "panic recovered: %v", r)
    35  		}
    36  	}()
    37  
    38  	// execute socket func
    39  	m.fn(sock)
    40  
    41  	return err
    42  }