- Nesk,
Bonjour à tous,
Je viens ici vous présenter un projet que j'ai initié en octobre 2011 et qui est resté abandonné pendant plus de 2 ans. J'ai repris le développement from scratch depuis février dernier et, bien que je n'ai pas beaucoup travaillé dessus entre début mai et fin septembre (je me suis consacré à mes études), je ne compte pas de nouveau abandonner ce projet.
Vous l'aurez compris au titre du sujet, le projet en question s'appelle SpeedTest et permet de mesurer précisément la latence et le débit de votre connexion Internet (les débits obtenus sont proches de ceux obtenus par SpeedTest.net et la latence généralement proche de celle obtenue par un simple ping
). Je vous propose d'essayer immédiatement cela sur le site du projet. Le projet est bien évidemment aussi disponible en open source sur Github.
Cependant, quel intérêt ? Pourquoi ne pas passer par le biais de l'incontournable SpeedTest.net ? Tout simplement parce que le but n'est pas le même. Mon projet permet de vérifier le débit et la latence d'une connexion (notamment celles de vos clients) avec un serveur donné, vous pouvez tester une connexion d'un point à un autre et non pas sur une multitude de serveurs prévus spécialement pour ça. Le projet a aussi l'avantage de fonctionner nativement sur mobile !
Comme beaucoup de développeurs, je me suis lancé sur le projet avant tout pour le défi technique. À l'origine, j'étais très clairement le seul à avoir créé une librairie du genre, les autres faisant tous usage du Flash pour effectuer ces mesures. Puis SpeedOf.Me est apparu en décembre 2011 (soit 2 mois après la création de mon projet) apportant une solution viable alors que mon projet n'était, à l'époque, qu'une solution très instable et relativement mal architecturée.
Entre fin 2013 et début 2014, j'ai commencé à voir pas mal de personnes ajouter SpeedTest dans leurs favoris Github alors que le site de démonstration était pourtant très instable. Du coup, j'ai décidé de reprendre le projet sur la bannière d'une V2. Aujourd'hui, cette version a enfin atteint un certain stade de maturité et je me suis donc décidé à présenter le projet ici.
Pour les intéressés, l'architecture du projet est détaillée sur Github. Concernant les aspects technologiques, j'ai décidé de tirer parti de l'ensemble de l'API Performance, ce qui explique actuellement la limitation à Chrome (j'ai prévu de quoi palier ce problème mais ce n'est pas encore fonctionnel). Si vous avez envie d'en savoir plus, voici un document que j'avais réalisé lors du prototypage pour garder une trace de la manière dont je devais faire mes calculs pour mesurer la latence de la connexion :
Le calcul du ping se fait en trois étapes :
- Envoie d'une requête XHR à une adresse normalement inconnue du navigateur (afin d'éviter tout problème de cache). Une URL pointant à la racine du serveur concaténée par le timestamp courant (afin d'éviter tout problème de cache) semble être la meilleure solution.
- Récupération des mesures avec la méthode
window.performance.getEntriesByName(USED_URL)[LAST_ITEM];
;- Calcul du temps de connexion au serveur (se baser sur cet article), représentant ainsi le temps de latence (en oubliant donc les éléments pertubateurs tels que le fetch DNS et autres choses) :
- Si la propriété
secureConnectionStart
est à 0 alors il s'agit d'une connexion HTTP. Le calcul se résume donc àconnectEnd - connectStart
.- Si la propriété
secureConnectionStart
est différente de 0 alors il s'agit d'une connexion HTTPS. Le calcul de la latence HTTPS se fait avecconnectEnd - connectStart
et le calcul de la latence HTTP avecsecureConnectionStart - connectStart
.Le protocole HTTP du serveur contacté ne doit pas utiliser les connexions persistantes ou bien la connexion TCP ne sera pas renouvelée et le calcul de la latence sera équivalent à 0.
Une chose importante à noter face au site SpeedOf.Me : toutes les données envoyées et réceptionnées sont générées à la volée, évitant ainsi une quelconque nécessiter d'héberger de gros fichiers sur le serveur et permettant aussi de lancer un éventuel upload avant même un download.
Enfin, une fois une première release mise en ligne, je vais m'atteler à un refactoring du projet pour passer d'ES5 à ES6, ce qui permettra d'obtenir un code plus propre grâce aux apports en sucre syntaxe de cette version du langage. Le développement se fera en ES6 et sera transpilé en ES5 par le biais de Traceur Compiler.
Voilà tout, les retours sont les bienvenus ! À noter que j'envisage de changer le nom du projet pour quelque chose de moins lié au service de SpeedTest.net (d'autant plus que le nom est déposé), je pensais à Network.js mais je suis à l'écoute d'autres suggestions.