package ws import ( "encoding/json" "fmt" "github.com/gorilla/websocket" "goseg/broadcast" "goseg/structs" "log/slog" "net/http" "os" "time" ) var ( logger = slog.New(slog.NewJSONHandler(os.Stdout, nil)) upgrader = websocket.Upgrader{ ReadBufferSize: 1024, WriteBufferSize: 1024, } ) // switch on ws event cases func WsHandler(w http.ResponseWriter, r *http.Request) { conn, err := upgrader.Upgrade(w, r, nil) if err != nil { fmt.Println(err) return } // manage broadcasts and clients thru the broadcast package broadcast.RegisterClient(conn) defer broadcast.UnregisterClient(conn) // keepalive for ws conn.SetPongHandler(func(string) error { conn.SetReadDeadline(time.Now().Add(60 * time.Second)) return nil }) pingInterval := 15 * time.Second go func() { ticker := time.NewTicker(pingInterval) defer ticker.Stop() for { select { case <-ticker.C: if err := conn.WriteMessage(websocket.PingMessage, nil); err != nil { return } } } }() for { _, msg, err := conn.ReadMessage() if err != nil { return } var payload structs.WsPayload if err := json.Unmarshal(msg, &payload); err != nil { fmt.Println("Error unmarshalling message:", err) continue } switch payload.Type { case "setup": logger.Info("Setup") // setup.Setup(payload) case "new_ship": logger.Info("New ship") case "pier_upload": logger.Info("Pier upload") case "password": logger.Info("Password") case "system": logger.Info("System") case "startram": logger.Info("StarTram") case "urbit": logger.Info("Urbit") case "support": logger.Info("Support") default: errmsg := fmt.Sprintf("Unknown request type:", payload.Type) logger.Warn(errmsg) } } }