Krishna Srinivas
11 years ago
6 changed files with 15814 additions and 0 deletions
@ -0,0 +1,86 @@ |
|||||
|
var express = require('express'); |
||||
|
var http = require('http'); |
||||
|
var https = require('https'); |
||||
|
var path = require('path'); |
||||
|
var ws = require('websocket').server; |
||||
|
var pty = require('pty.js'); |
||||
|
var fs = require('fs'); |
||||
|
|
||||
|
|
||||
|
var opts = require('optimist') |
||||
|
.options({ |
||||
|
sslkey: { |
||||
|
demand: false, |
||||
|
description: 'path to SSL key' |
||||
|
}, |
||||
|
sslcert: { |
||||
|
demand: false, |
||||
|
description: 'path to SSL certificate' |
||||
|
}, |
||||
|
port: { |
||||
|
demand: true, |
||||
|
alias: 'p', |
||||
|
description: 'port' |
||||
|
} |
||||
|
}).boolean('allow_discovery').argv; |
||||
|
|
||||
|
var runhttps = false; |
||||
|
|
||||
|
if (opts.sslkey && opts.sslcert) { |
||||
|
runhttps = true; |
||||
|
opts['ssl'] = {}; |
||||
|
opts.ssl['key'] = fs.readFileSync(path.resolve(opts.sslkey)); |
||||
|
opts.ssl['cert'] = fs.readFileSync(path.resolve(opts.sslcert)); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
process.on('uncaughtException', function(e) { |
||||
|
console.error('Error: ' + e); |
||||
|
}); |
||||
|
|
||||
|
var httpserv; |
||||
|
|
||||
|
var app = express(); |
||||
|
app.use('/', express.static(path.join(__dirname, 'public'))); |
||||
|
|
||||
|
if (runhttps) { |
||||
|
httpserv = https.createServer(opts.ssl, app).listen(opts.port, function() { |
||||
|
console.log('https on port ' + opts.port); |
||||
|
}); |
||||
|
} else { |
||||
|
httpserv = http.createServer(app).listen(opts.port, function() { |
||||
|
console.log('http on port ' + opts.port); |
||||
|
}); |
||||
|
} |
||||
|
|
||||
|
var wss = new ws({ |
||||
|
httpServer: httpserv |
||||
|
}); |
||||
|
|
||||
|
wss.on('request', function(request) { |
||||
|
var term; |
||||
|
var conn = request.accept('wetty', request.origin); |
||||
|
console.log((new Date()) + ' Connection accepted.'); |
||||
|
conn.on('message', function(msg) { |
||||
|
var data = JSON.parse(msg.utf8Data); |
||||
|
if (!term) { |
||||
|
term = pty.spawn('/bin/login', [], { |
||||
|
name: 'xterm-256color', |
||||
|
cols: 80, |
||||
|
rows: 30 |
||||
|
}); |
||||
|
term.on('data', function(data) { |
||||
|
conn.send(JSON.stringify({ |
||||
|
data: data |
||||
|
})); |
||||
|
}); |
||||
|
} |
||||
|
if (!data) |
||||
|
return; |
||||
|
if (data.rowcol) { |
||||
|
term.resize(data.col, data.row); |
||||
|
} else if (data.data) { |
||||
|
term.write(data.data); |
||||
|
} |
||||
|
}); |
||||
|
}) |
@ -0,0 +1,10 @@ |
|||||
|
{ |
||||
|
"name": "Wetty", |
||||
|
"version": "0.0.5", |
||||
|
"dependencies": { |
||||
|
"express": "3.5.1", |
||||
|
"websocket": "", |
||||
|
"pty.js": "", |
||||
|
"optimist": "" |
||||
|
} |
||||
|
} |
File diff suppressed because it is too large
File diff suppressed because it is too large
@ -0,0 +1,30 @@ |
|||||
|
<!doctype html> |
||||
|
<html lang="en"> |
||||
|
|
||||
|
<head> |
||||
|
<meta charset="UTF-8"> |
||||
|
<title>wtf</title> |
||||
|
<script src="hterm_all.js"></script> |
||||
|
<script src="hterm.js"></script> |
||||
|
<script src="wetty.js"></script> |
||||
|
<style> |
||||
|
html, |
||||
|
body { |
||||
|
height: 100%; |
||||
|
width: 100%; |
||||
|
margin: 0px; |
||||
|
} |
||||
|
#terminal { |
||||
|
display: block; |
||||
|
position: relative; |
||||
|
width: 100%; |
||||
|
height: 100%; |
||||
|
} |
||||
|
</style> |
||||
|
</head> |
||||
|
|
||||
|
<body> |
||||
|
<div id="terminal"></div> |
||||
|
</body> |
||||
|
|
||||
|
</html> |
@ -0,0 +1,62 @@ |
|||||
|
var term; |
||||
|
var ws; |
||||
|
|
||||
|
function Wetty(argv) { |
||||
|
this.argv_ = argv; |
||||
|
this.io = null; |
||||
|
this.pid_ = -1; |
||||
|
} |
||||
|
|
||||
|
Wetty.prototype.run = function() { |
||||
|
this.io = this.argv_.io.push(); |
||||
|
|
||||
|
this.io.onVTKeystroke = this.sendString_.bind(this); |
||||
|
this.io.sendString = this.sendString_.bind(this); |
||||
|
this.io.onTerminalResize = this.onTerminalResize.bind(this); |
||||
|
} |
||||
|
|
||||
|
Wetty.prototype.sendString_ = function(str) { |
||||
|
ws.send(JSON.stringify({ |
||||
|
data: str |
||||
|
})); |
||||
|
}; |
||||
|
|
||||
|
Wetty.prototype.onTerminalResize = function(col, row) { |
||||
|
if (ws) |
||||
|
ws.send(JSON.stringify({ |
||||
|
rowcol: true, |
||||
|
col: col, |
||||
|
row: row |
||||
|
})); |
||||
|
}; |
||||
|
|
||||
|
ws = new WebSocket(((window.location.protocol === 'https:') ? 'wss://' : 'ws://') + window.location.host, 'wetty'); |
||||
|
ws.onopen = function() { |
||||
|
lib.init(function() { |
||||
|
term = new hterm.Terminal(); |
||||
|
window.term = term; |
||||
|
term.decorate(document.getElementById('terminal')); |
||||
|
|
||||
|
term.setCursorPosition(0, 0); |
||||
|
term.setCursorVisible(true); |
||||
|
term.runCommandClass(Wetty, document.location.hash.substr(1)); |
||||
|
ws.send(JSON.stringify({ |
||||
|
rowcol: true, |
||||
|
col: term.screenSize.width, |
||||
|
row: term.screenSize.height |
||||
|
})); |
||||
|
}); |
||||
|
} |
||||
|
ws.onmessage = function(msg) { |
||||
|
if (!msg || !msg.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"); |
||||
|
} |
Loading…
Reference in new issue