Advertisement
Vedro

Untitled

Apr 15th, 2020
279
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. 'use strict';
  2.  
  3. const startButton = document.getElementById('startButton');
  4. const callButton = document.getElementById('callButton');
  5. const hangupButton = document.getElementById('hangupButton');
  6.  
  7. var wssPort = 8081;
  8. var webSocketConnection;
  9.  
  10. callButton.disabled = true;
  11. hangupButton.disabled = true;
  12.  
  13. startButton.addEventListener('click', start);
  14. callButton.addEventListener('click', call);
  15. hangupButton.addEventListener('click', hangup);
  16.  
  17. let startTime;
  18.  
  19. const localVideo = document.getElementById('localVideo');
  20. const remoteVideo = document.getElementById('remoteVideo');
  21.  
  22. localVideo.addEventListener('loadedmetadata', function() {
  23.   console.log(`Szerokość lokalnego video videoWidth: ${this.videoWidth}px,  videoHeight: ${this.videoHeight}px`);
  24. });
  25.  
  26. remoteVideo.addEventListener('loadedmetadata', function() {
  27.   console.log(`Szerokość zdalnego video videoWidth: ${this.videoWidth}px,  videoHeight: ${this.videoHeight}px`);
  28. });
  29.  
  30. remoteVideo.addEventListener('resize', () => {
  31.   console.log(`Rozmiar zdalnego video zmieniony na: ${remoteVideo.videoWidth}x${remoteVideo.videoHeight}`);
  32.  
  33.   if (startTime) {
  34.     const elapsedTime = window.performance.now() - startTime;
  35.     console.log('Czas ustanowienia połączenia: ' + elapsedTime.toFixed(3) + 'ms');
  36.     startTime = null;
  37.   }
  38. });
  39.  
  40. let localStream;
  41. let pc1;
  42. let pc2;
  43. const offerOptions = {
  44.   offerToReceiveAudio: 1,
  45.   offerToReceiveVideo: 1
  46. };
  47.  
  48. // ustawienia parametrów strumienia dla funkcji getUserMedia
  49.  
  50. const mediaConstraints = {
  51.   audio: true, video: true
  52. }
  53.  
  54. // ---------------------------------------------------------
  55.  
  56. function getName(pc) {
  57.   return (pc === pc1) ? 'pc1' : 'pc2';
  58. }
  59.  
  60. function getOtherPc(pc) {
  61.   return (pc === pc1) ? pc2 : pc1;
  62. }
  63.  
  64. async function start() {
  65.  
  66.   // zainicjowanie połączenia z serwerem WebSocket
  67.  
  68.   webSocketConnection = new WebSocket('ws://127.0.0.1' + ':' + wssPort);
  69.  
  70.   webSocketConnection.onopen = onOpenConnection;
  71.   webSocketConnection.onmessage = onReceivedMessage;
  72.   webSocketConnection.onclose = onCloseConnection;
  73.  
  74.   // ---------------------------------------------
  75.  
  76.  
  77.   startButton.disabled = true;
  78.  
  79.   console.log('Generowanie żądania lokalnego strumienia');
  80.  
  81.   try {
  82.    
  83.     // Zad 3.2.3. przechwyć strumień mediów a następnie przypisz go do obiektu localVideo
  84.       // UWAGA - konieczne jest również przypisanie pobranego strumienia do obiektu localStream  
  85.     // --------------------------------------------------------------------------
  86.     const stream = await navigator.mediaDevices.getUserMedia(mediaConstraints)
  87.     localVideo.srcObject = stream;
  88.     localStream = stream;
  89.     callButton.disabled = false;
  90.  
  91.   } catch (e) {
  92.     alert(`getUserMedia() error: ${e.name}`);
  93.   }
  94. }
  95.  
  96.  
  97.  
  98.  
  99.  
  100. function getSelectedSdpSemantics() {
  101.  
  102.   return {sdpSemantics: 'unified-plan'};
  103. }
  104.  
  105.  
  106.  
  107.  
  108.  
  109. // funkcja inicjująca połączenie z drugim użytkownikiem
  110.  
  111. async function call() {
  112.  
  113.   callButton.disabled = true;
  114.   hangupButton.disabled = false;
  115.  
  116.   console.log('Rozpoczęcie połączenia');
  117.   startTime = window.performance.now();
  118.  
  119.  
  120.  
  121.   // pobranie poszczególnych części strumienia mediów
  122.   const videoTracks = localStream.getVideoTracks();
  123.   const audioTracks = localStream.getAudioTracks();
  124.  
  125.  
  126.  
  127.   if (videoTracks.length > 0) {
  128.     console.log(`Używam urządzenia video: ${videoTracks[0].label}`);
  129.   }
  130.  
  131.   if (audioTracks.length > 0) {
  132.     console.log(`Używam urządznia audio: ${audioTracks[0].label}`);
  133.   }
  134.  
  135.   const configuration = getSelectedSdpSemantics();
  136.   console.log('RTCPeerConnection configuration:', configuration);
  137.  
  138.   pc1 = new RTCPeerConnection(configuration);
  139.   console.log('Stworzono lokalne połączenie PEER dla obiektu pc1');
  140.  
  141.   pc1.addEventListener('icecandidate', e => onIceCandidate(pc1, e));
  142.  
  143.   pc2 = new RTCPeerConnection(configuration);
  144.   console.log('Stworzono zdalne połaczenie PEER dla obiektu pc2');
  145.  
  146.   pc2.addEventListener('icecandidate', e => onIceCandidate(pc2, e));
  147.   pc1.addEventListener('iceconnectionstatechange', e => onIceStateChange(pc1, e));
  148.  
  149.   pc2.addEventListener('iceconnectionstatechange', e => onIceStateChange(pc2, e));
  150.   pc2.addEventListener('track', gotRemoteStream);
  151.  
  152.   // stworzenie lokalnego strumienia dla połączenia peer-to-peer
  153.   // to właśnie ten strumień chcemy przekazywać drugiemy użytkownikowi
  154.   localStream.getTracks().forEach(track => pc1.addTrack(track, localStream));
  155.   console.log('Added local stream to pc1');
  156.  
  157.   try {
  158.     console.log('pc1 createOffer start');
  159.     const offer = await pc1.createOffer(offerOptions);
  160.     await onCreateOfferSuccess(offer);
  161.   } catch (e) {
  162.     onCreateSessionDescriptionError(e);
  163.   }
  164. }
  165.  
  166.  
  167.  
  168.  
  169. function onCreateSessionDescriptionError(error) {
  170.   console.log(`Nie udało się utworzyć deskryptora sesji: ${error.toString()}`);
  171. }
  172.  
  173.  
  174.  
  175.  
  176. async function onCreateOfferSuccess(desc) {
  177.  
  178.   console.log(`Oferta od pc1\n${desc.sdp}`);
  179.   console.log('pc1 setLocalDescription start');
  180.  
  181.   try {
  182.     await pc1.setLocalDescription(desc);
  183.     onSetLocalSuccess(pc1);
  184.   } catch (e) {
  185.     onSetSessionDescriptionError();
  186.   }
  187.  
  188.   console.log('pc2 setRemoteDescription start');
  189.   try {
  190.     await pc2.setRemoteDescription(desc);
  191.     onSetRemoteSuccess(pc2);
  192.   } catch (e) {
  193.     onSetSessionDescriptionError();
  194.   }
  195.  
  196.   console.log('pc2 createAnswer start');
  197.  
  198.  
  199.   try {
  200.  
  201.     const answer = await pc2.createAnswer();
  202.     await onCreateAnswerSuccess(answer);
  203.  
  204.   } catch (e) {
  205.  
  206.     onCreateSessionDescriptionError(e);
  207.    
  208.   }
  209. }
  210.  
  211.  
  212. function onSetLocalSuccess(pc) {
  213.   console.log(`${getName(pc)} setLocalDescription complete`);
  214. }
  215.  
  216.  
  217. function onSetRemoteSuccess(pc) {
  218.   console.log(`${getName(pc)} setRemoteDescription complete`);
  219. }
  220.  
  221.  
  222. function onSetSessionDescriptionError(error) {
  223.   console.log(`Nie udało się utowrzyć deskryptora sesji: ${error.toString()}`);
  224. }
  225.  
  226.  
  227. function gotRemoteStream(e) {
  228.  
  229.   // Zad. 3.2.4 przechwytywanie zdalnego strumienia i wyświetlenie go w obiekcie remoteVideo
  230.   // należy również sprawdzić czy obiekt remoteVideo nie ma już przypisanego danego strumienia
  231.   if (remoteVideo.srcObject !== e.streams[0]) {
  232.     remoteVideo.srcObject = e.streams[0];
  233.   }
  234. }
  235.  
  236.  
  237.  
  238. async function onCreateAnswerSuccess(desc) {
  239.   console.log(`Odpowiedź od pc2:\n${desc.sdp}`);
  240.   console.log('pc2 setLocalDescription start');
  241.   try {
  242.     await pc2.setLocalDescription(desc);
  243.     onSetLocalSuccess(pc2);
  244.   } catch (e) {
  245.     onSetSessionDescriptionError(e);
  246.   }
  247.   console.log('pc1 setRemoteDescription start');
  248.   try {
  249.     await pc1.setRemoteDescription(desc);
  250.     onSetRemoteSuccess(pc1);
  251.   } catch (e) {
  252.     onSetSessionDescriptionError(e);
  253.   }
  254. }
  255.  
  256.  
  257. async function onIceCandidate(pc, event) {
  258.   try {
  259.     await (getOtherPc(pc).addIceCandidate(event.candidate));
  260.     onAddIceCandidateSuccess(pc);
  261.   } catch (e) {
  262.     onAddIceCandidateError(pc, e);
  263.   }
  264.   console.log(`${getName(pc)} ICE candidate:\n${event.candidate ? event.candidate.candidate : '(null)'}`);
  265. }
  266.  
  267.  
  268.  
  269. function onAddIceCandidateSuccess(pc) {
  270.   console.log(`${getName(pc)} addIceCandidate success`);
  271. }
  272.  
  273.  
  274. function onAddIceCandidateError(pc, error) {
  275.   console.log(`${getName(pc)} failed to add ICE Candidate: ${error.toString()}`);
  276. }
  277.  
  278. function onIceStateChange(pc, event) {
  279.   if (pc) {
  280.     console.log(`${getName(pc)} ICE state: ${pc.iceConnectionState}`);
  281.     console.log('ICE zdarzenie zmiany statusu: ', event);
  282.   }
  283. }
  284.  
  285.  
  286. function hangup() {
  287.   console.log('Zakończenie połączenia');
  288.   pc1.close();
  289.   pc2.close();
  290.   pc1 = null;
  291.   pc2 = null;
  292.   hangupButton.disabled = true;
  293.   callButton.disabled = false;
  294. }
  295.  
  296.  
  297. // Funkcje WebSocket
  298.  
  299. function onOpenConnection() {
  300.    
  301.   // Zad 3.2.1
  302.   var readyState = webSocketConnection.readyState;
  303.   var span = document.getElementById(wss-status-txt);
  304.   if(readyState == 1){
  305.     span.textContent = "Połączono";
  306.   }
  307.   console.log('Ustanowiono połączenie z serwerem WebSocket');
  308. }
  309.  
  310. function onCloseConnection() {
  311.    
  312.   // Zad 3.2.1 
  313.   var readyState = webSocketConnection.readyState;
  314.   var span = document.getElementById("wss-status-txt");
  315.   span.innerText = readyState;
  316.   if(readyState == 3){
  317.     span.textContent = "Połączono";
  318.   }
  319.   console.log('Zamknięto połączenie z serwerem WebSocket');
  320. }
  321.  
  322. function onReceivedMessage(message) {
  323.   if (!peerConnection) startTransmission(false);
  324.   var signal = JSON.parse(message.data);
  325.   if (signal.sdp) {
  326.       peerConnection.setRemoteDescription(new RTCSessionDescription(signal.sdp), function () {
  327.           peerConnection.createAnswer(onDescriptionReady, errorHandler);
  328.       }, errorHandler);
  329.   } else if (signal.ice) {
  330.       peerConnection.addIceCandidate(new RTCIceCandidate(signal.ice));
  331.   }
  332. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement