You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
98 lines
2.0 KiB
98 lines
2.0 KiB
'use strict' |
|
|
|
var os = require('os') |
|
var util = require('util') |
|
var EventEmitter = require('events').EventEmitter |
|
var serviceName = require('multicast-dns-service-types') |
|
var txt = require('dns-txt')() |
|
|
|
var TLD = '.local' |
|
|
|
module.exports = Service |
|
|
|
util.inherits(Service, EventEmitter) |
|
|
|
function Service (opts) { |
|
if (!opts.name) throw new Error('Required name not given') |
|
if (!opts.type) throw new Error('Required type not given') |
|
if (!opts.port) throw new Error('Required port not given') |
|
|
|
this.name = opts.name |
|
this.protocol = opts.protocol || 'tcp' |
|
this.type = serviceName.stringify(opts.type, this.protocol) |
|
this.host = opts.host || os.hostname() |
|
this.port = opts.port |
|
this.fqdn = this.name + '.' + this.type + TLD |
|
this.subtypes = opts.subtypes || null |
|
this.txt = opts.txt || null |
|
this.published = false |
|
|
|
this._activated = false // indicates intent - true: starting/started, false: stopping/stopped |
|
} |
|
|
|
Service.prototype._records = function () { |
|
var records = [rr_ptr(this), rr_srv(this), rr_txt(this)] |
|
|
|
var self = this |
|
var interfaces = os.networkInterfaces() |
|
Object.keys(interfaces).forEach(function (name) { |
|
interfaces[name].forEach(function (addr) { |
|
if (addr.internal) return |
|
if (addr.family === 'IPv4') { |
|
records.push(rr_a(self, addr.address)) |
|
} else { |
|
records.push(rr_aaaa(self, addr.address)) |
|
} |
|
}) |
|
}) |
|
|
|
return records |
|
} |
|
|
|
function rr_ptr (service) { |
|
return { |
|
name: service.type + TLD, |
|
type: 'PTR', |
|
ttl: 28800, |
|
data: service.fqdn |
|
} |
|
} |
|
|
|
function rr_srv (service) { |
|
return { |
|
name: service.fqdn, |
|
type: 'SRV', |
|
ttl: 120, |
|
data: { |
|
port: service.port, |
|
target: service.host |
|
} |
|
} |
|
} |
|
|
|
function rr_txt (service) { |
|
return { |
|
name: service.fqdn, |
|
type: 'TXT', |
|
ttl: 4500, |
|
data: txt.encode(service.txt) |
|
} |
|
} |
|
|
|
function rr_a (service, ip) { |
|
return { |
|
name: service.host, |
|
type: 'A', |
|
ttl: 120, |
|
data: ip |
|
} |
|
} |
|
|
|
function rr_aaaa (service, ip) { |
|
return { |
|
name: service.host, |
|
type: 'AAAA', |
|
ttl: 120, |
|
data: ip |
|
} |
|
}
|
|
|