Object.defineProperty(exports, "__esModule", { value: !0 }); var e = require("node:os"); var t = require("node:dgram"); var s = require("node:net"); let r = function(e) { e[e.QUERY = 0] = "QUERY"; e[e.RESPONSE = 32768] = "RESPONSE"; return e; }({}); let n = function(e) { e[e.A = 1] = "A"; e[e.NS = 2] = "NS"; e[e.CNAME = 5] = "CNAME"; e[e.SOA = 6] = "SOA"; e[e.NULL = 10] = "NULL"; e[e.PTR = 12] = "PTR"; e[e.HINFO = 13] = "HINFO"; e[e.MX = 15] = "MX"; e[e.TXT = 16] = "TXT"; e[e.RP = 17] = "RP"; e[e.AFSDB = 18] = "AFSDB"; e[e.SIG = 24] = "SIG"; e[e.KEY = 25] = "KEY"; e[e.AAAA = 28] = "AAAA"; e[e.LOC = 29] = "LOC"; e[e.SRV = 33] = "SRV"; e[e.NAPTR = 35] = "NAPTR"; e[e.KX = 36] = "KX"; e[e.CERT = 37] = "CERT"; e[e.DNAME = 39] = "DNAME"; e[e.OPT = 41] = "OPT"; e[e.APL = 42] = "APL"; e[e.DS = 43] = "DS"; e[e.SSHFP = 44] = "SSHFP"; e[e.IPSECKEY = 45] = "IPSECKEY"; e[e.RRSIG = 46] = "RRSIG"; e[e.NSEC = 47] = "NSEC"; e[e.DNSKEY = 48] = "DNSKEY"; e[e.DHCID = 49] = "DHCID"; e[e.NSEC3 = 50] = "NSEC3"; e[e.NSEC3PARAM = 51] = "NSEC3PARAM"; e[e.TLSA = 52] = "TLSA"; e[e.HIP = 55] = "HIP"; e[e.CDS = 59] = "CDS"; e[e.CDNSKEY = 60] = "CDNSKEY"; e[e.SVCB = 64] = "SVCB"; e[e.HTTPS = 65] = "HTTPS"; e[e.SPF = 99] = "SPF"; e[e.TKEY = 249] = "TKEY"; e[e.TSIG = 250] = "TSIG"; e[e.IXFR = 251] = "IXFR"; e[e.AXFR = 252] = "AXFR"; e[e.ANY = 255] = "ANY"; e[e.CAA = 257] = "CAA"; e[e.TA = 32768] = "TA"; e[e.DLV = 32769] = "DLV"; return e; }({}); let a = function(e) { e[e.IN = 1] = "IN"; e[e.CS = 2] = "CS"; e[e.CH = 3] = "CH"; e[e.HS = 4] = "HS"; e[e.ANY = 255] = "ANY"; return e; }({}); let i = function(e) { e[e.NOERR = 0] = "NOERR"; e[e.FORMERR = 1] = "FORMERR"; e[e.SERVFAIL = 2] = "SERVFAIL"; e[e.NXDOMAIN = 3] = "NXDOMAIN"; e[e.NOTIMP = 4] = "NOTIMP"; e[e.REFUSED = 5] = "REFUSED"; e[e.YXDOMAIN = 6] = "YXDOMAIN"; e[e.YXRRSET = 7] = "YXRRSET"; e[e.NXRRSET = 8] = "NXRRSET"; e[e.NOTAUTH = 9] = "NOTAUTH"; e[e.NOTZONE = 10] = "NOTZONE"; e[e.CHECKING_DISABLED = 16] = "CHECKING_DISABLED"; e[e.AUTHENTIC_DATA = 32] = "AUTHENTIC_DATA"; e[e.RECURSION_AVAILABLE = 128] = "RECURSION_AVAILABLE"; e[e.RECURSION_DESIRED = 256] = "RECURSION_DESIRED"; e[e.TRUNCATED_RESPONSE = 512] = "TRUNCATED_RESPONSE"; e[e.AUTHORITATIVE_ANSWER = 1024] = "AUTHORITATIVE_ANSWER"; return e; }({}); let o = function(e) { e[e.OPTION_0 = 0] = "OPTION_0"; e[e.LLQ = 1] = "LLQ"; e[e.UL = 2] = "UL"; e[e.NSID = 3] = "NSID"; e[e.OPTION_4 = 4] = "OPTION_4"; e[e.DAU = 5] = "DAU"; e[e.DHU = 6] = "DHU"; e[e.N3U = 7] = "N3U"; e[e.CLIENT_SUBNET = 8] = "CLIENT_SUBNET"; e[e.EXPIRE = 9] = "EXPIRE"; e[e.COOKIE = 10] = "COOKIE"; e[e.TCP_KEEPALIVE = 11] = "TCP_KEEPALIVE"; e[e.PADDING = 12] = "PADDING"; e[e.CHAIN = 13] = "CHAIN"; e[e.KEY_TAG = 14] = "KEY_TAG"; e[e.DEVICEID = 26946] = "DEVICEID"; e[e.OPTION_65535 = 65535] = "OPTION_65535"; return e; }({}); const c = new TextEncoder; const f = new TextDecoder; const l = "undefined" != typeof Buffer ? e => Buffer.byteLength(e) : e => { let t = e.length; for (let s = t - 1; s >= 0; s--) { const r = e.charCodeAt(s); if (r > 127 && r <= 2047) { t++; } else if (r > 2047 && r <= 65535) { t += 2; } if (r >= 56320 && r <= 57343) { s--; } } return t; }; const d = { bytes(e) { let t = 2; switch (e) { case "": case ".": case "..": return 1; default: if ("." === e[0]) { t--; } if ("." === e[e.length - 1]) { t--; } t += e.replace(/\\\./g, ".").length; if (t > 255) { throw new RangeError(`Name "${e}" is above 255 byte limit.`); } return t; } }, write(e, t, s) { const r = c.encode(s); for (let n = 46 === r[0] ? 1 : 0, a = 0; n < r.byteLength; n = a + 1) { a = r.indexOf(46, n); while (a > -1 && 92 === r[a - 1]) { a = r.indexOf(46, a + 1); } if (-1 === a) { a = r.byteLength; } if (a === n) { continue; } else if (a - n > 63) { throw new RangeError(`Label in "${s}" is above 63 byte limit.`); } let i = t + 1; for (let t = n; t < a; t++) { if (92 === r[t] && 46 === r[t + 1]) { t++; } e.setUint8(i++, r[t]); } e.setUint8(t, i - t - 1); t = i; n = a + 1; } return t + 1; }, read(e, t) { const s = []; let r = t.offset; let n = t; while (1) { const t = e.getUint8(n.offset); if (0 === t) { advance(n, 1); break; } else if (!(192 & t)) { advance(n, 1); const r = sliceView(e, n, t); s.push(f.decode(r).replace(/\./g, "\\.")); } else { const t = e.getUint16(n.offset) - 49152; advance(n, 2); if (t < r) { n = { offset: r = t, length: 0 }; } else { break; } } } return s.join(".") || "."; } }; const u = { bytes: e => "string" == typeof e ? l(e) : e.byteLength, write(e, t, s) { const r = "string" == typeof s ? c.encode(s) : s; new Uint8Array(e.buffer, e.byteOffset + t, r.byteLength).set(r); return t + r.byteLength; }, read: (e, t) => sliceView(e, t) }; const h = { bytes: e => e.byteLength + 1, write(e, t, s) { e.setUint8(t++, s.byteLength); new Uint8Array(e.buffer, e.byteOffset + t, s.byteLength).set(s); return t + s.byteLength; }, read(e, t) { const s = e.getUint8(t.offset); advance(t, 1); return sliceView(e, t, s); } }; const y = { bytes: e => l(e) + 1, write(e, t, s) { const r = c.encode(s); e.setUint8(t++, r.byteLength); return u.write(e, t, r); }, read(e, t) { const s = e.getUint8(t.offset); advance(t, 1); return f.decode(sliceView(e, t, s)); } }; const g = { bytes(e) { const t = []; for (let s = 0; s < e.length; s++) { t[e[s] >> 8] = Math.max(t[e[s] >> 8] || 0, 255 & e[s]); } let s = 0; for (let e = 0; e < t.length; e++) { if (null != t[e]) { s += 2 + Math.ceil((t[e] + 1) / 8); } } return s; }, write(e, t, s) { const r = []; for (let e = 0; e < s.length; e++) { (r[s[e] >> 8] || (r[s[e] >> 8] = []))[s[e] >> 3 & 31] |= 1 << 7 - (7 & s[e]); } for (let s = 0; s < r.length; s++) { const n = r[s]; if (null != n) { e.setUint8(t++, s); e.setUint8(t++, n.length); for (let s = 0; s < n.length; s++) { e.setUint8(t++, n[s]); } } } return t; }, read(e, t) { const {offset: s, length: r} = t; const n = []; while (t.offset - s < r) { const s = e.getUint8(t.offset); const r = e.getUint8(t.offset + 1); for (let a = 0; a < r; a++) { const r = e.getUint8(t.offset + 2 + a); for (let e = 0; e < 8; e++) { if (r & 1 << 7 - e) { n.push(s << 8 | a << 3 | e); } } } advance(t, 2 + r); } return n; } }; const p = { bytes: () => 4, write(e, t, s) { const r = s.split(".", 4); for (let s = 0; s < 4; s++) { e.setUint8(t++, parseInt(r[s], 10)); } return t; }, read(e, t) { const s = Math.min(t.length, 4); const r = new Array(4).fill(0).map((r, n) => n < s ? e.getUint8(t.offset + n) : 0).join("."); advance(t, s); return r; } }; const b = { bytes: () => 2, write(e, t, s) { e.setUint16(t, s); return t + 2; }, read(e, t) { const s = e.getUint16(t.offset); advance(t, 2); return s; } }; const w = { bytes: () => 16, write(e, t, s) { const r = s.indexOf("::"); const n = (r > -1 ? s.slice(0, r) : s).split(":"); const a = r > -1 ? s.slice(r + 2).split(":") : []; const i = a.length > 0 && a[a.length - 1].includes(".") ? a.pop() : void 0; for (let s = 0; s < n.length; s++) { e.setUint16(t, parseInt(n[s], 16)); t += 2; } for (let s = 8 - (n.length + a.length + (i ? 2 : 0)); s > 0; s--) { e.setUint16(t, 0); t += 2; } for (let s = 0; s < a.length; s++) { e.setUint16(t, parseInt(a[s], 16)); t += 2; } if (i) { const s = i.split(".", 4).map(e => parseInt(e, 10)); e.setUint16(t, s[0] << 8 | s[1]); e.setUint16(t + 2, s[2] << 8 | s[3]); t += 4; } return t; }, read(e, t) { let s = ""; const r = Math.min(t.length, 16); for (let n = 0; n < r; n += 2) { if (0 !== n) { s += ":"; } s += e.getUint16(t.offset + n).toString(16); } advance(t, r); return s.replace(/(^|:)0(:0)*:0(:|$)/, "$1::$3").replace(/:{3,4}/, "::"); } }; const withRDLength = e => ({ bytes: t => e.bytes(t) + 2, write(t, s, r) { const n = s; s = e.write(t, s + 2, r); t.setUint16(n, s - n - 2); return s; }, read(t, s) { const {offset: r, length: n} = s; const a = s.length = t.getUint16(s.offset); s.offset += 2; const i = e.read(t, s); s.offset = r + 2 + a; s.length = n; return i; } }); const array = e => ({ bytes(t) { let s = 0; for (let r = 0; null != t && r < t.length; r++) { s += e.bytes(t[r]); } return s; }, write(t, s, r) { for (let n = 0; null != r && n < r.length; n++) { s = e.write(t, s, r[n]); } return s; }, read(t, s) { const {offset: r, length: n} = s; const a = []; while (s.offset - r < n) { a.push(e.read(t, s)); } return a; } }); const advance = (e, t) => { e.offset += 0 | t; e.length -= 0 | t; e.length &= ~(e.length >> 31); }; const encodeIntoBuffer = (e, t) => { const s = new ArrayBuffer(e.bytes(t)); const r = e.write(new DataView(s), 0, t); return new Uint8Array(s, 0, r); }; const sliceView = (e, t, s = t.length) => { const r = new Uint8Array(e.buffer, e.byteOffset + t.offset, s); advance(t, s); return r; }; const A = { bytes: e => d.bytes(e.name) + 4, write(e, t, s) { let r = s.class || a.IN; if (s.qu) { r |= 32768; } t = d.write(e, t, s.name); e.setUint16(t, s.type); e.setUint16(t + 2, r); return t + 4; }, read(e, t) { const s = d.read(e, t); const r = e.getUint16(t.offset); let n = e.getUint16(t.offset + 2) || a.ANY; let i = !1; if (n !== a.ANY && 32768 & n) { n &= -32769; i = !0; } advance(t, 4); return { name: s, type: r, class: n, qu: i }; } }; const m = withRDLength({ bytes: e => u.bytes(e.data), write: (e, t, s) => u.write(e, t, s.data), read: (e, t) => ({ code: o.OPTION_0, data: u.read(e, t) }) }); const S = "(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])"; const E = new RegExp(`^(?:${S}\\.){3}${S}$`); const U = withRDLength({ bytes: e => Math.ceil((e.sourcePrefixLength || 0) / 8) + 4, write(e, t, s) { const r = s.sourcePrefixLength || 0; const n = s.scopePrefixLength || 0; const a = s.family || (E.test(s.ip) ? 1 : 2); const i = Math.ceil(r / 8); e.setUint16(t, a); e.setUint8(t + 2, r); e.setUint8(t + 3, n); t += 4; const o = encodeIntoBuffer(1 === a ? p : w, s.ip); for (let s = 0; s < i; s++) { e.setUint8(t++, o[s]); } return t; }, read(e, t) { const s = e.getUint16(t.offset); const r = e.getUint8(t.offset + 2); const n = e.getUint8(t.offset + 3); advance(t, 4); return { code: o.CLIENT_SUBNET, family: s, sourcePrefixLength: r, scopePrefixLength: n, ip: 1 === s ? p.read(e, t) : w.read(e, t) }; } }); const T = withRDLength({ bytes: e => e.timeout ? 2 : 0, write(e, t, s) { if (s.timeout) { e.setUint16(t, s.timeout); t += 2; } return t; }, read(e, t) { if (t.length) { const s = e.getUint16(t.offset); advance(t, 2); return { code: o.TCP_KEEPALIVE, timeout: s }; } else { return { code: o.TCP_KEEPALIVE, timeout: void 0 }; } } }); const N = withRDLength({ bytes: e => e.length || 0, write: (e, t, s) => t + (s.length || 0), read(e, t) { const {length: s} = t; advance(t, s); return { code: o.PADDING, length: s }; } }); const I = withRDLength({ bytes: e => 2 * e.tags.length, write(e, t, s) { for (let r = 0; r < s.tags.length; r++) { e.setUint16(t, s.tags[r]); t += 2; } return t; }, read(e, t) { const {offset: s, length: r} = t; const n = []; while (t.offset - s < r) { n.push(e.getUint16(t.offset)); advance(t, 2); } return { code: o.KEY_TAG, tags: n }; } }); const isUnknownOpt = e => !!e.data; const R = { bytes(e) { if (isUnknownOpt(e)) { return m.bytes(e) + 2; } switch (e.code) { case o.CLIENT_SUBNET: return U.bytes(e) + 2; case o.TCP_KEEPALIVE: return T.bytes(e) + 2; case o.PADDING: return N.bytes(e) + 2; case o.KEY_TAG: return I.bytes(e) + 2; } }, write(e, t, s) { e.setUint16(t, s.code); t += 2; if (isUnknownOpt(s)) { return m.write(e, t, s); } switch (s.code) { case o.CLIENT_SUBNET: return U.write(e, t, s); case o.TCP_KEEPALIVE: return T.write(e, t, s); case o.PADDING: return N.write(e, t, s); case o.KEY_TAG: return I.write(e, t, s); } }, read(e, t) { const s = e.getUint16(t.offset); advance(t, 2); switch (s) { case o.CLIENT_SUBNET: return U.read(e, t); case o.TCP_KEEPALIVE: return T.read(e, t); case o.PADDING: return N.read(e, t); case o.KEY_TAG: return I.read(e, t); default: const r = m.read(e, t); r.code = s; return r; } } }; const P = withRDLength(array(b)); const C = withRDLength(array(y)); const k = withRDLength(b); const O = withRDLength(array(p)); const L = withRDLength(array(w)); const v = withRDLength(u); const D = { bytes(e) { let t = 0; if (null != e.mandatory) { t += P.bytes(e.mandatory) + 2; } if (null != e.alpn) { t += C.bytes(e.alpn) + 2; } if (e["no-default-alpn"]) { t += 4; } if (null != e.port) { t += k.bytes(e.port) + 2; } if (e.ipv4hint) { t += O.bytes(e.ipv4hint) + 2; } if (e.ipv6hint) { t += L.bytes(e.ipv6hint) + 2; } if (e.echconfig) { t += v.bytes(e.echconfig) + 2; } if (e.dohpath) { t += v.bytes(e.dohpath) + 2; } if (e.odoh) { t += v.bytes(e.odoh) + 2; } return t; }, write(e, t, s) { if (null != s.mandatory) { e.setUint16(t, 0); t = P.write(e, t + 2, s.mandatory); } if (null != s.alpn) { e.setUint16(t, 1); t = C.write(e, t + 2, s.alpn); } if (s["no-default-alpn"]) { e.setUint16(t, 2); e.setUint16(t + 2, 0); t += 4; } if (null != s.port) { e.setUint16(t, 3); t = k.write(e, t + 2, s.port); } if (s.ipv4hint) { e.setUint16(t, 4); t = O.write(e, t + 2, s.ipv4hint); } if (s.ipv6hint) { e.setUint16(t, 6); t = L.write(e, t + 2, s.ipv6hint); } if (s.echconfig) { e.setUint16(t, 5); t = v.write(e, t + 2, s.echconfig); } if (s.dohpath) { e.setUint16(t, 7); t = v.write(e, t + 2, s.dohpath); } if (s.odoh) { e.setUint16(t, 32769); t = v.write(e, t + 2, s.odoh); } return t; }, read(e, t) { const {length: s, offset: r} = t; const n = { mandatory: void 0, alpn: void 0, "no-default-alpn": !1, port: void 0, ipv4hint: void 0, ipv6hint: void 0, echconfig: void 0, dohpath: void 0, odoh: void 0 }; while (t.offset - r < s) { const s = e.getUint16(t.offset); advance(t, 2); switch (s) { case 0: n.mandatory = P.read(e, t); break; case 1: n.alpn = C.read(e, t); break; case 2: n["no-default-alpn"] = !0; advance(t, 2); break; case 3: n.port = k.read(e, t); break; case 4: n.ipv4hint = O.read(e, t); break; case 6: n.ipv6hint = L.read(e, t); break; case 5: n.echconfig = v.read(e, t); break; case 7: n.dohpath = f.decode(v.read(e, t)); break; case 32769: n.odoh = v.read(e, t); break; default: v.read(e, t); } } return n; } }; const x = withRDLength(u); const _ = withRDLength(d); const M = withRDLength(p); const V = withRDLength(w); const Y = withRDLength(array(y)); const H = withRDLength({ bytes: e => d.bytes(e.target) + 6, write(e, t, s) { e.setUint16(t, s.priority || 0); e.setUint16(t + 2, s.weight || 0); e.setUint16(t + 4, s.port || 0); return d.write(e, t + 6, s.target); }, read(e, t) { const s = { priority: 0, weight: 0, port: 0, target: "" }; s.priority = e.getUint16(t.offset); s.weight = e.getUint16(t.offset + 2); s.port = e.getUint16(t.offset + 4); advance(t, 6); s.target = d.read(e, t); return s; } }); const q = withRDLength({ bytes: e => y.bytes(e.cpu) + y.bytes(e.os), write(e, t, s) { t = y.write(e, t, s.cpu); return y.write(e, t, s.os); }, read: (e, t) => ({ cpu: y.read(e, t), os: y.read(e, t) }) }); const toCaaTag = e => { switch (e) { case "issue": case "issuewild": case "iodef": return e; default: return "issue"; } }; const K = withRDLength({ bytes: e => y.bytes(e.tag) + u.bytes(e.value) + 1, write(e, t, s) { let r = s.flags || 0; if (s.issuerCritical) { r |= 128; } e.setUint8(t, r); t = y.write(e, t + 1, s.tag); return u.write(e, t, s.value); }, read(e, t) { const s = e.getUint8(t.offset); advance(t, 1); return { flags: s, tag: toCaaTag(y.read(e, t)), value: u.read(e, t), issuerCritical: !!(128 & s) }; } }); const X = withRDLength({ bytes: e => d.bytes(e.mname) + d.bytes(e.rname) + 20, write(e, t, s) { t = d.write(e, t, s.mname); t = d.write(e, t, s.rname); e.setUint32(t, s.serial || 0); e.setUint32(t + 4, s.refresh || 0); e.setUint32(t + 8, s.retry || 0); e.setUint32(t + 12, s.expire || 0); e.setUint32(t + 16, s.minimum || 0); return t + 20; }, read(e, t) { const s = { mname: d.read(e, t), rname: d.read(e, t), serial: e.getUint32(t.offset), refresh: e.getUint32(t.offset + 4), retry: e.getUint32(t.offset + 8), expire: e.getUint32(t.offset + 12), minimum: e.getUint32(t.offset + 16) }; t.offset += 20; t.length -= 20; return s; } }); const $ = withRDLength({ bytes: e => d.bytes(e.exchange) + 2, write(e, t, s) { e.setUint16(t, s.preference || 0); return d.write(e, t + 2, s.exchange); }, read(e, t) { const s = { preference: e.getUint16(t.offset), exchange: "" }; advance(t, 2); s.exchange = d.read(e, t); return s; } }); const F = withRDLength({ bytes: e => u.bytes(e.key) + 4, write(e, t, s) { e.setUint16(t, s.flags); e.setUint8(t + 2, 3); e.setUint8(t + 3, s.algorithm); return u.write(e, t + 4, s.key); }, read(e, t) { const s = e.getUint16(t.offset); const r = e.getUint8(t.offset + 3); advance(t, 4); return { flags: s, algorithm: r, key: u.read(e, t) }; } }); const G = withRDLength({ bytes: e => 18 + d.bytes(e.signersName) + u.bytes(e.signature), write(e, t, s) { e.setUint16(t, s.typeCovered); e.setUint8(t + 2, s.algorithm); e.setUint8(t + 3, s.labels); e.setUint32(t + 4, s.originalTTL); e.setUint32(t + 8, s.expiration); e.setUint32(t + 12, s.inception); e.setUint16(t + 16, s.keyTag); t = d.write(e, t + 18, s.signersName); return u.write(e, t, s.signature); }, read(e, t) { const s = e.getUint16(t.offset); const r = e.getUint8(t.offset + 2); const n = e.getUint8(t.offset + 3); const a = e.getUint32(t.offset + 4); const i = e.getUint32(t.offset + 8); const o = e.getUint32(t.offset + 12); const c = e.getUint16(t.offset + 16); advance(t, 18); return { typeCovered: s, algorithm: r, labels: n, originalTTL: a, expiration: i, inception: o, keyTag: c, signersName: d.read(e, t), signature: u.read(e, t) }; } }); const B = withRDLength({ bytes: e => d.bytes(e.mbox) + d.bytes(e.txt), write(e, t, s) { t = d.write(e, t, s.mbox); return d.write(e, t, s.txt); }, read: (e, t) => ({ mbox: d.read(e, t), txt: d.read(e, t) }) }); const z = withRDLength({ bytes: e => d.bytes(e.nextDomain) + g.bytes(e.rrtypes), write(e, t, s) { t = d.write(e, t, s.nextDomain); return g.write(e, t, s.rrtypes); }, read: (e, t) => ({ nextDomain: d.read(e, t), rrtypes: g.read(e, t) }) }); const Q = withRDLength({ bytes: e => h.bytes(e.salt) + h.bytes(e.nextDomain) + g.bytes(e.rrtypes) + 4, write(e, t, s) { e.setUint8(t, s.algorithm); e.setUint8(t + 1, s.flags); e.setUint16(t + 2, s.iterations); t = h.write(e, t + 4, s.salt); t = h.write(e, t, s.nextDomain); return g.write(e, t, s.rrtypes); }, read(e, t) { const s = e.getUint8(t.offset); const r = e.getUint8(t.offset + 1); const n = e.getUint16(t.offset + 2); advance(t, 4); return { algorithm: s, flags: r, iterations: n, salt: h.read(e, t), nextDomain: h.read(e, t), rrtypes: g.read(e, t) }; } }); const j = withRDLength({ bytes: e => u.bytes(e.fingerprint) + 2, write(e, t, s) { e.setUint8(t, s.algorithm); e.setUint8(t + 1, s.hash); return u.write(e, t + 2, s.fingerprint); }, read(e, t) { const s = e.getUint8(t.offset); const r = e.getUint8(t.offset + 1); advance(t, 2); return { algorithm: s, hash: r, fingerprint: u.read(e, t) }; } }); const W = withRDLength({ bytes: e => u.bytes(e.digest) + 4, write(e, t, s) { e.setUint16(t, s.keyTag); e.setUint8(t + 2, s.algorithm); e.setUint8(t + 3, s.digestType); return u.write(e, t + 4, s.digest); }, read(e, t) { const s = e.getUint16(t.offset); const r = e.getUint8(t.offset + 2); const n = e.getUint8(t.offset + 3); advance(t, 4); return { keyTag: s, algorithm: r, digestType: n, digest: u.read(e, t) }; } }); const Z = withRDLength({ bytes: e => y.bytes(e.flags) + y.bytes(e.services) + y.bytes(e.regexp) + d.bytes(e.replacement) + 4, write(e, t, s) { e.setUint16(t, s.order); e.setUint16(t + 2, s.preference); t = y.write(e, t + 4, s.flags); t = y.write(e, t, s.services); t = y.write(e, t, s.regexp); return d.write(e, t, s.replacement); }, read(e, t) { const s = e.getUint16(t.offset); const r = e.getUint16(t.offset + 2); advance(t, 4); return { order: s, preference: r, flags: y.read(e, t), services: y.read(e, t), regexp: y.read(e, t), replacement: d.read(e, t) }; } }); const J = withRDLength({ bytes: e => u.bytes(e.certificate) + 3, write(e, t, s) { e.setUint8(t, s.usage); e.setUint8(t + 1, s.selector); e.setUint8(t + 2, s.matchingType); return u.write(e, t + 3, s.certificate); }, read(e, t) { const s = e.getUint8(t.offset); const r = e.getUint8(t.offset + 1); const n = e.getUint8(t.offset + 2); advance(t, 3); return { usage: s, selector: r, matchingType: n, certificate: u.read(e, t) }; } }); const ee = withRDLength({ bytes: e => d.bytes(e.name) + D.bytes(e.params) + 2, write(e, t, s) { e.setUint16(t, s.priority || 0); t = d.write(e, t + 2, s.name); return D.write(e, t, s.params); }, read(e, t) { const s = e.getUint16(t.offset); advance(t, 2); return { name: d.read(e, t), priority: s, params: D.read(e, t) }; } }); const te = withRDLength(array(R)); const se = { bytes(e) { const t = 8 + d.bytes(e.type === n.OPT ? "." : e.name); switch (e.type) { case n.A: return t + M.bytes(e.data); case n.NS: return t + _.bytes(e.data); case n.SOA: return t + X.bytes(e.data); case n.HINFO: return t + q.bytes(e.data); case n.MX: return t + $.bytes(e.data); case n.TXT: return t + Y.bytes(e.data); case n.RP: return t + B.bytes(e.data); case n.AAAA: return t + V.bytes(e.data); case n.SRV: return t + H.bytes(e.data); case n.NAPTR: return t + Z.bytes(e.data); case n.OPT: return t + te.bytes(e.data); case n.DS: return t + W.bytes(e.data); case n.SSHFP: return t + j.bytes(e.data); case n.RRSIG: return t + G.bytes(e.data); case n.NSEC: return t + z.bytes(e.data); case n.DNSKEY: return t + F.bytes(e.data); case n.NSEC3: return t + Q.bytes(e.data); case n.TLSA: return t + J.bytes(e.data); case n.SVCB: case n.HTTPS: return t + ee.bytes(e.data); case n.CAA: return t + K.bytes(e.data); case n.PTR: case n.CNAME: case n.DNAME: return t + _.bytes(e.data); default: return t + x.bytes(e.data); } }, write(e, t, s) { if (s.type === n.OPT) { t = d.write(e, t, "."); e.setUint16(t, s.type); e.setUint16(t + 2, s.udpPayloadSize || 4096); e.setUint8(t + 4, s.extendedRcode || 0); e.setUint8(t + 5, s.ednsVersion || 0); e.setUint16(t + 6, s.flags || 0); return te.write(e, t += 8, s.data); } t = d.write(e, t, s.name); e.setUint16(t, s.type); e.setUint16(t + 2, (s.class || 0) | (s.flush ? 32768 : 0)); e.setUint32(t + 4, s.ttl || 0); t += 8; switch (s.type) { case n.A: return M.write(e, t, s.data); case n.NS: return _.write(e, t, s.data); case n.SOA: return X.write(e, t, s.data); case n.HINFO: return q.write(e, t, s.data); case n.MX: return $.write(e, t, s.data); case n.TXT: return Y.write(e, t, s.data); case n.RP: return B.write(e, t, s.data); case n.AAAA: return V.write(e, t, s.data); case n.SRV: return H.write(e, t, s.data); case n.NAPTR: return Z.write(e, t, s.data); case n.DS: return W.write(e, t, s.data); case n.SSHFP: return j.write(e, t, s.data); case n.RRSIG: return G.write(e, t, s.data); case n.NSEC: return z.write(e, t, s.data); case n.DNSKEY: return F.write(e, t, s.data); case n.NSEC3: return Q.write(e, t, s.data); case n.TLSA: return J.write(e, t, s.data); case n.SVCB: case n.HTTPS: return ee.write(e, t, s.data); case n.CAA: return K.write(e, t, s.data); case n.PTR: case n.CNAME: case n.DNAME: return _.write(e, t, s.data); default: return x.write(e, t, s.data); } }, read(e, t) { const s = d.read(e, t); const r = e.getUint16(t.offset); if (r === n.OPT) { const s = e.getUint16(t.offset + 2) || 4096; const n = e.getUint8(t.offset + 4); const a = e.getUint8(t.offset + 5); const i = e.getUint16(t.offset + 6); advance(t, 8); return { type: r, udpPayloadSize: s, extendedRcode: n, ednsVersion: a, flags: i, data: te.read(e, t) }; } const a = e.getUint16(t.offset + 2); const i = e.getUint32(t.offset + 4); advance(t, 8); const o = { name: s, type: r, class: -32769 & a, flush: !!(32768 & a), ttl: i, data: null }; switch (o.type) { case n.A: o.data = M.read(e, t); return o; case n.NS: o.data = _.read(e, t); return o; case n.SOA: o.data = X.read(e, t); return o; case n.HINFO: o.data = q.read(e, t); return o; case n.MX: o.data = $.read(e, t); return o; case n.TXT: o.data = Y.read(e, t); return o; case n.RP: o.data = B.read(e, t); return o; case n.AAAA: o.data = V.read(e, t); return o; case n.SRV: o.data = H.read(e, t); return o; case n.NAPTR: o.data = Z.read(e, t); return o; case n.DS: o.data = W.read(e, t); return o; case n.SSHFP: o.data = j.read(e, t); return o; case n.RRSIG: o.data = G.read(e, t); return o; case n.NSEC: o.data = z.read(e, t); return o; case n.DNSKEY: o.data = F.read(e, t); return o; case n.NSEC3: o.data = Q.read(e, t); return o; case n.TLSA: o.data = J.read(e, t); return o; case n.SVCB: case n.HTTPS: o.data = ee.read(e, t); return o; case n.CAA: o.data = K.read(e, t); return o; case n.PTR: case n.CNAME: case n.DNAME: o.data = _.read(e, t); return o; default: o.data = x.read(e, t); return o; } } }; const compareAnswers = (e, t) => { if (e.type === n.OPT || t.type === n.OPT) { return 0; } const s = e.class || a.IN; const r = t.class || a.IN; if (s !== r) { return s - r; } else if (e.type !== t.type) { return e.type - t.type; } let i; switch (e.type) { case n.A: i = M; break; case n.NS: i = _; break; case n.SOA: i = X; break; case n.HINFO: i = q; break; case n.MX: i = $; break; case n.TXT: i = Y; break; case n.RP: i = B; break; case n.AAAA: i = V; break; case n.SRV: i = H; break; case n.NAPTR: i = Z; break; case n.DS: i = W; break; case n.SSHFP: i = j; break; case n.RRSIG: i = G; break; case n.NSEC: i = z; break; case n.DNSKEY: i = F; break; case n.NSEC3: i = Q; break; case n.TLSA: i = J; break; case n.SVCB: case n.HTTPS: i = ee; break; case n.CAA: i = K; break; case n.PTR: case n.CNAME: case n.DNAME: i = _; break; default: i = x; } const o = encodeIntoBuffer(i, e.data); const c = encodeIntoBuffer(i, t.data); const f = o.byteLength < c.byteLength ? o.byteLength : c.byteLength; for (let e = 2; e < f; e++) { const t = o[e] - c[e]; if (0 !== t) { return t < 0 ? -1 : 1; } } return o.byteLength !== c.byteLength ? o.byteLength < c.byteLength ? -1 : 1 : 0; }; const readList = (e, t, s, r) => { if (!r) { return; } const {offset: n, length: a} = s; const i = []; for (let o = 0; o < r && s.offset - n < a; o++) { i.push(e.read(t, s)); } return i; }; const re = { bytes(e) { const {questions: t, answers: s, authorities: r, additionals: n} = e; let a = 12; let i = 0; for (i = 0; t && i < t.length; i++) { a += A.bytes(t[i]); } for (i = 0; s && i < s.length; i++) { a += se.bytes(s[i]); } for (i = 0; r && i < r.length; i++) { a += se.bytes(r[i]); } for (i = 0; n && i < n.length; i++) { a += se.bytes(n[i]); } return a; }, write(e, t, s) { const {questions: n, answers: a, authorities: i, additionals: o} = s; let c = 32767 & (s.flags || 0) | (s.type || r.QUERY) | (s.rtype || 0); e.setUint16(t, s.id || 0); e.setUint16(t + 2, c); e.setUint16(t + 4, s.questions?.length || 0); e.setUint16(t + 6, s.answers?.length || 0); e.setUint16(t + 8, s.authorities?.length || 0); e.setUint16(t + 10, s.additionals?.length || 0); t += 12; let f = 0; for (f = 0; n && f < n.length; f++) { t = A.write(e, t, n[f]); } for (f = 0; a && f < a.length; f++) { t = se.write(e, t, a[f]); } for (f = 0; i && f < i.length; f++) { t = se.write(e, t, i[f]); } for (f = 0; o && f < o.length; f++) { t = se.write(e, t, o[f]); } return t; }, read(e, t) { const s = e.getUint16(t.offset); const n = e.getUint16(t.offset + 2); const a = e.getUint16(t.offset + 4); const i = e.getUint16(t.offset + 6); const o = e.getUint16(t.offset + 8); const c = e.getUint16(t.offset + 10); advance(t, 12); return { id: s, flags: n, rtype: 15 & n, type: n & r.RESPONSE ? r.RESPONSE : r.QUERY, questions: readList(A, e, t, a), answers: readList(se, e, t, i), authorities: readList(se, e, t, o), additionals: readList(se, e, t, c) }; } }; function encode(e) { const t = new ArrayBuffer(re.bytes(e)); const s = re.write(new DataView(t), 0, e); return new Uint8Array(t, 0, s); } const ne = (() => { let t = null; let s = null; return () => { if (!t) { t = e.networkInterfaces(); } if (!s) { s = Promise.resolve().then(() => t = s = null); } return t; }; })(); const hasScopeid = e => null != e.scopeid && e.scopeid > 0; let ae; const hostname = () => ae || (ae = e.hostname()); const hammingWeight = e => { e = (e = (858993459 & (e -= e >> 1 & 1431655765)) + (e >> 2 & 858993459)) + (e >> 4) & 252645135; return 127 & (e += e >> 8) + (e >> 16); }; const getIPv6PrefixFromNetmask = e => e.split(":").map(e => e && parseInt(e, 16) || 0).reduce((e, t) => e + hammingWeight(t), 0); const getIPv4PrefixFromNetmask = e => e.split(".").map(e => e && parseInt(e, 10) || 0).reduce((e, t) => e + hammingWeight(t), 0); let ie = !1; const sanitizeLabel = e => e.trim().replace(/\.local\.?$/i, "").replace(/[^a-zA-Z0-9-]/g, "-").replace(/^-+|-+$/g, "").toLowerCase().slice(0, fe); const srvAnswer = (e, t) => ({ type: n.SRV, class: a.IN, name: e.fqdnOut, ttl: t, flush: !0, data: { priority: 0, weight: 0, port: e.port, target: e.host } }); const txtAnswer = (e, t) => ({ type: n.TXT, class: a.IN, name: e.fqdnOut, ttl: t, flush: !0, data: e.txt }); const ptrAnswer = (e, t, s) => ({ type: n.PTR, class: a.IN, name: e, ttl: s, flush: !1, data: t }); const ptrAnswers = (e, t) => [ ptrAnswer(e.domain, e.fqdnOut, t), ptrAnswer(de, e.domain, t), ...Object.keys(e.subtypes).map(s => ptrAnswer(s, e.fqdnOut, t)) ]; const aAnswers = (e, t, s) => t.filter(e => e.family === oe.v4).map(t => ({ type: n.A, class: a.IN, name: e.host, ttl: s, flush: !0, data: t.address })); const aaaaAnswers = (e, t, s) => t.filter(e => e.family === oe.v6).map(t => ({ type: n.AAAA, class: a.IN, name: e.host, ttl: s, flush: !0, data: t.address })); const answers = (e, t, s) => [ ...ptrAnswers(e, s), srvAnswer(e, s), txtAnswer(e, s), ...aAnswers(e, t, s), ...aaaaAnswers(e, t, s) ]; const authorities = (e, t, s) => [ ...aAnswers(e, t, s), txtAnswer(e, s), ...aaaaAnswers(e, t, s), srvAnswer(e, s) ]; const checkAnswerConflicts = (e, t, s) => { let r = 0; const a = new Set; const i = new Set; for (const s of e) { const e = s.name?.toLowerCase(); if (s.type === n.SRV && e === t.fqdnIn && (s.data.port !== t.port || s.data.target.toLowerCase() !== t.host)) { r |= 1; } else if (s.type === n.A && e === t.host) { a.add(s.data.toLowerCase()); } else if (s.type === n.AAAA && e === t.host) { i.add(s.data.toLowerCase()); } } if (a.size || i.size) { let e = 0; let t = 0; for (const n of s) { if (n.family === oe.v4) { e++; if (a.size && !a.has(n.address)) { r |= 2; break; } } else if (n.family === oe.v6) { t++; if (i.size && !i.has(n.address)) { r |= 4; break; } } } if (a.size && e !== a.size) { r |= 2; } if (i.size && t !== i.size) { r |= 4; } } return r; }; const checkResponseConflicts = (e, t, s) => { let n = 0; if (e.type === r.RESPONSE) { if (e.answers?.length) { n |= checkAnswerConflicts(e.answers, t, s); } if (e.additionals?.length) { n |= checkAnswerConflicts(e.additionals, t, s); } } return n; }; const responseMessage = (e, t, s, a) => { if (e.type !== r.QUERY || !e.questions?.length) { return null; } const o = Object.create(null); let c = !1; let f = !1; let l = !1; let d = !1; if (e.answers) { for (const s of e.answers) { const e = s.name?.toLowerCase(); switch (s.type) { case n.SRV: c ||= e === t.fqdnIn; break; case n.TXT: f ||= e === t.fqdnIn; break; case n.A: l ||= e === t.host; break; case n.AAAA: d ||= e === t.host; break; case n.PTR: switch (e) { case t.domain: if (s.data.toLowerCase() === t.fqdnIn) { o[t.domain] = !0; } break; case de: if (s.data.toLowerCase() === t.domain) { o[de] = !0; } break; default: if (e && t.subtypes[e] && s.data.toLowerCase() === t.fqdnIn) { o[e] = !0; } } } } } const u = []; const h = []; for (const r of e.questions) { if (!!r.qu !== a) { continue; } const e = r.name.toLowerCase(); switch (r.type) { case n.SRV: if (!c && e === t.fqdnIn) { u.push(srvAnswer(t, t.ttl)); c = !0; } break; case n.TXT: if (!f && e === t.fqdnIn) { u.push(txtAnswer(t, t.ttl)); f = !0; } break; case n.A: if (!l && e === t.host) { u.push(...aAnswers(t, s, t.ttl)); l = !0; } break; case n.AAAA: if (!d && e === t.host) { u.push(...aaaaAnswers(t, s, t.ttl)); d = !0; } break; case n.PTR: switch (e) { case t.domain: if (!o[t.domain]) { u.push(ptrAnswer(t.domain, t.fqdnOut, t.ttl)); o[t.domain] = !0; } break; case de: if (!o[de]) { u.push(ptrAnswer(de, t.domain, t.ttl)); o[de] = !0; } break; default: if (t.subtypes[e]) { u.push(ptrAnswer(e, t.fqdnOut, t.ttl)); o[e] = !0; } } break; case n.ANY: switch (e) { case t.fqdnIn: if (!c) { u.push(srvAnswer(t, t.ttl)); c = !0; } if (!f) { u.push(txtAnswer(t, t.ttl)); f = !0; } break; case t.host: if (!l) { u.push(...aAnswers(t, s, t.ttl)); l = !0; } if (!d) { u.push(...aaaaAnswers(t, s, t.ttl)); d = !0; } break; case t.domain: if (!o[t.domain]) { u.push(ptrAnswer(t.domain, t.fqdnOut, t.ttl)); o[t.domain] = !0; } break; case de: if (!o[de]) { u.push(ptrAnswer(de, t.domain, t.ttl)); o[de] = !0; } break; default: if (t.subtypes[e]) { u.push(ptrAnswer(e, t.fqdnOut, t.ttl)); o[e] = !0; } } } } if (o[t.domain] && !c) { h.push(srvAnswer(t, t.ttl)); c = !0; } if (o[t.domain] && !f) { h.push(txtAnswer(t, t.ttl)); f = !0; } if (c && !l) { h.push(...aAnswers(t, s, t.ttl)); l = !0; } if (c && !d) { h.push(...aaaaAnswers(t, s, t.ttl)); d = !0; } if (u.length > 0) { return encode({ type: r.RESPONSE, flags: i.AUTHORITATIVE_ANSWER, answers: u, additionals: h }); } else { return null; } }; const createSocketSettings = (e, t) => { const s = t === oe.v4 ? ce.v4 : ce.v6; const r = ((e, t) => { let s = ne()[e]?.filter(e => e.family === t).map(s => ({ ...s, family: t, iname: e })); if (s && t === oe.v6) { s?.sort((e, t) => { if (e.address.startsWith("fe80:")) { return 1; } else if (t.address.startsWith("fe80:")) { return -1; } else { return e.address < t.address ? -1 : 1; } }); } return s?.length ? s : void 0; })(e, t); if (!r?.length) { return null; } const n = new Set; let a; if (t === oe.v4) { a = r[0].address; for (const e of r) { n.add(e.address); } } else { const t = "win32" === process.platform ? r.find(hasScopeid)?.scopeid.toString() : e; if (!t) { return null; } n.add(a = `::%${t}`); } return { family: t, bindings: r, memberships: n, multicastAddress: s, multicastInterface: a }; }; const addMembership = (e, t, s) => { try { e.addMembership(t.multicastAddress, s); return !0; } catch (e) { return !1; } }; const dropMembership = (e, t, s) => { try { e.dropMembership(t.multicastAddress, s); return !0; } catch { return !1; } }; const createInterfaceSocket = (e, r, n) => { const a = []; let i = null; let o = initSocket(); function initSocket() { const a = createSocketSettings(e, r); if (!a) { return null; } let i; if ("linux" === process.platform) { const e = new s.BlockList; for (const t of a.bindings) { if (t.family === oe.v4) { e.addSubnet(t.address, getIPv4PrefixFromNetmask(t.netmask), "ipv4"); } else { e.addSubnet(t.address, getIPv6PrefixFromNetmask(t.netmask), "ipv6"); } } const t = r === oe.v4 ? "ipv4" : "ipv6"; i = s => e.check(s, t); } const o = t.createSocket(r === oe.v4 ? { type: "udp4", reuseAddr: !0 } : { type: "udp6", reuseAddr: !0, ipv6Only: !0 }); o.unref(); o.on("message", async (t, s) => { let a = -1; if (r === oe.v6 && (a = s.address.indexOf("%")) > -1) { if (s.address.slice(a + 1) !== e) { return; } } else if (-1 === a && i && !i(s.address)) { return; } try { await n.onMessage(t, { socket: c, family: "IPv6" === s.family ? oe.v6 : oe.v4, address: s.address, port: s.port, reply: e => send(e, s.address, s.port) }); } catch {} }); scheduleTimer(new Promise((e, t) => { o.prependOnceListener("error", t); o.prependOnceListener("close", closeSocket); o.bind(le, () => { try { setupSocket(o, a); e(); } catch (e) { closeSocket(); t(e); } finally { o.removeListener("error", t); o.on("error", closeSocket); } }); })); return { settings: a, socket: o }; } function setupSocket(e, t) { const s = t !== o?.settings ? o?.settings : null; let r = !!s && s.multicastInterface !== t.multicastInterface; try { e.setMulticastTTL(255); e.setMulticastLoopback(!0); e.setMulticastInterface(t.multicastInterface); } catch { closeSocket(); return !1; } if (s) { for (const n of s.memberships) { if (!t.memberships.has(n)) { dropMembership(e, s, n); r = !0; } } } for (const n of t.memberships) { if (!s?.memberships.has(n)) { if (!addMembership(e, t, n)) { t.memberships.delete(n); } else if (s) { r = !0; } } } if (!t.memberships.size) { closeSocket(); return !1; } else if (o) { o.settings = t; } return r; } function closeSocket() { if (o) { const {socket: e} = o; o = null; try { e.close(); } catch {} } } function sendImmediate(e) { try { if (o) { o.socket.send(e.message, 0, e.message.byteLength, e.port, e.address, e.onSent); } else { e.onSent(null); } } catch (t) { e.onSent(t); } } function flushQueue(e) { if (null === e || i === e) { i = null; } let t; while (!i && null != (t = a.shift())) { sendImmediate(t); } } function scheduleTimer(e = function waitTick() { return new Promise(e => setTimeout(e, 0).unref()); }()) { if (!i) { const t = i = e.then(() => flushQueue(t), () => flushQueue(null)); } } async function send(e, t, s) { return new Promise((r, n) => { scheduleTimer(); a.push({ message: e, address: t, port: s, onSent(e) { if (null != e) { n(e); } else { r(); } } }); }); } const c = { get closed() { return !o; }, get bindings() { return o?.settings.bindings ?? []; }, async send(e) { if (o) { await send(e, o.settings.multicastAddress, le); } }, refresh() { if (o) { const t = createSocketSettings(e, r); if (t) { return setupSocket(o.socket, t); } else { closeSocket(); return !1; } } else { o = initSocket(); return !!o; } }, close() { closeSocket(); flushQueue(null); } }; return c; }; let oe = function(e) { e.v4 = "IPv4"; e.v6 = "IPv6"; return e; }({}); let ce = function(e) { e.v4 = "224.0.0.251"; e.v6 = "ff02::fb"; return e; }({}); const fe = 63; const le = 5353; const de = "_services._dns-sd._udp.local"; const ue = { onError() {}, createSocket: (e, t) => { let s; let r = null; if ("IPv4" === t.stack) { s = createInterfaceSocket(e, oe.v4, t); } else if ("IPv6" === t.stack) { s = createInterfaceSocket(e, oe.v6, t); } else { s = createInterfaceSocket(e, oe.v4, t); r = createInterfaceSocket(e, oe.v6, t); } return { get closed() { return s.closed && (!r || r.closed); }, get bindings() { return r ? [ ...s.bindings, ...r.bindings ] : s.bindings; }, async send(e) { await Promise.all([ s.send(e), r?.send(e) ]); }, refresh() { const e = !!s.refresh(); const t = !!r?.refresh(); return e || t; }, close() { s.close(); r?.close(); } }; }, createScheduler: function createScheduler() { const e = new Set; return { schedule: async function schedule(t, s) { return await async function schedule(r, n) { if (!n) { n = getDelay(t, r); } return new Promise(async (a, i) => { const o = Math.max(n, 20); const c = runTimer(t, o, async () => { e.delete(onCancel); let o = !1; try { let e; if (s) { e = await s({ attempt: r, retry(e) { o = !0; return schedule(r + 1, e); } }); } a(e); } catch (e) { if (!o && shouldRetry(t, r)) { schedule(r + 1, n).then(a, i); } else { i(e); } } }); function onCancel() { i(new AbortError); c(); } e.add(onCancel); }); }(0); }, cancel() { for (const t of e) { t(); } e.clear(); } }; }, createServiceInput: e => ({ ...e, nameSeed: 0, hostnameSeed: ie && e.hostname === hostname() ? 1 : 0 }), createServiceRecord: e => { const t = ((e, t) => { let s = sanitizeLabel(e); if (t) { ie ||= e === hostname(); const r = /[-_](\d+)$/.exec(s); if (r) { const e = s.slice(0, -r[0].length); const n = `-${(parseInt(r[1], 10) || t) + 1}`; s = e.slice(0, fe - n.length) + n; } else { const e = `-${t + 1}`; s = s.slice(0, fe - e.length) + e; } } return s; })(e.hostname, e.hostnameSeed); const s = ((e, t, s) => { const r = (e => e.trim().replace(/\.+/, "_").slice(0, fe))(e); if (s) { const e = ` (${((e, t) => { const s = `${hostname()}:${e}`; let r = 5381; if (0 !== t) { r = (r << 5) + r + (255 & t); } for (let e = 0, t = s.length; e < t; e++) { r = (r << 5) + r + s.charCodeAt(e); } return (65535 & r).toString(16).toUpperCase().padStart(4, "0"); })(t, s - 1)})`; return r.slice(0, fe - e.length) + e; } else { return r; } })(e.name, e.port, e.nameSeed); const r = `_${sanitizeLabel(e.type)}._${sanitizeLabel(e.protocol)}.local`; const n = `${s}.${r}`; const a = []; for (const t in e.txt) { const s = e.txt[t]; if ("string" == typeof s || "number" == typeof s) { a.push(`${t}=${s}`); } else if ("boolean" == typeof s && s) { a.push(t); } } return { domain: r, fqdnOut: n, fqdnIn: n.toLowerCase(), host: `${t}.local`, port: e.port >>> 0, subtypes: (e.subtypes || []).reduce((e, t) => { e[`${(e => e.trim().replace(/[^a-zA-Z0-9-_.]/g, "-").replace(/^-+|-+$/g, "").toLowerCase())(t)}._sub.${r}`] = !0; return e; }, Object.create(null)), txt: a, ttl: e.ttl }; }, networkInterfaceNames: () => { const e = []; const t = ne(); for (const s in t) { const r = t[s]; if (r?.some(e => !e.internal)) { e.push(s); } } return e.length ? e : Object.keys(t); }, hostname }; const he = new Map; const randomDelay = (e, t) => e + Math.floor(Math.random() * (t - e + 1)); const shouldRetry = (e, t) => { switch (e) { case 0: case 1: return t < 4; case 2: return t < 3; case 3: return !0; } }; const getDelay = (e, t) => { switch (e) { case 0: return randomDelay(20, 120); case 1: return t ? 250 : randomDelay(0, 250); case 2: return t ? 1e3 * 2 ** (Math.min(t, 3) - 1) : 0; case 3: return 6e3; } }; const runTimer = (e, t, s) => { const r = Date.now() + t; let n = he.get(e); let a; if (n) { for (const t of n) { if (3 === e || Math.abs(t.time - r) <= 100) { a = t; break; } } } else { n = new Set; he.set(e, n); } if (!a) { const e = setTimeout(() => { n.delete(a); for (const e of a.tasks) { e(); } }, t); if ("unref" in e) { e.unref(); } n.add(a = { time: r, tasks: new Set, timeout: e }); } a.tasks.add(s); return () => { a.tasks.delete(s); if (!a.tasks.size) { clearTimeout(a.timeout); n.delete(a); } }; }; class AbortError extends Error { static isAbortError(e) { return e && "object" == typeof e && "AbortError" === e.name; } constructor() { super("Operation cancelled"); this.name = "AbortError"; } } function createInterfaceAdvertiser(e, t, s) { const o = s.createServiceInput(t); const c = s.createScheduler(); let f = 0; let l = 0; let d = s.createServiceRecord(o); let u = 0; let h = 0; const y = s.createSocket(e, { stack: t.stack, async onMessage(e, t) { if (3 === u) { return; } const a = function decode(e) { const t = "buffer" in e ? new DataView(e.buffer, e.byteOffset, e.byteLength) : new DataView(e); return re.read(t, { offset: 0, length: t.byteLength }); }(e); if (0 === u) { l++; if (a.type === r.QUERY) { const e = ((e, t, s) => { if (e.type !== r.QUERY || !e.questions?.length || !e.authorities?.length) { return 0; } if (!e.questions.some(e => { const s = e.name.toLowerCase(); return (e => e.type === n.ANY || e.type === n.A || e.type === n.AAAA || e.type === n.SRV || e.type === n.TXT || e.type === n.PTR)(e) && (s === t.host || s === t.fqdnIn); })) { return 0; } const a = ((e, t) => { e.sort(compareAnswers); t.sort(compareAnswers); const s = e.length < t.length ? e.length : t.length; for (let r = 0; r < s; r++) { const s = compareAnswers(e[r], t[r]); if (0 !== s) { return s; } } return e.length !== t.length ? e.length < t.length ? -1 : 1 : 0; })(authorities(t, s, t.ttl), e.authorities.filter(e => e.name?.toLowerCase() === t.host || e.name?.toLowerCase() === t.fqdnIn)); if (a < 0) { return checkAnswerConflicts(e.authorities, t, s); } else { return 0; } })(a, d, y.bindings); h |= 0 !== e ? 8 | e : 0; } else if (a.type === r.RESPONSE) { h |= checkResponseConflicts(a, d, y.bindings); } } else if (2 === u) { h = checkResponseConflicts(a, d, y.bindings); if (resolveConflicts()) { u = 0; } else { try { await async function sendReply(e, t) { const s = responseMessage(e, d, y.bindings, !1); const r = responseMessage(e, d, y.bindings, !0); await Promise.all([ s && c.schedule(0, () => t.reply(s)), r && c.schedule(0, () => y.send(r)) ]); }(a, t); } catch (e) { if (!AbortError.isAbortError(e)) { s.onError(e); } } } } } }); async function sendAnnouncement() { const e = ((e, t) => encode({ type: r.RESPONSE, flags: i.AUTHORITATIVE_ANSWER, answers: answers(e, t, e.ttl) }))(d, y.bindings); await c.schedule(0, () => y.send(e)); } function resolveConflicts() { if (0 !== h) { if (1 & h) { o.nameSeed++; } if (6 & h) { o.hostnameSeed++; } d = s.createServiceRecord(o); h = 0; return !0; } else { return !1; } } function next() { switch (u) { case 0: return async function probe() { f = 0; l = 0; h = 0; let e = 3; await c.schedule(1, async t => { const s = 8 & h; if (y.closed) { u = 3; return; } else if (0 !== u) { return; } else if (resolveConflicts()) { e += 4; if (++f < 15) { return t.retry(s ? 1e3 : void 0); } else { u = 3; } } else if (t.attempt < e) { await async function sendProbe() { const e = ((e, t) => encode({ type: r.QUERY, questions: [ { name: e.fqdnOut, type: n.ANY, class: a.IN, qu: !0 }, { name: e.host, type: n.ANY, class: a.IN, qu: !0 } ], authorities: authorities(e, t, e.ttl) }))(d, y.bindings); await c.schedule(0, () => y.send(e)); }(); return t.retry(); } else { u = l ? 0 === h ? 2 : 3 : u = 3; } }); return next(); }(); case 2: return async function announce() { while (2 === u && !y.closed) { if (!await c.schedule(2, async e => { if (2 !== u) { return !1; } else if (e.attempt > 2 && y.refresh()) { return !0; } if (!y.closed) { await sendAnnouncement(); if (e.attempt < 3) { return e.retry(); } } return !1; })) { await c.schedule(3, async e => { if (2 !== u) { return; } else if (!y.refresh() && !y.closed) { return e.retry(); } }); } } return next(); }(); case 3: return async function reopen() { c.cancel(); while (3 === u && f < 15) { f++; await c.schedule(3, async e => { if (3 !== u) { return; } if (!y.refresh() || y.closed) { return e.retry(); } u = 0; }); } return next(); }(); } } let g = !1; return { promise: (async () => { try { u = 0; await next(); c.cancel(); } catch (e) { if (!AbortError.isAbortError(e)) { s.onError(e); } } finally { if (!g) { y.close(); c.cancel(); } } })(), async close() { try { g = !0; c.cancel(); if (3 !== u) { u = 3; await async function sendGoodbye() { const e = ((e, t) => encode({ type: r.RESPONSE, flags: i.AUTHORITATIVE_ANSWER, answers: answers(e, t, 0) }))(d, y.bindings); await c.schedule(0, () => y.send(e)); }(); } } catch (e) { if (!AbortError.isAbortError(e)) { s.onError(e); } } finally { c.cancel(); y.close(); } } }; } exports.advertise = function advertise(e) { let t = null; if ("IPv4" === e.stack) { t = "IPv4"; } else if ("IPv6" === e.stack) { t = "IPv6"; } return function advertiseInternal(e, t) { const s = new Set(t.networkInterfaceNames()); const r = new Map; const n = t.createScheduler(); for (const n of s) { r.set(n, createInterfaceAdvertiser(n, e, t)); } n.schedule(3, s => { try { const s = new Set(t.networkInterfaceNames()); for (const n of s) { if (!r.has(n)) { r.set(n, createInterfaceAdvertiser(n, e, t)); } } for (const [e, t] of r) { if (!s.has(e)) { r.delete(e); t.close(); } } } catch (e) { if (!AbortError.isAbortError(e)) { t.onError(e); } } return s.retry(); }).catch(e => { if (!AbortError.isAbortError(e)) { t.onError(e); } }); return async () => { n.cancel(); try { await Promise.all([ ...r.values() ].map(e => e.close())); } catch (e) { if (!AbortError.isAbortError(e)) { t.onError(e); } } }; }({ name: e.name, type: e.type, protocol: e.protocol, hostname: e.hostname || ue.hostname(), port: e.port, subtypes: e.subtypes || [], txt: e.txt || {}, ttl: e.ttl || 120, stack: t }, ue); }; //# sourceMappingURL=dnssd-advertise.js.map