Skip to content
This repository was archived by the owner on Sep 21, 2024. It is now read-only.

Commit 799f421

Browse files
committed
feat: Introduce EphemeralStorage, allowing storages to create temporary
Stores.
1 parent 36cf25e commit 799f421

File tree

38 files changed

+1234
-170
lines changed

38 files changed

+1234
-170
lines changed

.vscode/settings.json

+1-2
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
},
1313
"rust-analyzer.cargo.features": [
1414
"test-kubo",
15-
"helpers",
16-
"performance"
15+
"helpers"
1716
]
1817
}

Cargo.lock

+2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

rust/noosphere-common/Cargo.toml

+1
Original file line numberDiff line numberDiff line change
@@ -32,3 +32,4 @@ tokio = { workspace = true, features = ["sync", "macros"] }
3232
futures = { workspace = true }
3333
wasm-bindgen = { workspace = true }
3434
wasm-bindgen-futures = { workspace = true }
35+
gloo-timers = { workspace = true, features = ["futures"] }
+11-6
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,13 @@
1-
use std::time::Duration;
2-
3-
/// Wait for the specified number of seconds; uses [tokio::time::sleep], so this
4-
/// will yield to the async runtime rather than block until the sleep time is
5-
/// elapsed.
1+
/// Wait for the specified number of seconds, yielding to the async runtime
2+
/// rather than block. Uses [tokio::time::sleep], or [gloo_timers::future::TimeoutFuture]
3+
/// on `wasm32` targets.
64
pub async fn wait(seconds: u64) {
7-
tokio::time::sleep(Duration::from_secs(seconds)).await;
5+
#[cfg(target_arch = "wasm32")]
6+
{
7+
gloo_timers::future::TimeoutFuture::new((seconds / 1000) as u32).await
8+
}
9+
#[cfg(not(target_arch = "wasm32"))]
10+
{
11+
tokio::time::sleep(std::time::Duration::from_secs(seconds)).await
12+
}
813
}

rust/noosphere-common/src/task.rs

+14
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ use futures::future::join_all;
1313
#[cfg(not(target_arch = "wasm32"))]
1414
use tokio::task::JoinSet;
1515

16+
use crate::ConditionalSend;
17+
1618
#[cfg(target_arch = "wasm32")]
1719
/// Spawn a future by scheduling it with the local executor. The returned
1820
/// future will be pending until the spawned future completes.
@@ -43,6 +45,18 @@ where
4345
Ok(tokio::spawn(future).await?)
4446
}
4547

48+
/// Spawns a [ConditionalSend] future without requiring `await`.
49+
/// The future will immediately start processing.
50+
pub fn spawn_no_wait<F>(future: F)
51+
where
52+
F: Future<Output = ()> + ConditionalSend + 'static,
53+
{
54+
#[cfg(target_arch = "wasm32")]
55+
wasm_bindgen_futures::spawn_local(future);
56+
#[cfg(not(target_arch = "wasm32"))]
57+
tokio::task::spawn(future);
58+
}
59+
4660
/// An aggregator of async work that can be used to observe the moment when all
4761
/// the aggregated work is completed. It is similar to tokio's [JoinSet], but is
4862
/// relatively constrained and also works on `wasm32-unknown-unknown`. Unlike

