build-chn-cidr.ts 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. import { fetchRemoteTextByLine } from './lib/fetch-text-by-line';
  2. import { createRuleset } from './lib/create-file';
  3. import { processLineFromReadline } from './lib/process-line';
  4. import { task } from './trace';
  5. import { exclude } from 'fast-cidr-tools';
  6. import { createMemoizedPromise } from './lib/memo-promise';
  7. import { CN_CIDR_NOT_INCLUDED_IN_CHNROUTE, NON_CN_CIDR_INCLUDED_IN_CHNROUTE } from './constants/cidr';
  8. import { appendArrayInPlace } from './lib/append-array-in-place';
  9. import { output } from './lib/misc';
  10. export const getChnCidrPromise = createMemoizedPromise(async () => {
  11. const cidr4 = await processLineFromReadline(await fetchRemoteTextByLine('https://raw.githubusercontent.com/misakaio/chnroutes2/master/chnroutes.txt'));
  12. const cidr6 = await processLineFromReadline(await fetchRemoteTextByLine('https://gaoyifan.github.io/china-operator-ip/china6.txt'));
  13. appendArrayInPlace(cidr4, CN_CIDR_NOT_INCLUDED_IN_CHNROUTE);
  14. return [exclude(cidr4, NON_CN_CIDR_INCLUDED_IN_CHNROUTE, true), cidr6] as const;
  15. });
  16. export const buildChnCidr = task(require.main === module, __filename)(async (span) => {
  17. const [filteredCidr4, cidr6] = await span.traceChildAsync('download chnroutes2', getChnCidrPromise);
  18. // Can not use SHARED_DESCRIPTION here as different license
  19. const description = [
  20. 'License: CC BY-SA 2.0',
  21. 'Homepage: https://ruleset.skk.moe',
  22. 'GitHub: https://github.com/SukkaW/Surge',
  23. ''
  24. ];
  25. // Can not use createRuleset here, as Clash support advanced ipset syntax
  26. return Promise.all([
  27. createRuleset(
  28. span,
  29. 'Sukka\'s Ruleset - Mainland China IPv4 CIDR',
  30. [
  31. ...description,
  32. 'Data from https://misaka.io (misakaio @ GitHub)'
  33. ],
  34. new Date(),
  35. filteredCidr4,
  36. 'ipcidr',
  37. output('china_ip', 'ip')
  38. ),
  39. createRuleset(
  40. span,
  41. 'Sukka\'s Ruleset - Mainland China IPv6 CIDR',
  42. [
  43. ...description,
  44. 'Data from https://github.com/gaoyifan/china-operator-ip'
  45. ],
  46. new Date(),
  47. cidr6,
  48. 'ipcidr6',
  49. output('china_ip_ipv6', 'ip')
  50. )
  51. ]);
  52. });