From cf24c81f3e2e538301c9097781d36e21b8360a54 Mon Sep 17 00:00:00 2001 From: dosse91 Date: Fri, 3 Mar 2017 14:20:27 +0100 Subject: [PATCH] Minor improvement to previous commit --- doc.pdf | Bin 56594 -> 56589 bytes speedtest_worker.js | 12 ++++++------ speedtest_worker.min.js | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/doc.pdf b/doc.pdf index 6f1d41e719b678916c6979c70917cc6a34d5b3ca..13cb8d9efd50707917a9189bd06f2773fa8ce142 100644 GIT binary patch delta 14645 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

Lp5PmWL-%y*vtX`dlmX{GmSRGVhl)=0NPMVdwac zMgEcxW zHXkuY0zDA31n*Wbamb*FEdNg_r=+-KZnAd z2s^V!Jn^qh7(ne=-r(v3!c4Pde#_!Dn=+D5o?#XyRuPnD;XmLX*mOwjFKf(ne~E8h zB&f$a4S(>^p!T5PvZj&SJ~NT4ltQs#98Nl22^DBfF%C)D0NQ~)_+NxR5Fe4e^P&Lr zsufCIV|+x`CzOz#|9Vq*OUsuP3dlj$6E%)?)k);tGlZVc=hvM%F$9bU6n0sWGEyqY z&ev5H5IeDE;Ch*3T)Z$G_J;f6*ga7xq3cb(=1)uU!%Lgzi~_ah)bx^71n~#zAjq9| z^HoY+gvmFtfxv#1%~s#9^XHkjZ@}L{Rdx+aPRCfzRoA>G@h1^tTHn3X!Qpnw&ul8Sh#MefaaNOVLh5%P$z@0uR0d zEo#RjhNzX1Y=+Y$aL&stQ6Af6sOtvf9AICc>19HhK1%R>YVl8ST2^mU<9+P${M-P{} z34)U!6Vn~;I#ueVI90~eEHPX!xN`_iX-=^9Lg(u-X4fm{8Y>%|D~31Sw>9q0UYKvy zB14@M`g%;H+$8Y>bb7l-N;oVrXIG9LLv8Y#N?IB!>RN0Y@J#ckH1ghlf~C0HUX|rs zH?$v*nIIfF9qyY@o>0V&YD7vk-Qjj-9Pw6_Pa1$3pUGX5w@Ubk3)Rnn}YJ zDP~aWYF@qVJIg`5N$HuzOnp}duSpy;2L~;`z1n7+`(XC!jVEiUw7o-Uwuv3r+r|Rq zvqi*B@4HAie@r;JOA|NvsB=p|C#Drt#JdW4uX>%f z2w$|Tb~P)etQx*sz)4`6#ZVnq;8`vq>eG_6Y@*T=R_CDDzIspcwo?}G>N0mdp~OfC zG>;aXMrbJcyFqtGugNDRT1aj7HBOnw@7J-3fh_v#)3a66dV1hvzO94|L7lVr%$Ia$ zP`Fb)LyPBW78Nc80s;JISOxyau&Noh+|Ggk5`ei`XdoV73Bvj;4xy`4mv4jtzp_zS zp^Ldsx*Pj0OgaDjaAnDO!m%ygcj*gy(iPcvabpR4@`f+&Gzr>wS#wJ2?45uH0YO8w zHx^0aR9L^Vm2A!RrP)U*UJTh{Ge0V~BHqcBnPb~v6Mq@wKE_mi^X{I@u~a=?Mf5!d zrz6|^)Z0%Z6Jb8ItY*g*Oa5pz4coj5YK55(-Jd&gUsJGt96H5KcUq@@4uuFt)Wri! zvMR;o1M$*<1o`N|d?1*twJpr68^{g@J`dP5dF1%$fd6Gpa2N+2L=FuAb-jMc=`FBM|*$h z3JN~Y@BRyWmiyZtke{FLf8?P5aSR6V0-xuP|E&z<7yQdH7|iz^)PKo=0ek{~IR=Bl ze_{L(f&aD#1pvSR5Z_-B^Ya7#j1C|u!2c%(27v#LSWrNa{||z^0DfMy$pCr(UJF3J zzoP^434s2L7zh#o|4I58;|I|_*Z=wWPYQux0OSvb&uIZd{)`R?1_S>z2zoBvp9}LD zheB!B09i7^Zy@)U|z7m zUygbC{~wqj@K4fUzGsVnI^p9J_%kzLKJfn{2>qX~2j+Y3ihn6Tzk={52IS@Yv+iIZ zknbIe@gZ soGbt+2?9yVf#qaC7-C`=9-ijzo<4Z));1VmkN^aX!OSeHCWrBV04X;|p8x;= delta 14570 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 diff --git a/speedtest_worker.js b/speedtest_worker.js index 2bc76db..9d2e92b 100644 --- a/speedtest_worker.js +++ b/speedtest_worker.js @@ -1,5 +1,5 @@ /* - HTML5 Speedtest v4.0 + HTML5 Speedtest v4.1 by Federico Dossena https://github.com/adolfintel/speedtest/ GNU LGPLv3 License @@ -144,9 +144,9 @@ function dlTest(done){ startT=new Date().getTime(), //timestamp when test was started failed=false; //set to true if a stream fails xhr=[]; - //function to create a download stream + //function to create a download stream. streams are slightly delayed so that they will not end at the same time var testStream=function(i,delay){ - setTimeout(function(){ //delay creation of a stream slightly so that the new stream is completely detached from the one that created it + setTimeout(function(){ if(testStatus!=1) return; //delayed stream ended up starting after the end of the download test if(useFetchAPI){ xhr[i]=fetch(settings.url_dl+"?r="+Math.random()+"&ckSize="+settings.garbagePhp_chunkSize).then(function(response) { @@ -176,7 +176,7 @@ function dlTest(done){ }.bind(this); xhr[i].onload=function(){ //the large file has been loaded entirely, start again - xhr[i].abort();// reset the stream data to empty ram + try{xhr[i].abort();}catch(e){} //reset the stream data to empty ram testStream(i,0); }.bind(this); xhr[i].onerror=function(){ @@ -224,9 +224,9 @@ function ulTest(done){ startT=new Date().getTime(), //timestamp when test was started failed=false; //set to true if a stream fails xhr=[]; - //function to create an upload stream + //function to create an upload stream. streams are slightly delayed so that they will not end at the same time var testStream=function(i,delay){ - setTimeout(function(){ //delay creation of a stream slightly so that the new stream is completely detached from the one that created it + setTimeout(function(){ if(testStatus!=3) return; //delayed stream ended up starting after the end of the upload test var prevLoaded=0; //number of bytes transmitted last time onprogress was called var x=new XMLHttpRequest(); diff --git a/speedtest_worker.min.js b/speedtest_worker.min.js index 522f9b9..40a44c7 100644 --- a/speedtest_worker.min.js +++ b/speedtest_worker.min.js @@ -1 +1 @@ -function clearRequests(){if(xhr){for(var i=0;iloadDiff||(totLoaded+=loadDiff,prevLoaded=event.loaded)}.bind(this),xhr[i].onload=function(){testStream(i,0)}.bind(this),xhr[i].onerror=function(){failed=!0;try{xhr[i].abort()}catch(e){}delete xhr[i]}.bind(this);try{settings.xhr_dlUseBlob?xhr[i].responseType="blob":xhr[i].responseType="arraybuffer"}catch(e){}xhr[i].open("GET",settings.url_dl+"?r="+Math.random()+"&ckSize="+settings.garbagePhp_chunkSize,!0),xhr[i].send()}}.bind(this),1+delay)}.bind(this),i=0;it)){var speed=totLoaded/(t/1e3);dlStatus=(8*speed/925e3).toFixed(2),(t/1e3>settings.time_dl||failed)&&((failed||isNaN(dlStatus))&&(dlStatus="Fail"),clearRequests(),clearInterval(interval),done())}}.bind(this),200)}}function ulTest(done){if(!ulCalled){ulCalled=!0;var totLoaded=0,startT=(new Date).getTime(),failed=!1;xhr=[];for(var testStream=function(i,delay){setTimeout(function(){if(3==testStatus){var prevLoaded=0,x=new XMLHttpRequest;xhr[i]=x,xhr[i].upload.onprogress=function(event){if(3!=testStatus)try{x.abort()}catch(e){}var loadDiff=event.loaded<=0?0:event.loaded-prevLoaded;isNaN(loadDiff)||!isFinite(loadDiff)||0>loadDiff||(totLoaded+=loadDiff,prevLoaded=event.loaded)}.bind(this),xhr[i].upload.onload=function(){testStream(i,0)}.bind(this),xhr[i].upload.onerror=function(){failed=!0;try{xhr[i].abort()}catch(e){}delete xhr[i]}.bind(this),xhr[i].open("POST",settings.url_ul+"?r="+Math.random(),!0),xhr[i].setRequestHeader("Content-Encoding","identity"),xhr[i].send(req)}}.bind(this),1)}.bind(this),i=0;it)){var speed=totLoaded/(t/1e3);ulStatus=(8*speed/925e3).toFixed(2),(t/1e3>settings.time_ul||failed)&&((failed||isNaN(ulStatus))&&(ulStatus="Fail"),clearRequests(),clearInterval(interval),done())}}.bind(this),200)}}function pingTest(done){if(!ptCalled){ptCalled=!0;var prevT=null,ping=0,jitter=0,i=0,prevInstspd=0;xhr=[];var doPing=function(){prevT=(new Date).getTime(),xhr[0]=new XMLHttpRequest,xhr[0].onload=function(){if(0==i)prevT=(new Date).getTime();else{var instspd=((new Date).getTime()-prevT)/2,instjitter=Math.abs(instspd-prevInstspd);1==i?ping=instspd:(ping=.9*ping+.1*instspd,jitter=instjitter>jitter?.2*jitter+.8*instjitter:.9*jitter+.1*instjitter),prevInstspd=instspd}pingStatus=ping.toFixed(2),jitterStatus=jitter.toFixed(2),i++,ii;i++)req.push(r);req=new Blob(req);var ulCalled=!1,ptCalled=!1; +function clearRequests(){if(xhr){for(var i=0;iloadDiff||(totLoaded+=loadDiff,prevLoaded=event.loaded)}.bind(this),xhr[i].onload=function(){try{xhr[i].abort()}catch(e){}testStream(i,0)}.bind(this),xhr[i].onerror=function(){failed=!0;try{xhr[i].abort()}catch(e){}delete xhr[i]}.bind(this);try{settings.xhr_dlUseBlob?xhr[i].responseType="blob":xhr[i].responseType="arraybuffer"}catch(e){}xhr[i].open("GET",settings.url_dl+"?r="+Math.random()+"&ckSize="+settings.garbagePhp_chunkSize,!0),xhr[i].send()}}.bind(this),1+delay)}.bind(this),i=0;it)){var speed=totLoaded/(t/1e3);dlStatus=(8*speed/925e3).toFixed(2),(t/1e3>settings.time_dl||failed)&&((failed||isNaN(dlStatus))&&(dlStatus="Fail"),clearRequests(),clearInterval(interval),done())}}.bind(this),200)}}function ulTest(done){if(!ulCalled){ulCalled=!0;var totLoaded=0,startT=(new Date).getTime(),failed=!1;xhr=[];for(var testStream=function(i,delay){setTimeout(function(){if(3==testStatus){var prevLoaded=0,x=new XMLHttpRequest;xhr[i]=x,xhr[i].upload.onprogress=function(event){if(3!=testStatus)try{x.abort()}catch(e){}var loadDiff=event.loaded<=0?0:event.loaded-prevLoaded;isNaN(loadDiff)||!isFinite(loadDiff)||0>loadDiff||(totLoaded+=loadDiff,prevLoaded=event.loaded)}.bind(this),xhr[i].upload.onload=function(){testStream(i,0)}.bind(this),xhr[i].upload.onerror=function(){failed=!0;try{xhr[i].abort()}catch(e){}delete xhr[i]}.bind(this),xhr[i].open("POST",settings.url_ul+"?r="+Math.random(),!0),xhr[i].setRequestHeader("Content-Encoding","identity"),xhr[i].send(req)}}.bind(this),1)}.bind(this),i=0;it)){var speed=totLoaded/(t/1e3);ulStatus=(8*speed/925e3).toFixed(2),(t/1e3>settings.time_ul||failed)&&((failed||isNaN(ulStatus))&&(ulStatus="Fail"),clearRequests(),clearInterval(interval),done())}}.bind(this),200)}}function pingTest(done){if(!ptCalled){ptCalled=!0;var prevT=null,ping=0,jitter=0,i=0,prevInstspd=0;xhr=[];var doPing=function(){prevT=(new Date).getTime(),xhr[0]=new XMLHttpRequest,xhr[0].onload=function(){if(0==i)prevT=(new Date).getTime();else{var instspd=((new Date).getTime()-prevT)/2,instjitter=Math.abs(instspd-prevInstspd);1==i?ping=instspd:(ping=.9*ping+.1*instspd,jitter=instjitter>jitter?.2*jitter+.8*instjitter:.9*jitter+.1*instjitter),prevInstspd=instspd}pingStatus=ping.toFixed(2),jitterStatus=jitter.toFixed(2),i++,ii;i++)req.push(r);req=new Blob(req);var ulCalled=!1,ptCalled=!1;