build-cdn-download-conf.ts 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. import path from 'path';
  2. import { createRuleset } from './lib/create-file';
  3. import { readFileIntoProcessedArray } from './lib/fetch-text-by-line';
  4. import { createTrie } from './lib/trie';
  5. import { task } from './trace';
  6. import { SHARED_DESCRIPTION } from './lib/constants';
  7. import { getPublicSuffixListTextPromise } from './download-publicsuffixlist';
  8. const getS3OSSDomainsPromise = (async (): Promise<Set<string>> => {
  9. const trie = createTrie((await getPublicSuffixListTextPromise()).split('\n'));
  10. /**
  11. * Extract OSS domain from publicsuffix list
  12. */
  13. const S3OSSDomains = new Set<string>();
  14. trie.find('.amazonaws.com').forEach((line: string) => {
  15. if (
  16. (line.startsWith('s3-') || line.startsWith('s3.'))
  17. && !line.includes('cn-')
  18. ) {
  19. S3OSSDomains.add(line);
  20. }
  21. });
  22. trie.find('.scw.cloud').forEach((line: string) => {
  23. if (
  24. (line.startsWith('s3-') || line.startsWith('s3.'))
  25. && !line.includes('cn-')
  26. ) {
  27. S3OSSDomains.add(line);
  28. }
  29. });
  30. trie.find('sakurastorage.jp').forEach((line: string) => {
  31. if (
  32. (line.startsWith('s3-') || line.startsWith('s3.'))
  33. ) {
  34. S3OSSDomains.add(line);
  35. }
  36. });
  37. return S3OSSDomains;
  38. })();
  39. export const buildCdnDownloadConf = task(import.meta.path, async (span) => {
  40. const [
  41. cdnDomainsList,
  42. S3OSSDomains,
  43. downloadDomainSet,
  44. steamDomainSet
  45. ] = await Promise.all([
  46. readFileIntoProcessedArray(path.resolve(import.meta.dir, '../Source/non_ip/cdn.conf')),
  47. getS3OSSDomainsPromise,
  48. readFileIntoProcessedArray(path.resolve(import.meta.dir, '../Source/domainset/download.conf')),
  49. readFileIntoProcessedArray(path.resolve(import.meta.dir, '../Source/domainset/steam.conf'))
  50. ]);
  51. cdnDomainsList.push(...S3OSSDomains);
  52. return Promise.all([
  53. createRuleset(
  54. span,
  55. 'Sukka\'s Ruleset - CDN Domains',
  56. [
  57. ...SHARED_DESCRIPTION,
  58. '',
  59. 'This file contains object storage and static assets CDN domains.'
  60. ],
  61. new Date(),
  62. cdnDomainsList,
  63. 'ruleset',
  64. path.resolve(import.meta.dir, '../List/non_ip/cdn.conf'),
  65. path.resolve(import.meta.dir, '../Clash/non_ip/cdn.txt')
  66. ),
  67. createRuleset(
  68. span,
  69. 'Sukka\'s Ruleset - Large Files Hosting Domains',
  70. [
  71. ...SHARED_DESCRIPTION,
  72. '',
  73. 'This file contains domains for software updating & large file hosting.'
  74. ],
  75. new Date(),
  76. [
  77. ...downloadDomainSet,
  78. ...steamDomainSet
  79. ],
  80. 'domainset',
  81. path.resolve(import.meta.dir, '../List/domainset/download.conf'),
  82. path.resolve(import.meta.dir, '../Clash/domainset/download.txt')
  83. )
  84. ]);
  85. });
  86. if (import.meta.main) {
  87. buildCdnDownloadConf();
  88. }