@fishjam-cloud/react-native-client 0.5.0 → 0.7.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 (124) hide show
  1. package/README.md +6 -6
  2. package/android/build.gradle +6 -2
  3. package/android/src/main/java/io/fishjam/reactnative/EmitableEvents.kt +17 -16
  4. package/android/src/main/java/io/fishjam/reactnative/RNFishjamClient.kt +64 -49
  5. package/android/src/main/java/io/fishjam/reactnative/RNFishjamClientModule.kt +16 -24
  6. package/build/RNFishjamClientModule.d.ts +44 -11
  7. package/build/RNFishjamClientModule.d.ts.map +1 -1
  8. package/build/RNFishjamClientModule.js +18 -4
  9. package/build/RNFishjamClientModule.js.map +1 -1
  10. package/build/common/client.d.ts +3 -8
  11. package/build/common/client.d.ts.map +1 -1
  12. package/build/common/client.js +2 -6
  13. package/build/common/client.js.map +1 -1
  14. package/build/common/metadata.d.ts +2 -1
  15. package/build/common/metadata.d.ts.map +1 -1
  16. package/build/common/metadata.js +2 -1
  17. package/build/common/metadata.js.map +1 -1
  18. package/build/components/FishjamRoom/index.d.ts +21 -0
  19. package/build/components/FishjamRoom/index.d.ts.map +1 -1
  20. package/build/components/FishjamRoom/index.js +16 -1
  21. package/build/components/FishjamRoom/index.js.map +1 -1
  22. package/build/components/FishjamRoom/parsePeersToTracks.d.ts.map +1 -1
  23. package/build/components/FishjamRoom/parsePeersToTracks.js +4 -6
  24. package/build/components/FishjamRoom/parsePeersToTracks.js.map +1 -1
  25. package/build/components/VideoPreviewView.d.ts +7 -3
  26. package/build/components/VideoPreviewView.d.ts.map +1 -1
  27. package/build/components/VideoPreviewView.js +5 -1
  28. package/build/components/VideoPreviewView.js.map +1 -1
  29. package/build/components/VideoRendererView.d.ts +13 -0
  30. package/build/components/VideoRendererView.d.ts.map +1 -1
  31. package/build/components/VideoRendererView.js +13 -0
  32. package/build/components/VideoRendererView.js.map +1 -1
  33. package/build/debug/stats/useRTCStatistics.d.ts.map +1 -1
  34. package/build/debug/stats/useRTCStatistics.js +13 -13
  35. package/build/debug/stats/useRTCStatistics.js.map +1 -1
  36. package/build/hooks/internal/useFishjamEvent.d.ts +4 -0
  37. package/build/hooks/internal/useFishjamEvent.d.ts.map +1 -0
  38. package/build/hooks/internal/useFishjamEvent.js +35 -0
  39. package/build/hooks/internal/useFishjamEvent.js.map +1 -0
  40. package/build/hooks/internal/useFishjamEventState.d.ts +3 -0
  41. package/build/hooks/internal/useFishjamEventState.d.ts.map +1 -0
  42. package/build/hooks/{useFishjamEventState.js → internal/useFishjamEventState.js} +3 -1
  43. package/build/hooks/internal/useFishjamEventState.js.map +1 -0
  44. package/build/hooks/useAppScreenShare.d.ts +9 -0
  45. package/build/hooks/useAppScreenShare.d.ts.map +1 -1
  46. package/build/hooks/useAppScreenShare.js +14 -14
  47. package/build/hooks/useAppScreenShare.js.map +1 -1
  48. package/build/hooks/useAudioSettings.d.ts +4 -0
  49. package/build/hooks/useAudioSettings.d.ts.map +1 -1
  50. package/build/hooks/useAudioSettings.js +8 -11
  51. package/build/hooks/useAudioSettings.js.map +1 -1
  52. package/build/hooks/useBandwidthEstimation.d.ts +3 -0
  53. package/build/hooks/useBandwidthEstimation.d.ts.map +1 -1
  54. package/build/hooks/useBandwidthEstimation.js +9 -5
  55. package/build/hooks/useBandwidthEstimation.js.map +1 -1
  56. package/build/hooks/useCamera.d.ts +11 -33
  57. package/build/hooks/useCamera.d.ts.map +1 -1
  58. package/build/hooks/useCamera.js +18 -68
  59. package/build/hooks/useCamera.js.map +1 -1
  60. package/build/hooks/useConnection.d.ts +58 -0
  61. package/build/hooks/useConnection.d.ts.map +1 -0
  62. package/build/hooks/useConnection.js +39 -0
  63. package/build/hooks/useConnection.js.map +1 -0
  64. package/build/hooks/useForegroundService.d.ts +20 -11
  65. package/build/hooks/useForegroundService.d.ts.map +1 -1
  66. package/build/hooks/useForegroundService.js +2 -3
  67. package/build/hooks/useForegroundService.js.map +1 -1
  68. package/build/hooks/useMicrophone.d.ts.map +1 -1
  69. package/build/hooks/useMicrophone.js +2 -3
  70. package/build/hooks/useMicrophone.js.map +1 -1
  71. package/build/hooks/usePeerStatus.d.ts +3 -12
  72. package/build/hooks/usePeerStatus.d.ts.map +1 -1
  73. package/build/hooks/usePeerStatus.js +5 -10
  74. package/build/hooks/usePeerStatus.js.map +1 -1
  75. package/build/hooks/usePeers.d.ts +19 -22
  76. package/build/hooks/usePeers.d.ts.map +1 -1
  77. package/build/hooks/usePeers.js +21 -20
  78. package/build/hooks/usePeers.js.map +1 -1
  79. package/build/hooks/useReconnection.d.ts +3 -3
  80. package/build/hooks/useReconnection.d.ts.map +1 -1
  81. package/build/hooks/useReconnection.js +5 -10
  82. package/build/hooks/useReconnection.js.map +1 -1
  83. package/build/hooks/useScreenShare.d.ts +2 -23
  84. package/build/hooks/useScreenShare.d.ts.map +1 -1
  85. package/build/hooks/useScreenShare.js +6 -45
  86. package/build/hooks/useScreenShare.js.map +1 -1
  87. package/build/hooks/useUpdatePeerMetadata.d.ts +15 -0
  88. package/build/hooks/useUpdatePeerMetadata.d.ts.map +1 -0
  89. package/build/hooks/useUpdatePeerMetadata.js +21 -0
  90. package/build/hooks/useUpdatePeerMetadata.js.map +1 -0
  91. package/build/index.d.ts +21 -16
  92. package/build/index.d.ts.map +1 -1
  93. package/build/index.js +15 -6
  94. package/build/index.js.map +1 -1
  95. package/build/types.d.ts +0 -19
  96. package/build/types.d.ts.map +1 -1
  97. package/build/types.js.map +1 -1
  98. package/build/utils/errorListener.d.ts.map +1 -1
  99. package/build/utils/errorListener.js +2 -3
  100. package/build/utils/errorListener.js.map +1 -1
  101. package/build/utils/eventPayloadValidator.d.ts +3 -0
  102. package/build/utils/eventPayloadValidator.d.ts.map +1 -0
  103. package/build/utils/eventPayloadValidator.js +94 -0
  104. package/build/utils/eventPayloadValidator.js.map +1 -0
  105. package/ios/Events.swift +8 -8
  106. package/ios/RNFishjamClient.podspec +1 -1
  107. package/ios/RNFishjamClient.swift +45 -48
  108. package/ios/RNFishjamClientModule.swift +13 -14
  109. package/ios/Utils.swift +0 -20
  110. package/package.json +21 -13
  111. package/plugin/build/withFishjamAndroid.js +18 -20
  112. package/plugin/build/withFishjamIos.js +116 -110
  113. package/build/common/webRTC.d.ts +0 -14
  114. package/build/common/webRTC.d.ts.map +0 -1
  115. package/build/common/webRTC.js +0 -15
  116. package/build/common/webRTC.js.map +0 -1
  117. package/build/hooks/useFishjamEvent.d.ts +0 -18
  118. package/build/hooks/useFishjamEvent.d.ts.map +0 -1
  119. package/build/hooks/useFishjamEvent.js +0 -27
  120. package/build/hooks/useFishjamEvent.js.map +0 -1
  121. package/build/hooks/useFishjamEventState.d.ts +0 -3
  122. package/build/hooks/useFishjamEventState.d.ts.map +0 -1
  123. package/build/hooks/useFishjamEventState.js.map +0 -1
  124. /package/{LICENSE → LICENSE.txt} +0 -0
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
- <img src="../../.github/images/fishjam-card.png" width="100%">
1
+ <img src="../../.github/images/fishjam-card.png" width="100%" />
2
2
 
