Avoid double JSON encoding/decoding (#287)
This commit is contained in:
parent
3775916c5c
commit
c8978681f6
2 changed files with 9 additions and 10 deletions
|
|
@ -156,11 +156,11 @@ class SseServerTransport:
|
||||||
response = Response("Could not find session", status_code=404)
|
response = Response("Could not find session", status_code=404)
|
||||||
return await response(scope, receive, send)
|
return await response(scope, receive, send)
|
||||||
|
|
||||||
json = await request.json()
|
body = await request.body()
|
||||||
logger.debug(f"Received JSON: {json}")
|
logger.debug(f"Received JSON: {body}")
|
||||||
|
|
||||||
try:
|
try:
|
||||||
message = types.JSONRPCMessage.model_validate(json)
|
message = types.JSONRPCMessage.model_validate_json(body)
|
||||||
logger.debug(f"Validated client message: {message}")
|
logger.debug(f"Validated client message: {message}")
|
||||||
except ValidationError as err:
|
except ValidationError as err:
|
||||||
logger.error(f"Failed to parse message: {err}")
|
logger.error(f"Failed to parse message: {err}")
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@ from contextlib import asynccontextmanager
|
||||||
|
|
||||||
import anyio
|
import anyio
|
||||||
from anyio.streams.memory import MemoryObjectReceiveStream, MemoryObjectSendStream
|
from anyio.streams.memory import MemoryObjectReceiveStream, MemoryObjectSendStream
|
||||||
|
from pydantic_core import ValidationError
|
||||||
from starlette.types import Receive, Scope, Send
|
from starlette.types import Receive, Scope, Send
|
||||||
from starlette.websockets import WebSocket
|
from starlette.websockets import WebSocket
|
||||||
|
|
||||||
|
|
@ -33,10 +34,10 @@ async def websocket_server(scope: Scope, receive: Receive, send: Send):
|
||||||
async def ws_reader():
|
async def ws_reader():
|
||||||
try:
|
try:
|
||||||
async with read_stream_writer:
|
async with read_stream_writer:
|
||||||
async for message in websocket.iter_json():
|
async for msg in websocket.iter_text():
|
||||||
try:
|
try:
|
||||||
client_message = types.JSONRPCMessage.model_validate(message)
|
client_message = types.JSONRPCMessage.model_validate_json(msg)
|
||||||
except Exception as exc:
|
except ValidationError as exc:
|
||||||
await read_stream_writer.send(exc)
|
await read_stream_writer.send(exc)
|
||||||
continue
|
continue
|
||||||
|
|
||||||
|
|
@ -48,10 +49,8 @@ async def websocket_server(scope: Scope, receive: Receive, send: Send):
|
||||||
try:
|
try:
|
||||||
async with write_stream_reader:
|
async with write_stream_reader:
|
||||||
async for message in write_stream_reader:
|
async for message in write_stream_reader:
|
||||||
obj = message.model_dump(
|
obj = message.model_dump_json(by_alias=True, exclude_none=True)
|
||||||
by_alias=True, mode="json", exclude_none=True
|
await websocket.send_text(obj)
|
||||||
)
|
|
||||||
await websocket.send_json(obj)
|
|
||||||
except anyio.ClosedResourceError:
|
except anyio.ClosedResourceError:
|
||||||
await websocket.close()
|
await websocket.close()
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue