Skip to content

✨ Add presence support #10

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Dec 29, 2021
Merged

✨ Add presence support #10

merged 1 commit into from
Dec 29, 2021

Conversation

alecgibson
Copy link
Collaborator

This change adds support for the transformPresence() method that
sharedb uses.

We add support for both text0 and json0.

text0

The text0 implementation leans on the existing
transformPosition, and takes its form and tests from
rich-text.

Its shape takes the form:

{
  index: 3,
  length: 5,
}

Where:

  • index is the cursor position
  • length is the selection length (0 for a collapsed selection)

json0

The json0 implementation has limited functionality because of the
limitations of the json0 type itself: we handle list moves lm, but
cannot infer any information when moving objects around the tree,
because the oi and od operations are destructive.

However, it will attempt to transform embedded subtypes that support
presence.

Its shape takes the form:

{
  p: ['key', 123],
  v: {},
}

Where:

  • p is the path to the client's position within the document
  • v is the presence value

The presence value v can take any arbitrary value (in simple cases it
may even be omitted entirely).

The exception to this is when using subtypes, where v should take the
presence shape defined by the subtype. For example, when using text0:

{
  p: ['key'],
  v: {index: 5, length: 0},
}

This change adds support for the `transformPresence()` method that
[`sharedb` uses][1].

We add support for both `text0` and `json0`.

`text0`
-------

The `text0` implementation leans on the existing
[`transformPosition`][2], and takes its form and tests from
[`rich-text`][3].

Its shape takes the form:

```js
{
  index: 3,
  length: 5,
}
```

Where:

 - `index` is the cursor position
 - `length` is the selection length (`0` for a collapsed selection)

`json0`
-------

The `json0` implementation has limited functionality because of the
limitations of the `json0` type itself: we handle list moves `lm`, but
cannot infer any information when moving objects around the tree,
because the `oi` and `od` operations are destructive.

However, it will attempt to transform embedded subtypes that support
presence.

Its shape takes the form:

```js
{
  p: ['key', 123],
  v: {},
}
```

Where:

 - `p` is the path to the client's position within the document
 - `v` is the presence value

The presence value `v` can take any arbitrary value (in simple cases it
may even be omitted entirely).

The exception to this is when using subtypes, where `v` should take the
presence shape defined by the subtype. For example, when using `text0`:

```js
{
  p: ['key'],
  v: {index: 5, length: 0},
}
```

[1]: share/sharedb#322
[2]: https://github.com/ottypes/json0/blob/90a3ae26364c4fa3b19b6df34dad46707a704421/lib/text0.js#L147
[3]: ottypes/rich-text#32
@alecgibson alecgibson merged commit f8aecc7 into master Dec 29, 2021
@alecgibson alecgibson deleted the presence branch December 29, 2021 09:42
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants