-
Notifications
You must be signed in to change notification settings - Fork 0
/
useGetSystemResources.ts
122 lines (107 loc) · 3.02 KB
/
useGetSystemResources.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
import { useCallback, useEffect, useState } from 'react'
import { ExtensionTypeEnum, MonitoringExtension } from '@janhq/core'
import { useSetAtom } from 'jotai'
import { extensionManager } from '@/extension/ExtensionManager'
import {
cpuUsageAtom,
totalRamAtom,
usedRamAtom,
nvidiaTotalVramAtom,
gpusAtom,
ramUtilitizedAtom,
availableVramAtom,
} from '@/helpers/atoms/SystemBar.atom'
export default function useGetSystemResources() {
const [intervalId, setIntervalId] = useState<
NodeJS.Timeout | number | undefined
>(undefined)
const setTotalRam = useSetAtom(totalRamAtom)
const setGpus = useSetAtom(gpusAtom)
const setUsedRam = useSetAtom(usedRamAtom)
const setCpuUsage = useSetAtom(cpuUsageAtom)
const setTotalNvidiaVram = useSetAtom(nvidiaTotalVramAtom)
const setAvailableVram = useSetAtom(availableVramAtom)
const setRamUtilitized = useSetAtom(ramUtilitizedAtom)
const getSystemResources = useCallback(async () => {
if (
!extensionManager.get<MonitoringExtension>(
ExtensionTypeEnum.SystemMonitoring
)
) {
return
}
const monitoring = extensionManager.get<MonitoringExtension>(
ExtensionTypeEnum.SystemMonitoring
)
const resourceInfor = await monitoring?.getResourcesInfo()
const currentLoadInfor = await monitoring?.getCurrentLoad()
if (resourceInfor?.mem?.usedMemory) setUsedRam(resourceInfor.mem.usedMemory)
if (resourceInfor?.mem?.totalMemory)
setTotalRam(resourceInfor.mem.totalMemory)
const ramUtilitized =
((resourceInfor?.mem?.usedMemory ?? 0) /
(resourceInfor?.mem?.totalMemory ?? 1)) *
100
setRamUtilitized(Math.round(ramUtilitized))
setCpuUsage(Math.round(currentLoadInfor?.cpu?.usage ?? 0))
const gpus = currentLoadInfor?.gpu ?? []
setGpus(gpus)
let totalNvidiaVram = 0
if (gpus.length > 0) {
totalNvidiaVram = gpus.reduce(
(total: number, gpu: { memoryTotal: string }) =>
total + Number(gpu.memoryTotal),
0
)
}
setTotalNvidiaVram(totalNvidiaVram)
setAvailableVram(
gpus.reduce(
(total: number, gpu: { memoryFree: string }) =>
total + Number(gpu.memoryFree),
0
)
)
}, [
setUsedRam,
setTotalRam,
setRamUtilitized,
setCpuUsage,
setGpus,
setTotalNvidiaVram,
setAvailableVram,
])
const watch = () => {
getSystemResources()
// Fetch interval - every 2s
const itv = setInterval(() => {
getSystemResources()
}, 2000)
setIntervalId(itv)
}
const stopWatching = useCallback(() => {
if (intervalId) clearInterval(intervalId)
}, [intervalId])
useEffect(() => {
getSystemResources()
// Component did unmount
// Stop watching if any
return () => {
stopWatching()
}
}, [getSystemResources, stopWatching])
return {
/**
* Fetch resource informations once
*/
getSystemResources,
/**
* Fetch & watch for resource update
*/
watch,
/**
* Stop watching
*/
stopWatching,
}
}