Skip to content

Commit a51f60f

Browse files
committed
improve logging on rtm timeout/disconnect issues
1 parent 4aa5edd commit a51f60f

File tree

1 file changed

+25
-8
lines changed

1 file changed

+25
-8
lines changed

livechat/utils/ws_client.py

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import json
66
import random
77
import ssl
8+
import subprocess
89
import threading
910
from time import sleep
1011
from typing import List, NoReturn, Union
@@ -13,13 +14,21 @@
1314
from websocket import WebSocketApp, WebSocketConnectionClosedException
1415
from websocket._abnf import ABNF
1516

17+
1618
from livechat.utils.structures import RtmResponse
1719

1820

1921
def on_message(ws_client: WebSocketApp, message: str):
2022
''' Custom WebSocketApp handler that inserts new messages in front of `self.messages` list. '''
2123
ws_client.messages.insert(0, json.loads(message))
2224

25+
def on_close(ws_client: WebSocketApp, close_status_code: int, close_msg: str):
26+
logger.info('websocket closed:')
27+
28+
if close_status_code or close_msg:
29+
logger.info("close status code: " + str(close_status_code))
30+
logger.info("close message: " + str(close_msg))
31+
2332

2433
class WebsocketClient(WebSocketApp):
2534
''' Custom extension of the WebSocketApp class for livechat python SDK. '''
@@ -77,22 +86,30 @@ def send(self, request: dict, opcode=ABNF.OPCODE_TEXT) -> dict:
7786
RtmResponse: RTM response structure (`request_id`, `action`,
7887
`type`, `success` and `payload` properties)
7988
'''
80-
response_timeout = self.response_timeout
8189
request_id = str(random.randint(1, 9999999999))
8290
request.update({'request_id': request_id})
8391
request_json = json.dumps(request, indent=4)
8492
logger.info(f'\nREQUEST:\n{request_json}')
93+
8594
if not self.sock or self.sock.send(request_json, opcode) == 0:
8695
raise WebSocketConnectionClosedException(
8796
'Connection is already closed.')
88-
while not (response := next(
89-
(item
90-
for item in self.messages if item.get('request_id') == request_id
91-
and item.get('type') == 'response'),
92-
None)) and response_timeout > 0:
97+
98+
response: dict
99+
def await_message():
100+
for item in self.messages:
101+
if item.get('request_id') == request_id and item.get('type') == 'response':
102+
response = item
103+
return
93104
sleep(0.2)
94-
response_timeout -= 0.2
95-
logger.info(f'\nRESPONSE:\n{json.dumps(response, indent=4)}')
105+
try:
106+
subprocess.run(['await_message', self.response_timeout], timeout = 2)
107+
logger.info(f'\nRESPONSE:\n{json.dumps(response, indent=4)}')
108+
except subprocess.TimeoutExpired:
109+
logger.error(f'timed out waiting for message with request_id {request_id}')
110+
logger.debug('all websocket messages received before timeout:')
111+
logger.debug(self.messages)
112+
96113
return RtmResponse(response)
97114

98115
def _wait_till_sock_connected(self,

0 commit comments

Comments
 (0)