build-cdn-download-conf.ts 3.0 KB

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