mirror of
https://github.com/SukkaW/Surge.git
synced 2026-01-29 01:51:52 +08:00
Refactor: new output
This commit is contained in:
@@ -1,6 +1,4 @@
|
||||
import path from 'node:path';
|
||||
import { createRuleset } from './lib/create-file';
|
||||
import { sortDomains } from './lib/stable-sort-domain';
|
||||
|
||||
import { Sema } from 'async-sema';
|
||||
import { getHostname } from 'tldts';
|
||||
@@ -10,8 +8,132 @@ import { SHARED_DESCRIPTION } from './lib/constants';
|
||||
import { readFileIntoProcessedArray } from './lib/fetch-text-by-line';
|
||||
import { TTL, deserializeArray, fsFetchCache, serializeArray, createCacheKey } from './lib/cache-filesystem';
|
||||
|
||||
import { createTrie } from './lib/trie';
|
||||
import { output } from './lib/misc';
|
||||
import { DomainsetOutput } from './lib/create-file-new';
|
||||
import { OUTPUT_SURGE_DIR } from './constants/dir';
|
||||
|
||||
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 PREDEFINE_DOMAINS = [
|
||||
// speedtest.net
|
||||
'.speedtest.net',
|
||||
'.speedtestcustom.com',
|
||||
'.ooklaserver.net',
|
||||
'.speed.misaka.one',
|
||||
'.speedtest.rt.ru',
|
||||
'.speedtest.aptg.com.tw',
|
||||
'.speedtest.gslnetworks.com',
|
||||
'.speedtest.jsinfo.net',
|
||||
'.speedtest.i3d.net',
|
||||
'.speedtestkorea.com',
|
||||
'.speedtest.telus.com',
|
||||
'.speedtest.telstra.net',
|
||||
'.speedtest.clouvider.net',
|
||||
'.speedtest.idv.tw',
|
||||
'.speedtest.frontier.com',
|
||||
'.speedtest.orange.fr',
|
||||
'.speedtest.centurylink.net',
|
||||
'.srvr.bell.ca',
|
||||
'.speedtest.contabo.net',
|
||||
'speedtest.hk.chinamobile.com',
|
||||
'speedtestbb.hk.chinamobile.com',
|
||||
'.hizinitestet.com',
|
||||
'.linknetspeedtest.net.br',
|
||||
'speedtest.rit.edu',
|
||||
'speedtest.ropa.de',
|
||||
'speedtest.sits.su',
|
||||
'speedtest.tigo.cr',
|
||||
'speedtest.upp.com',
|
||||
'.speedtest.pni.tw',
|
||||
'.speed.pfm.gg',
|
||||
'.speedtest.faelix.net',
|
||||
'.speedtest.labixe.net',
|
||||
'.speedtest.warian.net',
|
||||
'.speedtest.starhub.com',
|
||||
'.speedtest.gibir.net.tr',
|
||||
'.speedtest.ozarksgo.net',
|
||||
'.speedtest.exetel.com.au',
|
||||
'.speedtest.sbcglobal.net',
|
||||
'.speedtest.leaptel.com.au',
|
||||
'.speedtest.windstream.net',
|
||||
'.speedtest.vodafone.com.au',
|
||||
'.speedtest.rascom.ru',
|
||||
'.speedtest.dchost.com',
|
||||
'.speedtest.highnet.com',
|
||||
'.speedtest.seattle.wa.limewave.net',
|
||||
'.speedtest.optitel.com.au',
|
||||
'.speednet.net.tr',
|
||||
'.speedtest.angolacables.co.ao',
|
||||
'.ookla-speedtest.fsr.com',
|
||||
'.speedtest.comnet.com.tr',
|
||||
'.speedtest.gslnetworks.com.au',
|
||||
'.test.gslnetworks.com.au',
|
||||
'.speedtest.gslnetworks.com',
|
||||
'.speedtestunonet.com.br',
|
||||
'.speedtest.alagas.net',
|
||||
'speedtest.surfshark.com',
|
||||
'.speedtest.aarnet.net.au',
|
||||
'.ookla.rcp.net',
|
||||
'.ookla-speedtests.e2ro.com',
|
||||
'.speedtest.com.sg',
|
||||
'.ookla.ddnsgeek.com',
|
||||
'.speedtest.pni.tw',
|
||||
'.speedtest.cmcnetworks.net',
|
||||
'.speedtestwnet.com.br',
|
||||
// Cloudflare
|
||||
'.speed.cloudflare.com',
|
||||
// Wi-Fi Man
|
||||
'.wifiman.com',
|
||||
'.wifiman.me',
|
||||
'.wifiman.ubncloud.com',
|
||||
// Fast.com
|
||||
'.fast.com',
|
||||
// MacPaw
|
||||
'speedtest.macpaw.com',
|
||||
// speedtestmaster
|
||||
'.netspeedtestmaster.com',
|
||||
// Google Search Result of "speedtest", powered by this
|
||||
'.measurement-lab.org',
|
||||
'.measurementlab.net',
|
||||
// Google Fiber legacy speedtest site (new fiber speedtest use speedtestcustom.com)
|
||||
'.speed.googlefiber.net',
|
||||
// librespeed
|
||||
'.backend.librespeed.org',
|
||||
// Apple,
|
||||
'mensura.cdn-apple.com', // From netQuality command
|
||||
// OpenSpeedtest
|
||||
'open.cachefly.net' // This is also used for openspeedtest server download
|
||||
|
||||
];
|
||||
|
||||
const s = new Sema(2);
|
||||
const cacheKey = createCacheKey(__filename);
|
||||
@@ -85,170 +207,24 @@ const querySpeedtestApi = async (keyword: string): Promise<Array<string | null>>
|
||||
};
|
||||
|
||||
export const buildSpeedtestDomainSet = task(require.main === module, __filename)(async (span) => {
|
||||
const domainTrie = createTrie(
|
||||
[
|
||||
// speedtest.net
|
||||
'.speedtest.net',
|
||||
'.speedtestcustom.com',
|
||||
'.ooklaserver.net',
|
||||
'.speed.misaka.one',
|
||||
'.speedtest.rt.ru',
|
||||
'.speedtest.aptg.com.tw',
|
||||
'.speedtest.gslnetworks.com',
|
||||
'.speedtest.jsinfo.net',
|
||||
'.speedtest.i3d.net',
|
||||
'.speedtestkorea.com',
|
||||
'.speedtest.telus.com',
|
||||
'.speedtest.telstra.net',
|
||||
'.speedtest.clouvider.net',
|
||||
'.speedtest.idv.tw',
|
||||
'.speedtest.frontier.com',
|
||||
'.speedtest.orange.fr',
|
||||
'.speedtest.centurylink.net',
|
||||
'.srvr.bell.ca',
|
||||
'.speedtest.contabo.net',
|
||||
'speedtest.hk.chinamobile.com',
|
||||
'speedtestbb.hk.chinamobile.com',
|
||||
'.hizinitestet.com',
|
||||
'.linknetspeedtest.net.br',
|
||||
'speedtest.rit.edu',
|
||||
'speedtest.ropa.de',
|
||||
'speedtest.sits.su',
|
||||
'speedtest.tigo.cr',
|
||||
'speedtest.upp.com',
|
||||
'.speedtest.pni.tw',
|
||||
'.speed.pfm.gg',
|
||||
'.speedtest.faelix.net',
|
||||
'.speedtest.labixe.net',
|
||||
'.speedtest.warian.net',
|
||||
'.speedtest.starhub.com',
|
||||
'.speedtest.gibir.net.tr',
|
||||
'.speedtest.ozarksgo.net',
|
||||
'.speedtest.exetel.com.au',
|
||||
'.speedtest.sbcglobal.net',
|
||||
'.speedtest.leaptel.com.au',
|
||||
'.speedtest.windstream.net',
|
||||
'.speedtest.vodafone.com.au',
|
||||
'.speedtest.rascom.ru',
|
||||
'.speedtest.dchost.com',
|
||||
'.speedtest.highnet.com',
|
||||
'.speedtest.seattle.wa.limewave.net',
|
||||
'.speedtest.optitel.com.au',
|
||||
'.speednet.net.tr',
|
||||
'.speedtest.angolacables.co.ao',
|
||||
'.ookla-speedtest.fsr.com',
|
||||
'.speedtest.comnet.com.tr',
|
||||
'.speedtest.gslnetworks.com.au',
|
||||
'.test.gslnetworks.com.au',
|
||||
'.speedtest.gslnetworks.com',
|
||||
'.speedtestunonet.com.br',
|
||||
'.speedtest.alagas.net',
|
||||
'speedtest.surfshark.com',
|
||||
'.speedtest.aarnet.net.au',
|
||||
'.ookla.rcp.net',
|
||||
'.ookla-speedtests.e2ro.com',
|
||||
'.speedtest.com.sg',
|
||||
'.ookla.ddnsgeek.com',
|
||||
'.speedtest.pni.tw',
|
||||
'.speedtest.cmcnetworks.net',
|
||||
'.speedtestwnet.com.br',
|
||||
// Cloudflare
|
||||
'.speed.cloudflare.com',
|
||||
// Wi-Fi Man
|
||||
'.wifiman.com',
|
||||
'.wifiman.me',
|
||||
'.wifiman.ubncloud.com',
|
||||
// Fast.com
|
||||
'.fast.com',
|
||||
// MacPaw
|
||||
'speedtest.macpaw.com',
|
||||
// speedtestmaster
|
||||
'.netspeedtestmaster.com',
|
||||
// Google Search Result of "speedtest", powered by this
|
||||
'.measurement-lab.org',
|
||||
'.measurementlab.net',
|
||||
// Google Fiber legacy speedtest site (new fiber speedtest use speedtestcustom.com)
|
||||
'.speed.googlefiber.net',
|
||||
// librespeed
|
||||
'.backend.librespeed.org',
|
||||
// Apple,
|
||||
'mensura.cdn-apple.com', // From netQuality command
|
||||
// OpenSpeedtest
|
||||
'open.cachefly.net' // This is also used for openspeedtest server download
|
||||
],
|
||||
true
|
||||
);
|
||||
const output = new DomainsetOutput(span, 'speedtest')
|
||||
.withTitle('Sukka\'s Ruleset - Speedtest Domains')
|
||||
.withDescription([
|
||||
...SHARED_DESCRIPTION,
|
||||
'',
|
||||
'This file contains common speedtest endpoints.'
|
||||
])
|
||||
.addFromDomainset(PREDEFINE_DOMAINS)
|
||||
.addFromDomainset(await readFileIntoProcessedArray(path.resolve(OUTPUT_SURGE_DIR, 'domainset/speedtest.conf')));
|
||||
|
||||
await span.traceChildAsync(
|
||||
'fetch previous speedtest domainset',
|
||||
async () => {
|
||||
try {
|
||||
(
|
||||
await readFileIntoProcessedArray(path.resolve(__dirname, '../List/domainset/speedtest.conf'))
|
||||
) .forEach(line => {
|
||||
const hn = getHostname(line, { detectIp: false, validateHostname: true });
|
||||
if (hn) {
|
||||
domainTrie.add(hn);
|
||||
}
|
||||
});
|
||||
} catch { }
|
||||
}
|
||||
);
|
||||
|
||||
await Promise.all([
|
||||
'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'
|
||||
].map((keyword) => span.traceChildAsync(
|
||||
await Promise.all(KEYWORDS.map((keyword) => span.traceChildAsync(
|
||||
`fetch speedtest endpoints: ${keyword}`,
|
||||
() => querySpeedtestApi(keyword)
|
||||
).then(hostnameGroup => hostnameGroup.forEach(hostname => {
|
||||
if (hostname) {
|
||||
domainTrie.add(hostname);
|
||||
output.addDomain(hostname);
|
||||
}
|
||||
}))));
|
||||
|
||||
const deduped = span.traceChildSync('sort result', () => sortDomains(domainTrie.dump()));
|
||||
|
||||
const description = [
|
||||
...SHARED_DESCRIPTION,
|
||||
'',
|
||||
'This file contains common speedtest endpoints.'
|
||||
];
|
||||
|
||||
return createRuleset(
|
||||
span,
|
||||
'Sukka\'s Ruleset - Speedtest Domains',
|
||||
description,
|
||||
new Date(),
|
||||
deduped,
|
||||
'domainset',
|
||||
output('speedtest', 'domainset')
|
||||
);
|
||||
return output.write();
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user