build-chn-cidr.ts 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. import { fetchRemoteTextByLine } from './lib/fetch-text-by-line';
  2. import { processLineFromReadline } from './lib/process-line';
  3. import { task } from './trace';
  4. import { contains, exclude } from 'fast-cidr-tools';
  5. import { createMemoizedPromise } from './lib/memo-promise';
  6. import { CN_CIDR_NOT_INCLUDED_IN_CHNROUTE, NON_CN_CIDR_INCLUDED_IN_CHNROUTE } from './constants/cidr';
  7. import { appendArrayInPlace } from './lib/append-array-in-place';
  8. import { IPListOutput } from './lib/create-file';
  9. import { cachedOnlyFail } from './lib/fs-memo';
  10. const PROBE_CHN_CIDR = [
  11. // NetEase Hangzhou
  12. '223.252.196.38'
  13. ];
  14. export const getChnCidrPromise = createMemoizedPromise(cachedOnlyFail(
  15. async function getChnCidr() {
  16. const [cidr4, cidr6] = await Promise.all([
  17. fetchRemoteTextByLine('https://raw.githubusercontent.com/misakaio/chnroutes2/master/chnroutes.txt').then(processLineFromReadline),
  18. fetchRemoteTextByLine('https://gaoyifan.github.io/china-operator-ip/china6.txt').then(processLineFromReadline)
  19. ]);
  20. appendArrayInPlace(cidr4, CN_CIDR_NOT_INCLUDED_IN_CHNROUTE);
  21. if (!contains(cidr4, PROBE_CHN_CIDR)) {
  22. throw new TypeError('chnroutes missing probe IP');
  23. }
  24. return [exclude(cidr4, NON_CN_CIDR_INCLUDED_IN_CHNROUTE, true), cidr6] as const;
  25. },
  26. {
  27. serializer: JSON.stringify,
  28. deserializer: JSON.parse
  29. }
  30. ));
  31. export const buildChnCidr = task(require.main === module, __filename)(async (span) => {
  32. const [filteredCidr4, cidr6] = await span.traceChildAsync('download chnroutes2', getChnCidrPromise);
  33. // Can not use SHARED_DESCRIPTION here as different license
  34. const description = [
  35. 'License: CC BY-SA 2.0',
  36. 'Homepage: https://ruleset.skk.moe',
  37. 'GitHub: https://github.com/SukkaW/Surge',
  38. ''
  39. ];
  40. return Promise.all([
  41. new IPListOutput(span, 'china_ip', false)
  42. .withTitle('Sukka\'s Ruleset - Mainland China IPv4 CIDR')
  43. .withDescription([
  44. ...description,
  45. 'Data from https://misaka.io (misakaio @ GitHub)'
  46. ])
  47. .bulkAddCIDR4(filteredCidr4)
  48. .write(),
  49. new IPListOutput(span, 'china_ip_ipv6', false)
  50. .withTitle('Sukka\'s Ruleset - Mainland China IPv6 CIDR')
  51. .withDescription([
  52. ...description,
  53. 'Data from https://github.com/gaoyifan/china-operator-ip'
  54. ])
  55. .bulkAddCIDR6(cidr6)
  56. .write()
  57. ]);
  58. });