@fishjam-cloud/react-native-client 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/README.md +2 -2
  2. package/android/build.gradle +2 -2
  3. package/android/src/main/java/io/fishjam/reactnative/Errors.kt +1 -2
  4. package/android/src/main/java/io/fishjam/reactnative/RNFishjamClient.kt +52 -27
  5. package/android/src/main/java/io/fishjam/reactnative/RNFishjamClientModule.kt +40 -79
  6. package/android/src/main/java/io/fishjam/reactnative/VideoPreviewView.kt +4 -3
  7. package/android/src/main/java/io/fishjam/reactnative/VideoPreviewViewModule.kt +5 -0
  8. package/android/src/main/java/io/fishjam/reactnative/VideoRendererView.kt +4 -3
  9. package/android/src/main/java/io/fishjam/reactnative/VideoRendererViewModule.kt +2 -0
  10. package/android/src/main/java/io/fishjam/reactnative/VideoView.kt +3 -2
  11. package/android/src/main/java/io/fishjam/reactnative/{FishjamForegroundService.kt → foregroundService/FishjamForegroundService.kt} +7 -2
  12. package/android/src/main/java/io/fishjam/reactnative/foregroundService/ForegroundServiceManager.kt +147 -0
  13. package/android/src/main/java/io/fishjam/reactnative/managers/LocalCameraTracksChangedListenersManager.kt +21 -0
  14. package/android/src/main/java/io/fishjam/reactnative/managers/LocalTracksSwitchListenersManager.kt +27 -0
  15. package/android/src/main/java/io/fishjam/reactnative/managers/TracksUpdateListenersManager.kt +21 -0
  16. package/android/src/main/java/io/fishjam/reactnative/utils/PermissionUtils.kt +45 -0
  17. package/build/RNFishjamClientModule.d.ts +6 -2
  18. package/build/RNFishjamClientModule.d.ts.map +1 -1
  19. package/build/RNFishjamClientModule.js.map +1 -1
  20. package/build/hooks/useAppScreenShare.d.ts +11 -0
  21. package/build/hooks/useAppScreenShare.d.ts.map +1 -0
  22. package/build/hooks/useAppScreenShare.js +54 -0
  23. package/build/hooks/useAppScreenShare.js.map +1 -0
  24. package/build/hooks/useFishjamEvent.d.ts +1 -0
  25. package/build/hooks/useFishjamEvent.d.ts.map +1 -1
  26. package/build/hooks/useFishjamEvent.js +1 -0
  27. package/build/hooks/useFishjamEvent.js.map +1 -1
  28. package/build/hooks/useForegroundService.d.ts +44 -0
  29. package/build/hooks/useForegroundService.d.ts.map +1 -0
  30. package/build/hooks/useForegroundService.js +57 -0
  31. package/build/hooks/useForegroundService.js.map +1 -0
  32. package/build/hooks/useMicrophone.d.ts +1 -1
  33. package/build/hooks/useMicrophone.js +1 -1
  34. package/build/hooks/useMicrophone.js.map +1 -1
  35. package/build/hooks/useScreenShare.d.ts +1 -0
  36. package/build/hooks/useScreenShare.d.ts.map +1 -1
  37. package/build/hooks/useScreenShare.js +20 -13
  38. package/build/hooks/useScreenShare.js.map +1 -1
  39. package/build/index.d.ts +4 -3
  40. package/build/index.d.ts.map +1 -1
  41. package/build/index.js +2 -2
  42. package/build/index.js.map +1 -1
  43. package/build/types.d.ts +0 -25
  44. package/build/types.d.ts.map +1 -1
  45. package/build/types.js +1 -10
  46. package/build/types.js.map +1 -1
  47. package/ios/Events.swift +1 -0
  48. package/ios/RNFishjamClient.podspec +1 -1
  49. package/ios/RNFishjamClient.swift +144 -57
  50. package/ios/RNFishjamClientModule.swift +32 -24
  51. package/ios/VideoPreviewView.swift +6 -10
  52. package/ios/VideoRendererView.swift +5 -14
  53. package/package.json +6 -6
  54. package/plugin/build/withFishjamAndroid.js +1 -1
  55. package/build/utils/foregroundService.d.ts +0 -32
  56. package/build/utils/foregroundService.d.ts.map +0 -1
  57. package/build/utils/foregroundService.js +0 -43
  58. package/build/utils/foregroundService.js.map +0 -1
package/build/index.js CHANGED
@@ -5,14 +5,14 @@ export { useBandwidthEstimation } from './hooks/useBandwidthEstimation';
5
5
  export { useCamera } from './hooks/useCamera';
6
6
  export { useMicrophone } from './hooks/useMicrophone';
7
7
  export { useScreenShare } from './hooks/useScreenShare';
8
+ export { useAppScreenShare } from './hooks/useAppScreenShare';
8
9
  export { useReconnection } from './hooks/useReconnection';
9
10
  export { updatePeerMetadata } from './common/metadata';
10
11
  export { setTargetTrackEncoding } from './common/webRTC';
11
12
  export { joinRoom, leaveRoom } from './common/client';
12
13
  export { VideoPreviewView } from './components/VideoPreviewView';
13
14
  export { VideoRendererView } from './components/VideoRendererView';
14
- export { AndroidForegroundServiceType } from './types';
15
- export { startForegroundService, stopForegroundService, } from './utils/foregroundService';
16
15
  export { usePeerStatus } from './hooks/usePeerStatus';
16
+ export { useForegroundService } from './hooks/useForegroundService';
17
17
  initializeWarningListener();
