@fishjam-cloud/react-native-client 0.6.0 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +41 -39
- package/android/src/main/java/io/fishjam/reactnative/RNFishjamClientModule.kt +7 -17
- 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 +16 -1
- 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 +9 -0
- 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 +11 -33
- 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 +4 -6
- 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 +0 -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 +94 -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 +31 -39
- package/ios/RNFishjamClientModule.swift +5 -10
- package/package.json +18 -9
- 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.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 } 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,12 @@ 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, } from './hooks/usePeers';
|
|
15
14
|
export type { AudioOutputDevice, AudioOutputDeviceType, AudioSessionMode, } from './hooks/useAudioSettings';
|
|
16
15
|
export type { CameraId, Camera, CameraConfig, VideoQuality, CameraFacingDirection, } 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';
|
|
22
19
|
export { useAudioSettings } from './hooks/useAudioSettings';
|
|
23
20
|
export { useBandwidthEstimation } from './hooks/useBandwidthEstimation';
|
|
24
21
|
export { useCamera } from './hooks/useCamera';
|
|
@@ -31,5 +28,6 @@ export { usePeers } from './hooks/usePeers';
|
|
|
31
28
|
export { useForegroundService } from './hooks/useForegroundService';
|
|
32
29
|
export { useConnection } from './hooks/useConnection';
|
|
33
30
|
export { useUpdatePeerMetadata } from './hooks/useUpdatePeerMetadata';
|
|
31
|
+
export type { FishjamRoomProps } from './components/FishjamRoom';
|
|
34
32
|
export { FishjamRoom } from './components/FishjamRoom';
|
|
35
33
|
//# 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,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.tsx"],"names":[],"mappings":"AAGA,YAAY,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAC5D,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,GAClB,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,GACtB,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;AAI/B,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;AAKlE,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;AA4CnE,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 { SimulcastConfig, VideoLayout } 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} 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} 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';\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,24 +16,7 @@ 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';
|
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,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;\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;AAgElC,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,94 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { ReceivableEvents, } from '../RNFishjamClientModule';
|
|
3
|
+
const TrackMetadataSchema = z.object({
|
|
4
|
+
active: z.boolean(),
|
|
5
|
+
type: z.enum([
|
|
6
|
+
'microphone',
|
|
7
|
+
'camera',
|
|
8
|
+
'screenShareVideo',
|
|
9
|
+
'screenShareAudio',
|
|
10
|
+
]),
|
|
11
|
+
});
|
|
12
|
+
const BaseTrackSchema = z.object({
|
|
13
|
+
id: z.string(),
|
|
14
|
+
metadata: TrackMetadataSchema.optional(),
|
|
15
|
+
});
|
|
16
|
+
const AudioTrackSchema = BaseTrackSchema.extend({
|
|
17
|
+
type: z.literal('Audio'),
|
|
18
|
+
vadStatus: z.enum(['silence', 'speech']).optional(),
|
|
19
|
+
});
|
|
20
|
+
const VideoTrackSchema = BaseTrackSchema.extend({
|
|
21
|
+
type: z.literal('Video'),
|
|
22
|
+
});
|
|
23
|
+
const TrackSchema = z.discriminatedUnion('type', [
|
|
24
|
+
AudioTrackSchema,
|
|
25
|
+
VideoTrackSchema,
|
|
26
|
+
]);
|
|
27
|
+
const PeerSchema = z.object({
|
|
28
|
+
id: z.string(),
|
|
29
|
+
isLocal: z.boolean(),
|
|
30
|
+
tracks: z.array(TrackSchema),
|
|
31
|
+
metadata: z.record(z.any()),
|
|
32
|
+
});
|
|
33
|
+
const SimulcastConfigSchema = z.object({
|
|
34
|
+
enabled: z.boolean(),
|
|
35
|
+
activeEncodings: z.array(z.enum(['l', 'm', 'h'])),
|
|
36
|
+
});
|
|
37
|
+
const AudioOutputDeviceSchema = z.object({
|
|
38
|
+
name: z.string(),
|
|
39
|
+
type: z.enum(['bluetooth', 'headset', 'speaker', 'earpiece']),
|
|
40
|
+
});
|
|
41
|
+
const AudioDeviceEventSchema = z.object({
|
|
42
|
+
availableDevices: z.array(AudioOutputDeviceSchema),
|
|
43
|
+
selectedDevice: AudioOutputDeviceSchema.nullable(),
|
|
44
|
+
});
|
|
45
|
+
const CameraSchema = z.object({
|
|
46
|
+
id: z.string(),
|
|
47
|
+
name: z.string(),
|
|
48
|
+
facingDirection: z.enum(['front', 'back', 'unspecified']),
|
|
49
|
+
});
|
|
50
|
+
const CameraChangedEventSchema = z.object({
|
|
51
|
+
isCameraOn: z.boolean(),
|
|
52
|
+
currentCamera: CameraSchema.nullable(),
|
|
53
|
+
});
|
|
54
|
+
export function validateNativeEventPayload(eventName, payload) {
|
|
55
|
+
switch (eventName) {
|
|
56
|
+
case ReceivableEvents.IsMicrophoneOn:
|
|
57
|
+
case ReceivableEvents.IsScreenShareOn:
|
|
58
|
+
case ReceivableEvents.IsAppScreenShareOn:
|
|
59
|
+
z.boolean().parse(payload);
|
|
60
|
+
break;
|
|
61
|
+
case ReceivableEvents.SimulcastConfigUpdate:
|
|
62
|
+
SimulcastConfigSchema.parse(payload);
|
|
63
|
+
break;
|
|
64
|
+
case ReceivableEvents.PeersUpdate:
|
|
65
|
+
z.array(PeerSchema).parse(payload);
|
|
66
|
+
break;
|
|
67
|
+
case ReceivableEvents.AudioDeviceUpdate:
|
|
68
|
+
AudioDeviceEventSchema.parse(payload);
|
|
69
|
+
break;
|
|
70
|
+
case ReceivableEvents.BandwidthEstimation:
|
|
71
|
+
z.number().nullable().parse(payload);
|
|
72
|
+
break;
|
|
73
|
+
case ReceivableEvents.ReconnectionRetriesLimitReached:
|
|
74
|
+
case ReceivableEvents.ReconnectionStarted:
|
|
75
|
+
case ReceivableEvents.Reconnected:
|
|
76
|
+
z.undefined().parse(payload);
|
|
77
|
+
break;
|
|
78
|
+
case ReceivableEvents.Warning:
|
|
79
|
+
z.string().parse(payload);
|
|
80
|
+
break;
|
|
81
|
+
case ReceivableEvents.PeerStatusChanged:
|
|
82
|
+
z.enum(['connecting', 'connected', 'error', 'idle']).parse(payload);
|
|
83
|
+
break;
|
|
84
|
+
case ReceivableEvents.ReconnectionStatusChanged:
|
|
85
|
+
z.enum(['connecting', 'connected', 'error']).parse(payload);
|
|
86
|
+
break;
|
|
87
|
+
case ReceivableEvents.CurrentCameraChanged:
|
|
88
|
+
CameraChangedEventSchema.parse(payload);
|
|
89
|
+
break;
|
|
90
|
+
default:
|
|
91
|
+
throw new Error(`Unknown event: ${eventName}`);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=eventPayloadValidator.js.map
|
|
@@ -0,0 +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,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IACnC,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE;IACnB,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC;QACX,YAAY;QACZ,QAAQ;QACR,kBAAkB;QAClB,kBAAkB;KACnB,CAAC;CACH,CAAC,CAAC;AAEH,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC;IAC/B,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IACd,QAAQ,EAAE,mBAAmB,CAAC,QAAQ,EAAE;CACzC,CAAC,CAAC;AAEH,MAAM,gBAAgB,GAAG,eAAe,CAAC,MAAM,CAAC;IAC9C,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;IACxB,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE;CACpD,CAAC,CAAC;AAEH,MAAM,gBAAgB,GAAG,eAAe,CAAC,MAAM,CAAC;IAC9C,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;CACzB,CAAC,CAAC;AAEH,MAAM,WAAW,GAAG,CAAC,CAAC,kBAAkB,CAAC,MAAM,EAAE;IAC/C,gBAAgB;IAChB,gBAAgB;CACjB,CAAC,CAAC;AAEH,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1B,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IACd,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE;IACpB,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC;IAC5B,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;CAC5B,CAAC,CAAC;AAEH,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IACrC,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE;IACpB,eAAe,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;CAClD,CAAC,CAAC;AAEH,MAAM,uBAAuB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;CAC9D,CAAC,CAAC;AAEH,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC;IACtC,gBAAgB,EAAE,CAAC,CAAC,KAAK,CAAC,uBAAuB,CAAC;IAClD,cAAc,EAAE,uBAAuB,CAAC,QAAQ,EAAE;CACnD,CAAC,CAAC;AAEH,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5B,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IACd,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,eAAe,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC;CAC1D,CAAC,CAAC;AAEH,MAAM,wBAAwB,GAAG,CAAC,CAAC,MAAM,CAAC;IACxC,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE;IACvB,aAAa,EAAE,YAAY,CAAC,QAAQ,EAAE;CACvC,CAAC,CAAC;AAEH,MAAM,UAAU,0BAA0B,CAExC,SAAY,EAAE,OAAmC;IACjD,QAAQ,SAAS,EAAE,CAAC;QAClB,KAAK,gBAAgB,CAAC,cAAc,CAAC;QACrC,KAAK,gBAAgB,CAAC,eAAe,CAAC;QACtC,KAAK,gBAAgB,CAAC,kBAAkB;YACtC,CAAC,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC3B,MAAM;QAER,KAAK,gBAAgB,CAAC,qBAAqB;YACzC,qBAAqB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACrC,MAAM;QAER,KAAK,gBAAgB,CAAC,WAAW;YAC/B,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACnC,MAAM;QAER,KAAK,gBAAgB,CAAC,iBAAiB;YACrC,sBAAsB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACtC,MAAM;QAER,KAAK,gBAAgB,CAAC,mBAAmB;YACvC,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACrC,MAAM;QAER,KAAK,gBAAgB,CAAC,+BAA+B,CAAC;QACtD,KAAK,gBAAgB,CAAC,mBAAmB,CAAC;QAC1C,KAAK,gBAAgB,CAAC,WAAW;YAC/B,CAAC,CAAC,SAAS,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC7B,MAAM;QAER,KAAK,gBAAgB,CAAC,OAAO;YAC3B,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC1B,MAAM;QAER,KAAK,gBAAgB,CAAC,iBAAiB;YACrC,CAAC,CAAC,IAAI,CAAC,CAAC,YAAY,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACpE,MAAM;QAER,KAAK,gBAAgB,CAAC,yBAAyB;YAC7C,CAAC,CAAC,IAAI,CAAC,CAAC,YAAY,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC5D,MAAM;QAER,KAAK,gBAAgB,CAAC,oBAAoB;YACxC,wBAAwB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACxC,MAAM;QAER;YACE,MAAM,IAAI,KAAK,CAAC,kBAAkB,SAAS,EAAE,CAAC,CAAC;IACnD,CAAC;AACH,CAAC","sourcesContent":["import { z } from 'zod';\nimport {\n ReceivableEventPayloads,\n ReceivableEvents,\n} from '../RNFishjamClientModule';\n\nconst TrackMetadataSchema = z.object({\n active: z.boolean(),\n type: z.enum([\n 'microphone',\n 'camera',\n 'screenShareVideo',\n 'screenShareAudio',\n ]),\n});\n\nconst BaseTrackSchema = z.object({\n id: z.string(),\n metadata: TrackMetadataSchema.optional(),\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.record(z.any()),\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,19 @@ 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
25
|
var connectPromise: Promise? = nil
|
|
20
26
|
|
|
21
27
|
var videoSimulcastConfig: SimulcastConfig = SimulcastConfig()
|
|
22
28
|
|
|
23
29
|
var screenShareSimulcastConfig: SimulcastConfig = SimulcastConfig()
|
|
24
|
-
var screenShareMaxBandwidth: TrackBandwidthLimit = .BandwidthLimit(0)
|
|
25
30
|
|
|
26
31
|
var cameraId: String? = nil
|
|
27
32
|
|
|
@@ -58,13 +63,10 @@ class RNFishjamClient: FishjamClientListener {
|
|
|
58
63
|
}
|
|
59
64
|
|
|
60
65
|
private func getSimulcastConfigFromOptions(simulcastConfig: RNSimulcastConfig) throws -> SimulcastConfig {
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
activeEncodings.append(fishjamEncoding)
|
|
66
|
-
}
|
|
67
|
-
}
|
|
66
|
+
// iOS has a limit of 3 hardware encoders
|
|
67
|
+
// 3 simulcast layers + 1 screen share layer = 4, which is too much
|
|
68
|
+
// so we limit simulcast layers to 2
|
|
69
|
+
let activeEncodings: [TrackEncoding] = [.l, .h]
|
|
68
70
|
|
|
69
71
|
return SimulcastConfig(
|
|
70
72
|
enabled: simulcastConfig.enabled,
|
|
@@ -72,15 +74,6 @@ class RNFishjamClient: FishjamClientListener {
|
|
|
72
74
|
)
|
|
73
75
|
}
|
|
74
76
|
|
|
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
77
|
func create() {
|
|
85
78
|
RNFishjamClient.fishjamClient = FishjamClient(listener: self)
|
|
86
79
|
}
|
|
@@ -88,7 +81,6 @@ class RNFishjamClient: FishjamClientListener {
|
|
|
88
81
|
func getVideoParametersFromOptions(connectionOptions: CameraConfig) throws -> VideoParameters {
|
|
89
82
|
let videoQuality = connectionOptions.quality
|
|
90
83
|
let flipDimensions = connectionOptions.flipDimensions
|
|
91
|
-
let videoBandwidthLimit = getMaxBandwidthFromOptions(maxBandwidth: connectionOptions.maxBandwidth)
|
|
92
84
|
let simulcastConfig = try getSimulcastConfigFromOptions(simulcastConfig: connectionOptions.simulcastConfig)
|
|
93
85
|
|
|
94
86
|
let preset: VideoParameters = {
|
|
@@ -119,7 +111,7 @@ class RNFishjamClient: FishjamClientListener {
|
|
|
119
111
|
}()
|
|
120
112
|
let videoParameters = VideoParameters(
|
|
121
113
|
dimensions: flipDimensions ? preset.dimensions.flipped : preset.dimensions,
|
|
122
|
-
maxBandwidth:
|
|
114
|
+
maxBandwidth: preset.maxBandwidth,
|
|
123
115
|
simulcastConfig: simulcastConfig
|
|
124
116
|
)
|
|
125
117
|
return videoParameters
|
|
@@ -254,11 +246,6 @@ class RNFishjamClient: FishjamClientListener {
|
|
|
254
246
|
try ensureCreated()
|
|
255
247
|
|
|
256
248
|
guard !isCameraInitialized else {
|
|
257
|
-
emit(
|
|
258
|
-
event: .warning(
|
|
259
|
-
message:
|
|
260
|
-
"Camera already started. You may only call startCamera once before leaveRoom is called."))
|
|
261
|
-
|
|
262
249
|
return true
|
|
263
250
|
}
|
|
264
251
|
|
|
@@ -292,7 +279,8 @@ class RNFishjamClient: FishjamClientListener {
|
|
|
292
279
|
isCameraOn = enabled
|
|
293
280
|
emit(
|
|
294
281
|
event: .currentCameraChanged(
|
|
295
|
-
localCamera: cameraTrack.currentCaptureDevice?.toLocalCamera(), isCameraOn: enabled
|
|
282
|
+
localCamera: cameraTrack.currentCaptureDevice?.toLocalCamera(), isCameraOn: enabled,
|
|
283
|
+
isCameraInitialized: isCameraInitialized))
|
|
296
284
|
RNFishjamClient.localCameraTracksChangedListenersManager.notifyListeners()
|
|
297
285
|
}
|
|
298
286
|
|
|
@@ -320,11 +308,7 @@ class RNFishjamClient: FishjamClientListener {
|
|
|
320
308
|
try await startMicrophone()
|
|
321
309
|
}
|
|
322
310
|
|
|
323
|
-
try updateLocalAudioTrackMetadata(metadata:
|
|
324
|
-
"active": isMicrophoneOn,
|
|
325
|
-
"paused": !isMicrophoneOn, //TODO: FCE-711
|
|
326
|
-
"type": "microphone",
|
|
327
|
-
])
|
|
311
|
+
try updateLocalAudioTrackMetadata(metadata: getMicrophoneTrackMetadata())
|
|
328
312
|
|
|
329
313
|
return isMicrophoneOn
|
|
330
314
|
}
|
|
@@ -334,12 +318,21 @@ class RNFishjamClient: FishjamClientListener {
|
|
|
334
318
|
emit(event: .warning(message: "Microphone permission not granted."))
|
|
335
319
|
return
|
|
336
320
|
}
|
|
337
|
-
let microphoneTrack = RNFishjamClient.fishjamClient!.createAudioTrack(
|
|
321
|
+
let microphoneTrack = RNFishjamClient.fishjamClient!.createAudioTrack(
|
|
322
|
+
metadata: getMicrophoneTrackMetadata().toMetadata())
|
|
338
323
|
setAudioSessionMode()
|
|
339
324
|
setMicrophoneTrackState(microphoneTrack, enabled: true)
|
|
340
325
|
emitEndpoints()
|
|
341
326
|
}
|
|
342
327
|
|
|
328
|
+
private func getMicrophoneTrackMetadata() -> [String: Any] {
|
|
329
|
+
return [
|
|
330
|
+
"active": isMicrophoneOn,
|
|
331
|
+
"paused": !isMicrophoneOn, //TODO: FCE-711
|
|
332
|
+
"type": "microphone",
|
|
333
|
+
]
|
|
334
|
+
}
|
|
335
|
+
|
|
343
336
|
private func setMicrophoneTrackState(_ microphoneTrack: LocalAudioTrack, enabled: Bool) {
|
|
344
337
|
microphoneTrack.enabled = enabled
|
|
345
338
|
isMicrophoneOn = enabled
|
|
@@ -396,8 +389,6 @@ class RNFishjamClient: FishjamClientListener {
|
|
|
396
389
|
let simulcastConfig = try getSimulcastConfigFromOptions(simulcastConfig: screenShareOptions.simulcastConfig)
|
|
397
390
|
|
|
398
391
|
screenShareSimulcastConfig = simulcastConfig
|
|
399
|
-
screenShareMaxBandwidth = getMaxBandwidthFromOptions(
|
|
400
|
-
maxBandwidth: screenShareOptions.maxBandwidth)
|
|
401
392
|
let screenShareMetadata = screenShareOptions.screenShareMetadata.toMetadata()
|
|
402
393
|
let videoParameters = getScreenShareVideoParameters(options: screenShareOptions)
|
|
403
394
|
RNFishjamClient.fishjamClient!.prepareForScreenBroadcast(
|
|
@@ -451,7 +442,6 @@ class RNFishjamClient: FishjamClientListener {
|
|
|
451
442
|
let simulcastConfig = try getSimulcastConfigFromOptions(simulcastConfig: screenShareOptions.simulcastConfig)
|
|
452
443
|
|
|
453
444
|
screenShareSimulcastConfig = simulcastConfig
|
|
454
|
-
screenShareMaxBandwidth = getMaxBandwidthFromOptions(maxBandwidth: screenShareOptions.maxBandwidth)
|
|
455
445
|
let metadata = screenShareOptions.screenShareMetadata.toMetadata()
|
|
456
446
|
let videoParameters = getScreenShareVideoParameters(options: screenShareOptions)
|
|
457
447
|
let screenAppTrack = RNFishjamClient.fishjamClient!.createScreenAppTrack(
|
|
@@ -726,10 +716,11 @@ class RNFishjamClient: FishjamClientListener {
|
|
|
726
716
|
return res
|
|
727
717
|
}
|
|
728
718
|
|
|
729
|
-
func getStatistics() throws -> [String: Any] {
|
|
719
|
+
func getStatistics() async throws -> [String: Any] {
|
|
730
720
|
try ensureCreated()
|
|
731
721
|
|
|
732
|
-
let stats = RNFishjamClient.fishjamClient!.getStats()
|
|
722
|
+
let stats = await RNFishjamClient.fishjamClient!.getStats()
|
|
723
|
+
|
|
733
724
|
let pairs = stats.map { (key, value) in
|
|
734
725
|
let rnValue =
|
|
735
726
|
value is RTCOutboundStats
|
|
@@ -759,7 +750,6 @@ class RNFishjamClient: FishjamClientListener {
|
|
|
759
750
|
}
|
|
760
751
|
return VideoParameters(
|
|
761
752
|
dimensions: preset.dimensions.flipped,
|
|
762
|
-
maxBandwidth: screenShareMaxBandwidth,
|
|
763
753
|
maxFps: preset.maxFps,
|
|
764
754
|
simulcastConfig: screenShareSimulcastConfig
|
|
765
755
|
)
|
|
@@ -912,6 +902,8 @@ class RNFishjamClient: FishjamClientListener {
|
|
|
912
902
|
|
|
913
903
|
extension RNFishjamClient: CameraCapturerDeviceChangedListener {
|
|
914
904
|
func onCaptureDeviceChanged(_ device: AVCaptureDevice?) {
|
|
915
|
-
emit(
|
|
905
|
+
emit(
|
|
906
|
+
event: .currentCameraChanged(
|
|
907
|
+
localCamera: device?.toLocalCamera(), isCameraOn: isCameraOn, isCameraInitialized: isCameraInitialized))
|
|
916
908
|
}
|
|
917
909
|
}
|
|
@@ -3,9 +3,6 @@ import ExpoModulesCore
|
|
|
3
3
|
struct RNSimulcastConfig: Record {
|
|
4
4
|
@Field
|
|
5
5
|
var enabled: Bool = false
|
|
6
|
-
|
|
7
|
-
@Field
|
|
8
|
-
var activeEncodings: [String] = []
|
|
9
6
|
}
|
|
10
7
|
|
|
11
8
|
struct CameraConfig: Record {
|
|
@@ -21,9 +18,6 @@ struct CameraConfig: Record {
|
|
|
21
18
|
@Field
|
|
22
19
|
var simulcastConfig: RNSimulcastConfig = RNSimulcastConfig()
|
|
23
20
|
|
|
24
|
-
@Field
|
|
25
|
-
var maxBandwidth: RNTrackBandwidthLimit = RNTrackBandwidthLimit(0)
|
|
26
|
-
|
|
27
21
|
@Field
|
|
28
22
|
var cameraEnabled: Bool = true
|
|
29
23
|
|
|
@@ -48,9 +42,6 @@ struct ScreenShareOptions: Record {
|
|
|
48
42
|
|
|
49
43
|
@Field
|
|
50
44
|
var simulcastConfig: RNSimulcastConfig = RNSimulcastConfig()
|
|
51
|
-
|
|
52
|
-
@Field
|
|
53
|
-
var maxBandwidth: RNTrackBandwidthLimit = RNTrackBandwidthLimit(0)
|
|
54
45
|
}
|
|
55
46
|
|
|
56
47
|
struct ReconnectConfig: Record {
|
|
@@ -118,6 +109,10 @@ public class RNFishjamClientModule: Module {
|
|
|
118
109
|
return rnFishjamClient.isAppScreenShareOn
|
|
119
110
|
}
|
|
120
111
|
|
|
112
|
+
Property("isCameraInitialized") {
|
|
113
|
+
return rnFishjamClient.isCameraInitialized
|
|
114
|
+
}
|
|
115
|
+
|
|
121
116
|
Function("getPeers") {
|
|
122
117
|
return rnFishjamClient.getPeers()
|
|
123
118
|
}
|
|
@@ -211,7 +206,7 @@ public class RNFishjamClientModule: Module {
|
|
|
211
206
|
}
|
|
212
207
|
|
|
213
208
|
AsyncFunction("getStatistics") {
|
|
214
|
-
try rnFishjamClient.getStatistics()
|
|
209
|
+
try await rnFishjamClient.getStatistics()
|
|
215
210
|
}
|
|
216
211
|
|
|
217
212
|
AsyncFunction("selectAudioSessionMode") { (sessionMode: String) in
|
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fishjam-cloud/react-native-client",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "A React Native client for Fishjam
|
|
5
|
-
"author": "Fishjam
|
|
3
|
+
"version": "0.7.0",
|
|
4
|
+
"description": "A React Native client for Fishjam",
|
|
5
|
+
"author": "Fishjam Team",
|
|
6
6
|
"license": "Apache-2.0",
|
|
7
7
|
"main": "build/index.js",
|
|
8
8
|
"types": "build/index.d.ts",
|
|
@@ -22,6 +22,7 @@
|
|
|
22
22
|
"keywords": [
|
|
23
23
|
"react-native",
|
|
24
24
|
"expo",
|
|
25
|
+
"Fishjam",
|
|
25
26
|
"FishjamCloud",
|
|
26
27
|
"MembraneWebRTC",
|
|
27
28
|
"webRTC",
|
|
@@ -41,7 +42,8 @@
|
|
|
41
42
|
"dependencies": {
|
|
42
43
|
"phoenix": "^1.7.6",
|
|
43
44
|
"promise-fs": "^2.1.1",
|
|
44
|
-
"protobufjs": "^7.4.0"
|
|
45
|
+
"protobufjs": "^7.4.0",
|
|
46
|
+
"zod": "^3.24.1"
|
|
45
47
|
},
|
|
46
48
|
"devDependencies": {
|
|
47
49
|
"@testing-library/dom": "^10.4.0",
|
|
@@ -54,14 +56,14 @@
|
|
|
54
56
|
"husky": "^9.1.7",
|
|
55
57
|
"jest": "^29.6.1",
|
|
56
58
|
"jest-environment-jsdom": "^29.6.1",
|
|
57
|
-
"jest-expo": "
|
|
59
|
+
"jest-expo": "~52.0.2",
|
|
58
60
|
"jest-websocket-mock": "^2.4.0",
|
|
59
61
|
"pod-install": "^0.3.2",
|
|
60
62
|
"react-dom": "^18.3.1",
|
|
61
|
-
"ts-proto": "^2.
|
|
62
|
-
"typedoc": "^0.
|
|
63
|
+
"ts-proto": "^2.6.0",
|
|
64
|
+
"typedoc": "^0.27.4",
|
|
63
65
|
"typedoc-plugin-mark-react-functional-components": "^0.2.2",
|
|
64
|
-
"typescript": "^5.
|
|
66
|
+
"typescript": "^5.7.2"
|
|
65
67
|
},
|
|
66
68
|
"peerDependencies": {
|
|
67
69
|
"expo": "*",
|
|
@@ -89,5 +91,12 @@
|
|
|
89
91
|
"expo-module.config.json",
|
|
90
92
|
"README.md",
|
|
91
93
|
"!**/node_modules"
|
|
92
|
-
]
|
|
94
|
+
],
|
|
95
|
+
"expo": {
|
|
96
|
+
"doctor": {
|
|
97
|
+
"reactNativeDirectoryCheck": {
|
|
98
|
+
"listUnknownPackages": false
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
93
102
|
}
|
|
@@ -15,13 +15,23 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
|
|
|
15
15
|
}) : function(o, v) {
|
|
16
16
|
o["default"] = v;
|
|
17
17
|
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || function (
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
};
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
25
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
36
|
exports.SBE_PODFILE_SNIPPET = void 0;
|
|
27
37
|
// ios-related code was mostly copied from OneSignal expo plugin: https://github.com/OneSignal/onesignal-expo-plugin/blob/main/onesignal/withOneSignalIos.ts
|