czdb_rs/
lib.rs

1mod decrypt;
2pub mod searcher;
3
4use wasm_bindgen::prelude::*;
5use crate::searcher::{DbSearcher, SearchMode};
6
7#[wasm_bindgen]
8pub struct CzdbSearcher {
9    inner: DbSearcher,
10}
11
12#[wasm_bindgen]
13impl CzdbSearcher {
14    #[wasm_bindgen(constructor)]
15    pub fn new(data: &[u8], key: &str) -> Result<CzdbSearcher, JsError> {
16        let searcher = DbSearcher::new(data.to_vec(), key)
17            .map_err(|e| JsError::new(&e.to_string()))?;
18        Ok(CzdbSearcher { inner: searcher })
19    }
20
21    /// Create with specific search mode (0=Memory, 1=BTree)
22    #[wasm_bindgen]
23    pub fn new_with_mode(data: &[u8], key: &str, mode: u8) -> Result<CzdbSearcher, JsError> {
24        let search_mode = match mode {
25            0 => SearchMode::Memory,
26            1 => SearchMode::BTree,
27            _ => SearchMode::Memory,
28        };
29        let searcher = DbSearcher::with_mode(data.to_vec(), key, search_mode)
30            .map_err(|e| JsError::new(&e.to_string()))?;
31        Ok(CzdbSearcher { inner: searcher })
32    }
33
34    pub fn search(&self, ip: &str) -> Result<String, JsError> {
35        self.inner.search(ip).map_err(|e| JsError::new(&e.to_string()))
36    }
37
38    // Batch search to reduce WASM call overhead
39    pub fn search_batch(&self, ips: Vec<String>) -> Result<Vec<String>, JsError> {
40        let mut results = Vec::with_capacity(ips.len());
41        for ip in ips {
42            results.push(self.inner.search(&ip).unwrap_or_else(|_| "Error".to_string()));
43        }
44        Ok(results)
45    }
46
47    /// Get current search mode (0=Memory, 1=BTree)
48    pub fn search_mode(&self) -> u8 {
49        match self.inner.search_mode() {
50            SearchMode::Memory => 0,
51            SearchMode::BTree => 1,
52        }
53    }
54}