diff options
author | Nick Van Doorn <vandoorn.nick@gmail.com> | 2018-11-25 23:46:40 -0800 |
---|---|---|
committer | Nick Van Doorn <vandoorn.nick@gmail.com> | 2018-11-25 23:46:44 -0800 |
commit | 21e6d7f4d024fd7cc637c7dc0c6ad80eee0bc1c0 (patch) | |
tree | c47b34b488f4ed14f82b1e558a953128235948ac | |
parent | 796dc5d7e37ca897eac82cc1b42e33238c243a0e (diff) |
Implement fast.com download testing
-rw-r--r-- | src/test-services/fast/fast.ts | 54 |
1 files changed, 51 insertions, 3 deletions
diff --git a/src/test-services/fast/fast.ts b/src/test-services/fast/fast.ts index ae5956d..2092a60 100644 --- a/src/test-services/fast/fast.ts +++ b/src/test-services/fast/fast.ts @@ -1,6 +1,45 @@ import { TestService } from '../../models/test-service.model' import { Context } from '../../models/context.model' -import fastTest from 'fast-speedtest-api' +import puppeteer from 'puppeteer' +import Observable from 'zen-observable' + +// lifted from here: https://github.com/sindresorhus/fast-cli +// MIT License +// Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com) +async function init(browser, page, observer, prevSpeed?) { + const result = await page.evaluate(() => { + const $ = document.querySelector.bind(document) + + return { + speed: Number($('#speed-value').textContent), + unit: $('#speed-units').textContent.trim(), + isDone: Boolean($('#speed-value.succeeded')) + } + }) + + if (result.speed > 0 && result.speed !== prevSpeed) { + observer.next(result) + } + + if (result.isDone) { + browser.close() + observer.complete() + } else { + setTimeout(init, 100, browser, page, observer, result.speed) + } +} + +const makeFastObservable = () => + 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)) + }) // TODO looks like none of the pre-implemented fast.com // modules do not support upload speed ;-; @@ -8,10 +47,19 @@ export class Fast implements TestService { name = 'Fast.com Speed Test' constructor(private ctx: Context) {} testDownload = async (): Promise<number> => { - return 5 + const readings = [] + await makeFastObservable().forEach((result, i: number) => { + if (i > this.ctx.config.nTestSamples) { + return + } else { + readings.push(result.speed) + } + }) + return readings.reduce((a, b) => a + b) / readings.length } + // TODO implement testUpload = async (): Promise<number> => { - return 5 + return -1 } serverLocation = async (): Promise<string> => { return 'Victoria, BC' |