mirror of
https://github.com/SukkaW/Surge.git
synced 2026-01-28 17:41:54 +08:00
Refactor Stream Hosts
This commit is contained in:
79
Build/build-stream-service.js
Normal file
79
Build/build-stream-service.js
Normal file
@@ -0,0 +1,79 @@
|
||||
// @ts-check
|
||||
const { task } = require('./lib/trace-runner');
|
||||
|
||||
const path = require('path');
|
||||
const { createRuleset } = require('./lib/create-file');
|
||||
|
||||
const {
|
||||
ALL, NORTH_AMERICA, EU, HK, TW, JP, KR
|
||||
// SOUTH_EAST_ASIA, AU
|
||||
} = require('../Source/stream');
|
||||
|
||||
/**
|
||||
* @param {string} fileId
|
||||
* @param {string} title
|
||||
* @param {import('../Source/stream').StreamService[]} streamServices
|
||||
*/
|
||||
const createRulesetForStreamService = (fileId, title, streamServices) => {
|
||||
return [
|
||||
// Domains
|
||||
...createRuleset(
|
||||
`Sukka's Ruleset - Stream Services: ${title}`,
|
||||
[
|
||||
'License: AGPL 3.0',
|
||||
'Homepage: https://ruleset.skk.moe',
|
||||
'GitHub: https://github.com/SukkaW/Surge',
|
||||
'',
|
||||
...streamServices.map(i => `- ${i.name}`)
|
||||
],
|
||||
new Date(),
|
||||
streamServices.flatMap(i => i.rules),
|
||||
'ruleset',
|
||||
path.resolve(__dirname, `../List/non_ip/${fileId}.conf`),
|
||||
path.resolve(__dirname, `../Clash/non_ip/${fileId}.txt`)
|
||||
),
|
||||
// IP
|
||||
...createRuleset(
|
||||
`Sukka's Ruleset - Stream Services' IPs: ${title}`,
|
||||
[
|
||||
'License: AGPL 3.0',
|
||||
'Homepage: https://ruleset.skk.moe',
|
||||
'GitHub: https://github.com/SukkaW/Surge',
|
||||
'',
|
||||
...streamServices.map(i => `- ${i.name}`)
|
||||
],
|
||||
new Date(),
|
||||
streamServices.flatMap(i => (
|
||||
i.ip
|
||||
? [
|
||||
...i.ip.v4.map(ip => `IP-CIDR,${ip},no-resolve`),
|
||||
...i.ip.v6.map(ip => `IP-CIDR6,${ip},no-resolve`)
|
||||
]
|
||||
: []
|
||||
)),
|
||||
'ruleset',
|
||||
path.resolve(__dirname, `../List/ip/${fileId}.conf`),
|
||||
path.resolve(__dirname, `../Clash/ip/${fileId}.txt`)
|
||||
)
|
||||
];
|
||||
};
|
||||
|
||||
const buildStreamService = task(__filename, async () => {
|
||||
return Promise.all([
|
||||
...createRulesetForStreamService('stream', 'All', ALL),
|
||||
...createRulesetForStreamService('stream_us', 'North America', NORTH_AMERICA),
|
||||
...createRulesetForStreamService('stream_eu', 'Europe', EU),
|
||||
...createRulesetForStreamService('stream_hk', 'Hong Kong', HK),
|
||||
...createRulesetForStreamService('stream_tw', 'Taiwan', TW),
|
||||
...createRulesetForStreamService('stream_jp', 'Japan', JP),
|
||||
// ...createRulesetForStreamService('stream_au', 'Oceania', AU),
|
||||
...createRulesetForStreamService('stream_kr', 'Korean', KR)
|
||||
// ...createRulesetForStreamService('stream_south_east_asia', 'South East Asia', SOUTH_EAST_ASIA)
|
||||
]);
|
||||
});
|
||||
|
||||
module.exports.buildStreamService = buildStreamService;
|
||||
|
||||
if (require.main === module) {
|
||||
buildStreamService();
|
||||
}
|
||||
@@ -13,6 +13,7 @@ const { buildSpeedtestDomainSet } = require('./build-speedtest-domainset');
|
||||
const { buildInternalCDNDomains } = require('./build-internal-cdn-rules');
|
||||
const { buildInternalChnDomains } = require('./build-internal-chn-domains');
|
||||
const { buildDomesticRuleset } = require('./build-domestic-ruleset');
|
||||
const { buildStreamService } = require('./build-stream-service');
|
||||
const { buildRedirectModule } = require('./build-redirect-module');
|
||||
const { validate } = require('./validate-domainset');
|
||||
|
||||
@@ -103,8 +104,9 @@ const endWorker = async (worker) => {
|
||||
const buildInternalChnDomainsPromise = buildInternalChnDomains();
|
||||
// build:domestic-ruleset
|
||||
const buildDomesticRulesetPromise = downloadPreviousBuildPromise.then(() => buildDomesticRuleset());
|
||||
// build:redirect-module
|
||||
|
||||
const buildRedirectModulePromise = downloadPreviousBuildPromise.then(() => buildRedirectModule());
|
||||
const buildStreamServicePromise = downloadPreviousBuildPromise.then(() => buildStreamService());
|
||||
|
||||
const stats = await Promise.all([
|
||||
downloadPreviousBuildPromise,
|
||||
@@ -122,7 +124,8 @@ const endWorker = async (worker) => {
|
||||
buildInternalReverseChnCIDRPromise,
|
||||
buildInternalChnDomainsPromise,
|
||||
buildDomesticRulesetPromise,
|
||||
buildRedirectModulePromise
|
||||
buildRedirectModulePromise,
|
||||
buildStreamServicePromise
|
||||
]);
|
||||
|
||||
await Promise.all([
|
||||
|
||||
@@ -12,6 +12,9 @@ async function compareAndWriteFile(linesA, filePath) {
|
||||
if (!fs.existsSync(filePath)) {
|
||||
console.log(`${filePath} does not exists, writing...`);
|
||||
isEqual = false;
|
||||
} else if (linesA.length === 0) {
|
||||
console.log(`Nothing to write to ${filePath}...`);
|
||||
isEqual = false;
|
||||
} else {
|
||||
let index = 0;
|
||||
|
||||
@@ -19,6 +22,12 @@ async function compareAndWriteFile(linesA, filePath) {
|
||||
const lineA = linesA[index];
|
||||
index++;
|
||||
|
||||
if (lineA === undefined) {
|
||||
// The file becomes smaller
|
||||
isEqual = false;
|
||||
break;
|
||||
}
|
||||
|
||||
if (lineA[0] === '#' && lineB[0] === '#') {
|
||||
continue;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user