@@ -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
8680type 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
315303type 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
381370func 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
519507func (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