Awareness

Introduction

Through awareness, information about all present users can be shared. Awareness allows you to sync the names, cursor positions, or even coordinates in a complex 3D world. Under the hood it has its own CRDT, but does not have a history of updates. You can read more about it in the Yjs documentation on awareness.

Set your state

Pass a key and a value to set awareness information for the current users, you are free to pass whatever data you would like to share with other users. Here is an example with a name and a hex color under the user key:

You can also read more in our events section of the provider about the related events: awarenessUpdate and awarenessChange.

Set your state

// Set the awareness field for the current user
provider.setAwarenessField("user", {
  name: "Kevin Jahns",
  color: "#ffcc00",
});

Listen for changes

Register an event listener to receive and react to any changes, not only for your, but for all awareness states of all connected users:

// Listen for updates to the states of all users
provider.on("awarenessUpdate", ({ states }) => {
  console.log(states);
});

Usage

Gosh, all those tiny snippets. Here is complete working example of how that could look like in your app:

import * as Y from 'yjs'
import { HocuspocusProvider } from '@hocuspocus/provider'

// Set up the provider
provider = new HocuspocusProvider({
  url: "ws://127.0.0.1:1234",
  name: "awareness-example",
  document: new Y.Doc(),
  // Listen for updates …
  onAwarenessUpdate: ({ states }) => {
    console.log(states);
  },
});

// For example, listen for mouse movements
document.addEventListener("mousemove", (event) => {
  // Share any information you like
  provider.setAwarenessField("user", {
    name: "Kevin Jahns",
    color: "#ffcc00",
    mouseX: event.clientX,
    mouseY: event.clientY,
  });
});