Peerjs: рд╕реНрдЯреНрд░реАрдо рдЗрд╡реЗрдВрдЯ рдкрд░ рдХреЙрд▓ рдХрд░рдиреЗ рдкрд░ рджреЛ рдмрд╛рд░ рд╕рдорд╛рди рд░рд┐рдореЛрдЯ рд╕реНрдЯреНрд░реАрдо рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреА рд╣реИ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 18 рджрд┐рд╕ре░ 2019  ┬╖  16рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: peers/peerjs

рджреЛ рд╕рд╛рдерд┐рдпреЛрдВ рдХреЗ рдмреАрдЪ peerjs.com рд╕реЗ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред

var getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia;
peer.on('call', function(call) {
  getUserMedia({video: true, audio: true}, function(stream) {
    call.answer(stream); // Answer the call with an A/V stream.
    call.on('stream', function(remoteStream) {
      // Show stream in some video/canvas element.
     console.log('Received stream', remoteStream);
    });
  }, function(err) {
    console.log('Failed to get local stream' ,err);
  });
});

call.on ('рд╕реНрдЯреНрд░реАрдо') рд╣рдореЗрд╢рд╛ рджреЛ рд╕рдорд╛рди рджреВрд░рд╕реНрде рдзрд╛рд░рд╛рдПрдБ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред

рдпрд╣рд╛рдБ рдПрдХ рд╕реНрдХреНрд░реАрди рд╢реЙрдЯ рд╣реИред

issue

рдХреНрдпрд╛ рдпрд╣ рдПрдХ рдЬреНрдЮрд╛рдд рдореБрджреНрджрд╛ рд╣реИ?

рдзрдиреНрдпрд╡рд╛рдж

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдореИрдВ рдПрдХ рд╕рд░рдгреА рдмрдирд╛рддрд╛ рд╣реВрдВред

const callList = [];

рдЬрдм рдореБрдЭреЗ рдХреЛрдИ рдХреЙрд▓ рдорд┐рд▓рддрд╛ рд╣реИ рдпрд╛ рдореИрдВ рдЕрдиреНрдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдкрд╣рд▓реЗ рдореИрдВ рдЙрд╕ рд╕реВрдЪреА рдХреЛ рдСрдирд╕реНрдЯреНрд░реАрдо рдИрд╡реЗрдВрдЯ рдореЗрдВ рдЬрд╛рдВрдЪрддрд╛ рд╣реВрдВ рдФрд░ рдпрджрд┐ рд╡рд╣ рдХреЙрд▓ рдореЗрд░реА рд╕реВрдЪреА рдореЗрдВ рдирд╣реАрдВ рд╣реИ, рддреЛ рдореЗрд░реЗ рд╕реНрдЯреВрдлрд╝ (рд╡реАрдбрд┐рдпреЛ рддрддреНрд╡ рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдЪреАрдЬрд╝ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП) рдХрд░реЗрдВред
рдпрд╣рд╛рдВ рдЙрджрд╛рд╣рд░рдг (рдореИрдВ рдПрдХ рд╕реНрдЯреНрд░реАрдо рдХреЗ рд╕рд╛рде рдЕрдиреНрдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдФрд░ рдЕрдиреНрдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд╛ рдЬрд╡рд╛рдм рджреЗ рд░рд╣рд╛ рд╣реВрдВ):

        // make a call (userId is other users peer id)
    const call = peer.call(userId, myVideoElement.srcObject, { metadata: { userId: peer.id } });
    // create a video element
    const video = createVideoElement(); // this is my custom function for create a html video element, it returns a video element.
    // call on stream
    call.on('stream', remoteStream => {
            // check call list if call not in the list then add to list and page
            if(!callList[call.peer]){
                // add stream to video element
                video.srcObject = remoteStream;
                // show on page
                showVideoElemenetOnPage(video); // this is my custom function for append video element to another element on the page
                // add call objec to global object
                callList[call.peer] = call;
            }
    });

