build-telegram-cidr.ts 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. // @ts-check
  2. import { createReadlineInterfaceFromResponse } from './lib/fetch-text-by-line';
  3. import { isProbablyIpv4, isProbablyIpv6 } from 'foxts/is-probably-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/fetch-retry';
  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. // Telegram secret backup CIDR, announced by AS62041
  15. // see also https://github.com/Telegram-FOSS-Team/Telegram-FOSS/blob/10da5406ed92d30c6add3b25d40b2b3b6995d873/TMessagesProj/src/main/java/org/telegram/tgnet/ConnectionsManager.java#L1157
  16. '95.161.64.0/20'
  17. ];
  18. const ipcidr6: string[] = [];
  19. for await (const cidr of createReadlineInterfaceFromResponse(resp, true)) {
  20. const [subnet] = cidr.split('/');
  21. if (isProbablyIpv4(subnet)) {
  22. ipcidr.push(cidr);
  23. }
  24. if (isProbablyIpv6(subnet)) {
  25. ipcidr6.push(cidr);
  26. }
  27. }
  28. return { date, ipcidr, ipcidr6 };
  29. });
  30. export const buildTelegramCIDR = task(require.main === module, __filename)(async (span) => {
  31. const { date, ipcidr, ipcidr6 } = await span.traceChildAsync('get telegram cidr', getTelegramCIDRPromise);
  32. if (ipcidr.length + ipcidr6.length === 0) {
  33. throw new Error('Failed to fetch data!');
  34. }
  35. const description = [
  36. ...SHARED_DESCRIPTION,
  37. 'Data from:',
  38. ' - https://core.telegram.org/resources/cidr.txt'
  39. ];
  40. return new RulesetOutput(span, 'telegram', 'ip')
  41. .withTitle('Sukka\'s Ruleset - Telegram IP CIDR')
  42. .withDescription(description)
  43. .withDate(date)
  44. .bulkAddCIDR4NoResolve(ipcidr)
  45. .bulkAddCIDR6NoResolve(ipcidr6)
  46. .write();
  47. });