jupyter-server-ydoc 1.0.0b8__py3-none-any.whl → 1.0.0rc1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- __version__ = "1.0.0b8"
1
+ __version__ = "1.0.0rc1"
@@ -8,14 +8,14 @@ import json
8
8
  import time
9
9
  import uuid
10
10
  from logging import Logger
11
- from typing import Any
11
+ from typing import Any, Literal
12
12
  from uuid import uuid4
13
13
 
14
14
  from jupyter_server.auth import authorized
15
15
  from jupyter_server.base.handlers import APIHandler, JupyterHandler
16
16
  from jupyter_server.utils import ensure_async
17
17
  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
19
19
  from pycrdt_websocket.websocket_server import YRoom
20
20
  from pycrdt_websocket.ystore import BaseYStore
21
21
  from tornado import web
@@ -137,6 +137,10 @@ class YDocWebSocketHandler(WebSocketHandler, JupyterHandler):
137
137
  exception_handler=exception_logger,
138
138
  )
139
139
 
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
+
140
144
  try:
141
145
  await self._websocket_server.start_room(self.room)
142
146
  except Exception as e:
@@ -286,31 +290,6 @@ class YDocWebSocketHandler(WebSocketHandler, JupyterHandler):
286
290
  """
287
291
  message_type = message[0]
288
292
 
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
-
314
293
  if message_type == MessageType.CHAT:
315
294
  msg = message[2:].decode("utf-8")
316
295
 
@@ -405,6 +384,31 @@ class YDocWebSocketHandler(WebSocketHandler, JupyterHandler):
405
384
  self._emit(LogLevel.INFO, "clean", "Loader deleted.")
406
385
  del self._room_locks[self._room_id]
407
386
 
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
+
408
412
  def check_origin(self, origin):
409
413
  """
410
414
  Check origin
@@ -41,7 +41,7 @@ class DocumentRoom(YRoom):
41
41
  self._file_format: str = file_format
42
42
  self._file_type: str = file_type
43
43
  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)
45
45
  self._document.path = self._file.path
46
46
 
47
47
  self._logger = logger
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: jupyter-server-ydoc
3
- Version: 1.0.0b8
3
+ Version: 1.0.0rc1
4
4
  Summary: jupyter-server extension integrating collaborative shared models.
5
5
  Author-email: Jupyter Development Team <jupyter@googlegroups.com>
6
6
  License: # Licensing terms
@@ -79,9 +79,9 @@ Requires-Dist: jsonschema>=4.18.0
79
79
  Requires-Dist: jupyter-events>=0.10.0
80
80
  Requires-Dist: jupyter-server-fileid<1,>=0.7.0
81
81
  Requires-Dist: jupyter-server<3.0.0,>=2.11.1
82
- Requires-Dist: jupyter-ydoc<4.0.0,>=2.0.0
82
+ Requires-Dist: jupyter-ydoc<4.0.0,>=2.1.2
83
83
  Requires-Dist: pycrdt
84
- Requires-Dist: pycrdt-websocket<0.15.0,>=0.14.2
84
+ Requires-Dist: pycrdt-websocket<0.16.0,>=0.15.0
85
85
  Provides-Extra: test
86
86
  Requires-Dist: coverage; extra == 'test'
87
87
  Requires-Dist: importlib-metadata>=4.8.3; (python_version < '3.10') and extra == 'test'
@@ -1,18 +1,18 @@
1
1
  jupyter_server_ydoc/__init__.py,sha256=B8H7XLhzgrTCQD8304Lx91FYXslwabsnV9OuYu4M4Hw,346
2
- jupyter_server_ydoc/_version.py,sha256=FINJxficj37iURkarZ-YupPPH4azy-E4XBpiEqZ9uDU,24
2
+ jupyter_server_ydoc/_version.py,sha256=iwDi0TUz45SMYIlshEAh-UPerqIe7nxUavbLYwEgSR8,25
3
3
  jupyter_server_ydoc/app.py,sha256=8vOKWLYa4OKu8Pw24TLWtbgs2SfH0_R64dPrErdWyQM,7739
4
- jupyter_server_ydoc/handlers.py,sha256=delGUrN9pslVmkxgDEolbemLvOGHW4Sb8m41IOuQBZA,23816
4
+ jupyter_server_ydoc/handlers.py,sha256=xfcTzrOV08wJVIwxHhp9DdVH3ogEY5E_ktLpzBXV5qE,24016
5
5
  jupyter_server_ydoc/loaders.py,sha256=TijilImdgYk9K91cXEIP_DzkOr6phSddwQFpLI5l_RA,10564
6
6
  jupyter_server_ydoc/pytest_plugin.py,sha256=pSw5KGHid4qRgu1PqQ-GiNOH7IBSWudXQX21J43cB3o,6805
7
- jupyter_server_ydoc/rooms.py,sha256=lv1VIIOv26_K1lMEHB3ocyjLWP4Pk05-h3mO97uYiS4,12238
7
+ jupyter_server_ydoc/rooms.py,sha256=szOAfMldhQIrmVpqoF75O0_KXY54X_TrzJz6vpjR6kE,12254
8
8
  jupyter_server_ydoc/stores.py,sha256=_5J6eNs3R5Tv88PCc-GGuszxQstfvNoBCYABqzBzJXA,1004
9
9
  jupyter_server_ydoc/test_utils.py,sha256=IFXUPf1efHd4DgC1GT7ZMJMhKryKlB0Lx4vU2-mhz4Q,1540
10
10
  jupyter_server_ydoc/utils.py,sha256=yQC-uRdLyFDYbt2Zms_hA1HyjlwznMK4yQ3_FUwTlnQ,2013
11
11
  jupyter_server_ydoc/websocketserver.py,sha256=7fLPJcWczD-4R_-LXtfvNxM_pUXFasZWDmT4RIrOQHE,5150
12
12
  jupyter_server_ydoc/events/awareness.yaml,sha256=9isoK58uue7lqMnlHqyfQt29z16Otkh14oRe1k5vbKM,753
13
13
  jupyter_server_ydoc/events/session.yaml,sha256=A7Wt7czyx38MXp5fpDbH7HLS0QNkeOqaEhHdP2x-0Mo,1594
14
- jupyter_server_ydoc-1.0.0b8.data/data/etc/jupyter/jupyter_server_config.d/jupyter_collaboration.json,sha256=0thh2hJUxAKkZSmneJMG0U6QJRjdM6zGlwrTedEt-Jk,94
15
- jupyter_server_ydoc-1.0.0b8.dist-info/METADATA,sha256=fae7vmqLAiIHfFyMxv0DMQkh1cyN1HcmkI1LkIZCFmk,5012
16
- jupyter_server_ydoc-1.0.0b8.dist-info/WHEEL,sha256=1yFddiXMmvYK7QYTqtRNtX66WJ0Mz8PYEiEUoOUUxRY,87
17
- jupyter_server_ydoc-1.0.0b8.dist-info/licenses/LICENSE,sha256=mhO0ZW9EiWOPg0dUgB-lNbJ0CGwRmTdbeAg_se1SOnY,2833
18
- jupyter_server_ydoc-1.0.0b8.dist-info/RECORD,,
14
+ jupyter_server_ydoc-1.0.0rc1.data/data/etc/jupyter/jupyter_server_config.d/jupyter_collaboration.json,sha256=0thh2hJUxAKkZSmneJMG0U6QJRjdM6zGlwrTedEt-Jk,94
15
+ jupyter_server_ydoc-1.0.0rc1.dist-info/METADATA,sha256=8MBKlcFq26cR8DCRI2rNc4ENZLCLoT-SR6ktn9FpbX0,5013
16
+ jupyter_server_ydoc-1.0.0rc1.dist-info/WHEEL,sha256=1yFddiXMmvYK7QYTqtRNtX66WJ0Mz8PYEiEUoOUUxRY,87
17
+ jupyter_server_ydoc-1.0.0rc1.dist-info/licenses/LICENSE,sha256=mhO0ZW9EiWOPg0dUgB-lNbJ0CGwRmTdbeAg_se1SOnY,2833
18
+ jupyter_server_ydoc-1.0.0rc1.dist-info/RECORD,,