diff --git a/wnfs-wasm/src/fs/private/access_key.rs b/wnfs-wasm/src/fs/private/access_key.rs index 75199eda..e40d1876 100644 --- a/wnfs-wasm/src/fs/private/access_key.rs +++ b/wnfs-wasm/src/fs/private/access_key.rs @@ -28,4 +28,14 @@ impl AccessKey { pub fn get_content_cid(&self) -> Vec { self.0.get_content_cid().to_bytes() } + + #[wasm_bindgen(js_name = "toBytes")] + pub fn into_bytes(&self) -> Vec { + Vec::::from(&self.0) + } + + #[wasm_bindgen(js_name = "fromBytes")] + pub fn from_bytes(bytes: &[u8]) -> Self { + Self(WnfsAccessKey::from(bytes).into()) + } } diff --git a/wnfs-wasm/tests/mock.ts b/wnfs-wasm/tests/mock.ts index 1bb9146f..7a744223 100644 --- a/wnfs-wasm/tests/mock.ts +++ b/wnfs-wasm/tests/mock.ts @@ -5,6 +5,7 @@ import { Namefilter, PrivateDirectory, PrivateForest, + AccessKey, PublicDirectory, } from "../pkg"; @@ -190,4 +191,5 @@ export { createRecipientExchangeRoot, PrivateKey, ExchangeKey, + AccessKey, }; diff --git a/wnfs-wasm/tests/private.spec.ts b/wnfs-wasm/tests/private.spec.ts index f0fad7d4..6082e563 100644 --- a/wnfs-wasm/tests/private.spec.ts +++ b/wnfs-wasm/tests/private.spec.ts @@ -613,3 +613,36 @@ test.describe("PrivateForest", () => { expect(result).toBeDefined(); }); }); + +test.describe("AccessKey", () => { + test("can encode / decode an access key", async ({ page }) => { + const [metadataBefore, metadataAfter] = await page.evaluate(async () => { + const { + wnfs: { AccessKey, Namefilter, PrivateFile, PrivateNode, PrivateForest }, + mock: { MemoryBlockStore, Rng }, + } = await window.setup(); + + + const rng = new Rng(); + const store = new MemoryBlockStore(); + const time = new Date(); + const file = new PrivateFile(new Namefilter(), time, rng); + const node = file.asNode(); + const forest = new PrivateForest(); + const [accessKey, newForest] = await node.store(forest, store, rng); + + const encodedAccessKey = accessKey.toBytes(); + const decodedAccessKey = AccessKey.fromBytes(encodedAccessKey); + + const fetched = await PrivateNode.load(decodedAccessKey, newForest, store); + const metadataBefore = node.asFile().metadata(); + const metadataAfter = fetched.asFile().metadata(); + return [metadataBefore, metadataAfter]; + }); + + expect(metadataBefore).toBeDefined(); + expect(metadataAfter).toBeDefined(); + expect(metadataBefore.created).toEqual(metadataAfter.created); + expect(metadataBefore.modified).toEqual(metadataAfter.modified); + }); +}); diff --git a/wnfs/src/private/keys/access.rs b/wnfs/src/private/keys/access.rs index 46970843..c28d45a7 100644 --- a/wnfs/src/private/keys/access.rs +++ b/wnfs/src/private/keys/access.rs @@ -101,3 +101,15 @@ impl From<&PrivateRef> for SnapshotAccessKey { } } } + +impl From<&[u8]> for AccessKey { + fn from(bytes: &[u8]) -> Self { + serde_ipld_dagcbor::from_slice(bytes).unwrap() + } +} + +impl From<&AccessKey> for Vec { + fn from(key: &AccessKey) -> Self { + serde_ipld_dagcbor::to_vec(key).unwrap() + } +}