From 932ab00a53b0e4a093686038c4616bcc46a27dcc Mon Sep 17 00:00:00 2001 From: Paris Date: Tue, 24 Feb 2015 20:55:52 +0200 Subject: [PATCH] Implement buffered attaching Fixes #21 --- addons/attach/attach.js | 36 ++++++++++++++++++++++++++++-------- 1 file changed, 28 insertions(+), 8 deletions(-) diff --git a/addons/attach/attach.js b/addons/attach/attach.js index 992c790..b2cb05c 100644 --- a/addons/attach/attach.js +++ b/addons/attach/attach.js @@ -1,7 +1,7 @@ /* * Implements the attach method, that * attaches the terminal to a WebSocket stream. - * + * * The bidirectional argument indicates, whether the terminal should * send data to the socket as well and is true, by default. */ @@ -15,20 +15,40 @@ } else { /* * Plain browser environment - */ + */ attach(this.Xterm); } })(function (Xterm) { - Xterm.prototype.attach = function (socket, bidirectional) { + Xterm.prototype.attach = function (socket, bidirectional, buffered) { var term = this; bidirectional = (typeof bidirectional == 'undefined') ? true : bidirectional; this.socket = socket; - term._getMessage = function (ev) { - term.write(ev.data); + term._flushBuffer = function () { + term.write(term._attachSocketBuffer); + term._attachSocketBuffer = null; + clearTimeout(term._attachSocketBufferTimer); + term._attachSocketBufferTimer = null; }; - + + term._pushToBuffer = function (data) { + if (term._attachSocketBuffer) { + term._attachSocketBuffer += data; + } else { + term._attachSocketBuffer = data; + setTimeout(term._flushBuffer, 10); + } + }; + + term._getMessage = function (ev) { + if (buffered) { + term._pushToBuffer(ev.data); + } else { + term.write(ev.data); + } + }; + term._sendData = function (data) { socket.send(data); }; @@ -38,11 +58,11 @@ if (bidirectional) { this.on('data', term._sendData); } - + socket.addEventListener('close', term.detach.bind(term, socket)); socket.addEventListener('error', term.detach.bind(term, socket)); }; - + Xterm.prototype.detach = function (socket) { var term = this;