| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 | 'use strict'var os = require('os')var util = require('util')var EventEmitter = require('events').EventEmittervar serviceName = require('multicast-dns-service-types')var txt = require('dns-txt')()var TLD = '.local'module.exports = Serviceutil.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  }}
 |