Skip to content

Commit 2e3cf4a

Browse files
Update jupyter_ydoc and pycrdt_websocket dependencies (#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 fea37f0 commit 2e3cf4a

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
@@ -137,6 +137,10 @@ def exception_logger(exception: Exception, log: Logger) -> bool:
137137
exception_handler=exception_logger,
138138
)
139139

140+
if self._room_id == "JupyterLab:globalAwareness":
141+
# Listen for the changes in GlobalAwareness to update users
142+
self.room.awareness.observe(self._on_global_awareness_event)
143+
140144
try:
141145
await self._websocket_server.start_room(self.room)
142146
except Exception as e:
@@ -286,31 +290,6 @@ async def on_message(self, message):
286290
"""
287291
message_type = message[0]
288292

289-
if message_type == YMessageType.AWARENESS:
290-
# awareness
291-
skip = False
292-
changes = self.room.awareness.get_changes(message[1:])
293-
added_users = changes["added"]
294-
removed_users = changes["removed"]
295-
for i, user in enumerate(added_users):
296-
u = changes["states"][i]
297-
if "user" in u:
298-
name = u["user"]["name"]
299-
self._websocket_server.connected_users[user] = name
300-
self.log.debug("Y user joined: %s", name)
301-
for user in removed_users:
302-
if user in self._websocket_server.connected_users:
303-
name = self._websocket_server.connected_users[user]
304-
del self._websocket_server.connected_users[user]
305-
self.log.debug("Y user left: %s", name)
306-
# filter out message depending on changes
307-
if skip:
308-
self.log.debug(
309-
"Filtered out Y message of type: %s",
310-
YMessageType(message_type).name,
311-
)
312-
return skip
313-
314293
if message_type == MessageType.CHAT:
315294
msg = message[2:].decode("utf-8")
316295

@@ -405,6 +384,31 @@ async def _clean_room(self) -> None:
405384
self._emit(LogLevel.INFO, "clean", "Loader deleted.")
406385
del self._room_locks[self._room_id]
407386

387+
def _on_global_awareness_event(
388+
self, topic: Literal["change", "update"], changes: tuple[dict[str, Any], Any]
389+
) -> None:
390+
"""
391+
Update the users when the global awareness changes.
392+
393+
Parameters:
394+
topic (str): `"update"` or `"change"` (`"change"` is triggered only if the states are modified).
395+
changes (tuple[dict[str, Any], Any]): The changes and the origin of the changes.
396+
"""
397+
if topic != "change":
398+
return
399+
added_users = changes[0]["added"]
400+
removed_users = changes[0]["removed"]
401+
for user in added_users:
402+
u = self.room.awareness.states[user]
403+
if "user" in u:
404+
name = u["user"]["name"]
405+
self._websocket_server.connected_users[user] = name
406+
self.log.debug("Y user joined: %s", name)
407+
for user in removed_users:
408+
if user in self._websocket_server.connected_users:
409+
name = self._websocket_server.connected_users.pop(user)
410+
self.log.debug("Y user left: %s", name)
411+
408412
def check_origin(self, origin):
409413
"""
410414
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
@@ -41,7 +41,7 @@ def __init__(
4141
self._file_format: str = file_format
4242
self._file_type: str = file_type
4343
self._file: FileLoader = file
44-
self._document = YDOCS.get(self._file_type, YFILE)(self.ydoc)
44+
self._document = YDOCS.get(self._file_type, YFILE)(self.ydoc, self.awareness)
4545
self._document.path = self._file.path
4646

4747
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)