Yjs state vector:修订间差异
创建页面,内容为“Yjs has the ability to exchange only the differences when syncing two clients. We use lamport timestamps to identify structs and to track in which order a client created them. Each struct has an <syntaxhighlight lang="java" inline>struct.id = { client: number, clock: number}</syntaxhighlight> that uniquely identifies a struct. We define the next expected clock by each client as the state vector. This data structure is similar to the version vectors data structu…” |
小无编辑摘要 标签:2017版源代码编辑 |
||
(未显示同一用户的4个中间版本) | |||
第2行: | 第2行: | ||
<ref>https://github.com/yjs/yjs?tab=readme-ov-file#state-vector</ref> | <ref>https://github.com/yjs/yjs?tab=readme-ov-file#state-vector</ref> | ||
Format: | |||
* Size: VarUint | |||
* Entries: Client(VarUint), Clock(VarUint) | |||
<syntaxhighlight lang="ts"> | |||
const toHexString = (bytes) => { | |||
return Array.from(bytes, (byte) => { | |||
return ("0" + (byte & 0xff).toString(16)).slice(-2); | |||
}).join(""); | |||
}; | |||
const doc = new Y.Doc(); | |||
console.log("doc.clientID", doc.clientID); | |||
// doc.clientID 1077651333 varUint(1077651333)=85cfee8104 | |||
console.log("state vector", toHexString(Y.encodeStateVector(doc))); | |||
// state vector 00 | |||
const root = doc.getText("root"); | |||
root.insert(0, "Hello"); | |||
console.log("state vector", toHexString(Y.encodeStateVector(doc))); | |||
// state vector 0185cfee810405 -> client(1077651333, 5) | |||
root.insert(5, "World!"); | |||
console.log("state vector", toHexString(Y.encodeStateVector(doc))); | |||
// state vector 0185cfee81040b -> client(1077651333, 11) | |||
</syntaxhighlight> | |||
[[Category:Yjs]] | [[Category:Yjs]] | ||
[[Category:CRDT]] | [[Category:CRDT]] |
2024年10月24日 (四) 23:58的最新版本
Yjs has the ability to exchange only the differences when syncing two clients. We use lamport timestamps to identify structs and to track in which order a client created them. Each struct has an struct.id = { client: number, clock: number}
that uniquely identifies a struct. We define the next expected clock by each client as the state vector. This data structure is similar to the version vectors data structure. But we use state vectors only to describe the state of the local document, so we can compute the missing struct of the remote client. We do not use it to track causality.
[1]
Format:
- Size: VarUint
- Entries: Client(VarUint), Clock(VarUint)
const toHexString = (bytes) => {
return Array.from(bytes, (byte) => {
return ("0" + (byte & 0xff).toString(16)).slice(-2);
}).join("");
};
const doc = new Y.Doc();
console.log("doc.clientID", doc.clientID);
// doc.clientID 1077651333 varUint(1077651333)=85cfee8104
console.log("state vector", toHexString(Y.encodeStateVector(doc)));
// state vector 00
const root = doc.getText("root");
root.insert(0, "Hello");
console.log("state vector", toHexString(Y.encodeStateVector(doc)));
// state vector 0185cfee810405 -> client(1077651333, 5)
root.insert(5, "World!");
console.log("state vector", toHexString(Y.encodeStateVector(doc)));
// state vector 0185cfee81040b -> client(1077651333, 11)