2026-07-03 PulseUp 작업일지입니다. 오늘은 2건의 작업을 진행했습니다.
안정화 코드 자체 점검 후 버그 수정
현상/기능
- 수정한 소스 재점검에서 발견된 버그 수정
- 한글 주석·로그 문자열 깨짐(mojibake) 복구
- 세션 로그 마감 시 마지막 로그 유실 가능성 제거
작업
- `main/`
- `did-fail-load` 복구 로직에 `isMainFrame` 체크 추가. 서브프레임(Vimeo iframe) 로드 실패 시 전체 창이 해당 URL로 이동해버리는 문제를 차단하고, 메인 프레임 실패만 재시도하도록 수정(iframe 복구는 렌더러 워치독 담당)
- `main/heart-rate-modules/`
- 이전 PowerShell 편집으로 한글이 `???`로 손상된 파일을 UTF-8로 전체 재작성해 진단 로그 가독성 복구. 로직 변경 없음(주석·로그 문자열만 복원), 타입 체크 통과 확인
- `endWorkoutLogSession`에서 스트림을 닫기 전 `flushLogStream`(fsync)을 호출해, 운동 종료 직후 "로그 보내기" 시 세션 푸터·마지막 로그가 디스크에 기록되기 전에 수집되는 경쟁 상태를 방지
Electron 앱 안정화 (영상 멈춤·심박계·로그·크래시 복구)
현상/기능
- 실행 도중 일부 동영상이 멈춰 있는 경우 자동으로 다시 재생되도록 보완
- 심박계 연동 불안정 전면 점검 및 수정
- 로그 전송 시 파일이 커서 실패하는 문제 — 운동 시작부터 끝까지 하나의 로그 파일로 생성
- 프로그램 전반 안정화 (무인 환경 크래시 방치 해소)
작업
- `renderer/components/`
- 워치독 escalation 시 iframe src 리셋만 하던 것을 새 iframe 교체 + `Vimeo.Player` 재생성 + 핸들러/워치독 재부착 + players Map·큐 엔트리 참조 교체(`replacePlayerInstance`)로 완성. 반복 스톨 시 지수 백오프(5s×N, 최대 30s), destroy된 플레이어의 좀비 워치독은 iframe DOM 분리 감지로 자체 종료
- `main/heart-rate-modules/`
- ① 업로드 `sendToWeb`/`flushQueue`를 프로미스 체인(mutex)으로 직렬화해 JSONL 큐 파일 동시 read/write 경쟁(중복 전송·유실) 제거, 큐 파일 10MB 상한(초과 시 오래된 항목 삭제). ② 동글 `restart` 전 deviceId→슬롯 매핑을 `recentlyDisconnected`에 보존해 재스캔 시 원래 슬롯 복원. ③ USB 무수신 워치독 연속 트립 시 지수 백오프(1분×N, 최대 10분)로 무한 재시작 방지. ④ 동글 초기화 실패 시 30초×회차(최대 5분) 백오프 자동 재시도. ⑤ grace period 60초→기본 5분(`LINKHIIT_ANT_GRACE_MS` 조정 가능). ⑥ stale 콜백 meta의 `lastUpdate=0` 순서 버그 수정, connectionCheck 인터벌 재진입 가드 추가
- `main/`
- `endWorkoutLogSession` 추가 후 `stopPlaySession`에서 호출해 운동 종료 시 세션 로그를 마감하고 일반 로그로 복귀(종료 후 대기 로그로 세션 파일이 비대해지는 원인 제거). 같은 masterId 활성 세션이면 인트로→운동시작에서 재회전하지 않고 마커만 기록해 운동 1회=파일 1개 유지. 파일당 30MB 초과 시 ERROR/WARN/FATAL만 기록하는 안전장치 추가
- `main/`, `main/`
- `render-process-gone` 시 자동 reload(60초 내 연속 3회 초과 시 `app.relaunch`), `unresponsive` 10초 후 강제 reload, `did-fail-load`(ERR_ABORTED 제외) 3초 후 재시도, `child-process-gone`(GPU 등) 로그 추가. 로그 디렉터리 총 500MB 상한(오래된 파일부터 삭제) 적용. 타입체크·vitest 32건 전체 통과 확인