build-cdn-download-conf.ts 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  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 { domainDeduper } 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. const getS3OSSDomainsPromise = (async (): Promise<string[]> => {
  14. const trie = createTrie(
  15. await getPublicSuffixListTextPromise(),
  16. false
  17. );
  18. /**
  19. * Extract OSS domain from publicsuffix list
  20. */
  21. const S3OSSDomains = new Set<string>();
  22. trie.find('.amazonaws.com').forEach((line: string) => {
  23. if (
  24. (line.startsWith('s3-') || line.startsWith('s3.'))
  25. && !line.includes('cn-')
  26. ) {
  27. S3OSSDomains.add(line);
  28. }
  29. });
  30. trie.find('.scw.cloud').forEach((line: string) => {
  31. if (
  32. (line.startsWith('s3-') || line.startsWith('s3.'))
  33. && !line.includes('cn-')
  34. ) {
  35. S3OSSDomains.add(line);
  36. }
  37. });
  38. trie.find('sakurastorage.jp').forEach((line: string) => {
  39. if (
  40. (line.startsWith('s3-') || line.startsWith('s3.'))
  41. ) {
  42. S3OSSDomains.add(line);
  43. }
  44. });
  45. return Array.from(S3OSSDomains);
  46. })();
  47. export const buildCdnDownloadConf = task(require.main === module, __filename)(async (span) => {
  48. const [
  49. S3OSSDomains,
  50. cdnDomainsList,
  51. downloadDomainSet,
  52. steamDomainSet
  53. ] = await Promise.all([
  54. getS3OSSDomainsPromise,
  55. readFileIntoProcessedArray(path.join(SOURCE_DIR, 'domainset/cdn.conf')),
  56. readFileIntoProcessedArray(path.join(SOURCE_DIR, 'domainset/download.conf')),
  57. readFileIntoProcessedArray(path.join(SOURCE_DIR, 'domainset/steam.conf'))
  58. ]);
  59. appendArrayInPlace(downloadDomainSet, S3OSSDomains.map(domain => `.${domain}`));
  60. appendArrayInPlace(downloadDomainSet, steamDomainSet);
  61. return Promise.all([
  62. createRuleset(
  63. span,
  64. 'Sukka\'s Ruleset - CDN Domains',
  65. [
  66. ...SHARED_DESCRIPTION,
  67. '',
  68. 'This file contains object storage and static assets CDN domains.'
  69. ],
  70. new Date(),
  71. sortDomains(domainDeduper(cdnDomainsList)),
  72. 'domainset',
  73. output('cdn', 'domainset')
  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. output('download', 'domainset')
  87. )
  88. ]);
  89. });