Browse Source

Merge pull request #64 from syanbo/feature/update-2.4

Feature/update 2.4
matrixbirds 5 years ago
parent
commit
a5040a9619
No account linked to committer's email address

+ 4
- 0
CHANGELOG View File

1
 ## THE CHANGELOG
1
 ## THE CHANGELOG
2
 
2
 
3
+
4
+#### 2.4.0-alpha
5
+- support 2.4.0-alpha.1 agora video sdk android-2.4.0 / iOS-2.4.0.1 and add sendMessage support in the same channel. Deprecate: startEchoTest and setVideoQualityParameters
6
+
3
 #### 2.3.3-alpha
7
 #### 2.3.3-alpha
4
 - support agora video sdk 2.3.3
8
 - support agora video sdk 2.3.3
5
 - release 2.3.3-alpha.3
9
 - release 2.3.3-alpha.3

+ 3
- 1
README.md View File

53
   [English](https://docs.agora.io/en/Video/API%20Reference/oc/docs/headers/Agora-Objective-C-API-Overview.html)
53
   [English](https://docs.agora.io/en/Video/API%20Reference/oc/docs/headers/Agora-Objective-C-API-Overview.html)
54
 
54
 
55
 
55
 
56
-## [API DOCS](https://syanbo.github.io/react-native-agora/globals.html)
56
+## [2.3 API DOCS](https://syanbo.github.io/react-native-agora/globals.html)
57
+
58
+## [2.4 API DOCS](https://syanbo.github.io/react-native-agora/v2.4/globals.html)
57
 
59
 
58
 #### Events
60
 #### Events
59
 
61
 

+ 2
- 2
android/build.gradle View File

50
 
50
 
51
             reset()
51
             reset()
52
 
52
 
53
-            include "armeabi-v7a", "arm64-v8a", "x86", "x86_64"
53
+            include "armeabi-v7a", "arm64-v8a", "x86"
54
             // Specify that we do not want an additional universal SDK
54
             // Specify that we do not want an additional universal SDK
55
             universalApk false
55
             universalApk false
56
         }
56
         }
61
     def androidSupportVersion = rootProject.hasProperty("androidSupportVersion")  ? rootProject.androidSupportVersion : DEFAULT_ANDROID_SUPPORT_VERSION
61
     def androidSupportVersion = rootProject.hasProperty("androidSupportVersion")  ? rootProject.androidSupportVersion : DEFAULT_ANDROID_SUPPORT_VERSION
62
     // from internet
62
     // from internet
63
     implementation "com.android.support:appcompat-v7:$androidSupportVersion"
63
     implementation "com.android.support:appcompat-v7:$androidSupportVersion"
64
-    implementation "io.agora.rtc:full-sdk:2.3.3"
64
+    implementation "io.agora.rtc:full-sdk:2.4.0"
65
     // from node_modules
65
     // from node_modules
66
     implementation "com.facebook.react:react-native:+"
66
     implementation "com.facebook.react:react-native:+"
67
 }
67
 }

+ 23
- 0
android/src/main/java/com/syan/agora/AgoraManager.java View File

15
 
15
 
16
 import io.agora.rtc.IRtcEngineEventHandler;
16
 import io.agora.rtc.IRtcEngineEventHandler;
17
 import io.agora.rtc.RtcEngine;
17
 import io.agora.rtc.RtcEngine;
18
+import io.agora.rtc.video.BeautyOptions;
18
 import io.agora.rtc.video.VideoCanvas;
19
 import io.agora.rtc.video.VideoCanvas;
19
 import io.agora.rtc.video.VideoEncoderConfiguration;
20
 import io.agora.rtc.video.VideoEncoderConfiguration;
20
 
21
 
123
                 mRtcEngine.enableAudio();
124
                 mRtcEngine.enableAudio();
124
             }
125
             }
125
 
126
 
