@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.
Files changed (86) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +14 -401
  3. package/android/build.gradle +3 -3
  4. package/android/src/main/java/io/fishjam/reactnative/EmitableEvents.kt +25 -12
  5. package/android/src/main/java/io/fishjam/reactnative/Errors.kt +3 -2
  6. package/android/src/main/java/io/fishjam/reactnative/RNFishjamClient.kt +122 -105
  7. package/android/src/main/java/io/fishjam/reactnative/RNFishjamClientModule.kt +24 -33
  8. package/android/src/main/java/io/fishjam/reactnative/VideoPreviewView.kt +13 -3
  9. package/build/RNFishjamClientModule.d.ts +17 -15
  10. package/build/RNFishjamClientModule.d.ts.map +1 -1
  11. package/build/RNFishjamClientModule.js.map +1 -1
  12. package/build/common/client.d.ts +4 -4
  13. package/build/common/client.d.ts.map +1 -1
  14. package/build/common/client.js +5 -5
  15. package/build/common/client.js.map +1 -1
  16. package/build/common/metadata.d.ts +3 -3
  17. package/build/common/metadata.d.ts.map +1 -1
  18. package/build/common/metadata.js +4 -4
  19. package/build/common/metadata.js.map +1 -1
  20. package/build/common/webRTC.d.ts +0 -8
  21. package/build/common/webRTC.d.ts.map +1 -1
  22. package/build/common/webRTC.js +0 -9
  23. package/build/common/webRTC.js.map +1 -1
  24. package/build/components/VideoRendererView.d.ts +1 -1
  25. package/build/components/VideoRendererView.js +1 -1
  26. package/build/components/VideoRendererView.js.map +1 -1
  27. package/build/debug/common/webRTC.d.ts +9 -0
  28. package/build/debug/common/webRTC.d.ts.map +1 -0
  29. package/build/debug/common/webRTC.js +11 -0
  30. package/build/debug/common/webRTC.js.map +1 -0
  31. package/build/debug/index.d.ts +4 -0
  32. package/build/debug/index.d.ts.map +1 -0
  33. package/build/debug/index.js +3 -0
  34. package/build/debug/index.js.map +1 -0
  35. package/build/debug/stats/types.d.ts.map +1 -0
  36. package/build/debug/stats/types.js.map +1 -0
  37. package/build/debug/stats/useRTCStatistics.d.ts.map +1 -0
  38. package/build/{stats → debug/stats}/useRTCStatistics.js +1 -1
  39. package/build/debug/stats/useRTCStatistics.js.map +1 -0
  40. package/build/hooks/useCamera.d.ts +17 -0
  41. package/build/hooks/useCamera.d.ts.map +1 -1
  42. package/build/hooks/useCamera.js +1 -1
  43. package/build/hooks/useCamera.js.map +1 -1
  44. package/build/hooks/useFishjamEvent.d.ts +2 -1
  45. package/build/hooks/useFishjamEvent.d.ts.map +1 -1
  46. package/build/hooks/useFishjamEvent.js +2 -1
  47. package/build/hooks/useFishjamEvent.js.map +1 -1
  48. package/build/hooks/usePeerStatus.d.ts +19 -0
  49. package/build/hooks/usePeerStatus.d.ts.map +1 -0
  50. package/build/hooks/usePeerStatus.js +18 -0
  51. package/build/hooks/usePeerStatus.js.map +1 -0
  52. package/build/hooks/{useParticipants.d.ts → usePeers.d.ts} +11 -11
  53. package/build/hooks/usePeers.d.ts.map +1 -0
  54. package/build/hooks/usePeers.js +34 -0
  55. package/build/hooks/usePeers.js.map +1 -0
  56. package/build/hooks/useScreenShare.d.ts +57 -0
  57. package/build/hooks/useScreenShare.d.ts.map +1 -0
  58. package/build/hooks/useScreenShare.js +85 -0
  59. package/build/hooks/useScreenShare.js.map +1 -0
  60. package/build/index.d.ts +8 -7
  61. package/build/index.d.ts.map +1 -1
  62. package/build/index.js +4 -4
  63. package/build/index.js.map +1 -1
  64. package/debug/package.json +4 -0
  65. package/ios/Events.swift +29 -13
  66. package/ios/RNFishjamClient.podspec +1 -1
  67. package/ios/RNFishjamClient.swift +110 -107
  68. package/ios/RNFishjamClientModule.swift +22 -29
  69. package/ios/VideoPreviewView.swift +27 -9
  70. package/package.json +14 -11
  71. package/plugin/broadcastExtensionFiles/FishjamBroadcastSampleHandler.swift +1 -1
  72. package/plugin/build/withFishjamIos.js +3 -3
  73. package/build/hooks/useParticipants.d.ts.map +0 -1
  74. package/build/hooks/useParticipants.js +0 -34
  75. package/build/hooks/useParticipants.js.map +0 -1
  76. package/build/hooks/useScreencast.d.ts +0 -57
  77. package/build/hooks/useScreencast.d.ts.map +0 -1
  78. package/build/hooks/useScreencast.js +0 -85
  79. package/build/hooks/useScreencast.js.map +0 -1
  80. package/build/stats/types.d.ts.map +0 -1
  81. package/build/stats/types.js.map +0 -1
  82. package/build/stats/useRTCStatistics.d.ts.map +0 -1
  83. package/build/stats/useRTCStatistics.js.map +0 -1
  84. /package/build/{stats → debug/stats}/types.d.ts +0 -0
  85. /package/build/{stats → debug/stats}/types.js +0 -0
  86. /package/build/{stats → debug/stats}/useRTCStatistics.d.ts +0 -0
