UNPKG

airplay-js

Version:

JS Native Apple AirPlay client library for AppleTV

116 lines (91 loc) 2.74 kB
/** * node-airplay * * @file bojour server * @author zfkun(zfkun@msn.com) * @thanks https://github.com/benvanik/node-airplay/blob/master/lib/airplay/browser.js */ var util = require( 'util' ); var events = require( 'events' ); //var mdns = require( 'mdns' ); var mdns = require( 'mdns-js' ); var Device = require( './device' ).Device; var Browser = function( options ) { events.EventEmitter.call( this ); this.init( options ); }; util.inherits( Browser, events.EventEmitter ); exports.Browser = Browser; Browser.prototype.init = function ( options ) { var self = this; var nextDeviceId = 0; this.devices = {}; this.addresses = [] var browser = mdns.createBrowser(mdns.tcp('airplay')); browser.on('ready', function () { browser.discover(); }); browser.on('serviceUp', function(data) { if(data.port && data.port == 7000 && self.addresses.indexOf(data.address) < 0){ var info = [data.address] var name = data.name self.addresses.push(data.address) device = new Device( nextDeviceId++, info , name ); device.on( 'ready', function( d ) { self.emit( 'deviceOn', d ); }); device.on( 'close', function( d ) { delete self.devices[ d.id ]; self.emit( 'deviceOff', d ); }); self.devices[ device.id ] = device; } }); browser.on('serviceDown', function(info) { if ( !self.isValid( info ) ) { return; } var device = self.getDevice( info ); if ( device ) { device.close(); } }); }; Browser.prototype.start = function () { this.emit( 'start' ); return this; }; Browser.prototype.stop = function() { this.emit( 'stop' ); return this; }; Browser.prototype.isValid = function ( info ) { if ( !info || !/^en\d+$/.test( info.networkInterface ) ) { return !1; } return !0; }; Browser.prototype.getDevice = function ( info ) { for ( var deviceId in this.devices ) { var device = this.devices[ deviceId ]; if ( device.match( info ) ) { return device; } } }; Browser.prototype.getDeviceById = function ( deviceId, skipCheck ) { var device = this.devices[ deviceId ]; if ( device && ( skipCheck || device.isReady() ) ) { return device; } }; Browser.prototype.getDevices = function ( skipCheck ) { var devices = []; for ( var deviceId in this.devices ) { var device = this.devices[ deviceId ]; if ( skipCheck || device.isReady() ) { devices.push( device ); } } return devices; };