127
+            if (options.hasKey("beauty") && null != options.getMap("beauty")) {
128
+                ReadableMap beauty = options.getMap("beauty");
129
+                BeautyOptions beautyOption = new BeautyOptions();
130
+                beautyOption.lighteningContrastLevel = beauty.getInt("lighteningContrastLevel");
131
+                beautyOption.lighteningLevel = (float) beauty.getDouble("lighteningLevel");
132
+                beautyOption.smoothnessLevel = (float) beauty.getDouble("smoothnessLevel");
133
+                beautyOption.rednessLevel = (float) beauty.getDouble("rednessLevel");
134
+                mRtcEngine.setBeautyEffectOptions(true, beautyOption);
135
+            }
136
+
137
+            if (options.hasKey("voice") && null != options.getMap("voice")) {
138
+                ReadableMap voice = options.getMap("voice");
139
+                final String voiceType = voice.getString("type");
140
+                final Integer voiceValue = voice.getInt("value");
141
+                if (voiceType.equals("changer")) {
142
+                    mRtcEngine.setLocalVoiceChanger(voiceValue);
143
+                }
144
+                if (voiceType.equals("reverbPreset")) {
145
+                    mRtcEngine.setLocalVoiceReverbPreset(voiceValue);
146
+                }
147
+            }
148
+
126
             if (options.hasKey("videoEncoderConfig") && null != options.getMap("videoEncoderConfig")) {
149
             if (options.hasKey("videoEncoderConfig") && null != options.getMap("videoEncoderConfig")) {
127
                 ReadableMap config = options.getMap("videoEncoderConfig");
150
                 ReadableMap config = options.getMap("videoEncoderConfig");
128
                 VideoEncoderConfiguration encoderConfig = new VideoEncoderConfiguration(
151
                 VideoEncoderConfiguration encoderConfig = new VideoEncoderConfiguration(

+ 198
- 24
android/src/main/java/com/syan/agora/AgoraModule.java View File

25
 import io.agora.rtc.IAudioEffectManager;
25
 import io.agora.rtc.IAudioEffectManager;
26
 import io.agora.rtc.IRtcEngineEventHandler;
26
 import io.agora.rtc.IRtcEngineEventHandler;
27
 import io.agora.rtc.RtcEngine;
27
 import io.agora.rtc.RtcEngine;
28
+import io.agora.rtc.internal.LastmileProbeConfig;
28
 import io.agora.rtc.live.LiveInjectStreamConfig;
29
 import io.agora.rtc.live.LiveInjectStreamConfig;
29
 import io.agora.rtc.live.LiveTranscoding;
30
 import io.agora.rtc.live.LiveTranscoding;
30
 import io.agora.rtc.video.AgoraImage;
31
 import io.agora.rtc.video.AgoraImage;
32
+import io.agora.rtc.video.BeautyOptions;
33
+import io.agora.rtc.video.CameraCapturerConfiguration;
31
 import io.agora.rtc.video.VideoEncoderConfiguration;
34
 import io.agora.rtc.video.VideoEncoderConfiguration;
32
 
35
 
33
 import static com.facebook.react.bridge.UiThreadUtil.runOnUiThread;
36
 import static com.facebook.react.bridge.UiThreadUtil.runOnUiThread;
1451
     }
1454
     }
1452
 
1455
 
1453
     @ReactMethod
1456
     @ReactMethod
1454
-    public void setLog(String filePath, int level, Promise promise) {
1457
+    public void setLog(String filePath, int level, int size, Promise promise) {
1455
         try {
1458
         try {
1456
             int res = 0;
1459
             int res = 0;
1460
+            res = AgoraManager.getInstance().mRtcEngine.setLogFileSize(size);
1461
+            if (res != 0) throw new ReactNativeAgoraException("setLogFileSize Failed", res);
1457
             res = AgoraManager.getInstance().mRtcEngine.setLogFilter(level);
1462
             res = AgoraManager.getInstance().mRtcEngine.setLogFilter(level);
1458
             if (res != 0) throw new ReactNativeAgoraException("setLogFilter Failed", res);
1463
             if (res != 0) throw new ReactNativeAgoraException("setLogFilter Failed", res);
1459
             res = AgoraManager.getInstance().mRtcEngine.setLogFile(filePath);
1464
             res = AgoraManager.getInstance().mRtcEngine.setLogFile(filePath);
1794
         }
1799
         }
1795
     }
1800
     }
1796
 
1801
 
1797
-    @ReactMethod
1798
-    public void startEchoTest(Promise promise) {
1799
-        try {
1800
-            int res = AgoraManager.getInstance().mRtcEngine
1801
-                    .startEchoTest();
1802
-            if (res != 0) throw new ReactNativeAgoraException("startEchoTest Failed", res);
1803
-            WritableMap map = Arguments.createMap();
1804
-            map.putBoolean("success", true);
1805
-            map.putInt("value", res);
1806
-            promise.resolve(map);
1807
-        } catch (Exception e) {
1808
-            promise.reject("131009", e);
1809
-        }
1810
-    }
1802
+//  deprecated
1803
+//    @ReactMethod
1804
+//    public void startEchoTest(Promise promise) {
1805
+//        try {
1806
+//            int res = AgoraManager.getInstance().mRtcEngine
1807
+//                    .startEchoTest();
1808
+//            if (res != 0) throw new ReactNativeAgoraException("startEchoTest Failed", res);
1809
+//            WritableMap map = Arguments.createMap();
1810
+//            map.putBoolean("success", true);
1811
+//            map.putInt("value", res);
1812
+//            promise.resolve(map);
1813
+//        } catch (Exception e) {
1814
+//            promise.reject("131009", e);
1815
+//        }
1816
+//    }
1811
 
1817
 
1812
     @ReactMethod
1818
     @ReactMethod
1813
     public void stopEchoTest(Promise promise) {
1819
     public void stopEchoTest(Promise promise) {
2458
     }
2464
     }
2459
 
2465
 
2460
     @ReactMethod
2466
     @ReactMethod
2461
-    public void sendStreamMessage(int streamId, String data, Promise promise) {
2467
+    public void sendMessage(ReadableMap options, Promise promise) {
2462
         try {
2468
         try {
2463
-            int res = AgoraManager.getInstance().mRtcEngine.sendStreamMessage(streamId, data.getBytes());
2469
+            boolean reliable = options.getBoolean("reliable");
2470
+            boolean ordered = options.getBoolean("ordered");
2471
+            String data = options.getString("data");
2472
+            int streamID = AgoraManager.getInstance().mRtcEngine.createDataStream(reliable, ordered);
2473
+            if (streamID < 0) throw new ReactNativeAgoraException("createDataStream Failed", streamID);
2474
+            int res = AgoraManager.getInstance().mRtcEngine.sendStreamMessage(streamID, data.getBytes("utf8"));
2464
             if (res != 0) throw new ReactNativeAgoraException("sendStreamMessage Failed", res);
2475
             if (res != 0) throw new ReactNativeAgoraException("sendStreamMessage Failed", res);
2465
             WritableMap map = Arguments.createMap();
2476
             WritableMap map = Arguments.createMap();
2466
             map.putBoolean("success", true);
2477
             map.putBoolean("success", true);
2478
+            map.putInt("streamID", streamID);
2467
             promise.resolve(map);
2479
             promise.resolve(map);
2468
         } catch (Exception e) {
2480
         } catch (Exception e) {
2469
             promise.reject(e);
2481
             promise.reject(e);
2480
         }
2492
         }
2481
     }
2493
     }
2482
 
2494
 
2495
+//    deprecated
2496
+//    @ReactMethod
2497
+//    public void setVideoQualityParameters(boolean quality, Promise promise) {
2498
+//        try {
2499
+//            int res = AgoraManager.getInstance().mRtcEngine.setVideoQualityParameters(quality);
2500
+//            if (res != 0) throw new ReactNativeAgoraException("sendStreamMessage Failed", res);
2501
+//            WritableMap map = Arguments.createMap();
2502
+//            map.putBoolean("success", true);
2503
+//            map.putInt("value", res);
2504
+//            promise.resolve(map);
2505
+//        } catch (Exception e) {
2506
+//            promise.reject(e);
2507
+//        }
2508
+//    }
2509
+
2483
     @ReactMethod
2510
     @ReactMethod
2484
-    public void setVideoQualityParameters(boolean quality, Promise promise) {
2511
+    public void setLocalVideoMirrorMode(int mode, Promise promise) {
2485
         try {
2512
         try {
2486
-            int res = AgoraManager.getInstance().mRtcEngine.setVideoQualityParameters(quality);
2487
-            if (res != 0) throw new ReactNativeAgoraException("sendStreamMessage Failed", res);
2513
+            int res = AgoraManager.getInstance().mRtcEngine.setLocalVideoMirrorMode(mode);
2514
+            if (res != 0) throw new ReactNativeAgoraException("setLocalVideoMirrorMode Failed", res);
2488
             WritableMap map = Arguments.createMap();
2515
             WritableMap map = Arguments.createMap();
2489
             map.putBoolean("success", true);
2516
             map.putBoolean("success", true);
2490
-            map.putInt("value", res);
2491
             promise.resolve(map);
2517
             promise.resolve(map);
2492
         } catch (Exception e) {
2518
         } catch (Exception e) {
2493
             promise.reject(e);
2519
             promise.reject(e);
2495
     }
2521
     }
2496
 
2522
 
2497
     @ReactMethod
2523
     @ReactMethod
2498
-    public void setLocalVideoMirrorMode(int mode, Promise promise) {
2524
+    public void setBeautyEffectOptions(boolean enabled, ReadableMap options, Promise promise) {
2499
         try {
2525
         try {
2500
-            int res = AgoraManager.getInstance().mRtcEngine.setLocalVideoMirrorMode(mode);
2501
-            if (res != 0) throw new ReactNativeAgoraException("setLocalVideoMirrorMode Failed", res);
2526
+            BeautyOptions beautyOption = new BeautyOptions();
2527
+            beautyOption.lighteningContrastLevel = options.getInt("lighteningContrastLevel");
2528
+            beautyOption.lighteningLevel = (float) options.getDouble("lighteningLevel");
2529
+            beautyOption.smoothnessLevel = (float) options.getDouble("smoothnessLevel");
2530
+            beautyOption.rednessLevel = (float) options.getDouble("rednessLevel");
2531
+            int res = AgoraManager.getInstance().mRtcEngine.setBeautyEffectOptions(true, beautyOption);
2532
+            if (res != 0) throw new ReactNativeAgoraException("setBeautyEffectOptions Failed", res);
2533
+            WritableMap map = Arguments.createMap();
2534
+            map.putBoolean("success", true);
2535
+            promise.resolve(map);
2536
+        } catch (Exception e) {
2537
+            promise.reject(e);
2538
+        }
2539
+    }
2540
+
2541
+    @ReactMethod
2542
+    public void setLocalVoiceChanger(int voiceChanger, Promise promise) {
2543
+        try {
2544
+            int res = AgoraManager.getInstance().mRtcEngine.setLocalVoiceChanger(voiceChanger);
2545
+            if (res != 0) throw new ReactNativeAgoraException("setLocalVoiceChanger Failed", res);
2546
+            WritableMap map = Arguments.createMap();
2547
+            map.putBoolean("success", true);
2548
+            promise.resolve(map);
2549
+        } catch (Exception e) {
2550
+            promise.reject(e);
2551
+        }
2552
+    }
2553
+
2554
+    @ReactMethod
2555
+    public void setLocalVoiceReverbPreset(int preset, Promise promise) {
2556
+        try {
2557
+            int res = AgoraManager.getInstance().mRtcEngine.setLocalVoiceReverbPreset(preset);
2558
+            if (res != 0) throw new ReactNativeAgoraException("setLocalVoiceReverbPreset Failed", res);
2559
+            WritableMap map = Arguments.createMap();
2560
+            map.putBoolean("success", true);
2561
+            promise.resolve(map);
2562
+        } catch (Exception e) {
2563
+            promise.reject(e);
2564
+        }
2565
+    }
2566
+
2567
+    @ReactMethod
2568
+    public void enableSoundPositionIndication(boolean enabled, Promise promise) {
2569
+        try {
2570
+            int res = AgoraManager.getInstance().mRtcEngine.enableSoundPositionIndication(enabled);
2571
+            if (res != 0) throw new ReactNativeAgoraException("enableSoundPositionIndication Failed", res);
2572
+            WritableMap map = Arguments.createMap();
2573
+            map.putBoolean("success", true);
2574
+            promise.resolve(map);
2575
+        } catch (Exception e) {
2576
+            promise.reject(e);
2577
+        }
2578
+    }
2579
+
2580
+    @ReactMethod
2581
+    public void setRemoteVoicePosition(int uid, int pan, int gain, Promise promise) {
2582
+        try {
2583
+            int res = AgoraManager.getInstance().mRtcEngine.setRemoteVoicePosition(uid, pan, gain);
2584
+            if (res != 0) throw new ReactNativeAgoraException("setRemoteVoicePosition Failed", res);
2502
             WritableMap map = Arguments.createMap();
2585
             WritableMap map = Arguments.createMap();
2503
             map.putBoolean("success", true);
2586
             map.putBoolean("success", true);
2504
             promise.resolve(map);
2587
             promise.resolve(map);
2507
         }
2590
         }
2508
     }
2591
     }
2509
 
2592
 
2593
+    @ReactMethod
2594
+    public void startLastmileProbeTest(ReadableMap config, Promise promise) {
2595
+        try {
2596
+            LastmileProbeConfig probeConfig = new LastmileProbeConfig();
2597
+            probeConfig.probeUplink = config.getBoolean("probeUplink");
2598
+            probeConfig.probeDownlink = config.getBoolean("probeDownlink");
2599
+            probeConfig.expectedDownlinkBitrate = config.getInt("expectedDownlinkBitrate");
2600
+            probeConfig.expectedUplinkBitrate = config.getInt("expectedUplinkBitrate");
2601
+            int res = AgoraManager.getInstance().mRtcEngine.startLastmileProbeTest(probeConfig);
2602
+            if (res != 0) throw new ReactNativeAgoraException("startLastmileProbeTest Failed", res);
2603
+            WritableMap map = Arguments.createMap();
2604
+            map.putBoolean("success", true);
2605
+            promise.resolve(map);
2606
+        } catch (Exception e) {
2607
+            promise.reject(e);
2608
+        }
2609
+    }
2610
+
2611
+    @ReactMethod
2612
+    public void stopLastmileProbeTest(Promise promise) {
2613
+        try {
2614
+            int res = AgoraManager.getInstance().mRtcEngine.stopLastmileProbeTest();
2615
+            if (res != 0) throw new ReactNativeAgoraException("stopLastmileProbeTest Failed", res);
2616
+            WritableMap map = Arguments.createMap();
2617
+            map.putBoolean("success", true);
2618
+            promise.resolve(map);
2619
+        } catch (Exception e) {
2620
+            promise.reject(e);
2621
+        }
2622
+    }
2623
+
2624
+    @ReactMethod
2625
+    public void setRemoteUserPriority(int uid, int userPrority, Promise promise) {
2626
+        try {
2627
+            int res = AgoraManager.getInstance().mRtcEngine.setRemoteUserPriority(uid, userPrority);
2628
+            if (res != 0) throw new ReactNativeAgoraException("setRemoteUserPriority Failed", res);
2629
+            WritableMap map = Arguments.createMap();
2630
+            map.putBoolean("success", true);
2631
+            promise.resolve(map);
2632
+        } catch (Exception e) {
2633
+            promise.reject(e);
2634
+        }
2635
+    }
2636
+
2637
+    @ReactMethod
2638
+    public void startEchoTestWithInterval(int interval, Promise promise) {
2639
+        try {
2640
+            int res = AgoraManager.getInstance().mRtcEngine.startEchoTest(interval);
2641
+            if (res != 0) throw new ReactNativeAgoraException("startEchoTestWithInterval Failed", res);
2642
+            WritableMap map = Arguments.createMap();
2643
+            map.putBoolean("success", true);
2644
+            promise.resolve(map);
2645
+        } catch (Exception e) {
2646
+            promise.reject(e);
2647
+        }
2648
+    }
2649
+
2650
+    @ReactMethod
2651
+    public void setCameraCapturerConfiguration(ReadableMap options, Promise promise) {
2652
+        try {
2653
+            CameraCapturerConfiguration.CAPTURER_OUTPUT_PREFERENCE preference = CameraCapturerConfiguration.CAPTURER_OUTPUT_PREFERENCE.CAPTURER_OUTPUT_PREFERENCE_AUTO;
2654
+            switch (options.getInt("preference")) {
2655
+                case 0: {
2656
+                    preference = CameraCapturerConfiguration.CAPTURER_OUTPUT_PREFERENCE.CAPTURER_OUTPUT_PREFERENCE_AUTO;
2657
+                    break;
2658
+                }
2659
+                case 1: {
2660
+                    preference = CameraCapturerConfiguration.CAPTURER_OUTPUT_PREFERENCE.CAPTURER_OUTPUT_PREFERENCE_PERFORMANCE;
2661
+                    break;
2662
+                }
2663
+                case 2: {
2664
+                    preference = CameraCapturerConfiguration.CAPTURER_OUTPUT_PREFERENCE.CAPTURER_OUTPUT_PREFERENCE_PREVIEW;
2665
+                    break;
2666
+                }
2667
+            }
2668
+            CameraCapturerConfiguration config = new CameraCapturerConfiguration(preference);
2669
+
2670
+            int res = AgoraManager.getInstance().mRtcEngine.setCameraCapturerConfiguration(config);
2671
+            if (res != 0) throw new ReactNativeAgoraException("setCameraCapturerConfiguration Failed", res);
2672
+            WritableMap map = Arguments.createMap();
2673
+            map.putBoolean("success", true);
2674
+            promise.resolve(map);
2675
+        } catch (Exception e) {
2676
+            promise.reject(e);
2677
+        }
2678
+    }
2679
+
2680
+
2681
+
2682
+    @ReactMethod
2683
+
2510
     private void sendEvent(ReactContext reactContext,
2684
     private void sendEvent(ReactContext reactContext,
2511
                            String eventName,
2685
                            String eventName,
2512
                            @Nullable WritableMap params) {
2686
                            @Nullable WritableMap params) {

+ 865
- 0
docs/api/v2.4/assets/css/main.css View File

1
+/*! normalize.css v1.1.3 | MIT License | git.io/normalize */
2
+/* ========================================================================== HTML5 display definitions ========================================================================== */
3
+/** Correct `block` display not defined in IE 6/7/8/9 and Firefox 3. */
4
+article, aside, details, figcaption, figure, footer, header, hgroup, main, nav, section, summary { display: block; }
5
+
6
+/** Correct `inline-block` display not defined in IE 6/7/8/9 and Firefox 3. */
7
+audio, canvas, video { display: inline-block; *display: inline; *zoom: 1; }
8
+
9
+/** Prevent modern browsers from displaying `audio` without controls. Remove excess height in iOS 5 devices. */
10
+audio:not([controls]) { display: none; height: 0; }
11
+
12
+/** Address styling not present in IE 7/8/9, Firefox 3, and Safari 4. Known issue: no IE 6 support. */
13
+[hidden] { display: none; }
14
+
15
+/* ========================================================================== Base ========================================================================== */
16
+/** 1. Correct text resizing oddly in IE 6/7 when body `font-size` is set using `em` units. 2. Prevent iOS text size adjust after orientation change, without disabling user zoom. */
17
+html { font-size: 100%; /* 1 */ -ms-text-size-adjust: 100%; /* 2 */ -webkit-text-size-adjust: 100%; /* 2 */ font-family: sans-serif; }
18
+
19
+/** Address `font-family` inconsistency between `textarea` and other form elements. */
20
+button, input, select, textarea { font-family: sans-serif; }
21
+
22
+/** Address margins handled incorrectly in IE 6/7. */
23
+body { margin: 0; }
24
+
25
+/* ========================================================================== Links ========================================================================== */
26
+/** Address `outline` inconsistency between Chrome and other browsers. */
27
+a:focus { outline: thin dotted; }
28
+a:active, a:hover { outline: 0; }
29
+
30
+/** Improve readability when focused and also mouse hovered in all browsers. */
31
+/* ========================================================================== Typography ========================================================================== */
32
+/** Address font sizes and margins set differently in IE 6/7. Address font sizes within `section` and `article` in Firefox 4+, Safari 5, and Chrome. */
33
+h1 { font-size: 2em; margin: 0.67em 0; }
34
+
35
+h2 { font-size: 1.5em; margin: 0.83em 0; }
36
+
37
+h3 { font-size: 1.17em; margin: 1em 0; }
38
+
39
+h4, .tsd-index-panel h3 { font-size: 1em; margin: 1.33em 0; }
40
+
41
+h5 { font-size: 0.83em; margin: 1.67em 0; }
42
+
43
+h6 { font-size: 0.67em; margin: 2.33em 0; }
44
+
45
+/** Address styling not present in IE 7/8/9, Safari 5, and Chrome. */
46
+abbr[title] { border-bottom: 1px dotted; }
47
+
48
+/** Address style set to `bolder` in Firefox 3+, Safari 4/5, and Chrome. */
49
+b, strong { font-weight: bold; }
50
+
51
+blockquote { margin: 1em 40px; }
52
+
53
+/** Address styling not present in Safari 5 and Chrome. */
54
+dfn { font-style: italic; }
55
+
56
+/** Address differences between Firefox and other browsers. Known issue: no IE 6/7 normalization. */
57
+hr { box-sizing: content-box; height: 0; }
58
+
59
+/** Address styling not present in IE 6/7/8/9. */
60
+mark { background: #ff0; color: #000; }
61
+
62
+/** Address margins set differently in IE 6/7. */
63
+p, pre { margin: 1em 0; }
64
+
65
+/** Correct font family set oddly in IE 6, Safari 4/5, and Chrome. */
66
+code, kbd, pre, samp { font-family: monospace, serif; _font-family: "courier new", monospace; font-size: 1em; }
67
+
68
+/** Improve readability of pre-formatted text in all browsers. */
69
+pre { white-space: pre; white-space: pre-wrap; word-wrap: break-word; }
70
+
71
+/** Address CSS quotes not supported in IE 6/7. */
72
+q { quotes: none; }
73
+q:before, q:after { content: ""; content: none; }
74
+
75
+/** Address `quotes` property not supported in Safari 4. */
76
+/** Address inconsistent and variable font size in all browsers. */
77
+small { font-size: 80%; }
78
+
79
+/** Prevent `sub` and `sup` affecting `line-height` in all browsers. */
80
+sub { font-size: 75%; line-height: 0; position: relative; vertical-align: baseline; }
81
+
82
+sup { font-size: 75%; line-height: 0; position: relative; vertical-align: baseline; top: -0.5em; }
83
+
84
+sub { bottom: -0.25em; }
85
+
86
+/* ========================================================================== Lists ========================================================================== */
87
+/** Address margins set differently in IE 6/7. */
88
+dl, menu, ol, ul { margin: 1em 0; }
89
+
90
+dd { margin: 0 0 0 40px; }
91
+
92
+/** Address paddings set differently in IE 6/7. */
93
+menu, ol, ul { padding: 0 0 0 40px; }
94
+
95
+/** Correct list images handled incorrectly in IE 7. */
96
+nav ul, nav ol { list-style: none; list-style-image: none; }
97
+
98
+/* ========================================================================== Embedded content ========================================================================== */
99
+/** 1. Remove border when inside `a` element in IE 6/7/8/9 and Firefox 3. 2. Improve image quality when scaled in IE 7. */
100
+img { border: 0; /* 1 */ -ms-interpolation-mode: bicubic; }
101
+
102
+/* 2 */
103
+/** Correct overflow displayed oddly in IE 9. */
104
+svg:not(:root) { overflow: hidden; }
105
+
106
+/* ========================================================================== Figures ========================================================================== */
107
+/** Address margin not present in IE 6/7/8/9, Safari 5, and Opera 11. */
108
+figure, form { margin: 0; }
109
+
110
+/* ========================================================================== Forms ========================================================================== */
111
+/** Correct margin displayed oddly in IE 6/7. */
112
+/** Define consistent border, margin, and padding. */
113
+fieldset { border: 1px solid #c0c0c0; margin: 0 2px; padding: 0.35em 0.625em 0.75em; }
114
+
115
+/** 1. Correct color not being inherited in IE 6/7/8/9. 2. Correct text not wrapping in Firefox 3. 3. Correct alignment displayed oddly in IE 6/7. */
116
+legend { border: 0; /* 1 */ padding: 0; white-space: normal; /* 2 */ *margin-left: -7px; }
117
+
118
+/* 3 */
119
+/** 1. Correct font size not being inherited in all browsers. 2. Address margins set differently in IE 6/7, Firefox 3+, Safari 5, and Chrome. 3. Improve appearance and consistency in all browsers. */
120
+button, input, select, textarea { font-size: 100%; /* 1 */ margin: 0; /* 2 */ vertical-align: baseline; /* 3 */ *vertical-align: middle; }
121
+
122
+/* 3 */
123
+/** Address Firefox 3+ setting `line-height` on `input` using `!important` in the UA stylesheet. */
124
+button, input { line-height: normal; }
125
+
126
+/** Address inconsistent `text-transform` inheritance for `button` and `select`. All other form control elements do not inherit `text-transform` values. Correct `button` style inheritance in Chrome, Safari 5+, and IE 6+. Correct `select` style inheritance in Firefox 4+ and Opera. */
127
+button, select { text-transform: none; }
128
+
129
+/** 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` and `video` controls. 2. Correct inability to style clickable `input` types in iOS. 3. Improve usability and consistency of cursor style between image-type `input` and others. 4. Remove inner spacing in IE 7 without affecting normal text inputs. Known issue: inner spacing remains in IE 6. */
130
+button, html input[type="button"] { -webkit-appearance: button; /* 2 */ cursor: pointer; /* 3 */ *overflow: visible; }
131
+
132
+/* 4 */
133
+input[type="reset"], input[type="submit"] { -webkit-appearance: button; /* 2 */ cursor: pointer; /* 3 */ *overflow: visible; }
134
+
135
+/* 4 */
136
+/** Re-set default cursor for disabled elements. */
137
+button[disabled], html input[disabled] { cursor: default; }
138
+
139
+/** 1. Address box sizing set to content-box in IE 8/9. 2. Remove excess padding in IE 8/9. 3. Remove excess padding in IE 7. Known issue: excess padding remains in IE 6. */
140
+input { /* 3 */ }
141
+input[type="checkbox"], input[type="radio"] { box-sizing: border-box; /* 1 */ padding: 0; /* 2 */ *height: 13px; /* 3 */ *width: 13px; }
142
+input[type="search"] { -webkit-appearance: textfield; /* 1 */ /* 2 */ box-sizing: content-box; }
143
+input[type="search"]::-webkit-search-cancel-button, input[type="search"]::-webkit-search-decoration { -webkit-appearance: none; }
144
+
145
+/** 1. Address `appearance` set to `searchfield` in Safari 5 and Chrome. 2. Address `box-sizing` set to `border-box` in Safari 5 and Chrome (include `-moz` to future-proof). */
146
+/** Remove inner padding and search cancel button in Safari 5 and Chrome on OS X. */
147
+/** Remove inner padding and border in Firefox 3+. */
148
+button::-moz-focus-inner, input::-moz-focus-inner { border: 0; padding: 0; }
149
+
150
+/** 1. Remove default vertical scrollbar in IE 6/7/8/9. 2. Improve readability and alignment in all browsers. */
151
+textarea { overflow: auto; /* 1 */ vertical-align: top; }
152
+
153
+/* 2 */
154
+/* ========================================================================== Tables ========================================================================== */
155
+/** Remove most spacing between table cells. */
156
+table { border-collapse: collapse; border-spacing: 0; }
157
+
158
+/* Visual Studio-like style based on original C# coloring by Jason Diamond <jason@diamond.name> */
159
+.hljs { display: inline-block; padding: 0.5em; background: white; color: black; }
160
+
161
+.hljs-comment, .hljs-annotation, .hljs-template_comment, .diff .hljs-header, .hljs-chunk, .apache .hljs-cbracket { color: #008000; }
162
+
163
+.hljs-keyword, .hljs-id, .hljs-built_in, .css .smalltalk .hljs-class, .hljs-winutils, .bash .hljs-variable, .tex .hljs-command, .hljs-request, .hljs-status, .nginx .hljs-title { color: #00f; }
164
+
165
+.xml .hljs-tag { color: #00f; }
166
+.xml .hljs-tag .hljs-value { color: #00f; }
167
+
168
+.hljs-string, .hljs-title, .hljs-parent, .hljs-tag .hljs-value, .hljs-rules .hljs-value { color: #a31515; }
169
+
170
+.ruby .hljs-symbol { color: #a31515; }
171
+.ruby .hljs-symbol .hljs-string { color: #a31515; }
172
+
173
+.hljs-template_tag, .django .hljs-variable, .hljs-addition, .hljs-flow, .hljs-stream, .apache .hljs-tag, .hljs-date, .tex .hljs-formula, .coffeescript .hljs-attribute { color: #a31515; }
174
+
175
+.ruby .hljs-string, .hljs-decorator, .hljs-filter .hljs-argument, .hljs-localvars, .hljs-array, .hljs-attr_selector, .hljs-pseudo, .hljs-pi, .hljs-doctype, .hljs-deletion, .hljs-envvar, .hljs-shebang, .hljs-preprocessor, .hljs-pragma, .userType, .apache .hljs-sqbracket, .nginx .hljs-built_in, .tex .hljs-special, .hljs-prompt { color: #2b91af; }
176
+
177
+.hljs-phpdoc, .hljs-javadoc, .hljs-xmlDocTag { color: #808080; }
178
+
179
+.vhdl .hljs-typename { font-weight: bold; }
180
+.vhdl .hljs-string { color: #666666; }
181
+.vhdl .hljs-literal { color: #a31515; }
182
+.vhdl .hljs-attribute { color: #00b0e8; }
183
+
184
+.xml .hljs-attribute { color: #f00; }
185
+
186
+.col > :first-child, .col-1 > :first-child, .col-2 > :first-child, .col-3 > :first-child, .col-4 > :first-child, .col-5 > :first-child, .col-6 > :first-child, .col-7 > :first-child, .col-8 > :first-child, .col-9 > :first-child, .col-10 > :first-child, .col-11 > :first-child, .tsd-panel > :first-child, ul.tsd-descriptions > li > :first-child, .col > :first-child > :first-child, .col-1 > :first-child > :first-child, .col-2 > :first-child > :first-child, .col-3 > :first-child > :first-child, .col-4 > :first-child > :first-child, .col-5 > :first-child > :first-child, .col-6 > :first-child > :first-child, .col-7 > :first-child > :first-child, .col-8 > :first-child > :first-child, .col-9 > :first-child > :first-child, .col-10 > :first-child > :first-child, .col-11 > :first-child > :first-child, .tsd-panel > :first-child > :first-child, ul.tsd-descriptions > li > :first-child > :first-child, .col > :first-child > :first-child > :first-child, .col-1 > :first-child > :first-child > :first-child, .col-2 > :first-child > :first-child > :first-child, .col-3 > :first-child > :first-child > :first-child, .col-4 > :first-child > :first-child > :first-child, .col-5 > :first-child > :first-child > :first-child, .col-6 > :first-child > :first-child > :first-child, .col-7 > :first-child > :first-child > :first-child, .col-8 > :first-child > :first-child > :first-child, .col-9 > :first-child > :first-child > :first-child, .col-10 > :first-child > :first-child > :first-child, .col-11 > :first-child > :first-child > :first-child, .tsd-panel > :first-child > :first-child > :first-child, ul.tsd-descriptions > li > :first-child > :first-child > :first-child { margin-top: 0; }
187
+.col > :last-child, .col-1 > :last-child, .col-2 > :last-child, .col-3 > :last-child, .col-4 > :last-child, .col-5 > :last-child, .col-6 > :last-child, .col-7 > :last-child, .col-8 > :last-child, .col-9 > :last-child, .col-10 > :last-child, .col-11 > :last-child, .tsd-panel > :last-child, ul.tsd-descriptions > li > :last-child, .col > :last-child > :last-child, .col-1 > :last-child > :last-child, .col-2 > :last-child > :last-child, .col-3 > :last-child > :last-child, .col-4 > :last-child > :last-child, .col-5 > :last-child > :last-child, .col-6 > :last-child > :last-child, .col-7 > :last-child > :last-child, .col-8 > :last-child > :last-child, .col-9 > :last-child > :last-child, .col-10 > :last-child > :last-child, .col-11 > :last-child > :last-child, .tsd-panel > :last-child > :last-child, ul.tsd-descriptions > li > :last-child > :last-child, .col > :last-child > :last-child > :last-child, .col-1 > :last-child > :last-child > :last-child, .col-2 > :last-child > :last-child > :last-child, .col-3 > :last-child > :last-child > :last-child, .col-4 > :last-child > :last-child > :last-child, .col-5 > :last-child > :last-child > :last-child, .col-6 > :last-child > :last-child > :last-child, .col-7 > :last-child > :last-child > :last-child, .col-8 > :last-child > :last-child > :last-child, .col-9 > :last-child > :last-child > :last-child, .col-10 > :last-child > :last-child > :last-child, .col-11 > :last-child > :last-child > :last-child, .tsd-panel > :last-child > :last-child > :last-child, ul.tsd-descriptions > li > :last-child > :last-child > :last-child { margin-bottom: 0; }
188
+
189
+.container { max-width: 1200px; margin: 0 auto; padding: 0 40px; }
190
+@media (max-width: 640px) { .container { padding: 0 20px; } }
191
+
192
+.container-main { padding-bottom: 200px; }
193
+
194
+.row { position: relative; margin: 0 -10px; }
195
+.row:after { visibility: hidden; display: block; content: ""; clear: both; height: 0; }
196
+
197
+.col, .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11 { box-sizing: border-box; float: left; padding: 0 10px; }
198
+
199
+.col-1 { width: 8.33333%; }
200
+
201
+.offset-1 { margin-left: 8.33333%; }
202
+
203
+.col-2 { width: 16.66667%; }
204
+
205
+.offset-2 { margin-left: 16.66667%; }
206
+
207
+.col-3 { width: 25%; }
208
+
209
+.offset-3 { margin-left: 25%; }
210
+
211
+.col-4 { width: 33.33333%; }
212
+
213
+.offset-4 { margin-left: 33.33333%; }
214
+
215
+.col-5 { width: 41.66667%; }
216
+
217
+.offset-5 { margin-left: 41.66667%; }
218
+
219
+.col-6 { width: 50%; }
220
+
221
+.offset-6 { margin-left: 50%; }
222
+
223
+.col-7 { width: 58.33333%; }
224
+
225
+.offset-7 { margin-left: 58.33333%; }
226
+
227
+.col-8 { width: 66.66667%; }
228
+
229
+.offset-8 { margin-left: 66.66667%; }
230
+
231
+.col-9 { width: 75%; }
232
+
233
+.offset-9 { margin-left: 75%; }
234
+
235
+.col-10 { width: 83.33333%; }
236
+
237
+.offset-10 { margin-left: 83.33333%; }
238
+
239
+.col-11 { width: 91.66667%; }
240
+
241
+.offset-11 { margin-left: 91.66667%; }
242
+
243
+.tsd-kind-icon { display: block; position: relative; padding-left: 20px; text-indent: -20px; }
244
+.tsd-kind-icon:before { content: ''; display: inline-block; vertical-align: middle; width: 17px; height: 17px; margin: 0 3px 2px 0; background-image: url(../images/icons.png); }
245
+@media (-webkit-min-device-pixel-ratio: 1.5), (min-device-pixel-ratio: 1.5), (min-resolution: 144dpi) { .tsd-kind-icon:before { background-image: url(../images/icons@2x.png); background-size: 238px 204px; } }
246
+
247
+.tsd-signature.tsd-kind-icon:before { background-position: 0 -153px; }
248
+
249
+.tsd-kind-object-literal > .tsd-kind-icon:before { background-position: 0px -17px; }
250
+.tsd-kind-object-literal.tsd-is-protected > .tsd-kind-icon:before { background-position: -17px -17px; }
251
+.tsd-kind-object-literal.tsd-is-private > .tsd-kind-icon:before { background-position: -34px -17px; }
252
+
253
+.tsd-kind-class > .tsd-kind-icon:before { background-position: 0px -34px; }
254
+.tsd-kind-class.tsd-is-protected > .tsd-kind-icon:before { background-position: -17px -34px; }
255
+.tsd-kind-class.tsd-is-private > .tsd-kind-icon:before { background-position: -34px -34px; }
256
+
257
+.tsd-kind-class.tsd-has-type-parameter > .tsd-kind-icon:before { background-position: 0px -51px; }
258
+.tsd-kind-class.tsd-has-type-parameter.tsd-is-protected > .tsd-kind-icon:before { background-position: -17px -51px; }
259
+.tsd-kind-class.tsd-has-type-parameter.tsd-is-private > .tsd-kind-icon:before { background-position: -34px -51px; }
260
+
261
+.tsd-kind-interface > .tsd-kind-icon:before { background-position: 0px -68px; }
262
+.tsd-kind-interface.tsd-is-protected > .tsd-kind-icon:before { background-position: -17px -68px; }
263
+.tsd-kind-interface.tsd-is-private > .tsd-kind-icon:before { background-position: -34px -68px; }
264
+
265
+.tsd-kind-interface.tsd-has-type-parameter > .tsd-kind-icon:before { background-position: 0px -85px; }
266
+.tsd-kind-interface.tsd-has-type-parameter.tsd-is-protected > .tsd-kind-icon:before { background-position: -17px -85px; }
267
+.tsd-kind-interface.tsd-has-type-parameter.tsd-is-private > .tsd-kind-icon:before { background-position: -34px -85px; }
268
+
269
+.tsd-kind-module > .tsd-kind-icon:before { background-position: 0px -102px; }
270
+.tsd-kind-module.tsd-is-protected > .tsd-kind-icon:before { background-position: -17px -102px; }
271
+.tsd-kind-module.tsd-is-private > .tsd-kind-icon:before { background-position: -34px -102px; }
272
+
273
+.tsd-kind-external-module > .tsd-kind-icon:before { background-position: 0px -102px; }
274
+.tsd-kind-external-module.tsd-is-protected > .tsd-kind-icon:before { background-position: -17px -102px; }
275
+.tsd-kind-external-module.tsd-is-private > .tsd-kind-icon:before { background-position: -34px -102px; }
276
+
277
+.tsd-kind-enum > .tsd-kind-icon:before { background-position: 0px -119px; }
278
+.tsd-kind-enum.tsd-is-protected > .tsd-kind-icon:before { background-position: -17px -119px; }
279
+.tsd-kind-enum.tsd-is-private > .tsd-kind-icon:before { background-position: -34px -119px; }
280
+
281
+.tsd-kind-enum-member > .tsd-kind-icon:before { background-position: 0px -136px; }
282
+.tsd-kind-enum-member.tsd-is-protected > .tsd-kind-icon:before { background-position: -17px -136px; }
283
+.tsd-kind-enum-member.tsd-is-private > .tsd-kind-icon:before { background-position: -34px -136px; }
284
+
285
+.tsd-kind-signature > .tsd-kind-icon:before { background-position: 0px -153px; }
286
+.tsd-kind-signature.tsd-is-protected > .tsd-kind-icon:before { background-position: -17px -153px; }
287
+.tsd-kind-signature.tsd-is-private > .tsd-kind-icon:before { background-position: -34px -153px; }
288
+
289
+.tsd-kind-type-alias > .tsd-kind-icon:before { background-position: 0px -170px; }
290
+.tsd-kind-type-alias.tsd-is-protected > .tsd-kind-icon:before { background-position: -17px -170px; }
291
+.tsd-kind-type-alias.tsd-is-private > .tsd-kind-icon:before { background-position: -34px -170px; }
292
+
293
+.tsd-kind-variable > .tsd-kind-icon:before { background-position: -136px -0px; }
294
+.tsd-kind-variable.tsd-is-protected > .tsd-kind-icon:before { background-position: -153px -0px; }
295
+.tsd-kind-variable.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -0px; }
296
+.tsd-kind-variable.tsd-parent-kind-class > .tsd-kind-icon:before { background-position: -51px -0px; }
297
+.tsd-kind-variable.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { background-position: -68px -0px; }
298
+.tsd-kind-variable.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { background-position: -85px -0px; }
299
+.tsd-kind-variable.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { background-position: -102px -0px; }
300
+.tsd-kind-variable.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -0px; }
301
+.tsd-kind-variable.tsd-parent-kind-enum > .tsd-kind-icon:before { background-position: -170px -0px; }
302
+.tsd-kind-variable.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { background-position: -187px -0px; }
303
+.tsd-kind-variable.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -0px; }
304
+.tsd-kind-variable.tsd-parent-kind-interface > .tsd-kind-icon:before { background-position: -204px -0px; }
305
+.tsd-kind-variable.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { background-position: -221px -0px; }
306
+
307
+.tsd-kind-property > .tsd-kind-icon:before { background-position: -136px -0px; }
308
+.tsd-kind-property.tsd-is-protected > .tsd-kind-icon:before { background-position: -153px -0px; }
309
+.tsd-kind-property.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -0px; }
310
+.tsd-kind-property.tsd-parent-kind-class > .tsd-kind-icon:before { background-position: -51px -0px; }
311
+.tsd-kind-property.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { background-position: -68px -0px; }
312
+.tsd-kind-property.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { background-position: -85px -0px; }
313
+.tsd-kind-property.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { background-position: -102px -0px; }
314
+.tsd-kind-property.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -0px; }
315
+.tsd-kind-property.tsd-parent-kind-enum > .tsd-kind-icon:before { background-position: -170px -0px; }
316
+.tsd-kind-property.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { background-position: -187px -0px; }
317
+.tsd-kind-property.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -0px; }
318
+.tsd-kind-property.tsd-parent-kind-interface > .tsd-kind-icon:before { background-position: -204px -0px; }
319
+.tsd-kind-property.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { background-position: -221px -0px; }
320
+
321
+.tsd-kind-get-signature > .tsd-kind-icon:before { background-position: -136px -17px; }
322
+.tsd-kind-get-signature.tsd-is-protected > .tsd-kind-icon:before { background-position: -153px -17px; }
323
+.tsd-kind-get-signature.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -17px; }
324
+.tsd-kind-get-signature.tsd-parent-kind-class > .tsd-kind-icon:before { background-position: -51px -17px; }
325
+.tsd-kind-get-signature.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { background-position: -68px -17px; }
326
+.tsd-kind-get-signature.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { background-position: -85px -17px; }
327
+.tsd-kind-get-signature.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { background-position: -102px -17px; }
328
+.tsd-kind-get-signature.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -17px; }
329
+.tsd-kind-get-signature.tsd-parent-kind-enum > .tsd-kind-icon:before { background-position: -170px -17px; }
330
+.tsd-kind-get-signature.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { background-position: -187px -17px; }
331
+.tsd-kind-get-signature.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -17px; }
332
+.tsd-kind-get-signature.tsd-parent-kind-interface > .tsd-kind-icon:before { background-position: -204px -17px; }
333
+.tsd-kind-get-signature.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { background-position: -221px -17px; }
334
+
335
+.tsd-kind-set-signature > .tsd-kind-icon:before { background-position: -136px -34px; }
336
+.tsd-kind-set-signature.tsd-is-protected > .tsd-kind-icon:before { background-position: -153px -34px; }
337
+.tsd-kind-set-signature.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -34px; }
338
+.tsd-kind-set-signature.tsd-parent-kind-class > .tsd-kind-icon:before { background-position: -51px -34px; }
339
+.tsd-kind-set-signature.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { background-position: -68px -34px; }
340
+.tsd-kind-set-signature.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { background-position: -85px -34px; }
341
+.tsd-kind-set-signature.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { background-position: -102px -34px; }
342
+.tsd-kind-set-signature.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -34px; }
343
+.tsd-kind-set-signature.tsd-parent-kind-enum > .tsd-kind-icon:before { background-position: -170px -34px; }
344
+.tsd-kind-set-signature.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { background-position: -187px -34px; }
345
+.tsd-kind-set-signature.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -34px; }
346
+.tsd-kind-set-signature.tsd-parent-kind-interface > .tsd-kind-icon:before { background-position: -204px -34px; }
347
+.tsd-kind-set-signature.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { background-position: -221px -34px; }
348
+
349
+.tsd-kind-accessor > .tsd-kind-icon:before { background-position: -136px -51px; }
350
+.tsd-kind-accessor.tsd-is-protected > .tsd-kind-icon:before { background-position: -153px -51px; }
351
+.tsd-kind-accessor.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -51px; }
352
+.tsd-kind-accessor.tsd-parent-kind-class > .tsd-kind-icon:before { background-position: -51px -51px; }
353
+.tsd-kind-accessor.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { background-position: -68px -51px; }
354
+.tsd-kind-accessor.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { background-position: -85px -51px; }
355
+.tsd-kind-accessor.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { background-position: -102px -51px; }
356
+.tsd-kind-accessor.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -51px; }
357
+.tsd-kind-accessor.tsd-parent-kind-enum > .tsd-kind-icon:before { background-position: -170px -51px; }
358
+.tsd-kind-accessor.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { background-position: -187px -51px; }
359
+.tsd-kind-accessor.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -51px; }
360
+.tsd-kind-accessor.tsd-parent-kind-interface > .tsd-kind-icon:before { background-position: -204px -51px; }
361
+.tsd-kind-accessor.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { background-position: -221px -51px; }
362
+
363
+.tsd-kind-function > .tsd-kind-icon:before { background-position: -136px -68px; }
364
+.tsd-kind-function.tsd-is-protected > .tsd-kind-icon:before { background-position: -153px -68px; }
365
+.tsd-kind-function.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -68px; }
366
+.tsd-kind-function.tsd-parent-kind-class > .tsd-kind-icon:before { background-position: -51px -68px; }
367
+.tsd-kind-function.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { background-position: -68px -68px; }
368
+.tsd-kind-function.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { background-position: -85px -68px; }
369
+.tsd-kind-function.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { background-position: -102px -68px; }
370
+.tsd-kind-function.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -68px; }
371
+.tsd-kind-function.tsd-parent-kind-enum > .tsd-kind-icon:before { background-position: -170px -68px; }
372
+.tsd-kind-function.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { background-position: -187px -68px; }
373
+.tsd-kind-function.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -68px; }
374
+.tsd-kind-function.tsd-parent-kind-interface > .tsd-kind-icon:before { background-position: -204px -68px; }
375
+.tsd-kind-function.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { background-position: -221px -68px; }
376
+
377
+.tsd-kind-method > .tsd-kind-icon:before { background-position: -136px -68px; }
378
+.tsd-kind-method.tsd-is-protected > .tsd-kind-icon:before { background-position: -153px -68px; }
379
+.tsd-kind-method.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -68px; }
380
+.tsd-kind-method.tsd-parent-kind-class > .tsd-kind-icon:before { background-position: -51px -68px; }
381
+.tsd-kind-method.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { background-position: -68px -68px; }
382
+.tsd-kind-method.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { background-position: -85px -68px; }
383
+.tsd-kind-method.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { background-position: -102px -68px; }
384
+.tsd-kind-method.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -68px; }
385
+.tsd-kind-method.tsd-parent-kind-enum > .tsd-kind-icon:before { background-position: -170px -68px; }
386
+.tsd-kind-method.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { background-position: -187px -68px; }
387
+.tsd-kind-method.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -68px; }
388
+.tsd-kind-method.tsd-parent-kind-interface > .tsd-kind-icon:before { background-position: -204px -68px; }
389
+.tsd-kind-method.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { background-position: -221px -68px; }
390
+
391
+.tsd-kind-call-signature > .tsd-kind-icon:before { background-position: -136px -68px; }
392
+.tsd-kind-call-signature.tsd-is-protected > .tsd-kind-icon:before { background-position: -153px -68px; }
393
+.tsd-kind-call-signature.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -68px; }
394
+.tsd-kind-call-signature.tsd-parent-kind-class > .tsd-kind-icon:before { background-position: -51px -68px; }
395
+.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { background-position: -68px -68px; }
396
+.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { background-position: -85px -68px; }
397
+.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { background-position: -102px -68px; }
398
+.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -68px; }
399
+.tsd-kind-call-signature.tsd-parent-kind-enum > .tsd-kind-icon:before { background-position: -170px -68px; }
400
+.tsd-kind-call-signature.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { background-position: -187px -68px; }
401
+.tsd-kind-call-signature.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -68px; }
402
+.tsd-kind-call-signature.tsd-parent-kind-interface > .tsd-kind-icon:before { background-position: -204px -68px; }
403
+.tsd-kind-call-signature.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { background-position: -221px -68px; }
404
+
405
+.tsd-kind-function.tsd-has-type-parameter > .tsd-kind-icon:before { background-position: -136px -85px; }
406
+.tsd-kind-function.tsd-has-type-parameter.tsd-is-protected > .tsd-kind-icon:before { background-position: -153px -85px; }
407
+.tsd-kind-function.tsd-has-type-parameter.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -85px; }
408
+.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-class > .tsd-kind-icon:before { background-position: -51px -85px; }
409
+.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { background-position: -68px -85px; }
410
+.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { background-position: -85px -85px; }
411
+.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { background-position: -102px -85px; }
412
+.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -85px; }
413
+.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-enum > .tsd-kind-icon:before { background-position: -170px -85px; }
414
+.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { background-position: -187px -85px; }
415
+.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -85px; }
416
+.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-interface > .tsd-kind-icon:before { background-position: -204px -85px; }
417
+.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { background-position: -221px -85px; }
418
+
419
+.tsd-kind-method.tsd-has-type-parameter > .tsd-kind-icon:before { background-position: -136px -85px; }
420
+.tsd-kind-method.tsd-has-type-parameter.tsd-is-protected > .tsd-kind-icon:before { background-position: -153px -85px; }
421
+.tsd-kind-method.tsd-has-type-parameter.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -85px; }
422
+.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-class > .tsd-kind-icon:before { background-position: -51px -85px; }
423
+.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { background-position: -68px -85px; }
424
+.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { background-position: -85px -85px; }
425
+.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { background-position: -102px -85px; }
426
+.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -85px; }
427
+.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-enum > .tsd-kind-icon:before { background-position: -170px -85px; }
428
+.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { background-position: -187px -85px; }
429
+.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -85px; }
430
+.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-interface > .tsd-kind-icon:before { background-position: -204px -85px; }
431
+.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { background-position: -221px -85px; }
432
+
433
+.tsd-kind-constructor > .tsd-kind-icon:before { background-position: -136px -102px; }
434
+.tsd-kind-constructor.tsd-is-protected > .tsd-kind-icon:before { background-position: -153px -102px; }
435
+.tsd-kind-constructor.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -102px; }
436
+.tsd-kind-constructor.tsd-parent-kind-class > .tsd-kind-icon:before { background-position: -51px -102px; }
437
+.tsd-kind-constructor.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { background-position: -68px -102px; }
438
+.tsd-kind-constructor.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { background-position: -85px -102px; }
439
+.tsd-kind-constructor.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { background-position: -102px -102px; }
440
+.tsd-kind-constructor.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -102px; }
441
+.tsd-kind-constructor.tsd-parent-kind-enum > .tsd-kind-icon:before { background-position: -170px -102px; }
442
+.tsd-kind-constructor.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { background-position: -187px -102px; }
443
+.tsd-kind-constructor.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -102px; }
444
+.tsd-kind-constructor.tsd-parent-kind-interface > .tsd-kind-icon:before { background-position: -204px -102px; }
445
+.tsd-kind-constructor.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { background-position: -221px -102px; }
446
+
447
+.tsd-kind-constructor-signature > .tsd-kind-icon:before { background-position: -136px -102px; }
448
+.tsd-kind-constructor-signature.tsd-is-protected > .tsd-kind-icon:before { background-position: -153px -102px; }
449
+.tsd-kind-constructor-signature.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -102px; }
450
+.tsd-kind-constructor-signature.tsd-parent-kind-class > .tsd-kind-icon:before { background-position: -51px -102px; }
451
+.tsd-kind-constructor-signature.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { background-position: -68px -102px; }
452
+.tsd-kind-constructor-signature.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { background-position: -85px -102px; }
453
+.tsd-kind-constructor-signature.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { background-position: -102px -102px; }
454
+.tsd-kind-constructor-signature.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -102px; }
455
+.tsd-kind-constructor-signature.tsd-parent-kind-enum > .tsd-kind-icon:before { background-position: -170px -102px; }
456
+.tsd-kind-constructor-signature.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { background-position: -187px -102px; }
457
+.tsd-kind-constructor-signature.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -102px; }
458
+.tsd-kind-constructor-signature.tsd-parent-kind-interface > .tsd-kind-icon:before { background-position: -204px -102px; }
459
+.tsd-kind-constructor-signature.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { background-position: -221px -102px; }
460
+
461
+.tsd-kind-index-signature > .tsd-kind-icon:before { background-position: -136px -119px; }
462
+.tsd-kind-index-signature.tsd-is-protected > .tsd-kind-icon:before { background-position: -153px -119px; }
463
+.tsd-kind-index-signature.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -119px; }
464
+.tsd-kind-index-signature.tsd-parent-kind-class > .tsd-kind-icon:before { background-position: -51px -119px; }
465
+.tsd-kind-index-signature.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { background-position: -68px -119px; }
466
+.tsd-kind-index-signature.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { background-position: -85px -119px; }
467
+.tsd-kind-index-signature.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { background-position: -102px -119px; }
468
+.tsd-kind-index-signature.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -119px; }
469
+.tsd-kind-index-signature.tsd-parent-kind-enum > .tsd-kind-icon:before { background-position: -170px -119px; }
470
+.tsd-kind-index-signature.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { background-position: -187px -119px; }
471
+.tsd-kind-index-signature.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -119px; }
472
+.tsd-kind-index-signature.tsd-parent-kind-interface > .tsd-kind-icon:before { background-position: -204px -119px; }
473
+.tsd-kind-index-signature.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { background-position: -221px -119px; }
474
+
475
+.tsd-kind-event > .tsd-kind-icon:before { background-position: -136px -136px; }
476
+.tsd-kind-event.tsd-is-protected > .tsd-kind-icon:before { background-position: -153px -136px; }
477
+.tsd-kind-event.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -136px; }
478
+.tsd-kind-event.tsd-parent-kind-class > .tsd-kind-icon:before { background-position: -51px -136px; }
479
+.tsd-kind-event.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { background-position: -68px -136px; }
480
+.tsd-kind-event.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { background-position: -85px -136px; }
481
+.tsd-kind-event.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { background-position: -102px -136px; }
482
+.tsd-kind-event.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -136px; }
483
+.tsd-kind-event.tsd-parent-kind-enum > .tsd-kind-icon:before { background-position: -170px -136px; }
484
+.tsd-kind-event.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { background-position: -187px -136px; }
485
+.tsd-kind-event.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -136px; }
486
+.tsd-kind-event.tsd-parent-kind-interface > .tsd-kind-icon:before { background-position: -204px -136px; }
487
+.tsd-kind-event.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { background-position: -221px -136px; }
488
+
489
+.tsd-is-static > .tsd-kind-icon:before { background-position: -136px -153px; }
490
+.tsd-is-static.tsd-is-protected > .tsd-kind-icon:before { background-position: -153px -153px; }
491
+.tsd-is-static.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -153px; }
492
+.tsd-is-static.tsd-parent-kind-class > .tsd-kind-icon:before { background-position: -51px -153px; }
493
+.tsd-is-static.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { background-position: -68px -153px; }
494
+.tsd-is-static.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { background-position: -85px -153px; }
495
+.tsd-is-static.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { background-position: -102px -153px; }
496
+.tsd-is-static.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -153px; }
497
+.tsd-is-static.tsd-parent-kind-enum > .tsd-kind-icon:before { background-position: -170px -153px; }
498
+.tsd-is-static.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { background-position: -187px -153px; }
499
+.tsd-is-static.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -153px; }
500
+.tsd-is-static.tsd-parent-kind-interface > .tsd-kind-icon:before { background-position: -204px -153px; }
501
+.tsd-is-static.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { background-position: -221px -153px; }
502
+
503
+.tsd-is-static.tsd-kind-function > .tsd-kind-icon:before { background-position: -136px -170px; }
504
+.tsd-is-static.tsd-kind-function.tsd-is-protected > .tsd-kind-icon:before { background-position: -153px -170px; }
505
+.tsd-is-static.tsd-kind-function.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -170px; }
506
+.tsd-is-static.tsd-kind-function.tsd-parent-kind-class > .tsd-kind-icon:before { background-position: -51px -170px; }
507
+.tsd-is-static.tsd-kind-function.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { background-position: -68px -170px; }
508
+.tsd-is-static.tsd-kind-function.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { background-position: -85px -170px; }
509
+.tsd-is-static.tsd-kind-function.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { background-position: -102px -170px; }
510
+.tsd-is-static.tsd-kind-function.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -170px; }
511
+.tsd-is-static.tsd-kind-function.tsd-parent-kind-enum > .tsd-kind-icon:before { background-position: -170px -170px; }
512
+.tsd-is-static.tsd-kind-function.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { background-position: -187px -170px; }
513
+.tsd-is-static.tsd-kind-function.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -170px; }
514
+.tsd-is-static.tsd-kind-function.tsd-parent-kind-interface > .tsd-kind-icon:before { background-position: -204px -170px; }
515
+.tsd-is-static.tsd-kind-function.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { background-position: -221px -170px; }
516
+
517
+.tsd-is-static.tsd-kind-method > .tsd-kind-icon:before { background-position: -136px -170px; }
518
+.tsd-is-static.tsd-kind-method.tsd-is-protected > .tsd-kind-icon:before { background-position: -153px -170px; }
519
+.tsd-is-static.tsd-kind-method.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -170px; }
520
+.tsd-is-static.tsd-kind-method.tsd-parent-kind-class > .tsd-kind-icon:before { background-position: -51px -170px; }
521
+.tsd-is-static.tsd-kind-method.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { background-position: -68px -170px; }
522
+.tsd-is-static.tsd-kind-method.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { background-position: -85px -170px; }
523
+.tsd-is-static.tsd-kind-method.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { background-position: -102px -170px; }
524
+.tsd-is-static.tsd-kind-method.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -170px; }
525
+.tsd-is-static.tsd-kind-method.tsd-parent-kind-enum > .tsd-kind-icon:before { background-position: -170px -170px; }
526
+.tsd-is-static.tsd-kind-method.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { background-position: -187px -170px; }
527
+.tsd-is-static.tsd-kind-method.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -170px; }
528
+.tsd-is-static.tsd-kind-method.tsd-parent-kind-interface > .tsd-kind-icon:before { background-position: -204px -170px; }
529
+.tsd-is-static.tsd-kind-method.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { background-position: -221px -170px; }
530
+
531
+.tsd-is-static.tsd-kind-call-signature > .tsd-kind-icon:before { background-position: -136px -170px; }
532
+.tsd-is-static.tsd-kind-call-signature.tsd-is-protected > .tsd-kind-icon:before { background-position: -153px -170px; }
533
+.tsd-is-static.tsd-kind-call-signature.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -170px; }
534
+.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-class > .tsd-kind-icon:before { background-position: -51px -170px; }
535
+.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { background-position: -68px -170px; }
536
+.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { background-position: -85px -170px; }
537
+.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { background-position: -102px -170px; }
538
+.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -170px; }
539
+.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-enum > .tsd-kind-icon:before { background-position: -170px -170px; }
540
+.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { background-position: -187px -170px; }
541
+.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -170px; }
542
+.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-interface > .tsd-kind-icon:before { background-position: -204px -170px; }
543
+.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { background-position: -221px -170px; }
544
+
545
+.tsd-is-static.tsd-kind-event > .tsd-kind-icon:before { background-position: -136px -187px; }
546
+.tsd-is-static.tsd-kind-event.tsd-is-protected > .tsd-kind-icon:before { background-position: -153px -187px; }
547
+.tsd-is-static.tsd-kind-event.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -187px; }
548
+.tsd-is-static.tsd-kind-event.tsd-parent-kind-class > .tsd-kind-icon:before { background-position: -51px -187px; }
549
+.tsd-is-static.tsd-kind-event.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { background-position: -68px -187px; }
550
+.tsd-is-static.tsd-kind-event.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { background-position: -85px -187px; }
551
+.tsd-is-static.tsd-kind-event.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { background-position: -102px -187px; }
552
+.tsd-is-static.tsd-kind-event.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -187px; }
553
+.tsd-is-static.tsd-kind-event.tsd-parent-kind-enum > .tsd-kind-icon:before { background-position: -170px -187px; }
554
+.tsd-is-static.tsd-kind-event.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { background-position: -187px -187px; }
555
+.tsd-is-static.tsd-kind-event.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -187px; }
556
+.tsd-is-static.tsd-kind-event.tsd-parent-kind-interface > .tsd-kind-icon:before { background-position: -204px -187px; }
557
+.tsd-is-static.tsd-kind-event.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { background-position: -221px -187px; }
558
+
559
+.no-transition { transition: none !important; }
560
+
561
+@-webkit-keyframes fade-in { from { opacity: 0; }
562
+  to { opacity: 1; } }
563
+
564
+@keyframes fade-in { from { opacity: 0; }
565
+  to { opacity: 1; } }
566
+@-webkit-keyframes fade-out { from { opacity: 1; visibility: visible; }
567
+  to { opacity: 0; } }
568
+@keyframes fade-out { from { opacity: 1; visibility: visible; }
569
+  to { opacity: 0; } }
570
+@-webkit-keyframes fade-in-delayed { 0% { opacity: 0; }
571
+  33% { opacity: 0; }
572
+  100% { opacity: 1; } }
573
+@keyframes fade-in-delayed { 0% { opacity: 0; }
574
+  33% { opacity: 0; }
575
+  100% { opacity: 1; } }
576
+@-webkit-keyframes fade-out-delayed { 0% { opacity: 1; visibility: visible; }
577
+  66% { opacity: 0; }
578
+  100% { opacity: 0; } }
579
+@keyframes fade-out-delayed { 0% { opacity: 1; visibility: visible; }
580
+  66% { opacity: 0; }
581
+  100% { opacity: 0; } }
582
+@-webkit-keyframes shift-to-left { from { -webkit-transform: translate(0, 0); transform: translate(0, 0); }
583
+  to { -webkit-transform: translate(-25%, 0); transform: translate(-25%, 0); } }
584
+@keyframes shift-to-left { from { -webkit-transform: translate(0, 0); transform: translate(0, 0); }
585
+  to { -webkit-transform: translate(-25%, 0); transform: translate(-25%, 0); } }
586
+@-webkit-keyframes unshift-to-left { from { -webkit-transform: translate(-25%, 0); transform: translate(-25%, 0); }
587
+  to { -webkit-transform: translate(0, 0); transform: translate(0, 0); } }
588
+@keyframes unshift-to-left { from { -webkit-transform: translate(-25%, 0); transform: translate(-25%, 0); }
589
+  to { -webkit-transform: translate(0, 0); transform: translate(0, 0); } }
590
+@-webkit-keyframes pop-in-from-right { from { -webkit-transform: translate(100%, 0); transform: translate(100%, 0); }
591
+  to { -webkit-transform: translate(0, 0); transform: translate(0, 0); } }
592
+@keyframes pop-in-from-right { from { -webkit-transform: translate(100%, 0); transform: translate(100%, 0); }
593
+  to { -webkit-transform: translate(0, 0); transform: translate(0, 0); } }
594
+@-webkit-keyframes pop-out-to-right { from { -webkit-transform: translate(0, 0); transform: translate(0, 0); visibility: visible; }
595
+  to { -webkit-transform: translate(100%, 0); transform: translate(100%, 0); } }
596
+@keyframes pop-out-to-right { from { -webkit-transform: translate(0, 0); transform: translate(0, 0); visibility: visible; }
597
+  to { -webkit-transform: translate(100%, 0); transform: translate(100%, 0); } }
598
+body { background: #fdfdfd; font-family: "Segoe UI", sans-serif; font-size: 16px; color: #222; }
599
+
600
+a { color: #4da6ff; text-decoration: none; }
601
+a:hover { text-decoration: underline; }
602
+
603
+code, pre { font-family: Menlo, Monaco, Consolas, "Courier New", monospace; padding: 0.2em; margin: 0; font-size: 14px; background-color: rgba(0, 0, 0, 0.04); }
604
+
605
+pre { padding: 10px; }
606
+pre code { padding: 0; font-size: 100%; background-color: transparent; }
607
+
608
+.tsd-typography { line-height: 1.333em; }
609
+.tsd-typography ul { list-style: square; padding: 0 0 0 20px; margin: 0; }
610
+.tsd-typography h4, .tsd-typography .tsd-index-panel h3, .tsd-index-panel .tsd-typography h3, .tsd-typography h5, .tsd-typography h6 { font-size: 1em; margin: 0; }
611
+.tsd-typography h5, .tsd-typography h6 { font-weight: normal; }
612
+.tsd-typography p, .tsd-typography ul, .tsd-typography ol { margin: 1em 0; }
613
+
614
+@media (min-width: 901px) and (max-width: 1024px) { html.default .col-content { width: 72%; }
615
+  html.default .col-menu { width: 28%; }
616
+  html.default .tsd-navigation { padding-left: 10px; } }
617
+@media (max-width: 900px) { html.default .col-content { float: none; width: 100%; }
618
+  html.default .col-menu { position: fixed !important; overflow: auto; -webkit-overflow-scrolling: touch; overflow-scrolling: touch; z-index: 1024; top: 0 !important; bottom: 0 !important; left: auto !important; right: 0 !important; width: 100%; padding: 20px 20px 0 0; max-width: 450px; visibility: hidden; background-color: #fff; -webkit-transform: translate(100%, 0); transform: translate(100%, 0); }
619
+  html.default .col-menu > *:last-child { padding-bottom: 20px; }
620
+  html.default .overlay { content: ""; display: block; position: fixed; z-index: 1023; top: 0; left: 0; right: 0; bottom: 0; background-color: rgba(0, 0, 0, 0.75); visibility: hidden; }
621
+  html.default.to-has-menu .overlay { -webkit-animation: fade-in 0.4s; animation: fade-in 0.4s; }
622
+  html.default.to-has-menu header, html.default.to-has-menu footer, html.default.to-has-menu .col-content { -webkit-animation: shift-to-left 0.4s; animation: shift-to-left 0.4s; }
623
+  html.default.to-has-menu .col-menu { -webkit-animation: pop-in-from-right 0.4s; animation: pop-in-from-right 0.4s; }
624
+  html.default.from-has-menu .overlay { -webkit-animation: fade-out 0.4s; animation: fade-out 0.4s; }
625
+  html.default.from-has-menu header, html.default.from-has-menu footer, html.default.from-has-menu .col-content { -webkit-animation: unshift-to-left 0.4s; animation: unshift-to-left 0.4s; }
626
+  html.default.from-has-menu .col-menu { -webkit-animation: pop-out-to-right 0.4s; animation: pop-out-to-right 0.4s; }
627
+  html.default.has-menu body { overflow: hidden; }
628
+  html.default.has-menu .overlay { visibility: visible; }
629
+  html.default.has-menu header, html.default.has-menu footer, html.default.has-menu .col-content { -webkit-transform: translate(-25%, 0); transform: translate(-25%, 0); }
630
+  html.default.has-menu .col-menu { visibility: visible; -webkit-transform: translate(0, 0); transform: translate(0, 0); } }
631
+
632
+.tsd-page-title { padding: 70px 0 20px 0; margin: 0 0 40px 0; background: #fff; box-shadow: 0 0 5px rgba(0, 0, 0, 0.35); }
633
+.tsd-page-title h1 { margin: 0; }
634
+
635
+.tsd-breadcrumb { margin: 0; padding: 0; color: #808080; }
636
+.tsd-breadcrumb a { color: #808080; text-decoration: none; }
637
+.tsd-breadcrumb a:hover { text-decoration: underline; }
638
+.tsd-breadcrumb li { display: inline; }
639
+.tsd-breadcrumb li:after { content: " / "; }
640
+
641
+html.minimal .container { margin: 0; }
642
+html.minimal .container-main { padding-top: 50px; padding-bottom: 0; }
643
+html.minimal .content-wrap { padding-left: 300px; }
644
+html.minimal .tsd-navigation { position: fixed !important; overflow: auto; -webkit-overflow-scrolling: touch; overflow-scrolling: touch; box-sizing: border-box; z-index: 1; left: 0; top: 40px; bottom: 0; width: 300px; padding: 20px; margin: 0; }
645
+html.minimal .tsd-member .tsd-member { margin-left: 0; }
646
+html.minimal .tsd-page-toolbar { position: fixed; z-index: 2; }
647
+html.minimal #tsd-filter .tsd-filter-group { right: 0; -webkit-transform: none; transform: none; }
648
+html.minimal footer { background-color: transparent; }
649
+html.minimal footer .container { padding: 0; }
650
+html.minimal .tsd-generator { padding: 0; }
651
+@media (max-width: 900px) { html.minimal .tsd-navigation { display: none; }
652
+  html.minimal .content-wrap { padding-left: 0; } }
653
+
654
+dl.tsd-comment-tags { overflow: hidden; }
655
+dl.tsd-comment-tags dt { clear: both; float: left; padding: 1px 5px; margin: 0 10px 0 0; border-radius: 4px; border: 1px solid #808080; color: #808080; font-size: 0.8em; font-weight: normal; }
656
+dl.tsd-comment-tags dd { margin: 0 0 10px 0; }
657
+dl.tsd-comment-tags p { margin: 0; }
658
+
659
+.tsd-panel.tsd-comment .lead { font-size: 1.1em; line-height: 1.333em; margin-bottom: 2em; }
660
+.tsd-panel.tsd-comment .lead:last-child { margin-bottom: 0; }
661
+
662
+.toggle-protected .tsd-is-private { display: none; }
663
+
664
+.toggle-public .tsd-is-private, .toggle-public .tsd-is-protected, .toggle-public .tsd-is-private-protected { display: none; }
665
+
666
+.toggle-inherited .tsd-is-inherited { display: none; }
667
+
668
+.toggle-only-exported .tsd-is-not-exported { display: none; }
669
+
670
+.toggle-externals .tsd-is-external { display: none; }
671
+
672
+#tsd-filter { position: relative; display: inline-block; height: 40px; vertical-align: bottom; }
673
+.no-filter #tsd-filter { display: none; }
674
+#tsd-filter .tsd-filter-group { display: inline-block; height: 40px; vertical-align: bottom; white-space: nowrap; }
675
+#tsd-filter input { display: none; }
676
+@media (max-width: 900px) { #tsd-filter .tsd-filter-group { display: block; position: absolute; top: 40px; right: 20px; height: auto; background-color: #fff; visibility: hidden; -webkit-transform: translate(50%, 0); transform: translate(50%, 0); box-shadow: 0 0 4px rgba(0, 0, 0, 0.25); }
677
+  .has-options #tsd-filter .tsd-filter-group { visibility: visible; }
678
+  .to-has-options #tsd-filter .tsd-filter-group { -webkit-animation: fade-in 0.2s; animation: fade-in 0.2s; }
679
+  .from-has-options #tsd-filter .tsd-filter-group { -webkit-animation: fade-out 0.2s; animation: fade-out 0.2s; }
680
+  #tsd-filter label, #tsd-filter .tsd-select { display: block; padding-right: 20px; } }
681
+
682
+footer { border-top: 1px solid #eee; background-color: #fff; }
683
+footer.with-border-bottom { border-bottom: 1px solid #eee; }
684
+footer .tsd-legend-group { font-size: 0; }
685
+footer .tsd-legend { display: inline-block; width: 25%; padding: 0; font-size: 16px; list-style: none; line-height: 1.333em; vertical-align: top; }
686
+@media (max-width: 900px) { footer .tsd-legend { width: 50%; } }
687
+
688
+.tsd-hierarchy { list-style: square; padding: 0 0 0 20px; margin: 0; }
689
+.tsd-hierarchy .target { font-weight: bold; }
690
+
691
+.tsd-index-panel .tsd-index-content { margin-bottom: -30px !important; }
692
+.tsd-index-panel .tsd-index-section { margin-bottom: 30px !important; }
693
+.tsd-index-panel h3 { margin: 0 -20px 10px -20px; padding: 0 20px 10px 20px; border-bottom: 1px solid #eee; }
694
+.tsd-index-panel ul.tsd-index-list { -webkit-column-count: 3; -moz-column-count: 3; -ms-column-count: 3; -o-column-count: 3; column-count: 3; -webkit-column-gap: 20px; -moz-column-gap: 20px; -ms-column-gap: 20px; -o-column-gap: 20px; column-gap: 20px; padding: 0; list-style: none; line-height: 1.333em; }
695
+@media (max-width: 900px) { .tsd-index-panel ul.tsd-index-list { -webkit-column-count: 1; -moz-column-count: 1; -ms-column-count: 1; -o-column-count: 1; column-count: 1; } }
696
+@media (min-width: 901px) and (max-width: 1024px) { .tsd-index-panel ul.tsd-index-list { -webkit-column-count: 2; -moz-column-count: 2; -ms-column-count: 2; -o-column-count: 2; column-count: 2; } }
697
+.tsd-index-panel ul.tsd-index-list li { -webkit-column-break-inside: avoid; -moz-column-break-inside: avoid; -ms-column-break-inside: avoid; -o-column-break-inside: avoid; column-break-inside: avoid; -webkit-page-break-inside: avoid; -moz-page-break-inside: avoid; -ms-page-break-inside: avoid; -o-page-break-inside: avoid; page-break-inside: avoid; }
698
+.tsd-index-panel a, .tsd-index-panel .tsd-parent-kind-module a { color: #9600ff; }
699
+.tsd-index-panel .tsd-parent-kind-interface a { color: #7da01f; }
700
+.tsd-index-panel .tsd-parent-kind-enum a { color: #cc9900; }
701
+.tsd-index-panel .tsd-parent-kind-class a { color: #4da6ff; }
702
+.tsd-index-panel .tsd-kind-module a { color: #9600ff; }
703
+.tsd-index-panel .tsd-kind-interface a { color: #7da01f; }
704
+.tsd-index-panel .tsd-kind-enum a { color: #cc9900; }
705
+.tsd-index-panel .tsd-kind-class a { color: #4da6ff; }
706
+.tsd-index-panel .tsd-is-private a { color: #808080; }
707
+
708
+.tsd-flag { display: inline-block; padding: 1px 5px; border-radius: 4px; color: #fff; background-color: #808080; text-indent: 0; font-size: 14px; font-weight: normal; }
709
+
710
+.tsd-anchor { position: absolute; top: -100px; }
711
+
712
+.tsd-member { position: relative; }
713
+.tsd-member .tsd-anchor + h3 { margin-top: 0; margin-bottom: 0; border-bottom: none; }
714
+
715
+.tsd-navigation { padding: 0 0 0 40px; }
716
+.tsd-navigation a { display: block; padding-top: 2px; padding-bottom: 2px; border-left: 2px solid transparent; color: #222; text-decoration: none; transition: border-left-color 0.1s; }
717
+.tsd-navigation a:hover { text-decoration: underline; }
718
+.tsd-navigation ul { margin: 0; padding: 0; list-style: none; }
719
+.tsd-navigation li { padding: 0; }
720
+
721
+.tsd-navigation.primary { padding-bottom: 40px; }
722
+.tsd-navigation.primary a { display: block; padding-top: 6px; padding-bottom: 6px; }
723
+.tsd-navigation.primary ul li a { padding-left: 5px; }
724
+.tsd-navigation.primary ul li li a { padding-left: 25px; }
725
+.tsd-navigation.primary ul li li li a { padding-left: 45px; }
726
+.tsd-navigation.primary ul li li li li a { padding-left: 65px; }
727
+.tsd-navigation.primary ul li li li li li a { padding-left: 85px; }
728
+.tsd-navigation.primary ul li li li li li li a { padding-left: 105px; }
729
+.tsd-navigation.primary > ul { border-bottom: 1px solid #eee; }
730
+.tsd-navigation.primary li { border-top: 1px solid #eee; }
731
+.tsd-navigation.primary li.current > a { font-weight: bold; }
732
+.tsd-navigation.primary li.label span { display: block; padding: 20px 0 6px 5px; color: #808080; }
733
+.tsd-navigation.primary li.globals + li > span, .tsd-navigation.primary li.globals + li > a { padding-top: 20px; }
734
+
735
+.tsd-navigation.secondary ul { transition: opacity 0.2s; }
736
+.tsd-navigation.secondary ul li a { padding-left: 25px; }
737
+.tsd-navigation.secondary ul li li a { padding-left: 45px; }
738
+.tsd-navigation.secondary ul li li li a { padding-left: 65px; }
739
+.tsd-navigation.secondary ul li li li li a { padding-left: 85px; }
740
+.tsd-navigation.secondary ul li li li li li a { padding-left: 105px; }
741
+.tsd-navigation.secondary ul li li li li li li a { padding-left: 125px; }
742
+.tsd-navigation.secondary ul.current a { border-left-color: #eee; }
743
+.tsd-navigation.secondary li.focus > a, .tsd-navigation.secondary ul.current li.focus > a { border-left-color: #000; }
744
+.tsd-navigation.secondary li.current { margin-top: 20px; margin-bottom: 20px; border-left-color: #eee; }
745
+.tsd-navigation.secondary li.current > a { font-weight: bold; }
746
+
747
+@media (min-width: 901px) { .menu-sticky-wrap { position: static; }
748
+  .no-csspositionsticky .menu-sticky-wrap.sticky { position: fixed; }
749
+  .no-csspositionsticky .menu-sticky-wrap.sticky-current { position: fixed; }
750
+  .no-csspositionsticky .menu-sticky-wrap.sticky-current ul.before-current, .no-csspositionsticky .menu-sticky-wrap.sticky-current ul.after-current { opacity: 0; }
751
+  .no-csspositionsticky .menu-sticky-wrap.sticky-bottom { position: absolute; top: auto !important; left: auto !important; bottom: 0; right: 0; }
752
+  .csspositionsticky .menu-sticky-wrap.sticky { position: -webkit-sticky; position: sticky; }
753
+  .csspositionsticky .menu-sticky-wrap.sticky-current { position: -webkit-sticky; position: sticky; } }
754
+
755
+.tsd-panel { margin: 20px 0; padding: 20px; background-color: #fff; box-shadow: 0 0 4px rgba(0, 0, 0, 0.25); }
756
+.tsd-panel:empty { display: none; }
757
+.tsd-panel > h1, .tsd-panel > h2, .tsd-panel > h3 { margin: 1.5em -20px 10px -20px; padding: 0 20px 10px 20px; border-bottom: 1px solid #eee; }
758
+.tsd-panel > h1.tsd-before-signature, .tsd-panel > h2.tsd-before-signature, .tsd-panel > h3.tsd-before-signature { margin-bottom: 0; border-bottom: 0; }
759
+.tsd-panel table { display: block; width: 100%; overflow: auto; margin-top: 10px; word-break: normal; word-break: keep-all; }
760
+.tsd-panel table th { font-weight: bold; }
761
+.tsd-panel table th, .tsd-panel table td { padding: 6px 13px; border: 1px solid #ddd; }
762
+.tsd-panel table tr { background-color: #fff; border-top: 1px solid #ccc; }
763
+.tsd-panel table tr:nth-child(2n) { background-color: #f8f8f8; }
764
+
765
+.tsd-panel-group { margin: 60px 0; }
766
+.tsd-panel-group > h1, .tsd-panel-group > h2, .tsd-panel-group > h3 { padding-left: 20px; padding-right: 20px; }
767
+
768
+#tsd-search { transition: background-color 0.2s; }
769
+#tsd-search .title { position: relative; z-index: 2; }
770
+#tsd-search .field { position: absolute; left: 0; top: 0; right: 40px; height: 40px; }
771
+#tsd-search .field input { box-sizing: border-box; position: relative; top: -50px; z-index: 1; width: 100%; padding: 0 10px; opacity: 0; outline: 0; border: 0; background: transparent; color: #222; }
772
+#tsd-search .field label { position: absolute; overflow: hidden; right: -40px; }
773
+#tsd-search .field input, #tsd-search .title { transition: opacity 0.2s; }
774
+#tsd-search .results { position: absolute; visibility: hidden; top: 40px; width: 100%; margin: 0; padding: 0; list-style: none; box-shadow: 0 0 4px rgba(0, 0, 0, 0.25); }
775
+#tsd-search .results li { padding: 0 10px; background-color: #fdfdfd; }
776
+#tsd-search .results li:nth-child(even) { background-color: #fff; }
777
+#tsd-search .results li.state { display: none; }
778
+#tsd-search .results li.current, #tsd-search .results li:hover { background-color: #eee; }
779
+#tsd-search .results a { display: block; }
780
+#tsd-search .results a:before { top: 10px; }
781
+#tsd-search .results span.parent { color: #808080; font-weight: normal; }
782
+#tsd-search.has-focus { background-color: #eee; }
783
+#tsd-search.has-focus .field input { top: 0; opacity: 1; }
784
+#tsd-search.has-focus .title { z-index: 0; opacity: 0; }
785
+#tsd-search.has-focus .results { visibility: visible; }
786
+#tsd-search.loading .results li.state.loading { display: block; }
787
+#tsd-search.failure .results li.state.failure { display: block; }
788
+
789
+.tsd-signature { margin: 0 0 1em 0; padding: 10px; border: 1px solid #eee; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 14px; }
790
+.tsd-signature.tsd-kind-icon { padding-left: 30px; }
791
+.tsd-signature.tsd-kind-icon:before { top: 10px; left: 10px; }
792
+.tsd-panel > .tsd-signature { margin-left: -20px; margin-right: -20px; border-width: 1px 0; }
793
+.tsd-panel > .tsd-signature.tsd-kind-icon { padding-left: 40px; }
794
+.tsd-panel > .tsd-signature.tsd-kind-icon:before { left: 20px; }
795
+
796
+.tsd-signature-symbol { color: #808080; font-weight: normal; }
797
+
798
+.tsd-signature-type { font-style: italic; font-weight: normal; }
799
+
800
+.tsd-signatures { padding: 0; margin: 0 0 1em 0; border: 1px solid #eee; }
801
+.tsd-signatures .tsd-signature { margin: 0; border-width: 1px 0 0 0; transition: background-color 0.1s; }
802
+.tsd-signatures .tsd-signature:first-child { border-top-width: 0; }
803
+.tsd-signatures .tsd-signature.current { background-color: #eee; }
804
+.tsd-signatures.active > .tsd-signature { cursor: pointer; }
805
+.tsd-panel > .tsd-signatures { margin-left: -20px; margin-right: -20px; border-width: 1px 0; }
806
+.tsd-panel > .tsd-signatures .tsd-signature.tsd-kind-icon { padding-left: 40px; }
807
+.tsd-panel > .tsd-signatures .tsd-signature.tsd-kind-icon:before { left: 20px; }
808
+.tsd-panel > a.anchor + .tsd-signatures { border-top-width: 0; margin-top: -20px; }
809
+
810
+ul.tsd-descriptions { position: relative; overflow: hidden; transition: height 0.3s; padding: 0; list-style: none; }
811
+ul.tsd-descriptions.active > .tsd-description { display: none; }
812
+ul.tsd-descriptions.active > .tsd-description.current { display: block; }
813
+ul.tsd-descriptions.active > .tsd-description.fade-in { -webkit-animation: fade-in-delayed 0.3s; animation: fade-in-delayed 0.3s; }
814
+ul.tsd-descriptions.active > .tsd-description.fade-out { -webkit-animation: fade-out-delayed 0.3s; animation: fade-out-delayed 0.3s; position: absolute; display: block; top: 0; left: 0; right: 0; opacity: 0; visibility: hidden; }
815
+ul.tsd-descriptions h4, ul.tsd-descriptions .tsd-index-panel h3, .tsd-index-panel ul.tsd-descriptions h3 { font-size: 16px; margin: 1em 0 0.5em 0; }
816
+
817
+ul.tsd-parameters, ul.tsd-type-parameters { list-style: square; margin: 0; padding-left: 20px; }
818
+ul.tsd-parameters > li.tsd-parameter-siganture, ul.tsd-type-parameters > li.tsd-parameter-siganture { list-style: none; margin-left: -20px; }
819
+ul.tsd-parameters h5, ul.tsd-type-parameters h5 { font-size: 16px; margin: 1em 0 0.5em 0; }
820
+ul.tsd-parameters .tsd-comment, ul.tsd-type-parameters .tsd-comment { margin-top: -0.5em; }
821
+
822
+.tsd-sources { font-size: 14px; color: #808080; margin: 0 0 1em 0; }
823
+.tsd-sources a { color: #808080; text-decoration: underline; }
824
+.tsd-sources ul, .tsd-sources p { margin: 0 !important; }
825
+.tsd-sources ul { list-style: none; padding: 0; }
826
+
827
+.tsd-page-toolbar { position: absolute; z-index: 1; top: 0; left: 0; width: 100%; height: 40px; color: #333; background: #fff; border-bottom: 1px solid #eee; }
828
+.tsd-page-toolbar a { color: #333; text-decoration: none; }
829
+.tsd-page-toolbar a.title { font-weight: bold; }
830
+.tsd-page-toolbar a.title:hover { text-decoration: underline; }
831
+.tsd-page-toolbar .table-wrap { display: table; width: 100%; height: 40px; }
832
+.tsd-page-toolbar .table-cell { display: table-cell; position: relative; white-space: nowrap; line-height: 40px; }
833
+.tsd-page-toolbar .table-cell:first-child { width: 100%; }
834
+
835
+.tsd-widget:before, .tsd-select .tsd-select-label:before, .tsd-select .tsd-select-list li:before { content: ""; display: inline-block; width: 40px; height: 40px; margin: 0 -8px 0 0; background-image: url(../images/widgets.png); background-repeat: no-repeat; text-indent: -1024px; vertical-align: bottom; }
836
+@media (-webkit-min-device-pixel-ratio: 1.5), (min-device-pixel-ratio: 1.5), (min-resolution: 144dpi) { .tsd-widget:before, .tsd-select .tsd-select-label:before, .tsd-select .tsd-select-list li:before { background-image: url(../images/widgets@2x.png); background-size: 320px 40px; } }
837
+
838
+.tsd-widget { display: inline-block; overflow: hidden; opacity: 0.6; height: 40px; transition: opacity 0.1s, background-color 0.2s; vertical-align: bottom; cursor: pointer; }
839
+.tsd-widget:hover { opacity: 0.8; }
840
+.tsd-widget.active { opacity: 1; background-color: #eee; }
841
+.tsd-widget.no-caption { width: 40px; }
842
+.tsd-widget.no-caption:before { margin: 0; }
843
+.tsd-widget.search:before { background-position: 0 0; }
844
+.tsd-widget.menu:before { background-position: -40px 0; }
845
+.tsd-widget.options:before { background-position: -80px 0; }
846
+.tsd-widget.options, .tsd-widget.menu { display: none; }
847
+@media (max-width: 900px) { .tsd-widget.options, .tsd-widget.menu { display: inline-block; } }
848
+input[type=checkbox] + .tsd-widget:before { background-position: -120px 0; }
849
+input[type=checkbox]:checked + .tsd-widget:before { background-position: -160px 0; }
850
+
851
+.tsd-select { position: relative; display: inline-block; height: 40px; transition: opacity 0.1s, background-color 0.2s; vertical-align: bottom; cursor: pointer; }
852
+.tsd-select .tsd-select-label { opacity: 0.6; transition: opacity 0.2s; }
853
+.tsd-select .tsd-select-label:before { background-position: -240px 0; }
854
+.tsd-select.active .tsd-select-label { opacity: 0.8; }
855
+.tsd-select.active .tsd-select-list { visibility: visible; opacity: 1; transition-delay: 0s; }
856
+.tsd-select .tsd-select-list { position: absolute; visibility: hidden; top: 40px; left: 0; margin: 0; padding: 0; opacity: 0; list-style: none; box-shadow: 0 0 4px rgba(0, 0, 0, 0.25); transition: visibility 0s 0.2s, opacity 0.2s; }
857
+.tsd-select .tsd-select-list li { padding: 0 20px 0 0; background-color: #fdfdfd; }
858
+.tsd-select .tsd-select-list li:before { background-position: 40px 0; }
859
+.tsd-select .tsd-select-list li:nth-child(even) { background-color: #fff; }
860
+.tsd-select .tsd-select-list li:hover { background-color: #eee; }
861
+.tsd-select .tsd-select-list li.selected:before { background-position: -200px 0; }
862
+@media (max-width: 900px) { .tsd-select .tsd-select-list { top: 0; left: auto; right: 100%; margin-right: -5px; }
863
+  .tsd-select .tsd-select-label:before { background-position: -280px 0; } }
864
+
865
+img { max-width: 100%; }

+ 7
- 0
docs/api/v2.4/assets/css/main.css.map
File diff suppressed because it is too large
View File


BIN
docs/api/v2.4/assets/images/icons.png View File


BIN
docs/api/v2.4/assets/images/icons@2x.png View File


BIN
docs/api/v2.4/assets/images/widgets.png View File


BIN
docs/api/v2.4/assets/images/widgets@2x.png View File


+ 5
- 0
docs/api/v2.4/assets/js/main.js
File diff suppressed because it is too large
View File


+ 3
- 0
docs/api/v2.4/assets/js/search.js
File diff suppressed because it is too large
View File


+ 1060
- 0
docs/api/v2.4/classes/agoraview.html
File diff suppressed because it is too large
View File


+ 4117
- 0
docs/api/v2.4/classes/rtcengine.html
File diff suppressed because it is too large
View File


+ 224
- 0
docs/api/v2.4/globals.html View File

1
+<!doctype html>
2
+<html class="default no-js">
3
+<head>
4
+	<meta charset="utf-8">
5
+	<meta http-equiv="X-UA-Compatible" content="IE=edge">
6
+	<title>react-native-agora</title>
7
+	<meta name="description" content="">
8
+	<meta name="viewport" content="width=device-width, initial-scale=1">
9
+	<link rel="stylesheet" href="assets/css/main.css">
10
+</head>
11
+<body>
12
+<header>
13
+	<div class="tsd-page-toolbar">
14
+		<div class="container">
15
+			<div class="table-wrap">
16
+				<div class="table-cell" id="tsd-search" data-index="assets/js/search.js" data-base=".">
17
+					<div class="field">
18
+						<label for="tsd-search-field" class="tsd-widget search no-caption">Search</label>
19
+						<input id="tsd-search-field" type="text" />
20
+					</div>
21
+					<ul class="results">
22
+						<li class="state loading">Preparing search index...</li>
23
+						<li class="state failure">The search index is not available</li>
24
+					</ul>
25
+					<a href="index.html" class="title">react-native-agora</a>
26
+				</div>
27
+				<div class="table-cell" id="tsd-widgets">
28
+					<div id="tsd-filter">
29
+						<a href="#" class="tsd-widget options no-caption" data-toggle="options">Options</a>
30
+						<div class="tsd-filter-group">
31
+							<div class="tsd-select" id="tsd-filter-visibility">
32
+								<span class="tsd-select-label">All</span>
33
+								<ul class="tsd-select-list">
34
+									<li data-value="public">Public</li>
35
+									<li data-value="protected">Public/Protected</li>
36
+									<li data-value="private" class="selected">All</li>
37
+								</ul>
38
+							</div>
39
+							<input type="checkbox" id="tsd-filter-inherited" checked />
40
+							<label class="tsd-widget" for="tsd-filter-inherited">Inherited</label>
41
+							<input type="checkbox" id="tsd-filter-externals" checked />
42
+							<label class="tsd-widget" for="tsd-filter-externals">Externals</label>
43
+							<input type="checkbox" id="tsd-filter-only-exported" />
44
+							<label class="tsd-widget" for="tsd-filter-only-exported">Only exported</label>
45
+						</div>
46
+					</div>
47
+					<a href="#" class="tsd-widget menu no-caption" data-toggle="menu">Menu</a>
48
+				</div>
49
+			</div>
50
+		</div>
51
+	</div>
52
+	<div class="tsd-page-title">
53
+		<div class="container">
54
+			<ul class="tsd-breadcrumb">
55
+				<li>
56
+					<a href="globals.html">Globals</a>
57
+				</li>
58
+			</ul>
59
+			<h1> react-native-agora</h1>
60
+		</div>
61
+	</div>
62
+</header>
63
+<div class="container container-main">
64
+	<div class="row">
65
+		<div class="col-8 col-content">
66
+			<section class="tsd-panel-group tsd-index-group">
67
+				<h2>Index</h2>
68
+				<section class="tsd-panel tsd-index-panel">
69
+					<div class="tsd-index-content">
70
+						<section class="tsd-index-section ">
71
+							<h3>Classes</h3>
72
+							<ul class="tsd-index-list">
73
+								<li class="tsd-kind-class tsd-has-type-parameter"><a href="classes/agoraview.html" class="tsd-kind-icon">Agora<wbr>View</a></li>
74
+								<li class="tsd-kind-class"><a href="classes/rtcengine.html" class="tsd-kind-icon">Rtc<wbr>Engine</a></li>
75
+							</ul>
76
+						</section>
77
+						<section class="tsd-index-section tsd-is-not-exported">
78
+							<h3>Variables</h3>
79
+							<ul class="tsd-index-list">
80
+								<li class="tsd-kind-variable tsd-is-not-exported"><a href="globals.html#agora" class="tsd-kind-icon">Agora</a></li>
81
+								<li class="tsd-kind-variable tsd-is-not-exported"><a href="globals.html#agoraeventemitter" class="tsd-kind-icon">Agora<wbr>Event<wbr>Emitter</a></li>
82
+								<li class="tsd-kind-variable tsd-is-not-exported"><a href="globals.html#rctagoraview" class="tsd-kind-icon">RCTAgora<wbr>View</a></li>
83
+							</ul>
84
+						</section>
85
+					</div>
86
+				</section>
87
+			</section>
88
+			<section class="tsd-panel-group tsd-member-group tsd-is-not-exported">
89
+				<h2>Variables</h2>
90
+				<section class="tsd-panel tsd-member tsd-kind-variable tsd-is-not-exported">
91
+					<a name="agora" class="tsd-anchor"></a>
92
+					<h3>Agora</h3>
93
+					<div class="tsd-signature tsd-kind-icon">Agora<span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">any</span></div>
94
+					<aside class="tsd-sources">
95
+						<ul>
96
+							<li>Defined in <a href="https://github.com/syanbo/react-native-agora/blob/5a20586/src/RtcEngine.native.ts#L31">RtcEngine.native.ts:31</a></li>
97
+						</ul>
98
+					</aside>
99
+				</section>
100
+				<section class="tsd-panel tsd-member tsd-kind-variable tsd-is-not-exported">
101
+					<a name="agoraeventemitter" class="tsd-anchor"></a>
102
+					<h3><span class="tsd-flag ts-flagConst">Const</span> Agora<wbr>Event<wbr>Emitter</h3>
103
+					<div class="tsd-signature tsd-kind-icon">Agora<wbr>Event<wbr>Emitter<span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">EventEmitter</span><span class="tsd-signature-symbol"> =&nbsp;new NativeEventEmitter(Agora)</span></div>
104
+					<aside class="tsd-sources">
105
+						<ul>
106
+							<li>Defined in <a href="https://github.com/syanbo/react-native-agora/blob/5a20586/src/RtcEngine.native.ts#L32">RtcEngine.native.ts:32</a></li>
107
+						</ul>
108
+					</aside>
109
+				</section>
110
+				<section class="tsd-panel tsd-member tsd-kind-variable tsd-is-not-exported">
111
+					<a name="rctagoraview" class="tsd-anchor"></a>
112
+					<h3><span class="tsd-flag ts-flagConst">Const</span> RCTAgora<wbr>View</h3>
113
+					<div class="tsd-signature tsd-kind-icon">RCTAgora<wbr>View<span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">any</span><span class="tsd-signature-symbol"> =&nbsp;requireNativeComponent(&quot;RCTAgoraView&quot;)</span></div>
114
+					<aside class="tsd-sources">
115
+						<ul>
116
+							<li>Defined in <a href="https://github.com/syanbo/react-native-agora/blob/5a20586/src/AgoraView.native.tsx#L16">AgoraView.native.tsx:16</a></li>
117
+						</ul>
118
+					</aside>
119
+					<div class="tsd-comment tsd-typography">
120
+						<div class="lead">
121
+							<p>Import RCTAgoraView from native binding.</p>
122
+						</div>
123
+						<p>This @object is used to bridge native layer between react layer.</p>
124
+					</div>
125
+				</section>
126
+			</section>
127
+		</div>
128
+		<div class="col-4 col-menu menu-sticky-wrap menu-highlight">
129
+			<nav class="tsd-navigation primary">
130
+				<ul>
131
+					<li class="globals current ">
132
+						<a href="globals.html"><em>Globals</em></a>
133
+					</li>
134
+				</ul>
135
+			</nav>
136
+			<nav class="tsd-navigation secondary menu-sticky">
137
+				<ul class="before-current">
138
+					<li class=" tsd-kind-class tsd-has-type-parameter">
139
+						<a href="classes/agoraview.html" class="tsd-kind-icon">Agora<wbr>View</a>
140
+					</li>
141
+					<li class=" tsd-kind-class">
142
+						<a href="classes/rtcengine.html" class="tsd-kind-icon">Rtc<wbr>Engine</a>
143
+					</li>
144
+					<li class=" tsd-kind-variable tsd-is-not-exported">
145
+						<a href="globals.html#agora" class="tsd-kind-icon">Agora</a>
146
+					</li>
147
+					<li class=" tsd-kind-variable tsd-is-not-exported">
148
+						<a href="globals.html#agoraeventemitter" class="tsd-kind-icon">Agora<wbr>Event<wbr>Emitter</a>
149
+					</li>
150
+					<li class=" tsd-kind-variable tsd-is-not-exported">
151
+						<a href="globals.html#rctagoraview" class="tsd-kind-icon">RCTAgora<wbr>View</a>
152
+					</li>
153
+				</ul>
154
+			</nav>
155
+		</div>
156
+	</div>
157
+</div>
158
+<footer class="with-border-bottom">
159
+	<div class="container">
160
+		<h2>Legend</h2>
161
+		<div class="tsd-legend-group">
162
+			<ul class="tsd-legend">
163
+				<li class="tsd-kind-module"><span class="tsd-kind-icon">Module</span></li>
164
+				<li class="tsd-kind-object-literal"><span class="tsd-kind-icon">Object literal</span></li>
165
+				<li class="tsd-kind-variable"><span class="tsd-kind-icon">Variable</span></li>
166
+				<li class="tsd-kind-function"><span class="tsd-kind-icon">Function</span></li>
167
+				<li class="tsd-kind-function tsd-has-type-parameter"><span class="tsd-kind-icon">Function with type parameter</span></li>
168
+				<li class="tsd-kind-index-signature"><span class="tsd-kind-icon">Index signature</span></li>
169
+				<li class="tsd-kind-type-alias"><span class="tsd-kind-icon">Type alias</span></li>
170
+			</ul>
171
+			<ul class="tsd-legend">
172
+				<li class="tsd-kind-enum"><span class="tsd-kind-icon">Enumeration</span></li>
173
+				<li class="tsd-kind-enum-member"><span class="tsd-kind-icon">Enumeration member</span></li>
174
+				<li class="tsd-kind-property tsd-parent-kind-enum"><span class="tsd-kind-icon">Property</span></li>
175
+				<li class="tsd-kind-method tsd-parent-kind-enum"><span class="tsd-kind-icon">Method</span></li>
176
+			</ul>
177
+			<ul class="tsd-legend">
178
+				<li class="tsd-kind-interface"><span class="tsd-kind-icon">Interface</span></li>
179
+				<li class="tsd-kind-interface tsd-has-type-parameter"><span class="tsd-kind-icon">Interface with type parameter</span></li>
180
+				<li class="tsd-kind-constructor tsd-parent-kind-interface"><span class="tsd-kind-icon">Constructor</span></li>
181
+				<li class="tsd-kind-property tsd-parent-kind-interface"><span class="tsd-kind-icon">Property</span></li>
182
+				<li class="tsd-kind-method tsd-parent-kind-interface"><span class="tsd-kind-icon">Method</span></li>
183
+				<li class="tsd-kind-index-signature tsd-parent-kind-interface"><span class="tsd-kind-icon">Index signature</span></li>
184
+			</ul>
185
+			<ul class="tsd-legend">
186
+				<li class="tsd-kind-class"><span class="tsd-kind-icon">Class</span></li>
187
+				<li class="tsd-kind-class tsd-has-type-parameter"><span class="tsd-kind-icon">Class with type parameter</span></li>
188
+				<li class="tsd-kind-constructor tsd-parent-kind-class"><span class="tsd-kind-icon">Constructor</span></li>
189
+				<li class="tsd-kind-property tsd-parent-kind-class"><span class="tsd-kind-icon">Property</span></li>
190
+				<li class="tsd-kind-method tsd-parent-kind-class"><span class="tsd-kind-icon">Method</span></li>
191
+				<li class="tsd-kind-accessor tsd-parent-kind-class"><span class="tsd-kind-icon">Accessor</span></li>
192
+				<li class="tsd-kind-index-signature tsd-parent-kind-class"><span class="tsd-kind-icon">Index signature</span></li>
193
+			</ul>
194
+			<ul class="tsd-legend">
195
+				<li class="tsd-kind-constructor tsd-parent-kind-class tsd-is-inherited"><span class="tsd-kind-icon">Inherited constructor</span></li>
196
+				<li class="tsd-kind-property tsd-parent-kind-class tsd-is-inherited"><span class="tsd-kind-icon">Inherited property</span></li>
197
+				<li class="tsd-kind-method tsd-parent-kind-class tsd-is-inherited"><span class="tsd-kind-icon">Inherited method</span></li>
198
+				<li class="tsd-kind-accessor tsd-parent-kind-class tsd-is-inherited"><span class="tsd-kind-icon">Inherited accessor</span></li>
199
+			</ul>
200
+			<ul class="tsd-legend">
201
+				<li class="tsd-kind-property tsd-parent-kind-class tsd-is-protected"><span class="tsd-kind-icon">Protected property</span></li>
202
+				<li class="tsd-kind-method tsd-parent-kind-class tsd-is-protected"><span class="tsd-kind-icon">Protected method</span></li>
203
+				<li class="tsd-kind-accessor tsd-parent-kind-class tsd-is-protected"><span class="tsd-kind-icon">Protected accessor</span></li>
204
+			</ul>
205
+			<ul class="tsd-legend">
206
+				<li class="tsd-kind-property tsd-parent-kind-class tsd-is-private"><span class="tsd-kind-icon">Private property</span></li>
207
+				<li class="tsd-kind-method tsd-parent-kind-class tsd-is-private"><span class="tsd-kind-icon">Private method</span></li>
208
+				<li class="tsd-kind-accessor tsd-parent-kind-class tsd-is-private"><span class="tsd-kind-icon">Private accessor</span></li>
209
+			</ul>
210
+			<ul class="tsd-legend">
211
+				<li class="tsd-kind-property tsd-parent-kind-class tsd-is-static"><span class="tsd-kind-icon">Static property</span></li>
212
+				<li class="tsd-kind-call-signature tsd-parent-kind-class tsd-is-static"><span class="tsd-kind-icon">Static method</span></li>
213
+			</ul>
214
+		</div>
215
+	</div>
216
+</footer>
217
+<div class="container tsd-generator">
218
+	<p>Generated using <a href="http://typedoc.org/" target="_blank">TypeDoc</a></p>
219
+</div>
220
+<div class="overlay"></div>
221
+<script src="assets/js/main.js"></script>
222
+<script>if (location.protocol == 'file:') document.write('<script src="assets/js/search.js"><' + '/script>');</script>
223
+</body>
224
+</html>

+ 492
- 0
docs/api/v2.4/index.html View File

1
+<!doctype html>
2
+<html class="default no-js">
3
+<head>
4
+	<meta charset="utf-8">
5
+	<meta http-equiv="X-UA-Compatible" content="IE=edge">
6
+	<title>react-native-agora</title>
7
+	<meta name="description" content="">
8
+	<meta name="viewport" content="width=device-width, initial-scale=1">
9
+	<link rel="stylesheet" href="assets/css/main.css">
10
+</head>
11
+<body>
12
+<header>
13
+	<div class="tsd-page-toolbar">
14
+		<div class="container">
15
+			<div class="table-wrap">
16
+				<div class="table-cell" id="tsd-search" data-index="assets/js/search.js" data-base=".">
17
+					<div class="field">
18
+						<label for="tsd-search-field" class="tsd-widget search no-caption">Search</label>
19
+						<input id="tsd-search-field" type="text" />
20
+					</div>
21
+					<ul class="results">
22
+						<li class="state loading">Preparing search index...</li>
23
+						<li class="state failure">The search index is not available</li>
24
+					</ul>
25
+					<a href="index.html" class="title">react-native-agora</a>
26
+				</div>
27
+				<div class="table-cell" id="tsd-widgets">
28
+					<div id="tsd-filter">
29
+						<a href="#" class="tsd-widget options no-caption" data-toggle="options">Options</a>
30
+						<div class="tsd-filter-group">
31
+							<div class="tsd-select" id="tsd-filter-visibility">
32
+								<span class="tsd-select-label">All</span>
33
+								<ul class="tsd-select-list">
34
+									<li data-value="public">Public</li>
35
+									<li data-value="protected">Public/Protected</li>
36
+									<li data-value="private" class="selected">All</li>
37
+								</ul>
38
+							</div>
39
+							<input type="checkbox" id="tsd-filter-inherited" checked />
40
+							<label class="tsd-widget" for="tsd-filter-inherited">Inherited</label>
41
+							<input type="checkbox" id="tsd-filter-externals" checked />
42
+							<label class="tsd-widget" for="tsd-filter-externals">Externals</label>
43
+							<input type="checkbox" id="tsd-filter-only-exported" />
44
+							<label class="tsd-widget" for="tsd-filter-only-exported">Only exported</label>
45
+						</div>
46
+					</div>
47
+					<a href="#" class="tsd-widget menu no-caption" data-toggle="menu">Menu</a>
48
+				</div>
49
+			</div>
50
+		</div>
51
+	</div>
52
+	<div class="tsd-page-title">
53
+		<div class="container">
54
+			<ul class="tsd-breadcrumb">
55
+				<li>
56
+					<a href="globals.html">Globals</a>
57
+				</li>
58
+			</ul>
59
+			<h1> react-native-agora</h1>
60
+		</div>
61
+	</div>
62
+</header>
63
+<div class="container container-main">
64
+	<div class="row">
65
+		<div class="col-8 col-content">
66
+			<div class="tsd-panel tsd-typography">
67
+				<h5 id="-qq-471757030">有任何问题欢迎加入QQ群进行反馈  471757030</h5>
68
+				<h2 id="for-1-x-old-version"><a href="README.old.md">for 1.x old version</a></h2>
69
+				<h1 id="react-native-agora">react-native-agora</h1>
70
+				<p><a href="https://www.npmjs.com/package/react-native-agora"><img src="https://img.shields.io/npm/v/react-native-agora.svg" alt="npm"></a>
71
+					<a href="https://www.npmjs.com/package/react-native-agora"><img src="https://img.shields.io/npm/dm/react-native-agora.svg" alt="npm"></a>
72
+					<a href="https://www.npmjs.com/package/react-native-agora"><img src="https://img.shields.io/npm/dt/react-native-agora.svg" alt="npm"></a>
73
+					<a href="https://github.com/syanbo/react-native-agora/blob/master/LICENSE"><img src="https://img.shields.io/npm/l/react-native-agora.svg" alt="npm"></a>
74
+				<a href="https://gitter.im/react-native-agora/community"><img src="https://img.shields.io/badge/gitter-join%20chat-brightgreen.svg" alt="join chat"></a></p>
75
+				<h2 id="description">Description</h2>
76
+				<p>The react-native-agora is an open-source wrapper for react-native developers. This SDK takes advantage of React Native and Agora RTC Video SDKs on Android/iOS.</p>
77
+				<h2 id="compatibility">Compatibility</h2>
78
+				<ul>
79
+					<li>react native 0.58.x</li>
80
+					<li>iOS SDK 8.0+</li>
81
+					<li>Android 5.0+ x86 arm64 armv7a</li>
82
+				</ul>
83
+				<h2 id="quick-start"><a href="https://github.com/AgoraIO-Community/Agora-RN-Quickstart">quick start</a></h2>
84
+				<h2 id="installation">Installation</h2>
85
+				<p>Install with npm:</p>
86
+				<p> <code>npm install --save react-native-agora</code></p>
87
+				<p>Or, install with yarn:</p>
88
+				<p> <code>yarn add react-native-agora</code></p>
89
+				<p>Either way, then link with:</p>
90
+				<p> <code>react-native link react-native-agora</code></p>
91
+				<h3 id="ios-installation">iOS Installation</h3>
92
+				<p>  <a href="docs/IOS_INSTALLATION.zh.md">中文</a>
93
+				<a href="docs/IOS_INSTALLATION.md">English</a></p>
94
+				<h3 id="android-installation">Android Installation</h3>
95
+				<p>  <a href="docs/ANDROID_INSTALLATION.zh.md">中文</a>
96
+				<a href="docs/ANDROID_INSTALLATION.md">English</a></p>
97
+				<h2 id="agora-native-api-documentation">Agora Native API Documentation</h2>
98
+				<h3 id="android">Android</h3>
99
+				<p>  <a href="https://docs.agora.io/cn/Video/API%20Reference/java/index.html">中文</a>
100
+				<a href="https://docs.agora.io/en/Video/API%20Reference/java/index.html">English</a></p>
101
+				<h2 id="ios">iOS</h2>
102
+				<p>  <a href="https://docs.agora.io/cn/Video/API%20Reference/oc/docs/headers/Agora-Objective-C-API-Overview.html">中文</a>
103
+				<a href="https://docs.agora.io/en/Video/API%20Reference/oc/docs/headers/Agora-Objective-C-API-Overview.html">English</a></p>
104
+				<h2 id="api-docs"><a href="https://syanbo.github.io/react-native-agora/globals.html">API DOCS</a></h2>
105
+				<h4 id="events">Events</h4>
106
+				<pre><code class="language-javascript">RtcEngine.on(<span class="hljs-string">'eventName'</span>, (data) =&gt; {
107
+    <span class="hljs-built_in">console</span>.log(data);
108
+});</code></pre>
109
+				<table>
110
+					<thead>
111
+						<tr>
112
+							<th>Name</th>
113
+							<th>Description</th>
114
+							<th>Platform</th>
115
+						</tr>
116
+					</thead>
117
+					<tbody><tr>
118
+							<td>warning</td>
119
+							<td>warning</td>
120
+							<td>all</td>
121
+						</tr>
122
+						<tr>
123
+							<td>error</td>
124
+							<td>error</td>
125
+							<td>all</td>
126
+						</tr>
127
+						<tr>
128
+							<td>apiCallExecute</td>
129
+							<td>capture agora native api call executed</td>
130
+							<td>all</td>
131
+						</tr>
132
+						<tr>
133
+							<td>joinChannelSuccess</td>
134
+							<td>join channel success</td>
135
+							<td>all</td>
136
+						</tr>
137
+						<tr>
138
+							<td>reJoinChannelSuccess</td>
139
+							<td>rejoin channel success</td>
140
+							<td>all</td>
141
+						</tr>
142
+						<tr>
143
+							<td>leaveChannel</td>
144
+							<td>quit channel</td>
145
+							<td>all</td>
146
+						</tr>
147
+						<tr>
148
+							<td>clientRoleChanged</td>
149
+							<td>when changed client role</td>
150
+							<td>all</td>
151
+						</tr>
152
+						<tr>
153
+							<td>userJoined</td>
154
+							<td>when user joined channel</td>
155
+							<td>all</td>
156
+						</tr>
157
+						<tr>
158
+							<td>userOffline</td>
159
+							<td>when user left channel</td>
160
+							<td>all</td>
161
+						</tr>
162
+						<tr>
163
+							<td>connectionStateChanged</td>
164
+							<td>when connection state changed</td>
165
+							<td>all</td>
166
+						</tr>
167
+						<tr>
168
+							<td>connectionLost</td>
169
+							<td>when connection lost</td>
170
+							<td>all</td>
171
+						</tr>
172
+						<tr>
173
+							<td>tokenPrivilegeWillExpire</td>
174
+							<td>when token will expire</td>
175
+							<td>all</td>
176
+						</tr>
177
+						<tr>
178
+							<td>requestToken</td>
179
+							<td>when token expired</td>
180
+							<td>all</td>
181
+						</tr>
182
+						<tr>
183
+							<td>microphoneEnabled</td>
184
+							<td>when microphone enabled</td>
185
+							<td>all</td>
186
+						</tr>
187
+						<tr>
188
+							<td>audioVolumeIndication</td>
189
+							<td>notice audio volume</td>
190
+							<td>all</td>
191
+						</tr>
192
+						<tr>
193
+							<td>activeSpeaker</td>
194
+							<td>reports which user is the loudest speaker</td>
195
+							<td>all</td>
196
+						</tr>
197
+						<tr>
198
+							<td>firstLocalAudioFrame</td>
199
+							<td>when the first local audio frame is sent</td>
200
+							<td>all</td>
201
+						</tr>
202
+						<tr>
203
+							<td>firstRemoteAudioFrame</td>
204
+							<td>when the first remote audio frame is sent</td>
205
+							<td>all</td>
206
+						</tr>
207
+						<tr>
208
+							<td>videoStopped</td>
209
+							<td>when video stopped</td>
210
+							<td>all</td>
211
+						</tr>
212
+						<tr>
213
+							<td>firstLocalVideoFrame</td>
214
+							<td>when first local video frame is sent</td>
215
+							<td>all</td>
216
+						</tr>
217
+						<tr>
218
+							<td>firstRemoteVideoDecoded</td>
219
+							<td>when first remote video is decoded</td>
220
+							<td>all</td>
221
+						</tr>
222
+						<tr>
223
+							<td>firstRemoteVideoFrame</td>
224
+							<td>when first remote video frame is rendered</td>
225
+							<td>all</td>
226
+						</tr>
227
+						<tr>
228
+							<td>userMuteAudio</td>
229
+							<td>when a remote user&#39;s audio stream is muted/unmuted</td>
230
+							<td>all</td>
231
+						</tr>
232
+						<tr>
233
+							<td>userMuteVideo</td>
234
+							<td>when a remote user&#39;s video stream is muted/unmuted</td>
235
+							<td>all</td>
236
+						</tr>
237
+						<tr>
238
+							<td>userEnableVideo</td>
239
+							<td>when a remote user enables/disables the video module</td>
240
+							<td>all</td>
241
+						</tr>
242
+						<tr>
243
+							<td>userEnableLocalVideo</td>
244
+							<td>when a remote user enables/disables the local video capture function</td>
245
+							<td>all</td>
246
+						</tr>
247
+						<tr>
248
+							<td>videoSizeChanged</td>
249
+							<td>when the video size or rotation information of a specified remote user changes</td>
250
+							<td>all</td>
251
+						</tr>
252
+						<tr>
253
+							<td>remoteVideoStateChanged</td>
254
+							<td>when the remote video stream state changes</td>
255
+							<td>all</td>
256
+						</tr>
257
+						<tr>
258
+							<td>localPublishFallbackToAudioOnly</td>
259
+							<td>Occurs when the published video stream falls back to an audio-only stream due to unreliable network conditions or switches back to the video when the network conditions improve.</td>
260
+							<td>all</td>
261
+						</tr>
262
+						<tr>
263
+							<td>remoteSubscribeFallbackToAudioOnly</td>
264
+							<td>Occurs when the remote video stream falls back to an audio-only stream due to unreliable network conditions or switches back to the video after the network conditions improve.</td>
265
+							<td>all</td>
266
+						</tr>
267
+						<tr>
268
+							<td>audioRouteChanged</td>
269
+							<td>when the local audio pkayout route changes</td>
270
+							<td>all</td>
271
+						</tr>
272
+						<tr>
273
+							<td>cameraReady</td>
274
+							<td>when the camera is turned on and ready to capture video</td>
275
+							<td>all</td>
276
+						</tr>
277
+						<tr>
278
+							<td>cameraFocusAreaChanged</td>
279
+							<td>when the camera focus area is changed</td>
280
+							<td>all</td>
281
+						</tr>
282
+						<tr>
283
+							<td>cameraExposureAreaChanged</td>
284
+							<td>The camera exposure area has changed</td>
285
+							<td>all</td>
286
+						</tr>
287
+						<tr>
288
+							<td>remoteAudioStats</td>
289
+							<td>Reports the statistics of the audio stream from each remote user/host.</td>
290
+							<td>all</td>
291
+						</tr>
292
+						<tr>
293
+							<td>rtcStats</td>
294
+							<td>Reports the statistics of the RtcEngine once every two seconds</td>
295
+							<td>all</td>
296
+						</tr>
297
+						<tr>
298
+							<td>lastmileQuality</td>
299
+							<td>Reports the last mile network quality of the local user once every two seconds before the user joins the channel. Last mile refers to the connection between the local device and Agora&#39;s edge server. After the application calls the enableLastmileTest method, this callback reports once every two seconds the uplink and downlink last mile network conditions of the local user before the user joins the channel.</td>
300
+							<td>all</td>
301
+						</tr>
302
+						<tr>
303
+							<td>networkQuality</td>
304
+							<td>Reports the last mile network quality of each user in the channel once every two seconds. Last mile refers to the connection between the local device and Agora&#39;s edge server. This callback reports once every two seconds the uplink last mile network conditions of each user in the channel. If a channel includes multiple users, then this callback will be triggered as many times.</td>
305
+							<td>all</td>
306
+						</tr>
307
+						<tr>
308
+							<td>localVideoStats</td>
309
+							<td>Reports the statistics of the uploading local video streams. This callback is triggered once every two seconds for each individual user/host. If there are multiple users/hosts in the channel, this callback is triggered multiple times every 2 seconds.</td>
310
+							<td>all</td>
311
+						</tr>
312
+						<tr>
313
+							<td>remoteVideoStats</td>
314
+							<td>Reports the statistics of the video stream from each remote user/host. The SDK triggers this callback once every two seconds for each remote user/host. If a channel includes multiple remote users, the SDK triggers this callback as many times. This callback reports statistics more closely linked to the real-user experience of the video transmission quality than the statistics that the onRemoteVideoTransportStats callback reports</td>
315
+							<td>all</td>
316
+						</tr>
317
+						<tr>
318
+							<td>audioTransportStatsOfUid</td>
319
+							<td>Reports the transport-layer statistics of each remote audio stream.</td>
320
+							<td>all</td>
321
+						</tr>
322
+						<tr>
323
+							<td>videoTransportStatsOfUid</td>
324
+							<td>Reports the transport-layer statistics of each remote video stream.</td>
325
+							<td>all</td>
326
+						</tr>
327
+						<tr>
328
+							<td>localAudioMixingFinish</td>
329
+							<td>Occurs when the audio mixing file playback finishes.</td>
330
+							<td>all</td>
331
+						</tr>
332
+						<tr>
333
+							<td>remoteAudioMixingStart</td>
334
+							<td>Occurs when a remote user starts audio mixing.</td>
335
+							<td>ios</td>
336
+						</tr>
337
+						<tr>
338
+							<td>remoteAudioMixingFinish</td>
339
+							<td>Occurs when a remote user finishes audio mixing.</td>
340
+							<td>ios</td>
341
+						</tr>
342
+						<tr>
343
+							<td>audioEffectFinish</td>
344
+							<td>Occurs when the audio effect file playback finishes.</td>
345
+							<td>all</td>
346
+						</tr>
347
+						<tr>
348
+							<td>streamPublished</td>
349
+							<td>Occurs when a CDN live stream is published.</td>
350
+							<td>all</td>
351
+						</tr>
352
+						<tr>
353
+							<td>streamUnpublish</td>
354
+							<td>Occurs when CDN live streaming stops. This callback notifies the host that the CDN live stream is unpublished.</td>
355
+							<td>all</td>
356
+						</tr>
357
+						<tr>
358
+							<td>transcodingUpdate</td>
359
+							<td>Occurs when the publisher&#39;s transcoding settings are updated.</td>
360
+							<td>all</td>
361
+						</tr>
362
+						<tr>
363
+							<td>streamInjectedStatus</td>
364
+							<td>Reports the status of the injected online media stream.</td>
365
+							<td>all</td>
366
+						</tr>
367
+						<tr>
368
+							<td>receiveStreamMessage</td>
369
+							<td>Occurs when the local user receives a remote data stream within five seconds.</td>
370
+							<td>all</td>
371
+						</tr>
372
+						<tr>
373
+							<td>occurStreamMessageError</td>
374
+							<td>Occurs when the local user fails to receive a remote data stream.</td>
375
+							<td>all</td>
376
+						</tr>
377
+						<tr>
378
+							<td>mediaEngineLoaded</td>
379
+							<td>Occurs when the media engine is loaded.</td>
380
+							<td>all</td>
381
+						</tr>
382
+						<tr>
383
+							<td>mediaEngineStartCall</td>
384
+							<td>Occurs when the media engine starts.</td>
385
+							<td>all</td>
386
+						</tr>
387
+				</tbody></table>
388
+				<h2 id="resources">Resources</h2>
389
+				<ul>
390
+					<li>Complete <a href="https://docs.agora.io/en/">API documentation</a> at the Developer Center</li>
391
+					<li><a href="https://github.com/syanbo/react-native-agora/issues">File bugs about this sample</a></li>
392
+					<li><a href="https://facebook.github.io/react-native/docs/getting-started.html">React Native Getting Started</a></li>
393
+				</ul>
394
+			</div>
395
+		</div>
396
+		<div class="col-4 col-menu menu-sticky-wrap menu-highlight">
397
+			<nav class="tsd-navigation primary">
398
+				<ul>
399
+					<li class="globals  ">
400
+						<a href="globals.html"><em>Globals</em></a>
401
+					</li>
402
+				</ul>
403
+			</nav>
404
+			<nav class="tsd-navigation secondary menu-sticky">
405
+				<ul class="before-current">
406
+					<li class=" tsd-kind-class tsd-has-type-parameter">
407
+						<a href="classes/agoraview.html" class="tsd-kind-icon">Agora<wbr>View</a>
408
+					</li>
409
+					<li class=" tsd-kind-class">
410
+						<a href="classes/rtcengine.html" class="tsd-kind-icon">Rtc<wbr>Engine</a>
411
+					</li>
412
+					<li class=" tsd-kind-variable tsd-is-not-exported">
413
+						<a href="globals.html#agora" class="tsd-kind-icon">Agora</a>
414
+					</li>
415
+					<li class=" tsd-kind-variable tsd-is-not-exported">
416
+						<a href="globals.html#agoraeventemitter" class="tsd-kind-icon">Agora<wbr>Event<wbr>Emitter</a>
417
+					</li>
418
+					<li class=" tsd-kind-variable tsd-is-not-exported">
419
+						<a href="globals.html#rctagoraview" class="tsd-kind-icon">RCTAgora<wbr>View</a>
420
+					</li>
421
+				</ul>
422
+			</nav>
423
+		</div>
424
+	</div>
425
+</div>
426
+<footer class="with-border-bottom">
427
+	<div class="container">
428
+		<h2>Legend</h2>
429
+		<div class="tsd-legend-group">
430
+			<ul class="tsd-legend">
431
+				<li class="tsd-kind-module"><span class="tsd-kind-icon">Module</span></li>
432
+				<li class="tsd-kind-object-literal"><span class="tsd-kind-icon">Object literal</span></li>
433
+				<li class="tsd-kind-variable"><span class="tsd-kind-icon">Variable</span></li>
434
+				<li class="tsd-kind-function"><span class="tsd-kind-icon">Function</span></li>
435
+				<li class="tsd-kind-function tsd-has-type-parameter"><span class="tsd-kind-icon">Function with type parameter</span></li>
436
+				<li class="tsd-kind-index-signature"><span class="tsd-kind-icon">Index signature</span></li>
437
+				<li class="tsd-kind-type-alias"><span class="tsd-kind-icon">Type alias</span></li>
438
+			</ul>
439
+			<ul class="tsd-legend">
440
+				<li class="tsd-kind-enum"><span class="tsd-kind-icon">Enumeration</span></li>
441
+				<li class="tsd-kind-enum-member"><span class="tsd-kind-icon">Enumeration member</span></li>
442
+				<li class="tsd-kind-property tsd-parent-kind-enum"><span class="tsd-kind-icon">Property</span></li>
443
+				<li class="tsd-kind-method tsd-parent-kind-enum"><span class="tsd-kind-icon">Method</span></li>
444
+			</ul>
445
+			<ul class="tsd-legend">
446
+				<li class="tsd-kind-interface"><span class="tsd-kind-icon">Interface</span></li>
447
+				<li class="tsd-kind-interface tsd-has-type-parameter"><span class="tsd-kind-icon">Interface with type parameter</span></li>
448
+				<li class="tsd-kind-constructor tsd-parent-kind-interface"><span class="tsd-kind-icon">Constructor</span></li>
449
+				<li class="tsd-kind-property tsd-parent-kind-interface"><span class="tsd-kind-icon">Property</span></li>
450
+				<li class="tsd-kind-method tsd-parent-kind-interface"><span class="tsd-kind-icon">Method</span></li>
451
+				<li class="tsd-kind-index-signature tsd-parent-kind-interface"><span class="tsd-kind-icon">Index signature</span></li>
452
+			</ul>
453
+			<ul class="tsd-legend">
454
+				<li class="tsd-kind-class"><span class="tsd-kind-icon">Class</span></li>
455
+				<li class="tsd-kind-class tsd-has-type-parameter"><span class="tsd-kind-icon">Class with type parameter</span></li>
456
+				<li class="tsd-kind-constructor tsd-parent-kind-class"><span class="tsd-kind-icon">Constructor</span></li>
457
+				<li class="tsd-kind-property tsd-parent-kind-class"><span class="tsd-kind-icon">Property</span></li>
458
+				<li class="tsd-kind-method tsd-parent-kind-class"><span class="tsd-kind-icon">Method</span></li>
459
+				<li class="tsd-kind-accessor tsd-parent-kind-class"><span class="tsd-kind-icon">Accessor</span></li>
460
+				<li class="tsd-kind-index-signature tsd-parent-kind-class"><span class="tsd-kind-icon">Index signature</span></li>
461
+			</ul>
462
+			<ul class="tsd-legend">
463
+				<li class="tsd-kind-constructor tsd-parent-kind-class tsd-is-inherited"><span class="tsd-kind-icon">Inherited constructor</span></li>
464
+				<li class="tsd-kind-property tsd-parent-kind-class tsd-is-inherited"><span class="tsd-kind-icon">Inherited property</span></li>
465
+				<li class="tsd-kind-method tsd-parent-kind-class tsd-is-inherited"><span class="tsd-kind-icon">Inherited method</span></li>
466
+				<li class="tsd-kind-accessor tsd-parent-kind-class tsd-is-inherited"><span class="tsd-kind-icon">Inherited accessor</span></li>
467
+			</ul>
468
+			<ul class="tsd-legend">
469
+				<li class="tsd-kind-property tsd-parent-kind-class tsd-is-protected"><span class="tsd-kind-icon">Protected property</span></li>
470
+				<li class="tsd-kind-method tsd-parent-kind-class tsd-is-protected"><span class="tsd-kind-icon">Protected method</span></li>
471
+				<li class="tsd-kind-accessor tsd-parent-kind-class tsd-is-protected"><span class="tsd-kind-icon">Protected accessor</span></li>
472
+			</ul>
473
+			<ul class="tsd-legend">
474
+				<li class="tsd-kind-property tsd-parent-kind-class tsd-is-private"><span class="tsd-kind-icon">Private property</span></li>
475
+				<li class="tsd-kind-method tsd-parent-kind-class tsd-is-private"><span class="tsd-kind-icon">Private method</span></li>
476
+				<li class="tsd-kind-accessor tsd-parent-kind-class tsd-is-private"><span class="tsd-kind-icon">Private accessor</span></li>
477
+			</ul>
478
+			<ul class="tsd-legend">
479
+				<li class="tsd-kind-property tsd-parent-kind-class tsd-is-static"><span class="tsd-kind-icon">Static property</span></li>
480
+				<li class="tsd-kind-call-signature tsd-parent-kind-class tsd-is-static"><span class="tsd-kind-icon">Static method</span></li>
481
+			</ul>
482
+		</div>
483
+	</div>
484
+</footer>
485
+<div class="container tsd-generator">
486
+	<p>Generated using <a href="http://typedoc.org/" target="_blank">TypeDoc</a></p>
487
+</div>
488
+<div class="overlay"></div>
489
+<script src="assets/js/main.js"></script>
490
+<script>if (location.protocol == 'file:') document.write('<script src="assets/js/search.js"><' + '/script>');</script>
491
+</body>
492
+</html>

+ 4
- 0
ios/RCTAgora/AgoraConst.h View File

73
 static NSString *AGMediaEngineLoaded = @"mediaEngineLoaded";
73
 static NSString *AGMediaEngineLoaded = @"mediaEngineLoaded";
74
 static NSString *AGMediaEngineStartCall = @"mediaEngineStartCall";
74
 static NSString *AGMediaEngineStartCall = @"mediaEngineStartCall";
75
 
75
 
76
+static NSString *AGIntervalTest = @"startEchoTestWithInterval";
77
+static NSString *AGAudioMixingStateChanged = @"audioMixingStateChanged";
78
+static NSString *AGLastmileProbeTestResult = @"lastmileProbeTestResult";
79
+
76
 typedef NS_ENUM(NSInteger, AgoraModeType) {
80
 typedef NS_ENUM(NSInteger, AgoraModeType) {
77
   AgoraAudioMode,
81
   AgoraAudioMode,
78
   AgoraVideoMode
82
   AgoraVideoMode

+ 346
- 72
ios/RCTAgora/RCTAgora.m View File

177
      [self.rtcEngine enableAudio];
177
      [self.rtcEngine enableAudio];
178
    }
178
    }
179
   
179
   
180
+  if ([options objectForKey:@"beauty"]) {
181
+    AgoraBeautyOptions *beautyOption = [[AgoraBeautyOptions alloc] init];
182
+    beautyOption.lighteningContrastLevel = [options[@"beauty"][@"lighteningContrastLevel"] integerValue];
183
+    beautyOption.lighteningLevel = [options[@"beauty"][@"lighteningLevel"] floatValue];
184
+    beautyOption.smoothnessLevel = [options[@"beauty"][@"smoothnessLevel"] floatValue];
185
+    beautyOption.rednessLevel = [options[@"beauty"][@"rednessLevel"] floatValue];
186
+      [self.rtcEngine setBeautyEffectOptions:true options:beautyOption];
187
+  }
188
+  if ([options objectForKey:@"voice"]) {
189
+    NSInteger voiceValue = [options[@"voice"][@"value"] integerValue];
190
+    NSString *voiceType = options[@"voice"][@"type"];
191
+    if ([voiceType isEqualToString: @"changer"]) {
192
+      [self.rtcEngine setLocalVoiceChanger:(AgoraAudioVoiceChanger)voiceValue];
193
+    }
194
+    if ([voiceType isEqualToString: @"reverbPreset"]) {
195
+      [self.rtcEngine setLocalVoiceReverbPreset:(AgoraAudioReverbPreset)voiceValue];
196
+    }
197
+  }
180
    if (options[@"secret"] != nil) {
198
    if (options[@"secret"] != nil) {
181
      [self.rtcEngine setEncryptionSecret:[options[@"secret"] stringValue]];
199
      [self.rtcEngine setEncryptionSecret:[options[@"secret"] stringValue]];
182
      if (options[@"secretMode"] != nil) {
200
      if (options[@"secretMode"] != nil) {
184
      }
202
      }
185
    }
203
    }
186
      
204
      
187
-   AgoraVideoEncoderConfiguration *video_encoder_config = [[AgoraVideoEncoderConfiguration new] initWithWidth:[options[@"videoEncoderConfig"][@"width"] integerValue] height:[options[@"videoEncoderConfig"][@"height"] integerValue] frameRate:(AgoraVideoFrameRate)[options[@"videoEncoderConfig"][@"frameRate"] integerValue] bitrate:[options[@"videoEncoderConfig"][@"bitrate"] integerValue] orientationMode: (AgoraVideoOutputOrientationMode)[options[@"videoEncoderConfig"][@"orientationMode"] integerValue]];
205
+   AgoraVideoEncoderConfiguration *video_encoder_config = [[AgoraVideoEncoderConfiguration new] initWithWidth:[options[@"videoEncoderConfig"][@"width"] integerValue] height:[options[@"videoEncoderConfig"][@"height"] integerValue] frameRate:[options[@"videoEncoderConfig"][@"frameRate"] integerValue] bitrate:[options[@"videoEncoderConfig"][@"bitrate"] integerValue] orientationMode: (AgoraVideoOutputOrientationMode)[options[@"videoEncoderConfig"][@"orientationMode"] integerValue]];
188
    [self.rtcEngine setVideoEncoderConfiguration:video_encoder_config];
206
    [self.rtcEngine setVideoEncoderConfiguration:video_encoder_config];
189
    [self.rtcEngine setClientRole:(AgoraClientRole)[options[@"clientRole"] integerValue]];
207
    [self.rtcEngine setClientRole:(AgoraClientRole)[options[@"clientRole"] integerValue]];
190
    [self.rtcEngine setAudioProfile:(AgoraAudioProfile)[options[@"audioProfile"] integerValue]
208
    [self.rtcEngine setAudioProfile:(AgoraAudioProfile)[options[@"audioProfile"] integerValue]
431
   [self.rtcEngine enableAudioVolumeIndication:interval smooth:smooth];
449
   [self.rtcEngine enableAudioVolumeIndication:interval smooth:smooth];
432
 }
450
 }
433
 
451
 
434
-// create data stream
435
-RCT_EXPORT_METHOD(createDataStream
452
+RCT_EXPORT_METHOD(sendMessage
436
                   :(NSDictionary *)options
453
                   :(NSDictionary *)options
437
                   resolve:(RCTPromiseResolveBlock)resolve
454
                   resolve:(RCTPromiseResolveBlock)resolve
438
                   reject:(RCTPromiseRejectBlock)reject) {
455
                   reject:(RCTPromiseRejectBlock)reject) {
439
-  NSInteger streamId = 0;
440
-  if (options[@"streamId"] != nil) {
441
-    streamId = [options[@"streamId"] integerValue];
456
+  NSInteger uid = 0;
457
+  if (options[@"streamID"] != nil) {
458
+    uid = [options[@"streamID"] integerValue];
459
+  }
460
+  NSInteger streamID = [self.rtcEngine createDataStream:&uid reliable:[options[@"reliable"] boolValue] ordered:[options[@"ordered"] boolValue]];
461
+  if (streamID < 0) {
462
+    reject(@"131001", @"createDataStream failed", [self makeNSError:@{
463
+                                                                      @"code": @(131001),
464
+                                                                      @"message":@{
465
+                                                                        @"success": @(NO),
466
+                                                                        @"value":[NSNumber numberWithInteger:uid]
467
+                                                                        }
468
+                                                                    }]);
469
+  }
470
+  NSString *dataStr = options[@"data"];
471
+  NSData *data = [dataStr dataUsingEncoding:NSUTF8StringEncoding];
472
+  NSInteger res = [self.rtcEngine sendStreamMessage:uid data:data];
473
+  if (res == 0) {
474
+    resolve(@{@"success": @(YES), @"streamID": @(uid)});
475
+  } else {
476
+    reject(@"131001", @"sendStreamMessage failed", [self makeNSError:@{
477
+                                                                       @"code": @(131001),
478
+                                                                       @"message":@{
479
+                                                                         @"success": @(NO),
480
+                                                                         @"value":[NSNumber numberWithInteger:res]
481
+                                                                         }
482
+                                                                     }]);
442
   }
483
   }
443
-  [self.rtcEngine createDataStream:streamId reliable:[options[@"reliable"] boolValue] ordered:[options[@"ordered"] boolValue]];
444
-  resolve(@[[NSNumber numberWithInteger:streamId]]);
445
 }
484
 }
446
 
485
 
486
+
447
 // is speaker phone enabled
487
 // is speaker phone enabled
448
 RCT_EXPORT_METHOD(methodisSpeakerphoneEnabled:(RCTResponseSenderBlock)callback) {
488
 RCT_EXPORT_METHOD(methodisSpeakerphoneEnabled:(RCTResponseSenderBlock)callback) {
449
   callback(@[@{@"status": @([self.rtcEngine isSpeakerphoneEnabled])}]);
489
   callback(@[@{@"status": @([self.rtcEngine isSpeakerphoneEnabled])}]);
971
   [self.rtcEngine setAudioSessionOperationRestriction:restrictionType];
1011
   [self.rtcEngine setAudioSessionOperationRestriction:restrictionType];
972
 }
1012
 }
973
 
1013
 
1014
+// deprecated
974
 // gateway test start echo
1015
 // gateway test start echo
975
-RCT_EXPORT_METHOD(startEchoTest
976
-                  :(RCTPromiseResolveBlock)resolve
977
-                  reject:(RCTPromiseRejectBlock)reject) {
978
-  NSInteger res = [self.rtcEngine startEchoTest:^(NSString * _Nonnull channel, NSUInteger uid, NSInteger elapsed) {
979
-    _block(@{
980
-             @"channel": channel,
981
-             @"uid": @(uid),
982
-             @"elapsed": @(elapsed)
983
-             });
984
-  }];
985
-  if (res != 0) {
986
-    reject(@"131019", @"startEchoTest failed", [self makeNSError:@{
987
-                                                                   @"code": @(131019),
988
-                                                                   @"message":@{
989
-                                                                       @"success": @(NO),
990
-                                                                       @"value":@(res)
991
-                                                                       }
992
-                                                                   }]);
993
-  } else {
994
-    resolve(@{
995
-              @"success": @(YES),
996
-              @"value": @(res)
997
-              });
998
-  }
999
-}
1016
+//RCT_EXPORT_METHOD(startEchoTest
1017
+//                  :(RCTPromiseResolveBlock)resolve
1018
+//                  reject:(RCTPromiseRejectBlock)reject) {
1019
+//  NSInteger res = [self.rtcEngine startEchoTest:^(NSString * _Nonnull channel, NSUInteger uid, NSInteger elapsed) {
1020
+//    _block(@{
1021
+//             @"channel": channel,
1022
+//             @"uid": @(uid),
1023
+//             @"elapsed": @(elapsed)
1024
+//             });
1025
+//  }];
1026
+//  if (res != 0) {
1027
+//    reject(@"131019", @"startEchoTest failed", [self makeNSError:@{
1028
+//                                                                   @"code": @(131019),
1029
+//                                                                   @"message":@{
1030
+//                                                                       @"success": @(NO),
1031
+//                                                                       @"value":@(res)
1032
+//                                                                       }
1033
+//                                                                   }]);
1034
+//  } else {
1035
+//    resolve(@{
1036
+//              @"success": @(YES),
1037
+//              @"value": @(res)
1038
+//              });
1039
+//  }
1040
+//}
1000
 
1041
 
1001
 // gateway test stop echo
1042
 // gateway test stop echo
1002
 RCT_EXPORT_METHOD(stopEchoTest
1043
 RCT_EXPORT_METHOD(stopEchoTest
1346
   }
1387
   }
1347
 }
1388
 }
1348
 
1389
 
1390
+// deprecated
1349
 // set video quality
1391
 // set video quality
1350
-RCT_EXPORT_METHOD(setVideoQualityParameters
1351
-                  :(BOOL) quality
1352
-                  resolve:(RCTPromiseResolveBlock)resolve
1353
-                  reject:(RCTPromiseRejectBlock)reject) {
1354
-  NSInteger res = [self.rtcEngine setVideoQualityParameters:quality];
1355
-  if (res == 0) {
1356
-    resolve(@{@"success": @(YES)});
1357
-  } else {
1358
-    reject(@"131033", @"setVideoQualityParameters failed", [self makeNSError:@{
1359
-                                                                               @"code": @(131033),
1360
-                                                                               @"message":@{
1361
-                                                                                   @"success": @(NO),
1362
-                                                                                   @"value":[NSNumber numberWithInteger:res]
1363
-                                                                                   }
1364
-                                                                               }]);
1365
-  }
1366
-}
1392
+//RCT_EXPORT_METHOD(setVideoQualityParameters
1393
+//                  :(BOOL) quality
1394
+//                  resolve:(RCTPromiseResolveBlock)resolve
1395
+//                  reject:(RCTPromiseRejectBlock)reject) {
1396
+//  NSInteger res = [self.rtcEngine setVideoQualityParameters:quality];
1397
+//  if (res == 0) {
1398
+//    resolve(@{@"success": @(YES)});
1399
+//  } else {
1400
+//    reject(@"131033", @"setVideoQualityParameters failed", [self makeNSError:@{
1401
+//                                                                               @"code": @(131033),
1402
+//                                                                               @"message":@{
1403
+//                                                                                   @"success": @(NO),
1404
+//                                                                                   @"value":[NSNumber numberWithInteger:res]
1405
+//                                                                                   }
1406
+//                                                                               }]);
1407
+//  }
1408
+//}
1367
 
1409
 
1368
 // set local video mirror mode
1410
 // set local video mirror mode
1369
 RCT_EXPORT_METHOD(setLocalVideoMirrorMode
1411
 RCT_EXPORT_METHOD(setLocalVideoMirrorMode
1532
 // setLogFile and setLogFilter
1574
 // setLogFile and setLogFilter
1533
 RCT_EXPORT_METHOD(setLog
1575
 RCT_EXPORT_METHOD(setLog
1534
                   :(NSString *)filePath
1576
                   :(NSString *)filePath
1535
-                  level:(NSUInteger)level
1577
+                    level:(NSUInteger)level
1578
+                    size:(NSUInteger)size
1536
                   resolve:(RCTPromiseResolveBlock)resolve
1579
                   resolve:(RCTPromiseResolveBlock)resolve
1537
                   reject:(RCTPromiseRejectBlock)reject) {
1580
                   reject:(RCTPromiseRejectBlock)reject) {
1538
-  int res = [self.rtcEngine setLogFilter:level];
1581
+  int res = [self.rtcEngine setLogFileSize:size];
1582
+  if (res != 0) {
1583
+    reject(@"131036", @"setLogFileSize failed", [self makeNSError:@{
1584
+                                                                  @"code": @(131036),
1585
+                                                                  @"message":@{
1586
+                                                                      @"success": @(NO),
1587
+                                                                      @"value":[NSNumber numberWithInteger:res]
1588
+                                                                      }
1589
+                                                                  }]);
1590
+  } else {
1591
+    resolve(@{
1592
+              @"success": @(YES),
1593
+              @"value": @(res)
1594
+              });
1595
+  }
1596
+  
1597
+  res = [self.rtcEngine setLogFilter:level];
1539
   if (res != 0) {
1598
   if (res != 0) {
1540
     reject(@"131036", @"setLogFilter failed", [self makeNSError:@{
1599
     reject(@"131036", @"setLogFilter failed", [self makeNSError:@{
1541
                                                                   @"code": @(131036),
1600
                                                                   @"code": @(131036),
1567
   }
1626
   }
1568
 }
1627
 }
1569
 
1628
 
1570
-// set
1571
-
1572
-// send stream message
1573
-RCT_EXPORT_METHOD(sendStreamMessage:(NSInteger)streamId data:(NSData*)data
1574
-                  resolve:(RCTPromiseResolveBlock)resolve
1575
-                  reject:(RCTPromiseRejectBlock)reject) {
1576
-  NSInteger res = [self.rtcEngine sendStreamMessage:(streamId) data:data];
1577
-  if (res == 0) {
1578
-    resolve(@{@"success": @(YES)});
1579
-  } else {
1580
-    reject(@"131001", @"sendStreamMessage failed", [self makeNSError:@{
1581
-                                                                       @"code": @(131001),
1582
-                                                                       @"message":@{
1583
-                                                                           @"success": @(NO),
1584
-                                                                           @"value":[NSNumber numberWithInteger:res]
1585
-                                                                           }
1586
-                                                                       }]);
1587
-  }
1588
-}
1589
-
1590
 // get sdk version
1629
 // get sdk version
1591
 RCT_EXPORT_METHOD(getSdkVersion
1630
 RCT_EXPORT_METHOD(getSdkVersion
1592
                   :(RCTPromiseResolveBlock) resolve
1631
                   :(RCTPromiseResolveBlock) resolve
1675
   [self.rtcEngine setLiveTranscoding:transcoding];
1714
   [self.rtcEngine setLiveTranscoding:transcoding];
1676
 }
1715
 }
1677
 
1716
 
1717
+RCT_EXPORT_METHOD(setBeautyEffectOptions:(bool) enabled
1718
+                  options:(NSDictionary *)options
1719
+                  resolve:(RCTPromiseResolveBlock)resolve
1720
+                  reject:(RCTPromiseRejectBlock)reject) {
1721
+  int res = [self.rtcEngine setBeautyEffectOptions:enabled options:options];
1722
+  if (res != 0) {
1723
+    reject(@"131037", @"setBeautyEffectOptions failed", [self makeNSError:@{
1724
+                                                                @"code": @(131037),
1725
+                                                                @"message":@{
1726
+                                                                    @"success": @(NO),
1727
+                                                                    @"value":[NSNumber numberWithInteger:res]
1728
+                                                                    }
1729
+                                                                }]);
1730
+  } else {
1731
+    resolve(@{
1732
+              @"success": @(YES),
1733
+              @"value": @(res)
1734
+              });
1735
+  }
1736
+}
1737
+
1738
+RCT_EXPORT_METHOD(setLocalVoiceChanger:(NSInteger) voiceChanger
1739
+                  resolve:(RCTPromiseResolveBlock)resolve
1740
+                  reject:(RCTPromiseRejectBlock)reject) {
1741
+  int res = [self.rtcEngine setLocalVoiceChanger:(AgoraAudioVoiceChanger)voiceChanger];
1742
+  if (res != 0) {
1743
+    reject(@"131037", @"setBeautyEffectOptions failed", [self makeNSError:@{
1744
+                                                                            @"code": @(131037),
1745
+                                                                            @"message":@{
1746
+                                                                                @"success": @(NO),
1747
+                                                                                @"value":[NSNumber numberWithInteger:res]
1748
+                                                                                }
1749
+                                                                            }]);
1750
+  } else {
1751
+    resolve(@{
1752
+              @"success": @(YES),
1753
+              @"value": @(res)
1754
+              });
1755
+  }
1756
+}
1757
+
1758
+RCT_EXPORT_METHOD(setLocalVoiceReverbPreset:(NSInteger) reverbPreset
1759
+                  resolve:(RCTPromiseResolveBlock)resolve
1760
+                  reject:(RCTPromiseRejectBlock)reject) {
1761
+  int res = [self.rtcEngine setLocalVoiceReverbPreset:(AgoraAudioReverbPreset)reverbPreset];
1762
+  if (res != 0) {
1763
+    reject(@"131037", @"setLocalVoiceReverbPreset failed", [self makeNSError:@{
1764
+                                                                            @"code": @(131037),
1765
+                                                                            @"message":@{
1766
+                                                                                @"success": @(NO),
1767
+                                                                                @"value":[NSNumber numberWithInteger:res]
1768
+                                                                                }
1769
+                                                                            }]);
1770
+  } else {
1771
+    resolve(@{
1772
+              @"success": @(YES),
1773
+              @"value": @(res)
1774
+              });
1775
+  }
1776
+}
1777
+
1778
+RCT_EXPORT_METHOD(enableSoundPositionIndication:(bool) enabled
1779
+                  resolve:(RCTPromiseResolveBlock)resolve
1780
+                  reject:(RCTPromiseRejectBlock)reject) {
1781
+  int res = [self.rtcEngine enableSoundPositionIndication:enabled];
1782
+  if (res != 0) {
1783
+    reject(@"131037", @"enableSoundPositionIndication failed", [self makeNSError:@{
1784
+                                                                               @"code": @(131037),
1785
+                                                                               @"message":@{
1786
+                                                                                   @"success": @(NO),
1787
+                                                                                   @"value":[NSNumber numberWithInteger:res]
1788
+                                                                                   }
1789
+                                                                               }]);
1790
+  } else {
1791
+    resolve(@{
1792
+              @"success": @(YES),
1793
+              @"value": @(res)
1794
+              });
1795
+  }
1796
+}
1797
+
1798
+RCT_EXPORT_METHOD(setRemoteVoicePosition:(NSInteger) uid
1799
+                  pan:(float)pan
1800
+                  gain:(float)gain
1801
+                  resolve:(RCTPromiseResolveBlock)resolve
1802
+                  reject:(RCTPromiseRejectBlock)reject) {
1803
+  int res = [self.rtcEngine setRemoteVoicePosition:uid pan:pan gain: gain];
1804
+  if (res != 0) {
1805
+    reject(@"131037", @"setRemoteVoicePosition failed", [self makeNSError:@{
1806
+                                                                                   @"code": @(131037),
1807
+                                                                                   @"message":@{
1808
+                                                                                       @"success": @(NO),
1809
+                                                                                       @"value":[NSNumber numberWithInteger:res]
1810
+                                                                                       }
1811
+                                                                                   }]);
1812
+  } else {
1813
+    resolve(@{
1814
+              @"success": @(YES),
1815
+              @"value": @(res)
1816
+              });
1817
+  }
1818
+}
1819
+
1820
+RCT_EXPORT_METHOD(startLastmileProbeTest:(NSDictionary*)config
1821
+                  resolve:(RCTPromiseResolveBlock)resolve
1822
+                  reject:(RCTPromiseRejectBlock)reject) {
1823
+  AgoraLastmileProbeConfig* probeConfig = [[AgoraLastmileProbeConfig alloc] init];
1824
+  probeConfig.probeUplink = [config[@"probeUplink"] boolValue];
1825
+  probeConfig.probeDownlink = [config[@"probeDownlink"] boolValue];
1826
+  probeConfig.expectedUplinkBitrate = [config[@"expectedUplinkBitrate"] integerValue];
1827
+  probeConfig.expectedDownlinkBitrate = [config[@"expectedDownlinkBitrate"] integerValue];
1828
+
1829
+  int res = [self.rtcEngine startLastmileProbeTest:probeConfig];
1830
+  if (res != 0) {
1831
+    reject(@"131037", @"startLastmileProbeTest failed", [self makeNSError:@{
1832
+                                                                            @"code": @(131037),
1833
+                                                                            @"message":@{
1834
+                                                                                @"success": @(NO),
1835
+                                                                                @"value":[NSNumber numberWithInteger:res]
1836
+                                                                                }
1837
+                                                                            }]);
1838
+  } else {
1839
+    resolve(@{
1840
+              @"success": @(YES),
1841
+              @"value": @(res)
1842
+              });
1843
+  }
1844
+}
1845
+
1846
+
1847
+RCT_EXPORT_METHOD(setRemoteUserPriority:(NSUInteger)uid
1848
+                  userPriority:(NSInteger)userPriority
1849
+                  resolve:(RCTPromiseResolveBlock)resolve
1850
+                  reject:(RCTPromiseRejectBlock)reject) {
1851
+ 
1852
+  int res = [self.rtcEngine setRemoteUserPriority:uid type:(AgoraUserPriority)userPriority];
1853
+  if (res != 0) {
1854
+    reject(@"131037", @"setRemoteUserPriority failed", [self makeNSError:@{
1855
+                                                                            @"code": @(131037),
1856
+                                                                            @"message":@{
1857
+                                                                                @"success": @(NO),
1858
+                                                                                @"value":[NSNumber numberWithInteger:res]
1859
+                                                                                }
1860
+                                                                            }]);
1861
+  } else {
1862
+    resolve(@{
1863
+              @"success": @(YES),
1864
+              @"value": @(res)
1865
+              });
1866
+  }
1867
+}
1868
+
1869
+RCT_EXPORT_METHOD(startEchoTestWithInterval:(NSInteger)interval
1870
+                  resolve:(RCTPromiseResolveBlock)resolve
1871
+                  reject:(RCTPromiseRejectBlock)reject) {
1872
+  
1873
+  int res = [self.rtcEngine startEchoTestWithInterval:interval successBlock:^(NSString * _Nonnull channel, NSUInteger uid, NSInteger elapsed) {
1874
+    [self sendEvent:AGIntervalTest params:@{
1875
+                                            @"message": @"StartEchoTestWithInterval",
1876
+                                            @"channel": channel,
1877
+                                            @"uid": @(uid),
1878
+                                            @"elapsed": @(elapsed),
1879
+                                            }];
1880
+  }];
1881
+  if (res != 0) {
1882
+    reject(@"131037", @"startEchoTestWithInterval failed", [self makeNSError:@{
1883
+                                                                           @"code": @(131037),
1884
+                                                                           @"message":@{
1885
+                                                                               @"success": @(NO),
1886
+                                                                               @"value":[NSNumber numberWithInteger:res]
1887
+                                                                               }
1888
+                                                                           }]);
1889
+  } else {
1890
+    resolve(@{
1891
+              @"success": @(YES),
1892
+              @"value": @(res)
1893
+              });
1894
+  }
1895
+}
1896
+
1897
+RCT_EXPORT_METHOD(setCameraCapturerConfiguration:(NSDictionary *)config
1898
+                  resolve:(RCTPromiseResolveBlock)resolve
1899
+                  reject:(RCTPromiseRejectBlock)reject) {
1900
+  
1901
+  AgoraCameraCapturerConfiguration* configuration = [[AgoraCameraCapturerConfiguration alloc] init];
1902
+  configuration.preference = [config[@"preference"] integerValue];
1903
+  
1904
+  int res = [self.rtcEngine setCameraCapturerConfiguration:configuration];
1905
+  if (res != 0) {
1906
+    reject(@"131037", @"setCameraCapturerConfiguration failed", [self makeNSError:@{
1907
+                                                                               @"code": @(131037),
1908
+                                                                               @"message":@{
1909
+                                                                                   @"success": @(NO),
1910
+                                                                                   @"value":[NSNumber numberWithInteger:res]
1911
+                                                                                   }
1912
+                                                                               }]);
1913
+  } else {
1914
+    resolve(@{
1915
+              @"success": @(YES),
1916
+              @"value": @(res)
1917
+              });
1918
+  }
1919
+}
1920
+
1678
 - (NSArray<NSString *> *)supportedEvents {
1921
 - (NSArray<NSString *> *)supportedEvents {
1679
   return @[
1922
   return @[
1680
            AGWarning,
1923
            AGWarning,
1739
            
1982
            
1740
            AGMediaEngineLoaded,
1983
            AGMediaEngineLoaded,
1741
            AGMediaEngineStartCall,
1984
            AGMediaEngineStartCall,
1985
+           AGIntervalTest,
1986
+           AGAudioMixingStateChanged,
1987
+           AGLastmileProbeTestResult
1742
            ];
1988
            ];
1743
 }
1989
 }
1744
 
1990
 
2178
                                                    }];
2424
                                                    }];
2179
 }
2425
 }
2180
 
2426
 
2427
+- (void)rtcEngine:(AgoraRtcEngineKit *_Nonnull)engine localAudioMixingStateDidChanged:(AgoraAudioMixingStateCode)state errorCode:(AgoraAudioMixingErrorCode)errorCode {
2428
+  [self sendEvent:AGAudioMixingStateChanged params:@{
2429
+                                                     @"message": @"AudioMixingStateChanged",
2430
+                                                     @"state": @(state),
2431
+                                                     @"errorCode": @(errorCode)
2432
+                                                     }];
2433
+}
2434
+
2435
+- (void)rtcEngine:(AgoraRtcEngineKit *_Nonnull)engine lastmileProbeTestResult:(AgoraLastmileProbeResult *_Nonnull)result {
2436
+  [self sendEvent:AGLastmileProbeTestResult params:@{
2437
+                                                     @"message":@"LastmileProbeTestResult",
2438
+                                                     @"result": @{
2439
+                                                         @"state": @(result.state),
2440
+                                                         @"rtt": @(result.rtt),
2441
+                                                         @"uplinkReport": @{
2442
+                                                             @"packetLossRate": @(result.uplinkReport.packetLossRate),
2443
+                                                             @"jitter": @(result.uplinkReport.jitter),
2444
+                                                             @"availableBandwidth": @(result.uplinkReport.availableBandwidth),
2445
+                                                             },
2446
+                                                         @"downlinkReport": @{
2447
+                                                             @"packetLossRate": @(result.downlinkReport.packetLossRate),
2448
+                                                             @"jitter": @(result.downlinkReport.jitter),
2449
+                                                             @"availableBandwidth": @(result.downlinkReport.availableBandwidth),
2450
+                                                             }
2451
+                                                         }
2452
+                                                     }];
2453
+}
2454
+
2181
 @end
2455
 @end

+ 159
- 12
lib/RtcEngine.native.js View File

659
         Agora.setAudioSessionOperationRestriction();
659
         Agora.setAudioSessionOperationRestriction();
660
     }
660
     }
661
     /**
661
     /**
662
+     * @deprecated
662
      * start echo test
663
      * start echo test
663
      *
664
      *
664
      * This method launches an audio call test to determine whether the audio devices (for example, headset and speaker) and the network connection are working properly.
665
      * This method launches an audio call test to determine whether the audio devices (for example, headset and speaker) and the network connection are working properly.
665
      * @returns Promise<{success, value}>
666
      * @returns Promise<{success, value}>
666
      */
667
      */
667
-    static startEchoTest() {
668
-        return Agora.startEchoTest();
669
-    }
668
+    // public static startEchoTest(): Promise<any> {
669
+    //     return Agora.startEchoTest();
670
+    // }
670
     /**
671
     /**
671
      * stop echo test
672
      * stop echo test
672
      *
673
      *
828
         return Agora.removeInjectStreamUrl(options);
829
         return Agora.removeInjectStreamUrl(options);
829
     }
830
     }
830
     /**
831
     /**
832
+     * @deprecated
831
      * set video quality
833
      * set video quality
832
      *
834
      *
833
      * This method sets the preferences for the video quality. (Live broadcast only).
835
      * This method sets the preferences for the video quality. (Live broadcast only).
835
      * @param quality boolean
837
      * @param quality boolean
836
      * @returns Promise<{success, value}>
838
      * @returns Promise<{success, value}>
837
      */
839
      */
838
-    static setVideoQualityParameters(quality) {
839
-        return Agora.setVideoQualityParameters(quality);
840
-    }
840
+    // public static setVideoQualityParameters(quality: boolean): Promise<any> {
841
+    //     return Agora.setVideoQualityParameters(quality);
842
+    // }
841
     /**
843
     /**
842
      * set local video mirror mode
844
      * set local video mirror mode
843
      *
845
      *
990
      *
992
      *
991
      * This method sets the log file generated path and specified the log level.
993
      * This method sets the log file generated path and specified the log level.
992
      *
994
      *
993
-     * @param filepath
994
-     * @param level
995
+     * @param filepath string
996
+     * @param level enum
997
+     * @param maxfileSize integer (KB)
995
      * @returns Promise<{success, value}>
998
      * @returns Promise<{success, value}>
996
      */
999
      */
997
-    static setLog(filepath, level) {
998
-        return Agora.setLog(filepath, level);
1000
+    static setLog(filepath, level, maxfileSize) {
1001
+        return Agora.setLog(filepath, level, maxfileSize);
999
     }
1002
     }
1000
     /**
1003
     /**
1001
      * send stream message
1004
      * send stream message
1006
      * @param data
1009
      * @param data
1007
      * @returns Promise<{success, value}>
1010
      * @returns Promise<{success, value}>
1008
      */
1011
      */
1009
-    static sendStreamMessage(uid, data) {
1010
-        return Agora.sendStreamMessage(uid, data);
1012
+    static sendMessage(streamID, data, reliable, ordered) {
1013
+        return Agora.sendMessage({ streamID, data, reliable, ordered });
1011
     }
1014
     }
1012
     /**
1015
     /**
1013
      * add publish stream url
1016
      * add publish stream url
1063
     static muteLocalAudioStream(enabled) {
1066
     static muteLocalAudioStream(enabled) {
1064
         Agora.muteLocalAudioStream(enabled);
1067
         Agora.muteLocalAudioStream(enabled);
1065
     }
1068
     }
1069
+    /**
1070
+     * video pre-process/post-process
1071
+     *
1072
+     * This method enables/disables image enhancement and sets the options.
1073
+     *
1074
+     * @param enable boolean
1075
+     * @param options {@link BeautyOptions}
1076
+     * @returns Promise<{success, value}>
1077
+     */
1078
+    static setBeautyEffectOptions(enabled, options) {
1079
+        return Agora.setBeautyEffectOptions(enabled, options);
1080
+    }
1081
+    /**
1082
+     * set local voice change
1083
+     *
1084
+     * This method changes local speaker voice with voiceChanger
1085
+     *
1086
+     * @param voiceChanger integer
1087
+     * @voiceChanger value ranges [
1088
+     *          0: "The original voice",
1089
+     *          1: "An old man’s voice",
1090
+     *          2: "A little boy’s voice.",
1091
+     *          3: "A little girl’s voice.",
1092
+     *          4: "TBD",
1093
+     *          5: "Ethereal vocal effects.",
1094
+     *          6: "Hulk’s voice."
1095
+     *      ]
1096
+     * @returns Promise<{success, value}>
1097
+     */
1098
+    static setLocalVoiceChanger(voiceChanger) {
1099
+        return Agora.setLocalVoiceChanger(voiceChanger);
1100
+    }
1101
+    /**
1102
+     * set the preset local voice reverberation effect.
1103
+     *
1104
+     * This method sets the preset local voice reverberation effect.
1105
+     *
1106
+     * @param preset integer
1107
+     * @returns Promise<{success, value}>
1108
+     */
1109
+    static setLocalVoiceReverbPreset(preset) {
1110
+        return Agora.setLocalVoiceReverbPreset(preset);
1111
+    }
1112
+    /**
1113
+     * control stereo panning for remote users
1114
+     *
1115
+     * This method enables/disables stereo panning for remote users.
1116
+     *
1117
+     * @param enabled boolean
1118
+     * @returns Promise<{success, value}>
1119
+     */
1120
+    static enableSoundPositionIndication(enabled) {
1121
+        return Agora.enableSoundPositionIndication(enabled);
1122
+    }
1123
+    /**
1124
+     * set the sound position of a remote user
1125
+     *
1126
+     * This method sets the sound position of a remote user by uid
1127
+     *
1128
+     * @param uid number | The ID of the remote user
1129
+     * @param pan float | The sound position of the remote user. The value ranges from -1.0 to 1.0
1130
+     * @pan
1131
+     *  0.0: the remote sound comes from the front.
1132
+     *  -1.0: the remote sound comes from the left.
1133
+     *  1.0: the remote sound comes from the right.
1134
+     * @param gain float | Gain of the remote user. The value ranges from 0.0 to 100.0. The default value is 100.0 (the original gain of the remote user). The smaller the value, the less the gain.
1135
+     * @returns Promise<{success, value}>
1136
+     */
1137
+    static setRemoteVoicePosition(uid, pan, gain) {
1138
+        return Agora.setRemoteVoicePosition(uid, pan, gain);
1139
+    }
1140
+    /**
1141
+     * start the lastmile probe test
1142
+     *
1143
+     * This method start the last-mile network probe test before joining a channel to get the uplink and downlink last-mile network statistics, including the bandwidth, packet loss, jitter, and round-trip time (RTT).
1144
+     *
1145
+     * @param config LastmileProbeConfig {@link LastmileProbeConfig}
1146
+     *
1147
+     * @event onLastmileQuality: the SDK triggers this callback within two seconds depending on the network conditions. This callback rates the network conditions with a score and is more closely linked to the user experience.
1148
+     * @event onLastmileProbeResult: the SDK triggers this callback within 30 seconds depending on the network conditions. This callback returns the real-time statistics of the network conditions and is more objective.
1149
+     * @returns Promise<{success, value}>
1150
+     */
1151
+    static startLastmileProbeTest(config) {
1152
+        return Agora.startLastmileProbeTest(config);
1153
+    }
1154
+    /**
1155
+     * stop the lastmile probe test
1156
+     *
1157
+     * This method stop the lastmile probe test.
1158
+     *
1159
+     * @returns Promise<{success, value}>
1160
+     */
1161
+    static stopLastmileProbeTest() {
1162
+        return Agora.stopLastmileProbeTest();
1163
+    }
1164
+    /**
1165
+     * sets the priority of a remote user's media stream.
1166
+     *
1167
+     * note: Use this method with the setRemoteSubscribeFallbackOption method. If the fallback function is enabled for a subscribed stream, the SDK ensures the high-priority user gets the best possible stream quality.
1168
+     *
1169
+     * This method sets the priority of a remote user's media stream.
1170
+     * @param uid number
1171
+     * @param userPriority number | The value range is  [50 is "user's priority is hgih", 100 is "the default user's priority is normal"]
1172
+     *
1173
+     * @returns Promise<{success, value}>
1174
+     */
1175
+    static setRemoteUserPriority(uid, userPrority) {
1176
+        return Agora.setRemoteUserPriority(uid, userPrority);
1177
+    }
1178
+    /**
1179
+     * start an audio call test.
1180
+     *
1181
+     * note:
1182
+     *   Call this method before joining a channel.
1183
+     *   After calling this method, call the stopEchoTest method to end the test. Otherwise, the app cannot run the next echo test, or call the joinchannel method.
1184
+     *   In the Live-broadcast profile, only a host can call this method.
1185
+     * This method will start an audio call test with interval parameter.
1186
+     * In the audio call test, you record your voice. If the recording plays back within the set time interval, the audio devices and the network connection are working properly.
1187
+     *
1188
+     * @param interval number
1189
+     *
1190
+     * @returns Promise<{success, value}>
1191
+     */
1192
+    static startEchoTestWithInterval(interval) {
1193
+        return Agora.startEchoTestWithInterval(interval);
1194
+    }
1195
+    /**
1196
+     * set the camera capture preference.
1197
+     *
1198
+     * note:
1199
+     *  For a video call or live broadcast, generally the SDK controls the camera output parameters. When the default camera capture settings do not meet special requirements or cause performance problems, we recommend using this method to set the camera capture preference:
1200
+     *  If the resolution or frame rate of the captured raw video data are higher than those set by setVideoEncoderConfiguration, processing video frames requires extra CPU and RAM usage and degrades performance. We recommend setting config as CAPTURER_OUTPUT_PREFERENCE_PERFORMANCE(1) to avoid such problems.
1201
+     *  If you do not need local video preview or are willing to sacrifice preview quality, we recommend setting config as CAPTURER_OUTPUT_PREFERENCE_PERFORMANCE(1) to optimize CPU and RAM usage.
1202
+     *  If you want better quality for the local video preview, we recommend setting config as CAPTURER_OUTPUT_PREFERENCE_PREVIEW(2).
1203
+     *
1204
+     * This method will set the camera capture preference.
1205
+     *
1206
+     * @param config {@link CameraCapturerConfiguration}
1207
+     *
1208
+     * @returns Promise<{success, value}>
1209
+     */
1210
+    static setCameraCapturerConfiguration(config) {
1211
+        return Agora.setCameraCapturerConfiguration(config);
1212
+    }
1066
 }
1213
 }
1067
 RtcEngine.eventTypes = new Set();
1214
 RtcEngine.eventTypes = new Set();
1068
 exports.default = RtcEngine;
1215
 exports.default = RtcEngine;

+ 1
- 1
lib/RtcEngine.native.js.map
File diff suppressed because it is too large
View File


+ 2
- 2
package.json View File

1
 {
1
 {
2
   "name": "react-native-agora",
2
   "name": "react-native-agora",
3
-  "version": "2.3.3-alpha.7",
3
+  "version": "2.4.0-alpha-1",
4
   "description": "React Native around the Agora RTC SDKs for Android and iOS agora",
4
   "description": "React Native around the Agora RTC SDKs for Android and iOS agora",
5
   "summary": "agora native sdk for react-native",
5
   "summary": "agora native sdk for react-native",
6
   "main": "lib/index.js",
6
   "main": "lib/index.js",
9
     "test": "echo \"Error: no test specified\" && exit 1",
9
     "test": "echo \"Error: no test specified\" && exit 1",
10
     "lint": "tslint",
10
     "lint": "tslint",
11
     "build": "tsc",
11
     "build": "tsc",
12
-    "doc": "typedoc --out docs/api ./src"
12
+    "doc": "typedoc --out docs/api/v2.4 ./src"
13
   },
13
   },
14
   "repository": {
14
   "repository": {
15
     "type": "git",
15
     "type": "git",

+ 1
- 1
react-native-agora.podspec View File

93
       "$(SDKROOT)../../ios/Pods"
93
       "$(SDKROOT)../../ios/Pods"
94
     ]
94
     ]
95
   }
95
   }
96
-  s.dependency "AgoraRtcEngine_iOS", "2.3.3"
96
+  s.dependency "AgoraRtcEngine_iOS", "2.4.0.1"
97
   s.dependency 'React'
97
   s.dependency 'React'
98
 
98
 
99
 end
99
 end

+ 173
- 13
src/RtcEngine.native.ts View File

21
     PublishStreamOption,
21
     PublishStreamOption,
22
     RemovePublishStreamOption,
22
     RemovePublishStreamOption,
23
     LiveTranscodingOption,
23
     LiveTranscodingOption,
24
-    PositionOption
24
+    PositionOption,
25
+    BeautyOption,
26
+    LastmileProbeConfig,
27
+    CameraCapturerConfiguration
25
 } from "./types.d";
28
 } from "./types.d";
26
 
29
 
27
 
30
 
757
      }
760
      }
758
 
761
 
759
     /**
762
     /**
763
+     * @deprecated
760
      * start echo test
764
      * start echo test
761
      * 
765
      * 
762
      * This method launches an audio call test to determine whether the audio devices (for example, headset and speaker) and the network connection are working properly.
766
      * This method launches an audio call test to determine whether the audio devices (for example, headset and speaker) and the network connection are working properly.
763
      * @returns Promise<{success, value}>
767
      * @returns Promise<{success, value}>
764
      */
768
      */
765
-    public static startEchoTest(): Promise<any> {
766
-        return Agora.startEchoTest();
767
-    }
769
+    // public static startEchoTest(): Promise<any> {
770
+    //     return Agora.startEchoTest();
771
+    // }
768
 
772
 
769
     /**
773
     /**
770
      * stop echo test
774
      * stop echo test
942
     }
946
     }
943
 
947
 
944
     /**
948
     /**
949
+     * @deprecated
945
      * set video quality 
950
      * set video quality 
946
      * 
951
      * 
947
      * This method sets the preferences for the video quality. (Live broadcast only).
952
      * This method sets the preferences for the video quality. (Live broadcast only).
949
      * @param quality boolean
954
      * @param quality boolean
950
      * @returns Promise<{success, value}> 
955
      * @returns Promise<{success, value}> 
951
      */
956
      */
952
-    public static setVideoQualityParameters(quality: boolean): Promise<any> {
953
-        return Agora.setVideoQualityParameters(quality);
954
-    }
957
+    // public static setVideoQualityParameters(quality: boolean): Promise<any> {
958
+    //     return Agora.setVideoQualityParameters(quality);
959
+    // }
955
 
960
 
956
     /**
961
     /**
957
      * set local video mirror mode
962
      * set local video mirror mode
1119
      * 
1124
      * 
1120
      * This method sets the log file generated path and specified the log level.
1125
      * This method sets the log file generated path and specified the log level.
1121
      *
1126
      *
1122
-     * @param filepath
1123
-     * @param level
1127
+     * @param filepath string
1128
+     * @param level enum
1129
+     * @param maxfileSize integer (KB)
1124
      * @returns Promise<{success, value}>
1130
      * @returns Promise<{success, value}>
1125
      */
1131
      */
1126
-    public static setLog(filepath: string, level: number): Promise<any> {
1127
-        return Agora.setLog(filepath, level)
1132
+    public static setLog(filepath: string, level: number, maxfileSize: number): Promise<any> {
1133
+        return Agora.setLog(filepath, level, maxfileSize)
1128
     }
1134
     }
1129
     
1135
     
1130
     /**
1136
     /**
1136
      * @param data 
1142
      * @param data 
1137
      * @returns Promise<{success, value}>
1143
      * @returns Promise<{success, value}>
1138
      */
1144
      */
1139
-    public static sendStreamMessage(uid: number, data: any): Promise<any> {
1140
-        return Agora.sendStreamMessage(uid, data);
1145
+    public static sendMessage(streamID: number, data: any, reliable: boolean, ordered: boolean): Promise<any> {
1146
+        return Agora.sendMessage({streamID, data, reliable, ordered});
1141
     }
1147
     }
1142
 
1148
 
1143
     /**
1149
     /**
1199
      public static muteLocalAudioStream(enabled: boolean) {
1205
      public static muteLocalAudioStream(enabled: boolean) {
1200
         Agora.muteLocalAudioStream(enabled);
1206
         Agora.muteLocalAudioStream(enabled);
1201
      }
1207
      }
1208
+
1209
+    /**
1210
+     * video pre-process/post-process
1211
+     * 
1212
+     * This method enables/disables image enhancement and sets the options.
1213
+     * 
1214
+     * @param enable boolean
1215
+     * @param options {@link BeautyOptions}
1216
+     * @returns Promise<{success, value}>
1217
+     */
1218
+    static setBeautyEffectOptions(enabled: boolean, options: BeautyOption): Promise<any> {
1219
+        return Agora.setBeautyEffectOptions(enabled, options);
1220
+    }
1221
+
1222
+    /**
1223
+     * set local voice change
1224
+     * 
1225
+     * This method changes local speaker voice with voiceChanger
1226
+     * 
1227
+     * @param voiceChanger integer
1228
+     * @voiceChanger value ranges [
1229
+     *          0: "The original voice",
1230
+     *          1: "An old man’s voice",
1231
+     *          2: "A little boy’s voice.",
1232
+     *          3: "A little girl’s voice.",
1233
+     *          4: "TBD",
1234
+     *          5: "Ethereal vocal effects.",
1235
+     *          6: "Hulk’s voice."
1236
+     *      ]
1237
+     * @returns Promise<{success, value}>
1238
+     */
1239
+    static setLocalVoiceChanger(voiceChanger: number): Promise<any> {
1240
+        return Agora.setLocalVoiceChanger(voiceChanger);
1241
+    }
1242
+
1243
+    /**
1244
+     * set the preset local voice reverberation effect.
1245
+     * 
1246
+     * This method sets the preset local voice reverberation effect.
1247
+     * 
1248
+     * @param preset integer
1249
+     * @returns Promise<{success, value}>
1250
+     */
1251
+    static setLocalVoiceReverbPreset(preset: number): Promise<any> {
1252
+        return Agora.setLocalVoiceReverbPreset(preset);
1253
+    }
1254
+
1255
+    /**
1256
+     * control stereo panning for remote users
1257
+     * 
1258
+     * This method enables/disables stereo panning for remote users.
1259
+     * 
1260
+     * @param enabled boolean
1261
+     * @returns Promise<{success, value}>
1262
+     */
1263
+    static enableSoundPositionIndication(enabled: boolean): Promise<any> {
1264
+        return Agora.enableSoundPositionIndication(enabled);
1265
+    }
1266
+
1267
+    /**
1268
+     * set the sound position of a remote user
1269
+     * 
1270
+     * This method sets the sound position of a remote user by uid
1271
+     * 
1272
+     * @param uid number | The ID of the remote user
1273
+     * @param pan float | The sound position of the remote user. The value ranges from -1.0 to 1.0
1274
+     * @pan 
1275
+     *  0.0: the remote sound comes from the front.
1276
+     *  -1.0: the remote sound comes from the left.
1277
+     *  1.0: the remote sound comes from the right.
1278
+     * @param gain float | Gain of the remote user. The value ranges from 0.0 to 100.0. The default value is 100.0 (the original gain of the remote user). The smaller the value, the less the gain.
1279
+     * @returns Promise<{success, value}>
1280
+     */
1281
+    static setRemoteVoicePosition(uid: number, pan: number, gain: number): Promise<any> {
1282
+        return Agora.setRemoteVoicePosition(uid, pan, gain)
1283
+    }
1284
+
1285
+    /**
1286
+     * start the lastmile probe test
1287
+     *
1288
+     * This method start the last-mile network probe test before joining a channel to get the uplink and downlink last-mile network statistics, including the bandwidth, packet loss, jitter, and round-trip time (RTT).
1289
+     * 
1290
+     * @param config LastmileProbeConfig {@link LastmileProbeConfig}
1291
+     * 
1292
+     * @event onLastmileQuality: the SDK triggers this callback within two seconds depending on the network conditions. This callback rates the network conditions with a score and is more closely linked to the user experience.
1293
+     * @event onLastmileProbeResult: the SDK triggers this callback within 30 seconds depending on the network conditions. This callback returns the real-time statistics of the network conditions and is more objective.
1294
+     * @returns Promise<{success, value}>
1295
+     */
1296
+    static startLastmileProbeTest(config: LastmileProbeConfig): Promise<any> {
1297
+        return Agora.startLastmileProbeTest(config);
1298
+    }
1299
+
1300
+    /**
1301
+     * stop the lastmile probe test
1302
+     *
1303
+     * This method stop the lastmile probe test.
1304
+     * 
1305
+     * @returns Promise<{success, value}>
1306
+     */
1307
+    static stopLastmileProbeTest(): Promise<any> {
1308
+        return Agora.stopLastmileProbeTest();
1309
+    }
1310
+
1311
+    /**
1312
+     * sets the priority of a remote user's media stream.
1313
+     * 
1314
+     * note: Use this method with the setRemoteSubscribeFallbackOption method. If the fallback function is enabled for a subscribed stream, the SDK ensures the high-priority user gets the best possible stream quality.
1315
+     * 
1316
+     * This method sets the priority of a remote user's media stream.
1317
+     * @param uid number
1318
+     * @param userPriority number | The value range is  [50 is "user's priority is hgih", 100 is "the default user's priority is normal"]
1319
+     * 
1320
+     * @returns Promise<{success, value}>
1321
+     */
1322
+    static setRemoteUserPriority(uid: number, userPrority: number): Promise<any> {
1323
+        return Agora.setRemoteUserPriority(uid, userPrority);
1324
+    }
1325
+
1326
+    /**
1327
+     * start an audio call test.
1328
+     * 
1329
+     * note:
1330
+     *   Call this method before joining a channel.
1331
+     *   After calling this method, call the stopEchoTest method to end the test. Otherwise, the app cannot run the next echo test, or call the joinchannel method.
1332
+     *   In the Live-broadcast profile, only a host can call this method.
1333
+     * This method will start an audio call test with interval parameter.
1334
+     * In the audio call test, you record your voice. If the recording plays back within the set time interval, the audio devices and the network connection are working properly.
1335
+     * 
1336
+     * @param interval number
1337
+     * 
1338
+     * @returns Promise<{success, value}>
1339
+     */
1340
+    static startEchoTestWithInterval(interval: number): Promise<any> {
1341
+        return Agora.startEchoTestWithInterval(interval)
1342
+    }
1343
+
1344
+    /**
1345
+     * set the camera capture preference.
1346
+     *
1347
+     * note:
1348
+     *  For a video call or live broadcast, generally the SDK controls the camera output parameters. When the default camera capture settings do not meet special requirements or cause performance problems, we recommend using this method to set the camera capture preference:
1349
+     *  If the resolution or frame rate of the captured raw video data are higher than those set by setVideoEncoderConfiguration, processing video frames requires extra CPU and RAM usage and degrades performance. We recommend setting config as CAPTURER_OUTPUT_PREFERENCE_PERFORMANCE(1) to avoid such problems.
1350
+     *  If you do not need local video preview or are willing to sacrifice preview quality, we recommend setting config as CAPTURER_OUTPUT_PREFERENCE_PERFORMANCE(1) to optimize CPU and RAM usage.
1351
+     *  If you want better quality for the local video preview, we recommend setting config as CAPTURER_OUTPUT_PREFERENCE_PREVIEW(2).
1352
+     * 
1353
+     * This method will set the camera capture preference.
1354
+     * 
1355
+     * @param config {@link CameraCapturerConfiguration}
1356
+     * 
1357
+     * @returns Promise<{success, value}>
1358
+     */
1359
+    static setCameraCapturerConfiguration(config: CameraCapturerConfiguration): Promise<any> {
1360
+        return Agora.setCameraCapturerConfiguration(config);
1361
+    }
1202
 }
1362
 }
1203
 
1363
 
1204
 
1364
 

+ 62
- 1
src/types.d.ts View File

2
 
2
 
3
 declare module "IAgora"
3
 declare module "IAgora"
4
 
4
 
5
+/**
6
+ * VideoEncoderConfig details
7
+ * @property width: number | The encoder video's width
8
+ * @property height: number | The encoder video's height
9
+ * @property bitrate: number | The encoder video's bitrate
10
+ * @property frameRate: number | The frameRate of encoder video
11
+ * @property orientationMode: number | The video orientation mode of the video
12
+ * @orientationMode value range is [0 is "mode adapative", 1 is "mode fixed landscape", 2 is "mode fixed portrait"]
13
+ */
5
 export interface VideoEncoderConfig {
14
 export interface VideoEncoderConfig {
6
   width: number,
15
   width: number,
7
   height: number,
16
   height: number,
29
   mode: number,
38
   mode: number,
30
   clientRole: number,
39
   clientRole: number,
31
   audioProfile: number,
40
   audioProfile: number,
32
-  audioScenario: number
41
+  audioScenario: number,
42
+  beauty?: BeautyOption,
43
+  voice?: VoiceDecorator,
44
+}
45
+
46
+/**
47
+ * VoiceDecorator is decorate local audio voice
48
+ * 
49
+ * @property type: string | the range values ['changer' | 'reverbPreset'] This property is the identifier for audio voice decorator 
50
+ * @property value: number | the value for voice parameter option.
51
+ * type 'reverbPreset' range values: [0 is "off", 1 is "popular", 2 is "rnb", 3 is "rock", 4 is "hiphop", 5 is "vocal concert", 6 is "KTV", 7 is "studio"]
52
+ * type 'changer' range values: [0 is "off", 1 is "old man", 2 is "baby boy", 3 is "baby girl", 4 is "zhubajie", 5 is "ethereal", 6 is "hulk"]
53
+ */
54
+export interface VoiceDecorator {
55
+  type: string,
56
+  value: number
33
 }
57
 }
34
 
58
 
35
 export interface PublisherConfig {
59
 export interface PublisherConfig {
206
 export interface PositionOption {
230
 export interface PositionOption {
207
   x: number,
231
   x: number,
208
   y: number
232
   y: number
233
+}
234
+
235
+/**
236
+ * BeautyOption is setBeautyEffectOptions's option parameter
237
+ * @property lighteningContrastLevel: integer | lightening contrast level and the value ranges is low: 0, normal: 1, high: 2
238
+ * @property lighteningLevel: float | brightness level and the value ranges between 0.0 (original) and 1.0.
239
+ * @property smoothnessLevel: float | The sharpness level. The value ranges between 0.0 (original) and 1.0. This parameter is usually used to remove blemishes.
240
+ * @property rednessLevel: float | The redness level. The value ranges between 0.0 (original) and 1.0. This parameter adjusts the red saturation level.
241
+ */
242
+export interface BeautyOption {
243
+  lighteningContrastLevel: number,
244
+  lighteningLevel: number,
245
+  smoothnessLevel: number,
246
+  rednessLevel: number,
247
+}
248
+
249
+/**
250
+ * LastmileProbeConfig is startLastmileProbeTest's config parameter
251
+ * @property probeUplink: boolean | sets whether or not to test the uplink networks. some users, for example, the audience in a Live-broadcast channel, do not need such a test. true: enables the probe test. false: disables the probe test.
252
+ * @property probeDownlink: boolean | sets whether or not to probe the downlink network. true: enables the probe test. false: disables the probe test.
253
+ * @property expectedUplinkBitrate: integer | The expected maximum sending bitrate (Kbps) of the local user. The value ranges between 100 and 5000. We recommend setting this parameter according to the bitrate value set by setVideoEncoderConfiguration.
254
+ * @property expectedDownlinkBitrate: integer | The expected maximum receiving bitrate (Kbps) of the local user. The value ranges between 100 and 5000.
255
+ */
256
+export interface LastmileProbeConfig {
257
+  probeUplink: boolean,
258
+  probeDownlink: boolean,
259
+  expectedUplinkBitrate: number,
260
+  expectedDownlinkBitrate: number
261
+}
262
+
263
+
264
+/**
265
+ * CameraCapturerConfiguration is setCameraCapturerConfiguration's config parameter
266
+ * @property preference: number | The Camera capture preference and the value range is [0 is "(default) self-adapts the camera output parameters to the system performance and network conditions to balance CPU consumption and video preview quality.", 1 is "prioritizes the system performance. The SDK chooses the dimension and frame rate of the local camera capture closest to those set by setVideoEncoderConfiguration.", 2 is "prioritizes the local preview quality. The SDK chooses higher camera output parameters to improve the local video preview quality. This option requires extra CPU and RAM usage for video pre-processing."]
267
+ */
268
+export interface CameraCapturerConfiguration {
269
+  preference: number
209
 }
270
 }