Rewild Your Web
web
browser
dweb
1// SPDX-License-Identifier: AGPL-3.0-or-later
2
3export class ResultsAggregator {
4 constructor(providers = []) {
5 this.providers = providers;
6 }
7
8 // Add a provider to the list
9 addProvider(provider) {
10 this.providers.push(provider);
11 }
12
13 // Remove a provider by name
14 removeProvider(name) {
15 this.providers = this.providers.filter((p) => p.name !== name);
16 }
17
18 // Query all providers in parallel and return sorted results
19 async query(text) {
20 const promises = this.providers.map(async (provider) => {
21 try {
22 const results = await provider.query(text);
23 // Tag results with provider name and icon
24 return results.map((r) => ({
25 ...r,
26 provider: provider.name,
27 providerIcon: provider.icon,
28 }));
29 } catch (e) {
30 console.error(`Provider ${provider.name} error:`, e);
31 return [];
32 }
33 });
34
35 const resultsArrays = await Promise.all(promises);
36 const allResults = resultsArrays.flat();
37
38 // Sort by score (descending), defaulting to 0 if not set
39 allResults.sort((a, b) => (b.score || 0) - (a.score || 0));
40
41 return allResults;
42 }
43}