reachy-url
Version:
Zero dependency nodejs library for checking if URL is reachable or not
73 lines (71 loc) • 2.33 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "default", {
enumerable: true,
get: ()=>_default
});
const _url = require("url");
const _http = _interopRequireDefault(require("http"));
const _https = _interopRequireDefault(require("https"));
function _interopRequireDefault(obj) {
return obj && obj.__esModule ? obj : {
default: obj
};
}
// taken from https://stackoverflow.com/a/68415816/5748481
/**
Check if a URL is reachable
@param {string} url - URL of the website
@param {number} timeout - Cancel request after given time
@param {RequestOptions} requestOptions - Request options for HTTP Request
@returns {Promise} Promise object with status code or error
@example
try {
const statusCode = await isReachable("https://learnaws.io");
// statusCode = 200
} catch (error) {
const { message } = error;
// Unable to resolve given URL, got status 404 or
// Request timed out while requesting the provided URL
}
*/ const isReachable = (url, timeout = 2000, requestOptions)=>{
return new Promise((resolve, reject)=>{
const { host , protocol , pathname } = (0, _url.parse)(url);
if (!host) {
reject(Error("Invalid URL"));
}
const isHttps = protocol === "https:";
const options = {
host,
timeout,
method: "HEAD",
path: pathname,
port: isHttps ? 443 : 80,
...requestOptions
};
const network = isHttps ? _https.default : _http.default;
const req = network.request(options, (res)=>{
const statusCode = res.statusCode ?? 404;
const isStatusOk = statusCode < 400;
if (isStatusOk) {
return resolve(statusCode);
}
reject(Error(`Unable to resolve given URL, got status ${res.statusCode}`));
});
req.end();
req.on("timeout", ()=>{
req.destroy(Error("Request timed out while requesting the provided URL"));
});
req.on("error", (err)=>{
reject(err);
});
});
};
const _default = isReachable;
console.time("took");
isReachable("https://learnaws.io").then((d)=>{
console.log(d);
console.timeEnd("took");
}); /*#__PURE__*/ /*#__PURE__*/