/
server.go
84 lines (69 loc) · 2.26 KB
/
server.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
package ws
import (
"context"
"fmt"
"log"
"net/http"
"strconv"
db "github.com/PlatosCodes/desserted/backend/db/sqlc"
gameservice "github.com/PlatosCodes/desserted/backend/game_service"
"github.com/PlatosCodes/desserted/backend/token"
"github.com/PlatosCodes/desserted/backend/util"
"github.com/gorilla/websocket"
)
func ServeWs(hub *Hub, w http.ResponseWriter, r *http.Request, config util.Config, store db.Store, gameService *gameservice.GameService, mq *MessageQueue, tokenMaker token.Maker) {
var broadcastChan chan<- []byte
// Define upgrader here with dynamic CheckOrigin
upgrader := websocket.Upgrader{
ReadBufferSize: 1024,
WriteBufferSize: 1024,
CheckOrigin: func(r *http.Request) bool {
return r.Header.Get("Origin") == config.FrontendAddress
},
}
// Extract token from query parameters
accessToken := r.URL.Query().Get("access_token")
if accessToken == "" {
http.Error(w, "Authorization token is required", http.StatusUnauthorized)
return
}
// Verify the token
payload, err := validateToken(r, tokenMaker)
if err != nil {
log.Printf("err is: %v", err)
http.Error(w, err.Error(), http.StatusUnauthorized)
return
}
gameIDStr := r.URL.Query().Get("game_id")
playerGameIDStr := r.URL.Query().Get("player_game_id")
gameID, err := strconv.ParseInt(gameIDStr, 10, 64)
if err != nil {
http.Error(w, "Invalid game_id", http.StatusBadRequest)
return
}
playerGameID, err := strconv.ParseInt(playerGameIDStr, 10, 64)
if err != nil {
http.Error(w, "Invalid player_game_id", http.StatusBadRequest)
return
}
conn, err := upgrader.Upgrade(w, r, nil)
if err != nil {
handleWebsocketError(err, conn)
return
}
// Create a context for the client
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
client := NewClient(ctx, hub, conn, payload.UserID, store, gameService, mq, broadcastChan, gameID, playerGameID)
hub.register <- client
go client.writePump()
go client.readPump()
}
// validateToken extracts and validates the token from the request.
func validateToken(r *http.Request, tokenMaker token.Maker) (*token.Payload, error) {
accessToken := r.URL.Query().Get("access_token")
if accessToken == "" {
return nil, fmt.Errorf("authorization token is required")
}
return tokenMaker.VerifyToken(accessToken)
}