fast-speed-test
Version:
Uses Netflix's Fast.com infrastructure to measure network speed
85 lines • 3.47 kB
JavaScript
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
;