Skip to content

Commit e246a10

Browse files
Merge remote-tracking branch 'farhan/remove-json5-dep' into try-orjson
2 parents 7555e7b + 24b214c commit e246a10

2 files changed

Lines changed: 28 additions & 4 deletions

File tree

packages/reflex-base/src/reflex_base/.templates/web/utils/state.js

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
// State management for Reflex web apps.
22
import io from "socket.io-client";
3-
import JSON5 from "json5";
43
import env from "$/env.json";
54
import reflexEnvironment from "$/reflex.json";
65
import Cookies from "universal-cookie";
@@ -436,6 +435,25 @@ const resolveSocket = (socket) => {
436435
return socket?.current ?? socket;
437436
};
438437

438+
// Python's json.dumps emits bare Infinity/-Infinity/NaN tokens (invalid JSON).
439+
// Rewrite them outside string literals so JSON.parse accepts the payload.
440+
// 1e999 / -1e999 overflow to ±Infinity; NaN has no JSON literal, so it is
441+
// swapped for a sentinel string and revived back to NaN after parsing.
442+
// The alternation matches whole string literals first (passed through unchanged),
443+
// guaranteeing bare-token matches only land in numeric positions.
444+
const NAN_SENTINEL = "__reflex_nan__";
445+
const NON_FINITE_FLOAT_RE = /"(?:[^"\\]|\\.)*"|-?\bInfinity\b|\bNaN\b/g;
446+
const NON_FINITE_REPLACEMENTS = {
447+
Infinity: "1e999",
448+
"-Infinity": "-1e999",
449+
NaN: `"${NAN_SENTINEL}"`,
450+
};
451+
const rewriteBareNonFiniteFloats = (str) =>
452+
str.replace(NON_FINITE_FLOAT_RE, (match) =>
453+
match[0] === '"' ? match : NON_FINITE_REPLACEMENTS[match],
454+
);
455+
const reviveNonFiniteFloats = (_k, v) => (v === NAN_SENTINEL ? NaN : v);
456+
439457
/**
440458
* Queue events to be processed and trigger processing of queue.
441459
* @param events Array of events to queue.
@@ -541,9 +559,16 @@ export const connect = async (
541559
socket.current.io.encoder.replacer = (k, v) => (v === undefined ? null : v);
542560
socket.current.io.decoder.tryParse = (str) => {
543561
try {
544-
return JSON5.parse(str);
562+
return JSON.parse(str);
545563
} catch (e) {
546-
return false;
564+
try {
565+
return JSON.parse(
566+
rewriteBareNonFiniteFloats(str),
567+
reviveNonFiniteFloats,
568+
);
569+
} catch (e2) {
570+
return false;
571+
}
547572
}
548573
};
549574
// Set up a reconnect helper function

packages/reflex-base/src/reflex_base/constants/installer.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,6 @@ def DEPENDENCIES(cls) -> dict[str, str]:
122122
A dictionary of dependencies with their versions.
123123
"""
124124
return {
125-
"json5": "2.2.3",
126125
"react-router": cls._react_router_version,
127126
"react-router-dom": cls._react_router_version,
128127
"@react-router/node": cls._react_router_version,

0 commit comments

Comments
 (0)