build-telegram-cidr.ts 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. // @ts-check
  2. import { createReadlineInterfaceFromResponse } from './lib/fetch-text-by-line';
  3. import { isProbablyIpv4, isProbablyIpv6 } from './lib/is-fast-ip';
  4. import { task } from './trace';
  5. import { SHARED_DESCRIPTION } from './constants/description';
  6. import { createMemoizedPromise } from './lib/memo-promise';
  7. import { RulesetOutput } from './lib/create-file';
  8. import { $fetch } from './lib/make-fetch-happen';
  9. export const getTelegramCIDRPromise = createMemoizedPromise(async () => {
  10. const resp = await $fetch('https://core.telegram.org/resources/cidr.txt');
  11. const lastModified = resp.headers.get('last-modified');
  12. const date = lastModified ? new Date(lastModified) : new Date();
  13. const ipcidr: string[] = [];
  14. const ipcidr6: string[] = [];
  15. for await (const cidr of createReadlineInterfaceFromResponse(resp, true)) {
  16. const [subnet] = cidr.split('/');
  17. if (isProbablyIpv4(subnet)) {
  18. ipcidr.push(cidr);
  19. }
  20. if (isProbablyIpv6(subnet)) {
  21. ipcidr6.push(cidr);
  22. }
  23. }
  24. return { date, ipcidr, ipcidr6 };
  25. });
  26. export const buildTelegramCIDR = task(require.main === module, __filename)(async (span) => {
  27. const { date, ipcidr, ipcidr6 } = await span.traceChildAsync('get telegram cidr', getTelegramCIDRPromise);
  28. if (ipcidr.length + ipcidr6.length === 0) {
  29. throw new Error('Failed to fetch data!');
  30. }
  31. const description = [
  32. ...SHARED_DESCRIPTION,
  33. 'Data from:',
  34. ' - https://core.telegram.org/resources/cidr.txt'
  35. ];
  36. return new RulesetOutput(span, 'telegram', 'ip')
  37. .withTitle('Sukka\'s Ruleset - Telegram IP CIDR')
  38. .withDescription(description)
  39. .withDate(date)
  40. .bulkAddCIDR4NoResolve(ipcidr)
  41. .bulkAddCIDR6NoResolve(ipcidr6)
  42. .write();
  43. });