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 }