5
5
6
6
import asyncio
7
7
from logging import Logger
8
- from typing import Any
8
+ from typing import Any , Callable
9
9
10
10
from pycrdt_websocket .websocket_server import WebsocketServer , YRoom
11
11
from pycrdt_websocket .ystore import BaseYStore
@@ -16,6 +16,16 @@ class RoomNotFound(LookupError):
16
16
pass
17
17
18
18
19
+ def exception_logger (exception : Exception , log : Logger ) -> bool :
20
+ """A function that catches any exceptions raised in the websocket
21
+ server and logs them.
22
+ This protects the websocket server's task group from cancelling
23
+ anytime an exception is raised.
24
+ """
25
+ log .error ("Jupyter Websocket Server: " , exc_info = exception )
26
+ return True
27
+
28
+
19
29
class JupyterWebsocketServer (WebsocketServer ):
20
30
"""Ypy websocket server.
21
31
@@ -30,9 +40,15 @@ def __init__(
30
40
ystore_class : BaseYStore ,
31
41
rooms_ready : bool = True ,
32
42
auto_clean_rooms : bool = True ,
43
+ exception_handler : Callable [[Exception , Logger ], bool ] | None = None ,
33
44
log : Logger | None = None ,
34
45
):
35
- super ().__init__ (rooms_ready , auto_clean_rooms , log )
46
+ super ().__init__ (
47
+ rooms_ready = rooms_ready ,
48
+ auto_clean_rooms = auto_clean_rooms ,
49
+ exception_handler = exception_handler ,
50
+ log = log ,
51
+ )
36
52
self .ystore_class = ystore_class
37
53
self .ypatch_nb = 0
38
54
self .connected_users : dict [Any , Any ] = {}
0 commit comments