Skip to content

Commit 4633e2d

Browse files
committed
Use pickle instead of JSON for private records
1 parent d17a70e commit 4633e2d

File tree

2 files changed

+9
-17
lines changed

2 files changed

+9
-17
lines changed

reflex/utils/token_manager.py

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
import asyncio
66
import dataclasses
7-
import json
7+
import pickle
88
import uuid
99
from abc import ABC, abstractmethod
1010
from collections.abc import AsyncIterator, Callable, Coroutine
@@ -14,7 +14,6 @@
1414
from reflex.istate.manager.redis import StateManagerRedis
1515
from reflex.state import BaseState, StateUpdate
1616
from reflex.utils import console, prerequisites
17-
from reflex.utils.format import json_dumps
1817
from reflex.utils.tasks import ensure_task
1918

2019
if TYPE_CHECKING:
@@ -329,7 +328,7 @@ async def link_token_to_sid(self, token: str, sid: str) -> str | None:
329328
try:
330329
await self.redis.set(
331330
redis_key,
332-
json.dumps(dataclasses.asdict(socket_record)),
331+
pickle.dumps(socket_record),
333332
ex=self.token_expiration,
334333
)
335334
except Exception as e:
@@ -387,11 +386,7 @@ async def _subscribe_lost_and_found_updates(
387386
)
388387
async for message in pubsub.listen():
389388
if message["type"] == "pmessage":
390-
record_dict = json.loads(message["data"].decode())
391-
record = LostAndFoundRecord(
392-
token=record_dict["token"],
393-
update=StateUpdate(**record_dict["update"]),
394-
)
389+
record = pickle.loads(message["data"])
395390
await emit_update(record.update, record.token)
396391

397392
def ensure_lost_and_found_task(
@@ -429,10 +424,9 @@ async def _get_token_owner(self, token: str, refresh: bool = False) -> str | Non
429424

430425
redis_key = self._get_redis_key(token)
431426
try:
432-
record_json = await self.redis.get(redis_key)
433-
if record_json:
434-
record_data = json.loads(record_json)
435-
socket_record = SocketRecord(**record_data)
427+
record_pkl = await self.redis.get(redis_key)
428+
if record_pkl:
429+
socket_record = pickle.loads(record_pkl)
436430
self.token_to_socket[token] = socket_record
437431
self.sid_to_token[socket_record.sid] = token
438432
return socket_record.instance_id
@@ -463,7 +457,7 @@ async def emit_lost_and_found(
463457
try:
464458
await self.redis.publish(
465459
f"channel:{self._get_lost_and_found_key(owner_instance_id)}",
466-
json_dumps(record),
460+
pickle.dumps(record),
467461
)
468462
except Exception as e:
469463
console.error(f"Redis error publishing lost and found delta: {e}")

tests/units/utils/test_token_manager.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
from reflex.app import EventNamespace
1414
from reflex.istate.data import RouterData
1515
from reflex.state import StateUpdate
16-
from reflex.utils.format import json_dumps
1716
from reflex.utils.token_manager import (
1817
LocalTokenManager,
1918
RedisTokenManager,
@@ -703,7 +702,6 @@ async def test_redis_token_manager_lost_and_found_router_data(
703702
emit2_mock.assert_not_called()
704703
emit1_mock.assert_called_once()
705704
assert isinstance(emit1_mock.call_args[0][1], StateUpdate)
706-
assert emit1_mock.call_args[0][1].delta["state"]["router"] == json.loads(
707-
json_dumps(router)
708-
)
705+
assert isinstance(emit1_mock.call_args[0][1].delta["state"]["router"], RouterData)
706+
assert emit1_mock.call_args[0][1].delta["state"]["router"] == router
709707
emit1_mock.reset_mock()

0 commit comments

Comments
 (0)