Check if servers are reachable
Works in Node.js and the browser (with a bundler).
The Node.js version uses HTTP HEAD/GET requests for HTTP(S) URLs and TCP connections for other ports. For HTTP(S), it tries HEAD requests first (for better performance and bandwidth efficiency), falling back to GET requests if HEAD is not supported. It attempts to detect cases where a router redirects the request to itself.
The browser version is limited by the fact that browsers cannot connect to arbitrary ports. It only supports HTTP and HTTPS and tries to load common favicon paths (/favicon.ico
, /favicon.png
, /favicon.svg
, /apple-touch-icon.png
, /apple-touch-icon-precomposed.png
) to determine reachability. The browser version does not support the requireHttpSuccess
option and will only return true
if the favicon files load successfully (equivalent to requireHttpSuccess: true
).
Important
By default, any HTTP response (including 404, 401, 403, 500, etc.) is considered “reachable” since it proves the server is responding. This aligns with the network-level definition of reachability. Use the requireHttpSuccess
option if you need to check for successful responses only.
npm install is-reachable
import isReachable from 'is-reachable';
console.log(await isReachable('sindresorhus.com'));
//=> true
console.log(await isReachable('google.com:443'));
//=> true
// With timeout
console.log(await isReachable('sindresorhus.com', {
signal: AbortSignal.timeout(3000)
}));
//=> true
Returns a Promise<boolean>
which is true
if any of the targets
are reachable.
Type: string | string[]
One or more targets to check. Can either be hostname:port
, a URL like https://hostname:port
or even just hostname
. port
must be specified if protocol is not http:
or https:
and defaults to 443
. Protocols other than http:
and https:
are not supported.
Type: object
Type: AbortSignal
An AbortSignal
to cancel the requests.
You can use AbortSignal.timeout()
to create a signal that automatically aborts after a specified time:
await isReachable('sindresorhus.com', {
signal: AbortSignal.timeout(3000)
});
Or combine multiple signals using AbortSignal.any()
:
const controller = new AbortController();
const timeoutSignal = AbortSignal.timeout(5000);
await isReachable('example.com', {
signal: AbortSignal.any([controller.signal, timeoutSignal])
});
Type: boolean
Default: false
Only consider the server reachable if it returns a successful HTTP status code (200-299).
When false
(default), any HTTP response (including 4xx and 5xx) is considered reachable, as it proves the server is responding. This aligns with the network-level definition of "reachability".
When true
, only successful HTTP responses (2xx status codes) are considered reachable, which is useful for application health checks.
- is-online - Check if the internet connection is up