@fishjam-cloud/react-native-client 0.6.0 → 0.8.0

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