Пример #1
0
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)
}
Пример #2
0
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
				}
			}
		}
	}()
}