-
Notifications
You must be signed in to change notification settings - Fork 2
/
start.go
100 lines (82 loc) · 2.58 KB
/
start.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
// Copyright 2023, DASH-Industry Forum. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE.md file.
package app
import (
"context"
"fmt"
"log/slog"
"os"
"time"
"github.com/go-chi/chi/v5"
"github.com/go-chi/chi/v5/middleware"
"github.com/prometheus/client_golang/prometheus/promhttp"
"github.com/Dash-Industry-Forum/livesim2/internal"
"github.com/Dash-Industry-Forum/livesim2/pkg/logging"
)
// SetupServer sets up router, middleware, and server, given koanf configuration.
func SetupServer(ctx context.Context, cfg *ServerConfig) (*Server, error) {
var err error
logger := slog.Default()
r := chi.NewRouter()
r.Use(middleware.RequestID)
r.Use(logging.SlogMiddleWare(logger))
r.Use(middleware.Recoverer)
r.Use(addVersionAndCORSHeaders)
prometheusMiddleWare := NewPrometheusMiddleware()
r.Use(prometheusMiddleWare)
// Set a timeout value on the request context (ctx), that will signal
// through ctx.Done() that the request has timed out and further
// processing should be stopped.
if cfg.TimeoutS > 0 {
r.Use(middleware.Timeout(time.Duration(cfg.TimeoutS) * time.Second))
}
// Add prometheus counters
r.Mount("/metrics", promhttp.Handler())
var reqLimiter *IPRequestLimiter
l := chi.NewRouter()
v := chi.NewRouter()
if cfg.MaxRequests > 0 {
reqLimiter = NewIPRequestLimiter(cfg.MaxRequests, time.Duration(cfg.ReqLimitInt)*time.Second, time.Now(), cfg.ReqLimitLog)
ltrMw := NewLimiterMiddleware("Livesim2-Requests", reqLimiter)
l.Use(ltrMw)
v.Use(ltrMw)
}
// Mount livesim and vod routers
r.Mount("/livesim2", l)
r.Mount("/vod", v)
vodFS := os.DirFS(cfg.VodRoot)
server := Server{
Router: r,
LiveRouter: l,
VodRouter: v,
Cfg: cfg,
assetMgr: newAssetMgr(vodFS, cfg.RepDataRoot, cfg.WriteRepData),
reqLimiter: reqLimiter,
}
err = server.compileTemplates()
if err != nil {
return nil, err
}
err = server.Routes(ctx)
if err != nil {
return nil, fmt.Errorf("routes: %w", err)
}
start := time.Now()
err = server.assetMgr.discoverAssets()
if err != nil {
return nil, fmt.Errorf("findAssets: %w", err)
}
elapsedSeconds := fmt.Sprintf("%.3fs", time.Since(start).Seconds())
logger.Info("Vod asset found",
"count", len(server.assetMgr.assets),
"elapsed seconds", elapsedSeconds)
for name := range server.assetMgr.assets {
a := server.assetMgr.assets[name]
for mpdName := range a.MPDs {
logger.Info("Available MPD", "assetPath", name, "mpdName", mpdName)
}
}
logger.Info("livesim2 starting", "version", internal.GetVersion(), "port", cfg.Port)
return &server, nil
}