build-cdn-download-conf.ts 2.9 KB

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