#yrs #crdt #c-ffi

yffi

Yrs 本地 C 外部函数接口的绑定

60 个版本

0.19.2 2024 年 7 月 17 日
0.18.8 2024 年 5 月 10 日
0.18.2 2024 年 3 月 27 日
0.17.2 2023 年 12 月 7 日
0.1.0 2021 年 10 月 14 日

#153 in 文本处理

Download history 41/week @ 2024-04-13 1/week @ 2024-04-20 1171/week @ 2024-04-27 212/week @ 2024-05-04 35/week @ 2024-05-11 4/week @ 2024-05-18 104/week @ 2024-06-29 167/week @ 2024-07-06 115/week @ 2024-07-13 11/week @ 2024-07-20 8/week @ 2024-07-27

每月 339 次下载

MIT 许可证

195KB
4K SLoC

Yrs C 外部函数接口

该项目是 Yrs 的包装器,旨在与可能的宿主语言进行本地互操作。

它是一个用于使用无冲突复制数据类型(CRDT)进行协作文档编辑的库。这可以在不显式需要托管单个服务器的情况下在客户端设备上提供共享的文档编辑体验 - CRDT 可以在无需中央权威的情况下自行解决潜在更新冲突 - 以及提供一流的离线编辑功能,其中文档副本在没有相互连接的情况下进行修改,然后在启用此类连接后自动同步。

文档

也可以直接从生成的 C 头文件 中读取。

示例

#include <stdio.h>
#include "libyrs.h"

int main(void) {
    YDoc* doc = ydoc_new();
    YText* txt = ytext(doc, "name");
    YTransaction* txn = ydoc_write_transaction(doc);
    
    // append text to our collaborative document with no attributes
    ytext_insert(txt, txn, 0, "hello world", NULL);
    
    // simulate update with remote peer
    YDoc* remote_doc = ydoc_new();
    YText* remote_txt = ytext(remote_doc, "name");
    YTransaction* remote_txn = ydoc_write_transaction(remote_doc);
    
    // in order to exchange data with other documents
    // we first need to create a state vector
    int sv_length = 0;
    unsigned char* remote_sv = ytransaction_state_vector_v1(remote_txn, &sv_length);
    
    // now compute a differential update based on remote document's state vector
    int update_length = 0;
    unsigned char* update = ytransaction_state_diff_v1(txn, remote_sv, sv_length, &update_length);
    
    // release resources no longer in use in the rest of the example
    ybinary_destroy(remote_sv, sv_length);
    ytransaction_commit(txn);
    ydoc_destroy(doc);
    
    // both update and state vector are serializable, we can pass them over the wire
    // now apply update to a remote document
    int err_code = ytransaction_apply(remote_txn, update, update_length);
    if (0 != err_code) {
        // error occurred when trying to apply an update
        exit(err_code);
    }
    ybinary_destroy(update, update_length);
    
    // retrieve string from remote peer YText instance
    char* str = ytext_string(remote_txt, remote_txn);
    printf("%s", str);
    
    // release remaining resources
    ystring_destroy(str);
    ytransaction_commit(remote_txn);
    ydoc_destroy(remote_doc);
    
    return 0;
}

依赖项

~2.3–3.5MB
~72K SLoC