рдЗрд╕рд╕реЗ рджреЛ рдмрд╛рд░ рдЪрд▓рдиреЗ рд╡рд╛рд▓реА рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рд╣реЛ рд╕рдХрддреА рд╣реИред

рд╕рднреА 16 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдХреЛрдИ рднреА рдЗрд╕ рдкрд░ рдХреГрдкрдпрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

рдореБрдЭреЗ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдРрд╕рд╛ рддрдм рд╣реЛрддрд╛ рд╣реИ рдЬрдм рд╣рдо рдХрд┐рд╕реА рдЕрдиреНрдп рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдПрдХ рд╕реНрдЯреНрд░реАрдо рдЯреНрд░рд╛рдВрд╕рдлрд░ рдХрд░рддреЗ рд╣реИрдВ (рдСрдбрд┐рдпреЛ: рдЯреНрд░реВ, рд╡реАрдбрд┐рдпреЛ: рдЯреНрд░реВ), рдЗрд╕реЗ рдЪреЗрдХ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ, рд╡реАрдбрд┐рдпреЛ рдФрд░ рдСрдбрд┐рдпреЛ рджреЛрдиреЛрдВ рд╕реЗ рд╕реНрдЯреНрд░реАрдо рдЯреНрд░рд╛рдВрд╕рдлрд░ рдХрд░реЗрдВ, рдФрд░ рдлрд┐рд░ рдХреЗрд╡рд▓ рдСрдбрд┐рдпреЛ рдХреЗ рд╕рд╛рде, рдореИрдВ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╕рдВрднрд╡рддрдГ рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдореИрдВ рдЬрд╛рдВрдЪрддрд╛ рд╣реВрдВ рдХрд┐ рдХреНрдпрд╛ рдореБрдЭреЗ рдпрд╣ рд╕реНрдЯреНрд░реАрдо рдкрд╣рд▓реЗ рд╣реА рдорд┐рд▓ рдЧрдИ рд╣реИ (рдЬрдм рдореИрдВ рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдореИрдВ рд╕реНрдЯреНрд░реАрдо рд╕рд╣реЗрдЬрддрд╛ рд╣реВрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕рд░рдгреА рдореЗрдВ рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдиреВрдареА рдХреБрдВрдЬреА рдиреАрдЪреЗ рд░рдЦ рд╕рдХрддрд╛ рд╣реВрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЖрдИрдбреА рдХрд┐ {metadata: {user_id: 123}} рдкрд╛рд╕ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ)

рд╣рд╛рдВ, рд╣рд░ рдЯреНрд░реИрдХ рдкрд░ stream рдЗрд╡реЗрдВрдЯ рдХреЙрд▓ рд╣реЛрддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рдЖрдк рджреЛ рдЯреНрд░реИрдХ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ stream рдШрдЯрдирд╛ рдХреЛ рджреЛ рдмрд╛рд░ рдХреЙрд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдХреГрдкрдпрд╛, рдХреНрдпрд╛ рд╣рдо рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рд╕рдВрднрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ? рдореИрдВ рд╡реАрдбрд┐рдпреЛ рд╕реНрдЯреНрд░реАрдо рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рд▓реЗрдХрд┐рди рдореЗрд░реЗ рдкрд╛рд╕ рдзреНрд╡рдирд┐ рдирд╣реАрдВ рд╣реИ

рдлрд┐рд░ рднреА рдПрдХ рдореБрджреНрджрд╛ рд╣реИ

Sipjs рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╣реИрдВрдбрд▓ рдХрд░рддрд╛ рд╣реИ https://sipjs.com/guides/attach-media/ onTrackAdded рд╣реЛрдиреЗ рд╕реЗ

рдХреГрдкрдпрд╛, рдХреНрдпрд╛ рд╣рдо рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рд╕рдВрднрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ? рдореИрдВ рд╡реАрдбрд┐рдпреЛ рд╕реНрдЯреНрд░реАрдо рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рд▓реЗрдХрд┐рди рдореЗрд░реЗ рдкрд╛рд╕ рдзреНрд╡рдирд┐ рдирд╣реАрдВ рд╣реИ

