Skip to content

Commit

Permalink
feat: Add statsig interceptor package
Browse files Browse the repository at this point in the history
  • Loading branch information
laynax committed Jul 24, 2024
1 parent 097c91e commit 8f67536
Showing 1 changed file with 80 additions and 0 deletions.
80 changes: 80 additions & 0 deletions pkg/interceptors/statsig.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
package interceptors

import (
"context"

grpcmiddleware "github.com/grpc-ecosystem/go-grpc-middleware"
"google.golang.org/grpc"

sdkstatsigcontext "github.com/scribd/go-sdk/pkg/context/statsig"
"github.com/scribd/go-sdk/pkg/statsig"
)

// ExperimentUnaryServerInterceptor returns a unary server interceptor
// that adds sdkstatsigcontext.GetExperimentFunc to the context.
func ExperimentUnaryServerInterceptor(experiment string) grpc.UnaryServerInterceptor {
return func(
ctx context.Context,
req interface{},
info *grpc.UnaryServerInfo,
handler grpc.UnaryHandler,
) (interface{}, error) {
x := statsig.GetExperiment(experiment)
newCtx := sdkstatsigcontext.ExperimentToContext(ctx, x)
return handler(newCtx, req)
}
}

// ExperimentStreamServerInterceptor returns a streaming server interceptor
// that sdkstatsigcontext.GetExperimentFunc to the context.
func ExperimentStreamServerInterceptor(experiment string) grpc.StreamServerInterceptor {
return func(
srv interface{},
stream grpc.ServerStream,
info *grpc.StreamServerInfo,
handler grpc.StreamHandler,
) error {
x := statsig.GetExperiment(experiment)
newCtx := sdkstatsigcontext.ExperimentToContext(stream.Context(), x)

wrapped := grpcmiddleware.WrapServerStream(stream)
wrapped.WrappedContext = newCtx

return handler(srv, wrapped)
}
}

// FeatureFlagUnaryServerInterceptor returns a unary server interceptor
// that adds sdkstatsigcontext.GetFeatureFlagFunc to the context.
func FeatureFlagUnaryServerInterceptor(featureFlag string) grpc.UnaryServerInterceptor {
return func(
ctx context.Context,
req interface{},
info *grpc.UnaryServerInfo,
handler grpc.UnaryHandler,
) (interface{}, error) {
ff := statsig.GetFeatureFlag(featureFlag)
newCtx := sdkstatsigcontext.FeatureFlagToContext(ctx, ff)

return handler(newCtx, req)
}
}

// FeatureFlagStreamServerInterceptor returns a streaming server interceptor
// that sdkstatsigcontext.GetFeatureFlagFunc to the context.
func FeatureFlagStreamServerInterceptor(featureFlag string) grpc.StreamServerInterceptor {
return func(
srv interface{},
stream grpc.ServerStream,
info *grpc.StreamServerInfo,
handler grpc.StreamHandler,
) error {
ff := statsig.GetFeatureFlag(featureFlag)
newCtx := sdkstatsigcontext.FeatureFlagToContext(stream.Context(), ff)

wrapped := grpcmiddleware.WrapServerStream(stream)
wrapped.WrappedContext = newCtx

return handler(srv, wrapped)
}
}

0 comments on commit 8f67536

Please sign in to comment.