@stream-io/video-react-native-sdk 1.31.1 → 1.32.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 (207) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/android/src/main/AndroidManifest.xml +8 -1
  3. package/android/src/main/AndroidManifestNew.xml +11 -0
  4. package/android/src/main/java/com/streamvideo/reactnative/StreamVideoReactNativeModule.kt +42 -5
  5. package/android/src/main/java/com/streamvideo/reactnative/audio/utils/WebRtcAudioUtils.kt +70 -6
  6. package/android/src/main/java/com/streamvideo/reactnative/callmanager/StreamInCallManagerModule.kt +6 -4
  7. package/android/src/main/java/com/streamvideo/reactnative/keepalive/KeepAliveNotification.kt +83 -0
  8. package/android/src/main/java/com/streamvideo/reactnative/keepalive/StreamCallKeepAliveHeadlessService.kt +149 -0
  9. package/dist/commonjs/hooks/push/index.js +0 -2
  10. package/dist/commonjs/hooks/push/index.js.map +1 -1
  11. package/dist/commonjs/hooks/push/useCallingExpWithCallingStateEffect.js +146 -0
  12. package/dist/commonjs/hooks/push/useCallingExpWithCallingStateEffect.js.map +1 -0
  13. package/dist/commonjs/hooks/push/useIosVoipPushEventsSetupEffect.js +18 -31
  14. package/dist/commonjs/hooks/push/useIosVoipPushEventsSetupEffect.js.map +1 -1
  15. package/dist/commonjs/hooks/useAndroidKeepCallAliveEffect.js +41 -106
  16. package/dist/commonjs/hooks/useAndroidKeepCallAliveEffect.js.map +1 -1
  17. package/dist/commonjs/index.js +1 -0
  18. package/dist/commonjs/index.js.map +1 -1
  19. package/dist/commonjs/modules/call-manager/CallManager.js +26 -0
  20. package/dist/commonjs/modules/call-manager/CallManager.js.map +1 -1
  21. package/dist/commonjs/providers/StreamCall/index.js +6 -6
  22. package/dist/commonjs/providers/StreamCall/index.js.map +1 -1
  23. package/dist/commonjs/utils/StreamVideoRN/index.js +35 -21
  24. package/dist/commonjs/utils/StreamVideoRN/index.js.map +1 -1
  25. package/dist/commonjs/utils/internal/callingx/audioSessionPromise.js +68 -0
  26. package/dist/commonjs/utils/internal/callingx/audioSessionPromise.js.map +1 -0
  27. package/dist/commonjs/utils/internal/callingx/callingx.js +150 -0
  28. package/dist/commonjs/utils/internal/callingx/callingx.js.map +1 -0
  29. package/dist/commonjs/utils/internal/registerSDKGlobals.js +53 -3
  30. package/dist/commonjs/utils/internal/registerSDKGlobals.js.map +1 -1
  31. package/dist/commonjs/utils/keepCallAliveHeadlessTask.js +48 -0
  32. package/dist/commonjs/utils/keepCallAliveHeadlessTask.js.map +1 -0
  33. package/dist/commonjs/utils/push/android.js +135 -202
  34. package/dist/commonjs/utils/push/android.js.map +1 -1
  35. package/dist/commonjs/utils/push/internal/ios.js +17 -34
  36. package/dist/commonjs/utils/push/internal/ios.js.map +1 -1
  37. package/dist/commonjs/utils/push/internal/rxSubjects.js +1 -45
  38. package/dist/commonjs/utils/push/internal/rxSubjects.js.map +1 -1
  39. package/dist/commonjs/utils/push/internal/utils.js +71 -53
  40. package/dist/commonjs/utils/push/internal/utils.js.map +1 -1
  41. package/dist/commonjs/utils/push/ios.js.map +1 -1
  42. package/dist/commonjs/utils/push/libs/callingx.js +75 -0
  43. package/dist/commonjs/utils/push/libs/callingx.js.map +1 -0
  44. package/dist/commonjs/utils/push/libs/index.js +8 -19
  45. package/dist/commonjs/utils/push/libs/index.js.map +1 -1
  46. package/dist/commonjs/utils/push/libs/notifee/index.js +0 -23
  47. package/dist/commonjs/utils/push/libs/notifee/index.js.map +1 -1
  48. package/dist/commonjs/utils/push/setupCallingExpEvents.js +105 -0
  49. package/dist/commonjs/utils/push/setupCallingExpEvents.js.map +1 -0
  50. package/dist/commonjs/utils/push/setupIosVoipPushEvents.js +7 -6
  51. package/dist/commonjs/utils/push/setupIosVoipPushEvents.js.map +1 -1
  52. package/dist/commonjs/version.js +1 -1
  53. package/dist/module/hooks/push/index.js +0 -2
  54. package/dist/module/hooks/push/index.js.map +1 -1
  55. package/dist/module/hooks/push/useCallingExpWithCallingStateEffect.js +139 -0
  56. package/dist/module/hooks/push/useCallingExpWithCallingStateEffect.js.map +1 -0
  57. package/dist/module/hooks/push/useIosVoipPushEventsSetupEffect.js +18 -31
  58. package/dist/module/hooks/push/useIosVoipPushEventsSetupEffect.js.map +1 -1
  59. package/dist/module/hooks/useAndroidKeepCallAliveEffect.js +42 -107
  60. package/dist/module/hooks/useAndroidKeepCallAliveEffect.js.map +1 -1
  61. package/dist/module/index.js +1 -0
  62. package/dist/module/index.js.map +1 -1
  63. package/dist/module/modules/call-manager/CallManager.js +26 -0
  64. package/dist/module/modules/call-manager/CallManager.js.map +1 -1
  65. package/dist/module/providers/StreamCall/index.js +6 -6
  66. package/dist/module/providers/StreamCall/index.js.map +1 -1
  67. package/dist/module/utils/StreamVideoRN/index.js +35 -21
  68. package/dist/module/utils/StreamVideoRN/index.js.map +1 -1
  69. package/dist/module/utils/internal/callingx/audioSessionPromise.js +61 -0
  70. package/dist/module/utils/internal/callingx/audioSessionPromise.js.map +1 -0
  71. package/dist/module/utils/internal/callingx/callingx.js +140 -0
  72. package/dist/module/utils/internal/callingx/callingx.js.map +1 -0
  73. package/dist/module/utils/internal/registerSDKGlobals.js +53 -3
  74. package/dist/module/utils/internal/registerSDKGlobals.js.map +1 -1
  75. package/dist/module/utils/keepCallAliveHeadlessTask.js +42 -0
  76. package/dist/module/utils/keepCallAliveHeadlessTask.js.map +1 -0
  77. package/dist/module/utils/push/android.js +137 -204
  78. package/dist/module/utils/push/android.js.map +1 -1
  79. package/dist/module/utils/push/internal/ios.js +17 -34
  80. package/dist/module/utils/push/internal/ios.js.map +1 -1
  81. package/dist/module/utils/push/internal/rxSubjects.js +0 -44
  82. package/dist/module/utils/push/internal/rxSubjects.js.map +1 -1
  83. package/dist/module/utils/push/internal/utils.js +67 -50
  84. package/dist/module/utils/push/internal/utils.js.map +1 -1
  85. package/dist/module/utils/push/ios.js.map +1 -1
  86. package/dist/module/utils/push/libs/callingx.js +67 -0
  87. package/dist/module/utils/push/libs/callingx.js.map +1 -0
  88. package/dist/module/utils/push/libs/index.js +1 -2
  89. package/dist/module/utils/push/libs/index.js.map +1 -1
  90. package/dist/module/utils/push/libs/notifee/index.js +0 -21
  91. package/dist/module/utils/push/libs/notifee/index.js.map +1 -1
  92. package/dist/module/utils/push/setupCallingExpEvents.js +99 -0
  93. package/dist/module/utils/push/setupCallingExpEvents.js.map +1 -0
  94. package/dist/module/utils/push/setupIosVoipPushEvents.js +7 -6
  95. package/dist/module/utils/push/setupIosVoipPushEvents.js.map +1 -1
  96. package/dist/module/version.js +1 -1
  97. package/dist/typescript/hooks/push/index.d.ts.map +1 -1
  98. package/dist/typescript/hooks/push/useCallingExpWithCallingStateEffect.d.ts +5 -0
  99. package/dist/typescript/hooks/push/useCallingExpWithCallingStateEffect.d.ts.map +1 -0
  100. package/dist/typescript/hooks/push/useIosVoipPushEventsSetupEffect.d.ts.map +1 -1
  101. package/dist/typescript/hooks/useAndroidKeepCallAliveEffect.d.ts.map +1 -1
  102. package/dist/typescript/index.d.ts +1 -0
  103. package/dist/typescript/index.d.ts.map +1 -1
  104. package/dist/typescript/modules/call-manager/CallManager.d.ts +5 -0
  105. package/dist/typescript/modules/call-manager/CallManager.d.ts.map +1 -1
  106. package/dist/typescript/utils/StreamVideoRN/index.d.ts +22 -2
  107. package/dist/typescript/utils/StreamVideoRN/index.d.ts.map +1 -1
  108. package/dist/typescript/utils/StreamVideoRN/types.d.ts +59 -25
  109. package/dist/typescript/utils/StreamVideoRN/types.d.ts.map +1 -1
  110. package/dist/typescript/utils/internal/callingx/audioSessionPromise.d.ts +16 -0
  111. package/dist/typescript/utils/internal/callingx/audioSessionPromise.d.ts.map +1 -0
  112. package/dist/typescript/utils/internal/callingx/callingx.d.ts +18 -0
  113. package/dist/typescript/utils/internal/callingx/callingx.d.ts.map +1 -0
  114. package/dist/typescript/utils/internal/registerSDKGlobals.d.ts.map +1 -1
  115. package/dist/typescript/utils/keepCallAliveHeadlessTask.d.ts +10 -0
  116. package/dist/typescript/utils/keepCallAliveHeadlessTask.d.ts.map +1 -0
  117. package/dist/typescript/utils/push/android.d.ts +1 -2
  118. package/dist/typescript/utils/push/android.d.ts.map +1 -1
  119. package/dist/typescript/utils/push/internal/ios.d.ts.map +1 -1
  120. package/dist/typescript/utils/push/internal/rxSubjects.d.ts +0 -33
  121. package/dist/typescript/utils/push/internal/rxSubjects.d.ts.map +1 -1
  122. package/dist/typescript/utils/push/internal/utils.d.ts +14 -8
  123. package/dist/typescript/utils/push/internal/utils.d.ts.map +1 -1
  124. package/dist/typescript/utils/push/ios.d.ts +1 -2
  125. package/dist/typescript/utils/push/ios.d.ts.map +1 -1
  126. package/dist/typescript/utils/push/libs/callingx.d.ts +9 -0
  127. package/dist/typescript/utils/push/libs/callingx.d.ts.map +1 -0
  128. package/dist/typescript/utils/push/libs/index.d.ts +1 -2
  129. package/dist/typescript/utils/push/libs/index.d.ts.map +1 -1
  130. package/dist/typescript/utils/push/libs/notifee/index.d.ts +0 -2
  131. package/dist/typescript/utils/push/libs/notifee/index.d.ts.map +1 -1
  132. package/dist/typescript/utils/push/setupCallingExpEvents.d.ts +8 -0
  133. package/dist/typescript/utils/push/setupCallingExpEvents.d.ts.map +1 -0
  134. package/dist/typescript/utils/push/setupIosVoipPushEvents.d.ts.map +1 -1
  135. package/dist/typescript/version.d.ts +1 -1
  136. package/expo-config-plugin/dist/withAndroidManifest.js +1 -33
  137. package/expo-config-plugin/dist/withAndroidPermissions.js +2 -7
  138. package/expo-config-plugin/dist/withAppDelegate.js +19 -197
  139. package/expo-config-plugin/dist/withMainActivity.js +1 -1
  140. package/expo-config-plugin/dist/withiOSInfoPlist.js +2 -3
  141. package/ios/StreamInCallManager.m +2 -0
  142. package/ios/StreamInCallManager.swift +19 -7
  143. package/ios/StreamVideoReactNative-Bridging-Header.h +3 -1
  144. package/ios/StreamVideoReactNative.h +7 -4
  145. package/ios/StreamVideoReactNative.m +199 -84
  146. package/package.json +11 -16
  147. package/src/hooks/push/index.ts +0 -2
  148. package/src/hooks/push/useCallingExpWithCallingStateEffect.ts +193 -0
  149. package/src/hooks/push/useIosVoipPushEventsSetupEffect.ts +21 -34
  150. package/src/hooks/useAndroidKeepCallAliveEffect.ts +63 -129
  151. package/src/index.ts +1 -0
  152. package/src/modules/call-manager/CallManager.ts +36 -0
  153. package/src/modules/call-manager/native-module.d.ts +7 -0
  154. package/src/providers/StreamCall/index.tsx +6 -6
  155. package/src/utils/StreamVideoRN/index.ts +42 -30
  156. package/src/utils/StreamVideoRN/types.ts +61 -25
  157. package/src/utils/internal/callingx/audioSessionPromise.ts +65 -0
  158. package/src/utils/internal/callingx/callingx.ts +197 -0
  159. package/src/utils/internal/registerSDKGlobals.ts +52 -4
  160. package/src/utils/keepCallAliveHeadlessTask.ts +54 -0
  161. package/src/utils/push/android.ts +198 -311
  162. package/src/utils/push/internal/ios.ts +28 -44
  163. package/src/utils/push/internal/rxSubjects.ts +0 -61
  164. package/src/utils/push/internal/utils.ts +108 -64
  165. package/src/utils/push/ios.ts +1 -6
  166. package/src/utils/push/libs/callingx.ts +89 -0
  167. package/src/utils/push/libs/index.ts +1 -2
  168. package/src/utils/push/libs/notifee/index.ts +0 -31
  169. package/src/utils/push/setupCallingExpEvents.ts +135 -0
  170. package/src/utils/push/setupIosVoipPushEvents.ts +11 -7
  171. package/src/version.ts +1 -1
  172. package/android/src/main/java/com/streamvideo/reactnative/util/CallAliveServiceChecker.kt +0 -95
  173. package/dist/commonjs/hooks/push/useIosCallkeepWithCallingStateEffect.js +0 -160
  174. package/dist/commonjs/hooks/push/useIosCallkeepWithCallingStateEffect.js.map +0 -1
  175. package/dist/commonjs/hooks/push/useProcessPushCallEffect.js +0 -67
  176. package/dist/commonjs/hooks/push/useProcessPushCallEffect.js.map +0 -1
  177. package/dist/commonjs/utils/push/libs/callkeep.js +0 -17
  178. package/dist/commonjs/utils/push/libs/callkeep.js.map +0 -1
  179. package/dist/commonjs/utils/push/libs/voipPushNotification.js +0 -17
  180. package/dist/commonjs/utils/push/libs/voipPushNotification.js.map +0 -1
  181. package/dist/commonjs/utils/push/setupIosCallKeepEvents.js +0 -205
  182. package/dist/commonjs/utils/push/setupIosCallKeepEvents.js.map +0 -1
  183. package/dist/module/hooks/push/useIosCallkeepWithCallingStateEffect.js +0 -153
  184. package/dist/module/hooks/push/useIosCallkeepWithCallingStateEffect.js.map +0 -1
  185. package/dist/module/hooks/push/useProcessPushCallEffect.js +0 -60
  186. package/dist/module/hooks/push/useProcessPushCallEffect.js.map +0 -1
  187. package/dist/module/utils/push/libs/callkeep.js +0 -11
  188. package/dist/module/utils/push/libs/callkeep.js.map +0 -1
  189. package/dist/module/utils/push/libs/voipPushNotification.js +0 -11
  190. package/dist/module/utils/push/libs/voipPushNotification.js.map +0 -1
  191. package/dist/module/utils/push/setupIosCallKeepEvents.js +0 -199
  192. package/dist/module/utils/push/setupIosCallKeepEvents.js.map +0 -1
  193. package/dist/typescript/hooks/push/useIosCallkeepWithCallingStateEffect.d.ts +0 -5
  194. package/dist/typescript/hooks/push/useIosCallkeepWithCallingStateEffect.d.ts.map +0 -1
  195. package/dist/typescript/hooks/push/useProcessPushCallEffect.d.ts +0 -8
  196. package/dist/typescript/hooks/push/useProcessPushCallEffect.d.ts.map +0 -1
  197. package/dist/typescript/utils/push/libs/callkeep.d.ts +0 -3
  198. package/dist/typescript/utils/push/libs/callkeep.d.ts.map +0 -1
  199. package/dist/typescript/utils/push/libs/voipPushNotification.d.ts +0 -3
  200. package/dist/typescript/utils/push/libs/voipPushNotification.d.ts.map +0 -1
  201. package/dist/typescript/utils/push/setupIosCallKeepEvents.d.ts +0 -6
  202. package/dist/typescript/utils/push/setupIosCallKeepEvents.d.ts.map +0 -1
  203. package/src/hooks/push/useIosCallkeepWithCallingStateEffect.ts +0 -235
  204. package/src/hooks/push/useProcessPushCallEffect.ts +0 -108
  205. package/src/utils/push/libs/callkeep.ts +0 -16
  206. package/src/utils/push/libs/voipPushNotification.ts +0 -17
  207. package/src/utils/push/setupIosCallKeepEvents.ts +0 -252
