: 아래의 과정으로 코드 분석해보기
Publish 과정
Client(엔드포인트에서 사용하는 사용자)
- 유효성검사
- RTCRtp인코딩 파라미터, 오디오, 비디오 인코딩 파라미터 validation
- audio, video가 MediaStream에 존재하는 트랙들과 일관된지
- options의 audio, video가 있는지
- audio,video boolean이나 array인지, 올바른 파라미터 들어와있는지
- +기타 유효성 검사
- peerConnection 생성
- signaling Message 보냄(publish로)
- 유효성검사
V11Client
on('publish')
if(!that.inRoom)
-> 방에 join하지 않았다면 여기서 에러- streamID (난수)생성
- Validation 이후
- Portal의 publish call
- clientId == participantId, stream_id, req == pubInfo
Portal
- portal/rpcRequest에 RPC call(publish)
- participants[participantId].controller (여기선 conference Agent), participantId, streamId, pubInfo
- Conference Agent에게 요청됨(that.publish)
- portal/rpcRequest에 RPC call(publish)
Conference Agent - 여기서 Participants[participantId] 등록(addParticipant)
- 유효성 검사
- 해당 시점 accessController, roomController 객체의 존재여부
- Portal로부터 전달된 participants[participantId] (== 해당 Client가 Join 했는지)
- auth, input 수, Stream 이미 존재, audio or video 금지여부 등
- sip or analytics 타입의 경우 stream 추가하고 끝
- initiateStream을 통해 streams 배열에 stream객체 새롭게 저장
- Pub할 때 streams[streamId] init, Sub할 때 Subscriptions[subscriptionId] init
- 생성 시점: addStream
- 여기서 streamId, subscriptionId는 v11Client에서 생성한 Random Number
- streams[stream]에는 info가 있음(
info : { owner: participantId, type: pubInfo.type }
)
- Pub할 때 streams[streamId] init, Sub할 때 Subscriptions[subscriptionId] init
- format_preference의 video, audio를 pubInfo의 video,audio로 set
- webrtc worker node를 얻기 위해 accessController에게 initiate 요청
- 유효성 검사
accessController
Session 배열에 session 객체 새롭게 저장
- Pub / Sub에 관계 없이 전부 sessions[sessionId]에 추가.(이 때 conflict 방지 해야 함)
getWorkernode를 통해 workerAgent.Id, workerNode 얻음
-> cluster_name, sessionOptions.type == pubInfo.type(webrtc), {in_ room, sessionId}, origin == participants[participantId].getOrigin()
clusterManager에게 scheduling 요청 -> scheduler가 workerAgent 전해주고 -> workerAgent에 해당하는 node를 node manager에게 요청 -> 준비된 node 할당
workerAgent.id, workerNode 반환
worker, workers[worker].info
이 결과를 locality 변수에 저장, 해당 세션ID에 이 worker 정보 저장
initiate를 통해 worker node, session id 및 정보들 conference/rpcRequest의 RPC call
- conference/rpcRequest에서는 목적노드의 publish call -> worker node에게로
- sessionId (=connectionId), sessionType (=connectionType), options
- conference/rpcRequest에서는 목적노드의 publish call -> worker node에게로
Worker node(access node) (webrtc/index)
- 중복 연결 방지 validation
- (connectionType == sessionType이 webrtc일 때) createdWebRTCConnection
- WrtcConnection 생성 로직
- 생성되면서 내부 변수들 세팅, wrtc 변수를 새로운 Connection으로 만들어주고, addmediaStream 진행 됨
- initWebRtcConnection -> wrtc 객체에
status_event
라는 event Handler 등록- 이후 이벤트 발생시 이벤트로 전해지는 결과(evt) 타입이
answer
,candidate
,ready
,rid
,firstrid
에 따라 결과 나뉨 - 상황에 따라 콜백으로
on_status
oron_mediaUpdate
발생
- 이후 이벤트 발생시 이벤트로 전해지는 결과(evt) 타입이
- addConnection
- 중복 connection 객체 생성 방지, 새로 생성해 배열에 저장, return ‘ok’
- accessController까지 내려가, sessions[sessionId].state를 connecting으로 변경 후 return ‘ok’
- conference에서도 result 전달, -> portal -> v11Client -> Client
- webRTC connection complete
wrtc 객체 event 발생(status_event)
- 정상일 때 ready 상태이므로
on_status({type: 'ready', audio: ~~, video: ~~, simulcast: ~~})
발생 - workder node (webrtc/index)에서 콜백으로
notifyStatus
. - options.controller에게
onSessionProgress
remote 요청 - Conference Agent의 onSessionProgress에서
accessController.onSessionStatus(sessionId, sessionStatus)
- onSessionStatus에서 ready -> onReady
- audio, video 세팅 후
on_session_established
(콜백)하면, Conference Agent에서 accessController 만들 때 콜백으로 등록해 놓은 onSessionEstablished 실행 - worker Agent, worker Node 정보가 등록되어있는 sessionInfo, session을 전달하며
addStream
- 참가자(participantId == client)에게 “progress” 메시지, sessionId와 status : ready를 함께 전송
- 정상일 때 ready 상태이므로
Subscribe 과정
- Client
- send signaling message(subscribe)
- V11Client
- Subscripbe Id 생성, validation,
- portal에게 subscribe 요청
- Portal
- rpcRequest subscribe 요청(portal/rpcReq)
- Conference Agent가 받음
- Conference Agent
- 여러 유효성체크, subs 정보 저장
- initiateSubscription -> subsc배열에 subs 객체 추가
- accessController.initiate
- Access Controller
- Session 배열에 session 객체 저장
- getWorkernode를 통해 worker node 얻고, locality 변수에 저장
- 이후 worker node, session에 대한 정보들 conference/rpcRequest의 RPC call(initiate)
- conference/rpcReq 에서 direction === out이므로 목적노드의 subscribe 요청
- Worker node(webrtc/index)
- webRTC connection 생성 (createdWebRTCConnection)
- 위의 메서드 내부에서 WrtcConnection 객체 생성, 이 때 pub을 위한 addMediaStream 또한 진행됨(미디어 스트림 생성)
- Wrtc 객체 생성하면서 Webrtc connection Ready되고, 여기서 Conference node에게 connection ready status를 알려야 함.( onSessionProgress 호출)
- accessController에서 onReady 상태가 되면, 미리 세팅해두었던 conference의 onSessionEstablished를 호출
- Conference
- addSubscription 호출, media.video, audio 설정 후 roomController -> subscribe
- getAudioStream
- mixed Stream이라면 mixedStream을 생성하고 AudioStream을 얻음
- getVideoStream
- mixed Stream이고, 매치되는 mixed stream이 없다면 해당하는 Stream을 생성 후 얻음
Reference)
Client - https://github.com/open-webrtc-toolkit/owt-client-javascript/blob/8fae8a8e1714109d0851391f8fd20ffe3775cb65/src/sdk/conference/channel.js#L146
Server - https://github.com/open-webrtc-toolkit/owt-server