简介
npm 包 @jimpick/distjs-dat 是一个提供 de-centralized web 服务的 JavaScript 库。它基于 Hypercore Protocol 构建,用于在多个节点之间同步数据。
它提供了一个优雅的接口,使得在 de-centralized web 上创建和共享数据变得非常简单。它也可以帮助一些开发人员只使用少量代码即可在 P2P 网络中同步数据。
在本文中,我们将介绍如何使用 @jimpick/distjs-dat。
安装
使用 npm 进行安装:
npm install @jimpick/distjs-dat
使用
在我们介绍如何使用 @jimpick/distjs-dat 前,首先需要了解一些基础概念。
Hypercore Protocol
Hypercore Protocol 是 @jimpick/distjs-dat 的基础。它使用基于哈希的 P2P 网络协议,通过 TCP/IP 连接将数据同步到不同的节点。
Hypercore Protocol 的核心概念是 hypercore,它是一个类似于数组的数据结构,可以由许多节点共享。我们可以使用 hypercore 进行数据存储和同步。与 IPFS 不同,Hypercore Protocol 是只写的,每个 hypercore 只能由一个用户写入。
DatArchive
DatArchive 是一个用于访问 hypercore 数据的接口,类似于访问本地文件系统。
一个 DatArchive 除了可以添加、删除、更新文件,还可以被许多节点同时共享。所有的修改将会被同步到其他节点,即使你的设备没有联网也不会影响 sync。
这跟 Git 的方式非常相似,如果你熟悉 Git,对于 @jimpick/distjs-dat 的使用可能就更加得心应手了。
初始化 DatArchive
要初始化一个 DatArchive ,只需要使用如下命令:
-- -------------------- ---- ------- ----- --- - ------------------- ------------------ -------- ----- ---- - -- ----- ----- --- --- ------- - ----------- ------------------------------ -------- ----- ----- - ----------------- -- ------- -------- -- --- ---- -- ------- ------------------------ -- ------- --- --- -- --- ------- -- --
./my-folder
是存储本地数据的文件夹。在这个例子中,数据将被存储在 ./my-folder
目录下。
你可以使用 archive.writeFile
写入一个文件到本地数据中。
archive.writeFile('/file.txt', 'Howdy, Partner!', function (err) { if (err) throw err })
共享数据
我们需要创建两个不同的 DatArchive,来演示如何在两个 DatArchive 之间共享数据。使用 Dat
函数初始化两个不同的 DatArchive:
-- -------------------- ---- ------- --------------------- -------- ----- ----- - -- ----- ----- --- -- --- - ---- -- ---- --- -- - ----------------------------------------------- ------------- ---------- --- ---- - ---------------- --------------------- ----- ---------- -------- ----- ----- - -- ----- ----- --- -- ---- - ---- ---- ---- ---------------------------------- -------- ----- ----- - ---------------------------- -- ------- ------ ------- --- ---- - ---------------- -- --- --- ---- ------ -- --- ---- ----------------- ----------------- -- -- --
在这个例子中,我们创建了两个不同的 DatArchive:dat1
和 dat2
。
我们向dat1
中添加了一个文件:Hello World!
。
使用Dat
函数初始化dat2
并通过dat1.key
参数让dat2
知道本地需要与哪个HypercoreProtocol
节点同步数据。
现在,我们就可以使用dat2
获取到dat1
中保存的数据。
Hyperdrive
Hyperdrive
是一个建立在HypercoreProtocol
之上的高级协议。它提供了使用file
路径和directory
路径在分布式系统中使用文件夹和文件的能力。
Hyperdrive
有时候表现得比DatArchive
更好。
初始化一个Hyperdrive
需要使用Hyperdrive
函数。如下所示:
const Hyperdrive = require('hyperdrive') const drive = Hyperdrive('./my-folder')
./my-folder
是本地存储应用数据的目录。
一旦你调用了Hyperdrive
函数,它会返回一个drive
,你就可以使用drive
读/写数据了。
现在你就可以使用 writeFile
和 readFile
函数来读写数据了。这些函数的调用方式和DatArchive
是一样的。在下面的示例中,我们使用writeFile
向 Hyperdrive 写入一个文件。
drive.writeFile('/foo.txt', 'Hello, World!', function(err) { if (err) throw err console.log('file written!') })
处理文件和文件夹
Hyperdrive
使用 Unix 风格的路径,我们可以使用路径名来访问文件和目录。根目录以/
开头。使用mkdir
函数来创建目录:
-- -------------------- ---- ------- -- ------ --------- --------------------- ------------- - -- ----- ----- --- ---------------------- ---------- -- -- ------ ------ --------- --------------------------- ----------- ------ ------------- - -- ----- ----- --- ------------------- --------- ---------- --
删除文件或文件夹可以使用unlink
和rmdir
函数。
-- -------------------- ---- ------- -- ------ ---- ------------------------ ------------- - -- ----- ----- --- ----------------- ---------- -- -- ------ --------- --------------------- ------------- - -- ----- ----- --- ---------------------- ---------- --
使用 metadata 和 Extended Attributes (xattrs)
Hyperdrive
支持元数据和扩展文件属性(xattrs),以保存文件的额外信息。
当你小时,你可以通过创建一个对象并将其传递给metadata
参数来设置元数据。如果你需要设置有关特定文件的附加信息,比如时间戳或作者等等,那么这个特性就非常有用。
-- -------------------- ---- ------- ---------------------- -------- ----- - -- ----- ----- --- ---------------------------------- ----- ------ -------- ----- - -- ----- ----- --- ----- ------------ - - ------- -------- ----------- ---------- - --------------------------------- ------------- -------- ----- - -- ----- ----- --- ----------------------------- -------- ----- ----- - -- ----- ----- --- -------------------------- -- - ------- -------- ----------- ------------- - -- -- -- --
如果你想要删除元数据,你只需要将metadata
参数传递给null
。
和元数据一样,你也可以设置一个文件的 xattrs
。具体实现方式也类似于元数据的设置。你需要将所需的 xattrs
作为一个对象传递给xattrs
参数:
-- -------------------- ---- ------- ----- ------ - - ---------- ---------------------- ------- ------- - ---------------------------- ------ -------- -------- ----- - -- ----- ----- --- ------------------------------ ------- -------- ----- - -- ----- ----- --- ------------------------------ -------- ----- --------- - -- ----- ----- --- ---------------------------- -- - ---------- ---------------- ------- ------- - -- -- -- -- -- ------ ------- --- ---- -- ---- ------------------------------ -------- ------ -------- ----- - -- ----- ----- --- ------------------- --------- --
在上面这个例子中,我们在drive
中设置了一个 xattr,并将xattrs
参数设为以下值:
const xattrs = { timestamp: Date.now().toString(), author: 'Alice' }
然后,我们使用setMetadata
函数将这个xattrs
设置为一个文件。如果xattrs
设置为null
,则用来存储 xattrs 的空间将被释放。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6005726681e8991b448e8983