gRPC Integration

Rue provides seamless gRPC integration with middleware support, allowing you to use Rue's middleware in gRPC services.

Basic Setup

go
import (
    "google.golang.org/grpc"
    "github.com/ch-hash-lab/rue"
    pb "your/proto/package"
)

func main() {
    // Create Rue engine
    engine := rue.New()
    
    // Create gRPC server with Rue
    gs := rue.NewGRPCServer(engine)
    
    // Add Rue middleware as interceptors
    gs.Use(func(c *rue.Context) {
        c.Set("request_id", generateID())
        c.Next()
    })
    
    // Add native gRPC interceptors
    gs.UseUnary(rue.GRPCLogger())
    gs.UseUnary(rue.GRPCRecovery())
    
    // Build and register services
    server := gs.Build()
    pb.RegisterMyServiceServer(server, &myService{})
    
    // Run server
    gs.Run(":50051")
}

Built-in Interceptors

go
// Logger - logs gRPC calls
gs.UseUnary(rue.GRPCLogger())

// Recovery - recovers from panics
gs.UseUnary(rue.GRPCRecovery())

// Authentication
authFunc := func(ctx context.Context) (context.Context, error) {
    md, ok := metadata.FromIncomingContext(ctx)
    if !ok {
        return nil, status.Error(codes.Unauthenticated, "no metadata")
    }
    
    tokens := md.Get("authorization")
    if len(tokens) == 0 {
        return nil, status.Error(codes.Unauthenticated, "no token")
    }
    
    user, err := validateToken(tokens[0])
    if err != nil {
        return nil, status.Error(codes.Unauthenticated, "invalid token")
    }
    
    return context.WithValue(ctx, "user", user), nil
}

gs.UseUnary(rue.GRPCAuth(authFunc))
gs.UseStream(rue.GRPCStreamAuth(authFunc))

Accessing Context in Handlers

go
func (s *myService) MyMethod(ctx context.Context, req *pb.Request) (*pb.Response, error) {
    // Get Rue's GRPCContext
    gc := rue.GetGRPCContext(ctx)
    if gc != nil {
        // Access values set by middleware
        requestID, _ := gc.Get("request_id")
        
        // Access metadata
        auth := gc.GetMetadata("authorization")
        
        // Set values for later middleware
        gc.Set("processed", true)
    }
    
    return &pb.Response{}, nil
}

Stream Interceptors

go
// Add stream interceptors
gs.UseStream(rue.GRPCStreamLogger())
gs.UseStream(rue.GRPCStreamRecovery())

// Custom stream interceptor
gs.UseStream(func(srv any, ss grpc.ServerStream, info *grpc.StreamServerInfo, handler grpc.StreamHandler) error {
    log.Printf("Stream started: %s", info.FullMethod)
    err := handler(srv, ss)
    log.Printf("Stream ended: %s", info.FullMethod)
    return err
})

GRPCServer Methods

MethodDescription
Use(middleware)Add Rue middleware
UseUnary(interceptor)Add unary interceptor
UseStream(interceptor)Add stream interceptor
Build()Build grpc.Server
Run(addr)Start server