Skip to content

Commit e207a5b

Browse files
fsecada01claude
andcommitted
fix: remove double-serialisation of payload in component-client.js
Closes #11 — payload was JSON.stringify'd before embedding in the request body, then the body itself was stringified again. Server received payload as a string instead of an object, causing TypeError on handler(**payload). - Removed inner JSON.stringify(payload) in component-client.js - Added server-side guards in FastAPI and Litestar adapters to handle double-serialised payloads from cached older JS (Django already had this) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent d34cc05 commit e207a5b

3 files changed

Lines changed: 23 additions & 3 deletions

File tree

src/component_framework/adapters/fastapi.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
"""FastAPI adapter for component endpoints."""
22

3+
import json
34
import logging
45

56
try:
@@ -47,9 +48,18 @@ async def component_endpoint(name: str, request: Request) -> JSONResponse:
4748
# Extract parameters
4849
params = data.get("params", {})
4950
event = data.get("event")
50-
payload = data.get("payload", {})
51+
payload_raw = data.get("payload", {})
5152
state_str = data.get("state")
5253

54+
# Guard against double-serialised payload from older client JS
55+
if isinstance(payload_raw, str):
56+
try:
57+
payload = json.loads(payload_raw)
58+
except (json.JSONDecodeError, ValueError):
59+
payload = {}
60+
else:
61+
payload = payload_raw
62+
5363
# Deserialize state if provided
5464
state = None
5565
if state_str:

src/component_framework/adapters/litestar.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
"""Litestar adapter for component endpoints."""
22

3+
import json
34
import logging
45

56
try:
@@ -49,9 +50,18 @@ async def component_endpoint(name: str, request: Request) -> Response:
4950
# Extract parameters
5051
params = data.get("params", {})
5152
event = data.get("event")
52-
payload = data.get("payload", {})
53+
payload_raw = data.get("payload", {})
5354
state_str = data.get("state")
5455

56+
# Guard against double-serialised payload from older client JS
57+
if isinstance(payload_raw, str):
58+
try:
59+
payload = json.loads(payload_raw)
60+
except (json.JSONDecodeError, ValueError):
61+
payload = {}
62+
else:
63+
payload = payload_raw
64+
5565
# Deserialize state if provided
5666
state = None
5767
if state_str:

src/component_framework/static/component_framework/js/component-client.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ class ComponentClient {
152152

153153
const body = {
154154
event,
155-
payload: JSON.stringify(payload),
155+
payload,
156156
...(stateJson ? { state: stateJson } : {}),
157157
};
158158

0 commit comments

Comments
 (0)