build-telegram-cidr.ts 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. // @ts-check
  2. import { createReadlineInterfaceFromResponse } from './lib/fetch-text-by-line';
  3. import { task } from './trace';
  4. import { SHARED_DESCRIPTION } from './constants/description';
  5. import { once } from 'foxts/once';
  6. import { RulesetOutput } from './lib/rules/ruleset';
  7. import { $$fetch } from './lib/fetch-retry';
  8. import { fastIpVersion } from 'foxts/fast-ip-version';
  9. export const getTelegramCIDRPromise = once(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 v = fastIpVersion(cidr);
  21. if (v === 4) {
  22. ipcidr.push(cidr);
  23. } else if (v === 6) {
  24. ipcidr6.push(cidr);
  25. }
  26. }
  27. return { date, ipcidr, ipcidr6 };
  28. });
  29. export const buildTelegramCIDR = task(require.main === module, __filename)(async (span) => {
  30. const { date, ipcidr, ipcidr6 } = await span.traceChildAsync('get telegram cidr', getTelegramCIDRPromise);
  31. if (ipcidr.length + ipcidr6.length === 0) {
  32. throw new Error('Failed to fetch data!');
  33. }
  34. const description = [
  35. ...SHARED_DESCRIPTION,
  36. 'Data from:',
  37. ' - https://core.telegram.org/resources/cidr.txt'
  38. ];
  39. return new RulesetOutput(span, 'telegram', 'ip')
  40. .withTitle('Sukka\'s Ruleset - Telegram IP CIDR')
  41. .withDescription(description)
  42. .withDate(date)
  43. .bulkAddCIDR4NoResolve(ipcidr)
  44. .bulkAddCIDR6NoResolve(ipcidr6)
  45. .write();
  46. });