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.
- jupyter_server_ydoc/_version.py +1 -1
- jupyter_server_ydoc/handlers.py +31 -27
- jupyter_server_ydoc/rooms.py +1 -1
- {jupyter_server_ydoc-1.0.0b8.dist-info → jupyter_server_ydoc-1.0.0rc1.dist-info}/METADATA +3 -3
- {jupyter_server_ydoc-1.0.0b8.dist-info → jupyter_server_ydoc-1.0.0rc1.dist-info}/RECORD +8 -8
- {jupyter_server_ydoc-1.0.0b8.data → jupyter_server_ydoc-1.0.0rc1.data}/data/etc/jupyter/jupyter_server_config.d/jupyter_collaboration.json +0 -0
- {jupyter_server_ydoc-1.0.0b8.dist-info → jupyter_server_ydoc-1.0.0rc1.dist-info}/WHEEL +0 -0
- {jupyter_server_ydoc-1.0.0b8.dist-info → jupyter_server_ydoc-1.0.0rc1.dist-info}/licenses/LICENSE +0 -0
jupyter_server_ydoc/_version.py
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
__version__ = "1.0.
|
|
1
|
+
__version__ = "1.0.0rc1"
|
jupyter_server_ydoc/handlers.py
CHANGED
|
@@ -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,
|
|
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
|
jupyter_server_ydoc/rooms.py
CHANGED
|
@@ -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.
|
|
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.
|
|
82
|
+
Requires-Dist: jupyter-ydoc<4.0.0,>=2.1.2
|
|
83
83
|
Requires-Dist: pycrdt
|
|
84
|
-
Requires-Dist: pycrdt-websocket<0.
|
|
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=
|
|
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=
|
|
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=
|
|
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.
|
|
15
|
-
jupyter_server_ydoc-1.0.
|
|
16
|
-
jupyter_server_ydoc-1.0.
|
|
17
|
-
jupyter_server_ydoc-1.0.
|
|
18
|
-
jupyter_server_ydoc-1.0.
|
|
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,,
|
|
File without changes
|
|
File without changes
|
{jupyter_server_ydoc-1.0.0b8.dist-info → jupyter_server_ydoc-1.0.0rc1.dist-info}/licenses/LICENSE
RENAMED
|
File without changes
|