build-cdn-download-conf.ts 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  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. import { CRASHLYTICS_WHITELIST } from './constants/reject-data-source';
  12. const getS3OSSDomainsPromise = (async (): Promise<string[]> => {
  13. const trie = createTrie((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. /**
  24. * Extract OSS domain from publicsuffix list
  25. */
  26. const S3OSSDomains = new Set<string>();
  27. trie.find('.amazonaws.com').forEach((line: string) => {
  28. if (
  29. (line.startsWith('s3-') || line.startsWith('s3.'))
  30. && !line.includes('cn-')
  31. ) {
  32. S3OSSDomains.add(line);
  33. }
  34. });
  35. trie.find('.scw.cloud').forEach((line: string) => {
  36. if (
  37. (line.startsWith('s3-') || line.startsWith('s3.'))
  38. && !line.includes('cn-')
  39. ) {
  40. S3OSSDomains.add(line);
  41. }
  42. });
  43. trie.find('sakurastorage.jp').forEach((line: string) => {
  44. if (
  45. (line.startsWith('s3-') || line.startsWith('s3.'))
  46. ) {
  47. S3OSSDomains.add(line);
  48. }
  49. });
  50. return Array.from(S3OSSDomains);
  51. })();
  52. export const buildCdnDownloadConf = task(require.main === module, __filename)(async (span) => {
  53. const [
  54. S3OSSDomains,
  55. cdnDomainsList,
  56. downloadDomainSet,
  57. steamDomainSet
  58. ] = await Promise.all([
  59. getS3OSSDomainsPromise,
  60. readFileIntoProcessedArray(path.join(SOURCE_DIR, 'domainset/cdn.conf')),
  61. readFileIntoProcessedArray(path.join(SOURCE_DIR, 'domainset/download.conf')),
  62. readFileIntoProcessedArray(path.join(SOURCE_DIR, 'domainset/steam.conf'))
  63. ]);
  64. appendArrayInPlace(downloadDomainSet, S3OSSDomains.map(domain => `.${domain}`));
  65. appendArrayInPlace(downloadDomainSet, steamDomainSet);
  66. // we have whitelisted the crashlytics domain, but it doesn't mean we can't put it in CDN policy
  67. appendArrayInPlace(cdnDomainsList, CRASHLYTICS_WHITELIST);
  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. });