index.ts 5.5 KB

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