func (m *mdnsRegistry) ListServices() ([]*registry.Service, error) { p := mdns.DefaultParams("_services") p.Timeout = m.opts.Timeout entryCh := make(chan *mdns.ServiceEntry, 10) p.Entries = entryCh exit := make(chan bool) defer close(exit) serviceMap := make(map[string]bool) var services []*registry.Service go func() { for { select { case e := <-entryCh: if e.TTL == 0 { continue } name := strings.TrimSuffix(e.Name, "."+p.Service+"."+p.Domain+".") if !serviceMap[name] { serviceMap[name] = true services = append(services, ®istry.Service{Name: name}) } case <-exit: return } } }() if err := mdns.Query(p); err != nil { return nil, err } return services, nil }
func (m *mdnsRegistry) GetService(service string) ([]*registry.Service, error) { p := mdns.DefaultParams(service) p.Timeout = m.opts.Timeout entryCh := make(chan *mdns.ServiceEntry, 10) p.Entries = entryCh exit := make(chan bool) defer close(exit) serviceMap := make(map[string]*registry.Service) go func() { for { select { case e := <-entryCh: // list record so skip if p.Service == "_services" { continue } if e.TTL == 0 { continue } txt, err := decode(e.InfoFields) if err != nil { continue } if txt.Service != service { continue } s, ok := serviceMap[txt.Version] if !ok { s = ®istry.Service{ Name: txt.Service, Version: txt.Version, Endpoints: txt.Endpoints, } } s.Nodes = append(s.Nodes, ®istry.Node{ Id: strings.TrimSuffix(e.Name, "."+p.Service+"."+p.Domain+"."), Address: e.AddrV4.String(), Port: e.Port, Metadata: txt.Metadata, }) serviceMap[txt.Version] = s case <-exit: return } } }() if err := mdns.Query(p); err != nil { return nil, err } // create list and return var services []*registry.Service for _, service := range serviceMap { services = append(services, service) } return services, nil }