@fishjam-cloud/react-native-client 0.2.3 → 0.3.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/LICENSE +201 -0
- package/README.md +14 -401
- package/android/build.gradle +3 -3
- package/android/src/main/java/io/fishjam/reactnative/EmitableEvents.kt +25 -12
- package/android/src/main/java/io/fishjam/reactnative/Errors.kt +3 -2
- package/android/src/main/java/io/fishjam/reactnative/RNFishjamClient.kt +122 -105
- package/android/src/main/java/io/fishjam/reactnative/RNFishjamClientModule.kt +24 -33
- package/android/src/main/java/io/fishjam/reactnative/VideoPreviewView.kt +13 -3
- package/build/RNFishjamClientModule.d.ts +17 -15
- package/build/RNFishjamClientModule.d.ts.map +1 -1
- package/build/RNFishjamClientModule.js.map +1 -1
- package/build/common/client.d.ts +4 -4
- package/build/common/client.d.ts.map +1 -1
- package/build/common/client.js +5 -5
- package/build/common/client.js.map +1 -1
- package/build/common/metadata.d.ts +3 -3
- package/build/common/metadata.d.ts.map +1 -1
- package/build/common/metadata.js +4 -4
- package/build/common/metadata.js.map +1 -1
- package/build/common/webRTC.d.ts +0 -8
- package/build/common/webRTC.d.ts.map +1 -1
- package/build/common/webRTC.js +0 -9
- package/build/common/webRTC.js.map +1 -1
- package/build/components/VideoRendererView.d.ts +1 -1
- package/build/components/VideoRendererView.js +1 -1
- package/build/components/VideoRendererView.js.map +1 -1
- package/build/debug/common/webRTC.d.ts +9 -0
- package/build/debug/common/webRTC.d.ts.map +1 -0
- package/build/debug/common/webRTC.js +11 -0
- package/build/debug/common/webRTC.js.map +1 -0
- package/build/debug/index.d.ts +4 -0
- package/build/debug/index.d.ts.map +1 -0
- package/build/debug/index.js +3 -0
- package/build/debug/index.js.map +1 -0
- package/build/debug/stats/types.d.ts.map +1 -0
- package/build/debug/stats/types.js.map +1 -0
- package/build/debug/stats/useRTCStatistics.d.ts.map +1 -0
- package/build/{stats → debug/stats}/useRTCStatistics.js +1 -1
- package/build/debug/stats/useRTCStatistics.js.map +1 -0
- package/build/hooks/useCamera.d.ts +17 -0
- package/build/hooks/useCamera.d.ts.map +1 -1
- package/build/hooks/useCamera.js +1 -1
- package/build/hooks/useCamera.js.map +1 -1
- package/build/hooks/useFishjamEvent.d.ts +2 -1
- package/build/hooks/useFishjamEvent.d.ts.map +1 -1
- package/build/hooks/useFishjamEvent.js +2 -1
- package/build/hooks/useFishjamEvent.js.map +1 -1
- package/build/hooks/usePeerStatus.d.ts +19 -0
- package/build/hooks/usePeerStatus.d.ts.map +1 -0
- package/build/hooks/usePeerStatus.js +18 -0
- package/build/hooks/usePeerStatus.js.map +1 -0
- package/build/hooks/{useParticipants.d.ts → usePeers.d.ts} +11 -11
- package/build/hooks/usePeers.d.ts.map +1 -0
- package/build/hooks/usePeers.js +34 -0
- package/build/hooks/usePeers.js.map +1 -0
- package/build/hooks/useScreenShare.d.ts +57 -0
- package/build/hooks/useScreenShare.d.ts.map +1 -0
- package/build/hooks/useScreenShare.js +85 -0
- package/build/hooks/useScreenShare.js.map +1 -0
- package/build/index.d.ts +8 -7
- package/build/index.d.ts.map +1 -1
- package/build/index.js +4 -4
- package/build/index.js.map +1 -1
- package/debug/package.json +4 -0
- package/ios/Events.swift +29 -13
- package/ios/RNFishjamClient.podspec +1 -1
- package/ios/RNFishjamClient.swift +110 -107
- package/ios/RNFishjamClientModule.swift +22 -29
- package/ios/VideoPreviewView.swift +27 -9
- package/package.json +14 -11
- package/plugin/broadcastExtensionFiles/FishjamBroadcastSampleHandler.swift +1 -1
- package/plugin/build/withFishjamIos.js +3 -3
- package/build/hooks/useParticipants.d.ts.map +0 -1
- package/build/hooks/useParticipants.js +0 -34
- package/build/hooks/useParticipants.js.map +0 -1
- package/build/hooks/useScreencast.d.ts +0 -57
- package/build/hooks/useScreencast.d.ts.map +0 -1
- package/build/hooks/useScreencast.js +0 -85
- package/build/hooks/useScreencast.js.map +0 -1
- package/build/stats/types.d.ts.map +0 -1
- package/build/stats/types.js.map +0 -1
- package/build/stats/useRTCStatistics.d.ts.map +0 -1
- package/build/stats/useRTCStatistics.js.map +0 -1
- /package/build/{stats → debug/stats}/types.d.ts +0 -0
- /package/build/{stats → debug/stats}/types.js +0 -0
- /package/build/{stats → debug/stats}/useRTCStatistics.d.ts +0 -0
|
@@ -1,15 +1,28 @@
|
|
|
1
1
|
package io.fishjam.reactnative
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
3
|
+
@Suppress("ktlint:standard:enum-entry-name-case")
|
|
4
|
+
enum class PeerStatus {
|
|
5
|
+
connecting,
|
|
6
|
+
connected,
|
|
7
|
+
error,
|
|
8
|
+
idle
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
enum class EmitableEvents {
|
|
12
|
+
IsCameraOn,
|
|
13
|
+
IsMicrophoneOn,
|
|
14
|
+
IsScreenShareOn,
|
|
15
|
+
SimulcastConfigUpdate,
|
|
16
|
+
PeersUpdate,
|
|
17
|
+
AudioDeviceUpdate,
|
|
18
|
+
BandwidthEstimation,
|
|
19
|
+
ReconnectionRetriesLimitReached,
|
|
20
|
+
ReconnectionStarted,
|
|
21
|
+
Reconnected,
|
|
22
|
+
Warning,
|
|
23
|
+
PeerStatusChanged;
|
|
24
|
+
|
|
25
|
+
companion object {
|
|
26
|
+
val allEvents = EmitableEvents.entries.map { it.name }.toTypedArray()
|
|
27
|
+
}
|
|
15
28
|
}
|
|
@@ -11,7 +11,8 @@ class ConnectionError(
|
|
|
11
11
|
reason: AuthError
|
|
12
12
|
) : CodedException(message = "Connection error: ${reason.error}")
|
|
13
13
|
|
|
14
|
-
class
|
|
14
|
+
class MissingScreenSharePermission :
|
|
15
|
+
CodedException(message = "No permission to start screen share, call handleScreenSharePermission first.")
|
|
15
16
|
|
|
16
17
|
class ClientNotConnectedError : CodedException(message = "Client not connected to server yet. Make sure to call connect() first!")
|
|
17
18
|
|
|
@@ -19,7 +20,7 @@ class NoLocalVideoTrackError : CodedException(message = "No local video track. M
|
|
|
19
20
|
|
|
20
21
|
class NoLocalAudioTrackError : CodedException(message = "No local audio track. Make sure to call connect() first!")
|
|
21
22
|
|
|
22
|
-
class
|
|
23
|
+
class NoScreenShareTrackError : CodedException(message = "No local screen share track. Make sure to toggle screen share on first!")
|
|
23
24
|
|
|
24
25
|
class SocketClosedError(
|
|
25
26
|
code: Int,
|
|
@@ -8,7 +8,7 @@ import androidx.appcompat.app.AppCompatActivity
|
|
|
8
8
|
import com.fishjamcloud.client.FishjamClient
|
|
9
9
|
import com.fishjamcloud.client.FishjamClientListener
|
|
10
10
|
import com.fishjamcloud.client.media.LocalAudioTrack
|
|
11
|
-
import com.fishjamcloud.client.media.
|
|
11
|
+
import com.fishjamcloud.client.media.LocalScreenShareTrack
|
|
12
12
|
import com.fishjamcloud.client.media.LocalVideoTrack
|
|
13
13
|
import com.fishjamcloud.client.media.RemoteAudioTrack
|
|
14
14
|
import com.fishjamcloud.client.media.RemoteVideoTrack
|
|
@@ -36,26 +36,26 @@ import org.webrtc.Logging
|
|
|
36
36
|
class RNFishjamClient(
|
|
37
37
|
val sendEvent: (name: String, data: Map<String, Any?>) -> Unit
|
|
38
38
|
) : FishjamClientListener {
|
|
39
|
-
private val
|
|
39
|
+
private val SCREENSHARE_REQUEST = 1
|
|
40
40
|
|
|
41
41
|
var isMicrophoneOn = false
|
|
42
42
|
var isCameraOn = false
|
|
43
|
-
var
|
|
43
|
+
var isScreenShareOn = false
|
|
44
44
|
var isConnected = false
|
|
45
45
|
|
|
46
46
|
private var isCameraInitialized = false
|
|
47
47
|
|
|
48
48
|
private var connectPromise: Promise? = null
|
|
49
|
-
private var
|
|
49
|
+
private var screenSharePermissionPromise: Promise? = null
|
|
50
50
|
|
|
51
51
|
var videoSimulcastConfig: SimulcastConfig = SimulcastConfig()
|
|
52
52
|
private var localUserMetadata: Metadata = mutableMapOf()
|
|
53
53
|
|
|
54
|
-
var
|
|
55
|
-
var
|
|
56
|
-
var
|
|
54
|
+
var screenShareQuality: String? = null
|
|
55
|
+
var screenShareSimulcastConfig: SimulcastConfig = SimulcastConfig()
|
|
56
|
+
var screenShareMaxBandwidth: TrackBandwidthLimit = TrackBandwidthLimit.BandwidthLimit(0)
|
|
57
57
|
|
|
58
|
-
var
|
|
58
|
+
var screenShareMetadata: Map<String, Any> = mutableMapOf()
|
|
59
59
|
|
|
60
60
|
private var mediaProjectionIntent: Intent? = null
|
|
61
61
|
|
|
@@ -63,6 +63,13 @@ class RNFishjamClient(
|
|
|
63
63
|
|
|
64
64
|
var appContext: AppContext? = null
|
|
65
65
|
|
|
66
|
+
var peerStatus = PeerStatus.idle
|
|
67
|
+
private set(value) {
|
|
68
|
+
field = value
|
|
69
|
+
val event = EmitableEvents.PeerStatusChanged
|
|
70
|
+
emitEvent(event, mapOf(event.name to value))
|
|
71
|
+
}
|
|
72
|
+
|
|
66
73
|
interface OnTrackUpdateListener {
|
|
67
74
|
fun onTracksUpdate()
|
|
68
75
|
}
|
|
@@ -73,9 +80,14 @@ class RNFishjamClient(
|
|
|
73
80
|
suspend fun onLocalTrackSwitched()
|
|
74
81
|
}
|
|
75
82
|
|
|
83
|
+
interface OnLocalCameraTrackChangedListener {
|
|
84
|
+
fun onLocalCameraTrackChanged()
|
|
85
|
+
}
|
|
86
|
+
|
|
76
87
|
companion object {
|
|
77
88
|
var onTracksUpdateListeners: MutableList<OnTrackUpdateListener> = mutableListOf()
|
|
78
89
|
val onLocalTrackSwitchListener: MutableList<OnLocalTrackSwitchListener> = mutableListOf()
|
|
90
|
+
var localCameraTrackListeners: MutableList<OnLocalCameraTrackChangedListener> = mutableListOf()
|
|
79
91
|
lateinit var fishjamClient: FishjamClient
|
|
80
92
|
|
|
81
93
|
fun getAllPeers(): List<Peer> {
|
|
@@ -105,16 +117,16 @@ class RNFishjamClient(
|
|
|
105
117
|
data: Intent?
|
|
106
118
|
) {
|
|
107
119
|
coroutineScope.launch(Dispatchers.Main) {
|
|
108
|
-
if (requestCode !=
|
|
120
|
+
if (requestCode != SCREENSHARE_REQUEST) return@launch
|
|
109
121
|
if (resultCode != Activity.RESULT_OK) {
|
|
110
|
-
|
|
111
|
-
|
|
122
|
+
screenSharePermissionPromise?.resolve("denied")
|
|
123
|
+
screenSharePermissionPromise = null
|
|
112
124
|
return@launch
|
|
113
125
|
}
|
|
114
126
|
|
|
115
127
|
mediaProjectionIntent = data
|
|
116
|
-
|
|
117
|
-
|
|
128
|
+
screenSharePermissionPromise?.resolve("granted")
|
|
129
|
+
screenSharePermissionPromise = null
|
|
118
130
|
}
|
|
119
131
|
}
|
|
120
132
|
|
|
@@ -169,7 +181,7 @@ class RNFishjamClient(
|
|
|
169
181
|
}
|
|
170
182
|
videoParameters =
|
|
171
183
|
videoParameters.copy(
|
|
172
|
-
dimensions = if (createOptions.
|
|
184
|
+
dimensions = if (createOptions.flipDimensions) videoParameters.dimensions.flip() else videoParameters.dimensions,
|
|
173
185
|
simulcastConfig = getSimulcastConfigFromOptions(createOptions.simulcastConfig),
|
|
174
186
|
maxBitrate = videoMaxBandwidth
|
|
175
187
|
)
|
|
@@ -192,12 +204,12 @@ class RNFishjamClient(
|
|
|
192
204
|
.filterIsInstance<LocalAudioTrack>()
|
|
193
205
|
.firstOrNull()
|
|
194
206
|
|
|
195
|
-
private fun
|
|
207
|
+
private fun getLocalScreenShareTrack(): LocalScreenShareTrack? =
|
|
196
208
|
fishjamClient
|
|
197
209
|
.getLocalEndpoint()
|
|
198
210
|
.tracks
|
|
199
211
|
.values
|
|
200
|
-
.filterIsInstance<
|
|
212
|
+
.filterIsInstance<LocalScreenShareTrack>()
|
|
201
213
|
.firstOrNull()
|
|
202
214
|
|
|
203
215
|
private fun ensureConnected() {
|
|
@@ -218,9 +230,9 @@ class RNFishjamClient(
|
|
|
218
230
|
}
|
|
219
231
|
}
|
|
220
232
|
|
|
221
|
-
private fun
|
|
222
|
-
if (
|
|
223
|
-
throw
|
|
233
|
+
private fun ensureScreenShareTrack() {
|
|
234
|
+
if (getLocalScreenShareTrack() == null) {
|
|
235
|
+
throw NoScreenShareTrackError()
|
|
224
236
|
}
|
|
225
237
|
}
|
|
226
238
|
|
|
@@ -228,23 +240,25 @@ class RNFishjamClient(
|
|
|
228
240
|
CoroutineScope(Dispatchers.Main).launch {
|
|
229
241
|
connectPromise?.reject(ConnectionError(reason))
|
|
230
242
|
connectPromise = null
|
|
243
|
+
peerStatus = PeerStatus.error
|
|
231
244
|
}
|
|
232
245
|
}
|
|
233
246
|
|
|
234
247
|
fun joinRoom(
|
|
235
248
|
url: String,
|
|
236
|
-
|
|
237
|
-
|
|
249
|
+
peerToken: String,
|
|
250
|
+
peerMetadata: Map<String, Any>,
|
|
238
251
|
config: ConnectConfig,
|
|
239
252
|
promise: Promise
|
|
240
253
|
) {
|
|
254
|
+
peerStatus = PeerStatus.connecting
|
|
241
255
|
connectPromise = promise
|
|
242
|
-
localUserMetadata =
|
|
256
|
+
localUserMetadata = peerMetadata
|
|
243
257
|
fishjamClient.connect(
|
|
244
258
|
com.fishjamcloud.client.ConnectConfig(
|
|
245
259
|
url,
|
|
246
|
-
|
|
247
|
-
|
|
260
|
+
peerToken,
|
|
261
|
+
peerMetadata,
|
|
248
262
|
ReconnectConfig(
|
|
249
263
|
config.reconnectConfig.maxAttempts,
|
|
250
264
|
config.reconnectConfig.initialDelayMs,
|
|
@@ -255,15 +269,17 @@ class RNFishjamClient(
|
|
|
255
269
|
}
|
|
256
270
|
|
|
257
271
|
fun leaveRoom() {
|
|
258
|
-
if (
|
|
259
|
-
|
|
272
|
+
if (isScreenShareOn) {
|
|
273
|
+
stopScreenShare()
|
|
260
274
|
}
|
|
261
275
|
isMicrophoneOn = false
|
|
262
276
|
isCameraOn = false
|
|
263
|
-
|
|
277
|
+
isScreenShareOn = false
|
|
264
278
|
isConnected = false
|
|
265
279
|
isCameraInitialized = false
|
|
266
|
-
fishjamClient.leave
|
|
280
|
+
fishjamClient.leave {
|
|
281
|
+
emitEndpoints()
|
|
282
|
+
}
|
|
267
283
|
}
|
|
268
284
|
|
|
269
285
|
suspend fun startCamera(config: CameraConfig) {
|
|
@@ -293,9 +309,9 @@ class RNFishjamClient(
|
|
|
293
309
|
) {
|
|
294
310
|
cameraTrack.setEnabled(isEnabled)
|
|
295
311
|
isCameraOn = isEnabled
|
|
296
|
-
val
|
|
297
|
-
|
|
298
|
-
|
|
312
|
+
val event = EmitableEvents.IsCameraOn
|
|
313
|
+
emitEvent(event, mapOf(event.name to isEnabled))
|
|
314
|
+
localCameraTrackListeners.forEach { it.onLocalCameraTrackChanged() }
|
|
299
315
|
}
|
|
300
316
|
|
|
301
317
|
fun toggleCamera(): Boolean {
|
|
@@ -332,9 +348,8 @@ class RNFishjamClient(
|
|
|
332
348
|
) {
|
|
333
349
|
microphoneTrack.setEnabled(isEnabled)
|
|
334
350
|
isMicrophoneOn = isEnabled
|
|
335
|
-
val
|
|
336
|
-
|
|
337
|
-
emitEvent(eventName, isMicrophoneOnMap)
|
|
351
|
+
val event = EmitableEvents.IsMicrophoneOn
|
|
352
|
+
emitEvent(event, mapOf(event.name to isEnabled))
|
|
338
353
|
}
|
|
339
354
|
|
|
340
355
|
suspend fun toggleMicrophone(): Boolean {
|
|
@@ -346,9 +361,9 @@ class RNFishjamClient(
|
|
|
346
361
|
return isMicrophoneOn
|
|
347
362
|
}
|
|
348
363
|
|
|
349
|
-
fun
|
|
350
|
-
|
|
351
|
-
if (!
|
|
364
|
+
fun handleScreenSharePermission(promise: Promise) {
|
|
365
|
+
screenSharePermissionPromise = promise
|
|
366
|
+
if (!isScreenShareOn) {
|
|
352
367
|
ensureConnected()
|
|
353
368
|
val currentActivity = appContext?.currentActivity ?: throw ActivityNotFoundException()
|
|
354
369
|
|
|
@@ -357,25 +372,25 @@ class RNFishjamClient(
|
|
|
357
372
|
AppCompatActivity.MEDIA_PROJECTION_SERVICE
|
|
358
373
|
) as MediaProjectionManager
|
|
359
374
|
val intent = mediaProjectionManager.createScreenCaptureIntent()
|
|
360
|
-
currentActivity.startActivityForResult(intent,
|
|
375
|
+
currentActivity.startActivityForResult(intent, SCREENSHARE_REQUEST)
|
|
361
376
|
}
|
|
362
377
|
}
|
|
363
378
|
|
|
364
|
-
suspend fun
|
|
365
|
-
this.
|
|
366
|
-
this.
|
|
367
|
-
this.
|
|
368
|
-
getSimulcastConfigFromOptions(
|
|
369
|
-
this.
|
|
379
|
+
suspend fun toggleScreenShare(screenShareOptions: ScreenShareOptions) {
|
|
380
|
+
this.screenShareMetadata = screenShareOptions.screenShareMetadata
|
|
381
|
+
this.screenShareQuality = screenShareOptions.quality
|
|
382
|
+
this.screenShareSimulcastConfig =
|
|
383
|
+
getSimulcastConfigFromOptions(screenShareOptions.simulcastConfig)
|
|
384
|
+
this.screenShareMaxBandwidth =
|
|
370
385
|
getMaxBandwidthFromOptions(
|
|
371
|
-
|
|
372
|
-
|
|
386
|
+
screenShareOptions.maxBandwidthMap,
|
|
387
|
+
screenShareOptions.maxBandwidthInt
|
|
373
388
|
)
|
|
374
|
-
if (!
|
|
389
|
+
if (!isScreenShareOn) {
|
|
375
390
|
ensureConnected()
|
|
376
|
-
|
|
391
|
+
startScreenShare()
|
|
377
392
|
} else {
|
|
378
|
-
|
|
393
|
+
stopScreenShare()
|
|
379
394
|
}
|
|
380
395
|
}
|
|
381
396
|
|
|
@@ -413,7 +428,7 @@ class RNFishjamClient(
|
|
|
413
428
|
"metadata" to track.metadata
|
|
414
429
|
)
|
|
415
430
|
|
|
416
|
-
is
|
|
431
|
+
is LocalScreenShareTrack ->
|
|
417
432
|
mapOf(
|
|
418
433
|
"id" to track.id(),
|
|
419
434
|
"type" to "Video",
|
|
@@ -478,9 +493,9 @@ class RNFishjamClient(
|
|
|
478
493
|
}
|
|
479
494
|
}
|
|
480
495
|
|
|
481
|
-
fun
|
|
482
|
-
|
|
483
|
-
|
|
496
|
+
fun updateLocalScreenShareTrackMetadata(metadata: Metadata) {
|
|
497
|
+
ensureScreenShareTrack()
|
|
498
|
+
getLocalScreenShareTrack()?.let {
|
|
484
499
|
updateTrackMetadata(it.id(), metadata)
|
|
485
500
|
}
|
|
486
501
|
}
|
|
@@ -531,27 +546,27 @@ class RNFishjamClient(
|
|
|
531
546
|
)
|
|
532
547
|
}
|
|
533
548
|
|
|
534
|
-
fun
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
549
|
+
fun toggleScreenShareTrackEncoding(encoding: String): Map<String, Any> {
|
|
550
|
+
ensureScreenShareTrack()
|
|
551
|
+
getLocalScreenShareTrack()?.let {
|
|
552
|
+
screenShareSimulcastConfig = toggleTrackEncoding(encoding, it.id(), screenShareSimulcastConfig)
|
|
538
553
|
}
|
|
539
|
-
return getSimulcastConfigAsRNMap(
|
|
554
|
+
return getSimulcastConfigAsRNMap(screenShareSimulcastConfig)
|
|
540
555
|
}
|
|
541
556
|
|
|
542
|
-
fun
|
|
543
|
-
|
|
544
|
-
|
|
557
|
+
fun setScreenShareTrackBandwidth(bandwidth: Int) {
|
|
558
|
+
ensureScreenShareTrack()
|
|
559
|
+
getLocalScreenShareTrack()?.let {
|
|
545
560
|
fishjamClient.setTrackBandwidth(it.id(), TrackBandwidthLimit.BandwidthLimit(bandwidth))
|
|
546
561
|
}
|
|
547
562
|
}
|
|
548
563
|
|
|
549
|
-
fun
|
|
564
|
+
fun setScreenShareTrackEncodingBandwidth(
|
|
550
565
|
encoding: String,
|
|
551
566
|
bandwidth: Int
|
|
552
567
|
) {
|
|
553
|
-
|
|
554
|
-
|
|
568
|
+
ensureScreenShareTrack()
|
|
569
|
+
getLocalScreenShareTrack()?.let {
|
|
555
570
|
fishjamClient.setEncodingBandwidth(
|
|
556
571
|
it.id(),
|
|
557
572
|
encoding,
|
|
@@ -669,25 +684,25 @@ class RNFishjamClient(
|
|
|
669
684
|
return newMap
|
|
670
685
|
}
|
|
671
686
|
|
|
672
|
-
private suspend fun
|
|
673
|
-
val videoParameters =
|
|
687
|
+
private suspend fun startScreenShare() {
|
|
688
|
+
val videoParameters = getScreenShareVideoParameters()
|
|
674
689
|
if (mediaProjectionIntent == null) {
|
|
675
|
-
throw
|
|
690
|
+
throw MissingScreenSharePermission()
|
|
676
691
|
}
|
|
677
|
-
fishjamClient.
|
|
692
|
+
fishjamClient.createScreenShareTrack(
|
|
678
693
|
mediaProjectionIntent!!,
|
|
679
694
|
videoParameters,
|
|
680
|
-
|
|
695
|
+
screenShareMetadata
|
|
681
696
|
)
|
|
682
697
|
mediaProjectionIntent = null
|
|
683
698
|
|
|
684
|
-
|
|
699
|
+
setScreenShareTrackState(true)
|
|
685
700
|
emitEndpoints()
|
|
686
701
|
}
|
|
687
702
|
|
|
688
|
-
private fun
|
|
703
|
+
private fun getScreenShareVideoParameters(): VideoParameters {
|
|
689
704
|
val videoParameters =
|
|
690
|
-
when (
|
|
705
|
+
when (screenShareQuality) {
|
|
691
706
|
"VGA" -> VideoParameters.presetScreenShareVGA
|
|
692
707
|
"HD5" -> VideoParameters.presetScreenShareHD5
|
|
693
708
|
"HD15" -> VideoParameters.presetScreenShareHD15
|
|
@@ -698,48 +713,46 @@ class RNFishjamClient(
|
|
|
698
713
|
val dimensions = videoParameters.dimensions.flip()
|
|
699
714
|
return videoParameters.copy(
|
|
700
715
|
dimensions = dimensions,
|
|
701
|
-
simulcastConfig =
|
|
702
|
-
maxBitrate =
|
|
716
|
+
simulcastConfig = screenShareSimulcastConfig,
|
|
717
|
+
maxBitrate = screenShareMaxBandwidth
|
|
703
718
|
)
|
|
704
719
|
}
|
|
705
720
|
|
|
706
|
-
private fun
|
|
707
|
-
|
|
708
|
-
val
|
|
709
|
-
emitEvent(
|
|
721
|
+
private fun setScreenShareTrackState(isEnabled: Boolean) {
|
|
722
|
+
isScreenShareOn = isEnabled
|
|
723
|
+
val event = EmitableEvents.IsScreenShareOn
|
|
724
|
+
emitEvent(event, mapOf(event.name to isEnabled))
|
|
710
725
|
}
|
|
711
726
|
|
|
712
|
-
private fun
|
|
713
|
-
|
|
727
|
+
private fun stopScreenShare() {
|
|
728
|
+
ensureScreenShareTrack()
|
|
714
729
|
coroutineScope.launch {
|
|
715
|
-
val
|
|
730
|
+
val screenShareTrack =
|
|
716
731
|
fishjamClient.getLocalEndpoint().tracks.values.first { track ->
|
|
717
|
-
track is
|
|
718
|
-
} as?
|
|
719
|
-
if (
|
|
720
|
-
fishjamClient.removeTrack(
|
|
732
|
+
track is LocalScreenShareTrack
|
|
733
|
+
} as? LocalScreenShareTrack
|
|
734
|
+
if (screenShareTrack != null) {
|
|
735
|
+
fishjamClient.removeTrack(screenShareTrack.id())
|
|
721
736
|
}
|
|
722
|
-
|
|
737
|
+
setScreenShareTrackState(false)
|
|
723
738
|
emitEndpoints()
|
|
724
739
|
}
|
|
725
740
|
}
|
|
726
741
|
|
|
727
742
|
private fun emitEvent(
|
|
728
|
-
|
|
729
|
-
data: Map<String, Any?>
|
|
743
|
+
event: EmitableEvents,
|
|
744
|
+
data: Map<String, Any?> = mapOf()
|
|
730
745
|
) {
|
|
731
|
-
sendEvent(
|
|
746
|
+
sendEvent(event.name, data)
|
|
732
747
|
}
|
|
733
748
|
|
|
734
749
|
private fun emitWarning(warning: String) {
|
|
735
|
-
|
|
736
|
-
emitEvent(eventName, mapOf("message" to warning))
|
|
750
|
+
emitEvent(EmitableEvents.Warning, mapOf("message" to warning))
|
|
737
751
|
}
|
|
738
752
|
|
|
739
753
|
private fun emitEndpoints() {
|
|
740
|
-
val
|
|
741
|
-
|
|
742
|
-
emitEvent(eventName, map)
|
|
754
|
+
val event = EmitableEvents.PeersUpdate
|
|
755
|
+
emitEvent(event, mapOf(event.name to getPeers()))
|
|
743
756
|
}
|
|
744
757
|
|
|
745
758
|
private fun audioDeviceAsRNMap(audioDevice: AudioDevice): Map<String, String?> =
|
|
@@ -752,10 +765,11 @@ class RNFishjamClient(
|
|
|
752
765
|
audioDevices: List<AudioDevice>,
|
|
753
766
|
selectedDevice: AudioDevice?
|
|
754
767
|
) {
|
|
755
|
-
val
|
|
756
|
-
|
|
768
|
+
val event = EmitableEvents.AudioDeviceUpdate
|
|
769
|
+
emitEvent(
|
|
770
|
+
event,
|
|
757
771
|
mapOf(
|
|
758
|
-
|
|
772
|
+
event.name to
|
|
759
773
|
mapOf(
|
|
760
774
|
"selectedDevice" to (
|
|
761
775
|
if (selectedDevice != null) {
|
|
@@ -774,8 +788,7 @@ class RNFishjamClient(
|
|
|
774
788
|
}
|
|
775
789
|
)
|
|
776
790
|
)
|
|
777
|
-
|
|
778
|
-
emitEvent(eventName, map)
|
|
791
|
+
)
|
|
779
792
|
}
|
|
780
793
|
|
|
781
794
|
private fun getSimulcastConfigAsRNMap(simulcastConfig: SimulcastConfig): Map<String, Any> =
|
|
@@ -796,6 +809,7 @@ class RNFishjamClient(
|
|
|
796
809
|
connectPromise?.resolve(null)
|
|
797
810
|
connectPromise = null
|
|
798
811
|
emitEndpoints()
|
|
812
|
+
peerStatus = PeerStatus.connected
|
|
799
813
|
}
|
|
800
814
|
}
|
|
801
815
|
|
|
@@ -846,11 +860,13 @@ class RNFishjamClient(
|
|
|
846
860
|
override fun onPeerUpdated(peer: Peer) {}
|
|
847
861
|
|
|
848
862
|
override fun onBandwidthEstimationChanged(estimation: Long) {
|
|
849
|
-
val
|
|
850
|
-
emitEvent(
|
|
863
|
+
val event = EmitableEvents.BandwidthEstimation
|
|
864
|
+
emitEvent(event, mapOf(event.name to estimation.toFloat()))
|
|
851
865
|
}
|
|
852
866
|
|
|
853
|
-
override fun onDisconnected() {
|
|
867
|
+
override fun onDisconnected() {
|
|
868
|
+
peerStatus = PeerStatus.idle
|
|
869
|
+
}
|
|
854
870
|
|
|
855
871
|
override fun onSocketClose(
|
|
856
872
|
code: Int,
|
|
@@ -859,6 +875,7 @@ class RNFishjamClient(
|
|
|
859
875
|
CoroutineScope(Dispatchers.Main).launch {
|
|
860
876
|
connectPromise?.reject(SocketClosedError(code, reason))
|
|
861
877
|
connectPromise = null
|
|
878
|
+
peerStatus = PeerStatus.error
|
|
862
879
|
}
|
|
863
880
|
}
|
|
864
881
|
|
|
@@ -870,14 +887,14 @@ class RNFishjamClient(
|
|
|
870
887
|
}
|
|
871
888
|
|
|
872
889
|
override fun onReconnected() {
|
|
873
|
-
emitEvent(EmitableEvents.Reconnected
|
|
890
|
+
emitEvent(EmitableEvents.Reconnected)
|
|
874
891
|
}
|
|
875
892
|
|
|
876
893
|
override fun onReconnectionStarted() {
|
|
877
|
-
emitEvent(EmitableEvents.ReconnectionStarted
|
|
894
|
+
emitEvent(EmitableEvents.ReconnectionStarted)
|
|
878
895
|
}
|
|
879
896
|
|
|
880
897
|
override fun onReconnectionRetriesLimitReached() {
|
|
881
|
-
emitEvent(EmitableEvents.ReconnectionRetriesLimitReached
|
|
898
|
+
emitEvent(EmitableEvents.ReconnectionRetriesLimitReached)
|
|
882
899
|
}
|
|
883
900
|
}
|