@fishjam-cloud/react-native-client 0.5.0 → 0.6.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 (88) hide show
  1. package/android/build.gradle +1 -1
  2. package/android/src/main/java/io/fishjam/reactnative/EmitableEvents.kt +13 -14
  3. package/android/src/main/java/io/fishjam/reactnative/RNFishjamClient.kt +23 -10
  4. package/android/src/main/java/io/fishjam/reactnative/RNFishjamClientModule.kt +9 -7
  5. package/build/RNFishjamClientModule.d.ts +23 -6
  6. package/build/RNFishjamClientModule.d.ts.map +1 -1
  7. package/build/RNFishjamClientModule.js +19 -4
  8. package/build/RNFishjamClientModule.js.map +1 -1
  9. package/build/common/client.d.ts +1 -6
  10. package/build/common/client.d.ts.map +1 -1
  11. package/build/common/client.js +0 -4
  12. package/build/common/client.js.map +1 -1
  13. package/build/common/metadata.d.ts +1 -1
  14. package/build/common/metadata.js +1 -1
  15. package/build/common/metadata.js.map +1 -1
  16. package/build/components/FishjamRoom/parsePeersToTracks.d.ts.map +1 -1
  17. package/build/components/FishjamRoom/parsePeersToTracks.js +4 -6
  18. package/build/components/FishjamRoom/parsePeersToTracks.js.map +1 -1
  19. package/build/debug/stats/useRTCStatistics.d.ts.map +1 -1
  20. package/build/debug/stats/useRTCStatistics.js +13 -13
  21. package/build/debug/stats/useRTCStatistics.js.map +1 -1
  22. package/build/hooks/internal/useFishjamEvent.d.ts +3 -0
  23. package/build/hooks/internal/useFishjamEvent.d.ts.map +1 -0
  24. package/build/hooks/internal/useFishjamEvent.js +11 -0
  25. package/build/hooks/internal/useFishjamEvent.js.map +1 -0
  26. package/build/hooks/internal/useFishjamEventState.d.ts +3 -0
  27. package/build/hooks/internal/useFishjamEventState.d.ts.map +1 -0
  28. package/build/hooks/{useFishjamEventState.js → internal/useFishjamEventState.js} +3 -1
  29. package/build/hooks/internal/useFishjamEventState.js.map +1 -0
  30. package/build/hooks/useAppScreenShare.d.ts.map +1 -1
  31. package/build/hooks/useAppScreenShare.js +5 -7
  32. package/build/hooks/useAppScreenShare.js.map +1 -1
  33. package/build/hooks/useAudioSettings.d.ts.map +1 -1
  34. package/build/hooks/useAudioSettings.js +8 -11
  35. package/build/hooks/useAudioSettings.js.map +1 -1
  36. package/build/hooks/useBandwidthEstimation.d.ts.map +1 -1
  37. package/build/hooks/useBandwidthEstimation.js +3 -4
  38. package/build/hooks/useBandwidthEstimation.js.map +1 -1
  39. package/build/hooks/useCamera.d.ts.map +1 -1
  40. package/build/hooks/useCamera.js +7 -8
  41. package/build/hooks/useCamera.js.map +1 -1
  42. package/build/hooks/useConnection.d.ts +42 -0
  43. package/build/hooks/useConnection.d.ts.map +1 -0
  44. package/build/hooks/useConnection.js +33 -0
  45. package/build/hooks/useConnection.js.map +1 -0
  46. package/build/hooks/useMicrophone.d.ts.map +1 -1
  47. package/build/hooks/useMicrophone.js +2 -3
  48. package/build/hooks/useMicrophone.js.map +1 -1
  49. package/build/hooks/usePeerStatus.d.ts +2 -3
  50. package/build/hooks/usePeerStatus.d.ts.map +1 -1
  51. package/build/hooks/usePeerStatus.js +4 -10
  52. package/build/hooks/usePeerStatus.js.map +1 -1
  53. package/build/hooks/usePeers.d.ts.map +1 -1
  54. package/build/hooks/usePeers.js +4 -15
  55. package/build/hooks/usePeers.js.map +1 -1
  56. package/build/hooks/useReconnection.d.ts +1 -1
  57. package/build/hooks/useReconnection.d.ts.map +1 -1
  58. package/build/hooks/useReconnection.js +4 -10
  59. package/build/hooks/useReconnection.js.map +1 -1
  60. package/build/hooks/useScreenShare.d.ts.map +1 -1
  61. package/build/hooks/useScreenShare.js +6 -10
  62. package/build/hooks/useScreenShare.js.map +1 -1
  63. package/build/hooks/useUpdatePeerMetadata.d.ts +15 -0
  64. package/build/hooks/useUpdatePeerMetadata.d.ts.map +1 -0
  65. package/build/hooks/useUpdatePeerMetadata.js +21 -0
  66. package/build/hooks/useUpdatePeerMetadata.js.map +1 -0
  67. package/build/index.d.ts +22 -15
  68. package/build/index.d.ts.map +1 -1
  69. package/build/index.js +17 -6
  70. package/build/index.js.map +1 -1
  71. package/build/utils/errorListener.d.ts.map +1 -1
  72. package/build/utils/errorListener.js +2 -3
  73. package/build/utils/errorListener.js.map +1 -1
  74. package/ios/Events.swift +4 -7
  75. package/ios/RNFishjamClient.podspec +1 -1
  76. package/ios/RNFishjamClient.swift +14 -9
  77. package/ios/RNFishjamClientModule.swift +8 -4
  78. package/ios/Utils.swift +0 -20
  79. package/package.json +6 -7
  80. package/plugin/build/withFishjamAndroid.js +18 -20
  81. package/plugin/build/withFishjamIos.js +99 -103
  82. package/build/hooks/useFishjamEvent.d.ts +0 -18
  83. package/build/hooks/useFishjamEvent.d.ts.map +0 -1
  84. package/build/hooks/useFishjamEvent.js +0 -27
  85. package/build/hooks/useFishjamEvent.js.map +0 -1
  86. package/build/hooks/useFishjamEventState.d.ts +0 -3
  87. package/build/hooks/useFishjamEventState.d.ts.map +0 -1
  88. package/build/hooks/useFishjamEventState.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"useScreenShare.d.ts","sourceRoot":"","sources":["../../src/hooks/useScreenShare.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,cAAc,EACd,eAAe,EACf,mBAAmB,EACnB,aAAa,EACb,aAAa,EACd,MAAM,UAAU,CAAC;AAKlB,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;IAC5B;;OAEG;IACH,YAAY,EAAE,mBAAmB,CAAC;CACnC,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;;;IAsE1B;;;OAGG;6CA5BwB,OAAO,CAAC,kBAAkB,CAAC;;IAgCtD;;OAEG;8CAhDe,cAAc;IAkDhC;;;;OAIG;+CAzEc,aAAa;IA2E9B;;;;;OAKG;qDAvEc,aAAa,aAAa,cAAc;EAkF5D"}