@@ -0,0 +1,140 @@
1
+ /***
2
+ * Internal utils for callingx library usage from video-client.
3
+ * See @./registerSDKGlobals.ts for more usage details.
4
+ */
5
+ import { Platform } from 'react-native';
6
+ import { getCallingxLibIfAvailable } from '../../push/libs/callingx';
7
+ import { waitForAudioSessionActivation } from './audioSessionPromise';
8
+ import { CallingState, videoLoggerSystem } from '@stream-io/video-client';
9
+ const CallingxModule = getCallingxLibIfAvailable();
10
+
11
+ /**
12
+ * Gets the call display name. To be used for display in native call screen.
13
+ */
14
+ export function getCallDisplayName(callMembers, participants, currentUserId) {
15
+ if (!callMembers || !participants || !currentUserId) {
16
+ return 'Call';
17
+ }
18
+ let names = [];
19
+ if (callMembers.length > 0) {
20
+ // for ringing calls, members array contains all call members from the very early state and participants array is empty in the beginning
21
+ names = callMembers.filter(member => member.user.id !== currentUserId).map(member => member.user.name).filter(name => name !== undefined);
22
+ } else if (participants.length > 0) {
23
+ // for non-ringing calls, members array is empty and we rely on participants array there
24
+ names = participants.filter(participant => participant.userId !== currentUserId).map(participant => participant.name).filter(Boolean);
25
+ }
26
+
27
+ // if no names are found, we use the name of the current user
28
+ if (names.length === 0) {
29
+ names = [participants.find(participant => participant.userId === currentUserId)?.name ?? 'Call'];
30
+ }
31
+ return names.sort().join(', ');
32
+ }
33
+ function getCallDisplayNameFromCall(call) {
34
+ return call.state.custom?.display_name ?? getCallDisplayName(call.state.members, call.state.participants, call.currentUserId);
35
+ }
36
+ export async function registerOutgoingCall(call) {
37
+ if (!CallingxModule || !CallingxModule.isSetup) {
38
+ return;
39
+ }
40
+ const isOutcomingCall = call.ringing && call.isCreatedByMe;
41
+ if (!isOutcomingCall) {
42
+ return;
43
+ }
44
+ const logger = videoLoggerSystem.getLogger('callingx');
45
+ try {
46
+ logger.debug(`registerOutgoingCall: Registering outgoing call ${call.cid}`);
47
+ await CallingxModule.startCall(call.cid,
48
+ // unique id for call
49
+ call.state.createdBy?.id ?? getCallDisplayNameFromCall(call),
50
+ // handle for native call UI (prefer createdBy user id, fallback to call display name)
51
+ getCallDisplayNameFromCall(call),
52
+ // display name for display in call screen
53
+ call.state.settings?.video?.enabled ?? false // is video call?
54
+ );
55
+ } catch (error) {
56
+ logger.error(`registerOutgoingCall: Error registering outgoing call in callingx: ${call.cid}`, error);
57
+ }
58
+ }
59
+
60
+ /**
61
+ * Starts the call in the callingx library.
62
+ * It is done by client on every join
63
+ * Does either of the following:
64
+ * 1. Sets the state for outgoing calls in the callingx library
65
+ * 2. Displays the incoming call in the callingx library
66
+ * 3. Optionally for non-ringing calls also when ongoing calls are enabled.
67
+ */
68
+ export async function joinCallingxCall(call, activeCalls) {
69
+ if (!CallingxModule || !CallingxModule.isSetup) {
70
+ return;
71
+ }
72
+ const logger = videoLoggerSystem.getLogger('callingx');
73
+ const isOutcomingCall = call.ringing && call.isCreatedByMe;
74
+ const isIncomingCall = call.ringing && !call.isCreatedByMe;
75
+ if (isOutcomingCall || !call.ringing && CallingxModule.isOngoingCallsEnabled) {
76
+ try {
77
+ logger.debug(`joinCallingxCall: Joining call ${call.cid}`);
78
+ await CallingxModule.startCall(call.cid,
79
+ // unique id for call
80
+ call.state.createdBy?.id ?? getCallDisplayNameFromCall(call),
81
+ // handle for native call UI (prefer createdBy user id, fallback to call display name)
82
+ getCallDisplayNameFromCall(call),
83
+ // display name for display in call screen
84
+ call.state.settings?.video?.enabled ?? false // is video call?
85
+ );
86
+
87
+ // Wait for audio session activation on iOS only
88
+ if (Platform.OS === 'ios') {
89
+ await waitForAudioSessionActivation();
90
+ }
91
+ } catch (error) {
92
+ logger.error(`startCallingxCall: Error starting call in callingx: ${call.cid}`, error);
93
+ }
94
+ } else if (isIncomingCall) {
95
+ logger.debug(`joinCallingxCall: Joining incoming call ${call.cid}`);
96
+ try {
97
+ // Leave any existing active ringing calls before joining a new ringing call
98
+ const activeCallsToLeave = activeCalls.filter(c => c.cid !== call.cid && c.ringing && c.state.callingState !== CallingState.LEFT);
99
+ for (const activeCall of activeCallsToLeave) {
100
+ logger.debug(`leaving active call ${activeCall.cid} before joining ${call.cid}`);
101
+ await activeCall.leave({
102
+ reason: 'cancel'
103
+ }).catch(e => {
104
+ logger.error(`failed to leave active call ${activeCall.cid}`, e);
105
+ });
106
+ }
107
+
108
+ // Awaits native CallKit/Telecom registration before answering.
109
+ // Safe to call even if the call is already registered (e.g. from VoIP push) --
110
+ // iOS early-returns with no error, Android sends the registered broadcast.
111
+ await CallingxModule.displayIncomingCall(call.cid,
112
+ // unique id for call
113
+ call.state.createdBy?.id ?? getCallDisplayNameFromCall(call),
114
+ // handle for native call UI (prefer createdBy user id, fallback to call display name)
115
+ getCallDisplayNameFromCall(call),
116
+ // display name for display in call screen
117
+ call.state.settings?.video?.enabled ?? false // is video call?
118
+ );
119
+ await CallingxModule.answerIncomingCall(call.cid);
120
+ if (Platform.OS === 'ios') {
121
+ await waitForAudioSessionActivation();
122
+ }
123
+ } catch (error) {
124
+ logger.error(`Error displaying incoming call in callingx: ${call.cid}`, error);
125
+ }
126
+ }
127
+ }
128
+ export async function endCallingxCall(call, reason) {
129
+ if (!CallingxModule || !CallingxModule.isSetup || !CallingxModule.isCallTracked(call.cid)) {
130
+ return;
131
+ }
132
+ const logger = videoLoggerSystem.getLogger('callingx');
133
+ try {
134
+ logger.debug(`endCallingxCall: Ending call ${call.cid}`);
135
+ await CallingxModule.endCallWithReason(call.cid, reason ?? 'local');
136
+ } catch (error) {
137
+ logger.error(`endCallingxCall: Error ending call in callingx: ${call.cid}`, error);
138
+ }
139
+ }
140
+ //# sourceMappingURL=callingx.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["Platform","getCallingxLibIfAvailable","waitForAudioSessionActivation","CallingState","videoLoggerSystem","CallingxModule","getCallDisplayName","callMembers","participants","currentUserId","names","length","filter","member","user","id","map","name","undefined","participant","userId","Boolean","find","sort","join","getCallDisplayNameFromCall","call","state","custom","display_name","members","registerOutgoingCall","isSetup","isOutcomingCall","ringing","isCreatedByMe","logger","getLogger","debug","cid","startCall","createdBy","settings","video","enabled","error","joinCallingxCall","activeCalls","isIncomingCall","isOngoingCallsEnabled","OS","activeCallsToLeave","c","callingState","LEFT","activeCall","leave","reason","catch","e","displayIncomingCall","answerIncomingCall","endCallingxCall","isCallTracked","endCallWithReason"],"sourceRoot":"../../../../../src","sources":["utils/internal/callingx/callingx.ts"],"mappings":"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","ignoreList":[]}
@@ -1,18 +1,68 @@
1
1
  import { NativeModules, PermissionsAndroid, Platform } from 'react-native';
