'use strict';const require$$0=require('node:path'),require$$5=require('tldts-experimental'),index=require('./index.B8Uk9n3v.cjs'),base=require('./base.C13YY5P3.cjs'),fetchTextByLine=require('./fetch-text-by-line.YY5b5610.cjs'),domainset=require('./domainset.CSQfKAtf.cjs'),fetchRetry=require('./fetch-retry.D06uBUaW.cjs'),require$$7=require('@henrygd/queue');var buildSpeedtestDomainset = {exports: {}};var hasRequiredBuildSpeedtestDomainset; function requireBuildSpeedtestDomainset () { if (hasRequiredBuildSpeedtestDomainset) return buildSpeedtestDomainset.exports; hasRequiredBuildSpeedtestDomainset = 1; (function (module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "buildSpeedtestDomainSet", { enumerable: true, get: function() { return buildSpeedtestDomainSet; } }); const _nodepath = /*#__PURE__*/ _interop_require_default(require$$0); const _tldtsexperimental = /*#__PURE__*/ _interop_require_default(require$$5); const _trace = /*@__PURE__*/ index.r(); const _description = /*@__PURE__*/ base.r(); const _fetchtextbyline = /*@__PURE__*/ fetchTextByLine.a(); const _domainset = /*@__PURE__*/ domainset.r(); const _dir = /*@__PURE__*/ fetchRetry.a(); const _queue = require$$7; const _fetchretry = /*@__PURE__*/ fetchRetry.r(); function _interop_require_default(obj) { return obj && obj.__esModule ? obj : { default: obj }; } const KEYWORDS = [ 'Hong Kong', 'Taiwan', 'China Telecom', 'China Mobile', 'China Unicom', 'Japan', 'Tokyo', 'Singapore', 'Korea', 'Seoul', 'Canada', 'Toronto', 'Montreal', 'Los Ang', 'San Jos', 'Seattle', 'New York', 'Dallas', 'Miami', 'Berlin', 'Frankfurt', 'London', 'Paris', 'Amsterdam', 'Moscow', 'Australia', 'Sydney', 'Brazil', 'Turkey' ]; const s = (0, _queue.newQueue)(2); const latestTopUserAgentsPromise = (0, _fetchretry.$$fetch)('https://raw.githubusercontent.com/microlinkhq/top-user-agents/master/src/desktop.json').then((res)=>res.json()).then((userAgents)=>userAgents.filter((ua)=>ua.startsWith('Mozilla/5.0 '))); const getSpeedtestHostsGroupsPromise = Promise.all(KEYWORDS.flatMap(querySpeedtestApi)); const buildSpeedtestDomainSet = (0, _trace.task)(require.main === module, __filename)(async (span)=>{ const output = new _domainset.DomainsetOutput(span, 'speedtest').withTitle('Sukka\'s Ruleset - Speedtest Domains').withDescription([ ..._description.SHARED_DESCRIPTION, '', 'This file contains common speedtest endpoints.' ]).addFromDomainset((0, _fetchtextbyline.readFileIntoProcessedArray)(_nodepath.default.resolve(_dir.SOURCE_DIR, 'domainset/speedtest.conf'))).addFromDomainset((0, _fetchtextbyline.readFileIntoProcessedArray)(_nodepath.default.resolve(_dir.OUTPUT_SURGE_DIR, 'domainset/speedtest.conf'))); const hostnameGroup = await span.traceChildPromise('get speedtest hosts groups', getSpeedtestHostsGroupsPromise); hostnameGroup.forEach(output.bulkAddDomain.bind(output)); return output.write(); }); async function querySpeedtestApi(keyword) { const topUserAgents = await latestTopUserAgentsPromise; const url = `https://www.speedtest.net/api/js/servers?engine=js&search=${keyword}&limit=100`; try { const randomUserAgent = topUserAgents[Math.floor(Math.random() * topUserAgents.length)]; const data = await s.add(()=>(0, _fetchretry.$$fetch)(url, { headers: { dnt: '1', Referer: 'https://www.speedtest.net/', accept: 'application/json, text/plain, */*', 'User-Agent': randomUserAgent, 'Accept-Language': 'en-US,en;q=0.9', ...randomUserAgent.includes('Chrome') ? { 'Sec-Ch-Ua-Mobile': '?0', 'Sec-Fetch-Dest': 'empty', 'Sec-Fetch-Mode': 'cors', 'Sec-Fetch-Site': 'same-origin', 'Sec-Gpc': '1' } : {} }, signal: AbortSignal.timeout(1000 * 60) }).then((res)=>res.json())); return data.reduce((prev, cur)=>{ const hn = _tldtsexperimental.default.getHostname(cur.host || cur.url, { detectIp: false, validateHostname: true }); if (hn) { prev.push(hn); } return prev; }, []); } catch (e) { console.error(e); return []; } } } (buildSpeedtestDomainset, buildSpeedtestDomainset.exports)); return buildSpeedtestDomainset.exports; }exports.r=requireBuildSpeedtestDomainset;