Skip to content

Commit 44ca7c7

Browse files
committed
feat: fully complete the transition to protobuf, optimizations
1 parent 88817f2 commit 44ca7c7

1 file changed

Lines changed: 19 additions & 22 deletions

File tree

main.go

Lines changed: 19 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -76,12 +76,6 @@ const (
7676
ActionSetVolume = "set_volume"
7777
)
7878

79-
// Message is the base message structure
80-
type Message struct {
81-
Type string `json:"type"`
82-
Payload json.RawMessage `json:"payload,omitempty"`
83-
}
84-
8579
// CreateRoomPayload is for creating a new room
8680
type CreateRoomPayload struct {
8781
Username string `json:"username"`
@@ -305,12 +299,6 @@ type Session struct {
305299
DisconnectAt time.Time
306300
}
307301

308-
// RateLimiter tracks message rates per client
309-
type RateLimiter struct {
310-
messages []time.Time
311-
mu sync.Mutex
312-
}
313-
314302
// Client represents a connected WebSocket client
315303
type Client struct {
316304
ID string
@@ -321,7 +309,6 @@ type Client struct {
321309
Send chan []byte
322310
closed bool
323311
mu sync.Mutex
324-
rateLimiter *RateLimiter
325312
codec *MessageCodec // Message codec for encoding/decoding
326313
}
327314

@@ -374,8 +361,10 @@ const (
374361
MaxTrackArtistLength = 200
375362
MaxQueueSize = 1000
376363
// Connection limits
377-
MaxReadMessageSize = 4194304 // 4MB (increased from 64KB)
364+
MaxReadMessageSize = 524288 // 512KB (reasonable for queue syncs)
378365
ReadTimeout = 60 * time.Second
366+
WriteTimeout = 10 * time.Second
367+
IdleTimeout = 120 * time.Second
379368
)
380369

381370
func NewServer(logger *zap.Logger) *Server {
@@ -499,11 +488,10 @@ func (s *Server) handleWebSocket(w http.ResponseWriter, r *http.Request) {
499488

500489
// Use Protobuf codec with compression enabled
501490
client := &Client{
502-
ID: s.generateUserID(),
503-
Conn: conn,
504-
Send: make(chan []byte, 256),
505-
rateLimiter: &RateLimiter{messages: make([]time.Time, 0)},
506-
codec: NewMessageCodec(true),
491+
ID: s.generateUserID(),
492+
Conn: conn,
493+
Send: make(chan []byte, 256),
494+
codec: NewMessageCodec(true),
507495
}
508496

509497
s.mu.Lock()
@@ -517,7 +505,8 @@ func (s *Server) handleWebSocket(w http.ResponseWriter, r *http.Request) {
517505
}
518506

519507
func (c *Client) writePump(logger *zap.Logger) {
520-
ticker := time.NewTicker(30 * time.Second)
508+
// Reduce ping frequency for efficiency (60s is sufficient for idle detection)
509+
ticker := time.NewTicker(60 * time.Second)
521510
defer func() {
522511
ticker.Stop()
523512
c.Conn.Close()
@@ -532,7 +521,7 @@ func (c *Client) writePump(logger *zap.Logger) {
532521
return
533522
}
534523

535-
if err := c.Conn.WriteMessage(websocket.TextMessage, message); err != nil {
524+
if err := c.Conn.WriteMessage(websocket.BinaryMessage, message); err != nil {
536525
logger.Debug("Write error for client", zap.String("client_id", c.ID), zap.Error(err))
537526
return
538527
}
@@ -2093,7 +2082,15 @@ func main() {
20932082
logger.Info("Server starting",
20942083
zap.String("port", port))
20952084

2096-
if err := http.ListenAndServe(":"+port, nil); err != nil {
2085+
// Configure HTTP server with timeouts for production
2086+
httpServer := &http.Server{
2087+
Addr: ":" + port,
2088+
ReadTimeout: ReadTimeout,
2089+
WriteTimeout: WriteTimeout,
2090+
IdleTimeout: IdleTimeout,
2091+
}
2092+
2093+
if err := httpServer.ListenAndServe(); err != nil {
20972094
logger.Fatal("Server failed", zap.Error(err))
20982095
}
20992096
}

0 commit comments

Comments
 (0)