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