Skip to content

Commit

Permalink
Measure upload speed (#28)
Browse files Browse the repository at this point in the history
Closes #27
  • Loading branch information
GloriousYellow authored and sindresorhus committed Feb 20, 2019
1 parent 067b20e commit 076a30d
Show file tree
Hide file tree
Showing 4 changed files with 77 additions and 34 deletions.
70 changes: 44 additions & 26 deletions api.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,37 +2,55 @@
/* eslint-env browser */
const puppeteer = require('puppeteer');
const Observable = require('zen-observable');
const equals = require('deep-equal'); // TODO: Use `util.isDeepStrictEqual` when targeting Node.js 10
const delay = require('delay');

async function init(browser, page, observer, prevSpeed) {
const result = await page.evaluate(() => {
const $ = document.querySelector.bind(document);
async function init(browser, page, observer, opts) {
let prevResult;

return {
speed: Number($('#speed-value').textContent),
unit: $('#speed-units').textContent.trim(),
isDone: Boolean($('#speed-value.succeeded'))
};
});
/* eslint-disable no-constant-condition, no-await-in-loop */

if (result.speed > 0 && result.speed !== prevSpeed) {
observer.next(result);
}
while (true) {
const result = await page.evaluate(() => {
const $ = document.querySelector.bind(document);

return {
downloadSpeed: Number($('#speed-value').textContent),
uploadSpeed: Number($('#upload-value').textContent),
downloadUnit: $('#speed-units').textContent.trim(),
uploadUnit: $('#upload-units').textContent.trim(),
isDone: Boolean(
$('#speed-value.succeeded') && $('#upload-value.succeeded')
)
};
});

if (result.downloadSpeed > 0 && !equals(result, prevResult)) {
observer.next(result);
}

if (result.isDone) {
browser.close();
observer.complete();
} else {
setTimeout(init, 100, browser, page, observer, result.speed);
if (result.isDone || (opts && !opts.measureUpload && result.uploadSpeed)) {
browser.close();
observer.complete();
return;
}

prevResult = result;

await delay(100);
}

/* eslint-enable no-constant-condition, no-await-in-loop */
}

module.exports = () => new Observable(observer => {
// Wrapped in async IIFE as `new Observable` can't handle async function
(async () => {
const browser = await puppeteer.launch({args: ['--no-sandbox']});
const page = await browser.newPage();
module.exports = opts =>
new Observable(observer => {
// Wrapped in async IIFE as `new Observable` can't handle async function
(async () => {
const browser = await puppeteer.launch({args: ['--no-sandbox']});
const page = await browser.newPage();

await page.goto('https://fast.com');
await init(browser, page, observer);
})().catch(observer.error.bind(observer));
});
await page.goto('https://fast.com');
await init(browser, page, observer, opts);
})().catch(observer.error.bind(observer));
});
38 changes: 30 additions & 8 deletions cli.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,14 @@ const logUpdate = require('log-update');
const ora = require('ora');
const api = require('./api');

meow(`
const cli = meow(`
Usage
$ fast
$ fast > file
$ fast
$ fast > file
$ fast --verbose
`);

// Check connection
// Check connections
dns.lookup('fast.com', err => {
if (err && err.code === 'ENOTFOUND') {
console.error(chalk.red('\n Please check your internet connection.\n'));
Expand All @@ -24,13 +25,34 @@ dns.lookup('fast.com', err => {
let data = {};
const spinner = ora();

const speed = () => chalk[data.isDone ? 'green' : 'cyan'](data.speed + ' ' + chalk.dim(data.unit)) + '\n\n';
const downloadSpeed = () =>
`${data.downloadSpeed} ${chalk.dim(data.downloadUnit)} ↓`;

const uploadSpeed = () =>
data.uploadSpeed ?
`${data.uploadSpeed} ${chalk.dim(data.uploadUnit)} ↑` :
chalk.dim('- Mbps ↑');

const uColor = s => (data.isDone ? chalk.green(s) : chalk.cyan(s));

const dColor = s => ((data.isDone || data.uploadSpeed) ? chalk.green(s) : chalk.cyan(s));

const speedText = () =>
cli.flags.verbose ?
`${dColor(downloadSpeed())} ${chalk.dim('/')} ${uColor(uploadSpeed())}` :
dColor(downloadSpeed());

const speed = () => speedText() + '\n\n';

function exit() {
if (process.stdout.isTTY) {
logUpdate(`\n\n ${speed()}`);
} else if (cli.flags.verbose) {
console.log(
`${data.downloadSpeed} ${data.downloadUnit} / ${data.uploadSpeed} ${data.uploadUnit}`
);
} else {
console.log(`${data.speed} ${data.unit}`);
console.log(`${data.downloadSpeed} ${data.downloadUnit}`);
}

process.exit();
Expand All @@ -40,7 +62,7 @@ if (process.stdout.isTTY) {
setInterval(() => {
const pre = '\n\n ' + chalk.gray.dim(spinner.frame());

if (!data.speed) {
if (!data.downloadSpeed) {
logUpdate(pre + '\n\n');
return;
}
Expand All @@ -51,7 +73,7 @@ if (process.stdout.isTTY) {

(async () => {
try {
await api().forEach(result => {
await api({measureUpload: cli.flags.verbose}).forEach(result => {
data = result;
});

Expand Down
2 changes: 2 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,8 @@
],
"dependencies": {
"chalk": "^2.1.0",
"deep-equal": "^1.0.1",
"delay": "^4.1.0",
"log-update": "^2.1.0",
"meow": "^5.0.0",
"ora": "^2.0.0",
Expand Down
1 change: 1 addition & 0 deletions readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ $ fast --help
Usage
$ fast
$ fast > file
$ fast --verbose
```


Expand Down

0 comments on commit 076a30d

Please sign in to comment.