import { SOURCE_DIR } from './constants/dir'; import path from 'node:path'; import { newQueue } from '@henrygd/queue'; import { isDomainAlive, keyedAsyncMutexWithQueue } from './lib/is-domain-alive'; import { fdir as Fdir } from 'fdir'; import runAgainstSourceFile from './lib/run-against-source-file'; const queue = newQueue(24); const deadDomains: string[] = []; function onDomain(args: [string, boolean]) { if (!args[1]) { deadDomains.push(args[0]); } } (async () => { const domainSets = await new Fdir() .withFullPaths() .filter((filePath, isDirectory) => { if (isDirectory) return false; const extname = path.extname(filePath); return extname === '.txt' || extname === '.conf'; }) .crawl(SOURCE_DIR + path.sep + 'domainset') .withPromise(); const domainRules = await new Fdir() .withFullPaths() .filter((filePath, isDirectory) => { if (isDirectory) return false; const extname = path.extname(filePath); return extname === '.txt' || extname === '.conf'; }) .crawl(SOURCE_DIR + path.sep + 'non_ip') .withPromise(); const promises: Array> = []; await Promise.all([ ...domainRules, ...domainSets ].map( filepath => runAgainstSourceFile( filepath, (domain: string, includeAllSubdomain: boolean) => promises.push(queue.add( () => keyedAsyncMutexWithQueue( domain, () => isDomainAlive(domain, includeAllSubdomain) ).then(onDomain) )) ).then(() => console.log('[crawl]', filepath)) )); await Promise.all(promises); console.log(); console.log(); console.log(JSON.stringify(deadDomains)); })();