stream-pack-detect-ip.js (1642B)
1 const https = require("https"); 2 3 function getJson(url, { timeoutMs = 2500 } = {}) { 4 return new Promise((resolve) => { 5 let settled = false; 6 const done = (v) => { 7 if (settled) return; 8 settled = true; 9 resolve(v); 10 }; 11 try { 12 const u = new URL(url); 13 const req = https.request( 14 { 15 method: "GET", 16 protocol: u.protocol, 17 hostname: u.hostname, 18 port: u.port, 19 path: `${u.pathname || "/"}${u.search || ""}`, 20 headers: { Accept: "application/json", "Cache-Control": "no-store" } 21 }, 22 (res) => { 23 let buf = ""; 24 res.setEncoding("utf8"); 25 res.on("data", (c) => (buf += c)); 26 res.on("end", () => { 27 try { 28 done({ ok: true, status: res.statusCode || 0, json: JSON.parse(buf || "{}") }); 29 } catch { 30 done({ ok: false, status: res.statusCode || 0 }); 31 } 32 }); 33 } 34 ); 35 req.on("error", (e) => done({ ok: false, error: e?.message || String(e) })); 36 req.setTimeout(timeoutMs, () => { 37 try { 38 req.destroy(new Error("timeout")); 39 } catch { 40 // ignore 41 } 42 done({ ok: false, timeout: true }); 43 }); 44 req.end(); 45 } catch (e) { 46 done({ ok: false, error: e?.message || String(e) }); 47 } 48 }); 49 } 50 51 async function main() { 52 const r = await getJson("https://api.ipify.org?format=json"); 53 const ip = String(r?.json?.ip || "").trim(); 54 if (!ip) { 55 console.error("[stream-pack] Failed to detect IP."); 56 process.exit(1); 57 } 58 console.log(ip); 59 } 60 61 main(); 62