Skip to content

Commit 1b54535

Browse files
brichetdavidbrochart
authored andcommitted
Update jupyter_ydoc and pycrdt_websocket dependencies (jupyterlab#367)
* Update jupyter_ydoc and pycrdt_websocket dependencies (and indirectly pycrdt) * linting * Remove useless enumerate * Update the connected users on global awareness changes * Apply suggestions from code review Co-authored-by: David Brochart <[email protected]> * Test if the transcient room is the global awareness to observe it * typing --------- Co-authored-by: David Brochart <[email protected]>
1 parent 1ed1544 commit 1b54535

File tree

3 files changed

+34
-30
lines changed

3 files changed

+34
-30
lines changed

projects/jupyter-server-ydoc/jupyter_server_ydoc/handlers.py

Lines changed: 31 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,14 @@
88
import time
99
import uuid
1010
from logging import Logger
11-
from typing import Any
11+
from typing import Any, Literal
1212
from uuid import uuid4
1313

1414
from jupyter_server.auth import authorized
1515
from jupyter_server.base.handlers import APIHandler, JupyterHandler
1616
from jupyter_server.utils import ensure_async
1717
from jupyter_ydoc import ydocs as YDOCS
18-
from pycrdt import Doc, UndoManager, YMessageType, write_var_uint
18+
from pycrdt import Doc, UndoManager, write_var_uint
1919
from pycrdt_websocket.websocket_server import YRoom
2020
from pycrdt_websocket.ystore import BaseYStore
2121
from tornado import web
@@ -142,6 +142,10 @@ def exception_logger(exception: Exception, log: Logger) -> bool:
142142
exception_handler=exception_logger,
143143
)
144144

145+
if self._room_id == "JupyterLab:globalAwareness":
146+
# Listen for the changes in GlobalAwareness to update users
147+
self.room.awareness.observe(self._on_global_awareness_event)
148+
145149
try:
146150
await self._websocket_server.start_room(self.room)
147151
except Exception as e:
@@ -293,31 +297,6 @@ async def on_message(self, message):
293297
"""
294298
message_type = message[0]
295299

296-
if message_type == YMessageType.AWARENESS:
297-
# awareness
298-
skip = False
299-
changes = self.room.awareness.get_changes(message[1:])
300-
added_users = changes["added"]
301-
removed_users = changes["removed"]
302-
for i, user in enumerate(added_users):
303-
u = changes["states"][i]
304-
if "user" in u:
305-
name = u["user"]["name"]
306-
self._websocket_server.connected_users[user] = name
307-
self.log.debug("Y user joined: %s", name)
308-
for user in removed_users:
309-
if user in self._websocket_server.connected_users:
310-
name = self._websocket_server.connected_users[user]
311-
del self._websocket_server.connected_users[user]
312-
self.log.debug("Y user left: %s", name)
313-
# filter out message depending on changes
314-
if skip:
315-
self.log.debug(
316-
"Filtered out Y message of type: %s",
317-
YMessageType(message_type).name,
318-
)
319-
return skip
320-
321300
if message_type == MessageType.CHAT:
322301
msg = message[2:].decode("utf-8")
323302

@@ -408,6 +387,31 @@ async def _clean_room(self) -> None:
408387
self._emit(LogLevel.INFO, "clean", "Loader deleted.")
409388
del self._room_locks[self._room_id]
410389

390+
def _on_global_awareness_event(
391+
self, topic: Literal["change", "update"], changes: tuple[dict[str, Any], Any]
392+
) -> None:
393+
"""
394+
Update the users when the global awareness changes.
395+
396+
Parameters:
397+
topic (str): `"update"` or `"change"` (`"change"` is triggered only if the states are modified).
398+
changes (tuple[dict[str, Any], Any]): The changes and the origin of the changes.
399+
"""
400+
if topic != "change":
401+
return
402+
added_users = changes[0]["added"]
403+
removed_users = changes[0]["removed"]
404+
for user in added_users:
405+
u = self.room.awareness.states[user]
406+
if "user" in u:
407+
name = u["user"]["name"]
408+
self._websocket_server.connected_users[user] = name
409+
self.log.debug("Y user joined: %s", name)
410+
for user in removed_users:
411+
if user in self._websocket_server.connected_users:
412+
name = self._websocket_server.connected_users.pop(user)
413+
self.log.debug("Y user left: %s", name)
414+
411415
def check_origin(self, origin):
412416
"""
413417
Check origin

projects/jupyter-server-ydoc/jupyter_server_ydoc/rooms.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ def __init__(
4040
self._file_format: str = file_format
4141
self._file_type: str = file_type
4242
self._file: FileLoader = file
43-
self._document = YDOCS.get(self._file_type, YFILE)(self.ydoc)
43+
self._document = YDOCS.get(self._file_type, YFILE)(self.ydoc, self.awareness)
4444
self._document.path = self._file.path
4545

4646
self._logger = logger

projects/jupyter-server-ydoc/pyproject.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,9 @@ authors = [
2929
]
3030
dependencies = [
3131
"jupyter_server>=2.11.1,<3.0.0",
32-
"jupyter_ydoc>=2.0.0,<4.0.0",
32+
"jupyter_ydoc>=2.1.2,<4.0.0",
3333
"pycrdt",
34-
"pycrdt-websocket>=0.14.2,<0.15.0",
34+
"pycrdt-websocket>=0.15.0,<0.16.0",
3535
"jupyter_events>=0.10.0",
3636
"jupyter_server_fileid>=0.7.0,<1",
3737
"jsonschema>=4.18.0"

0 commit comments

Comments
 (0)