ws.go 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. package ws
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "github.com/gorilla/websocket"
  6. "goseg/broadcast"
  7. "goseg/structs"
  8. "log/slog"
  9. "net/http"
  10. "os"
  11. "time"
  12. )
  13. var (
  14. logger = slog.New(slog.NewJSONHandler(os.Stdout, nil))
  15. upgrader = websocket.Upgrader{
  16. ReadBufferSize: 1024,
  17. WriteBufferSize: 1024,
  18. }
  19. )
  20. // switch on ws event cases
  21. func WsHandler(w http.ResponseWriter, r *http.Request) {
  22. conn, err := upgrader.Upgrade(w, r, nil)
  23. if err != nil {
  24. fmt.Println(err)
  25. return
  26. }
  27. // manage broadcasts and clients thru the broadcast package
  28. broadcast.RegisterClient(conn)
  29. defer broadcast.UnregisterClient(conn)
  30. // keepalive for ws
  31. conn.SetPongHandler(func(string) error {
  32. conn.SetReadDeadline(time.Now().Add(60 * time.Second))
  33. return nil
  34. })
  35. pingInterval := 15 * time.Second
  36. go func() {
  37. ticker := time.NewTicker(pingInterval)
  38. defer ticker.Stop()
  39. for {
  40. select {
  41. case <-ticker.C:
  42. if err := conn.WriteMessage(websocket.PingMessage, nil); err != nil {
  43. return
  44. }
  45. }
  46. }
  47. }()
  48. for {
  49. _, msg, err := conn.ReadMessage()
  50. if err != nil {
  51. return
  52. }
  53. var payload structs.WsPayload
  54. if err := json.Unmarshal(msg, &payload); err != nil {
  55. fmt.Println("Error unmarshalling message:", err)
  56. continue
  57. }
  58. switch payload.Type {
  59. case "setup":
  60. logger.Info("Setup")
  61. // setup.Setup(payload)
  62. case "new_ship":
  63. logger.Info("New ship")
  64. case "pier_upload":
  65. logger.Info("Pier upload")
  66. case "password":
  67. logger.Info("Password")
  68. case "system":
  69. logger.Info("System")
  70. case "startram":
  71. logger.Info("StarTram")
  72. case "urbit":
  73. logger.Info("Urbit")
  74. case "support":
  75. logger.Info("Support")
  76. case "broadcast":
  77. if err := broadcast.BroadcastToClients(); err != nil {
  78. logger.Error("Unable to broadcast")
  79. }
  80. default:
  81. errmsg := fmt.Sprintf("Unknown request type:", payload.Type)
  82. logger.Warn(errmsg)
  83. }
  84. }
  85. }