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

Download history 29/week @ 2024-04-21 307/week @ 2024-04-28

每月500次下载

Apache-2.0

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