@@ -5,6 +5,7 @@ package reqctx
55
66import (
77 "context"
8+ "io"
89 "sync"
910 "time"
1011
@@ -15,8 +16,16 @@ type RequestContextKeyType struct{}
1516
1617var RequestContextKey RequestContextKeyType
1718
19+ type RequestContext interface {
20+ context.Context
21+ SetContextValue (k , v any )
22+ GetData () ContextData
23+ AddCleanUp (f func ())
24+ AddCloser (c io.Closer )
25+ }
26+
1827// RequestContext is a short-lived context that is used to store request-specific data.
19- type RequestContext struct {
28+ type requestContext struct {
2029 ctx context.Context
2130 data ContextData
2231
@@ -26,19 +35,19 @@ type RequestContext struct {
2635 cleanUpFuncs []func ()
2736}
2837
29- func (r * RequestContext ) Deadline () (deadline time.Time , ok bool ) {
38+ func (r * requestContext ) Deadline () (deadline time.Time , ok bool ) {
3039 return r .ctx .Deadline ()
3140}
3241
33- func (r * RequestContext ) Done () <- chan struct {} {
42+ func (r * requestContext ) Done () <- chan struct {} {
3443 return r .ctx .Done ()
3544}
3645
37- func (r * RequestContext ) Err () error {
46+ func (r * requestContext ) Err () error {
3847 return r .ctx .Err ()
3948}
4049
41- func (r * RequestContext ) Value (key any ) any {
50+ func (r * requestContext ) Value (key any ) any {
4251 if key == RequestContextKey {
4352 return r
4453 }
@@ -51,42 +60,46 @@ func (r *RequestContext) Value(key any) any {
5160 return r .ctx .Value (key )
5261}
5362
54- func (r * RequestContext ) SetContextValue (k , v any ) {
63+ func (r * requestContext ) SetContextValue (k , v any ) {
5564 r .mu .Lock ()
5665 r .values [k ] = v
5766 r .mu .Unlock ()
5867}
5968
6069// GetData and the underlying ContextData are not thread-safe, callers should ensure thread-safety.
61- func (r * RequestContext ) GetData () ContextData {
70+ func (r * requestContext ) GetData () ContextData {
6271 if r .data == nil {
6372 r .data = make (ContextData )
6473 }
6574 return r .data
6675}
6776
68- func (r * RequestContext ) AddCleanUp (f func ()) {
77+ func (r * requestContext ) AddCleanUp (f func ()) {
6978 r .mu .Lock ()
7079 r .cleanUpFuncs = append (r .cleanUpFuncs , f )
7180 r .mu .Unlock ()
7281}
7382
74- func (r * RequestContext ) cleanUp () {
83+ func (r * requestContext ) AddCloser (c io.Closer ) {
84+ r .AddCleanUp (func () { _ = c .Close () })
85+ }
86+
87+ func (r * requestContext ) cleanUp () {
7588 for _ , f := range r .cleanUpFuncs {
7689 f ()
7790 }
7891}
7992
80- func GetRequestContext (ctx context.Context ) * RequestContext {
81- if req , ok := ctx .Value (RequestContextKey ).(* RequestContext ); ok {
93+ func GetRequestContext (ctx context.Context ) RequestContext {
94+ if req , ok := ctx .Value (RequestContextKey ).(* requestContext ); ok {
8295 return req
8396 }
8497 return nil
8598}
8699
87- func NewRequestContext (parentCtx context.Context , profDesc string ) (_ * RequestContext , finished func ()) {
100+ func NewRequestContext (parentCtx context.Context , profDesc string ) (_ RequestContext , finished func ()) {
88101 ctx , _ , processFinished := process .GetManager ().AddTypedContext (parentCtx , profDesc , process .RequestProcessType , true )
89- reqCtx := & RequestContext {ctx : ctx , values : make (map [any ]any )}
102+ reqCtx := & requestContext {ctx : ctx , values : make (map [any ]any )}
90103 return reqCtx , func () {
91104 reqCtx .cleanUp ()
92105 processFinished ()
@@ -95,7 +108,7 @@ func NewRequestContext(parentCtx context.Context, profDesc string) (_ *RequestCo
95108
96109// NewRequestContextForTest creates a new RequestContext for testing purposes
97110// It doesn't add the context to the process manager, nor do cleanup
98- func NewRequestContextForTest (parentCtx context.Context ) * RequestContext {
99- reqCtx := & RequestContext {ctx : parentCtx , values : make (map [any ]any )}
111+ func NewRequestContextForTest (parentCtx context.Context ) RequestContext {
112+ reqCtx := & requestContext {ctx : parentCtx , values : make (map [any ]any )}
100113 return reqCtx
101114}
0 commit comments