Browse Source

feat(electron): basic Electron SS support

dev1
hristoterezov 8 years ago
parent
commit
16c4a1fbc5
3 changed files with 70 additions and 22 deletions
  1. 25
    0
      modules/RTC/RTCBrowserType.js
  2. 3
    1
      modules/RTC/RTCUtils.js
  3. 42
    21
      modules/RTC/ScreenObtainer.js

+ 25
- 0
modules/RTC/RTCBrowserType.js View File

@@ -20,6 +20,8 @@ var RTCBrowserType = {
20 20
 
21 21
     RTC_BROWSER_NWJS: "rtc_browser.nwjs",
22 22
 
23
+    RTC_BROWSER_ELECTRON: "rtc_browser.electron",
24
+
23 25
     RTC_BROWSER_REACT_NATIVE: "rtc_browser.react-native",
24 26
 
25 27
     /**
@@ -90,6 +92,14 @@ var RTCBrowserType = {
90 92
         return currentBrowser === RTCBrowserType.RTC_BROWSER_NWJS;
91 93
     },
92 94
 
95
+    /**
96
+     * Checks if current environment is Electron.
97
+     * @returns {boolean}
98
+     */
99
+    isElectron: function () {
100
+        return currentBrowser === RTCBrowserType.RTC_BROWSER_ELECTRON;
101
+    },
102
+
93 103
     /**
94 104
      * Checks if current environment is React Native.
95 105
      * @returns {boolean}
@@ -237,6 +247,20 @@ function detectIE() {
237 247
     return version;
238 248
 }
239 249
 
250
+/**
251
+ * Detects Electron environment.
252
+ */
253
+function detectElectron (){
254
+    var userAgent = navigator.userAgent;
255
+    if (userAgent.match(/Electron/)) {
256
+        currentBrowser = RTCBrowserType.RTC_BROWSER_ELECTRON;
257
+        var version = userAgent.match(/Electron\/([\d.]+)/)[1];
258
+        logger.info("This appears to be Electron, ver: " + version);
259
+        return version;
260
+    }
261
+    return null;
262
+}
263
+
240 264
 function detectNWJS (){
241 265
     var userAgent = navigator.userAgent;
242 266
     if (userAgent.match(/JitsiMeetNW/)) {
@@ -280,6 +304,7 @@ function detectBrowser() {
280 304
     var version;
281 305
     var detectors = [
282 306
         detectReactNative,
307
+        detectElectron,
283 308
         detectNWJS,
284 309
         detectOpera,
285 310
         detectChrome,

+ 3
- 1
modules/RTC/RTCUtils.js View File

@@ -788,6 +788,7 @@ var RTCUtils = {
788 788
             } else if (RTCBrowserType.isChrome() ||
789 789
                     RTCBrowserType.isOpera() ||
790 790
                     RTCBrowserType.isNWJS() ||
791
+                    RTCBrowserType.isElectron() ||
791 792
                     RTCBrowserType.isReactNative()) {
792 793
                 this.peerconnection = webkitRTCPeerConnection;
793 794
                 var getUserMedia = navigator.webkitGetUserMedia.bind(navigator);
@@ -1181,7 +1182,8 @@ var RTCUtils = {
1181 1182
                 RTCBrowserType.isFirefox() ||
1182 1183
                 RTCBrowserType.isOpera() ||
1183 1184
                 RTCBrowserType.isTemasysPluginUsed()||
1184
-                RTCBrowserType.isNWJS();
1185
+                RTCBrowserType.isNWJS() ||
1186
+                RTCBrowserType.isElectron();
1185 1187
     },
1186 1188
     /**
1187 1189
      * A method to handle stopping of the stream.

+ 42
- 21
modules/RTC/ScreenObtainer.js View File

@@ -113,6 +113,14 @@ var ScreenObtainer = {
113 113
                             onFailure(jitsiError);
114 114
                     });
115 115
             };
116
+        } else if(RTCBrowserType.isElectron()) {
117
+            obtainDesktopStream = (options, onSuccess, onFailure) =>
118
+                window.JitsiMeetElectron.obtainDesktopStream (
119
+                    streamId =>
120
+                        onGetStreamResponse({streamId}, onSuccess, onFailure),
121
+                    err => onFailure(new JitsiTrackError(
122
+                        JitsiTrackErrors.CHROME_EXTENSION_GENERIC_ERROR, err))
123
+                );
116 124
         } else if (RTCBrowserType.isTemasysPluginUsed()) {
117 125
             // XXX Don't require Temasys unless it's to be used because it
118 126
             // doesn't run on React Native, for example.
@@ -428,27 +436,7 @@ function doGetStreamFromExtension(options, streamCallback, failCallback) {
428 436
                 return;
429 437
             }
430 438
             logger.log("Response from extension: ", response);
431
-            if (response.streamId) {
432
-                GUM(
433
-                    ['desktop'],
434
-                    stream => streamCallback(stream),
435
-                    failCallback,
436
-                    { desktopStream: response.streamId });
437
-            } else {
438
-                // As noted in Chrome Desktop Capture API:
439
-                // If user didn't select any source (i.e. canceled the prompt)
440
-                // then the callback is called with an empty streamId.
441
-                if(response.streamId === "")
442
-                {
443
-                    failCallback(new JitsiTrackError(
444
-                        JitsiTrackErrors.CHROME_EXTENSION_USER_CANCELED));
445
-                    return;
446
-                }
447
-
448
-                failCallback(new JitsiTrackError(
449
-                    JitsiTrackErrors.CHROME_EXTENSION_GENERIC_ERROR,
450
-                    response.error));
451
-            }
439
+            onGetStreamResponse(response, streamCallback, failCallback);
452 440
         }
453 441
     );
454 442
 }
@@ -513,6 +501,39 @@ function waitForExtensionAfterInstall(options, waitInterval, retries) {
513 501
     });
514 502
 }
515 503
 
504
+/**
505
+ * Handles response from external application / extension and calls GUM to
506
+ * receive the desktop streams or reports error.
507
+ * @param {object} response
508
+ * @param {string} response.streamId - the streamId for the desktop stream
509
+ * @param {string} response.error - error to be reported.
510
+ * @param {Function} onSuccess - callback for success.
511
+ * @param {Function} onFailure - callback for failure.
512
+ */
513
+function onGetStreamResponse(response, onSuccess, onFailure) {
514
+    if (response.streamId) {
515
+        GUM(
516
+            ['desktop'],
517
+            stream => onSuccess(stream),
518
+            onFailure,
519
+            { desktopStream: response.streamId });
520
+    } else {
521
+        // As noted in Chrome Desktop Capture API:
522
+        // If user didn't select any source (i.e. canceled the prompt)
523
+        // then the callback is called with an empty streamId.
524
+        if(response.streamId === "")
525
+        {
526
+            onFailure(new JitsiTrackError(
527
+                JitsiTrackErrors.CHROME_EXTENSION_USER_CANCELED));
528
+            return;
529
+        }
530
+
531
+        onFailure(new JitsiTrackError(
532
+            JitsiTrackErrors.CHROME_EXTENSION_GENERIC_ERROR,
533
+            response.error));
534
+    }
535
+}
536
+
516 537
 /**
517 538
  * Starts the detection of an installed jidesha extension for firefox.
518 539
  * @param options supports "desktopSharingFirefoxDisabled",

Loading…
Cancel
Save