@fishjam-cloud/react-native-client 0.24.0 → 0.25.0-rc.1

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 (266) hide show
  1. package/README.md +56 -15
  2. package/dist/index.d.ts +13 -0
  3. package/dist/index.d.ts.map +1 -0
  4. package/dist/index.js +19 -0
  5. package/dist/overrides/RTCPeerConnection.d.ts +8 -0
  6. package/dist/overrides/RTCPeerConnection.d.ts.map +1 -0
  7. package/dist/overrides/RTCPeerConnection.js +16 -0
  8. package/dist/overrides/RTCView.d.ts +11 -0
  9. package/dist/overrides/RTCView.d.ts.map +1 -0
  10. package/dist/overrides/RTCView.js +21 -0
  11. package/dist/polyfills/local-storage.d.ts +10 -0
  12. package/dist/polyfills/local-storage.d.ts.map +1 -0
  13. package/dist/polyfills/local-storage.js +24 -0
  14. package/{build/hooks → dist}/useForegroundService.d.ts +10 -10
  15. package/dist/useForegroundService.d.ts.map +1 -0
  16. package/dist/useForegroundService.js +10 -0
  17. package/dist/webrtc-polyfill.d.ts +2 -0
  18. package/dist/webrtc-polyfill.d.ts.map +1 -0
  19. package/dist/webrtc-polyfill.js +14 -0
  20. package/package.json +44 -92
  21. package/plugin/broadcastExtensionFiles/Atomic.swift +37 -0
  22. package/plugin/broadcastExtensionFiles/DarwinNotificationCenter.swift +29 -0
  23. package/plugin/broadcastExtensionFiles/Info.plist +1 -1
  24. package/plugin/broadcastExtensionFiles/SampleHandler.swift +104 -0
  25. package/plugin/broadcastExtensionFiles/SampleUploader.swift +146 -0
  26. package/plugin/broadcastExtensionFiles/SocketConnection.swift +198 -0
  27. package/plugin/build/types.d.ts +5 -4
  28. package/plugin/build/withFishjam.d.ts +31 -2
  29. package/plugin/build/withFishjam.js +31 -5
  30. package/plugin/build/withFishjamAndroid.d.ts +2 -2
  31. package/plugin/build/withFishjamAndroid.js +48 -40
  32. package/plugin/build/withFishjamIos.d.ts +3 -8
  33. package/plugin/build/withFishjamIos.js +52 -72
  34. package/plugin/src/types.ts +19 -0
  35. package/plugin/src/withFishjam.ts +42 -0
  36. package/plugin/src/withFishjamAndroid.ts +112 -0
  37. package/plugin/src/withFishjamIos.ts +336 -0
  38. package/plugin/tsconfig.json +9 -0
  39. package/plugin/tsconfig.tsbuildinfo +1 -0
  40. package/LICENSE.txt +0 -201
  41. package/android/build.gradle +0 -95
  42. package/android/src/main/AndroidManifest.xml +0 -2
  43. package/android/src/main/java/io/fishjam/reactnative/AudioDeviceKind.kt +0 -34
  44. package/android/src/main/java/io/fishjam/reactnative/AudioSwitchManager.kt +0 -61
  45. package/android/src/main/java/io/fishjam/reactnative/EmitableEvents.kt +0 -126
  46. package/android/src/main/java/io/fishjam/reactnative/Errors.kt +0 -31
  47. package/android/src/main/java/io/fishjam/reactnative/PipContainerView.kt +0 -282
  48. package/android/src/main/java/io/fishjam/reactnative/PipContainerViewModule.kt +0 -41
  49. package/android/src/main/java/io/fishjam/reactnative/PipTrackSelector.kt +0 -98
  50. package/android/src/main/java/io/fishjam/reactnative/PipViewFactory.kt +0 -186
  51. package/android/src/main/java/io/fishjam/reactnative/RNFishjamClient.kt +0 -1001
  52. package/android/src/main/java/io/fishjam/reactnative/RNFishjamClientModule.kt +0 -358
  53. package/android/src/main/java/io/fishjam/reactnative/Utils.kt +0 -11
  54. package/android/src/main/java/io/fishjam/reactnative/VideoPreviewView.kt +0 -40
  55. package/android/src/main/java/io/fishjam/reactnative/VideoPreviewViewModule.kt +0 -22
  56. package/android/src/main/java/io/fishjam/reactnative/VideoRendererView.kt +0 -76
  57. package/android/src/main/java/io/fishjam/reactnative/VideoRendererViewModule.kt +0 -33
  58. package/android/src/main/java/io/fishjam/reactnative/VideoView.kt +0 -257
  59. package/android/src/main/java/io/fishjam/reactnative/extensions/CaptureDevice.kt +0 -17
  60. package/android/src/main/java/io/fishjam/reactnative/foregroundService/FishjamForegroundService.kt +0 -101
  61. package/android/src/main/java/io/fishjam/reactnative/foregroundService/ForegroundServiceManager.kt +0 -118
  62. package/android/src/main/java/io/fishjam/reactnative/foregroundService/ForegroundServiceState.kt +0 -46
  63. package/android/src/main/java/io/fishjam/reactnative/helpers/PictureInPictureHelperFragment.kt +0 -20
  64. package/android/src/main/java/io/fishjam/reactnative/managers/ListenerManager.kt +0 -24
  65. package/android/src/main/java/io/fishjam/reactnative/managers/LocalCameraTracksChangedListenersManager.kt +0 -8
  66. package/android/src/main/java/io/fishjam/reactnative/managers/LocalTracksSwitchListenersManager.kt +0 -17
  67. package/android/src/main/java/io/fishjam/reactnative/managers/TracksUpdateListenersManager.kt +0 -7
  68. package/android/src/main/java/io/fishjam/reactnative/utils/PermissionUtils.kt +0 -45
  69. package/build/RNFishjamClientModule.d.ts +0 -106
  70. package/build/RNFishjamClientModule.d.ts.map +0 -1
  71. package/build/RNFishjamClientModule.js +0 -21
  72. package/build/RNFishjamClientModule.js.map +0 -1
  73. package/build/common/metadata.d.ts +0 -9
  74. package/build/common/metadata.d.ts.map +0 -1
  75. package/build/common/metadata.js +0 -11
  76. package/build/common/metadata.js.map +0 -1
  77. package/build/components/FishjamRoom/GridTrackItem.d.ts +0 -12
  78. package/build/components/FishjamRoom/GridTrackItem.d.ts.map +0 -1
  79. package/build/components/FishjamRoom/GridTrackItem.js +0 -56
  80. package/build/components/FishjamRoom/GridTrackItem.js.map +0 -1
  81. package/build/components/FishjamRoom/VideosGrid.d.ts +0 -3
  82. package/build/components/FishjamRoom/VideosGrid.d.ts.map +0 -1
  83. package/build/components/FishjamRoom/VideosGrid.js +0 -20
  84. package/build/components/FishjamRoom/VideosGrid.js.map +0 -1
  85. package/build/components/FishjamRoom/index.d.ts +0 -33
  86. package/build/components/FishjamRoom/index.d.ts.map +0 -1
  87. package/build/components/FishjamRoom/index.js +0 -52
  88. package/build/components/FishjamRoom/index.js.map +0 -1
  89. package/build/components/FishjamRoom/parsePeersToTracks.d.ts +0 -4
  90. package/build/components/FishjamRoom/parsePeersToTracks.d.ts.map +0 -1
  91. package/build/components/FishjamRoom/parsePeersToTracks.js +0 -37
  92. package/build/components/FishjamRoom/parsePeersToTracks.js.map +0 -1
  93. package/build/components/PipContainerView.d.ts +0 -48
  94. package/build/components/PipContainerView.d.ts.map +0 -1
  95. package/build/components/PipContainerView.js +0 -34
  96. package/build/components/PipContainerView.js.map +0 -1
  97. package/build/components/VideoPreviewView.d.ts +0 -28
  98. package/build/components/VideoPreviewView.d.ts.map +0 -1
  99. package/build/components/VideoPreviewView.js +0 -17
  100. package/build/components/VideoPreviewView.js.map +0 -1
  101. package/build/components/VideoRendererView.d.ts +0 -39
  102. package/build/components/VideoRendererView.d.ts.map +0 -1
  103. package/build/components/VideoRendererView.js +0 -25
  104. package/build/components/VideoRendererView.js.map +0 -1
  105. package/build/consts/index.d.ts +0 -5
  106. package/build/consts/index.d.ts.map +0 -1
  107. package/build/consts/index.js +0 -8
  108. package/build/consts/index.js.map +0 -1
  109. package/build/debug/common/webRTC.d.ts +0 -9
  110. package/build/debug/common/webRTC.d.ts.map +0 -1
  111. package/build/debug/common/webRTC.js +0 -11
  112. package/build/debug/common/webRTC.js.map +0 -1
  113. package/build/debug/index.d.ts +0 -4
  114. package/build/debug/index.d.ts.map +0 -1
  115. package/build/debug/index.js +0 -3
  116. package/build/debug/index.js.map +0 -1
  117. package/build/debug/stats/types.d.ts +0 -55
  118. package/build/debug/stats/types.d.ts.map +0 -1
  119. package/build/debug/stats/types.js +0 -2
  120. package/build/debug/stats/types.js.map +0 -1
  121. package/build/debug/stats/useRTCStatistics.d.ts +0 -9
  122. package/build/debug/stats/useRTCStatistics.d.ts.map +0 -1
  123. package/build/debug/stats/useRTCStatistics.js +0 -79
  124. package/build/debug/stats/useRTCStatistics.js.map +0 -1
  125. package/build/hooks/internal/useFishjamEvent.d.ts +0 -4
  126. package/build/hooks/internal/useFishjamEvent.d.ts.map +0 -1
  127. package/build/hooks/internal/useFishjamEvent.js +0 -38
  128. package/build/hooks/internal/useFishjamEvent.js.map +0 -1
  129. package/build/hooks/internal/useFishjamEventState.d.ts +0 -3
  130. package/build/hooks/internal/useFishjamEventState.d.ts.map +0 -1
  131. package/build/hooks/internal/useFishjamEventState.js +0 -18
  132. package/build/hooks/internal/useFishjamEventState.js.map +0 -1
  133. package/build/hooks/useAppScreenShare.d.ts +0 -18
  134. package/build/hooks/useAppScreenShare.d.ts.map +0 -1
  135. package/build/hooks/useAppScreenShare.js +0 -46
  136. package/build/hooks/useAppScreenShare.js.map +0 -1
  137. package/build/hooks/useAudioSettings.d.ts +0 -49
  138. package/build/hooks/useAudioSettings.d.ts.map +0 -1
  139. package/build/hooks/useAudioSettings.js +0 -70
  140. package/build/hooks/useAudioSettings.js.map +0 -1
  141. package/build/hooks/useBandwidthEstimation.d.ts +0 -14
  142. package/build/hooks/useBandwidthEstimation.d.ts.map +0 -1
  143. package/build/hooks/useBandwidthEstimation.js +0 -19
  144. package/build/hooks/useBandwidthEstimation.js.map +0 -1
  145. package/build/hooks/useCallKit.d.ts +0 -121
  146. package/build/hooks/useCallKit.d.ts.map +0 -1
  147. package/build/hooks/useCallKit.js +0 -142
  148. package/build/hooks/useCallKit.js.map +0 -1
  149. package/build/hooks/useCamera.d.ts +0 -113
  150. package/build/hooks/useCamera.d.ts.map +0 -1
  151. package/build/hooks/useCamera.js +0 -93
  152. package/build/hooks/useCamera.js.map +0 -1
  153. package/build/hooks/useConnection.d.ts +0 -73
  154. package/build/hooks/useConnection.d.ts.map +0 -1
  155. package/build/hooks/useConnection.js +0 -46
  156. package/build/hooks/useConnection.js.map +0 -1
  157. package/build/hooks/useForegroundService.d.ts.map +0 -1
  158. package/build/hooks/useForegroundService.js +0 -66
  159. package/build/hooks/useForegroundService.js.map +0 -1
  160. package/build/hooks/useMicrophone.d.ts +0 -16
  161. package/build/hooks/useMicrophone.d.ts.map +0 -1
  162. package/build/hooks/useMicrophone.js +0 -31
  163. package/build/hooks/useMicrophone.js.map +0 -1
  164. package/build/hooks/usePeerStatus.d.ts +0 -10
  165. package/build/hooks/usePeerStatus.d.ts.map +0 -1
  166. package/build/hooks/usePeerStatus.js +0 -13
  167. package/build/hooks/usePeerStatus.js.map +0 -1
  168. package/build/hooks/usePeers.d.ts +0 -98
  169. package/build/hooks/usePeers.d.ts.map +0 -1
  170. package/build/hooks/usePeers.js +0 -81
  171. package/build/hooks/usePeers.js.map +0 -1
  172. package/build/hooks/usePermissions.d.ts +0 -24
  173. package/build/hooks/usePermissions.d.ts.map +0 -1
  174. package/build/hooks/usePermissions.js +0 -61
  175. package/build/hooks/usePermissions.js.map +0 -1
  176. package/build/hooks/useReconnection.d.ts +0 -11
  177. package/build/hooks/useReconnection.d.ts.map +0 -1
  178. package/build/hooks/useReconnection.js +0 -14
  179. package/build/hooks/useReconnection.js.map +0 -1
  180. package/build/hooks/useSandbox.d.ts +0 -20
  181. package/build/hooks/useSandbox.d.ts.map +0 -1
  182. package/build/hooks/useSandbox.js +0 -54
  183. package/build/hooks/useSandbox.js.map +0 -1
  184. package/build/hooks/useScreenShare.d.ts +0 -36
  185. package/build/hooks/useScreenShare.d.ts.map +0 -1
  186. package/build/hooks/useScreenShare.js +0 -45
  187. package/build/hooks/useScreenShare.js.map +0 -1
  188. package/build/hooks/useUpdatePeerMetadata.d.ts +0 -15
  189. package/build/hooks/useUpdatePeerMetadata.d.ts.map +0 -1
  190. package/build/hooks/useUpdatePeerMetadata.js +0 -21
  191. package/build/hooks/useUpdatePeerMetadata.js.map +0 -1
  192. package/build/index.d.ts +0 -36
  193. package/build/index.d.ts.map +0 -1
  194. package/build/index.js +0 -30
  195. package/build/index.js.map +0 -1
  196. package/build/livestream/components/LivestreamStreamer.d.ts +0 -24
  197. package/build/livestream/components/LivestreamStreamer.d.ts.map +0 -1
  198. package/build/livestream/components/LivestreamStreamer.js +0 -12
  199. package/build/livestream/components/LivestreamStreamer.js.map +0 -1
  200. package/build/livestream/components/LivestreamViewer.d.ts +0 -46
  201. package/build/livestream/components/LivestreamViewer.d.ts.map +0 -1
  202. package/build/livestream/components/LivestreamViewer.js +0 -10
  203. package/build/livestream/components/LivestreamViewer.js.map +0 -1
  204. package/build/livestream/hooks/useLivestreamScreenSharingStreamer.d.ts +0 -49
  205. package/build/livestream/hooks/useLivestreamScreenSharingStreamer.d.ts.map +0 -1
  206. package/build/livestream/hooks/useLivestreamScreenSharingStreamer.js +0 -58
  207. package/build/livestream/hooks/useLivestreamScreenSharingStreamer.js.map +0 -1
  208. package/build/livestream/hooks/useLivestreamStreamer.d.ts +0 -65
  209. package/build/livestream/hooks/useLivestreamStreamer.d.ts.map +0 -1
  210. package/build/livestream/hooks/useLivestreamStreamer.js +0 -71
  211. package/build/livestream/hooks/useLivestreamStreamer.js.map +0 -1
  212. package/build/livestream/hooks/useLivestreamViewer.d.ts +0 -36
  213. package/build/livestream/hooks/useLivestreamViewer.d.ts.map +0 -1
  214. package/build/livestream/hooks/useLivestreamViewer.js +0 -73
  215. package/build/livestream/hooks/useLivestreamViewer.js.map +0 -1
  216. package/build/livestream/index.d.ts +0 -12
  217. package/build/livestream/index.d.ts.map +0 -1
  218. package/build/livestream/index.js +0 -7
  219. package/build/livestream/index.js.map +0 -1
  220. package/build/protos/fishjam/peer_notifications.d.ts +0 -63
  221. package/build/protos/fishjam/peer_notifications.d.ts.map +0 -1
  222. package/build/protos/fishjam/peer_notifications.js +0 -235
  223. package/build/protos/fishjam/peer_notifications.js.map +0 -1
  224. package/build/types.d.ts +0 -34
  225. package/build/types.d.ts.map +0 -1
  226. package/build/types.js +0 -2
  227. package/build/types.js.map +0 -1
  228. package/build/utils/config.d.ts +0 -6
  229. package/build/utils/config.d.ts.map +0 -1
  230. package/build/utils/config.js +0 -10
  231. package/build/utils/config.js.map +0 -1
  232. package/build/utils/errorListener.d.ts +0 -2
  233. package/build/utils/errorListener.d.ts.map +0 -1
  234. package/build/utils/errorListener.js +0 -15
  235. package/build/utils/errorListener.js.map +0 -1
  236. package/build/utils/eventPayloadValidator.d.ts +0 -3
  237. package/build/utils/eventPayloadValidator.d.ts.map +0 -1
  238. package/build/utils/eventPayloadValidator.js +0 -86
  239. package/build/utils/eventPayloadValidator.js.map +0 -1
  240. package/build/utils/getFishjamUrl.d.ts +0 -2
  241. package/build/utils/getFishjamUrl.d.ts.map +0 -1
  242. package/build/utils/getFishjamUrl.js +0 -10
  243. package/build/utils/getFishjamUrl.js.map +0 -1
  244. package/debug/package.json +0 -4
  245. package/expo-module.config.json +0 -19
  246. package/ios/CameraPermissionsRequester.swift +0 -117
  247. package/ios/Events.swift +0 -152
  248. package/ios/PictureInPictureManager.swift +0 -215
  249. package/ios/PipContainerView.swift +0 -56
  250. package/ios/PipContainerViewModule.swift +0 -48
  251. package/ios/RNFishjamClient.podspec +0 -30
  252. package/ios/RNFishjamClient.swift +0 -995
  253. package/ios/RNFishjamClientModule.swift +0 -289
  254. package/ios/RNFishjamProxy.swift +0 -12
  255. package/ios/Utils/PermissionUtils.swift +0 -16
  256. package/ios/Utils.swift +0 -23
  257. package/ios/VideoPreviewView.swift +0 -54
  258. package/ios/VideoPreviewViewModule.swift +0 -21
  259. package/ios/VideoRendererView.swift +0 -98
  260. package/ios/VideoRendererViewModule.swift +0 -23
  261. package/ios/extensions/AVCaptureDevice.swift +0 -20
  262. package/ios/managers/LocalCameraTracksChangedListenersManager.swift +0 -23
  263. package/ios/managers/TracksUpdateListenersManager.swift +0 -21
  264. package/livestream/package.json +0 -4
  265. package/plugin/broadcastExtensionFiles/FishjamBroadcastSampleHandler.swift +0 -50
  266. /package/plugin/broadcastExtensionFiles/{FishjamScreenBroadcastExtension.entitlements → ScreenBroadcastExtension.entitlements} +0 -0
