Loading...
Please waitLoading...
Please waitMeasure RTT, throughput and categorize connection quality for adaptive behaviors like adjusting video quality or deferring sync on poor networks.
pnpm dlx uselab@latest add use-network-quality
import * as React from "react"
import { useNetworkQuality } from "@/hooks/use-network-quality"
export function Component() {
const { rtt, downKbps, upKbps, category } = useNetworkQuality({
sampleInterval: 5000,
})
return (
<div>
<p>Network Quality: {category}</p>
<p>RTT: {rtt ? `${Math.round(rtt)}ms` : "N/A"}</p>
<p>
Download: {downKbps ? `${(downKbps / 1000).toFixed(2)} Mbps` : "N/A"}
</p>
</div>
)
}| Name | Type | Description | Default Value | Optional |
|---|---|---|---|---|
options | UseNetworkQualityOptions | Configuration object for network quality measurement. | — | No |
sampleInterval | number | Interval in milliseconds between quality measurements. | 5000 | Yes |
testEndpoint | string | URL endpoint to use for network measurements. | "https://www.google.com/favicon.ico" | Yes |
enabled | boolean | Whether to enable network quality monitoring. | true | Yes |
| Name | Type | Description |
|---|---|---|
rtt | number | null | Round Trip Time in milliseconds. |
downKbps | number | null | Download throughput in kilobits per second. |
upKbps | number | null | Upload throughput in kilobits per second. |
category | NetworkQualityCategory | Quality category: "excellent", "good", "fair", "poor", or "unknown". |
isMeasuring | boolean | Whether a measurement is currently in progress. |
error | Error | null | Error object if measurement failed, null otherwise. |
| Category | Criteria |
|---|---|
excellent | RTT < 50ms, Download > 5 Mbps, Upload > 2 Mbps |
good | RTT < 100ms, Download > 2 Mbps, Upload > 1 Mbps |
fair | RTT < 200ms, Download > 500 Kbps, Upload > 200 Kbps |
poor | Below fair thresholds |
unknown | No measurements available |
const { category, downKbps } = useNetworkQuality()
const videoQuality = React.useMemo(() => {
switch (category) {
case "excellent":
return "1080p"
case "good":
return "720p"
case "fair":
return "480p"
default:
return "360p"
}
}, [category])const { category } = useNetworkQuality()
const shouldSync = React.useMemo(() => {
return category === "excellent" || category === "good"
}, [category])
React.useEffect(() => {
if (shouldSync) {
syncData()
}
}, [shouldSync])const { rtt, category } = useNetworkQuality({
sampleInterval: 10000, // Measure every 10 seconds
enabled: true,
})const { category } = useNetworkQuality({
enabled: false, // Disable automatic monitoring
})sampleIntervalRTT < 50ms
Down > 5 Mbps
Up > 2 Mbps
RTT < 100ms
Down > 2 Mbps
Up > 1 Mbps
RTT < 200ms
Down > 500 Kbps
Up > 200 Kbps
Below fair thresholds