4
4
import inspect
5
5
import time
6
6
import uuid
7
+ from collections import defaultdict
7
8
from contextlib import contextmanager
8
9
from pathlib import Path
9
10
from typing import TYPE_CHECKING , Any , Awaitable , Callable , ClassVar , Dict , Iterable , Iterator , List , Optional , Union
@@ -59,7 +60,7 @@ def __init__(self, page: page, *, request: Optional[Request]) -> None:
59
60
self .environ : Optional [Dict [str , Any ]] = None
60
61
self .shared = request is None
61
62
self .on_air = False
62
- self ._num_connections = 0
63
+ self ._num_connections = defaultdict ( int )
63
64
self ._delete_task : Optional [asyncio .Task ] = None
64
65
self ._deleted = False
65
66
self .tab_id : Optional [str ] = None
@@ -235,10 +236,10 @@ def on_disconnect(self, handler: Union[Callable[..., Any], Awaitable]) -> None:
235
236
"""Add a callback to be invoked when the client disconnects."""
236
237
self .disconnect_handlers .append (handler )
237
238
238
- def handle_handshake (self , next_message_id : Optional [int ]) -> None :
239
+ def handle_handshake (self , socket_id : str , next_message_id : Optional [int ]) -> None :
239
240
"""Cancel pending disconnect task and invoke connect handlers."""
240
241
self ._cancel_delete_task ()
241
- self ._num_connections += 1
242
+ self ._num_connections [ socket_id ] += 1
242
243
if next_message_id is not None :
243
244
self .outbox .try_rewind (next_message_id )
244
245
storage .request_contextvar .set (self .request )
@@ -247,18 +248,19 @@ def handle_handshake(self, next_message_id: Optional[int]) -> None:
247
248
for t in core .app ._connect_handlers : # pylint: disable=protected-access
248
249
self .safe_invoke (t )
249
250
250
- def handle_disconnect (self ) -> None :
251
+ def handle_disconnect (self , socket_id : str ) -> None :
251
252
"""Wait for the browser to reconnect; invoke disconnect handlers if it doesn't."""
252
253
self ._cancel_delete_task ()
253
- self ._num_connections -= 1
254
+ self ._num_connections [ socket_id ] -= 1
254
255
for t in self .disconnect_handlers :
255
256
self .safe_invoke (t )
256
257
for t in core .app ._disconnect_handlers : # pylint: disable=protected-access
257
258
self .safe_invoke (t )
258
259
if not self .shared :
259
260
async def delete_content () -> None :
260
261
await asyncio .sleep (self .page .resolve_reconnect_timeout ())
261
- if self ._num_connections == 0 :
262
+ if self ._num_connections [socket_id ] == 0 :
263
+ self ._num_connections .pop (socket_id )
262
264
self .delete ()
263
265
self ._delete_task = background_tasks .create (delete_content ())
264
266
0 commit comments