18
18
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AASlE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAO5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAE5D,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AASxE,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAE9C,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAMtD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAGxD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAE1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEvD,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAGzD,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAGtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAGjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAEnE,OAAO,EAAE,4BAA4B,EAAE,MAAM,SAAS,CAAC;AACvD,OAAO,EACL,sBAAsB,EACtB,qBAAqB,GACtB,MAAM,2BAA2B,CAAC;AAGnC,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAWtD,yBAAyB,EAAE,CAAC","sourcesContent":["import { initializeWarningListener } from './utils/errorListener';\n\nexport type {\n Peer,\n Track,\n TrackType,\n VadStatus,\n EncodingReason,\n} from './hooks/usePeers';\nexport { usePeers } from './hooks/usePeers';\n\nexport type {\n AudioOutputDevice,\n AudioOutputDeviceType,\n AudioSessionMode,\n} from './hooks/useAudioSettings';\nexport { useAudioSettings } from './hooks/useAudioSettings';\n\nexport { useBandwidthEstimation } from './hooks/useBandwidthEstimation';\n\nexport type {\n CameraId,\n Camera,\n CameraConfig,\n VideoQuality,\n CameraFacingDirection,\n} from './hooks/useCamera';\nexport { useCamera } from './hooks/useCamera';\n\nexport { useMicrophone } from './hooks/useMicrophone';\n\nexport type {\n ScreenShareOptions,\n ScreenShareQuality,\n} from './hooks/useScreenShare';\nexport { useScreenShare } from './hooks/useScreenShare';\n\nexport type { ReconnectionStatus } from './hooks/useReconnection';\nexport { useReconnection } from './hooks/useReconnection';\n\nexport { updatePeerMetadata } from './common/metadata';\n\nexport { setTargetTrackEncoding } from './common/webRTC';\n\nexport type { ConnectionConfig } from './common/client';\nexport { joinRoom, leaveRoom } from './common/client';\n\nexport type { VideoPreviewViewProps } from './components/VideoPreviewView';\nexport { VideoPreviewView } from './components/VideoPreviewView';\n\nexport type { VideoRendererProps } from './components/VideoRendererView';\nexport { VideoRendererView } from './components/VideoRendererView';\n\nexport { AndroidForegroundServiceType } from './types';\nexport {\n startForegroundService,\n stopForegroundService,\n} from './utils/foregroundService';\n\nexport type { PeerStatus } from './hooks/usePeerStatus';\nexport { usePeerStatus } from './hooks/usePeerStatus';\n\nexport type {\n TrackBandwidthLimit,\n TrackEncoding,\n SimulcastBandwidthLimit,\n BandwidthLimit,\n SimulcastConfig,\n VideoLayout,\n} from './types';\n\ninitializeWarningListener();\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AAYlE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAO5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAE5D,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AASxE,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAE9C,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAMtD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAG9D,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAE1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEvD,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAGzD,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAGtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAGjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAGnE,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAMtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAWpE,yBAAyB,EAAE,CAAC","sourcesContent":["import { initializeWarningListener } from './utils/errorListener';\n\nexport type {\n Peer,\n Track,\n TrackType,\n VadStatus,\n EncodingReason,\n AudioTrack,\n VideoTrack,\n} from './hooks/usePeers';\n\nexport { usePeers } from './hooks/usePeers';\n\nexport type {\n AudioOutputDevice,\n AudioOutputDeviceType,\n AudioSessionMode,\n} from './hooks/useAudioSettings';\nexport { useAudioSettings } from './hooks/useAudioSettings';\n\nexport { useBandwidthEstimation } from './hooks/useBandwidthEstimation';\n\nexport type {\n CameraId,\n Camera,\n CameraConfig,\n VideoQuality,\n CameraFacingDirection,\n} from './hooks/useCamera';\nexport { useCamera } from './hooks/useCamera';\n\nexport { useMicrophone } from './hooks/useMicrophone';\n\nexport type {\n ScreenShareOptions,\n ScreenShareQuality,\n} from './hooks/useScreenShare';\nexport { useScreenShare } from './hooks/useScreenShare';\n\nexport { useAppScreenShare } from './hooks/useAppScreenShare';\n\nexport type { ReconnectionStatus } from './hooks/useReconnection';\nexport { useReconnection } from './hooks/useReconnection';\n\nexport { updatePeerMetadata } from './common/metadata';\n\nexport { setTargetTrackEncoding } from './common/webRTC';\n\nexport type { ConnectionConfig } from './common/client';\nexport { joinRoom, leaveRoom } from './common/client';\n\nexport type { VideoPreviewViewProps } from './components/VideoPreviewView';\nexport { VideoPreviewView } from './components/VideoPreviewView';\n\nexport type { VideoRendererProps } from './components/VideoRendererView';\nexport { VideoRendererView } from './components/VideoRendererView';\n\nexport type { PeerStatus } from './hooks/usePeerStatus';\nexport { usePeerStatus } from './hooks/usePeerStatus';\n\nexport type {\n ForegroundServiceNotificationConfig,\n ForegroundServicePermissionsConfig,\n} from './hooks/useForegroundService';\nexport { useForegroundService } from './hooks/useForegroundService';\n\nexport type {\n TrackBandwidthLimit,\n TrackEncoding,\n SimulcastBandwidthLimit,\n BandwidthLimit,\n SimulcastConfig,\n VideoLayout,\n} from './types';\n\ninitializeWarningListener();\n"]}
package/build/types.d.ts CHANGED
@@ -45,30 +45,5 @@ declare const brand: unique symbol;
45
45
  export type Brand<T, TBrand extends string> = T & {
46
46
  [brand]: TBrand;
47
47
  };
48
- /**
49
- * Enum used to set the foreground service types identifying the work done by the service.
50
- * See Android's [foreground service types](https://developer.android.com/develop/background-work/services/fg-service-types) documentation.
51
- */
52
- export declare enum AndroidForegroundServiceType {
53
- FOREGROUND_SERVICE_TYPE_CAMERA = 64,
54
- FOREGROUND_SERVICE_TYPE_MEDIA_PROJECTION = 32,
55
- FOREGROUND_SERVICE_TYPE_MICROPHONE = 128
56
- }
57
- /**
58
- * A type representing the options required for configuring the foreground service.
59
- *
60
- * @param channelId The id of the channel. Must be unique per package.
61
- * @param channelName The user visible name of the channel.
62
- * @param notificationTitle The title (first row) of the notification, in a standard notification.
63
- * @param notificationContent The text (second row) of the notification, in a standard notification.
64
- * @param foregroundServiceTypes The type of foreground service to launch.
65
- */
66
- export type ForegroundServiceOptions = {
67
- channelId: string;
68
- channelName: string;
69
- notificationTitle: string;
70
- notificationContent: string;
71
- foregroundServiceTypes: AndroidForegroundServiceType[];
72
- };
73
48
  export {};
74
49
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,KAAK,CAAC;AAEzC,MAAM,MAAM,aAAa,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAE5C;;;;;;GAMG;AACH,MAAM,MAAM,eAAe,GAAG;IAC5B;;OAEG;IACH,OAAO,EAAE,OAAO,CAAC;IACjB;;OAEG;IACH,eAAe,EAAE,aAAa,EAAE,CAAC;CAClC,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC;AAEpC;;;GAGG;AACH,MAAM,MAAM,uBAAuB,GAAG,MAAM,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC;AAE5E;;GAEG;AACH,MAAM,MAAM,mBAAmB,GAAG,cAAc,GAAG,uBAAuB,CAAC;AAE3E,MAAM,MAAM,aAAa,GAAG;IAC1B,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,EAAE,OAAO,GAAG,QAAQ,GAAG,eAAe,CAAC;CAC5C,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;AAEtE;;;GAGG;AACH,oBAAY,4BAA4B;IACtC,8BAA8B,KAAK;IACnC,wCAAwC,KAAK;IAC7C,kCAAkC,MAAM;CACzC;AAED;;;;;;;;GAQG;AACH,MAAM,MAAM,wBAAwB,GAAG;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,sBAAsB,EAAE,4BAA4B,EAAE,CAAC;CACxD,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,KAAK,CAAC;AAEzC,MAAM,MAAM,aAAa,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAE5C;;;;;;GAMG;AACH,MAAM,MAAM,eAAe,GAAG;IAC5B;;OAEG;IACH,OAAO,EAAE,OAAO,CAAC;IACjB;;OAEG;IACH,eAAe,EAAE,aAAa,EAAE,CAAC;CAClC,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC;AAEpC;;;GAGG;AACH,MAAM,MAAM,uBAAuB,GAAG,MAAM,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC;AAE5E;;GAEG;AACH,MAAM,MAAM,mBAAmB,GAAG,cAAc,GAAG,uBAAuB,CAAC;AAE3E,MAAM,MAAM,aAAa,GAAG;IAC1B,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,EAAE,OAAO,GAAG,QAAQ,GAAG,eAAe,CAAC;CAC5C,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 CHANGED
@@ -1,11 +1,2 @@
1
- /**
2
- * Enum used to set the foreground service types identifying the work done by the service.
3
- * See Android's [foreground service types](https://developer.android.com/develop/background-work/services/fg-service-types) documentation.
4
- */
5
- export var AndroidForegroundServiceType;
6
- (function (AndroidForegroundServiceType) {
7
- AndroidForegroundServiceType[AndroidForegroundServiceType["FOREGROUND_SERVICE_TYPE_CAMERA"] = 64] = "FOREGROUND_SERVICE_TYPE_CAMERA";
8
- AndroidForegroundServiceType[AndroidForegroundServiceType["FOREGROUND_SERVICE_TYPE_MEDIA_PROJECTION"] = 32] = "FOREGROUND_SERVICE_TYPE_MEDIA_PROJECTION";
9
- AndroidForegroundServiceType[AndroidForegroundServiceType["FOREGROUND_SERVICE_TYPE_MICROPHONE"] = 128] = "FOREGROUND_SERVICE_TYPE_MICROPHONE";
10
- })(AndroidForegroundServiceType || (AndroidForegroundServiceType = {}));
1
+ export {};
11
2
  //# sourceMappingURL=types.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAuDA;;;GAGG;AACH,MAAM,CAAN,IAAY,4BAIX;AAJD,WAAY,4BAA4B;IACtC,oIAAmC,CAAA;IACnC,wJAA6C,CAAA;IAC7C,6IAAwC,CAAA;AAC1C,CAAC,EAJW,4BAA4B,KAA5B,4BAA4B,QAIvC","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 * @category Components\n */\nexport type VideoLayout = 'FILL' | 'FIT';\n\nexport type TrackEncoding = 'l' | 'm' | 'h';\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 * list of active encodings. Encoding can be one of `\"h\"` (original encoding), `\"m\"` (scaled down x2), `\"l\"` (scaled down x4).\n */\n activeEncodings: TrackEncoding[];\n};\n\n/**\n * Type describing maximal bandwidth that can be used, in kbps. 0 is interpreted as unlimited bandwidth.\n */\nexport type BandwidthLimit = number;\n\n/**\n * Type describing bandwidth limit for simulcast track. It is a mapping `encoding -> BandwidthLimit`. If encoding isn't present in this mapping,\n * it will be assumed that this particular encoding shouldn't have any bandwidth limit.\n */\nexport type SimulcastBandwidthLimit = Record<TrackEncoding, BandwidthLimit>;\n\n/**\n * A type describing bandwidth limitation of a track, including simulcast and non-simulcast tracks. Can be `BandwidthLimit` or `SimulcastBandwidthLimit`.\n */\nexport type TrackBandwidthLimit = BandwidthLimit | SimulcastBandwidthLimit;\n\nexport type TrackMetadata = {\n active: boolean;\n type: 'audio' | 'camera' | 'screensharing';\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\n/**\n * Enum used to set the foreground service types identifying the work done by the service.\n * See Android's [foreground service types](https://developer.android.com/develop/background-work/services/fg-service-types) documentation.\n */\nexport enum AndroidForegroundServiceType {\n FOREGROUND_SERVICE_TYPE_CAMERA = 64,\n FOREGROUND_SERVICE_TYPE_MEDIA_PROJECTION = 32,\n FOREGROUND_SERVICE_TYPE_MICROPHONE = 128,\n}\n\n/**\n * A type representing the options required for configuring the foreground service.\n *\n * @param channelId The id of the channel. Must be unique per package.\n * @param channelName The user visible name of the channel.\n * @param notificationTitle The title (first row) of the notification, in a standard notification.\n * @param notificationContent The text (second row) of the notification, in a standard notification.\n * @param foregroundServiceTypes The type of foreground service to launch.\n */\nexport type ForegroundServiceOptions = {\n channelId: string;\n channelName: string;\n notificationTitle: string;\n notificationContent: string;\n foregroundServiceTypes: AndroidForegroundServiceType[];\n};\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 * @category Components\n */\nexport type VideoLayout = 'FILL' | 'FIT';\n\nexport type TrackEncoding = 'l' | 'm' | 'h';\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 * list of active encodings. Encoding can be one of `\"h\"` (original encoding), `\"m\"` (scaled down x2), `\"l\"` (scaled down x4).\n */\n activeEncodings: TrackEncoding[];\n};\n\n/**\n * Type describing maximal bandwidth that can be used, in kbps. 0 is interpreted as unlimited bandwidth.\n */\nexport type BandwidthLimit = number;\n\n/**\n * Type describing bandwidth limit for simulcast track. It is a mapping `encoding -> BandwidthLimit`. If encoding isn't present in this mapping,\n * it will be assumed that this particular encoding shouldn't have any bandwidth limit.\n */\nexport type SimulcastBandwidthLimit = Record<TrackEncoding, BandwidthLimit>;\n\n/**\n * A type describing bandwidth limitation of a track, including simulcast and non-simulcast tracks. Can be `BandwidthLimit` or `SimulcastBandwidthLimit`.\n */\nexport type TrackBandwidthLimit = BandwidthLimit | SimulcastBandwidthLimit;\n\nexport type TrackMetadata = {\n active: boolean;\n type: 'audio' | 'camera' | 'screensharing';\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"]}
