Presence
ShareDB supports sharing “presence”: transient information about a client’s whereabouts in a given document. For example, this might be their position in a text document; their mouse pointer coordinates on the screen; or a selected field in a form.
Presence needs to be enabled in the Backend
.
Usage
Untyped presence
Presence can be used independently of a document (for example, sharing a mouse pointer position).
In this case, clients just need to subscribe to a common channel using connection.getPresence()
to get a Presence
instance:
const presence = connection.getPresence('my-channel')
presence.subscribe()
presence.on('receive', (presenceId, update) => {
if (update === null) {
// The remote client is no longer present in the document
} else {
// Handle the new value by updating UI, etc.
}
})
In order to send presence information to other clients, a LocalPresence
should be created. The presence object can take any arbitrary value
const localPresence = presence.create()
// The presence value can take any shape
localPresence.submit({foo: 'bar'})
Multiple local presences can be created from a single presence
instance, which can be used to represent columnar text cursors, multi-touch input, etc.
Typed presence
Presence can be coupled to a particular document by getting a DocPresence
instance with connection.getDocPresence()
.
The special thing about a DocPresence
(as opposed to a Presence
) instance is that DocPresence
will automatically handle synchronisation issues. Since presence and ops are submitted independently of one another, they can arrive out-of-sync, which might make a text cursor jitter, for example. DocPresence
will handle these cases, and make sure the correct presence is always applied to the correct version of a document.
Support depends on the type being used.
Currently, only rich-text
supports presence information
Clients subscribe to a particular Doc
instead of a channel:
const presence = connection.getDocPresence(collection, id)
presence.subscribe()
presence.on('receive', (presenceId, update) => {
if (update === null) {
// The remote client is no longer present in the document
} else {
// Handle the new value by updating UI, etc.
}
})
The shape of the presence value will be defined by the type:
const localPresence = presence.create()
// The presence value depends on the type
localPresence.submit(value)