UNPKG

@esm2cjs/public-ip

Version:

Get your public IP address — very fast!. This is a fork of sindresorhus/public-ip, but with CommonJS support.

262 lines (261 loc) 7.23 kB
var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var esm_exports = {}; __export(esm_exports, { CancelError: () => import_got2.CancelError, IpNotFoundError: () => import_core2.IpNotFoundError, publicIp: () => publicIp, publicIpv4: () => publicIpv4, publicIpv6: () => publicIpv6 }); module.exports = __toCommonJS(esm_exports); var import_node_util = require("node:util"); var import_node_dgram = __toESM(require("node:dgram")); var import_dns_socket = __toESM(require("dns-socket")); var import_got = __toESM(require("@esm2cjs/got")); var import_is_ip = require("@esm2cjs/is-ip"); var import_core = require("./core.js"); var import_core2 = require("./core.js"); var import_got2 = require("@esm2cjs/got"); const defaults = { timeout: 5e3, onlyHttps: false }; const dnsServers = [ { v4: { servers: [ "208.67.222.222", "208.67.220.220", "208.67.222.220", "208.67.220.222" ], name: "myip.opendns.com", type: "A" }, v6: { servers: [ "2620:0:ccc::2", "2620:0:ccd::2" ], name: "myip.opendns.com", type: "AAAA" } }, { v4: { servers: [ "216.239.32.10", "216.239.34.10", "216.239.36.10", "216.239.38.10" ], name: "o-o.myaddr.l.google.com", type: "TXT", transform: (ip) => ip.replace(/"/g, "") }, v6: { servers: [ "2001:4860:4802:32::a", "2001:4860:4802:34::a", "2001:4860:4802:36::a", "2001:4860:4802:38::a" ], name: "o-o.myaddr.l.google.com", type: "TXT", transform: (ip) => ip.replace(/"/g, "") } } ]; const type = { v4: { dnsServers: dnsServers.map(({ v4: { servers, ...question } }) => ({ servers, question })), httpsUrls: [ "https://icanhazip.com/", "https://api.ipify.org/" ] }, v6: { dnsServers: dnsServers.map(({ v6: { servers, ...question } }) => ({ servers, question })), httpsUrls: [ "https://icanhazip.com/", "https://api6.ipify.org/" ] } }; const queryDns = (version, options) => { const data = type[version]; const socket = (0, import_dns_socket.default)({ retries: 0, maxQueries: 1, socket: import_node_dgram.default.createSocket(version === "v6" ? "udp6" : "udp4"), timeout: options.timeout }); const socketQuery = (0, import_node_util.promisify)(socket.query.bind(socket)); const promise = (async () => { let lastError; for (const dnsServerInfo of data.dnsServers) { const { servers, question } = dnsServerInfo; for (const server of servers) { if (socket.destroyed) { return; } try { const { name, type: type2, transform } = question; const dnsResponse = await socketQuery({ questions: [{ name, type: type2 }] }, 53, server); const { answers: { 0: { data: data2 } } } = dnsResponse; const response = (typeof data2 === "string" ? data2 : data2.toString()).trim(); const ip = transform ? transform(response) : response; const method = version === "v6" ? import_is_ip.isIPv6 : import_is_ip.isIPv4; if (ip && method(ip)) { socket.destroy(); return ip; } } catch (error) { lastError = error; } } } socket.destroy(); throw new import_core.IpNotFoundError({ cause: lastError }); })(); promise.cancel = () => { socket.destroy(); }; return promise; }; const queryHttps = (version, options) => { let cancel; const promise = (async () => { var _a; try { const requestOptions = { dnsLookupIpVersion: version === "v6" ? 6 : 4, retry: { limit: 0 }, timeout: { request: options.timeout } }; const urls = [ ...type[version].httpsUrls, ...(_a = options.fallbackUrls) != null ? _a : [] ]; let lastError; for (const url of urls) { try { const gotPromise = import_got.default.get(url, requestOptions); cancel = gotPromise.cancel; const response = await gotPromise; const ip = (response.body || "").trim(); const method = version === "v6" ? import_is_ip.isIPv6 : import_is_ip.isIPv4; if (ip && method(ip)) { return ip; } } catch (error) { lastError = error; if (error instanceof import_got.CancelError) { throw error; } } } throw new import_core.IpNotFoundError({ cause: lastError }); } catch (error) { if (!(error instanceof import_got.CancelError)) { throw error; } } })(); promise.cancel = function() { return cancel.apply(this); }; return promise; }; const queryAll = (version, options) => { let cancel; const promise = (async () => { let response; const dnsPromise = queryDns(version, options); cancel = dnsPromise.cancel; try { response = await dnsPromise; } catch { const httpsPromise = queryHttps(version, options); cancel = httpsPromise.cancel; response = await httpsPromise; } return response; })(); promise.cancel = cancel; return promise; }; const publicIp = (0, import_core.createPublicIp)(publicIpv4, publicIpv6); function publicIpv4(options) { options = { ...defaults, ...options }; if (!options.onlyHttps) { return queryAll("v4", options); } if (options.onlyHttps) { return queryHttps("v4", options); } return queryDns("v4", options); } function publicIpv6(options) { options = { ...defaults, ...options }; if (!options.onlyHttps) { return queryAll("v6", options); } if (options.onlyHttps) { return queryHttps("v6", options); } return queryDns("v6", options); } // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { CancelError, IpNotFoundError, publicIp, publicIpv4, publicIpv6 }); //# sourceMappingURL=index.js.map