Skip to content

Commit fc8fd7d

Browse files
committed
Allow transient rooms to log exceptions
1 parent 8d52c58 commit fc8fd7d

File tree

2 files changed

+32
-26
lines changed

2 files changed

+32
-26
lines changed

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

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,21 @@ async def prepare(self):
8282
if self._websocket_server.room_exists(self._room_id):
8383
self.room: YRoom = await self._websocket_server.get_room(self._room_id)
8484
else:
85+
# Logging exceptions, instead of raising them here to ensure
86+
# that the y-rooms stay alive even after an exception is seen.
87+
def exception_logger(exception: Exception, log: Logger) -> bool:
88+
"""A function that catches any exceptions raised in the websocket
89+
server and logs them.
90+
91+
The protects the y-room's task group from cancelling
92+
anytime an exception is raised.
93+
"""
94+
log.error(
95+
f"Document Room Exception, (room_id={self._room_id or 'unknown'}: ",
96+
exc_info=exception,
97+
)
98+
return True
99+
85100
if self._room_id.count(":") >= 2:
86101
# DocumentRoom
87102
file_format, file_type, file_id = decode_file_path(self._room_id)
@@ -103,33 +118,18 @@ async def prepare(self):
103118
self.event_logger,
104119
ystore,
105120
self.log,
106-
self._document_save_delay,
121+
exception_handler=exception_logger,
122+
save_delay=self._document_save_delay,
107123
)
108124

109-
def exception_logger(exception: Exception, log: Logger) -> bool:
110-
"""A function that catches any exceptions raised in the websocket
111-
server and logs them.
112-
113-
The protects the y-room's task group from cancelling
114-
anytime an exception is raised.
115-
"""
116-
room_id = "unknown"
117-
if self.room.room_id:
118-
room_id = self.room.room_id
119-
log.error(
120-
f"Document Room Exception, (room_id={room_id}: ",
121-
exc_info=exception,
122-
)
123-
return True
124-
125-
# Logging exceptions, instead of raising them here to ensure
126-
# that the y-rooms stay alive even after an exception is seen.
127-
self.room.exception_handler = exception_logger
128-
129125
else:
130126
# TransientRoom
131127
# it is a transient document (e.g. awareness)
132-
self.room = TransientRoom(self._room_id, self.log)
128+
self.room = TransientRoom(
129+
self._room_id,
130+
exception_handler=exception_logger,
131+
log=self.log,
132+
)
133133

134134
await self._websocket_server.start_room(self.room)
135135
self._websocket_server.add_room(self._room_id, self.room)

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

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
import asyncio
77
from logging import Logger
8-
from typing import Any
8+
from typing import Any, Callable
99

1010
from jupyter_events import EventLogger
1111
from jupyter_ydoc import ydocs as YDOCS
@@ -31,8 +31,9 @@ def __init__(
3131
ystore: BaseYStore | None,
3232
log: Logger | None,
3333
save_delay: float | None = None,
34+
exception_handler: Callable[[Exception, Logger], bool] | None = None,
3435
):
35-
super().__init__(ready=False, ystore=ystore, log=log)
36+
super().__init__(ready=False, ystore=ystore, exception_handler=exception_handler, log=log)
3637

3738
self._room_id: str = room_id
3839
self._file_format: str = file_format
@@ -285,8 +286,13 @@ async def _maybe_save_document(self, saving_document: asyncio.Task | None) -> No
285286
class TransientRoom(YRoom):
286287
"""A Y room for sharing state (e.g. awareness)."""
287288

288-
def __init__(self, room_id: str, log: Logger | None):
289-
super().__init__(log=log)
289+
def __init__(
290+
self,
291+
room_id: str,
292+
log: Logger | None = None,
293+
exception_handler: Callable[[Exception, Logger], bool] | None = None,
294+
):
295+
super().__init__(log=log, exception_handler=exception_handler)
290296

291297
self._room_id = room_id
292298

0 commit comments

Comments
 (0)