마지막 업데이트 2026-07-22
치료사(호스트)가 특정 세션(룸) 또는 그룹을 모니터링할 때 누가 점유 중인지(claim)를 관리해 중복 모니터링을 막고, 좀비 점유를 정리하는 서버측 로직. 모니터 대시보드(#13)의 진입 게이트, SFU 서버(#2) 핸들러군의 일부.
peerKind): monitor-presence(접속만, MONITOR_CONNECTED #2) / monitoring-claim(특정 룸 점유) / group-monitoring-claim(그룹 카드뷰 점유). claim은 presence peer와 별도 peerId로 관리된다.
| 종류 | peerId | 의미 |
|---|---|---|
| 룸 모니터링 | monitoring-claim:{hostId}:{roomId} | 한 룸을 한 호스트가 점유(1:1/포커스뷰) |
| 그룹 모니터링 | group-monitoring:{hostId}:{groupId}:{socketId} | 그룹 카드뷰 점유(socketId 포함 → 탭별) |
resolveOtherMonitor로 다른 socket(다른 탭/유저)이 이 룸을 점유 중인지 검사 — 메모리 + Redis(cross-instance) 양쪽(MONITOR_CLAIM_SOURCE).isMonitorAlive로 소켓 생존 확인. 죽었으면(좀비) removePeer로 full cleanup 후 진행. 살아있으면 ALREADY_MONITORED(점유자 정보 동봉) 반환.monitoring-claim PeerInfo 생성(monitoringRoomId/monitoringGroupId). groupId 있으면 socket.join("monitor-group-{groupId}").broadcastRoomList(모니터링 상태 포함 갱신).monitoring-claim:{hostId}:{roomId} deletePeer.monitoringRoomId로 들고 있으면(구버전 잔재) null로 비움.socket.leave("monitor-group-{groupId}"). broadcast.카드뷰(그룹 그리드) 진입 시 그룹 단위 점유. claim peerId에 socketId 포함 → 한 호스트가 여러 탭에서 같은 그룹을 봐도 탭별 claim. group-monitoring-claim PeerInfo 생성 + socket.join("monitor-group-{groupId}").
monitor-group-{groupId} socket room은 그룹 단위 broadcast(카드 상태·토스트 등)를 같은 그룹을 보는 모든 호스트에게 전달하는 통로다.resolveOtherMonitor). 메모리/Redis 불일치는 warn 로깅.isMonitorAlive false) removePeer로 정리 후 진행. 이 단계를 빼면 죽은 점유 때문에 영영 ALREADY_MONITORED.| 파일/심볼 | 역할 |
|---|---|
| monitoring-handlers.ts (HOST_START_MONITORING L138, STOP L232, GROUP L277) | claim 등록·해제 |
| resolveOtherMonitor / isMonitorAlive (L59~) | cross-instance 점유·생존 확인 |
| broadcast-utils.ts | broadcastRoomList/ConnectedHosts |
| connection-handlers.ts (MONITOR_CONNECTED) | presence 등록(#2) |