call-av — 메신저 v3 WebRTC 통화 배선 완성
개요
끊겨 있던 WebRTC 통화 시그널링을 ADDITIVE로 연결해 1:1 음성/영상 통화가 실제 동작하도록 완성. signaling.js를 SSOT 실행본으로 ws-server-v3.js 라우터에 위임, 클라이언트 통화 객체 보완, 통화 UI 번들 주입.
무엇을 했는지
- signaling.js (SSOT): ICE_SERVERS를 자체 인프라(stun:stun.crowny.org:3478)로 교체 + 환경변수(CROWNY_STUN/CROWNY_TURN/STUN_FALLBACK) 주입 구조. onOffer가 발신자에게 CALL_STATE(ringing)로 서버 정본 callId+iceServers를 통지(기존엔 발신자가 callId를 못 받던 갭 해결).
- ws-server-v3.js: sendTo 정의 직후
require('./signaling').setupSignaling(connections, sendTo) ADDITIVE. 라우터 switch default 직전 CALL_ 11종 case → sig.handle. close 핸들러에 sig.onDisconnect(통화 정리). wallet-crd 레인(handleWalletSend)과 라인 분리 — 충돌 없음.
- 통화UI.한선: 발신()은 클라 callId 생성 제거(서버 정본 사용), _peer 저장, overlay 표시. 수락()에 createAnswer→setLocalDescription→CALL_ANSWER 송신 추가(핵심 누락 보완). onState(ringing)로 _callId 수신, 조기 ICE 버퍼링(flushIce). onBusy/onReject/onEnd 추가. ICE 서버를 서버 응답에서 setIce.
- index.html(웹v3): startCall('audio'|'video') 스텁→통화.발신(otherUser,type). wsRecv에 CALL_ 7종 디스패치. 통화 번들(CSS+오버레이 스켈레톤+통화JS) </body> 직전 주입(기본 hidden).
- 앱.한선: 앱.통화/앱.화상 스텁→통화.발신. WS수신 체인에 CALL_ 디스패치.
- 동반본: ws-server-v3.한선에 시그널처리()+CALL_ 라우팅, signaling.한선/시그널링.한선 STUN 자체 인프라 동기화.
검증
- 모든 .한선 hanseonc_high 컴파일 성공: 통화UI/앱/ws-server-v3/signaling/시그널링/통화.한선
- signaling.js 통합 스모크: offer→ringing+offer(자체STUN)→answer→ICE→disconnect 정리까지 정상, roomStats 0
- ws-server-v3.js 라이브 로드 정상(signaling 배선 후)
관련 파일
- /Users/ef/CrownyOS/apps/메신저/v3/서버/signaling.js
- /Users/ef/CrownyOS/apps/메신저/v3/서버/ws-server-v3.js
- /Users/ef/CrownyOS/apps/메신저/v3/웹v3/통화UI.한선
- /Users/ef/CrownyOS/apps/메신저/v3/웹v3/index.html
- /Users/ef/CrownyOS/apps/메신저/v3/웹v3/앱.한선
- /Users/ef/CrownyOS/apps/메신저/v3/서버/ws-server-v3.한선
- /Users/ef/CrownyOS/apps/메신저/v3/서버/signaling.한선
- /Users/ef/CrownyOS/apps/메신저/v3/웹v3/시그널링.한선
잔여 이슈 (followups)
- 자체 STUN/TURN(stun.crowny.org:3478) 미배포 — 대칭 NAT 통과 위해 coturn 류 자체 TURN 배포 필요. 미배포 구간은 STUN_FALLBACK=1 시 Google 폴백.
- 그룹 통화(CALL_GROUP/JOIN/LEAVE) 서버 signaling.js는 지원하나 클라 통화UI는 1:1 멀티 PeerConnection 미구현(mesh) — 그룹 UI 후속.
- 주입된 오버레이 스켈레톤이 수신 시 발신자 이름/아바타를 동적 갱신 안 함(통화.onOffer가 #call-name 업데이트 추가 필요).
- crowny-ai 프론트에서 메신저 통화UI iframe/모듈 재사용(통화 버튼) — ai-bridge/crownyos-app 레인과 연계 후속.
- 앱.한선 동반본 시그널처리는 CALL_GROUP* 미라우팅(JS SSOT만 지원).