44global using INN = JetBrains . Annotations . ItemNotNullAttribute ;
55using System . Collections ;
66using System . Collections . Concurrent ;
7+ using System . Collections . Immutable ;
78using System . Diagnostics ;
89using System . Net ;
910using System . Net . NetworkInformation ;
@@ -45,7 +46,7 @@ public sealed class SearchClient : IDisposable
4546
4647 public bool IsComplete { get ; private set ; }
4748
48- public BaseSearchEngine [ ] Engines { get ; private set ; }
49+ public IEnumerable < BaseSearchEngine > Engines { get ; private set ; }
4950
5051 public bool ConfigApplied { get ; private set ; }
5152
@@ -99,12 +100,14 @@ public void OpenChannel()
99100 {
100101 var ok = ResultChannel ? . Writer . TryComplete ( new ChannelClosedException ( "Reopened channel" ) ) ;
101102
102- if ( ok . HasValue && ok . Value ) { }
103-
104103 ResultChannel = Channel . CreateUnbounded < SearchResult > ( new UnboundedChannelOptions ( )
105104 {
106105 SingleWriter = true ,
107106 } ) ;
107+
108+ if ( ok . HasValue && ok . Value ) { }
109+
110+ // throw new InvalidOperationException();
108111 }
109112
110113 /// <summary>
@@ -114,7 +117,7 @@ public void OpenChannel()
114117 /// <param name="scheduler"></param>
115118 /// <param name="token">Cancellation token passed to <see cref="WebSearchEngine.GetResultAsync(SearchQuery,CancellationToken)"/></param>
116119 public async Task < SearchResult [ ] > RunSearchAsync ( SearchQuery query ,
117- TaskScheduler scheduler = default ,
120+ TaskScheduler scheduler = null ,
118121 CancellationToken token = default )
119122 {
120123 scheduler ??= TaskScheduler . Default ;
@@ -140,7 +143,7 @@ public async Task<SearchResult[]> RunSearchAsync(SearchQuery query,
140143
141144 Debug . WriteLine ( $ "Config: { Config } | { Engines . QuickJoin ( ) } ") ;
142145
143- List < Task < SearchResult > > tasks = GetSearchTasks ( query , scheduler , token ) . ToList ( ) ;
146+ var tasks = GetSearchTasks ( query , scheduler , token ) . ToHashSet ( ) ;
144147
145148 var results = new SearchResult [ tasks . Count ] ;
146149 int i = 0 ;
@@ -186,6 +189,8 @@ public async Task<SearchResult[]> RunSearchAsync(SearchQuery query,
186189 results[i] = result;
187190 i++;
188191 }*/
192+
193+
189194 ret :
190195 CompleteSearchAsync ( ) ;
191196 OnSearchComplete ? . Invoke ( this , results ) ;
@@ -213,6 +218,7 @@ public async Task<SearchResult[]> RunSearchAsync(SearchQuery query,
213218 return results ;
214219 }
215220
221+ [ return : MN ]
216222 public static SearchResultItem GetBest ( SearchResult [ ] results )
217223 {
218224 var ordered = results . Select ( x => x . GetBestResult ( ) )
@@ -278,7 +284,8 @@ public static void OpenResult([MN] Url url1)
278284 public IEnumerable < Task < SearchResult > > GetSearchTasks ( SearchQuery query , TaskScheduler scheduler ,
279285 CancellationToken token )
280286 {
281- var tasks = Engines . Select ( e =>
287+
288+ return Engines . Select ( e =>
282289 {
283290 try {
284291 Debug . WriteLine ( $ "Starting { e } for { query } ") ;
@@ -300,10 +307,8 @@ public IEnumerable<Task<SearchResult>> GetSearchTasks(SearchQuery query, TaskSch
300307 // return Task.FromException(exception);
301308 }
302309
303- return default ;
310+ return null ;
304311 } ) ;
305-
306- return tasks ;
307312 }
308313
309314 public async ValueTask LoadEnginesAsync ( CancellationToken token = default )
@@ -312,7 +317,7 @@ public async ValueTask LoadEnginesAsync(CancellationToken token = default)
312317
313318 Trace . WriteLine ( "Loading engines" ) ;
314319
315- Engines = BaseSearchEngine . GetSelectedEngines ( Config . SearchEngines ) . ToArray ( ) ;
320+ Engines = BaseSearchEngine . GetSelectedEngines ( Config . SearchEngines ) ;
316321
317322 if ( Config . ReadCookies ) {
318323
@@ -346,7 +351,7 @@ public async ValueTask LoadEnginesAsync(CancellationToken token = default)
346351
347352 if ( Config . FlareSolverr && ! FlareSolverrClient . Value . IsInitialized ) {
348353
349- var ok = FlareSolverrClient . Value . Configure ( Config . FlareSolverrApiUrl ) ;
354+ var ok = await FlareSolverrClient . Value . ApplyConfigAsync ( Config , token ) ;
350355
351356 if ( ! ok ) {
352357 Debugger . Break ( ) ;
0 commit comments