123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120 |
- "use strict";
- var __importDefault = (this && this.__importDefault) || function (mod) {
- return (mod && mod.__esModule) ? mod : { "default": mod };
- };
- Object.defineProperty(exports, "__esModule", { value: true });
- exports.Server = void 0;
- const array_flatten_1 = __importDefault(require("array-flatten"));
- const es6_1 = __importDefault(require("fast-deep-equal/es6"));
- const multicast_dns_1 = __importDefault(require("multicast-dns"));
- const dns_equal_1 = __importDefault(require("dns-equal"));
- class Server {
- constructor(opts, errorCallback) {
- this.registry = {};
- this.mdns = (0, multicast_dns_1.default)(opts);
- this.mdns.setMaxListeners(0);
- this.mdns.on('query', this.respondToQuery.bind(this));
- this.errorCallback = errorCallback !== null && errorCallback !== void 0 ? errorCallback : function (err) { throw err; };
- }
- register(records) {
- const shouldRegister = (record) => {
- var subRegistry = this.registry[record.type];
- if (!subRegistry) {
- subRegistry = this.registry[record.type] = [];
- }
- else if (subRegistry.some(this.isDuplicateRecord(record))) {
- return;
- }
- subRegistry.push(record);
- };
- if (Array.isArray(records)) {
- records.forEach(shouldRegister);
- }
- else {
- shouldRegister(records);
- }
- }
- unregister(records) {
- const shouldUnregister = (record) => {
- let type = record.type;
- if (!(type in this.registry)) {
- return;
- }
- this.registry[type] = this.registry[type].filter((i) => i.name !== record.name);
- };
- if (Array.isArray(records)) {
- records.forEach(shouldUnregister);
- }
- else {
- shouldUnregister(records);
- }
- }
- respondToQuery(query) {
- let self = this;
- query.questions.forEach((question) => {
- var type = question.type;
- var name = question.name;
- var answers = type === 'ANY'
- ? array_flatten_1.default.depth(Object.keys(self.registry).map(self.recordsFor.bind(self, name)), 1)
- : self.recordsFor(name, type);
- if (answers.length === 0)
- return;
- var additionals = [];
- if (type !== 'ANY') {
- answers.forEach((answer) => {
- if (answer.type !== 'PTR')
- return;
- additionals = additionals
- .concat(self.recordsFor(answer.data, 'SRV'))
- .concat(self.recordsFor(answer.data, 'TXT'));
- });
- additionals
- .filter(function (record) {
- return record.type === 'SRV';
- })
- .map(function (record) {
- return record.data.target;
- })
- .filter(this.unique())
- .forEach(function (target) {
- additionals = additionals
- .concat(self.recordsFor(target, 'A'))
- .concat(self.recordsFor(target, 'AAAA'));
- });
- }
- self.mdns.respond({ answers: answers, additionals: additionals }, (err) => {
- if (err) {
- this.errorCallback(err);
- }
- });
- });
- }
- recordsFor(name, type) {
- if (!(type in this.registry)) {
- return [];
- }
- return this.registry[type].filter((record) => {
- var _name = ~name.indexOf('.') ? record.name : record.name.split('.')[0];
- return (0, dns_equal_1.default)(_name, name);
- });
- }
- isDuplicateRecord(a) {
- return (b) => {
- return a.type === b.type &&
- a.name === b.name &&
- (0, es6_1.default)(a.data, b.data);
- };
- }
- unique() {
- var set = [];
- return (obj) => {
- if (~set.indexOf(obj))
- return false;
- set.push(obj);
- return true;
- };
- }
- }
- exports.Server = Server;
- exports.default = Server;
- //# sourceMappingURL=mdns-server.js.map
|