@fishjam-cloud/react-native-client 0.6.0 → 0.8.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 (101) 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 +4 -2
  4. package/android/src/main/java/io/fishjam/reactnative/RNFishjamClient.kt +60 -39
  5. package/android/src/main/java/io/fishjam/reactnative/RNFishjamClientModule.kt +11 -19
  6. package/build/RNFishjamClientModule.d.ts +24 -8
  7. package/build/RNFishjamClientModule.d.ts.map +1 -1
  8. package/build/RNFishjamClientModule.js +0 -1
  9. package/build/RNFishjamClientModule.js.map +1 -1
  10. package/build/common/client.d.ts +4 -4
  11. package/build/common/client.d.ts.map +1 -1
  12. package/build/common/client.js +4 -4
  13. package/build/common/client.js.map +1 -1
  14. package/build/common/metadata.d.ts +1 -0
  15. package/build/common/metadata.d.ts.map +1 -1
  16. package/build/common/metadata.js +1 -0
  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 +29 -9
  21. package/build/components/FishjamRoom/index.js.map +1 -1
  22. package/build/components/VideoPreviewView.d.ts +7 -3
  23. package/build/components/VideoPreviewView.d.ts.map +1 -1
  24. package/build/components/VideoPreviewView.js +5 -1
  25. package/build/components/VideoPreviewView.js.map +1 -1
  26. package/build/components/VideoRendererView.d.ts +13 -0
  27. package/build/components/VideoRendererView.d.ts.map +1 -1
  28. package/build/components/VideoRendererView.js +13 -0
  29. package/build/components/VideoRendererView.js.map +1 -1
  30. package/build/hooks/internal/useFishjamEvent.d.ts +3 -2
  31. package/build/hooks/internal/useFishjamEvent.d.ts.map +1 -1
  32. package/build/hooks/internal/useFishjamEvent.js +25 -1
  33. package/build/hooks/internal/useFishjamEvent.js.map +1 -1
  34. package/build/hooks/internal/useFishjamEventState.d.ts +2 -2
  35. package/build/hooks/internal/useFishjamEventState.d.ts.map +1 -1
  36. package/build/hooks/internal/useFishjamEventState.js.map +1 -1
  37. package/build/hooks/useAppScreenShare.d.ts +10 -1
  38. package/build/hooks/useAppScreenShare.d.ts.map +1 -1
  39. package/build/hooks/useAppScreenShare.js +9 -7
  40. package/build/hooks/useAppScreenShare.js.map +1 -1
  41. package/build/hooks/useAudioSettings.d.ts +4 -0
  42. package/build/hooks/useAudioSettings.d.ts.map +1 -1
  43. package/build/hooks/useAudioSettings.js.map +1 -1
  44. package/build/hooks/useBandwidthEstimation.d.ts +3 -0
  45. package/build/hooks/useBandwidthEstimation.d.ts.map +1 -1
  46. package/build/hooks/useBandwidthEstimation.js +6 -1
  47. package/build/hooks/useBandwidthEstimation.js.map +1 -1
  48. package/build/hooks/useCamera.d.ts +12 -35
  49. package/build/hooks/useCamera.d.ts.map +1 -1
  50. package/build/hooks/useCamera.js +11 -60
  51. package/build/hooks/useCamera.js.map +1 -1
  52. package/build/hooks/useConnection.d.ts +29 -13
  53. package/build/hooks/useConnection.d.ts.map +1 -1
  54. package/build/hooks/useConnection.js +11 -5
  55. package/build/hooks/useConnection.js.map +1 -1
  56. package/build/hooks/useForegroundService.d.ts +20 -11
  57. package/build/hooks/useForegroundService.d.ts.map +1 -1
  58. package/build/hooks/useForegroundService.js +2 -3
  59. package/build/hooks/useForegroundService.js.map +1 -1
  60. package/build/hooks/useMicrophone.js.map +1 -1
  61. package/build/hooks/usePeerStatus.d.ts +2 -10
  62. package/build/hooks/usePeerStatus.d.ts.map +1 -1
  63. package/build/hooks/usePeerStatus.js +1 -0
  64. package/build/hooks/usePeerStatus.js.map +1 -1
  65. package/build/hooks/usePeers.d.ts +19 -22
  66. package/build/hooks/usePeers.d.ts.map +1 -1
  67. package/build/hooks/usePeers.js +17 -5
  68. package/build/hooks/usePeers.js.map +1 -1
  69. package/build/hooks/useReconnection.d.ts +2 -2
  70. package/build/hooks/useReconnection.d.ts.map +1 -1
  71. package/build/hooks/useReconnection.js +1 -0
  72. package/build/hooks/useReconnection.js.map +1 -1
  73. package/build/hooks/useScreenShare.d.ts +2 -23
  74. package/build/hooks/useScreenShare.d.ts.map +1 -1
  75. package/build/hooks/useScreenShare.js +1 -36
  76. package/build/hooks/useScreenShare.js.map +1 -1
  77. package/build/index.d.ts +6 -7
  78. package/build/index.d.ts.map +1 -1
  79. package/build/index.js +0 -2
  80. package/build/index.js.map +1 -1
  81. package/build/types.d.ts +3 -19
  82. package/build/types.d.ts.map +1 -1
  83. package/build/types.js.map +1 -1
  84. package/build/utils/eventPayloadValidator.d.ts +3 -0
  85. package/build/utils/eventPayloadValidator.d.ts.map +1 -0
  86. package/build/utils/eventPayloadValidator.js +85 -0
  87. package/build/utils/eventPayloadValidator.js.map +1 -0
  88. package/ios/Events.swift +4 -1
  89. package/ios/RNFishjamClient.podspec +1 -1
  90. package/ios/RNFishjamClient.swift +60 -48
  91. package/ios/RNFishjamClientModule.swift +5 -10
  92. package/ios/VideoPreviewView.swift +5 -0
  93. package/ios/VideoRendererView.swift +5 -0
  94. package/package.json +21 -14
  95. package/plugin/build/withFishjamAndroid.js +1 -0
  96. package/plugin/build/withFishjamIos.js +17 -7
  97. package/build/common/webRTC.d.ts +0 -14
  98. package/build/common/webRTC.d.ts.map +0 -1
  99. package/build/common/webRTC.js +0 -15
  100. package/build/common/webRTC.js.map +0 -1
  101. /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.6.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'
