@@ -2,69 +2,9 @@ import mammoth from "mammoth";
2
2
import * as unpdf from "unpdf" ;
3
3
4
4
export async function search ( { keywords, maxResults = 10 } ) {
5
- const results = [ ] ;
6
- let formData = new URLSearchParams ( ) ;
7
- formData . append ( "q" , keywords ) ;
8
-
9
- while ( results . length < maxResults ) {
10
- const response = await fetch ( `/api/proxy?url=https://html.duckduckgo.com/html/?q=${ keywords } ` ) ;
11
- const html = await response . text ( ) ;
12
- const parser = new DOMParser ( ) ;
13
- const document = parser . parseFromString ( html , "text/html" ) ;
14
-
15
- // Get results
16
- const elements = document . querySelectorAll ( "#links .web-result" ) ;
17
- const pageResults = [ ] ;
18
-
19
- for ( const el of elements ) {
20
- if ( results . length >= maxResults ) break ;
21
-
22
- const titleEl = el . querySelector ( ".result__title" ) ;
23
- const snippetEl = el . querySelector ( ".result__snippet" ) ;
24
- const linkEl = el . querySelector ( ".result__url" ) ;
25
-
26
- if ( titleEl && linkEl ) {
27
- const ddgUrl = new URL ( linkEl . href , "https://duckduckgo.com" ) ;
28
- const realUrl = ddgUrl . pathname === "/l/" ? new URLSearchParams ( ddgUrl . search ) . get ( "uddg" ) : linkEl . href ;
29
-
30
- pageResults . push ( {
31
- title : titleEl ?. textContent ?. trim ( ) ,
32
- url : decodeURIComponent ( realUrl ) ,
33
- snippet : snippetEl ?. textContent ?. trim ( ) ,
34
- // headers: Object.fromEntries(response.headers),
35
- } ) ;
36
- }
37
- }
38
-
39
- // Fetch all page contents in parallel
40
- const processedResults = await Promise . all (
41
- pageResults . map ( async ( result ) => ( {
42
- ...result ,
43
- body : await getWebsiteText ( { url : result . url } ) ,
44
- } ) )
45
- ) ;
46
-
47
- results . push ( ...processedResults ) ;
48
-
49
- // Get next page data
50
- const form = document . querySelector ( "#links form" ) ;
51
- if ( ! form ) break ;
52
-
53
- formData = new URLSearchParams ( ) ;
54
- form . querySelectorAll ( "input" ) . forEach ( ( input ) => {
55
- formData . append ( input . name , input . value ) ;
56
- } ) ;
57
-
58
- if ( ! form || elements . length === 0 ) break ;
59
- }
60
-
61
- // retry in case of proxy error
62
- if ( ! results . length || ( results . length === 1 && ! results [ 0 ] . title . trim ( ) . length ) ) {
63
- await new Promise ( ( resolve ) => setTimeout ( resolve , 2000 ) ) ;
64
- return await search ( { keywords, maxResults } ) ;
65
- }
66
-
67
- return results ;
5
+ const queryParams = new URLSearchParams ( { q : keywords , limit : maxResults } ) ;
6
+ const response = await fetch ( '/api/search?' + queryParams ) ;
7
+ return await response . json ( ) ;
68
8
}
69
9
70
10
export async function getWebsiteText ( { url, expandUrls = false } ) {
0 commit comments