@@ -1,15 +1,28 @@
1
1
  package io.fishjam.reactnative
2
2
 
3
- object EmitableEvents {
4
- const val IsCameraOn = "IsCameraOn"
5
- const val IsMicrophoneOn = "IsMicrophoneOn"
6
- const val IsScreencastOn = "IsScreencastOn"
7
- const val SimulcastConfigUpdate = "SimulcastConfigUpdate"
8
- const val PeersUpdate = "PeersUpdate"
9
- const val AudioDeviceUpdate = "AudioDeviceUpdate"
10
- const val BandwidthEstimation = "BandwidthEstimation"
11
- const val ReconnectionRetriesLimitReached = "ReconnectionRetriesLimitReached"
12
- const val ReconnectionStarted = "ReconnectionStarted"
13
- const val Reconnected = "Reconnected"
14
- const val Warning = "Warning"
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 MissingScreencastPermission : CodedException(message = "No permission to start screencast, call handleScreencastPermission first.")
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 NoScreencastTrackError : CodedException(message = "No local screencast track. Make sure to toggle screencast on first!")
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.LocalScreencastTrack
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 SCREENCAST_REQUEST = 1
39
+ private val SCREENSHARE_REQUEST = 1
40
40
 
41
41
  var isMicrophoneOn = false
42
42
  var isCameraOn = false
43
- var isScreencastOn = false
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 screencastPermissionPromise: Promise? = null
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 screencastQuality: String? = null
55
- var screencastSimulcastConfig: SimulcastConfig = SimulcastConfig()
56
- var screencastMaxBandwidth: TrackBandwidthLimit = TrackBandwidthLimit.BandwidthLimit(0)
54
+ var screenShareQuality: String? = null
55
+ var screenShareSimulcastConfig: SimulcastConfig = SimulcastConfig()
56
+ var screenShareMaxBandwidth: TrackBandwidthLimit = TrackBandwidthLimit.BandwidthLimit(0)
57
57
 
58
- var screencastMetadata: Map<String, Any> = mutableMapOf()
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 != SCREENCAST_REQUEST) return@launch
120
+ if (requestCode != SCREENSHARE_REQUEST) return@launch
109
121
  if (resultCode != Activity.RESULT_OK) {
110
- screencastPermissionPromise?.resolve("denied")
111
- screencastPermissionPromise = null
122
+ screenSharePermissionPromise?.resolve("denied")
123
+ screenSharePermissionPromise = null
112
124
  return@launch
113
125
  }
