4141type serviceRegistry struct {
4242 mu sync.Mutex
4343 services map [string ]service
44+ logger log.Logger
4445}
4546
4647// service represents a registered object.
@@ -59,14 +60,15 @@ type callback struct {
5960 errPos int // err return idx, of -1 when method cannot return error
6061 isSubscribe bool // true if this is a subscription callback
6162 streamable bool // support JSON streaming (more efficient for large responses)
63+ logger log.Logger
6264}
6365
6466func (r * serviceRegistry ) registerName (name string , rcvr interface {}) error {
6567 rcvrVal := reflect .ValueOf (rcvr )
6668 if name == "" {
6769 return fmt .Errorf ("no service name for type %s" , rcvrVal .Type ().String ())
6870 }
69- callbacks := suitableCallbacks (rcvrVal )
71+ callbacks := suitableCallbacks (rcvrVal , r . logger )
7072 if len (callbacks ) == 0 {
7173 return fmt .Errorf ("service %T doesn't have any suitable methods/subscriptions to expose" , rcvr )
7274 }
@@ -116,7 +118,7 @@ func (r *serviceRegistry) subscription(service, name string) *callback {
116118// suitableCallbacks iterates over the methods of the given type. It determines if a method
117119// satisfies the criteria for a RPC callback or a subscription callback and adds it to the
118120// collection of callbacks. See server documentation for a summary of these criteria.
119- func suitableCallbacks (receiver reflect.Value ) map [string ]* callback {
121+ func suitableCallbacks (receiver reflect.Value , logger log. Logger ) map [string ]* callback {
120122 typ := receiver .Type ()
121123 callbacks := make (map [string ]* callback )
122124 for m := 0 ; m < typ .NumMethod (); m ++ {
@@ -125,7 +127,7 @@ func suitableCallbacks(receiver reflect.Value) map[string]*callback {
125127 continue // method not exported
126128 }
127129 name := formatName (method .Name )
128- cb := newCallback (receiver , method .Func , name )
130+ cb := newCallback (receiver , method .Func , name , logger )
129131 if cb == nil {
130132 continue // function invalid
131133 }
@@ -136,9 +138,9 @@ func suitableCallbacks(receiver reflect.Value) map[string]*callback {
136138
137139// newCallback turns fn (a function) into a callback object. It returns nil if the function
138140// is unsuitable as an RPC callback.
139- func newCallback (receiver , fn reflect.Value , name string ) * callback {
141+ func newCallback (receiver , fn reflect.Value , name string , logger log. Logger ) * callback {
140142 fntype := fn .Type ()
141- c := & callback {fn : fn , rcvr : receiver , errPos : - 1 , isSubscribe : isPubSub (fntype )}
143+ c := & callback {fn : fn , rcvr : receiver , errPos : - 1 , isSubscribe : isPubSub (fntype ), logger : logger }
142144 // Determine parameter types. They must all be exported or builtin types.
143145 c .makeArgTypes ()
144146
@@ -149,7 +151,7 @@ func newCallback(receiver, fn reflect.Value, name string) *callback {
149151 outs [i ] = fntype .Out (i )
150152 }
151153 if len (outs ) > 2 {
152- log .Warn (fmt .Sprintf ("Cannot register RPC callback [%s] - maximum 2 return values are allowed, got %d" , name , len (outs )))
154+ logger .Warn (fmt .Sprintf ("Cannot register RPC callback [%s] - maximum 2 return values are allowed, got %d" , name , len (outs )))
153155 return nil
154156 }
155157 // If an error is returned, it must be the last returned value.
@@ -158,7 +160,7 @@ func newCallback(receiver, fn reflect.Value, name string) *callback {
158160 c .errPos = 0
159161 case len (outs ) == 2 :
160162 if isErrorType (outs [0 ]) || ! isErrorType (outs [1 ]) {
161- log .Warn (fmt .Sprintf ("Cannot register RPC callback [%s] - error must the last return value" , name ))
163+ logger .Warn (fmt .Sprintf ("Cannot register RPC callback [%s] - error must the last return value" , name ))
162164 return nil
163165 }
164166 c .errPos = 1
@@ -214,7 +216,7 @@ func (c *callback) call(ctx context.Context, method string, args []reflect.Value
214216 // Catch panic while running the callback.
215217 defer func () {
216218 if err := recover (); err != nil {
217- log .Error ("RPC method " + method + " crashed: " + fmt .Sprintf ("%v\n %s" , err , dbg .Stack ()))
219+ c . logger .Error ("RPC method " + method + " crashed: " + fmt .Sprintf ("%v\n %s" , err , dbg .Stack ()))
218220 errRes = errors .New ("method handler crashed" )
219221 }
220222 }()
0 commit comments