@@ -73,6 +73,32 @@ async def close(self) -> None:
7373 self ._rate_limiter .close ()
7474 await self ._close_all_sessions ()
7575
76+ async def get_or_create_session (self ) -> ClientSession :
77+ async with self ._create_session_lock :
78+ existing_session = await self ._get_existing_session ()
79+ if not existing_session :
80+ return await self ._create_new_session ()
81+ is_session_open = await existing_session .is_session_open ()
82+ if not is_session_open :
83+ return await self ._create_new_session ()
84+ is_ws_open = await existing_session .is_websocket_open ()
85+ if is_ws_open :
86+ return existing_session
87+ new_ws , _ , hs_response = await self ._establish_new_connection (
88+ existing_session
89+ )
90+ if hs_response .status .sessionId == existing_session .session_id :
91+ logger .info (
92+ "Replacing ws connection in session id %s" ,
93+ existing_session .session_id ,
94+ )
95+ await existing_session .replace_with_new_websocket (new_ws )
96+ return existing_session
97+ else :
98+ logger .info ("Closing stale session %s" , existing_session .session_id )
99+ await existing_session .close ()
100+ return await self ._create_new_session ()
101+
76102 async def _get_existing_session (self ) -> Optional [ClientSession ]:
77103 async with self ._session_lock :
78104 if not self ._sessions :
@@ -190,33 +216,7 @@ async def _create_new_session(
190216 async def _retry_connection (self ) -> ClientSession :
191217 if not self ._transport_options .transparent_reconnect :
192218 await self ._close_all_sessions ()
193- return await self ._get_or_create_session ()
194-
195- async def _get_or_create_session (self ) -> ClientSession :
196- async with self ._create_session_lock :
197- existing_session = await self ._get_existing_session ()
198- if not existing_session :
199- return await self ._create_new_session ()
200- is_session_open = await existing_session .is_session_open ()
201- if not is_session_open :
202- return await self ._create_new_session ()
203- is_ws_open = await existing_session .is_websocket_open ()
204- if is_ws_open :
205- return existing_session
206- new_ws , _ , hs_response = await self ._establish_new_connection (
207- existing_session
208- )
209- if hs_response .status .sessionId == existing_session .session_id :
210- logger .info (
211- "Replacing ws connection in session id %s" ,
212- existing_session .session_id ,
213- )
214- await existing_session .replace_with_new_websocket (new_ws )
215- return existing_session
216- else :
217- logger .info ("Closing stale session %s" , existing_session .session_id )
218- await existing_session .close ()
219- return await self ._create_new_session ()
219+ return await self .get_or_create_session ()
220220
221221 async def _send_handshake_request (
222222 self ,
0 commit comments