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,5 +1,9 @@
1 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 7
 #### 2.3.3-alpha
4 8
 - support agora video sdk 2.3.3
5 9
 - release 2.3.3-alpha.3

+ 3
- 1
README.md View File

@@ -53,7 +53,9 @@ Either way, then link with:
53 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 60
 #### Events
59 61
 

+ 2
- 2
android/build.gradle View File

@@ -50,7 +50,7 @@ android {
50 50
 
51 51
             reset()
52 52
 
53
-            include "armeabi-v7a", "arm64-v8a", "x86", "x86_64"
53
+            include "armeabi-v7a", "arm64-v8a", "x86"
54 54
             // Specify that we do not want an additional universal SDK
55 55
             universalApk false
56 56
         }
@@ -61,7 +61,7 @@ dependencies {
61 61
     def androidSupportVersion = rootProject.hasProperty("androidSupportVersion")  ? rootProject.androidSupportVersion : DEFAULT_ANDROID_SUPPORT_VERSION
62 62
     // from internet
63 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 65
     // from node_modules
66 66
     implementation "com.facebook.react:react-native:+"
67 67
 }

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

@@ -15,6 +15,7 @@ import java.util.Map;
15 15
 
16 16
 import io.agora.rtc.IRtcEngineEventHandler;
17 17
 import io.agora.rtc.RtcEngine;
18
+import io.agora.rtc.video.BeautyOptions;
18 19
 import io.agora.rtc.video.VideoCanvas;
19 20
 import io.agora.rtc.video.VideoEncoderConfiguration;
20 21
 