2
+ import { getCallingxLibIfAvailable } from '../push/libs/callingx';
3
+ import { endCallingxCall, registerOutgoingCall, joinCallingxCall } from './callingx/callingx';
2
4
  const StreamInCallManagerNativeModule = NativeModules.StreamInCallManager;
3
5
  const StreamVideoReactNativeModule = NativeModules.StreamVideoReactNative;
6
+ const CallingxModule = getCallingxLibIfAvailable();
7
+
8
+ /**
9
+ * Checks if StreamInCallManager should be bypassed because CallKit is handling
10
+ * the audio session via CallingX.
11
+ *
12
+ * On iOS, when CallingX is set up and has a registered call, the audio session
13
+ * is managed by CallKit through CallingxImpl.swift.
14
+ * In this case, StreamInCallManager should not run to avoid conflicting audio
15
+ * session configurations.
16
+ */
17
+ const shouldBypassForCallKit = ({
18
+ isRingingTypeCall
19
+ }) => {
20
+ if (Platform.OS !== 'ios') {
21
+ return false;
22
+ }
23
+ if (!CallingxModule) {
24
+ return false;
25
+ }
26
+ const bypass = CallingxModule.isSetup && (isRingingTypeCall || CallingxModule.isOngoingCallsEnabled);
27
+ return bypass;
28
+ };
4
29
  const streamRNVideoSDKGlobals = {
30
+ callingX: {
31
+ joinCall: joinCallingxCall,
32
+ endCall: endCallingxCall,
33
+ registerOutgoingCall: registerOutgoingCall
34
+ },
5
35
  callManager: {
6
36
  setup: ({
7
- defaultDevice
37
+ defaultDevice,
38
+ isRingingTypeCall
8
39
  }) => {
40
+ if (shouldBypassForCallKit({
41
+ isRingingTypeCall
42
+ })) {
43
+ return;
44
+ }
9
45
  StreamInCallManagerNativeModule.setDefaultAudioDeviceEndpointType(defaultDevice);
10
46
  StreamInCallManagerNativeModule.setup();
11
47
  },
12
- start: () => {
48
+ start: ({
49
+ isRingingTypeCall
50
+ }) => {
51
+ if (shouldBypassForCallKit({
52
+ isRingingTypeCall
53
+ })) {
54
+ return;
55
+ }
13
56
  StreamInCallManagerNativeModule.start();
14
57
  },
15
- stop: () => {
58
+ stop: ({
59
+ isRingingTypeCall
60
+ }) => {
61
+ if (shouldBypassForCallKit({
62
+ isRingingTypeCall
63
+ })) {
64
+ return;
65
+ }
16
66
  StreamInCallManagerNativeModule.stop();
17
67
  }
18
68
  },
@@ -1 +1 @@
1
- {"version":3,"names":["NativeModules","PermissionsAndroid","Platform","StreamInCallManagerNativeModule","StreamInCallManager","StreamVideoReactNativeModule","StreamVideoReactNative","streamRNVideoSDKGlobals","callManager","setup","defaultDevice","setDefaultAudioDeviceEndpointType","start","stop","permissions","check","permission","OS","nativeAndroidPermission","PERMISSIONS","CAMERA","RECORD_AUDIO","Boolean","checkPermission","registerSDKGlobals","global","streamRNVideoSDK"],"sourceRoot":"../../../../src","sources":["utils/internal/registerSDKGlobals.ts"],"mappings":"AACA,SAASA,aAAa,EAAEC,kBAAkB,EAAEC,QAAQ,QAAQ,cAAc;AAE1E,MAAMC,+BAA+B,GAAGH,aAAa,CAACI,mBAAmB;AACzE,MAAMC,4BAA4B,GAAGL,aAAa,CAACM,sBAElD;AAED,MAAMC,uBAAgD,GAAG;EACvDC,WAAW,EAAE;IACXC,KAAK,EAAEA,CAAC;MAAEC;IAAc,CAAC,KAAK;MAC5BP,+BAA+B,CAACQ,iCAAiC,CAC/DD,aACF,CAAC;MACDP,+BAA+B,CAACM,KAAK,CAAC,CAAC;IACzC,CAAC;IACDG,KAAK,EAAEA,CAAA,KAAM;MACXT,+BAA+B,CAACS,KAAK,CAAC,CAAC;IACzC,CAAC;IACDC,IAAI,EAAEA,CAAA,KAAM;MACVV,+BAA+B,CAACU,IAAI,CAAC,CAAC;IACxC;EACF,CAAC;EACDC,WAAW,EAAE;IACXC,KAAK,EAAE,MAAOC,UAAU,IAAK;MAC3B,IAAId,QAAQ,CAACe,EAAE,KAAK,SAAS,EAAE;QAC7B,MAAMC,uBAAuB,GAC3BF,UAAU,KAAK,QAAQ,GACnBf,kBAAkB,CAACkB,WAAW,CAACC,MAAM,GACrCnB,kBAAkB,CAACkB,WAAW,CAACE,YAAY;QACjD,OAAOpB,kBAAkB,CAACc,KAAK,CAACG,uBAAuB,CAAC;MAC1D;;MAEA;MACA,OAAOI,OAAO,CACZ,MAAMjB,4BAA4B,CAACkB,eAAe,GAAGP,UAAU,CACjE,CAAC;IACH;EACF;AACF,CAAC;;AAED;AACA;AACA;AACA,OAAO,SAASQ,kBAAkBA,CAAA,EAAG;EACnC,IAAI,CAACC,MAAM,CAACC,gBAAgB,EAAE;IAC5BD,MAAM,CAACC,gBAAgB,GAAGnB,uBAAuB;EACnD;AACF","ignoreList":[]}
1
+ {"version":3,"names":["NativeModules","PermissionsAndroid","Platform","getCallingxLibIfAvailable","endCallingxCall","registerOutgoingCall","joinCallingxCall","StreamInCallManagerNativeModule","StreamInCallManager","StreamVideoReactNativeModule","StreamVideoReactNative","CallingxModule","shouldBypassForCallKit","isRingingTypeCall","OS","bypass","isSetup","isOngoingCallsEnabled","streamRNVideoSDKGlobals","callingX","joinCall","endCall","callManager","setup","defaultDevice","setDefaultAudioDeviceEndpointType","start","stop","permissions","check","permission","nativeAndroidPermission","PERMISSIONS","CAMERA","RECORD_AUDIO","Boolean","checkPermission","registerSDKGlobals","global","streamRNVideoSDK"],"sourceRoot":"../../../../src","sources":["utils/internal/registerSDKGlobals.ts"],"mappings":"AACA,SAASA,aAAa,EAAEC,kBAAkB,EAAEC,QAAQ,QAAQ,cAAc;AAC1E,SAASC,yBAAyB,QAAQ,uBAAuB;AACjE,SACEC,eAAe,EACfC,oBAAoB,EACpBC,gBAAgB,QACX,qBAAqB;AAE5B,MAAMC,+BAA+B,GAAGP,aAAa,CAACQ,mBAAmB;AACzE,MAAMC,4BAA4B,GAAGT,aAAa,CAACU,sBAElD;AAED,MAAMC,cAAc,GAAGR,yBAAyB,CAAC,CAAC;;AAElD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAMS,sBAAsB,GAAGA,CAAC;EAC9BC;AAGF,CAAC,KAAc;EACb,IAAIX,QAAQ,CAACY,EAAE,KAAK,KAAK,EAAE;IACzB,OAAO,KAAK;EACd;EACA,IAAI,CAACH,cAAc,EAAE;IACnB,OAAO,KAAK;EACd;EACA,MAAMI,MAAM,GACVJ,cAAc,CAACK,OAAO,KACrBH,iBAAiB,IAAIF,cAAc,CAACM,qBAAqB,CAAC;EAC7D,OAAOF,MAAM;AACf,CAAC;AAED,MAAMG,uBAAgD,GAAG;EACvDC,QAAQ,EAAE;IACRC,QAAQ,EAAEd,gBAAgB;IAC1Be,OAAO,EAAEjB,eAAe;IACxBC,oBAAoB,EAAEA;EACxB,CAAC;EACDiB,WAAW,EAAE;IACXC,KAAK,EAAEA,CAAC;MAAEC,aAAa;MAAEX;IAAkB,CAAC,KAAK;MAC/C,IAAID,sBAAsB,CAAC;QAAEC;MAAkB,CAAC,CAAC,EAAE;QACjD;MACF;MACAN,+BAA+B,CAACkB,iCAAiC,CAC/DD,aACF,CAAC;MACDjB,+BAA+B,CAACgB,KAAK,CAAC,CAAC;IACzC,CAAC;IACDG,KAAK,EAAEA,CAAC;MAAEb;IAAkB,CAAC,KAAK;MAChC,IAAID,sBAAsB,CAAC;QAAEC;MAAkB,CAAC,CAAC,EAAE;QACjD;MACF;MACAN,+BAA+B,CAACmB,KAAK,CAAC,CAAC;IACzC,CAAC;IACDC,IAAI,EAAEA,CAAC;MAAEd;IAAkB,CAAC,KAAK;MAC/B,IAAID,sBAAsB,CAAC;QAAEC;MAAkB,CAAC,CAAC,EAAE;QACjD;MACF;MACAN,+BAA+B,CAACoB,IAAI,CAAC,CAAC;IACxC;EACF,CAAC;EACDC,WAAW,EAAE;IACXC,KAAK,EAAE,MAAOC,UAAU,IAAK;MAC3B,IAAI5B,QAAQ,CAACY,EAAE,KAAK,SAAS,EAAE;QAC7B,MAAMiB,uBAAuB,GAC3BD,UAAU,KAAK,QAAQ,GACnB7B,kBAAkB,CAAC+B,WAAW,CAACC,MAAM,GACrChC,kBAAkB,CAAC+B,WAAW,CAACE,YAAY;QACjD,OAAOjC,kBAAkB,CAAC4B,KAAK,CAACE,uBAAuB,CAAC;MAC1D;;MAEA;MACA,OAAOI,OAAO,CACZ,MAAM1B,4BAA4B,CAAC2B,eAAe,GAAGN,UAAU,CACjE,CAAC;IACH;EACF;AACF,CAAC;;AAED;AACA;AACA;AACA,OAAO,SAASO,kBAAkBA,CAAA,EAAG;EACnC,IAAI,CAACC,MAAM,CAACC,gBAAgB,EAAE;IAC5BD,MAAM,CAACC,gBAAgB,GAAGrB,uBAAuB;EACnD;AACF","ignoreList":[]}
@@ -0,0 +1,42 @@
1
+ import { AppRegistry, Platform } from 'react-native';
2
+ import { videoLoggerSystem } from '@stream-io/video-client';
3
+ import { StreamVideoRN } from './StreamVideoRN';
4
+ export const KEEP_CALL_ALIVE_HEADLESS_TASK_NAME = 'StreamVideoKeepCallAlive';
5
+
6
+ /**
7
+ * The keep-alive headless task needs access to the active `Call` instance.
8
+ * The keep-alive hook will set this reference before starting the native service.
9
+ */
10
+ export const keepCallAliveCallRef = {
11
+ current: undefined
12
+ };
13
+ function registerKeepCallAliveHeadlessTaskOnce() {
14
+ if (Platform.OS !== 'android') return;
15
+ AppRegistry.registerHeadlessTask(KEEP_CALL_ALIVE_HEADLESS_TASK_NAME, () => async data => {
16
+ const logger = videoLoggerSystem.getLogger('KEEP_CALL_ALIVE_HEADLESS_TASK');
17
+ const callCid = data?.callCid;
18
+ const call = keepCallAliveCallRef.current;
19
+ if (!call) {
20
+ logger.warn('No active call instance available for keep-alive task; skipping.', {
21
+ callCid
22
+ });
23
+ return;
24
+ }
25
+ if (callCid && call.cid && call.cid !== callCid) {
26
+ logger.warn('Keep-alive task callCid does not match active call; skipping.', {
27
+ callCid,
28
+ activeCallCid: call.cid
29
+ });
30
+ return;
31
+ }
32
+ const config = StreamVideoRN.getConfig();
33
+ const taskToRun = config.foregroundService.android.taskToRun;
34
+ try {
35
+ await taskToRun(call);
36
+ } catch (e) {
37
+ logger.error('Keep-alive headless task failed', e);
38
+ }
39
+ });
40
+ }
41
+ registerKeepCallAliveHeadlessTaskOnce();
42
+ //# sourceMappingURL=keepCallAliveHeadlessTask.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["AppRegistry","Platform","videoLoggerSystem","StreamVideoRN","KEEP_CALL_ALIVE_HEADLESS_TASK_NAME","keepCallAliveCallRef","current","undefined","registerKeepCallAliveHeadlessTaskOnce","OS","registerHeadlessTask","data","logger","getLogger","callCid","call","warn","cid","activeCallCid","config","getConfig","taskToRun","foregroundService","android","e","error"],"sourceRoot":"../../../src","sources":["utils/keepCallAliveHeadlessTask.ts"],"mappings":"AAAA,SAASA,WAAW,EAAEC,QAAQ,QAAQ,cAAc;AAEpD,SAASC,iBAAiB,QAAQ,yBAAyB;AAC3D,SAASC,aAAa,QAAQ,iBAAiB;AAE/C,OAAO,MAAMC,kCAAkC,GAAG,0BAA0B;;AAE5E;AACA;AACA;AACA;AACA,OAAO,MAAMC,oBAAmD,GAAG;EACjEC,OAAO,EAAEC;AACX,CAAC;AAED,SAASC,qCAAqCA,CAAA,EAAG;EAC/C,IAAIP,QAAQ,CAACQ,EAAE,KAAK,SAAS,EAAE;EAE/BT,WAAW,CAACU,oBAAoB,CAC9BN,kCAAkC,EAClC,MAAM,MAAOO,IAAsC,IAAK;IACtD,MAAMC,MAAM,GAAGV,iBAAiB,CAACW,SAAS,CACxC,+BACF,CAAC;IACD,MAAMC,OAAO,GAAGH,IAAI,EAAEG,OAAO;IAE7B,MAAMC,IAAI,GAAGV,oBAAoB,CAACC,OAAO;IACzC,IAAI,CAACS,IAAI,EAAE;MACTH,MAAM,CAACI,IAAI,CACT,kEAAkE,EAClE;QAAEF;MAAQ,CACZ,CAAC;MACD;IACF;IACA,IAAIA,OAAO,IAAIC,IAAI,CAACE,GAAG,IAAIF,IAAI,CAACE,GAAG,KAAKH,OAAO,EAAE;MAC/CF,MAAM,CAACI,IAAI,CACT,+DAA+D,EAC/D;QAAEF,OAAO;QAAEI,aAAa,EAAEH,IAAI,CAACE;MAAI,CACrC,CAAC;MACD;IACF;IAEA,MAAME,MAAM,GAAGhB,aAAa,CAACiB,SAAS,CAAC,CAAC;IACxC,MAAMC,SAAS,GAAGF,MAAM,CAACG,iBAAiB,CAACC,OAAO,CAACF,SAAS;IAC5D,IAAI;MACF,MAAMA,SAAS,CAACN,IAAI,CAAC;IACvB,CAAC,CAAC,OAAOS,CAAC,EAAE;MACVZ,MAAM,CAACa,KAAK,CAAC,iCAAiC,EAAED,CAAC,CAAC;IACpD;EACF,CACF,CAAC;AACH;AAEAhB,qCAAqC,CAAC,CAAC","ignoreList":[]}