github.com/annwntech/go-micro/v2@v2.9.5/transport/grpc/handler.go (about)

     1  package grpc
     2  
     3  import (
     4  	"runtime/debug"
     5  
     6  	"github.com/annwntech/go-micro/v2/errors"
     7  	"github.com/annwntech/go-micro/v2/logger"
     8  	"github.com/annwntech/go-micro/v2/transport"
     9  	pb "github.com/annwntech/go-micro/v2/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  
    21  	sock := &grpcTransportSocket{
    22  		stream: ts,
    23  		local:  m.addr,
    24  	}
    25  
    26  	p, ok := peer.FromContext(ts.Context())
    27  	if ok {
    28  		sock.remote = p.Addr.String()
    29  	}
    30  
    31  	defer func() {
    32  		if r := recover(); r != nil {
    33  			logger.Error(r, string(debug.Stack()))
    34  			sock.Close()
    35  			err = errors.InternalServerError("go.micro.transport", "panic recovered: %v", r)
    36  		}
    37  	}()
    38  
    39  	// execute socket func
    40  	m.fn(sock)
    41  
    42  	return err
    43  }