1
+ {"version":3,"file":"useScreenShare.d.ts","sourceRoot":"","sources":["../../src/hooks/useScreenShare.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,cAAc,EACd,eAAe,EACf,mBAAmB,EACnB,aAAa,EACb,aAAa,EACd,MAAM,UAAU,CAAC;AAOlB,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;IAC5B;;OAEG;IACH,YAAY,EAAE,mBAAmB,CAAC;CACnC,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;;;IAmE1B;;;OAGG;6CA3BwB,OAAO,CAAC,kBAAkB,CAAC;;IA+BtD;;OAEG;8CA/Ce,cAAc;IAiDhC;;;;OAIG;+CAtEc,aAAa;IAwE9B;;;;;OAKG;qDAtEc,aAAa,aAAa,cAAc;EAiF5D"}
@@ -1,7 +1,7 @@
1
- import { useCallback, useState } from 'react';
2
- import RNFishjamClientModule from '../RNFishjamClientModule';
1
+ import { useCallback } from 'react';
2
+ import RNFishjamClientModule, { ReceivableEvents, } from '../RNFishjamClientModule';
3
3
  import { Platform } from 'react-native';
4
- import { ReceivableEvents, useFishjamEvent } from './useFishjamEvent';
4
+ import { useFishjamEventState } from './internal/useFishjamEventState';
5
5
  const defaultSimulcastConfig = () => ({
6
6
  enabled: false,
7
7
  activeEncodings: [],
@@ -14,13 +14,10 @@ let screenShareSimulcastConfig = defaultSimulcastConfig();
14
14
  * @group Hooks
15
15
  */
16
16
  export function useScreenShare() {
17
- const [isScreenShareOn, setIsScreenShareOn] = useState(RNFishjamClientModule.isScreenShareOn);
18
- const [simulcastConfig, setSimulcastConfig] = useState(screenShareSimulcastConfig);
19
- useFishjamEvent(ReceivableEvents.IsScreenShareOn, setIsScreenShareOn);
17
+ const isScreenShareOn = useFishjamEventState(ReceivableEvents.IsScreenShareOn, RNFishjamClientModule.isScreenShareOn);
18
+ const simulcastConfig = useFishjamEventState(ReceivableEvents.SimulcastConfigUpdate, screenShareSimulcastConfig);
20
19
  const toggleScreenShareTrackEncoding = useCallback(async (encoding) => {
21
- screenShareSimulcastConfig =
22
- await RNFishjamClientModule.toggleScreenShareTrackEncoding(encoding);
23
- setSimulcastConfig(screenShareSimulcastConfig);
20
+ await RNFishjamClientModule.toggleScreenShareTrackEncoding(encoding);
24
21
  }, []);
25
22
  const setScreenShareTrackEncodingBandwidth = useCallback(async (encoding, bandwidth) => {
26
23
  await RNFishjamClientModule.setScreenShareTrackEncodingBandwidth(encoding, bandwidth);
@@ -50,7 +47,6 @@ export function useScreenShare() {
50
47
  };
51
48
  await RNFishjamClientModule.toggleScreenShare(options);
52
49
  screenShareSimulcastConfig = defaultSimulcastConfig(); //to do: sync with camera settings
53
- setSimulcastConfig(screenShareSimulcastConfig);
54
50
  }, [isScreenShareOn, handleScreenSharePermission]);
55
51
  return {
56
52
  isScreenShareOn,
@@ -1 +1 @@
1
- {"version":3,"file":"useScreenShare.js","sourceRoot":"","sources":["../../src/hooks/useScreenShare.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAS9C,OAAO,qBAAqB,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAyBtE,MAAM,sBAAsB,GAAG,GAAG,EAAE,CAAC,CAAC;IACpC,OAAO,EAAE,KAAK;IACd,eAAe,EAAE,EAAE;CACpB,CAAC,CAAC;AAEH,IAAI,0BAA0B,GAAoB,sBAAsB,EAAE,CAAC;AAE3E;;;;;GAKG;AACH,MAAM,UAAU,cAAc;IAC5B,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAG,QAAQ,CACpD,qBAAqB,CAAC,eAAe,CACtC,CAAC;IAEF,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAG,QAAQ,CACpD,0BAA0B,CAC3B,CAAC;IAEF,eAAe,CAAC,gBAAgB,CAAC,eAAe,EAAE,kBAAkB,CAAC,CAAC;IAEtE,MAAM,8BAA8B,GAAG,WAAW,CAChD,KAAK,EAAE,QAAuB,EAAE,EAAE;QAChC,0BAA0B;YACxB,MAAM,qBAAqB,CAAC,8BAA8B,CAAC,QAAQ,CAAC,CAAC;QACvE,kBAAkB,CAAC,0BAA0B,CAAC,CAAC;IACjD,CAAC,EACD,EAAE,CACH,CAAC;IAEF,MAAM,oCAAoC,GAAG,WAAW,CACtD,KAAK,EAAE,QAAuB,EAAE,SAAyB,EAAE,EAAE;QAC3D,MAAM,qBAAqB,CAAC,oCAAoC,CAC9D,QAAQ,EACR,SAAS,CACV,CAAC;IACJ,CAAC,EACD,EAAE,CACH,CAAC;IAEF,MAAM,4BAA4B,GAAG,WAAW,CAC9C,KAAK,EAAE,SAAyB,EAAE,EAAE;QAClC,MAAM,qBAAqB,CAAC,4BAA4B,CAAC,SAAS,CAAC,CAAC;IACtE,CAAC,EACD,EAAE,CACH,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;QACzF,kBAAkB,CAAC,0BAA0B,CAAC,CAAC;IACjD,CAAC,EACD,CAAC,eAAe,EAAE,2BAA2B,CAAC,CAC/C,CAAC;IAEF,OAAO;QACL,eAAe;QACf,eAAe;QAEf;;;WAGG;QACH,iBAAiB;QACjB,2BAA2B;QAE3B;;WAEG;QACH,4BAA4B;QAC5B;;;;WAIG;QACH,8BAA8B;QAC9B;;;;;WAKG;QACH,oCAAoC;QACpC;;;;;;;WAOG;KACJ,CAAC;AACJ,CAAC","sourcesContent":["import { useCallback, useState } from 'react';\n\nimport {\n BandwidthLimit,\n SimulcastConfig,\n TrackBandwidthLimit,\n TrackEncoding,\n TrackMetadata,\n} from '../types';\nimport RNFishjamClientModule from '../RNFishjamClientModule';\nimport { Platform } from 'react-native';\nimport { ReceivableEvents, useFishjamEvent } from './useFishjamEvent';\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 /**\n * bandwidth limit of a screen share track. By default there is no bandwidth limit.\n */\n maxBandwidth: TrackBandwidthLimit;\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 enabled: false,\n activeEncodings: [],\n});\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 Screenshare\n * @group Hooks\n */\nexport function useScreenShare() {\n const [isScreenShareOn, setIsScreenShareOn] = useState(\n RNFishjamClientModule.isScreenShareOn,\n );\n\n const [simulcastConfig, setSimulcastConfig] = useState<SimulcastConfig>(\n screenShareSimulcastConfig,\n );\n\n useFishjamEvent(ReceivableEvents.IsScreenShareOn, setIsScreenShareOn);\n\n const toggleScreenShareTrackEncoding = useCallback(\n async (encoding: TrackEncoding) => {\n screenShareSimulcastConfig =\n await RNFishjamClientModule.toggleScreenShareTrackEncoding(encoding);\n setSimulcastConfig(screenShareSimulcastConfig);\n },\n [],\n );\n\n const setScreenShareTrackEncodingBandwidth = useCallback(\n async (encoding: TrackEncoding, bandwidth: BandwidthLimit) => {\n await RNFishjamClientModule.setScreenShareTrackEncodingBandwidth(\n encoding,\n bandwidth,\n );\n },\n [],\n );\n\n const setScreenShareTrackBandwidth = useCallback(\n async (bandwidth: BandwidthLimit) => {\n await RNFishjamClientModule.setScreenShareTrackBandwidth(bandwidth);\n },\n [],\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 setSimulcastConfig(screenShareSimulcastConfig);\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 * @deprecated\n */\n setScreenShareTrackBandwidth,\n /**\n * Toggles simulcast encoding of a screen share track on/off\n * @param encoding encoding to toggle\n * @deprecated\n */\n toggleScreenShareTrackEncoding,\n /**\n * updates maximum bandwidth for the given simulcast encoding of the screen share track\n * @param encoding encoding to update\n * @param bandwidth BandwidthLimit to set\n * @deprecated\n */\n setScreenShareTrackEncodingBandwidth,\n /**\n * updates maximum bandwidth for the screen share track. This value directly translates\n * to quality of the stream and the amount of RTP packets being sent. In case simulcast\n * is enabled bandwidth is split between all of the variant streams proportionally to\n * their resolution\n * @param bandwidth BandwidthLimit to set\n * @deprecated\n */\n };\n}\n"]}
1
+ {"version":3,"file":"useScreenShare.js","sourceRoot":"","sources":["../../src/hooks/useScreenShare.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AASpC,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;AAyBvE,MAAM,sBAAsB,GAAG,GAAG,EAAE,CAAC,CAAC;IACpC,OAAO,EAAE,KAAK;IACd,eAAe,EAAE,EAAE;CACpB,CAAC,CAAC;AAEH,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,8BAA8B,GAAG,WAAW,CAChD,KAAK,EAAE,QAAuB,EAAE,EAAE;QAChC,MAAM,qBAAqB,CAAC,8BAA8B,CAAC,QAAQ,CAAC,CAAC;IACvE,CAAC,EACD,EAAE,CACH,CAAC;IAEF,MAAM,oCAAoC,GAAG,WAAW,CACtD,KAAK,EAAE,QAAuB,EAAE,SAAyB,EAAE,EAAE;QAC3D,MAAM,qBAAqB,CAAC,oCAAoC,CAC9D,QAAQ,EACR,SAAS,CACV,CAAC;IACJ,CAAC,EACD,EAAE,CACH,CAAC;IAEF,MAAM,4BAA4B,GAAG,WAAW,CAC9C,KAAK,EAAE,SAAyB,EAAE,EAAE;QAClC,MAAM,qBAAqB,CAAC,4BAA4B,CAAC,SAAS,CAAC,CAAC;IACtE,CAAC,EACD,EAAE,CACH,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;QAE3B;;WAEG;QACH,4BAA4B;QAC5B;;;;WAIG;QACH,8BAA8B;QAC9B;;;;;WAKG;QACH,oCAAoC;QACpC;;;;;;;WAOG;KACJ,CAAC;AACJ,CAAC","sourcesContent":["import { useCallback } from 'react';\n\nimport {\n BandwidthLimit,\n SimulcastConfig,\n TrackBandwidthLimit,\n TrackEncoding,\n TrackMetadata,\n} 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 /**\n * bandwidth limit of a screen share track. By default there is no bandwidth limit.\n */\n maxBandwidth: TrackBandwidthLimit;\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 enabled: false,\n activeEncodings: [],\n});\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 Screenshare\n * @group Hooks\n */\nexport function useScreenShare() {\n const isScreenShareOn = useFishjamEventState<boolean>(\n ReceivableEvents.IsScreenShareOn,\n RNFishjamClientModule.isScreenShareOn,\n );\n\n const simulcastConfig = useFishjamEventState<SimulcastConfig>(\n ReceivableEvents.SimulcastConfigUpdate,\n screenShareSimulcastConfig,\n );\n\n const toggleScreenShareTrackEncoding = useCallback(\n async (encoding: TrackEncoding) => {\n await RNFishjamClientModule.toggleScreenShareTrackEncoding(encoding);\n },\n [],\n );\n\n const setScreenShareTrackEncodingBandwidth = useCallback(\n async (encoding: TrackEncoding, bandwidth: BandwidthLimit) => {\n await RNFishjamClientModule.setScreenShareTrackEncodingBandwidth(\n encoding,\n bandwidth,\n );\n },\n [],\n );\n\n const setScreenShareTrackBandwidth = useCallback(\n async (bandwidth: BandwidthLimit) => {\n await RNFishjamClientModule.setScreenShareTrackBandwidth(bandwidth);\n },\n [],\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 * @deprecated\n */\n setScreenShareTrackBandwidth,\n /**\n * Toggles simulcast encoding of a screen share track on/off\n * @param encoding encoding to toggle\n * @deprecated\n */\n toggleScreenShareTrackEncoding,\n /**\n * updates maximum bandwidth for the given simulcast encoding of the screen share track\n * @param encoding encoding to update\n * @param bandwidth BandwidthLimit to set\n * @deprecated\n */\n setScreenShareTrackEncodingBandwidth,\n /**\n * updates maximum bandwidth for the screen share track. This value directly translates\n * to quality of the stream and the amount of RTP packets being sent. In case simulcast\n * is enabled bandwidth is split between all of the variant streams proportionally to\n * their resolution\n * @param bandwidth BandwidthLimit to set\n * @deprecated\n */\n };\n}\n"]}
@@ -0,0 +1,15 @@
1
+ import { GenericMetadata } from '../types';
2
+ /**
3
+ * This hook provides method to update peer metadata
4
+ * @category Connection
5
+ * @group Hooks
6
+ */
7
+ export declare const useUpdatePeerMetadata: <PeerMetadata extends GenericMetadata = GenericMetadata>() => {
8
+ /**
9
+ * Updates metadata send to other peers
10
+ * @param peerMetadata string indexed record with metadata, that will be available to all other peers
11
+ * @category Connection
12
+ */
13
+ updatePeerMetadata: (peerMetadata: PeerMetadata) => Promise<void>;
14
+ };
15
+ //# sourceMappingURL=useUpdatePeerMetadata.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useUpdatePeerMetadata.d.ts","sourceRoot":"","sources":["../../src/hooks/useUpdatePeerMetadata.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAE3C;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,GAChC,YAAY,SAAS,eAAe;IAOlC;;;;OAIG;uCATuD,YAAY;CAYzE,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { useCallback } from 'react';
2
+ import RNFishjamClientModule from '../RNFishjamClientModule';
3
+ /**
4
+ * This hook provides method to update peer metadata
5
+ * @category Connection
6
+ * @group Hooks
7
+ */
8
+ export const useUpdatePeerMetadata = () => {
9
+ const updatePeerMetadata = useCallback(async (peerMetadata) => {
10
+ await RNFishjamClientModule.updatePeerMetadata(peerMetadata);
11
+ }, []);
12
+ return {
13
+ /**
14
+ * Updates metadata send to other peers
15
+ * @param peerMetadata string indexed record with metadata, that will be available to all other peers
16
+ * @category Connection
17
+ */
18
+ updatePeerMetadata,
19
+ };
20
+ };
21
+ //# sourceMappingURL=useUpdatePeerMetadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useUpdatePeerMetadata.js","sourceRoot":"","sources":["../../src/hooks/useUpdatePeerMetadata.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AACpC,OAAO,qBAAqB,MAAM,0BAA0B,CAAC;AAG7D;;;;GAIG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,GAEjC,EAAE;IACJ,MAAM,kBAAkB,GAAG,WAAW,CAAC,KAAK,EAAE,YAA0B,EAAE,EAAE;QAC1E,MAAM,qBAAqB,CAAC,kBAAkB,CAAC,YAAY,CAAC,CAAC;IAC/D,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO;QACL;;;;WAIG;QACH,kBAAkB;KACnB,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import { useCallback } from 'react';\nimport RNFishjamClientModule from '../RNFishjamClientModule';\nimport { GenericMetadata } from '../types';\n\n/**\n * This hook provides method to update peer metadata\n * @category Connection\n * @group Hooks\n */\nexport const useUpdatePeerMetadata = <\n PeerMetadata extends GenericMetadata = GenericMetadata,\n>() => {\n const updatePeerMetadata = useCallback(async (peerMetadata: PeerMetadata) => {\n await RNFishjamClientModule.updatePeerMetadata(peerMetadata);\n }, []);\n\n return {\n /**\n * Updates metadata send to other peers\n * @param peerMetadata string indexed record with metadata, that will be available to all other peers\n * @category Connection\n */\n updatePeerMetadata,\n };\n};\n"]}
package/build/index.d.ts CHANGED
@@ -1,28 +1,35 @@
1
+ export type { TrackBandwidthLimit, TrackEncoding, SimulcastBandwidthLimit, BandwidthLimit, SimulcastConfig, VideoLayout, } from './types';
2
+ export type { ConnectionConfig } from './common/client';
3
+ export { updatePeerMetadata } from './common/metadata';
4
+ export { setTargetTrackEncoding } from './common/webRTC';
5
+ export {
6
+ /** @deprecated */
7
+ joinRoom,
8
+ /** @deprecated */
9
+ leaveRoom, } from './common/client';
10
+ export type { VideoPreviewViewProps } from './components/VideoPreviewView';
11
+ export type { VideoRendererProps } from './components/VideoRendererView';
12
+ export { VideoPreviewView } from './components/VideoPreviewView';
13
+ export { VideoRendererView } from './components/VideoRendererView';
1
14
  export type { Peer, PeerId, Track, TrackId, TrackType, VadStatus, EncodingReason, AudioTrack, VideoTrack, UsePeersResult, PeerWithTracks, } from './hooks/usePeers';
2
- export { usePeers } from './hooks/usePeers';
3
15
  export type { AudioOutputDevice, AudioOutputDeviceType, AudioSessionMode, } from './hooks/useAudioSettings';
16
+ export type { CameraId, Camera, CameraConfig, VideoQuality, CameraFacingDirection, } from './hooks/useCamera';
17
+ export type { ScreenShareOptions, ScreenShareQuality, } from './hooks/useScreenShare';
18
+ export type { ReconnectionStatus } from './hooks/useReconnection';
19
+ export type { PeerStatus } from './hooks/usePeerStatus';
20
+ export type { ForegroundServiceConfig } from './hooks/useForegroundService';
21
+ export type { ConnectionStatus, JoinRoomConfig } from './hooks/useConnection';
4
22
  export { useAudioSettings } from './hooks/useAudioSettings';
5
23
  export { useBandwidthEstimation } from './hooks/useBandwidthEstimation';
6
- export type { CameraId, Camera, CameraConfig, VideoQuality, CameraFacingDirection, } from './hooks/useCamera';
7
24
  export { useCamera } from './hooks/useCamera';
8
25
  export { useMicrophone } from './hooks/useMicrophone';
9
- export type { ScreenShareOptions, ScreenShareQuality, } from './hooks/useScreenShare';
10
26
  export { useScreenShare } from './hooks/useScreenShare';
11
27
  export { useAppScreenShare } from './hooks/useAppScreenShare';
12
- export type { ReconnectionStatus } from './hooks/useReconnection';
13
28
  export { useReconnection } from './hooks/useReconnection';
14
- export { updatePeerMetadata } from './common/metadata';
15
- export { setTargetTrackEncoding } from './common/webRTC';
16
- export type { ConnectionConfig } from './common/client';
17
- export { joinRoom, leaveRoom } from './common/client';
18
- export type { VideoPreviewViewProps } from './components/VideoPreviewView';
19
- export { VideoPreviewView } from './components/VideoPreviewView';
20
- export type { VideoRendererProps } from './components/VideoRendererView';
21
- export { VideoRendererView } from './components/VideoRendererView';
22
- export type { PeerStatus } from './hooks/usePeerStatus';
23
29
  export { usePeerStatus } from './hooks/usePeerStatus';
24
- export type { ForegroundServiceConfig } from './hooks/useForegroundService';
30
+ export { usePeers } from './hooks/usePeers';
25
31
  export { useForegroundService } from './hooks/useForegroundService';
32
+ export { useConnection } from './hooks/useConnection';
33
+ export { useUpdatePeerMetadata } from './hooks/useUpdatePeerMetadata';
26
34
  export { FishjamRoom } from './components/FishjamRoom';
27
- export type { TrackBandwidthLimit, TrackEncoding, SimulcastBandwidthLimit, BandwidthLimit, SimulcastConfig, VideoLayout, } from './types';
28
35
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.tsx"],"names":[],"mappings":"AAEA,YAAY,EACV,IAAI,EACJ,MAAM,EACN,KAAK,EACL,OAAO,EACP,SAAS,EACT,SAAS,EACT,cAAc,EACd,UAAU,EACV,UAAU,EACV,cAAc,EACd,cAAc,GACf,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,YAAY,EACV,iBAAiB,EACjB,qBAAqB,EACrB,gBAAgB,GACjB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAE5D,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AAExE,YAAY,EACV,QAAQ,EACR,MAAM,EACN,YAAY,EACZ,YAAY,EACZ,qBAAqB,GACtB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAE9C,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAEtD,YAAY,EACV,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAE9D,YAAY,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAE1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEvD,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAEzD,YAAY,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEtD,YAAY,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAC3E,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAEjE,YAAY,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACzE,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAEnE,YAAY,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAEtD,YAAY,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAC5E,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAEpE,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAEvD,YAAY,EACV,mBAAmB,EACnB,aAAa,EACb,uBAAuB,EACvB,cAAc,EACd,eAAe,EACf,WAAW,GACZ,MAAM,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.tsx"],"names":[],"mappings":"AAGA,YAAY,EACV,mBAAmB,EACnB,aAAa,EACb,uBAAuB,EACvB,cAAc,EACd,eAAe,EACf,WAAW,GACZ,MAAM,SAAS,CAAC;AACjB,YAAY,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAIxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzD,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,UAAU,EACV,UAAU,EACV,cAAc,EACd,cAAc,GACf,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,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAClE,YAAY,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACxD,YAAY,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAC5E,YAAY,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAI9E,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,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC"}
package/build/index.js CHANGED
@@ -1,5 +1,17 @@
1
1
  import { initializeWarningListener } from './utils/errorListener';
2
- export { usePeers } from './hooks/usePeers';
2
+ // #endregion
3
+ // #region methods
4
+ export { updatePeerMetadata } from './common/metadata';
5
+ export { setTargetTrackEncoding } from './common/webRTC';
6
+ export {
7
+ /** @deprecated */
8
+ joinRoom,
9
+ /** @deprecated */
10
+ leaveRoom, } from './common/client';
11
+ export { VideoPreviewView } from './components/VideoPreviewView';
12
+ export { VideoRendererView } from './components/VideoRendererView';
13
+ // #endregion
14
+ // #region hooks
3
15
  export { useAudioSettings } from './hooks/useAudioSettings';
4
16
  export { useBandwidthEstimation } from './hooks/useBandwidthEstimation';
5
17
  export { useCamera } from './hooks/useCamera';
@@ -7,13 +19,12 @@ export { useMicrophone } from './hooks/useMicrophone';
7
19
  export { useScreenShare } from './hooks/useScreenShare';
8
20
  export { useAppScreenShare } from './hooks/useAppScreenShare';
9
21
  export { useReconnection } from './hooks/useReconnection';
10
- export { updatePeerMetadata } from './common/metadata';
11
- export { setTargetTrackEncoding } from './common/webRTC';
12
- export { joinRoom, leaveRoom } from './common/client';
13
- export { VideoPreviewView } from './components/VideoPreviewView';
14
- export { VideoRendererView } from './components/VideoRendererView';
15
22
  export { usePeerStatus } from './hooks/usePeerStatus';
23
+ export { usePeers } from './hooks/usePeers';
16
24
  export { useForegroundService } from './hooks/useForegroundService';
25
+ export { useConnection } from './hooks/useConnection';
26
+ export { useUpdatePeerMetadata } from './hooks/useUpdatePeerMetadata';
27
+ // #endregion
17
28
  export { FishjamRoom } from './components/FishjamRoom';
18
29
  initializeWarningListener();
19
30
  //# 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;AAgBlE,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;AAGtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAEpE,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAWvD,yBAAyB,EAAE,CAAC","sourcesContent":["import { initializeWarningListener } from './utils/errorListener';\n\nexport type {\n Peer,\n PeerId,\n Track,\n TrackId,\n TrackType,\n VadStatus,\n EncodingReason,\n AudioTrack,\n VideoTrack,\n UsePeersResult,\n PeerWithTracks,\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 { ForegroundServiceConfig } from './hooks/useForegroundService';\nexport { useForegroundService } from './hooks/useForegroundService';\n\nexport { FishjamRoom } from './components/FishjamRoom';\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,aAAa;AAEb,kBAAkB;AAClB,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzD,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;AAwCnE,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;AACtE,aAAa;AAEb,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAEvD,yBAAyB,EAAE,CAAC","sourcesContent":["import { initializeWarningListener } from './utils/errorListener';\n\n// #region types\nexport type {\n TrackBandwidthLimit,\n TrackEncoding,\n SimulcastBandwidthLimit,\n BandwidthLimit,\n SimulcastConfig,\n VideoLayout,\n} from './types';\nexport type { ConnectionConfig } from './common/client';\n// #endregion\n\n// #region methods\nexport { updatePeerMetadata } from './common/metadata';\nexport { setTargetTrackEncoding } from './common/webRTC';\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 AudioTrack,\n VideoTrack,\n UsePeersResult,\n PeerWithTracks,\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 { ReconnectionStatus } from './hooks/useReconnection';\nexport type { PeerStatus } from './hooks/usePeerStatus';\nexport type { ForegroundServiceConfig } from './hooks/useForegroundService';\nexport type { ConnectionStatus, JoinRoomConfig } 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 { FishjamRoom } from './components/FishjamRoom';\n\ninitializeWarningListener();\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"errorListener.d.ts","sourceRoot":"","sources":["../../src/utils/errorListener.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,yBAAyB,YAcrC,CAAC"}
1
+ {"version":3,"file":"errorListener.d.ts","sourceRoot":"","sources":["../../src/utils/errorListener.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,yBAAyB,YAWrC,CAAC"}
@@ -1,11 +1,10 @@
1
- import { ReceivableEvents } from '../hooks/useFishjamEvent';
2
- import { nativeModuleEventEmitter } from '../RNFishjamClientModule';
1
+ import nativeModule, { ReceivableEvents } from '../RNFishjamClientModule';
3
2
  export const initializeWarningListener = () => {
4
3
  if (!__DEV__) {
5
4
  return;
6
5
  }
7
6
  try {
8
- nativeModuleEventEmitter.addListener(ReceivableEvents.Warning, (event) => {
7
+ nativeModule.addListener(ReceivableEvents.Warning, (event) => {
9
8
  console.warn(event[ReceivableEvents.Warning]);
10
9
  });
11
10
  }
@@ -1 +1 @@
1
- {"version":3,"file":"errorListener.js","sourceRoot":"","sources":["../../src/utils/errorListener.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AAEpE,MAAM,CAAC,MAAM,yBAAyB,GAAG,GAAG,EAAE;IAC5C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO;IACT,CAAC;IACD,IAAI,CAAC;QACH,wBAAwB,CAAC,WAAW,CAClC,gBAAgB,CAAC,OAAO,EACxB,CAAC,KAA6C,EAAE,EAAE;YAChD,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC;QAChD,CAAC,CACF,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,qCAAqC,KAAK,EAAE,OAAO,IAAI,EAAE,EAAE,CAAC,CAAC;IAC7E,CAAC;AACH,CAAC,CAAC","sourcesContent":["import { ReceivableEvents } from '../hooks/useFishjamEvent';\nimport { nativeModuleEventEmitter } from '../RNFishjamClientModule';\n\nexport const initializeWarningListener = () => {\n if (!__DEV__) {\n return;\n }\n try {\n nativeModuleEventEmitter.addListener(\n ReceivableEvents.Warning,\n (event: { [ReceivableEvents.Warning]: string }) => {\n console.warn(event[ReceivableEvents.Warning]);\n },\n );\n } catch (error) {\n console.error(`Failed to start warning listener: ${error?.message ?? ''}`);\n }\n};\n"]}
1
+ {"version":3,"file":"errorListener.js","sourceRoot":"","sources":["../../src/utils/errorListener.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,EAAE,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAE1E,MAAM,CAAC,MAAM,yBAAyB,GAAG,GAAG,EAAE;IAC5C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO;IACT,CAAC;IACD,IAAI,CAAC;QACH,YAAY,CAAC,WAAW,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YAC3D,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC;QAChD,CAAC,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,qCAAqC,KAAK,EAAE,OAAO,IAAI,EAAE,EAAE,CAAC,CAAC;IAC7E,CAAC;AACH,CAAC,CAAC","sourcesContent":["import nativeModule, { ReceivableEvents } from '../RNFishjamClientModule';\n\nexport const initializeWarningListener = () => {\n if (!__DEV__) {\n return;\n }\n try {\n nativeModule.addListener(ReceivableEvents.Warning, (event) => {\n console.warn(event[ReceivableEvents.Warning]);\n });\n } catch (error) {\n console.error(`Failed to start warning listener: ${error?.message ?? ''}`);\n }\n};\n"]}
package/ios/Events.swift CHANGED
@@ -17,11 +17,9 @@ class EmitableEvent {
17
17
  case PeersUpdate
18
18
  case AudioDeviceUpdate
19
19
  case BandwidthEstimation
20
- case ReconnectionRetriesLimitReached
21
- case ReconnectionStarted
22
- case Reconnected
23
20
  case Warning
24
21
  case PeerStatusChanged
22
+ case ReconnectionStatusChanged
25
23
  case CurrentCameraChanged
26
24
 
27
25
  var name: String {
@@ -41,10 +39,6 @@ class EmitableEvent {
41
39
  self.eventContent = eventContent
42
40
  }
43
41
 
44
- static var reconnectionRetriesLimitReached: EmitableEvent { .init(event: .ReconnectionRetriesLimitReached) }
45
- static var reconnectionStarted: EmitableEvent { .init(event: .ReconnectionStarted) }
46
- static var reconnected: EmitableEvent { .init(event: .Reconnected) }
47
-
48
42
  static func isMicrophoneOn(enabled: Bool) -> EmitableEvent { .init(event: .IsMicrophoneOn, eventContent: enabled) }
49
43
  static func isScreenShareOn(enabled: Bool) -> EmitableEvent {
50
44
  .init(event: .IsScreenShareOn, eventContent: enabled)
@@ -59,6 +53,9 @@ class EmitableEvent {
59
53
  static func peerStatusChanged(peerStatus: PeerStatus) -> EmitableEvent {
60
54
  .init(event: .PeerStatusChanged, eventContent: peerStatus.rawValue)
61
55
  }
56
+ static func reconnectionStatusChanged(reconnectionStatus: ReconnectionStatus) -> EmitableEvent {
57
+ .init(event: .ReconnectionStatusChanged, eventContent: reconnectionStatus.rawValue)
58
+ }
62
59
 
63
60
  static func currentCameraChanged(localCamera: LocalCamera?, isCameraOn: Bool) -> EmitableEvent {
64
61
  return .init(
@@ -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.5.0'
28
+ s.dependency 'FishjamCloudClient', '0.6.0'
29
29
 
30
30
  end
@@ -19,7 +19,6 @@ class RNFishjamClient: FishjamClientListener {
19
19
  var connectPromise: Promise? = nil
20
20
 
21
21
  var videoSimulcastConfig: SimulcastConfig = SimulcastConfig()
22
- var localUserMetadata: Metadata = .init()
23
22
 
24
23
  var screenShareSimulcastConfig: SimulcastConfig = SimulcastConfig()
25
24
  var screenShareMaxBandwidth: TrackBandwidthLimit = .BandwidthLimit(0)
@@ -37,6 +36,12 @@ class RNFishjamClient: FishjamClientListener {
37
36
  }
38
37
  }
39
38
 
39
+ private(set) var reconnectionStatus: ReconnectionStatus = .idle {
40
+ didSet {
41
+ emit(event: .reconnectionStatusChanged(reconnectionStatus: reconnectionStatus))
42
+ }
43
+ }
44
+
40
45
  let sendEvent: (_ eventName: String, _ data: [String: Any?]) -> Void
41
46
 
42
47
  static var tracksUpdateListenersManager = TracksUpdateListenersManager()
@@ -207,7 +212,6 @@ class RNFishjamClient: FishjamClientListener {
207
212
  ) {
208
213
  peerStatus = .connecting
209
214
  connectPromise = promise
210
- localUserMetadata = ["server": [:], "peer": peerMetadata].toMetadata()
211
215
 
212
216
  let reconnectConfig = FishjamCloudClient.ReconnectConfig(
213
217
  maxAttempts: config.reconnectConfig.maxAttempts, initialDelayMs: config.reconnectConfig.initialDelayMs,
@@ -489,7 +493,7 @@ class RNFishjamClient: FishjamClientListener {
489
493
  return [localEndpoint] + remoteEndpoints
490
494
  }
491
495
 
492
- func getPeers() throws -> [[String: Any?]] {
496
+ func getPeers() -> [[String: Any?]] {
493
497
  let endpoints = RNFishjamClient.getLocalAndRemoteEndpoints()
494
498
  return endpoints.compactMap { endpoint in
495
499
  [
@@ -512,7 +516,7 @@ class RNFishjamClient: FishjamClientListener {
512
516
  "id": track.id,
513
517
  "type": "Audio",
514
518
  "metadata": track.metadata.toDict(),
515
- "vadStatus": track.vadStatus.rawValue,
519
+ "vadStatus": track.vadStatus == .speech ? "speech" : "silence",
516
520
  ]
517
521
 
518
522
  case let track as LocalCameraTrack:
@@ -768,7 +772,7 @@ class RNFishjamClient: FishjamClientListener {
768
772
  }
769
773
 
770
774
  func emitEndpoints() {
771
- emit(event: .peersUpdate(peersData: (try? getPeers()) ?? []))
775
+ emit(event: .peersUpdate(peersData: getPeers()))
772
776
  }
773
777
 
774
778
  func onJoined(peerID: String, peersInRoom: [String: Endpoint]) {
@@ -836,7 +840,7 @@ class RNFishjamClient: FishjamClientListener {
836
840
  "E_MEMBRANE_CONNECT", "Failed to connect: socket close, code: \(code), reason: \(reason)")
837
841
  }
838
842
  connectPromise = nil
839
- peerStatus = .error
843
+ peerStatus = .idle
840
844
  }
841
845
 
842
846
  func onSocketError() {
@@ -844,6 +848,7 @@ class RNFishjamClient: FishjamClientListener {
844
848
  connectPromise.reject("E_MEMBRANE_CONNECT", "Failed to connect: socket error")
845
849
  }
846
850
  connectPromise = nil
851
+ peerStatus = .error
847
852
  }
848
853
 
849
854
  func onSocketOpen() {}
@@ -892,15 +897,15 @@ class RNFishjamClient: FishjamClientListener {
892
897
  }
893
898
 
894
899
  func onReconnectionStarted() {
895
- emit(event: .reconnectionStarted)
900
+ reconnectionStatus = .reconnecting
896
901
  }
897
902
 
898
903
  func onReconnected() {
899
- emit(event: .reconnected)
904
+ reconnectionStatus = .idle
900
905
  }
901
906
 
902
907
  func onReconnectionRetriesLimitReached() {
903
- emit(event: .reconnectionRetriesLimitReached)
908
+ reconnectionStatus = .error
904
909
  }
905
910
 
906
911
  }
@@ -90,6 +90,10 @@ public class RNFishjamClientModule: Module {
90
90
  return rnFishjamClient.peerStatus.rawValue
91
91
  }
92
92
 
93
+ Property("reconnectionStatus") {
94
+ return rnFishjamClient.reconnectionStatus.rawValue
95
+ }
96
+
93
97
  Property("isMicrophoneOn") {
94
98
  return rnFishjamClient.isMicrophoneOn
95
99
  }
@@ -114,6 +118,10 @@ public class RNFishjamClientModule: Module {
114
118
  return rnFishjamClient.isAppScreenShareOn
115
119
  }
116
120
 
121
+ Function("getPeers") {
122
+ return rnFishjamClient.getPeers()
123
+ }
124
+
117
125
  AsyncFunction("joinRoom") {
118
126
  (
119
127
  url: String, peerToken: String, peerMetadata: [String: Any], config: ConnectConfig,
@@ -156,10 +164,6 @@ public class RNFishjamClientModule: Module {
156
164
  try rnFishjamClient.toggleAppScreenShare(screenShareOptions: screenShareOptions)
157
165
  }
158
166
 
159
- AsyncFunction("getPeers") {
160
- try rnFishjamClient.getPeers()
161
- }
162
-
163
167
  AsyncFunction("updatePeerMetadata") { (metadata: [String: Any]) in
164
168
  try rnFishjamClient.updatePeerMetadata(metadata: metadata)
165
169
  }
package/ios/Utils.swift CHANGED
@@ -21,23 +21,3 @@ let log = OSLog(subsystem: "com.fishjamcloud.react-native-client", category: "Er
21
21
  }
22
22
  }
23
23
  #endif
24
-
25
- extension [String: Any] {
26
- public func toMetadata() -> Metadata {
27
- var res: Metadata = .init()
28
- self.forEach { entry in
29
- res[entry.key] = entry.value
30
- }
31
- return res
32
- }
33
- }
34
-
35
- extension AnyJson {
36
- public func toDict() -> [String: Any] {
37
- var res: [String: Any] = [:]
38
- self.keys.forEach { key in
39
- res[key] = self[key]
40
- }
41
- return res
42
- }
43
- }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fishjam-cloud/react-native-client",
3
- "version": "0.5.0",
3
+ "version": "0.6.0",
4
4
  "description": "A React Native client for Fishjam Cloud",
5
5
  "author": "Fishjam Cloud Team",
6
6
  "license": "Apache-2.0",
@@ -50,22 +50,21 @@
50
50
  "@types/phoenix": "^1.6.5",
51
51
  "@types/promise-fs": "^2.1.2",
52
52
  "@types/react": "^18.3.12",
53
- "expo-module-scripts": "^3.5.2",
54
- "husky": "^9.1.6",
53
+ "expo-module-scripts": "^4.0.2",
54
+ "husky": "^9.1.7",
55
55
  "jest": "^29.6.1",
56
56
  "jest-environment-jsdom": "^29.6.1",
57
- "jest-expo": "^51.0.4",
57
+ "jest-expo": "^52.0.0",
58
58
  "jest-websocket-mock": "^2.4.0",
59
- "pod-install": "^0.2.0",
59
+ "pod-install": "^0.3.2",
60
60
  "react-dom": "^18.3.1",
61
- "ts-proto": "^2.2.5",
61
+ "ts-proto": "^2.3.0",
62
62
  "typedoc": "^0.26.11",
63
63
  "typedoc-plugin-mark-react-functional-components": "^0.2.2",
64
64
  "typescript": "^5.6.3"
65
65
  },
66
66
  "peerDependencies": {
67
67
  "expo": "*",
68
- "expo-modules-core": "*",
69
68
  "react": "*",
70
69
  "react-native": "*"
71
70
  },
@@ -3,26 +3,24 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.withFishjamAndroid = void 0;
4
4
  const config_plugins_1 = require("@expo/config-plugins");
5
5
  const Manifest_1 = require("@expo/config-plugins/build/android/Manifest");
6
- const withFishjamForegroundService = (config) => {
7
- return (0, config_plugins_1.withAndroidManifest)(config, async (config) => {
8
- const mainApplication = (0, Manifest_1.getMainApplicationOrThrow)(config.modResults);
9
- mainApplication.service = mainApplication.service || [];
10
- const newService = {
11
- $: {
12
- 'android:name': 'io.fishjam.reactnative.foregroundService.FishjamForegroundService',
13
- 'android:foregroundServiceType': 'camera|microphone|mediaProjection',
14
- },
15
- };
16
- const existingServiceIndex = mainApplication.service.findIndex((service) => service.$['android:name'] === newService.$['android:name']);
17
- if (existingServiceIndex !== -1) {
18
- mainApplication.service[existingServiceIndex] = newService;
19
- }
20
- else {
21
- mainApplication.service.push(newService);
22
- }
23
- return config;
24
- });
25
- };
6
+ const withFishjamForegroundService = (config) => (0, config_plugins_1.withAndroidManifest)(config, async (configuration) => {
7
+ const mainApplication = (0, Manifest_1.getMainApplicationOrThrow)(configuration.modResults);
8
+ mainApplication.service = mainApplication.service || [];
9
+ const newService = {
10
+ $: {
11
+ 'android:name': 'io.fishjam.reactnative.foregroundService.FishjamForegroundService',
12
+ 'android:foregroundServiceType': 'camera|microphone|mediaProjection',
13
+ },
14
+ };
15
+ const existingServiceIndex = mainApplication.service.findIndex((service) => service.$['android:name'] === newService.$['android:name']);
16
+ if (existingServiceIndex !== -1) {
17
+ mainApplication.service[existingServiceIndex] = newService;
18
+ }
19
+ else {
20
+ mainApplication.service.push(newService);
21
+ }
22
+ return configuration;
23
+ });
26
24
  const withFishjamAndroid = (config, props) => {
27
25
  if (props?.android?.enableForegroundService) {
28
26
  config = withFishjamForegroundService(config);