@@ -123,6 +124,28 @@ public class AgoraManager {
123 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 149
             if (options.hasKey("videoEncoderConfig") && null != options.getMap("videoEncoderConfig")) {
127 150
                 ReadableMap config = options.getMap("videoEncoderConfig");
128 151
                 VideoEncoderConfiguration encoderConfig = new VideoEncoderConfiguration(

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

@@ -25,9 +25,12 @@ import io.agora.rtc.Constants;
25 25
 import io.agora.rtc.IAudioEffectManager;
26 26
 import io.agora.rtc.IRtcEngineEventHandler;
27 27
 import io.agora.rtc.RtcEngine;
28
+import io.agora.rtc.internal.LastmileProbeConfig;
28 29
 import io.agora.rtc.live.LiveInjectStreamConfig;
29 30
 import io.agora.rtc.live.LiveTranscoding;
30 31
 import io.agora.rtc.video.AgoraImage;
32
+import io.agora.rtc.video.BeautyOptions;
33
+import io.agora.rtc.video.CameraCapturerConfiguration;
31 34
 import io.agora.rtc.video.VideoEncoderConfiguration;
32 35
 
33 36
 import static com.facebook.react.bridge.UiThreadUtil.runOnUiThread;
@@ -1451,9 +1454,11 @@ public class AgoraModule extends ReactContextBaseJavaModule {
1451 1454
     }
1452 1455
 
1453 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 1458
         try {
1456 1459
             int res = 0;
1460
+            res = AgoraManager.getInstance().mRtcEngine.setLogFileSize(size);
1461
+            if (res != 0) throw new ReactNativeAgoraException("setLogFileSize Failed", res);
1457 1462
             res = AgoraManager.getInstance().mRtcEngine.setLogFilter(level);
1458 1463
             if (res != 0) throw new ReactNativeAgoraException("setLogFilter Failed", res);
1459 1464
             res = AgoraManager.getInstance().mRtcEngine.setLogFile(filePath);
@@ -1794,20 +1799,21 @@ public class AgoraModule extends ReactContextBaseJavaModule {
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 1818
     @ReactMethod
1813 1819
     public void stopEchoTest(Promise promise) {
@@ -2458,12 +2464,18 @@ public class AgoraModule extends ReactContextBaseJavaModule {
2458 2464
     }
2459 2465
 
2460 2466
     @ReactMethod
2461
-    public void sendStreamMessage(int streamId, String data, Promise promise) {
2467
+    public void sendMessage(ReadableMap options, Promise promise) {
2462 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 2475
             if (res != 0) throw new ReactNativeAgoraException("sendStreamMessage Failed", res);
2465 2476
             WritableMap map = Arguments.createMap();
2466 2477
             map.putBoolean("success", true);
2478
+            map.putInt("streamID", streamID);
2467 2479
             promise.resolve(map);
2468 2480
         } catch (Exception e) {
2469 2481
             promise.reject(e);
@@ -2480,14 +2492,28 @@ public class AgoraModule extends ReactContextBaseJavaModule {
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 2510
     @ReactMethod
2484
-    public void setVideoQualityParameters(boolean quality, Promise promise) {
2511
+    public void setLocalVideoMirrorMode(int mode, Promise promise) {
2485 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 2515
             WritableMap map = Arguments.createMap();
2489 2516
             map.putBoolean("success", true);
2490
-            map.putInt("value", res);
2491 2517
             promise.resolve(map);
2492 2518
         } catch (Exception e) {
2493 2519
             promise.reject(e);
@@ -2495,10 +2521,67 @@ public class AgoraModule extends ReactContextBaseJavaModule {
2495 2521
     }
2496 2522
 
2497 2523
     @ReactMethod
2498
-    public void setLocalVideoMirrorMode(int mode, Promise promise) {
2524
+    public void setBeautyEffectOptions(boolean enabled, ReadableMap options, Promise promise) {
2499 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 2585
             WritableMap map = Arguments.createMap();
2503 2586
             map.putBoolean("success", true);
2504 2587
             promise.resolve(map);
@@ -2507,6 +2590,97 @@ public class AgoraModule extends ReactContextBaseJavaModule {
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 2684
     private void sendEvent(ReactContext reactContext,
2511 2685
                            String eventName,
2512 2686
                            @Nullable WritableMap params) {

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

@@ -0,0 +1,865 @@
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

@@ -0,0 +1,224 @@
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

@@ -0,0 +1,492 @@
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,6 +73,10 @@ static NSString *AGOccurStreamMessageError = @"occurStreamMessageError";
73 73
 static NSString *AGMediaEngineLoaded = @"mediaEngineLoaded";
74 74
 static NSString *AGMediaEngineStartCall = @"mediaEngineStartCall";
75 75
 
76
+static NSString *AGIntervalTest = @"startEchoTestWithInterval";
77
+static NSString *AGAudioMixingStateChanged = @"audioMixingStateChanged";
78
+static NSString *AGLastmileProbeTestResult = @"lastmileProbeTestResult";
79
+
76 80
 typedef NS_ENUM(NSInteger, AgoraModeType) {
77 81
   AgoraAudioMode,
78 82
   AgoraVideoMode

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

@@ -177,6 +177,24 @@ RCT_EXPORT_METHOD(init:(NSDictionary *)options) {
177 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 198
    if (options[@"secret"] != nil) {
181 199
      [self.rtcEngine setEncryptionSecret:[options[@"secret"] stringValue]];
182 200
      if (options[@"secretMode"] != nil) {
@@ -184,7 +202,7 @@ RCT_EXPORT_METHOD(init:(NSDictionary *)options) {
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 206
    [self.rtcEngine setVideoEncoderConfiguration:video_encoder_config];
189 207
    [self.rtcEngine setClientRole:(AgoraClientRole)[options[@"clientRole"] integerValue]];
190 208
    [self.rtcEngine setAudioProfile:(AgoraAudioProfile)[options[@"audioProfile"] integerValue]
@@ -431,19 +449,41 @@ RCT_EXPORT_METHOD(enableAudioVolumeIndication: (NSInteger) interval smooth:(NSIn
431 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 453
                   :(NSDictionary *)options
437 454
                   resolve:(RCTPromiseResolveBlock)resolve
438 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 487
 // is speaker phone enabled
448 488
 RCT_EXPORT_METHOD(methodisSpeakerphoneEnabled:(RCTResponseSenderBlock)callback) {
449 489
   callback(@[@{@"status": @([self.rtcEngine isSpeakerphoneEnabled])}]);
@@ -971,32 +1011,33 @@ RCT_EXPORT_METHOD(setAudioSessionOperationRestriction
971 1011
   [self.rtcEngine setAudioSessionOperationRestriction:restrictionType];
972 1012
 }
973 1013
 
1014
+// deprecated
974 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 1042
 // gateway test stop echo
1002 1043
 RCT_EXPORT_METHOD(stopEchoTest
@@ -1346,24 +1387,25 @@ RCT_EXPORT_METHOD(removeInjectStreamUrl
1346 1387
   }
1347 1388
 }
1348 1389
 
1390
+// deprecated
1349 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 1410
 // set local video mirror mode
1369 1411
 RCT_EXPORT_METHOD(setLocalVideoMirrorMode
@@ -1532,10 +1574,27 @@ RCT_EXPORT_METHOD(getCallId
1532 1574
 // setLogFile and setLogFilter
1533 1575
 RCT_EXPORT_METHOD(setLog
1534 1576
                   :(NSString *)filePath
1535
-                  level:(NSUInteger)level
1577
+                    level:(NSUInteger)level
1578
+                    size:(NSUInteger)size
1536 1579
                   resolve:(RCTPromiseResolveBlock)resolve
1537 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 1598
   if (res != 0) {
1540 1599
     reject(@"131036", @"setLogFilter failed", [self makeNSError:@{
1541 1600
                                                                   @"code": @(131036),
@@ -1567,26 +1626,6 @@ RCT_EXPORT_METHOD(setLog
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 1629
 // get sdk version
1591 1630
 RCT_EXPORT_METHOD(getSdkVersion
1592 1631
                   :(RCTPromiseResolveBlock) resolve
@@ -1675,6 +1714,210 @@ RCT_EXPORT_METHOD(setLiveTranscoding:(NSDictionary *)options) {
1675 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 1921
 - (NSArray<NSString *> *)supportedEvents {
1679 1922
   return @[
1680 1923
            AGWarning,
@@ -1739,6 +1982,9 @@ RCT_EXPORT_METHOD(setLiveTranscoding:(NSDictionary *)options) {
1739 1982
            
1740 1983
            AGMediaEngineLoaded,
1741 1984
            AGMediaEngineStartCall,
1985
+           AGIntervalTest,
1986
+           AGAudioMixingStateChanged,
1987
+           AGLastmileProbeTestResult
1742 1988
            ];
1743 1989
 }
1744 1990
 
@@ -2178,4 +2424,32 @@ RCT_EXPORT_METHOD(setLiveTranscoding:(NSDictionary *)options) {
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 2455
 @end

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

@@ -659,14 +659,15 @@ class RtcEngine {
659 659
         Agora.setAudioSessionOperationRestriction();
660 660
     }
661 661
     /**
662
+     * @deprecated
662 663
      * start echo test
663 664
      *
664 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 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 672
      * stop echo test
672 673
      *
@@ -828,6 +829,7 @@ class RtcEngine {
828 829
         return Agora.removeInjectStreamUrl(options);
829 830
     }
830 831
     /**
832
+     * @deprecated
831 833
      * set video quality
832 834
      *
833 835
      * This method sets the preferences for the video quality. (Live broadcast only).
@@ -835,9 +837,9 @@ class RtcEngine {
835 837
      * @param quality boolean
836 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 844
      * set local video mirror mode
843 845
      *
@@ -990,12 +992,13 @@ class RtcEngine {
990 992
      *
991 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 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 1004
      * send stream message
@@ -1006,8 +1009,8 @@ class RtcEngine {
1006 1009
      * @param data
1007 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 1016
      * add publish stream url
@@ -1063,6 +1066,150 @@ class RtcEngine {
1063 1066
     static muteLocalAudioStream(enabled) {
1064 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 1214
 RtcEngine.eventTypes = new Set();
1068 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,6 +1,6 @@
1 1
 {
2 2
   "name": "react-native-agora",
3
-  "version": "2.3.3-alpha.7",
3
+  "version": "2.4.0-alpha-1",
4 4
   "description": "React Native around the Agora RTC SDKs for Android and iOS agora",
5 5
   "summary": "agora native sdk for react-native",
6 6
   "main": "lib/index.js",
@@ -9,7 +9,7 @@
9 9
     "test": "echo \"Error: no test specified\" && exit 1",
10 10
     "lint": "tslint",
11 11
     "build": "tsc",
12
-    "doc": "typedoc --out docs/api ./src"
12
+    "doc": "typedoc --out docs/api/v2.4 ./src"
13 13
   },
14 14
   "repository": {
15 15
     "type": "git",

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

@@ -93,7 +93,7 @@ Pod::Spec.new do |s|
93 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 97
   s.dependency 'React'
98 98
 
99 99
 end

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

@@ -21,7 +21,10 @@ import {
21 21
     PublishStreamOption,
22 22
     RemovePublishStreamOption,
23 23
     LiveTranscodingOption,
24
-    PositionOption
24
+    PositionOption,
25
+    BeautyOption,
26
+    LastmileProbeConfig,
27
+    CameraCapturerConfiguration
25 28
 } from "./types.d";
26 29
 
27 30
 
@@ -757,14 +760,15 @@ class RtcEngine {
757 760
      }
758 761
 
759 762
     /**
763
+     * @deprecated
760 764
      * start echo test
761 765
      * 
762 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 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 774
      * stop echo test
@@ -942,6 +946,7 @@ class RtcEngine {
942 946
     }
943 947
 
944 948
     /**
949
+     * @deprecated
945 950
      * set video quality 
946 951
      * 
947 952
      * This method sets the preferences for the video quality. (Live broadcast only).
@@ -949,9 +954,9 @@ class RtcEngine {
949 954
      * @param quality boolean
950 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 962
      * set local video mirror mode
@@ -1119,12 +1124,13 @@ class RtcEngine {
1119 1124
      * 
1120 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 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,8 +1142,8 @@ class RtcEngine {
1136 1142
      * @param data 
1137 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,6 +1205,160 @@ class RtcEngine {
1199 1205
      public static muteLocalAudioStream(enabled: boolean) {
1200 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,6 +2,15 @@ import { View, ViewProps } from 'react-native';
2 2
 
3 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 14
 export interface VideoEncoderConfig {
6 15
   width: number,
7 16
   height: number,
@@ -29,7 +38,22 @@ export interface Option {
29 38
   mode: number,
30 39
   clientRole: number,
31 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 59
 export interface PublisherConfig {
@@ -206,4 +230,41 @@ export interface RemovePublishStreamOption {
206 230
 export interface PositionOption {
207 231
   x: number,
208 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
 }