A JavaScript library, entirely written in ES6, to measure various aspects of a connection. It can accurately estimate a bandwidth/latency between a client (using a web browser) and a server (running a specific script).
Installation
User Bower or download a ZIP file:
bower install network-js
How to use
// Create a new Network instance by providing an optional object.var settings = // The settings list is available below.; var net = settings; // Listen for the "end" event which provides the calculated latencies.netlatency; // Once all the configuration is done, start the requests for this module.netlatencystart; // It is possible to chain functions for all the modules, here's an example with the// upload module.netupload start; // You can also cancel a request (except for the "latency" module).netupload; netdownload start; netdownload;
Settings
The available settings with their default values:
latency: // Where is located your `network.php` file. endpoint: './network.php' // How many measures should be returned. measures: 5 // How much attempts to get a valid value should be done for each measure. attempts: 3 upload: // Where is located your `network.php` file. endpoint: './network.php' // The delay while you want to take measures. delay: 8000 data: // The amount of data to initially use. size: 2 * 1024 * 1024 // 2 MB // If the measure period can't reach the delay defined in the settings, // the data amount is multiplied by the following value. multiplier: 2 download: // Where is located your `network.php` file. endpoint: './network.php' // The delay while you want to take measures. delay: 8000 data: // The amount of data to initially use. size: 10 * 1024 * 1024 // 10 MB // If the measure period can't reach the delay defined in the settings, // the data amount is multiplied by the following value. multiplier: 2
Here is an example usage:
var net = // If you define a value at the top level of the object, // it will be applied to every module. endpoint: './my-new-endpoint/' download: data: multiplier: 25 ;
You can also redefine settings whenever you want:
// The `settings()` method takes an object in parameter.net; // Without any parameters, it will return the current settings.console; // Prints the current settings in the console. // Each module has a `settings()` method that works the same way.netlatency;console;
Compatibility
Network.js is based on two browser features: Resource Timing and XMLHttpRequest (v2). While the first one can be polyfilled, the second one is a requirement.
Thus, Network.js should be compatible with:
Browser | Partial support (polyfill) | Native support |
---|---|---|
IE 10+ | ✔ | |
Firefox 35+ | ✔ | |
Chrome 29+ | ✔ | |
Opera 15+ | ✔ | |
Android Browser 4.4+ | ✔ | |
Safari 5+ | ✔ | |
iOS Safari 5.1+ | ✔ | |
Firefox 12+ | ✔ | |
Opera 12.1+ | ✔ | |
Android Browser 3+ | ✔ |
Latency measures can be very far from reality if the browser doesn't support Resource Timing and uses the provided polyfill. You can determine if the browser uses the latter:
if NetworksupportsResourceTiming // Resource Timing is available. else // The polyfill will be used, expect some weird latency measures.
Caveats
- Chrome cannot upload a ~128 MB file, which will mainly affect fiber users.
Compilation
To compile the project, install the latest version of Node and run these commands inside a terminal:
git clone https://github.com/nesk/network.js.gitcd network.jsnpm installnpm run build
There's also a watch
script which compiles the project whenever a file is changed:
npm run watch
To check if the project passes all the tests, run:
npm test
Contribution
Read the CONTRIBUTING file.
License
This project is licensed under the MIT license, check TLDRLegal for details.