🌳
pt0/serverF/cfIpF.mts
1import fetch from 'node-fetch'
4export const cfCdnTraceUrl = 'https://1.1.1.1/cdn-cgi/trace'
5const cfCdnTraceDomain = 'https://cloudflare.com/cdn-cgi/trace'
7export const parseCfCdnTrace = (text: string) => {
8 return Object.fromEntries(
9 text.split("\n").map(s => s.trim()).filter(Boolean).map(line => line.split("="))
10 )
13export const getMyCfExtIp = async (): Promise<string | false> => {
14 const text = await (await fetch(cfCdnTraceUrl)).text()
15 const cfTrace = parseCfCdnTrace(text)
16 const {ip} = cfTrace
17 if (!ip) {
18 betLog(cfTrace)
19 console.log('softFail getMyExtIp')
20 return false
21 }
22 return ip
25export const getCfExtIpViaDomain = async (): Promise<string | false> => {
26 try {
27 const text = await (await globalThis.fetch(cfCdnTraceDomain, {signal: AbortSignal.timeout(5000)})).text()
28 const {ip} = parseCfCdnTrace(text)
29 return ip || false
30 } catch { return false }
33export type ExtIpSource = () => Promise<string | false>