1
0

speedtest_worker.js 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. var testStatus=0,dlStatus="",ulStatus="",pingStatus="";
  2. var settings={time_ul : 15, time_dl:15, count_ping: 15, url_dl:"garbage.php",url_ul:"empty.dat",url_ping:"empty.dat"};
  3. var xhr=null;
  4. this.addEventListener('message', function(e){
  5. var params=e.data.split(" ");
  6. if(params[0]=="set")
  7. {
  8. if(params[1] && settings.hasOwnProperty(params[1]) && params[2])
  9. {
  10. settings[params[1]]=params[2];
  11. }
  12. }
  13. if(params[0]=="status"){
  14. postMessage(testStatus+";"+dlStatus+";"+ulStatus+";"+pingStatus);
  15. }
  16. if(params[0]=="start"){
  17. if(testStatus==0){
  18. testStatus=1;
  19. dlTest(function(){testStatus=2;ulTest(function(){testStatus=3;pingTest(function(){testStatus=4;});});});
  20. }
  21. }
  22. if(params[0]=="abort"){
  23. console.warn("Aborting test...")
  24. try{if(xhr)xhr.abort();}catch(e){}
  25. testStatus=5;dlStatus="";ulStatus="";pingStatus="";
  26. }
  27. });
  28. function dlTest(done){
  29. var firstTick=true,startT=new Date().getTime(), prevT=new Date().getTime(),prevLoaded=0,speed=0.0;
  30. xhr=new XMLHttpRequest();
  31. xhr.onprogress=function(event){
  32. var instspd=(event.loaded-prevLoaded)/((new Date().getTime()-prevT)/1000.0);
  33. if(isNaN(instspd)||!isFinite(instspd)) return;
  34. if(firstTick){
  35. speed=instspd;
  36. firstTick=false;
  37. }else{
  38. speed=speed*0.9+instspd*0.1;
  39. }
  40. prevLoaded=event.loaded;
  41. prevT=new Date().getTime();
  42. dlStatus=((speed*8)/1048576.0).toFixed(2);
  43. if(((prevT-startT)/1000.0)>settings.time_dl){;try{xhr.abort();}catch(e){} xhr=null; done();}
  44. }.bind(this);
  45. xhr.onload=function(){
  46. dlStatus=((speed*8)/1048576.0).toFixed(2);
  47. xhr=null;
  48. done();
  49. }.bind(this);
  50. xhr.onerror=function(){
  51. dlStatus="Fail";
  52. xhr=null;
  53. done();
  54. }.bind(this);
  55. xhr.open("GET", settings.url_dl+"?r="+Math.random(),true);
  56. xhr.send();
  57. }
  58. function ulTest(done){
  59. var firstTick=true,startT=new Date().getTime(), prevT=new Date().getTime(),prevLoaded=0,speed=0.0;
  60. xhr=new XMLHttpRequest();
  61. xhr.upload.onprogress=function(event){
  62. var instspd=(event.loaded-prevLoaded)/((new Date().getTime()-prevT)/1000.0);
  63. if(isNaN(instspd)||!isFinite(instspd)) return;
  64. if(firstTick){
  65. firstTick=false;
  66. }else{
  67. speed=speed*0.7+instspd*0.3;
  68. }
  69. prevLoaded=event.loaded;
  70. prevT=new Date().getTime();
  71. ulStatus=((speed*8)/1048576.0).toFixed(2);
  72. if(((prevT-startT)/1000.0)>settings.time_ul){try{xhr.abort();}catch(e){} xhr=null; done();}
  73. }.bind(this);
  74. xhr.onload=function(){
  75. ulStatus=((speed*8)/1048576.0).toFixed(2);
  76. done();
  77. }.bind(this);
  78. xhr.onerror=function(){
  79. ulStatus="Fail";
  80. done();
  81. }.bind(this);
  82. xhr.open("POST", settings.url_ul+"?r="+Math.random(),true);
  83. xhr.send(new ArrayBuffer(10485760));
  84. }
  85. function pingTest(done){
  86. var prevT=null,ping=0.0,i=0;
  87. var doPing=function(){
  88. prevT=new Date().getTime();
  89. xhr=new XMLHttpRequest();
  90. xhr.onload=function(){
  91. if(i==0){
  92. prevT=new Date().getTime();
  93. }else{
  94. var instspd=new Date().getTime()-prevT;
  95. if(i==1) ping=instspd; else ping=ping*0.9+instspd*0.1;
  96. }
  97. pingStatus=ping.toFixed(2);
  98. i++;
  99. if(i<settings.count_ping) doPing(); else done();
  100. }.bind(this);
  101. xhr.onerror=function(){
  102. pingStatus="Fail";
  103. done();
  104. }.bind(this);
  105. xhr.open("GET", settings.url_ping+"?r="+Math.random(),true);
  106. xhr.send();
  107. }.bind(this);
  108. doPing();
  109. }