mdns-discovery
Advanced tools
Comparing version 0.0.5 to 0.1.1
"use strict"; | ||
var debug = require('debug')('mdns-discovery'); | ||
var dgram = require("dgram"); | ||
@@ -7,3 +8,4 @@ var packet = require('dns-packet'); | ||
var defaultOptions = { | ||
name: 'm_d_n_s', | ||
//name: 'm_d_n_s', | ||
nsme: '', | ||
port: 5353, | ||
@@ -15,3 +17,3 @@ ip: "224.0.0.251", | ||
q: { | ||
name: '_amzn-wplay._tcp.local', | ||
name: '', | ||
type: 'PTR', | ||
@@ -21,2 +23,4 @@ class: 0x8001 | ||
timeout: 4, | ||
broadcast: true, | ||
multicast: true, | ||
multicastTTL: 64, | ||
@@ -28,3 +32,13 @@ ttl: 64 | ||
function checkOptions(opts, def) { | ||
function MulticastDNS(opts) { | ||
if (this instanceof MulticastDNS === false) { | ||
return new MulticastDNS(opts); | ||
} | ||
this.setOptions(opts); | ||
this.clients = []; | ||
this.found = []; | ||
} | ||
function checkOptions (opts, def) { | ||
//opts = opts || {}; | ||
@@ -50,27 +64,2 @@ def = def || defaultOptions; | ||
function MulticastDNS(opts) { | ||
if (this instanceof MulticastDNS === false) { | ||
return new MulticastDNS(opts); | ||
} | ||
this.setOptions(opts); | ||
// opts.name = opts.name || 'm_d_n_s'; | ||
// opts.port = opts.port || 5353; | ||
// opts.ip = opts.ip || "224.0.0.251"; | ||
// opts.reuseAddr = opts.reuseAddr !== false; | ||
// opts.interfaces = opts.interfaces || []; | ||
// opts.type = opts.type || 'udp4'; | ||
// opts.q = opts.q || {}; | ||
// opts.q.name = opts.q.name || '_amzn-wplay._tcp.local'; | ||
// opts.q.type = opts.q.type || dnsjs.DNSRecord.Type.PTR; | ||
// opts.q.class = opts.q.class || 0x8001; | ||
// if (opts.timeout === undefined) opts.timeout = 30; | ||
// if (opts.multicastTTL === undefined) opts.multicastTTL = 64; | ||
// if (opts.ttl === undefined) opts.ttl = 64; | ||
this.options = opts; | ||
this.clients = []; | ||
this.found = []; | ||
} | ||
MulticastDNS.prototype.setOptions = function (opts) { | ||
@@ -80,5 +69,9 @@ opts = opts || {}; | ||
opts.q.name = opts.q.name || opts.name; | ||
var to = opts.timeout; | ||
checkOptions(opts); | ||
if (!opts.find && !to) opts.timeout = 0; | ||
this.options = opts; | ||
} | ||
MulticastDNS.prototype.getInterfaces = function () { | ||
@@ -94,2 +87,3 @@ if (this.options.interfaces && this.options.interfaces.length) return; | ||
self.options.interfaces.push(alias.address); | ||
debug("found interface: %s", alias.address); | ||
} | ||
@@ -99,34 +93,6 @@ } | ||
}; | ||
MulticastDNS.prototype.browse = MulticastDNS.prototype.run; | ||
MulticastDNS.prototype.getPayloadx = function () { | ||
var payload = new Buffer( | ||
[].concat([0x00, 0x00, // ID | ||
0x00, 0x00, // fixed | ||
0x00, 0x01, // QDCount: number of entries in the Question Section | ||
0x00, 0x00, | ||
0x00, 0x00, | ||
0x00, 0x00 | ||
], | ||
this.options.name.length, | ||
this.options.name.split("").map(function (letter) { | ||
return letter.charCodeAt(0); | ||
}), | ||
"local".length, | ||
"local".split("").map(function (letter) { | ||
return letter.charCodeAt(0); | ||
}), | ||
0x00, // NULL terminate | ||
[0x00, 0x01, // QTYPE | ||
0x80, 0x01 // QCLASS | ||
// http://tools.ietf.org/html/draft-cheshire-dnsext-multicastdns-06#section-6.5 | ||
// Multicast DNS defines the top bit in the class field of a DNS question as the "unicast response" bit. | ||
] | ||
) | ||
); | ||
return payload; | ||
}; | ||
MulticastDNS.prototype.getPayload = function () { | ||
var message = packet.encode({ | ||
@@ -147,5 +113,7 @@ questions: [this.options.q] | ||
}; | ||
MulticastDNS.prototype.onError = function (err) { | ||
}; | ||
MulticastDNS.prototype.prepare = function (interfaceIp) { | ||
@@ -155,5 +123,8 @@ | ||
client.on("message", this.onMessage.bind(this)); | ||
//client.on("message", this.onMessage.bind(this)); | ||
client.on("message", function(message, rinfo) { | ||
this.onMessage(message, rinfo); | ||
}.bind(this)); | ||
client.on("listening", function() { | ||
console.log("listening on ",client.address()); | ||
debug("listening on ",client.address()); | ||
@@ -170,5 +141,7 @@ client.setBroadcast(this.options.broadcast !== false); | ||
if (this.options.ttl) client.setTTL(this.options.ttl); | ||
var payload = this.getPayload(); | ||
client.send(payload, 0, payload.length, this.options.port, this.options.ip, function(err, bytes) { | ||
}); | ||
if (this.options.q.name) { | ||
var payload = this.getPayload(); | ||
client.send(payload, 0, payload.length, this.options.port, this.options.ip, function (err, bytes) { | ||
}); | ||
} | ||
}.bind(this)); | ||
@@ -182,2 +155,3 @@ client.on("close", this.onClose.bind(this)); | ||
MulticastDNS.prototype.close = function () { | ||
@@ -194,3 +168,9 @@ if (this.timer) { | ||
MulticastDNS.prototype.run = function (readyCallback) { | ||
MulticastDNS.prototype.run = function (timeout, readyCallback) { | ||
if (typeof timeout === 'function') { | ||
readyCallback = timeout; | ||
timeout = undefined; | ||
} | ||
if (timeout === undefined) timeout = this.options.timeout; | ||
this.getInterfaces(); | ||
@@ -200,8 +180,15 @@ this.options.interfaces.forEach(function(interfaceIp) { | ||
}.bind(this)); | ||
if (this.options.timeout) this.timer = setTimeout(function() { | ||
if (timeout) this.timer = setTimeout(function() { | ||
this.close(); | ||
if (debug.enabled) { | ||
this.found.foreEach(function(info) { | ||
debug("found: %s - %s", info.ip, info.name); | ||
}); | ||
} | ||
readyCallback && readyCallback(this.found); | ||
}.bind(this), this.options.timeout * 1000); | ||
}.bind(this), timeout * 1000); | ||
return this; | ||
}; | ||
MulticastDNS.prototype.onPacket = function (packets, rinfo) { | ||
@@ -213,3 +200,3 @@ //this.options.find = 'amzn.dmgr:'; | ||
if (a.name.indexOf(this.options.find) === 0) { | ||
var found = this.found.find(function(v) { //xxxx | ||
var found = this.found.find(function(v) { | ||
return v.ip === rinfo.address; | ||
@@ -224,4 +211,32 @@ }); | ||
}.bind(this)); | ||
return this; | ||
}; | ||
MulticastDNS.prototype.on = function (name, fn) { | ||
switch(name) { | ||
case 'packet': this.__proto__.onPacket = fn; break; | ||
case 'message': this.__proto__.onMessage = fn; break; | ||
} | ||
return this; | ||
} | ||
MulticastDNS.prototype.onIP = function (ip, fn) { | ||
var args = arguments; | ||
if (args.length < 2) return; | ||
fn = args[args.length-1]; | ||
if (typeof fn !== 'function') return; | ||
if (!this.onIPs) this.onIPs = []; | ||
fn = fn.bind(this); | ||
for (var i=0; i<args.length-1; i++) { | ||
this.onIPs.push({ | ||
ip: args[i], | ||
fn: fn | ||
}); | ||
} | ||
return this; | ||
} | ||
MulticastDNS.prototype.onMessage = function (message, rinfo) { | ||
@@ -237,9 +252,14 @@ | ||
//var s = message.toString(); | ||
console.log(rinfo.address); | ||
var m = packet.decode(message); | ||
if (packets.answers) packets.answers.forEach(function(packet, i) { | ||
//console.log('packet[%d]=%s type=%s class=%d, ttl=%d', i, packet.name, packet.type, packet.class, packet.ttl); | ||
console.log(`packet[${i}]=${packet.name}, type=${packet.type}, class=${packet.class}, ttl=${packet.ttl}}`); | ||
if (this.onIPs) { | ||
var found = this.onIPs.find(function(entry) { | ||
return (entry.ip === rinfo.address); | ||
}); | ||
if (found) found.fn(packets, rinfo); | ||
} | ||
if (debug.enabled && packets.answers) packets.answers.forEach(function(packet, i) { | ||
//debug('packet[%d]=%s type=%s class=%d, ttl=%d', i, packet.name, packet.type, packet.class, packet.ttl); | ||
debug(`${rinfo.address} - packet[${i}]=${packet.name}, type=${packet.type}, class=${packet.class}, ttl=${packet.ttl}}`); | ||
}); | ||
return this; | ||
}; | ||
@@ -249,3 +269,1 @@ | ||
module.exports = MulticastDNS; | ||
//new MulticastDNS().run(); |
{ | ||
"name": "mdns-discovery", | ||
"version": "0.0.5", | ||
"version": "0.1.1", | ||
"description": "Multicast DNS", | ||
@@ -20,10 +20,11 @@ "author": { | ||
"broadcast", | ||
"datagram", | ||
"dgram", | ||
"multicast", | ||
"discovery" | ||
"datagram", | ||
"dgram", | ||
"multicast", | ||
"discovery" | ||
], | ||
"dependencies": { | ||
"dgram": "^1.0.1", | ||
"dns-packet": "^1.1.1" | ||
"dns-packet": "^1.1.1", | ||
"debug": "~2.2.0" | ||
}, | ||
@@ -33,3 +34,3 @@ "devDependencies": { | ||
"chai": "^3.4.1" | ||
}, | ||
}, | ||
"scripts": { | ||
@@ -46,3 +47,7 @@ "test": "node node_modules/mocha/bin/mocha" | ||
"main": "mdns-discovery.js", | ||
"readmeFilename": "readme.md" | ||
"readmeFilename": "readme.md", | ||
"readme": "###mnds Multicast DNS\r\n<!--\r\n[![NPM version](http://img.shields.io/npm/v/soef.svg)](https://www.npmjs.com/package/soef)\r\n[![Tests](http://img.shields.io/travis/soef/soef/master.svg)](https://travis-ci.org/soef/soef)\r\n[![Build status](https://ci.appveyor.com/api/projects/status/njb3gh6f49motmuk?svg=true)](https://ci.appveyor.com/project/soef/soef)\r\n-->\r\n\r\n[![License](https://img.shields.io/badge/license-MIT-blue.svg?style=flat)](https://github.com/soef/soef/blob/master/LICENSE)\r\n\r\n", | ||
"_id": "mdns-discovery@0.0.4", | ||
"_shasum": "25b2ade419133ded1f4e9198f5143a33a099a8ec", | ||
"_from": "mdns-discovery@latest" | ||
} |
@@ -10,1 +10,42 @@ ###mnds Multicast DNS | ||
####Some Examples: | ||
Find all Amazon Fire TV devices on the local network: | ||
``` | ||
var Mdns = require('mdns-discovery'); | ||
var mdns = new Mdns({ timeout: 5, name: '_amzn-wplay._tcp.local', find: 'amzn.dmgr:'}); | ||
mdns.run (function(res) { | ||
res.forEach(enry) { | ||
console.log(entry); | ||
} | ||
}); | ||
``` | ||
List all mdns questions and answers for 10 seconds: | ||
``` | ||
var Mdns = require('mdns-discovery'); | ||
var mdns = new Mdns({ timeout: 10 }); | ||
mdns.on('packet', function (packets, rinfo) { | ||
if (packets.answers) packets.answers.forEach(function(packet, i) { | ||
console.log(`A: ${rinfo.address} - packet[${i}]=${packet.name}, type=${packet.type}, class=${packet.class}, ttl=${packet.ttl}}`); | ||
}); | ||
if (packets.questions) packets.questions.forEach(function(packet, i) { | ||
console.log(`Q: ${rinfo.address} - packet[${i}]=${packet.name}, type=${packet.type}, class=${packet.class}, ttl=${packet.ttl}}`); | ||
}); | ||
}); | ||
mdns.run (); | ||
``` | ||
Presence: | ||
``` | ||
var mdns = require('mdns-discovery')(); | ||
mdns.onIP('192.168.1.31', function (packet, rinfo) { | ||
if (packet.answers.length) { | ||
console.log(rinfo.address + ' is present'); | ||
} | ||
}).run (); | ||
``` |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
11824
211
51
3
+ Addeddebug@~2.2.0
+ Addeddebug@2.2.0(transitive)
+ Addedms@0.7.1(transitive)