Преглед изворни кода

feat(electron): basic Electron SS support

dev1
hristoterezov пре 8 година
родитељ
комит
16c4a1fbc5
3 измењених фајлова са 70 додато и 22 уклоњено
  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 Прегледај датотеку

20
 
20
 
21
     RTC_BROWSER_NWJS: "rtc_browser.nwjs",
21
     RTC_BROWSER_NWJS: "rtc_browser.nwjs",
22
 
22
 
23
+    RTC_BROWSER_ELECTRON: "rtc_browser.electron",
24
+
23
     RTC_BROWSER_REACT_NATIVE: "rtc_browser.react-native",
25
     RTC_BROWSER_REACT_NATIVE: "rtc_browser.react-native",
24
 
26
 
25
     /**
27
     /**
90
         return currentBrowser === RTCBrowserType.RTC_BROWSER_NWJS;
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
      * Checks if current environment is React Native.
104
      * Checks if current environment is React Native.
95
      * @returns {boolean}
105
      * @returns {boolean}
237
     return version;
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
 function detectNWJS (){
264
 function detectNWJS (){
241
     var userAgent = navigator.userAgent;
265
     var userAgent = navigator.userAgent;
242
     if (userAgent.match(/JitsiMeetNW/)) {
266
     if (userAgent.match(/JitsiMeetNW/)) {
280
     var version;
304
     var version;
281
     var detectors = [
305
     var detectors = [
282
         detectReactNative,
306
         detectReactNative,
307
+        detectElectron,
283
         detectNWJS,
308
         detectNWJS,
284
         detectOpera,
309
         detectOpera,
285
         detectChrome,
310
         detectChrome,

+ 3
- 1
modules/RTC/RTCUtils.js Прегледај датотеку

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

+ 42
- 21
modules/RTC/ScreenObtainer.js Прегледај датотеку

113
                             onFailure(jitsiError);
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
         } else if (RTCBrowserType.isTemasysPluginUsed()) {
124
         } else if (RTCBrowserType.isTemasysPluginUsed()) {
117
             // XXX Don't require Temasys unless it's to be used because it
125
             // XXX Don't require Temasys unless it's to be used because it
118
             // doesn't run on React Native, for example.
126
             // doesn't run on React Native, for example.
428
                 return;
436
                 return;
429
             }
437
             }
430
             logger.log("Response from extension: ", response);
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
     });
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
  * Starts the detection of an installed jidesha extension for firefox.
538
  * Starts the detection of an installed jidesha extension for firefox.
518
  * @param options supports "desktopSharingFirefoxDisabled",
539
  * @param options supports "desktopSharingFirefoxDisabled",

Loading…
Откажи
Сачувај