Skip to content

Commit

Permalink
Add regMethod
Browse files Browse the repository at this point in the history
  • Loading branch information
vibhavp committed Mar 4, 2016
1 parent 50b92c1 commit da9baa5
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 10 deletions.
2 changes: 1 addition & 1 deletion client.go
Expand Up @@ -171,7 +171,7 @@ func (c *Client) listener(s *Server) {
s.handlersLock.RUnlock()

if !ok {
if s.defaultHandler.IsNil() {
if s.defaultHandler == nil {
continue
}
f = s.defaultHandler
Expand Down
24 changes: 15 additions & 9 deletions server.go
Expand Up @@ -26,9 +26,9 @@ type ServerCodec interface {
Error(error) interface{}
}

func (s *Server) call(client *Client, f reflect.Value, data []byte) (interface{}, error) {
func (s *Server) call(client *Client, f *regMethod, data []byte) (interface{}, error) {
//praams is a pointer to the parameter struct for the handler
params := reflect.New(f.Type().In(1))
params := reflect.New(f.paramType)
err := s.codec.Unmarshal(data, params.Interface())
if err != nil {
return nil, err
Expand All @@ -37,12 +37,18 @@ func (s *Server) call(client *Client, f reflect.Value, data []byte) (interface{}
in := []reflect.Value{
reflect.ValueOf(client),
reflect.Indirect(params)}
out := f.Call(in)[0].Interface()
out := f.method.Call(in)[0].Interface()
err, _ = out.(error)

return out, err
}

//represents a registered method
type regMethod struct {
method reflect.Value
paramType reflect.Type // second argument to method/handler
}

//Server represents an RPC server
type Server struct {
closed *int32
Expand All @@ -58,11 +64,11 @@ type Server struct {
//session ID is sent as an argument
OnDisconnect func(string, *jwt.Token)

handlers map[string]reflect.Value
handlers map[string]*regMethod
handlersLock *sync.RWMutex

codec ServerCodec
defaultHandler reflect.Value
defaultHandler *regMethod

reqMu *sync.Mutex
freeReq *request
Expand Down Expand Up @@ -133,11 +139,11 @@ func NewServer(codec ServerCodec, defaultHandler interface{}) *Server {
joinedRooms: make(map[string][]string),
joinedRoomsMu: new(sync.RWMutex),

handlers: make(map[string]reflect.Value),
handlers: make(map[string]*regMethod),
handlersLock: new(sync.RWMutex),

codec: codec,
defaultHandler: reflect.ValueOf(defaultHandler),
defaultHandler: &regMethod{value, value.Type().In(1)},

reqMu: new(sync.Mutex),
replyMu: new(sync.Mutex),
Expand Down Expand Up @@ -274,7 +280,7 @@ func (s *Server) On(event string, f interface{}) {
}

s.handlersLock.Lock()
s.handlers[event] = value
s.handlers[event] = &regMethod{value, value.Type().In(1)}
s.handlersLock.Unlock()
}

Expand Down Expand Up @@ -302,7 +308,7 @@ func (s *Server) Register(rcvr Receiver) {
}

s.handlersLock.Lock()
s.handlers[rcvr.Name(name)] = method
s.handlers[rcvr.Name(name)] = &regMethod{method, method.Type().In(1)}
s.handlersLock.Unlock()
}
}
Expand Down

0 comments on commit da9baa5

Please sign in to comment.