Add basic working websocket support
Specifically moving away from Socketio because the websockets can handle everything we need, and theres no updated go socketio libraries, so its a nightmare.
This commit is contained in:
52
websocket.go
52
websocket.go
@@ -2,27 +2,49 @@ package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/googollee/go-socket.io"
|
||||
"github.com/gorilla/websocket"
|
||||
"github.com/julienschmidt/httprouter"
|
||||
"go.uber.org/zap"
|
||||
"net/http"
|
||||
)
|
||||
|
||||
// Configures the websocket connection and attaches it to the Router struct.
|
||||
func (rt *Router) ConfigureWebsocket() (*socketio.Server, error) {
|
||||
s, err := socketio.NewServer(nil)
|
||||
type WebsocketMessage struct {
|
||||
// The action to perform. Should be one of the following that are supported:
|
||||
//
|
||||
// - status : Returns the server's power state.
|
||||
// - logs : Returns the server log data at the time of the request.
|
||||
// - power : Performs a power action aganist the server based the data.
|
||||
// - command : Performs a command on a server using the data field.
|
||||
Action string
|
||||
|
||||
// The data to pass along, only used by power/command currently. Other requests
|
||||
// should either omit the field or pass an empty string value as it is ignored.
|
||||
Data string
|
||||
}
|
||||
|
||||
func (rt *Router) routeWebsocket(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
|
||||
c, err := rt.upgrader.Upgrade(w, r, nil)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
zap.S().Error(err)
|
||||
return
|
||||
}
|
||||
defer c.Close()
|
||||
|
||||
s.OnConnect("/", func(s socketio.Conn) error {
|
||||
s.SetContext("")
|
||||
fmt.Println("connected:", s.ID())
|
||||
return nil
|
||||
})
|
||||
for {
|
||||
j := WebsocketMessage{}
|
||||
|
||||
s.OnError("/", func(e error) {
|
||||
zap.S().Error(e)
|
||||
})
|
||||
// Discard and JSON parse errors into the void and don't continue processing this
|
||||
// specific socket request. If we did a break here the client would get disconnected
|
||||
// from the socket, which is NOT what we want to do.
|
||||
if err := c.ReadJSON(&j); err != nil {
|
||||
continue
|
||||
}
|
||||
|
||||
return s, nil
|
||||
}
|
||||
fmt.Printf("%s sent: %s = %s\n", c.RemoteAddr(), j.Action, j.Data)
|
||||
|
||||
if err := c.WriteMessage(websocket.TextMessage, []byte("")); err != nil {
|
||||
zap.S().Warnw("error writing JSON to socket", zap.Error(err))
|
||||
continue
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user