Skip to content

Commit 3997dde

Browse files
authored
Rooms (#201)
* Split rooms in different files * Split rooms in different files and creates a room manager * Swap websocket server by room manager * Small improvements and documentation
1 parent 8879800 commit 3997dde

19 files changed

+379
-351
lines changed

docs/source/configuration.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,6 @@ jupyter lab --YDocExtension.file_poll_interval=2
2626
# If None, the document will be kept in memory forever.
2727
jupyter lab --YDocExtension.document_cleanup_delay=100
2828

29-
# The YStore class to use for storing Y updates (default: JupyterSQLiteYStore).
30-
jupyter lab --YDocExtension.ystore_class=ypy_websocket.ystore.TempFileYStore
29+
# The Store class used for storing Y updates (default: SQLiteYStore).
30+
jupyter lab --YDocExtension.ystore_class=jupyter_collaboration.stores.FileYStore
3131
```

docs/source/developer/architecture.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,15 @@
44

55
COMING...
66

7+
### Opening a document
8+
![initialization](../images/initialization_diagram.png)
9+
10+
### Autosave
11+
![autosave](../images/autosave_diagram.png)
12+
13+
### Conflict
14+
![autosave](../images/conflict_diagram.png)
15+
716
## Early attempts
817

918
Prior to the current implementation based on [Yjs](https://docs.yjs.dev/), other attempts using
361 KB
Loading
380 KB
Loading
327 KB
Loading

jupyter_collaboration/app.py

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@
99

1010
from .handlers import DocSessionHandler, YDocWebSocketHandler
1111
from .loaders import FileLoaderMapping
12+
from .rooms import RoomManager
1213
from .stores import BaseYStore, SQLiteYStore
1314
from .utils import EVENTS_SCHEMA_PATH
14-
from .websocketserver import JupyterWebsocketServer
1515

1616

1717
class YDocExtension(ExtensionApp):
@@ -21,8 +21,6 @@ class YDocExtension(ExtensionApp):
2121
Enables Real Time Collaboration in JupyterLab
2222
"""
2323

24-
_store: BaseYStore = None
25-
2624
disable_rtc = Bool(False, config=True, help="Whether to disable real time collaboration.")
2725

2826
file_poll_interval = Float(
@@ -81,14 +79,7 @@ def initialize_handlers(self):
8179
for k, v in self.config.get(self.ystore_class.__name__, {}).items():
8280
setattr(self.ystore_class, k, v)
8381

84-
# Instantiate the store
85-
self._store = self.ystore_class(log=self.log)
86-
87-
self.ywebsocket_server = JupyterWebsocketServer(
88-
rooms_ready=False,
89-
auto_clean_rooms=False,
90-
log=self.log,
91-
)
82+
self.store = self.ystore_class(log=self.log)
9283

9384
# self.settings is local to the ExtensionApp but here we need
9485
# the global app settings in which the file id manager will register
@@ -97,17 +88,23 @@ def initialize_handlers(self):
9788
self.serverapp.web_app.settings, self.log, self.file_poll_interval
9889
)
9990

91+
self.room_manager = RoomManager(
92+
self.store,
93+
self.file_loaders,
94+
self.serverapp.event_logger,
95+
self.document_save_delay,
96+
self.log,
97+
)
98+
10099
self.handlers.extend(
101100
[
102101
(
103102
r"/api/collaboration/room/(.*)",
104103
YDocWebSocketHandler,
105104
{
106105
"document_cleanup_delay": self.document_cleanup_delay,
107-
"document_save_delay": self.document_save_delay,
108-
"file_loaders": self.file_loaders,
109-
"store": self._store,
110-
"ywebsocket_server": self.ywebsocket_server,
106+
"store": self.store,
107+
"room_manager": self.room_manager,
111108
},
112109
),
113110
(r"/api/collaboration/session/(.*)", DocSessionHandler),
@@ -118,7 +115,7 @@ async def stop_extension(self):
118115
# Cancel tasks and clean up
119116
await asyncio.wait(
120117
[
121-
asyncio.create_task(self.ywebsocket_server.clean()),
118+
asyncio.create_task(self.room_manager.clear()),
122119
asyncio.create_task(self.file_loaders.clear()),
123120
],
124121
timeout=3,

0 commit comments

Comments
 (0)