Commit 0093aef1 authored by martin hou's avatar martin hou

fix: adding timeout for getFile()

parent 922d4049
...@@ -1248,40 +1248,62 @@ Jensen.prototype.getFile = async function (filename, length, ondata, onprogress) ...@@ -1248,40 +1248,62 @@ Jensen.prototype.getFile = async function (filename, length, ondata, onprogress)
// document.addEventListener('visibilitychange', visibilitychange); // document.addEventListener('visibilitychange', visibilitychange);
let stime = new Date(); let stime = new Date();
let flen = 0; let flen = 0;
let finished = false;
let lastActivityTime = Date.now();
const IDLE_TIMEOUT_MS = 2000;
const idleTimer = setInterval(() => {
if (finished) {
clearInterval(idleTimer);
return;
}
if (Date.now() - lastActivityTime > IDLE_TIMEOUT_MS) {
clearInterval(idleTimer);
if (!finished) {
finished = true;
Logger.info(this.identifier(), 'getFile',
`transfer timeout: no data for ${IDLE_TIMEOUT_MS}ms, received ${flen}/${length} bytes`);
ondata('fail');
}
}
}, 500);
let handler = (msg) => { let handler = (msg) => {
if (finished) return;
lastActivityTime = Date.now();
if (msg != null) { if (msg != null) {
const bodyLen = msg.body ? (msg.body.byteLength ?? msg.body.length ?? 0) : 0; const bodyLen = msg.body ? (msg.body.byteLength ?? msg.body.length ?? 0) : 0;
if (bodyLen === 0 && flen === 0) { if (bodyLen === 0 && flen === 0) {
finished = true;
clearInterval(idleTimer);
Logger.info(this.identifier(), 'getFile', 'file not found (0-length body).'); Logger.info(this.identifier(), 'getFile', 'file not found (0-length body).');
ondata('fail'); ondata('fail');
return 'fail'; return 'fail';
} }
flen += bodyLen; flen += bodyLen;
ondata(msg.body); ondata(msg.body);
// Logger.info('jensen', 'getFile length', `${length} ${flen}`);
if (flen >= length) { if (flen >= length) {
// document.removeEventListener('visibilitychange', visibilitychange); finished = true;
clearInterval(idleTimer);
let cost = new Date().getTime() - stime.getTime(); let cost = new Date().getTime() - stime.getTime();
Logger.info(this.identifier(), 'getFile', 'file transfer finish, cost: ' + cost + ' ms'); Logger.info(this.identifier(), 'getFile', 'file transfer finish, cost: ' + cost + ' ms');
// clearEventAndTask();
// return OK indicates all file blocks received
return 'OK'; return 'OK';
} }
} else { } else {
// document.removeEventListener('visibilitychange', visibilitychange); finished = true;
// clearEventAndTask(); clearInterval(idleTimer);
Logger.info(this.identifier(), 'getFile', 'file transfer fail.'); Logger.info(this.identifier(), 'getFile', 'file transfer fail.');
ondata('fail'); ondata('fail');
return 'fail'; return 'fail';
} }
}; };
// this.onreceive = onprogress;
this._progress_report = {}; this._progress_report = {};
// try { onprogress(0); } catch(e) {}
let self = this; let self = this;
this.onprogress = onprogress; this.onprogress = onprogress;
this.onreceive = function(recvBytes) this.onreceive = function(recvBytes)
{ {
lastActivityTime = Date.now();
let percent = Math.floor(recvBytes / length * 100); let percent = Math.floor(recvBytes / length * 100);
let k = 't' + percent; let k = 't' + percent;
if (percent > 0 && percent < 100) if (percent > 0 && percent < 100)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment