# Only one receives stream

**URL:** https://react-native-webrtc.discourse.group/t/only-one-receives-stream/785
**Category:** Help
**Created:** [June 16, 2020, 5:30pm UTC](https://react-native-webrtc.discourse.group/t/only-one-receives-stream/785 "2020-06-16T17:30:10Z")
**Posts on this page:** 2
**Page:** 1

<div class="post-metadata">

### Author: ![williamtdepaula](https://yyz2.discourse-cdn.com/free1/user_avatar/react-native-webrtc.discourse.group/williamtdepaula/32/247_2.png) [@williamtdepaula](https://react-native-webrtc.discourse.group/u/williamtdepaula)
#### Post date: [June 16, 2020, 5:30pm UTC](https://react-native-webrtc.discourse.group/t/only-one-receives-stream/785/1 "2020-06-16T17:30:10Z")

</div>

Hello, in my application, a room is created, in this room two users can enter, but when one enters and then the other, only the first one of the two devices shows the two videos, in the logs show that the SDPs and Candidates are being set correctly.  
I realized that only what shows the two videos, onaddstream is triggered.  
On two devices signaling state returns: stable  
On two devices Ice state returns: connected and after one return completed

#### Expected behavior

Show the two videos

```
let pc
let socket
let _localStream

export default function Chat({ route }) {

    const [localStream, setLocalStream] = useState('')
    const [remoteStream, setRemoteStream] = useState(null)

    useEffect(() => {
        connectToServer()
    }, [])

    function getRoom() {
        return route.params.room
    }

    function connectToServer() {

        socket = io.connect('http://192.168.15.6:8080/signal', {
            reconnection: false
        })

        socket.on('connect', () => {
            socket.emit('join', {
                room: getRoom()
            });

            socket.on('joined', () => {
                createPeerConnection()
                getMedia()

            })

            socket.on('video-offer', (data) => {
                handleOfferMsg(data)
                // //console.log('OFERTA RECEBIDA NO ' + route.params.name + ' DO ' + data.who)
            })

            socket.on('video-answer', function (data) {
                handleVideoAnswerMsg(data);
                // //console.log('RESPOSTA RECEBIDA NO ' + route.params.name + ' DO ' + data.who)
            });

            socket.on('new-ice-candidate', function (data) {
                handleNewICECandidateMsg(data)
                ////console.log('ICE SERVER RECEBIDO NO ' + route.params.name + ' DO ' + data.who)
            });
        })

    }

    function getMedia() {
        let isFront = true;
        mediaDevices.enumerateDevices().then(sourceInfos => {
            let videoSourceId;
            for (let i = 0; i < sourceInfos.length; i++) {
                const sourceInfo = sourceInfos[i];
                if (sourceInfo.kind == "videoinput" && sourceInfo.facing == (isFront ? "front" : "environment")) {
                    videoSourceId = sourceInfo.deviceId;
                }
            }
            mediaDevices.getUserMedia({
                audio: true,
                video: {
                    mandatory: {
                        minWidth: 500, // Provide your own width, height and frame rate here
                        minHeight: 300,
                        minFrameRate: 30
                    },
                    facingMode: (isFront ? "user" : "environment"),
                    optional: (videoSourceId ? [{ sourceId: videoSourceId }] : [])
                }
            })
                .then(stream => {
                    setLocalStream(stream.toURL())
                    _localStream = stream
                    pc.addStream(stream)
                    // Got stream!
                })
                .catch((e) => console.log('ERRRO AQUI @@@@@@@', e));
        })
        .catch((e) => console.log('ERRRO AQUI 222222', e))
    }

    function createPeerConnection(callback) {
        const configuration = { "iceServers": [{ "url": "stun:stun.l.google.com:19302" }] };
        pc = new RTCPeerConnection(configuration);

        pc.onicecandidate = function (event) {
            if (event.candidate) {
                //console.log('ICE CRIADO NO ' + route.params.name + ': ' + JSON.stringify(event.candidate))
                socket.emit('new-ice-candidate', {
                    room: getRoom(),
                    candidate: event.candidate,
                    who: route.params.nameklj
                });
            }
        };

        pc.onaddstream = (e) => {
            //console.log('STREAM RECEBIDO NO ' + route.params.name)
            debugger
            setRemoteStream(e.stream)
        }

        pc.onnegotiationneeded = () => {
            pc.createOffer({
                'mandatory': {
                    'OfferToReceiveAudio': true,
                    'OfferToReceiveVideo': true
                }
            })
                .then(sdp => {
                    //console.log('SDP CRIADO PARA OFERTA NO ' + route.params.name + ': ' + JSON.stringify(sdp))
                    pc.setLocalDescription(sdp)

                    socket.emit('video-offer', {
                        room: getRoom(),
                        sdp: sdp,
                        who: route.params.name
                    })
                })
                .catch(e => reportError(e, 'offer'));
        }

        if (callback) callback(pc)
    }

    function reportError(errMessage, from) {
        console.log(`Error ${errMessage}, from: ${from}`);
    }

    function handleOfferMsg(msg) {
        createPeerConnection((pc) => {
            pc.setRemoteDescription(new RTCSessionDescription(msg.sdp))
                .then(() => pc.createAnswer({
                    'mandatory': {
                        'OfferToReceiveAudio': true,
                        'OfferToReceiveVideo': true
                    }
                }))
                .then(sdp => {
                    pc.setLocalDescription(sdp)
                   
                    socket.emit('video-answer', {
                        room: getRoom(),
                        sdp,
                        who: route.params.name
                    })
                })
                .catch((e) => console.log('ERRRROOO AQUIIIIIIII', e));
        })
    }

    function handleNewICECandidateMsg(msg) {
        if (pc) pc.addIceCandidate(new RTCIceCandidate(msg.candidate))
    }

    function handleVideoAnswerMsg(msg) {
       if (pc) pc.setRemoteDescription(new RTCSessionDescription(msg.sdp)).catch(e => reportError(e, 'VideoAnswerMSG'))
    }

    return (
        <View style={styles.container}>
            <Text style={{ fontSize: 20, fontWeight: 'bold' }}>Usuário: {route.params.name}</Text>
            <View style={{ flexDirection: "row" }}>
                <RTCView streamURL={localStream} style={{ width: 200, height: 200 }} />
                {remoteStream && <RTCView streamURL={remoteStream.toURL()} style={{ width: 200, height: 200 }} mirror={true} />}
            </View>
        </View>
    )
}
```

---

<div class="post-metadata">

### Author: ![williamtdepaula](https://yyz2.discourse-cdn.com/free1/user_avatar/react-native-webrtc.discourse.group/williamtdepaula/32/247_2.png) [@williamtdepaula](https://react-native-webrtc.discourse.group/u/williamtdepaula)
#### Post date: [June 17, 2020, 3:19pm UTC](https://react-native-webrtc.discourse.group/t/only-one-receives-stream/785/2 "2020-06-17T15:19:06Z")

</div>

Fixed, when receiving the offer, I was creating the “onnegotiationneeded” event again and was not adding local stream of user
