Skip to content

Commit 37c0dd8

Browse files
Merge pull request #21 from AKVorrat/timeout-setting
Handle speedtest timeouts
2 parents 6b29146 + aba301d commit 37c0dd8

7 files changed

Lines changed: 36 additions & 22 deletions

File tree

nb-speedtest/src/SpeedTest.tsx

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { TestResult } from './types/test-result';
2-
import { Component, createEffect, createSignal, For, Match, Show, Switch, on } from "solid-js";
2+
import { Component, createEffect, createSignal, For, Match, Show, Switch, on, createResource } from "solid-js";
33
import { useTranslation } from './i18n/context';
44
import { PowerBtn } from './components/PowerBtn';
55
import { Stepper } from './components/Stepper';
@@ -46,7 +46,7 @@ const NBSpeedTest: Component<{ onStateChange?: (state: SpeedTestState) => void }
4646

4747
const now = createTimeSignal(1000)
4848

49-
// const [metadata] = createResource(fetchMetadata)
49+
const [metadata] = createResource(fetchMetadata)
5050

5151
const restart = () => {
5252
setSessionID(uuidV4())
@@ -65,6 +65,10 @@ const NBSpeedTest: Component<{ onStateChange?: (state: SpeedTestState) => void }
6565
}))
6666
)
6767

68+
createEffect(() => {
69+
console.log(`Connection Metadata: ${metadata()?.asOrganization} (ASN ${metadata()?.asn})`)
70+
})
71+
6872
const onStartClick = async () => {
6973
// Check privacy policy acceptance first
7074
if (!isPrivacyPolicyAccepted()) {

nb-speedtest/src/components/AdvancedResults/ErrorAccordion.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ export const ErrorAccordion: Component<{
1616
<div class="collapse-title text-lg font-medium peer-checked:bg-base-300 peer-checked:text-base-content">
1717
<div class="flex flex-row flex-wrap items-center justify-between gap-2">
1818
<span class="text-base lg:text-lg">{props.testResult.label}</span>
19-
<div class="text-xs lg:text-sm opacity-70 flex items-center gap-2">
19+
<div class="text-sm flex items-center gap-2">
2020
<TbExclamationCircle class="w-4 h-4 text-error" />
2121
<span class="text-error">{t.speedtest.error()}</span>
2222
</div>
@@ -34,4 +34,4 @@ export const ErrorAccordion: Component<{
3434
</div>
3535
</div>
3636
);
37-
};
37+
};

nb-speedtest/src/data/config.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,6 @@ const parseEnvNumber = (envVar: string | undefined, defaultValue: number): numbe
77
export const config = {
88
// 59 min, 59 sec
99
repeatIntervalSec: parseEnvNumber(import.meta.env.VITE_SPEEDTEST_REPEAT_INTERVAL, 60 * 60 - 1),
10-
// 270 second timeout for speedtest
11-
speedtestTimeoutMs: parseEnvNumber(import.meta.env.VITE_SPEEDTEST_TIMEOUT, 3 * 60 * 1000),
10+
// 5 minute timeout for speedtest
11+
speedtestTimeoutMs: parseEnvNumber(import.meta.env.VITE_SPEEDTEST_TIMEOUT, 5 * 60 * 1000),
1212
}

nb-speedtest/src/data/test-runs.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ export function getTestRuns(sessionID: string, routeLabeler: (letter: string, la
2929
turnServerCredsApiUrl: `${d.uri}/__turn`,
3030
turnServerUri: "turn.cloudflare.com:3478",
3131
includeCredentials: false,
32+
bandwidthAbortRequestDuration: 60 * 1000,
3233
measurements: [
3334
{ type: "download", bytes: 100_000, count: 2 },
3435
{ type: "upload", bytes: 100_000, count: 2 },

nb-speedtest/src/util/create-speedtest.ts

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { config as appConfig } from "../data/config"
55
import { SpeedtestError } from "../types/speedtest-error"
66

77
type SpeedTestCallbacks = {
8-
onDone?: (results: Results) => void
8+
onDone?: (results: Results) => void // callbacks are called exactly once, either onDone or onError, never both
99
onError?: (error: SpeedtestError) => void
1010
timeoutMs?: number
1111
}
@@ -38,12 +38,11 @@ export function createSpeedtest(config: ConfigOptions, callbacks: SpeedTestCallb
3838

3939
if (isRunning() && !isFinished()) {
4040
timeoutId = setTimeout(() => {
41+
if (isFinished()) return
42+
setIsFinished(true)
4143
const error = { message: `Speedtest timeout after ${timeoutMs}ms` }
42-
console.error("Speedtest timeout", error)
4344
speedTest.pause()
44-
if (callbacks.onError) {
45-
callbacks.onError(error)
46-
}
45+
callbacks.onError?.(error)
4746
}, timeoutMs)
4847
}
4948
}
@@ -85,18 +84,29 @@ export function createSpeedtest(config: ConfigOptions, callbacks: SpeedTestCallb
8584
clearTimeoutTimer()
8685
}
8786
}
87+
8888
speedTest.onFinish = () => {
8989
clearTimeoutTimer()
90+
91+
// make sure we only ever do the callback once
92+
if (isFinished()) return
9093
setIsFinished(true)
91-
if (callbacks.onDone) callbacks.onDone(speedTest.results)
94+
95+
const summary = speedTest.results.getSummary()
96+
console.log("done", summary, speedTest.results.getDownloadBandwidth())
97+
if (!summary.download && !summary.upload) { // we consider a speedtest with no results failed
98+
callbacks.onError?.({ message: "All measurements failed" })
99+
} else {
100+
callbacks.onDone?.(speedTest.results)
101+
}
92102
}
103+
104+
// speedtest can return multiple errors when individual measurements fail
105+
// errors are non terminal so for our purpose they are more like warnings
93106
speedTest.onError = (error) => {
94-
clearTimeoutTimer()
95-
console.error("Speedtest error", error)
96-
if (callbacks.onError) {
97-
callbacks.onError({ message: error })
98-
}
107+
console.warn("Speedtest measurement error:", error)
99108
}
109+
100110
onCleanup(() => {
101111
clearTimeoutTimer()
102112
if (speedTest?.isRunning) {

package-lock.json

Lines changed: 3 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
"license": "ISC",
1616
"description": "",
1717
"dependencies": {
18-
"@cloudflare/speedtest": "^1.7.0",
18+
"@cloudflare/speedtest": "github:cloudflare/speedtest#v1.8.0",
1919
"@fontsource/roboto": "^5.1.0",
2020
"@fontsource/source-code-pro": "^5.1.0",
2121
"@solid-primitives/i18n": "^2.2.1",

0 commit comments

Comments
 (0)