1- // DEPRECATED.
2- // use 'useMeetingMediaStreamsV2' instead
3-
41import { useEffect , useState } from 'react' ;
5- import { Socket } from 'socket.io-client' ;
2+ import { Socket , io } from 'socket.io-client' ;
63import { STUN_SERVER } from 'src/constants/rtc' ;
74import RTC from 'src/utils/rtc' ;
8- import { setTrack , TrackKind } from 'src/utils/trackSetter' ;
5+ import { setTrack } from 'src/utils/trackSetter' ;
6+
7+ export interface MeetingMediaStream {
8+ stream : MediaStream ;
9+ id : string ;
10+ type : 'local' | 'remote' ;
11+ audioOn : boolean ;
12+ videoOn : boolean ;
13+ }
14+
15+ export type SetLocalAudio = ( audioOn : boolean ) => void ;
16+ export type SetLocalVideo = ( videoOn : boolean ) => void ;
917
1018export function useMeetingMediaStreams (
1119 socket : Socket ,
12- ) : [ Map < string , MediaStream > , ( kind : TrackKind , turnOn : boolean ) => void ] {
13- const [ mediaStreams , setMediaStreams ] = useState < Map < string , MediaStream > > (
14- new Map ( ) ,
15- ) ;
16- const [ myStream , setMyStream ] = useState < MediaStream > ( ) ;
17-
18- const setMyTrack = async ( kind : TrackKind , turnOn : boolean ) => {
19- if ( ! myStream ) {
20- return ;
21- }
22- setTrack ( myStream , kind , turnOn ) ;
23- } ;
20+ ) : [ MeetingMediaStream [ ] , SetLocalAudio , SetLocalVideo ] {
21+ const [ meetingMediaStreams , setMeetingMediaStreams ] = useState <
22+ MeetingMediaStream [ ]
23+ > ( [ ] ) ;
24+ const [ localStream , setLocalStream ] = useState < MediaStream > ( ) ;
2425
2526 const initRTC = async ( ) => {
26- const userMedia = await navigator . mediaDevices . getUserMedia ( {
27- video : true ,
28- audio : true ,
29- } ) ;
30-
31- setMyStream ( userMedia ) ;
32- setMediaStreams ( ( prev ) =>
33- copyMapWithOperation ( prev , ( map ) => map . set ( 'me' , userMedia ) ) ,
27+ const userMediaConstraints = { video : true , audio : true } ;
28+ const userStream = await navigator . mediaDevices . getUserMedia (
29+ userMediaConstraints ,
3430 ) ;
31+ setLocalStream ( userStream ) ;
3532
36- const rtc = new RTC ( socket , STUN_SERVER , userMedia ) ;
33+ // note: local MeetingMediaStream has empty id
34+ const localMeetingMediaStream : MeetingMediaStream = {
35+ stream : userStream ,
36+ id : '' ,
37+ type : 'local' ,
38+ audioOn : true ,
39+ videoOn : true ,
40+ } ;
41+ setMeetingMediaStreams ( ( prev ) => [ ...prev , localMeetingMediaStream ] ) ;
3742
43+ const rtc = new RTC ( socket , STUN_SERVER , userStream ) ;
3844 rtc . onMediaConnected ( ( socketId , remoteStream ) => {
39- setMediaStreams ( ( prev ) =>
40- copyMapWithOperation ( prev , ( map ) => map . set ( socketId , remoteStream ) ) ,
41- ) ;
45+ const remoteMeetingMediaStream : MeetingMediaStream = {
46+ stream : remoteStream ,
47+ id : socketId ,
48+ type : 'remote' ,
49+ audioOn : true ,
50+ videoOn : true ,
51+ } ;
52+ setMeetingMediaStreams ( ( prev ) => [ ...prev , remoteMeetingMediaStream ] ) ;
4253 } ) ;
4354
4455 rtc . onMediaDisconnected ( ( socketId ) => {
45- setMediaStreams ( ( prev ) =>
46- copyMapWithOperation ( prev , ( map ) => map . delete ( socketId ) ) ,
47- ) ;
56+ setMeetingMediaStreams ( ( prev ) => prev . filter ( ( _ ) => _ . id !== socketId ) ) ;
4857 } ) ;
4958
5059 rtc . connect ( ) ;
@@ -54,15 +63,33 @@ export function useMeetingMediaStreams(
5463 initRTC ( ) ;
5564 } , [ ] ) ;
5665
57- return [ mediaStreams , setMyTrack ] ;
58- }
66+ const setLocalAudio : SetLocalAudio = async ( audioOn ) => {
67+ if ( ! localStream ) {
68+ return ;
69+ }
70+ setTrack ( localStream , 'audio' , audioOn ) ;
71+ socket . emit ( 'audio_state_changed' , audioOn ) ;
72+ } ;
73+
74+ const setLocalVideo : SetLocalVideo = async ( videoOn ) => {
75+ if ( ! localStream ) {
76+ return ;
77+ }
78+ setTrack ( localStream , 'video' , videoOn ) ;
79+ socket . emit ( 'video_state_changed' , videoOn ) ;
80+ } ;
81+
82+ socket . on ( 'audio_state_changed' , ( socketId , audioOn ) => {
83+ setMeetingMediaStreams ( ( prev ) =>
84+ prev . map ( ( _ ) => ( _ . id === socketId ? { ..._ , audioOn } : _ ) ) ,
85+ ) ;
86+ } ) ;
87+
88+ socket . on ( 'video_state_changed' , ( socketId , videoOn ) => {
89+ setMeetingMediaStreams ( ( prev ) =>
90+ prev . map ( ( _ ) => ( _ . id === socketId ? { ..._ , videoOn } : _ ) ) ,
91+ ) ;
92+ } ) ;
5993
60- // TODO: 코드 반복때문에 만든 함수. 더 좋은 방법 있으면 고치기
61- function copyMapWithOperation < K , V > (
62- prev : Map < K , V > ,
63- operation : ( cur : Map < K , V > ) => void ,
64- ) {
65- const cur = new Map ( prev ) ;
66- operation ( cur ) ;
67- return cur ;
94+ return [ meetingMediaStreams , setLocalAudio , setLocalVideo ] ;
6895}
0 commit comments