Repository navigation
Expand file tree
/
Copy pathmain.go
More file actions
83 lines (69 loc) · 1.53 KB
/
Copy pathmain.go
File metadata and controls
83 lines (69 loc) · 1.53 KB
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
package main
import (
"context"
"log/slog"
"net/http"
"os"
"os/signal"
"syscall"
"time"
)
func main() {
logger := slog.Default()
port := os.Getenv("PORT")
if port == "" {
logger.Error("$PORT must be set")
os.Exit(1)
}
redisURL := os.Getenv("REDIS_URL")
if redisURL == "" {
logger.Error("$REDIS_URL must be set")
os.Exit(1)
}
rdb, err := newRedisClient(redisURL)
if err != nil {
logger.Error("failed to create redis client", "err", err)
os.Exit(1)
}
hub := NewHub(rdb, logger)
ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGTERM)
defer stop()
go func() {
for {
if err := waitForRedis(ctx, rdb, logger, func() {
hub.Broadcast(waitingMsg)
}); err != nil {
return
}
hub.Broadcast(availableMsg)
if err := hub.Subscribe(ctx); err != nil {
if ctx.Err() != nil {
return
}
logger.Error("redis subscription error, reconnecting", "err", err)
continue
}
return
}
}()
mux := http.NewServeMux()
mux.Handle("/", http.FileServer(http.Dir("./public")))
mux.HandleFunc("/ws", handleWebSocket(hub, logger))
srv := &http.Server{
Addr: ":" + port,
Handler: mux,
}
go func() {
logger.Info("server starting", "port", port)
if err := srv.ListenAndServe(); err != http.ErrServerClosed {
logger.Error("server error", "err", err)
os.Exit(1)
}
}()
<-ctx.Done()
logger.Info("shutting down")
shutdownCtx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
srv.Shutdown(shutdownCtx)
rdb.Close()
}