mdns-server.js 4.2 KB

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