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 文本处理
每月 339 次下载
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