build-cdn-download-conf.ts 3.0 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. import { appendArrayInPlace } from './lib/append-array-in-place';
  10. import { sortDomains } from './lib/stable-sort-domain';
  11. const getS3OSSDomainsPromise = (async (): Promise<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 Array.from(S3OSSDomains);
  45. })();
  46. export const buildCdnDownloadConf = task(typeof Bun !== 'undefined' ? Bun.main === __filename : require.main === module, __filename)(async (span) => {
  47. const [
  48. S3OSSDomains,
  49. cdnDomainsList,
  50. downloadDomainSet,
  51. steamDomainSet
  52. ] = await Promise.all([
  53. getS3OSSDomainsPromise,
  54. readFileIntoProcessedArray(path.resolve(__dirname, '../Source/domainset/cdn.conf')),
  55. readFileIntoProcessedArray(path.resolve(__dirname, '../Source/domainset/download.conf')),
  56. readFileIntoProcessedArray(path.resolve(__dirname, '../Source/domainset/steam.conf'))
  57. ]);
  58. appendArrayInPlace(downloadDomainSet, S3OSSDomains.map(domain => `.${domain}`));
  59. appendArrayInPlace(downloadDomainSet, steamDomainSet);
  60. return Promise.all([
  61. createRuleset(
  62. span,
  63. 'Sukka\'s Ruleset - CDN Domains',
  64. [
  65. ...SHARED_DESCRIPTION,
  66. '',
  67. 'This file contains object storage and static assets CDN domains.'
  68. ],
  69. new Date(),
  70. sortDomains(domainDeduper(cdnDomainsList)),
  71. 'domainset',
  72. path.resolve(__dirname, '../List/domainset/cdn.conf'),
  73. path.resolve(__dirname, '../Clash/domainset/cdn.txt')
  74. ),
  75. createRuleset(
  76. span,
  77. 'Sukka\'s Ruleset - Large Files Hosting Domains',
  78. [
  79. ...SHARED_DESCRIPTION,
  80. '',
  81. 'This file contains domains for software updating & large file hosting.'
  82. ],
  83. new Date(),
  84. sortDomains(domainDeduper(downloadDomainSet)),
  85. 'domainset',
  86. path.resolve(__dirname, '../List/domainset/download.conf'),
  87. path.resolve(__dirname, '../Clash/domainset/download.txt')
  88. )
  89. ]);
  90. });