|
3 | 3 | package main
|
4 | 4 |
|
5 | 5 | import (
|
6 |
| - "github.com/gorilla/websocket" |
| 6 | + "github.com/gin-gonic/gin" |
| 7 | + "github.com/googollee/go-socket.io" |
7 | 8 | "log"
|
8 | 9 | "net/http"
|
9 | 10 | )
|
10 | 11 |
|
11 | 12 | type connection struct {
|
12 | 13 | // The websocket connection.
|
13 |
| - ws *websocket.Conn |
| 14 | + ws socketio.Socket |
14 | 15 |
|
15 | 16 | // Buffered channel of outbound messages.
|
16 |
| - send chan []byte |
17 |
| -} |
18 |
| - |
19 |
| -func (c *connection) reader() { |
20 |
| - for { |
21 |
| - _, message, err := c.ws.ReadMessage() |
22 |
| - if err != nil { |
23 |
| - break |
24 |
| - } |
25 |
| - |
26 |
| - h.broadcast <- message |
27 |
| - } |
28 |
| - c.ws.Close() |
| 17 | + send chan []byte |
| 18 | + incoming chan []byte |
29 | 19 | }
|
30 | 20 |
|
31 | 21 | func (c *connection) writer() {
|
32 | 22 | for message := range c.send {
|
33 |
| - err := c.ws.WriteMessage(websocket.TextMessage, message) |
| 23 | + err := c.ws.Emit("message", string(message)) |
34 | 24 | if err != nil {
|
35 | 25 | break
|
36 | 26 | }
|
37 | 27 | }
|
38 |
| - c.ws.Close() |
39 | 28 | }
|
40 | 29 |
|
41 |
| -func uploadHandler(w http.ResponseWriter, r *http.Request) { |
| 30 | +// WsServer overrides socket.io server to set the CORS |
| 31 | +type WsServer struct { |
| 32 | + Server *socketio.Server |
| 33 | +} |
| 34 | + |
| 35 | +func (s *WsServer) ServeHTTP(c *gin.Context) { |
| 36 | + s.Server.ServeHTTP(c.Writer, c.Request) |
| 37 | +} |
| 38 | + |
| 39 | +func uploadHandler(c *gin.Context) { |
42 | 40 | log.Print("Received a upload")
|
43 |
| - w.Header().Set("Access-Control-Allow-Origin", "*") |
44 |
| - port := r.FormValue("port") |
| 41 | + port := c.PostForm("port") |
45 | 42 | if port == "" {
|
46 |
| - http.Error(w, "port is required", http.StatusBadRequest) |
| 43 | + c.String(http.StatusBadRequest, "port is required") |
47 | 44 | return
|
48 | 45 | }
|
49 |
| - board := r.FormValue("board") |
| 46 | + board := c.PostForm("board") |
50 | 47 | if board == "" {
|
51 |
| - http.Error(w, "board is required", http.StatusBadRequest) |
| 48 | + c.String(http.StatusBadRequest, "board is required") |
52 | 49 | return
|
53 | 50 | }
|
54 |
| - board_rewrite := r.FormValue("board_rewrite") |
55 |
| - sketch, header, err := r.FormFile("sketch_hex") |
| 51 | + board_rewrite := c.PostForm("board_rewrite") |
| 52 | + sketch, header, err := c.Request.FormFile("sketch_hex") |
56 | 53 | if err != nil {
|
57 |
| - http.Error(w, err.Error(), http.StatusBadRequest) |
| 54 | + c.String(http.StatusBadRequest, err.Error()) |
58 | 55 | }
|
59 | 56 |
|
60 | 57 | if header != nil {
|
61 | 58 | path, err := saveFileonTempDir(header.Filename, sketch)
|
62 | 59 | if err != nil {
|
63 |
| - http.Error(w, err.Error(), http.StatusBadGateway) |
| 60 | + c.String(http.StatusBadRequest, err.Error()) |
64 | 61 | }
|
65 | 62 |
|
66 | 63 | go spProgramRW(port, board, board_rewrite, path)
|
67 | 64 | }
|
68 | 65 | }
|
69 | 66 |
|
70 |
| -func wsHandler(w http.ResponseWriter, r *http.Request) { |
71 |
| - w.Header().Set("Access-Control-Allow-Origin", "*") |
72 |
| - log.Print("Started a new websocket handler") |
73 |
| - ws, err := websocket.Upgrade(w, r, nil, 1024, 1024) |
74 |
| - if _, ok := err.(websocket.HandshakeError); ok { |
75 |
| - http.Error(w, "Not a websocket handshake", 400) |
76 |
| - return |
77 |
| - } else if err != nil { |
78 |
| - return |
| 67 | +func wsHandler() *WsServer { |
| 68 | + server, err := socketio.NewServer(nil) |
| 69 | + if err != nil { |
| 70 | + log.Fatal(err) |
79 | 71 | }
|
80 |
| - //c := &connection{send: make(chan []byte, 256), ws: ws} |
81 |
| - c := &connection{send: make(chan []byte, 256*10), ws: ws} |
82 |
| - h.register <- c |
83 |
| - defer func() { h.unregister <- c }() |
84 |
| - go c.writer() |
85 |
| - c.reader() |
| 72 | + |
| 73 | + server.On("connection", func(so socketio.Socket) { |
| 74 | + c := &connection{send: make(chan []byte, 256*10), ws: so} |
| 75 | + h.register <- c |
| 76 | + so.On("command", func(message string) { |
| 77 | + h.broadcast <- []byte(message) |
| 78 | + }) |
| 79 | + so.On("disconnection", func() { |
| 80 | + h.unregister <- c |
| 81 | + }) |
| 82 | + go c.writer() |
| 83 | + }) |
| 84 | + server.On("error", func(so socketio.Socket, err error) { |
| 85 | + log.Println("error:", err) |
| 86 | + }) |
| 87 | + |
| 88 | + wrapper := WsServer{ |
| 89 | + Server: server, |
| 90 | + } |
| 91 | + |
| 92 | + return &wrapper |
86 | 93 | }
|
0 commit comments