v0.1.39
v0.1.39 — renderer crash/freeze 감지 강화 + AppErrorBoundary + single instance lock
배경
- v0.1.38 webhook 이 동작하지 않음. 사용자 보고: "일렉트론 앱에서 화면에 아무것도 표시되지 않는 버그 — 웹훅 알림 전송 안 됨". dev 모드 콘솔에 GPU cache
ACCESS_DENIED (0x5)와No handler registered for 'updater:getStatus'에러.
근본 원인 분석
- v0.1.38 webhook 은 main process 의
uncaughtException/unhandledRejection만 감지. **renderer 가 죽거나 freeze 되거나 React error 가 발생해도 main 핸들러는 안 발화.** - GPU cache 에러는 두 번째 Electron 인스턴스가 같은 userData 를 lock 하려다 충돌 → 회색/blank 화면.
updater:getStatusno-handler 는 dev 모드에서initAutoUpdater()가 early return → renderer 의useAutoUpdate훅이 reject → 콘솔 에러.- consent='unknown' 이면 자동 전송 안 함 + ConsentBanner 도 안 보임 (화면 blank).
변경 파일
electron/utils/crashReporter.ts:CrashTrigger확장:renderer-crashed,renderer-unresponsive,renderer-error,renderer-unhandled-rejection,react-error-boundary5종 추가.promptForConsentNative(reason)신규 — renderer 가 죽었을 때 nativedialog.showMessageBox로 즉시 동의 요청 ('이번에만' / '항상 허용' / '거부').electron/main.ts:app.requestSingleInstanceLock()— 두 번째 인스턴스는 즉시 종료, 첫 인스턴스 포커스. GPU cache 충돌 방지. (dev 모드는 hot-reload race 방지 위해 skip.)app.on('second-instance')— 첫 인스턴스가 두 번째 launch 시 창 포커스 +--project=인자 처리.handleRendererIncident(trigger, detail)— consent 검사 + unknown 이면 native dialog → sendCrashReport.webContents.on('render-process-gone')— renderer 프로세스 사망 (OOM/native crash/killed) 감지.webContents.on('unresponsive')— renderer 이벤트 루프 정지 감지 (30s+).webContents.on('preload-error')— preload 자체 throw 감지 (viewworkApi 마운트 실패 → blank 화면).electron/ipc/handlers.ts:- 신규 IPC
crashReport:reportRendererError— renderer 의 window error 를 main 으로 forward. consent 검사 + unknown 이면 native dialog. electron/preload.ts:viewworkApi.reportRendererError(payload)브리지 추가.CrashTrigger타입 동기화.electron/updater/autoUpdater.ts:- dev 모드에서 IPC noop stub 핸들러 등록 (이전엔 아예 안 등록 → "No handler" 에러).
- check/download/quitAndInstall/cancelAutoInstall/setAutoDownload/getStatus 6개 모두 idle 응답.
src/main.tsx:- 신규
AppErrorBoundary—<App />전체를 감쌈. React error 발생 시 fallback UI (앱 재시작 / 다시 시도 버튼) +viewworkApi.reportRendererError({ trigger: 'react-error-boundary', ... })자동 호출. src/App.tsx:window.addEventListener('error' | 'unhandledrejection')— 5초 throttle 로 main 에 forward.
결과
- blank screen 발생 시 native dialog 가 즉시 동의 요청 → 사용자 한 번 클릭으로 webhook 전송.
- AppErrorBoundary 가 React error 를 잡아 fallback UI 표시 + 자동 보고.
- 두 번째 인스턴스 launch 가 GPU cache 충돌을 일으키지 않음.
- dev 콘솔의 "No handler" 에러 사라짐.
검증
npx tsc --noEmitexit=0.npm run build성공 — out/main/main.js 350.65kB (+5.5kB), out/renderer/index-CtquyYbV.js 3,041.17kB (+5.6kB).
📦 GitHub 릴리스 노트: v0.1.39