'use strict'; const pkg = imports.package; pkg.require({ 'Gdk': '3.0' , 'Gio': '2.0' , 'GLib': '2.0' , 'GObject': '2.0' , 'Gtk': '3.0' }); const {Gdk, Gio, GLib, Gtk, GObject, Avahi, AvahiCore} = imports.gi; const Signals = imports.signals; // address.h const PROTO_UNSPEC = -1; const IF_UNSPEC = -1; // AvahiLookupFlags const LOOKUP_USE_WIDE_AREA = 1; const LOOKUP_USE_MULTICAST = 2; const LOOKUP_NO_TXT = 4; const LOOKUP_NO_ADDRESS = 8; // AvahiLookupResultFlags const LOOKUP_RESULT_CACHED = 1; const LOOKUP_RESULT_WIDE_AREA = 2; const LOOKUP_RESULT_MULTICAST = 4; const LOOKUP_RESULT_LOCAL = 8; const LOOKUP_RESULT_OUR_OWN = 16; const LOOKUP_RESULT_STATIC = 32; const DNS_TYPE_A = 0x01; const DNS_TYPE_NS = 0x02; const DNS_TYPE_CNAME = 0x05; const DNS_TYPE_SOA = 0x06; const DNS_TYPE_PTR = 0x0C; const DNS_TYPE_HINFO = 0x0D; const DNS_TYPE_MX = 0x0F; const DNS_TYPE_TXT = 0x10; const DNS_TYPE_AAAA = 0x1C; const DNS_TYPE_SRV = 0x2; const DNS_CLASS_IN = 0x01; //log(imports.gi.GIRepository.Repository.get_default().is_registered('AvahiCore', '0.6')); const SNAPCAST_AVAHI_TCP = '_snapcast-tcp._tcp'; const SNAPCAST_AVAHI_STREAM = '_snapcast-stream._tcp'; const SNAPCAST_AVAHI_RCP = '_snapcast-rpc._tcp'; var AvahiSnapcast = class { constructor() { this.servers = {}; } enable() { this.aclient = new Avahi.Client({flags: Avahi.ClientFlags.GA_CLIENT_FLAG_NO_FAIL}); this.aclient.connect('state-changed', () => { log('AVAHI: state-changed') }); this.aclient.start(); this.abrowser = Avahi.ServiceBrowser.new_full(-1, AvahiCore.Protocol.INET, SNAPCAST_AVAHI_TCP, 'local', 0); this.abrowser.attach(this.aclient); this.abrowser.connect('all-for-now', () => { log('AVAHI: all-for-now') this.emit('all-for-now'); }); this.abrowser.connect('removed-service', (browser, if_index, protocol, name, service, domain, flags) => { this.removeServer(name); }); this.abrowser.connect('cache-exhausted', () => {log('AVAHI: cache exhausted')}); this.abrowser.connect('new-service', (browser, if_index, protocol, name, service, domain, flags) => { log('AVAHI: new-service') let aresolver = Avahi.ServiceResolver.new(if_index, protocol, name, service, domain, AvahiCore.Protocol.INET, 0); aresolver.attach(this.aclient); aresolver.connect('found', (resolver, if_index, protocol, name, service, domain, hostname, address, port, txt, flags, e) => { let ip = Gio.Resolver.get_default().lookup_by_name(hostname, null)[0].to_string(); this.addServer(name, hostname, domain, ip, port); }); }); } addServer(name, hostname, domain, ip, port) { if (name in this.servers) { return; } this.servers[name] = { name: name , hostname: hostname , domain: domain , ip: ip , port: port } log('AVAHI NEW: ' + JSON.stringify(this.servers[name])); this.emit('added', this.servers[name]); } removeServer(name) { if (name in this.servers) { delete this.servers[name]; log('AVAHI REMOVE: ' + name); this.emit('removed', name); } } server(name) { return this.servers[name]; } }; Signals.addSignalMethods(AvahiSnapcast.prototype); /* const avahiInterface = '\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ '; var Avahi = class Avahi { constructor() { const avahiProxy = Gio.DBusProxy.makeProxyWrapper(avahiInterface); this.proxy = new avahiProxy( Gio.DBus.system , 'org.freedesktop.Avahi' , '/' ); } } let derp = new Avahi(); let path = derp.proxy.ServiceBrowserNewSync(-1, -1, '_tcp', 'local', 0); var iface = 'org.freedesktop.Avahi.DomainBrowser'; derp.proxy.connectSignal('ItemNew', function(proxy, result) { log(proxy); }); derp.proxy.connectSignal('AllForNow', function(proxy, result) { log(proxy); }); derp.proxy.connectSignal('StateChanged', function(proxy, result) { log(proxy); }); */ //let loop = new GLib.MainLoop(null, false); //loop.run();