build-cdn-download-conf.ts 2.8 KB

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