@fishjam-cloud/react-native-client 0.8.1 → 0.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/android/src/main/java/io/fishjam/reactnative/EmitableEvents.kt +13 -1
- package/android/src/main/java/io/fishjam/reactnative/RNFishjamClient.kt +36 -5
- package/android/src/main/java/io/fishjam/reactnative/RNFishjamClientModule.kt +1 -1
- package/android/src/main/java/io/fishjam/reactnative/VideoRendererView.kt +17 -2
- package/android/src/main/java/io/fishjam/reactnative/VideoRendererViewModule.kt +2 -0
- package/build/RNFishjamClientModule.d.ts +6 -1
- package/build/RNFishjamClientModule.d.ts.map +1 -1
- package/build/RNFishjamClientModule.js +1 -0
- package/build/RNFishjamClientModule.js.map +1 -1
- package/build/components/FishjamRoom/GridTrackItem.d.ts +1 -0
- package/build/components/FishjamRoom/GridTrackItem.d.ts.map +1 -1
- package/build/components/FishjamRoom/GridTrackItem.js +1 -1
- package/build/components/FishjamRoom/GridTrackItem.js.map +1 -1
- package/build/components/FishjamRoom/index.d.ts.map +1 -1
- package/build/components/FishjamRoom/parsePeersToTracks.d.ts.map +1 -1
- package/build/components/FishjamRoom/parsePeersToTracks.js +3 -0
- package/build/components/FishjamRoom/parsePeersToTracks.js.map +1 -1
- package/build/components/VideoRendererView.d.ts +2 -2
- package/build/components/VideoRendererView.d.ts.map +1 -1
- package/build/components/VideoRendererView.js.map +1 -1
- package/build/hooks/usePeers.d.ts +4 -3
- package/build/hooks/usePeers.d.ts.map +1 -1
- package/build/hooks/usePeers.js +14 -3
- package/build/hooks/usePeers.js.map +1 -1
- package/build/hooks/useUpdatePeerMetadata.d.ts.map +1 -1
- package/build/utils/eventPayloadValidator.d.ts.map +1 -1
- package/build/utils/eventPayloadValidator.js +7 -22
- package/build/utils/eventPayloadValidator.js.map +1 -1
- package/ios/Events.swift +12 -2
- package/ios/RNFishjamClient.swift +25 -6
- package/ios/RNFishjamClientModule.swift +1 -4
- package/ios/VideoRendererView.swift +19 -4
- package/ios/VideoRendererViewModule.swift +2 -0
- package/package.json +6 -6
|
@@ -28,7 +28,8 @@ class EmitableEvent private constructor(
|
|
|
28
28
|
Warning,
|
|
29
29
|
PeerStatusChanged,
|
|
30
30
|
ReconnectionStatusChanged,
|
|
31
|
-
CurrentCameraChanged
|
|
31
|
+
CurrentCameraChanged,
|
|
32
|
+
TrackAspectRatioUpdated
|
|
32
33
|
}
|
|
33
34
|
|
|
34
35
|
val name: String
|
|
@@ -108,6 +109,17 @@ class EmitableEvent private constructor(
|
|
|
108
109
|
)
|
|
109
110
|
}
|
|
110
111
|
|
|
112
|
+
fun trackAspectRatioUpdated(
|
|
113
|
+
trackId: String,
|
|
114
|
+
aspectRatio: Double?
|
|
115
|
+
) = EmitableEvent(
|
|
116
|
+
EventName.TrackAspectRatioUpdated,
|
|
117
|
+
mapOf(
|
|
118
|
+
"trackId" to trackId,
|
|
119
|
+
"aspectRatio" to aspectRatio
|
|
120
|
+
)
|
|
121
|
+
)
|
|
122
|
+
|
|
111
123
|
val allEvents: Array<String>
|
|
112
124
|
get() = EventName.entries.map { it.name }.toTypedArray()
|
|
113
125
|
}
|
|
@@ -4,6 +4,7 @@ import android.app.Activity
|
|
|
4
4
|
import android.content.ActivityNotFoundException
|
|
5
5
|
import android.content.Intent
|
|
6
6
|
import android.media.projection.MediaProjectionManager
|
|
7
|
+
import android.util.Log
|
|
7
8
|
import androidx.appcompat.app.AppCompatActivity
|
|
8
9
|
import com.fishjamcloud.client.FishjamClient
|
|
9
10
|
import com.fishjamcloud.client.FishjamClientListener
|
|
@@ -46,7 +47,7 @@ import kotlinx.coroutines.launch
|
|
|
46
47
|
import org.webrtc.Logging
|
|
47
48
|
|
|
48
49
|
class RNFishjamClient(
|
|
49
|
-
val sendEvent: (name: String, data: Map<String, Any?>) -> Unit
|
|
50
|
+
private val sendEvent: (name: String, data: Map<String, Any?>) -> Unit
|
|
50
51
|
) : FishjamClientListener,
|
|
51
52
|
CaptureDeviceChangedListener {
|
|
52
53
|
private val SCREENSHARE_REQUEST = 1
|
|
@@ -134,16 +135,34 @@ class RNFishjamClient(
|
|
|
134
135
|
listOfPeers.add(localEndpoint)
|
|
135
136
|
return listOfPeers
|
|
136
137
|
}
|
|
138
|
+
|
|
139
|
+
private var eventEmitter: ((String, Map<String, Any?>) -> Unit)? = null
|
|
140
|
+
|
|
141
|
+
private fun setEventEmitter(emitter: ((String, Map<String, Any?>) -> Unit)?) {
|
|
142
|
+
if (emitter != null && eventEmitter != null) {
|
|
143
|
+
throw IllegalStateException("Event emitter already set.")
|
|
144
|
+
}
|
|
145
|
+
eventEmitter = emitter
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
fun sendEvent(event: EmitableEvent) {
|
|
149
|
+
if (eventEmitter == null) {
|
|
150
|
+
Log.e("RNFishjamClient", "Event emitter is not set.")
|
|
151
|
+
}
|
|
152
|
+
eventEmitter?.invoke(event.name, event.data)
|
|
153
|
+
}
|
|
137
154
|
}
|
|
138
155
|
|
|
139
156
|
fun onModuleCreate(appContext: AppContext) {
|
|
140
157
|
this.appContext = appContext
|
|
141
158
|
this.audioSwitchManager = AudioSwitchManager(appContext.reactContext!!)
|
|
159
|
+
setEventEmitter(sendEvent)
|
|
142
160
|
create()
|
|
143
161
|
}
|
|
144
162
|
|
|
145
163
|
fun onModuleDestroy() {
|
|
146
164
|
audioSwitchManager?.stop()
|
|
165
|
+
setEventEmitter(null)
|
|
147
166
|
}
|
|
148
167
|
|
|
149
168
|
private val coroutineScope: CoroutineScope =
|
|
@@ -459,7 +478,8 @@ class RNFishjamClient(
|
|
|
459
478
|
"type" to "Video",
|
|
460
479
|
"metadata" to track.metadata,
|
|
461
480
|
"encoding" to track.encoding?.rid,
|
|
462
|
-
"encodingReason" to track.encodingReason?.value
|
|
481
|
+
"encodingReason" to track.encodingReason?.value,
|
|
482
|
+
"aspectRatio" to track.dimensions?.aspectRatio
|
|
463
483
|
)
|
|
464
484
|
|
|
465
485
|
is RemoteAudioTrack ->
|
|
@@ -478,14 +498,16 @@ class RNFishjamClient(
|
|
|
478
498
|
mapOf(
|
|
479
499
|
"id" to track.id(),
|
|
480
500
|
"type" to "Video",
|
|
481
|
-
"metadata" to track.metadata
|
|
501
|
+
"metadata" to track.metadata,
|
|
502
|
+
"aspectRatio" to track.dimensions?.aspectRatio
|
|
482
503
|
)
|
|
483
504
|
|
|
484
505
|
is LocalScreenShareTrack ->
|
|
485
506
|
mapOf(
|
|
486
507
|
"id" to track.id(),
|
|
487
508
|
"type" to "Video",
|
|
488
|
-
"metadata" to track.metadata
|
|
509
|
+
"metadata" to track.metadata,
|
|
510
|
+
"aspectRatio" to track.dimensions?.aspectRatio
|
|
489
511
|
)
|
|
490
512
|
|
|
491
513
|
is LocalAudioTrack ->
|
|
@@ -796,7 +818,7 @@ class RNFishjamClient(
|
|
|
796
818
|
|
|
797
819
|
private fun emitEvent(event: EmitableEvent) {
|
|
798
820
|
CoroutineScope(Dispatchers.Main).launch {
|
|
799
|
-
sendEvent(event
|
|
821
|
+
RNFishjamClient.sendEvent(event)
|
|
800
822
|
}
|
|
801
823
|
}
|
|
802
824
|
|
|
@@ -927,4 +949,13 @@ class RNFishjamClient(
|
|
|
927
949
|
)
|
|
928
950
|
)
|
|
929
951
|
}
|
|
952
|
+
|
|
953
|
+
override fun onIncompatibleTracksDetected() {
|
|
954
|
+
// TODO: FCE-1215 Add proper url after docs are updated
|
|
955
|
+
emitEvent(
|
|
956
|
+
EmitableEvent.warning(
|
|
957
|
+
"Incompatible track detected. This usually means your device is missing codecs negotiated for the room. Visit https://docs.fishjam.io/category/react-native-integration for information."
|
|
958
|
+
)
|
|
959
|
+
)
|
|
960
|
+
}
|
|
930
961
|
}
|
|
@@ -2,6 +2,8 @@ package io.fishjam.reactnative
|
|
|
2
2
|
|
|
3
3
|
import android.content.Context
|
|
4
4
|
import com.fishjamcloud.client.media.VideoTrack
|
|
5
|
+
import com.fishjamcloud.client.media.VideoTrackListener
|
|
6
|
+
import com.fishjamcloud.client.models.Dimensions
|
|
5
7
|
import expo.modules.kotlin.AppContext
|
|
6
8
|
import io.fishjam.reactnative.managers.TrackUpdateListener
|
|
7
9
|
import kotlinx.coroutines.CoroutineScope
|
|
@@ -12,7 +14,8 @@ class VideoRendererView(
|
|
|
12
14
|
context: Context,
|
|
13
15
|
appContext: AppContext
|
|
14
16
|
) : VideoView(context, appContext),
|
|
15
|
-
TrackUpdateListener
|
|
17
|
+
TrackUpdateListener,
|
|
18
|
+
VideoTrackListener {
|
|
16
19
|
private var activeVideoTrack: VideoTrack? = null
|
|
17
20
|
private var trackId: String? = null
|
|
18
21
|
|
|
@@ -26,6 +29,7 @@ class VideoRendererView(
|
|
|
26
29
|
activeVideoTrack?.removeRenderer(videoView)
|
|
27
30
|
activeVideoTrack = videoTrack
|
|
28
31
|
|
|
32
|
+
videoTrack.setDimensionsListener(this)
|
|
29
33
|
videoTrack.addRenderer(videoView)
|
|
30
34
|
|
|
31
35
|
super.setupTrack()
|
|
@@ -47,7 +51,7 @@ class VideoRendererView(
|
|
|
47
51
|
|
|
48
52
|
override fun dispose() {
|
|
49
53
|
activeVideoTrack?.removeRenderer(videoView)
|
|
50
|
-
RNFishjamClient.trackUpdateListenersManager.
|
|
54
|
+
RNFishjamClient.trackUpdateListenersManager.remove(this)
|
|
51
55
|
super.dispose()
|
|
52
56
|
}
|
|
53
57
|
|
|
@@ -56,4 +60,15 @@ class VideoRendererView(
|
|
|
56
60
|
}
|
|
57
61
|
|
|
58
62
|
override fun getVideoTrack(): VideoTrack? = activeVideoTrack
|
|
63
|
+
|
|
64
|
+
override fun onDimensionsChanged(dimensions: Dimensions) {
|
|
65
|
+
if (trackId == null) return
|
|
66
|
+
|
|
67
|
+
RNFishjamClient.sendEvent(
|
|
68
|
+
EmitableEvent.trackAspectRatioUpdated(
|
|
69
|
+
trackId!!,
|
|
70
|
+
dimensions.aspectRatio
|
|
71
|
+
)
|
|
72
|
+
)
|
|
73
|
+
}
|
|
59
74
|
}
|
|
@@ -67,13 +67,14 @@ export declare const ReceivableEvents: {
|
|
|
67
67
|
readonly PeerStatusChanged: "PeerStatusChanged";
|
|
68
68
|
readonly ReconnectionStatusChanged: "ReconnectionStatusChanged";
|
|
69
69
|
readonly CurrentCameraChanged: "CurrentCameraChanged";
|
|
70
|
+
readonly TrackAspectRatioUpdated: "TrackAspectRatioUpdated";
|
|
70
71
|
};
|
|
71
72
|
export type ReceivableEventPayloads = {
|
|
72
73
|
[ReceivableEvents.IsMicrophoneOn]: boolean;
|
|
73
74
|
[ReceivableEvents.IsScreenShareOn]: boolean;
|
|
74
75
|
[ReceivableEvents.IsAppScreenShareOn]: boolean;
|
|
75
76
|
[ReceivableEvents.SimulcastConfigUpdate]: SimulcastConfig;
|
|
76
|
-
[ReceivableEvents.PeersUpdate]:
|
|
77
|
+
[ReceivableEvents.PeersUpdate]: void;
|
|
77
78
|
[ReceivableEvents.AudioDeviceUpdate]: OnAudioDeviceEvent;
|
|
78
79
|
[ReceivableEvents.BandwidthEstimation]: number | null;
|
|
79
80
|
[ReceivableEvents.ReconnectionRetriesLimitReached]: void;
|
|
@@ -83,6 +84,10 @@ export type ReceivableEventPayloads = {
|
|
|
83
84
|
[ReceivableEvents.PeerStatusChanged]: PeerStatus;
|
|
84
85
|
[ReceivableEvents.ReconnectionStatusChanged]: ReconnectionStatus;
|
|
85
86
|
[ReceivableEvents.CurrentCameraChanged]: CurrentCameraChangedType;
|
|
87
|
+
[ReceivableEvents.TrackAspectRatioUpdated]: {
|
|
88
|
+
trackId: string;
|
|
89
|
+
aspectRatio: number | null;
|
|
90
|
+
};
|
|
86
91
|
};
|
|
87
92
|
declare const _default: RNFishjamClient & NativeModule<Record<keyof typeof ReceivableEvents, (payload: ReceivableEventPayloads) => void>>;
|
|
88
93
|
export default _default;
|
|
@@ -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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"}
|
|
@@ -14,6 +14,7 @@ export const ReceivableEvents = {
|
|
|
14
14
|
PeerStatusChanged: 'PeerStatusChanged',
|
|
15
15
|
ReconnectionStatusChanged: 'ReconnectionStatusChanged',
|
|
16
16
|
CurrentCameraChanged: 'CurrentCameraChanged',
|
|
17
|
+
TrackAspectRatioUpdated: 'TrackAspectRatioUpdated',
|
|
17
18
|
};
|
|
18
19
|
export default requireNativeModule('RNFishjamClient');
|
|
19
20
|
//# sourceMappingURL=RNFishjamClientModule.js.map
|
|
@@ -1 +1 @@
|
|
|
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;
|
|
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;IAC5C,uBAAuB,EAAE,yBAAyB;CAC1C,CAAC;AAuBX,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 TrackAspectRatioUpdated: 'TrackAspectRatioUpdated',\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]: void;\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 [ReceivableEvents.TrackAspectRatioUpdated]: {\n trackId: string;\n aspectRatio: number | null;\n };\n};\n\nexport default requireNativeModule('RNFishjamClient') as RNFishjamClient &\n NativeModule<\n Record<\n keyof typeof ReceivableEvents,\n (payload: ReceivableEventPayloads) => void\n >\n >;\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GridTrackItem.d.ts","sourceRoot":"","sources":["../../../src/components/FishjamRoom/GridTrackItem.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAE7C,MAAM,MAAM,SAAS,GAAG;IACtB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"GridTrackItem.d.ts","sourceRoot":"","sources":["../../../src/components/FishjamRoom/GridTrackItem.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAE7C,MAAM,MAAM,SAAS,GAAG;IACtB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B,CAAC;AAEF,eAAO,MAAM,aAAa,GAAI,UAAU;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,gCAiC1D,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GridTrackItem.js","sourceRoot":"","sources":["../../../src/components/FishjamRoom/GridTrackItem.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAChC,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"GridTrackItem.js","sourceRoot":"","sources":["../../../src/components/FishjamRoom/GridTrackItem.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAChC,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAWzD,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,EAAE,IAAI,EAAuB,EAAE,EAAE;IAC7D,MAAM,cAAc,GAAG,OAAO,CAC5B,GAAG,EAAE,CAAC;QACJ,MAAM,CAAC,KAAK;QACZ;YACE,eAAe,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;SACtD;KACF,EACD,CAAC,IAAI,CAAC,OAAO,CAAC,CACf,CAAC;IAEF,OAAO,CACL,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAC5B;MAAA,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,CAC1B;QAAA,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CACZ,CAAC,iBAAiB,CAChB,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CACvB,WAAW,CAAC,KAAK,CACjB,KAAK,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,EAC3B,CACH,CAAC,CAAC,CAAC,CACF,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAC/B;YAAA,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CACtB;UAAA,EAAE,IAAI,CAAC,CACR,CACD;QAAA,CAAC,IAAI,CAAC,WAAW,IAAI,CACnB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAC1B;YAAA,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CACtB;UAAA,EAAE,IAAI,CAAC,CACR,CACH;MAAA,EAAE,IAAI,CACR;IAAA,EAAE,IAAI,CAAC,CACR,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC;IAC/B,SAAS,EAAE;QACT,IAAI,EAAE,CAAC;QACP,YAAY,EAAE,EAAE;KACjB;IACD,YAAY,EAAE;QACZ,IAAI,EAAE,CAAC;QACP,UAAU,EAAE,QAAQ;QACpB,cAAc,EAAE,QAAQ;KACzB;IACD,KAAK,EAAE;QACL,IAAI,EAAE,CAAC;QACP,WAAW,EAAE,CAAC;QACd,YAAY,EAAE,CAAC;QACf,QAAQ,EAAE,QAAQ;QAClB,WAAW,EAAE,SAAS;QACtB,WAAW,EAAE,CAAC;KACf;IACD,OAAO,EAAE;QACP,QAAQ,EAAE,UAAU;QACpB,GAAG,EAAE,EAAE;QACP,KAAK,EAAE,EAAE;QACT,OAAO,EAAE,GAAG;KACb;IACD,SAAS,EAAE;QACT,QAAQ,EAAE,UAAU;QACpB,MAAM,EAAE,EAAE;QACV,KAAK,EAAE,EAAE;QACT,OAAO,EAAE,GAAG;QACZ,eAAe,EAAE,SAAS;QAC1B,YAAY,EAAE,CAAC;QACf,OAAO,EAAE,CAAC;KACX;CACF,CAAC,CAAC","sourcesContent":["import { useMemo } from 'react';\nimport { View, StyleSheet, Text } from 'react-native';\nimport { VideoRendererView } from '../VideoRendererView';\nimport { Track } from '../../hooks/usePeers';\n\nexport type GridTrack = {\n track: Track | null;\n peerId: string;\n isLocal: boolean;\n isVadActive: boolean;\n aspectRatio: number | null;\n};\n\nexport const GridTrackItem = ({ peer }: { peer: GridTrack }) => {\n const videoContainer = useMemo(\n () => [\n styles.video,\n {\n backgroundColor: peer.isLocal ? '#606619' : '#7089DB',\n },\n ],\n [peer.isLocal],\n );\n\n return (\n <View style={styles.container}>\n <View style={videoContainer}>\n {peer.track ? (\n <VideoRendererView\n trackId={peer.track.id}\n videoLayout=\"FIT\"\n style={styles.videoContent}\n />\n ) : (\n <View style={styles.videoContent}>\n <Text>No video</Text>\n </View>\n )}\n {peer.isVadActive && (\n <View style={styles.vadIcon}>\n <Text>speaking</Text>\n </View>\n )}\n </View>\n </View>\n );\n};\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n marginBottom: 10,\n },\n videoContent: {\n flex: 1,\n alignItems: 'center',\n justifyContent: 'center',\n },\n video: {\n flex: 1,\n aspectRatio: 1,\n borderRadius: 8,\n overflow: 'hidden',\n borderColor: '#001A72',\n borderWidth: 2,\n },\n vadIcon: {\n position: 'absolute',\n top: 10,\n right: 10,\n opacity: 0.5,\n },\n userLabel: {\n position: 'absolute',\n bottom: 10,\n right: 10,\n opacity: 0.5,\n backgroundColor: '#F5F7FE',\n borderRadius: 4,\n padding: 3,\n },\n});\n"]}
|
|
@@ -1 +1 @@
|
|
|
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,
|
|
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,GAAI,2BAA2B,gBAAgB,gCA8BtE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parsePeersToTracks.d.ts","sourceRoot":"","sources":["../../../src/components/FishjamRoom/parsePeersToTracks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"parsePeersToTracks.d.ts","sourceRoot":"","sources":["../../../src/components/FishjamRoom/parsePeersToTracks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAwC5C,eAAO,MAAM,kBAAkB,GAC7B,WAAW,cAAc,GAAG,IAAI,EAChC,aAAa,cAAc,EAAE,KAC5B,SAAS,EAGX,CAAC"}
|
|
@@ -6,6 +6,7 @@ const createGridTracksFromPeer = (peer) => {
|
|
|
6
6
|
peerId: peer.id,
|
|
7
7
|
isLocal: peer.isLocal,
|
|
8
8
|
isVadActive: peer.microphoneTrack?.vadStatus === 'speech',
|
|
9
|
+
aspectRatio: peer.cameraTrack.aspectRatio,
|
|
9
10
|
});
|
|
10
11
|
}
|
|
11
12
|
if (peer.screenShareVideoTrack && peer.screenShareVideoTrack.isActive) {
|
|
@@ -14,6 +15,7 @@ const createGridTracksFromPeer = (peer) => {
|
|
|
14
15
|
peerId: peer.id,
|
|
15
16
|
isLocal: peer.isLocal,
|
|
16
17
|
isVadActive: peer.screenShareAudioTrack?.vadStatus === 'speech',
|
|
18
|
+
aspectRatio: peer.screenShareVideoTrack.aspectRatio,
|
|
17
19
|
});
|
|
18
20
|
}
|
|
19
21
|
if (tracks.length === 0) {
|
|
@@ -23,6 +25,7 @@ const createGridTracksFromPeer = (peer) => {
|
|
|
23
25
|
isLocal: peer.isLocal,
|
|
24
26
|
isVadActive: peer.microphoneTrack?.vadStatus === 'speech' ||
|
|
25
27
|
peer.screenShareAudioTrack?.vadStatus === 'speech',
|
|
28
|
+
aspectRatio: null,
|
|
26
29
|
});
|
|
27
30
|
}
|
|
28
31
|
return tracks;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parsePeersToTracks.js","sourceRoot":"","sources":["../../../src/components/FishjamRoom/parsePeersToTracks.ts"],"names":[],"mappings":"AAGA,MAAM,wBAAwB,GAAG,CAAC,IAAoB,EAAe,EAAE;IACrE,MAAM,MAAM,GAAgB,EAAE,CAAC;IAE/B,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;QAClD,MAAM,CAAC,IAAI,CAAC;YACV,KAAK,EAAE,IAAI,CAAC,WAAW;YACvB,MAAM,EAAE,IAAI,CAAC,EAAE;YACf,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,WAAW,EAAE,IAAI,CAAC,eAAe,EAAE,SAAS,KAAK,QAAQ;
|
|
1
|
+
{"version":3,"file":"parsePeersToTracks.js","sourceRoot":"","sources":["../../../src/components/FishjamRoom/parsePeersToTracks.ts"],"names":[],"mappings":"AAGA,MAAM,wBAAwB,GAAG,CAAC,IAAoB,EAAe,EAAE;IACrE,MAAM,MAAM,GAAgB,EAAE,CAAC;IAE/B,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;QAClD,MAAM,CAAC,IAAI,CAAC;YACV,KAAK,EAAE,IAAI,CAAC,WAAW;YACvB,MAAM,EAAE,IAAI,CAAC,EAAE;YACf,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,WAAW,EAAE,IAAI,CAAC,eAAe,EAAE,SAAS,KAAK,QAAQ;YACzD,WAAW,EAAE,IAAI,CAAC,WAAW,CAAC,WAAW;SAC1C,CAAC,CAAC;IACL,CAAC;IAED,IAAI,IAAI,CAAC,qBAAqB,IAAI,IAAI,CAAC,qBAAqB,CAAC,QAAQ,EAAE,CAAC;QACtE,MAAM,CAAC,IAAI,CAAC;YACV,KAAK,EAAE,IAAI,CAAC,qBAAqB;YACjC,MAAM,EAAE,IAAI,CAAC,EAAE;YACf,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,WAAW,EAAE,IAAI,CAAC,qBAAqB,EAAE,SAAS,KAAK,QAAQ;YAC/D,WAAW,EAAE,IAAI,CAAC,qBAAqB,CAAC,WAAW;SACpD,CAAC,CAAC;IACL,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,CAAC,IAAI,CAAC;YACV,KAAK,EAAE,IAAI;YACX,MAAM,EAAE,IAAI,CAAC,EAAE;YACf,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,WAAW,EACT,IAAI,CAAC,eAAe,EAAE,SAAS,KAAK,QAAQ;gBAC5C,IAAI,CAAC,qBAAqB,EAAE,SAAS,KAAK,QAAQ;YACpD,WAAW,EAAE,IAAI;SAClB,CAAC,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAChC,SAAgC,EAChC,WAA6B,EAChB,EAAE,CAAC;IAChB,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,wBAAwB,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACzD,GAAG,WAAW,CAAC,OAAO,CAAC,wBAAwB,CAAC;CACjD,CAAC","sourcesContent":["import { PeerWithTracks } from '../../hooks/usePeers';\nimport { GridTrack } from './GridTrackItem';\n\nconst createGridTracksFromPeer = (peer: PeerWithTracks): GridTrack[] => {\n const tracks: GridTrack[] = [];\n\n if (peer.cameraTrack && peer.cameraTrack.isActive) {\n tracks.push({\n track: peer.cameraTrack,\n peerId: peer.id,\n isLocal: peer.isLocal,\n isVadActive: peer.microphoneTrack?.vadStatus === 'speech',\n aspectRatio: peer.cameraTrack.aspectRatio,\n });\n }\n\n if (peer.screenShareVideoTrack && peer.screenShareVideoTrack.isActive) {\n tracks.push({\n track: peer.screenShareVideoTrack,\n peerId: peer.id,\n isLocal: peer.isLocal,\n isVadActive: peer.screenShareAudioTrack?.vadStatus === 'speech',\n aspectRatio: peer.screenShareVideoTrack.aspectRatio,\n });\n }\n\n if (tracks.length === 0) {\n tracks.push({\n track: null,\n peerId: peer.id,\n isLocal: peer.isLocal,\n isVadActive:\n peer.microphoneTrack?.vadStatus === 'speech' ||\n peer.screenShareAudioTrack?.vadStatus === 'speech',\n aspectRatio: null,\n });\n }\n\n return tracks;\n};\n\nexport const parsePeersToTracks = (\n localPeer: PeerWithTracks | null,\n remotePeers: PeerWithTracks[],\n): GridTrack[] => [\n ...(localPeer ? createGridTracksFromPeer(localPeer) : []),\n ...remotePeers.flatMap(createGridTracksFromPeer),\n];\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
|
-
import { ViewStyle } from 'react-native';
|
|
2
|
+
import { ViewStyle, StyleProp } from 'react-native';
|
|
3
3
|
import { VideoLayout } from '../types';
|
|
4
4
|
import type { TrackId } from '../hooks/usePeers';
|
|
5
5
|
export type VideoRendererProps = {
|
|
@@ -16,7 +16,7 @@ export type VideoRendererProps = {
|
|
|
16
16
|
* Whether the video should be rendered if it's off screen or hidden.
|
|
17
17
|
*/
|
|
18
18
|
skipRenderOutsideVisibleArea?: boolean;
|
|
19
|
-
style?: ViewStyle
|
|
19
|
+
style?: StyleProp<ViewStyle>;
|
|
20
20
|
};
|
|
21
21
|
/**
|
|
22
22
|
* Render video track received from {@link usePeers} hook
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VideoRendererView.d.ts","sourceRoot":"","sources":["../../src/components/VideoRendererView.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"VideoRendererView.d.ts","sourceRoot":"","sources":["../../src/components/VideoRendererView.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEpD,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAEjD,MAAM,MAAM,kBAAkB,GAAG;IAC/B;;OAEG;IACH,OAAO,EAAE,OAAO,CAAC;IACjB;;;OAGG;IACH,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B;;OAEG;IACH,4BAA4B,CAAC,EAAE,OAAO,CAAC;IACvC,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;CAC9B,CAAC;AAKF;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,iBAAiB,oHAM5B,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VideoRendererView.js","sourceRoot":"","sources":["../../src/components/VideoRendererView.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAuB/B,MAAM,UAAU,GACd,wBAAwB,CAAC,yBAAyB,CAAC,CAAC;AAEtD;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,CAAC,UAAU,CAG/C,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC;AAChB,gDAAgD;AAChD,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAG,CACpC,CAAC,CAAC","sourcesContent":["import { requireNativeViewManager } from 'expo-modules-core';\nimport * as React from 'react';\nimport { ViewStyle } from 'react-native';\n\nimport { VideoLayout } from '../types';\nimport type { TrackId } from '../hooks/usePeers';\n\nexport type VideoRendererProps = {\n /**\n * id of the video track which you want to render.\n */\n trackId: TrackId;\n /**\n * Video layout inside of the component\n * @default `FILL`\n */\n videoLayout?: VideoLayout;\n /**\n * Whether the video should be rendered if it's off screen or hidden.\n */\n skipRenderOutsideVisibleArea?: boolean;\n style?: ViewStyle
|
|
1
|
+
{"version":3,"file":"VideoRendererView.js","sourceRoot":"","sources":["../../src/components/VideoRendererView.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAuB/B,MAAM,UAAU,GACd,wBAAwB,CAAC,yBAAyB,CAAC,CAAC;AAEtD;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,CAAC,UAAU,CAG/C,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC;AAChB,gDAAgD;AAChD,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAG,CACpC,CAAC,CAAC","sourcesContent":["import { requireNativeViewManager } from 'expo-modules-core';\nimport * as React from 'react';\nimport { ViewStyle, StyleProp } from 'react-native';\n\nimport { VideoLayout } from '../types';\nimport type { TrackId } from '../hooks/usePeers';\n\nexport type VideoRendererProps = {\n /**\n * id of the video track which you want to render.\n */\n trackId: TrackId;\n /**\n * Video layout inside of the component\n * @default `FILL`\n */\n videoLayout?: VideoLayout;\n /**\n * Whether the video should be rendered if it's off screen or hidden.\n */\n skipRenderOutsideVisibleArea?: boolean;\n style?: StyleProp<ViewStyle>;\n};\n\nconst NativeView: React.ComponentType<VideoRendererProps> =\n requireNativeViewManager('VideoRendererViewModule');\n\n/**\n * Render video track received from {@link usePeers} hook\n *\n * Example usage:\n * ```tsx\n * <VideoRendererView\n * trackId={peer.track.id}\n * videoLayout=\"FIT\"\n * style={styles.videoContent}\n * />\n * ```\n *\n * @category Components\n *\n * @param {Object} props\n * @param props.trackId\n */\nexport const VideoRendererView = React.forwardRef<\n React.ComponentType<VideoRendererProps>,\n VideoRendererProps\n>((props, ref) => (\n // @ts-expect-error ref prop needs to be updated\n <NativeView {...props} ref={ref} />\n));\n"]}
|
|
@@ -25,6 +25,7 @@ export type AudioTrack = TrackBase & {
|
|
|
25
25
|
};
|
|
26
26
|
export type VideoTrack = TrackBase & {
|
|
27
27
|
type: 'Video';
|
|
28
|
+
aspectRatio: number;
|
|
28
29
|
};
|
|
29
30
|
export type Track = VideoTrack | AudioTrack;
|
|
30
31
|
/**
|
|
@@ -82,16 +83,16 @@ export declare function usePeers<PeerMetadata extends GenericMetadata = GenericM
|
|
|
82
83
|
* The local peer with distinguished tracks (camera, microphone, screen share).
|
|
83
84
|
* Will be null if the local peer is not found.
|
|
84
85
|
*/
|
|
85
|
-
localPeer: PeerWithTracks<
|
|
86
|
+
localPeer: PeerWithTracks<PeerMetadata, ServerMetadata> | null;
|
|
86
87
|
/**
|
|
87
88
|
* Array of remote peers with distinguished tracks (camera, microphone, screen share).
|
|
88
89
|
*/
|
|
89
|
-
remotePeers: PeerWithTracks<
|
|
90
|
+
remotePeers: PeerWithTracks<PeerMetadata, ServerMetadata>[];
|
|
90
91
|
/**
|
|
91
92
|
* @deprecated Use localPeer and remotePeers instead
|
|
92
93
|
* Legacy array containing all peers (both local and remote) without distinguished tracks.
|
|
93
94
|
* This property will be removed in future versions.
|
|
94
95
|
*/
|
|
95
|
-
peers: Peer<
|
|
96
|
+
peers: Peer<PeerMetadata, ServerMetadata>[];
|
|
96
97
|
};
|
|
97
98
|
//# sourceMappingURL=usePeers.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usePeers.d.ts","sourceRoot":"","sources":["../../src/hooks/usePeers.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAMjE,MAAM,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;AAC7C,MAAM,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;AAE/C,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,OAAO,CAAC;AAE1C;;;;;GAKG;AACH,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAC;AAE7C,MAAM,MAAM,iBAAiB,CAAC,YAAY,EAAE,cAAc,IAAI;IAC5D,IAAI,EAAE,YAAY,CAAC;IACnB,MAAM,EAAE,cAAc,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACtB,EAAE,EAAE,OAAO,CAAC;IACZ,IAAI,EAAE,SAAS,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,aAAa,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG;IACnC,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,EAAE,SAAS,GAAG,SAAS,CAAC;CAClC,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG;IACnC,IAAI,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"usePeers.d.ts","sourceRoot":"","sources":["../../src/hooks/usePeers.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAMjE,MAAM,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;AAC7C,MAAM,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;AAE/C,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,OAAO,CAAC;AAE1C;;;;;GAKG;AACH,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAC;AAE7C,MAAM,MAAM,iBAAiB,CAAC,YAAY,EAAE,cAAc,IAAI;IAC5D,IAAI,EAAE,YAAY,CAAC;IACnB,MAAM,EAAE,cAAc,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACtB,EAAE,EAAE,OAAO,CAAC;IACZ,IAAI,EAAE,SAAS,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,aAAa,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG;IACnC,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,EAAE,SAAS,GAAG,SAAS,CAAC;CAClC,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG;IACnC,IAAI,EAAE,OAAO,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,KAAK,GAAG,UAAU,GAAG,UAAU,CAAC;AAC5C;;;;;;GAMG;AACH,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,mBAAmB,GAAG,eAAe,CAAC;AAE7E,MAAM,MAAM,mBAAmB,GAAG;IAChC,WAAW,CAAC,EAAE,UAAU,CAAC;IACzB,eAAe,CAAC,EAAE,UAAU,CAAC;IAC7B,qBAAqB,CAAC,EAAE,UAAU,CAAC;IACnC,qBAAqB,CAAC,EAAE,UAAU,CAAC;CACpC,CAAC;AAEF,MAAM,MAAM,cAAc,CACxB,YAAY,SAAS,eAAe,GAAG,eAAe,EACtD,cAAc,SAAS,eAAe,GAAG,eAAe,IACtD,IAAI,CAAC,YAAY,EAAE,cAAc,CAAC,GAAG,mBAAmB,CAAC;AAE7D,MAAM,MAAM,IAAI,CACd,YAAY,SAAS,eAAe,GAAG,eAAe,EACtD,cAAc,SAAS,eAAe,GAAG,eAAe,IACtD;IACF;;OAEG;IACH,EAAE,EAAE,MAAM,CAAC;IACX;;OAEG;IACH,OAAO,EAAE,OAAO,CAAC;IACjB;;OAEG;IACH,QAAQ,EAAE,iBAAiB,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC;IAC1D;;OAEG;IACH,MAAM,EAAE,KAAK,EAAE,CAAC;CACjB,CAAC;AA6EF;;;;GAIG;AACH,MAAM,MAAM,cAAc,CACxB,YAAY,SAAS,eAAe,GAAG,eAAe,EACtD,cAAc,SAAS,eAAe,GAAG,eAAe,IACtD;IACF,SAAS,EAAE,cAAc,CAAC,YAAY,EAAE,cAAc,CAAC,GAAG,IAAI,CAAC;IAE/D,WAAW,EAAE,cAAc,CAAC,YAAY,EAAE,cAAc,CAAC,EAAE,CAAC;IAE5D,KAAK,EAAE,IAAI,CAAC,YAAY,EAAE,cAAc,CAAC,EAAE,CAAC;CAC7C,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,QAAQ,CACtB,YAAY,SAAS,eAAe,GAAG,eAAe,EACtD,cAAc,SAAS,eAAe,GAAG,eAAe;IAgBtD;;;OAGG;;IAEH;;OAEG;;IAEH;;;;OAIG;;EAGN"}
|
package/build/hooks/usePeers.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import { useMemo } from 'react';
|
|
1
|
+
import { useCallback, useMemo, useState } from 'react';
|
|
2
2
|
import RNFishjamClientModule, { ReceivableEvents, } from '../RNFishjamClientModule';
|
|
3
|
-
import {
|
|
3
|
+
import { useFishjamEvent } from './internal/useFishjamEvent';
|
|
4
|
+
// TODO: This should return a different metadata type if it's requiring it to have a certain field.
|
|
4
5
|
function addIsActiveToTracks(peers) {
|
|
5
6
|
return peers.map((peer) => ({
|
|
6
7
|
...peer,
|
|
@@ -35,6 +36,16 @@ function getPeerWithDistinguishedTracks(peer) {
|
|
|
35
36
|
...distinguishedTracks,
|
|
36
37
|
};
|
|
37
38
|
}
|
|
39
|
+
const usePeersEventState = () => {
|
|
40
|
+
const getTransformedPeers = useCallback(() => addIsActiveToTracks(RNFishjamClientModule.getPeers()), []);
|
|
41
|
+
const [value, setValue] = useState(getTransformedPeers());
|
|
42
|
+
const onEvent = useCallback(() => {
|
|
43
|
+
setValue(getTransformedPeers());
|
|
44
|
+
}, [getTransformedPeers]);
|
|
45
|
+
useFishjamEvent(ReceivableEvents.PeersUpdate, onEvent);
|
|
46
|
+
useFishjamEvent(ReceivableEvents.TrackAspectRatioUpdated, onEvent);
|
|
47
|
+
return value;
|
|
48
|
+
};
|
|
38
49
|
/**
|
|
39
50
|
* Hook that provides live updates of room peers.
|
|
40
51
|
* @template PeerMetadata - Type for peer-specific metadata
|
|
@@ -43,7 +54,7 @@ function getPeerWithDistinguishedTracks(peer) {
|
|
|
43
54
|
* @group Hooks
|
|
44
55
|
*/
|
|
45
56
|
export function usePeers() {
|
|
46
|
-
const peers =
|
|
57
|
+
const peers = usePeersEventState();
|
|
47
58
|
const localPeer = useMemo(() => {
|
|
48
59
|
const localPeerData = peers.find((peer) => peer.isLocal);
|
|
49
60
|
return localPeerData ? getPeerWithDistinguishedTracks(localPeerData) : null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usePeers.js","sourceRoot":"","sources":["../../src/hooks/usePeers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"usePeers.js","sourceRoot":"","sources":["../../src/hooks/usePeers.ts"],"names":[],"mappings":"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","sourcesContent":["import { useCallback, useMemo, useState } from 'react';\n\nimport { Brand, GenericMetadata, TrackMetadata } from '../types';\nimport RNFishjamClientModule, {\n ReceivableEvents,\n} from '../RNFishjamClientModule';\nimport { useFishjamEvent } from './internal/useFishjamEvent';\n\nexport type PeerId = Brand<string, 'PeerId'>;\nexport type TrackId = Brand<string, 'TrackId'>;\n\nexport type TrackType = 'Audio' | 'Video';\n\n/**\n * Type describing Voice Activity Detection statuses.\n *\n * - `speech` voice activity has been detected\n * - `silence` - lack of voice activity has been detected\n */\nexport type VadStatus = 'silence' | 'speech';\n\nexport type PeerTrackMetadata<PeerMetadata, ServerMetadata> = {\n peer: PeerMetadata;\n server: ServerMetadata;\n};\n\nexport type TrackBase = {\n id: TrackId;\n type: TrackType;\n isActive: boolean;\n metadata?: TrackMetadata;\n};\n\nexport type AudioTrack = TrackBase & {\n type: 'Audio';\n vadStatus: VadStatus | undefined;\n};\n\nexport type VideoTrack = TrackBase & {\n type: 'Video';\n aspectRatio: number;\n};\n\nexport type Track = VideoTrack | AudioTrack;\n/**\n * Type describing possible reasons of currently selected encoding.\n *\n * - other - the exact reason couldn't be determined\n * - encoding_inactive - previously selected encoding became inactive\n * - low_bandwidth - there is no longer enough bandwidth to maintain previously selected encoding\n */\nexport type EncodingReason = 'other' | 'encoding_inactive' | 'low_bandwidth';\n\nexport type DistinguishedTracks = {\n cameraTrack?: VideoTrack;\n microphoneTrack?: AudioTrack;\n screenShareVideoTrack?: VideoTrack;\n screenShareAudioTrack?: AudioTrack;\n};\n\nexport type PeerWithTracks<\n PeerMetadata extends GenericMetadata = GenericMetadata,\n ServerMetadata extends GenericMetadata = GenericMetadata,\n> = Peer<PeerMetadata, ServerMetadata> & DistinguishedTracks;\n\nexport type Peer<\n PeerMetadata extends GenericMetadata = GenericMetadata,\n ServerMetadata extends GenericMetadata = GenericMetadata,\n> = {\n /**\n * id used to identify a peer\n */\n id: PeerId;\n /**\n * whether the peer is local or remote\n */\n isLocal: boolean;\n /**\n * a type containing peer and server metadata\n */\n metadata: PeerTrackMetadata<PeerMetadata, ServerMetadata>;\n /**\n * a list of peer's video and audio tracks\n */\n tracks: Track[];\n};\n\n// TODO: This should return a different metadata type if it's requiring it to have a certain field.\nfunction addIsActiveToTracks<\n PeerMetadata extends GenericMetadata = GenericMetadata,\n ServerMetadata extends GenericMetadata = GenericMetadata,\n>(\n peers: ReadonlyArray<Peer<PeerMetadata, ServerMetadata>>,\n): Peer<PeerMetadata, ServerMetadata>[] {\n return peers.map((peer) => ({\n ...peer,\n tracks: peer.tracks.map((track) => ({\n ...track,\n isActive:\n (track as { metadata?: TrackMetadata })?.metadata?.active ?? true,\n })),\n }));\n}\n\nfunction getPeerWithDistinguishedTracks<\n PeerMetadata extends GenericMetadata = GenericMetadata,\n ServerMetadata extends GenericMetadata = GenericMetadata,\n>(\n peer: Peer<PeerMetadata, ServerMetadata>,\n): PeerWithTracks<PeerMetadata, ServerMetadata> {\n const { tracks: peerTracks } = peer;\n\n const distinguishedTracks: DistinguishedTracks = {};\n\n for (const track of peerTracks) {\n const trackType = track.metadata?.type;\n\n switch (trackType) {\n case 'camera':\n distinguishedTracks.cameraTrack = track as VideoTrack;\n break;\n case 'microphone':\n distinguishedTracks.microphoneTrack = track as AudioTrack;\n break;\n case 'screenShareVideo':\n distinguishedTracks.screenShareVideoTrack = track as VideoTrack;\n break;\n case 'screenShareAudio':\n distinguishedTracks.screenShareAudioTrack = track as AudioTrack;\n break;\n }\n }\n\n return {\n ...peer,\n ...distinguishedTracks,\n };\n}\n\nconst usePeersEventState = <\n PeerMetadata extends GenericMetadata = GenericMetadata,\n ServerMetadata extends GenericMetadata = GenericMetadata,\n>() => {\n const getTransformedPeers = useCallback(\n () =>\n addIsActiveToTracks(\n RNFishjamClientModule.getPeers<PeerMetadata, ServerMetadata>(),\n ),\n [],\n );\n\n const [value, setValue] = useState(getTransformedPeers());\n\n const onEvent = useCallback(() => {\n setValue(getTransformedPeers());\n }, [getTransformedPeers]);\n\n useFishjamEvent(ReceivableEvents.PeersUpdate, onEvent);\n useFishjamEvent(ReceivableEvents.TrackAspectRatioUpdated, onEvent);\n return value;\n};\n\n/**\n * Result type for the usePeers hook.\n * @template PeerMetadata - Type for peer-specific metadata\n * @template ServerMetadata - Type for server-specific metadata\n */\nexport type UsePeersResult<\n PeerMetadata extends GenericMetadata = GenericMetadata,\n ServerMetadata extends GenericMetadata = GenericMetadata,\n> = {\n localPeer: PeerWithTracks<PeerMetadata, ServerMetadata> | null;\n\n remotePeers: PeerWithTracks<PeerMetadata, ServerMetadata>[];\n\n peers: Peer<PeerMetadata, ServerMetadata>[];\n};\n\n/**\n * Hook that provides live updates of room peers.\n * @template PeerMetadata - Type for peer-specific metadata\n * @template ServerMetadata - Type for server-specific metadata\n * @category Connection\n * @group Hooks\n */\nexport function usePeers<\n PeerMetadata extends GenericMetadata = GenericMetadata,\n ServerMetadata extends GenericMetadata = GenericMetadata,\n>() {\n const peers = usePeersEventState<PeerMetadata, ServerMetadata>();\n\n const localPeer = useMemo(() => {\n const localPeerData = peers.find((peer) => peer.isLocal);\n return localPeerData ? getPeerWithDistinguishedTracks(localPeerData) : null;\n }, [peers]);\n\n const remotePeers = useMemo(\n () =>\n peers.filter((peer) => !peer.isLocal).map(getPeerWithDistinguishedTracks),\n [peers],\n );\n\n return {\n /**\n * The local peer with distinguished tracks (camera, microphone, screen share).\n * Will be null if the local peer is not found.\n */\n localPeer,\n /**\n * Array of remote peers with distinguished tracks (camera, microphone, screen share).\n */\n remotePeers,\n /**\n * @deprecated Use localPeer and remotePeers instead\n * Legacy array containing all peers (both local and remote) without distinguished tracks.\n * This property will be removed in future versions.\n */\n peers,\n };\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useUpdatePeerMetadata.d.ts","sourceRoot":"","sources":["../../src/hooks/useUpdatePeerMetadata.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAE3C;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,GAChC,YAAY,SAAS,eAAe;
|
|
1
|
+
{"version":3,"file":"useUpdatePeerMetadata.d.ts","sourceRoot":"","sources":["../../src/hooks/useUpdatePeerMetadata.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAE3C;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,GAChC,YAAY,SAAS,eAAe,GAAG,eAAe;IAOpD;;;;OAIG;uCATuD,YAAY;CAYzE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"eventPayloadValidator.d.ts","sourceRoot":"","sources":["../../src/utils/eventPayloadValidator.ts"],"names":[],"mappings":"AACA,OAAO,EACL,uBAAuB,EACvB,gBAAgB,EACjB,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"eventPayloadValidator.d.ts","sourceRoot":"","sources":["../../src/utils/eventPayloadValidator.ts"],"names":[],"mappings":"AACA,OAAO,EACL,uBAAuB,EACvB,gBAAgB,EACjB,MAAM,0BAA0B,CAAC;AAiClC,wBAAgB,0BAA0B,CACxC,CAAC,SAAS,MAAM,OAAO,gBAAgB,EACvC,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,uBAAuB,CAAC,CAAC,CAAC,GAAG,IAAI,CAoDzD"}
|
|
@@ -1,26 +1,5 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import { ReceivableEvents, } from '../RNFishjamClientModule';
|
|
3
|
-
const BaseTrackSchema = z.object({
|
|
4
|
-
id: z.string(),
|
|
5
|
-
metadata: z.object({}).passthrough(),
|
|
6
|
-
});
|
|
7
|
-
const AudioTrackSchema = BaseTrackSchema.extend({
|
|
8
|
-
type: z.literal('Audio'),
|
|
9
|
-
vadStatus: z.enum(['silence', 'speech']).optional(),
|
|
10
|
-
});
|
|
11
|
-
const VideoTrackSchema = BaseTrackSchema.extend({
|
|
12
|
-
type: z.literal('Video'),
|
|
13
|
-
});
|
|
14
|
-
const TrackSchema = z.discriminatedUnion('type', [
|
|
15
|
-
AudioTrackSchema,
|
|
16
|
-
VideoTrackSchema,
|
|
17
|
-
]);
|
|
18
|
-
const PeerSchema = z.object({
|
|
19
|
-
id: z.string(),
|
|
20
|
-
isLocal: z.boolean(),
|
|
21
|
-
tracks: z.array(TrackSchema),
|
|
22
|
-
metadata: z.object({}).passthrough(),
|
|
23
|
-
});
|
|
24
3
|
const SimulcastConfigSchema = z.object({
|
|
25
4
|
enabled: z.boolean(),
|
|
26
5
|
activeEncodings: z.array(z.enum(['l', 'm', 'h'])),
|
|
@@ -42,6 +21,10 @@ const CameraChangedEventSchema = z.object({
|
|
|
42
21
|
isCameraOn: z.boolean(),
|
|
43
22
|
currentCamera: CameraSchema.nullable(),
|
|
44
23
|
});
|
|
24
|
+
const TrackAspectRatioUpdatedEventSchema = z.object({
|
|
25
|
+
trackId: z.string(),
|
|
26
|
+
aspectRatio: z.number(),
|
|
27
|
+
});
|
|
45
28
|
export function validateNativeEventPayload(eventName, payload) {
|
|
46
29
|
switch (eventName) {
|
|
47
30
|
case ReceivableEvents.IsMicrophoneOn:
|
|
@@ -53,7 +36,6 @@ export function validateNativeEventPayload(eventName, payload) {
|
|
|
53
36
|
SimulcastConfigSchema.parse(payload);
|
|
54
37
|
break;
|
|
55
38
|
case ReceivableEvents.PeersUpdate:
|
|
56
|
-
z.array(PeerSchema).parse(payload);
|
|
57
39
|
break;
|
|
58
40
|
case ReceivableEvents.AudioDeviceUpdate:
|
|
59
41
|
AudioDeviceEventSchema.parse(payload);
|
|
@@ -78,6 +60,9 @@ export function validateNativeEventPayload(eventName, payload) {
|
|
|
78
60
|
case ReceivableEvents.CurrentCameraChanged:
|
|
79
61
|
CameraChangedEventSchema.parse(payload);
|
|
80
62
|
break;
|
|
63
|
+
case ReceivableEvents.TrackAspectRatioUpdated:
|
|
64
|
+
TrackAspectRatioUpdatedEventSchema.parse(payload);
|
|
65
|
+
break;
|
|
81
66
|
default:
|
|
82
67
|
throw new Error(`Unknown event: ${eventName}`);
|
|
83
68
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"eventPayloadValidator.js","sourceRoot":"","sources":["../../src/utils/eventPayloadValidator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAEL,gBAAgB,GACjB,MAAM,0BAA0B,CAAC;AAElC,MAAM,
|
|
1
|
+
{"version":3,"file":"eventPayloadValidator.js","sourceRoot":"","sources":["../../src/utils/eventPayloadValidator.ts"],"names":[],"mappings":"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","sourcesContent":["import { z } from 'zod';\nimport {\n ReceivableEventPayloads,\n ReceivableEvents,\n} from '../RNFishjamClientModule';\n\nconst SimulcastConfigSchema = z.object({\n enabled: z.boolean(),\n activeEncodings: z.array(z.enum(['l', 'm', 'h'])),\n});\n\nconst AudioOutputDeviceSchema = z.object({\n name: z.string(),\n type: z.enum(['bluetooth', 'headset', 'speaker', 'earpiece']),\n});\n\nconst AudioDeviceEventSchema = z.object({\n availableDevices: z.array(AudioOutputDeviceSchema),\n selectedDevice: AudioOutputDeviceSchema.nullable(),\n});\n\nconst CameraSchema = z.object({\n id: z.string(),\n name: z.string(),\n facingDirection: z.enum(['front', 'back', 'unspecified']),\n});\n\nconst CameraChangedEventSchema = z.object({\n isCameraOn: z.boolean(),\n currentCamera: CameraSchema.nullable(),\n});\n\nconst TrackAspectRatioUpdatedEventSchema = z.object({\n trackId: z.string(),\n aspectRatio: z.number(),\n});\n\nexport function validateNativeEventPayload<\n T extends keyof typeof ReceivableEvents,\n>(eventName: T, payload: ReceivableEventPayloads[T]): void {\n switch (eventName) {\n case ReceivableEvents.IsMicrophoneOn:\n case ReceivableEvents.IsScreenShareOn:\n case ReceivableEvents.IsAppScreenShareOn:\n z.boolean().parse(payload);\n break;\n\n case ReceivableEvents.SimulcastConfigUpdate:\n SimulcastConfigSchema.parse(payload);\n break;\n\n case ReceivableEvents.PeersUpdate:\n break;\n\n case ReceivableEvents.AudioDeviceUpdate:\n AudioDeviceEventSchema.parse(payload);\n break;\n\n case ReceivableEvents.BandwidthEstimation:\n z.number().nullable().parse(payload);\n break;\n\n case ReceivableEvents.ReconnectionRetriesLimitReached:\n case ReceivableEvents.ReconnectionStarted:\n case ReceivableEvents.Reconnected:\n z.undefined().parse(payload);\n break;\n\n case ReceivableEvents.Warning:\n z.string().parse(payload);\n break;\n\n case ReceivableEvents.PeerStatusChanged:\n z.enum(['connecting', 'connected', 'error', 'idle']).parse(payload);\n break;\n\n case ReceivableEvents.ReconnectionStatusChanged:\n z.enum(['connecting', 'connected', 'error']).parse(payload);\n break;\n\n case ReceivableEvents.CurrentCameraChanged:\n CameraChangedEventSchema.parse(payload);\n break;\n\n case ReceivableEvents.TrackAspectRatioUpdated:\n TrackAspectRatioUpdatedEventSchema.parse(payload);\n break;\n\n default:\n throw new Error(`Unknown event: ${eventName}`);\n }\n}\n"]}
|
package/ios/Events.swift
CHANGED
|
@@ -21,6 +21,7 @@ class EmitableEvent {
|
|
|
21
21
|
case PeerStatusChanged
|
|
22
22
|
case ReconnectionStatusChanged
|
|
23
23
|
case CurrentCameraChanged
|
|
24
|
+
case TrackAspectRatioUpdated
|
|
24
25
|
|
|
25
26
|
var name: String {
|
|
26
27
|
rawValue
|
|
@@ -78,8 +79,17 @@ class EmitableEvent {
|
|
|
78
79
|
])
|
|
79
80
|
}
|
|
80
81
|
|
|
81
|
-
static func peersUpdate(
|
|
82
|
-
return .init(event: .PeersUpdate
|
|
82
|
+
static func peersUpdate() -> EmitableEvent {
|
|
83
|
+
return .init(event: .PeersUpdate)
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
static func trackAspectRatioUpdated(trackId: String, aspectRatio: Double?) -> EmitableEvent {
|
|
87
|
+
return .init(
|
|
88
|
+
event: .TrackAspectRatioUpdated,
|
|
89
|
+
eventContent: [
|
|
90
|
+
"trackId": trackId,
|
|
91
|
+
"aspectRatio": aspectRatio as Any,
|
|
92
|
+
])
|
|
83
93
|
}
|
|
84
94
|
|
|
85
95
|
static func audioDeviceUpdate(currentRoute: AVAudioSessionRouteDescription) -> EmitableEvent {
|
|
@@ -63,13 +63,15 @@ class RNFishjamClient: FishjamClientListener {
|
|
|
63
63
|
}
|
|
64
64
|
}
|
|
65
65
|
|
|
66
|
-
|
|
66
|
+
static private(set) var sendEvent: ((_ event: EmitableEvent) -> Void)?
|
|
67
67
|
|
|
68
68
|
static var tracksUpdateListenersManager = TracksUpdateListenersManager()
|
|
69
69
|
static var localCameraTracksChangedListenersManager = LocalCameraTracksChangedListenersManager()
|
|
70
70
|
|
|
71
|
-
init(
|
|
72
|
-
|
|
71
|
+
init(_ eventEmitter: @escaping (_ eventName: String, _ data: [String: Any?]) -> Void) {
|
|
72
|
+
RNFishjamClient.sendEvent = { event in
|
|
73
|
+
eventEmitter(event.event.name, event.data)
|
|
74
|
+
}
|
|
73
75
|
NotificationCenter.default.addObserver(
|
|
74
76
|
self,
|
|
75
77
|
selector: #selector(onRouteChangeNotification),
|
|
@@ -78,6 +80,10 @@ class RNFishjamClient: FishjamClientListener {
|
|
|
78
80
|
)
|
|
79
81
|
}
|
|
80
82
|
|
|
83
|
+
deinit {
|
|
84
|
+
RNFishjamClient.sendEvent = nil
|
|
85
|
+
}
|
|
86
|
+
|
|
81
87
|
private func getSimulcastConfigFromOptions(simulcastConfig: RNSimulcastConfig) throws -> SimulcastConfig {
|
|
82
88
|
// iOS has a limit of 3 hardware encoders
|
|
83
89
|
// 3 simulcast layers + 1 screen share layer = 4, which is too much
|
|
@@ -519,6 +525,7 @@ class RNFishjamClient: FishjamClientListener {
|
|
|
519
525
|
"metadata": track.metadata.toDict(),
|
|
520
526
|
"encoding": track.encoding?.description,
|
|
521
527
|
"encodingReason": track.encodingReason?.rawValue,
|
|
528
|
+
"aspectRatio": track.dimensions?.aspectRatio,
|
|
522
529
|
]
|
|
523
530
|
|
|
524
531
|
case let track as RemoteAudioTrack:
|
|
@@ -534,6 +541,7 @@ class RNFishjamClient: FishjamClientListener {
|
|
|
534
541
|
"id": track.id,
|
|
535
542
|
"type": "Video",
|
|
536
543
|
"metadata": track.metadata.toDict(),
|
|
544
|
+
"aspectRatio": track.dimensions?.aspectRatio,
|
|
537
545
|
]
|
|
538
546
|
|
|
539
547
|
case let track as LocalBroadcastScreenShareTrack:
|
|
@@ -541,6 +549,7 @@ class RNFishjamClient: FishjamClientListener {
|
|
|
541
549
|
"id": track.id,
|
|
542
550
|
"type": "Video",
|
|
543
551
|
"metadata": track.metadata.toDict(),
|
|
552
|
+
"aspectRatio": track.dimensions?.aspectRatio,
|
|
544
553
|
]
|
|
545
554
|
|
|
546
555
|
case let track as LocalAppScreenShareTrack:
|
|
@@ -548,6 +557,7 @@ class RNFishjamClient: FishjamClientListener {
|
|
|
548
557
|
"id": track.id,
|
|
549
558
|
"type": "Video",
|
|
550
559
|
"metadata": track.metadata.toDict(),
|
|
560
|
+
"aspectRatio": track.dimensions?.aspectRatio,
|
|
551
561
|
]
|
|
552
562
|
|
|
553
563
|
case let track as LocalAudioTrack:
|
|
@@ -776,13 +786,13 @@ class RNFishjamClient: FishjamClientListener {
|
|
|
776
786
|
}
|
|
777
787
|
|
|
778
788
|
func emit(event: EmitableEvent) {
|
|
779
|
-
DispatchQueue.main.async {
|
|
780
|
-
|
|
789
|
+
DispatchQueue.main.async {
|
|
790
|
+
RNFishjamClient.sendEvent?(event)
|
|
781
791
|
}
|
|
782
792
|
}
|
|
783
793
|
|
|
784
794
|
func emitEndpoints() {
|
|
785
|
-
emit(event: .peersUpdate(
|
|
795
|
+
emit(event: .peersUpdate())
|
|
786
796
|
}
|
|
787
797
|
|
|
788
798
|
func onJoined(peerID: String, peersInRoom: [String: Endpoint]) {
|
|
@@ -918,6 +928,15 @@ class RNFishjamClient: FishjamClientListener {
|
|
|
918
928
|
reconnectionStatus = .error
|
|
919
929
|
}
|
|
920
930
|
|
|
931
|
+
func onIncompatibleTracksDetected() {
|
|
932
|
+
// TODO: FCE-1215 Add proper url after docs are updated
|
|
933
|
+
emit(
|
|
934
|
+
event: .warning(
|
|
935
|
+
message:
|
|
936
|
+
"Incompatible track detected. This usually means your device is missing codecs negotiated for the room. Visit https://docs.fishjam.io/category/react-native-integration for information."
|
|
937
|
+
))
|
|
938
|
+
}
|
|
939
|
+
|
|
921
940
|
}
|
|
922
941
|
|
|
923
942
|
extension RNFishjamClient: CameraCapturerDeviceChangedListener {
|
|
@@ -65,10 +65,7 @@ typealias RNTrackBandwidthLimit = Either<Int, [String: Int]>
|
|
|
65
65
|
public class RNFishjamClientModule: Module {
|
|
66
66
|
public func definition() -> ModuleDefinition {
|
|
67
67
|
let rnFishjamClient: RNFishjamClient = {
|
|
68
|
-
let client = RNFishjamClient
|
|
69
|
-
(eventName: String, data: [String: Any?]) in
|
|
70
|
-
self.sendEvent(eventName, data)
|
|
71
|
-
}
|
|
68
|
+
let client = RNFishjamClient(sendEvent)
|
|
72
69
|
client.create()
|
|
73
70
|
return client
|
|
74
71
|
}()
|
|
@@ -2,15 +2,17 @@ import Combine
|
|
|
2
2
|
import ExpoModulesCore
|
|
3
3
|
import FishjamCloudClient
|
|
4
4
|
|
|
5
|
-
class VideoRendererView: ExpoView, TrackUpdateListener {
|
|
6
|
-
|
|
7
|
-
var cancellableEndpoints: Cancellable?
|
|
5
|
+
class VideoRendererView: ExpoView, TrackUpdateListener, VideoViewDelegate {
|
|
6
|
+
let videoView: VideoView
|
|
8
7
|
|
|
9
8
|
required init(appContext: AppContext? = nil) {
|
|
10
|
-
super.init(appContext: appContext)
|
|
11
9
|
videoView = VideoView()
|
|
12
10
|
videoView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
|
|
13
11
|
videoView.clipsToBounds = true
|
|
12
|
+
|
|
13
|
+
super.init(appContext: appContext)
|
|
14
|
+
|
|
15
|
+
videoView.delegate = self
|
|
14
16
|
}
|
|
15
17
|
|
|
16
18
|
override func willMove(toSuperview newSuperview: UIView?) {
|
|
@@ -80,4 +82,17 @@ class VideoRendererView: ExpoView, TrackUpdateListener {
|
|
|
80
82
|
videoView.checkVisibilityTimeInterval = checkVisibilityTimeInterval
|
|
81
83
|
}
|
|
82
84
|
}
|
|
85
|
+
|
|
86
|
+
func didChange(dimensions newDimensions: FishjamCloudClient.Dimensions) {
|
|
87
|
+
DispatchQueue.main.async { [weak self] in
|
|
88
|
+
guard let self else { return }
|
|
89
|
+
|
|
90
|
+
let event = EmitableEvent.trackAspectRatioUpdated(
|
|
91
|
+
trackId: trackId,
|
|
92
|
+
aspectRatio: newDimensions.aspectRatio
|
|
93
|
+
)
|
|
94
|
+
|
|
95
|
+
RNFishjamClient.sendEvent?(event)
|
|
96
|
+
}
|
|
97
|
+
}
|
|
83
98
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fishjam-cloud/react-native-client",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.14.0",
|
|
4
4
|
"description": "A React Native client for Fishjam",
|
|
5
5
|
"author": "Fishjam Team",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -42,15 +42,15 @@
|
|
|
42
42
|
"dependencies": {
|
|
43
43
|
"promise-fs": "^2.1.1",
|
|
44
44
|
"protobufjs": "^7.4.0",
|
|
45
|
-
"zod": "^3.24.
|
|
45
|
+
"zod": "^3.24.2"
|
|
46
46
|
},
|
|
47
47
|
"devDependencies": {
|
|
48
48
|
"@testing-library/dom": "^10.4.0",
|
|
49
49
|
"@testing-library/react": "^16.0.1",
|
|
50
|
-
"@types/lodash": "^4.17.
|
|
50
|
+
"@types/lodash": "^4.17.16",
|
|
51
51
|
"@types/promise-fs": "^2.1.2",
|
|
52
52
|
"@types/react": "^18.3.12",
|
|
53
|
-
"expo-module-scripts": "^4.0.
|
|
53
|
+
"expo-module-scripts": "^4.0.4",
|
|
54
54
|
"husky": "^9.1.7",
|
|
55
55
|
"jest": "^29.6.1",
|
|
56
56
|
"jest-environment-jsdom": "^29.6.1",
|
|
@@ -59,9 +59,9 @@
|
|
|
59
59
|
"pod-install": "^0.3.4",
|
|
60
60
|
"react-dom": "^18.3.1",
|
|
61
61
|
"ts-proto": "^2.6.1",
|
|
62
|
-
"typedoc": "^0.27.
|
|
62
|
+
"typedoc": "^0.27.9",
|
|
63
63
|
"typedoc-plugin-mark-react-functional-components": "^0.2.2",
|
|
64
|
-
"typescript": "^5.
|
|
64
|
+
"typescript": "^5.8.2"
|
|
65
65
|
},
|
|
66
66
|
"peerDependencies": {
|
|
67
67
|
"expo": "*",
|