diff --git a/apps/indexer/src/rpc.ts b/apps/indexer/src/rpc.ts index 17df081..e615160 100644 --- a/apps/indexer/src/rpc.ts +++ b/apps/indexer/src/rpc.ts @@ -12,6 +12,7 @@ function escapeControlCharactersInStrings(payload: string): string { let result = ""; let inString = false; let escaping = false; + let unicodeDigitsRemaining = 0; for (let index = 0; index < payload.length; index += 1) { const char = payload[index]; @@ -25,7 +26,41 @@ function escapeControlCharactersInStrings(payload: string): string { } if (escaping) { - result += char; + if (unicodeDigitsRemaining > 0) { + if (/^[0-9a-fA-F]$/.test(char)) { + result += char; + unicodeDigitsRemaining -= 1; + if (unicodeDigitsRemaining === 0) { + escaping = false; + } + continue; + } + + result += "\\u"; + result += "0".repeat(unicodeDigitsRemaining); + unicodeDigitsRemaining = 0; + escaping = false; + } + + if (char === "\"" || char === "\\" || char === "/" || char === "b" || char === "f" || char === "n" || char === "r" || char === "t") { + result += char; + escaping = false; + continue; + } + + if (char === "u") { + result += char; + unicodeDigitsRemaining = 4; + continue; + } + + result += "\\\\"; + const code = char.charCodeAt(0); + if (code <= 0x1f) { + result += `u${code.toString(16).padStart(4, "0")}`; + } else { + result += char; + } escaping = false; continue; }