Commit graph

1166 commits

Author SHA1 Message Date
Zixuan Chen
aca14fda10
fix(ts): types 2024-04-09 16:05:30 +08:00
Zixuan Chen
81ae2abacc
Cursors (#290)
This PR introduces support for retrieving and querying cursors.

## Motivation

Using "index" to denote cursor positions can be unstable, as positions may shift with document edits. To reliably represent a position or range within a document, it is more effective to leverage the unique ID of each item/character in a List CRDT or Text CRDT.

## Updating Cursors

Loro optimizes State metadata by not storing the IDs of deleted elements. This approach, while efficient, complicates tracking cursor positions since they rely on these IDs for precise locations within the document. The solution recalculates position by replaying relevant history to update stable positions accurately. To minimize the performance impact of history replay, the system updates cursor info to reference only the IDs of currently present elements, thereby reducing the need for replay.

Each position has a "Side" information, indicating the actual cursor position is on the left, right, or directly in the center of the target ID.

Note: In JavaScript, the offset returned when querying a Stable Position is based on the UTF-16 index.

# Example

```ts
const loro = new Loro();
const list = loro.getList("list");
list.insert(0, "a");
const pos0 = list.getStablePos(0);
list.insert(1, "b");
{
  const ans = loro.queryStablePos(pos0!);
  expect(ans.offset).toEqual(0);
  expect(ans.side).toEqual(0);
  expect(ans.update).toBeUndefined();
}
list.insert(0, "c");
{
  const ans = loro.queryStablePos(pos0!);
  expect(ans.offset).toEqual(1);
  expect(ans.side).toEqual(0);
  expect(ans.update).toBeUndefined();
}
list.delete(1, 1);
{
  const ans = loro.queryStablePos(pos0!);
  expect(ans.offset).toEqual(1);
  expect(ans.side).toEqual(-1);
  expect(ans.update).toBeDefined();
}
```
2024-04-09 16:01:37 +08:00
Zixuan Chen
205fa94653
chore: bump loro-crdt 2024-04-05 02:25:25 +08:00
Zixuan Chen
9365cc049c
refactor(ts): make method types better (#315)
* refactor(ts): make method types better

* docs: add missing docs omitted by skip_typescript
2024-04-05 01:43:36 +08:00
Zixuan Chen
a215d88c03
refactor: add concrete type for each different container (#313) 2024-04-03 19:24:48 +08:00
Zixuan Chen
7561448323
refactor: replace "local" and "fromCheckout" in event with "triggeredBy" (#312)
* refactor: replace "local" and "fromCheckout" in event with "triggeredBy"

* refactor: simplify the name to `by`
2024-04-03 17:56:01 +08:00
Zixuan Chen
756d7a9404
fix: type error caused by merging 2024-04-01 17:42:02 +08:00
Leon Zhao
51890ff8d8
fix: decode iter return result by updating columnar to 0.3.4 (#309) 2024-04-01 17:29:07 +08:00
Zixuan Chen
3da28459b0
feat: decode import blob meta (#307)
* feat: decode import blob meta

* chore: rm logs
2024-04-01 17:25:43 +08:00
Zixuan Chen
3c124f454b
feat: access value/container by path (#308)
* feat: access elem by path

* fix: parse tree node index by str

* fix: reuse treeid try_from

* chore: rename methods on lib.rs

---------

Co-authored-by: Leon Zhao <leeeon233@gmail.com>
2024-04-01 17:25:12 +08:00
Zixuan Chen
c788ff1727
docs: clarify that peer id should be convertable to a u64 (#306)
#305
2024-04-01 10:06:13 +08:00
Zixuan Chen
25b0f8096e
docs: refine wasm docs (#304) 2024-04-01 09:03:32 +08:00
Zixuan Chen
1015ee33a7
chore: bump loro-crdt 2024-03-31 02:12:06 +08:00
Zixuan Chen
c3d5e92407
refactor: rm isAttached type on containers (#303) 2024-03-31 02:06:57 +08:00
Zixuan Chen
a8c059d96b
fix: type mismatch and add type info for whether a container is attached (#302) 2024-03-31 01:12:08 +08:00
Zixuan Chen
3fe9cc1969
fix: avoid bundler change the classname (#301) 2024-03-31 01:11:55 +08:00
Zixuan Chen
422e442012
chore: bump loro-crdt to 0.13.0 2024-03-30 11:44:18 +08:00
Zixuan Chen
9ecc0a90b1
refactor!: Add prelim support, making creating sub container easier (#300)
This PR includes a BREAKING CHANGE.

It enables you to create containers before attaching them to the document, making the API more intuitive and straightforward.

A container can be either attached to a document or detached. When it's detached, its history/state does not persist. You can attach a container to a document by inserting it into an attached container. Once a container is attached, its state, along with all of its descendants's states, will be recreated in the document. After attaching, the container and its descendants, will each have their corresponding "attached" version of themselves?

When a detached container x is attached to a document, you can use x.getAttached() to obtain the corresponding attached container.
2024-03-30 11:38:24 +08:00
Zixuan Chen
e58e4e3fdd
chore: bump loro-crdt to v0.12.0 2024-03-27 23:53:34 +08:00
Zixuan Chen
673e36a7ba
feat: add getParent for each handler (#297)
* feat: add getParent for each handler

* fix: type err
2024-03-27 18:43:48 +08:00
Zixuan Chen
9a673acfde
feat: add getOrCreate on map (#296) 2024-03-27 17:52:53 +08:00
Zixuan Chen
c8b8694908
refactor: extract common methods on handlers (#295)
Co-authored-by: Leon <leeeon233@gmail.com>
2024-03-25 11:58:51 +08:00
Leon Zhao
83d4950a4e
fix: empty diff emits event (#292) 2024-03-14 20:46:18 +08:00
Zixuan Chen
f7fe0d4b26
test: reduce overall test time by splitting the fuzz 10s (#291) 2024-03-12 21:10:30 +08:00
Leon Zhao
a47cf06712
Refactor fuzzing test (#271)
* feat: new fuzz test

* test: add arbtest

* fix: remove PROPTEST_FACTOR
2024-03-08 16:40:06 +08:00
Zixuan Chen
1233b8df82
refactor: replace debug-log with tracing (#285)
* refactor: replace debug-log with tracing

* chore: fix setDebug in wasm

* chore: rm useless comments
2024-03-04 20:06:24 +08:00
Zixuan Chen
7e07e4dad4
perf: reduce mem usage in fugue span (#283) 2024-03-04 12:02:49 +08:00
Zixuan Chen
08847d6639
refactor: rename client_id in idspan to peer (#287)
* refactor: rename client_id in idspan to peer

* fix: type err
2024-03-02 19:10:33 +08:00
Zixuan Chen
a5fce60883
perf: avoid a few clones in wasm (#288) 2024-03-02 16:26:34 +08:00
Leon Zhao
1db510104e
fix: delete list event hint assert (#289) 2024-03-02 16:25:57 +08:00
Leon Zhao
da782c7659
fix: tree child container index (#284) 2024-03-02 16:21:31 +08:00
Zixuan Chen
71addcb6de
fix: fix a few legacy bugs (#286) 2024-03-02 13:42:50 +08:00
Zixuan Chen
07c11f68b6
Perf make revert faster (#279)
* refactor: include start_id in seq delete span

* Add size benchmark example  (#276)

* test: add size bench example

* chore: update lock file

* refactor: optimize encoding

* perf: make revert ops with the size of m O(m)

* fix: delete span with id merge rule

* fix: fix several bugs related to delete span id
2024-02-29 23:00:02 +08:00
Zixuan Chen
06e3a5420d
refactor: reduce tracker mem usage by using nonmax id (#282) 2024-02-29 22:55:57 +08:00
Zixuan Chen
cadde3cb55
Refactor: include target id for delete seq (#278)
* refactor: include start_id in seq delete span

* Add size benchmark example  (#276)

* test: add size bench example

* chore: update lock file

* refactor: optimize encoding
2024-02-29 20:37:06 +08:00
Zixuan Chen
e9bac5ccab
fix: tracker insert err (#281) 2024-02-29 20:36:45 +08:00
Leon Zhao
80bd6936d2
fix: use TreeID as external event item (#280) 2024-02-29 20:33:06 +08:00
Leon Zhao
d3844ce04c
fix: missing event when checkout (#275)
* fix: refresh depth in diff_calc when checkout

* refactor: replace u16 with Option<NonZero>

---------

Co-authored-by: Zixuan Chen <remch183@outlook.com>
2024-02-29 11:05:25 +08:00
Zixuan Chen
dbf128959d
Add compression cmp in size bench (#277) 2024-02-28 22:03:43 +08:00
Zixuan Chen
17571ab6e0
Add size benchmark example (#276)
* test: add size bench example

* chore: update lock file
2024-02-28 21:59:20 +08:00
Zixuan Chen
b8eb57f4a5
Refactor ID (#274)
* refactor: add idlp and add lamport info to snapshot enc

* fix: fix warnings

* fix: idlp err due to incorrect merge

* fix: comments

* test: fix fuzz
2024-02-27 23:36:17 +08:00
Leon Zhao
1f4a59e85c
fix: state lock when emit events (#272)
* fix: state lock when emit events

* test: add deadlock test
2024-02-25 12:57:19 +08:00
Zixuan Chen
403eb18fa5
feat: expose timestamp related configures (#270)
* feat: expose timestamp related configures

* fix(wasm): set change merge interval api
2024-02-22 20:22:04 +08:00
Zixuan Chen
bd57eb52b1
refactor: replace i32 with i64 (#269) 2024-02-18 17:27:33 +08:00
Zixuan Chen
751082f307
chore: bump 2024-02-17 14:42:37 +08:00
Leon Zhao
73d5ec5cad
fix: import batch snapshot (#268) 2024-02-17 10:50:00 +08:00
Zixuan Chen
f648b353ad
chore: upgrade rust crates 2024-02-16 11:30:56 +08:00
Zixuan Chen
57287fa6d8
chore: add pkg info 2024-02-16 11:25:12 +08:00
Gentle
68117070dd
add pub LoroDoc::peer_id (#267)
Co-authored-by: Gentle <ramon.klass@gmail.com>
2024-02-16 01:45:16 +08:00
Zixuan Chen
7a75673fb8
chore: bump version of loro-crdt 2024-02-10 22:25:05 +08:00
Zixuan Chen
9c25e6d273
fix: should not reset the state when calling checkout to latest (#265) 2024-02-10 22:19:52 +08:00
Leon Zhao
3a4ed97e0b
fix: only send a event for one import/transaction/checkout (#263)
---------

Co-authored-by: Zixuan Chen <remch183@outlook.com>
2024-02-08 14:03:15 +08:00
Zixuan Chen
6950e42cae
perf: optimize snapshot encoding (#264)
* perf: optimize snapshot encoding

* perf: rm id_int_map and boost speed 1.4x

Co-authored-by: Leon Zhao <leeeon233@gmail.com>

---------

Co-authored-by: Leon Zhao <leeeon233@gmail.com>
2024-02-04 15:28:08 +08:00
Leon Zhao
dcbdd55195
feat: remove deleted set in tree state and optimize api (#259)
Co-authored-by: Zixuan Chen <me@zxch3n.com>
2024-01-30 09:54:54 +08:00
Zixuan Chen
0bcc3bd56d
chore: upgrade wasm-bindgen to 0.2.90 (#262) 2024-01-29 22:40:33 +08:00
Zixuan Chen
e1f3e7aa9a
docs: add config comment 2024-01-24 23:15:00 +08:00
Zixuan Chen
fd7c37c94e
chore: bump version to 0.10.1 2024-01-24 10:01:30 +08:00
Zixuan Chen
d01c03eb77
fix: rm checking after checkout 2024-01-24 10:00:00 +08:00
Zixuan Chen
af893d2431
docs: refine apply delta doc 2024-01-22 16:00:32 +08:00
Zixuan Chen
e304af05f4
chore: bump loro-crdt 2024-01-22 13:00:42 +08:00
Leon Zhao
f6cc5da0f1
refactor: Optimizing Encoding Representation for Child Container Creation to Reduce Document Size (#247)
* refactor: encoding container id

* fix: container indexing when merged ops in encoding

* chore: add compress encode size for draw example

* fix: do not need cids in encoding

* chore: change name containerIdx to containerType in encoding
2024-01-22 12:19:09 +08:00
Zixuan Chen
680041f3a9
feat: compare frontiers causal order (#257) 2024-01-22 12:03:50 +08:00
Zixuan Chen
0998342001
docs: update docs about rich text style (#258) 2024-01-22 12:03:35 +08:00
Zixuan Chen
dbef6b0a38
chore: bump loro-crdt version 2024-01-21 20:04:31 +08:00
Zixuan Chen
9e57ccbc00
Fix avoid rich text apply diff err when time travel (#256)
* fix: avoid enter invalid richtext state

* fix: only include the style when the doc contains both style start and style end

* fix: iter_range err in richtext state

* fix: richtext state iter range

* fix: iter range err

* fix: iter range

* chore: rm log

* fix: iter range

* fix: get affected range

* fix: return err if given checkout target is invalid
2024-01-21 19:51:27 +08:00
Zixuan Chen
bbea78b9bf
chore: bump version 2024-01-20 00:59:07 +08:00
Zixuan Chen
adf0d54ba6
feat(wasm): get change at lamport (#255) 2024-01-20 00:56:03 +08:00
Zixuan Chen
3573d96a31
refactor: make it more conservative about pub 2024-01-19 23:30:41 +08:00
Zixuan Chen
982a521864
fix: js method should use camel case 2024-01-19 22:26:02 +08:00
Zixuan Chen
2b86783467
chore: bump loro-crdt version 2024-01-19 22:23:24 +08:00
Zixuan Chen
77eb6853b8
fix: time travel back should be able to nullify rich text span (#254) 2024-01-19 22:20:27 +08:00
Zixuan Chen
f2d9152f2d
fix: formalize apply delta method (#252) 2024-01-19 22:20:13 +08:00
Zixuan Chen
b5aa622554
fix: how to find best insert pos for richtext & expand type reverse behavior (#250)
* chore: bump loro-crdt version

* fix: find best insert pos

* fix: style anchors' ExpandType's reverse behavior
2024-01-19 22:19:56 +08:00
Zixuan Chen
3a2c9523cd
chore: bump loro-crdt version 2024-01-18 13:30:26 +08:00
Zixuan Chen
1295ac6d61
(wasm) Extract VersionVector class and fix inconsistent PeerID repr (#249)
* refactor(wasm): extract VersionVector class and fix inconsistent PeerID in wasm

* fix: example type err

* fix: binding err

* fix: peer id repr should be consistent

* test: update tests
2024-01-18 13:28:28 +08:00
Zixuan Chen
ce1ac36b62
chore: bump loro-crdt version 2024-01-17 23:00:50 +08:00
Zixuan Chen
b4701a4de6
refactor: use rich text style config (#246)
* refactor: use rich text style config

* chore: rm log

* feat: support config text style in wasm

* feat: overlapped styles

* chore: add warning style key cannot contain ':'

* test: refine test case for richtext

* test: refine test
2024-01-17 22:55:46 +08:00
Leon Zhao
692c5e3436
feat: group ops (#243) 2024-01-12 16:47:44 +08:00
Leon Zhao
e111c519e3
refactor: setting parent only in state (#245)
* refactor: set parent in state
2024-01-12 16:46:31 +08:00
Zixuan Chen
b8cf4dc4c3
Refine the new encoding schema (#244)
* perf: refine the new encoding schema

* chore: rm auto derived fromprimitive and toprimitive from encode mode
2024-01-11 22:49:18 +08:00
Zixuan Chen
5f1353791d
Remove txn abort and reduce mem usage (#240)
* refactor: rm txn.abort and related undo behavior

* perf: simplify richtext state when there is not styles

* perf: reduce text cost when there is no style

* chore: refine logs

* perf: remove cid in states to reduce mem overhead

* refactor: reduce mem overhead by using a compacter mapvalue

* refactor: rm the box inside richtext state
2024-01-08 17:29:11 +08:00
Zixuan Chen
e2cf29f3a8
Fix time travel issue (#241)
* fix: time travel issue

* docs: refine comment

* fix: fix start vv in diff_calc apply change
2024-01-08 17:02:32 +08:00
Zixuan Chen
08390cb0de
chore: loro-crdt v0.8.0 2024-01-05 16:11:09 +08:00
Zixuan Chen
a30abf7af1
chore: upgrade debug-log to fix type issue 2024-01-05 16:07:47 +08:00
Zixuan Chen
aaec64a503
Update debug-log (#236)
* chore: use new version of debug-log

* fix: rm group_end
2024-01-05 12:12:04 +08:00
Zixuan Chen
92305f8917
chore: add checks for tracker (#238) 2024-01-05 12:10:50 +08:00
Leon Zhao
76e3f97ff9
feat: use string as peer type in wasm (#234) 2024-01-05 12:06:13 +08:00
Zixuan Chen
bf3b442e97
Fix time travel issue in Tracker (#235)
This pull request fixes an issue in the Tracker module where only the target span was forwarded during forwarding instead of forwarding all content from vv to the target opid. This resulted in errors in current_vv. The issue is resolved by updating the forward function in the Tracker module to include the entire range of content to be forwarded.

It also fixed the inconsistent issue in richtext between style anchors and style ranges.

---------

Co-authored-by: leeeon233 <leeeon233@gmail.com>
2024-01-05 12:05:39 +08:00
Zixuan Chen
00f158c0df
Update loro_value! macro and add binary support (#231)
* docs: update loro_value! doc

* fix: type errors
2024-01-04 22:58:21 +08:00
Zixuan Chen
13a3078408
Refactor container states and add consistency checks (#237)
* refactor: make container states can get their ids

* test: add utils to test consistency between the current states and diff calc

* test: add state diff calc consistency check
2024-01-03 21:57:31 +08:00
Zixuan Chen
8be7cf0412
fix: tracker delete err when the update is partially included (#232) 2024-01-02 20:11:36 +08:00
Zixuan Chen
a6be7d2ea6
refactor: make InternalString an internal struct (#233) 2024-01-02 20:11:22 +08:00
Leon zhao
a4c30f7a4b
test: add richtext fuzz (#224)
This PR adds fuzz for richtext, adding new tests covering checkout, event, and time machine
2024-01-02 17:13:18 +08:00
Zixuan Chen
bc27a47531
feat: stabilizing encoding (#219)
This PR implements a new encode schema that is more extendible and more compact. It’s also simpler and takes less binary size and maintaining effort. It is inspired by the [Automerge Encoding Format](https://automerge.org/automerge-binary-format-spec/).

The main motivation is the extensibility. When we integrate a new CRDT algorithm, we don’t want to make a breaking change to the encoding or keep multiple versions of the encoding schema in the code, as it will make our WASM size much larger. We need a stable and extendible encoding schema for our v1.0 version.

This PR also exposes the ops that compose the current container state. For example, now you can make a query about which operation a certain character quickly. This behavior is required in the new snapshot encoding, so it’s included in this PR.

# Encoding Schema

## Header

The header has 22 bytes.

- (0-4 bytes) Magic Bytes: The encoding starts with `loro` as magic bytes.
- (4-20 bytes) Checksum: MD5 checksum of the encoded data, including the header starting from 20th bytes. The checksum is encoded as a 16-byte array. The `checksum` and `magic bytes` fields are trimmed when calculating the checksum.
- (20-21 bytes) Encoding Method (2 bytes, big endian): Multiple encoding methods are available for a specific encoding version.

## Encode Mode: Updates

In this approach, only ops, specifically their historical record, are encoded, while document states are excluded.

Like Automerge's format, we employ columnar encoding for operations and changes.

Previously, operations were ordered by their Operation ID (OpId) before columnar encoding. However, sorting operations based on their respective containers initially enhance compression potential.

## Encode Mode: Snapshot

This mode simultaneously captures document state and historical data. Upon importing a snapshot into a new document, initialization occurs directly from the snapshot, bypassing the need for CRDT-based recalculations.

Unlike previous snapshot encoding methods, the current binary output in snapshot mode is compatible with the updates mode. This enhances the efficiency of importing snapshots into non-empty documents, where initialization via snapshot is infeasible. 

Additionally, when feasible, we leverage the sequence of operations to construct state snapshots. In CRDTs, deducing the specific ops constituting the current container state is feasible. These ops are tagged in relation to the container, facilitating direct state reconstruction from them. This approach, pioneered by Automerge, significantly improves compression efficiency.
2024-01-02 17:03:24 +08:00
Zixuan Chen
727b5c2518
Add benchmark utils that simulate drawing workflow (#229)
* chore: add benchmark utils that simulate drawing workflow

* chore: use markdown as table default style

* chore: init sheet simulating
2023-12-28 18:00:34 +08:00
Zixuan Chen
6a2d0f8fef
test: fix fuzz test config 2023-12-26 18:09:55 +08:00
Zixuan Chen
9477717e3e
chore: bump loro-crdt versions to v0.7.1 2023-12-26 18:01:14 +08:00
Leon zhao
012abe97c3
fix: richtext undo item merge error (#227) 2023-12-26 11:06:27 +08:00
Zixuan Chen
612745aa8c
Fix issue with richtext's applyDelta() behavior (#226)
* fix: [LORO-371] The behavior of richtext's `applyDelta()` is not entirely correct #225

* test: add corresponding test

Fixes #225
2023-12-21 11:40:39 +08:00
Zixuan Chen
c2877e8468
chore: bump version 2023-12-14 10:38:54 +08:00