speedTest.js 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. /* SPEEDTEST JS FILE */
  2. function clamp(num, min, max) {
  3. return num <= min ? min : num >= max ? max : num;
  4. }
  5. function I(id){return document.getElementById(id);}
  6. var w=null; //speedtest worker
  7. function startStop(){
  8. if(w!=null){
  9. //speedtest is running, abort
  10. w.postMessage('abort');
  11. w=null;
  12. $('#speedTestButtonText').text('Start');
  13. initUI();
  14. }else{
  15. //test is not running, begin
  16. w=new Worker('api/plugins/misc/speedTest/speedtest_worker.min.js');
  17. w.postMessage('start'); //Add optional parameters as a JSON object to this command
  18. $('#speedTestButtonText').text('Running');
  19. w.onmessage=function(e){
  20. var data=e.data.split(';');
  21. var status=Number(data[0]);
  22. if(status>=4){
  23. //test completed
  24. $('#speedTestButtonText').text('Re-Test');
  25. w=null;
  26. }
  27. var downloadText = Math.ceil((data[1]/1000)*1000);
  28. var downloadPercent = clamp(Math.ceil(((data[1]/1000)*100)/5)*5, 0,100);
  29. var uploadText = Math.ceil((data[2]/1000)*1000);
  30. var uploadPercent = clamp(Math.ceil(((data[2]/1000)*100)/5)*5, 0,100);
  31. I("ip").textContent=data[4];
  32. I("dlText").textContent=(status==1&&data[1]==0)?"...":Math.ceil(data[1]);
  33. I("ulText").textContent=(status==3&&data[2]==0)?"...":Math.ceil(data[2]);
  34. I("pingText").textContent=Math.ceil(data[3]);
  35. I("jitText").textContent=Math.ceil(data[5]);
  36. var prog=(Number(data[6])*2+Number(data[7])*2+Number(data[8]))/5;
  37. I("progress").style.width=(100*prog)+"%";
  38. $('#downloadPercent').attr('class', 'css-bar css-bar-'+downloadPercent+' css-bar-lg css-bar-default').attr('data-label', downloadText+'Mbps');
  39. $('#uploadPercent').attr('class', 'css-bar css-bar-'+uploadPercent+' css-bar-lg css-bar-warning pull-right').attr('data-label', uploadText+'Mbps');
  40. };
  41. }
  42. }
  43. //poll the status from the worker every 200ms (this will also update the UI)
  44. setInterval(function(){
  45. if(w) w.postMessage('status');
  46. },200);
  47. //function to (re)initialize UI
  48. function initUI(){
  49. I("dlText").textContent="";
  50. I("ulText").textContent="";
  51. I("pingText").textContent="";
  52. I("jitText").textContent="";
  53. I("ip").textContent="";
  54. I("progress").style.width="";
  55. $('#downloadPercent').attr('class', 'css-bar css-bar-0 css-bar-lg css-bar-default').attr('data-label', '0Mbps');
  56. $('#uploadPercent').attr('class', 'css-bar css-bar-0 css-bar-lg css-bar-warning pull-right').attr('data-label', '0Mbps');
  57. }
  58. // FUNCTIONS
  59. speedTestLaunch()
  60. function speedTestLaunch(){
  61. if(typeof activeInfo == 'undefined'){
  62. setTimeout(function () {
  63. speedTestLaunch();
  64. }, 1000);
  65. }else{
  66. if(activeInfo.plugins["SPEEDTEST-enabled"] == true){
  67. if (activeInfo.user.groupID <= activeInfo.plugins.includes["SPEEDTEST-Auth-include"]) {
  68. var menuList = `<li><a class="inline-popups speedTestModal" href="#speedtest-area" data-effect="mfp-zoom-out"><i class="fa fa-rocket fa-fw"></i> <span lang="en">Test Server Speed</span></a></li>`;
  69. var htmlDOM = `
  70. <div id="speedtest-area" class="white-popup mfp-with-anim mfp-hide">
  71. <div class="col-md-4 col-md-offset-4">
  72. <div class="panel bg-org panel-info">
  73. <div class="panel-heading">
  74. <span lang="en">Test Speed to Server</span>
  75. <button id="startStopBtn" onclick="startStop()" class="btn btn-info waves-effect waves-light pull-right"><span lang="en" id="speedTestButtonText">Start</span> <i class="fa fa-rocket m-l-5"></i></button>
  76. </div>
  77. <div class="panel-body">
  78. <div id="test">
  79. <div class="row hidden-xs">
  80. <div class="col-md-6 col-xs-6"><div id="downloadPercent" data-label="0Mbps" style="font-size: 15px;"></div></div>
  81. <div class="col-md-6 col-xs-6"><div id="uploadPercent" data-label="0Mbps" style="font-size: 15px;"></div></div>
  82. </div>
  83. <div class="progress progress-sm">
  84. <div id="progress" class="progress-bar progress-bar-info active progress-bar-striped" role="progressbar" aria-valuenow="40" aria-valuemin="0" aria-valuemax="100" style="width: 0%">
  85. <span class="sr-only">0% Complete (success)</span>
  86. </div>
  87. </div>
  88. <div class="white-box m-b-0">
  89. <div class="user-btm-box">
  90. <div class="col-md-3 col-xs-6 p-l-0 p-r-0 text-center">
  91. <p class="text-success"><i class="ti-download fa-2x"></i></p>
  92. <h1 id="dlText"></h1>
  93. <h4 class="">Mbps</h4>
  94. </div>
  95. <div class="col-md-3 col-xs-6 p-l-0 p-r-0 text-center">
  96. <p class="text-warning"><i class="ti-upload fa-2x"></i></p>
  97. <h1 id="ulText"></h1>
  98. <h4 class="">Mbps</h4>
  99. </div>
  100. <div class="col-md-3 col-xs-6 p-l-0 p-r-0 text-center">
  101. <p class="text-purple"><i class="ti-direction-alt fa-2x"></i></p>
  102. <h1 id="pingText"></h1>
  103. <h4 class="">ms</h4>
  104. </div>
  105. <div class="col-md-3 col-xs-6 p-l-0 p-r-0 text-center">
  106. <p class="text-info"><i class="ti-pulse fa-2x"></i></p>
  107. <h1 id="jitText"></h1>
  108. <h4 class="">ms</h4>
  109. </div>
  110. </div>
  111. </div>
  112. </div>
  113. <script type="text/javascript">initUI();</script>
  114. </div>
  115. <div class="panel-footer"> IP Address: <span id="ip"></span> </div>
  116. </div>
  117. </div>
  118. </div>
  119. `;
  120. $('.append-menu').after(menuList);
  121. $('.organizr-area').after(htmlDOM);
  122. pageLoad();
  123. }
  124. }
  125. }
  126. }
  127. $(document).on('click', '#SPEEDTEST-settings-button', function() {
  128. ajaxloader(".content-wrap","in");
  129. organizrAPI2('GET','api/v2/plugins/speedtest/settings').success(function(data) {
  130. var response = data.response;
  131. $('#SPEEDTEST-settings-items').html(buildFormGroup(response.data));
  132. }).fail(function(xhr) {
  133. console.error("Organizr Function: API Connection Failed");
  134. });
  135. ajaxloader();
  136. });