func streamRouterEvents(rc routerc.Client, db *postgres.DB, doneCh chan struct{}) error { // wait for router to come up { events := make(chan *discoverd.Event) stream, err := discoverd.NewService("router-api").Watch(events) if err != nil { return err } for e := range events { if e.Kind == discoverd.EventKindUp { break } } stream.Close() } events := make(chan *router.StreamEvent) s, err := rc.StreamEvents(events) if err != nil { return err } go func() { for { e, ok := <-events if !ok { return } route := e.Route route.ID = postgres.CleanUUID(route.ID) var appID string if strings.HasPrefix(route.ParentRef, routeParentRefPrefix) { appID = strings.TrimPrefix(route.ParentRef, routeParentRefPrefix) } eventType := ct.EventTypeRoute if e.Event == "remove" { eventType = ct.EventTypeRouteDeletion } hash := md5.New() io.WriteString(hash, appID) io.WriteString(hash, string(eventType)) io.WriteString(hash, route.ID) io.WriteString(hash, route.CreatedAt.String()) io.WriteString(hash, route.UpdatedAt.String()) uniqueID := fmt.Sprintf("%x", hash.Sum(nil)) if err := createEvent(wrapDBExec(db.Exec), &ct.Event{ AppID: appID, ObjectID: route.ID, ObjectType: eventType, UniqueID: uniqueID, }, route); err != nil { log.Println(err) } } }() _, _ = <-doneCh return s.Close() }