114
126
 
115
127
  mediaProjectionIntent = data
116
- screencastPermissionPromise?.resolve("granted")
117
- screencastPermissionPromise = null
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.flipVideo) videoParameters.dimensions.flip() else videoParameters.dimensions,
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 getLocalScreencastTrack(): LocalScreencastTrack? =
207
+ private fun getLocalScreenShareTrack(): LocalScreenShareTrack? =
196
208
  fishjamClient
197
209
  .getLocalEndpoint()
198
210
  .tracks
199
211
  .values
200
- .filterIsInstance<LocalScreencastTrack>()
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 ensureScreencastTrack() {
222
- if (getLocalScreencastTrack() == null) {
223
- throw NoScreencastTrackError()
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
- participantToken: String,
237
- participantMetadata: Map<String, Any>,
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 = participantMetadata
256
+ localUserMetadata = peerMetadata
243
257
  fishjamClient.connect(
244
258
  com.fishjamcloud.client.ConnectConfig(
245
259
  url,
246
- participantToken,
247
- participantMetadata,
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 (isScreencastOn) {
259
- stopScreencast()
272
+ if (isScreenShareOn) {
273
+ stopScreenShare()
260
274
  }
261
275
  isMicrophoneOn = false
262
276
  isCameraOn = false
263
- isScreencastOn = false
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 eventName = EmitableEvents.IsCameraOn
297
- val isCameraOnMap = mapOf(eventName to isEnabled)
298
- emitEvent(eventName, isCameraOnMap)
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 eventName = EmitableEvents.IsMicrophoneOn
336
- val isMicrophoneOnMap = mapOf(eventName to isEnabled)
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 handleScreencastPermission(promise: Promise) {
350
- screencastPermissionPromise = promise
351
- if (!isScreencastOn) {
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, SCREENCAST_REQUEST)
375
+ currentActivity.startActivityForResult(intent, SCREENSHARE_REQUEST)
361
376
  }
362
377
  }
363
378
 
364
- suspend fun toggleScreencast(screencastOptions: ScreencastOptions) {
365
- this.screencastMetadata = screencastOptions.screencastMetadata
366
- this.screencastQuality = screencastOptions.quality
367
- this.screencastSimulcastConfig =
368
- getSimulcastConfigFromOptions(screencastOptions.simulcastConfig)
369
- this.screencastMaxBandwidth =
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
- screencastOptions.maxBandwidthMap,
372
- screencastOptions.maxBandwidthInt
386
+ screenShareOptions.maxBandwidthMap,
387
+ screenShareOptions.maxBandwidthInt
373
388
  )
374
- if (!isScreencastOn) {
389
+ if (!isScreenShareOn) {
375
390
  ensureConnected()
376
- startScreencast()
391
+ startScreenShare()
377
392
  } else {
378
- stopScreencast()
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 LocalScreencastTrack ->
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 updateLocalScreencastTrackMetadata(metadata: Metadata) {
482
- ensureScreencastTrack()
483
- getLocalScreencastTrack()?.let {
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 toggleScreencastTrackEncoding(encoding: String): Map<String, Any> {
535
- ensureScreencastTrack()
536
- getLocalScreencastTrack()?.let {
537
- screencastSimulcastConfig = toggleTrackEncoding(encoding, it.id(), screencastSimulcastConfig)
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(screencastSimulcastConfig)
554
+ return getSimulcastConfigAsRNMap(screenShareSimulcastConfig)
540
555
  }
541
556
 
542
- fun setScreencastTrackBandwidth(bandwidth: Int) {
543
- ensureScreencastTrack()
544
- getLocalScreencastTrack()?.let {
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 setScreencastTrackEncodingBandwidth(
564
+ fun setScreenShareTrackEncodingBandwidth(
550
565
  encoding: String,
551
566
  bandwidth: Int
552
567
  ) {
553
- ensureScreencastTrack()
554
- getLocalScreencastTrack()?.let {
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 startScreencast() {
673
- val videoParameters = getScreencastVideoParameters()
687
+ private suspend fun startScreenShare() {
688
+ val videoParameters = getScreenShareVideoParameters()
674
689
  if (mediaProjectionIntent == null) {
675
- throw MissingScreencastPermission()
690
+ throw MissingScreenSharePermission()
676
691
  }
677
- fishjamClient.createScreencastTrack(
692
+ fishjamClient.createScreenShareTrack(
678
693
  mediaProjectionIntent!!,
679
694
  videoParameters,
680
- screencastMetadata
695
+ screenShareMetadata
681
696
  )
682
697
  mediaProjectionIntent = null
683
698
 
684
- setScreencastTrackState(true)
699
+ setScreenShareTrackState(true)
685
700
  emitEndpoints()
686
701
  }
687
702
 
688
- private fun getScreencastVideoParameters(): VideoParameters {
703
+ private fun getScreenShareVideoParameters(): VideoParameters {
689
704
  val videoParameters =
690
- when (screencastQuality) {
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 = screencastSimulcastConfig,
702
- maxBitrate = screencastMaxBandwidth
716
+ simulcastConfig = screenShareSimulcastConfig,
717
+ maxBitrate = screenShareMaxBandwidth
703
718
  )
704
719
  }
705
720
 
706
- private fun setScreencastTrackState(isEnabled: Boolean) {
707
- isScreencastOn = isEnabled
708
- val eventName = EmitableEvents.IsScreencastOn
709
- emitEvent(eventName, mapOf(eventName to isEnabled))
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 stopScreencast() {
713
- ensureScreencastTrack()
727
+ private fun stopScreenShare() {
728
+ ensureScreenShareTrack()
714
729
  coroutineScope.launch {
715
- val screencastTrack =
730
+ val screenShareTrack =
716
731
  fishjamClient.getLocalEndpoint().tracks.values.first { track ->
717
- track is LocalScreencastTrack
718
- } as? LocalScreencastTrack
719
- if (screencastTrack != null) {
720
- fishjamClient.removeTrack(screencastTrack.id())
732
+ track is LocalScreenShareTrack
733
+ } as? LocalScreenShareTrack
734
+ if (screenShareTrack != null) {
735
+ fishjamClient.removeTrack(screenShareTrack.id())
721
736
  }
722
- setScreencastTrackState(false)
737
+ setScreenShareTrackState(false)
723
738
  emitEndpoints()
724
739
  }
725
740
  }
726
741
 
727
742
  private fun emitEvent(
728
- eventName: String,
729
- data: Map<String, Any?>
743
+ event: EmitableEvents,
744
+ data: Map<String, Any?> = mapOf()
730
745
  ) {
731
- sendEvent(eventName, data)
746
+ sendEvent(event.name, data)
732
747
  }
733
748
 
734
749
  private fun emitWarning(warning: String) {
735
- val eventName = EmitableEvents.Warning
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 eventName = EmitableEvents.PeersUpdate
741
- val map = mapOf(eventName to getPeers())
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 eventName = EmitableEvents.AudioDeviceUpdate
756
- val map =
768
+ val event = EmitableEvents.AudioDeviceUpdate
769
+ emitEvent(
770
+ event,
757
771
  mapOf(
758
- eventName to
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 eventName = EmitableEvents.BandwidthEstimation
850
- emitEvent(eventName, mapOf(eventName to estimation.toFloat()))
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, emptyMap())
890
+ emitEvent(EmitableEvents.Reconnected)
874
891
  }
875
892
 
876
893
  override fun onReconnectionStarted() {
877
- emitEvent(EmitableEvents.ReconnectionStarted, emptyMap())
894
+ emitEvent(EmitableEvents.ReconnectionStarted)
878
895
  }
879
896
 
880
897
  override fun onReconnectionRetriesLimitReached() {
881
- emitEvent(EmitableEvents.ReconnectionRetriesLimitReached, emptyMap())
898
+ emitEvent(EmitableEvents.ReconnectionRetriesLimitReached)
882
899
  }
883
900
  }