func NewServer() { l4g.Info("Server is initializing...") Srv = &Server{} Srv.Server = manners.NewServer() Srv.Store = store.NewSqlStore() store.RedisClient() Srv.Router = mux.NewRouter() Srv.Router.NotFoundHandler = http.HandlerFunc(Handle404) }
func (h *TeamHub) Start() { pubsub := store.RedisClient().PubSub() go func() { defer func() { l4g.Debug("redis reader finished for teamId=%v", h.teamId) hub.Stop(h.teamId) }() l4g.Debug("redis reader starting for teamId=%v", h.teamId) err := pubsub.Subscribe(h.teamId) if err != nil { l4g.Error("Error while subscribing to redis %v %v", h.teamId, err) return } for { if payload, err := pubsub.ReceiveTimeout(REDIS_WAIT); err != nil { if strings.Contains(err.Error(), "i/o timeout") { if len(h.connections) == 0 { l4g.Debug("No active connections so sending stop %v", h.teamId) return } } else { return } } else { msg := store.GetMessageFromPayload(payload) if msg != nil { h.broadcast <- msg } } } }() go func() { for { select { case webCon := <-h.register: h.connections[webCon] = true case webCon := <-h.unregister: if _, ok := h.connections[webCon]; ok { delete(h.connections, webCon) close(webCon.Send) } case msg := <-h.broadcast: for webCon := range h.connections { if !(webCon.UserId == msg.UserId && msg.Action == model.ACTION_TYPING) { select { case webCon.Send <- msg: default: close(webCon.Send) delete(h.connections, webCon) } } } case s := <-h.stop: if s { l4g.Debug("team hub stopping for teamId=%v", h.teamId) for webCon := range h.connections { webCon.WebSocket.Close() } pubsub.Close() return } } } }() }