diff --git a/autonomi/examples/metamask/index.js b/autonomi/examples/metamask/index.js index b8ec63a5bd..66bf524037 100644 --- a/autonomi/examples/metamask/index.js +++ b/autonomi/examples/metamask/index.js @@ -40,7 +40,7 @@ export async function externalSignerPrivateDataPutToVault(peerAddr) { const privateArchive = new autonomi.PrivateArchive(); // Add our data's data map chunk to the private archive - privateArchive.addNewFile("test", privateDataAccess); + privateArchive.addFile("test", privateDataAccess, autonomi.createMetadata(data.length)); // Get the private archive's bytes const privateArchiveBytes = privateArchive.bytes(); diff --git a/autonomi/src/client/archive.rs b/autonomi/src/client/archive.rs index 9d5f1de78a..24a8fae99e 100644 --- a/autonomi/src/client/archive.rs +++ b/autonomi/src/client/archive.rs @@ -50,29 +50,27 @@ pub struct Metadata { pub created: u64, /// Last file modification time taken from local file system. See [`std::fs::Metadata::modified`] for details per OS. pub modified: u64, + /// File size in bytes + pub size: u64, } impl Metadata { - /// Create a new metadata struct - pub fn new() -> Self { + /// Create a new metadata struct with the current time as uploaded, created and modified. + pub fn new_with_size(size: u64) -> Self { let now = SystemTime::now() .duration_since(UNIX_EPOCH) .unwrap_or(Duration::from_secs(0)) .as_secs(); + Self { uploaded: now, created: now, modified: now, + size, } } } -impl Default for Metadata { - fn default() -> Self { - Self::new() - } -} - impl Archive { /// Create a new emtpy local archive /// Note that this does not upload the archive to the network @@ -104,12 +102,6 @@ impl Archive { self.map.insert(path, (data_addr, meta)); } - /// Add a file to a local archive, with default metadata - /// Note that this does not upload the archive to the network - pub fn add_new_file(&mut self, path: PathBuf, data_addr: DataAddr) { - self.map.insert(path, (data_addr, Metadata::new())); - } - /// List all files in the archive pub fn files(&self) -> Vec<(PathBuf, Metadata)> { self.map diff --git a/autonomi/src/client/archive_private.rs b/autonomi/src/client/archive_private.rs index 7354634140..4bcf4c5ca9 100644 --- a/autonomi/src/client/archive_private.rs +++ b/autonomi/src/client/archive_private.rs @@ -65,12 +65,6 @@ impl PrivateArchive { self.map.insert(path, (data_map, meta)); } - /// Add a file to a local archive, with default metadata - /// Note that this does not upload the archive to the network - pub fn add_new_file(&mut self, path: PathBuf, data_map: PrivateDataAccess) { - self.map.insert(path, (data_map, Metadata::new())); - } - /// List all files in the archive pub fn files(&self) -> Vec<(PathBuf, Metadata)> { self.map diff --git a/autonomi/src/client/fs.rs b/autonomi/src/client/fs.rs index 40a43b9fba..b91efbb865 100644 --- a/autonomi/src/client/fs.rs +++ b/autonomi/src/client/fs.rs @@ -208,7 +208,8 @@ impl Client { tracing::debug!("Encryption took: {:.2?}", now.elapsed()); let map_xor_name = *data_map_chunk.address().xorname(); - archive.add_file(path, map_xor_name, Metadata::new()); + let metadata = metadata_from_entry(&entry); + archive.add_file(path, map_xor_name, metadata); } let root_serialized = rmp_serde::to_vec(&archive)?; @@ -234,6 +235,7 @@ pub(crate) fn metadata_from_entry(entry: &walkdir::DirEntry) -> Metadata { uploaded: 0, created: 0, modified: 0, + size: 0, }; } }; @@ -266,5 +268,6 @@ pub(crate) fn metadata_from_entry(entry: &walkdir::DirEntry) -> Metadata { .as_secs(), created, modified, + size: fs_metadata.len(), } } diff --git a/autonomi/src/client/wasm.rs b/autonomi/src/client/wasm.rs index 18d7ffa49d..425463d91c 100644 --- a/autonomi/src/client/wasm.rs +++ b/autonomi/src/client/wasm.rs @@ -18,7 +18,7 @@ use wasm_bindgen::prelude::*; /// const dataAddr = await client.putData(new Uint8Array([0, 1, 2, 3]), wallet); /// /// const archive = new Archive(); -/// archive.addNewFile("foo", dataAddr); +/// archive.addFile("foo", dataAddr, createMetadata(4)); /// /// const archiveAddr = await client.putArchive(archive, wallet); /// const archiveFetched = await client.getArchive(archiveAddr); @@ -178,6 +178,13 @@ mod archive { #[wasm_bindgen(js_name = Archive)] pub struct JsArchive(Archive); + /// Create new metadata with the current time as uploaded, created and modified. + #[wasm_bindgen(js_name = createMetadata)] + pub fn create_metadata(size: u64) -> Result { + let metadata = Metadata::new_with_size(size); + Ok(serde_wasm_bindgen::to_value(&metadata)?) + } + #[wasm_bindgen(js_class = Archive)] impl JsArchive { /// Create a new archive. @@ -187,11 +194,17 @@ mod archive { } /// Add a new file to the archive. - #[wasm_bindgen(js_name = addNewFile)] - pub fn add_new_file(&mut self, path: String, data_addr: String) -> Result<(), JsError> { + #[wasm_bindgen(js_name = addFile)] + pub fn add_file( + &mut self, + path: String, + data_addr: String, + metadata: JsValue, + ) -> Result<(), JsError> { let path = PathBuf::from(path); let data_addr = str_to_addr(&data_addr)?; - self.0.add_new_file(path, data_addr); + let metadata: Metadata = serde_wasm_bindgen::from_value(metadata)?; + self.0.add_file(path, data_addr, metadata); Ok(()) } @@ -268,11 +281,17 @@ mod archive_private { } /// Add a new file to the private archive. - #[wasm_bindgen(js_name = addNewFile)] - pub fn add_new_file(&mut self, path: String, data_map: JsValue) -> Result<(), JsError> { + #[wasm_bindgen(js_name = addFile)] + pub fn add_file( + &mut self, + path: String, + data_map: JsValue, + metadata: JsValue, + ) -> Result<(), JsError> { let path = PathBuf::from(path); let data_map: PrivateDataAccess = serde_wasm_bindgen::from_value(data_map)?; - self.0.add_new_file(path, data_map); + let metadata: Metadata = serde_wasm_bindgen::from_value(metadata)?; + self.0.add_file(path, data_map, metadata); Ok(()) } diff --git a/autonomi/tests-js/index.js b/autonomi/tests-js/index.js index a2c38d3836..31ea4e1dc5 100644 --- a/autonomi/tests-js/index.js +++ b/autonomi/tests-js/index.js @@ -45,7 +45,7 @@ describe('autonomi', function () { const data = randomData(32); const addr = await client.putData(data, wallet); const archive = new atnm.Archive(); - archive.addNewFile("foo", addr); + archive.addFile("foo", addr, atnm.createMetadata(data.length)); const archiveAddr = await client.putArchive(archive, wallet); const archiveFetched = await client.getArchive(archiveAddr); @@ -59,7 +59,7 @@ describe('autonomi', function () { const secretKey = atnm.genSecretKey(); const archive = new atnm.Archive(); - archive.addNewFile('foo', addr); + archive.addFile('foo', addr, atnm.createMetadata(data.length)); const archiveAddr = await client.putArchive(archive, wallet); const userData = new atnm.UserData(); diff --git a/autonomi/tests/external_signer.rs b/autonomi/tests/external_signer.rs index 161e881cad..89c9cd4d48 100644 --- a/autonomi/tests/external_signer.rs +++ b/autonomi/tests/external_signer.rs @@ -116,7 +116,11 @@ async fn external_signer_put() -> eyre::Result<()> { .await?; let mut private_archive = PrivateArchive::new(); - private_archive.add_file("test-file".into(), private_data_access, Metadata::default()); + private_archive.add_file( + "test-file".into(), + private_data_access, + Metadata::new_with_size(data.len() as u64), + ); let archive_serialized = private_archive.into_bytes()?;