From cc67742d3ad81c5474d71fba3172d45c61abcc52 Mon Sep 17 00:00:00 2001 From: Ylian Saint-Hilaire Date: Wed, 10 Jun 2020 12:10:32 -0700 Subject: [PATCH] Improved websocket speed for MSTSC.js bitmaps. --- mstsc.js | 4 ++- public/mstsc/js/client.js | 61 ++++++++++++++++++++++----------------- 2 files changed, 38 insertions(+), 27 deletions(-) diff --git a/mstsc.js b/mstsc.js index 3344aebf..74025fd5 100644 --- a/mstsc.js +++ b/mstsc.js @@ -84,7 +84,9 @@ module.exports.CreateMstscRelay = function (parent, db, ws, req, args, domain, u }).on('connect', function () { send(['rdp-connect']); }).on('bitmap', function (bitmap) { - send(['rdp-bitmap', bitmap]); + try { ws.send(bitmap.data); } catch (ex) { } // Send the bitmap data as binary + delete bitmap.data; + send(['rdp-bitmap', bitmap]); // Send the bitmap metadata seperately, without bitmap data. }).on('close', function () { send(['rdp-close']); }).on('error', function (err) { diff --git a/public/mstsc/js/client.js b/public/mstsc/js/client.js index 61842fc4..de9c93ce 100644 --- a/public/mstsc/js/client.js +++ b/public/mstsc/js/client.js @@ -129,6 +129,7 @@ // start connection var self = this; this.socket = new WebSocket("wss://" + window.location.host + "/mstsc/relay.ashx"); + this.socket.binaryType = 'arraybuffer'; this.socket.onopen = function () { console.log("WS-OPEN"); self.socket.send(JSON.stringify(['infos', { @@ -145,33 +146,41 @@ }])); }; this.socket.onmessage = function (evt) { - var msg = JSON.parse(evt.data); - switch (msg[0]) { - case 'rdp-connect': { - //console.log('[mstsc.js] connected'); - self.activeSession = true; - break; - } - case 'rdp-bitmap': { - var bitmap = msg[1]; - bitmap.data = new Uint8Array(bitmap.data.data).buffer; - //console.log('[mstsc.js] bitmap update bpp : ' + bitmap.bitsPerPixel); - self.render.update(bitmap); - break; - } - case 'rdp-close': { - //console.log('[mstsc.js] close'); - self.activeSession = false; - next(null); - break; - } - case 'rdp-error': { - var err = msg[1]; - console.log('[mstsc.js] error : ' + err.code + '(' + err.message + ')'); - self.activeSession = false; - next(err); - break; + if (typeof evt.data == 'string') { + // This is a JSON text string, parse it. + var msg = JSON.parse(evt.data); + switch (msg[0]) { + case 'rdp-connect': { + //console.log('[mstsc.js] connected'); + self.activeSession = true; + break; + } + case 'rdp-bitmap': { + if (self.bitmapData == null) break; + var bitmap = msg[1]; + bitmap.data = self.bitmapData; // Use the binary data that was sent earlier. + delete self.bitmapData; + //console.log('[mstsc.js] bitmap update bpp : ' + bitmap.bitsPerPixel); + self.render.update(bitmap); + break; + } + case 'rdp-close': { + //console.log('[mstsc.js] close'); + self.activeSession = false; + next(null); + break; + } + case 'rdp-error': { + var err = msg[1]; + console.log('[mstsc.js] error : ' + err.code + '(' + err.message + ')'); + self.activeSession = false; + next(err); + break; + } } + } else { + // This is binary bitmap data, store it. + self.bitmapData = evt.data; } }; this.socket.onclose = function () {