mirror of
https://github.com/9001/copyparty.git
synced 2025-08-18 09:22:31 -06:00
browser compat + multitasking switch
This commit is contained in:
parent
ea7c82c5e4
commit
d98daf96be
|
@ -44,6 +44,7 @@ class Up2k(object):
|
||||||
try:
|
try:
|
||||||
job = self.registry[wark]
|
job = self.registry[wark]
|
||||||
if job["vdir"] != cj["vdir"] or job["name"] != cj["name"]:
|
if job["vdir"] != cj["vdir"] or job["name"] != cj["name"]:
|
||||||
|
print("\n".join([job["vdir"], cj["vdir"], job["name"], cj["name"]]))
|
||||||
raise Pebkac(400, "unexpected filepath")
|
raise Pebkac(400, "unexpected filepath")
|
||||||
|
|
||||||
except KeyError:
|
except KeyError:
|
||||||
|
@ -119,7 +120,9 @@ class Up2k(object):
|
||||||
|
|
||||||
for k in cj["hash"]:
|
for k in cj["hash"]:
|
||||||
if not self.r_hash.match(k):
|
if not self.r_hash.match(k):
|
||||||
raise Pebkac(400, "at least one hash is not according to spec")
|
raise Pebkac(
|
||||||
|
400, "at least one hash is not according to spec: {}".format(k)
|
||||||
|
)
|
||||||
|
|
||||||
# server-reproducible file identifier, independent of name or location
|
# server-reproducible file identifier, independent of name or location
|
||||||
ident = [self.salt, str(cj["size"])]
|
ident = [self.salt, str(cj["size"])]
|
||||||
|
|
|
@ -153,7 +153,7 @@ function up2k_init(have_crypto) {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
function cfg(name) {
|
function cfg_get(name) {
|
||||||
var val = localStorage.getItem(name);
|
var val = localStorage.getItem(name);
|
||||||
if (val === null)
|
if (val === null)
|
||||||
return parseInt(o(name).value);
|
return parseInt(o(name).value);
|
||||||
|
@ -162,9 +162,29 @@ function up2k_init(have_crypto) {
|
||||||
return val;
|
return val;
|
||||||
}
|
}
|
||||||
|
|
||||||
var parallel_uploads = cfg('nthread');
|
function bcfg_get(name, defval) {
|
||||||
|
var val = localStorage.getItem(name);
|
||||||
|
if (val === null)
|
||||||
|
val = defval;
|
||||||
|
else
|
||||||
|
val = (val == '1');
|
||||||
|
|
||||||
var col_hashing = '#0099ff';
|
o(name).checked = val;
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
|
||||||
|
function bcfg_set(name, val) {
|
||||||
|
localStorage.setItem(
|
||||||
|
name, val ? '1' : '0');
|
||||||
|
|
||||||
|
o(name).checked = val;
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
|
||||||
|
var parallel_uploads = cfg_get('nthread');
|
||||||
|
var multitask = bcfg_get('multitask', true);
|
||||||
|
|
||||||
|
var col_hashing = '#00bbff';
|
||||||
var col_hashed = '#004466';
|
var col_hashed = '#004466';
|
||||||
var col_uploading = '#ffcc44';
|
var col_uploading = '#ffcc44';
|
||||||
var col_uploaded = '#00bb00';
|
var col_uploaded = '#00bb00';
|
||||||
|
@ -225,6 +245,7 @@ function up2k_init(have_crypto) {
|
||||||
return alert('no files selected??');
|
return alert('no files selected??');
|
||||||
|
|
||||||
more_one_file();
|
more_one_file();
|
||||||
|
var bad_files = [];
|
||||||
for (var a = 0; a < files.length; a++) {
|
for (var a = 0; a < files.length; a++) {
|
||||||
var fobj = files[a];
|
var fobj = files[a];
|
||||||
if (is_itemlist) {
|
if (is_itemlist) {
|
||||||
|
@ -238,10 +259,8 @@ function up2k_init(have_crypto) {
|
||||||
throw 1;
|
throw 1;
|
||||||
}
|
}
|
||||||
catch (ex) {
|
catch (ex) {
|
||||||
return alert(
|
bad_files.push([a, fobj.name]);
|
||||||
'Due to a browser bug, Firefox-Android can only select one file at a time. ' +
|
continue;
|
||||||
'This works in "Firefox Preview" (new Firefox, currently in beta).\n\n' +
|
|
||||||
'Google firefox bug 1456557 for more info');
|
|
||||||
}
|
}
|
||||||
var entry = {
|
var entry = {
|
||||||
"n": parseInt(st.files.length.toString()),
|
"n": parseInt(st.files.length.toString()),
|
||||||
|
@ -269,6 +288,17 @@ function up2k_init(have_crypto) {
|
||||||
st.files.push(entry);
|
st.files.push(entry);
|
||||||
st.todo.hash.push(entry);
|
st.todo.hash.push(entry);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (bad_files.length > 0) {
|
||||||
|
var msg = 'These files were skipped because they are empty:\n';
|
||||||
|
for (var a = 0; a < bad_files.length; a++)
|
||||||
|
msg += '-- ' + bad_files[a][1] + '\n';
|
||||||
|
|
||||||
|
if (files.length - bad_files.length <= 1 && /(android)/i.test(navigator.userAgent))
|
||||||
|
msg += '\nFirefox-Android has a bug which prevents selecting multiple files. Try selecting one file at a time. For more info, see firefox bug 1456557';
|
||||||
|
|
||||||
|
alert(msg);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
o('u2btn').addEventListener('drop', gotfile, false);
|
o('u2btn').addEventListener('drop', gotfile, false);
|
||||||
|
|
||||||
|
@ -286,6 +316,19 @@ function up2k_init(have_crypto) {
|
||||||
/// actuator
|
/// actuator
|
||||||
//
|
//
|
||||||
|
|
||||||
|
function handshakes_permitted() {
|
||||||
|
return multitask || (
|
||||||
|
st.todo.upload.length == 0 &&
|
||||||
|
st.busy.upload.length == 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
function hashing_permitted() {
|
||||||
|
return multitask || (
|
||||||
|
handshakes_permitted() &&
|
||||||
|
st.todo.handshake.length == 0 &&
|
||||||
|
st.busy.handshake.length == 0);
|
||||||
|
}
|
||||||
|
|
||||||
var tasker = (function () {
|
var tasker = (function () {
|
||||||
var mutex = false;
|
var mutex = false;
|
||||||
|
|
||||||
|
@ -297,13 +340,8 @@ function up2k_init(have_crypto) {
|
||||||
while (true) {
|
while (true) {
|
||||||
var mou_ikkai = false;
|
var mou_ikkai = false;
|
||||||
|
|
||||||
if (st.todo.hash.length > 0 &&
|
if (handshakes_permitted() &&
|
||||||
st.busy.hash.length == 0) {
|
st.todo.handshake.length > 0 &&
|
||||||
exec_hash();
|
|
||||||
mou_ikkai = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (st.todo.handshake.length > 0 &&
|
|
||||||
st.busy.handshake.length == 0 &&
|
st.busy.handshake.length == 0 &&
|
||||||
st.busy.upload.length < parallel_uploads) {
|
st.busy.upload.length < parallel_uploads) {
|
||||||
exec_handshake();
|
exec_handshake();
|
||||||
|
@ -316,6 +354,13 @@ function up2k_init(have_crypto) {
|
||||||
mou_ikkai = true;
|
mou_ikkai = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (hashing_permitted() &&
|
||||||
|
st.todo.hash.length > 0 &&
|
||||||
|
st.busy.hash.length == 0) {
|
||||||
|
exec_hash();
|
||||||
|
mou_ikkai = true;
|
||||||
|
}
|
||||||
|
|
||||||
if (!mou_ikkai) {
|
if (!mou_ikkai) {
|
||||||
setTimeout(taskerd, 100);
|
setTimeout(taskerd, 100);
|
||||||
mutex = false;
|
mutex = false;
|
||||||
|
@ -466,7 +511,9 @@ function up2k_init(have_crypto) {
|
||||||
};
|
};
|
||||||
|
|
||||||
var hash_done = function (hashbuf) {
|
var hash_done = function (hashbuf) {
|
||||||
t.hash.push(buf2b64(hashbuf.slice(0, 32)).replace(/=$/, ''));
|
var hslice = new Uint8Array(hashbuf).subarray(0, 32);
|
||||||
|
var b64str = buf2b64(hslice).replace(/=$/, '');
|
||||||
|
t.hash.push(b64str);
|
||||||
|
|
||||||
prog(t.n, nchunk, col_hashed);
|
prog(t.n, nchunk, col_hashed);
|
||||||
if (++nchunk < nchunks) {
|
if (++nchunk < nchunks) {
|
||||||
|
@ -523,7 +570,7 @@ function up2k_init(have_crypto) {
|
||||||
? col_uploaded : col_hashed);
|
? col_uploaded : col_hashed);
|
||||||
|
|
||||||
var done = true;
|
var done = true;
|
||||||
var msg = 'completed';
|
var msg = '🎷🐛';
|
||||||
if (t.postlist.length > 0) {
|
if (t.postlist.length > 0) {
|
||||||
for (var a = 0; a < t.postlist.length; a++)
|
for (var a = 0; a < t.postlist.length; a++)
|
||||||
st.todo.upload.push({
|
st.todo.upload.push({
|
||||||
|
@ -540,7 +587,7 @@ function up2k_init(have_crypto) {
|
||||||
if (done) {
|
if (done) {
|
||||||
var spd1 = (t.size / ((t.t1 - t.t0) / 1000.)) / (1024 * 1024.);
|
var spd1 = (t.size / ((t.t1 - t.t0) / 1000.)) / (1024 * 1024.);
|
||||||
var spd2 = (t.size / ((t.t2 - t.t1) / 1000.)) / (1024 * 1024.);
|
var spd2 = (t.size / ((t.t2 - t.t1) / 1000.)) / (1024 * 1024.);
|
||||||
o('f{0}p'.format(t.n)).innerHTML = '🎷🐛 (hash {0} MB/s | upload {1} MB/s)'.format(
|
o('f{0}p'.format(t.n)).innerHTML = 'hash {0}, up {1} MB/s'.format(
|
||||||
spd1.toFixed(2), spd2.toFixed(2));
|
spd1.toFixed(2), spd2.toFixed(2));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -678,6 +725,11 @@ function up2k_init(have_crypto) {
|
||||||
bumpthread({ "target": 1 })
|
bumpthread({ "target": 1 })
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function tgl_multitask() {
|
||||||
|
multitask = !multitask;
|
||||||
|
bcfg_set('multitask', multitask);
|
||||||
|
}
|
||||||
|
|
||||||
function nop(ev) {
|
function nop(ev) {
|
||||||
ev.preventDefault();
|
ev.preventDefault();
|
||||||
this.click();
|
this.click();
|
||||||
|
@ -693,6 +745,7 @@ function up2k_init(have_crypto) {
|
||||||
};
|
};
|
||||||
|
|
||||||
o('nthread').addEventListener('input', bumpthread, false);
|
o('nthread').addEventListener('input', bumpthread, false);
|
||||||
|
o('multitask').addEventListener('click', tgl_multitask, false);
|
||||||
|
|
||||||
var nodes = o('u2conf').getElementsByTagName('a');
|
var nodes = o('u2conf').getElementsByTagName('a');
|
||||||
for (var a = nodes.length - 1; a >= 0; a--)
|
for (var a = nodes.length - 1; a >= 0; a--)
|
||||||
|
|
|
@ -86,7 +86,7 @@
|
||||||
width: 40%;
|
width: 40%;
|
||||||
}
|
}
|
||||||
#u2tab tr+tr:hover td {
|
#u2tab tr+tr:hover td {
|
||||||
background: #fea;
|
background: #222;
|
||||||
}
|
}
|
||||||
#u2conf {
|
#u2conf {
|
||||||
margin: 1em auto;
|
margin: 1em auto;
|
||||||
|
@ -100,7 +100,7 @@
|
||||||
border: none;
|
border: none;
|
||||||
outline: none;
|
outline: none;
|
||||||
}
|
}
|
||||||
#u2conf input {
|
#u2conf .txtbox {
|
||||||
width: 4em;
|
width: 4em;
|
||||||
color: #fff;
|
color: #fff;
|
||||||
background: #444;
|
background: #444;
|
||||||
|
@ -126,8 +126,12 @@
|
||||||
#u2conf input+a {
|
#u2conf input+a {
|
||||||
background: #d80;
|
background: #d80;
|
||||||
}
|
}
|
||||||
|
#u2foot {
|
||||||
|
color: #fff;
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
.prog {
|
.prog {
|
||||||
font-family: monospace, monospace;
|
font-family: monospace;
|
||||||
}
|
}
|
||||||
.prog>div {
|
.prog>div {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
|
|
|
@ -19,9 +19,13 @@
|
||||||
<tr>
|
<tr>
|
||||||
<td>
|
<td>
|
||||||
<a href="#" id="nthread_sub">–</a>
|
<a href="#" id="nthread_sub">–</a>
|
||||||
<input id="nthread" value="2" />
|
<input class="txtbox" id="nthread" value="2" />
|
||||||
<a href="#" id="nthread_add">+</a>
|
<a href="#" id="nthread_add">+</a>
|
||||||
</td>
|
</td>
|
||||||
|
<td rowspan="2">
|
||||||
|
<input type="checkbox" id="multitask" />
|
||||||
|
<label for="multitask">hash while<br />uploading</label>
|
||||||
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue