Advertisement
Guest User

script2.js with slight modifications

a guest
May 29th, 2018
36
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. var runSocketIOSample = function() {
  2.   'use strict';
  3.   var localStream;
  4.   let showedRemoteStreams = [];
  5.   let myId;
  6.  
  7.   function getParameterByName(name) {
  8.     name = name.replace(/[\[]/, '\\\[').replace(/[\]]/, '\\\]');
  9.     var regex = new RegExp('[\\?&]' + name + '=([^&#]*)'),
  10.       results = regex.exec(location.search);
  11.     return results === null ? '' : decodeURIComponent(results[1].replace(
  12.       /\+/g, ' '));
  13.   }
  14.  
  15.   var subscribeMix = getParameterByName('mix') || 'false';
  16.  
  17.   function createToken(room, userName, role, callback) {
  18.     var req = new XMLHttpRequest();
  19.     var url = '/createToken/';
  20.     var body = {
  21.       room: room,
  22.       username: userName,
  23.       role: role
  24.     };
  25.     req.onreadystatechange = function() {
  26.       if (req.readyState === 4) {
  27.         callback(req.responseText);
  28.       }
  29.     };
  30.     req.open('POST', url, true);
  31.     req.setRequestHeader('Content-Type', 'application/json');
  32.     req.send(JSON.stringify(body));
  33.   }
  34.  
  35.   var conference = Woogeen.ConferenceClient.create({});
  36.  
  37.   function displayStream(stream, resolution) {
  38.     var streamId = stream.id();
  39.     if (stream instanceof Woogeen.RemoteMixedStream) {
  40.       resolution = resolution || {
  41.         width: 640,
  42.         height: 480
  43.       };
  44.     } else {
  45.       resolution = resolution || {
  46.         width: 720,
  47.         height: 540
  48.       };
  49.     }
  50.     if (!resolution.width || !resolution.height) {
  51.       resolution = {
  52.         width: 640,
  53.         height: 480
  54.       };
  55.     }
  56.     var div = document.getElementById('test' + streamId);
  57.     if (!div) {
  58.       div = document.createElement('div');
  59.       div.setAttribute('id', 'test' + streamId);
  60.       div.setAttribute('title', 'Stream#' + streamId);
  61.       document.body.appendChild(div);
  62.     }
  63.     div.setAttribute('style', 'width: ' + resolution.width + 'px; height: ' +
  64.       resolution.height + 'px;');
  65.     stream.show('test' + streamId);
  66.     showedRemoteStreams.push(stream);
  67.   }
  68.  
  69.   function removeStreamFromShowedStreams(stream) {
  70.     let index = showedRemoteStreams.indexOf(stream);
  71.     if (index >= 0) {
  72.       showedRemoteStreams.slice(index, 1);
  73.     }
  74.   }
  75.  
  76.   function trySubscribeStream(stream) {
  77.     if (stream instanceof Woogeen.RemoteMixedStream) {
  78.       stream.on('VideoLayoutChanged', function() {
  79.         L.Logger.info('stream', stream.id(), 'VideoLayoutChanged');
  80.       });
  81.       if (subscribeMix === 'true') {
  82.         L.Logger.info('subscribing:', stream.id());
  83.         var resolutions = stream.resolutions();
  84.         var videoOpt = true;
  85.         var resolution;
  86.         if (resolutions.length > 1) {
  87.           resolution = resolutions[Math.floor(Math.random() * 10) % 2];
  88.           videoOpt = {
  89.             resolution: resolution
  90.           };
  91.           L.Logger.info('subscribe stream with option:', resolution);
  92.         }
  93.         conference.subscribe(stream, {
  94.           video: videoOpt
  95.         }, function() {
  96.           L.Logger.info('subscribed:', stream.id());
  97.           displayStream(stream, resolution);
  98.         }, function(err) {
  99.           L.Logger.error(stream.id(), 'subscribe failed:', err);
  100.         });
  101.       } else {
  102.         L.Logger.info('won`t subscribe', stream.id());
  103.       }
  104.     } else {
  105.       ['VideoEnabled', 'AudioEnabled', 'VideoDisabled', 'AudioDisabled'].map(
  106.         function(event_name) {
  107.           stream.on(event_name, function() {
  108.             L.Logger.info('stream', stream.id(), event_name);
  109.           });
  110.         });
  111.       if (subscribeMix !== 'true' || stream.isScreen()) {
  112.         L.Logger.info('subscribing:', stream.id());
  113.         conference.subscribe(stream, function() {
  114.           L.Logger.info('subscribed:', stream.id());
  115.           displayStream(stream);
  116.         }, function(err) {
  117.           L.Logger.error(stream.id(), 'subscribe failed:', err);
  118.         });
  119.       } else {
  120.         L.Logger.info('won`t subscribe', stream.id());
  121.       }
  122.     }
  123.   }
  124.  
  125.   function subscribeDifferentResolution(resolution) {
  126.     for (var i in conference.remoteStreams) {
  127.       if (conference.remoteStreams[i].isMixed()) {
  128.         var stream = conference.remoteStreams[i];
  129.         if (subscribeMix === 'true') {
  130.           conference.unsubscribe(stream, function(et) {
  131.             L.Logger.info(stream.id(), 'unsubscribe stream');
  132.             stream.hide();
  133.             removeStreamFromShowedStreams(stream);
  134.             conference.subscribe(stream, {
  135.               video: {
  136.                 resolution: resolution
  137.               }
  138.             }, function() {
  139.               L.Logger.info('subscribed:', stream.id());
  140.               displayStream(stream, resolution);
  141.             }, function(err) {
  142.               L.Logger.error(stream.id(), 'subscribe failed:', err);
  143.             });
  144.           }, function(err) {
  145.             L.Logger.error(stream.id(), 'unsubscribe failed:', err);
  146.           });
  147.         } else {
  148.           conference.subscribe(stream, {
  149.             video: {
  150.               resolution: resolution
  151.             }
  152.           }, function() {
  153.             L.Logger.info('subscribed:', stream.id());
  154.             displayStream(stream, resolution);
  155.             subscribeMix = 'true';
  156.           }, function(err) {
  157.             L.Logger.error(stream.id(), 'subscribe failed:', err);
  158.           });
  159.         }
  160.       }
  161.     }
  162.   }
  163.  
  164.   conference.onMessage(function(event) {
  165.     L.Logger.info('Message Received:', event.msg);
  166.   });
  167.  
  168.   conference.on('server-disconnected', function() {
  169.     showedRemoteStreams.forEach((stream) => {
  170.       stream.hide();
  171.       removeStreamFromShowedStreams(stream);
  172.     });
  173.     L.Logger.info('Server disconnected');
  174.   });
  175.  
  176.   conference.on('stream-added', function(event) {
  177.     var stream = event.stream;
  178.     // if(stream.id() !== localStream.id()) return;
  179.     L.Logger.info('stream added:', stream.id());
  180.     /*if(event.stream.from === myId) {
  181.       L.Logger.info('stream', stream.id(),
  182.         'is from me; will not be subscribed.');
  183.       return;
  184.     }*/
  185.     trySubscribeStream(stream);
  186.   });
  187.  
  188.   conference.on('stream-removed', function(event) {
  189.     var stream = event.stream;
  190.     L.Logger.info('stream removed: ', stream.id());
  191.     var id = stream.elementId !== undefined ? stream.elementId : 'test' +
  192.       stream.id();
  193.     if (id !== undefined) {
  194.       var element = document.getElementById(id);
  195.       if (element) {
  196.         document.body.removeChild(element);
  197.       }
  198.     }
  199.   });
  200.  
  201.   conference.on('stream-failed', function(event) {
  202.     L.Logger.info('Error occurred for stream ', event.stream.id());
  203.     event.stream.hide();
  204.     removeStreamFromShowedStreams(stream);
  205.   });
  206.  
  207.   conference.on('user-joined', function(event) {
  208.     L.Logger.info('user joined:', event.user);
  209.   });
  210.  
  211.   conference.on('user-left', function(event) {
  212.     L.Logger.info('user left:', event.user);
  213.   });
  214.  
  215.   conference.on('recorder-added', function(event) {
  216.     L.Logger.info('media recorder added:', event.recorderId);
  217.   });
  218.  
  219.   conference.on('recorder-continued', function(event) {
  220.     L.Logger.info('media recorder continued:', event.recorderId);
  221.   });
  222.  
  223.   conference.on('recorder-removed', function(event) {
  224.     L.Logger.info('media recorder removed:', event.recorderId);
  225.   });
  226.  
  227.   window.onload = function() {
  228.     L.Logger.setLogLevel(L.Logger.INFO);
  229.     var myResolution = getParameterByName('resolution') || {width: 320, height: 240};
  230.     var shareScreen = getParameterByName('screen') || false;
  231.     var myRoom = getParameterByName('room');
  232.     var isHttps = (location.protocol === 'https:');
  233.     var mediaUrl = getParameterByName('url');
  234.     var isPublish = getParameterByName('publish');
  235.  
  236.     if (isHttps) {
  237.       var shareButton = document.getElementById('shareScreen');
  238.       if (shareButton) {
  239.         shareButton.setAttribute('style', 'display:block');
  240.         shareButton.onclick = (function() {
  241.           Woogeen.LocalStream.create({
  242.             video: {
  243.               device: 'screen',
  244.               resolution: myResolution,
  245.               extensionId: 'pndohhifhheefbpeljcmnhnkphepimhe'
  246.             },
  247.             audio: true
  248.           }, function(err, stream) {
  249.             document.getElementById('myScreen').setAttribute(
  250.               'style', 'width:320px; height: 240px;');
  251.             stream.show('myScreen');
  252.             conference.publish(stream, {}, function(st) {
  253.               L.Logger.info('stream published:', st.id());
  254.             }, function(err) {
  255.               L.Logger.error('publish failed:', err);
  256.             });
  257.             stream.on('Ended', () => {
  258.               stream.hide();
  259.               conference.unpublish(stream);
  260.             });
  261.           });
  262.         });
  263.       }
  264.     }
  265.  
  266.     var externalOutputButton = document.getElementById('externalOutput');
  267.     externalOutputButton.onclick = (function() {
  268.       var isOutputing;
  269.       var startExternalOutput = 'start external streaming';
  270.       var stopExternalOutput = 'stop external streaming';
  271.       externalOutputButton.innerHTML = startExternalOutput;
  272.       return function() {
  273.         var url = document.getElementById('externalOutputURL');
  274.         if (!url || !url.value) {
  275.           L.Logger.error('invalid url of rtsp server.');
  276.           return;
  277.         }
  278.         if (!isOutputing) {
  279.           conference.addExternalOutput(url.value, function() {
  280.             L.Logger.info('started external streaming');
  281.             isOutputing = true;
  282.             externalOutputButton.innerHTML = stopExternalOutput;
  283.           }, function(err) {
  284.             L.Logger.error('start external streaming failed:',
  285.               err);
  286.           });
  287.         } else {
  288.           conference.removeExternalOutput(url.value, function() {
  289.             L.Logger.info('stopped external streaming');
  290.             isOutputing = false;
  291.             externalOutputButton.innerHTML = startExternalOutput;
  292.           }, function(err) {
  293.             L.Logger.error('stop external streaming failed:', err);
  294.           });
  295.         }
  296.       };
  297.     }());
  298.  
  299.     createToken(myRoom, 'user', 'presenter', function(response) {
  300.       var token = response;
  301.  
  302.       conference.join(token, function(resp) {
  303.         myId = resp.self.id;
  304.         if (typeof mediaUrl === 'string' && mediaUrl !== '') {
  305.           Woogeen.ExternalStream.create({
  306.             url: mediaUrl,
  307.             audio: false,
  308.             video: true
  309.           }, function(err, stream) {
  310.             if (err) {
  311.               return L.Logger.error(
  312.                 'create ExternalStream failed:', err);
  313.             }
  314.             localStream = stream;
  315.             conference.publish(localStream, {}, function(st) {
  316.               L.Logger.info('stream published:', st.id());
  317.             }, function(err) {
  318.               L.Logger.error('publish failed:', err);
  319.             });
  320.             stream.on('Ended', () => {
  321.               stream.hide();
  322.               conference.unpublish(stream);
  323.             });
  324.           });
  325.         } else if (shareScreen === false) {
  326.           if (isPublish !== 'false') {
  327.             Woogeen.LocalStream.create({
  328.               video: {
  329.                 device: 'camera',
  330.                 resolution: myResolution,
  331.                 frameRate: 15
  332.               },
  333.               audio: false
  334.             }, function(err, stream) {
  335.               if (err) {
  336.                 return L.Logger.error(
  337.                   'create LocalStream failed:', err);
  338.               }
  339.               localStream = stream;
  340.               localStream.show('myVideo');
  341.  
  342.               conference.publish(localStream, {maxVideoBW: 150, videoCodec: 'h264'}, function(st) {
  343.                 L.Logger.info('stream published:', st.id());
  344.               }, function(err) {
  345.                 L.Logger.error('publish failed:', err);
  346.               });
  347.               stream.on('Ended', () => {
  348.                 stream.hide();
  349.                 conference.unpublish(stream);
  350.               });
  351.             });
  352.           }
  353.         } else if (isHttps) {
  354.           Woogeen.LocalStream.create({
  355.             video: {
  356.               device: 'screen',
  357.               resolution: myResolution,
  358.               extensionId: 'pndohhifhheefbpeljcmnhnkphepimhe'
  359.             },
  360.             audio: true
  361.           }, function(err, stream) {
  362.             document.getElementById('myScreen').setAttribute(
  363.               'style', 'width:320px; height: 240px;');
  364.             stream.show('myScreen');
  365.             conference.publish(stream, {}, function(st) {
  366.               L.Logger.info('stream published:', st.id());
  367.             }, function(err) {
  368.               L.Logger.error('publish failed:', err);
  369.             });
  370.             stream.on('Ended', () => {
  371.               stream.hide();
  372.               conference.unpublish(stream);
  373.             });
  374.           });
  375.         } else {
  376.           L.Logger.error(
  377.             'Share screen must be done in https enviromnent!');
  378.         }
  379.         var streams = resp.streams;
  380.         streams.map(function(stream) {
  381.           if (stream.resolutions) {
  382.             var selectResolution = document.getElementById(
  383.               'resolutions');
  384.             stream.resolutions().map(function(resolution) {
  385.               var button = document.createElement('button');
  386.               button.innerHTML = resolution.width + 'x' +
  387.                 resolution.height;
  388.               button.onclick = function() {
  389.                 subscribeDifferentResolution(resolution);
  390.               }
  391.               selectResolution.appendChild(button);
  392.             });
  393.           }
  394.           L.Logger.info('stream in conference:', stream.id());
  395.           trySubscribeStream(stream);
  396.         });
  397.         var users = resp.users;
  398.         if (users instanceof Array) {
  399.           users.map(function(u) {
  400.             L.Logger.info('user in conference:', u);
  401.           });
  402.         }
  403.       }, function(err) {
  404.         L.Logger.error('server connection failed:', err);
  405.       });
  406.     });
  407.   };
  408.  
  409.   window.onbeforeunload = function() {
  410.     if (localStream) {
  411.       localStream.close();
  412.       if (localStream.channel && typeof localStream.channel.close ===
  413.         'function') {
  414.         localStream.channel.close();
  415.       }
  416.     }
  417.     for (var i in conference.remoteStreams) {
  418.       if (conference.remoteStreams.hasOwnProperty(i)) {
  419.         var stream = conference.remoteStreams[i];
  420.         stream.close();
  421.         if (stream.channel && typeof stream.channel.close === 'function') {
  422.           stream.channel.close();
  423.         }
  424.         delete conference.remoteStreams[i];
  425.       }
  426.     }
  427.   };
  428.  
  429. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement