diff --git a/Cargo.lock b/Cargo.lock index 94cd9bb..3efe442 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -62,9 +62,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.68" +version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cb2f989d18dd141ab8ae82f64d1a8cdd37e0840f73a406896cf5e99502fab61" +checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" [[package]] name = "api" @@ -984,9 +984,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.25" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52ba265a92256105f45b719605a571ffe2d1f0fea3807304b522c1d778f79eed" +checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" dependencies = [ "futures-core", "futures-sink", @@ -994,9 +994,9 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.25" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04909a7a7e4633ae6c4a9ab280aeb86da1236243a77b694a49eacd659a4bd3ac" +checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" [[package]] name = "futures-executor" @@ -1022,9 +1022,9 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.25" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00f5fb52a06bdcadeb54e8d3671f8888a39697dcb0b81b23b55174030427f4eb" +checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" [[package]] name = "futures-lite" @@ -1043,32 +1043,32 @@ dependencies = [ [[package]] name = "futures-macro" -version = "0.3.25" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdfb8ce053d86b91919aad980c220b1fb8401a9394410e1c289ed7e66b61835d" +checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 1.0.107", + "syn 2.0.39", ] [[package]] name = "futures-sink" -version = "0.3.25" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39c15cf1a4aa79df40f1bb462fb39676d0ad9e366c2a33b590d7c66f4f81fcf9" +checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" [[package]] name = "futures-task" -version = "0.3.25" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ffb393ac5d9a6eaa9d3fdf37ae2776656b706e200c8e16b1bdb227f5198e6ea" +checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" [[package]] name = "futures-util" -version = "0.3.25" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "197676987abd2f9cadff84926f410af1c183608d36641465df73ae8211dc65d6" +checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" dependencies = [ "futures-channel", "futures-core", @@ -1412,6 +1412,20 @@ dependencies = [ "unicode-normalization", ] +[[package]] +name = "indexed-db" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8d1a6dc2ff1680ae3856d2a3a42b8f9d70b91c3883705cfd0a8f1ea0ed850c8" +dependencies = [ + "futures-channel", + "futures-util", + "pin-project-lite", + "scoped-tls", + "thiserror", + "web-sys", +] + [[package]] name = "indexmap" version = "1.9.2" @@ -1481,9 +1495,9 @@ checksum = "fad582f4b9e86b6caa621cabeb0963332d92eea04729ab12892c2533951e6440" [[package]] name = "js-sys" -version = "0.3.60" +version = "0.3.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49409df3e3bf0856b916e2ceaca09ee28e6871cf7d9ce97a692cacfdb2a25a47" +checksum = "cee9c64da59eae3b50095c18d3e74f8b73c0b86d2792824ff01bbce68ba229ca" dependencies = [ "wasm-bindgen", ] @@ -1526,12 +1540,14 @@ dependencies = [ name = "kitchen-wasm" version = "0.2.25" dependencies = [ + "anyhow", "api", "async-trait", "base64 0.21.0", "chrono", "console_error_panic_hook", "gloo-net", + "indexed-db", "js-sys", "maud", "recipes", @@ -2048,9 +2064,9 @@ dependencies = [ [[package]] name = "pin-project-lite" -version = "0.2.9" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" +checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" [[package]] name = "pin-utils" @@ -3659,9 +3675,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.60" +version = "0.3.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcda906d8be16e728fd5adc5b729afad4e444e106ab28cd1c7256e54fa61510f" +checksum = "50c24a44ec86bb68fbecd1b3efed7e85ea5621b39b35ef2766b66cd984f8010f" dependencies = [ "js-sys", "wasm-bindgen", diff --git a/web/Cargo.toml b/web/Cargo.toml index 03761a0..cae121e 100644 --- a/web/Cargo.toml +++ b/web/Cargo.toml @@ -27,6 +27,8 @@ sycamore-router = "0.8" js-sys = "0.3.60" wasm-web-component = { git = "https://github.com/zaphar/wasm-web-components.git", rev = "v0.3.0" } maud = "*" +indexed-db = "0.4.1" +anyhow = "1.0.86" [dependencies.serde] version = "<=1.0.171" diff --git a/web/src/js_lib.rs b/web/src/js_lib.rs index 82596f5..c37dd97 100644 --- a/web/src/js_lib.rs +++ b/web/src/js_lib.rs @@ -14,6 +14,25 @@ use js_sys::Date; use tracing::error; use web_sys::{window, Storage, Window}; +use indexed_db::{self, Factory, Database}; +use anyhow::{Result, Context}; + +pub async fn get_indexed_db(name: &str, version: Option) -> Result> { + let version = version.unwrap_or(0); + let factory = Factory::::get().context("opening IndexedDB")?; + let db = factory.open(name, version, |evt| async move { + // NOTE(zaphar): This is the on upgradeneeded handler. It get's called on new databases or + // database with an older version than the one we requested to build. + let db = evt.database(); + // NOTE(jwall): This needs to be somewhat clever in handling version upgrades. + if db.version() == 0 { + // We use out of line keys for this object store + db.build_object_store("store").create()?; + } + Ok(()) + }).await.context(format!("Openong or creating the database {}", name))?; + Ok(db) +} pub fn get_storage() -> Storage { get_window()