diff --git a/demo/client.ts b/demo/client.ts index 2d7c800d..01789402 100644 --- a/demo/client.ts +++ b/demo/client.ts @@ -27,7 +27,6 @@ declare let window: IWindowWithTerminal; Terminal.applyAddon(fit); let term; -let attachAddon: AttachAddon; let searchAddon: SearchAddon; let protocol; let socketURL; @@ -90,8 +89,6 @@ function createTerminal(): void { // Load addons const typedTerm = term as TerminalType; typedTerm.loadAddon(new WebLinksAddon()); - attachAddon = new AttachAddon(); - typedTerm.loadAddon(attachAddon); searchAddon = new SearchAddon(); typedTerm.loadAddon(searchAddon); @@ -152,7 +149,14 @@ function createTerminal(): void { } function runRealTerminal(): void { - attachAddon.attach(socket); + /** + * The demo defaults to string transport by default. + * To run it with UTF8 binary transport, swap comment on + * the lines below. (Must also be switched in server.js) + */ + term.loadAddon(new AttachAddon(socket)); + // term.loadAddon(new AttachAddon(socket, {inputUtf8: true})); + term._initialized = true; } diff --git a/demo/server.js b/demo/server.js index 8270a398..e3473400 100644 --- a/demo/server.js +++ b/demo/server.js @@ -3,6 +3,13 @@ var expressWs = require('express-ws'); var os = require('os'); var pty = require('node-pty'); +/** + * Whether to use UTF8 binary transport. + * (Must also be switched in client.ts) + */ +const USE_BINARY_UTF8 = false; + + function startServer() { var app = express(); expressWs(app); @@ -36,7 +43,8 @@ function startServer() { cols: cols || 80, rows: rows || 24, cwd: process.env.PWD, - env: process.env + env: process.env, + encoding: USE_BINARY_UTF8 ? null : 'utf8' }); console.log('Created terminal with PID: ' + term.pid); @@ -65,6 +73,7 @@ function startServer() { console.log('Connected to terminal ' + term.pid); ws.send(logs[term.pid]); + // string message buffering function buffer(socket, timeout) { let s = ''; let sender = null; @@ -79,7 +88,25 @@ function startServer() { } }; } - const send = buffer(ws, 5); + // binary message buffering + function bufferUtf8(socket, timeout) { + let buffer = []; + let sender = null; + let length = 0; + return (data) => { + buffer.push(data); + length += data.length; + if (!sender) { + sender = setTimeout(() => { + socket.send(Buffer.concat(buffer, length)); + buffer = []; + sender = null; + length = 0; + }, timeout); + } + }; + } + const send = USE_BINARY_UTF8 ? bufferUtf8(ws, 5) : buffer(ws, 5); term.on('data', function(data) { try { diff --git a/package.json b/package.json index cafa43b1..043b76cb 100644 --- a/package.json +++ b/package.json @@ -40,13 +40,13 @@ "ts-loader": "^4.5.0", "tslint": "^5.9.1", "tslint-consistent-codestyle": "^1.13.0", - "utf8": "^3.0.0", "typescript": "3.4", + "utf8": "^3.0.0", "vinyl-buffer": "^1.0.0", "vinyl-source-stream": "^1.1.0", "webpack": "^4.17.1", "webpack-cli": "^3.1.0", - "xterm-addon-attach": "0.1.0-beta7", + "xterm-addon-attach": "0.1.0-beta8", "xterm-addon-search": "0.1.0-beta4", "xterm-addon-web-links": "0.1.0-beta6", "zmodem.js": "^0.1.5" diff --git a/yarn.lock b/yarn.lock index 3db8e9a4..321fe6f3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7236,10 +7236,10 @@ xregexp@4.0.0: resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" integrity sha1-pcbVMr5lbiPbgg77lDofBJmNY68= -xterm-addon-attach@0.1.0-beta7: - version "0.1.0-beta7" - resolved "https://registry.yarnpkg.com/xterm-addon-attach/-/xterm-addon-attach-0.1.0-beta7.tgz#787f6cce709611ee08ab731b95a62fa1c0bce6a9" - integrity sha512-nQr6LcYtpZcyDoHyL/BDIPJcTgL7qlHR/rvm8lSizQysGVT0pSzr5M7SjY3kQHw33U3hTer3c6oZzwjfj4ohOw== +xterm-addon-attach@0.1.0-beta8: + version "0.1.0-beta8" + resolved "https://registry.yarnpkg.com/xterm-addon-attach/-/xterm-addon-attach-0.1.0-beta8.tgz#e469ed9d6ab7e535d0a9ffae23ef4f2efe58163b" + integrity sha512-HtQuwqnvcR+SwI9/JbBMd//Il+oEeo3rWrIucLLKHT8sB+OAOkdhmo5KIM/hhnovjI040WJ+tTHkDgPFwIJtmw== xterm-addon-search@0.1.0-beta4: version "0.1.0-beta4"