-
-
Notifications
You must be signed in to change notification settings - Fork 92
Open
Description
Hi,
there are various issues with the current redis implementation. I suspect it has to do with updates of asyncio, but I cannot say for certain. I was able to identify two problems:
This first error is as follows:
File "/usr/local/lib/python3.12/asyncio/tasks.py", line 461, in wait
raise TypeError("Passing coroutines is forbidden, use tasks explicitly.")
This seems to happen because the call to handle_message
(See https://github.com/etesync/server/blob/master/etebase_server/fastapi/routers/websocket.py#L132) is not wrapped in a task:
try:
while True:
# We wait on the websocket so we fail if web sockets fail or get data
receive = asyncio.create_task(websocket.receive()) # <=== this is correct
done, pending = await asyncio.wait(
{receive, handle_message()}, # <=== but is missing for handle_message
return_when=asyncio.FIRST_COMPLETED,
)
for task in pending:
task.cancel()
if receive in done:
# Web socket should never receive any data
await websocket.close(code=status.WS_1008_POLICY_VIOLATION)
return
After fixing that, a second error appears:
File "/etebase/etebase_server/fastapi/routers/websocket.py", line 124, in handle_message
_, message = message_raw
^^^^^^^^^^
ValueError: too many values to unpack (expected 2)
This seems to have to do with the fact, that pubsub.get_message
does not return a tuple, but a dict (See https://aredis.readthedocs.io/en/latest/pubsub.html). When casting it to a tuple (See https://github.com/etesync/server/blob/master/etebase_server/fastapi/routers/websocket.py#L122), it fails:
async def handle_message():
msg = await pubsub.get_message(ignore_subscribe_messages=True, timeout=20)
message_raw = t.cast(t.Optional[t.Tuple[str, bytes]], msg) # <=== should instead be treated as map
if message_raw:
_, message = message_raw # <=== access via data
await ws.send_bytes(message)
Metadata
Metadata
Assignees
Labels
No labels