UNPKG

@stacksjs/dnsx

Version:

A command-line & library DNS client. Like dig & dog, but for TypeScript.

8 lines (7 loc) 22.6 kB
var c=Object.create;var{getPrototypeOf:d,defineProperty:q,getOwnPropertyNames:p}=Object;var a=Object.prototype.hasOwnProperty;var o=(x,b,B)=>{B=x!=null?c(d(x)):{};let Y=b||!x||!x.__esModule?q(B,"default",{value:x,enumerable:!0}):B;for(let G of p(x))if(!a.call(Y,G))q(Y,G,{get:()=>x[G],enumerable:!0});return Y};var t=(x,b)=>()=>(b||x((b={exports:{}}).exports,b),b.exports);var l=t((g1,m)=>{var P=process||{},i=P.argv||[],S=P.env||{},X1=!(!!S.NO_COLOR||i.includes("--no-color"))&&(!!S.FORCE_COLOR||i.includes("--color")||P.platform==="win32"||(P.stdout||{}).isTTY&&S.TERM!=="dumb"||!!S.CI),Z1=(x,b,B=x)=>(Y)=>{let G=""+Y,X=G.indexOf(b,x.length);return~X?x+z1(G,b,B,X)+b:x+G+b},z1=(x,b,B,Y)=>{let G="",X=0;do G+=x.substring(X,Y)+B,X=Y+b.length,Y=x.indexOf(b,X);while(~Y);return G+x.substring(X)},T=(x=X1)=>{let b=x?Z1:()=>String;return{isColorSupported:x,reset:b("\x1B[0m","\x1B[0m"),bold:b("\x1B[1m","\x1B[22m","\x1B[22m\x1B[1m"),dim:b("\x1B[2m","\x1B[22m","\x1B[22m\x1B[2m"),italic:b("\x1B[3m","\x1B[23m"),underline:b("\x1B[4m","\x1B[24m"),inverse:b("\x1B[7m","\x1B[27m"),hidden:b("\x1B[8m","\x1B[28m"),strikethrough:b("\x1B[9m","\x1B[29m"),black:b("\x1B[30m","\x1B[39m"),red:b("\x1B[31m","\x1B[39m"),green:b("\x1B[32m","\x1B[39m"),yellow:b("\x1B[33m","\x1B[39m"),blue:b("\x1B[34m","\x1B[39m"),magenta:b("\x1B[35m","\x1B[39m"),cyan:b("\x1B[36m","\x1B[39m"),white:b("\x1B[37m","\x1B[39m"),gray:b("\x1B[90m","\x1B[39m"),bgBlack:b("\x1B[40m","\x1B[49m"),bgRed:b("\x1B[41m","\x1B[49m"),bgGreen:b("\x1B[42m","\x1B[49m"),bgYellow:b("\x1B[43m","\x1B[49m"),bgBlue:b("\x1B[44m","\x1B[49m"),bgMagenta:b("\x1B[45m","\x1B[49m"),bgCyan:b("\x1B[46m","\x1B[49m"),bgWhite:b("\x1B[47m","\x1B[49m"),blackBright:b("\x1B[90m","\x1B[39m"),redBright:b("\x1B[91m","\x1B[39m"),greenBright:b("\x1B[92m","\x1B[39m"),yellowBright:b("\x1B[93m","\x1B[39m"),blueBright:b("\x1B[94m","\x1B[39m"),magentaBright:b("\x1B[95m","\x1B[39m"),cyanBright:b("\x1B[96m","\x1B[39m"),whiteBright:b("\x1B[97m","\x1B[39m"),bgBlackBright:b("\x1B[100m","\x1B[49m"),bgRedBright:b("\x1B[101m","\x1B[49m"),bgGreenBright:b("\x1B[102m","\x1B[49m"),bgYellowBright:b("\x1B[103m","\x1B[49m"),bgBlueBright:b("\x1B[104m","\x1B[49m"),bgMagentaBright:b("\x1B[105m","\x1B[49m"),bgCyanBright:b("\x1B[106m","\x1B[49m"),bgWhiteBright:b("\x1B[107m","\x1B[49m")}};m.exports=T();m.exports.createColors=T});var W;((_)=>{_[_.A=1]="A";_[_.NS=2]="NS";_[_.CNAME=5]="CNAME";_[_.SOA=6]="SOA";_[_.PTR=12]="PTR";_[_.MX=15]="MX";_[_.TXT=16]="TXT";_[_.AAAA=28]="AAAA";_[_.SRV=33]="SRV";_[_.NAPTR=35]="NAPTR";_[_.OPT=41]="OPT";_[_.SSHFP=44]="SSHFP";_[_.TLSA=52]="TLSA";_[_.DNSKEY=48]="DNSKEY";_[_.CAA=257]="CAA"})(W||={});var L;((Y)=>{Y[Y.IN=1]="IN";Y[Y.CH=3]="CH";Y[Y.HS=4]="HS"})(L||={});var n;((Y)=>{Y.Disable="disable";Y.Hide="hide";Y.Show="show"})(n||={});var r;((Z)=>{Z[Z.NoError=0]="NoError";Z[Z.FormErr=1]="FormErr";Z[Z.ServFail=2]="ServFail";Z[Z.NXDomain=3]="NXDomain";Z[Z.NotImp=4]="NotImp";Z[Z.Refused=5]="Refused";Z[Z.YXDomain=6]="YXDomain";Z[Z.YXRRSet=7]="YXRRSet";Z[Z.NXRRSet=8]="NXRRSet";Z[Z.NotAuth=9]="NotAuth";Z[Z.NotZone=10]="NotZone"})(r||={});var s;((K)=>{K.TruncatedPacket="TRUNCATED_PACKET";K.InvalidLength="INVALID_LENGTH";K.InvalidFormat="INVALID_FORMAT";K.InvalidName="INVALID_NAME";K.InvalidLabel="INVALID_LABEL";K.InvalidPointer="INVALID_POINTER";K.InvalidType="INVALID_TYPE";K.InvalidClass="INVALID_CLASS";K.NetworkError="NETWORK_ERROR"})(s||={});function W1(x){if(!x)return;let b=Array.isArray(x)?x:[x],B={};for(let Y of b)if(Y==="aa"||Y==="authoritative")B.authoritative=!0;else if(Y==="ad"||Y==="authentic")B.authenticData=!0;else if(Y==="cd"||Y==="checking-disabled")B.checkingDisabled=!0;else if(Y.startsWith("bufsize="))B.udpPayloadSize=Number.parseInt(Y.split("=")[1]);return B}function V(x,b,B){if(B)console.debug(`[dnsx:${x}] ${b}`)}import{Buffer as D}from"node:buffer";var e=12,x1=63;class I{response=!1;opcode=0;authoritative=!1;truncated=!1;recursionDesired=!1;recursionAvailable=!1;authenticData=!1;checkingDisabled=!1;responseCode=0;static fromBuffer(x){let b=new I,B=x.readUInt16BE(0);return b.response=(B&32768)!==0,b.opcode=(B&30720)>>>11,b.authoritative=(B&1024)!==0,b.truncated=(B&512)!==0,b.recursionDesired=(B&256)!==0,b.recursionAvailable=(B&128)!==0,b.authenticData=(B&32)!==0,b.checkingDisabled=(B&16)!==0,b.responseCode=B&15,b}toBuffer(){let x=D.alloc(2),b=0;if(this.response)b|=32768;if(b|=(this.opcode&15)<<11,this.authoritative)b|=1024;if(this.truncated)b|=512;if(this.recursionDesired)b|=256;if(this.recursionAvailable)b|=128;if(this.authenticData)b|=32;if(this.checkingDisabled)b|=16;return b|=this.responseCode&15,x.writeUInt16BE(b,0),x}}class R{buffer;offset;nameOffsets;verbose;constructor(x=512,b){this.buffer=D.alloc(x),this.offset=0,this.nameOffsets=new Map,this.verbose=b}writeHeader(x,b,B){V("encoder",`Writing DNS header: ${JSON.stringify({id:x,flags:{response:b.response,opcode:b.opcode,recursionDesired:b.recursionDesired},counts:B})}`,this.verbose),this.writeUint16(x);let Y=b.toBuffer();this.buffer.set(Y,this.offset),this.offset+=2,this.writeUint16(B.qdcount),this.writeUint16(B.ancount),this.writeUint16(B.nscount),this.writeUint16(B.arcount)}writeName(x){V("encoder",`Writing DNS name: ${x}`,this.verbose);let b=x.split(".");for(let B of b){if(B.length>x1)throw new Error(`Label too long: ${B}`);this.buffer[this.offset++]=B.length,this.buffer.write(B,this.offset),this.offset+=B.length}this.buffer[this.offset++]=0}writeQuestion(x){this.writeName(x.name),this.writeUint16(x.type),this.writeUint16(x.class)}writeUint16(x){this.buffer.writeUInt16BE(x,this.offset),this.offset+=2}writeUint32(x){this.buffer.writeUInt32BE(x,this.offset),this.offset+=4}getBuffer(){return this.buffer.slice(0,this.offset)}}class w{buffer;offset;constructor(x){this.buffer=x,this.offset=0}canRead(x){return this.offset+x<=this.buffer.length}readName(){let x=[],b=!1,B=this.offset;for(let Y=0;Y<5;Y++){if(B>=this.buffer.length)throw new Error("Out of bounds access");let G=this.buffer[B];if(G===0){if(!b)this.offset=B+1;break}if((G&192)===192){if(!this.canRead(2))throw new Error("Out of bounds access");if(!b)this.offset=B+2,b=!0;B=(G&63)<<8|this.buffer[B+1];continue}if(B++,B+G>this.buffer.length)throw new Error("Out of bounds access");let X=this.buffer.slice(B,B+G).toString("ascii");x.push(X),B+=G}return x.join(".")}readHeader(){if(!this.canRead(e))throw new Error(`Invalid DNS header size: ${this.buffer.length} bytes`);let x=this.readUint16(),b=I.fromBuffer(this.buffer.slice(this.offset,this.offset+2));this.offset+=2;let B={qdcount:this.readUint16(),ancount:this.readUint16(),nscount:this.readUint16(),arcount:this.readUint16()};return{id:x,flags:b,counts:B}}readQuestion(){let x=this.readName();if(!this.canRead(4))throw new Error("Out of bounds access");let b=this.readUint16(),B=this.readUint16();return{name:x,type:b,class:B}}readAnswer(){let x=this.readName();if(!this.canRead(10))throw new Error("Out of bounds access");let b=this.readUint16(),B=this.readUint16(),Y=this.readUint32(),G=this.readUint16();if(!this.canRead(G))throw new Error("Out of bounds access");let X=this.readRData(b,G);return{name:x,type:b,class:B,ttl:Y,data:X}}readRData(x,b){let B=this.offset,Y;switch(x){case 1:if(b!==4)throw new Error("Invalid IPv4 length");Y=this.readIPv4();break;case 28:if(b!==16)throw new Error("Invalid IPv6 length");Y=this.readIPv6();break;case 15:if(b<3)throw new Error("Invalid MX record length");Y={preference:this.readUint16(),exchange:this.readName()};break;case 16:Y=this.readString(b);break;case 5:case 2:case 12:Y=this.readName();break;default:Y=this.buffer.slice(this.offset,this.offset+b).toString("hex"),this.offset+=b}if(this.offset-B!==b)this.offset=B+b;return Y}readUint16(){if(!this.canRead(2))throw new Error("Out of bounds access");let x=this.buffer.readUInt16BE(this.offset);return this.offset+=2,x}readUint32(){if(!this.canRead(4))throw new Error("Out of bounds access");let x=this.buffer.readUInt32BE(this.offset);return this.offset+=4,x}readIPv4(){if(!this.canRead(4))throw new Error("Out of bounds access");let x=[];for(let b=0;b<4;b++)x.push(this.buffer[this.offset++]);return x.join(".")}readIPv6(){if(!this.canRead(16))throw new Error("Out of bounds access");let x=[];for(let b=0;b<8;b++)x.push(this.buffer.readUInt16BE(this.offset).toString(16)),this.offset+=2;return x.join(":")}readString(x){if(!this.canRead(x))throw new Error("Out of bounds access");let b=this.buffer.slice(this.offset,this.offset+x).toString();return this.offset+=x,b}}function g(x,b={}){let B=new R(512,b.verbose),Y=new I;Y.recursionDesired=!0,Y.response=!1;let G=b.txid??b.id??Math.floor(Math.random()*65536);return B.writeHeader(G,Y,{qdcount:1,ancount:0,nscount:0,arcount:0}),B.writeQuestion({name:x.name,type:typeof x.type==="string"?W[x.type]:x.type,class:x.class}),B.getBuffer()}function C(x){let b=new w(x);if((x.readUInt16BE(2)&32768)===0)throw new Error("Not a DNS response");let{id:Y,flags:G,counts:X}=b.readHeader();for(let K=0;K<X.qdcount;K++)b.readQuestion();let $=[];for(let K=0;K<X.ancount;K++)$.push(b.readAnswer());let z=[];for(let K=0;K<X.nscount;K++)z.push(b.readAnswer());let M=[];for(let K=0;K<X.arcount;K++)M.push(b.readAnswer());return{id:Y,flags:G,answers:$,authorities:z,additionals:M}}import{Buffer as h}from"node:buffer";import b1 from"node:dgram";import B1 from"node:https";import Y1 from"node:net";import G1 from"node:tls";import{URL as f}from"node:url";var y;((G)=>{G.UDP="udp";G.TCP="tcp";G.TLS="tls";G.HTTPS="https"})(y||={});class H{static DEFAULT_PORT=53;static TIMEOUT=5000;async query(x,b){return new Promise((B,Y)=>{let G=b1.createSocket("udp4"),X,$,z=H.DEFAULT_PORT;if(x.includes(":")){let[K,J]=x.split(":");$=K;let Z=Number.parseInt(J,10);if(Z>0&&Z<65536)z=Z}else $=x;G.on("error",(K)=>{clearTimeout(X),G.close(),Y(K)}),G.on("message",(K)=>{clearTimeout(X),G.close(),B(K)}),X=setTimeout(()=>{G.close(),Y(new Error("UDP query timed out"))},H.TIMEOUT);let M=new Uint8Array(b.buffer,b.byteOffset,b.length);G.send(M,z,$,(K)=>{if(K)clearTimeout(X),G.close(),Y(K)})})}}class F{static DEFAULT_PORT=53;static TIMEOUT=5000;async query(x,b){return new Promise((B,Y)=>{let G=new Y1.Socket,X,$=new Uint8Array(0),z=-1;G.on("error",(J)=>{clearTimeout(X),G.destroy(),Y(J)}),G.on("data",(J)=>{let Z=new Uint8Array($.length+J.length);if(Z.set($),Z.set(new Uint8Array(J.buffer,J.byteOffset,J.length),$.length),$=Z,z===-1&&$.length>=2)z=new DataView($.buffer,$.byteOffset).getUint16(0)+2;if(z!==-1&&$.length>=z)clearTimeout(X),G.destroy(),B(h.from($.slice(2,z)))}),X=setTimeout(()=>{G.destroy(),Y(new Error("TCP query timed out"))},F.TIMEOUT);let[M,K=F.DEFAULT_PORT]=x.split(":");G.connect(Number(K),M,()=>{let J=new Uint8Array(2);new DataView(J.buffer).setUint16(0,b.length);let O=new Uint8Array(b.buffer,b.byteOffset,b.length),N=new Uint8Array(J.length+O.length);N.set(J),N.set(O,J.length),G.write(N,(Q)=>{if(Q)clearTimeout(X),G.destroy(),Y(Q)})})})}}class E{static DEFAULT_PORT=853;static TIMEOUT=5000;async query(x,b){return new Promise((B,Y)=>{let G={host:x.split(":")[0],port:Number(x.split(":")[1])||E.DEFAULT_PORT,servername:x.split(":")[0]},X,$=G1.connect(G,()=>{if(!$.authorized){$.destroy(),Y(new Error("TLS authorization failed"));return}let K=new Uint8Array(2);new DataView(K.buffer).setUint16(0,b.length);let Z=new Uint8Array(b.buffer,b.byteOffset,b.length),O=new Uint8Array(K.length+Z.length);O.set(K),O.set(Z,K.length),$.write(O,(N)=>{if(N)clearTimeout(X),$.destroy(),Y(N)})}),z=new Uint8Array(0),M=-1;$.on("error",(K)=>{clearTimeout(X),$.destroy(),Y(K)}),$.on("data",(K)=>{let J=new Uint8Array(z.length+K.length);if(J.set(z),J.set(new Uint8Array(K.buffer,K.byteOffset,K.length),z.length),z=J,M===-1&&z.length>=2)M=new DataView(z.buffer,z.byteOffset).getUint16(0)+2;if(M!==-1&&z.length>=M)clearTimeout(X),$.destroy(),B(h.from(z.slice(2,M)))}),X=setTimeout(()=>{$.destroy(),Y(new Error("TLS query timed out"))},E.TIMEOUT)})}}class A{static TIMEOUT=5000;static CONTENT_TYPE="application/dns-message";async query(x,b){return new Promise((B,Y)=>{let G;try{G=new f(x)}catch{G=new f(`https://${x}/dns-query`)}let X={method:"POST",headers:{"Content-Type":A.CONTENT_TYPE,"Content-Length":b.length.toString(),Accept:A.CONTENT_TYPE},timeout:A.TIMEOUT},$=B1.request(G,X,(z)=>{let M=[];z.on("data",(K)=>{M.push(new Uint8Array(K.buffer,K.byteOffset,K.length))}),z.on("end",()=>{if(z.statusCode!==200){Y(new Error(`HTTPS query failed with status ${z.statusCode}`));return}let K=z.headers["content-type"];if(K!==A.CONTENT_TYPE){Y(new Error(`Invalid content type: ${K}`));return}let J=M.reduce((N,Q)=>N+Q.length,0),Z=new Uint8Array(J),O=0;for(let N of M)Z.set(N,O),O+=N.length;B(h.from(Z))})});$.on("error",Y),$.on("timeout",()=>{$.destroy(),Y(new Error("HTTPS query timed out"))}),$.write(new Uint8Array(b.buffer,b.byteOffset,b.length)),$.end()})}}function k(x){switch(x){case"udp":return new H;case"tcp":return new F;case"tls":return new E;case"https":return new A}}import{promises as K1}from"node:fs";import{platform as $1}from"node:os";class U{options;static DEFAULT_NAMESERVER="1.1.1.1";static RESOLV_CONF_PATH="/etc/resolv.conf";static WINDOWS_DNS_KEY="SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Nameserver";validateDomainName(x){if(x.includes(".."))throw new Error(`Invalid domain name: ${x} (consecutive dots)`);if(x.startsWith(".")||x.endsWith("."))throw new Error(`Invalid domain name: ${x} (starts or ends with dot)`);if(x.length>253)throw new Error(`Domain name too long: ${x}`);let b=x.split(".");for(let B of b){if(B.length>63)throw new Error(`Label too long in domain: ${x}`);if(!/^[a-z0-9-]+$/i.test(B))throw new Error(`Invalid characters in domain label: ${B}`)}}validateRecordType(x){if(typeof x==="string"){if(!(x.toUpperCase()in W))throw new Error(`Invalid record type: ${x}`)}else if(typeof x==="number"){if(!Object.values(W).filter((B)=>typeof B==="number").includes(x))throw new Error(`Invalid record type number: ${x}`)}else throw new TypeError("Record type must be string or number")}constructor(x){this.options={transport:{type:"udp"},verbose:!1,...x},this.validateOptions()}async query(){try{let x=this.determineTransportType();V("client",`Selected transport type: ${x}`,this.options.verbose);let b=k(x);if(!b)throw new Error(`Failed to create transport for type: ${x}`);let B=[],Y=await this.resolveNameserver();if(V("client",`Resolved nameserver: ${Y}`,this.options.verbose),!Y)throw new Error("Failed to resolve nameserver");let G=this.buildQueries();V("client",`Built ${G.length} queries`,this.options.verbose);for(let X of G){V("client",`Processing query: ${JSON.stringify({query:X,nameserver:Y,transportType:x})}`,this.options.verbose);let $=g(X,{txid:this.options.txid,edns:this.options.edns,tweaks:this.options.tweaks,verbose:this.options.verbose});V("client",`Built DNS request: ${JSON.stringify({hexData:$.toString("hex"),length:$.length,txid:$.readUInt16BE(0),flags:$.readUInt16BE(2).toString(16)})}`,this.options.verbose);let z=this.options.retries||3;for(let M=0;M<z;M++)try{V("client",`Attempt ${M+1}/${z}`,this.options.verbose);let K=await b.query(Y,$);if(V("client",`Received DNS response: ${JSON.stringify({hexData:K.toString("hex"),length:K.length,txid:K.readUInt16BE(0),flags:K.readUInt16BE(2).toString(16)})}`,this.options.verbose),K.length<12)throw new Error(`Response too short: ${K.length} bytes`);if(!(K.readUInt16BE(2)&32768))throw new Error("Response flag not set in DNS message");let Z=C(K);if(V("client",`Parsed DNS response: ${JSON.stringify({id:Z.id,answerCount:Z.answers.length,authorityCount:Z.authorities.length,additionalCount:Z.additionals.length})}`,this.options.verbose),x==="udp"&&Z.flags.truncated){V("client","Response truncated, retrying with TCP",this.options.verbose);let N=await k("tcp").query(Y,$);B.push(C(N))}else B.push(Z);break}catch(K){if(V("client",`Attempt ${M+1} failed: ${K.message}`,this.options.verbose),M===z-1)throw V("client","All retry attempts failed",this.options.verbose),K;let J=2**M*1000;V("client",`Waiting ${J}ms before retry`,this.options.verbose),await new Promise((Z)=>setTimeout(Z,J))}}if(B.length===0)throw new Error("No responses received");return B}catch(x){let b=x instanceof Error?x.message:"Unknown error occurred";throw V("client",`Query failed with error: ${b}`,this.options.verbose),V("client",`Full error: ${JSON.stringify(x)}`,this.options.verbose),new Error(`DNS query failed: ${b}`)}}buildQueries(){let x=[];if(!this.options.domains?.length)throw new Error("No domains specified");let b=Array.isArray(this.options.domains)?this.options.domains:[this.options.domains],B=this.resolveTypes(),Y=this.resolveClasses();for(let G of b)for(let X of B)for(let $ of Y)x.push({name:G,type:X,class:$});return V("client",`Built queries: ${JSON.stringify(x)}`,this.options.verbose),x}resolveTypes(){if(!this.options.type)return[1];return(Array.isArray(this.options.type)?this.options.type:[this.options.type]).map((b)=>{if(this.validateRecordType(b),typeof b==="number")return b;let B=b.toUpperCase();return W[B]})}resolveClasses(){if(!this.options.class)return[1];return(Array.isArray(this.options.class)?this.options.class:[this.options.class]).map((b)=>{if(typeof b==="number")return b;let B=b.toUpperCase(),Y=L[B];if(Y===void 0)throw new Error(`Invalid query class: ${b}`);return Y})}validateNameserver(x){if(x.startsWith("https://"))return!0;if(x.includes("%"))return!1;if(/^(?:\d{1,3}\.){3}\d{1,3}$/.test(x))return x.split(".").every((Y)=>{let G=Number.parseInt(Y,10);return G>=0&&G<=255});if(x.includes(":"))return!1;return!1}async resolveNameserver(){try{if(this.options.nameserver){if(V("client",`Checking configured nameserver: ${this.options.nameserver}`,this.options.verbose),this.validateNameserver(this.options.nameserver))return this.options.nameserver}let x=$1();V("client",`Resolving nameserver for platform: ${x}`,this.options.verbose);let b;if(x==="win32")b=await this.resolveWindowsNameserver();else b=await this.resolveUnixNameserver();if(this.validateNameserver(b))return b;return V("client",`Using default nameserver: ${U.DEFAULT_NAMESERVER}`,this.options.verbose),U.DEFAULT_NAMESERVER}catch(x){return V("client",`Failed to resolve nameserver: ${x.message}`,this.options.verbose),V("client",`Using default nameserver: ${U.DEFAULT_NAMESERVER}`,this.options.verbose),U.DEFAULT_NAMESERVER}}async resolveUnixNameserver(){try{let b=(await K1.readFile(U.RESOLV_CONF_PATH,"utf-8")).split(` `),B=[];for(let G of b){let X=G.trim();if(X.startsWith("nameserver")){let[,$]=X.split(/\s+/);if($&&!$.includes("%"))B.push($)}}let Y=B.find((G)=>!G.includes(":"));if(Y)return V("client",`Using IPv4 nameserver from resolv.conf: ${Y}`,this.options.verbose),Y;return V("client",`No valid nameserver found in resolv.conf, using fallback: ${U.DEFAULT_NAMESERVER}`,this.options.verbose),U.DEFAULT_NAMESERVER}catch(x){return V("client",`Failed to read resolv.conf: ${x.message}`,this.options.verbose),V("client",`Using fallback nameserver: ${U.DEFAULT_NAMESERVER}`,this.options.verbose),U.DEFAULT_NAMESERVER}}async resolveWindowsNameserver(){try{return V("client",`Using default nameserver for Windows: ${U.DEFAULT_NAMESERVER}`,this.options.verbose),U.DEFAULT_NAMESERVER}catch(x){throw V("client",`Failed to get Windows nameserver: ${x.message}`,this.options.verbose),new Error("Failed to get Windows nameserver")}}determineTransportType(){if(this.options.https)return"https";if(this.options.tls)return"tls";if(this.options.tcp)return"tcp";if(this.options.udp)return"udp";if(typeof this.options.transport==="object")return this.options.transport.type||"udp";return"udp"}validateOptions(){if(this.options.domains)for(let b of Array.isArray(this.options.domains)?this.options.domains:[this.options.domains])this.validateDomainName(b);if(this.options.type){let b=Array.isArray(this.options.type)?this.options.type:[this.options.type];for(let B of b)this.validateRecordType(B)}if([this.options.udp,this.options.tcp,this.options.tls,this.options.https].filter(Boolean).length>1)throw new Error("Only one transport type can be specified");if(this.options.https&&!this.options.nameserver?.startsWith("https://"))throw new Error("HTTPS transport requires an HTTPS nameserver URL");V("client","Options validation completed successfully",this.options.verbose)}}var u=o(l(),1);var V1={A:"green",AAAA:"green",CNAME:"yellow",MX:"cyan",NS:"red",PTR:"red",SOA:"magenta",SRV:"cyan",TXT:"yellow",CAA:"red",TLSA:"yellow"};function y1(x,b){if(b.json)return _1(x,b.showDuration);return J1(x,b)}function _1(x,b){let B={responses:x.map((Y)=>({id:Y.id,answers:Y.answers.map(v),authorities:Y.authorities.map(v),additionals:Y.additionals.map(v)}))};if(b!==void 0)B.duration={ms:b};return JSON.stringify(B,null,2)}function v(x){let b={name:x.name,type:W[x.type]||x.type,ttl:x.ttl};switch(x.type){case 1:case 28:return{...b,address:x.data};case 5:case 12:case 2:return{...b,target:x.data};case 15:return{...b,preference:x.data.preference,exchange:x.data.exchange};case 16:return{...b,text:x.data};case 33:return{...b,priority:x.data.priority,weight:x.data.weight,port:x.data.port,target:x.data.target};case 257:return{...b,flags:x.data.flags,tag:x.data.tag,value:x.data.value};default:return{...b,data:x.data}}}function J1(x,b){let B=[];for(let Y of x){if(b.short){if(Y.answers.length>0)B.push(j(Y.answers[0],b));continue}if(Y.answers.length>0)for(let G of Y.answers)B.push(j(G,b));if(Y.authorities.length>0){B.push(` Authority Records:`);for(let G of Y.authorities)B.push(j(G,b))}if(Y.additionals.length>0){B.push(` Additional Records:`);for(let G of Y.additionals)B.push(j(G,b))}}if(b.showDuration!==void 0)B.push(` Query time: ${N1(b.showDuration,b.rawSeconds)}`);return B.join(` `)}function j(x,b){let B=W[x.type]||x.type.toString(),Y=V1[B]||"white",G=b.colors.enabled?u.default[Y](B.padEnd(6)):B.padEnd(6),X=M1(x.ttl,b.rawSeconds).padStart(8),$;switch(x.type){case 1:case 28:$=x.data;break;case 5:case 12:case 2:$=x.data;break;case 15:$=`${x.data.preference} ${x.data.exchange}`;break;case 16:$=`"${x.data}"`;break;case 33:$=`${x.data.priority} ${x.data.weight} ${x.data.port} ${x.data.target}`;break;case 257:$=`${x.data.flags} ${x.data.tag} "${x.data.value}"`;break;default:$=JSON.stringify(x.data)}return`${G} ${X} ${x.name.padEnd(30)} ${$}`}function M1(x,b){if(b)return x.toString();if(x<60)return`${x}s`;if(x<3600){let G=Math.floor(x/60),X=x%60;return`${G}m${X}s`}if(x<86400){let G=Math.floor(x/3600),X=Math.floor(x%3600/60);return`${G}h${X}m`}let B=Math.floor(x/86400),Y=Math.floor(x%86400/3600);return`${B}d${Y}h`}function N1(x,b){if(b)return`${x}ms`;if(x<1000)return`${x}ms`;return`${(x/1000).toFixed(2)}s`} export{o as a,W as b,L as c,n as d,r as e,s as f,W1 as g,V as h,I as i,R as j,w as k,g as l,C as m,y as n,k as o,U as p,l as q,y1 as r};