@@ -5,7 +5,7 @@ import { config as appConfig } from "../data/config"
55import { SpeedtestError } from "../types/speedtest-error"
66
77type 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 ) {
0 commit comments