index.js 5.4 KB

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