updates to factor out more logic to library
This commit is contained in:
@@ -22,6 +22,7 @@
|
|||||||
<script src="/zmodemjs/zsubpacket.js"></script>
|
<script src="/zmodemjs/zsubpacket.js"></script>
|
||||||
<script src="/zmodemjs/zsession.js"></script>
|
<script src="/zmodemjs/zsession.js"></script>
|
||||||
<script src="/zmodemjs/zsentry.js"></script>
|
<script src="/zmodemjs/zsentry.js"></script>
|
||||||
|
<script src="/zmodemjs/zbrowser.js"></script>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<h1>xterm.js: xterm, in the browser</h1>
|
<h1>xterm.js: xterm, in the browser</h1>
|
||||||
|
|||||||
+103
-148
@@ -138,19 +138,7 @@ function _hide_file_info() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function _download(xfer, buffer) {
|
function _download(xfer, buffer) {
|
||||||
var uint8array = new Uint8Array(buffer);
|
return Zmodem.Browser.save_to_disk(buffer, xfer.get_details().name);
|
||||||
var blob = new Blob([uint8array]);
|
|
||||||
var url = URL.createObjectURL(blob);
|
|
||||||
|
|
||||||
var el = document.createElement("a");
|
|
||||||
el.style.display = "none";
|
|
||||||
el.href = url;
|
|
||||||
el.download = xfer.get_details().name;
|
|
||||||
document.body.appendChild(el);
|
|
||||||
|
|
||||||
//It seems like a security problem that this actually works.
|
|
||||||
//But, hey.
|
|
||||||
el.click();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function _update_progress(xfer) {
|
function _update_progress(xfer) {
|
||||||
@@ -164,151 +152,118 @@ function _update_progress(xfer) {
|
|||||||
document.getElementById("percent_received").textContent = percent_received;
|
document.getElementById("percent_received").textContent = percent_received;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var start_form = document.getElementById("zm_start");
|
||||||
|
|
||||||
// END UI STUFF
|
// END UI STUFF
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
|
|
||||||
var text_encoder = new TextEncoder();
|
function _handle_receive_session(zsession) {
|
||||||
var zsentry = new Zmodem.Sentry();
|
zsession.on("offer", function(xfer) {
|
||||||
|
_show_file_info(xfer);
|
||||||
|
|
||||||
var zsession;
|
var offer_form = document.getElementById("zm_offer");
|
||||||
function handleWSMessage(evt) {
|
offer_form.style.display = "";
|
||||||
var input = Array.prototype.slice.call(
|
offer_form.onsubmit = function(e) {
|
||||||
new Uint8Array(
|
offer_form.style.display = "none";
|
||||||
(typeof evt.data === "string") ? text_encoder.encode(evt.data) : evt.data
|
|
||||||
)
|
|
||||||
);
|
|
||||||
|
|
||||||
if (zsession) {
|
//START
|
||||||
zsession.consume(input);
|
if (offer_form.zmaccept.value) {
|
||||||
if (zsession.has_ended()) {
|
var FILE_BUFFER = [];
|
||||||
if (zsession.type === "receive") {
|
xfer.on("input", (payload) => {
|
||||||
input = zsession.get_trailing_bytes();
|
_update_progress(xfer);
|
||||||
|
FILE_BUFFER.push.apply(FILE_BUFFER, payload);
|
||||||
|
});
|
||||||
|
xfer.accept().then( () => {
|
||||||
|
_download(xfer, FILE_BUFFER);
|
||||||
|
_hide_file_info();
|
||||||
|
} );
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
input = [];
|
_hide_file_info();
|
||||||
|
xfer.skip();
|
||||||
}
|
}
|
||||||
zsession = null;
|
//END
|
||||||
}
|
};
|
||||||
else input = []; //keep ZMODEM from going to the terminal
|
} );
|
||||||
|
|
||||||
|
zsession.start();
|
||||||
|
}
|
||||||
|
|
||||||
|
function _handle_send_session(zsession) {
|
||||||
|
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 files_obj = file_el.files;
|
||||||
|
|
||||||
|
Zmodem.Browser.send_files(
|
||||||
|
zsession,
|
||||||
|
files_obj,
|
||||||
|
{
|
||||||
|
on_offer_response(obj, xfer) {
|
||||||
|
console.log("offer", xfer ? "accepted" : "skipped");
|
||||||
|
},
|
||||||
|
on_file_complete(obj) {
|
||||||
|
console.log("COMPLETE", obj);
|
||||||
|
},
|
||||||
|
}
|
||||||
|
).then(
|
||||||
|
zsession.close.bind(zsession),
|
||||||
|
console.error.bind(console)
|
||||||
|
);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
var text_encoder = new TextEncoder();
|
||||||
|
var zsentry = new Zmodem.Sentry( {
|
||||||
|
to_terminal(octets) {
|
||||||
|
term.write(
|
||||||
|
String.fromCharCode.apply(String, octets)
|
||||||
|
);
|
||||||
|
},
|
||||||
|
|
||||||
|
sender(octets) {
|
||||||
|
socket.send( new Uint8Array(octets) );
|
||||||
|
},
|
||||||
|
|
||||||
|
on_retract() {
|
||||||
|
start_form.style.display = "none";
|
||||||
|
start_form.onsubmit = null;
|
||||||
|
},
|
||||||
|
|
||||||
|
on_detect(detection) {
|
||||||
|
start_form.style.display = "";
|
||||||
|
start_form.onsubmit = function(e) {
|
||||||
|
start_form.style.display = "none";
|
||||||
|
|
||||||
|
//Aborted
|
||||||
|
if (!e.currentTarget.zmstart.value) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var zsession = detection.confirm();
|
||||||
|
|
||||||
|
//HERE
|
||||||
|
if (zsession.type === "receive") {
|
||||||
|
_handle_receive_session(zsession);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
_handle_send_session(zsession);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
},
|
||||||
|
} );
|
||||||
|
|
||||||
|
function handleWSMessage(evt) {
|
||||||
|
|
||||||
|
//For some reason the first message from the server is text.
|
||||||
|
if (typeof evt.data === "string") {
|
||||||
|
term.write(evt.data);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
let termbytes;
|
zsentry.consume(evt.data);
|
||||||
[termbytes, zsession] = zsentry.parse(input);
|
|
||||||
input = termbytes;
|
|
||||||
|
|
||||||
if (zsession) {
|
|
||||||
|
|
||||||
zsession.set_sender( (octets) => {
|
|
||||||
socket.send( new Uint8Array(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)
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+1
-1
Submodule demo/zmodemjs updated: 7220230d12...f19e3fcfc0
Reference in New Issue
Block a user