example-singleServer-chart.html 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8" />
  5. <title>LibreSpeed Example</title>
  6. <link rel="shortcut icon" href="favicon.ico">
  7. <style type="text/css">
  8. html,
  9. body {
  10. margin: 0;
  11. padding: 0;
  12. border: none;
  13. text-align: center;
  14. }
  15. #startBtn {
  16. display: inline-block;
  17. border: 0.15em solid #000000;
  18. padding: 0.3em 0.5em;
  19. margin: 0.6em;
  20. color: #000000;
  21. text-decoration: none;
  22. }
  23. #ip {
  24. margin: 0.8em 0;
  25. font-size: 1.2em;
  26. }
  27. #chart1Area,
  28. #chart2Area {
  29. width: 100%;
  30. max-width: 30em;
  31. height: 10em;
  32. display: block;
  33. margin: 0 auto;
  34. }
  35. </style>
  36. <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.5.0/Chart.bundle.min.js"></script> <!--THIS LIBRARY SUCKS!-->
  37. <script src="speedtest.js"></script>
  38. <script type="text/javascript">
  39. var s = null
  40. function runTest() {
  41. var chart1ctx = document.getElementById('chart1Area').getContext('2d')
  42. var chart2ctx = document.getElementById('chart2Area').getContext('2d')
  43. var dlDataset = {
  44. label: 'Download',
  45. fill: false,
  46. lineTension: 0.1,
  47. backgroundColor: 'rgba(75,192,192,0.4)',
  48. borderColor: 'rgba(75,192,192,1)',
  49. borderCapStyle: 'butt',
  50. borderDash: [],
  51. borderDashOffset: 0.0,
  52. borderJoinStyle: 'miter',
  53. pointBorderColor: 'rgba(75,192,192,1)',
  54. pointBackgroundColor: '#fff',
  55. pointBorderWidth: 1,
  56. pointHoverRadius: 5,
  57. pointHoverBackgroundColor: 'rgba(75,192,192,1)',
  58. pointHoverBorderColor: 'rgba(220,220,220,1)',
  59. pointHoverBorderWidth: 2,
  60. pointRadius: 1,
  61. pointHitRadius: 10,
  62. data: [0],
  63. spanGaps: false
  64. }
  65. var ulDataset = {
  66. label: 'Upload',
  67. fill: false,
  68. lineTension: 0.1,
  69. backgroundColor: 'rgba(192,192,75,0.4)',
  70. borderColor: 'rgba(192,192,75,1)',
  71. borderCapStyle: 'butt',
  72. borderDash: [],
  73. borderDashOffset: 0.0,
  74. borderJoinStyle: 'miter',
  75. pointBorderColor: 'rgba(192,192,75,1)',
  76. pointBackgroundColor: '#fff',
  77. pointBorderWidth: 1,
  78. pointHoverRadius: 5,
  79. pointHoverBackgroundColor: 'rgba(192,192,75,1)',
  80. pointHoverBorderColor: 'rgba(220,220,220,1)',
  81. pointHoverBorderWidth: 2,
  82. pointRadius: 1,
  83. pointHitRadius: 10,
  84. data: [0],
  85. spanGaps: false
  86. }
  87. var pingDataset = {
  88. label: 'Ping',
  89. fill: false,
  90. lineTension: 0.1,
  91. backgroundColor: 'rgba(75,220,75,0.4)',
  92. borderColor: 'rgba(75,220,75,1)',
  93. borderCapStyle: 'butt',
  94. borderDash: [],
  95. borderDashOffset: 0.0,
  96. borderJoinStyle: 'miter',
  97. pointBorderColor: 'rgba(75,220,75,1)',
  98. pointBackgroundColor: '#fff',
  99. pointBorderWidth: 1,
  100. pointHoverRadius: 5,
  101. pointHoverBackgroundColor: 'rgba(75,220,75,1)',
  102. pointHoverBorderColor: 'rgba(220,220,220,1)',
  103. pointHoverBorderWidth: 2,
  104. pointRadius: 1,
  105. pointHitRadius: 10,
  106. data: [],
  107. spanGaps: false
  108. }
  109. var jitterDataset = {
  110. label: 'Jitter',
  111. fill: false,
  112. lineTension: 0.1,
  113. backgroundColor: 'rgba(220,75,75,0.4)',
  114. borderColor: 'rgba(220,75,75,1)',
  115. borderCapStyle: 'butt',
  116. borderDash: [],
  117. borderDashOffset: 0.0,
  118. borderJoinStyle: 'miter',
  119. pointBorderColor: 'rgba(220,75,75,1)',
  120. pointBackgroundColor: '#fff',
  121. pointBorderWidth: 1,
  122. pointHoverRadius: 5,
  123. pointHoverBackgroundColor: 'rgba(220,75,75,1)',
  124. pointHoverBorderColor: 'rgba(220,220,220,1)',
  125. pointHoverBorderWidth: 2,
  126. pointRadius: 1,
  127. pointHitRadius: 10,
  128. data: [],
  129. spanGaps: false
  130. }
  131. var chart1Options = {
  132. type: 'line',
  133. data: {
  134. datasets: [dlDataset, ulDataset]
  135. },
  136. options: {
  137. responsive: true,
  138. legend: {
  139. position: 'bottom'
  140. },
  141. scales: {
  142. xAxes: [{
  143. display: true,
  144. scaleLabel: {
  145. display: false
  146. },
  147. ticks: {
  148. beginAtZero: true
  149. }
  150. }],
  151. yAxes: [{
  152. display: true,
  153. scaleLabel: 'Speed',
  154. ticks: {
  155. beginAtZero: true
  156. }
  157. }]
  158. }
  159. }
  160. }
  161. var chart2Options = {
  162. type: 'line',
  163. data: {
  164. datasets: [pingDataset, jitterDataset]
  165. },
  166. options: {
  167. responsive: true,
  168. legend: {
  169. position: 'bottom'
  170. },
  171. scales: {
  172. xAxes: [{
  173. display: true,
  174. scaleLabel: {
  175. display: false
  176. },
  177. ticks: {
  178. beginAtZero: true
  179. }
  180. }],
  181. yAxes: [{
  182. display: true,
  183. scaleLabel: 'Latency',
  184. ticks: {
  185. beginAtZero: true
  186. }
  187. }]
  188. }
  189. }
  190. }
  191. var chart1 = new Chart(chart1ctx, chart1Options)
  192. var chart2 = new Chart(chart2ctx, chart2Options)
  193. document.getElementById('startBtn').style.display = 'none'
  194. document.getElementById('testArea').style.display = ''
  195. document.getElementById('abortBtn').style.display = ''
  196. s=new Speedtest();
  197. s.onupdate = function (data) {
  198. var status = data.testState
  199. if (status === 1 && Number(data.dlStatus) > 0) {
  200. for(var i=~~(20*Number(data.dlProgress));i<20;i++) chart1.data.datasets[0].data[i]=(Number(data.dlStatus))
  201. chart1.data.labels[chart1.data.datasets[0].data.length - 1] = ''
  202. chart1.update()
  203. }
  204. if (status === 3 && Number(data.ulStatus) > 0) {
  205. for(var i=~~(20*Number(data.ulProgress));i<20;i++) chart1.data.datasets[1].data[i]=(Number(data.ulStatus))
  206. chart1.data.labels[chart1.data.datasets[1].data.length - 1] = ''
  207. chart1.update()
  208. }
  209. if (status === 2 && Number(data.pingStatus) > 0) {
  210. chart2.data.datasets[0].data.push(Number(data.pingStatus))
  211. chart2.data.datasets[1].data.push(Number(data.jitterStatus))
  212. chart2.data.labels[chart2.data.datasets[0].data.length - 1] = ''
  213. chart2.data.labels[chart2.data.datasets[1].data.length - 1] = ''
  214. chart2.update()
  215. }
  216. ip.textContent = data.clientIp
  217. }
  218. s.onend=function(aborted){
  219. document.getElementById('abortBtn').style.display = 'none'
  220. document.getElementById('startBtn').style.display = ''
  221. s = null
  222. if (aborted) {
  223. document.getElementById('testArea').style.display = 'none'
  224. }
  225. }
  226. s.start();
  227. }
  228. function abortTest() {
  229. if (s) s.abort();
  230. }
  231. </script>
  232. </head>
  233. <body>
  234. <h1>LibreSpeed - Chart.js example</h1>
  235. <div id="testArea" style="display:none">
  236. <p id="ip">Please wait...</p>
  237. <h2>Speed</h2>
  238. <canvas id="chart1Area"></canvas>
  239. <h2>Latency</h2>
  240. <canvas id="chart2Area"></canvas>
  241. <br/>
  242. <a href="javascript:abortTest()" id="abortBtn">Abort</a>
  243. </div>
  244. <a href="javascript:runTest()" id="startBtn">Run speed test</a>
  245. <br/><br/> Charts by <a href="http://www.chartjs.org/">Chart.js</a><br/><br/><a href="https://github.com/librespeed/speedtest">Source code</a>
  246. </body>
  247. </html>