3
- # Fishjam Cloud React Native client
3
+ # Fishjam React Native client
4
4
 
5
5
  `@fishjam-cloud/react-native-client` is an easiest way to add video streaming to your React Native app.
6
6
 
@@ -10,9 +10,9 @@ Check out the [installation](https://docs.fishjam.io/react-native/installation)
10
10
 
11
11
  # Documentation
12
12
 
13
- Check out our [documentation](https://docs.fishjam.io/) on how Fishjam Cloud work and how to integrate our service with your app.
13
+ Check out our [documentation](https://docs.fishjam.io/) on how Fishjam work and how to integrate our service with your app.
14
14
 
15
- There is also [API documentation](https://fishjam-cloud.github.io/mobile-client-sdk/modules/_fishjam_cloud_react_native_client.html) available.
15
+ There is also [API documentation](https://docs.fishjam.io/category/api) available.
16
16
 
17
17
  # Examples
18
18
 
@@ -20,9 +20,9 @@ There is simple example app, that allows you to test our service. To run it loca
20
20
 
21
21
  ## License
22
22
 
23
- Licensed under the [Apache License, Version 2.0](LICENSE)
23
+ Licensed under the [Apache License, Version 2.0](./LICENSE.txt)
24
24
 
25
- ## Fishjam Cloud is created by Software Mansion
25
+ ## Fishjam is created by Software Mansion
26
26
 
27
27
  Since 2012 [Software Mansion](https://swmansion.com) is a software agency with experience in building web and mobile apps. We are Core React Native Contributors and experts in dealing with all kinds of React Native issues. We can help you build your next dream product – [Hire us](https://swmansion.com/contact/projects?utm_source=fishjam&utm_medium=mobile-readme).
28
28
 
@@ -1,8 +1,12 @@
1
+ import groovy.json.JsonSlurper
2
+
1
3
  apply plugin: 'com.android.library'
2
4
  apply plugin: 'kotlin-android'
3
5
  apply plugin: 'maven-publish'
4
6
 
5
- def packageVersion = '0.5.0'
7
+ def inputFile = new File("$projectDir/../../../package.json")
8
+ def packageJson = new JsonSlurper().parseText(inputFile.text)
9
+ def packageVersion = packageJson["version"]
6
10
 
7
11
  group = 'io.fishjam.reactnative'
8
12
  version = "${packageVersion}"
@@ -63,6 +67,7 @@ android {
63
67
  versionCode 1
64
68
  versionName "${packageVersion}"
65
69
  }
70
+
66
71
  lintOptions {
67
72
  abortOnError false
68
73
  }
@@ -83,7 +88,6 @@ dependencies {
83
88
  if (findProject(':fishjam-cloud-android-client')) {
84
89
  implementation project(':fishjam-cloud-android-client')
85
90
  } else {
86
- // update version number when releasing
87
91
  implementation "com.github.fishjam-cloud:mobile-client-sdk:${packageVersion}"
88
92
  }
89
93
  implementation 'com.twilio:audioswitch:1.2.0'
@@ -1,15 +1,17 @@
1
1
  package io.fishjam.reactnative
2
2
 
3
+ import com.fishjamcloud.client.ReconnectionStatus
3
4
  import com.fishjamcloud.client.models.SimulcastConfig
4
5
  import com.twilio.audioswitch.AudioDevice
5
6
  import io.fishjam.reactnative.extensions.LocalCamera
6
7
 
7
- @Suppress("ktlint:standard:enum-entry-name-case")
8
- enum class PeerStatus {
9
- connecting,
10
- connected,
11
- error,
12
- idle
8
+ enum class PeerStatus(
9
+ val status: String
10
+ ) {
11
+ Connecting("connecting"),
12
+ Connected("connected"),
13
+ Idle("idle"),
14
+ Error("error")
13
15
  }
14
16
 
15
17
  class EmitableEvent private constructor(
@@ -23,11 +25,9 @@ class EmitableEvent private constructor(
23
25
  PeersUpdate,
24
26
  AudioDeviceUpdate,
25
27
  BandwidthEstimation,
26
- ReconnectionRetriesLimitReached,
27
- ReconnectionStarted,
28
- Reconnected,
29
28
  Warning,
30
29
  PeerStatusChanged,
30
+ ReconnectionStatusChanged,
31
31
  CurrentCameraChanged
32
32
  }
33
33
 
@@ -38,10 +38,6 @@ class EmitableEvent private constructor(
38
38
  get() = mapOf(event.name to eventContent)
39
39
 
40
40
  companion object {
41
- val reconnectionRetriesLimitReached = EmitableEvent(EventName.ReconnectionRetriesLimitReached)
42
- val reconnectionStarted = EmitableEvent(EventName.ReconnectionStarted)
43
- val reconnected = EmitableEvent(EventName.Reconnected)
44
-
45
41
  fun isMicrophoneOn(enabled: Boolean) = EmitableEvent(EventName.IsMicrophoneOn, enabled)
46
42
 
47
43
  fun isScreenShareOn(enabled: Boolean) = EmitableEvent(EventName.IsScreenShareOn, enabled)
@@ -50,16 +46,21 @@ class EmitableEvent private constructor(
50
46
 
51
47
  fun warning(message: String) = EmitableEvent(EventName.Warning, message)
52
48
 
53
- fun peerStatusChanged(peerStatus: PeerStatus) = EmitableEvent(EventName.PeerStatusChanged, peerStatus.name)
49
+ fun peerStatusChanged(peerStatus: PeerStatus) = EmitableEvent(EventName.PeerStatusChanged, peerStatus.status)
50
+
51
+ fun reconnectionStatusChanged(reconnectionStatus: ReconnectionStatus) =
52
+ EmitableEvent(EventName.ReconnectionStatusChanged, reconnectionStatus.status)
54
53
 
55
54
  fun currentCameraChanged(
56
55
  localCamera: LocalCamera?,
57
- isCameraOn: Boolean
56
+ isCameraOn: Boolean,
57
+ isCameraInitialized: Boolean
58
58
  ) = EmitableEvent(
59
59
  EventName.CurrentCameraChanged,
60
60
  mapOf(
61
61
  "currentCamera" to localCamera,
62
- "isCameraOn" to isCameraOn
62
+ "isCameraOn" to isCameraOn,
63
+ "isCameraInitialized" to isCameraInitialized
63
64
  )
64
65
  )
65
66
 
@@ -7,6 +7,7 @@ import android.media.projection.MediaProjectionManager
7
7
  import androidx.appcompat.app.AppCompatActivity
8
8
  import com.fishjamcloud.client.FishjamClient
9
9
  import com.fishjamcloud.client.FishjamClientListener
10
+ import com.fishjamcloud.client.ReconnectionStatus
10
11
  import com.fishjamcloud.client.media.CaptureDevice
11
12
  import com.fishjamcloud.client.media.CaptureDeviceChangedListener
12
13
  import com.fishjamcloud.client.media.LocalAudioTrack
@@ -24,11 +25,13 @@ import com.fishjamcloud.client.models.RTCOutboundStats
24
25
  import com.fishjamcloud.client.models.ReconnectConfig
25
26
  import com.fishjamcloud.client.models.SimulcastConfig
26
27
  import com.fishjamcloud.client.models.TrackBandwidthLimit
28
+ import com.fishjamcloud.client.models.TrackEncoding
27
29
  import com.fishjamcloud.client.models.VideoParameters
28
30
  import com.twilio.audioswitch.AudioDevice
29
31
  import expo.modules.kotlin.AppContext
30
32
  import expo.modules.kotlin.Promise
31
33
  import expo.modules.kotlin.exception.CodedException
34
+ import fishjam.media_events.server.Server
32
35
  import io.fishjam.reactnative.extensions.toLocalCamera
33
36
  import io.fishjam.reactnative.foregroundService.ForegroundServiceManager
34
37
  import io.fishjam.reactnative.managers.LocalCameraTracksChangedListenersManager
@@ -52,7 +55,17 @@ class RNFishjamClient(
52
55
  var isScreenShareOn = false
53
56
  var isConnected = false
54
57
 
55
- private var isCameraInitialized = false
58
+ var isCameraInitialized = false
59
+ private set(value) {
60
+ field = value
61
+ emitEvent(
62
+ EmitableEvent.currentCameraChanged(
63
+ getCurrentCaptureDevice(),
64
+ isCameraOn,
65
+ value
66
+ )
67
+ )
68
+ }
56
69
 
57
70
  private var connectPromise: Promise? = null
58
71
  private var screenSharePermissionPromise: Promise? = null
@@ -62,7 +75,6 @@ class RNFishjamClient(
62
75
 
63
76
  var screenShareQuality: String? = null
64
77
  var screenShareSimulcastConfig: SimulcastConfig = SimulcastConfig()
65
- var screenShareMaxBandwidth: TrackBandwidthLimit = TrackBandwidthLimit.BandwidthLimit(0)
66
78
 
67
79
  var screenShareMetadata: Map<String, Any> = mutableMapOf()
68
80
 
@@ -72,12 +84,18 @@ class RNFishjamClient(
72
84
 
73
85
  var appContext: AppContext? = null
74
86
 
75
- var peerStatus = PeerStatus.idle
87
+ var peerStatus = PeerStatus.Idle
76
88
  private set(value) {
77
89
  field = value
78
90
  emitEvent(EmitableEvent.peerStatusChanged(value))
79
91
  }
80
92
 
93
+ var reconnectionStatus = ReconnectionStatus.Idle
94
+ private set(value) {
95
+ field = value
96
+ emitEvent(EmitableEvent.reconnectionStatusChanged(value))
97
+ }
98
+
81
99
  private val foregroundServiceManager by lazy {
82
100
  ForegroundServiceManager(appContext ?: throw CodedException("appContext not found"))
83
101
  }
@@ -133,27 +151,13 @@ class RNFishjamClient(
133
151
 
134
152
  private fun getSimulcastConfigFromOptions(simulcastConfigMap: io.fishjam.reactnative.SimulcastConfig): SimulcastConfig {
135
153
  val simulcastEnabled = simulcastConfigMap.enabled
136
- val activeEncodings = simulcastConfigMap.activeEncodings.map { e -> e.toTrackEncoding() }
154
+ val activeEncodings = listOf(TrackEncoding.L, TrackEncoding.M, TrackEncoding.H)
137
155
  return SimulcastConfig(
138
156
  enabled = simulcastEnabled,
139
157
  activeEncodings = activeEncodings
140
158
  )
141
159
  }
142
160
 
143
- private fun getMaxBandwidthFromOptions(
144
- maxBandwidthMap: Map<String, Int>?,
145
- maxBandwidthInt: Int
146
- ): TrackBandwidthLimit {
147
- if (maxBandwidthMap != null) {
148
- val maxBandwidthSimulcast = mutableMapOf<String, TrackBandwidthLimit.BandwidthLimit>()
149
- maxBandwidthMap.forEach {
150
- maxBandwidthSimulcast[it.key] = TrackBandwidthLimit.BandwidthLimit(it.value)
151
- }
152
- return TrackBandwidthLimit.SimulcastBandwidthLimit(maxBandwidthSimulcast)
153
- }
154
- return TrackBandwidthLimit.BandwidthLimit(maxBandwidthInt)
155
- }
156
-
157
161
  private fun create() {
158
162
  audioSwitchManager = AudioSwitchManager(appContext?.reactContext!!)
159
163
  fishjamClient =
@@ -164,8 +168,6 @@ class RNFishjamClient(
164
168
  }
165
169
 
166
170
  private fun getVideoParametersFromOptions(createOptions: CameraConfig): VideoParameters {
167
- val videoMaxBandwidth =
168
- getMaxBandwidthFromOptions(createOptions.maxBandwidthMap, createOptions.maxBandwidthInt)
169
171
  var videoParameters =
170
172
  when (createOptions.quality) {
171
173
  "QVGA169" -> VideoParameters.presetQVGA169
@@ -184,7 +186,7 @@ class RNFishjamClient(
184
186
  videoParameters.copy(
185
187
  dimensions = if (createOptions.flipDimensions) videoParameters.dimensions.flip() else videoParameters.dimensions,
186
188
  simulcastConfig = getSimulcastConfigFromOptions(createOptions.simulcastConfig),
187
- maxBitrate = videoMaxBandwidth
189
+ maxBitrate = videoParameters.maxBitrate
188
190
  )
189
191
  return videoParameters
190
192
  }
@@ -241,7 +243,7 @@ class RNFishjamClient(
241
243
  CoroutineScope(Dispatchers.Main).launch {
242
244
  connectPromise?.reject(ConnectionError(reason))
243
245
  connectPromise = null
244
- peerStatus = PeerStatus.error
246
+ peerStatus = PeerStatus.Error
245
247
  }
246
248
  }
247
249
 
@@ -252,7 +254,7 @@ class RNFishjamClient(
252
254
  config: ConnectConfig,
253
255
  promise: Promise
254
256
  ) {
255
- peerStatus = PeerStatus.connecting
257
+ peerStatus = PeerStatus.Connecting
256
258
  connectPromise = promise
257
259
  localUserMetadata = mapOf("server" to emptyMap(), "peer" to peerMetadata)
258
260
  fishjamClient.connect(
@@ -285,7 +287,6 @@ class RNFishjamClient(
285
287
 
286
288
  suspend fun startCamera(config: CameraConfig): Boolean {
287
289
  if (isCameraInitialized) {
288
- emitEvent(EmitableEvent.warning("Camera already started. You may only call startCamera once before leaveRoom is called."))
289
290
  return true
290
291
  }
291
292
  if (!PermissionUtils.requestCameraPermission(appContext)) {
@@ -317,7 +318,13 @@ class RNFishjamClient(
317
318
  ) {
318
319
  cameraTrack.setEnabled(isEnabled)
319
320
  isCameraOn = isEnabled
320
- emitEvent(EmitableEvent.currentCameraChanged(cameraTrack.getCaptureDevice()?.toLocalCamera(), isEnabled))
321
+ emitEvent(
322
+ EmitableEvent.currentCameraChanged(
323
+ cameraTrack.getCaptureDevice()?.toLocalCamera(),
324
+ isEnabled,
325
+ isCameraInitialized
326
+ )
327
+ )
321
328
  localCameraTracksChangedListenersManager.notifyListeners()
322
329
  }
323
330
 
@@ -347,7 +354,7 @@ class RNFishjamClient(
347
354
  return
348
355
  }
349
356
 
350
- val microphoneTrack = fishjamClient.createAudioTrack(emptyMap())
357
+ val microphoneTrack = fishjamClient.createAudioTrack(getMicrophoneTrackMetadata())
351
358
  setMicrophoneTrackState(microphoneTrack, true)
352
359
  emitEndpoints()
353
360
  }
@@ -368,17 +375,18 @@ class RNFishjamClient(
368
375
  getLocalAudioTrack()?.let { setMicrophoneTrackState(it, !isMicrophoneOn) }
369
376
  }
370
377
 
371
- updateLocalAudioTrackMetadata(
372
- mapOf(
373
- "active" to isMicrophoneOn,
374
- "paused" to !isMicrophoneOn, // TODO: FCE-711,
375
- "type" to "microphone"
376
- )
377
- )
378
+ updateLocalAudioTrackMetadata(getMicrophoneTrackMetadata())
378
379
 
379
380
  return isMicrophoneOn
380
381
  }
381
382
 
383
+ private fun getMicrophoneTrackMetadata(): Map<String, Any> =
384
+ mapOf(
385
+ "active" to isMicrophoneOn,
386
+ "paused" to !isMicrophoneOn, // TODO: FCE-711,
387
+ "type" to "microphone"
388
+ )
389
+
382
390
  fun handleScreenSharePermission(promise: Promise) {
383
391
  screenSharePermissionPromise = promise
384
392
  if (!isScreenShareOn) {
@@ -408,11 +416,6 @@ class RNFishjamClient(
408
416
  this.screenShareQuality = screenShareOptions.quality
409
417
  this.screenShareSimulcastConfig =
410
418
  getSimulcastConfigFromOptions(screenShareOptions.simulcastConfig)
411
- this.screenShareMaxBandwidth =
412
- getMaxBandwidthFromOptions(
413
- screenShareOptions.maxBandwidthMap,
414
- screenShareOptions.maxBandwidthInt
415
- )
416
419
 
417
420
  if (!isScreenShareOn) {
418
421
  ensureConnected()
@@ -445,7 +448,11 @@ class RNFishjamClient(
445
448
  "id" to track.id(),
446
449
  "type" to "Audio",
447
450
  "metadata" to track.metadata,
448
- "vadStatus" to track.vadStatus.value
451
+ "vadStatus" to
452
+ when (track.vadStatus) {
453
+ Server.MediaEvent.VadNotification.Status.STATUS_SPEECH -> "speech"
454
+ else -> "silence"
455
+ }
449
456
  )
450
457
 
451
458
  is LocalVideoTrack ->
@@ -692,9 +699,10 @@ class RNFishjamClient(
692
699
  return res
693
700
  }
694
701
 
695
- fun getStatistics(): MutableMap<String, Map<String, Any?>> {
702
+ suspend fun getStatistics(): Map<String, Map<String, Any?>> {
696
703
  val newMap = mutableMapOf<String, Map<String, Any?>>()
697
- fishjamClient.getStats().forEach { entry ->
704
+ val stats = fishjamClient.getStats()
705
+ stats.forEach { entry ->
698
706
  newMap[entry.key] =
699
707
  if (entry.value is RTCInboundStats) {
700
708
  rtcInboundStatsToRNMap(
@@ -741,7 +749,7 @@ class RNFishjamClient(
741
749
  return videoParameters.copy(
742
750
  dimensions = dimensions,
743
751
  simulcastConfig = screenShareSimulcastConfig,
744
- maxBitrate = screenShareMaxBandwidth
752
+ maxBitrate = videoParameters.maxBitrate
745
753
  )
746
754
  }
747
755
 
@@ -802,7 +810,7 @@ class RNFishjamClient(
802
810
  connectPromise?.resolve(null)
803
811
  connectPromise = null
804
812
  emitEndpoints()
805
- peerStatus = PeerStatus.connected
813
+ peerStatus = PeerStatus.Connected
806
814
  }
807
815
  }
808
816
 
@@ -857,7 +865,7 @@ class RNFishjamClient(
857
865
  }
858
866
 
859
867
  override fun onDisconnected() {
860
- peerStatus = PeerStatus.idle
868
+ peerStatus = PeerStatus.Idle
861
869
  }
862
870
 
863
871
  override fun onSocketClose(
@@ -867,7 +875,7 @@ class RNFishjamClient(
867
875
  CoroutineScope(Dispatchers.Main).launch {
868
876
  connectPromise?.reject(SocketClosedError(code, reason))
869
877
  connectPromise = null
870
- peerStatus = PeerStatus.error
878
+ peerStatus = PeerStatus.Idle
871
879
  }
872
880
  }
873
881
 
@@ -875,22 +883,29 @@ class RNFishjamClient(
875
883
  CoroutineScope(Dispatchers.Main).launch {
876
884
  connectPromise?.reject(SocketError(t.message ?: t.toString()))
877
885
  connectPromise = null
886
+ peerStatus = PeerStatus.Error
878
887
  }
879
888
  }
880
889
 
881
890
  override fun onReconnected() {
882
- emitEvent(EmitableEvent.reconnected)
891
+ reconnectionStatus = ReconnectionStatus.Reconnecting
883
892
  }
884
893
 
885
894
  override fun onReconnectionStarted() {
886
- emitEvent(EmitableEvent.reconnectionStarted)
895
+ reconnectionStatus = ReconnectionStatus.Idle
887
896
  }
888
897
 
889
898
  override fun onReconnectionRetriesLimitReached() {
890
- emitEvent(EmitableEvent.reconnectionRetriesLimitReached)
899
+ reconnectionStatus = ReconnectionStatus.Error
891
900
  }
892
901
 
893
902
  override fun onCaptureDeviceChanged(captureDevice: CaptureDevice?) {
894
- emitEvent(EmitableEvent.currentCameraChanged(captureDevice?.toLocalCamera(), isCameraOn))
903
+ emitEvent(
904
+ EmitableEvent.currentCameraChanged(
905
+ captureDevice?.toLocalCamera(),
906
+ isCameraOn,
907
+ isCameraInitialized
908
+ )
909
+ )
895
910
  }
896
911
  }
@@ -16,9 +16,6 @@ import kotlinx.coroutines.withContext
16
16
  class SimulcastConfig : Record {
17
17
  @Field
18
18
  val enabled: Boolean = false
19
-
20
- @Field
21
- val activeEncodings: List<String> = emptyList()
22
19
  }
23
20
 
24
21
  class CameraConfig : Record {
@@ -34,13 +31,6 @@ class CameraConfig : Record {
34
31
  @Field
35
32
  val simulcastConfig: SimulcastConfig = SimulcastConfig()
36
33
 
37
- // expo-modules on Android don't support Either type
38
- @Field
39
- val maxBandwidthMap: Map<String, Int> = emptyMap()
40
-
41
- @Field
42
- val maxBandwidthInt: Int = 0
43
-
44
34
  @Field
45
35
  val cameraEnabled: Boolean = true
46
36
 
@@ -57,12 +47,6 @@ class ScreenShareOptions : Record {
57
47
 
58
48
  @Field
59
49
  val simulcastConfig: SimulcastConfig = SimulcastConfig()
60
-
61
- @Field
62
- val maxBandwidthMap: Map<String, Int> = emptyMap()
63
-
64
- @Field
65
- val maxBandwidthInt: Int = 0
66
50
  }
67
51
 
68
52
  class ReconnectConfig : Record {
@@ -152,7 +136,19 @@ class RNFishjamClientModule : Module() {
152
136
  }
153
137
 
154
138
  Property("peerStatus") {
155
- return@Property rnFishjamClient.peerStatus
139
+ return@Property rnFishjamClient.peerStatus.status
140
+ }
141
+
142
+ Property("reconnectionStatus") {
143
+ return@Property rnFishjamClient.reconnectionStatus.status
144
+ }
145
+
146
+ Property("isCameraInitialized") {
147
+ return@Property rnFishjamClient.isCameraInitialized
148
+ }
149
+
150
+ Function("getPeers") {
151
+ return@Function rnFishjamClient.getPeers()
156
152
  }
157
153
 
158
154
  AsyncFunction(
@@ -215,12 +211,6 @@ class RNFishjamClientModule : Module() {
215
211
  }
216
212
  }
217
213
 
218
- AsyncFunction("getPeers") Coroutine { ->
219
- withContext(Dispatchers.Main) {
220
- rnFishjamClient.getPeers()
221
- }
222
- }
223
-
224
214
  AsyncFunction("updatePeerMetadata") Coroutine { metadata: Map<String, Any> ->
225
215
  withContext(Dispatchers.Main) {
226
216
  rnFishjamClient.updatePeerMetadata(metadata)
@@ -299,7 +289,9 @@ class RNFishjamClientModule : Module() {
299
289
  }
300
290
  }
301
291
 
302
- AsyncFunction("getStatistics") { rnFishjamClient.getStatistics() }
292
+ AsyncFunction("getStatistics") Coroutine { ->
293
+ return@Coroutine rnFishjamClient.getStatistics()
294
+ }
303
295
 
304
296
  AsyncFunction("startForegroundService") Coroutine { config: ForegroundServiceConfig ->
305
297
  rnFishjamClient.startForegroundService(config)
@@ -1,15 +1,15 @@
1
- import { EventEmitter } from 'expo-modules-core';
2
- import { NativeModule } from 'react-native';
1
+ import type { NativeModule } from 'expo-modules-core/types';
2
+ import type { ConnectionConfig } from './common/client';
3
3
  import type { RTCStats } from './debug/stats/types';
4
- import type { GenericMetadata, SimulcastConfig } from './types';
5
- import type { CameraConfigInternal, Camera } from './hooks/useCamera';
4
+ import type { OnAudioDeviceEvent } from './hooks/useAudioSettings';
5
+ import type { Camera, CameraConfigInternal, CurrentCameraChangedType } from './hooks/useCamera';
6
+ import type { PeerStatus, ReconnectionStatus } from './hooks/useConnection';
7
+ import type { ForegroundServiceConfig } from './hooks/useForegroundService';
6
8
  import type { Peer } from './hooks/usePeers';
7
9
  import type { ScreenShareOptionsInternal } from './hooks/useScreenShare';
8
- import type { ConnectionConfig } from './common/client';
9
- import { PeerStatus } from './hooks/usePeerStatus';
10
- import { ForegroundServiceConfig } from './hooks/useForegroundService';
10
+ import type { GenericMetadata, SimulcastConfig } from './types';
11
11
  type Metadata = {
12
- [key: string]: any;
12
+ [key: string]: unknown;
13
13
  };
14
14
  type RNFishjamClient = {
15
15
  isMicrophoneOn: boolean;
@@ -19,6 +19,9 @@ type RNFishjamClient = {
19
19
  cameras: ReadonlyArray<Camera>;
20
20
  currentCamera: Camera | null;
21
21
  peerStatus: PeerStatus;
22
+ reconnectionStatus: ReconnectionStatus;
23
+ isCameraInitialized: boolean;
24
+ getPeers: <PeerMetadataType extends Metadata, ServerMetadata extends Metadata = GenericMetadata>() => Peer<PeerMetadataType, ServerMetadata>[];
22
25
  joinRoom: (url: string, peerToken: string, peerMetadata: Metadata, config: ConnectionConfig) => Promise<void>;
23
26
  leaveRoom: () => Promise<void>;
24
27
  startCamera: (config: CameraConfigInternal) => Promise<boolean>;
@@ -29,7 +32,6 @@ type RNFishjamClient = {
29
32
  handleScreenSharePermission: () => Promise<'granted' | 'denied'>;
30
33
  toggleScreenShare: (screenShareOptions: Partial<ScreenShareOptionsInternal>) => Promise<void>;
31
34
  toggleAppScreenShare: (screenShareOptions: Partial<ScreenShareOptionsInternal>) => Promise<void>;
32
- getPeers: <PeerMetadataType extends Metadata, ServerMetadata extends Metadata = GenericMetadata>() => Promise<Peer<PeerMetadataType, ServerMetadata>[]>;
33
35
  updatePeerMetadata: <MetadataType extends Metadata>(metadata: MetadataType) => Promise<void>;
34
36
  updateVideoTrackMetadata: <MetadataType extends Metadata>(metadata: MetadataType) => Promise<void>;
35
37
  updateScreenShareTrackMetadata: <MetadataType extends Metadata>(metadata: MetadataType) => Promise<void>;
@@ -50,7 +52,38 @@ type RNFishjamClient = {
50
52
  startForegroundService: (config: ForegroundServiceConfig) => Promise<void>;
51
53
  stopForegroundService: () => void;
52
54
  };
53
- export declare const nativeModuleEventEmitter: EventEmitter;
54
- declare const _default: RNFishjamClient & NativeModule;
55
+ export declare const ReceivableEvents: {
56
+ readonly IsMicrophoneOn: "IsMicrophoneOn";
57
+ readonly IsScreenShareOn: "IsScreenShareOn";
58
+ readonly IsAppScreenShareOn: "IsAppScreenShareOn";
59
+ readonly SimulcastConfigUpdate: "SimulcastConfigUpdate";
60
+ readonly PeersUpdate: "PeersUpdate";
61
+ readonly AudioDeviceUpdate: "AudioDeviceUpdate";
62
+ readonly BandwidthEstimation: "BandwidthEstimation";
63
+ readonly ReconnectionRetriesLimitReached: "ReconnectionRetriesLimitReached";
64
+ readonly ReconnectionStarted: "ReconnectionStarted";
65
+ readonly Reconnected: "Reconnected";
66
+ readonly Warning: "Warning";
67
+ readonly PeerStatusChanged: "PeerStatusChanged";
68
+ readonly ReconnectionStatusChanged: "ReconnectionStatusChanged";
69
+ readonly CurrentCameraChanged: "CurrentCameraChanged";
70
+ };
71
+ export type ReceivableEventPayloads = {
72
+ [ReceivableEvents.IsMicrophoneOn]: boolean;
73
+ [ReceivableEvents.IsScreenShareOn]: boolean;
74
+ [ReceivableEvents.IsAppScreenShareOn]: boolean;
75
+ [ReceivableEvents.SimulcastConfigUpdate]: SimulcastConfig;
76
+ [ReceivableEvents.PeersUpdate]: Peer<GenericMetadata, GenericMetadata>[];
77
+ [ReceivableEvents.AudioDeviceUpdate]: OnAudioDeviceEvent;
78
+ [ReceivableEvents.BandwidthEstimation]: number | null;
79
+ [ReceivableEvents.ReconnectionRetriesLimitReached]: void;
80
+ [ReceivableEvents.ReconnectionStarted]: void;
81
+ [ReceivableEvents.Reconnected]: void;
82
+ [ReceivableEvents.Warning]: string;
83
+ [ReceivableEvents.PeerStatusChanged]: PeerStatus;
84
+ [ReceivableEvents.ReconnectionStatusChanged]: ReconnectionStatus;
85
+ [ReceivableEvents.CurrentCameraChanged]: CurrentCameraChangedType;
86
+ };
87
+ declare const _default: RNFishjamClient & NativeModule<Record<keyof typeof ReceivableEvents, (payload: ReceivableEventPayloads) => void>>;
55
88
  export default _default;
56
89
  //# sourceMappingURL=RNFishjamClientModule.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"RNFishjamClientModule.d.ts","sourceRoot":"","sources":["../src/RNFishjamClientModule.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"RNFishjamClientModule.d.ts","sourceRoot":"","sources":["../src/RNFishjamClientModule.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,19 @@
1
- import { EventEmitter, requireNativeModule } from 'expo-modules-core';
2
- const nativeModule = requireNativeModule('RNFishjamClient');
3
- export const nativeModuleEventEmitter = new EventEmitter(nativeModule);
4
- export default nativeModule;
1
+ import { requireNativeModule } from 'expo-modules-core';
2
+ export const ReceivableEvents = {
3
+ IsMicrophoneOn: 'IsMicrophoneOn',
4
+ IsScreenShareOn: 'IsScreenShareOn',
5
+ IsAppScreenShareOn: 'IsAppScreenShareOn', // only for iOS
6
+ SimulcastConfigUpdate: 'SimulcastConfigUpdate',
7
+ PeersUpdate: 'PeersUpdate',
8
+ AudioDeviceUpdate: 'AudioDeviceUpdate',
9
+ BandwidthEstimation: 'BandwidthEstimation',
10
+ ReconnectionRetriesLimitReached: 'ReconnectionRetriesLimitReached',
11
+ ReconnectionStarted: 'ReconnectionStarted',
12
+ Reconnected: 'Reconnected',
13
+ Warning: 'Warning',
14
+ PeerStatusChanged: 'PeerStatusChanged',
15
+ ReconnectionStatusChanged: 'ReconnectionStatusChanged',
16
+ CurrentCameraChanged: 'CurrentCameraChanged',
17
+ };
18
+ export default requireNativeModule('RNFishjamClient');
5
19
  //# sourceMappingURL=RNFishjamClientModule.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"RNFishjamClientModule.js","sourceRoot":"","sources":["../src/RNFishjamClientModule.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAgFtE,MAAM,YAAY,GAAG,mBAAmB,CAAC,iBAAiB,CAAC,CAAC;AAC5D,MAAM,CAAC,MAAM,wBAAwB,GAAG,IAAI,YAAY,CAAC,YAAY,CAAC,CAAC;AAEvE,eAAe,YAA8C,CAAC","sourcesContent":["import { EventEmitter, requireNativeModule } from 'expo-modules-core';\nimport { NativeModule } from 'react-native';\n\nimport type { RTCStats } from './debug/stats/types';\nimport type { GenericMetadata, SimulcastConfig } from './types';\nimport type { CameraConfigInternal, Camera } from './hooks/useCamera';\nimport type { Peer } from './hooks/usePeers';\nimport type { ScreenShareOptionsInternal } from './hooks/useScreenShare';\nimport type { ConnectionConfig } from './common/client';\nimport { PeerStatus } from './hooks/usePeerStatus';\nimport { ForegroundServiceConfig } from './hooks/useForegroundService';\n\ntype Metadata = { [key: string]: any };\n\ntype RNFishjamClient = {\n isMicrophoneOn: boolean;\n isCameraOn: boolean;\n isScreenShareOn: boolean;\n isAppScreenShareOn: boolean; // only available on ios\n cameras: ReadonlyArray<Camera>;\n currentCamera: Camera | null;\n peerStatus: PeerStatus;\n joinRoom: (\n url: string,\n peerToken: string,\n peerMetadata: Metadata,\n config: ConnectionConfig,\n ) => Promise<void>;\n leaveRoom: () => Promise<void>;\n startCamera: (config: CameraConfigInternal) => Promise<boolean>;\n toggleMicrophone: () => Promise<boolean>;\n toggleCamera: () => Promise<boolean>;\n flipCamera: () => Promise<void>;\n switchCamera: (cameraId: string) => Promise<void>;\n handleScreenSharePermission: () => Promise<'granted' | 'denied'>;\n toggleScreenShare: (\n screenShareOptions: Partial<ScreenShareOptionsInternal>,\n ) => Promise<void>;\n toggleAppScreenShare: (\n screenShareOptions: Partial<ScreenShareOptionsInternal>,\n ) => Promise<void>;\n getPeers: <\n PeerMetadataType extends Metadata,\n ServerMetadata extends Metadata = GenericMetadata,\n >() => Promise<Peer<PeerMetadataType, ServerMetadata>[]>;\n updatePeerMetadata: <MetadataType extends Metadata>(\n metadata: MetadataType,\n ) => Promise<void>;\n updateVideoTrackMetadata: <MetadataType extends Metadata>(\n metadata: MetadataType,\n ) => Promise<void>;\n updateScreenShareTrackMetadata: <MetadataType extends Metadata>(\n metadata: MetadataType,\n ) => Promise<void>;\n setOutputAudioDevice: (audioDevice: string) => Promise<void>;\n startAudioSwitcher: () => Promise<void>;\n stopAudioSwitcher: () => Promise<void>;\n selectAudioSessionMode: (sessionMode: string) => Promise<void>;\n showAudioRoutePicker: () => Promise<void>;\n toggleScreenShareTrackEncoding: (\n encoding: string,\n ) => Promise<SimulcastConfig>;\n setScreenShareTrackBandwidth: (bandwidth: number) => Promise<void>;\n setScreenShareTrackEncodingBandwidth: (\n encoding: string,\n bandwidth: number,\n ) => Promise<void>;\n setTargetTrackEncoding: (trackId: string, encoding: string) => Promise<void>;\n toggleVideoTrackEncoding: (encoding: string) => Promise<SimulcastConfig>;\n setVideoTrackEncodingBandwidth: (\n encoding: string,\n bandwidth: number,\n ) => Promise<void>;\n setVideoTrackBandwidth: (bandwidth: number) => Promise<void>;\n changeWebRTCLoggingSeverity: (severity: string) => Promise<void>;\n getStatistics: () => Promise<RTCStats>;\n startForegroundService: (config: ForegroundServiceConfig) => Promise<void>;\n stopForegroundService: () => void;\n};\n\nconst nativeModule = requireNativeModule('RNFishjamClient');\nexport const nativeModuleEventEmitter = new EventEmitter(nativeModule);\n\nexport default nativeModule as RNFishjamClient & NativeModule;\n"]}
1
+ {"version":3,"file":"RNFishjamClientModule.js","sourceRoot":"","sources":["../src/RNFishjamClientModule.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAyFxD,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,cAAc,EAAE,gBAAgB;IAChC,eAAe,EAAE,iBAAiB;IAClC,kBAAkB,EAAE,oBAAoB,EAAE,eAAe;IACzD,qBAAqB,EAAE,uBAAuB;IAC9C,WAAW,EAAE,aAAa;IAC1B,iBAAiB,EAAE,mBAAmB;IACtC,mBAAmB,EAAE,qBAAqB;IAC1C,+BAA+B,EAAE,iCAAiC;IAClE,mBAAmB,EAAE,qBAAqB;IAC1C,WAAW,EAAE,aAAa;IAC1B,OAAO,EAAE,SAAS;IAClB,iBAAiB,EAAE,mBAAmB;IACtC,yBAAyB,EAAE,2BAA2B;IACtD,oBAAoB,EAAE,sBAAsB;CACpC,CAAC;AAmBX,eAAe,mBAAmB,CAAC,iBAAiB,CAMjD,CAAC","sourcesContent":["import { requireNativeModule } from 'expo-modules-core';\n\nimport type { NativeModule } from 'expo-modules-core/types';\nimport type { ConnectionConfig } from './common/client';\nimport type { RTCStats } from './debug/stats/types';\nimport type { OnAudioDeviceEvent } from './hooks/useAudioSettings';\nimport type {\n Camera,\n CameraConfigInternal,\n CurrentCameraChangedType,\n} from './hooks/useCamera';\nimport type { PeerStatus, ReconnectionStatus } from './hooks/useConnection';\nimport type { ForegroundServiceConfig } from './hooks/useForegroundService';\nimport type { Peer } from './hooks/usePeers';\nimport type { ScreenShareOptionsInternal } from './hooks/useScreenShare';\nimport type { GenericMetadata, SimulcastConfig } from './types';\n\ntype Metadata = { [key: string]: unknown };\n\ntype RNFishjamClient = {\n isMicrophoneOn: boolean;\n isCameraOn: boolean;\n isScreenShareOn: boolean;\n isAppScreenShareOn: boolean; // only available on ios\n cameras: ReadonlyArray<Camera>;\n currentCamera: Camera | null;\n peerStatus: PeerStatus;\n reconnectionStatus: ReconnectionStatus;\n isCameraInitialized: boolean;\n\n getPeers: <\n PeerMetadataType extends Metadata,\n ServerMetadata extends Metadata = GenericMetadata,\n >() => Peer<PeerMetadataType, ServerMetadata>[];\n\n joinRoom: (\n url: string,\n peerToken: string,\n peerMetadata: Metadata,\n config: ConnectionConfig,\n ) => Promise<void>;\n leaveRoom: () => Promise<void>;\n startCamera: (config: CameraConfigInternal) => Promise<boolean>;\n toggleMicrophone: () => Promise<boolean>;\n toggleCamera: () => Promise<boolean>;\n flipCamera: () => Promise<void>;\n switchCamera: (cameraId: string) => Promise<void>;\n handleScreenSharePermission: () => Promise<'granted' | 'denied'>;\n toggleScreenShare: (\n screenShareOptions: Partial<ScreenShareOptionsInternal>,\n ) => Promise<void>;\n toggleAppScreenShare: (\n screenShareOptions: Partial<ScreenShareOptionsInternal>,\n ) => Promise<void>;\n updatePeerMetadata: <MetadataType extends Metadata>(\n metadata: MetadataType,\n ) => Promise<void>;\n updateVideoTrackMetadata: <MetadataType extends Metadata>(\n metadata: MetadataType,\n ) => Promise<void>;\n updateScreenShareTrackMetadata: <MetadataType extends Metadata>(\n metadata: MetadataType,\n ) => Promise<void>;\n setOutputAudioDevice: (audioDevice: string) => Promise<void>;\n startAudioSwitcher: () => Promise<void>;\n stopAudioSwitcher: () => Promise<void>;\n selectAudioSessionMode: (sessionMode: string) => Promise<void>;\n showAudioRoutePicker: () => Promise<void>;\n toggleScreenShareTrackEncoding: (\n encoding: string,\n ) => Promise<SimulcastConfig>;\n setScreenShareTrackBandwidth: (bandwidth: number) => Promise<void>;\n setScreenShareTrackEncodingBandwidth: (\n encoding: string,\n bandwidth: number,\n ) => Promise<void>;\n setTargetTrackEncoding: (trackId: string, encoding: string) => Promise<void>;\n toggleVideoTrackEncoding: (encoding: string) => Promise<SimulcastConfig>;\n setVideoTrackEncodingBandwidth: (\n encoding: string,\n bandwidth: number,\n ) => Promise<void>;\n setVideoTrackBandwidth: (bandwidth: number) => Promise<void>;\n changeWebRTCLoggingSeverity: (severity: string) => Promise<void>;\n getStatistics: () => Promise<RTCStats>;\n startForegroundService: (config: ForegroundServiceConfig) => Promise<void>;\n stopForegroundService: () => void;\n};\n\nexport const ReceivableEvents = {\n IsMicrophoneOn: 'IsMicrophoneOn',\n IsScreenShareOn: 'IsScreenShareOn',\n IsAppScreenShareOn: 'IsAppScreenShareOn', // only for iOS\n SimulcastConfigUpdate: 'SimulcastConfigUpdate',\n PeersUpdate: 'PeersUpdate',\n AudioDeviceUpdate: 'AudioDeviceUpdate',\n BandwidthEstimation: 'BandwidthEstimation',\n ReconnectionRetriesLimitReached: 'ReconnectionRetriesLimitReached',\n ReconnectionStarted: 'ReconnectionStarted',\n Reconnected: 'Reconnected',\n Warning: 'Warning',\n PeerStatusChanged: 'PeerStatusChanged',\n ReconnectionStatusChanged: 'ReconnectionStatusChanged',\n CurrentCameraChanged: 'CurrentCameraChanged',\n} as const;\n\nexport type ReceivableEventPayloads = {\n [ReceivableEvents.IsMicrophoneOn]: boolean;\n [ReceivableEvents.IsScreenShareOn]: boolean;\n [ReceivableEvents.IsAppScreenShareOn]: boolean;\n [ReceivableEvents.SimulcastConfigUpdate]: SimulcastConfig;\n [ReceivableEvents.PeersUpdate]: Peer<GenericMetadata, GenericMetadata>[];\n [ReceivableEvents.AudioDeviceUpdate]: OnAudioDeviceEvent;\n [ReceivableEvents.BandwidthEstimation]: number | null;\n [ReceivableEvents.ReconnectionRetriesLimitReached]: void;\n [ReceivableEvents.ReconnectionStarted]: void;\n [ReceivableEvents.Reconnected]: void;\n [ReceivableEvents.Warning]: string;\n [ReceivableEvents.PeerStatusChanged]: PeerStatus;\n [ReceivableEvents.ReconnectionStatusChanged]: ReconnectionStatus;\n [ReceivableEvents.CurrentCameraChanged]: CurrentCameraChangedType;\n};\n\nexport default requireNativeModule('RNFishjamClient') as RNFishjamClient &\n NativeModule<\n Record<\n keyof typeof ReceivableEvents,\n (payload: ReceivableEventPayloads) => void\n >\n >;\n"]}