Browse Source
It's important to have this in the meantime, otherwise taker will get shutdown when maker goes offline and we will not notice it.new-http-api
Mariusz Klochowicz
3 years ago
2 changed files with 52 additions and 0 deletions
@ -0,0 +1,50 @@ |
|||
import { useEffect, useRef } from "react"; |
|||
|
|||
async function fetchWithTimeout(resource: any, timeout: number) { |
|||
const controller = new AbortController(); |
|||
const id = setTimeout(() => controller.abort(), timeout); |
|||
const response = await fetch(resource, { |
|||
signal: controller.signal, |
|||
}); |
|||
clearTimeout(id); |
|||
return response; |
|||
} |
|||
|
|||
// Check for backend's presence by sending a request to '/alive' endpoint.
|
|||
// When the backend's not there, the request is likely to timeout, triggering a
|
|||
// persistent toast notification that goes away when the daemon is back online.
|
|||
export function useBackendMonitor(toast: any, timeout_ms: number): void { |
|||
const toastIdRef = useRef(); |
|||
|
|||
const checkForBackend: () => void = async () => { |
|||
try { |
|||
const res = await fetchWithTimeout("/alive", timeout_ms); |
|||
// In case we get a response, but it's not what we expected
|
|||
if (res.status.toString().startsWith("2")) { |
|||
if (toastIdRef.current) { |
|||
toast.close(toastIdRef.current); |
|||
} |
|||
} else { |
|||
throw new Error(res.statusText); |
|||
} |
|||
} catch (e) { |
|||
if (!toastIdRef.current) { |
|||
toastIdRef.current = toast({ |
|||
title: "Connection Error", |
|||
description: "Daemon process is not running", |
|||
status: "error", |
|||
position: "top", |
|||
duration: timeout_ms * 100000, // we don't want this to be closed
|
|||
isClosable: false, |
|||
}); |
|||
} |
|||
} |
|||
}; |
|||
|
|||
useEffect(() => { |
|||
const interval = setInterval(() => checkForBackend(), timeout_ms); |
|||
return () => { |
|||
clearInterval(interval); |
|||
}; |
|||
}); |
|||
} |
Loading…
Reference in new issue