@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.
- package/README.md +6 -6
- package/android/build.gradle +6 -2
- package/android/src/main/java/io/fishjam/reactnative/EmitableEvents.kt +4 -2
- package/android/src/main/java/io/fishjam/reactnative/RNFishjamClient.kt +60 -39
- package/android/src/main/java/io/fishjam/reactnative/RNFishjamClientModule.kt +11 -19
- package/build/RNFishjamClientModule.d.ts +24 -8
- package/build/RNFishjamClientModule.d.ts.map +1 -1
- package/build/RNFishjamClientModule.js +0 -1
- package/build/RNFishjamClientModule.js.map +1 -1
- package/build/common/client.d.ts +4 -4
- package/build/common/client.d.ts.map +1 -1
- package/build/common/client.js +4 -4
- package/build/common/client.js.map +1 -1
- package/build/common/metadata.d.ts +1 -0
- package/build/common/metadata.d.ts.map +1 -1
- package/build/common/metadata.js +1 -0
- package/build/common/metadata.js.map +1 -1
- package/build/components/FishjamRoom/index.d.ts +21 -0
- package/build/components/FishjamRoom/index.d.ts.map +1 -1
- package/build/components/FishjamRoom/index.js +29 -9
- package/build/components/FishjamRoom/index.js.map +1 -1
- package/build/components/VideoPreviewView.d.ts +7 -3
- package/build/components/VideoPreviewView.d.ts.map +1 -1
- package/build/components/VideoPreviewView.js +5 -1
- package/build/components/VideoPreviewView.js.map +1 -1
- package/build/components/VideoRendererView.d.ts +13 -0
- package/build/components/VideoRendererView.d.ts.map +1 -1
- package/build/components/VideoRendererView.js +13 -0
- package/build/components/VideoRendererView.js.map +1 -1
- package/build/hooks/internal/useFishjamEvent.d.ts +3 -2
- package/build/hooks/internal/useFishjamEvent.d.ts.map +1 -1
- package/build/hooks/internal/useFishjamEvent.js +25 -1
- package/build/hooks/internal/useFishjamEvent.js.map +1 -1
- package/build/hooks/internal/useFishjamEventState.d.ts +2 -2
- package/build/hooks/internal/useFishjamEventState.d.ts.map +1 -1
- package/build/hooks/internal/useFishjamEventState.js.map +1 -1
- package/build/hooks/useAppScreenShare.d.ts +10 -1
- package/build/hooks/useAppScreenShare.d.ts.map +1 -1
- package/build/hooks/useAppScreenShare.js +9 -7
- package/build/hooks/useAppScreenShare.js.map +1 -1
- package/build/hooks/useAudioSettings.d.ts +4 -0
- package/build/hooks/useAudioSettings.d.ts.map +1 -1
- package/build/hooks/useAudioSettings.js.map +1 -1
- package/build/hooks/useBandwidthEstimation.d.ts +3 -0
- package/build/hooks/useBandwidthEstimation.d.ts.map +1 -1
- package/build/hooks/useBandwidthEstimation.js +6 -1
- package/build/hooks/useBandwidthEstimation.js.map +1 -1
- package/build/hooks/useCamera.d.ts +12 -35
- package/build/hooks/useCamera.d.ts.map +1 -1
- package/build/hooks/useCamera.js +11 -60
- package/build/hooks/useCamera.js.map +1 -1
- package/build/hooks/useConnection.d.ts +29 -13
- package/build/hooks/useConnection.d.ts.map +1 -1
- package/build/hooks/useConnection.js +11 -5
- package/build/hooks/useConnection.js.map +1 -1
- package/build/hooks/useForegroundService.d.ts +20 -11
- package/build/hooks/useForegroundService.d.ts.map +1 -1
- package/build/hooks/useForegroundService.js +2 -3
- package/build/hooks/useForegroundService.js.map +1 -1
- package/build/hooks/useMicrophone.js.map +1 -1
- package/build/hooks/usePeerStatus.d.ts +2 -10
- package/build/hooks/usePeerStatus.d.ts.map +1 -1
- package/build/hooks/usePeerStatus.js +1 -0
- package/build/hooks/usePeerStatus.js.map +1 -1
- package/build/hooks/usePeers.d.ts +19 -22
- package/build/hooks/usePeers.d.ts.map +1 -1
- package/build/hooks/usePeers.js +17 -5
- package/build/hooks/usePeers.js.map +1 -1
- package/build/hooks/useReconnection.d.ts +2 -2
- package/build/hooks/useReconnection.d.ts.map +1 -1
- package/build/hooks/useReconnection.js +1 -0
- package/build/hooks/useReconnection.js.map +1 -1
- package/build/hooks/useScreenShare.d.ts +2 -23
- package/build/hooks/useScreenShare.d.ts.map +1 -1
- package/build/hooks/useScreenShare.js +1 -36
- package/build/hooks/useScreenShare.js.map +1 -1
- package/build/index.d.ts +6 -7
- package/build/index.d.ts.map +1 -1
- package/build/index.js +0 -2
- package/build/index.js.map +1 -1
- package/build/types.d.ts +3 -19
- package/build/types.d.ts.map +1 -1
- package/build/types.js.map +1 -1
- package/build/utils/eventPayloadValidator.d.ts +3 -0
- package/build/utils/eventPayloadValidator.d.ts.map +1 -0
- package/build/utils/eventPayloadValidator.js +85 -0
- package/build/utils/eventPayloadValidator.js.map +1 -0
- package/ios/Events.swift +4 -1
- package/ios/RNFishjamClient.podspec +1 -1
- package/ios/RNFishjamClient.swift +60 -48
- package/ios/RNFishjamClientModule.swift +5 -10
- package/ios/VideoPreviewView.swift +5 -0
- package/ios/VideoRendererView.swift +5 -0
- package/package.json +21 -14
- package/plugin/build/withFishjamAndroid.js +1 -0
- package/plugin/build/withFishjamIos.js +17 -7
- package/build/common/webRTC.d.ts +0 -14
- package/build/common/webRTC.d.ts.map +0 -1
- package/build/common/webRTC.js +0 -15
- package/build/common/webRTC.js.map +0 -1
- /package/{LICENSE → LICENSE.txt} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useScreenShare.d.ts","sourceRoot":"","sources":["../../src/hooks/useScreenShare.ts"],"names":[],"mappings":"AAEA,OAAO,
|
|
1
|
+
{"version":3,"file":"useScreenShare.d.ts","sourceRoot":"","sources":["../../src/hooks/useScreenShare.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAO1D,MAAM,MAAM,kBAAkB,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC;AAE5E,MAAM,MAAM,kBAAkB,GAAG;IAC/B;;;;;OAKG;IACH,OAAO,EAAE,kBAAkB,CAAC;CAC7B,CAAC;AACF,MAAM,MAAM,0BAA0B,GAAG;IACvC,mBAAmB,EAAE,aAAa,GAAG;QAAE,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9D;;OAEG;IACH,eAAe,EAAE,eAAe,CAAC;CAClC,CAAC;AASF;;;;;GAKG;AACH,wBAAgB,cAAc;;;IA2C1B;;;OAGG;6CA3BwB,OAAO,CAAC,kBAAkB,CAAC;;EA+BzD"}
|
|
@@ -4,27 +4,17 @@ import { Platform } from 'react-native';
|
|
|
4
4
|
import { useFishjamEventState } from './internal/useFishjamEventState';
|
|
5
5
|
const defaultSimulcastConfig = () => ({
|
|
6
6
|
enabled: false,
|
|
7
|
-
activeEncodings: [],
|
|
8
7
|
});
|
|
9
8
|
let screenShareSimulcastConfig = defaultSimulcastConfig();
|
|
10
9
|
/**
|
|
11
10
|
* This hook can toggle screen sharing on/off and provides current screen share state.
|
|
12
11
|
* @returns An object with functions to manage screen share.
|
|
13
|
-
* @category
|
|
12
|
+
* @category Connection
|
|
14
13
|
* @group Hooks
|
|
15
14
|
*/
|
|
16
15
|
export function useScreenShare() {
|
|
17
16
|
const isScreenShareOn = useFishjamEventState(ReceivableEvents.IsScreenShareOn, RNFishjamClientModule.isScreenShareOn);
|
|
18
17
|
const simulcastConfig = useFishjamEventState(ReceivableEvents.SimulcastConfigUpdate, screenShareSimulcastConfig);
|
|
19
|
-
const toggleScreenShareTrackEncoding = useCallback(async (encoding) => {
|
|
20
|
-
await RNFishjamClientModule.toggleScreenShareTrackEncoding(encoding);
|
|
21
|
-
}, []);
|
|
22
|
-
const setScreenShareTrackEncodingBandwidth = useCallback(async (encoding, bandwidth) => {
|
|
23
|
-
await RNFishjamClientModule.setScreenShareTrackEncodingBandwidth(encoding, bandwidth);
|
|
24
|
-
}, []);
|
|
25
|
-
const setScreenShareTrackBandwidth = useCallback(async (bandwidth) => {
|
|
26
|
-
await RNFishjamClientModule.setScreenShareTrackBandwidth(bandwidth);
|
|
27
|
-
}, []);
|
|
28
18
|
const handleScreenSharePermission = useCallback(async () => {
|
|
29
19
|
if (Platform.OS === 'android') {
|
|
30
20
|
return await RNFishjamClientModule.handleScreenSharePermission();
|
|
@@ -57,31 +47,6 @@ export function useScreenShare() {
|
|
|
57
47
|
*/
|
|
58
48
|
toggleScreenShare,
|
|
59
49
|
handleScreenSharePermission,
|
|
60
|
-
/**
|
|
61
|
-
* @deprecated
|
|
62
|
-
*/
|
|
63
|
-
setScreenShareTrackBandwidth,
|
|
64
|
-
/**
|
|
65
|
-
* Toggles simulcast encoding of a screen share track on/off
|
|
66
|
-
* @param encoding encoding to toggle
|
|
67
|
-
* @deprecated
|
|
68
|
-
*/
|
|
69
|
-
toggleScreenShareTrackEncoding,
|
|
70
|
-
/**
|
|
71
|
-
* updates maximum bandwidth for the given simulcast encoding of the screen share track
|
|
72
|
-
* @param encoding encoding to update
|
|
73
|
-
* @param bandwidth BandwidthLimit to set
|
|
74
|
-
* @deprecated
|
|
75
|
-
*/
|
|
76
|
-
setScreenShareTrackEncodingBandwidth,
|
|
77
|
-
/**
|
|
78
|
-
* updates maximum bandwidth for the screen share track. This value directly translates
|
|
79
|
-
* to quality of the stream and the amount of RTP packets being sent. In case simulcast
|
|
80
|
-
* is enabled bandwidth is split between all of the variant streams proportionally to
|
|
81
|
-
* their resolution
|
|
82
|
-
* @param bandwidth BandwidthLimit to set
|
|
83
|
-
* @deprecated
|
|
84
|
-
*/
|
|
85
50
|
};
|
|
86
51
|
}
|
|
87
52
|
//# sourceMappingURL=useScreenShare.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useScreenShare.js","sourceRoot":"","sources":["../../src/hooks/useScreenShare.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"useScreenShare.js","sourceRoot":"","sources":["../../src/hooks/useScreenShare.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAGpC,OAAO,qBAAqB,EAAE,EAC5B,gBAAgB,GACjB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AAqBvE,MAAM,sBAAsB,GAAG,GAAG,EAAE,CAClC,CAAC;IACC,OAAO,EAAE,KAAK;CACf,CAA2B,CAAC;AAE/B,IAAI,0BAA0B,GAAoB,sBAAsB,EAAE,CAAC;AAE3E;;;;;GAKG;AACH,MAAM,UAAU,cAAc;IAC5B,MAAM,eAAe,GAAG,oBAAoB,CAC1C,gBAAgB,CAAC,eAAe,EAChC,qBAAqB,CAAC,eAAe,CACtC,CAAC;IAEF,MAAM,eAAe,GAAG,oBAAoB,CAC1C,gBAAgB,CAAC,qBAAqB,EACtC,0BAA0B,CAC3B,CAAC;IAEF,MAAM,2BAA2B,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QACzD,IAAI,QAAQ,CAAC,EAAE,KAAK,SAAS,EAAE,CAAC;YAC9B,OAAO,MAAM,qBAAqB,CAAC,2BAA2B,EAAE,CAAC;QACnE,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,iBAAiB,GAAG,WAAW,CACnC,KAAK,EAAE,qBAAkD,EAAE,EAAE,EAAE;QAC7D,IAAI,QAAQ,CAAC,EAAE,KAAK,SAAS,IAAI,CAAC,eAAe,EAAE,CAAC;YAClD,IAAI,CAAC,MAAM,2BAA2B,EAAE,CAAC,KAAK,SAAS,EAAE,CAAC;gBACxD,OAAO;YACT,CAAC;QACH,CAAC;QACD,MAAM,OAAO,GAAG;YACd,GAAG,kBAAkB;YACrB,mBAAmB,EAAE;gBACnB,WAAW,EAAE,YAAY;gBACzB,IAAI,EAAE,kBAA2B;gBACjC,MAAM,EAAE,CAAC,eAAe;aACzB;SACF,CAAC;QACF,MAAM,qBAAqB,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;QACvD,0BAA0B,GAAG,sBAAsB,EAAE,CAAC,CAAC,kCAAkC;IAC3F,CAAC,EACD,CAAC,eAAe,EAAE,2BAA2B,CAAC,CAC/C,CAAC;IAEF,OAAO;QACL,eAAe;QACf,eAAe;QAEf;;;WAGG;QACH,iBAAiB;QACjB,2BAA2B;KAC5B,CAAC;AACJ,CAAC","sourcesContent":["import { useCallback } from 'react';\n\nimport { SimulcastConfig, TrackMetadata } from '../types';\nimport RNFishjamClientModule, {\n ReceivableEvents,\n} from '../RNFishjamClientModule';\nimport { Platform } from 'react-native';\nimport { useFishjamEventState } from './internal/useFishjamEventState';\n\nexport type ScreenShareQuality = 'VGA' | 'HD5' | 'HD15' | 'FHD15' | 'FHD30';\n\nexport type ScreenShareOptions = {\n /**\n * Resolution + fps of screen share track, one of: `VGA`, `HD5`, `HD15`, `FHD15`, `FHD30`.\n * Note that quality might be worse than specified due to device capabilities, internet\n * connection etc.\n * @default `HD15``\n */\n quality: ScreenShareQuality;\n};\nexport type ScreenShareOptionsInternal = {\n screenShareMetadata: TrackMetadata & { displayName?: string };\n /**\n * SimulcastConfig of a screen share track. By default simulcast is disabled.\n */\n simulcastConfig: SimulcastConfig;\n};\n\nconst defaultSimulcastConfig = () =>\n ({\n enabled: false,\n }) satisfies SimulcastConfig;\n\nlet screenShareSimulcastConfig: SimulcastConfig = defaultSimulcastConfig();\n\n/**\n * This hook can toggle screen sharing on/off and provides current screen share state.\n * @returns An object with functions to manage screen share.\n * @category Connection\n * @group Hooks\n */\nexport function useScreenShare() {\n const isScreenShareOn = useFishjamEventState(\n ReceivableEvents.IsScreenShareOn,\n RNFishjamClientModule.isScreenShareOn,\n );\n\n const simulcastConfig = useFishjamEventState(\n ReceivableEvents.SimulcastConfigUpdate,\n screenShareSimulcastConfig,\n );\n\n const handleScreenSharePermission = useCallback(async () => {\n if (Platform.OS === 'android') {\n return await RNFishjamClientModule.handleScreenSharePermission();\n }\n return 'denied';\n }, []);\n\n const toggleScreenShare = useCallback(\n async (screenShareOptions: Partial<ScreenShareOptions> = {}) => {\n if (Platform.OS === 'android' && !isScreenShareOn) {\n if ((await handleScreenSharePermission()) !== 'granted') {\n return;\n }\n }\n const options = {\n ...screenShareOptions,\n screenShareMetadata: {\n displayName: 'presenting',\n type: 'screenShareVideo' as const,\n active: !isScreenShareOn,\n },\n };\n await RNFishjamClientModule.toggleScreenShare(options);\n screenShareSimulcastConfig = defaultSimulcastConfig(); //to do: sync with camera settings\n },\n [isScreenShareOn, handleScreenSharePermission],\n );\n\n return {\n isScreenShareOn,\n simulcastConfig,\n\n /**\n * Toggles the screen share on/off\n * Emits warning on ios when user is screensharing app screen.\n */\n toggleScreenShare,\n handleScreenSharePermission,\n };\n}\n"]}
|
package/build/index.d.ts
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
export type {
|
|
1
|
+
export type { SimulcastConfig, VideoLayout, GenericMetadata, TrackMetadata, Brand, } from './types';
|
|
2
2
|
export type { ConnectionConfig } from './common/client';
|
|
3
3
|
export { updatePeerMetadata } from './common/metadata';
|
|
4
|
-
export { setTargetTrackEncoding } from './common/webRTC';
|
|
5
4
|
export {
|
|
6
5
|
/** @deprecated */
|
|
7
6
|
joinRoom,
|
|
@@ -11,14 +10,13 @@ export type { VideoPreviewViewProps } from './components/VideoPreviewView';
|
|
|
11
10
|
export type { VideoRendererProps } from './components/VideoRendererView';
|
|
12
11
|
export { VideoPreviewView } from './components/VideoPreviewView';
|
|
13
12
|
export { VideoRendererView } from './components/VideoRendererView';
|
|
14
|
-
export type { Peer, PeerId, Track, TrackId, TrackType, VadStatus, EncodingReason, AudioTrack, VideoTrack, UsePeersResult, PeerWithTracks, } from './hooks/usePeers';
|
|
13
|
+
export type { Peer, PeerId, Track, TrackId, TrackType, VadStatus, EncodingReason, TrackBase, AudioTrack, VideoTrack, UsePeersResult, PeerWithTracks, PeerTrackMetadata, DistinguishedTracks, } from './hooks/usePeers';
|
|
15
14
|
export type { AudioOutputDevice, AudioOutputDeviceType, AudioSessionMode, } from './hooks/useAudioSettings';
|
|
16
|
-
export type { CameraId, Camera, CameraConfig, VideoQuality, CameraFacingDirection, } from './hooks/useCamera';
|
|
15
|
+
export type { CameraId, Camera, CameraConfig, VideoQuality, CameraFacingDirection, CameraConfigBase, } from './hooks/useCamera';
|
|
17
16
|
export type { ScreenShareOptions, ScreenShareQuality, } from './hooks/useScreenShare';
|
|
18
|
-
export type { ReconnectionStatus } from './hooks/useReconnection';
|
|
19
|
-
export type { PeerStatus } from './hooks/usePeerStatus';
|
|
20
17
|
export type { ForegroundServiceConfig } from './hooks/useForegroundService';
|
|
21
|
-
export type {
|
|
18
|
+
export type { JoinRoomConfig, ReconnectionStatus, PeerStatus, } from './hooks/useConnection';
|
|
19
|
+
export type { AppScreenShareData } from './hooks/useAppScreenShare';
|
|
22
20
|
export { useAudioSettings } from './hooks/useAudioSettings';
|
|
23
21
|
export { useBandwidthEstimation } from './hooks/useBandwidthEstimation';
|
|
24
22
|
export { useCamera } from './hooks/useCamera';
|
|
@@ -31,5 +29,6 @@ export { usePeers } from './hooks/usePeers';
|
|
|
31
29
|
export { useForegroundService } from './hooks/useForegroundService';
|
|
32
30
|
export { useConnection } from './hooks/useConnection';
|
|
33
31
|
export { useUpdatePeerMetadata } from './hooks/useUpdatePeerMetadata';
|
|
32
|
+
export type { FishjamRoomProps } from './components/FishjamRoom';
|
|
34
33
|
export { FishjamRoom } from './components/FishjamRoom';
|
|
35
34
|
//# sourceMappingURL=index.d.ts.map
|
package/build/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.tsx"],"names":[],"mappings":"AAGA,YAAY,EACV,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.tsx"],"names":[],"mappings":"AAGA,YAAY,EACV,eAAe,EACf,WAAW,EACX,eAAe,EACf,aAAa,EACb,KAAK,GACN,MAAM,SAAS,CAAC;AACjB,YAAY,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAIxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO;AACL,kBAAkB;AAClB,QAAQ;AACR,kBAAkB;AAClB,SAAS,GACV,MAAM,iBAAiB,CAAC;AAIzB,YAAY,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAC3E,YAAY,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAEzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAInE,YAAY,EACV,IAAI,EACJ,MAAM,EACN,KAAK,EACL,OAAO,EACP,SAAS,EACT,SAAS,EACT,cAAc,EACd,SAAS,EACT,UAAU,EACV,UAAU,EACV,cAAc,EACd,cAAc,EACd,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,kBAAkB,CAAC;AAE1B,YAAY,EACV,iBAAiB,EACjB,qBAAqB,EACrB,gBAAgB,GACjB,MAAM,0BAA0B,CAAC;AAElC,YAAY,EACV,QAAQ,EACR,MAAM,EACN,YAAY,EACZ,YAAY,EACZ,qBAAqB,EACrB,gBAAgB,GACjB,MAAM,mBAAmB,CAAC;AAE3B,YAAY,EACV,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,wBAAwB,CAAC;AAChC,YAAY,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAC5E,YAAY,EACV,cAAc,EACd,kBAAkB,EAClB,UAAU,GACX,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAIpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAGtE,YAAY,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC"}
|
package/build/index.js
CHANGED
|
@@ -2,7 +2,6 @@ import { initializeWarningListener } from './utils/errorListener';
|
|
|
2
2
|
// #endregion
|
|
3
3
|
// #region methods
|
|
4
4
|
export { updatePeerMetadata } from './common/metadata';
|
|
5
|
-
export { setTargetTrackEncoding } from './common/webRTC';
|
|
6
5
|
export {
|
|
7
6
|
/** @deprecated */
|
|
8
7
|
joinRoom,
|
|
@@ -24,7 +23,6 @@ export { usePeers } from './hooks/usePeers';
|
|
|
24
23
|
export { useForegroundService } from './hooks/useForegroundService';
|
|
25
24
|
export { useConnection } from './hooks/useConnection';
|
|
26
25
|
export { useUpdatePeerMetadata } from './hooks/useUpdatePeerMetadata';
|
|
27
|
-
// #endregion
|
|
28
26
|
export { FishjamRoom } from './components/FishjamRoom';
|
|
29
27
|
initializeWarningListener();
|
|
30
28
|
//# sourceMappingURL=index.js.map
|
package/build/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AAWlE,aAAa;AAEb,kBAAkB;AAClB,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO;AACL,kBAAkB;AAClB,QAAQ;AACR,kBAAkB;AAClB,SAAS,GACV,MAAM,iBAAiB,CAAC;AAOzB,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AA+CnE,aAAa;AAEb,gBAAgB;AAChB,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAItE,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAEvD,yBAAyB,EAAE,CAAC","sourcesContent":["import { initializeWarningListener } from './utils/errorListener';\n\n// #region types\nexport type {\n SimulcastConfig,\n VideoLayout,\n GenericMetadata,\n TrackMetadata,\n Brand,\n} from './types';\nexport type { ConnectionConfig } from './common/client';\n// #endregion\n\n// #region methods\nexport { updatePeerMetadata } from './common/metadata';\nexport {\n /** @deprecated */\n joinRoom,\n /** @deprecated */\n leaveRoom,\n} from './common/client';\n// #endregion\n\n// #region components\nexport type { VideoPreviewViewProps } from './components/VideoPreviewView';\nexport type { VideoRendererProps } from './components/VideoRendererView';\n\nexport { VideoPreviewView } from './components/VideoPreviewView';\nexport { VideoRendererView } from './components/VideoRendererView';\n// #endregion\n\n// #region types for hooks\nexport type {\n Peer,\n PeerId,\n Track,\n TrackId,\n TrackType,\n VadStatus,\n EncodingReason,\n TrackBase,\n AudioTrack,\n VideoTrack,\n UsePeersResult,\n PeerWithTracks,\n PeerTrackMetadata,\n DistinguishedTracks,\n} from './hooks/usePeers';\n\nexport type {\n AudioOutputDevice,\n AudioOutputDeviceType,\n AudioSessionMode,\n} from './hooks/useAudioSettings';\n\nexport type {\n CameraId,\n Camera,\n CameraConfig,\n VideoQuality,\n CameraFacingDirection,\n CameraConfigBase,\n} from './hooks/useCamera';\n\nexport type {\n ScreenShareOptions,\n ScreenShareQuality,\n} from './hooks/useScreenShare';\nexport type { ForegroundServiceConfig } from './hooks/useForegroundService';\nexport type {\n JoinRoomConfig,\n ReconnectionStatus,\n PeerStatus,\n} from './hooks/useConnection';\nexport type { AppScreenShareData } from './hooks/useAppScreenShare';\n// #endregion\n\n// #region hooks\nexport { useAudioSettings } from './hooks/useAudioSettings';\nexport { useBandwidthEstimation } from './hooks/useBandwidthEstimation';\nexport { useCamera } from './hooks/useCamera';\nexport { useMicrophone } from './hooks/useMicrophone';\nexport { useScreenShare } from './hooks/useScreenShare';\nexport { useAppScreenShare } from './hooks/useAppScreenShare';\nexport { useReconnection } from './hooks/useReconnection';\nexport { usePeerStatus } from './hooks/usePeerStatus';\nexport { usePeers } from './hooks/usePeers';\nexport { useForegroundService } from './hooks/useForegroundService';\nexport { useConnection } from './hooks/useConnection';\nexport { useUpdatePeerMetadata } from './hooks/useUpdatePeerMetadata';\n// #endregion\n\nexport type { FishjamRoomProps } from './components/FishjamRoom';\nexport { FishjamRoom } from './components/FishjamRoom';\n\ninitializeWarningListener();\n"]}
|
package/build/types.d.ts
CHANGED
|
@@ -2,10 +2,8 @@
|
|
|
2
2
|
* `FILL` or `FIT` - it works just like RN Image component. `FILL` fills the whole view
|
|
3
3
|
* with video and it may cut some parts of the video. `FIT` scales the video so the whole
|
|
4
4
|
* video is visible, but it may leave some empty space in the view.
|
|
5
|
-
* @category Components
|
|
6
5
|
*/
|
|
7
6
|
export type VideoLayout = 'FILL' | 'FIT';
|
|
8
|
-
export type TrackEncoding = 'l' | 'm' | 'h';
|
|
9
7
|
/**
|
|
10
8
|
* A type describing simulcast configuration.
|
|
11
9
|
*
|
|
@@ -18,30 +16,16 @@ export type SimulcastConfig = {
|
|
|
18
16
|
* whether to simulcast track or not. By default simulcast is disabled.
|
|
19
17
|
*/
|
|
20
18
|
enabled: boolean;
|
|
21
|
-
/**
|
|
22
|
-
* list of active encodings. Encoding can be one of `"h"` (original encoding), `"m"` (scaled down x2), `"l"` (scaled down x4).
|
|
23
|
-
*/
|
|
24
|
-
activeEncodings: TrackEncoding[];
|
|
25
19
|
};
|
|
26
|
-
/**
|
|
27
|
-
* Type describing maximal bandwidth that can be used, in kbps. 0 is interpreted as unlimited bandwidth.
|
|
28
|
-
*/
|
|
29
|
-
export type BandwidthLimit = number;
|
|
30
|
-
/**
|
|
31
|
-
* Type describing bandwidth limit for simulcast track. It is a mapping `encoding -> BandwidthLimit`. If encoding isn't present in this mapping,
|
|
32
|
-
* it will be assumed that this particular encoding shouldn't have any bandwidth limit.
|
|
33
|
-
*/
|
|
34
|
-
export type SimulcastBandwidthLimit = Record<TrackEncoding, BandwidthLimit>;
|
|
35
|
-
/**
|
|
36
|
-
* A type describing bandwidth limitation of a track, including simulcast and non-simulcast tracks. Can be `BandwidthLimit` or `SimulcastBandwidthLimit`.
|
|
37
|
-
*/
|
|
38
|
-
export type TrackBandwidthLimit = BandwidthLimit | SimulcastBandwidthLimit;
|
|
39
20
|
export type TrackMetadata = {
|
|
40
21
|
active: boolean;
|
|
41
22
|
type: 'microphone' | 'camera' | 'screenShareVideo' | 'screenShareAudio';
|
|
42
23
|
};
|
|
43
24
|
export type GenericMetadata = Record<string, unknown>;
|
|
44
25
|
declare const brand: unique symbol;
|
|
26
|
+
/**
|
|
27
|
+
* Branded type
|
|
28
|
+
*/
|
|
45
29
|
export type Brand<T, TBrand extends string> = T & {
|
|
46
30
|
[brand]: TBrand;
|
|
47
31
|
};
|
package/build/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,KAAK,CAAC;AAEzC;;;;;;GAMG;AACH,MAAM,MAAM,eAAe,GAAG;IAC5B;;OAEG;IACH,OAAO,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,EAAE,YAAY,GAAG,QAAQ,GAAG,kBAAkB,GAAG,kBAAkB,CAAC;CACzE,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAGtD,OAAO,CAAC,MAAM,KAAK,EAAE,OAAO,MAAM,CAAC;AACnC;;GAEG;AACH,MAAM,MAAM,KAAK,CAAC,CAAC,EAAE,MAAM,SAAS,MAAM,IAAI,CAAC,GAAG;IAAE,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC"}
|
package/build/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"","sourcesContent":["/**\n * `FILL` or `FIT` - it works just like RN Image component. `FILL` fills the whole view\n * with video and it may cut some parts of the video. `FIT` scales the video so the whole\n * video is visible, but it may leave some empty space in the view.\n
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"","sourcesContent":["/**\n * `FILL` or `FIT` - it works just like RN Image component. `FILL` fills the whole view\n * with video and it may cut some parts of the video. `FIT` scales the video so the whole\n * video is visible, but it may leave some empty space in the view.\n */\nexport type VideoLayout = 'FILL' | 'FIT';\n\n/**\n * A type describing simulcast configuration.\n *\n * At the moment, simulcast track is initialized in three versions - low, medium and high.\n * High resolution is the original track resolution, while medium and low resolutions are\n * the original track resolution scaled down by 2 and 4 respectively.\n */\nexport type SimulcastConfig = {\n /**\n * whether to simulcast track or not. By default simulcast is disabled.\n */\n enabled: boolean;\n};\n\nexport type TrackMetadata = {\n active: boolean;\n type: 'microphone' | 'camera' | 'screenShareVideo' | 'screenShareAudio';\n};\n\nexport type GenericMetadata = Record<string, unknown>;\n\n// branded types are useful for restricting where given value can be passed\ndeclare const brand: unique symbol;\n/**\n * Branded type\n */\nexport type Brand<T, TBrand extends string> = T & { [brand]: TBrand };\n"]}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { ReceivableEventPayloads, ReceivableEvents } from '../RNFishjamClientModule';
|
|
2
|
+
export declare function validateNativeEventPayload<T extends keyof typeof ReceivableEvents>(eventName: T, payload: ReceivableEventPayloads[T]): void;
|
|
3
|
+
//# sourceMappingURL=eventPayloadValidator.d.ts.map
|
|
@@ -0,0 +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;AAsDlC,wBAAgB,0BAA0B,CACxC,CAAC,SAAS,MAAM,OAAO,gBAAgB,EACvC,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,uBAAuB,CAAC,CAAC,CAAC,GAAG,IAAI,CAiDzD"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
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
|
+
const SimulcastConfigSchema = z.object({
|
|
25
|
+
enabled: z.boolean(),
|
|
26
|
+
activeEncodings: z.array(z.enum(['l', 'm', 'h'])),
|
|
27
|
+
});
|
|
28
|
+
const AudioOutputDeviceSchema = z.object({
|
|
29
|
+
name: z.string(),
|
|
30
|
+
type: z.enum(['bluetooth', 'headset', 'speaker', 'earpiece']),
|
|
31
|
+
});
|
|
32
|
+
const AudioDeviceEventSchema = z.object({
|
|
33
|
+
availableDevices: z.array(AudioOutputDeviceSchema),
|
|
34
|
+
selectedDevice: AudioOutputDeviceSchema.nullable(),
|
|
35
|
+
});
|
|
36
|
+
const CameraSchema = z.object({
|
|
37
|
+
id: z.string(),
|
|
38
|
+
name: z.string(),
|
|
39
|
+
facingDirection: z.enum(['front', 'back', 'unspecified']),
|
|
40
|
+
});
|
|
41
|
+
const CameraChangedEventSchema = z.object({
|
|
42
|
+
isCameraOn: z.boolean(),
|
|
43
|
+
currentCamera: CameraSchema.nullable(),
|
|
44
|
+
});
|
|
45
|
+
export function validateNativeEventPayload(eventName, payload) {
|
|
46
|
+
switch (eventName) {
|
|
47
|
+
case ReceivableEvents.IsMicrophoneOn:
|
|
48
|
+
case ReceivableEvents.IsScreenShareOn:
|
|
49
|
+
case ReceivableEvents.IsAppScreenShareOn:
|
|
50
|
+
z.boolean().parse(payload);
|
|
51
|
+
break;
|
|
52
|
+
case ReceivableEvents.SimulcastConfigUpdate:
|
|
53
|
+
SimulcastConfigSchema.parse(payload);
|
|
54
|
+
break;
|
|
55
|
+
case ReceivableEvents.PeersUpdate:
|
|
56
|
+
z.array(PeerSchema).parse(payload);
|
|
57
|
+
break;
|
|
58
|
+
case ReceivableEvents.AudioDeviceUpdate:
|
|
59
|
+
AudioDeviceEventSchema.parse(payload);
|
|
60
|
+
break;
|
|
61
|
+
case ReceivableEvents.BandwidthEstimation:
|
|
62
|
+
z.number().nullable().parse(payload);
|
|
63
|
+
break;
|
|
64
|
+
case ReceivableEvents.ReconnectionRetriesLimitReached:
|
|
65
|
+
case ReceivableEvents.ReconnectionStarted:
|
|
66
|
+
case ReceivableEvents.Reconnected:
|
|
67
|
+
z.undefined().parse(payload);
|
|
68
|
+
break;
|
|
69
|
+
case ReceivableEvents.Warning:
|
|
70
|
+
z.string().parse(payload);
|
|
71
|
+
break;
|
|
72
|
+
case ReceivableEvents.PeerStatusChanged:
|
|
73
|
+
z.enum(['connecting', 'connected', 'error', 'idle']).parse(payload);
|
|
74
|
+
break;
|
|
75
|
+
case ReceivableEvents.ReconnectionStatusChanged:
|
|
76
|
+
z.enum(['connecting', 'connected', 'error']).parse(payload);
|
|
77
|
+
break;
|
|
78
|
+
case ReceivableEvents.CurrentCameraChanged:
|
|
79
|
+
CameraChangedEventSchema.parse(payload);
|
|
80
|
+
break;
|
|
81
|
+
default:
|
|
82
|
+
throw new Error(`Unknown event: ${eventName}`);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=eventPayloadValidator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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 BaseTrackSchema = z.object({\n id: z.string(),\n metadata: z.object({}).passthrough(),\n});\n\nconst AudioTrackSchema = BaseTrackSchema.extend({\n type: z.literal('Audio'),\n vadStatus: z.enum(['silence', 'speech']).optional(),\n});\n\nconst VideoTrackSchema = BaseTrackSchema.extend({\n type: z.literal('Video'),\n});\n\nconst TrackSchema = z.discriminatedUnion('type', [\n AudioTrackSchema,\n VideoTrackSchema,\n]);\n\nconst PeerSchema = z.object({\n id: z.string(),\n isLocal: z.boolean(),\n tracks: z.array(TrackSchema),\n metadata: z.object({}).passthrough(),\n});\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\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 z.array(PeerSchema).parse(payload);\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 default:\n throw new Error(`Unknown event: ${eventName}`);\n }\n}\n"]}
|
package/ios/Events.swift
CHANGED
|
@@ -57,12 +57,15 @@ class EmitableEvent {
|
|
|
57
57
|
.init(event: .ReconnectionStatusChanged, eventContent: reconnectionStatus.rawValue)
|
|
58
58
|
}
|
|
59
59
|
|
|
60
|
-
static func currentCameraChanged(localCamera: LocalCamera?, isCameraOn: Bool
|
|
60
|
+
static func currentCameraChanged(localCamera: LocalCamera?, isCameraOn: Bool, isCameraInitialized: Bool)
|
|
61
|
+
-> EmitableEvent
|
|
62
|
+
{
|
|
61
63
|
return .init(
|
|
62
64
|
event: .CurrentCameraChanged,
|
|
63
65
|
eventContent: [
|
|
64
66
|
"currentCamera": localCamera as Any,
|
|
65
67
|
"isCameraOn": isCameraOn,
|
|
68
|
+
"isCameraInitialized": isCameraInitialized,
|
|
66
69
|
])
|
|
67
70
|
}
|
|
68
71
|
|
|
@@ -14,14 +14,35 @@ class RNFishjamClient: FishjamClientListener {
|
|
|
14
14
|
var isAppScreenShareOn = false
|
|
15
15
|
var isConnected = false
|
|
16
16
|
|
|
17
|
-
private var isCameraInitialized = false
|
|
17
|
+
private(set) var isCameraInitialized = false {
|
|
18
|
+
didSet {
|
|
19
|
+
emit(
|
|
20
|
+
event: .currentCameraChanged(
|
|
21
|
+
localCamera: currentCamera, isCameraOn: isCameraOn, isCameraInitialized: isCameraInitialized))
|
|
22
|
+
}
|
|
23
|
+
}
|
|
18
24
|
|
|
19
|
-
var connectPromise: Promise? = nil
|
|
25
|
+
var connectPromise: Promise? = nil {
|
|
26
|
+
didSet {
|
|
27
|
+
guard connectPromise != nil else { return }
|
|
28
|
+
|
|
29
|
+
let timeout = DispatchTime.now() + .seconds(15)
|
|
30
|
+
DispatchQueue.main.asyncAfter(deadline: timeout) { [weak self] in
|
|
31
|
+
// If promise is still assigned it means it was not resolved in that time,
|
|
32
|
+
// so close the client and reject it with timeout error.
|
|
33
|
+
guard let promise = self?.connectPromise else { return }
|
|
34
|
+
RNFishjamClient.fishjamClient?.leave { [weak self] in
|
|
35
|
+
promise.reject("E_MEMBRANE_CONNECT", "Failed to connect: Fishjam server is not responding")
|
|
36
|
+
self?.connectPromise = nil
|
|
37
|
+
self?.peerStatus = .error
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
20
42
|
|
|
21
43
|
var videoSimulcastConfig: SimulcastConfig = SimulcastConfig()
|
|
22
44
|
|
|
23
45
|
var screenShareSimulcastConfig: SimulcastConfig = SimulcastConfig()
|
|
24
|
-
var screenShareMaxBandwidth: TrackBandwidthLimit = .BandwidthLimit(0)
|
|
25
46
|
|
|
26
47
|
var cameraId: String? = nil
|
|
27
48
|
|
|
@@ -58,13 +79,10 @@ class RNFishjamClient: FishjamClientListener {
|
|
|
58
79
|
}
|
|
59
80
|
|
|
60
81
|
private func getSimulcastConfigFromOptions(simulcastConfig: RNSimulcastConfig) throws -> SimulcastConfig {
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
activeEncodings.append(fishjamEncoding)
|
|
66
|
-
}
|
|
67
|
-
}
|
|
82
|
+
// iOS has a limit of 3 hardware encoders
|
|
83
|
+
// 3 simulcast layers + 1 screen share layer = 4, which is too much
|
|
84
|
+
// so we limit simulcast layers to 2
|
|
85
|
+
let activeEncodings: [TrackEncoding] = [.l, .h]
|
|
68
86
|
|
|
69
87
|
return SimulcastConfig(
|
|
70
88
|
enabled: simulcastConfig.enabled,
|
|
@@ -72,15 +90,6 @@ class RNFishjamClient: FishjamClientListener {
|
|
|
72
90
|
)
|
|
73
91
|
}
|
|
74
92
|
|
|
75
|
-
private func getMaxBandwidthFromOptions(maxBandwidth: RNTrackBandwidthLimit) -> TrackBandwidthLimit {
|
|
76
|
-
if let maxBandwidth: Int = maxBandwidth.get() {
|
|
77
|
-
return .BandwidthLimit(maxBandwidth)
|
|
78
|
-
} else if let maxBandwidth: [String: Int] = maxBandwidth.get() {
|
|
79
|
-
return .SimulcastBandwidthLimit(maxBandwidth)
|
|
80
|
-
}
|
|
81
|
-
return .BandwidthLimit(0)
|
|
82
|
-
}
|
|
83
|
-
|
|
84
93
|
func create() {
|
|
85
94
|
RNFishjamClient.fishjamClient = FishjamClient(listener: self)
|
|
86
95
|
}
|
|
@@ -88,7 +97,6 @@ class RNFishjamClient: FishjamClientListener {
|
|
|
88
97
|
func getVideoParametersFromOptions(connectionOptions: CameraConfig) throws -> VideoParameters {
|
|
89
98
|
let videoQuality = connectionOptions.quality
|
|
90
99
|
let flipDimensions = connectionOptions.flipDimensions
|
|
91
|
-
let videoBandwidthLimit = getMaxBandwidthFromOptions(maxBandwidth: connectionOptions.maxBandwidth)
|
|
92
100
|
let simulcastConfig = try getSimulcastConfigFromOptions(simulcastConfig: connectionOptions.simulcastConfig)
|
|
93
101
|
|
|
94
102
|
let preset: VideoParameters = {
|
|
@@ -119,7 +127,7 @@ class RNFishjamClient: FishjamClientListener {
|
|
|
119
127
|
}()
|
|
120
128
|
let videoParameters = VideoParameters(
|
|
121
129
|
dimensions: flipDimensions ? preset.dimensions.flipped : preset.dimensions,
|
|
122
|
-
maxBandwidth:
|
|
130
|
+
maxBandwidth: preset.maxBandwidth,
|
|
123
131
|
simulcastConfig: simulcastConfig
|
|
124
132
|
)
|
|
125
133
|
return videoParameters
|
|
@@ -244,27 +252,26 @@ class RNFishjamClient: FishjamClientListener {
|
|
|
244
252
|
}
|
|
245
253
|
}
|
|
246
254
|
|
|
255
|
+
private let startCameraLock = NSLock()
|
|
256
|
+
|
|
247
257
|
func startCamera(config: CameraConfig) async throws -> Bool {
|
|
248
258
|
#if targetEnvironment(simulator)
|
|
249
259
|
emit(
|
|
250
260
|
event: .warning(
|
|
251
261
|
message: "Camera is not supported on simulator."))
|
|
252
262
|
return false
|
|
253
|
-
#
|
|
254
|
-
try ensureCreated()
|
|
263
|
+
#endif
|
|
255
264
|
|
|
256
|
-
|
|
257
|
-
emit(
|
|
258
|
-
event: .warning(
|
|
259
|
-
message:
|
|
260
|
-
"Camera already started. You may only call startCamera once before leaveRoom is called."))
|
|
265
|
+
try ensureCreated()
|
|
261
266
|
|
|
262
|
-
|
|
263
|
-
|
|
267
|
+
guard await PermissionUtils.requestCameraPermission() else {
|
|
268
|
+
emit(event: .warning(message: "Camera permission not granted."))
|
|
269
|
+
return false
|
|
270
|
+
}
|
|
264
271
|
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
return
|
|
272
|
+
return try startCameraLock.withLock {
|
|
273
|
+
guard !isCameraInitialized else {
|
|
274
|
+
return true
|
|
268
275
|
}
|
|
269
276
|
|
|
270
277
|
let cameraTrack = try createCameraTrack(config: config)
|
|
@@ -273,7 +280,7 @@ class RNFishjamClient: FishjamClientListener {
|
|
|
273
280
|
emitEndpoints()
|
|
274
281
|
isCameraInitialized = true
|
|
275
282
|
return true
|
|
276
|
-
|
|
283
|
+
}
|
|
277
284
|
}
|
|
278
285
|
|
|
279
286
|
private func createCameraTrack(config: CameraConfig) throws -> LocalCameraTrack {
|
|
@@ -292,7 +299,8 @@ class RNFishjamClient: FishjamClientListener {
|
|
|
292
299
|
isCameraOn = enabled
|
|
293
300
|
emit(
|
|
294
301
|
event: .currentCameraChanged(
|
|
295
|
-
localCamera: cameraTrack.currentCaptureDevice?.toLocalCamera(), isCameraOn: enabled
|
|
302
|
+
localCamera: cameraTrack.currentCaptureDevice?.toLocalCamera(), isCameraOn: enabled,
|
|
303
|
+
isCameraInitialized: isCameraInitialized))
|
|
296
304
|
RNFishjamClient.localCameraTracksChangedListenersManager.notifyListeners()
|
|
297
305
|
}
|
|
298
306
|
|
|
@@ -320,11 +328,7 @@ class RNFishjamClient: FishjamClientListener {
|
|
|
320
328
|
try await startMicrophone()
|
|
321
329
|
}
|
|
322
330
|
|
|
323
|
-
try updateLocalAudioTrackMetadata(metadata:
|
|
324
|
-
"active": isMicrophoneOn,
|
|
325
|
-
"paused": !isMicrophoneOn, //TODO: FCE-711
|
|
326
|
-
"type": "microphone",
|
|
327
|
-
])
|
|
331
|
+
try updateLocalAudioTrackMetadata(metadata: getMicrophoneTrackMetadata())
|
|
328
332
|
|
|
329
333
|
return isMicrophoneOn
|
|
330
334
|
}
|
|
@@ -334,12 +338,21 @@ class RNFishjamClient: FishjamClientListener {
|
|
|
334
338
|
emit(event: .warning(message: "Microphone permission not granted."))
|
|
335
339
|
return
|
|
336
340
|
}
|
|
337
|
-
let microphoneTrack = RNFishjamClient.fishjamClient!.createAudioTrack(
|
|
341
|
+
let microphoneTrack = RNFishjamClient.fishjamClient!.createAudioTrack(
|
|
342
|
+
metadata: getMicrophoneTrackMetadata().toMetadata())
|
|
338
343
|
setAudioSessionMode()
|
|
339
344
|
setMicrophoneTrackState(microphoneTrack, enabled: true)
|
|
340
345
|
emitEndpoints()
|
|
341
346
|
}
|
|
342
347
|
|
|
348
|
+
private func getMicrophoneTrackMetadata() -> [String: Any] {
|
|
349
|
+
return [
|
|
350
|
+
"active": isMicrophoneOn,
|
|
351
|
+
"paused": !isMicrophoneOn, //TODO: FCE-711
|
|
352
|
+
"type": "microphone",
|
|
353
|
+
]
|
|
354
|
+
}
|
|
355
|
+
|
|
343
356
|
private func setMicrophoneTrackState(_ microphoneTrack: LocalAudioTrack, enabled: Bool) {
|
|
344
357
|
microphoneTrack.enabled = enabled
|
|
345
358
|
isMicrophoneOn = enabled
|
|
@@ -396,8 +409,6 @@ class RNFishjamClient: FishjamClientListener {
|
|
|
396
409
|
let simulcastConfig = try getSimulcastConfigFromOptions(simulcastConfig: screenShareOptions.simulcastConfig)
|
|
397
410
|
|
|
398
411
|
screenShareSimulcastConfig = simulcastConfig
|
|
399
|
-
screenShareMaxBandwidth = getMaxBandwidthFromOptions(
|
|
400
|
-
maxBandwidth: screenShareOptions.maxBandwidth)
|
|
401
412
|
let screenShareMetadata = screenShareOptions.screenShareMetadata.toMetadata()
|
|
402
413
|
let videoParameters = getScreenShareVideoParameters(options: screenShareOptions)
|
|
403
414
|
RNFishjamClient.fishjamClient!.prepareForScreenBroadcast(
|
|
@@ -451,7 +462,6 @@ class RNFishjamClient: FishjamClientListener {
|
|
|
451
462
|
let simulcastConfig = try getSimulcastConfigFromOptions(simulcastConfig: screenShareOptions.simulcastConfig)
|
|
452
463
|
|
|
453
464
|
screenShareSimulcastConfig = simulcastConfig
|
|
454
|
-
screenShareMaxBandwidth = getMaxBandwidthFromOptions(maxBandwidth: screenShareOptions.maxBandwidth)
|
|
455
465
|
let metadata = screenShareOptions.screenShareMetadata.toMetadata()
|
|
456
466
|
let videoParameters = getScreenShareVideoParameters(options: screenShareOptions)
|
|
457
467
|
let screenAppTrack = RNFishjamClient.fishjamClient!.createScreenAppTrack(
|
|
@@ -726,10 +736,11 @@ class RNFishjamClient: FishjamClientListener {
|
|
|
726
736
|
return res
|
|
727
737
|
}
|
|
728
738
|
|
|
729
|
-
func getStatistics() throws -> [String: Any] {
|
|
739
|
+
func getStatistics() async throws -> [String: Any] {
|
|
730
740
|
try ensureCreated()
|
|
731
741
|
|
|
732
|
-
let stats = RNFishjamClient.fishjamClient!.getStats()
|
|
742
|
+
let stats = await RNFishjamClient.fishjamClient!.getStats()
|
|
743
|
+
|
|
733
744
|
let pairs = stats.map { (key, value) in
|
|
734
745
|
let rnValue =
|
|
735
746
|
value is RTCOutboundStats
|
|
@@ -759,7 +770,6 @@ class RNFishjamClient: FishjamClientListener {
|
|
|
759
770
|
}
|
|
760
771
|
return VideoParameters(
|
|
761
772
|
dimensions: preset.dimensions.flipped,
|
|
762
|
-
maxBandwidth: screenShareMaxBandwidth,
|
|
763
773
|
maxFps: preset.maxFps,
|
|
764
774
|
simulcastConfig: screenShareSimulcastConfig
|
|
765
775
|
)
|
|
@@ -912,6 +922,8 @@ class RNFishjamClient: FishjamClientListener {
|
|
|
912
922
|
|
|
913
923
|
extension RNFishjamClient: CameraCapturerDeviceChangedListener {
|
|
914
924
|
func onCaptureDeviceChanged(_ device: AVCaptureDevice?) {
|
|
915
|
-
emit(
|
|
925
|
+
emit(
|
|
926
|
+
event: .currentCameraChanged(
|
|
927
|
+
localCamera: device?.toLocalCamera(), isCameraOn: isCameraOn, isCameraInitialized: isCameraInitialized))
|
|
916
928
|
}
|
|
917
929
|
}
|