UNPKG

@adguard/dead-domains-linter

Version:

Simple tool to check adblock filtering rules for dead domains.

57 lines (48 loc) 1.82 kB
const punycode = require('node:punycode'); const { fetchWithRetry, trimFqdn } = require('./fetchdomains'); const CHUNK_SIZE = 25; /** * This function looks for dead domains among the specified ones. It uses a web * service to do that. * * @param {Array<string>} domains domains to check. * @param {number} chunkSize configures the size of chunks for checking large * arrays. * @returns {Promise<Array<string>>} returns the list of dead domains. */ async function findDeadDomains(domains, chunkSize = CHUNK_SIZE) { const result = []; // Split the domains array into chunks const chunks = []; for (let i = 0; i < domains.length; i += chunkSize) { chunks.push(domains.slice(i, i + chunkSize)); } // Compose and send requests for each chunk // eslint-disable-next-line no-restricted-syntax for (const chunk of chunks) { try { // eslint-disable-next-line no-await-in-loop const response = await fetchWithRetry(chunk); // eslint-disable-next-line no-await-in-loop const data = await response.json(); if (data.error) { throw new Error(data.error); } // Iterate over the domains in the chunk // eslint-disable-next-line no-restricted-syntax for (const domain of chunk) { const domainData = data[punycode.toASCII(trimFqdn(domain))]; if (domainData && domainData.info.registered_domain_used_last_24_hours === false) { result.push(domain); } } } catch (ex) { // Re-throw to add information about the URL. throw new Error(`Failed to fetch domains ${ex}`); } } return result; } module.exports = { findDeadDomains, };