Skip to content

Commit a893b45

Browse files
committed
Start y Websocket Server earlier and make it resilient to crashes
1 parent adcde32 commit a893b45

File tree

2 files changed

+23
-12
lines changed

2 files changed

+23
-12
lines changed

projects/jupyter-server-ydoc/jupyter_server_ydoc/app.py

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@
1010
from jupyter_ydoc.ybasedoc import YBaseDoc
1111
from pycrdt import Doc
1212
from pycrdt_websocket.ystore import BaseYStore
13-
from traitlets import Bool, Float, Type
13+
from pycrdt_websocket.websocket_server import exception_logger
14+
from traitlets import Bool, Float, Type, Set, Instance
1415

1516
from .handlers import DocSessionHandler, YDocWebSocketHandler
1617
from .loaders import FileLoaderMapping
@@ -24,7 +25,6 @@
2425
)
2526
from .websocketserver import JupyterWebsocketServer, RoomNotFound
2627

27-
2828
class YDocExtension(ExtensionApp):
2929
name = "jupyter_server_ydoc"
3030
app_name = "Collaboration"
@@ -75,6 +75,10 @@ class YDocExtension(ExtensionApp):
7575
model.""",
7676
)
7777

78+
_running_ywebsocket_server = Instance(asyncio.Task, allow_none=True)
79+
ywebsocket_server = Instance(JupyterWebsocketServer, allow_none=True)
80+
81+
7882
def initialize(self):
7983
super().initialize()
8084
self.serverapp.event_logger.register_event_schema(EVENTS_SCHEMA_PATH)
@@ -90,6 +94,14 @@ def initialize_settings(self):
9094
}
9195
)
9296

97+
self.ywebsocket_server = JupyterWebsocketServer(
98+
rooms_ready=False,
99+
auto_clean_rooms=False,
100+
ystore_class=self.ystore_class,
101+
log=self.log,
102+
exception_logger=exception_logger
103+
)
104+
93105
def initialize_handlers(self):
94106
self.serverapp.web_app.settings.setdefault(
95107
"page_config_data",
@@ -103,13 +115,6 @@ def initialize_handlers(self):
103115
for k, v in self.config.get(self.ystore_class.__name__, {}).items():
104116
setattr(self.ystore_class, k, v)
105117

106-
self.ywebsocket_server = JupyterWebsocketServer(
107-
rooms_ready=False,
108-
auto_clean_rooms=False,
109-
ystore_class=self.ystore_class,
110-
log=self.log,
111-
)
112-
113118
# self.settings is local to the ExtensionApp but here we need
114119
# the global app settings in which the file id manager will register
115120
# itself maybe at a later time.
@@ -134,6 +139,14 @@ def initialize_handlers(self):
134139
]
135140
)
136141

142+
async def start_extension(self):
143+
"""Start the y-websocket server.
144+
"""
145+
self.log.info("Starting the Collaborative Document Server.")
146+
147+
# Start the websocket server
148+
self._running_ywebsocket_server = asyncio.create_task(self.ywebsocket_server.start())
149+
137150
async def get_document(
138151
self: YDocExtension,
139152
*,

projects/jupyter-server-ydoc/jupyter_server_ydoc/handlers.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -70,9 +70,7 @@ def create_task(self, aw):
7070
task.add_done_callback(self._background_tasks.discard)
7171

7272
async def prepare(self):
73-
if not self._websocket_server.started.is_set():
74-
self.create_task(self._websocket_server.start())
75-
await self._websocket_server.started.wait()
73+
await self._websocket_server.started.wait()
7674

7775
# Get room
7876
self._room_id: str = room_id_from_encoded_path(self.request.path)

0 commit comments

Comments
 (0)