@fishjam-cloud/react-native-client 0.3.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/android/build.gradle +2 -2
- package/android/src/main/java/io/fishjam/reactnative/Errors.kt +1 -2
- package/android/src/main/java/io/fishjam/reactnative/RNFishjamClient.kt +52 -27
- package/android/src/main/java/io/fishjam/reactnative/RNFishjamClientModule.kt +40 -79
- package/android/src/main/java/io/fishjam/reactnative/VideoPreviewView.kt +4 -3
- package/android/src/main/java/io/fishjam/reactnative/VideoPreviewViewModule.kt +5 -0
- package/android/src/main/java/io/fishjam/reactnative/VideoRendererView.kt +4 -3
- package/android/src/main/java/io/fishjam/reactnative/VideoRendererViewModule.kt +2 -0
- package/android/src/main/java/io/fishjam/reactnative/VideoView.kt +3 -2
- package/android/src/main/java/io/fishjam/reactnative/{FishjamForegroundService.kt → foregroundService/FishjamForegroundService.kt} +7 -2
- package/android/src/main/java/io/fishjam/reactnative/foregroundService/ForegroundServiceManager.kt +147 -0
- package/android/src/main/java/io/fishjam/reactnative/managers/LocalCameraTracksChangedListenersManager.kt +21 -0
- package/android/src/main/java/io/fishjam/reactnative/managers/LocalTracksSwitchListenersManager.kt +27 -0
- package/android/src/main/java/io/fishjam/reactnative/managers/TracksUpdateListenersManager.kt +21 -0
- package/android/src/main/java/io/fishjam/reactnative/utils/PermissionUtils.kt +45 -0
- package/build/RNFishjamClientModule.d.ts +6 -2
- package/build/RNFishjamClientModule.d.ts.map +1 -1
- package/build/RNFishjamClientModule.js.map +1 -1
- package/build/hooks/useAppScreenShare.d.ts +11 -0
- package/build/hooks/useAppScreenShare.d.ts.map +1 -0
- package/build/hooks/useAppScreenShare.js +54 -0
- package/build/hooks/useAppScreenShare.js.map +1 -0
- package/build/hooks/useFishjamEvent.d.ts +1 -0
- package/build/hooks/useFishjamEvent.d.ts.map +1 -1
- package/build/hooks/useFishjamEvent.js +1 -0
- package/build/hooks/useFishjamEvent.js.map +1 -1
- package/build/hooks/useForegroundService.d.ts +44 -0
- package/build/hooks/useForegroundService.d.ts.map +1 -0
- package/build/hooks/useForegroundService.js +57 -0
- package/build/hooks/useForegroundService.js.map +1 -0
- package/build/hooks/useMicrophone.d.ts +1 -1
- package/build/hooks/useMicrophone.js +1 -1
- package/build/hooks/useMicrophone.js.map +1 -1
- package/build/hooks/useScreenShare.d.ts +1 -0
- package/build/hooks/useScreenShare.d.ts.map +1 -1
- package/build/hooks/useScreenShare.js +20 -13
- package/build/hooks/useScreenShare.js.map +1 -1
- package/build/index.d.ts +4 -3
- package/build/index.d.ts.map +1 -1
- package/build/index.js +2 -2
- package/build/index.js.map +1 -1
- package/build/types.d.ts +0 -25
- package/build/types.d.ts.map +1 -1
- package/build/types.js +1 -10
- package/build/types.js.map +1 -1
- package/ios/Events.swift +1 -0
- package/ios/RNFishjamClient.podspec +1 -1
- package/ios/RNFishjamClient.swift +144 -57
- package/ios/RNFishjamClientModule.swift +32 -24
- package/ios/VideoPreviewView.swift +6 -10
- package/ios/VideoRendererView.swift +5 -14
- package/package.json +6 -6
- package/plugin/build/withFishjamAndroid.js +1 -1
- package/build/utils/foregroundService.d.ts +0 -32
- package/build/utils/foregroundService.d.ts.map +0 -1
- package/build/utils/foregroundService.js +0 -43
- package/build/utils/foregroundService.js.map +0 -1
package/build/index.js
CHANGED
|
@@ -5,14 +5,14 @@ export { useBandwidthEstimation } from './hooks/useBandwidthEstimation';
|
|
|
5
5
|
export { useCamera } from './hooks/useCamera';
|
|
6
6
|
export { useMicrophone } from './hooks/useMicrophone';
|
|
7
7
|
export { useScreenShare } from './hooks/useScreenShare';
|
|
8
|
+
export { useAppScreenShare } from './hooks/useAppScreenShare';
|
|
8
9
|
export { useReconnection } from './hooks/useReconnection';
|
|
9
10
|
export { updatePeerMetadata } from './common/metadata';
|
|
10
11
|
export { setTargetTrackEncoding } from './common/webRTC';
|
|
11
12
|
export { joinRoom, leaveRoom } from './common/client';
|
|
12
13
|
export { VideoPreviewView } from './components/VideoPreviewView';
|
|
13
14
|
export { VideoRendererView } from './components/VideoRendererView';
|
|
14
|
-
export { AndroidForegroundServiceType } from './types';
|
|
15
|
-
export { startForegroundService, stopForegroundService, } from './utils/foregroundService';
|
|
16
15
|
export { usePeerStatus } from './hooks/usePeerStatus';
|
|
16
|
+
export { useForegroundService } from './hooks/useForegroundService';
|
|
17
17
|
initializeWarningListener();
|
|
18
18
|
//# sourceMappingURL=index.js.map
|
package/build/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AAYlE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAO5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAE5D,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AASxE,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAE9C,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAMtD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAG9D,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAE1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEvD,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAGzD,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAGtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAGjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAGnE,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAMtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAWpE,yBAAyB,EAAE,CAAC","sourcesContent":["import { initializeWarningListener } from './utils/errorListener';\n\nexport type {\n Peer,\n Track,\n TrackType,\n VadStatus,\n EncodingReason,\n AudioTrack,\n VideoTrack,\n} from './hooks/usePeers';\n\nexport { usePeers } from './hooks/usePeers';\n\nexport type {\n AudioOutputDevice,\n AudioOutputDeviceType,\n AudioSessionMode,\n} from './hooks/useAudioSettings';\nexport { useAudioSettings } from './hooks/useAudioSettings';\n\nexport { useBandwidthEstimation } from './hooks/useBandwidthEstimation';\n\nexport type {\n CameraId,\n Camera,\n CameraConfig,\n VideoQuality,\n CameraFacingDirection,\n} from './hooks/useCamera';\nexport { useCamera } from './hooks/useCamera';\n\nexport { useMicrophone } from './hooks/useMicrophone';\n\nexport type {\n ScreenShareOptions,\n ScreenShareQuality,\n} from './hooks/useScreenShare';\nexport { useScreenShare } from './hooks/useScreenShare';\n\nexport { useAppScreenShare } from './hooks/useAppScreenShare';\n\nexport type { ReconnectionStatus } from './hooks/useReconnection';\nexport { useReconnection } from './hooks/useReconnection';\n\nexport { updatePeerMetadata } from './common/metadata';\n\nexport { setTargetTrackEncoding } from './common/webRTC';\n\nexport type { ConnectionConfig } from './common/client';\nexport { joinRoom, leaveRoom } from './common/client';\n\nexport type { VideoPreviewViewProps } from './components/VideoPreviewView';\nexport { VideoPreviewView } from './components/VideoPreviewView';\n\nexport type { VideoRendererProps } from './components/VideoRendererView';\nexport { VideoRendererView } from './components/VideoRendererView';\n\nexport type { PeerStatus } from './hooks/usePeerStatus';\nexport { usePeerStatus } from './hooks/usePeerStatus';\n\nexport type {\n ForegroundServiceNotificationConfig,\n ForegroundServicePermissionsConfig,\n} from './hooks/useForegroundService';\nexport { useForegroundService } from './hooks/useForegroundService';\n\nexport type {\n TrackBandwidthLimit,\n TrackEncoding,\n SimulcastBandwidthLimit,\n BandwidthLimit,\n SimulcastConfig,\n VideoLayout,\n} from './types';\n\ninitializeWarningListener();\n"]}
|
package/build/types.d.ts
CHANGED
|
@@ -45,30 +45,5 @@ declare const brand: unique symbol;
|
|
|
45
45
|
export type Brand<T, TBrand extends string> = T & {
|
|
46
46
|
[brand]: TBrand;
|
|
47
47
|
};
|
|
48
|
-
/**
|
|
49
|
-
* Enum used to set the foreground service types identifying the work done by the service.
|
|
50
|
-
* See Android's [foreground service types](https://developer.android.com/develop/background-work/services/fg-service-types) documentation.
|
|
51
|
-
*/
|
|
52
|
-
export declare enum AndroidForegroundServiceType {
|
|
53
|
-
FOREGROUND_SERVICE_TYPE_CAMERA = 64,
|
|
54
|
-
FOREGROUND_SERVICE_TYPE_MEDIA_PROJECTION = 32,
|
|
55
|
-
FOREGROUND_SERVICE_TYPE_MICROPHONE = 128
|
|
56
|
-
}
|
|
57
|
-
/**
|
|
58
|
-
* A type representing the options required for configuring the foreground service.
|
|
59
|
-
*
|
|
60
|
-
* @param channelId The id of the channel. Must be unique per package.
|
|
61
|
-
* @param channelName The user visible name of the channel.
|
|
62
|
-
* @param notificationTitle The title (first row) of the notification, in a standard notification.
|
|
63
|
-
* @param notificationContent The text (second row) of the notification, in a standard notification.
|
|
64
|
-
* @param foregroundServiceTypes The type of foreground service to launch.
|
|
65
|
-
*/
|
|
66
|
-
export type ForegroundServiceOptions = {
|
|
67
|
-
channelId: string;
|
|
68
|
-
channelName: string;
|
|
69
|
-
notificationTitle: string;
|
|
70
|
-
notificationContent: string;
|
|
71
|
-
foregroundServiceTypes: AndroidForegroundServiceType[];
|
|
72
|
-
};
|
|
73
48
|
export {};
|
|
74
49
|
//# sourceMappingURL=types.d.ts.map
|
package/build/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,KAAK,CAAC;AAEzC,MAAM,MAAM,aAAa,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAE5C;;;;;;GAMG;AACH,MAAM,MAAM,eAAe,GAAG;IAC5B;;OAEG;IACH,OAAO,EAAE,OAAO,CAAC;IACjB;;OAEG;IACH,eAAe,EAAE,aAAa,EAAE,CAAC;CAClC,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC;AAEpC;;;GAGG;AACH,MAAM,MAAM,uBAAuB,GAAG,MAAM,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC;AAE5E;;GAEG;AACH,MAAM,MAAM,mBAAmB,GAAG,cAAc,GAAG,uBAAuB,CAAC;AAE3E,MAAM,MAAM,aAAa,GAAG;IAC1B,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,EAAE,OAAO,GAAG,QAAQ,GAAG,eAAe,CAAC;CAC5C,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAGtD,OAAO,CAAC,MAAM,KAAK,EAAE,OAAO,MAAM,CAAC;AACnC,MAAM,MAAM,KAAK,CAAC,CAAC,EAAE,MAAM,SAAS,MAAM,IAAI,CAAC,GAAG;IAAE,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,KAAK,CAAC;AAEzC,MAAM,MAAM,aAAa,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAE5C;;;;;;GAMG;AACH,MAAM,MAAM,eAAe,GAAG;IAC5B;;OAEG;IACH,OAAO,EAAE,OAAO,CAAC;IACjB;;OAEG;IACH,eAAe,EAAE,aAAa,EAAE,CAAC;CAClC,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC;AAEpC;;;GAGG;AACH,MAAM,MAAM,uBAAuB,GAAG,MAAM,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC;AAE5E;;GAEG;AACH,MAAM,MAAM,mBAAmB,GAAG,cAAc,GAAG,uBAAuB,CAAC;AAE3E,MAAM,MAAM,aAAa,GAAG;IAC1B,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,EAAE,OAAO,GAAG,QAAQ,GAAG,eAAe,CAAC;CAC5C,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAGtD,OAAO,CAAC,MAAM,KAAK,EAAE,OAAO,MAAM,CAAC;AACnC,MAAM,MAAM,KAAK,CAAC,CAAC,EAAE,MAAM,SAAS,MAAM,IAAI,CAAC,GAAG;IAAE,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC"}
|
package/build/types.js
CHANGED
|
@@ -1,11 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
* Enum used to set the foreground service types identifying the work done by the service.
|
|
3
|
-
* See Android's [foreground service types](https://developer.android.com/develop/background-work/services/fg-service-types) documentation.
|
|
4
|
-
*/
|
|
5
|
-
export var AndroidForegroundServiceType;
|
|
6
|
-
(function (AndroidForegroundServiceType) {
|
|
7
|
-
AndroidForegroundServiceType[AndroidForegroundServiceType["FOREGROUND_SERVICE_TYPE_CAMERA"] = 64] = "FOREGROUND_SERVICE_TYPE_CAMERA";
|
|
8
|
-
AndroidForegroundServiceType[AndroidForegroundServiceType["FOREGROUND_SERVICE_TYPE_MEDIA_PROJECTION"] = 32] = "FOREGROUND_SERVICE_TYPE_MEDIA_PROJECTION";
|
|
9
|
-
AndroidForegroundServiceType[AndroidForegroundServiceType["FOREGROUND_SERVICE_TYPE_MICROPHONE"] = 128] = "FOREGROUND_SERVICE_TYPE_MICROPHONE";
|
|
10
|
-
})(AndroidForegroundServiceType || (AndroidForegroundServiceType = {}));
|
|
1
|
+
export {};
|
|
11
2
|
//# sourceMappingURL=types.js.map
|
package/build/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"","sourcesContent":["/**\n * `FILL` or `FIT` - it works just like RN Image component. `FILL` fills the whole view\n * with video and it may cut some parts of the video. `FIT` scales the video so the whole\n * video is visible, but it may leave some empty space in the view.\n * @category Components\n */\nexport type VideoLayout = 'FILL' | 'FIT';\n\nexport type TrackEncoding = 'l' | 'm' | 'h';\n\n/**\n * A type describing simulcast configuration.\n *\n * At the moment, simulcast track is initialized in three versions - low, medium and high.\n * High resolution is the original track resolution, while medium and low resolutions are\n * the original track resolution scaled down by 2 and 4 respectively.\n */\nexport type SimulcastConfig = {\n /**\n * whether to simulcast track or not. By default simulcast is disabled.\n */\n enabled: boolean;\n /**\n * list of active encodings. Encoding can be one of `\"h\"` (original encoding), `\"m\"` (scaled down x2), `\"l\"` (scaled down x4).\n */\n activeEncodings: TrackEncoding[];\n};\n\n/**\n * Type describing maximal bandwidth that can be used, in kbps. 0 is interpreted as unlimited bandwidth.\n */\nexport type BandwidthLimit = number;\n\n/**\n * Type describing bandwidth limit for simulcast track. It is a mapping `encoding -> BandwidthLimit`. If encoding isn't present in this mapping,\n * it will be assumed that this particular encoding shouldn't have any bandwidth limit.\n */\nexport type SimulcastBandwidthLimit = Record<TrackEncoding, BandwidthLimit>;\n\n/**\n * A type describing bandwidth limitation of a track, including simulcast and non-simulcast tracks. Can be `BandwidthLimit` or `SimulcastBandwidthLimit`.\n */\nexport type TrackBandwidthLimit = BandwidthLimit | SimulcastBandwidthLimit;\n\nexport type TrackMetadata = {\n active: boolean;\n type: 'audio' | 'camera' | 'screensharing';\n};\n\nexport type GenericMetadata = Record<string, unknown>;\n\n// branded types are useful for restricting where given value can be passed\ndeclare const brand: unique symbol;\nexport type Brand<T, TBrand extends string> = T & { [brand]: TBrand };\n"]}
|
package/ios/Events.swift
CHANGED
|
@@ -11,6 +11,7 @@ class RNFishjamClient: FishjamClientListener {
|
|
|
11
11
|
var isMicrophoneOn = false
|
|
12
12
|
var isCameraOn = false
|
|
13
13
|
var isScreenShareOn = false
|
|
14
|
+
var isAppScreenShareOn = false
|
|
14
15
|
var isConnected = false
|
|
15
16
|
|
|
16
17
|
private var isCameraInitialized = false
|
|
@@ -37,8 +38,8 @@ class RNFishjamClient: FishjamClientListener {
|
|
|
37
38
|
|
|
38
39
|
let sendEvent: (_ eventName: String, _ data: [String: Any]) -> Void
|
|
39
40
|
|
|
40
|
-
static var
|
|
41
|
-
static var
|
|
41
|
+
static var tracksUpdateListenersManager = TracksUpdateListenersManager()
|
|
42
|
+
static var localCameraTracksChangedListenersManager = LocalCameraTracksChangedListenersManager()
|
|
42
43
|
|
|
43
44
|
init(sendEvent: @escaping (_ eventName: String, _ data: [String: Any]) -> Void) {
|
|
44
45
|
self.sendEvent = sendEvent
|
|
@@ -111,26 +112,34 @@ class RNFishjamClient: FishjamClientListener {
|
|
|
111
112
|
}
|
|
112
113
|
}()
|
|
113
114
|
let videoParameters = VideoParameters(
|
|
114
|
-
dimensions: flipDimensions ? preset.dimensions.
|
|
115
|
+
dimensions: flipDimensions ? preset.dimensions.flipped : preset.dimensions,
|
|
115
116
|
maxBandwidth: videoBandwidthLimit,
|
|
116
117
|
simulcastConfig: simulcastConfig
|
|
117
118
|
)
|
|
118
119
|
return videoParameters
|
|
119
120
|
}
|
|
120
121
|
|
|
121
|
-
private
|
|
122
|
-
|
|
123
|
-
|
|
122
|
+
private var localEndpoint: Endpoint? {
|
|
123
|
+
RNFishjamClient.fishjamClient?.getLocalEndpoint()
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
private func getLocalCameraTrack() -> LocalCameraTrack? {
|
|
127
|
+
return localEndpoint?.tracks.compactMap { $0.value as? LocalCameraTrack }.first
|
|
128
|
+
|
|
124
129
|
}
|
|
125
130
|
|
|
126
131
|
private func getLocalAudioTrack() -> LocalAudioTrack? {
|
|
127
|
-
return
|
|
128
|
-
|
|
132
|
+
return localEndpoint?.tracks.compactMap { $0.value as? LocalAudioTrack }.first
|
|
133
|
+
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
private func getLocalScreenBroadcastTrack() -> LocalBroadcastScreenShareTrack? {
|
|
137
|
+
return localEndpoint?.tracks.compactMap { $0.value as? LocalBroadcastScreenShareTrack }.first
|
|
138
|
+
|
|
129
139
|
}
|
|
130
140
|
|
|
131
|
-
private func
|
|
132
|
-
return
|
|
133
|
-
.value as? LocalScreenShareTrack
|
|
141
|
+
private func getLocalScreenAppTrack() -> LocalAppScreenShareTrack? {
|
|
142
|
+
return localEndpoint?.tracks.compactMap { $0.value as? LocalAppScreenShareTrack }.first
|
|
134
143
|
}
|
|
135
144
|
|
|
136
145
|
private func ensureCreated() throws {
|
|
@@ -151,8 +160,8 @@ class RNFishjamClient: FishjamClientListener {
|
|
|
151
160
|
}
|
|
152
161
|
}
|
|
153
162
|
|
|
154
|
-
private func
|
|
155
|
-
if
|
|
163
|
+
private func ensureCameraTrack() throws {
|
|
164
|
+
if getLocalCameraTrack() == nil {
|
|
156
165
|
throw Exception(
|
|
157
166
|
name: "E_NO_LOCAL_VIDEO_TRACK",
|
|
158
167
|
description: "No local video track. Make sure to call connect() first!")
|
|
@@ -167,11 +176,19 @@ class RNFishjamClient: FishjamClientListener {
|
|
|
167
176
|
}
|
|
168
177
|
}
|
|
169
178
|
|
|
170
|
-
private func
|
|
171
|
-
if
|
|
179
|
+
private func ensureScreenBroadcastTrack() throws {
|
|
180
|
+
if getLocalScreenBroadcastTrack() == nil {
|
|
172
181
|
throw Exception(
|
|
173
182
|
name: "E_NO_LOCAL_SCREENSHARE_TRACK",
|
|
174
|
-
description: "No local screen
|
|
183
|
+
description: "No local screen broadcast track. Make sure to toggle screen broadcast on first!")
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
private func ensureScreenAppTrack() throws {
|
|
188
|
+
if getLocalScreenAppTrack() == nil {
|
|
189
|
+
throw Exception(
|
|
190
|
+
name: "E_NO_LOCAL_SCREENSHARE_TRACK",
|
|
191
|
+
description: "No local screen app track. Make sure to toggle screen app on first!")
|
|
175
192
|
}
|
|
176
193
|
}
|
|
177
194
|
|
|
@@ -189,7 +206,7 @@ class RNFishjamClient: FishjamClientListener {
|
|
|
189
206
|
) {
|
|
190
207
|
peerStatus = .connecting
|
|
191
208
|
connectPromise = promise
|
|
192
|
-
localUserMetadata = peerMetadata.toMetadata()
|
|
209
|
+
localUserMetadata = ["server": [:], "peer": peerMetadata].toMetadata()
|
|
193
210
|
|
|
194
211
|
let reconnectConfig = FishjamCloudClient.ReconnectConfig(
|
|
195
212
|
maxAttempts: config.reconnectConfig.maxAttempts, initialDelayMs: config.reconnectConfig.initialDelayMs,
|
|
@@ -197,7 +214,7 @@ class RNFishjamClient: FishjamClientListener {
|
|
|
197
214
|
|
|
198
215
|
RNFishjamClient.fishjamClient?.connect(
|
|
199
216
|
config: FishjamCloudClient.ConnectConfig(
|
|
200
|
-
websocketUrl: url, token: peerToken, peerMetadata:
|
|
217
|
+
websocketUrl: url, token: peerToken, peerMetadata: localUserMetadata,
|
|
201
218
|
reconnectConfig: reconnectConfig
|
|
202
219
|
))
|
|
203
220
|
|
|
@@ -214,6 +231,7 @@ class RNFishjamClient: FishjamClientListener {
|
|
|
214
231
|
isMicrophoneOn = false
|
|
215
232
|
isCameraOn = false
|
|
216
233
|
isScreenShareOn = false
|
|
234
|
+
isAppScreenShareOn = false
|
|
217
235
|
isConnected = false
|
|
218
236
|
isCameraInitialized = false
|
|
219
237
|
RNFishjamClient.fishjamClient?.leave { [weak self] in
|
|
@@ -221,7 +239,7 @@ class RNFishjamClient: FishjamClientListener {
|
|
|
221
239
|
}
|
|
222
240
|
}
|
|
223
241
|
|
|
224
|
-
func startCamera(config: CameraConfig) throws {
|
|
242
|
+
func startCamera(config: CameraConfig) async throws {
|
|
225
243
|
try ensureCreated()
|
|
226
244
|
|
|
227
245
|
guard !isCameraInitialized else {
|
|
@@ -229,13 +247,18 @@ class RNFishjamClient: FishjamClientListener {
|
|
|
229
247
|
return
|
|
230
248
|
}
|
|
231
249
|
|
|
250
|
+
guard await PermissionUtils.requestCameraPermission() else {
|
|
251
|
+
emit(warning: "Camera permission not granted.")
|
|
252
|
+
return
|
|
253
|
+
}
|
|
254
|
+
|
|
232
255
|
let cameraTrack = try createCameraTrack(config: config)
|
|
233
256
|
setCameraTrackState(cameraTrack, enabled: config.cameraEnabled)
|
|
234
257
|
emitEndpoints()
|
|
235
258
|
isCameraInitialized = true
|
|
236
259
|
}
|
|
237
260
|
|
|
238
|
-
private func createCameraTrack(config: CameraConfig) throws ->
|
|
261
|
+
private func createCameraTrack(config: CameraConfig) throws -> LocalCameraTrack {
|
|
239
262
|
try ensureCreated()
|
|
240
263
|
let videoParameters = try getVideoParametersFromOptions(connectionOptions: config)
|
|
241
264
|
videoSimulcastConfig = try getSimulcastConfigFromOptions(simulcastConfig: config.simulcastConfig)
|
|
@@ -246,42 +269,46 @@ class RNFishjamClient: FishjamClientListener {
|
|
|
246
269
|
)
|
|
247
270
|
}
|
|
248
271
|
|
|
249
|
-
private func setCameraTrackState(_ cameraTrack:
|
|
272
|
+
private func setCameraTrackState(_ cameraTrack: LocalCameraTrack, enabled: Bool) {
|
|
250
273
|
cameraTrack.enabled = enabled
|
|
251
274
|
isCameraOn = enabled
|
|
252
275
|
let event = EmitableEvents.IsCameraOn
|
|
253
276
|
let isCameraEnabledMap = [event.name: enabled]
|
|
254
277
|
emit(event: event, data: isCameraEnabledMap)
|
|
255
|
-
RNFishjamClient.
|
|
278
|
+
RNFishjamClient.localCameraTracksChangedListenersManager.notifyListeners()
|
|
256
279
|
}
|
|
257
280
|
|
|
258
281
|
func toggleCamera() throws -> Bool {
|
|
259
|
-
try
|
|
260
|
-
setCameraTrackState(
|
|
282
|
+
try ensureCameraTrack()
|
|
283
|
+
setCameraTrackState(getLocalCameraTrack()!, enabled: !isCameraOn)
|
|
261
284
|
return isCameraOn
|
|
262
285
|
}
|
|
263
286
|
|
|
264
287
|
func flipCamera() throws {
|
|
265
|
-
try
|
|
266
|
-
|
|
288
|
+
try ensureCameraTrack()
|
|
289
|
+
getLocalCameraTrack()?.flipCamera()
|
|
267
290
|
}
|
|
268
291
|
|
|
269
292
|
func switchCamera(cameraId: String) throws {
|
|
270
|
-
try
|
|
271
|
-
|
|
293
|
+
try ensureCameraTrack()
|
|
294
|
+
getLocalCameraTrack()?.switchCamera(deviceId: cameraId)
|
|
272
295
|
|
|
273
296
|
}
|
|
274
297
|
|
|
275
|
-
func toggleMicrophone() throws -> Bool {
|
|
298
|
+
func toggleMicrophone() async throws -> Bool {
|
|
276
299
|
if let audioTrack = getLocalAudioTrack() {
|
|
277
300
|
setMicrophoneTrackState(audioTrack, enabled: !isMicrophoneOn)
|
|
278
301
|
} else {
|
|
279
|
-
try startMicrophone()
|
|
302
|
+
try await startMicrophone()
|
|
280
303
|
}
|
|
281
304
|
return isMicrophoneOn
|
|
282
305
|
}
|
|
283
306
|
|
|
284
|
-
func startMicrophone() throws {
|
|
307
|
+
func startMicrophone() async throws {
|
|
308
|
+
guard await PermissionUtils.requestMicrophonePermission() else {
|
|
309
|
+
emit(warning: "Microphone permission not granted.")
|
|
310
|
+
return
|
|
311
|
+
}
|
|
285
312
|
let microphoneTrack = RNFishjamClient.fishjamClient!.createAudioTrack(metadata: Metadata())
|
|
286
313
|
setAudioSessionMode()
|
|
287
314
|
setMicrophoneTrackState(microphoneTrack, enabled: true)
|
|
@@ -317,6 +344,10 @@ class RNFishjamClient: FishjamClientListener {
|
|
|
317
344
|
func toggleScreenShare(screenShareOptions: ScreenShareOptions) throws {
|
|
318
345
|
try ensureCreated()
|
|
319
346
|
try ensureConnected()
|
|
347
|
+
guard isAppScreenShareOn == false else {
|
|
348
|
+
emit(warning: "Screensharing screen not available during screensharing app.")
|
|
349
|
+
return
|
|
350
|
+
}
|
|
320
351
|
guard let screenShareExtensionBundleId = Bundle.main.infoDictionary?["ScreenShareExtensionBundleId"] as? String
|
|
321
352
|
else {
|
|
322
353
|
throw Exception(
|
|
@@ -346,13 +377,18 @@ class RNFishjamClient: FishjamClientListener {
|
|
|
346
377
|
maxBandwidth: screenShareOptions.maxBandwidth)
|
|
347
378
|
let screenShareMetadata = screenShareOptions.screenShareMetadata.toMetadata()
|
|
348
379
|
let videoParameters = getScreenShareVideoParameters(options: screenShareOptions)
|
|
349
|
-
RNFishjamClient.fishjamClient!.
|
|
380
|
+
RNFishjamClient.fishjamClient!.prepareForScreenBroadcast(
|
|
350
381
|
appGroup: appGroupName,
|
|
351
382
|
videoParameters: videoParameters,
|
|
352
383
|
metadata: screenShareMetadata,
|
|
384
|
+
canStart: {
|
|
385
|
+
if self.isAppScreenShareOn {
|
|
386
|
+
self.emit(warning: "Screensharing screen not available during screensharing app.")
|
|
387
|
+
}
|
|
388
|
+
return !self.isAppScreenShareOn
|
|
389
|
+
},
|
|
353
390
|
onStart: { [weak self] in
|
|
354
391
|
guard let self else { return }
|
|
355
|
-
|
|
356
392
|
do {
|
|
357
393
|
try setScreenShareTrackState(enabled: true)
|
|
358
394
|
} catch {
|
|
@@ -387,6 +423,50 @@ class RNFishjamClient: FishjamClientListener {
|
|
|
387
423
|
emit(event: event, data: isScreenShareEnabled)
|
|
388
424
|
}
|
|
389
425
|
|
|
426
|
+
func startScreenAppShare(screenShareOptions: ScreenShareOptions) throws {
|
|
427
|
+
try ensureCreated()
|
|
428
|
+
try ensureConnected()
|
|
429
|
+
|
|
430
|
+
let simulcastConfig = try getSimulcastConfigFromOptions(simulcastConfig: screenShareOptions.simulcastConfig)
|
|
431
|
+
|
|
432
|
+
screenShareSimulcastConfig = simulcastConfig
|
|
433
|
+
screenShareMaxBandwidth = getMaxBandwidthFromOptions(maxBandwidth: screenShareOptions.maxBandwidth)
|
|
434
|
+
let metadata = screenShareOptions.screenShareMetadata.toMetadata()
|
|
435
|
+
let videoParameters = getScreenShareVideoParameters(options: screenShareOptions)
|
|
436
|
+
let screenAppTrack = RNFishjamClient.fishjamClient!.createScreenAppTrack(
|
|
437
|
+
videoParameters: videoParameters, metadata: metadata)
|
|
438
|
+
setScreenAppTrackState(screenAppTrack, enabled: true)
|
|
439
|
+
emitEndpoints()
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
func stopAppScreenShare() throws {
|
|
443
|
+
try ensureScreenAppTrack()
|
|
444
|
+
let track = getLocalScreenAppTrack()!
|
|
445
|
+
setScreenAppTrackState(track, enabled: false)
|
|
446
|
+
RNFishjamClient.fishjamClient?.removeTrack(trackId: track.id)
|
|
447
|
+
emitEndpoints()
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
func toggleAppScreenShare(screenShareOptions: ScreenShareOptions) throws {
|
|
451
|
+
guard isScreenShareOn == false else {
|
|
452
|
+
emit(warning: "App screensharing not available during screensharing.")
|
|
453
|
+
return
|
|
454
|
+
}
|
|
455
|
+
if getLocalScreenAppTrack() != nil {
|
|
456
|
+
try stopAppScreenShare()
|
|
457
|
+
} else {
|
|
458
|
+
try startScreenAppShare(screenShareOptions: screenShareOptions)
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
private func setScreenAppTrackState(_ track: LocalAppScreenShareTrack, enabled: Bool) {
|
|
463
|
+
track.enabled = enabled
|
|
464
|
+
isAppScreenShareOn = enabled
|
|
465
|
+
let event = EmitableEvents.IsAppScreenShareOn
|
|
466
|
+
let eventMap = [event.name: enabled]
|
|
467
|
+
emit(event: event, data: eventMap)
|
|
468
|
+
}
|
|
469
|
+
|
|
390
470
|
//returns local endpoint and remote endpoints
|
|
391
471
|
static func getLocalAndRemoteEndpoints() -> [Endpoint] {
|
|
392
472
|
let localEndpoint = RNFishjamClient.fishjamClient!.getLocalEndpoint()
|
|
@@ -421,14 +501,21 @@ class RNFishjamClient: FishjamClientListener {
|
|
|
421
501
|
"vadStatus": track.vadStatus.rawValue,
|
|
422
502
|
]
|
|
423
503
|
|
|
424
|
-
case let track as
|
|
504
|
+
case let track as LocalCameraTrack:
|
|
505
|
+
return [
|
|
506
|
+
"id": track.id,
|
|
507
|
+
"type": "Video",
|
|
508
|
+
"metadata": track.metadata.toDict(),
|
|
509
|
+
]
|
|
510
|
+
|
|
511
|
+
case let track as LocalBroadcastScreenShareTrack:
|
|
425
512
|
return [
|
|
426
513
|
"id": track.id,
|
|
427
514
|
"type": "Video",
|
|
428
515
|
"metadata": track.metadata.toDict(),
|
|
429
516
|
]
|
|
430
517
|
|
|
431
|
-
case let track as
|
|
518
|
+
case let track as LocalAppScreenShareTrack:
|
|
432
519
|
return [
|
|
433
520
|
"id": track.id,
|
|
434
521
|
"type": "Video",
|
|
@@ -451,7 +538,7 @@ class RNFishjamClient: FishjamClientListener {
|
|
|
451
538
|
}
|
|
452
539
|
|
|
453
540
|
func getCaptureDevices() -> [[String: Any]] {
|
|
454
|
-
let devices =
|
|
541
|
+
let devices = LocalCameraTrack.getCaptureDevices()
|
|
455
542
|
return devices.map { device -> [String: Any] in
|
|
456
543
|
let facingDirection =
|
|
457
544
|
switch device.position {
|
|
@@ -478,8 +565,8 @@ class RNFishjamClient: FishjamClientListener {
|
|
|
478
565
|
}
|
|
479
566
|
|
|
480
567
|
func updateLocalVideoTrackMetadata(metadata: [String: Any]) throws {
|
|
481
|
-
try
|
|
482
|
-
if let track =
|
|
568
|
+
try ensureCameraTrack()
|
|
569
|
+
if let track = getLocalCameraTrack() {
|
|
483
570
|
updateTrackMetadata(trackId: track.id, metadata: metadata)
|
|
484
571
|
}
|
|
485
572
|
}
|
|
@@ -492,8 +579,8 @@ class RNFishjamClient: FishjamClientListener {
|
|
|
492
579
|
}
|
|
493
580
|
|
|
494
581
|
func updateLocalScreenShareTrackMetadata(metadata: [String: Any]) throws {
|
|
495
|
-
try
|
|
496
|
-
if let track =
|
|
582
|
+
try ensureScreenBroadcastTrack()
|
|
583
|
+
if let track = getLocalScreenBroadcastTrack() {
|
|
497
584
|
updateTrackMetadata(trackId: track.id, metadata: metadata)
|
|
498
585
|
}
|
|
499
586
|
}
|
|
@@ -518,8 +605,8 @@ class RNFishjamClient: FishjamClientListener {
|
|
|
518
605
|
}
|
|
519
606
|
|
|
520
607
|
func toggleScreenShareTrackEncoding(encoding: String) throws -> [String: Any] {
|
|
521
|
-
try
|
|
522
|
-
if let track =
|
|
608
|
+
try ensureScreenBroadcastTrack()
|
|
609
|
+
if let track = getLocalScreenBroadcastTrack() {
|
|
523
610
|
screenShareSimulcastConfig = try toggleTrackEncoding(
|
|
524
611
|
encoding: encoding, trackId: track.id, simulcastConfig: screenShareSimulcastConfig)
|
|
525
612
|
}
|
|
@@ -527,15 +614,15 @@ class RNFishjamClient: FishjamClientListener {
|
|
|
527
614
|
}
|
|
528
615
|
|
|
529
616
|
func setScreenShareTrackBandwidth(bandwidth: Int) throws {
|
|
530
|
-
try
|
|
531
|
-
if let track =
|
|
617
|
+
try ensureScreenBroadcastTrack()
|
|
618
|
+
if let track = getLocalScreenBroadcastTrack() {
|
|
532
619
|
RNFishjamClient.fishjamClient?.setTrackBandwidth(trackId: track.id, bandwidthLimit: bandwidth)
|
|
533
620
|
}
|
|
534
621
|
}
|
|
535
622
|
|
|
536
623
|
func setScreenShareTrackEncodingBandwidth(encoding: String, bandwidth: Int) throws {
|
|
537
|
-
try
|
|
538
|
-
if let track =
|
|
624
|
+
try ensureScreenBroadcastTrack()
|
|
625
|
+
if let track = getLocalScreenBroadcastTrack() {
|
|
539
626
|
RNFishjamClient.fishjamClient?.setEncodingBandwidth(
|
|
540
627
|
trackId: track.id, encoding: encoding, bandwidthLimit: bandwidth)
|
|
541
628
|
}
|
|
@@ -548,10 +635,10 @@ class RNFishjamClient: FishjamClientListener {
|
|
|
548
635
|
}
|
|
549
636
|
|
|
550
637
|
func toggleVideoTrackEncoding(encoding: String) throws -> [String: Any] {
|
|
551
|
-
try
|
|
638
|
+
try ensureCameraTrack()
|
|
552
639
|
try ensureConnected()
|
|
553
640
|
|
|
554
|
-
let track =
|
|
641
|
+
let track = getLocalCameraTrack()!
|
|
555
642
|
videoSimulcastConfig = try toggleTrackEncoding(
|
|
556
643
|
encoding: encoding, trackId: track.id, simulcastConfig: videoSimulcastConfig)
|
|
557
644
|
|
|
@@ -563,15 +650,15 @@ class RNFishjamClient: FishjamClientListener {
|
|
|
563
650
|
}
|
|
564
651
|
|
|
565
652
|
func setVideoTrackEncodingBandwidth(encoding: String, bandwidth: Int) throws {
|
|
566
|
-
try
|
|
567
|
-
let track =
|
|
653
|
+
try ensureCameraTrack()
|
|
654
|
+
let track = getLocalCameraTrack()!
|
|
568
655
|
RNFishjamClient.fishjamClient?.setEncodingBandwidth(
|
|
569
656
|
trackId: track.id, encoding: encoding, bandwidthLimit: bandwidth)
|
|
570
657
|
}
|
|
571
658
|
|
|
572
659
|
func setVideoTrackBandwidth(bandwidth: Int) throws {
|
|
573
|
-
try
|
|
574
|
-
let track =
|
|
660
|
+
try ensureCameraTrack()
|
|
661
|
+
let track = getLocalCameraTrack()!
|
|
575
662
|
RNFishjamClient.fishjamClient?.setTrackBandwidth(trackId: track.id, bandwidthLimit: bandwidth)
|
|
576
663
|
}
|
|
577
664
|
|
|
@@ -665,7 +752,7 @@ class RNFishjamClient: FishjamClientListener {
|
|
|
665
752
|
preset = VideoParameters.presetScreenShareHD15
|
|
666
753
|
}
|
|
667
754
|
return VideoParameters(
|
|
668
|
-
dimensions: preset.dimensions.
|
|
755
|
+
dimensions: preset.dimensions.flipped,
|
|
669
756
|
maxBandwidth: screenShareMaxBandwidth,
|
|
670
757
|
maxFps: preset.maxFps,
|
|
671
758
|
simulcastConfig: screenShareSimulcastConfig
|
|
@@ -673,7 +760,9 @@ class RNFishjamClient: FishjamClientListener {
|
|
|
673
760
|
}
|
|
674
761
|
|
|
675
762
|
func emit(event: EmitableEvents, data: [String: Any] = [:]) {
|
|
676
|
-
|
|
763
|
+
DispatchQueue.main.async { [weak self] in
|
|
764
|
+
self?.sendEvent(event.name, data)
|
|
765
|
+
}
|
|
677
766
|
}
|
|
678
767
|
|
|
679
768
|
func emit(warning: String) {
|
|
@@ -712,9 +801,7 @@ class RNFishjamClient: FishjamClientListener {
|
|
|
712
801
|
}
|
|
713
802
|
}
|
|
714
803
|
|
|
715
|
-
RNFishjamClient.
|
|
716
|
-
$0.onTrackUpdate()
|
|
717
|
-
}
|
|
804
|
+
RNFishjamClient.tracksUpdateListenersManager.notifyListeners()
|
|
718
805
|
|
|
719
806
|
emitEndpoints()
|
|
720
807
|
}
|
|
@@ -73,10 +73,6 @@ typealias RNTrackBandwidthLimit = Either<Int, [String: Int]>
|
|
|
73
73
|
|
|
74
74
|
public class RNFishjamClientModule: Module {
|
|
75
75
|
public func definition() -> ModuleDefinition {
|
|
76
|
-
Name("RNFishjamClient")
|
|
77
|
-
|
|
78
|
-
Events(EmitableEvents.allEvents)
|
|
79
|
-
|
|
80
76
|
let rnFishjamClient: RNFishjamClient = {
|
|
81
77
|
let client = RNFishjamClient {
|
|
82
78
|
(eventName: String, data: [String: Any]) in
|
|
@@ -86,6 +82,34 @@ public class RNFishjamClientModule: Module {
|
|
|
86
82
|
return client
|
|
87
83
|
}()
|
|
88
84
|
|
|
85
|
+
Name("RNFishjamClient")
|
|
86
|
+
|
|
87
|
+
Events(EmitableEvents.allEvents)
|
|
88
|
+
|
|
89
|
+
Property("peerStatus") {
|
|
90
|
+
return rnFishjamClient.peerStatus.rawValue
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
Property("isMicrophoneOn") {
|
|
94
|
+
return rnFishjamClient.isMicrophoneOn
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
Property("isCameraOn") {
|
|
98
|
+
return rnFishjamClient.isCameraOn
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
Property("cameras") {
|
|
102
|
+
return rnFishjamClient.getCaptureDevices()
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
Property("isScreenShareOn") {
|
|
106
|
+
return rnFishjamClient.isScreenShareOn
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
Property("isAppScreenShareOn") {
|
|
110
|
+
return rnFishjamClient.isAppScreenShareOn
|
|
111
|
+
}
|
|
112
|
+
|
|
89
113
|
AsyncFunction("joinRoom") {
|
|
90
114
|
(
|
|
91
115
|
url: String, peerToken: String, peerMetadata: [String: Any], config: ConnectConfig,
|
|
@@ -101,19 +125,11 @@ public class RNFishjamClientModule: Module {
|
|
|
101
125
|
}
|
|
102
126
|
|
|
103
127
|
AsyncFunction("startCamera") { (config: CameraConfig) in
|
|
104
|
-
try rnFishjamClient.startCamera(config: config)
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
Property("isMicrophoneOn") {
|
|
108
|
-
return rnFishjamClient.isMicrophoneOn
|
|
128
|
+
try await rnFishjamClient.startCamera(config: config)
|
|
109
129
|
}
|
|
110
130
|
|
|
111
131
|
AsyncFunction("toggleMicrophone") {
|
|
112
|
-
try rnFishjamClient.toggleMicrophone()
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
Property("isCameraOn") {
|
|
116
|
-
return rnFishjamClient.isCameraOn
|
|
132
|
+
try await rnFishjamClient.toggleMicrophone()
|
|
117
133
|
}
|
|
118
134
|
|
|
119
135
|
AsyncFunction("toggleCamera") {
|
|
@@ -128,16 +144,12 @@ public class RNFishjamClientModule: Module {
|
|
|
128
144
|
try rnFishjamClient.switchCamera(cameraId: cameraId)
|
|
129
145
|
}
|
|
130
146
|
|
|
131
|
-
Property("cameras") {
|
|
132
|
-
rnFishjamClient.getCaptureDevices()
|
|
133
|
-
}
|
|
134
|
-
|
|
135
147
|
AsyncFunction("toggleScreenShare") { (screenShareOptions: ScreenShareOptions) in
|
|
136
148
|
try rnFishjamClient.toggleScreenShare(screenShareOptions: screenShareOptions)
|
|
137
149
|
}
|
|
138
150
|
|
|
139
|
-
|
|
140
|
-
|
|
151
|
+
AsyncFunction("toggleAppScreenShare") { (screenShareOptions: ScreenShareOptions) in
|
|
152
|
+
try rnFishjamClient.toggleAppScreenShare(screenShareOptions: screenShareOptions)
|
|
141
153
|
}
|
|
142
154
|
|
|
143
155
|
AsyncFunction("getPeers") {
|
|
@@ -209,9 +221,5 @@ public class RNFishjamClientModule: Module {
|
|
|
209
221
|
AsyncFunction("startAudioSwitcher") {
|
|
210
222
|
rnFishjamClient.startAudioSwitcher()
|
|
211
223
|
}
|
|
212
|
-
|
|
213
|
-
Property("peerStatus") {
|
|
214
|
-
return rnFishjamClient.peerStatus.rawValue
|
|
215
|
-
}
|
|
216
224
|
}
|
|
217
225
|
}
|