package/ios/Events.swift CHANGED
@@ -9,6 +9,7 @@ enum EmitableEvents: String, CaseIterable {
9
9
  case IsCameraOn
10
10
  case IsMicrophoneOn
11
11
  case IsScreenShareOn
12
+ case IsAppScreenShareOn
12
13
  case SimulcastConfigUpdate
13
14
  case PeersUpdate
14
15
  case AudioDeviceUpdate
@@ -25,6 +25,6 @@ Pod::Spec.new do |s|
25
25
 
26
26
  s.source_files = '**/*.{h,m,swift}'
27
27
 
28
- s.dependency 'FishjamCloudClient', '0.3.0'
28
+ s.dependency 'FishjamCloudClient', '0.4.0'
29
29
 
30
30
  end
@@ -11,6 +11,7 @@ class RNFishjamClient: FishjamClientListener {
11
11
  var isMicrophoneOn = false
12
12
  var isCameraOn = false
13
13
  var isScreenShareOn = false
14
+ var isAppScreenShareOn = false
14
15
  var isConnected = false
15
16
 
16
17
  private var isCameraInitialized = false
@@ -37,8 +38,8 @@ class RNFishjamClient: FishjamClientListener {
37
38
 
38
39
  let sendEvent: (_ eventName: String, _ data: [String: Any]) -> Void
39
40
 
40
- static var onTracksUpdateListeners: [OnTrackUpdateListener] = []
41
- static var localCameraTrackListeners: [OnLocalCameraTrackChangedListener] = []
41
+ static var tracksUpdateListenersManager = TracksUpdateListenersManager()
42
+ static var localCameraTracksChangedListenersManager = LocalCameraTracksChangedListenersManager()
42
43
 
43
44
  init(sendEvent: @escaping (_ eventName: String, _ data: [String: Any]) -> Void) {
44
45
  self.sendEvent = sendEvent
@@ -111,26 +112,34 @@ class RNFishjamClient: FishjamClientListener {
111
112
  }
112
113
  }()
113
114
  let videoParameters = VideoParameters(
114
- dimensions: flipDimensions ? preset.dimensions.flip() : preset.dimensions,
115
+ dimensions: flipDimensions ? preset.dimensions.flipped : preset.dimensions,
115
116
  maxBandwidth: videoBandwidthLimit,
116
117
  simulcastConfig: simulcastConfig
117
118
  )
118
119
  return videoParameters
119
120
  }
120
121
 
121
- private func getLocalVideoTrack() -> LocalVideoTrack? {
122
- return RNFishjamClient.fishjamClient?.getLocalEndpoint().tracks.first { $0.value is LocalVideoTrack }?.value
123
- as? LocalVideoTrack
122
+ private var localEndpoint: Endpoint? {
123
+ RNFishjamClient.fishjamClient?.getLocalEndpoint()
124
+ }
125
+
126
+ private func getLocalCameraTrack() -> LocalCameraTrack? {
127
+ return localEndpoint?.tracks.compactMap { $0.value as? LocalCameraTrack }.first
128
+
124
129
  }
125
130
 
126
131
  private func getLocalAudioTrack() -> LocalAudioTrack? {
127
- return RNFishjamClient.fishjamClient?.getLocalEndpoint().tracks.first { $0.value is LocalAudioTrack }?.value
128
- as? LocalAudioTrack
132
+ return localEndpoint?.tracks.compactMap { $0.value as? LocalAudioTrack }.first
133
+
134
+ }
135
+
136
+ private func getLocalScreenBroadcastTrack() -> LocalBroadcastScreenShareTrack? {
137
+ return localEndpoint?.tracks.compactMap { $0.value as? LocalBroadcastScreenShareTrack }.first
138
+
129
139
  }
130
140
 
131
- private func getLocalScreenShareTrack() -> LocalScreenShareTrack? {
132
- return RNFishjamClient.fishjamClient?.getLocalEndpoint().tracks.first { $0.value is LocalScreenShareTrack }?
133
- .value as? LocalScreenShareTrack
141
+ private func getLocalScreenAppTrack() -> LocalAppScreenShareTrack? {
142
+ return localEndpoint?.tracks.compactMap { $0.value as? LocalAppScreenShareTrack }.first
134
143
  }
135
144
 
136
145
  private func ensureCreated() throws {
@@ -151,8 +160,8 @@ class RNFishjamClient: FishjamClientListener {
151
160
  }
152
161
  }
153
162
 
154
- private func ensureVideoTrack() throws {
155
- if getLocalVideoTrack() == nil {
163
+ private func ensureCameraTrack() throws {
164
+ if getLocalCameraTrack() == nil {
156
165
  throw Exception(
157
166
  name: "E_NO_LOCAL_VIDEO_TRACK",
158
167
  description: "No local video track. Make sure to call connect() first!")
@@ -167,11 +176,19 @@ class RNFishjamClient: FishjamClientListener {
167
176
  }
168
177
  }
169
178
 
170
- private func ensureScreenShareTrack() throws {
171
- if getLocalScreenShareTrack() == nil {
179
+ private func ensureScreenBroadcastTrack() throws {
180
+ if getLocalScreenBroadcastTrack() == nil {
172
181
  throw Exception(
173
182
  name: "E_NO_LOCAL_SCREENSHARE_TRACK",
174
- description: "No local screen share track. Make sure to toggle screen share on first!")
183
+ description: "No local screen broadcast track. Make sure to toggle screen broadcast on first!")
184
+ }
185
+ }
186
+
187
+ private func ensureScreenAppTrack() throws {
188
+ if getLocalScreenAppTrack() == nil {
189
+ throw Exception(
190
+ name: "E_NO_LOCAL_SCREENSHARE_TRACK",
191
+ description: "No local screen app track. Make sure to toggle screen app on first!")
175
192
  }
176
193
  }
177
194
 
@@ -189,7 +206,7 @@ class RNFishjamClient: FishjamClientListener {
189
206
  ) {
190
207
  peerStatus = .connecting
191
208
  connectPromise = promise
192
- localUserMetadata = peerMetadata.toMetadata()
209
+ localUserMetadata = ["server": [:], "peer": peerMetadata].toMetadata()
193
210
 
194
211
  let reconnectConfig = FishjamCloudClient.ReconnectConfig(
195
212
  maxAttempts: config.reconnectConfig.maxAttempts, initialDelayMs: config.reconnectConfig.initialDelayMs,
@@ -197,7 +214,7 @@ class RNFishjamClient: FishjamClientListener {
197
214
 
198
215
  RNFishjamClient.fishjamClient?.connect(
199
216
  config: FishjamCloudClient.ConnectConfig(
200
- websocketUrl: url, token: peerToken, peerMetadata: .init(peerMetadata),
217
+ websocketUrl: url, token: peerToken, peerMetadata: localUserMetadata,
201
218
  reconnectConfig: reconnectConfig
202
219
  ))
203
220
 
@@ -214,6 +231,7 @@ class RNFishjamClient: FishjamClientListener {
214
231
  isMicrophoneOn = false
215
232
  isCameraOn = false
216
233
  isScreenShareOn = false
234
+ isAppScreenShareOn = false
217
235
  isConnected = false
218
236
  isCameraInitialized = false
219
237
  RNFishjamClient.fishjamClient?.leave { [weak self] in
@@ -221,7 +239,7 @@ class RNFishjamClient: FishjamClientListener {
221
239
  }
222
240
  }
223
241
 
224
- func startCamera(config: CameraConfig) throws {
242
+ func startCamera(config: CameraConfig) async throws {
225
243
  try ensureCreated()
226
244
 
227
245
  guard !isCameraInitialized else {
@@ -229,13 +247,18 @@ class RNFishjamClient: FishjamClientListener {
229
247
  return
230
248
  }
231
249
 
250
+ guard await PermissionUtils.requestCameraPermission() else {
251
+ emit(warning: "Camera permission not granted.")
252
+ return
253
+ }
254
+
232
255
  let cameraTrack = try createCameraTrack(config: config)
233
256
  setCameraTrackState(cameraTrack, enabled: config.cameraEnabled)
234
257
  emitEndpoints()
235
258
  isCameraInitialized = true
236
259
  }
237
260
 
238
- private func createCameraTrack(config: CameraConfig) throws -> LocalVideoTrack {
261
+ private func createCameraTrack(config: CameraConfig) throws -> LocalCameraTrack {
239
262
  try ensureCreated()
240
263
  let videoParameters = try getVideoParametersFromOptions(connectionOptions: config)
241
264
  videoSimulcastConfig = try getSimulcastConfigFromOptions(simulcastConfig: config.simulcastConfig)
@@ -246,42 +269,46 @@ class RNFishjamClient: FishjamClientListener {
246
269
  )
247
270
  }
248
271
 
249
- private func setCameraTrackState(_ cameraTrack: LocalVideoTrack, enabled: Bool) {
272
+ private func setCameraTrackState(_ cameraTrack: LocalCameraTrack, enabled: Bool) {
250
273
  cameraTrack.enabled = enabled
251
274
  isCameraOn = enabled
252
275
  let event = EmitableEvents.IsCameraOn
253
276
  let isCameraEnabledMap = [event.name: enabled]
254
277
  emit(event: event, data: isCameraEnabledMap)
255
- RNFishjamClient.localCameraTrackListeners.forEach { $0.onLocalCameraTrackChanged() }
278
+ RNFishjamClient.localCameraTracksChangedListenersManager.notifyListeners()
256
279
  }
257
280
 
258
281
  func toggleCamera() throws -> Bool {
259
- try ensureVideoTrack()
260
- setCameraTrackState(getLocalVideoTrack()!, enabled: !isCameraOn)
282
+ try ensureCameraTrack()
283
+ setCameraTrackState(getLocalCameraTrack()!, enabled: !isCameraOn)
261
284
  return isCameraOn
262
285
  }
263
286
 
264
287
  func flipCamera() throws {
265
- try ensureVideoTrack()
266
- getLocalVideoTrack()?.flipCamera()
288
+ try ensureCameraTrack()
289
+ getLocalCameraTrack()?.flipCamera()
267
290
  }
268
291
 
269
292
  func switchCamera(cameraId: String) throws {
270
- try ensureVideoTrack()
271
- getLocalVideoTrack()?.switchCamera(deviceId: cameraId)
293
+ try ensureCameraTrack()
294
+ getLocalCameraTrack()?.switchCamera(deviceId: cameraId)
272
295
 
273
296
  }
274
297
 
275
- func toggleMicrophone() throws -> Bool {
298
+ func toggleMicrophone() async throws -> Bool {
276
299
  if let audioTrack = getLocalAudioTrack() {
277
300
  setMicrophoneTrackState(audioTrack, enabled: !isMicrophoneOn)
278
301
  } else {
279
- try startMicrophone()
302
+ try await startMicrophone()
280
303
  }
281
304
  return isMicrophoneOn
282
305
  }
283
306
 
284
- func startMicrophone() throws {
307
+ func startMicrophone() async throws {
308
+ guard await PermissionUtils.requestMicrophonePermission() else {
309
+ emit(warning: "Microphone permission not granted.")
310
+ return
311
+ }
285
312
  let microphoneTrack = RNFishjamClient.fishjamClient!.createAudioTrack(metadata: Metadata())
286
313
  setAudioSessionMode()
287
314
  setMicrophoneTrackState(microphoneTrack, enabled: true)
@@ -317,6 +344,10 @@ class RNFishjamClient: FishjamClientListener {
317
344
  func toggleScreenShare(screenShareOptions: ScreenShareOptions) throws {
318
345
  try ensureCreated()
319
346
  try ensureConnected()
347
+ guard isAppScreenShareOn == false else {
348
+ emit(warning: "Screensharing screen not available during screensharing app.")
349
+ return
350
+ }
320
351
  guard let screenShareExtensionBundleId = Bundle.main.infoDictionary?["ScreenShareExtensionBundleId"] as? String
321
352
  else {
322
353
  throw Exception(
@@ -346,13 +377,18 @@ class RNFishjamClient: FishjamClientListener {
346
377
  maxBandwidth: screenShareOptions.maxBandwidth)
347
378
  let screenShareMetadata = screenShareOptions.screenShareMetadata.toMetadata()
348
379
  let videoParameters = getScreenShareVideoParameters(options: screenShareOptions)
349
- RNFishjamClient.fishjamClient!.prepareForScreenSharing(
380
+ RNFishjamClient.fishjamClient!.prepareForScreenBroadcast(
350
381
  appGroup: appGroupName,
351
382
  videoParameters: videoParameters,
352
383
  metadata: screenShareMetadata,
384
+ canStart: {
385
+ if self.isAppScreenShareOn {
386
+ self.emit(warning: "Screensharing screen not available during screensharing app.")
387
+ }
388
+ return !self.isAppScreenShareOn
389
+ },
353
390
  onStart: { [weak self] in
354
391
  guard let self else { return }
355
-
356
392
  do {
357
393
  try setScreenShareTrackState(enabled: true)
358
394
  } catch {
@@ -387,6 +423,50 @@ class RNFishjamClient: FishjamClientListener {
387
423
  emit(event: event, data: isScreenShareEnabled)
388
424
  }
389
425
 
426
+ func startScreenAppShare(screenShareOptions: ScreenShareOptions) throws {
427
+ try ensureCreated()
428
+ try ensureConnected()
429
+
430
+ let simulcastConfig = try getSimulcastConfigFromOptions(simulcastConfig: screenShareOptions.simulcastConfig)
431
+
432
+ screenShareSimulcastConfig = simulcastConfig
433
+ screenShareMaxBandwidth = getMaxBandwidthFromOptions(maxBandwidth: screenShareOptions.maxBandwidth)
434
+ let metadata = screenShareOptions.screenShareMetadata.toMetadata()
435
+ let videoParameters = getScreenShareVideoParameters(options: screenShareOptions)
436
+ let screenAppTrack = RNFishjamClient.fishjamClient!.createScreenAppTrack(
437
+ videoParameters: videoParameters, metadata: metadata)
438
+ setScreenAppTrackState(screenAppTrack, enabled: true)
439
+ emitEndpoints()
440
+ }
441
+
442
+ func stopAppScreenShare() throws {
443
+ try ensureScreenAppTrack()
444
+ let track = getLocalScreenAppTrack()!
445
+ setScreenAppTrackState(track, enabled: false)
446
+ RNFishjamClient.fishjamClient?.removeTrack(trackId: track.id)
447
+ emitEndpoints()
448
+ }
449
+
450
+ func toggleAppScreenShare(screenShareOptions: ScreenShareOptions) throws {
451
+ guard isScreenShareOn == false else {
452
+ emit(warning: "App screensharing not available during screensharing.")
453
+ return
454
+ }
455
+ if getLocalScreenAppTrack() != nil {
456
+ try stopAppScreenShare()
457
+ } else {
458
+ try startScreenAppShare(screenShareOptions: screenShareOptions)
459
+ }
460
+ }
461
+
462
+ private func setScreenAppTrackState(_ track: LocalAppScreenShareTrack, enabled: Bool) {
463
+ track.enabled = enabled
464
+ isAppScreenShareOn = enabled
465
+ let event = EmitableEvents.IsAppScreenShareOn
466
+ let eventMap = [event.name: enabled]
467
+ emit(event: event, data: eventMap)
468
+ }
469
+
390
470
  //returns local endpoint and remote endpoints
391
471
  static func getLocalAndRemoteEndpoints() -> [Endpoint] {
392
472
  let localEndpoint = RNFishjamClient.fishjamClient!.getLocalEndpoint()
@@ -421,14 +501,21 @@ class RNFishjamClient: FishjamClientListener {
421
501
  "vadStatus": track.vadStatus.rawValue,
422
502
  ]
423
503
 
424
- case let track as LocalVideoTrack:
504
+ case let track as LocalCameraTrack:
505
+ return [
506
+ "id": track.id,
507
+ "type": "Video",
508
+ "metadata": track.metadata.toDict(),
509
+ ]
510
+
511
+ case let track as LocalBroadcastScreenShareTrack:
425
512
  return [
426
513
  "id": track.id,
427
514
  "type": "Video",
428
515
  "metadata": track.metadata.toDict(),
429
516
  ]
430
517
 
431
- case let track as LocalScreenShareTrack:
518
+ case let track as LocalAppScreenShareTrack:
432
519
  return [
433
520
  "id": track.id,
434
521
  "type": "Video",
@@ -451,7 +538,7 @@ class RNFishjamClient: FishjamClientListener {
451
538
  }
452
539
 
453
540
  func getCaptureDevices() -> [[String: Any]] {
454
- let devices = LocalVideoTrack.getCaptureDevices()
541
+ let devices = LocalCameraTrack.getCaptureDevices()
455
542
  return devices.map { device -> [String: Any] in
456
543
  let facingDirection =
457
544
  switch device.position {
@@ -478,8 +565,8 @@ class RNFishjamClient: FishjamClientListener {
478
565
  }
479
566
 
480
567
  func updateLocalVideoTrackMetadata(metadata: [String: Any]) throws {
481
- try ensureVideoTrack()
482
- if let track = getLocalVideoTrack() {
568
+ try ensureCameraTrack()
569
+ if let track = getLocalCameraTrack() {
483
570
  updateTrackMetadata(trackId: track.id, metadata: metadata)
484
571
  }
485
572
  }
@@ -492,8 +579,8 @@ class RNFishjamClient: FishjamClientListener {
492
579
  }
493
580
 
494
581
  func updateLocalScreenShareTrackMetadata(metadata: [String: Any]) throws {
495
- try ensureScreenShareTrack()
496
- if let track = getLocalScreenShareTrack() {
582
+ try ensureScreenBroadcastTrack()
583
+ if let track = getLocalScreenBroadcastTrack() {
497
584
  updateTrackMetadata(trackId: track.id, metadata: metadata)
498
585
  }
499
586
  }
@@ -518,8 +605,8 @@ class RNFishjamClient: FishjamClientListener {
518
605
  }
519
606
 
520
607
  func toggleScreenShareTrackEncoding(encoding: String) throws -> [String: Any] {
521
- try ensureScreenShareTrack()
522
- if let track = getLocalScreenShareTrack() {
608
+ try ensureScreenBroadcastTrack()
609
+ if let track = getLocalScreenBroadcastTrack() {
523
610
  screenShareSimulcastConfig = try toggleTrackEncoding(
524
611
  encoding: encoding, trackId: track.id, simulcastConfig: screenShareSimulcastConfig)
525
612
  }
@@ -527,15 +614,15 @@ class RNFishjamClient: FishjamClientListener {
527
614
  }
528
615
 
529
616
  func setScreenShareTrackBandwidth(bandwidth: Int) throws {
530
- try ensureScreenShareTrack()
531
- if let track = getLocalScreenShareTrack() {
617
+ try ensureScreenBroadcastTrack()
618
+ if let track = getLocalScreenBroadcastTrack() {
532
619
  RNFishjamClient.fishjamClient?.setTrackBandwidth(trackId: track.id, bandwidthLimit: bandwidth)
533
620
  }
534
621
  }
535
622
 
536
623
  func setScreenShareTrackEncodingBandwidth(encoding: String, bandwidth: Int) throws {
537
- try ensureScreenShareTrack()
538
- if let track = getLocalScreenShareTrack() {
624
+ try ensureScreenBroadcastTrack()
625
+ if let track = getLocalScreenBroadcastTrack() {
539
626
  RNFishjamClient.fishjamClient?.setEncodingBandwidth(
540
627
  trackId: track.id, encoding: encoding, bandwidthLimit: bandwidth)
541
628
  }
@@ -548,10 +635,10 @@ class RNFishjamClient: FishjamClientListener {
548
635
  }
549
636
 
550
637
  func toggleVideoTrackEncoding(encoding: String) throws -> [String: Any] {
551
- try ensureVideoTrack()
638
+ try ensureCameraTrack()
552
639
  try ensureConnected()
553
640
 
554
- let track = getLocalVideoTrack()!
641
+ let track = getLocalCameraTrack()!
555
642
  videoSimulcastConfig = try toggleTrackEncoding(
556
643
  encoding: encoding, trackId: track.id, simulcastConfig: videoSimulcastConfig)
557
644
 
@@ -563,15 +650,15 @@ class RNFishjamClient: FishjamClientListener {
563
650
  }
564
651
 
565
652
  func setVideoTrackEncodingBandwidth(encoding: String, bandwidth: Int) throws {
566
- try ensureVideoTrack()
567
- let track = getLocalVideoTrack()!
653
+ try ensureCameraTrack()
654
+ let track = getLocalCameraTrack()!
568
655
  RNFishjamClient.fishjamClient?.setEncodingBandwidth(
569
656
  trackId: track.id, encoding: encoding, bandwidthLimit: bandwidth)
570
657
  }
571
658
 
572
659
  func setVideoTrackBandwidth(bandwidth: Int) throws {
573
- try ensureVideoTrack()
574
- let track = getLocalVideoTrack()!
660
+ try ensureCameraTrack()
661
+ let track = getLocalCameraTrack()!
575
662
  RNFishjamClient.fishjamClient?.setTrackBandwidth(trackId: track.id, bandwidthLimit: bandwidth)
576
663
  }
577
664
 
@@ -665,7 +752,7 @@ class RNFishjamClient: FishjamClientListener {
665
752
  preset = VideoParameters.presetScreenShareHD15
666
753
  }
667
754
  return VideoParameters(
668
- dimensions: preset.dimensions.flip(),
755
+ dimensions: preset.dimensions.flipped,
669
756
  maxBandwidth: screenShareMaxBandwidth,
670
757
  maxFps: preset.maxFps,
671
758
  simulcastConfig: screenShareSimulcastConfig
@@ -673,7 +760,9 @@ class RNFishjamClient: FishjamClientListener {
673
760
  }
674
761
 
675
762
  func emit(event: EmitableEvents, data: [String: Any] = [:]) {
676
- sendEvent(event.name, data)
763
+ DispatchQueue.main.async { [weak self] in
764
+ self?.sendEvent(event.name, data)
765
+ }
677
766
  }
678
767
 
679
768
  func emit(warning: String) {
@@ -712,9 +801,7 @@ class RNFishjamClient: FishjamClientListener {
712
801
  }
713
802
  }
714
803
 
715
- RNFishjamClient.onTracksUpdateListeners.forEach {
716
- $0.onTrackUpdate()
717
- }
804
+ RNFishjamClient.tracksUpdateListenersManager.notifyListeners()
718
805
 
719
806
  emitEndpoints()
720
807
  }
@@ -73,10 +73,6 @@ typealias RNTrackBandwidthLimit = Either<Int, [String: Int]>
73
73
 
74
74
  public class RNFishjamClientModule: Module {
75
75
  public func definition() -> ModuleDefinition {
76
- Name("RNFishjamClient")
77
-
78
- Events(EmitableEvents.allEvents)
79
-
80
76
  let rnFishjamClient: RNFishjamClient = {
81
77
  let client = RNFishjamClient {
82
78
  (eventName: String, data: [String: Any]) in
@@ -86,6 +82,34 @@ public class RNFishjamClientModule: Module {
86
82
  return client
87
83
  }()
88
84
 
85
+ Name("RNFishjamClient")
86
+
87
+ Events(EmitableEvents.allEvents)
88
+
89
+ Property("peerStatus") {
90
+ return rnFishjamClient.peerStatus.rawValue
91
+ }
92
+
93
+ Property("isMicrophoneOn") {
94
+ return rnFishjamClient.isMicrophoneOn
95
+ }
96
+
97
+ Property("isCameraOn") {
98
+ return rnFishjamClient.isCameraOn
99
+ }
100
+
101
+ Property("cameras") {
102
+ return rnFishjamClient.getCaptureDevices()
103
+ }
104
+
105
+ Property("isScreenShareOn") {
106
+ return rnFishjamClient.isScreenShareOn
107
+ }
108
+
109
+ Property("isAppScreenShareOn") {
110
+ return rnFishjamClient.isAppScreenShareOn
111
+ }
112
+
89
113
  AsyncFunction("joinRoom") {
90
114
  (
91
115
  url: String, peerToken: String, peerMetadata: [String: Any], config: ConnectConfig,
@@ -101,19 +125,11 @@ public class RNFishjamClientModule: Module {
101
125
  }
102
126
 
103
127
  AsyncFunction("startCamera") { (config: CameraConfig) in
104
- try rnFishjamClient.startCamera(config: config)
105
- }
106
-
107
- Property("isMicrophoneOn") {
108
- return rnFishjamClient.isMicrophoneOn
128
+ try await rnFishjamClient.startCamera(config: config)
109
129
  }
110
130
 
111
131
  AsyncFunction("toggleMicrophone") {
112
- try rnFishjamClient.toggleMicrophone()
113
- }
114
-
115
- Property("isCameraOn") {
116
- return rnFishjamClient.isCameraOn
132
+ try await rnFishjamClient.toggleMicrophone()
117
133
  }
118
134
 
119
135
  AsyncFunction("toggleCamera") {
@@ -128,16 +144,12 @@ public class RNFishjamClientModule: Module {
128
144
  try rnFishjamClient.switchCamera(cameraId: cameraId)
129
145
  }
130
146
 
131
- Property("cameras") {
132
- rnFishjamClient.getCaptureDevices()
133
- }
134
-
135
147
  AsyncFunction("toggleScreenShare") { (screenShareOptions: ScreenShareOptions) in
136
148
  try rnFishjamClient.toggleScreenShare(screenShareOptions: screenShareOptions)
137
149
  }
138
150
 
139
- Property("isScreenShareOn") {
140
- return rnFishjamClient.isScreenShareOn
151
+ AsyncFunction("toggleAppScreenShare") { (screenShareOptions: ScreenShareOptions) in
152
+ try rnFishjamClient.toggleAppScreenShare(screenShareOptions: screenShareOptions)
141
153
  }
142
154
 
143
155
  AsyncFunction("getPeers") {
@@ -209,9 +221,5 @@ public class RNFishjamClientModule: Module {
209
221
  AsyncFunction("startAudioSwitcher") {
210
222
  rnFishjamClient.startAudioSwitcher()
211
223
  }
212
-
213
- Property("peerStatus") {
214
- return rnFishjamClient.peerStatus.rawValue
215
- }
216
224
  }
217
225
  }