99 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			99 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
'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
 | 
						|
  }
 | 
						|
}
 |