рдореБрдЭреЗ рд▓рдЧрд╛ рдХрд┐ рдореИрдВ рдЧрд▓рдд рдерд╛ред рдкреНрд░рд╛рдкреНрдд рджреЛрдиреЛрдВ рдзрд╛рд░рд╛рдУрдВ рдореЗрдВ рдСрдбрд┐рдпреЛ рдФрд░ рд╡реАрдбрд┐рдпреЛ рд╣реИрдВред рдореИрдВ рдЕрдкрдиреЗ HTML рдЯреИрдЧ рд╕реЗ рдореНрдпреВрдЯ рдкреНрд░реЛрдк рдХреЛ рд╣рдЯрд╛рдирд╛ рднреВрд▓ рдЧрдпрд╛ ...

рдореЗрд░реЗ рдкрд╛рд╕ рд╡реАрдбрд┐рдпреЛ рдФрд░ рдСрдбрд┐рдпреЛ рджреЛрдиреЛрдВ рд╣реИрдВ рдмрд╕ рдЗрд╕рдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдореБрдЭреЗ рдкрд░реЗрд╢рд╛рди рдХрд░рддрд╛ рд╣реИред

рдПрд▓ рд╡реАред, 17 рдПрдмреАрдЖрд░ред 2020 рдПрдХ рд▓рд╛рд╕ 10:27, рдмреИрдкреНрдЯрд┐рд╕реНрдЯ рдЕрд░рдиреМрдж (<
рд╕реВрдЪрдирд╛рдПрдВ@github.com>) escribi├│:

рдХреГрдкрдпрд╛, рдХреНрдпрд╛ рд╣рдо рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рд╕рдВрднрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ? рдореИрдВ рд╡реАрдбрд┐рдпреЛ рд╕реНрдЯреНрд░реАрдо рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рд▓реЗрдХрд┐рди рдореЗрд░реЗ рдкрд╛рд╕ рдирд╣реАрдВ рд╣реИ
рдзреНрд╡рдирд┐

рдореБрдЭреЗ рд▓рдЧрд╛ рдХрд┐ рдореИрдВ рдЧрд▓рдд рдерд╛ред рдкреНрд░рд╛рдкреНрдд рджреЛрдиреЛрдВ рдзрд╛рд░рд╛рдУрдВ рдореЗрдВ рдСрдбрд┐рдпреЛ рдФрд░ рд╡реАрдбрд┐рдпреЛ рд╣реИрдВред рдореИрдВ
рдореЗрд░реЗ HTML рдЯреИрдЧ рд╕реЗ рдореНрдпреВрдЯ рдкреНрд░реЛрдк рдХреЛ рд╣рдЯрд╛рдирд╛ рднреВрд▓ рдЧрдпрд╛ ...

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдиреЗ рдЯрд┐рдкреНрдкрдгреА рдХреА рд╣реИред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рдЙрддреНрддрд░ рд╕реАрдзреЗ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/peers/peerjs/issues/609#issuecomment-615115594 , рдпрд╛
рд╕рджрд╕реНрдпрддрд╛ рд╕рдорд╛рдкреНрдд рдХрд░реЗрдВ
https://github.com/notifications/unsubscribe-auth/AA47FG5NRKADFOYTFWURTI3RNAHFRANCNFSM4J4HKVA
ред

рдХрд┐рд╕реА рдХреЛ рднреА рдЗрди рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░ рд╕рдорд╛рдзрд╛рди рд╣реИ? рдЕрднреА рднреА рджреЛ рдмрд╛рд░ рдмреБрд▓рд╛рдпрд╛ рдШрдЯрдирд╛ рд╕реНрдЯреНрд░реАрдоред

рдпрд╣ рдЪреАрдЬреЗрдВ рдЖрдЬ рднреА рдПрдХ рдореБрджреНрджрд╛ рд╣реИ, рдХрд┐рд╕реА рдХреЛ рднреА рдЗрд╕рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ?

рдореИрдВ рдПрдХ рд╕рд░рдгреА рдмрдирд╛рддрд╛ рд╣реВрдВред

const callList = [];

рдЬрдм рдореБрдЭреЗ рдХреЛрдИ рдХреЙрд▓ рдорд┐рд▓рддрд╛ рд╣реИ рдпрд╛ рдореИрдВ рдЕрдиреНрдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдкрд╣рд▓реЗ рдореИрдВ рдЙрд╕ рд╕реВрдЪреА рдХреЛ рдСрдирд╕реНрдЯреНрд░реАрдо рдИрд╡реЗрдВрдЯ рдореЗрдВ рдЬрд╛рдВрдЪрддрд╛ рд╣реВрдВ рдФрд░ рдпрджрд┐ рд╡рд╣ рдХреЙрд▓ рдореЗрд░реА рд╕реВрдЪреА рдореЗрдВ рдирд╣реАрдВ рд╣реИ, рддреЛ рдореЗрд░реЗ рд╕реНрдЯреВрдлрд╝ (рд╡реАрдбрд┐рдпреЛ рддрддреНрд╡ рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдЪреАрдЬрд╝ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП) рдХрд░реЗрдВред
рдпрд╣рд╛рдВ рдЙрджрд╛рд╣рд░рдг (рдореИрдВ рдПрдХ рд╕реНрдЯреНрд░реАрдо рдХреЗ рд╕рд╛рде рдЕрдиреНрдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдФрд░ рдЕрдиреНрдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд╛ рдЬрд╡рд╛рдм рджреЗ рд░рд╣рд╛ рд╣реВрдВ):

        // make a call (userId is other users peer id)
    const call = peer.call(userId, myVideoElement.srcObject, { metadata: { userId: peer.id } });
    // create a video element
    const video = createVideoElement(); // this is my custom function for create a html video element, it returns a video element.
    // call on stream
    call.on('stream', remoteStream => {
            // check call list if call not in the list then add to list and page
            if(!callList[call.peer]){
                // add stream to video element
                video.srcObject = remoteStream;
                // show on page
                showVideoElemenetOnPage(video); // this is my custom function for append video element to another element on the page
                // add call objec to global object
                callList[call.peer] = call;
            }
    });

рдЗрд╕рд╕реЗ рджреЛ рдмрд╛рд░ рдЪрд▓рдиреЗ рд╡рд╛рд▓реА рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рд╣реЛ рд╕рдХрддреА рд╣реИред

рдореИрдВ рдПрдХ рд╕рд░рдгреА рдмрдирд╛рддрд╛ рд╣реВрдВред

const callList = [];

рдЬрдм рдореБрдЭреЗ рдХреЛрдИ рдХреЙрд▓ рдорд┐рд▓рддрд╛ рд╣реИ рдпрд╛ рдореИрдВ рдЕрдиреНрдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдкрд╣рд▓реЗ рдореИрдВ рдЙрд╕ рд╕реВрдЪреА рдХреЛ рдСрдирд╕реНрдЯреНрд░реАрдо рдИрд╡реЗрдВрдЯ рдореЗрдВ рдЬрд╛рдВрдЪрддрд╛ рд╣реВрдВ рдФрд░ рдпрджрд┐ рд╡рд╣ рдХреЙрд▓ рдореЗрд░реА рд╕реВрдЪреА рдореЗрдВ рдирд╣реАрдВ рд╣реИ, рддреЛ рдореЗрд░реЗ рд╕реНрдЯреВрдлрд╝ (рд╡реАрдбрд┐рдпреЛ рддрддреНрд╡ рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдЪреАрдЬрд╝ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП) рдХрд░реЗрдВред
рдпрд╣рд╛рдВ рдЙрджрд╛рд╣рд░рдг (рдореИрдВ рдПрдХ рд╕реНрдЯреНрд░реАрдо рдХреЗ рд╕рд╛рде рдЕрдиреНрдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдФрд░ рдЕрдиреНрдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд╛ рдЬрд╡рд╛рдм рджреЗ рд░рд╣рд╛ рд╣реВрдВ):

        // make a call (userId is other users peer id)
  const call = peer.call(userId, myVideoElement.srcObject, { metadata: { userId: peer.id } });
  // create a video element
  const video = createVideoElement(); // this is my custom function for create a html video element, it returns a video element.
  // call on stream
  call.on('stream', remoteStream => {
            // check call list if call not in the list then add to list and page
            if(!callList[call.peer]){
                // add stream to video element
                video.srcObject = remoteStream;
                // show on page
                showVideoElemenetOnPage(video); // this is my custom function for append video element to another element on the page
                // add call objec to global object
                callList[call.peer] = call;
            }
  });

рдЗрд╕рд╕реЗ рджреЛ рдмрд╛рд░ рдЪрд▓рдиреЗ рд╡рд╛рд▓реА рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рд╣реЛ рд╕рдХрддреА рд╣реИред

рдпрд╣ рдореЗрд░реА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ, рдзрдиреНрдпрд╡рд╛рдж

рдЙрдкрд░реЛрдХреНрдд рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рднреА рдпрд╣ рджреЛ рдмрд╛рд░ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд░рд╣рд╛ рдерд╛ред

const callList = [];

peer.on ('рдХреЙрд▓', рдХреЙрд▓ => {
call.answer (myMedia);
// рд╢реБрд░реБрдЖрддреА рд╣рд░ рдирдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдмреВрд▓рд┐рдпрди рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛
var рд╕реНрд╡реАрдХрд╛рд░ = true;
call.on ('рд╕реНрдЯреНрд░реАрдо', рдбреЗрдЯрд╛ => {
рдХрдВрд╕реЛрд▓.рд▓реЙрдЧ ("рдПрдХреНрд╕реЗрдкреНрдЯреЙрд▓");
// рдЕрдиреНрдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдХреЙрд▓ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
рдЕрдЧрд░ (рд╕реНрд╡реАрдХрд╛рд░) {
addvideoElement (рдЧрд▓рдд, рдбреЗрдЯрд╛);
рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛ = рдЭреВрдард╛;
}
};
};

рд╕реЙрдХреЗрдЯ.рдСрди ('рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реЗ рдЬреБрдбрд╝рд╛', рдЖрдИрдбреА => {

var call = peer.call(ID,myMedia);

    call.on('stream', data => { 
        if(!callList.includes(ID)){
            console.log("user-connected");
            addvideoElement(false,data);
            callList.push(ID);
        }

    });

};

рдпрджрд┐ рдЖрдкрдХреЛ рдбрдмрд▓ рд╕реНрдЯреНрд░реАрдо рд╕рдорд╕реНрдпрд╛ рдорд┐рд▓рддреА рд╣реИ рддреЛ call.on('stream', data => { рд▓рд╛рдЗрди рд╕реЗ рдкрд╣рд▓реЗ рд╡реАрдбрд┐рдпреЛ рдПрд▓рд┐рдореЗрдВрдЯ рдмрдирд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред @ рджрд┐рдкрд╛рдВрд╢реБрднреЛрд▓рд╛ 1009

рдЕрдм рдпрд╣ рдЙрдореНрдореАрдж рдХреЗ рдореБрддрд╛рдмрд┐рдХ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ

рдпрд╣рд╛рдБ рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ :( рдореИрдВрдиреЗ рджреВрд╕рд░реА рдШрдЯрдирд╛ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЪрд╛рд░реЛрдВ рдУрд░ рдХрд╛рдо рдХрд┐рдпрд╛

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

schweini picture schweini  ┬╖  7рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

furozen picture furozen  ┬╖  9рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

nhducseuit picture nhducseuit  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

afrokick picture afrokick  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

Kitanga picture Kitanga  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