18个版本
0.2.2 | 2024年3月8日 |
---|---|
0.1.28 | 2023年12月6日 |
0.1.27 | 2023年9月10日 |
0.1.21 | 2023年6月14日 |
0.1.10 | 2022年12月6日 |
#27 in WebAssembly
每月500次下载
4.5MB
10K SLoC
Wasm WNFS
该项目实现了在浏览器中使用WebNative FileSystem (WNFS) Rust实现所需的JavaScript绑定。
WNFS是一个具有版本控制和内容寻址的分布式文件系统,具有私有和公共子系统。私有文件系统是加密的,只有拥有正确密钥的用户才能访问其内容。它旨在防止推断元数据,如文件树的结构。WNFS文件系统的另一部分是一个简单的公共文件系统,未加密,任何拥有正确地址的人都可以访问。
WNFS还支持文件树的协作编辑,多个用户可以同时编辑同一树。
WNFS文件树可以从具有可扩展元数据部分的IPLD图序列化和反序列化。这使得WNFS可以被其他基于IPLD的工具和系统理解。
概要
设置项目
-
安装
wasm-bindgen
cargo install wasm-bindgen-cli
-
安装依赖项
yarn
-
安装playwright二进制文件
npx playwright install
-
构建项目
yarn run build
使用
WNFS对您希望持久化内容或文件树的位置没有意见。相反,API接受任何实现了异步BlockStore
trait的对象。该库还避免了包含可能将其绑定到一组平台的系统函数调用。像时间和随机数生成这样的操作必须通过API传递。这使得库可以在各种环境中使用。它特别简化了虚拟化。
让我们看看如何与公共文件系统一起工作的例子。我们将使用用户提供的内存块存储。
import { MemoryBlockStore } from "<custom>";
import { PublicDirectory } from "wnfs";
const dir = new PublicDirectory(new Date());
const store = new MemoryBlockStore();
var { rootDir } = await dir.mkdir(["pictures", "cats"], new Date(), store);
// Create a sample CIDv1.
const cid = Uint8Array.from([
1, 112, 18, 32, 195, 196, 115, 62, 200, 175, 253, 6, 207, 158, 159, 245, 15,
252, 107, 205, 46, 200, 90, 97, 112, 0, 75, 183, 9, 102, 156, 49, 222, 148,
57, 26,
]);
// Add a file to /pictures/cats.
var { rootDir } = await rootDir.write(
["pictures", "cats", "tabby.png"],
cid,
time,
store
);
// Create and add a file to /pictures/dogs directory.
var { rootDir } = await rootDir.write(
["pictures", "dogs", "billie.jpeg"],
cid,
time,
store
);
// Delete /pictures/cats directory.
var { rootDir } = await rootDir.rm(["pictures", "cats"], store);
// List all files in /pictures directory.
var { result } = await rootDir.ls(["pictures"], store);
console.log("Files in /pictures directory:", result);
您可能会注意到,我们在后续操作中使用每个操作返回的 rootDir
。这是因为WNFS内部状态是不变的,每个操作都可能返回一个新的根目录。这使得我们可以在需要时跟踪和回滚更改。这也使得协同编辑更容易实现和推理。文件系统不可变性的基本演示在此处:这里。
另一方面,私有文件系统要复杂一些。在将其持久化到块存储之前,使用 哈希数组映射 trie (HAMT) 作为私有文件树的中间格式。我们使用HAMTs来混淆文件树层次结构。
import { MemoryBlockStore, Rng } from "<custom>";
import { PrivateDirectory, PrivateForest, Namefilter } from "wnfs";
const initialForest = new PrivateForest();
const rng = new Rng();
const store = new MemoryBlockStore();
const dir = new PrivateDirectory(new Namefilter(), new Date(), rng);
var { rootDir, forest } = await root.mkdir(
["pictures", "cats"],
true,
new Date(),
initialForest,
store,
rng
);
// Add a file to /pictures/cats.
var { rootDir, forest } = await rootDir.write(
["pictures", "cats", "tabby.png"],
cid,
time,
store
);
// Create and add a file to /pictures/dogs directory.
var { rootDir, forest } = await rootDir.write(
["pictures", "cats", "billie.png"],
true,
new Uint8Array([1, 2, 3, 4, 5]),
new Date(),
forest,
store,
rng
);
// Delete /pictures/cats directory.
var { rootDir, forest } = await rootDir.rm(
["pictures", "cats"],
true,
forest,
store,
rng
);
// List all files in /pictures directory.
var { result } = await rootDir.ls(["pictures"], true, forest, store);
console.log("Files in /pictures directory:", result);
测试项目
-
运行测试
yarn run test
发布包
-
构建项目
rs-wnfs build --wasm
-
发布
npm publish
依赖关系
~14–25MB
~356K SLoC