chat_platform_wasm/
storage.rs

1use chat_core::error::ChatResult;
2use rusqlite::Connection;
3
4#[cfg(target_arch = "wasm32")]
5use sqlite_wasm_vfs::relaxed_idb::{install, RelaxedIdbCfg};
6#[cfg(target_arch = "wasm32")]
7use sqlite_wasm_rs as ffi;
8
9/// Open a SQLite connection backed by IndexedDB via the `relaxed-idb` VFS.
10///
11/// The relaxed-idb VFS keeps the database in memory and asynchronously
12/// flushes changed blocks to IndexedDB on every transaction commit.
13/// It requires `PRAGMA synchronous = OFF`.
14///
15/// On non-WASM targets this falls back to an in-memory connection so the
16/// crate can still be type-checked when consumed by bin crates on native.
17pub async fn open_storage(name: &str) -> ChatResult<Connection> {
18    #[cfg(target_arch = "wasm32")]
19    {
20        let cfg = RelaxedIdbCfg {
21            vfs_name: name.into(),
22            clear_on_init: false,
23            preload: sqlite_wasm_vfs::relaxed_idb::Preload::All,
24        };
25
26        install::<ffi::WasmOsCallback>(&cfg, true).await.unwrap();
27
28        let conn = Connection::open(format!("{}.db", name))?;
29        conn.execute("PRAGMA synchronous = OFF", [])?;
30
31        Ok(conn)
32    }
33    #[cfg(not(target_arch = "wasm32"))]
34    {
35        let _ = name;
36        let conn = Connection::open_in_memory()?;
37        Ok(conn)
38    }
39}