summaryrefslogtreecommitdiff
path: root/app/assets/javascripts/terminal/xterm/attach.js
diff options
context:
space:
mode:
Diffstat (limited to 'app/assets/javascripts/terminal/xterm/attach.js')
-rwxr-xr-xapp/assets/javascripts/terminal/xterm/attach.js134
1 files changed, 134 insertions, 0 deletions
diff --git a/app/assets/javascripts/terminal/xterm/attach.js b/app/assets/javascripts/terminal/xterm/attach.js
new file mode 100755
index 00000000000..24a45eaea02
--- /dev/null
+++ b/app/assets/javascripts/terminal/xterm/attach.js
@@ -0,0 +1,134 @@
+/*
+ * 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.
+ */
+
+(function (attach) {
+ if (typeof exports === 'object' && typeof module === 'object') {
+ /*
+ * CommonJS environment
+ */
+ module.exports = attach(require('../../src/xterm'));
+ } else if (typeof define == 'function') {
+ /*
+ * Require.js is available
+ */
+ define(['../../src/xterm'], attach);
+ } else {
+ /*
+ * Plain browser environment
+ */
+ attach(this.Xterm);
+ }
+})(function (Xterm) {
+ 'use strict';
+
+ /**
+ * This module provides methods for attaching a terminal to a WebSocket
+ * stream.
+ *
+ * @module xterm/addons/attach/attach
+ */
+ var exports = {};
+
+ /**
+ * Attaches the given terminal to the given socket.
+ *
+ * @param {Xterm} term - The terminal to be attached to the given socket.
+ * @param {WebSocket} socket - The socket to attach the current terminal.
+ * @param {boolean} bidirectional - Whether the terminal should send data
+ * to the socket as well.
+ * @param {boolean} buffered - Whether the rendering of incoming data
+ * should happen instantly or at a maximum
+ * frequency of 1 rendering per 10ms.
+ */
+ exports.attach = function (term, socket, bidirectional, buffered) {
+ bidirectional = (typeof bidirectional == 'undefined') ? true : bidirectional;
+ term.socket = socket;
+
+ 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);
+ };
+
+ socket.addEventListener('message', term._getMessage);
+
+ if (bidirectional) {
+ term.on('data', term._sendData);
+ }
+
+ socket.addEventListener('close', term.detach.bind(term, socket));
+ socket.addEventListener('error', term.detach.bind(term, socket));
+ };
+
+ /**
+ * Detaches the given terminal from the given socket
+ *
+ * @param {Xterm} term - The terminal to be detached from the given socket.
+ * @param {WebSocket} socket - The socket from which to detach the current
+ * terminal.
+ */
+ exports.detach = function (term, socket) {
+ term.off('data', term._sendData);
+
+ socket = (typeof socket == 'undefined') ? term.socket : socket;
+
+ if (socket) {
+ socket.removeEventListener('message', term._getMessage);
+ }
+
+ delete term.socket;
+ };
+
+ /**
+ * Attaches the current terminal to the given socket
+ *
+ * @param {WebSocket} socket - The socket to attach the current terminal.
+ * @param {boolean} bidirectional - Whether the terminal should send data
+ * to the socket as well.
+ * @param {boolean} buffered - Whether the rendering of incoming data
+ * should happen instantly or at a maximum
+ * frequency of 1 rendering per 10ms.
+ */
+ Xterm.prototype.attach = function (socket, bidirectional, buffered) {
+ return exports.attach(this, socket, bidirectional, buffered);
+ };
+
+ /**
+ * Detaches the current terminal from the given socket.
+ *
+ * @param {WebSocket} socket - The socket from which to detach the current
+ * terminal.
+ */
+ Xterm.prototype.detach = function (socket) {
+ return exports.detach(this, socket);
+ };
+
+ return exports;
+});