package websocket import ( "git.xdrm.io/go/ws/internal/uri/parser" ) // Client contains available information about a client type Client struct { Protocol string // choosen protocol (Sec-WebSocket-Protocol) Arguments [][]string // URI parameters, index 0 is full URI, then matching groups Store interface{} // store (for client implementation-specific data) } // ControllerFunc is a websocket controller callback function type ControllerFunc func(*Client, <-chan Message, chan<- Message, chan<- Message) // Controller is a websocket controller type Controller struct { URI *parser.Scheme // uri scheme Fun ControllerFunc // controller function } // ControllerSet is set of controllers type ControllerSet struct { Def *Controller // default controller URI []*Controller // uri controllers } // Match finds a controller for a given URI // also it returns the matching string patterns func (s *ControllerSet) Match(uri string) (*Controller, [][]string) { /* (1) Initialise argument list */ arguments := [][]string{{uri}} /* (2) Try each controller */ for _, c := range s.URI { /* 1. If matches */ if c.URI.Match(uri) { /* Extract matches */ match := c.URI.GetAllMatch() /* Add them to the 'arg' attribute */ arguments = append(arguments, match...) /* Mark that we have a controller */ return c, arguments } } /* (3) If no controller found -> set default controller */ if s.Def != nil { return s.Def, arguments } /* (4) If default is NIL, return empty controller */ return nil, arguments }