index.js 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. // @ts-check
  2. const { downloadPreviousBuild, downloadPublicSuffixList } = require('./download-previous-build');
  3. const { buildCommon } = require('./build-common');
  4. const { buildAntiBogusDomain } = require('./build-anti-bogus-domain');
  5. const { buildAppleCdn } = require('./build-apple-cdn');
  6. const { buildCdnConf } = require('./build-cdn-conf');
  7. const { buildPhishingDomainSet } = require('./build-phishing-domainset');
  8. const { buildRejectDomainSet } = require('./build-reject-domainset');
  9. const { buildTelegramCIDR } = require('./build-telegram-cidr');
  10. const { buildChnCidr } = require('./build-chn-cidr');
  11. const { buildSpeedtestDomainSet } = require('./build-speedtest-domainset');
  12. const { buildInternalCDNDomains } = require('./build-internal-cdn-rules');
  13. const { buildInternalChnDomains } = require('./build-internal-chn-domains');
  14. const { buildDomesticRuleset } = require('./build-domestic-ruleset');
  15. const { buildStreamService } = require('./build-stream-service');
  16. const { buildRedirectModule } = require('./build-redirect-module');
  17. const { validate } = require('./validate-domainset');
  18. const { buildPublicHtml } = require('./build-public');
  19. const { Worker } = require('jest-worker');
  20. /**
  21. * @template T
  22. * @typedef {import('jest-worker').Worker & { __sukka_worker_name: string } & T} WithWorker
  23. */
  24. /**
  25. * @template T
  26. * @param {string} path
  27. * @returns {WithWorker<T>}
  28. */
  29. const requireWorker = (path) => {
  30. const _worker = /** @type {WithWorker<T>} */ (new Worker(
  31. require.resolve(path),
  32. {
  33. numWorkers: 1,
  34. maxRetries: 0,
  35. enableWorkerThreads: true
  36. }
  37. ));
  38. _worker.getStderr().pipe(process.stderr);
  39. _worker.getStdout().pipe(process.stdout);
  40. _worker.__sukka_worker_name = path;
  41. return _worker;
  42. };
  43. /**
  44. * @template T
  45. * @param {WithWorker<T>} worker
  46. */
  47. const endWorker = async (worker) => {
  48. const { forceExited } = await worker.end();
  49. if (forceExited && worker.__sukka_worker_name) {
  50. console.log(worker.__sukka_worker_name, 'forceExited');
  51. }
  52. };
  53. (async () => {
  54. const buildInternalReverseChnCIDRWorker = /** @type {WithWorker<import('./build-internal-reverse-chn-cidr')>} */ (requireWorker('./build-internal-reverse-chn-cidr'));
  55. const { buildInternalReverseChnCIDR } = buildInternalReverseChnCIDRWorker;
  56. // download-previous-build
  57. const downloadPreviousBuildPromise = downloadPreviousBuild();
  58. const downloadPublicSuffixListPromise = downloadPublicSuffixList();
  59. // build:common
  60. const buildCommonPromise = downloadPreviousBuildPromise.then(() => buildCommon());
  61. // build:anti-bogus-domain
  62. const buildAntiBogusDomainPromise = downloadPreviousBuildPromise.then(() => buildAntiBogusDomain());
  63. // build:apple-cdn
  64. const buildAppleCdnPromise = downloadPreviousBuildPromise.then(() => buildAppleCdn());
  65. // build:cdn-conf
  66. const buildCdnConfPromise = Promise.all([
  67. downloadPreviousBuildPromise,
  68. downloadPublicSuffixListPromise
  69. ]).then(() => buildCdnConf());
  70. // build:phishing-domainset
  71. const buildPhilishingDomainsetPromise = Promise.all([
  72. downloadPreviousBuildPromise,
  73. downloadPublicSuffixListPromise
  74. ]).then(() => buildPhishingDomainSet());
  75. // build:reject-domainset
  76. const buildRejectDomainSetPromise = Promise.all([
  77. downloadPreviousBuildPromise,
  78. downloadPublicSuffixListPromise,
  79. buildPhilishingDomainsetPromise
  80. ]).then(() => buildRejectDomainSet());
  81. // build:telegram-cidr
  82. const buildTelegramCIDRPromise = downloadPreviousBuildPromise.then(() => buildTelegramCIDR());
  83. // build:chn-cidr
  84. const buildChnCidrPromise = downloadPreviousBuildPromise.then(() => buildChnCidr());
  85. // build:speedtest-domainset
  86. const buildSpeedtestDomainSetPromise = downloadPreviousBuildPromise.then(() => buildSpeedtestDomainSet());
  87. // build:internal-cdn-rules
  88. const buildInternalCDNDomainsPromise = Promise.all([
  89. downloadPublicSuffixListPromise,
  90. buildCommonPromise,
  91. buildCdnConfPromise
  92. ]).then(() => buildInternalCDNDomains());
  93. // build:internal-reverse-chn-cidr
  94. const buildInternalReverseChnCIDRPromise = buildInternalReverseChnCIDR();
  95. // build:internal-chn-domains
  96. const buildInternalChnDomainsPromise = buildInternalChnDomains();
  97. // build:domestic-ruleset
  98. const buildDomesticRulesetPromise = downloadPreviousBuildPromise.then(() => buildDomesticRuleset());
  99. const buildRedirectModulePromise = downloadPreviousBuildPromise.then(() => buildRedirectModule());
  100. const buildStreamServicePromise = downloadPreviousBuildPromise.then(() => buildStreamService());
  101. const stats = await Promise.all([
  102. downloadPreviousBuildPromise,
  103. downloadPublicSuffixListPromise,
  104. buildCommonPromise,
  105. buildAntiBogusDomainPromise,
  106. buildAppleCdnPromise,
  107. buildCdnConfPromise,
  108. buildPhilishingDomainsetPromise,
  109. buildRejectDomainSetPromise,
  110. buildTelegramCIDRPromise,
  111. buildChnCidrPromise,
  112. buildSpeedtestDomainSetPromise,
  113. buildInternalCDNDomainsPromise,
  114. buildInternalReverseChnCIDRPromise,
  115. buildInternalChnDomainsPromise,
  116. buildDomesticRulesetPromise,
  117. buildRedirectModulePromise,
  118. buildStreamServicePromise
  119. ]);
  120. await Promise.all([
  121. buildPublicHtml(),
  122. validate(),
  123. endWorker(buildInternalReverseChnCIDRWorker)
  124. ]);
  125. printStats(stats);
  126. })();
  127. /**
  128. * @param {Array<{ start: number, end: number, taskName: string }>} stats
  129. */
  130. function printStats(stats) {
  131. // sort stats by start time
  132. stats.sort((a, b) => a.start - b.start);
  133. const longestTaskName = Math.max(...stats.map(i => i.taskName.length));
  134. const realStart = Math.min(...stats.map(i => i.start));
  135. const realEnd = Math.max(...stats.map(i => i.end));
  136. const totalMs = realEnd - realStart;
  137. const statsStep = (totalMs / 160) | 0;
  138. stats.forEach(stat => {
  139. console.log(
  140. `[${stat.taskName}]${' '.repeat(longestTaskName - stat.taskName.length)}`,
  141. ' '.repeat(((stat.start - realStart) / statsStep) | 0),
  142. '='.repeat(Math.max(((stat.end - stat.start) / statsStep) | 0, 1))
  143. );
  144. });
  145. }