@@ -33,21 +33,15 @@ var __importStar = (this && this.__importStar) || (function () {
33
33
  };
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.getSbePodfileSnippet = getSbePodfileSnippet;
37
- // ios-related code was mostly copied from OneSignal expo plugin: https://github.com/OneSignal/onesignal-expo-plugin/blob/main/onesignal/withOneSignalIos.ts
36
+ exports.withFishjamIos = void 0;
38
37
  const config_plugins_1 = require("@expo/config-plugins");
39
- const fs = __importStar(require("promise-fs"));
40
38
  const path = __importStar(require("path"));
39
+ const fs = __importStar(require("promise-fs"));
41
40
  function getSbeTargetName(props) {
42
- return (props?.ios?.broadcastExtensionTargetName ||
43
- 'FishjamScreenBroadcastExtension');
41
+ return props?.ios?.broadcastExtensionTargetName || 'ScreenBroadcastExtension';
44
42
  }
45
43
  function getSbeDisplayName(props) {
46
- return props?.ios?.broadcastExtensionDisplayName || 'FishjamScreenBroadcast';
47
- }
48
- function getSbePodfileSnippet(props) {
49
- const targetName = getSbeTargetName(props);
50
- return `\ntarget '${targetName}' do\n pod 'FishjamCloudBroadcastClient'\nend`;
44
+ return props?.ios?.broadcastExtensionDisplayName || 'ScreenBroadcast';
51
45
  }
52
46
  const TARGETED_DEVICE_FAMILY = `"1,2"`;
53
47
  const IPHONEOS_DEPLOYMENT_TARGET = '15.1';
@@ -64,36 +58,9 @@ async function updateFileWithRegex(iosPath, fileName, regex, value, props) {
64
58
  file = file.replace(regex, value);
65
59
  await fs.writeFile(filePath, file);
66
60
  }
67
- /**
68
- * Inserts a required target to Podfile.
69
- * This is needed to provide the dependency of FishjamCloudBroadcastClient to the extension.
70
- */
71
- async function updatePodfile(iosPath, props) {
72
- const podfileSnippet = getSbePodfileSnippet(props);
73
- let matches;
74
- try {
75
- const podfile = await fs.readFile(`${iosPath}/Podfile`, {
76
- encoding: 'utf-8',
77
- });
78
- matches = podfile.match(podfileSnippet);
79
- }
80
- catch (e) {
81
- console.error('Error reading from Podfile: ', e);
82
- }
83
- if (matches) {
84
- console.log(`${getSbeTargetName(props)} target already added to Podfile. Skipping...`);
85
- return;
86
- }
87
- try {
88
- fs.appendFile(`${iosPath}/Podfile`, podfileSnippet);
89
- }
90
- catch (e) {
91
- console.error('Error writing to Podfile: ', e);
92
- }
93
- }
94
61
  /**
95
62
  * Adds "App Group" permission
96
- * App Group allow your app and the FishjamScreenBroadcastExtension to communicate with each other.
63
+ * App Group allows your app and the ScreenBroadcastExtension to communicate with each other.
97
64
  */
98
65
  const withAppGroupPermissions = (config, props) => {
99
66
  const APP_GROUP_KEY = 'com.apple.security.application-groups';
@@ -115,6 +82,7 @@ const withAppGroupPermissions = (config, props) => {
115
82
  newConfig.modResults[APP_GROUP_KEY] = modResultsArray;
116
83
  return newConfig;
117
84
  });
85
+ // eslint-disable-next-line no-shadow
118
86
  config = (0, config_plugins_1.withXcodeProject)(config, (props) => {
119
87
  const xcodeProject = props.modResults;
120
88
  const targets = xcodeProject.getFirstTarget();
@@ -128,8 +96,7 @@ const withAppGroupPermissions = (config, props) => {
128
96
  projectObj.attributes ??= {};
129
97
  projectObj.attributes.TargetAttributes ??= {};
130
98
  projectObj.attributes.TargetAttributes[targetUuid] ??= {};
131
- projectObj.attributes.TargetAttributes[targetUuid].SystemCapabilities ??=
132
- {};
99
+ projectObj.attributes.TargetAttributes[targetUuid].SystemCapabilities ??= {};
133
100
  projectObj.attributes.TargetAttributes[targetUuid].SystemCapabilities['com.apple.ApplicationGroups.iOS'] = {
134
101
  enabled: 1,
135
102
  };
@@ -137,6 +104,7 @@ const withAppGroupPermissions = (config, props) => {
137
104
  const entitlementsFilePath = `${mainTargetName}/${mainTargetName}.entitlements`;
138
105
  const configurations = xcodeProject.pbxXCBuildConfigurationSection();
139
106
  Object.keys(configurations).forEach((key) => {
107
+ // eslint-disable-next-line no-shadow
140
108
  const config = configurations[key];
141
109
  if (config.buildSettings?.PRODUCT_NAME?.includes(mainTargetName)) {
142
110
  if (!config.buildSettings.CODE_SIGN_ENTITLEMENTS) {
@@ -150,14 +118,13 @@ const withAppGroupPermissions = (config, props) => {
150
118
  };
151
119
  /**
152
120
  * Adds constants to Info.plist
153
- * In other to dynamically retreive extension's bundleId and group name we need to store it in Info.plist.
121
+ * In order to dynamically retrieve extension's bundleId and group name we need to store it in Info.plist.
154
122
  */
155
123
  const withInfoPlistConstants = (config, props) => (0, config_plugins_1.withInfoPlist)(config, (configuration) => {
156
124
  const bundleIdentifier = configuration.ios?.bundleIdentifier || '';
157
125
  const groupIdentifier = props?.ios?.appGroupContainerId || `group.${bundleIdentifier}`;
158
- configuration.modResults['AppGroupName'] = groupIdentifier;
159
- configuration.modResults['ScreenShareExtensionBundleId'] =
160
- `${bundleIdentifier}.${getSbeTargetName(props)}`;
126
+ configuration.modResults['RTCScreenSharingExtension'] = `${bundleIdentifier}.${getSbeTargetName(props)}`;
127
+ configuration.modResults['RTCAppGroupIdentifier'] = groupIdentifier;
161
128
  return configuration;
162
129
  });
163
130
  /**
@@ -173,18 +140,25 @@ const withFishjamSBE = (config, options) => (0, config_plugins_1.withXcodeProjec
173
140
  const targetName = getSbeTargetName(options);
174
141
  const pluginDir = require.resolve('@fishjam-cloud/react-native-client/package.json');
175
142
  const extensionSourceDir = path.join(pluginDir, '../plugin/broadcastExtensionFiles/');
176
- await updatePodfile(iosPath, options);
177
143
  const projPath = `${iosPath}/${appName}.xcodeproj/project.pbxproj`;
178
- const templateTargetName = 'FishjamScreenBroadcastExtension';
144
+ const templateTargetName = 'ScreenBroadcastExtension';
179
145
  const extFiles = [
180
- 'FishjamBroadcastSampleHandler.swift',
146
+ 'SampleHandler.swift',
147
+ 'SampleUploader.swift',
181
148
  `${templateTargetName}.entitlements`,
182
149
  `Info.plist`,
150
+ 'SocketConnection.swift',
151
+ 'DarwinNotificationCenter.swift',
152
+ 'Atomic.swift',
183
153
  ];
184
154
  const destFiles = [
185
- 'FishjamBroadcastSampleHandler.swift',
155
+ 'SampleHandler.swift',
156
+ 'SampleUploader.swift',
186
157
  `${targetName}.entitlements`,
187
158
  `Info.plist`,
159
+ 'SocketConnection.swift',
160
+ 'DarwinNotificationCenter.swift',
161
+ 'Atomic.swift',
188
162
  ];
189
163
  await xcodeProject.parse(async function (err) {
190
164
  if (err) {
@@ -192,6 +166,7 @@ const withFishjamSBE = (config, options) => (0, config_plugins_1.withXcodeProjec
192
166
  return;
193
167
  }
194
168
  if (xcodeProject.pbxTargetByName(targetName)) {
169
+ // eslint-disable-next-line no-console
195
170
  console.log(`${targetName} already exists in project. Skipping...`);
196
171
  return;
197
172
  }
@@ -205,11 +180,17 @@ const withFishjamSBE = (config, options) => (0, config_plugins_1.withXcodeProjec
205
180
  }
206
181
  catch (e) {
207
182
  console.error('Error copying extension files: ', e);
183
+ throw e;
184
+ }
185
+ try {
186
+ await updateFileWithRegex(iosPath, `${targetName}.entitlements`, GROUP_IDENTIFIER_TEMPLATE_REGEX, groupIdentifier, options);
187
+ await updateFileWithRegex(iosPath, 'SampleHandler.swift', GROUP_IDENTIFIER_TEMPLATE_REGEX, groupIdentifier, options);
188
+ await updateFileWithRegex(iosPath, 'SampleUploader.swift', BUNDLE_IDENTIFIER_TEMPLATE_REGEX, bundleIdentifier || '', options);
189
+ await updateFileWithRegex(iosPath, 'Info.plist', DISPLAY_NAME_TEMPLATE_REGEX, getSbeDisplayName(options), options);
190
+ }
191
+ catch (e) {
192
+ console.error('Error updating extension files: ', e);
208
193
  }
209
- await updateFileWithRegex(iosPath, `${targetName}.entitlements`, GROUP_IDENTIFIER_TEMPLATE_REGEX, groupIdentifier, options);
210
- await updateFileWithRegex(iosPath, 'FishjamBroadcastSampleHandler.swift', GROUP_IDENTIFIER_TEMPLATE_REGEX, groupIdentifier, options);
211
- await updateFileWithRegex(iosPath, 'FishjamBroadcastSampleHandler.swift', BUNDLE_IDENTIFIER_TEMPLATE_REGEX, bundleIdentifier || '', options);
212
- await updateFileWithRegex(iosPath, 'Info.plist', DISPLAY_NAME_TEMPLATE_REGEX, getSbeDisplayName(options), options);
213
194
  // Create new PBXGroup for the extension
214
195
  const extGroup = xcodeProject.addPbxGroup(extFiles, targetName, targetName);
215
196
  // Add the new PBXGroup to the top level group. This makes the
@@ -225,15 +206,19 @@ const withFishjamSBE = (config, options) => (0, config_plugins_1.withXcodeProjec
225
206
  // An upstream fix should be made to the code referenced in this link:
226
207
  // - https://github.com/apache/cordova-node-xcode/blob/8b98cabc5978359db88dc9ff2d4c015cba40f150/lib/pbxProject.js#L860
227
208
  const projObjects = xcodeProject.hash.project.objects;
228
- projObjects['PBXTargetDependency'] =
229
- projObjects['PBXTargetDependency'] || {};
230
- projObjects['PBXContainerItemProxy'] =
231
- projObjects['PBXTargetDependency'] || {};
209
+ projObjects['PBXTargetDependency'] = projObjects['PBXTargetDependency'] || {};
210
+ projObjects['PBXContainerItemProxy'] = projObjects['PBXContainerItemProxy'] || {};
232
211
  // Add the SBE target
233
212
  // This adds PBXTargetDependency and PBXContainerItemProxy for you
234
213
  const sbeTarget = xcodeProject.addTarget(targetName, 'app_extension', targetName, `${bundleIdentifier}.${targetName}`);
235
214
  // Add build phases to the new target
236
- xcodeProject.addBuildPhase(['FishjamBroadcastSampleHandler.swift'], 'PBXSourcesBuildPhase', 'Sources', sbeTarget.uuid);
215
+ xcodeProject.addBuildPhase([
216
+ 'SampleHandler.swift',
217
+ 'SampleUploader.swift',
218
+ 'SocketConnection.swift',
219
+ 'DarwinNotificationCenter.swift',
220
+ 'Atomic.swift',
221
+ ], 'PBXSourcesBuildPhase', 'Sources', sbeTarget.uuid);
237
222
  xcodeProject.addBuildPhase([], 'PBXResourcesBuildPhase', 'Resources', sbeTarget.uuid);
238
223
  xcodeProject.addBuildPhase([], 'PBXFrameworksBuildPhase', 'Frameworks', sbeTarget.uuid);
239
224
  xcodeProject.addFramework('ReplayKit.framework', {
@@ -262,14 +247,6 @@ const withFishjamSBE = (config, options) => (0, config_plugins_1.withXcodeProjec
262
247
  });
263
248
  return props;
264
249
  });
265
- const withFishjamPictureInPicture = (config, props) => (0, config_plugins_1.withInfoPlist)(config, (configuration) => {
266
- if (props?.ios?.supportsPictureInPicture) {
267
- const backgroundModes = new Set(configuration.modResults.UIBackgroundModes ?? []);
268
- backgroundModes.add('audio');
269
- configuration.modResults.UIBackgroundModes = Array.from(backgroundModes);
270
- }
271
- return configuration;
272
- });
273
250
  /**
274
251
  * Adds iOS VoIP background mode to keep the app running during calls
275
252
  */
@@ -281,10 +258,14 @@ const withFishjamVoIPBackgroundMode = (config, props) => (0, config_plugins_1.wi
281
258
  }
282
259
  return configuration;
283
260
  });
284
- /**
285
- * Applies screen sharing plugin if enabled. In order for screensharing to work, we need to copy extension files to your iOS project.
286
- * Allows for dynamically changing deploymentTarget.
287
- */
261
+ const withFishjamPictureInPicture = (config, props) => (0, config_plugins_1.withInfoPlist)(config, (configuration) => {
262
+ if (props?.ios?.supportsPictureInPicture) {
263
+ const backgroundModes = new Set(configuration.modResults.UIBackgroundModes ?? []);
264
+ backgroundModes.add('audio');
265
+ configuration.modResults.UIBackgroundModes = Array.from(backgroundModes);
266
+ }
267
+ return configuration;
268
+ });
288
269
  const withFishjamIos = (config, props) => {
289
270
  if (props?.ios?.enableScreensharing) {
290
271
  config = withAppGroupPermissions(config, props);
@@ -292,12 +273,11 @@ const withFishjamIos = (config, props) => {
292
273
  config = withFishjamSBE(config, props);
293
274
  }
294
275
  config = (0, config_plugins_1.withPodfileProperties)(config, (configuration) => {
295
- configuration.modResults['ios.deploymentTarget'] =
296
- props?.ios?.iphoneDeploymentTarget ?? IPHONEOS_DEPLOYMENT_TARGET;
276
+ configuration.modResults['ios.deploymentTarget'] = props?.ios?.iphoneDeploymentTarget ?? IPHONEOS_DEPLOYMENT_TARGET;
297
277
  return configuration;
298
278
  });
299
279
  config = withFishjamPictureInPicture(config, props);
300
280
  config = withFishjamVoIPBackgroundMode(config, props);
301
281
  return config;
302
282
  };
303
- exports.default = withFishjamIos;
283
+ exports.withFishjamIos = withFishjamIos;
@@ -0,0 +1,19 @@
1
+ export type FishjamPluginOptions =
2
+ | {
3
+ android?: {
4
+ enableForegroundService?: boolean;
5
+ enableScreensharing?: boolean;
6
+ supportsPictureInPicture?: boolean;
7
+ };
8
+ ios?: {
9
+ enableScreensharing?: boolean;
10
+ supportsPictureInPicture?: boolean;
11
+ broadcastExtensionTargetName?: string;
12
+ broadcastExtensionDisplayName?: string;
13
+ appGroupContainerId?: string;
14
+ mainTargetName?: string;
15
+ iphoneDeploymentTarget?: string;
16
+ enableVoIPBackgroundMode?: boolean;
17
+ };
18
+ }
19
+ | undefined;
@@ -0,0 +1,42 @@
1
+ import type { ConfigPlugin } from '@expo/config-plugins';
2
+
3
+ import type { FishjamPluginOptions } from './types';
4
+ import { withFishjamAndroid } from './withFishjamAndroid';
5
+ import { withFishjamIos } from './withFishjamIos';
6
+
7
+ /**
8
+ * Main Fishjam Expo config plugin.
9
+ *
10
+ * This plugin configures both iOS and Android platforms for Picture-in-Picture support.
11
+ *
12
+ * ## Usage
13
+ *
14
+ * ```json
15
+ * {
16
+ * "plugins": [
17
+ * [
18
+ * "@fishjam-cloud/react-native-client",
19
+ * {
20
+ * "android": {
21
+ * "supportsPictureInPicture": true
22
+ * },
23
+ * "ios": {
24
+ * "supportsPictureInPicture": true
25
+ * }
26
+ * }
27
+ * ]
28
+ * ]
29
+ * }
30
+ * ```
31
+ *
32
+ * @param config - Expo config object
33
+ * @param options - Plugin configuration options
34
+ * @returns Modified config object
35
+ */
36
+ const withFishjam: ConfigPlugin<FishjamPluginOptions> = (config, options) => {
37
+ config = withFishjamAndroid(config, options);
38
+ config = withFishjamIos(config, options);
39
+ return config;
40
+ };
41
+
42
+ export default withFishjam;
@@ -0,0 +1,112 @@
1
+ import type { ConfigPlugin } from '@expo/config-plugins';
2
+ import { AndroidConfig, withAndroidManifest } from '@expo/config-plugins';
3
+ import { getMainApplicationOrThrow } from '@expo/config-plugins/build/android/Manifest';
4
+
5
+ import type { FishjamPluginOptions } from './types';
6
+
7
+ const withFishjamPictureInPicture: ConfigPlugin<FishjamPluginOptions> = (config, props) =>
8
+ withAndroidManifest(config, (configuration) => {
9
+ const activity = AndroidConfig.Manifest.getMainActivityOrThrow(configuration.modResults);
10
+
11
+ if (props?.android?.supportsPictureInPicture) {
12
+ activity.$['android:supportsPictureInPicture'] = 'true';
13
+ } else {
14
+ delete activity.$['android:supportsPictureInPicture'];
15
+ }
16
+ return configuration;
17
+ });
18
+
19
+ const withFishjamForegroundService: ConfigPlugin<FishjamPluginOptions> = (config, props) =>
20
+ withAndroidManifest(config, async (configuration) => {
21
+ if (!props?.android?.enableForegroundService) {
22
+ return configuration;
23
+ }
24
+
25
+ const mainApplication = getMainApplicationOrThrow(configuration.modResults);
26
+ mainApplication.service = mainApplication.service || [];
27
+
28
+ const webRTCForegroundService = {
29
+ $: {
30
+ 'android:name': 'com.oney.WebRTCModule.foregroundService.WebRTCForegroundService',
31
+ 'android:foregroundServiceType': 'camera|microphone',
32
+ 'android:stopWithTask': 'true',
33
+ },
34
+ };
35
+
36
+ const existingWebRTCForegroundServiceIndex = mainApplication.service.findIndex(
37
+ (service) => service.$['android:name'] === webRTCForegroundService.$['android:name'],
38
+ );
39
+
40
+ if (existingWebRTCForegroundServiceIndex !== -1) {
41
+ mainApplication.service[existingWebRTCForegroundServiceIndex] = webRTCForegroundService;
42
+ } else {
43
+ mainApplication.service.push(webRTCForegroundService);
44
+ }
45
+
46
+ if (props?.android?.enableScreensharing) {
47
+ const mediaProjectionService = {
48
+ $: {
49
+ 'android:name': 'com.oney.WebRTCModule.MediaProjectionService',
50
+ 'android:foregroundServiceType': 'mediaProjection',
51
+ 'android:stopWithTask': 'true',
52
+ },
53
+ };
54
+
55
+ const existingMediaProjectionServiceIndex = mainApplication.service.findIndex(
56
+ (service) => service.$['android:name'] === mediaProjectionService.$['android:name'],
57
+ );
58
+
59
+ if (existingMediaProjectionServiceIndex !== -1) {
60
+ mainApplication.service[existingMediaProjectionServiceIndex] = mediaProjectionService;
61
+ } else {
62
+ mainApplication.service.push(mediaProjectionService);
63
+ }
64
+ }
65
+ return configuration;
66
+ });
67
+
68
+ const withFishjamForegroundServicePermission: ConfigPlugin<FishjamPluginOptions> = (config, props) =>
69
+ withAndroidManifest(config, (configuration) => {
70
+ if (!props?.android?.enableForegroundService) {
71
+ return configuration;
72
+ }
73
+
74
+ const mainApplication = configuration.modResults;
75
+ if (!mainApplication.manifest) {
76
+ return configuration;
77
+ }
78
+
79
+ if (!mainApplication.manifest['uses-permission']) {
80
+ mainApplication.manifest['uses-permission'] = [];
81
+ }
82
+
83
+ const permissions = mainApplication.manifest['uses-permission'];
84
+
85
+ const foregroundServicePermissions = [
86
+ 'android.permission.FOREGROUND_SERVICE',
87
+ 'android.permission.FOREGROUND_SERVICE_CAMERA',
88
+ 'android.permission.FOREGROUND_SERVICE_MEDIA_PROJECTION',
89
+ 'android.permission.FOREGROUND_SERVICE_MICROPHONE',
90
+ ];
91
+
92
+ foregroundServicePermissions.forEach((permissionName) => {
93
+ const hasPermission = permissions.some((perm) => perm.$?.['android:name'] === permissionName);
94
+
95
+ if (!hasPermission) {
96
+ permissions.push({
97
+ $: {
98
+ 'android:name': permissionName,
99
+ },
100
+ });
101
+ }
102
+ });
103
+
104
+ return configuration;
105
+ });
106
+
107
+ export const withFishjamAndroid: ConfigPlugin<FishjamPluginOptions> = (config, props) => {
108
+ config = withFishjamForegroundServicePermission(config, props);
109
+ config = withFishjamForegroundService(config, props);
110
+ config = withFishjamPictureInPicture(config, props);
111
+ return config;
112
+ };