Skip to content

Commit b491bfd

Browse files
committed
bidirectional awareness update support
1 parent 4f35477 commit b491bfd

2 files changed

Lines changed: 22 additions & 0 deletions

File tree

src/ypywidgets/comm.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
TransactionEvent,
99
YMessageType,
1010
YSyncMessageType,
11+
create_awareness_message,
1112
create_sync_message,
1213
create_update_message,
1314
handle_sync_message,
@@ -51,6 +52,7 @@ def __init__(
5152
self._ydoc = ydoc
5253
self._comm = comm
5354
self._awareness = Awareness(ydoc)
55+
self._awareness_sub_id = self._awareness.observe(self._send_awareness)
5456
msg = create_sync_message(ydoc)
5557
self._comm.send(buffers=[msg])
5658
self._comm.on_msg(self._receive)
@@ -59,6 +61,12 @@ def __init__(
5961
def awareness(self) -> Awareness:
6062
return self._awareness
6163

64+
# send awareness to the frontend
65+
def _send_awareness(self, topic, data):
66+
update = self._awareness.encode_awareness_update([self._awareness.client_id])
67+
message = create_awareness_message(update)
68+
self._comm.send(buffers=[message])
69+
6270
def _receive(self, msg):
6371
message = bytes(msg["buffers"][0])
6472
match message[0]:

tests/test_comm_awareness.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,3 +42,17 @@ async def test_comm_widget_awareness_observe_and_unobserve():
4242
events.clear()
4343
widget.awareness.set_local_state({"ping": 2})
4444
assert events == []
45+
46+
47+
async def test_comm_provider_sends_awareness_to_frontend(synced_widgets, context):
48+
async with context:
49+
local_widget = await synced_widgets.get_local_widget()
50+
51+
sent_messages = []
52+
local_widget._comm_provider._comm.send = lambda buffers: sent_messages.append(
53+
buffers[0]
54+
)
55+
56+
local_widget.awareness.set_local_state({"role": "python-test"})
57+
58+
assert any(msg[0] == YMessageType.AWARENESS for msg in sent_messages)

0 commit comments

Comments
 (0)