|
|
- '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
- }
- }
|