@@ -168,15 +168,75 @@ const (
168
168
DefaultInternalMiddlewareServerSpecific = "servicespecific"
169
169
)
170
170
171
+ //go:generate go run github.com/ecordell/optgen -output zz_generated.middlewareoption.go . MiddlewareOption
171
172
type MiddlewareOption struct {
172
- logger zerolog.Logger
173
- authFunc grpcauth.AuthFunc
174
- enableVersionResponse bool
175
- dispatcher dispatch.Dispatcher
176
- ds datastore.Datastore
177
- enableRequestLog bool
178
- enableResponseLog bool
179
- disableGRPCHistogram bool
173
+ Logger zerolog.Logger `debugmap:"hidden"`
174
+ AuthFunc grpcauth.AuthFunc `debugmap:"hidden"`
175
+ EnableVersionResponse bool `debugmap:"visible"`
176
+ DispatcherForMiddleware dispatch.Dispatcher `debugmap:"hidden"`
177
+ EnableRequestLog bool `debugmap:"visible"`
178
+ EnableResponseLog bool `debugmap:"visible"`
179
+ DisableGRPCHistogram bool `debugmap:"visible"`
180
+
181
+ unaryDatastoreMiddleware * ReferenceableMiddleware [grpc.UnaryServerInterceptor ] `debugmap:"hidden"`
182
+ streamDatastoreMiddleware * ReferenceableMiddleware [grpc.StreamServerInterceptor ] `debugmap:"hidden"`
183
+ }
184
+
185
+ type Middleware interface {
186
+ UnaryServerInterceptor () grpc.UnaryServerInterceptor
187
+ StreamServerInterceptor () grpc.StreamServerInterceptor
188
+ }
189
+
190
+ func (m MiddlewareOption ) WithDatastoreMiddleware (middleware Middleware ) MiddlewareOption {
191
+ unary := NewUnaryMiddleware ().
192
+ WithName (DefaultInternalMiddlewareDatastore ).
193
+ WithInternal (true ).
194
+ WithInterceptor (middleware .UnaryServerInterceptor ()).
195
+ Done ()
196
+
197
+ stream := NewStreamMiddleware ().
198
+ WithName (DefaultInternalMiddlewareDatastore ).
199
+ WithInternal (true ).
200
+ WithInterceptor (middleware .StreamServerInterceptor ()).
201
+ Done ()
202
+
203
+ return MiddlewareOption {
204
+ Logger : m .Logger ,
205
+ AuthFunc : m .AuthFunc ,
206
+ EnableVersionResponse : m .EnableVersionResponse ,
207
+ DispatcherForMiddleware : m .DispatcherForMiddleware ,
208
+ EnableRequestLog : m .EnableRequestLog ,
209
+ EnableResponseLog : m .EnableResponseLog ,
210
+ DisableGRPCHistogram : m .DisableGRPCHistogram ,
211
+ unaryDatastoreMiddleware : & unary ,
212
+ streamDatastoreMiddleware : & stream ,
213
+ }
214
+ }
215
+
216
+ func (m MiddlewareOption ) WithDatastore (ds datastore.Datastore ) MiddlewareOption {
217
+ unary := NewUnaryMiddleware ().
218
+ WithName (DefaultInternalMiddlewareDatastore ).
219
+ WithInternal (true ).
220
+ WithInterceptor (datastoremw .UnaryServerInterceptor (ds )).
221
+ Done ()
222
+
223
+ stream := NewStreamMiddleware ().
224
+ WithName (DefaultInternalMiddlewareDatastore ).
225
+ WithInternal (true ).
226
+ WithInterceptor (datastoremw .StreamServerInterceptor (ds )).
227
+ Done ()
228
+
229
+ return MiddlewareOption {
230
+ Logger : m .Logger ,
231
+ AuthFunc : m .AuthFunc ,
232
+ EnableVersionResponse : m .EnableVersionResponse ,
233
+ DispatcherForMiddleware : m .DispatcherForMiddleware ,
234
+ EnableRequestLog : m .EnableRequestLog ,
235
+ EnableResponseLog : m .EnableResponseLog ,
236
+ DisableGRPCHistogram : m .DisableGRPCHistogram ,
237
+ unaryDatastoreMiddleware : & unary ,
238
+ streamDatastoreMiddleware : & stream ,
239
+ }
180
240
}
181
241
182
242
// gRPCMetricsUnaryInterceptor creates the default prometheus metrics interceptor for unary gRPCs
@@ -212,7 +272,7 @@ func doesNotMatchRoute(route string) func(_ context.Context, c interceptors.Call
212
272
213
273
// DefaultUnaryMiddleware generates the default middleware chain used for the public SpiceDB Unary gRPC methods
214
274
func DefaultUnaryMiddleware (opts MiddlewareOption ) (* MiddlewareChain [grpc.UnaryServerInterceptor ], error ) {
215
- grpcMetricsUnaryInterceptor , _ := GRPCMetrics (opts .disableGRPCHistogram )
275
+ grpcMetricsUnaryInterceptor , _ := GRPCMetrics (opts .DisableGRPCHistogram )
216
276
chain , err := NewMiddlewareChain ([]ReferenceableMiddleware [grpc.UnaryServerInterceptor ]{
217
277
NewUnaryMiddleware ().
218
278
WithName (DefaultMiddlewareRequestID ).
@@ -232,15 +292,15 @@ func DefaultUnaryMiddleware(opts MiddlewareOption) (*MiddlewareChain[grpc.UnaryS
232
292
NewUnaryMiddleware ().
233
293
WithName (DefaultMiddlewareGRPCLog + "-debug" ).
234
294
WithInterceptor (selector .UnaryServerInterceptor (
235
- grpclog .UnaryServerInterceptor (InterceptorLogger (opts .logger ), determineEventsToLog (opts ), alwaysDebugOption , durationFieldOption , traceIDFieldOption ),
295
+ grpclog .UnaryServerInterceptor (InterceptorLogger (opts .Logger ), determineEventsToLog (opts ), alwaysDebugOption , durationFieldOption , traceIDFieldOption ),
236
296
selector .MatchFunc (matchesRoute (healthCheckRoute )))).
237
297
EnsureAlreadyExecuted (DefaultMiddlewareOTelGRPC ). // dependency so that OTel traceID is injected in logs),
238
298
Done (),
239
299
240
300
NewUnaryMiddleware ().
241
301
WithName (DefaultMiddlewareGRPCLog ).
242
302
WithInterceptor (selector .UnaryServerInterceptor (
243
- grpclog .UnaryServerInterceptor (InterceptorLogger (opts .logger ), determineEventsToLog (opts ), defaultCodeToLevel , durationFieldOption , traceIDFieldOption ),
303
+ grpclog .UnaryServerInterceptor (InterceptorLogger (opts .Logger ), determineEventsToLog (opts ), defaultCodeToLevel , durationFieldOption , traceIDFieldOption ),
244
304
selector .MatchFunc (doesNotMatchRoute (healthCheckRoute )))).
245
305
EnsureAlreadyExecuted (DefaultMiddlewareOTelGRPC ). // dependency so that OTel traceID is injected in logs),
246
306
Done (),
@@ -252,26 +312,22 @@ func DefaultUnaryMiddleware(opts MiddlewareOption) (*MiddlewareChain[grpc.UnaryS
252
312
253
313
NewUnaryMiddleware ().
254
314
WithName (DefaultMiddlewareGRPCAuth ).
255
- WithInterceptor (grpcauth .UnaryServerInterceptor (opts .authFunc )).
315
+ WithInterceptor (grpcauth .UnaryServerInterceptor (opts .AuthFunc )).
256
316
EnsureAlreadyExecuted (DefaultMiddlewareGRPCProm ). // so that prom middleware reports auth failures
257
317
Done (),
258
318
259
319
NewUnaryMiddleware ().
260
320
WithName (DefaultMiddlewareServerVersion ).
261
- WithInterceptor (serverversion .UnaryServerInterceptor (opts .enableVersionResponse )).
321
+ WithInterceptor (serverversion .UnaryServerInterceptor (opts .EnableVersionResponse )).
262
322
Done (),
263
323
264
324
NewUnaryMiddleware ().
265
325
WithName (DefaultInternalMiddlewareDispatch ).
266
326
WithInternal (true ).
267
- WithInterceptor (dispatchmw .UnaryServerInterceptor (opts .dispatcher )).
327
+ WithInterceptor (dispatchmw .UnaryServerInterceptor (opts .DispatcherForMiddleware )).
268
328
Done (),
269
329
270
- NewUnaryMiddleware ().
271
- WithName (DefaultInternalMiddlewareDatastore ).
272
- WithInternal (true ).
273
- WithInterceptor (datastoremw .UnaryServerInterceptor (opts .ds )).
274
- Done (),
330
+ * opts .unaryDatastoreMiddleware ,
275
331
276
332
NewUnaryMiddleware ().
277
333
WithName (DefaultInternalMiddlewareConsistency ).
@@ -290,7 +346,7 @@ func DefaultUnaryMiddleware(opts MiddlewareOption) (*MiddlewareChain[grpc.UnaryS
290
346
291
347
// DefaultStreamingMiddleware generates the default middleware chain used for the public SpiceDB Streaming gRPC methods
292
348
func DefaultStreamingMiddleware (opts MiddlewareOption ) (* MiddlewareChain [grpc.StreamServerInterceptor ], error ) {
293
- _ , grpcMetricsStreamingInterceptor := GRPCMetrics (opts .disableGRPCHistogram )
349
+ _ , grpcMetricsStreamingInterceptor := GRPCMetrics (opts .DisableGRPCHistogram )
294
350
chain , err := NewMiddlewareChain ([]ReferenceableMiddleware [grpc.StreamServerInterceptor ]{
295
351
NewStreamMiddleware ().
296
352
WithName (DefaultMiddlewareRequestID ).
@@ -310,15 +366,15 @@ func DefaultStreamingMiddleware(opts MiddlewareOption) (*MiddlewareChain[grpc.St
310
366
NewStreamMiddleware ().
311
367
WithName (DefaultMiddlewareGRPCLog + "-debug" ).
312
368
WithInterceptor (selector .StreamServerInterceptor (
313
- grpclog .StreamServerInterceptor (InterceptorLogger (opts .logger ), determineEventsToLog (opts ), alwaysDebugOption , durationFieldOption , traceIDFieldOption ),
369
+ grpclog .StreamServerInterceptor (InterceptorLogger (opts .Logger ), determineEventsToLog (opts ), alwaysDebugOption , durationFieldOption , traceIDFieldOption ),
314
370
selector .MatchFunc (matchesRoute (healthCheckRoute )))).
315
371
EnsureInterceptorAlreadyExecuted (DefaultMiddlewareOTelGRPC ). // dependency so that OTel traceID is injected in logs),
316
372
Done (),
317
373
318
374
NewStreamMiddleware ().
319
375
WithName (DefaultMiddlewareGRPCLog ).
320
376
WithInterceptor (selector .StreamServerInterceptor (
321
- grpclog .StreamServerInterceptor (InterceptorLogger (opts .logger ), determineEventsToLog (opts ), defaultCodeToLevel , durationFieldOption , traceIDFieldOption ),
377
+ grpclog .StreamServerInterceptor (InterceptorLogger (opts .Logger ), determineEventsToLog (opts ), defaultCodeToLevel , durationFieldOption , traceIDFieldOption ),
322
378
selector .MatchFunc (doesNotMatchRoute (healthCheckRoute )))).
323
379
EnsureInterceptorAlreadyExecuted (DefaultMiddlewareOTelGRPC ). // dependency so that OTel traceID is injected in logs),
324
380
Done (),
@@ -330,26 +386,22 @@ func DefaultStreamingMiddleware(opts MiddlewareOption) (*MiddlewareChain[grpc.St
330
386
331
387
NewStreamMiddleware ().
332
388
WithName (DefaultMiddlewareGRPCAuth ).
333
- WithInterceptor (grpcauth .StreamServerInterceptor (opts .authFunc )).
389
+ WithInterceptor (grpcauth .StreamServerInterceptor (opts .AuthFunc )).
334
390
EnsureInterceptorAlreadyExecuted (DefaultMiddlewareGRPCProm ). // so that prom middleware reports auth failures
335
391
Done (),
336
392
337
393
NewStreamMiddleware ().
338
394
WithName (DefaultMiddlewareServerVersion ).
339
- WithInterceptor (serverversion .StreamServerInterceptor (opts .enableVersionResponse )).
395
+ WithInterceptor (serverversion .StreamServerInterceptor (opts .EnableVersionResponse )).
340
396
Done (),
341
397
342
398
NewStreamMiddleware ().
343
399
WithName (DefaultInternalMiddlewareDispatch ).
344
400
WithInternal (true ).
345
- WithInterceptor (dispatchmw .StreamServerInterceptor (opts .dispatcher )).
401
+ WithInterceptor (dispatchmw .StreamServerInterceptor (opts .DispatcherForMiddleware )).
346
402
Done (),
347
403
348
- NewStreamMiddleware ().
349
- WithName (DefaultInternalMiddlewareDatastore ).
350
- WithInternal (true ).
351
- WithInterceptor (datastoremw .StreamServerInterceptor (opts .ds )).
352
- Done (),
404
+ * opts .streamDatastoreMiddleware ,
353
405
354
406
NewStreamMiddleware ().
355
407
WithName (DefaultInternalMiddlewareConsistency ).
@@ -368,11 +420,11 @@ func DefaultStreamingMiddleware(opts MiddlewareOption) (*MiddlewareChain[grpc.St
368
420
369
421
func determineEventsToLog (opts MiddlewareOption ) grpclog.Option {
370
422
eventsToLog := []grpclog.LoggableEvent {grpclog .FinishCall }
371
- if opts .enableRequestLog {
423
+ if opts .EnableRequestLog {
372
424
eventsToLog = append (eventsToLog , grpclog .PayloadReceived )
373
425
}
374
426
375
- if opts .enableResponseLog {
427
+ if opts .EnableResponseLog {
376
428
eventsToLog = append (eventsToLog , grpclog .PayloadSent )
377
429
}
378
430
0 commit comments