diff --git a/handlers/ws.go b/handlers/ws.go
index f291070..23ee845 100644
--- a/handlers/ws.go
+++ b/handlers/ws.go
@@ -27,6 +27,7 @@ type socket struct {
listeners map[string][]func(args ...interface{})
r *http.Request
id string
+ closed bool
}
func newSocket(r *http.Request, c *websocket.Conn) *socket {
@@ -46,8 +47,13 @@ func (s *socket) Request() *http.Request {
return s.r
}
+func (s *socket) Close() {
+ s.closed = true
+ s.onMessage(message{Name: "close"})
+}
+
func (s *socket) process() {
- defer s.onMessage(message{Name: "close"})
+ defer s.Close()
for {
mt, m, err := s.c.ReadMessage()
if err != nil {
@@ -85,6 +91,11 @@ func (s *socket) onMessage(msg message) {
func (s *socket) Emit(ev string, args ...interface{}) {
s.mx.Lock()
defer s.mx.Unlock()
+
+ if s.closed {
+ return
+ }
+
m := message{Name: ev, Args: args}
b, err := json.Marshal(m)
if err != nil {
@@ -93,6 +104,7 @@ func (s *socket) Emit(ev string, args ...interface{}) {
}
if err := s.c.WriteMessage(websocket.TextMessage, b); err != nil {
log.Printf("Cannot write event to websocket connection. Got: %v\n", err)
+ s.Close()
return
}
}
diff --git a/www/assets/app.js b/www/assets/app.js
index d5a583c..dea4503 100644
--- a/www/assets/app.js
+++ b/www/assets/app.js
@@ -27,7 +27,7 @@
$scope.selectedInstance = null;
$scope.isAlive = true;
$scope.ttl = '--:--:--';
- $scope.connected = true;
+ $scope.connected = false;
$scope.type = {windows: false};
$scope.isInstanceBeingCreated = false;
$scope.newInstanceBtnText = '+ Add new instance';
@@ -35,7 +35,6 @@
$scope.isInstanceBeingDeleted = false;
$scope.uploadProgress = 0;
-
$scope.uploadFiles = function (files, invalidFiles) {
let total = files.length;
let uploadFile = function() {
@@ -190,7 +189,7 @@
base += ':' + window.location.port;
}
- var socket = new WebSocket(base + '/sessions/' + sessionId + '/ws/');
+ var socket = new ReconnectingWebSocket(base + '/sessions/' + sessionId + '/ws/', null, {reconnectInterval: 1000});
socket.listeners = {};
socket.on = function(name, cb) {
@@ -210,10 +209,22 @@
}
socket.addEventListener('open', function (event) {
- console.log('open', event);
+ $scope.connected = true;
+ for (var i in $scope.instances) {
+ var instance = $scope.instances[i];
+ if (instance.term) {
+ instance.term.setOption('disableStdin', false);
+ }
+ }
});
socket.addEventListener('close', function (event) {
- console.log('close', event);
+ $scope.connected = false;
+ for (var i in $scope.instances) {
+ var instance = $scope.instances[i];
+ if (instance.term) {
+ instance.term.setOption('disableStdin', true);
+ }
+ }
});
socket.addEventListener('message', function (event) {
var m = JSON.parse(event.data);
@@ -290,13 +301,6 @@
});
});
- socket.on('connect_error', function() {
- $scope.connected = false;
- });
- socket.on('connect', function() {
- $scope.connected = true;
- });
-
socket.on('instance stats', function(stats) {
$scope.idx[stats.instance].mem = stats.mem;
$scope.idx[stats.instance].cpu = stats.cpu;
diff --git a/www/index.html b/www/index.html
index 6f92ed3..94c1a70 100644
--- a/www/index.html
+++ b/www/index.html
@@ -280,6 +280,7 @@
+