Browse Source

Merge pull request #34 from jarrettgilliam/master

Use socket.io instead of WebSockets
pull/41/head
Krishna Srinivas 9 years ago
parent
commit
b7e9179454
  1. 85
      app.js
  2. 2
      package.json
  3. 1
      public/index.html
  4. 1
      public/wetty/index.html
  5. 54
      public/wetty/wetty.js

85
app.js

@ -2,7 +2,7 @@ var express = require('express');
var http = require('http');
var https = require('https');
var path = require('path');
var ws = require('websocket').server;
var server = require('socket.io');
var pty = require('pty.js');
var fs = require('fs');
@ -90,62 +90,45 @@ if (runhttps) {
});
}
var wss = new ws({
httpServer: httpserv
});
wss.on('request', function(request) {
var term;
var io = server(httpserv,{path: '/wetty/socket.io'});
io.on('connection', function(socket){
var sshuser = '';
var conn = request.accept('wetty', request.origin);
var request = socket.request;
console.log((new Date()) + ' Connection accepted.');
if (request.resource.match('^/wetty/ssh/')) {
sshuser = request.resource;
sshuser = sshuser.replace('/wetty/ssh/', '');
}
if (sshuser) {
sshuser = sshuser + '@';
if (match = request.headers.referer.match('/wetty/ssh/.+$')) {
sshuser = match[0].replace('/wetty/ssh/', '') + '@';
} else if (globalsshuser) {
sshuser = globalsshuser + '@';
}
conn.on('message', function(msg) {
var data = JSON.parse(msg.utf8Data);
if (!term) {
if (process.getuid() == 0) {
term = pty.spawn('/bin/login', [], {
name: 'xterm-256color',
cols: 80,
rows: 30
});
} else {
term = pty.spawn('ssh', [sshuser + sshhost, '-p', sshport, '-o', 'PreferredAuthentications=' + sshauth], {
name: 'xterm-256color',
cols: 80,
rows: 30
});
}
console.log((new Date()) + " PID=" + term.pid + " STARTED on behalf of user=" + sshuser)
term.on('data', function(data) {
conn.send(JSON.stringify({
data: data
}));
});
term.on('exit', function(code) {
console.log((new Date()) + " PID=" + term.pid + " ENDED")
})
}
if (!data)
return;
if (data.rowcol) {
term.resize(data.col, data.row);
} else if (data.data) {
term.write(data.data);
}
var term;
if (process.getuid() == 0) {
term = pty.spawn('/bin/login', [], {
name: 'xterm-256color',
cols: 80,
rows: 30
});
} else {
term = pty.spawn('ssh', [sshuser + sshhost, '-p', sshport, '-o', 'PreferredAuthentications=' + sshauth], {
name: 'xterm-256color',
cols: 80,
rows: 30
});
}
console.log((new Date()) + " PID=" + term.pid + " STARTED on behalf of user=" + sshuser)
term.on('data', function(data) {
socket.emit('output', data);
});
conn.on('error', function() {
term.end();
term.on('exit', function(code) {
console.log((new Date()) + " PID=" + term.pid + " ENDED")
});
socket.on('resize', function(data) {
term.resize(data.col, data.row);
});
conn.on('close', function() {
socket.on('input', function(data) {
term.write(data);
});
socket.on('disconnect', function() {
term.end();
})
});
})

2
package.json

@ -3,7 +3,7 @@
"version": "0.1.0",
"dependencies": {
"express": "3.5.1",
"websocket": "^1.0",
"socket.io": "^1.3.7",
"pty.js": "^0.2.7-1",
"optimist": "^0.6"
},

1
public/index.html

@ -5,6 +5,7 @@
<meta charset="UTF-8">
<title>Wetty - The WebTTY Terminal Emulator</title>
<script src="/wetty/hterm_all.js"></script>
<script src="/wetty/socket.io/socket.io.js"></script>
<script src="/wetty/wetty.js"></script>
<style>
html,

1
public/wetty/index.html

@ -5,6 +5,7 @@
<meta charset="UTF-8">
<title>Wetty - The WebTTY Terminal Emulator</title>
<script src="/wetty/hterm_all.js"></script>
<script src="/wetty/socket.io/socket.io.js"></script>
<script src="/wetty/wetty.js"></script>
<style>
html,

54
public/wetty/wetty.js

@ -1,5 +1,6 @@
var term;
var ws;
var socket = io(location.origin, {path: '/wetty/socket.io'})
var buf = '';
function Wetty(argv) {
this.argv_ = argv;
@ -16,23 +17,16 @@ Wetty.prototype.run = function() {
}
Wetty.prototype.sendString_ = function(str) {
ws.send(JSON.stringify({
data: str
}));
socket.emit('input', str);
};
Wetty.prototype.onTerminalResize = function(col, row) {
if (ws)
ws.send(JSON.stringify({
rowcol: true,
col: col,
row: row
}));
socket.emit('resize', { col: col, row: row });
};
ws = new WebSocket(((window.location.protocol === 'https:') ? 'wss://' : 'ws://') + window.location.host + window.location.pathname, 'wetty');
ws.onopen = function() {
socket.on('connect', function() {
lib.init(function() {
hterm.defaultStorage = new lib.Storage.Local();
term = new hterm.Terminal();
window.term = term;
term.decorate(document.getElementById('terminal'));
@ -44,23 +38,27 @@ ws.onopen = function() {
term.prefs_.set('use-default-window-copy', true);
term.runCommandClass(Wetty, document.location.hash.substr(1));
ws.send(JSON.stringify({
rowcol: true,
socket.emit('resize', {
col: term.screenSize.width,
row: term.screenSize.height
}));
});
if (buf && buf != '')
{
term.io.writeUTF16(buf);
buf = '';
}
});
}
ws.onmessage = function(msg) {
if (!msg || !msg.data)
});
socket.on('output', function(data) {
if (!term) {
buf += data;
return;
var data = JSON.parse(msg.data);
if (term)
term.io.writeUTF16(data.data);
}
ws.onerror = function(e) {
console.log("WebSocket connection error");
}
ws.onclose = function() {
console.log("WebSocket connection closed");
}
}
term.io.writeUTF16(data);
});
socket.on('disconnect', function() {
console.log("Socket.io connection closed");
});

Loading…
Cancel
Save