rust/noosphere-core/src/authority/author.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,7 @@ mod tests {
179179
#[cfg_attr(not(target_arch = "wasm32"), tokio::test)]
180180
async fn it_gives_read_only_access_when_there_is_no_authorization() -> Result<()> {
181181
let author = Author::anonymous();
182-
let mut db = SphereDb::new(&MemoryStorage::default()).await?;
182+
let mut db = SphereDb::new(MemoryStorage::default()).await?;
183183

184184
let (sphere, _, _) = Sphere::generate("did:key:foo", &mut db).await?;
185185

@@ -201,7 +201,7 @@ mod tests {
201201
async fn it_gives_read_write_access_if_the_key_is_authorized() -> Result<()> {
202202
let owner_key = generate_ed25519_key();
203203
let owner_did = Did(owner_key.get_did().await.unwrap());
204-
let mut db = SphereDb::new(&MemoryStorage::default()).await.unwrap();
204+
let mut db = SphereDb::new(MemoryStorage::default()).await.unwrap();
205205

206206
let (sphere, authorization, _) = Sphere::generate(&owner_did, &mut db).await.unwrap();
207207

@@ -227,7 +227,7 @@ mod tests {
227227
async fn it_gives_read_write_access_to_the_root_sphere_credential() -> Result<()> {
228228
let owner_key = generate_ed25519_key();
229229
let owner_did = Did(owner_key.get_did().await.unwrap());
230-
let mut db = SphereDb::new(&MemoryStorage::default()).await.unwrap();
230+
let mut db = SphereDb::new(MemoryStorage::default()).await.unwrap();
231231

232232
let (sphere, authorization, mnemonic) =
233233
Sphere::generate(&owner_did, &mut db).await.unwrap();
@@ -256,7 +256,7 @@ mod tests {
256256
async fn it_can_find_itself_in_an_authorization_lineage() -> Result<()> {
257257
let owner_key = generate_ed25519_key();
258258
let owner_did = Did(owner_key.get_did().await.unwrap());
259-
let mut db = SphereDb::new(&MemoryStorage::default()).await.unwrap();
259+
let mut db = SphereDb::new(MemoryStorage::default()).await.unwrap();
260260

261261
let (sphere, authorization, _) = Sphere::generate(&owner_did, &mut db).await.unwrap();
262262

rust/noosphere-core/src/context/context.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -393,7 +393,7 @@ mod tests {
393393
let mut records: Vec<LinkRecord> = vec![];
394394
let owner_key = generate_ed25519_key();
395395
let owner_did = owner_key.get_did().await?;
396-
let mut db = SphereDb::new(&MemoryStorage::default()).await?;
396+
let mut db = SphereDb::new(MemoryStorage::default()).await?;
397397
let (sphere, proof, _) = Sphere::generate(&owner_did, &mut db).await?;
398398
let ucan_proof = proof.as_ucan(&db).await?;
399399
let sphere_identity = sphere.get_identity().await?;

rust/noosphere-core/src/data/address.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -403,7 +403,7 @@ mod tests {
403403
let sphere_identity = Did::from(sphere_key.get_did().await?);
404404
let link = "bafyr4iagi6t6khdrtbhmyjpjgvdlwv6pzylxhuhstxhkdp52rju7er325i";
405405
let cid_link: Link<MemoIpld> = link.parse()?;
406-
let store = SphereDb::new(&MemoryStorage::default()).await.unwrap();
406+
let store = SphereDb::new(MemoryStorage::default()).await.unwrap();
407407

408408
let record = from_issuer(&sphere_key, &sphere_identity, &cid_link, None).await?;
409409

@@ -422,7 +422,7 @@ mod tests {
422422
let sphere_identity = Did::from(sphere_key.get_did().await?);
423423
let link = "bafyr4iagi6t6khdrtbhmyjpjgvdlwv6pzylxhuhstxhkdp52rju7er325i";
424424
let cid_link: Cid = link.parse()?;
425-
let mut store = SphereDb::new(&MemoryStorage::default()).await.unwrap();
425+
let mut store = SphereDb::new(MemoryStorage::default()).await.unwrap();
426426

427427
// First verify that `owner` cannot publish for `sphere`
428428
// without delegation.
@@ -486,7 +486,7 @@ mod tests {
486486
let sphere_key = generate_ed25519_key();
487487
let sphere_identity = Did::from(sphere_key.get_did().await?);
488488
let cid_address = "bafyr4iagi6t6khdrtbhmyjpjgvdlwv6pzylxhuhstxhkdp52rju7er325i";
489-
let store = SphereDb::new(&MemoryStorage::default()).await.unwrap();
489+
let store = SphereDb::new(MemoryStorage::default()).await.unwrap();
490490

491491
expect_failure(
492492
"fails when expect `fact` is missing",
@@ -676,7 +676,7 @@ mod tests {
676676
let delegatee_key = generate_ed25519_key();
677677
let delegatee_did = delegatee_key.get_did().await?;
678678

679-
let mut db = SphereDb::new(&MemoryStorage::default()).await?;
679+
let mut db = SphereDb::new(MemoryStorage::default()).await?;
680680
let mut ucan_store = UcanStore(db.clone());
681681

682682
let (sphere, proof, _) = Sphere::generate(&owner_did, &mut db).await?;

rust/noosphere-core/src/data/sphere.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ mod tests {
7878
let identity_credential = generate_ed25519_key();
7979
let identity = Did(identity_credential.get_did().await?);
8080

81-
let mut store = SphereDb::new(&MemoryStorage::default()).await?;
81+
let mut store = SphereDb::new(MemoryStorage::default()).await?;
8282

8383
let sphere = SphereIpld::new(&identity, &mut store).await?;
8484

@@ -127,7 +127,7 @@ mod tests {
127127
let identity = Did(identity_credential.get_did().await?);
128128
let authorized = Did(authorized_credential.get_did().await?);
129129

130-
let mut store = SphereDb::new(&MemoryStorage::default()).await?;
130+
let mut store = SphereDb::new(MemoryStorage::default()).await?;
131131

132132
let sphere = SphereIpld::new(&identity, &mut store).await?;
133133

rust/noosphere-core/src/helpers/context.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ pub async fn simulated_sphere_context(
3737
Some(db) => db,
3838
None => {
3939
let storage_provider = TrackingStorage::wrap(MemoryStorage::default());
40-
SphereDb::new(&storage_provider).await?
40+
SphereDb::new(storage_provider).await?
4141
}
4242
};
4343

rust/noosphere-core/src/helpers/link.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ where
1616
{
1717
let owner_key = generate_ed25519_key();
1818
let owner_did = owner_key.get_did().await?;
19-
let mut db = SphereDb::new(&MemoryStorage::default()).await?;
19+
let mut db = SphereDb::new(MemoryStorage::default()).await?;
2020

2121
let (sphere, proof, _) = Sphere::generate(&owner_did, &mut db).await?;
2222
let ucan_proof = proof.as_ucan(&db).await?;

rust/noosphere-into/examples/notes-to-html/implementation.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ use ucan::crypto::KeyMaterial;
2727

2828
pub async fn main() -> Result<()> {
2929
let storage_provider = MemoryStorage::default();
30-
let mut db = SphereDb::new(&storage_provider).await.unwrap();
30+
let mut db = SphereDb::new(storage_provider).await.unwrap();
3131

3232
let owner_key: SphereContextKey = Arc::new(Box::new(generate_ed25519_key()));
3333
let owner_did = owner_key.get_did().await?;

rust/noosphere-ipfs/src/storage.rs

+15-2
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use anyhow::Result;
33
use async_trait::async_trait;
44
use cid::Cid;
55
use noosphere_common::ConditionalSync;
6-
use noosphere_storage::{BlockStore, Storage};
6+
use noosphere_storage::{BlockStore, EphemeralStorage, EphemeralStore, Storage};
77
use std::sync::Arc;
88
use tokio::sync::RwLock;
99

@@ -45,7 +45,6 @@ where
4545
C: IpfsClient + ConditionalSync,
4646
{
4747
type BlockStore = IpfsStore<S::BlockStore, C>;
48-
4948
type KeyValueStore = S::KeyValueStore;
5049

5150
async fn get_block_store(&self, name: &str) -> Result<Self::BlockStore> {
@@ -58,6 +57,20 @@ where
5857
}
5958
}
6059

60+
#[cfg_attr(not(target_arch = "wasm32"), async_trait)]
61+
#[cfg_attr(target_arch = "wasm32", async_trait(?Send))]
62+
impl<S, C> EphemeralStorage for IpfsStorage<S, C>
63+
where
64+
S: Storage + EphemeralStorage + ConditionalSync,
65+
C: IpfsClient + ConditionalSync,
66+
{
67+
type EphemeralStoreType = <S as EphemeralStorage>::EphemeralStoreType;
68+
69+
async fn get_ephemeral_store(&self) -> Result<EphemeralStore<Self::EphemeralStoreType>> {
70+
self.local_storage.get_ephemeral_store().await
71+
}
72+
}
73+
6174
/// An implementation of [BlockStore] that wraps some other implementation of
6275
/// same. It forwards most behavior to its wrapped implementation, except when
6376
/// reading blocks. In that case, if a block cannot be found locally, it will

rust/noosphere-ns/src/builder.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ use libp2p::kad::KademliaConfig;
2323
/// #[tokio::main(flavor = "multi_thread")]
2424
/// async fn main() {
2525
/// let key_material = generate_ed25519_key();
26-
/// let store = SphereDb::new(&MemoryStorage::default()).await.unwrap();
26+
/// let store = SphereDb::new(MemoryStorage::default()).await.unwrap();
2727
///
2828
/// let ns = NameSystemBuilder::default()
2929
/// .ucan_store(store)
@@ -190,7 +190,7 @@ mod tests {
190190
let keypair = key_material.to_dht_keypair()?;
191191
PeerId::from(keypair.public())
192192
};
193-
let store = SphereDb::new(&MemoryStorage::default()).await.unwrap();
193+
let store = SphereDb::new(MemoryStorage::default()).await.unwrap();
194194
let bootstrap_peers: Vec<Multiaddr> = vec![
195195
"/ip4/127.0.0.50/tcp/33333/p2p/12D3KooWH8WgH9mgbMXrKX4veokUznvEn6Ycwg4qaGNi83nLkoUK"
196196
.parse()?,

rust/noosphere-ns/src/dht_client.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ pub mod test {
133133
// Now test another node connecting.
134134
let (_other_ns, other_peer_id) = {
135135
let key_material = generate_ed25519_key();
136-
let store = SphereDb::new(&MemoryStorage::default()).await.unwrap();
136+
let store = SphereDb::new(MemoryStorage::default()).await.unwrap();
137137
let ns = NameSystemBuilder::default()
138138
.ucan_store(store)
139139
.key_material(&key_material)

rust/noosphere-ns/src/name_system.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,7 @@ mod test {
172172
async fn before_name_resolver_tests() -> Result<NameSystem> {
173173
let ns = {
174174
let key_material = generate_ed25519_key();
175-
let store = SphereDb::new(&MemoryStorage::default()).await.unwrap();
175+
let store = SphereDb::new(MemoryStorage::default()).await.unwrap();
176176
let ns = NameSystemBuilder::default()
177177
.ucan_store(store)
178178
.key_material(&key_material)
@@ -205,7 +205,7 @@ mod test {
205205
async fn before_each() -> Result<(DataPlaceholder, Arc<Mutex<NameSystem>>)> {
206206
let (bootstrap, bootstrap_address) = {
207207
let key_material = generate_ed25519_key();
208-
let store = SphereDb::new(&MemoryStorage::default()).await.unwrap();
208+
let store = SphereDb::new(MemoryStorage::default()).await.unwrap();
209209
let ns = NameSystemBuilder::default()
210210
.ucan_store(store)
211211
.key_material(&key_material)
@@ -221,7 +221,7 @@ mod test {
221221

222222
let ns = {
223223
let key_material = generate_ed25519_key();
224-
let store = SphereDb::new(&MemoryStorage::default()).await.unwrap();
224+
let store = SphereDb::new(MemoryStorage::default()).await.unwrap();
225225
let ns = NameSystemBuilder::default()
226226
.ucan_store(store)
227227
.key_material(&key_material)

rust/noosphere-ns/src/server/client.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ mod test {
146146
async fn before_each() -> Result<(DataPlaceholder, Arc<Mutex<HttpClient>>)> {
147147
let (bootstrap, bootstrap_address) = {
148148
let key_material = generate_ed25519_key();
149-
let store = SphereDb::new(&MemoryStorage::default()).await.unwrap();
149+
let store = SphereDb::new(MemoryStorage::default()).await.unwrap();
150150
let ns = NameSystemBuilder::default()
151151
.ucan_store(store)
152152
.key_material(&key_material)
@@ -164,7 +164,7 @@ mod test {
164164
let api_port = api_listener.local_addr().unwrap().port();
165165
let api_url = Url::parse(&format!("http://127.0.0.1:{}", api_port))?;
166166
let key_material = generate_ed25519_key();
167-
let store = SphereDb::new(&MemoryStorage::default()).await.unwrap();
167+
let store = SphereDb::new(MemoryStorage::default()).await.unwrap();
168168

169169
let ns = NameSystemBuilder::default()
170170
.ucan_store(store)

rust/noosphere-ns/tests/ns_test.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ async fn test_name_system_peer_propagation() -> Result<()> {
7575
initialize_tracing(None);
7676
// Create two NameSystems, where `ns_1` is publishing for `sphere_1`
7777
// and `ns_2` is publishing for `sphere_2`.
78-
let mut db = SphereDb::new(&MemoryStorage::default()).await?;
78+
let mut db = SphereDb::new(MemoryStorage::default()).await?;
7979
let network = NameSystemNetwork::generate(3, Some(db.clone())).await?;
8080
let sphere_1_cid_1 = derive_cid::<DagCborCodec>(b"00000000");
8181
let sphere_1_cid_2 = derive_cid::<DagCborCodec>(b"11111111");
@@ -172,7 +172,7 @@ async fn test_name_system_peer_propagation() -> Result<()> {
172172
#[tokio::test]
173173
async fn test_name_system_validation() -> Result<()> {
174174
initialize_tracing(None);
175-
let mut db = SphereDb::new(&MemoryStorage::default()).await?;
175+
let mut db = SphereDb::new(MemoryStorage::default()).await?;
176176
let network = NameSystemNetwork::generate(2, Some(db.clone())).await?;
177177

178178
let ns_1 = network.get(1).unwrap();

rust/noosphere-storage/Cargo.toml

+4-5
Original file line numberDiff line numberDiff line change
@@ -21,29 +21,27 @@ readme = "README.md"
2121
anyhow = { workspace = true }
2222
async-trait = "~0.1"
2323
async-stream = { workspace = true }
24+
futures = { workspace = true }
2425
tokio-stream = { workspace = true }
2526
cid = { workspace = true }
2627
noosphere-common = { version = "0.1.0", path = "../noosphere-common" }
2728
tracing = "~0.1"
2829
ucan = { workspace = true }
2930
libipld-core = { workspace = true }
3031
libipld-cbor = { workspace = true }
32+
rand = { workspace = true }
3133
serde = { workspace = true }
3234
base64 = "=0.21.2"
3335
url = { version = "^2" }
3436

3537
[dev-dependencies]
36-
witty-phrase-generator = "~0.2"
3738
wasm-bindgen-test = { workspace = true }
38-
rand = { workspace = true }
3939
noosphere-core-dev = { path = "../noosphere-core", features = ["helpers"], package = "noosphere-core" }
4040
noosphere-common = { path = "../noosphere-common", features = ["helpers"] }
4141
instant = { version = "0.1.12", features = ["wasm-bindgen"] }
4242

43-
[target.'cfg(not(target_arch = "wasm32"))'.dev-dependencies]
44-
tempfile = { workspace = true }
45-
4643
[target.'cfg(not(target_arch = "wasm32"))'.dependencies]
44+
tempfile = { workspace = true }
4745
sled = "~0.34"
4846
tokio = { workspace = true, features = ["full"] }
4947
rocksdb = { version = "0.21.0", optional = true }
@@ -52,6 +50,7 @@ rocksdb = { version = "0.21.0", optional = true }
5250
tokio = { workspace = true, features = ["sync", "macros"] }
5351
wasm-bindgen = { workspace = true, features = ["serde-serialize"] }
5452
wasm-bindgen-futures = { workspace = true }
53+
witty-phrase-generator = "~0.2"
5554
serde-wasm-bindgen = { workspace = true }
5655
js-sys = { workspace = true }
5756
rexie = { version = "~0.5" }

0 commit comments

Comments
 (0)