old-remnantchat/src/components/Shell/useConnectionTest.ts

108 lines
2.8 KiB
TypeScript

import { useEffect, useState } from 'react'
import { sleep } from 'utils'
import {
ConnectionTest,
ConnectionTestEvent,
ConnectionTestEvents,
TrackerConnection,
} from 'services/ConnectionTest/ConnectionTest'
export interface ConnectionTestResults {
hasHost: boolean
hasRelay: boolean
trackerConnection: TrackerConnection
}
const rtcPollInterval = 20 * 1000
const trackerPollInterval = 5 * 1000
export const useConnectionTest = () => {
const [hasHost, setHasHost] = useState(false)
const [hasRelay, setHasRelay] = useState(false)
const [trackerConnection, setTrackerConnection] = useState(
TrackerConnection.SEARCHING
)
useEffect(() => {
const checkRtcConnection = async () => {
const connectionTest = new ConnectionTest()
const handleHasHostChanged = ((event: ConnectionTestEvent) => {
setHasHost(event.detail.hasHost)
connectionTest.removeEventListener(
ConnectionTestEvents.HAS_HOST_CHANGED,
handleHasHostChanged
)
}) as EventListener
connectionTest.addEventListener(
ConnectionTestEvents.HAS_HOST_CHANGED,
handleHasHostChanged
)
const handleHasRelayChanged = ((event: ConnectionTestEvent) => {
setHasRelay(event.detail.hasRelay)
connectionTest.removeEventListener(
ConnectionTestEvents.HAS_RELAY_CHANGED,
handleHasRelayChanged
)
}) as EventListener
connectionTest.addEventListener(
ConnectionTestEvents.HAS_RELAY_CHANGED,
handleHasRelayChanged
)
setTimeout(() => {
connectionTest.removeEventListener(
ConnectionTestEvents.HAS_HOST_CHANGED,
handleHasHostChanged
)
connectionTest.removeEventListener(
ConnectionTestEvents.HAS_RELAY_CHANGED,
handleHasRelayChanged
)
}, rtcPollInterval)
try {
await connectionTest.initRtcPeerConnectionTest()
} catch (e) {
setHasHost(false)
setHasRelay(false)
console.error(e)
}
return connectionTest
}
;(async () => {
while (true) {
const connectionTest = await checkRtcConnection()
await sleep(rtcPollInterval)
connectionTest.destroyRtcPeerConnectionTest()
}
})()
;(async () => {
while (true) {
try {
const connectionTest = new ConnectionTest()
const trackerConnectionTestResult =
connectionTest.testTrackerConnection()
setTrackerConnection(trackerConnectionTestResult)
} catch (e) {
setTrackerConnection(TrackerConnection.FAILED)
}
await sleep(trackerPollInterval)
}
})()
}, [])
return {
connectionTestResults: { hasHost, hasRelay, trackerConnection },
}
}