Skip to content

Commit fa400d9

Browse files
core: frontend: disk: Add speed test
Signed-off-by: Patrick José Pereira <patrickelectric@gmail.com>
1 parent d110261 commit fa400d9

File tree

3 files changed

+318
-126
lines changed

3 files changed

+318
-126
lines changed

core/frontend/src/store/disk.ts

Lines changed: 50 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import {
33
} from 'vuex-module-decorators'
44

55
import store from '@/store'
6-
import { DiskUsageQuery, DiskUsageResponse } from '@/types/disk'
6+
import { DiskSpeedResult, DiskUsageQuery, DiskUsageResponse } from '@/types/disk'
77
import back_axios, { isBackendOffline } from '@/utils/api'
88

99
@Module({ dynamic: true, store, name: 'disk' })
@@ -18,6 +18,12 @@ class DiskStore extends VuexModule {
1818

1919
error: string | null = null
2020

21+
speedResult: DiskSpeedResult | null = null
22+
23+
speedTesting = false
24+
25+
speedError: string | null = null
26+
2127
@Mutation
2228
setUsage(value: DiskUsageResponse | null): void {
2329
this.usage = value
@@ -38,6 +44,21 @@ class DiskStore extends VuexModule {
3844
this.error = message
3945
}
4046

47+
@Mutation
48+
setSpeedResult(value: DiskSpeedResult | null): void {
49+
this.speedResult = value
50+
}
51+
52+
@Mutation
53+
setSpeedTesting(value: boolean): void {
54+
this.speedTesting = value
55+
}
56+
57+
@Mutation
58+
setSpeedError(message: string | null): void {
59+
this.speedError = message
60+
}
61+
4162
@Action
4263
async fetchUsage(query: DiskUsageQuery): Promise<void> {
4364
this.setLoading(true)
@@ -109,6 +130,34 @@ class DiskStore extends VuexModule {
109130
this.setDeleting(false)
110131
return { succeeded, failed }
111132
}
133+
134+
@Action
135+
async runSpeedTest(sizeBytes: number): Promise<void> {
136+
this.setSpeedTesting(true)
137+
this.setSpeedError(null)
138+
this.setSpeedResult(null)
139+
140+
await back_axios({
141+
method: 'get',
142+
url: `${this.API_URL}/speed`,
143+
params: { size_bytes: sizeBytes },
144+
timeout: 600000,
145+
})
146+
.then((response) => {
147+
this.setSpeedResult(response.data as DiskSpeedResult)
148+
})
149+
.catch((error) => {
150+
if (isBackendOffline(error)) {
151+
return
152+
}
153+
const axiosError = error as { response?: { data?: { detail?: string } }; message?: string }
154+
const message = axiosError.response?.data?.detail || axiosError.message || 'Unknown error'
155+
this.setSpeedError(`Speed test failed: ${message}`)
156+
})
157+
.finally(() => {
158+
this.setSpeedTesting(false)
159+
})
160+
}
112161
}
113162

114163
const disk_store = getModule(DiskStore)

core/frontend/src/types/disk.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,3 +20,12 @@ export interface DiskUsageQuery {
2020
include_files?: boolean
2121
min_size_bytes?: number
2222
}
23+
24+
export interface DiskSpeedResult {
25+
write_speed_mbps: number | null
26+
read_speed_mbps: number | null
27+
bytes_tested: number
28+
seed: string
29+
success: boolean
30+
error: string | null
31+
}

0 commit comments

Comments
 (0)