diff --git a/src/ypywidgets/comm.py b/src/ypywidgets/comm.py index b2d1d91..c0e7344 100644 --- a/src/ypywidgets/comm.py +++ b/src/ypywidgets/comm.py @@ -8,6 +8,7 @@ TransactionEvent, YMessageType, YSyncMessageType, + create_awareness_message, create_sync_message, create_update_message, handle_sync_message, @@ -51,6 +52,7 @@ def __init__( self._ydoc = ydoc self._comm = comm self._awareness = Awareness(ydoc) + self._awareness_sub_id = self._awareness.observe(self._send_awareness) msg = create_sync_message(ydoc) self._comm.send(buffers=[msg]) self._comm.on_msg(self._receive) @@ -59,6 +61,12 @@ def __init__( def awareness(self) -> Awareness: return self._awareness + # send awareness to the frontend + def _send_awareness(self, topic, data): + update = self._awareness.encode_awareness_update([self._awareness.client_id]) + message = create_awareness_message(update) + self._comm.send(buffers=[message]) + def _receive(self, msg): message = bytes(msg["buffers"][0]) match message[0]: diff --git a/tests/test_comm_awareness.py b/tests/test_comm_awareness.py index 5f9ca0f..67a6271 100644 --- a/tests/test_comm_awareness.py +++ b/tests/test_comm_awareness.py @@ -42,3 +42,17 @@ async def test_comm_widget_awareness_observe_and_unobserve(): events.clear() widget.awareness.set_local_state({"ping": 2}) assert events == [] + + +async def test_comm_provider_sends_awareness_to_frontend(synced_widgets, context): + async with context: + local_widget = await synced_widgets.get_local_widget() + + sent_messages = [] + local_widget._comm_provider._comm.send = lambda buffers: sent_messages.append( + buffers[0] + ) + + local_widget.awareness.set_local_state({"role": "python-test"}) + + assert any(msg[0] == YMessageType.AWARENESS for msg in sent_messages)