Skip to content

Commit 272da27

Browse files
committed
Make dyn storage Send
1 parent ca0c64f commit 272da27

File tree

3 files changed

+45
-5
lines changed

3 files changed

+45
-5
lines changed

src/storage/mod.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,16 +30,16 @@ pub struct PartialKeypair {
3030
}
3131

3232
/// Dynamic-dispatch Storage wrapper
33-
pub type BoxStorage = Box<dyn DynStorage>;
33+
pub type BoxStorage = Box<dyn DynStorage + Send>;
3434

3535
/// Create a new instance backed by a `RandomAccessMemory` instance.
36-
pub async fn storage_memory() -> Result<Box<dyn DynStorage>> {
36+
pub async fn storage_memory() -> Result<Box<dyn DynStorage + Send>> {
3737
let create = |_| async { Ok(RandomAccessMemory::default()) }.boxed();
3838
Ok(Storage::new(create, false).await?)
3939
}
4040

4141
/// Create a new instance backed by a `RandomAccessDisk` instance.
42-
pub async fn storage_disk(dir: &PathBuf) -> Result<Box<dyn DynStorage>> {
42+
pub async fn storage_disk(dir: &PathBuf) -> Result<Box<dyn DynStorage + Send>> {
4343
let storage = |storage: Store| {
4444
let name = match storage {
4545
Store::Tree => "tree",
@@ -162,7 +162,7 @@ where
162162
/// storage instances.
163163
// Named `.open()` in the JS version. Replaces the `.openKey()` method too by
164164
// requiring a key pair to be initialized before creating a new instance.
165-
pub async fn new<Cb>(create: Cb, overwrite: bool) -> Result<Box<dyn DynStorage>>
165+
pub async fn new<Cb>(create: Cb, overwrite: bool) -> Result<Box<dyn DynStorage + Send>>
166166
where
167167
Cb: Fn(Store) -> std::pin::Pin<Box<dyn std::future::Future<Output = Result<T>> + Send>>,
168168
{

src/storage/node.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,13 @@ impl Node {
7070
writer.write_u64::<BigEndian>(self.length as u64)?;
7171
Ok(writer)
7272
}
73+
74+
// Write into a provided buffer.
75+
// pub fn write(&self, buf: &mut [u8]) -> Result<()> {
76+
// buf[0..32].copy_from_slice(&self.hash);
77+
// (&mut buf[32..]).write_u64::<BigEndian>(self.length as u64)?;
78+
// Ok(())
79+
// }
7380
}
7481

7582
impl NodeTrait for Node {

tests/feed.rs

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@ extern crate random_access_memory as ram;
33
mod common;
44

55
use common::create_feed;
6-
use hypercore::{generate_keypair, Feed, NodeTrait, PublicKey, SecretKey, Storage};
6+
use hypercore::{generate_keypair, Event, Feed, NodeTrait, PublicKey, SecretKey, Storage};
7+
use futures::stream::StreamExt;
78
use hypercore::{storage_disk, storage_memory};
89
use std::env::temp_dir;
910
use std::fs;
@@ -27,6 +28,31 @@ async fn display() {
2728
assert_eq!(output.len(), 61);
2829
}
2930

31+
#[async_std::test]
32+
async fn task_send() {
33+
use async_std::sync::{Arc, Mutex};
34+
use async_std::task;
35+
let mut feed = create_feed(50).await.unwrap();
36+
feed.append(b"hello").await.unwrap();
37+
let feed_arc = Arc::new(Mutex::new(feed));
38+
let feed = feed_arc.clone();
39+
task::spawn(async move {
40+
feed.lock().await.append(b"world").await.unwrap();
41+
})
42+
.await;
43+
let feed = feed_arc.clone();
44+
let t1 = task::spawn(async move {
45+
let value = feed.lock().await.get(0).await.unwrap();
46+
assert_eq!(value, Some(b"hello".to_vec()));
47+
});
48+
let feed = feed_arc.clone();
49+
let t2 = task::spawn(async move {
50+
let value = feed.lock().await.get(1).await.unwrap();
51+
assert_eq!(value, Some(b"world".to_vec()));
52+
});
53+
futures::future::join_all(vec![t1, t2]).await;
54+
}
55+
3056
#[async_std::test]
3157
/// Verify `.append()` and `.get()` work.
3258
async fn set_get() {
@@ -162,13 +188,17 @@ async fn put_with_data() {
162188
let mut a = create_feed(50).await.unwrap();
163189

164190
// Create a second feed with the first feed's key.
191+
<<<<<<< HEAD
165192
let (public, secret) = copy_keys(&a);
166193
let storage = storage_memory().await.unwrap();
167194
let mut b = Feed::builder(public, storage)
168195
.secret_key(secret)
169196
.build()
170197
.await
171198
.unwrap();
199+
=======
200+
let mut b = create_clone(&a).await.unwrap();
201+
>>>>>>> c79679a... Make dyn storage Send
172202

173203
// Append 4 blocks of data to the writable feed.
174204
a.append(b"hi").await.unwrap();
@@ -226,6 +256,7 @@ async fn create_with_stored_keys() {
226256
);
227257
}
228258

259+
<<<<<<< HEAD
229260
fn copy_keys(feed: &Feed) -> (PublicKey, SecretKey) {
230261
match &feed.secret_key() {
231262
Some(secret) => {
@@ -241,6 +272,8 @@ fn copy_keys(feed: &Feed) -> (PublicKey, SecretKey) {
241272
}
242273
}
243274

275+
=======
276+
>>>>>>> c79679a... Make dyn storage Send
244277
#[async_std::test]
245278
async fn audit() {
246279
let mut feed = create_feed(50).await.unwrap();

0 commit comments

Comments
 (0)