@@ -262,7 +262,8 @@ async def run(self) -> None:
262262 _receive .cancel ()
263263 return
264264
265- await self ._handle_stream (msg )
265+ if msg is not None : # this can happen
266+ await self ._handle_stream (msg )
266267
267268 async def _handle_stream (self , stream : Dict [str , Any ]):
268269 """
@@ -710,6 +711,13 @@ async def _reconnect(self, to_resume: bool, code: Optional[int] = 1012) -> None:
710711
711712 self ._client = None
712713
714+ # We need to check about existing heartbeater tasks for edge cases.
715+
716+ if self ._task :
717+ self ._task .cancel ()
718+ if self .__heartbeat_event .is_set ():
719+ self .__heartbeat_event .clear () # Because we're hardresetting the process
720+
713721 if not to_resume :
714722 url = self .ws_url if self .ws_url else await self ._http .get_gateway ()
715723 else :
@@ -721,12 +729,7 @@ async def _reconnect(self, to_resume: bool, code: Optional[int] = 1012) -> None:
721729
722730 self .__heartbeater .delay = data ["d" ]["heartbeat_interval" ]
723731
724- if self ._task :
725- self ._task .cancel ()
726- if self .__heartbeat_event .is_set ():
727- self .__heartbeat_event .clear () # Because we're hardresetting the process
728-
729- self ._task = create_task (self .run_heartbeat ())
732+ self ._task = create_task (self .run_heartbeat ())
730733
731734 if not to_resume :
732735 await self .__identify (self .__shard , self .__presence )
@@ -800,7 +803,19 @@ async def __receive_packet(self, ignore_lock: bool = False) -> Optional[Dict[str
800803 if packet .data is None :
801804 continue # We just loop it over because it could just be processing something.
802805
803- return loads (packet .data ) if isinstance (packet .data , str ) else None
806+ try :
807+ msg = loads (packet .data )
808+ except Exception as e :
809+ import traceback
810+
811+ log .debug (
812+ f'Error serialising message: { "" .join (traceback .format_exception (type (e ), e , e .__traceback__ ))} .'
813+ )
814+ # There's an edge case when the packet's None... or some other deserialisation error.
815+ # Instead of raising an exception, we just log it to debug, so it doesn't annoy end user's console logs.
816+ msg = None
817+
818+ return msg
804819
805820 async def _send_packet (self , data : Dict [str , Any ]) -> None :
806821 """
0 commit comments