build-cdn-download-conf.ts 3.0 KB

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