UNPKG

fast-speed-test

Version:

Uses Netflix's Fast.com infrastructure to measure network speed

85 lines 3.47 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); const https = require("https"); const token = 'true&token=YXNkZmFzZGxmbnNkYWZoYXNkZmhrYWxm'; function average(arr) { return arr.reduce((a, b) => a + b) / arr.length; } function get(url) { return __awaiter(this, void 0, void 0, function* () { return new Promise(resolve => https.get(url, response => { resolve(response); }).end()); }); } function getBody(response) { return __awaiter(this, void 0, void 0, function* () { return new Promise(resolve => { let data = ''; response.on('data', d => data += d); response.on('end', () => resolve(data)); }); }); } function chooseVideos() { return __awaiter(this, void 0, void 0, function* () { const response = yield get('https://api.fast.com/netflix/speedtest?https=' + token); try { const urls = JSON.parse(yield getBody(response)); const targets = urls.map(urlobject => urlobject.url); return targets; } catch (err) { throw new Error('Failed to select a cdn server: ' + err); } }); } /** * Uses 3 connections to netflix cdns, counting bytes transferred. * Uses 0.2s time slices, averaged w/ sma5. * Resolves when the first video finished downloading. * Returns Speed in bytes per second. * * @export * @param {number} [timeLimitInSeconds=60] time limit for the speed test (60 sec by default) * @returns {Promise<number>} Speed in bytes per second */ function getSpeed(timeLimitInSeconds = 60) { return __awaiter(this, void 0, void 0, function* () { const timeLimitInMS = timeLimitInSeconds * 1000; //ensure existence and convert to ms const startTime = Date.now(); const targets = yield chooseVideos(); let bytes = 0; let done = false; targets.forEach((target) => __awaiter(this, void 0, void 0, function* () { const stream = yield get(target); stream.on('data', data => bytes += data.length); stream.on('end', () => done = true); })); return new Promise(resolve => { let i = 0; const recents = [0, 0, 0, 0, 0]; //list of most recent speeds const interval = 200; //ms setInterval(() => { if (done || (Date.now() - startTime) > timeLimitInMS) { resolve(average(recents)); } else { i = (i + 1) % recents.length; //loop through recents recents[i] = bytes / (interval / 1000); //add most recent bytes/second bytes = 0; //reset byte count } }, interval); }); }); } exports.default = getSpeed; //# sourceMappingURL=index.js.map