From 3f06ab13818cc667b4c7e4bdc18721444e64c414 Mon Sep 17 00:00:00 2001 From: anoy Date: Mon, 15 May 2017 12:02:32 +0200 Subject: [PATCH] improvements and new example (#29) Merge with #29. Using standard js code style (ugh...); rewritten documentation in markdown; Added example6 --- .editorconfig | 18 + doc.md | 239 +++++++++++ doc.pdf | Bin 56451 -> 0 bytes example1.html | 52 +-- example2.html | 163 ++++---- example3.html | 239 ++++++----- example4.html | 373 ++++++++--------- example5.html | 490 ++++++++++++----------- example5_data/Chart.bundle.min.js | 16 - example6.html | 104 +++++ speedtest_worker.js | 645 +++++++++++++++--------------- speedtest_worker.min.js | 2 +- 12 files changed, 1365 insertions(+), 976 deletions(-) create mode 100644 .editorconfig create mode 100644 doc.md delete mode 100644 doc.pdf delete mode 100644 example5_data/Chart.bundle.min.js create mode 100644 example6.html diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..8f4f139 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,18 @@ +# EditorConfig is awesome: http://EditorConfig.org + +root = true + +[*] +end_of_line = lf +trim_trailing_whitespace = true +insert_final_newline = true +indent_style = space +indent_size = 4 +charset = utf-8 + +[*.js] +indent_size = 2 +indent_style = space + +[*.md] +trim_trailing_whitespace = false diff --git a/doc.md b/doc.md new file mode 100644 index 0000000..613a070 --- /dev/null +++ b/doc.md @@ -0,0 +1,239 @@ +# HTML5 Speedtest + +> by Federico Dossena +> Version 4.2, April 26 2017 +> [https://github.com/adolfintel/speedtest/](https://github.com/adolfintel/speedtest/) + + +## Introduction +In this document, we will introduce an XHR based HTML5 Speedtest and see how to use it. +This test measures download speed, upload speed, ping and jitter. + +First of all, the requirements to run this test: + +* The browser have to support XHR Level 2 and Web Workers and Javascript must be enabled. + * Internet Explorer 11 + * Microsoft Edge 12+ + * Mozilla Firefox 12+ + * Google Chrome / Chromium 31+ + * Apple Safari 7.1+ + * Opera 18+ +* Client side, the test can use up to 500 megabytes of RAM +* Server side, you'll need a fast connection (at least 100 Mbps recommended), and the web server must accept large POST requests (up to 20 megabytes). + Apache2 and PHP are recommended, but not mandatory. + +If this looks good, let's proceed and see how to use the test. + + +## Installation +To install the test on your server, upload the following files: + +* `speedtest_worker.min.js` +* `garbage.php` +* `getIP.php` +* `empty.dat` + +You may also want to upload one of the examples to test it. +Later we'll see how to use the test without PHP. + +__Important:__ keep all the files together; all paths are relative to the js file + + +## Usage +To run the test, you need to do 3 things: + +* Create the worker +* Write some code that handles the responses coming from the worker +* Start the test + +### Creating the worker +```js +var w = new Worker("speedtest_worker.min.js") +``` + +__Important:__ use the minified version, it's smaller! + +### Response handler +First, we set up a timer that fetches the status of the worker continuously: +```js +var timer = setInterval(function () { + w.postMessage('status') +}, 100) +``` + +Then we write a response handler that receives the status and updates the page. Later +we'll see the details of the format of the response. + +```js +w.onmessage = function (event) { + var data = event.data.split(';') + var testState = data[0] + var dlStatus = data[1] + var ulStatus = data[2] + var pingStatus = data[3] + var jitterStatus = data[5] + var clientIp = data[4] + if (testState >= 4) { + clearInterval(timer) // test is finished or aborted + } + // .. update your page here .. +} +``` + +#### Response format +The response from the worker is composed of values separated by `;` (semicolon) in this +format: + +`testState;dlStatus;ulStatus;pingStatus;clientIp;jitterStatus` + +* __testState__ is an integer 0-5 + * `0` = Test starting + * `1` = Download test in progress + * `2` = Ping + Jitter test in progress + * `3` = Upload test in progress + * `4` = Test finished + * `5` = Test aborted +* __dlStatus__ is either + * Empty string (not started or aborted) + * Download speed in Megabit/s as a number with 2 digits + * The string "Fail" (test failed) +* __ulStatus__ is either + * Empty string (not started or aborted) + * Upload speed in Megabit/s as a number with 2 digits + * The string "Fail" (test failed) +* __pingStatus__ is either + * Empty string (not started or aborted) + * Estimated ping in milliseconds as a number with 2 digits + * The string "Fail" (test failed) +* __clientIp__ is either + * Empty string (not fetched yet or failed) + * The client's IP address as a string +* __jitterStatus__ is either + * Empty string (not started or aborted) + * Estimated jitter in milliseconds as a number with 2 digits (lower = stable connection) + * The string "Fail" (test failed) + +### Starting the test +To start the test, send the start command to the worker: + +```js +w.postMessage('start') +``` + +This starts the test with the default settings, which is usually the best choice. If you want, you can change these settings and pass them to the worker as JSON with like this: + +```js +w.postMessage('start {"param1": "value1", "param2": "value2", ...}') +``` + +#### Test parameters +* __time_dl__: How long the download test should be in seconds + * Default: `15` + * Recommended: `>=5` +* __time_ul__: How long the upload test should be in seconds + * Default: `15` + * Recommended: `>=10` +* __count_ping__: How many pings to perform in the ping test + * Default: `35` + * Recommended: `>=20` +* __url_dl__: path to garbage.php or a large file to use for the download test + * Default: `garbage.php` + * __Important:__ path is relative to js file +* __url_ul__: path to ab empty file or empty.dat to use for the upload test + * Default: `empty.dat` + * __Important:__ path is relative to js file +* __url_ping__: path to an empty file or empty.dat to use for the ping test + * Default: `empty.dat` + * __Important:__ path is relative to js file +* __url_getIp__: path to getIP.php or replacement + * Default: `getIP.php` + * __Important:__ path is relative to js file +* __enable_quirks__: enables browser-specific optimizations. These optimizations override some of the default settings below. They do not override settings that are explicitly set. + * Default: `true` +* __garbagePhp_chunkSize__: size of chunks sent by garbage.php in megabytes + * Default: `20` + * Recommended: `>=10` + * Default override: 5 on Safari if enable_quirks is true +* __xhr_dlMultistream__: how many streams should be opened for the download test + * Default: `10` + * Recommended: `>=3` + * Default override: 3 on Edge if enable_quirks is true + * Default override: 5 on Chromium-based if enable_quirks is true +* __xhr_ulMultistream__: how many streams should be opened for the upload test + * Default: `3` + * Recommended: `>=1` + * Default override: 1 on Firefox if enable_quirks is true + * Default override: 10 on Safari if enable_quirks is true +* __allow_fetchAPI__: allow the use of Fetch API for the download test instead of regular XHR. Experimental, not recommended. + * Default: `false` +* __force_fetchAPI__: forces the use of Fetch API on all browsers that support it + * Default: `false` +Fetch API are used if the following conditions are met: + * allow_fetchAPI is true + * Chromium-based browser with support for Fetch API and enable_quirks is true +OR force_fetchAPI is true and the browser supports Fetch API + +### Aborting the test prematurely +The test can be aborted at any time by sending an abort command to the worker: + +```js +w.postMessage('abort') +``` + +This will terminate all network activity and stop the worker. + +__Important:__ do not simply kill the worker while it's running, as it will leave pending XHR requests! + + +## Using the test without PHP +If your server does not support PHP, or you're using something newer like Node.js, you can still use this test by replacing `garbage.php` and `getIP.php`. + +### Replacements + +#### Replacement for `garbage.php` +A replacement for `garbage.php` must generate incompressible garbage data. + +A large file (10-100 Mbytes) is a possible replacement. You can get [one here](http://downloads.fdossena.com/geth.php?r=speedtest-bigfile). + +If you're using Node.js or some other server, your replacement should accept the `ckSize` parameter (via GET) which tells it how many megabytes of garbage to generate. +It is important here to turn off compression, and generate incompressible data. +A symlink to `/dev/urandom` is also ok. + +#### Replacement for `getIP.php` +Your replacement must simply respond with the client's IP as plaintext. Nothing fancy. + +### JS +You need to start the test with your replacements like this: + +```js +w.postMessage('start {"url_dl": "newGarbageURL", "url_getIp": "newIpURL"}') +``` + + +## Known bugs and limitations +* __Chrome:__ high CPU usage from XHR requests with very fast connections (like gigabit). + For this reason, the test may report inaccurate results if your CPU is too slow. (Does not affect most computers) +* __IE11:__ the upload test is not precise on very fast connections +* __Safari:__ works, but needs more testing and tweaking for very fast connections + +## Making changes +Since this is an open source project, you can modify it. + +To make changes to the speedtest itself, edit `speedtest_worker.js` + +To create the minified version, use UglifyJS like this: + +``` +uglifyjs -c --screw-ie8 speedtest_worker.js > speedtest_worker.min.js +``` + +Pull requests are much appreciated. If you don't use github (or git), simply contact me. + +__Important:__ please add your name to modified versions to distinguish them from the main project. + + +## License +This software is under the GNU LGPL license, Version 3 or newer. + +To put it short: you are free to use, study, modify, and redistribute this software and modified versions of it, for free or for money. +You can also use it in proprietary software but all changes to this software must remain under the same GNU LGPL license. diff --git a/doc.pdf b/doc.pdf deleted file mode 100644 index 4c784481e80415d64ce252ae82eae2d8c39afbf6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 56451 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 acCM~&CN6G>t_pZ#hQKlD>7|sVG5;To -Speedtest + Speedtest + -

Speedtest

-

IP Address

-
-

Download

-
-

Upload

-
-

Latency

-
- +

Speedtest

+ +

IP Address

+

+ +

Download

+

+ +

Upload

+

+ +

Latency

+

+ + - \ No newline at end of file + diff --git a/example2.html b/example2.html index f384035..af945df 100644 --- a/example2.html +++ b/example2.html @@ -1,78 +1,91 @@ - - Speedtest - - - -

Speedtest

-
-
Download
-
  
-
Mbit/s
-
-
-
Upload
-
  
-
Mbit/s
-
-
-
Latency
-
  
-
ms
-
-
-
Jitter
-
  
-
ms
-
-
- - - \ No newline at end of file + div.test { + display: inline-block; + margin: 1em; + text-align: center; + } + + div.testName, + div.meterUnit { + font-size: 3vw; + } + + div.meter { + font-size: 6vw; + line-height: 1.5em; + height: 1.5em !important; + } + + .flash { + animation: flash 0.6s linear infinite; + } + + @keyframes flash { + 0% { opacity: 0.6; } + 50% { opacity: 1; } + } + + + + +

Speedtest

+
+
Download
+
  
+
Mbit/s
+
+
+
Upload
+
  
+
Mbit/s
+
+
+
Latency
+
  
+
ms
+
+
+
Jitter
+
  
+
ms
+
+
+ + + diff --git a/example3.html b/example3.html index 79d396e..f7b0d5e 100644 --- a/example3.html +++ b/example3.html @@ -1,116 +1,133 @@ - - Speedtest - + - - -

Speedtest

-