mirror of
https://github.com/wavetermdev/xterm.js.git
synced 2026-08-05 13:43:48 -07:00
trying to make it work
This commit is contained in:
@@ -0,0 +1,3 @@
|
||||
[submodule "zmodemjs"]
|
||||
path = demo/zmodemjs
|
||||
url = https://github.com/FGasper/zmodemjs.git
|
||||
@@ -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) {
|
||||
|
||||
@@ -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>
|
||||
|
||||
<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>
|
||||
|
||||
<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
@@ -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
Reference in New Issue
Block a user