Skip to content
Snippets Groups Projects
router.go 1.76 KiB
Newer Older
  • Learn to ignore specific revisions
  • package server
    
    import (
    	"net/http"
    	"sync"
    
    	"github.com/go-chi/chi"
    	"github.com/markbates/pkger"
    	"github.com/prometheus/client_golang/prometheus/promhttp"
    )
    
    var (
    	displaysMu sync.Mutex
    	displays   map[string]*Display = make(map[string]*Display)
    )
    
    // GetRouter gets the router for the server
    func GetRouter(useHostNamespace bool) *chi.Mux {
    
    	r := chi.NewRouter()
    
    	r.Route("/twitch", func(r chi.Router) {
    		r.With(monitoringMiddleware("/twitch/getTopGames")).Get("/getTopGames", twitchGetTopGamesHandler)
    		r.With(monitoringMiddleware("/twitch/searchGames")).Get("/searchGames", twitchSearchGamesHandler)
    		r.With(monitoringMiddleware("/twitch/getTopStreams")).Get("/getTopStreams", twitchGetTopStreamsHandler)
    		r.With(monitoringMiddleware("/twitch/getFeaturedStreams")).Get("/getFeaturedStreams", twitchGetFeaturedStreamsHandler)
    	})
    
    	r.Get("/display", func(w http.ResponseWriter, r *http.Request) {
    		namespace := "default"
    		if useHostNamespace {
    			namespace = r.Host
    		}
    
    		displaysMu.Lock()
    		display, ok := displays[namespace]
    		if !ok {
    			display = NewDisplay(namespace)
    			displays[namespace] = display
    		}
    		displaysMu.Unlock()
    
    		// We had to create a namespace
    		// Increase metric outside mutex for performance
    		if !ok {
    			namespacesMetric.Inc()
    		}
    
    		if r.Header.Get("Accept") == "text/event-stream" {
    			displayListernersMetric.Inc()
    			defer displayListernersMetric.Dec()
    			monitoringMiddleware("/display(events)")(http.HandlerFunc(display.eventsHandler)).ServeHTTP(w, r)
    		} else {
    			monitoringMiddleware("/display(state)")(http.HandlerFunc(display.stateHandler)).ServeHTTP(w, r)
    		}
    	})
    
    	// Export Prometheus metrics
    	r.Handle("/metrics", promhttp.Handler())
    
    	r.With(monitoringMiddleware("/")).Mount("/", http.FileServer(pkger.Dir("/internal/static")))
    
    	return r
    }