trying to make it work

This commit is contained in:
Felipe Gasper
2017-09-09 23:12:01 -04:00
parent 9bb675462f
commit e442512087
5 changed files with 206 additions and 2 deletions
+3
View File
@@ -0,0 +1,3 @@
[submodule "zmodemjs"]
path = demo/zmodemjs
url = https://github.com/FGasper/zmodemjs.git
+5
View File
@@ -21,6 +21,10 @@ app.get('/main.js', function(req, res){
res.sendFile(__dirname + '/main.js');
});
app.get('/zmodemjs/*.js', function(req, res){
res.sendFile(__dirname + req.url);
});
app.post('/terminals', function (req, res) {
var cols = parseInt(req.query.cols),
rows = parseInt(req.query.rows),
@@ -59,6 +63,7 @@ app.ws('/terminals/:pid', function (ws, req) {
ws.send(logs[term.pid]);
term.on('data', function(data) {
console.log("From PTY: ", escape(data) );
try {
ws.send(data);
} catch (ex) {
+48
View File
@@ -12,9 +12,57 @@
<script src="/build/addons/fit/fit.js" ></script>
<script src="/build/addons/fullscreen/fullscreen.js" ></script>
<script src="/build/addons/search/search.js" ></script>
<script src="/zmodemjs/zmodem.js"></script>
<script src="/zmodemjs/encode.js"></script>
<script src="/zmodemjs/zmlib.js"></script>
<script src="/zmodemjs/zcrc.js"></script>
<script src="/zmodemjs/zdle.js"></script>
<script src="/zmodemjs/zheader.js"></script>
<script src="/zmodemjs/zsubpacket.js"></script>
<script src="/zmodemjs/zsession.js"></script>
<script src="/zmodemjs/zsentry.js"></script>
</head>
<body>
<h1>xterm.js: xterm, in the browser</h1>
<div id="zmodem_controls">
<form id="zm_start" style="display: none" action="javascript:void(0)">
ZMODEM detected: Start ZMODEM session?
<label><input name="zmstart" type=radio checked value="1"> Yes</label>
&nbsp;
<label><input name="zmstart" type=radio value=""> No</label>
<button type="submit">Submit</button>
</form>
<div id="zm_file" style="display: none">
<div>Name: <span id="name"></span></div>
<div>Size: <span id="size"></span></div>
<div>Last modified: <span id="mtime"></span></div>
<div>Mode: <span id="mode"></span></div>
<div>Files remaining: <span id="files_remaining"></span></div>
<div>Bytes remaining: <span id="bytes_remaining"></span></div>
</div>
<form id="zm_offer" style="display: none" action="javascript:void(0)">
<p>ZMODEM File offered!</p>
<label><input name="zmaccept" type=radio checked value="1"> Accept</label>
&nbsp;
<label><input name="zmaccept" type=radio value=""> Skip</label>
<button type="submit">Submit</button>
</form>
<form id="zm_progress" style="display: none" action="javascript:void(0)">
<div><span id="percent_received"></span>% (<span id="bytes_received"></span> bytes) received</div>
</form>
<form id="zm_choose" style="display: none" action="javascript:void(0)">
<label>Choose file(s): <input id="zm_files" type="file" multiple></label>
<button type="submit">Send</button>
</form>
</div>
<div id="terminal-container"></div>
<div>
<h2>Actions</h2>
+149 -2
View File
@@ -90,7 +90,7 @@ function createTerminal() {
socketURL = protocol + location.hostname + ((location.port) ? (':' + location.port) : '') + '/terminals/';
term.open(terminalContainer);
term.fit();
//term.fit();
// fit is called within a setTimeout, cols and rows need this.
setTimeout(() => {
@@ -109,13 +109,160 @@ function createTerminal() {
socket.onopen = runRealTerminal;
socket.onclose = runFakeTerminal;
socket.onerror = runFakeTerminal;
socket.addEventListener("message", handleWSMessage);
});
});
}, 0);
}
var text_encoder = new TextEncoder();
var zsentry = new Zmodem.Sentry();
var zsession;
function handleWSMessage(evt) {
var binary = text_encoder.encode(evt.data);
var input = Array.prototype.slice.call( new Uint8Array(binary) );
console.log("from WS", evt.data, input, evt.data.charCodeAt( evt.data.length - 2 ));
if (zsession) {
zsession.consume(input);
if (zsession.has_ended()) {
input = zsession.get_trailing_bytes();
zsession = null;
}
}
else {
let termbytes;
[termbytes, zsession] = zsentry.parse(input);
input = termbytes;
if (zsession) {
zsession.set_sender( (octets) => {
socket.send( String.fromCharCode.apply(String, octets) );
} );
var start_form = document.getElementById("zm_start");
start_form.style.display = "";
start_form.onsubmit = function(e) {
start_form.style.display = "none";
if (zsession.type === "receive") {
zsession.on("offer", function(xfer) {
_show_file_info(xfer);
var offer_form = document.getElementById("zm_offer");
offer_form.style.display = "";
offer_form.onsubmit = function(e) {
offer_form.style.display = "none";
if (offer_form.zmaccept) {
var FILE_BUFFER = [];
xfer.on("input", (payload) => {
_update_progress(xfer);
FILE_BUFFER.push.apply(FILE_BUFFER, payload);
});
xfer.accept().then( () => {
_download(xfer, FILE_BUFFER);
_hide_file_info();
} );
}
else {
_hide_file_info();
xfer.skip();
}
};
} );
zsession.start();
}
else {
var choose_form = document.getElementById("zm_choose");
choose_form.style.display = "";
choose_form.onsubmit = function(e) {
choose_form.style.display = "none";
var file_el = document.getElementById("zm_files");
var batch = [];
var total_size = 0;
for (var f=0; f<file_el.files.length; f++) {
var fobj = file_el.files[f];
batch.push( {
obj: fobj,
name: fobj.name,
size: fobj.size,
} );
total_size += fobj.size;
}
var file_idx = 0;
function promise_callback() {
var cur_b = batch[file_idx];
if (cur_b) {
file_idx++;
zsession.send_offer(cur_b).then( (xfer) => {
if (xfer === undefined) {
return promise_callback(); //skipped
}
return new Promise( (res) => {
var reader = new FileReader();
reader.onerror = function(e) {
console.error("file read error", e);
throw("File read error: " + e);
};
var offset = xfer.get_offset();
reader.onprogress = function(e) {
xfer.send(
new Uint8Array(e.target.result, offset)
);
offset = e.loaded;
};
reader.onload = function(e) {
xfer.end(
new Uint8Array(e.target.result, offset)
).then(res).then(promise_callback);
};
reader.readAsArrayBuffer(cur_b.obj);
} );
} )
}
else {
zsession.close();
choose_form.style.display = "none";
}
}
promise_callback();
};
}
};
}
}
if (input.length) {
term.write(
String.fromCharCode.apply(String, input)
);
}
}
//var text_encoder = new TextEncoder();
function runRealTerminal() {
term.attach(socket);
//term.attach(socket);
term.on("data", (d) => {
//socket.send( text_encoder.encode(d) );
socket.send(d);
});
term._initialized = true;
}
Submodule
+1
Submodule demo/zmodemjs added at eefc61c2c4