Skip to content

Commit bd2dc3a

Browse files
committedDec 11, 2023
wip
1 parent ba3283c commit bd2dc3a

File tree

3 files changed

+101
-116
lines changed

3 files changed

+101
-116
lines changed
 

‎conn.go

Lines changed: 31 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -28,35 +28,49 @@ import (
2828
"github.com/arduino/arduino-create-agent/upload"
2929
"github.com/arduino/arduino-create-agent/utilities"
3030
"github.com/gin-gonic/gin"
31-
socketio "github.com/googollee/go-socket.io"
31+
"github.com/gorilla/websocket"
3232
log "github.com/sirupsen/logrus"
3333
)
3434

3535
type connection struct {
3636
// The websocket connection.
37-
ws socketio.Socket
37+
ws *websocket.Conn
3838

3939
// Buffered channel of outbound messages.
4040
send chan []byte
4141
}
4242

4343
func (c *connection) writer() {
4444
for message := range c.send {
45-
err := c.ws.Emit("message", string(message))
45+
err := c.ws.WriteMessage(websocket.TextMessage, message)
4646
if err != nil {
4747
break
4848
}
4949
}
5050
}
5151

52-
// WsServer overrides socket.io server to set the CORS
53-
type WsServer struct {
54-
Server *socketio.Server
52+
func (c *connection) reader() {
53+
for {
54+
mt, payload, err := c.ws.ReadMessage()
55+
if err != nil {
56+
if websocket.IsCloseError(err, websocket.CloseNormalClosure, websocket.CloseGoingAway) {
57+
return
58+
}
59+
log.Error("ME:", err)
60+
}
61+
log.Info("Received message: ", string(payload))
62+
switch mt {
63+
case websocket.TextMessage:
64+
h.broadcast <- payload
65+
case websocket.CloseMessage:
66+
h.unregister <- c
67+
default:
68+
log.Warn("Unknown message type")
69+
}
70+
}
5571
}
5672

57-
func (s *WsServer) ServeHTTP(c *gin.Context) {
58-
s.Server.ServeHTTP(c.Writer, c.Request)
59-
}
73+
var upgrader = websocket.Upgrader{} // use default options
6074

6175
type additionalFile struct {
6276
Hex []byte `json:"hex"`
@@ -212,31 +226,14 @@ func send(args map[string]string) {
212226
h.broadcastSys <- mapB
213227
}
214228

215-
func wsHandler() *WsServer {
216-
server, err := socketio.NewServer(nil)
229+
func ServeWS(ctx *gin.Context) {
230+
ws, err := upgrader.Upgrade(ctx.Writer, ctx.Request, nil)
217231
if err != nil {
218-
log.Fatal(err)
219-
}
220-
221-
server.On("connection", func(so socketio.Socket) {
222-
c := &connection{send: make(chan []byte, 256*10), ws: so}
223-
h.register <- c
224-
so.On("command", func(message string) {
225-
h.broadcast <- []byte(message)
226-
})
227-
228-
so.On("disconnection", func() {
229-
h.unregister <- c
230-
})
231-
go c.writer()
232-
})
233-
server.On("error", func(so socketio.Socket, err error) {
234-
log.Println("error:", err)
235-
})
236-
237-
wrapper := WsServer{
238-
Server: server,
232+
fmt.Println(err.Error())
233+
return
239234
}
240-
241-
return &wrapper
235+
c := &connection{send: make(chan []byte, 256*10), ws: ws}
236+
h.register <- c
237+
go c.reader()
238+
go c.writer()
242239
}

‎home.html

Lines changed: 63 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -4,105 +4,91 @@
44
<title>Arduino Create Agent Debug Console</title>
55
<link href="https://fonts.googleapis.com/css?family=Open+Sans:400,600,700&display=swap" rel="stylesheet">
66
<link href="https://fonts.googleapis.com/css?family=Roboto+Mono:400,600,700&display=swap" rel="stylesheet">
7-
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
8-
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/1.3.5/socket.io.min.js"></script>
97
<script type="text/javascript">
10-
$(function() {
11-
var socket;
12-
var input = $('#input');
13-
var log = document.getElementById('log');
14-
var autoscroll = document.getElementById('autoscroll');
15-
var listenabled = document.getElementById('list');
16-
var messages = [];
17-
var MESSAGES_MAX_COUNT = 2000;
8+
var ready = (callback) => {
9+
if (document.readyState != "loading") callback();
10+
else document.addEventListener("DOMContentLoaded", callback);
11+
}
12+
13+
ready(() => {
14+
/* Do things after DOM has fully loaded */
15+
let socket;
16+
let input = document.getElementById('input');
17+
let log = document.getElementById('log');
18+
let autoscroll = document.getElementById('autoscroll');
19+
let listenabled = document.getElementById('list');
20+
let messages = [];
21+
let MESSAGES_MAX_COUNT = 2000;
1822

1923
function appendLog(msg) {
2024
let jsonMsg = {};
21-
let portListing = false;
2225
try {
2326
jsonMsg = JSON.parse(msg);
24-
portsListing = jsonMsg.Ports;
2527
} catch {
2628
// no valid json
2729
}
2830

29-
var startsWithList = msg.indexOf('list') == 0;
30-
31-
if (listenabled.checked || (!portsListing && !startsWithList)) {
32-
let printMsg = msg;
33-
if (jsonMsg.Ports) {
34-
const validKeys = ['Name', 'SerialNumber', 'IsOpen', 'VendorID', 'ProductID'];
35-
if (jsonMsg.Network) {
36-
printMsg = "Network Ports:\n"+JSON.stringify(jsonMsg.Ports, validKeys, 2);
37-
} else {
38-
printMsg = "Serial Ports:\n"+JSON.stringify(jsonMsg.Ports, validKeys, 2);
39-
}
40-
} else if (Object.keys(jsonMsg).length !== 0) {
41-
printMsg = JSON.stringify(jsonMsg, undefined, 2);
42-
}
43-
44-
// when parsing JSON we're escaping some html charaters like "&<>", we want to show their
45-
// original value in the log
46-
function decode(str) {
47-
let txt = new DOMParser().parseFromString(str, "text/html");
48-
return txt.documentElement.textContent;
49-
}
50-
printMsg = decode(printMsg);
51-
52-
messages.push(printMsg);
53-
if (messages.length > MESSAGES_MAX_COUNT) {
54-
messages.shift();
55-
}
56-
log.textContent = messages.join('\n\n');
57-
if (autoscroll.checked) {
58-
log.scrollTop = log.scrollHeight - log.clientHeight;
59-
}
31+
if (!listenabled.checked) {
32+
return
33+
}
34+
35+
let printMsg = msg;
36+
if (jsonMsg.Ports) {
37+
const validKeys = ['Name', 'SerialNumber', 'IsOpen', 'VendorID', 'ProductID'];
38+
const prefix = (jsonMsg.Network) ? "Network Ports:\n" : "Serial Ports:\n";
39+
printMsg = prefix+JSON.stringify(jsonMsg.Ports, validKeys, 2);
40+
} else if (Object.keys(jsonMsg).length !== 0) {
41+
printMsg = JSON.stringify(jsonMsg, undefined, 2);
42+
}
43+
44+
// when parsing JSON we're escaping some html charaters like "&<>", we want to show their
45+
// original value in the log
46+
const decode = (str) => { return new DOMParser().parseFromString(str, "text/html").documentElement.textContent; }
47+
messages.push(decode(printMsg));
48+
if (messages.length > MESSAGES_MAX_COUNT) {
49+
messages.shift();
50+
}
51+
log.textContent = messages.join('\n\n');
52+
if (autoscroll.checked) {
53+
log.scrollTop = log.scrollHeight - log.clientHeight;
6054
}
6155
}
6256

63-
$('#form').submit(function(e) {
64-
e.preventDefault();
65-
if (!socket) {
66-
return false;
67-
}
68-
if (!input.val()) {
69-
return false;
70-
}
71-
socket.emit('command', input.val());
72-
input.val('');
73-
});
74-
75-
$('#export').click(function() {
76-
var link = document.createElement('a');
77-
link.setAttribute('download', 'agent-log.txt');
78-
var text = log.textContent;
79-
link.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text));
80-
link.click();
81-
});
82-
83-
$('#clear').click(function() {
57+
document.getElementById('form').addEventListener('submit', (e) => {
58+
e.preventDefault();
59+
if (!socket) {
60+
return false;
61+
}
62+
if (!input.value) {
63+
return false;
64+
}
65+
socket.send(input.value)
66+
input.value = '';
67+
});
68+
69+
document.getElementById('export').addEventListener('click', (e) => {
70+
let link = document.createElement('a');
71+
link.setAttribute('download', 'agent-log.txt');
72+
link.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(log.textContent));
73+
link.click();
74+
});
75+
76+
document.getElementById('clear').addEventListener('click', (e) => {
8477
messages = [];
8578
log.innerHTML = '';
8679
});
8780

8881
if (window['WebSocket']) {
89-
if (window.location.protocol === 'https:') {
90-
socket = io('https://{{$}}')
91-
} else {
92-
socket = io('http://{{$}}');
93-
}
94-
socket.on('disconnect', function(evt) {
95-
appendLog('Connection closed.')
96-
});
97-
socket.on('message', function(evt) {
98-
appendLog(evt);
99-
});
82+
socket = new WebSocket((window.location.protocol === 'https:') ? 'wss://{{$}}/ws' : 'ws://{{$}}/ws')
83+
socket.onopen = () => { };
84+
socket.onmessage = (message) => { appendLog(message.data) };
85+
socket.onclose = () => { appendLog('Connection closed.') };
10086
} else {
10187
appendLog('Your browser does not support WebSockets.')
10288
}
10389

104-
$("#input").focus();
105-
});
90+
input.focus();
91+
});
10692
</script>
10793
<style type="text/css">
10894
html, body {

‎main.go

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -357,7 +357,7 @@ func loop() {
357357

358358
r := gin.New()
359359

360-
socketHandler := wsHandler().ServeHTTP
360+
//socketHandler := wsHandler().ServeHTTP
361361

362362
extraOrigins := []string{
363363
"https://create.arduino.cc",
@@ -385,14 +385,16 @@ func loop() {
385385

386386
r.LoadHTMLFiles("templates/nofirefox.html")
387387

388+
socketHandler := ServeWS
389+
388390
r.GET("/", homeHandler)
389391
r.GET("/certificate.crt", cert.CertHandler)
390392
r.DELETE("/certificate.crt", cert.DeleteCertHandler)
391393
r.POST("/upload", uploadHandler)
392-
r.GET("/socket.io/", socketHandler)
393-
r.POST("/socket.io/", socketHandler)
394-
r.Handle("WS", "/socket.io/", socketHandler)
395-
r.Handle("WSS", "/socket.io/", socketHandler)
394+
r.GET("/ws", socketHandler)
395+
r.POST("/ws", socketHandler)
396+
//r.Handle("WS", "/socket.io/", socketHandler)
397+
//r.Handle("WSS", "/socket.io/", socketHandler)
396398
r.GET("/info", infoHandler)
397399
r.POST("/killbrowser", killBrowserHandler)
398400
r.POST("/pause", pauseHandler)

0 commit comments

Comments
 (0)