1*3f982cf4SFabien Sanglard// Copyright 2018 The Chromium Authors. All rights reserved. 2*3f982cf4SFabien Sanglard// Use of this source code is governed by a BSD-style license that can be 3*3f982cf4SFabien Sanglard// found in the LICENSE file. 4*3f982cf4SFabien Sanglard 5*3f982cf4SFabien Sanglardpackage osp 6*3f982cf4SFabien Sanglard 7*3f982cf4SFabien Sanglard// TODO(jophba): 8*3f982cf4SFabien Sanglard// - Make our own abstraction that has 9*3f982cf4SFabien Sanglard// .InstanceName, .HostName, .MetadataVersion, .FingerPrint 10*3f982cf4SFabien Sanglard// rather than using mdns.ServiceEntry 11*3f982cf4SFabien Sanglard// - Advertise TXT (text below) with "fp" and "mv" 12*3f982cf4SFabien Sanglard 13*3f982cf4SFabien Sanglardimport ( 14*3f982cf4SFabien Sanglard "context" 15*3f982cf4SFabien Sanglard 16*3f982cf4SFabien Sanglard mdns "github.com/grandcat/zeroconf" 17*3f982cf4SFabien Sanglard) 18*3f982cf4SFabien Sanglard 19*3f982cf4SFabien Sanglardconst ( 20*3f982cf4SFabien Sanglard MdnsServiceType = "_openscreen._udp" 21*3f982cf4SFabien Sanglard MdnsDomain = "local" 22*3f982cf4SFabien Sanglard) 23*3f982cf4SFabien Sanglard 24*3f982cf4SFabien Sanglard// Returns a channel of mDNS entries. The critical parts are 25*3f982cf4SFabien Sanglard// entry.Target (service name) entry.HostName, entry.AddrIPv4, and 26*3f982cf4SFabien Sanglard// entry.AddrIPv6. 27*3f982cf4SFabien Sanglardfunc BrowseMdns(ctx context.Context) (<-chan *mdns.ServiceEntry, error) { 28*3f982cf4SFabien Sanglard entries := make(chan *mdns.ServiceEntry) 29*3f982cf4SFabien Sanglard 30*3f982cf4SFabien Sanglard resolver, err := mdns.NewResolver(nil) 31*3f982cf4SFabien Sanglard if err != nil { 32*3f982cf4SFabien Sanglard return entries, err 33*3f982cf4SFabien Sanglard } 34*3f982cf4SFabien Sanglard 35*3f982cf4SFabien Sanglard err = resolver.Browse(ctx, MdnsServiceType, MdnsDomain, entries) 36*3f982cf4SFabien Sanglard return entries, err 37*3f982cf4SFabien Sanglard} 38*3f982cf4SFabien Sanglard 39*3f982cf4SFabien Sanglard// Returns a channel of mDNS entries. The critical parts are, 40*3f982cf4SFabien Sanglard// entry.HostName, entry.AddrIPv4, and entry.AddrIPv6. 41*3f982cf4SFabien Sanglardfunc LookupMdns(ctx context.Context, target string) (<-chan *mdns.ServiceEntry, error) { 42*3f982cf4SFabien Sanglard entries := make(chan *mdns.ServiceEntry) 43*3f982cf4SFabien Sanglard 44*3f982cf4SFabien Sanglard resolver, err := mdns.NewResolver(nil) 45*3f982cf4SFabien Sanglard if err != nil { 46*3f982cf4SFabien Sanglard return entries, err 47*3f982cf4SFabien Sanglard } 48*3f982cf4SFabien Sanglard 49*3f982cf4SFabien Sanglard err = resolver.Lookup(ctx, target, MdnsServiceType, MdnsDomain, entries) 50*3f982cf4SFabien Sanglard return entries, err 51*3f982cf4SFabien Sanglard} 52*3f982cf4SFabien Sanglard 53*3f982cf4SFabien Sanglardfunc RunMdnsServer(ctx context.Context, instance string, port int) error { 54*3f982cf4SFabien Sanglard var text []string 55*3f982cf4SFabien Sanglard server, err := mdns.Register(instance, MdnsServiceType, MdnsDomain, port, text, nil /* ifaces */) 56*3f982cf4SFabien Sanglard if err != nil { 57*3f982cf4SFabien Sanglard return err 58*3f982cf4SFabien Sanglard } 59*3f982cf4SFabien Sanglard waitUntilDone(ctx) 60*3f982cf4SFabien Sanglard server.Shutdown() 61*3f982cf4SFabien Sanglard return nil 62*3f982cf4SFabien Sanglard} 63