@collight/dns-sd
Version:
A DNS Service Discovery implementation in modern TypeScript
3 lines (2 loc) • 1.5 kB
JavaScript
import"../utils/debug.js";import{nameEquals as f,decodeTXT as c}from"../utils/dns-utils.js";import"events";import"fast-deep-equal";import"multicast-dns";import{ServiceType as p}from"../utils/ServiceType.js";class d{constructor(o,r,i,s,t,e,n){this.name=o,this.fqdn=r,this.host=i,this.port=s,this.referer=t,this.ttl=e,this.lastSeen=n,this.subtypes=[],this.addresses=[];const a=p.fromString(r.split(".").slice(1,-1).join("."));this.type=a.name,this.protocol=a.protocol}static fromResponse(o,r){const i=[];for(const t of[...o.answers,...o.additionals])"ttl"in t&&t.ttl!==void 0&&t.ttl>0&&i.push(t);const s=[];for(const t of i)if(t.type==="PTR"){const e=this.fromPTR(t,i,r);e&&s.push(e)}return s}static fromPTR(o,r,i){let s;for(const t of r)if(t.type==="SRV"&&f(t.name,o.data)){const e=t.name,n=e.split(".")[0];if(n===void 0)return console.error("Invalid service name",n),null;const a=t.data.target,l=t.data.port;s=new d(n,e,a,l,i,o.ttl,Date.now())}if(!s)return null;for(const t of r)t.type==="TXT"&&f(t.name,o.data)&&(s.txt=c(t.data,!1),s.binaryTxt=c(t.data,!0),s.rawTxt=t.data);for(const t of r)if(t.type==="PTR"&&f(t.data,o.data)&&t.name.includes("._sub")){const e=p.fromString(t.name);e.subtype!==void 0&&s.subtypes.push(e.subtype)}for(const t of r)(t.type==="A"||t.type==="AAAA")&&s.host&&f(t.name,s.host)&&s.addresses.push(t.data);return s}get expired(){return this.ttl!==void 0&&Date.now()>this.lastSeen+this.ttl*1e3}}export{d as DiscoveredService};
//# sourceMappingURL=DiscoveredService.js.map