@@ -53,12 +53,14 @@ class EmitableEvent private constructor(
53
53
 
54
54
  fun currentCameraChanged(
55
55
  localCamera: LocalCamera?,
56
- isCameraOn: Boolean
56
+ isCameraOn: Boolean,
57
+ isCameraInitialized: Boolean
57
58
  ) = EmitableEvent(
58
59
  EventName.CurrentCameraChanged,
59
60
  mapOf(
60
61
  "currentCamera" to localCamera,
61
- "isCameraOn" to isCameraOn
62
+ "isCameraOn" to isCameraOn,
63
+ "isCameraInitialized" to isCameraInitialized
62
64
  )
63
65
  )
64
66
 
@@ -25,6 +25,7 @@ import com.fishjamcloud.client.models.RTCOutboundStats
25
25
  import com.fishjamcloud.client.models.ReconnectConfig
26
26
  import com.fishjamcloud.client.models.SimulcastConfig
27
27
  import com.fishjamcloud.client.models.TrackBandwidthLimit
28
+ import com.fishjamcloud.client.models.TrackEncoding
28
29
  import com.fishjamcloud.client.models.VideoParameters
29
30
  import com.twilio.audioswitch.AudioDevice
30
31
  import expo.modules.kotlin.AppContext
@@ -40,6 +41,7 @@ import io.fishjam.reactnative.utils.PermissionUtils
40
41
  import kotlinx.coroutines.CoroutineScope
41
42
  import kotlinx.coroutines.Dispatchers
42
43
  import kotlinx.coroutines.SupervisorJob
44
+ import kotlinx.coroutines.delay
43
45
  import kotlinx.coroutines.launch
44
46
  import org.webrtc.Logging
45
47
 
@@ -54,9 +56,37 @@ class RNFishjamClient(
54
56
  var isScreenShareOn = false
55
57
  var isConnected = false
56
58
 
57
- private var isCameraInitialized = false
59
+ var isCameraInitialized = false
60
+ private set(value) {
61
+ field = value
62
+ emitEvent(
63
+ EmitableEvent.currentCameraChanged(
64
+ getCurrentCaptureDevice(),
65
+ isCameraOn,
66
+ value
67
+ )
68
+ )
69
+ }
58
70
 
59
71
  private var connectPromise: Promise? = null
72
+ private set(value) {
73
+ field = value
74
+ if (value == null) {
75
+ return
76
+ }
77
+ coroutineScope.launch {
78
+ delay(15000)
79
+ // If promise is still assigned it means it was not resolved in that time,
80
+ // so close the client and reject it with timeout error
81
+ connectPromise?.let { promise ->
82
+ fishjamClient.leave {
83
+ promise.reject(SocketError("Failed to connect: Fishjam server is not responding"))
84
+ connectPromise = null
85
+ peerStatus = PeerStatus.Error
86
+ }
87
+ }
88
+ }
89
+ }
60
90
  private var screenSharePermissionPromise: Promise? = null
61
91
 
62
92
  var videoSimulcastConfig: SimulcastConfig = SimulcastConfig()
@@ -64,7 +94,6 @@ class RNFishjamClient(
64
94
 
65
95
  var screenShareQuality: String? = null
66
96
  var screenShareSimulcastConfig: SimulcastConfig = SimulcastConfig()
67
- var screenShareMaxBandwidth: TrackBandwidthLimit = TrackBandwidthLimit.BandwidthLimit(0)
68
97
 
69
98
  var screenShareMetadata: Map<String, Any> = mutableMapOf()
70
99
 
@@ -141,27 +170,13 @@ class RNFishjamClient(
141
170
 
142
171
  private fun getSimulcastConfigFromOptions(simulcastConfigMap: io.fishjam.reactnative.SimulcastConfig): SimulcastConfig {
143
172
  val simulcastEnabled = simulcastConfigMap.enabled
144
- val activeEncodings = simulcastConfigMap.activeEncodings.map { e -> e.toTrackEncoding() }
173
+ val activeEncodings = listOf(TrackEncoding.L, TrackEncoding.M, TrackEncoding.H)
145
174
  return SimulcastConfig(
146
175
  enabled = simulcastEnabled,
147
176
  activeEncodings = activeEncodings
148
177
  )
149
178
  }
150
179
 
151
- private fun getMaxBandwidthFromOptions(
152
- maxBandwidthMap: Map<String, Int>?,
153
- maxBandwidthInt: Int
154
- ): TrackBandwidthLimit {
155
- if (maxBandwidthMap != null) {
156
- val maxBandwidthSimulcast = mutableMapOf<String, TrackBandwidthLimit.BandwidthLimit>()
157
- maxBandwidthMap.forEach {
158
- maxBandwidthSimulcast[it.key] = TrackBandwidthLimit.BandwidthLimit(it.value)
159
- }
160
- return TrackBandwidthLimit.SimulcastBandwidthLimit(maxBandwidthSimulcast)
161
- }
162
- return TrackBandwidthLimit.BandwidthLimit(maxBandwidthInt)
163
- }
164
-
165
180
  private fun create() {
166
181
  audioSwitchManager = AudioSwitchManager(appContext?.reactContext!!)
167
182
  fishjamClient =
@@ -172,8 +187,6 @@ class RNFishjamClient(
172
187
  }
173
188
 
174
189
  private fun getVideoParametersFromOptions(createOptions: CameraConfig): VideoParameters {
175
- val videoMaxBandwidth =
176
- getMaxBandwidthFromOptions(createOptions.maxBandwidthMap, createOptions.maxBandwidthInt)
177
190
  var videoParameters =
178
191
  when (createOptions.quality) {
179
192
  "QVGA169" -> VideoParameters.presetQVGA169
@@ -192,7 +205,7 @@ class RNFishjamClient(
192
205
  videoParameters.copy(
193
206
  dimensions = if (createOptions.flipDimensions) videoParameters.dimensions.flip() else videoParameters.dimensions,
194
207
  simulcastConfig = getSimulcastConfigFromOptions(createOptions.simulcastConfig),
195
- maxBitrate = videoMaxBandwidth
208
+ maxBitrate = videoParameters.maxBitrate
196
209
  )
197
210
  return videoParameters
198
211
  }
@@ -293,7 +306,6 @@ class RNFishjamClient(
293
306
 
294
307
  suspend fun startCamera(config: CameraConfig): Boolean {
295
308
  if (isCameraInitialized) {
296
- emitEvent(EmitableEvent.warning("Camera already started. You may only call startCamera once before leaveRoom is called."))
297
309
  return true
298
310
  }
299
311
  if (!PermissionUtils.requestCameraPermission(appContext)) {
@@ -325,7 +337,13 @@ class RNFishjamClient(
325
337
  ) {
326
338
  cameraTrack.setEnabled(isEnabled)
327
339
  isCameraOn = isEnabled
328
- emitEvent(EmitableEvent.currentCameraChanged(cameraTrack.getCaptureDevice()?.toLocalCamera(), isEnabled))
340
+ emitEvent(
341
+ EmitableEvent.currentCameraChanged(
342
+ cameraTrack.getCaptureDevice()?.toLocalCamera(),
343
+ isEnabled,
344
+ isCameraInitialized
345
+ )
346
+ )
329
347
  localCameraTracksChangedListenersManager.notifyListeners()
330
348
  }
331
349
 
@@ -355,7 +373,7 @@ class RNFishjamClient(
355
373
  return
356
374
  }
357
375
 
358
- val microphoneTrack = fishjamClient.createAudioTrack(emptyMap())
376
+ val microphoneTrack = fishjamClient.createAudioTrack(getMicrophoneTrackMetadata())
359
377
  setMicrophoneTrackState(microphoneTrack, true)
360
378
  emitEndpoints()
361
379
  }
@@ -376,17 +394,18 @@ class RNFishjamClient(
376
394
  getLocalAudioTrack()?.let { setMicrophoneTrackState(it, !isMicrophoneOn) }
377
395
  }
378
396
 
379
- updateLocalAudioTrackMetadata(
380
- mapOf(
381
- "active" to isMicrophoneOn,
382
- "paused" to !isMicrophoneOn, // TODO: FCE-711,
383
- "type" to "microphone"
384
- )
385
- )
397
+ updateLocalAudioTrackMetadata(getMicrophoneTrackMetadata())
386
398
 
387
399
  return isMicrophoneOn
388
400
  }
389
401
 
402
+ private fun getMicrophoneTrackMetadata(): Map<String, Any> =
403
+ mapOf(
404
+ "active" to isMicrophoneOn,
405
+ "paused" to !isMicrophoneOn, // TODO: FCE-711,
406
+ "type" to "microphone"
407
+ )
408
+
390
409
  fun handleScreenSharePermission(promise: Promise) {
391
410
  screenSharePermissionPromise = promise
392
411
  if (!isScreenShareOn) {
@@ -416,11 +435,6 @@ class RNFishjamClient(
416
435
  this.screenShareQuality = screenShareOptions.quality
417
436
  this.screenShareSimulcastConfig =
418
437
  getSimulcastConfigFromOptions(screenShareOptions.simulcastConfig)
419
- this.screenShareMaxBandwidth =
420
- getMaxBandwidthFromOptions(
421
- screenShareOptions.maxBandwidthMap,
422
- screenShareOptions.maxBandwidthInt
423
- )
424
438
 
425
439
  if (!isScreenShareOn) {
426
440
  ensureConnected()
@@ -704,9 +718,10 @@ class RNFishjamClient(
704
718
  return res
705
719
  }
706
720
 
707
- fun getStatistics(): MutableMap<String, Map<String, Any?>> {
721
+ suspend fun getStatistics(): Map<String, Map<String, Any?>> {
708
722
  val newMap = mutableMapOf<String, Map<String, Any?>>()
709
- fishjamClient.getStats().forEach { entry ->
723
+ val stats = fishjamClient.getStats()
724
+ stats.forEach { entry ->
710
725
  newMap[entry.key] =
711
726
  if (entry.value is RTCInboundStats) {
712
727
  rtcInboundStatsToRNMap(
@@ -753,7 +768,7 @@ class RNFishjamClient(
753
768
  return videoParameters.copy(
754
769
  dimensions = dimensions,
755
770
  simulcastConfig = screenShareSimulcastConfig,
756
- maxBitrate = screenShareMaxBandwidth
771
+ maxBitrate = videoParameters.maxBitrate
757
772
  )
758
773
  }
759
774
 
@@ -904,6 +919,12 @@ class RNFishjamClient(
904
919
  }
905
920
 
906
921
  override fun onCaptureDeviceChanged(captureDevice: CaptureDevice?) {
907
- emitEvent(EmitableEvent.currentCameraChanged(captureDevice?.toLocalCamera(), isCameraOn))
922
+ emitEvent(
923
+ EmitableEvent.currentCameraChanged(
924
+ captureDevice?.toLocalCamera(),
925
+ isCameraOn,
926
+ isCameraInitialized
927
+ )
928
+ )
908
929
  }
909
930
  }
@@ -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 {
@@ -159,6 +143,10 @@ class RNFishjamClientModule : Module() {
159
143
  return@Property rnFishjamClient.reconnectionStatus.status
160
144
  }
161
145
 
146
+ Property("isCameraInitialized") {
147
+ return@Property rnFishjamClient.isCameraInitialized
148
+ }
149
+
162
150
  Function("getPeers") {
163
151
  return@Function rnFishjamClient.getPeers()
164
152
  }
@@ -178,8 +166,10 @@ class RNFishjamClientModule : Module() {
178
166
  }
179
167
 
180
168
  AsyncFunction("startCamera") Coroutine { config: CameraConfig ->
181
- return@Coroutine withContext(Dispatchers.Main) {
182
- return@withContext rnFishjamClient.startCamera(config)
169
+ mutex.withLock {
170
+ return@Coroutine withContext(Dispatchers.Main) {
171
+ return@withContext rnFishjamClient.startCamera(config)
172
+ }
183
173
  }
184
174
  }
185
175
 
@@ -301,7 +291,9 @@ class RNFishjamClientModule : Module() {
301
291
  }
302
292
  }
303
293
 
304
- AsyncFunction("getStatistics") { rnFishjamClient.getStatistics() }
294
+ AsyncFunction("getStatistics") Coroutine { ->
295
+ return@Coroutine rnFishjamClient.getStatistics()
296
+ }
305
297
 
306
298
  AsyncFunction("startForegroundService") Coroutine { config: ForegroundServiceConfig ->
307
299
  rnFishjamClient.startForegroundService(config)
@@ -1,13 +1,13 @@
1
1
  import type { NativeModule } from 'expo-modules-core/types';
2
+ import type { ConnectionConfig } from './common/client';
2
3
  import type { RTCStats } from './debug/stats/types';
3
- import type { GenericMetadata, SimulcastConfig } from './types';
4
- 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';
5
8
  import type { Peer } from './hooks/usePeers';
6
9
  import type { ScreenShareOptionsInternal } from './hooks/useScreenShare';
7
- import type { ConnectionConfig } from './common/client';
8
- import { PeerStatus } from './hooks/usePeerStatus';
9
- import { ForegroundServiceConfig } from './hooks/useForegroundService';
10
- import { ReconnectionStatus } from './hooks/useReconnection';
10
+ import type { GenericMetadata, SimulcastConfig } from './types';
11
11
  type Metadata = {
12
12
  [key: string]: unknown;
13
13
  };
@@ -20,6 +20,7 @@ type RNFishjamClient = {
20
20
  currentCamera: Camera | null;
21
21
  peerStatus: PeerStatus;
22
22
  reconnectionStatus: ReconnectionStatus;
23
+ isCameraInitialized: boolean;
23
24
  getPeers: <PeerMetadataType extends Metadata, ServerMetadata extends Metadata = GenericMetadata>() => Peer<PeerMetadataType, ServerMetadata>[];
24
25
  joinRoom: (url: string, peerToken: string, peerMetadata: Metadata, config: ConnectionConfig) => Promise<void>;
25
26
  leaveRoom: () => Promise<void>;
@@ -58,7 +59,6 @@ export declare const ReceivableEvents: {
58
59
  readonly SimulcastConfigUpdate: "SimulcastConfigUpdate";
59
60
  readonly PeersUpdate: "PeersUpdate";
60
61
  readonly AudioDeviceUpdate: "AudioDeviceUpdate";
61
- readonly SendMediaEvent: "SendMediaEvent";
62
62
  readonly BandwidthEstimation: "BandwidthEstimation";
63
63
  readonly ReconnectionRetriesLimitReached: "ReconnectionRetriesLimitReached";
64
64
  readonly ReconnectionStarted: "ReconnectionStarted";
@@ -68,6 +68,22 @@ export declare const ReceivableEvents: {
68
68
  readonly ReconnectionStatusChanged: "ReconnectionStatusChanged";
69
69
  readonly CurrentCameraChanged: "CurrentCameraChanged";
70
70
  };
71
- declare const _default: RNFishjamClient & NativeModule<Record<keyof typeof ReceivableEvents, <T>(...args: T[]) => void>>;
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>>;
72
88
  export default _default;
73
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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"}
@@ -6,7 +6,6 @@ export const ReceivableEvents = {
6
6
  SimulcastConfigUpdate: 'SimulcastConfigUpdate',
7
7
  PeersUpdate: 'PeersUpdate',
8
8
  AudioDeviceUpdate: 'AudioDeviceUpdate',
9
- SendMediaEvent: 'SendMediaEvent',
10
9
  BandwidthEstimation: 'BandwidthEstimation',
11
10
  ReconnectionRetriesLimitReached: 'ReconnectionRetriesLimitReached',
12
11
  ReconnectionStarted: 'ReconnectionStarted',
@@ -1 +1 @@
1
- {"version":3,"file":"RNFishjamClientModule.js","sourceRoot":"","sources":["../src/RNFishjamClientModule.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAoFxD,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,cAAc,EAAE,gBAAgB;IAChC,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;AAEX,eAAe,mBAAmB,CAAC,iBAAiB,CAIjD,CAAC","sourcesContent":["import { requireNativeModule } from 'expo-modules-core';\n\nimport type { NativeModule } from 'expo-modules-core/types';\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';\nimport { ReconnectionStatus } from './hooks/useReconnection';\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\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 SendMediaEvent: 'SendMediaEvent',\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 default requireNativeModule('RNFishjamClient') as RNFishjamClient &\n NativeModule<\n // TODO: Make event arguments typesafe instead of generic.\n Record<keyof typeof ReceivableEvents, <T>(...args: T[]) => void>\n >;\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"]}
@@ -15,11 +15,11 @@ export type ConnectionConfig = {
15
15
  };
16
16
  };
17
17
  /**
18
- * @param url fishjam Url
19
- * @param peerToken token received from server (or Room Manager)
20
- * @param peerMetadata string indexed record with metadata, that will be available to all other peers
21
- * @param config additional connection configuration
18
+ * @ignore
22
19
  */
23
20
  export declare function joinRoom<PeerMetadata extends GenericMetadata = GenericMetadata>(url: string, peerToken: string, peerMetadata?: PeerMetadata, config?: ConnectionConfig): Promise<void>;
21
+ /**
22
+ * @ignore
23
+ */
24
24
  export declare function leaveRoom(): Promise<void>;
25
25
  //# sourceMappingURL=client.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/common/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAG3C,MAAM,MAAM,gBAAgB,GAAG;IAC7B;;;;;;;OAOG;IACH,eAAe,CAAC,EAAE;QAChB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;CACH,CAAC;AAEF;;;;;GAKG;AACH,wBAAsB,QAAQ,CAC5B,YAAY,SAAS,eAAe,GAAG,eAAe,EAEtD,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,MAAM,EACjB,YAAY,CAAC,EAAE,YAAY,EAC3B,MAAM,CAAC,EAAE,gBAAgB,iBAQ1B;AAED,wBAAsB,SAAS,kBAE9B"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/common/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAG3C,MAAM,MAAM,gBAAgB,GAAG;IAC7B;;;;;;;OAOG;IACH,eAAe,CAAC,EAAE;QAChB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;CACH,CAAC;AAEF;;GAEG;AACH,wBAAsB,QAAQ,CAC5B,YAAY,SAAS,eAAe,GAAG,eAAe,EAEtD,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,MAAM,EACjB,YAAY,CAAC,EAAE,YAAY,EAC3B,MAAM,CAAC,EAAE,gBAAgB,iBAQ1B;AACD;;GAEG;AACH,wBAAsB,SAAS,kBAE9B"}
@@ -1,13 +1,13 @@
1
1
  import RNFishjamClientModule from '../RNFishjamClientModule';
2
2
  /**
3
- * @param url fishjam Url
4
- * @param peerToken token received from server (or Room Manager)
5
- * @param peerMetadata string indexed record with metadata, that will be available to all other peers
6
- * @param config additional connection configuration
3
+ * @ignore
7
4
  */
8
5
  export async function joinRoom(url, peerToken, peerMetadata, config) {
9
6
  await RNFishjamClientModule.joinRoom(url, peerToken, peerMetadata ?? {}, config ?? {});
10
7
  }
8
+ /**
9
+ * @ignore
10
+ */
11
11
  export async function leaveRoom() {
12
12
  await RNFishjamClientModule.leaveRoom();
13
13
  }
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/common/client.ts"],"names":[],"mappings":"AACA,OAAO,qBAAqB,MAAM,0BAA0B,CAAC;AAkB7D;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAG5B,GAAW,EACX,SAAiB,EACjB,YAA2B,EAC3B,MAAyB;IAEzB,MAAM,qBAAqB,CAAC,QAAQ,CAClC,GAAG,EACH,SAAS,EACT,YAAY,IAAI,EAAE,EAClB,MAAM,IAAI,EAAE,CACb,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS;IAC7B,MAAM,qBAAqB,CAAC,SAAS,EAAE,CAAC;AAC1C,CAAC","sourcesContent":["import { GenericMetadata } from '../types';\nimport RNFishjamClientModule from '../RNFishjamClientModule';\n\nexport type ConnectionConfig = {\n /**\n * Configuration for automatic reconnection\n * sdk uses a linear backoff algorithm, that is the formula\n * for the delay of the nth attempt is\n * n * delayMs + initialDelayMs\n *\n * Pass 0 for maxAttempts to disable automatic reconnection\n */\n reconnectConfig?: {\n maxAttempts?: number;\n initialDelayMs?: number;\n delayMs?: number;\n };\n};\n\n/**\n * @param url fishjam Url\n * @param peerToken token received from server (or Room Manager)\n * @param peerMetadata string indexed record with metadata, that will be available to all other peers\n * @param config additional connection configuration\n */\nexport async function joinRoom<\n PeerMetadata extends GenericMetadata = GenericMetadata,\n>(\n url: string,\n peerToken: string,\n peerMetadata?: PeerMetadata,\n config?: ConnectionConfig,\n) {\n await RNFishjamClientModule.joinRoom(\n url,\n peerToken,\n peerMetadata ?? {},\n config ?? {},\n );\n}\n\nexport async function leaveRoom() {\n await RNFishjamClientModule.leaveRoom();\n}\n"]}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/common/client.ts"],"names":[],"mappings":"AACA,OAAO,qBAAqB,MAAM,0BAA0B,CAAC;AAkB7D;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAG5B,GAAW,EACX,SAAiB,EACjB,YAA2B,EAC3B,MAAyB;IAEzB,MAAM,qBAAqB,CAAC,QAAQ,CAClC,GAAG,EACH,SAAS,EACT,YAAY,IAAI,EAAE,EAClB,MAAM,IAAI,EAAE,CACb,CAAC;AACJ,CAAC;AACD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS;IAC7B,MAAM,qBAAqB,CAAC,SAAS,EAAE,CAAC;AAC1C,CAAC","sourcesContent":["import { GenericMetadata } from '../types';\nimport RNFishjamClientModule from '../RNFishjamClientModule';\n\nexport type ConnectionConfig = {\n /**\n * Configuration for automatic reconnection\n * sdk uses a linear backoff algorithm, that is the formula\n * for the delay of the nth attempt is\n * n * delayMs + initialDelayMs\n *\n * Pass 0 for maxAttempts to disable automatic reconnection\n */\n reconnectConfig?: {\n maxAttempts?: number;\n initialDelayMs?: number;\n delayMs?: number;\n };\n};\n\n/**\n * @ignore\n */\nexport async function joinRoom<\n PeerMetadata extends GenericMetadata = GenericMetadata,\n>(\n url: string,\n peerToken: string,\n peerMetadata?: PeerMetadata,\n config?: ConnectionConfig,\n) {\n await RNFishjamClientModule.joinRoom(\n url,\n peerToken,\n peerMetadata ?? {},\n config ?? {},\n );\n}\n/**\n * @ignore\n */\nexport async function leaveRoom() {\n await RNFishjamClientModule.leaveRoom();\n}\n"]}
@@ -3,6 +3,7 @@ import { GenericMetadata } from '../types';
3
3
  * Updates metadata send to other peers
4
4
  * @param peerMetadata string indexed record with metadata, that will be available to all other peers
5
5
  * @deprecated
6
+ * @ignore
6
7
  */
7
8
  export declare function updatePeerMetadata<PeerMetadata extends GenericMetadata = GenericMetadata>(peerMetadata: PeerMetadata): Promise<void>;
8
9
  //# sourceMappingURL=metadata.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../../src/common/metadata.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAG3C;;;;GAIG;AACH,wBAAsB,kBAAkB,CACtC,YAAY,SAAS,eAAe,GAAG,eAAe,EACtD,YAAY,EAAE,YAAY,iBAE3B"}
1
+ {"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../../src/common/metadata.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAG3C;;;;;GAKG;AACH,wBAAsB,kBAAkB,CACtC,YAAY,SAAS,eAAe,GAAG,eAAe,EACtD,YAAY,EAAE,YAAY,iBAE3B"}
@@ -3,6 +3,7 @@ import RNFishjamClientModule from '../RNFishjamClientModule';
3
3
  * Updates metadata send to other peers
4
4
  * @param peerMetadata string indexed record with metadata, that will be available to all other peers
5
5
  * @deprecated
6
+ * @ignore
6
7
  */
7
8
  export async function updatePeerMetadata(peerMetadata) {
8
9
  await RNFishjamClientModule.updatePeerMetadata(peerMetadata);
@@ -1 +1 @@
1
- {"version":3,"file":"metadata.js","sourceRoot":"","sources":["../../src/common/metadata.ts"],"names":[],"mappings":"AACA,OAAO,qBAAqB,MAAM,0BAA0B,CAAC;AAE7D;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAEtC,YAA0B;IAC1B,MAAM,qBAAqB,CAAC,kBAAkB,CAAC,YAAY,CAAC,CAAC;AAC/D,CAAC","sourcesContent":["import { GenericMetadata } from '../types';\nimport RNFishjamClientModule from '../RNFishjamClientModule';\n\n/**\n * Updates metadata send to other peers\n * @param peerMetadata string indexed record with metadata, that will be available to all other peers\n * @deprecated\n */\nexport async function updatePeerMetadata<\n PeerMetadata extends GenericMetadata = GenericMetadata,\n>(peerMetadata: PeerMetadata) {\n await RNFishjamClientModule.updatePeerMetadata(peerMetadata);\n}\n"]}
1
+ {"version":3,"file":"metadata.js","sourceRoot":"","sources":["../../src/common/metadata.ts"],"names":[],"mappings":"AACA,OAAO,qBAAqB,MAAM,0BAA0B,CAAC;AAE7D;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAEtC,YAA0B;IAC1B,MAAM,qBAAqB,CAAC,kBAAkB,CAAC,YAAY,CAAC,CAAC;AAC/D,CAAC","sourcesContent":["import { GenericMetadata } from '../types';\nimport RNFishjamClientModule from '../RNFishjamClientModule';\n\n/**\n * Updates metadata send to other peers\n * @param peerMetadata string indexed record with metadata, that will be available to all other peers\n * @deprecated\n * @ignore\n */\nexport async function updatePeerMetadata<\n PeerMetadata extends GenericMetadata = GenericMetadata,\n>(peerMetadata: PeerMetadata) {\n await RNFishjamClientModule.updatePeerMetadata(peerMetadata);\n}\n"]}
@@ -1,6 +1,27 @@
1
1
  export type FishjamRoomProps = {
2
+ /**
3
+ * URL to your fishjam instance
4
+ */
2
5
  fishjamUrl: string;
6
+ /**
7
+ * Peer Token
8
+ */
3
9
  peerToken: string;
4
10
  };
11
+ /**
12
+ * Simple component that enables your camera and show all tracks
13
+ *
14
+ * Example usage:
15
+ * ```tsx
16
+ * <FishjamRoom
17
+ * fishjamUrl={FISHJAM_URL}
18
+ * peerToken={PEER_TOKEN}
19
+ * />
20
+ * ```
21
+ * @category Components
22
+ * @param {object} props
23
+ * @param {string} props.fishjamUrl
24
+ * @param {string} props.peerToken
25
+ */
5
26
  export declare const FishjamRoom: ({ fishjamUrl, peerToken }: FishjamRoomProps) => import("react").JSX.Element;
6
27
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/FishjamRoom/index.tsx"],"names":[],"mappings":"AAMA,MAAM,MAAM,gBAAgB,GAAG;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,eAAO,MAAM,WAAW,8BAA+B,gBAAgB,gCA0BtE,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/FishjamRoom/index.tsx"],"names":[],"mappings":"AAMA,MAAM,MAAM,gBAAgB,GAAG;IAC7B;;OAEG;IACH,UAAU,EAAE,MAAM,CAAC;IACnB;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,WAAW,8BAA+B,gBAAgB,gCA8BtE,CAAC"}
@@ -3,19 +3,39 @@ import { joinRoom, leaveRoom } from '../../common/client';
3
3
  import { useCamera } from '../../hooks/useCamera';
4
4
  import { VideosGrid } from './VideosGrid';
5
5
  import { SafeAreaView } from 'react-native';
6
+ /**
7
+ * Simple component that enables your camera and show all tracks
8
+ *
9
+ * Example usage:
10
+ * ```tsx
11
+ * <FishjamRoom
12
+ * fishjamUrl={FISHJAM_URL}
13
+ * peerToken={PEER_TOKEN}
14
+ * />
15
+ * ```
16
+ * @category Components
17
+ * @param {object} props
18
+ * @param {string} props.fishjamUrl
19
+ * @param {string} props.peerToken
20
+ */
6
21
  export const FishjamRoom = ({ fishjamUrl, peerToken }) => {
7
22
  const { prepareCamera } = useCamera();
8
23
  useEffect(() => {
9
24
  const join = async () => {
10
- await prepareCamera({
11
- simulcastEnabled: false,
12
- quality: 'HD169',
13
- cameraEnabled: true,
14
- });
15
- await joinRoom(fishjamUrl, peerToken, {
16
- peer: {},
17
- server: {},
18
- });
25
+ try {
26
+ await prepareCamera({
27
+ simulcastEnabled: true,
28
+ quality: 'HD169',
29
+ cameraEnabled: true,
30
+ });
31
+ await joinRoom(fishjamUrl, peerToken, {
32
+ peer: {},
33
+ server: {},
34
+ });
35
+ }
36
+ catch (e) {
37
+ console.warn(e);
38
+ }
19
39
  };
20
40
  join();
21
41
  return () => {