Skip to content

fix(adapter): catch JSON.stringify RangeError on oversized bridge data#1960

Merged
piorpua merged 1 commit intomainfrom
fix/sentry-ELECTRON-D9
Mar 31, 2026
Merged

fix(adapter): catch JSON.stringify RangeError on oversized bridge data#1960
piorpua merged 1 commit intomainfrom
fix/sentry-ELECTRON-D9

Conversation

@kaizhou-lab
Copy link
Copy Markdown
Collaborator

Summary

  • Wrap JSON.stringify in adapter emit() with try-catch to prevent RangeError: Invalid string length when data payloads exceed V8's string size limit
  • Log the error and return early instead of crashing with an unhandled promise rejection
  • Also avoids redundant JSON.stringify calls per window by serializing once before the loop

Sentry Issue

ELECTRON-D9RangeError: Invalid string length in src/common/adapter/main.ts:39

  • 6 occurrences, last seen 2026-03-30
  • Triggered by oversized data passed to bridge.adapter.emit()JSON.stringify({ name, data })
  • Release: [email protected]

Root Cause

JSON.stringify throws RangeError: Invalid string length when the resulting string would exceed ~512 MB (V8 limit). The adapter's emit function called JSON.stringify without error handling, causing an unhandled promise rejection that crashed the event broadcasting.

Fix

  1. Serialize once before the window loop (also a minor perf improvement — avoids re-serializing per window)
  2. Catch serialization errors and log them with console.error
  3. Return early on failure — skip both IPC send and WebSocket broadcast

Test Plan

  • Added test case in tests/unit/adapterEmitGuard.test.ts that mocks JSON.stringify to throw RangeError and verifies:
    • No exception propagates
    • win.webContents.send is not called
    • broadcastToAll is not called
    • Error is logged to console
  • All existing adapter tests pass (5/5)
  • Type check passes (bunx tsc --noEmit)
  • Lint passes (0 errors)

When the adapter emits events to BrowserWindows, JSON.stringify can
throw RangeError ("Invalid string length") if the data payload exceeds
V8's string size limit. Wrap serialization in try-catch to prevent
unhandled promise rejection and log the error instead.

Fixes ELECTRON-D9
@kaizhou-lab kaizhou-lab marked this pull request as ready for review March 30, 2026 16:06
@piorpua piorpua added the bot:reviewing Review in progress (mutex) label Mar 31, 2026
@piorpua
Copy link
Copy Markdown
Contributor

piorpua commented Mar 31, 2026

Code Review:fix(adapter): catch JSON.stringify RangeError on oversized bridge data (#1960)

变更概述

本 PR 修复了 Sentry ELECTRON-D9 问题:当 bridge adapter 的 emit 函数接收到超大数据时,JSON.stringify 抛出 RangeError: Invalid string length,导致未处理的异常崩溃。修改涉及 src/common/adapter/main.ts 和对应测试文件,共 2 个文件。


方案评估

结论:✅ 方案合理

方案正确解决了目标问题:在序列化阶段 catch RangeError,记录错误后 early return,避免崩溃传播。额外将 JSON.stringify 提到循环外一次序列化,消除了原先每个 window 重复序列化的开销。方案与项目架构一致(main process 层面的错误处理),无过度工程化,实现路径简洁直接。


问题清单

未发现 CRITICAL、HIGH 或 MEDIUM 级别问题。


汇总

# 严重级别 文件 问题
无阻塞性问题

结论

批准合并 — 修复逻辑正确,错误处理恰当(catch + log + early return),序列化优化合理,测试覆盖了核心错误路径(mock RangeError + 验证 IPC/WebSocket 均未调用),代码质量良好。


本报告由本地 pr-review skill 生成,包含完整项目上下文,无截断限制。

CONCLUSION: APPROVED
IS_CRITICAL_PATH: false
PR_NUMBER: 1960

@piorpua
Copy link
Copy Markdown
Contributor

piorpua commented Mar 31, 2026

✅ 已自动 review,无阻塞性问题,正在触发自动合并。

@piorpua piorpua merged commit 5ed97af into main Mar 31, 2026
17 checks passed
@piorpua piorpua deleted the fix/sentry-ELECTRON-D9 branch March 31, 2026 05:11
@piorpua piorpua added bot:done Auto-merged by bot and removed bot:reviewing Review in progress (mutex) labels Mar 31, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bot:done Auto-merged by bot

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants