1
|
'use strict'
|
2
|
|
3
|
var os = require('os')
|
4
|
var util = require('util')
|
5
|
var EventEmitter = require('events').EventEmitter
|
6
|
var serviceName = require('multicast-dns-service-types')
|
7
|
var txt = require('dns-txt')()
|
8
|
|
9
|
var TLD = '.local'
|
10
|
|
11
|
module.exports = Service
|
12
|
|
13
|
util.inherits(Service, EventEmitter)
|
14
|
|
15
|
function Service (opts) {
|
16
|
if (!opts.name) throw new Error('Required name not given')
|
17
|
if (!opts.type) throw new Error('Required type not given')
|
18
|
if (!opts.port) throw new Error('Required port not given')
|
19
|
|
20
|
this.name = opts.name
|
21
|
this.protocol = opts.protocol || 'tcp'
|
22
|
this.type = serviceName.stringify(opts.type, this.protocol)
|
23
|
this.host = opts.host || os.hostname()
|
24
|
this.port = opts.port
|
25
|
this.fqdn = this.name + '.' + this.type + TLD
|
26
|
this.subtypes = opts.subtypes || null
|
27
|
this.txt = opts.txt || null
|
28
|
this.published = false
|
29
|
|
30
|
this._activated = false // indicates intent - true: starting/started, false: stopping/stopped
|
31
|
}
|
32
|
|
33
|
Service.prototype._records = function () {
|
34
|
var records = [rr_ptr(this), rr_srv(this), rr_txt(this)]
|
35
|
|
36
|
var self = this
|
37
|
var interfaces = os.networkInterfaces()
|
38
|
Object.keys(interfaces).forEach(function (name) {
|
39
|
interfaces[name].forEach(function (addr) {
|
40
|
if (addr.internal) return
|
41
|
if (addr.family === 'IPv4') {
|
42
|
records.push(rr_a(self, addr.address))
|
43
|
} else {
|
44
|
records.push(rr_aaaa(self, addr.address))
|
45
|
}
|
46
|
})
|
47
|
})
|
48
|
|
49
|
return records
|
50
|
}
|
51
|
|
52
|
function rr_ptr (service) {
|
53
|
return {
|
54
|
name: service.type + TLD,
|
55
|
type: 'PTR',
|
56
|
ttl: 28800,
|
57
|
data: service.fqdn
|
58
|
}
|
59
|
}
|
60
|
|
61
|
function rr_srv (service) {
|
62
|
return {
|
63
|
name: service.fqdn,
|
64
|
type: 'SRV',
|
65
|
ttl: 120,
|
66
|
data: {
|
67
|
port: service.port,
|
68
|
target: service.host
|
69
|
}
|
70
|
}
|
71
|
}
|
72
|
|
73
|
function rr_txt (service) {
|
74
|
return {
|
75
|
name: service.fqdn,
|
76
|
type: 'TXT',
|
77
|
ttl: 4500,
|
78
|
data: txt.encode(service.txt)
|
79
|
}
|
80
|
}
|
81
|
|
82
|
function rr_a (service, ip) {
|
83
|
return {
|
84
|
name: service.host,
|
85
|
type: 'A',
|
86
|
ttl: 120,
|
87
|
data: ip
|
88
|
}
|
89
|
}
|
90
|
|
91
|
function rr_aaaa (service, ip) {
|
92
|
return {
|
93
|
name: service.host,
|
94
|
type: 'AAAA',
|
95
|
ttl: 120,
|
96
|
data: ip
|
97
|
}
|
98
|
}
|