#multicast #graph #node #port #relay #gun

bin+lib gundb

通过WebSocket和组播同步的分布式图数据库

2个版本

0.2.1 2022年5月16日
0.2.0 2022年5月15日
0.1.1 2022年1月21日
0.1.0 2022年1月21日

#181 in WebSocket

MIT 许可证

31MB
1.5K SLoC

包含(WOFF字体,16KB) assets/stats/fonts/nucleo.woff,(WOFF字体,13KB) assets/stats/fonts/nucleo.woff2

Gun-rs

纯Rust实现的Gun.js。对于wasm版本,请查看gun-rs-wasm

Iris-messenger 使用 gun-rs 节点 wss://gun-rs.iris.to/gun

为什么?

  • Rust可以在许多平台上编译成高性能的原生二进制文件,包括嵌入式系统。
  • 维护和为代码库做贡献比在Gun.js中更容易。Gun.js没有编译或压缩步骤,代码有点是手动压缩的 😄

使用

首先安装Rust

Gun中继

cargo install gundb
gundb start

Gun库

use gundb::{Node, NodeConfig};
use gundb::types::GunValue;
let mut db = Node::new_with_config(NodeConfig {
    outgoing_websocket_peers: vec!["wss://some-server-to-sync.with/gun".to_string()],
    ..NodeConfig::default()
});
let mut sub = db.get("greeting").on();
db.get("greeting").put("Hello World!".into());
if let GunValue::Text(str) = sub.recv().await.unwrap() {
    assert_eq!(&str, "Hello World!");
}

状态

15/5/2022:

  • Gun基本API
  • 用于运行服务器的CLI
  • 传入的WebSocket
  • 传出的WebSocket(环境变量 PEERS=wss://some-server-url.herokuapp.com/gun)
  • 组播(目前大小限制为65KB — 消息中的大照片无法通过它同步)
  • 内存存储
  • TLS支持(环境变量 CERT_PATH 和 KEY_PATH)
  • 网络消息的高级去重
  • 发布与订阅(只将网络消息中继到相关节点)
  • 磁盘存储(sled.rs
  • 针对内容寻址数据的内容哈希验证(db.get('#').get(data_hash).put(data)
  • 用户数据签名验证(db.get('~' + pubkey).get('profile') ...
  • 加密与解密(通常在客户端的js中完成,如iris私密消息)

问题

  • 多播不转发像Iris帖子带照片的大消息

开发

cargo install cargo-watch
RUST_LOG=debug cargo watch -x 'run -- start'

在Heroku上运行

heroku create --buildpack emk/rust
git push heroku master

Deploy

依赖关系

~20–35MB
~658K SLoC