fix: Outsource searching

This commit is contained in:
Myzel394 2024-02-19 21:20:36 +01:00
parent 2ef3eea524
commit 9c3a48710d
No known key found for this signature in database
GPG Key ID: DEC4AAB876F73185
3 changed files with 52 additions and 30 deletions

View File

@ -1,10 +1,12 @@
pub mod engine_base {
use std::sync::Arc;
use bytes::Bytes;
use futures::{Stream, StreamExt};
use futures::{lock::Mutex, Future, Stream, StreamExt};
use lazy_static::lazy_static;
use regex::Regex;
use reqwest::Error;
use reqwest::{Client, Error, Response};
lazy_static! {
static ref STRIP: Regex = Regex::new(r"\s+").unwrap();

32
src/helpers.rs Normal file
View File

@ -0,0 +1,32 @@
// Helpers for specific project-related tasks
// This module differs from utils in the way that everything here
// is specifically related the project
pub mod helpers {
use std::sync::Arc;
use futures::{lock::Mutex, Future, StreamExt};
use reqwest::{Error, Response};
use crate::engines::engine_base::engine_base::EngineBase;
pub async fn run_search(
request: impl Future<Output = Result<Response, Error>>,
engine_ref: Arc<Mutex<impl EngineBase>>,
) {
let response = request.await.unwrap();
let mut stream = response.bytes_stream();
while let Some(chunk) = stream.next().await {
let buffer = chunk.unwrap();
let mut engine = engine_ref.lock().await;
if let Some(result) = engine.parse_packet(buffer.iter()) {
engine.add_result(result);
drop(engine);
tokio::task::yield_now().await;
}
}
}
}

View File

@ -1,21 +1,19 @@
use crate::engines::engine_base::engine_base::EngineBase;
use std::str;
use std::sync::Arc;
use engines::brave::brave::Brave;
use futures::lock::Mutex;
use futures::StreamExt;
use lazy_static::lazy_static;
use reqwest::ClientBuilder;
use rocket::response::{
content::{RawCss, RawHtml},
stream::TextStream,
};
use rocket::response::content::{RawCss, RawHtml};
use rocket::response::stream::TextStream;
use crate::helpers::helpers::run_search;
use crate::static_files::static_files::read_file_contents;
pub mod client;
pub mod engines;
pub mod helpers;
pub mod static_files;
pub mod tsclient;
pub mod utils;
@ -56,27 +54,17 @@ async fn hello<'a>(query: &str) -> RawHtml<TextStream![String]> {
let completed_ref_writer = completed_ref.clone();
let brave_ref = Arc::new(Mutex::new(Brave::new()));
let brave_ref_writer = brave_ref.clone();
let client = Arc::new(Box::new(
ClientBuilder::new().user_agent(USER_AGENT).build().unwrap(),
));
let client_ref = client.clone();
tokio::spawn(async move {
let client = ClientBuilder::new().user_agent(USER_AGENT).build().unwrap();
let response = client
let request = client_ref
.get(format!("https://search.brave.com/search?q={}", query_box))
.send()
.await
.unwrap();
.send();
let mut stream = response.bytes_stream();
while let Some(chunk) = stream.next().await {
let buffer = chunk.unwrap();
let mut brave = brave_ref_writer.lock().await;
if let Some(result) = brave.parse_packet(buffer.iter()) {
brave.add_result(result);
drop(brave);
tokio::task::yield_now().await;
}
}
run_search(request, brave_ref_writer).await;
let mut completed = completed_ref_writer.lock().await;
*completed = true;
@ -88,12 +76,12 @@ async fn hello<'a>(query: &str) -> RawHtml<TextStream![String]> {
yield HTML_BEGINNING.to_string();
loop {
let ddg = brave_ref.lock().await;
let brave = brave_ref.lock().await;
let len = ddg.results.len();
let len = brave.results.len();
if len == 0 {
drop(ddg);
drop(brave);
tokio::task::yield_now().await;
continue
}
@ -105,13 +93,13 @@ async fn hello<'a>(query: &str) -> RawHtml<TextStream![String]> {
drop(completed);
for ii in (current_index + 1)..len {
let result = ddg.results.get(ii).unwrap();
let result = brave.results.get(ii).unwrap();
let text = format!("<li><h1>{}</h1><p>{}</p></li>", &result.title, &result.description);
yield text.to_string();
}
drop(ddg);
drop(brave);
tokio::task::yield_now().await;
// [1] -> 0