Skip to content

Commit b34c7ea

Browse files
Backport 'Update jupyter_ydoc and pycrdt_websocket dependencies' #367 (#376)
* Backport 'Update jupyter_ydoc and pycrdt_websocket dependencies' #367 * Update pyproject.toml Co-authored-by: David Brochart <[email protected]> --------- Co-authored-by: David Brochart <[email protected]>
1 parent 350ac77 commit b34c7ea

File tree

3 files changed

+34
-30
lines changed

3 files changed

+34
-30
lines changed

jupyter_collaboration/handlers.py

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

1313
from jupyter_server.auth import authorized
1414
from jupyter_server.base.handlers import APIHandler, JupyterHandler
1515
from jupyter_server.utils import ensure_async
1616
from jupyter_ydoc import ydocs as YDOCS
17-
from pycrdt import YMessageType, write_var_uint
17+
from pycrdt import write_var_uint
1818
from pycrdt_websocket.websocket_server import YRoom
1919
from pycrdt_websocket.ystore import BaseYStore
2020
from tornado import web
@@ -132,6 +132,10 @@ def exception_logger(exception: Exception, log: Logger) -> bool:
132132
exception_handler=exception_logger,
133133
)
134134

135+
if self._room_id == "JupyterLab:globalAwareness":
136+
# Listen for the changes in GlobalAwareness to update users
137+
self.room.awareness.observe(self._on_global_awareness_event)
138+
135139
try:
136140
await self._websocket_server.start_room(self.room)
137141
except Exception as e:
@@ -280,31 +284,6 @@ async def on_message(self, message):
280284
"""
281285
message_type = message[0]
282286

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

@@ -395,6 +374,31 @@ async def _clean_room(self) -> None:
395374
self._emit(LogLevel.INFO, "clean", "Loader deleted.")
396375
del self._room_locks[self._room_id]
397376

377+
def _on_global_awareness_event(
378+
self, topic: Literal["change", "update"], changes: tuple[dict[str, Any], Any]
379+
) -> None:
380+
"""
381+
Update the users when the global awareness changes.
382+
383+
Parameters:
384+
topic (str): `"update"` or `"change"` (`"change"` is triggered only if the states are modified).
385+
changes (tuple[dict[str, Any], Any]): The changes and the origin of the changes.
386+
"""
387+
if topic != "change":
388+
return
389+
added_users = changes[0]["added"]
390+
removed_users = changes[0]["removed"]
391+
for user in added_users:
392+
u = self.room.awareness.states[user]
393+
if "user" in u:
394+
name = u["user"]["name"]
395+
self._websocket_server.connected_users[user] = name
396+
self.log.debug("Y user joined: %s", name)
397+
for user in removed_users:
398+
if user in self._websocket_server.connected_users:
399+
name = self._websocket_server.connected_users.pop(user)
400+
self.log.debug("Y user left: %s", name)
401+
398402
def check_origin(self, origin):
399403
"""
400404
Check origin

jupyter_collaboration/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

4646
self._logger = logger
4747
self._save_delay = save_delay

pyproject.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,9 @@ classifiers = [
2828
]
2929
dependencies = [
3030
"jupyter_server>=2.0.0,<3.0.0",
31-
"jupyter_ydoc>=2.0.0,<3.0.0",
31+
"jupyter_ydoc>=2.1.2,<3.0.0",
3232
"pycrdt",
33-
"pycrdt-websocket>=0.14.0,<0.15.0",
33+
"pycrdt-websocket>=0.15.0,<0.16.0",
3434
"jupyter_events>=0.10.0",
3535
"jupyter_server_fileid>=0.7.0,<1",
3636
"jsonschema>=4.18.0"

0 commit comments

Comments
 (0)