@stream-io/video-react-native-sdk 1.30.0 → 1.30.1-beta.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.
- package/android/src/main/AndroidManifest.xml +8 -1
- package/android/src/main/AndroidManifestNew.xml +11 -0
- package/android/src/main/java/com/streamvideo/reactnative/StreamVideoReactNativeModule.kt +42 -5
- package/android/src/main/java/com/streamvideo/reactnative/audio/utils/WebRtcAudioUtils.kt +70 -6
- package/android/src/main/java/com/streamvideo/reactnative/callmanager/StreamInCallManagerModule.kt +6 -4
- package/android/src/main/java/com/streamvideo/reactnative/keepalive/KeepAliveNotification.kt +83 -0
- package/android/src/main/java/com/streamvideo/reactnative/keepalive/StreamCallKeepAliveHeadlessService.kt +149 -0
- package/dist/commonjs/hooks/push/index.js +0 -2
- package/dist/commonjs/hooks/push/index.js.map +1 -1
- package/dist/commonjs/hooks/push/useCallingExpWithCallingStateEffect.js +121 -0
- package/dist/commonjs/hooks/push/useCallingExpWithCallingStateEffect.js.map +1 -0
- package/dist/commonjs/hooks/push/useIosVoipPushEventsSetupEffect.js +18 -31
- package/dist/commonjs/hooks/push/useIosVoipPushEventsSetupEffect.js.map +1 -1
- package/dist/commonjs/hooks/useAndroidKeepCallAliveEffect.js +64 -97
- package/dist/commonjs/hooks/useAndroidKeepCallAliveEffect.js.map +1 -1
- package/dist/commonjs/index.js +1 -0
- package/dist/commonjs/index.js.map +1 -1
- package/dist/commonjs/modules/call-manager/CallManager.js +26 -0
- package/dist/commonjs/modules/call-manager/CallManager.js.map +1 -1
- package/dist/commonjs/providers/StreamCall/index.js +6 -6
- package/dist/commonjs/providers/StreamCall/index.js.map +1 -1
- package/dist/commonjs/utils/StreamVideoRN/index.js +33 -21
- package/dist/commonjs/utils/StreamVideoRN/index.js.map +1 -1
- package/dist/commonjs/utils/internal/callingx/audioSessionPromise.js +68 -0
- package/dist/commonjs/utils/internal/callingx/audioSessionPromise.js.map +1 -0
- package/dist/commonjs/utils/internal/callingx/callingx.js +123 -0
- package/dist/commonjs/utils/internal/callingx/callingx.js.map +1 -0
- package/dist/commonjs/utils/internal/registerSDKGlobals.js +52 -3
- package/dist/commonjs/utils/internal/registerSDKGlobals.js.map +1 -1
- package/dist/commonjs/utils/keepCallAliveHeadlessTask.js +48 -0
- package/dist/commonjs/utils/keepCallAliveHeadlessTask.js.map +1 -0
- package/dist/commonjs/utils/push/android.js +135 -202
- package/dist/commonjs/utils/push/android.js.map +1 -1
- package/dist/commonjs/utils/push/internal/ios.js +17 -34
- package/dist/commonjs/utils/push/internal/ios.js.map +1 -1
- package/dist/commonjs/utils/push/internal/rxSubjects.js +1 -45
- package/dist/commonjs/utils/push/internal/rxSubjects.js.map +1 -1
- package/dist/commonjs/utils/push/internal/utils.js +67 -52
- package/dist/commonjs/utils/push/internal/utils.js.map +1 -1
- package/dist/commonjs/utils/push/ios.js.map +1 -1
- package/dist/commonjs/utils/push/libs/callingx.js +78 -0
- package/dist/commonjs/utils/push/libs/callingx.js.map +1 -0
- package/dist/commonjs/utils/push/libs/index.js +8 -19
- package/dist/commonjs/utils/push/libs/index.js.map +1 -1
- package/dist/commonjs/utils/push/libs/notifee/index.js +0 -19
- package/dist/commonjs/utils/push/libs/notifee/index.js.map +1 -1
- package/dist/commonjs/utils/push/setupCallingExpEvents.js +105 -0
- package/dist/commonjs/utils/push/setupCallingExpEvents.js.map +1 -0
- package/dist/commonjs/utils/push/setupIosVoipPushEvents.js +7 -6
- package/dist/commonjs/utils/push/setupIosVoipPushEvents.js.map +1 -1
- package/dist/commonjs/version.js +1 -1
- package/dist/commonjs/version.js.map +1 -1
- package/dist/module/hooks/push/index.js +0 -2
- package/dist/module/hooks/push/index.js.map +1 -1
- package/dist/module/hooks/push/useCallingExpWithCallingStateEffect.js +114 -0
- package/dist/module/hooks/push/useCallingExpWithCallingStateEffect.js.map +1 -0
- package/dist/module/hooks/push/useIosVoipPushEventsSetupEffect.js +18 -31
- package/dist/module/hooks/push/useIosVoipPushEventsSetupEffect.js.map +1 -1
- package/dist/module/hooks/useAndroidKeepCallAliveEffect.js +66 -99
- package/dist/module/hooks/useAndroidKeepCallAliveEffect.js.map +1 -1
- package/dist/module/index.js +1 -0
- package/dist/module/index.js.map +1 -1
- package/dist/module/modules/call-manager/CallManager.js +26 -0
- package/dist/module/modules/call-manager/CallManager.js.map +1 -1
- package/dist/module/providers/StreamCall/index.js +6 -6
- package/dist/module/providers/StreamCall/index.js.map +1 -1
- package/dist/module/utils/StreamVideoRN/index.js +33 -21
- package/dist/module/utils/StreamVideoRN/index.js.map +1 -1
- package/dist/module/utils/internal/callingx/audioSessionPromise.js +61 -0
- package/dist/module/utils/internal/callingx/audioSessionPromise.js.map +1 -0
- package/dist/module/utils/internal/callingx/callingx.js +114 -0
- package/dist/module/utils/internal/callingx/callingx.js.map +1 -0
- package/dist/module/utils/internal/registerSDKGlobals.js +52 -3
- package/dist/module/utils/internal/registerSDKGlobals.js.map +1 -1
- package/dist/module/utils/keepCallAliveHeadlessTask.js +42 -0
- package/dist/module/utils/keepCallAliveHeadlessTask.js.map +1 -0
- package/dist/module/utils/push/android.js +137 -204
- package/dist/module/utils/push/android.js.map +1 -1
- package/dist/module/utils/push/internal/ios.js +17 -34
- package/dist/module/utils/push/internal/ios.js.map +1 -1
- package/dist/module/utils/push/internal/rxSubjects.js +0 -44
- package/dist/module/utils/push/internal/rxSubjects.js.map +1 -1
- package/dist/module/utils/push/internal/utils.js +63 -49
- package/dist/module/utils/push/internal/utils.js.map +1 -1
- package/dist/module/utils/push/ios.js.map +1 -1
- package/dist/module/utils/push/libs/callingx.js +70 -0
- package/dist/module/utils/push/libs/callingx.js.map +1 -0
- package/dist/module/utils/push/libs/index.js +1 -2
- package/dist/module/utils/push/libs/index.js.map +1 -1
- package/dist/module/utils/push/libs/notifee/index.js +0 -18
- package/dist/module/utils/push/libs/notifee/index.js.map +1 -1
- package/dist/module/utils/push/setupCallingExpEvents.js +99 -0
- package/dist/module/utils/push/setupCallingExpEvents.js.map +1 -0
- package/dist/module/utils/push/setupIosVoipPushEvents.js +7 -6
- package/dist/module/utils/push/setupIosVoipPushEvents.js.map +1 -1
- package/dist/module/version.js +1 -1
- package/dist/module/version.js.map +1 -1
- package/dist/typescript/hooks/push/index.d.ts.map +1 -1
- package/dist/typescript/hooks/push/useCallingExpWithCallingStateEffect.d.ts +5 -0
- package/dist/typescript/hooks/push/useCallingExpWithCallingStateEffect.d.ts.map +1 -0
- package/dist/typescript/hooks/push/useIosVoipPushEventsSetupEffect.d.ts.map +1 -1
- package/dist/typescript/hooks/useAndroidKeepCallAliveEffect.d.ts.map +1 -1
- package/dist/typescript/index.d.ts +1 -0
- package/dist/typescript/index.d.ts.map +1 -1
- package/dist/typescript/modules/call-manager/CallManager.d.ts +5 -0
- package/dist/typescript/modules/call-manager/CallManager.d.ts.map +1 -1
- package/dist/typescript/utils/StreamVideoRN/index.d.ts +20 -2
- package/dist/typescript/utils/StreamVideoRN/index.d.ts.map +1 -1
- package/dist/typescript/utils/StreamVideoRN/types.d.ts +63 -25
- package/dist/typescript/utils/StreamVideoRN/types.d.ts.map +1 -1
- package/dist/typescript/utils/internal/callingx/audioSessionPromise.d.ts +16 -0
- package/dist/typescript/utils/internal/callingx/audioSessionPromise.d.ts.map +1 -0
- package/dist/typescript/utils/internal/callingx/callingx.d.ts +17 -0
- package/dist/typescript/utils/internal/callingx/callingx.d.ts.map +1 -0
- package/dist/typescript/utils/internal/registerSDKGlobals.d.ts.map +1 -1
- package/dist/typescript/utils/keepCallAliveHeadlessTask.d.ts +10 -0
- package/dist/typescript/utils/keepCallAliveHeadlessTask.d.ts.map +1 -0
- package/dist/typescript/utils/push/android.d.ts +1 -2
- package/dist/typescript/utils/push/android.d.ts.map +1 -1
- package/dist/typescript/utils/push/internal/ios.d.ts.map +1 -1
- package/dist/typescript/utils/push/internal/rxSubjects.d.ts +0 -33
- package/dist/typescript/utils/push/internal/rxSubjects.d.ts.map +1 -1
- package/dist/typescript/utils/push/internal/utils.d.ts +14 -8
- package/dist/typescript/utils/push/internal/utils.d.ts.map +1 -1
- package/dist/typescript/utils/push/ios.d.ts +1 -2
- package/dist/typescript/utils/push/ios.d.ts.map +1 -1
- package/dist/typescript/utils/push/libs/callingx.d.ts +9 -0
- package/dist/typescript/utils/push/libs/callingx.d.ts.map +1 -0
- package/dist/typescript/utils/push/libs/index.d.ts +1 -2
- package/dist/typescript/utils/push/libs/index.d.ts.map +1 -1
- package/dist/typescript/utils/push/libs/notifee/index.d.ts +0 -1
- package/dist/typescript/utils/push/libs/notifee/index.d.ts.map +1 -1
- package/dist/typescript/utils/push/setupCallingExpEvents.d.ts +8 -0
- package/dist/typescript/utils/push/setupCallingExpEvents.d.ts.map +1 -0
- package/dist/typescript/utils/push/setupIosVoipPushEvents.d.ts.map +1 -1
- package/dist/typescript/version.d.ts +1 -1
- package/dist/typescript/version.d.ts.map +1 -1
- package/expo-config-plugin/dist/withAndroidManifest.js +1 -33
- package/expo-config-plugin/dist/withAndroidPermissions.js +2 -7
- package/expo-config-plugin/dist/withAppDelegate.js +19 -197
- package/expo-config-plugin/dist/withMainActivity.js +1 -1
- package/expo-config-plugin/dist/withiOSInfoPlist.js +2 -3
- package/ios/StreamInCallManager.m +2 -0
- package/ios/StreamInCallManager.swift +19 -7
- package/ios/StreamVideoReactNative.h +7 -4
- package/ios/StreamVideoReactNative.m +189 -82
- package/package.json +13 -18
- package/src/hooks/push/index.ts +0 -2
- package/src/hooks/push/useCallingExpWithCallingStateEffect.ts +147 -0
- package/src/hooks/push/useIosVoipPushEventsSetupEffect.ts +21 -34
- package/src/hooks/useAndroidKeepCallAliveEffect.ts +94 -120
- package/src/index.ts +1 -0
- package/src/modules/call-manager/CallManager.ts +36 -0
- package/src/modules/call-manager/native-module.d.ts +7 -0
- package/src/providers/StreamCall/index.tsx +6 -6
- package/src/utils/StreamVideoRN/index.ts +40 -30
- package/src/utils/StreamVideoRN/types.ts +65 -25
- package/src/utils/internal/callingx/audioSessionPromise.ts +65 -0
- package/src/utils/internal/callingx/callingx.ts +165 -0
- package/src/utils/internal/registerSDKGlobals.ts +47 -4
- package/src/utils/keepCallAliveHeadlessTask.ts +54 -0
- package/src/utils/push/android.ts +196 -311
- package/src/utils/push/internal/ios.ts +28 -44
- package/src/utils/push/internal/rxSubjects.ts +0 -61
- package/src/utils/push/internal/utils.ts +104 -63
- package/src/utils/push/ios.ts +1 -6
- package/src/utils/push/libs/callingx.ts +93 -0
- package/src/utils/push/libs/index.ts +1 -2
- package/src/utils/push/libs/notifee/index.ts +0 -27
- package/src/utils/push/setupCallingExpEvents.ts +135 -0
- package/src/utils/push/setupIosVoipPushEvents.ts +11 -7
- package/src/version.ts +1 -1
- package/android/src/main/java/com/streamvideo/reactnative/util/CallAliveServiceChecker.kt +0 -95
- package/dist/commonjs/hooks/push/useIosCallkeepWithCallingStateEffect.js +0 -160
- package/dist/commonjs/hooks/push/useIosCallkeepWithCallingStateEffect.js.map +0 -1
- package/dist/commonjs/hooks/push/useProcessPushCallEffect.js +0 -67
- package/dist/commonjs/hooks/push/useProcessPushCallEffect.js.map +0 -1
- package/dist/commonjs/utils/push/libs/callkeep.js +0 -17
- package/dist/commonjs/utils/push/libs/callkeep.js.map +0 -1
- package/dist/commonjs/utils/push/libs/voipPushNotification.js +0 -17
- package/dist/commonjs/utils/push/libs/voipPushNotification.js.map +0 -1
- package/dist/commonjs/utils/push/setupIosCallKeepEvents.js +0 -205
- package/dist/commonjs/utils/push/setupIosCallKeepEvents.js.map +0 -1
- package/dist/module/hooks/push/useIosCallkeepWithCallingStateEffect.js +0 -153
- package/dist/module/hooks/push/useIosCallkeepWithCallingStateEffect.js.map +0 -1
- package/dist/module/hooks/push/useProcessPushCallEffect.js +0 -60
- package/dist/module/hooks/push/useProcessPushCallEffect.js.map +0 -1
- package/dist/module/utils/push/libs/callkeep.js +0 -11
- package/dist/module/utils/push/libs/callkeep.js.map +0 -1
- package/dist/module/utils/push/libs/voipPushNotification.js +0 -11
- package/dist/module/utils/push/libs/voipPushNotification.js.map +0 -1
- package/dist/module/utils/push/setupIosCallKeepEvents.js +0 -199
- package/dist/module/utils/push/setupIosCallKeepEvents.js.map +0 -1
- package/dist/typescript/hooks/push/useIosCallkeepWithCallingStateEffect.d.ts +0 -5
- package/dist/typescript/hooks/push/useIosCallkeepWithCallingStateEffect.d.ts.map +0 -1
- package/dist/typescript/hooks/push/useProcessPushCallEffect.d.ts +0 -8
- package/dist/typescript/hooks/push/useProcessPushCallEffect.d.ts.map +0 -1
- package/dist/typescript/utils/push/libs/callkeep.d.ts +0 -3
- package/dist/typescript/utils/push/libs/callkeep.d.ts.map +0 -1
- package/dist/typescript/utils/push/libs/voipPushNotification.d.ts +0 -3
- package/dist/typescript/utils/push/libs/voipPushNotification.d.ts.map +0 -1
- package/dist/typescript/utils/push/setupIosCallKeepEvents.d.ts +0 -6
- package/dist/typescript/utils/push/setupIosCallKeepEvents.d.ts.map +0 -1
- package/src/hooks/push/useIosCallkeepWithCallingStateEffect.ts +0 -235
- package/src/hooks/push/useProcessPushCallEffect.ts +0 -108
- package/src/utils/push/libs/callkeep.ts +0 -16
- package/src/utils/push/libs/voipPushNotification.ts +0 -17
- package/src/utils/push/setupIosCallKeepEvents.ts +0 -252
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["videoLoggerSystem","logger","getLogger","pendingResolve","pendingTimeout","resolveSetTime","isAudioSessionAlreadyActivated","AUDIO_SESSION_TIMEOUT_MS","waitForAudioSessionActivation","Promise","resolve","Date","now","setTimeout","debug","resolvePendingAudioSession","clearTimeout","elapsedTime"],"sourceRoot":"../../../../../src","sources":["utils/internal/callingx/audioSessionPromise.ts"],"mappings":"AAAA;AACA;AACA;AACA;;AAEA,SAASA,iBAAiB,QAAQ,yBAAyB;AAE3D,MAAMC,MAAM,GAAGD,iBAAiB,CAACE,SAAS,CAAC,UAAU,CAAC;AAEtD,IAAIC,cAAmC,GAAG,IAAI;AAC9C,IAAIC,cAAoD,GAAG,IAAI;AAC/D,IAAIC,cAA6B,GAAG,IAAI;AACxC;AACA;AACA;AACA;AACA,IAAIC,8BAA8B,GAAG,KAAK;AAE1C,MAAMC,wBAAwB,GAAG,IAAI;;AAErC;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,6BAA6BA,CAAA,EAAkB;EAC7D,IAAIF,8BAA8B,EAAE;IAClCA,8BAA8B,GAAG,KAAK;IACtC,OAAOG,OAAO,CAACC,OAAO,CAAC,CAAC;EAC1B;EAEAL,cAAc,GAAGM,IAAI,CAACC,GAAG,CAAC,CAAC;EAC3B,OAAO,IAAIH,OAAO,CAAEC,OAAO,IAAK;IAC9BP,cAAc,GAAGO,OAAO;IACxBN,cAAc,GAAGS,UAAU,CAAC,MAAM;MAChC;MACAZ,MAAM,CAACa,KAAK,CAAC,+BAA+B,CAAC;MAC7CC,0BAA0B,CAAC,CAAC;IAC9B,CAAC,EAAER,wBAAwB,CAAC;EAC9B,CAAC,CAAC;AACJ;;AAEA;AACA;AACA;AACA;AACA,OAAO,SAASQ,0BAA0BA,CAAA,EAAS;EACjD,IAAIX,cAAc,EAAE;IAClBY,YAAY,CAACZ,cAAc,CAAC;IAC5BA,cAAc,GAAG,IAAI;EACvB;EAEA,IAAID,cAAc,EAAE;IAClBA,cAAc,CAAC,CAAC;IAChB,IAAIE,cAAc,EAAE;MAClB,MAAMY,WAAW,GAAGN,IAAI,CAACC,GAAG,CAAC,CAAC,GAAGP,cAAc;MAC/CA,cAAc,GAAG,IAAI;MACrBJ,MAAM,CAACa,KAAK,CAAC,mCAAmCG,WAAW,IAAI,CAAC;IAClE;IACAd,cAAc,GAAG,IAAI;IACrBG,8BAA8B,GAAG,KAAK;EACxC,CAAC,MAAM;IACLA,8BAA8B,GAAG,IAAI;EACvC;AACF","ignoreList":[]}
|
|
@@ -0,0 +1,114 @@
|
|
|
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
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Starts the call in the callingx library.
|
|
36
|
+
* It is done by client on every join
|
|
37
|
+
* Does either of the following:
|
|
38
|
+
* 1. Sets the state for outgoing calls in the callingx library
|
|
39
|
+
* 2. Displays the incoming call in the callingx library
|
|
40
|
+
* 3. Optionally for non-ringing calls also when ongoing calls are enabled.
|
|
41
|
+
*/
|
|
42
|
+
export async function startCallingxCall(call, activeCalls) {
|
|
43
|
+
if (!CallingxModule || !CallingxModule.isSetup) {
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
const logger = videoLoggerSystem.getLogger('callingx');
|
|
47
|
+
const isOutcomingCall = call.ringing && call.isCreatedByMe;
|
|
48
|
+
const isIncomingCall = call.ringing && !call.isCreatedByMe;
|
|
49
|
+
const callDisplayName = getCallDisplayName(call.state.members, call.state.participants, call.currentUserId);
|
|
50
|
+
if (!CallingxModule.isCallTracked(call.cid) && (isOutcomingCall || !call.ringing && CallingxModule.isOngoingCallsEnabled)) {
|
|
51
|
+
try {
|
|
52
|
+
await CallingxModule.startCall(call.cid,
|
|
53
|
+
// unique id for call
|
|
54
|
+
call.id,
|
|
55
|
+
// phone number for display in dialer (we use call id as phone number)
|
|
56
|
+
callDisplayName,
|
|
57
|
+
// display name for display in call screen
|
|
58
|
+
call.state.settings?.video?.enabled ?? false // is video call?
|
|
59
|
+
);
|
|
60
|
+
|
|
61
|
+
// Wait for audio session activation on iOS only
|
|
62
|
+
if (Platform.OS === 'ios') {
|
|
63
|
+
await waitForAudioSessionActivation();
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// TODO: this must be done after join call is complete
|
|
67
|
+
CallingxModule.setCurrentCallActive(call.cid);
|
|
68
|
+
} catch (error) {
|
|
69
|
+
logger.error(`startCallingxCall: Error starting call in callingx: ${call.cid}`, error);
|
|
70
|
+
}
|
|
71
|
+
} else if (isIncomingCall) {
|
|
72
|
+
try {
|
|
73
|
+
// Leave any existing active ringing calls before joining a new ringing call
|
|
74
|
+
const activeCallsToLeave = activeCalls.filter(c => c.cid !== call.cid && c.ringing && c.state.callingState !== CallingState.LEFT);
|
|
75
|
+
for (const activeCall of activeCallsToLeave) {
|
|
76
|
+
logger.debug(`leaving active call ${activeCall.cid} before joining ${call.cid}`);
|
|
77
|
+
await activeCall.leave({
|
|
78
|
+
reason: 'cancel'
|
|
79
|
+
}).catch(e => {
|
|
80
|
+
logger.error(`failed to leave active call ${activeCall.cid}`, e);
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// Awaits native CallKit/Telecom registration before answering.
|
|
85
|
+
// Safe to call even if the call is already registered (e.g. from VoIP push) --
|
|
86
|
+
// iOS early-returns with no error, Android sends the registered broadcast.
|
|
87
|
+
await CallingxModule.displayIncomingCall(call.cid,
|
|
88
|
+
// unique id for call
|
|
89
|
+
call.id,
|
|
90
|
+
// phone number for display in dialer (we use call id as phone number)
|
|
91
|
+
callDisplayName,
|
|
92
|
+
// display name for display in call screen
|
|
93
|
+
call.state.settings?.video?.enabled ?? false // is video call?
|
|
94
|
+
);
|
|
95
|
+
await CallingxModule.answerIncomingCall(call.cid);
|
|
96
|
+
if (Platform.OS === 'ios') {
|
|
97
|
+
await waitForAudioSessionActivation();
|
|
98
|
+
}
|
|
99
|
+
} catch (error) {
|
|
100
|
+
logger.error(`Error displaying incoming call in callingx: ${call.cid}`, error);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
export async function endCallingxCall(call, reason) {
|
|
105
|
+
if (!CallingxModule || !CallingxModule.isSetup || !CallingxModule.isCallTracked(call.cid)) {
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
try {
|
|
109
|
+
await CallingxModule.endCallWithReason(call.cid, reason ?? 'local');
|
|
110
|
+
} catch (error) {
|
|
111
|
+
videoLoggerSystem.getLogger('callingx').error(`endCallingxCall: Error ending call in callingx: ${call.cid}`, error);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
//# 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","startCallingxCall","call","activeCalls","isSetup","logger","getLogger","isOutcomingCall","ringing","isCreatedByMe","isIncomingCall","callDisplayName","state","members","isCallTracked","cid","isOngoingCallsEnabled","startCall","settings","video","enabled","OS","setCurrentCallActive","error","activeCallsToLeave","c","callingState","LEFT","activeCall","debug","leave","reason","catch","e","displayIncomingCall","answerIncomingCall","endCallingxCall","endCallWithReason"],"sourceRoot":"../../../../../src","sources":["utils/internal/callingx/callingx.ts"],"mappings":"AAAA;AACA;AACA;AACA;AACA,SAASA,QAAQ,QAAQ,cAAc;AAEvC,SAASC,yBAAyB,QAAQ,0BAA0B;AACpE,SAASC,6BAA6B,QAAQ,uBAAuB;AAMrE,SAASC,YAAY,EAAEC,iBAAiB,QAAQ,yBAAyB;AACzE,MAAMC,cAAc,GAAGJ,yBAAyB,CAAC,CAAC;;AAElD;AACA;AACA;AACA,OAAO,SAASK,kBAAkBA,CAChCC,WAAyC,EACzCC,YAAkD,EAClDC,aAAiC,EACjC;EACA,IAAI,CAACF,WAAW,IAAI,CAACC,YAAY,IAAI,CAACC,aAAa,EAAE;IACnD,OAAO,MAAM;EACf;EAEA,IAAIC,KAAe,GAAG,EAAE;EAExB,IAAIH,WAAW,CAACI,MAAM,GAAG,CAAC,EAAE;IAC1B;IACAD,KAAK,GAAGH,WAAW,CAChBK,MAAM,CAAEC,MAAM,IAAKA,MAAM,CAACC,IAAI,CAACC,EAAE,KAAKN,aAAa,CAAC,CACpDO,GAAG,CAAEH,MAAM,IAAKA,MAAM,CAACC,IAAI,CAACG,IAAI,CAAC,CACjCL,MAAM,CAAEK,IAAI,IAAqBA,IAAI,KAAKC,SAAS,CAAC;EACzD,CAAC,MAAM,IAAIV,YAAY,CAACG,MAAM,GAAG,CAAC,EAAE;IAClC;IACAD,KAAK,GAAGF,YAAY,CACjBI,MAAM,CAAEO,WAAW,IAAKA,WAAW,CAACC,MAAM,KAAKX,aAAa,CAAC,CAC7DO,GAAG,CAAEG,WAAW,IAAKA,WAAW,CAACF,IAAI,CAAC,CACtCL,MAAM,CAACS,OAAO,CAAC;EACpB;;EAEA;EACA,IAAIX,KAAK,CAACC,MAAM,KAAK,CAAC,EAAE;IACtBD,KAAK,GAAG,CACNF,YAAY,CAACc,IAAI,CAAEH,WAAW,IAAKA,WAAW,CAACC,MAAM,KAAKX,aAAa,CAAC,EACpEQ,IAAI,IAAI,MAAM,CACnB;EACH;EAEA,OAAOP,KAAK,CAACa,IAAI,CAAC,CAAC,CAACC,IAAI,CAAC,IAAI,CAAC;AAChC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,eAAeC,iBAAiBA,CAACC,IAAU,EAAEC,WAAmB,EAAE;EACvE,IAAI,CAACtB,cAAc,IAAI,CAACA,cAAc,CAACuB,OAAO,EAAE;IAC9C;EACF;EAEA,MAAMC,MAAM,GAAGzB,iBAAiB,CAAC0B,SAAS,CAAC,UAAU,CAAC;EACtD,MAAMC,eAAe,GAAGL,IAAI,CAACM,OAAO,IAAIN,IAAI,CAACO,aAAa;EAC1D,MAAMC,cAAc,GAAGR,IAAI,CAACM,OAAO,IAAI,CAACN,IAAI,CAACO,aAAa;EAE1D,MAAME,eAAe,GAAG7B,kBAAkB,CACxCoB,IAAI,CAACU,KAAK,CAACC,OAAO,EAClBX,IAAI,CAACU,KAAK,CAAC5B,YAAY,EACvBkB,IAAI,CAACjB,aACP,CAAC;EAED,IACE,CAACJ,cAAc,CAACiC,aAAa,CAACZ,IAAI,CAACa,GAAG,CAAC,KACtCR,eAAe,IAAK,CAACL,IAAI,CAACM,OAAO,IAAI3B,cAAc,CAACmC,qBAAsB,CAAC,EAC5E;IACA,IAAI;MACF,MAAMnC,cAAc,CAACoC,SAAS,CAC5Bf,IAAI,CAACa,GAAG;MAAE;MACVb,IAAI,CAACX,EAAE;MAAE;MACToB,eAAe;MAAE;MACjBT,IAAI,CAACU,KAAK,CAACM,QAAQ,EAAEC,KAAK,EAAEC,OAAO,IAAI,KAAK,CAAE;MAChD,CAAC;;MAED;MACA,IAAI5C,QAAQ,CAAC6C,EAAE,KAAK,KAAK,EAAE;QACzB,MAAM3C,6BAA6B,CAAC,CAAC;MACvC;;MAEA;MACAG,cAAc,CAACyC,oBAAoB,CAACpB,IAAI,CAACa,GAAG,CAAC;IAC/C,CAAC,CAAC,OAAOQ,KAAK,EAAE;MACdlB,MAAM,CAACkB,KAAK,CACV,uDAAuDrB,IAAI,CAACa,GAAG,EAAE,EACjEQ,KACF,CAAC;IACH;EACF,CAAC,MAAM,IAAIb,cAAc,EAAE;IACzB,IAAI;MACF;MACA,MAAMc,kBAAkB,GAAGrB,WAAW,CAACf,MAAM,CAC1CqC,CAAC,IACAA,CAAC,CAACV,GAAG,KAAKb,IAAI,CAACa,GAAG,IAClBU,CAAC,CAACjB,OAAO,IACTiB,CAAC,CAACb,KAAK,CAACc,YAAY,KAAK/C,YAAY,CAACgD,IAC1C,CAAC;MACD,KAAK,MAAMC,UAAU,IAAIJ,kBAAkB,EAAE;QAC3CnB,MAAM,CAACwB,KAAK,CACV,uBAAuBD,UAAU,CAACb,GAAG,mBAAmBb,IAAI,CAACa,GAAG,EAClE,CAAC;QACD,MAAMa,UAAU,CAACE,KAAK,CAAC;UAAEC,MAAM,EAAE;QAAS,CAAC,CAAC,CAACC,KAAK,CAAEC,CAAC,IAAK;UACxD5B,MAAM,CAACkB,KAAK,CAAC,+BAA+BK,UAAU,CAACb,GAAG,EAAE,EAAEkB,CAAC,CAAC;QAClE,CAAC,CAAC;MACJ;;MAEA;MACA;MACA;MACA,MAAMpD,cAAc,CAACqD,mBAAmB,CACtChC,IAAI,CAACa,GAAG;MAAE;MACVb,IAAI,CAACX,EAAE;MAAE;MACToB,eAAe;MAAE;MACjBT,IAAI,CAACU,KAAK,CAACM,QAAQ,EAAEC,KAAK,EAAEC,OAAO,IAAI,KAAK,CAAE;MAChD,CAAC;MAED,MAAMvC,cAAc,CAACsD,kBAAkB,CAACjC,IAAI,CAACa,GAAG,CAAC;MAEjD,IAAIvC,QAAQ,CAAC6C,EAAE,KAAK,KAAK,EAAE;QACzB,MAAM3C,6BAA6B,CAAC,CAAC;MACvC;IACF,CAAC,CAAC,OAAO6C,KAAK,EAAE;MACdlB,MAAM,CAACkB,KAAK,CACV,+CAA+CrB,IAAI,CAACa,GAAG,EAAE,EACzDQ,KACF,CAAC;IACH;EACF;AACF;AAEA,OAAO,eAAea,eAAeA,CAAClC,IAAU,EAAE6B,MAAsB,EAAE;EACxE,IACE,CAAClD,cAAc,IACf,CAACA,cAAc,CAACuB,OAAO,IACvB,CAACvB,cAAc,CAACiC,aAAa,CAACZ,IAAI,CAACa,GAAG,CAAC,EACvC;IACA;EACF;EAEA,IAAI;IACF,MAAMlC,cAAc,CAACwD,iBAAiB,CAACnC,IAAI,CAACa,GAAG,EAAEgB,MAAM,IAAI,OAAO,CAAC;EACrE,CAAC,CAAC,OAAOR,KAAK,EAAE;IACd3C,iBAAiB,CACd0B,SAAS,CAAC,UAAU,CAAC,CACrBiB,KAAK,CACJ,mDAAmDrB,IAAI,CAACa,GAAG,EAAE,EAC7DQ,KACF,CAAC;EACL;AACF","ignoreList":[]}
|
|
@@ -1,18 +1,67 @@
|
|
|
1
1
|
import { NativeModules, PermissionsAndroid, Platform } from 'react-native';
|
|
2
|
+
import { getCallingxLibIfAvailable } from '../push/libs/callingx';
|
|
3
|
+
import { endCallingxCall, startCallingxCall } 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
|
+
startCall: startCallingxCall,
|
|
32
|
+
endCall: endCallingxCall
|
|
33
|
+
},
|
|
5
34
|
callManager: {
|
|
6
35
|
setup: ({
|
|
7
|
-
defaultDevice
|
|
36
|
+
defaultDevice,
|
|
37
|
+
isRingingTypeCall
|
|
8
38
|
}) => {
|
|
39
|
+
if (shouldBypassForCallKit({
|
|
40
|
+
isRingingTypeCall
|
|
41
|
+
})) {
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
9
44
|
StreamInCallManagerNativeModule.setDefaultAudioDeviceEndpointType(defaultDevice);
|
|
10
45
|
StreamInCallManagerNativeModule.setup();
|
|
11
46
|
},
|
|
12
|
-
start: (
|
|
47
|
+
start: ({
|
|
48
|
+
isRingingTypeCall
|
|
49
|
+
}) => {
|
|
50
|
+
if (shouldBypassForCallKit({
|
|
51
|
+
isRingingTypeCall
|
|
52
|
+
})) {
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
13
55
|
StreamInCallManagerNativeModule.start();
|
|
14
56
|
},
|
|
15
|
-
stop: (
|
|
57
|
+
stop: ({
|
|
58
|
+
isRingingTypeCall
|
|
59
|
+
}) => {
|
|
60
|
+
if (shouldBypassForCallKit({
|
|
61
|
+
isRingingTypeCall
|
|
62
|
+
})) {
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
16
65
|
StreamInCallManagerNativeModule.stop();
|
|
17
66
|
}
|
|
18
67
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["NativeModules","PermissionsAndroid","Platform","StreamInCallManagerNativeModule","StreamInCallManager","StreamVideoReactNativeModule","StreamVideoReactNative","streamRNVideoSDKGlobals","callManager","setup","defaultDevice","setDefaultAudioDeviceEndpointType","start","stop","permissions","check","permission","
|
|
1
|
+
{"version":3,"names":["NativeModules","PermissionsAndroid","Platform","getCallingxLibIfAvailable","endCallingxCall","startCallingxCall","StreamInCallManagerNativeModule","StreamInCallManager","StreamVideoReactNativeModule","StreamVideoReactNative","CallingxModule","shouldBypassForCallKit","isRingingTypeCall","OS","bypass","isSetup","isOngoingCallsEnabled","streamRNVideoSDKGlobals","callingX","startCall","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,SAASC,eAAe,EAAEC,iBAAiB,QAAQ,qBAAqB;AAExE,MAAMC,+BAA+B,GAAGN,aAAa,CAACO,mBAAmB;AACzE,MAAMC,4BAA4B,GAAGR,aAAa,CAACS,sBAElD;AAED,MAAMC,cAAc,GAAGP,yBAAyB,CAAC,CAAC;;AAElD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAMQ,sBAAsB,GAAGA,CAAC;EAC9BC;AAGF,CAAC,KAAc;EACb,IAAIV,QAAQ,CAACW,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,SAAS,EAAEd,iBAAiB;IAC5Be,OAAO,EAAEhB;EACX,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,IAAI3B,QAAQ,CAACW,EAAE,KAAK,SAAS,EAAE;QAC7B,MAAMiB,uBAAuB,GAC3BD,UAAU,KAAK,QAAQ,GACnB5B,kBAAkB,CAAC8B,WAAW,CAACC,MAAM,GACrC/B,kBAAkB,CAAC8B,WAAW,CAACE,YAAY;QACjD,OAAOhC,kBAAkB,CAAC2B,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":[]}
|