Skip to content

Commit

Permalink
wip
Browse files Browse the repository at this point in the history
  • Loading branch information
alessio-perugini committed Dec 11, 2023
1 parent ba3283c commit bd2dc3a
Show file tree
Hide file tree
Showing 3 changed files with 101 additions and 116 deletions.
65 changes: 31 additions & 34 deletions conn.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,35 +28,49 @@ import (
"github.com/arduino/arduino-create-agent/upload"
"github.com/arduino/arduino-create-agent/utilities"
"github.com/gin-gonic/gin"
socketio "github.com/googollee/go-socket.io"
"github.com/gorilla/websocket"
log "github.com/sirupsen/logrus"
)

type connection struct {
// The websocket connection.
ws socketio.Socket
ws *websocket.Conn

// Buffered channel of outbound messages.
send chan []byte
}

func (c *connection) writer() {
for message := range c.send {
err := c.ws.Emit("message", string(message))
err := c.ws.WriteMessage(websocket.TextMessage, message)
if err != nil {
break
}
}
}

// WsServer overrides socket.io server to set the CORS
type WsServer struct {
Server *socketio.Server
func (c *connection) reader() {
for {
mt, payload, err := c.ws.ReadMessage()
if err != nil {
if websocket.IsCloseError(err, websocket.CloseNormalClosure, websocket.CloseGoingAway) {
return
}
log.Error("ME:", err)
}
log.Info("Received message: ", string(payload))
switch mt {
case websocket.TextMessage:
h.broadcast <- payload
case websocket.CloseMessage:
h.unregister <- c
default:
log.Warn("Unknown message type")
}
}
}

func (s *WsServer) ServeHTTP(c *gin.Context) {
s.Server.ServeHTTP(c.Writer, c.Request)
}
var upgrader = websocket.Upgrader{} // use default options

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

func wsHandler() *WsServer {
server, err := socketio.NewServer(nil)
func ServeWS(ctx *gin.Context) {

Check failure on line 229 in conn.go

View workflow job for this annotation

GitHub Actions / check-style (./)

exported function ServeWS should have comment or be unexported
ws, err := upgrader.Upgrade(ctx.Writer, ctx.Request, nil)
if err != nil {
log.Fatal(err)
}

server.On("connection", func(so socketio.Socket) {
c := &connection{send: make(chan []byte, 256*10), ws: so}
h.register <- c
so.On("command", func(message string) {
h.broadcast <- []byte(message)
})

so.On("disconnection", func() {
h.unregister <- c
})
go c.writer()
})
server.On("error", func(so socketio.Socket, err error) {
log.Println("error:", err)
})

wrapper := WsServer{
Server: server,
fmt.Println(err.Error())
return
}

return &wrapper
c := &connection{send: make(chan []byte, 256*10), ws: ws}
h.register <- c
go c.reader()
go c.writer()
}
140 changes: 63 additions & 77 deletions home.html
Original file line number Diff line number Diff line change
Expand Up @@ -4,105 +4,91 @@
<title>Arduino Create Agent Debug Console</title>
<link href="https://fonts.googleapis.com/css?family=Open+Sans:400,600,700&display=swap" rel="stylesheet">
<link href="https://fonts.googleapis.com/css?family=Roboto+Mono:400,600,700&display=swap" rel="stylesheet">
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/1.3.5/socket.io.min.js"></script>
<script type="text/javascript">
$(function() {
var socket;
var input = $('#input');
var log = document.getElementById('log');
var autoscroll = document.getElementById('autoscroll');
var listenabled = document.getElementById('list');
var messages = [];
var MESSAGES_MAX_COUNT = 2000;
var ready = (callback) => {
if (document.readyState != "loading") callback();
else document.addEventListener("DOMContentLoaded", callback);
}

ready(() => {
/* Do things after DOM has fully loaded */
let socket;
let input = document.getElementById('input');
let log = document.getElementById('log');
let autoscroll = document.getElementById('autoscroll');
let listenabled = document.getElementById('list');
let messages = [];
let MESSAGES_MAX_COUNT = 2000;

function appendLog(msg) {
let jsonMsg = {};
let portListing = false;
try {
jsonMsg = JSON.parse(msg);
portsListing = jsonMsg.Ports;
} catch {
// no valid json
}

var startsWithList = msg.indexOf('list') == 0;

if (listenabled.checked || (!portsListing && !startsWithList)) {
let printMsg = msg;
if (jsonMsg.Ports) {
const validKeys = ['Name', 'SerialNumber', 'IsOpen', 'VendorID', 'ProductID'];
if (jsonMsg.Network) {
printMsg = "Network Ports:\n"+JSON.stringify(jsonMsg.Ports, validKeys, 2);
} else {
printMsg = "Serial Ports:\n"+JSON.stringify(jsonMsg.Ports, validKeys, 2);
}
} else if (Object.keys(jsonMsg).length !== 0) {
printMsg = JSON.stringify(jsonMsg, undefined, 2);
}

// when parsing JSON we're escaping some html charaters like "&<>", we want to show their
// original value in the log
function decode(str) {
let txt = new DOMParser().parseFromString(str, "text/html");
return txt.documentElement.textContent;
}
printMsg = decode(printMsg);

messages.push(printMsg);
if (messages.length > MESSAGES_MAX_COUNT) {
messages.shift();
}
log.textContent = messages.join('\n\n');
if (autoscroll.checked) {
log.scrollTop = log.scrollHeight - log.clientHeight;
}
if (!listenabled.checked) {
return
}

let printMsg = msg;
if (jsonMsg.Ports) {
const validKeys = ['Name', 'SerialNumber', 'IsOpen', 'VendorID', 'ProductID'];
const prefix = (jsonMsg.Network) ? "Network Ports:\n" : "Serial Ports:\n";
printMsg = prefix+JSON.stringify(jsonMsg.Ports, validKeys, 2);
} else if (Object.keys(jsonMsg).length !== 0) {
printMsg = JSON.stringify(jsonMsg, undefined, 2);
}

// when parsing JSON we're escaping some html charaters like "&<>", we want to show their
// original value in the log
const decode = (str) => { return new DOMParser().parseFromString(str, "text/html").documentElement.textContent; }
messages.push(decode(printMsg));
if (messages.length > MESSAGES_MAX_COUNT) {
messages.shift();
}
log.textContent = messages.join('\n\n');
if (autoscroll.checked) {
log.scrollTop = log.scrollHeight - log.clientHeight;
}
}

$('#form').submit(function(e) {
e.preventDefault();
if (!socket) {
return false;
}
if (!input.val()) {
return false;
}
socket.emit('command', input.val());
input.val('');
});

$('#export').click(function() {
var link = document.createElement('a');
link.setAttribute('download', 'agent-log.txt');
var text = log.textContent;
link.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text));
link.click();
});

$('#clear').click(function() {
document.getElementById('form').addEventListener('submit', (e) => {
e.preventDefault();
if (!socket) {
return false;
}
if (!input.value) {
return false;
}
socket.send(input.value)
input.value = '';
});

document.getElementById('export').addEventListener('click', (e) => {
let link = document.createElement('a');
link.setAttribute('download', 'agent-log.txt');
link.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(log.textContent));
link.click();
});

document.getElementById('clear').addEventListener('click', (e) => {
messages = [];
log.innerHTML = '';
});

if (window['WebSocket']) {
if (window.location.protocol === 'https:') {
socket = io('https://{{$}}')
} else {
socket = io('http://{{$}}');
}
socket.on('disconnect', function(evt) {
appendLog('Connection closed.')
});
socket.on('message', function(evt) {
appendLog(evt);
});
socket = new WebSocket((window.location.protocol === 'https:') ? 'wss://{{$}}/ws' : 'ws://{{$}}/ws')
socket.onopen = () => { };
socket.onmessage = (message) => { appendLog(message.data) };
socket.onclose = () => { appendLog('Connection closed.') };
} else {
appendLog('Your browser does not support WebSockets.')
}

$("#input").focus();
});
input.focus();
});
</script>
<style type="text/css">
html, body {
Expand Down
12 changes: 7 additions & 5 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -357,7 +357,7 @@ func loop() {

r := gin.New()

socketHandler := wsHandler().ServeHTTP
//socketHandler := wsHandler().ServeHTTP

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

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

socketHandler := ServeWS

r.GET("/", homeHandler)
r.GET("/certificate.crt", cert.CertHandler)
r.DELETE("/certificate.crt", cert.DeleteCertHandler)
r.POST("/upload", uploadHandler)
r.GET("/socket.io/", socketHandler)
r.POST("/socket.io/", socketHandler)
r.Handle("WS", "/socket.io/", socketHandler)
r.Handle("WSS", "/socket.io/", socketHandler)
r.GET("/ws", socketHandler)
r.POST("/ws", socketHandler)
//r.Handle("WS", "/socket.io/", socketHandler)
//r.Handle("WSS", "/socket.io/", socketHandler)
r.GET("/info", infoHandler)
r.POST("/killbrowser", killBrowserHandler)
r.POST("/pause", pauseHandler)
Expand Down

0 comments on commit bd2dc3a

Please sign in to comment.