Files
youtube-downloader/ws-server/server.go
David Majdandžić 51a94b6636 Fix memory leak in server
Remove server instrumentation
2024-06-27 11:22:16 +02:00

56 lines
1.2 KiB
Go

package main
import (
"log"
"time"
"github.com/gorilla/websocket"
)
type WSServer struct {
connections map[*WSConnection]bool
clientId int32
Upgrader websocket.Upgrader
Broadcast chan string
IdleTimeout time.Duration
PingInterval time.Duration
}
func New(timeout time.Duration) *WSServer {
server := &WSServer{
connections: make(map[*WSConnection]bool),
Upgrader: websocket.Upgrader{},
Broadcast: make(chan string, 128),
IdleTimeout: timeout,
PingInterval: timeout / 2,
}
go func() {
for {
msg := <-server.Broadcast
for conn := range server.connections {
conn.WriteChan <- msg
}
}
}()
return server
}
func (server *WSServer) HandleNew(conn *websocket.Conn) {
log.Printf("Client connected, now %d clients", len(server.connections)+1)
wsconn := NewConn(conn, server)
go wsconn.Open()
server.connections[wsconn] = true
go func() {
err := <-wsconn.ErrorChan
wsconn.alive = false
close(wsconn.ReadChan)
close(wsconn.WriteChan)
close(wsconn.ErrorChan)
log.Printf("Client %d: disconnected due to %+v, now %d clients", wsconn.id, err, len(server.connections))
wsconn.conn.Close()
delete(server.connections, wsconn)
}()
}