package main import ( "encoding/json" "fmt" "log" "time" ) var textResultsChan = make(chan []TextSearchResult) func tryOtherNodesForTextSearch(query, safe, lang string, page int, visitedNodes []string) []TextSearchResult { for _, nodeAddr := range peers { if contains(visitedNodes, nodeAddr) { continue // Skip nodes already visited } results, err := sendTextSearchRequestToNode(nodeAddr, query, safe, lang, page, visitedNodes) if err != nil { log.Printf("Error contacting node %s: %v", nodeAddr, err) continue } if len(results) > 0 { return results } } return nil } func sendTextSearchRequestToNode(nodeAddr, query, safe, lang string, page int, visitedNodes []string) ([]TextSearchResult, error) { visitedNodes = append(visitedNodes, nodeAddr) searchParams := struct { Query string `json:"query"` Safe string `json:"safe"` Lang string `json:"lang"` Page int `json:"page"` ResponseAddr string `json:"responseAddr"` VisitedNodes []string `json:"visitedNodes"` }{ Query: query, Safe: safe, Lang: lang, Page: page, ResponseAddr: fmt.Sprintf("http://localhost:%d/node", config.Port), VisitedNodes: visitedNodes, } msgBytes, err := json.Marshal(searchParams) if err != nil { return nil, fmt.Errorf("failed to marshal search parameters: %v", err) } msg := Message{ ID: hostID, Type: "search-text", Content: string(msgBytes), } err = sendMessage(nodeAddr, msg) if err != nil { return nil, fmt.Errorf("failed to send search request to node %s: %v", nodeAddr, err) } // Wait for results select { case res := <-textResultsChan: return res, nil case <-time.After(20 * time.Second): return nil, fmt.Errorf("timeout waiting for results from node %s", nodeAddr) } } func handleTextResultsMessage(msg Message) { var results []TextSearchResult err := json.Unmarshal([]byte(msg.Content), &results) if err != nil { log.Printf("Error unmarshalling text results: %v", err) return } log.Printf("Received text results: %+v", results) // Send results to textResultsChan go func() { textResultsChan <- results }() }