#yrs #crdt #persistence #rocksdb #back-end

yrs-rocksdb

基于RocksDB后端的Yrs文档持久化层

3个版本 (重大更新)

0.3.0 2024年7月9日
0.2.0 2023年11月25日
0.1.0 2023年3月1日

数据库接口中排名第1539

Download history 2/week @ 2024-04-25 19/week @ 2024-05-02 97/week @ 2024-07-04 20/week @ 2024-07-11

每月下载量130

MIT许可证

48KB
876

yrs-rocksdb

yrs-rocksdb是一个持久化层,允许存储Yrs文档,并提供方便的实用函数来处理这些文档,使用RocksDB作为持久化后端。

阅读文档以获取更多示例。


lib.rs:

yrs-rocksdb是一个持久化层,允许存储Yrs文档,并提供方便的实用函数来处理这些文档,使用RocksDB作为持久化后端。

示例

use std::sync::Arc;
use rocksdb::TransactionDB;
use yrs::{Doc, Text, Transact};
use yrs_kvstore::DocOps;
use yrs_rocksdb::RocksDBStore;

let db: Arc<TransactionDB> = Arc::new(TransactionDB::open_default("my-db-path").unwrap());

let doc = Doc::new();
let text = doc.get_or_insert_text("text");

// restore document state from DB
{
  let db_txn = RocksDBStore::from(db.transaction());
  db_txn.load_doc("my-doc-name", &mut doc.transact_mut()).unwrap();
}

// another options is to flush document state right away, but
// this requires a read-write transaction
{
  let db_txn = RocksDBStore::from(db.transaction());
  let doc = db_txn.flush_doc_with("my-doc-name", yrs::Options::default()).unwrap();
  db_txn.commit().unwrap(); // flush may change store state
}

// configure document to persist every update and
// occassionaly compact them into document state
let sub = {
  let db = db.clone();
  let options = doc.options().clone();
  doc.observe_update_v1(move |_,e| {
      let db_txn = RocksDBStore::from(db.transaction());
      let seq_nr = db_txn.push_update("my-doc-name", &e.update).unwrap();
      if seq_nr % 64 == 0 {
          // occassinally merge updates into the document state
          db_txn.flush_doc_with("my-doc-name", options.clone()).unwrap();
      }
      db_txn.commit().unwrap();
  })
};

text.insert(&mut doc.transact_mut(), 0, "a");
text.insert(&mut doc.transact_mut(), 1, "b");
text.insert(&mut doc.transact_mut(), 2, "c");

依赖项

~29MB
~590K SLoC