| 507 | 0x01 - A |
| 508 | */ |
| 509 | reply(response, mask, service, bye = false, from, host = service.host) { |
| 510 | const build = response ? false : true; |
| 511 | if (build) response = new Serializer({query: false, opcode: DNS.OPCODE.QUERY, authoritative: true}); |
| 512 | bye = bye ? 0 : 0xFFFFFFF; |
| 513 | const instanceName = service?.instanceName ?? host; |
| 514 | |
| 515 | if (0x20 & mask) // NSEC indicating A only |
| 516 | response.add(DNS.SECTION.ANSWER, host + "." + LOCAL, DNS.RR.NSEC, DNS.CLASS.IN | DNSSD.FLUSH, TTL & bye, |
| 517 | {next: host + "." + LOCAL, bitmaps: Uint8Array.of(0, 4, 0x40, 0, 0, 0)}); |
| 518 | |
| 519 | if (0x10 & mask) // PTR for service discovery |
| 520 | response.add(DNS.SECTION.ANSWER, "_services._dns-sd._udp.local", DNS.RR.PTR, DNS.CLASS.IN, TTL & bye, "_" + service.name + "._" + service.protocol + "." + LOCAL); |
| 521 | |
| 522 | if (0x08 & mask) // PTR |
| 523 | response.add(DNS.SECTION.ANSWER, "_" + service.name + "._" + service.protocol + "." + LOCAL, DNS.RR.PTR, DNS.CLASS.IN, TTL & bye, instanceName + "._" + service.name + "._" + service.protocol + "." + LOCAL); |
| 524 | |
| 525 | if ((0x04 & mask) && service.txt) // TXT |
| 526 | response.add(DNS.SECTION.ANSWER, instanceName + "._" + service.name + "._" + service.protocol + "." + LOCAL, DNS.RR.TXT, DNS.CLASS.IN | ((0x8000 & mask) ? DNSSD.FLUSH : 0), TTL & bye, service.txt); |
| 527 | |
| 528 | if (0x02 & mask) // SRV |
| 529 | response.add(DNS.SECTION.ANSWER, instanceName + "._" + service.name + "._" + service.protocol + "." + LOCAL, DNS.RR.SRV, DNS.CLASS.IN, 120 & bye, |
| 530 | {priority: 0, weight: 0, port: service.port, target: host + "." + LOCAL}); |
| 531 | |
| 532 | if (0x01 & mask) // A |
| 533 | response.add(DNS.SECTION.ANSWER, host + "." + LOCAL, DNS.RR.A, DNS.CLASS.IN | DNSSD.FLUSH, 120 & bye, Net.get("IP", from)); |
| 534 | |
| 535 | if (!build) |
| 536 | return; |
| 537 | |
| 538 | return response.build(); |
| 539 | } |
| 540 | |
| 541 | /* |
| 542 | Probe |