mdns-server.js 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. "use strict";
  2. var __importDefault = (this && this.__importDefault) || function (mod) {
  3. return (mod && mod.__esModule) ? mod : { "default": mod };
  4. };
  5. Object.defineProperty(exports, "__esModule", { value: true });
  6. exports.Server = void 0;
  7. const multicast_dns_1 = __importDefault(require("multicast-dns"));
  8. const es6_1 = __importDefault(require("fast-deep-equal/es6"));
  9. const dns_equal_1 = __importDefault(require("./utils/dns-equal"));
  10. class Server {
  11. constructor(opts, errorCallback) {
  12. this.registry = {};
  13. this.mdns = (0, multicast_dns_1.default)(opts);
  14. this.mdns.setMaxListeners(0);
  15. this.mdns.on('query', this.respondToQuery.bind(this));
  16. this.errorCallback = errorCallback !== null && errorCallback !== void 0 ? errorCallback : function (err) { throw err; };
  17. }
  18. register(records) {
  19. const shouldRegister = (record) => {
  20. var subRegistry = this.registry[record.type];
  21. if (!subRegistry) {
  22. subRegistry = this.registry[record.type] = [];
  23. }
  24. else if (subRegistry.some(this.isDuplicateRecord(record))) {
  25. return;
  26. }
  27. subRegistry.push(record);
  28. };
  29. if (Array.isArray(records)) {
  30. records.forEach(shouldRegister);
  31. }
  32. else {
  33. shouldRegister(records);
  34. }
  35. }
  36. unregister(records) {
  37. const shouldUnregister = (record) => {
  38. let type = record.type;
  39. if (!(type in this.registry)) {
  40. return;
  41. }
  42. this.registry[type] = this.registry[type].filter((i) => i.name !== record.name);
  43. };
  44. if (Array.isArray(records)) {
  45. records.forEach(shouldUnregister);
  46. }
  47. else {
  48. shouldUnregister(records);
  49. }
  50. }
  51. respondToQuery(query) {
  52. let self = this;
  53. query.questions.forEach((question) => {
  54. var type = question.type;
  55. var name = question.name;
  56. var answers = type === 'ANY'
  57. ? Object.keys(self.registry).map(self.recordsFor.bind(self, name)).flat(1)
  58. : self.recordsFor(name, type);
  59. if (answers.length === 0)
  60. return;
  61. var additionals = [];
  62. if (type !== 'ANY') {
  63. answers.forEach((answer) => {
  64. if (answer.type !== 'PTR')
  65. return;
  66. additionals = additionals
  67. .concat(self.recordsFor(answer.data, 'SRV'))
  68. .concat(self.recordsFor(answer.data, 'TXT'));
  69. });
  70. additionals
  71. .filter(function (record) {
  72. return record.type === 'SRV';
  73. })
  74. .map(function (record) {
  75. return record.data.target;
  76. })
  77. .filter(this.unique())
  78. .forEach(function (target) {
  79. additionals = additionals
  80. .concat(self.recordsFor(target, 'A'))
  81. .concat(self.recordsFor(target, 'AAAA'));
  82. });
  83. }
  84. self.mdns.respond({ answers: answers, additionals: additionals }, (err) => {
  85. if (err) {
  86. this.errorCallback(err);
  87. }
  88. });
  89. });
  90. }
  91. recordsFor(name, type) {
  92. if (!(type in this.registry)) {
  93. return [];
  94. }
  95. return this.registry[type].filter((record) => {
  96. var _name = ~name.indexOf('.') ? record.name : record.name.split('.')[0];
  97. return (0, dns_equal_1.default)(_name, name);
  98. });
  99. }
  100. isDuplicateRecord(a) {
  101. return (b) => {
  102. return a.type === b.type &&
  103. a.name === b.name &&
  104. (0, es6_1.default)(a.data, b.data);
  105. };
  106. }
  107. unique() {
  108. var set = [];
  109. return (obj) => {
  110. if (~set.indexOf(obj))
  111. return false;
  112. set.push(obj);
  113. return true;
  114. };
  115. }
  116. }
  117. exports.Server = Server;
  118. exports.default = Server;
  119. //# sourceMappingURL=mdns-server.js.map