Skip to content

Commit bea6afd

Browse files
authored
Merge pull request #64 from ImDevinC/handle-socket-reading
fix(sockets): improves how we read from sockets
2 parents 4328cd9 + 3ae94c2 commit bea6afd

4 files changed

Lines changed: 12 additions & 11 deletions

File tree

discordrpc/asyncdiscord.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
from loguru import logger as log
77

88
from .sockets import UnixPipe, SOCKET_BAD_BUFFER_SIZE, SOCKET_DISCONNECTED
9+
from socket import timeout
910
from .commands import *
1011
from .exceptions import *
1112
from .constants import MAX_SOCKET_RETRY_ATTEMPTS
@@ -82,10 +83,11 @@ def poll_callback(self, callback: callable):
8283
while self.polling:
8384
try:
8485
val = self.rpc.receive()
86+
except timeout:
87+
continue
8588
except Exception as ex:
8689
log.error(f"error receiving data from socket. {ex}")
8790
self.disconnect()
88-
return
8991
if val[0] == SOCKET_BAD_BUFFER_SIZE:
9092
log.debug("bad buffer size when receiving data from socket")
9193
if val[0] == SOCKET_DISCONNECTED:

discordrpc/constants.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,5 @@
66
10 # Number of IPC sockets to try (discord-ipc-0 through discord-ipc-9)
77
)
88
SOCKET_SELECT_TIMEOUT = 0.1 # Socket select timeout in seconds (reduced from 1.0s for 90% latency improvement)
9-
SOCKET_BUFFER_SIZE = 1024 # Socket receive buffer size in bytes
9+
#SOCKET_BUFFER_SIZE = 1024 # Socket receive buffer size in bytes
10+
SOCKET_BUFFER_SIZE = 8

discordrpc/sockets.py

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
SOCKET_BAD_BUFFER_SIZE: int = -2
1515
SOCKET_SEND_TIMEOUT: int = 5
1616
SOCKET_CONNECT_TIMEOUT: int = 2
17-
SOCKET_RECEIVE_TIMEOUT: int = 5
17+
SOCKET_RECEIVE_TIMEOUT: int = 10
1818

1919
class UnixPipe:
2020
def __init__(self):
@@ -64,25 +64,23 @@ def disconnect(self):
6464
self.socket = None # Reset so connect() creates a fresh socket
6565

6666
def send(self, payload, op):
67-
log.debug(f"Sending payload: {payload} with op: {op}")
6867
payload_bytes = json.dumps(payload).encode("UTF-8")
6968
header = struct.pack("<ii", op, len(payload_bytes))
7069
message = header + payload_bytes
7170
self.socket.settimeout(SOCKET_SEND_TIMEOUT)
7271
self.socket.sendall(message)
7372

7473
def receive(self) -> (int, str):
75-
self.socket.settimeout(SOCKET_RECEIVE_TIMEOUT)
7674
data = self.socket.recv(SOCKET_BUFFER_SIZE)
7775
if len(data) == 0:
7876
return SOCKET_DISCONNECTED, {}
7977
header = data[:8]
8078
code = int.from_bytes(header[:4], "little")
8179
length = int.from_bytes(header[4:], "little")
82-
all_data = data[8:]
83-
buffer_size = length - len(all_data)
84-
if buffer_size < 0:
80+
all_data = b""
81+
if length < 0:
8582
return SOCKET_BAD_BUFFER_SIZE, {}
86-
data = self.socket.recv(length - len(all_data))
87-
all_data += data
83+
if length > 0:
84+
data = self.socket.recv(length)
85+
all_data += data
8886
return code, all_data.decode("UTF-8")

manifest.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
2-
"version": "1.9.1",
2+
"version": "1.9.2",
33
"thumbnail": "store/thumbnail.png",
44
"id": "com_imdevinc_StreamControllerDiscordPlugin",
55
"name": "Discord - Debug",

0 commit comments

Comments
 (0)