build-cdn-download-conf.ts 2.8 KB

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