Skip to content

Commit 4d932c1

Browse files
authored
fix: Mitigate gateway null responses. (#1053)
* fix: Handle gateway stream when None is given. * refactor: Change occurrence of heartbeater task recreation (This just mitigates an edgecase of heartbeating when the wsclient is None. * chore: pre-commit ci
1 parent ee4376c commit 4d932c1

File tree

1 file changed

+23
-8
lines changed

1 file changed

+23
-8
lines changed

interactions/api/gateway/client.py

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)