build-cdn-download-conf.ts 2.8 KB

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