UNPKG

ipquery

Version:
1 lines 3.42 kB
"use strict";var e=e=>!!(e=>/^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/.test(e))(e)||!!(e=>/^(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|(?:[0-9a-fA-F]{1,4}:){1,7}:/.test(e))(e);async function t(e,t,r){let s=e.url;const n={...e.headers,...t.headers},a=new URLSearchParams(t.query).toString();"/"===s[0]&&(s=s.slice(1)),s=`https://api.ipquery.io/${s}`,a&&(s=`${s}?${a}`);const i={...t.params};for(const e in i)s=s.replace(`{${e}}`,i[e]);const o=t.body;let l;return o&&(l=JSON.stringify(o)),await fetch(s,{method:e.method,headers:n,body:l}).then((async e=>{if(!e.ok){const t=await e.text();throw new Error(`(${e.status}) IPQuery error: ${t}`)}return await e.text()})).then((e=>{try{return JSON.parse(e)}catch{return e}})).then((e=>e))}var r=null,s={self:{url:"/",method:"get",request:{query:r},response:null},specific:{url:"/{ip}",method:"get",request:{query:r},response:null},bulk:{url:"/{ip_list}",method:"get",request:{query:r},response:null}},n=(e,t)=>`${e}-${t}`,a=e=>{const t=new Map,r=e?.disable;if(r)return{has:()=>!1,get:()=>{},set:()=>{},clear:()=>{},isEnabled:()=>!1};const s=e?.ttl??Number.POSITIVE_INFINITY,a=e?.limit??Number.POSITIVE_INFINITY,i=e=>Date.now()-e>s;return{has:(e,r)=>{const s=n(e,r),a=t.get(s);return!(!a||i(a.timestamp)&&(t.delete(s),1))},get:(e,r)=>{const s=n(e,r),a=t.get(s);if(a&&!i(a.timestamp))return t.delete(s),t.set(s,a),a.value;t.delete(s)},set:(e,r)=>{t.set(e,{value:r,timestamp:Date.now()}),(()=>{for(;t.size>a;){const e=t.keys().next();if(e.done)break;t.delete(e.value)}})()},clear:()=>t.clear(),isEnabled:()=>!0}},i={cache:{disable:!1,ttl:3e5,limit:100}},o=a(i.cache),l={config(e){i={...i,...e},o=a(i.cache)},get query(){return r=o,async function(n,a){const i=a?.format??"json";if((t=>{if("self"!==t)if(Array.isArray(t)){if(t.length>1e4)throw new Error("IP list can't exceed 10,000 IPs, check https://ipquery.gitbook.io/ipquery-docs#bulk-query-a-list-of-ip-addresss");for(const[r,s]of t.entries())if(!e(s))throw new Error(`Invalid IP addres '${s}' at index '${r}'`)}else if(!e(t))throw new Error(`Invalid IP address: ${t}`)})(n),"self"===n)return await async function(e,r){if(e.has("self",r))return e.get("self",r);const n=await t(s.self,{query:{format:r}});return e.set(`self-${r}`,n),n}(r,i);if(Array.isArray(n)&&n.length>1)return await async function(e,r,n){const a=[],i=[];if(e.isEnabled())for(const t of r){const r=e.get(t,n);r?a.push(r):i.push(t)}if(i.length>0){const r=await t(s.bulk,{params:{ip_list:i.join(",")},query:{format:n}});let o=[];"string"==typeof r&&(o=(e=>{const t="- ip:";if(e.includes("<IPInfo>")){const t=e.match(/<IPInfo>[\s\S]*?<\/IPInfo>/g);return t?.map((e=>e.trim()))??[]}return e.includes(t)?e.split(t).slice(1).map((e=>`ip:${e}`.split("\n").map((e=>e.replace(/\s+$/,""))).join("\n").trim())):e.split("\n").map((e=>e.trim())).filter((e=>e.length>0))})(r)),Array.isArray(r)&&(o=r),1===i.length&&!Array.isArray(r)&&(o=[r]);for(let t=0;t<i.length;t++){const r=i[t],s=o[t];e.set(`${r}-${n}`,s),a.push(s)}}return a}(r,n,i);const o=Array.isArray(n)?n[0]:n;if(o)return await async function(e,r,n){if(e.has(r,n))return e.get(r,n);const a=await t(s.specific,{params:{ip:r},query:{format:n}});return e.set(`${r}-${n}`,a),a}(r,o,i);throw new Error("Invalid input. Expected a single IP address or an array of IP addresses.")};var r}};exports.ip=l;