import * as initBonjour from 'bonjour'; import {Bonjour, RemoteService} from 'bonjour'; import {API} from './api'; export class APIDiscovery { private constructor() {} static async search(duration: number = 10000): Promise { const apis: API[] = []; const bonjour: Bonjour = initBonjour(); bonjour.find({ type: 'soundtouch', protocol: 'tcp', }, (service) => { const api = _APIFromService(service); if(api) { apis.push(api); } }); await new Promise((resolve) => setTimeout(resolve, duration)); bonjour.destroy(); return apis; } static async find(name: string, duration: number = 10000): Promise { return new Promise((resolve) => { const bonjour: Bonjour = initBonjour(); let timer = setTimeout(() => { bonjour.destroy(); resolve(undefined); }, duration); bonjour.find({ type: 'soundtouch', protocol: 'tcp', }, (service) => { if (service && service.name === name) { const api = _APIFromService(service); if (api) { clearTimeout(timer); bonjour.destroy(); resolve(api); } } }); }); } } function _APIFromService(service?: RemoteService): API | undefined { if(service && service.addresses.length > 0) { const ipAddress = service.addresses[0]; return new API({ ip: ipAddress, host: service.host, port: service.port, name: service.name, mac: service.txt['mac'], manufacturer: service.txt['manufacturer'], model: service.txt['model'] }); } return undefined; }