package interceptor import ( "context" "errors" "runtime/debug" "sig-pub/pkg/zlog" "google.golang.org/grpc" "google.golang.org/grpc/grpclog" "google.golang.org/protobuf/types/known/emptypb" ) func RecoverInterceptor(ctx context.Context, req any, server *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (resp any, err error) { defer func() { if r := recover(); r != nil { switch r := r.(type) { case error: err = r case string: err = errors.New(r) default: err = errors.New("grpc server recover error") } grpclog.Error("grpc server error: ", r) debug.PrintStack() } }() // zlog.Debugf("call method: %s", server.FullMethod) // -> /TradingService/IndicatorSeries resp, err = handler(ctx, req) if err == nil { if empty, ok := resp.(*emptypb.Empty); ok && empty == nil { resp = &emptypb.Empty{} // grpc: error while marshaling: proto: Marshal called with nil } else if resp == nil { zlog.Warningf("grpc request: has no response: method=%s, %v", server.FullMethod, req) } } return }