Surge_by_SukkaW/Build/build-telegram-cidr.ts

67 lines
2.0 KiB
TypeScript

// @ts-check
import { defaultRequestInit, fetchWithRetry } from './lib/fetch-retry';
import { createReadlineInterfaceFromResponse } from './lib/fetch-text-by-line';
import path from 'path';
import { isProbablyIpv4, isProbablyIpv6 } from './lib/is-fast-ip';
import { processLine } from './lib/process-line';
import { createRuleset } from './lib/create-file';
import { task } from './trace';
import { SHARED_DESCRIPTION } from './lib/constants';
import { createMemoizedPromise } from './lib/memo-promise';
export const getTelegramCIDRPromise = createMemoizedPromise(async () => {
const resp = await fetchWithRetry('https://core.telegram.org/resources/cidr.txt', defaultRequestInit);
const lastModified = resp.headers.get('last-modified');
const date = lastModified ? new Date(lastModified) : new Date();
const results: string[] = [];
for await (const line of createReadlineInterfaceFromResponse(resp)) {
const cidr = processLine(line);
if (!cidr) continue;
const [subnet] = cidr.split('/');
if (isProbablyIpv4(subnet)) {
results.push(`IP-CIDR,${cidr},no-resolve`);
}
if (isProbablyIpv6(subnet)) {
results.push(`IP-CIDR6,${cidr},no-resolve`);
}
}
return { date, results };
});
export const buildTelegramCIDR = task(import.meta.path, async (span) => {
const promise = getTelegramCIDRPromise();
const peeked = Bun.peek(promise);
const { date, results } = peeked === promise
? await span.traceChildPromise('get telegram cidr', promise)
: (peeked as { date: Date, results: string[] });
if (results.length === 0) {
throw new Error('Failed to fetch data!');
}
const description = [
...SHARED_DESCRIPTION,
'Data from:',
' - https://core.telegram.org/resources/cidr.txt'
];
return createRuleset(
span,
'Sukka\'s Ruleset - Telegram IP CIDR',
description,
date,
results,
'ruleset',
path.resolve(import.meta.dir, '../List/ip/telegram.conf'),
path.resolve(import.meta.dir, '../Clash/ip/telegram.txt')
);
});
if (import.meta.main) {
buildTelegramCIDR();
}