build-internal-reverse-chn-cidr.ts 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. import path from 'node:path';
  2. import { task } from './trace';
  3. import { exclude, merge } from 'fast-cidr-tools';
  4. import { getChnCidrPromise } from './build-chn-cidr';
  5. import { NON_CN_CIDR_INCLUDED_IN_CHNROUTE, RESERVED_IPV4_CIDR } from './constants/cidr';
  6. import fs from 'node:fs';
  7. import { OUTPUT_INTERNAL_DIR } from './constants/dir';
  8. import { asyncWriteToStream } from 'foxts/async-write-to-stream';
  9. import { mkdirp } from './lib/misc';
  10. import { appendArrayInPlace } from './lib/append-array-in-place';
  11. export const buildInternalReverseChnCIDR = task(require.main === module, __filename)(async () => {
  12. const [cidr] = await getChnCidrPromise();
  13. const reversedCidr = merge(
  14. appendArrayInPlace(
  15. exclude(
  16. ['0.0.0.0/0'],
  17. RESERVED_IPV4_CIDR.concat(cidr),
  18. true
  19. ),
  20. // https://github.com/misakaio/chnroutes2/issues/25
  21. NON_CN_CIDR_INCLUDED_IN_CHNROUTE
  22. ),
  23. true
  24. );
  25. const outputFile = path.join(OUTPUT_INTERNAL_DIR, 'reversed-chn-cidr.txt');
  26. await mkdirp(OUTPUT_INTERNAL_DIR);
  27. const writeStream = fs.createWriteStream(outputFile);
  28. for (const line of reversedCidr) {
  29. const p = asyncWriteToStream(writeStream, line + '\n');
  30. if (p) {
  31. // eslint-disable-next-line no-await-in-loop -- stream high water mark
  32. await p;
  33. }
  34. }
  35. await asyncWriteToStream(writeStream, '\n');
  36. writeStream.end();
  37. });