@stream-io/video-react-native-sdk 1.44.0 → 2.0.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +26 -3
- package/android/src/main/java/com/streamvideo/reactnative/keepalive/StreamCallKeepAliveHeadlessService.kt +112 -26
- package/android/src/main/java/com/streamvideo/reactnative/util/CallAlivePermissionsHelper.kt +68 -37
- package/dist/commonjs/hooks/push/useCallingExpWithCallingStateEffect.js +12 -6
- package/dist/commonjs/hooks/push/useCallingExpWithCallingStateEffect.js.map +1 -1
- package/dist/commonjs/hooks/useAndroidKeepCallAliveEffect.js +38 -11
- package/dist/commonjs/hooks/useAndroidKeepCallAliveEffect.js.map +1 -1
- package/dist/commonjs/hooks/useLoopbackRecording.js +10 -127
- package/dist/commonjs/hooks/useLoopbackRecording.js.map +1 -1
- package/dist/commonjs/utils/StreamVideoRN/index.js +2 -0
- package/dist/commonjs/utils/StreamVideoRN/index.js.map +1 -1
- package/dist/commonjs/utils/internal/callingx/callingx.js +38 -56
- package/dist/commonjs/utils/internal/callingx/callingx.js.map +1 -1
- package/dist/commonjs/utils/keepCallAliveHeadlessTask.js +43 -4
- package/dist/commonjs/utils/keepCallAliveHeadlessTask.js.map +1 -1
- package/dist/commonjs/utils/push/android.js +7 -167
- package/dist/commonjs/utils/push/android.js.map +1 -1
- package/dist/commonjs/utils/push/internal/android.js +204 -0
- package/dist/commonjs/utils/push/internal/android.js.map +1 -0
- package/dist/commonjs/utils/push/libs/firebaseMessaging/index.js +9 -1
- package/dist/commonjs/utils/push/libs/firebaseMessaging/index.js.map +1 -1
- package/dist/commonjs/utils/push/libs/firebaseMessaging/lib.js +1 -1
- package/dist/commonjs/utils/push/libs/firebaseMessaging/lib.js.map +1 -1
- package/dist/commonjs/utils/push/setupAndroidPushEvents.js +25 -0
- package/dist/commonjs/utils/push/setupAndroidPushEvents.js.map +1 -0
- package/dist/commonjs/utils/push/setupCallingExpEvents.js +6 -2
- package/dist/commonjs/utils/push/setupCallingExpEvents.js.map +1 -1
- package/dist/commonjs/utils/push/setupIosVoipPushEvents.js +6 -7
- package/dist/commonjs/utils/push/setupIosVoipPushEvents.js.map +1 -1
- package/dist/commonjs/utils/push/utils.js.map +1 -1
- package/dist/commonjs/version.js +1 -1
- package/dist/commonjs/version.js.map +1 -1
- package/dist/module/hooks/push/useCallingExpWithCallingStateEffect.js +12 -6
- package/dist/module/hooks/push/useCallingExpWithCallingStateEffect.js.map +1 -1
- package/dist/module/hooks/useAndroidKeepCallAliveEffect.js +39 -12
- package/dist/module/hooks/useAndroidKeepCallAliveEffect.js.map +1 -1
- package/dist/module/hooks/useLoopbackRecording.js +10 -127
- package/dist/module/hooks/useLoopbackRecording.js.map +1 -1
- package/dist/module/utils/StreamVideoRN/index.js +2 -0
- package/dist/module/utils/StreamVideoRN/index.js.map +1 -1
- package/dist/module/utils/internal/callingx/callingx.js +38 -56
- package/dist/module/utils/internal/callingx/callingx.js.map +1 -1
- package/dist/module/utils/keepCallAliveHeadlessTask.js +41 -3
- package/dist/module/utils/keepCallAliveHeadlessTask.js.map +1 -1
- package/dist/module/utils/push/android.js +9 -169
- package/dist/module/utils/push/android.js.map +1 -1
- package/dist/module/utils/push/internal/android.js +200 -0
- package/dist/module/utils/push/internal/android.js.map +1 -0
- package/dist/module/utils/push/libs/firebaseMessaging/index.js +9 -1
- package/dist/module/utils/push/libs/firebaseMessaging/index.js.map +1 -1
- package/dist/module/utils/push/libs/firebaseMessaging/lib.js +1 -1
- package/dist/module/utils/push/libs/firebaseMessaging/lib.js.map +1 -1
- package/dist/module/utils/push/setupAndroidPushEvents.js +21 -0
- package/dist/module/utils/push/setupAndroidPushEvents.js.map +1 -0
- package/dist/module/utils/push/setupCallingExpEvents.js +6 -2
- package/dist/module/utils/push/setupCallingExpEvents.js.map +1 -1
- package/dist/module/utils/push/setupIosVoipPushEvents.js +6 -7
- package/dist/module/utils/push/setupIosVoipPushEvents.js.map +1 -1
- package/dist/module/utils/push/utils.js.map +1 -1
- package/dist/module/version.js +1 -1
- package/dist/module/version.js.map +1 -1
- package/dist/typescript/hooks/push/useCallingExpWithCallingStateEffect.d.ts.map +1 -1
- package/dist/typescript/hooks/useAndroidKeepCallAliveEffect.d.ts.map +1 -1
- package/dist/typescript/hooks/useLoopbackRecording.d.ts +12 -69
- package/dist/typescript/hooks/useLoopbackRecording.d.ts.map +1 -1
- package/dist/typescript/utils/StreamVideoRN/index.d.ts.map +1 -1
- package/dist/typescript/utils/StreamVideoRN/types.d.ts +1 -2
- package/dist/typescript/utils/StreamVideoRN/types.d.ts.map +1 -1
- package/dist/typescript/utils/internal/callingx/callingx.d.ts.map +1 -1
- package/dist/typescript/utils/keepCallAliveHeadlessTask.d.ts +9 -0
- package/dist/typescript/utils/keepCallAliveHeadlessTask.d.ts.map +1 -1
- package/dist/typescript/utils/push/android.d.ts +3 -4
- package/dist/typescript/utils/push/android.d.ts.map +1 -1
- package/dist/typescript/utils/push/internal/android.d.ts +8 -0
- package/dist/typescript/utils/push/internal/android.d.ts.map +1 -0
- package/dist/typescript/utils/push/libs/firebaseMessaging/index.d.ts +6 -4
- package/dist/typescript/utils/push/libs/firebaseMessaging/index.d.ts.map +1 -1
- package/dist/typescript/utils/push/libs/firebaseMessaging/lib.d.ts +2 -2
- package/dist/typescript/utils/push/libs/firebaseMessaging/lib.d.ts.map +1 -1
- package/dist/typescript/utils/push/setupAndroidPushEvents.d.ts +3 -0
- package/dist/typescript/utils/push/setupAndroidPushEvents.d.ts.map +1 -0
- package/dist/typescript/utils/push/setupCallingExpEvents.d.ts.map +1 -1
- package/dist/typescript/utils/push/setupIosVoipPushEvents.d.ts.map +1 -1
- package/dist/typescript/utils/push/utils.d.ts +2 -2
- package/dist/typescript/utils/push/utils.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/withAndroidPermissions.js +1 -1
- package/ios/TracksRecorder/RecorderVideoSink.swift +92 -5
- package/package.json +4 -4
- package/src/hooks/push/useCallingExpWithCallingStateEffect.ts +25 -11
- package/src/hooks/useAndroidKeepCallAliveEffect.ts +59 -21
- package/src/hooks/useLoopbackRecording.ts +36 -248
- package/src/utils/StreamVideoRN/index.ts +2 -0
- package/src/utils/StreamVideoRN/types.ts +1 -2
- package/src/utils/internal/callingx/callingx.ts +49 -68
- package/src/utils/keepCallAliveHeadlessTask.ts +45 -3
- package/src/utils/push/android.ts +12 -237
- package/src/utils/push/internal/android.ts +273 -0
- package/src/utils/push/libs/firebaseMessaging/index.ts +16 -5
- package/src/utils/push/libs/firebaseMessaging/lib.ts +3 -3
- package/src/utils/push/setupAndroidPushEvents.ts +25 -0
- package/src/utils/push/setupCallingExpEvents.ts +6 -3
- package/src/utils/push/setupIosVoipPushEvents.ts +8 -7
- package/src/utils/push/utils.ts +2 -4
- package/src/version.ts +1 -1
|
@@ -6,55 +6,28 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
exports.useLoopbackRecording = useLoopbackRecording;
|
|
7
7
|
var _react = require("react");
|
|
8
8
|
var _reactNative = require("react-native");
|
|
9
|
-
var _rxjs = require("rxjs");
|
|
10
9
|
var _videoClient = require("@stream-io/video-client");
|
|
11
10
|
var _videoReactBindings = require("@stream-io/video-react-bindings");
|
|
12
11
|
/** @internal */
|
|
13
12
|
const {
|
|
14
13
|
StreamVideoReactNative
|
|
15
14
|
} = _reactNative.NativeModules;
|
|
16
|
-
|
|
17
|
-
// Upper bound on how long `startRecording` will wait for the SFU to
|
|
18
|
-
// echo loopback tracks back via the Subscriber. Tuned generously since
|
|
19
|
-
// this includes connection setup; consumers that want shorter feedback
|
|
20
|
-
// should call `stopRecording` to cancel the wait early.
|
|
21
|
-
const STREAMS_WAIT_TIMEOUT_MS = 10 * 1000;
|
|
22
|
-
const DEFAULT_RECORDING_DURATION = 10 * 1000;
|
|
23
|
-
const MIN_RECORDING_DURATION = 5 * 1000;
|
|
24
|
-
const MAX_RECORDING_DURATION = 2 * 60 * 1000;
|
|
25
|
-
/**
|
|
26
|
-
* Records the SFU loopback streams (audio + video) on the local participant
|
|
27
|
-
* to a local MP4 file. Designed for the `allowOwnTracksLoopback` pre-call test mode:
|
|
28
|
-
* the SFU echoes the caller's published tracks back through the Subscriber
|
|
29
|
-
* peer connection. The hook identifies the loopback streams on the local
|
|
30
|
-
* participant by reference inequality against
|
|
31
|
-
* `call.camera.state.mediaStream` / `call.microphone.state.mediaStream` —
|
|
32
|
-
* the canonical references to the local capture — and captures them.
|
|
33
|
-
*/
|
|
15
|
+
/** Records SFU loopback streams to a local MP4 file. */
|
|
34
16
|
function useLoopbackRecording() {
|
|
35
17
|
const call = (0, _videoReactBindings.useCall)();
|
|
36
18
|
const {
|
|
37
19
|
useCallCallingState,
|
|
38
20
|
useParticipantCount,
|
|
39
|
-
useLocalParticipant
|
|
40
|
-
useCameraState,
|
|
41
|
-
useMicrophoneState
|
|
21
|
+
useLocalParticipant
|
|
42
22
|
} = (0, _videoReactBindings.useCallStateHooks)();
|
|
43
23
|
const callingState = useCallCallingState();
|
|
44
24
|
const participantCount = useParticipantCount();
|
|
45
25
|
const localParticipant = useLocalParticipant();
|
|
46
|
-
const {
|
|
47
|
-
mediaStream: cameraStream
|
|
48
|
-
} = useCameraState();
|
|
49
|
-
const {
|
|
50
|
-
mediaStream: microphoneStream
|
|
51
|
-
} = useMicrophoneState();
|
|
52
26
|
const [recordingState, setRecordingState] = (0, _react.useState)('idle');
|
|
53
27
|
const recordingStateRef = (0, _react.useRef)('idle');
|
|
54
28
|
const isMountedRef = (0, _react.useRef)(true);
|
|
55
|
-
// Used to abort the awaiting-streams wait on stop / leave / unmount.
|
|
56
29
|
const awaitAbortRef = (0, _react.useRef)(null);
|
|
57
|
-
const loopbackStreams = (0, _react.useMemo)(() =>
|
|
30
|
+
const loopbackStreams = (0, _react.useMemo)(() => (0, _videoClient.getLoopbackStreams)(call, localParticipant), [call, localParticipant]);
|
|
58
31
|
const updateState = (0, _react.useCallback)(next => {
|
|
59
32
|
recordingStateRef.current = next;
|
|
60
33
|
if (isMountedRef.current) {
|
|
@@ -80,7 +53,7 @@ function useLoopbackRecording() {
|
|
|
80
53
|
}, []);
|
|
81
54
|
const startRecording = (0, _react.useCallback)(async ({
|
|
82
55
|
includeVideo = true,
|
|
83
|
-
maxDurationMs =
|
|
56
|
+
maxDurationMs = _videoClient.DEFAULT_LOOPBACK_RECORDING_DURATION_MS
|
|
84
57
|
} = {}) => {
|
|
85
58
|
if (!call) {
|
|
86
59
|
return null;
|
|
@@ -95,51 +68,30 @@ function useLoopbackRecording() {
|
|
|
95
68
|
}
|
|
96
69
|
awaitAbortRef.current = new AbortController();
|
|
97
70
|
updateState('awaiting-streams');
|
|
98
|
-
let audioTrack;
|
|
99
71
|
try {
|
|
100
|
-
const streams = await waitForLoopbackStreams(call, {
|
|
72
|
+
const streams = await (0, _videoClient.waitForLoopbackStreams)(call, {
|
|
101
73
|
includeVideo,
|
|
102
74
|
signal: awaitAbortRef.current.signal,
|
|
103
|
-
timeoutMs:
|
|
75
|
+
timeoutMs: _videoClient.LOOPBACK_STREAMS_WAIT_TIMEOUT_MS
|
|
104
76
|
});
|
|
105
77
|
if (streams === null) {
|
|
106
78
|
_videoClient.videoLoggerSystem.getLogger('useLoopbackRecording').warn('timed out waiting for loopback streams');
|
|
107
79
|
return null;
|
|
108
80
|
}
|
|
109
|
-
audioTrack = streams.audioTrack;
|
|
110
|
-
const videoTrackId = streams.videoTrack?.id;
|
|
111
|
-
|
|
112
|
-
// The loopback audio track lands disabled (the SDK default-mutes
|
|
113
|
-
// it to prevent echo). Enable it so the native recording
|
|
114
|
-
// pipeline receives PCM; `finally` returns it to muted.
|
|
115
|
-
if (audioTrack) {
|
|
116
|
-
audioTrack.enabled = true;
|
|
117
|
-
}
|
|
118
81
|
updateState('recording');
|
|
119
|
-
const clampedDuration = Math.min(MAX_RECORDING_DURATION, Math.max(MIN_RECORDING_DURATION, maxDurationMs));
|
|
120
|
-
|
|
121
|
-
// Pre-size the native encoder to the publisher's max video
|
|
122
|
-
// publish-option dimension. Without this, the encoder locks to
|
|
123
|
-
// whatever the SFU happens to echo *first* and stays there for the
|
|
124
|
-
// rest of the recording even after the network improves and
|
|
125
|
-
// higher layers arrive.
|
|
126
82
|
const publishMaxDim = call.getMaxVideoPublishDimension();
|
|
127
83
|
try {
|
|
128
|
-
|
|
129
|
-
videoTrackId,
|
|
130
|
-
maxDurationMs:
|
|
84
|
+
return await (0, _videoClient.withLoopbackAudioEnabled)(streams, () => StreamVideoReactNative.startTrackRecording({
|
|
85
|
+
videoTrackId: streams.videoTrack?.id,
|
|
86
|
+
maxDurationMs: (0, _videoClient.clampLoopbackRecordingDuration)(maxDurationMs),
|
|
131
87
|
targetWidth: publishMaxDim?.width,
|
|
132
88
|
targetHeight: publishMaxDim?.height
|
|
133
|
-
});
|
|
134
|
-
return uri;
|
|
89
|
+
}));
|
|
135
90
|
} catch (error) {
|
|
136
91
|
_videoClient.videoLoggerSystem.getLogger('useLoopbackRecording').error('failed to start recording', error);
|
|
137
92
|
throw new Error('failed to start recording');
|
|
138
93
|
}
|
|
139
94
|
} finally {
|
|
140
|
-
if (audioTrack) {
|
|
141
|
-
audioTrack.enabled = false;
|
|
142
|
-
}
|
|
143
95
|
awaitAbortRef.current = null;
|
|
144
96
|
updateState('idle');
|
|
145
97
|
}
|
|
@@ -161,21 +113,12 @@ function useLoopbackRecording() {
|
|
|
161
113
|
throw new Error('failed to get recordings');
|
|
162
114
|
}
|
|
163
115
|
}, []);
|
|
164
|
-
|
|
165
|
-
// Auto-stop on call leave / end. Aborts an awaiting-streams wait or
|
|
166
|
-
// signals native finalisation depending on which phase we're in.
|
|
167
|
-
// Without this, leaving the call mid-recording would leave native
|
|
168
|
-
// encoders mid-write while the SFU subscriber tracks end under their
|
|
169
|
-
// feet — undefined final file state.
|
|
170
116
|
(0, _react.useEffect)(() => {
|
|
171
117
|
if (callingState === _videoClient.CallingState.LEFT || callingState === _videoClient.CallingState.IDLE) {
|
|
172
118
|
_videoClient.videoLoggerSystem.getLogger('useLoopbackRecording').debug('auto-stopping recording on call leave / end');
|
|
173
119
|
stopRecording().catch(() => {});
|
|
174
120
|
}
|
|
175
121
|
}, [callingState, stopRecording]);
|
|
176
|
-
|
|
177
|
-
// Auto-stop if another participant joins. Loopback recording is a
|
|
178
|
-
// single-user pre-call test.
|
|
179
122
|
(0, _react.useEffect)(() => {
|
|
180
123
|
if (recordingState !== 'idle' && participantCount > 1) {
|
|
181
124
|
stopRecording().catch(() => {});
|
|
@@ -200,64 +143,4 @@ function useLoopbackRecording() {
|
|
|
200
143
|
loopbackAudioStream: loopbackStreams.loopbackAudioStream
|
|
201
144
|
};
|
|
202
145
|
}
|
|
203
|
-
function getLoopbackStreamsFor(participant, cameraStream, microphoneStream) {
|
|
204
|
-
return {
|
|
205
|
-
loopbackVideoStream: participant?.videoStream && participant.videoStream !== cameraStream ? participant.videoStream : undefined,
|
|
206
|
-
loopbackAudioStream: participant?.audioStream && participant.audioStream !== microphoneStream ? participant.audioStream : undefined
|
|
207
|
-
};
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
/**
|
|
211
|
-
* Subscribe to `localParticipant$` and resolve once the requested loopback
|
|
212
|
-
* streams are present on the participant. Aborts cleanly on `signal`
|
|
213
|
-
* (resolves `null`) and rejects on timeout.
|
|
214
|
-
*/
|
|
215
|
-
function waitForLoopbackStreams(call, opts) {
|
|
216
|
-
return new Promise((resolve, reject) => {
|
|
217
|
-
const initial = getLoopbackStreams(call.state.localParticipant, call.camera.state.mediaStream, call.microphone.state.mediaStream, opts.includeVideo);
|
|
218
|
-
if (initial) {
|
|
219
|
-
resolve(initial);
|
|
220
|
-
return;
|
|
221
|
-
}
|
|
222
|
-
const cleanup = () => {
|
|
223
|
-
subscription.unsubscribe();
|
|
224
|
-
if (timeoutId !== undefined) {
|
|
225
|
-
clearTimeout(timeoutId);
|
|
226
|
-
}
|
|
227
|
-
opts.signal.removeEventListener('abort', onAbort);
|
|
228
|
-
};
|
|
229
|
-
const onAbort = () => {
|
|
230
|
-
cleanup();
|
|
231
|
-
resolve(null);
|
|
232
|
-
};
|
|
233
|
-
opts.signal.addEventListener('abort', onAbort);
|
|
234
|
-
const timeoutId = setTimeout(() => {
|
|
235
|
-
cleanup();
|
|
236
|
-
reject(new Error('useLoopbackRecording: timed out waiting for loopback streams. ' + 'Ensure the call was joined with `allowOwnTracksLoopback: true` and ' + 'that the SFU is configured to echo self-sub tracks.'));
|
|
237
|
-
}, opts.timeoutMs);
|
|
238
|
-
const subscription = (0, _rxjs.combineLatest)([call.state.localParticipant$, call.camera.state.mediaStream$, call.microphone.state.mediaStream$]).subscribe(([participant, cameraStream, microphoneStream]) => {
|
|
239
|
-
const ready = getLoopbackStreams(participant, cameraStream, microphoneStream, opts.includeVideo);
|
|
240
|
-
if (ready) {
|
|
241
|
-
cleanup();
|
|
242
|
-
resolve(ready);
|
|
243
|
-
}
|
|
244
|
-
});
|
|
245
|
-
});
|
|
246
|
-
}
|
|
247
|
-
function getLoopbackStreams(participant, cameraStream, microphoneStream, includeVideo) {
|
|
248
|
-
if (!participant) return undefined;
|
|
249
|
-
const {
|
|
250
|
-
loopbackAudioStream,
|
|
251
|
-
loopbackVideoStream
|
|
252
|
-
} = getLoopbackStreamsFor(participant, cameraStream, microphoneStream);
|
|
253
|
-
const audioTrack = loopbackAudioStream?.getAudioTracks()[0];
|
|
254
|
-
const videoTrack = includeVideo ? loopbackVideoStream?.getVideoTracks()[0] : undefined;
|
|
255
|
-
if (!audioTrack || includeVideo && !videoTrack) {
|
|
256
|
-
return undefined;
|
|
257
|
-
}
|
|
258
|
-
return {
|
|
259
|
-
audioTrack,
|
|
260
|
-
videoTrack
|
|
261
|
-
};
|
|
262
|
-
}
|
|
263
146
|
//# sourceMappingURL=useLoopbackRecording.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_react","require","_reactNative","
|
|
1
|
+
{"version":3,"names":["_react","require","_reactNative","_videoClient","_videoReactBindings","StreamVideoReactNative","NativeModules","useLoopbackRecording","call","useCall","useCallCallingState","useParticipantCount","useLocalParticipant","useCallStateHooks","callingState","participantCount","localParticipant","recordingState","setRecordingState","useState","recordingStateRef","useRef","isMountedRef","awaitAbortRef","loopbackStreams","useMemo","getLoopbackStreams","updateState","useCallback","next","current","stopRecording","videoLoggerSystem","getLogger","debug","abort","stopTrackRecording","error","Error","startRecording","includeVideo","maxDurationMs","DEFAULT_LOOPBACK_RECORDING_DURATION_MS","warn","state","AbortController","streams","waitForLoopbackStreams","signal","timeoutMs","LOOPBACK_STREAMS_WAIT_TIMEOUT_MS","publishMaxDim","getMaxVideoPublishDimension","withLoopbackAudioEnabled","startTrackRecording","videoTrackId","videoTrack","id","clampLoopbackRecordingDuration","targetWidth","width","targetHeight","height","clearRecordings","clearStreamRecordings","getRecordings","list","getStreamRecordings","useEffect","CallingState","LEFT","IDLE","catch","loopbackVideoStream","loopbackAudioStream"],"sourceRoot":"../../../src","sources":["hooks/useLoopbackRecording.ts"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AACA,IAAAC,YAAA,GAAAD,OAAA;AACA,IAAAE,YAAA,GAAAF,OAAA;AAaA,IAAAG,mBAAA,GAAAH,OAAA;AAEA;AACA,MAAM;EAAEI;AAAuB,CAAC,GAAGC,0BAAa;AAgChD;AACO,SAASC,oBAAoBA,CAAA,EAA+B;EACjE,MAAMC,IAAI,GAAG,IAAAC,2BAAO,EAAC,CAAC;EACtB,MAAM;IAAEC,mBAAmB;IAAEC,mBAAmB;IAAEC;EAAoB,CAAC,GACrE,IAAAC,qCAAiB,EAAC,CAAC;EACrB,MAAMC,YAAY,GAAGJ,mBAAmB,CAAC,CAAC;EAC1C,MAAMK,gBAAgB,GAAGJ,mBAAmB,CAAC,CAAC;EAC9C,MAAMK,gBAAgB,GAAGJ,mBAAmB,CAAC,CAAC;EAE9C,MAAM,CAACK,cAAc,EAAEC,iBAAiB,CAAC,GACvC,IAAAC,eAAQ,EAAyB,MAAM,CAAC;EAC1C,MAAMC,iBAAiB,GAAG,IAAAC,aAAM,EAAyB,MAAM,CAAC;EAChE,MAAMC,YAAY,GAAG,IAAAD,aAAM,EAAC,IAAI,CAAC;EACjC,MAAME,aAAa,GAAG,IAAAF,aAAM,EAAyB,IAAI,CAAC;EAE1D,MAAMG,eAAe,GAAG,IAAAC,cAAO,EAC7B,MAAM,IAAAC,+BAAkB,EAAClB,IAAI,EAAEQ,gBAAgB,CAAC,EAChD,CAACR,IAAI,EAAEQ,gBAAgB,CACzB,CAAC;EAED,MAAMW,WAAW,GAAG,IAAAC,kBAAW,EAAEC,IAA4B,IAAK;IAChET,iBAAiB,CAACU,OAAO,GAAGD,IAAI;IAChC,IAAIP,YAAY,CAACQ,OAAO,EAAE;MACxBZ,iBAAiB,CAACW,IAAI,CAAC;IACzB;EACF,CAAC,EAAE,EAAE,CAAC;EAEN,MAAME,aAAa,GAAG,IAAAH,kBAAW,EAAC,YAA2B;IAC3D,MAAME,OAAO,GAAGV,iBAAiB,CAACU,OAAO;IACzC,IAAIA,OAAO,KAAK,MAAM,EAAE;MACtB;IACF;IAEA,IAAIA,OAAO,KAAK,kBAAkB,EAAE;MAClCE,8BAAiB,CACdC,SAAS,CAAC,sBAAsB,CAAC,CACjCC,KAAK,CAAC,gCAAgC,CAAC;MAC1CX,aAAa,CAACO,OAAO,EAAEK,KAAK,CAAC,CAAC;MAC9B;IACF;IAEA,IAAI;MACF,MAAM9B,sBAAsB,CAAC+B,kBAAkB,CAAC,CAAC;IACnD,CAAC,CAAC,OAAOC,KAAK,EAAE;MACdL,8BAAiB,CACdC,SAAS,CAAC,sBAAsB,CAAC,CACjCI,KAAK,CAAC,0BAA0B,EAAEA,KAAK,CAAC;MAC3C,MAAM,IAAIC,KAAK,CAAC,0BAA0B,CAAC;IAC7C;EACF,CAAC,EAAE,EAAE,CAAC;EAEN,MAAMC,cAAc,GAAG,IAAAX,kBAAW,EAChC,OAAO;IACLY,YAAY,GAAG,IAAI;IACnBC,aAAa,GAAGC;EACa,CAAC,GAAG,CAAC,CAAC,KAA6B;IAChE,IAAI,CAAClC,IAAI,EAAE;MACT,OAAO,IAAI;IACb;IAEA,IAAIY,iBAAiB,CAACU,OAAO,KAAK,MAAM,EAAE;MACxCE,8BAAiB,CACdC,SAAS,CAAC,sBAAsB,CAAC,CACjCU,IAAI,CAAC,gCAAgC,CAAC;MACzC,OAAO,IAAI;IACb;IAEA,IAAInC,IAAI,CAACoC,KAAK,CAAC7B,gBAAgB,GAAG,CAAC,EAAE;MACnCiB,8BAAiB,CACdC,SAAS,CAAC,sBAAsB,CAAC,CACjCU,IAAI,CAAC,wDAAwD,CAAC;MACjE,OAAO,IAAI;IACb;IAEApB,aAAa,CAACO,OAAO,GAAG,IAAIe,eAAe,CAAC,CAAC;IAC7ClB,WAAW,CAAC,kBAAkB,CAAC;IAE/B,IAAI;MACF,MAAMmB,OAAO,GAAG,MAAM,IAAAC,mCAAsB,EAACvC,IAAI,EAAE;QACjDgC,YAAY;QACZQ,MAAM,EAAEzB,aAAa,CAACO,OAAO,CAACkB,MAAM;QACpCC,SAAS,EAAEC;MACb,CAAC,CAAC;MAEF,IAAIJ,OAAO,KAAK,IAAI,EAAE;QACpBd,8BAAiB,CACdC,SAAS,CAAC,sBAAsB,CAAC,CACjCU,IAAI,CAAC,wCAAwC,CAAC;QACjD,OAAO,IAAI;MACb;MAEAhB,WAAW,CAAC,WAAW,CAAC;MAExB,MAAMwB,aAAa,GAAG3C,IAAI,CAAC4C,2BAA2B,CAAC,CAAC;MAExD,IAAI;QACF,OAAO,MAAM,IAAAC,qCAAwB,EACnCP,OAAO,EACP,MACEzC,sBAAsB,CAACiD,mBAAmB,CAAC;UACzCC,YAAY,EAAET,OAAO,CAACU,UAAU,EAAEC,EAAE;UACpChB,aAAa,EAAE,IAAAiB,2CAA8B,EAACjB,aAAa,CAAC;UAC5DkB,WAAW,EAAER,aAAa,EAAES,KAAK;UACjCC,YAAY,EAAEV,aAAa,EAAEW;QAC/B,CAAC,CACL,CAAC;MACH,CAAC,CAAC,OAAOzB,KAAK,EAAE;QACdL,8BAAiB,CACdC,SAAS,CAAC,sBAAsB,CAAC,CACjCI,KAAK,CAAC,2BAA2B,EAAEA,KAAK,CAAC;QAC5C,MAAM,IAAIC,KAAK,CAAC,2BAA2B,CAAC;MAC9C;IACF,CAAC,SAAS;MACRf,aAAa,CAACO,OAAO,GAAG,IAAI;MAC5BH,WAAW,CAAC,MAAM,CAAC;IACrB;EACF,CAAC,EACD,CAACnB,IAAI,EAAEmB,WAAW,CACpB,CAAC;EAED,MAAMoC,eAAe,GAAG,IAAAnC,kBAAW,EAAC,YAA2B;IAC7D,IAAI;MACF,MAAMvB,sBAAsB,CAAC2D,qBAAqB,CAAC,CAAC;IACtD,CAAC,CAAC,OAAO3B,KAAK,EAAE;MACdL,8BAAiB,CACdC,SAAS,CAAC,sBAAsB,CAAC,CACjCI,KAAK,CAAC,4BAA4B,EAAEA,KAAK,CAAC;MAC7C,MAAM,IAAIC,KAAK,CAAC,4BAA4B,CAAC;IAC/C;EACF,CAAC,EAAE,EAAE,CAAC;EAEN,MAAM2B,aAAa,GAAG,IAAArC,kBAAW,EAAC,YAA+B;IAC/D,IAAI;MACF,MAAMsC,IAAiC,GACrC,MAAM7D,sBAAsB,CAAC8D,mBAAmB,CAAC,CAAC;MACpD,OAAOD,IAAI,IAAI,EAAE;IACnB,CAAC,CAAC,OAAO7B,KAAK,EAAE;MACdL,8BAAiB,CACdC,SAAS,CAAC,sBAAsB,CAAC,CACjCI,KAAK,CAAC,0BAA0B,EAAEA,KAAK,CAAC;MAC3C,MAAM,IAAIC,KAAK,CAAC,0BAA0B,CAAC;IAC7C;EACF,CAAC,EAAE,EAAE,CAAC;EAEN,IAAA8B,gBAAS,EAAC,MAAM;IACd,IACEtD,YAAY,KAAKuD,yBAAY,CAACC,IAAI,IAClCxD,YAAY,KAAKuD,yBAAY,CAACE,IAAI,EAClC;MACAvC,8BAAiB,CACdC,SAAS,CAAC,sBAAsB,CAAC,CACjCC,KAAK,CAAC,6CAA6C,CAAC;MACvDH,aAAa,CAAC,CAAC,CAACyC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IACjC;EACF,CAAC,EAAE,CAAC1D,YAAY,EAAEiB,aAAa,CAAC,CAAC;EAEjC,IAAAqC,gBAAS,EAAC,MAAM;IACd,IAAInD,cAAc,KAAK,MAAM,IAAIF,gBAAgB,GAAG,CAAC,EAAE;MACrDgB,aAAa,CAAC,CAAC,CAACyC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;MAC/BxC,8BAAiB,CACdC,SAAS,CAAC,sBAAsB,CAAC,CACjCC,KAAK,CAAC,qDAAqD,CAAC;IACjE;EACF,CAAC,EAAE,CAACnB,gBAAgB,EAAEE,cAAc,EAAEc,aAAa,CAAC,CAAC;EAErD,IAAAqC,gBAAS,EAAC,MAAM;IACd9C,YAAY,CAACQ,OAAO,GAAG,IAAI;IAC3B,OAAO,MAAM;MACXR,YAAY,CAACQ,OAAO,GAAG,KAAK;MAC5BE,8BAAiB,CACdC,SAAS,CAAC,sBAAsB,CAAC,CACjCC,KAAK,CAAC,oCAAoC,CAAC;MAC9CH,aAAa,CAAC,CAAC,CAACyC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IACjC,CAAC;EACH,CAAC,EAAE,CAACzC,aAAa,CAAC,CAAC;EAEnB,OAAO;IACLQ,cAAc;IACdR,aAAa;IACbgC,eAAe;IACfE,aAAa;IACbhD,cAAc;IACdwD,mBAAmB,EAAEjD,eAAe,CAACiD,mBAAmB;IACxDC,mBAAmB,EAAElD,eAAe,CAACkD;EACvC,CAAC;AACH","ignoreList":[]}
|
|
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
exports.StreamVideoRN = void 0;
|
|
7
7
|
var _pushLogoutCallback = _interopRequireDefault(require("../internal/pushLogoutCallback"));
|
|
8
8
|
var _setupIosVoipPushEvents = require("../push/setupIosVoipPushEvents");
|
|
9
|
+
var _setupAndroidPushEvents = require("../push/setupAndroidPushEvents");
|
|
9
10
|
var _setupCallingExpEvents = require("../push/setupCallingExpEvents");
|
|
10
11
|
var _callingx = require("../push/libs/callingx");
|
|
11
12
|
var _reactNative = require("react-native");
|
|
@@ -108,6 +109,7 @@ class StreamVideoRN {
|
|
|
108
109
|
}
|
|
109
110
|
(0, _setupCallingExpEvents.setupCallingExpEvents)(pushConfig);
|
|
110
111
|
(0, _setupIosVoipPushEvents.setupIosVoipPushEvents)(pushConfig);
|
|
112
|
+
(0, _setupAndroidPushEvents.setupAndroidPushEvents)(pushConfig);
|
|
111
113
|
}
|
|
112
114
|
static getConfig() {
|
|
113
115
|
return this.config;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_pushLogoutCallback","_interopRequireDefault","require","_setupIosVoipPushEvents","_setupCallingExpEvents","_callingx","_reactNative","_videoClient","e","__esModule","default","deepMerge","target","source","result","key","undefined","Array","isArray","DEFAULT_STREAM_VIDEO_CONFIG","foregroundService","android","channel","id","name","notificationTexts","title","body","taskToRun","Promise","StreamVideoRN","config","updateConfig","setPushConfig","pushConfig","push","callingx","getCallingxLib","videoLoggerSystem","getLogger","info","JSON","stringify","options","extractCallingExpOptions","setup","Error","setupCallingExpEvents","setupIosVoipPushEvents","getConfig","onPushLogout","callbacks","pushLogoutCallbacks","current","resolve","all","map","callback","then","clearPushLogoutCallbacks","playBusyTone","NativeModules","StreamVideoReactNative","stopBusyTone","androidHasAudioOutputHardware","Platform","OS","hasAudioOutputHardware","androidHasMicrophoneHardware","hasMicrophoneHardware","androidHasCameraHardware","hasCameraHardware","exports"],"sourceRoot":"../../../../src","sources":["utils/StreamVideoRN/index.ts"],"mappings":";;;;;;AACA,IAAAA,mBAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,uBAAA,GAAAD,OAAA;AACA,IAAAE,
|
|
1
|
+
{"version":3,"names":["_pushLogoutCallback","_interopRequireDefault","require","_setupIosVoipPushEvents","_setupAndroidPushEvents","_setupCallingExpEvents","_callingx","_reactNative","_videoClient","e","__esModule","default","deepMerge","target","source","result","key","undefined","Array","isArray","DEFAULT_STREAM_VIDEO_CONFIG","foregroundService","android","channel","id","name","notificationTexts","title","body","taskToRun","Promise","StreamVideoRN","config","updateConfig","setPushConfig","pushConfig","push","callingx","getCallingxLib","videoLoggerSystem","getLogger","info","JSON","stringify","options","extractCallingExpOptions","setup","Error","setupCallingExpEvents","setupIosVoipPushEvents","setupAndroidPushEvents","getConfig","onPushLogout","callbacks","pushLogoutCallbacks","current","resolve","all","map","callback","then","clearPushLogoutCallbacks","playBusyTone","NativeModules","StreamVideoReactNative","stopBusyTone","androidHasAudioOutputHardware","Platform","OS","hasAudioOutputHardware","androidHasMicrophoneHardware","hasMicrophoneHardware","androidHasCameraHardware","hasCameraHardware","exports"],"sourceRoot":"../../../../src","sources":["utils/StreamVideoRN/index.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -37,12 +37,25 @@ function getCallDisplayName(callMembers, participants, currentUserId) {
|
|
|
37
37
|
|
|
38
38
|
// if no names are found, we use the name of the current user
|
|
39
39
|
if (names.length === 0) {
|
|
40
|
-
names = [participants.find(participant => participant.userId === currentUserId)?.name
|
|
40
|
+
names = [participants.find(participant => participant.userId === currentUserId)?.name || 'Call'];
|
|
41
41
|
}
|
|
42
42
|
return names.sort().join(', ');
|
|
43
43
|
}
|
|
44
|
-
|
|
45
|
-
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Args shared by the callingx call registration APIs:
|
|
47
|
+
* `(callId, phoneNumber, callerName, hasVideo)`.
|
|
48
|
+
*/
|
|
49
|
+
function getCallingxCallArgs(call) {
|
|
50
|
+
const callDisplayName = call.state.custom?.display_name || getCallDisplayName(call.state.members, call.state.participants, call.currentUserId);
|
|
51
|
+
return [call.cid,
|
|
52
|
+
// unique id for call
|
|
53
|
+
call.state.createdBy?.id ?? callDisplayName,
|
|
54
|
+
// handle for native call UI (prefer createdBy user id, fallback to call display name)
|
|
55
|
+
callDisplayName,
|
|
56
|
+
// display name for display in call screen
|
|
57
|
+
call.state.settings?.video?.enabled ?? false // is video call?
|
|
58
|
+
];
|
|
46
59
|
}
|
|
47
60
|
async function registerOutgoingCall(call) {
|
|
48
61
|
if (!CallingxModule || !CallingxModule.isSetup || call.isOwnTracksLoopbackAllowed) {
|
|
@@ -55,15 +68,7 @@ async function registerOutgoingCall(call) {
|
|
|
55
68
|
const logger = _videoClient.videoLoggerSystem.getLogger('callingx');
|
|
56
69
|
try {
|
|
57
70
|
logger.debug(`registerOutgoingCall: Registering outgoing call ${call.cid}`);
|
|
58
|
-
|
|
59
|
-
await CallingxModule.startCall(call.cid,
|
|
60
|
-
// unique id for call
|
|
61
|
-
call.state.createdBy?.id ?? callDisplayName,
|
|
62
|
-
// handle for native call UI (prefer createdBy user id, fallback to call display name)
|
|
63
|
-
callDisplayName,
|
|
64
|
-
// display name for display in call screen
|
|
65
|
-
call.state.settings?.video?.enabled ?? false // is video call?
|
|
66
|
-
);
|
|
71
|
+
await CallingxModule.startCall(...getCallingxCallArgs(call));
|
|
67
72
|
} catch (error) {
|
|
68
73
|
logger.error(`registerOutgoingCall: Error registering outgoing call in callingx: ${call.cid}`, error);
|
|
69
74
|
}
|
|
@@ -84,53 +89,30 @@ async function joinCallingxCall(call, activeCalls) {
|
|
|
84
89
|
const logger = _videoClient.videoLoggerSystem.getLogger('callingx');
|
|
85
90
|
const isOutcomingCall = call.ringing && call.isCreatedByMe;
|
|
86
91
|
const isIncomingCall = call.ringing && !call.isCreatedByMe;
|
|
87
|
-
const
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
call.state.
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
try {
|
|
101
|
-
await startCallInCallingx();
|
|
102
|
-
} catch (error) {
|
|
103
|
-
logger.error(`startCallingxCall: Error starting call in callingx: ${call.cid}`, error);
|
|
92
|
+
const isOngoingCall = c => !c.ringing && CallingxModule.isOngoingCallsEnabled && !c.isOwnTracksLoopbackAllowed;
|
|
93
|
+
if (!isIncomingCall && !isOutcomingCall && !isOngoingCall(call)) {
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
try {
|
|
97
|
+
const activeCallsToLeave = activeCalls.filter(c => c.cid !== call.cid && (c.ringing || isOngoingCall(c)) && c.state.callingState !== _videoClient.CallingState.LEFT);
|
|
98
|
+
for (const activeCall of activeCallsToLeave) {
|
|
99
|
+
logger.debug(`leaving currently-active-call:${activeCall.cid} before joining the call:${call.cid}`);
|
|
100
|
+
await activeCall.leave({
|
|
101
|
+
reason: 'cancel'
|
|
102
|
+
}).catch(e => {
|
|
103
|
+
logger.error(`failed to leave active call ${activeCall.cid}`, e);
|
|
104
|
+
});
|
|
104
105
|
}
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
const activeCallsToLeave = activeCalls.filter(c => c.cid !== call.cid && c.ringing && c.state.callingState !== _videoClient.CallingState.LEFT);
|
|
110
|
-
for (const activeCall of activeCallsToLeave) {
|
|
111
|
-
logger.debug(`leaving active call ${activeCall.cid} before joining ${call.cid}`);
|
|
112
|
-
await activeCall.leave({
|
|
113
|
-
reason: 'cancel'
|
|
114
|
-
}).catch(e => {
|
|
115
|
-
logger.error(`failed to leave active call ${activeCall.cid}`, e);
|
|
116
|
-
});
|
|
117
|
-
}
|
|
118
|
-
// Awaits native CallKit/Telecom registration before answering.
|
|
119
|
-
// Safe to call even if the call is already registered (e.g. from VoIP push) --
|
|
120
|
-
// iOS early-returns with no error, Android sends the registered broadcast.
|
|
121
|
-
const callDisplayName = getCallDisplayNameFromCall(call);
|
|
122
|
-
await CallingxModule.displayIncomingCall(call.cid,
|
|
123
|
-
// unique id for call
|
|
124
|
-
call.state.createdBy?.id ?? callDisplayName,
|
|
125
|
-
// handle for native call UI (prefer createdBy user id, fallback to call display name)
|
|
126
|
-
callDisplayName,
|
|
127
|
-
// display name for display in call screen
|
|
128
|
-
call.state.settings?.video?.enabled ?? false // is video call?
|
|
129
|
-
);
|
|
106
|
+
logger.debug(`joinCallingxCall: Joining call ${call.cid} isIncoming: ${isIncomingCall} isOutgoing: ${isOutcomingCall}`);
|
|
107
|
+
const callArgs = getCallingxCallArgs(call);
|
|
108
|
+
if (isIncomingCall) {
|
|
109
|
+
await CallingxModule.displayIncomingCall(...callArgs);
|
|
130
110
|
await CallingxModule.answerIncomingCall(call.cid);
|
|
131
|
-
}
|
|
132
|
-
|
|
111
|
+
} else {
|
|
112
|
+
await CallingxModule.startCall(...callArgs);
|
|
133
113
|
}
|
|
114
|
+
} catch (error) {
|
|
115
|
+
logger.error(`startCallingxCall: Error starting call in callingx: ${call.cid} isIncoming: ${isIncomingCall} isOutgoing: ${isOutcomingCall}`, error);
|
|
134
116
|
}
|
|
135
117
|
}
|
|
136
118
|
async function endCallingxCall(call, reason) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_reactNative","require","_callingx","_videoClient","CallingxModule","getCallingxLibIfAvailable","getCallDisplayName","callMembers","participants","currentUserId","names","length","flatMap","member","user","id","name","participant","userId","find","sort","join","
|
|
1
|
+
{"version":3,"names":["_reactNative","require","_callingx","_videoClient","CallingxModule","getCallingxLibIfAvailable","getCallDisplayName","callMembers","participants","currentUserId","names","length","flatMap","member","user","id","name","participant","userId","find","sort","join","getCallingxCallArgs","call","callDisplayName","state","custom","display_name","members","cid","createdBy","settings","video","enabled","registerOutgoingCall","isSetup","isOwnTracksLoopbackAllowed","isOutcomingCall","ringing","isCreatedByMe","logger","videoLoggerSystem","getLogger","debug","startCall","error","joinCallingxCall","activeCalls","isIncomingCall","isOngoingCall","c","isOngoingCallsEnabled","activeCallsToLeave","filter","callingState","CallingState","LEFT","activeCall","leave","reason","catch","e","callArgs","displayIncomingCall","answerIncomingCall","endCallingxCall","isCallTracked","endCallWithReason","wireAudioEngineSubscription","Platform","OS","unwireAudioEngineSubscription"],"sourceRoot":"../../../../../src","sources":["utils/internal/callingx/callingx.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.keepCallAliveCallRef = exports.KEEP_CALL_ALIVE_HEADLESS_TASK_NAME = void 0;
|
|
6
|
+
exports.keepCallAliveCallRef = exports.endKeepCallAliveHeadlessTask = exports.KEEP_CALL_ALIVE_HEADLESS_TASK_NAME = void 0;
|
|
7
7
|
var _reactNative = require("react-native");
|
|
8
8
|
var _videoClient = require("@stream-io/video-client");
|
|
9
9
|
var _StreamVideoRN = require("./StreamVideoRN");
|
|
@@ -16,6 +16,21 @@ const KEEP_CALL_ALIVE_HEADLESS_TASK_NAME = exports.KEEP_CALL_ALIVE_HEADLESS_TASK
|
|
|
16
16
|
const keepCallAliveCallRef = exports.keepCallAliveCallRef = {
|
|
17
17
|
current: undefined
|
|
18
18
|
};
|
|
19
|
+
let resolveRunningTask;
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Ends the currently running keep-alive headless task.
|
|
23
|
+
*
|
|
24
|
+
* The task's promise is app-provided (`foregroundService.android.taskToRun`) and by default never
|
|
25
|
+
* resolves, so stopping the native service alone would leave the task registered in
|
|
26
|
+
* `HeadlessJsTaskContext` forever - which keeps RN's timer choreographer callback posted for the
|
|
27
|
+
* rest of the process lifetime. Resolving it here lets React Native unwind the task properly.
|
|
28
|
+
*/
|
|
29
|
+
const endKeepCallAliveHeadlessTask = () => {
|
|
30
|
+
resolveRunningTask?.();
|
|
31
|
+
resolveRunningTask = undefined;
|
|
32
|
+
};
|
|
33
|
+
exports.endKeepCallAliveHeadlessTask = endKeepCallAliveHeadlessTask;
|
|
19
34
|
function registerKeepCallAliveHeadlessTaskOnce() {
|
|
20
35
|
if (_reactNative.Platform.OS !== 'android') return;
|
|
21
36
|
_reactNative.AppRegistry.registerHeadlessTask(KEEP_CALL_ALIVE_HEADLESS_TASK_NAME, () => async data => {
|
|
@@ -37,10 +52,34 @@ function registerKeepCallAliveHeadlessTaskOnce() {
|
|
|
37
52
|
}
|
|
38
53
|
const config = _StreamVideoRN.StreamVideoRN.getConfig();
|
|
39
54
|
const taskToRun = config.foregroundService.android.taskToRun;
|
|
55
|
+
// A previous task (if any) must not keep hanging around.
|
|
56
|
+
endKeepCallAliveHeadlessTask();
|
|
57
|
+
const taskEnded = new Promise(resolve => {
|
|
58
|
+
resolveRunningTask = resolve;
|
|
59
|
+
});
|
|
60
|
+
const ownResolver = resolveRunningTask;
|
|
61
|
+
|
|
62
|
+
// React Native stops the foreground service as soon as the promise returned from here
|
|
63
|
+
// settles. `taskToRun` is app-provided and may resolve early - or immediately - so its
|
|
64
|
+
// completion must not end the keep-alive: that would drop the call's background protection
|
|
65
|
+
// while the call is still ongoing. The task's lifetime is owned by the SDK instead, and ends
|
|
66
|
+
// via endKeepCallAliveHeadlessTask() when the call is left.
|
|
67
|
+
(async () => {
|
|
68
|
+
try {
|
|
69
|
+
await taskToRun(call);
|
|
70
|
+
logger.debug('Keep-alive taskToRun completed, keeping the call alive until the call ends');
|
|
71
|
+
} catch (e) {
|
|
72
|
+
logger.error('Keep-alive headless task failed', e);
|
|
73
|
+
}
|
|
74
|
+
})();
|
|
40
75
|
try {
|
|
41
|
-
await
|
|
42
|
-
}
|
|
43
|
-
|
|
76
|
+
await taskEnded;
|
|
77
|
+
} finally {
|
|
78
|
+
// a newer task may already have installed its own resolver - clearing it here would leave
|
|
79
|
+
// that task with no way to be ended.
|
|
80
|
+
if (resolveRunningTask === ownResolver) {
|
|
81
|
+
resolveRunningTask = undefined;
|
|
82
|
+
}
|
|
44
83
|
}
|
|
45
84
|
});
|
|
46
85
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_reactNative","require","_videoClient","_StreamVideoRN","KEEP_CALL_ALIVE_HEADLESS_TASK_NAME","exports","keepCallAliveCallRef","current","undefined","registerKeepCallAliveHeadlessTaskOnce","Platform","OS","AppRegistry","registerHeadlessTask","data","logger","videoLoggerSystem","getLogger","callCid","call","warn","cid","activeCallCid","config","StreamVideoRN","getConfig","taskToRun","foregroundService","android","e","error"],"sourceRoot":"../../../src","sources":["utils/keepCallAliveHeadlessTask.ts"],"mappings":";;;;;;AAAA,IAAAA,YAAA,GAAAC,OAAA;AAEA,IAAAC,YAAA,GAAAD,OAAA;AACA,IAAAE,cAAA,GAAAF,OAAA;AAEO,MAAMG,kCAAkC,GAAAC,OAAA,CAAAD,kCAAA,GAAG,0BAA0B;;AAE5E;AACA;AACA;AACA;AACO,MAAME,oBAAmD,GAAAD,OAAA,CAAAC,oBAAA,GAAG;EACjEC,OAAO,EAAEC;AACX,CAAC;AAED,SAASC,qCAAqCA,CAAA,EAAG;EAC/C,IAAIC,qBAAQ,CAACC,EAAE,KAAK,SAAS,EAAE;EAE/BC,wBAAW,CAACC,oBAAoB,
|
|
1
|
+
{"version":3,"names":["_reactNative","require","_videoClient","_StreamVideoRN","KEEP_CALL_ALIVE_HEADLESS_TASK_NAME","exports","keepCallAliveCallRef","current","undefined","resolveRunningTask","endKeepCallAliveHeadlessTask","registerKeepCallAliveHeadlessTaskOnce","Platform","OS","AppRegistry","registerHeadlessTask","data","logger","videoLoggerSystem","getLogger","callCid","call","warn","cid","activeCallCid","config","StreamVideoRN","getConfig","taskToRun","foregroundService","android","taskEnded","Promise","resolve","ownResolver","debug","e","error"],"sourceRoot":"../../../src","sources":["utils/keepCallAliveHeadlessTask.ts"],"mappings":";;;;;;AAAA,IAAAA,YAAA,GAAAC,OAAA;AAEA,IAAAC,YAAA,GAAAD,OAAA;AACA,IAAAE,cAAA,GAAAF,OAAA;AAEO,MAAMG,kCAAkC,GAAAC,OAAA,CAAAD,kCAAA,GAAG,0BAA0B;;AAE5E;AACA;AACA;AACA;AACO,MAAME,oBAAmD,GAAAD,OAAA,CAAAC,oBAAA,GAAG;EACjEC,OAAO,EAAEC;AACX,CAAC;AAED,IAAIC,kBAA4C;;AAEhD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAMC,4BAA4B,GAAGA,CAAA,KAAM;EAChDD,kBAAkB,GAAG,CAAC;EACtBA,kBAAkB,GAAGD,SAAS;AAChC,CAAC;AAACH,OAAA,CAAAK,4BAAA,GAAAA,4BAAA;AAEF,SAASC,qCAAqCA,CAAA,EAAG;EAC/C,IAAIC,qBAAQ,CAACC,EAAE,KAAK,SAAS,EAAE;EAE/BC,wBAAW,CAACC,oBAAoB,CAC9BX,kCAAkC,EAClC,MAAM,MAAOY,IAAsC,IAAK;IACtD,MAAMC,MAAM,GAAGC,8BAAiB,CAACC,SAAS,CACxC,+BACF,CAAC;IACD,MAAMC,OAAO,GAAGJ,IAAI,EAAEI,OAAO;IAE7B,MAAMC,IAAI,GAAGf,oBAAoB,CAACC,OAAO;IACzC,IAAI,CAACc,IAAI,EAAE;MACTJ,MAAM,CAACK,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/CH,MAAM,CAACK,IAAI,CACT,+DAA+D,EAC/D;QAAEF,OAAO;QAAEI,aAAa,EAAEH,IAAI,CAACE;MAAI,CACrC,CAAC;MACD;IACF;IAEA,MAAME,MAAM,GAAGC,4BAAa,CAACC,SAAS,CAAC,CAAC;IACxC,MAAMC,SAAS,GAAGH,MAAM,CAACI,iBAAiB,CAACC,OAAO,CAACF,SAAS;IAC5D;IACAlB,4BAA4B,CAAC,CAAC;IAC9B,MAAMqB,SAAS,GAAG,IAAIC,OAAO,CAAQC,OAAO,IAAK;MAC/CxB,kBAAkB,GAAGwB,OAAO;IAC9B,CAAC,CAAC;IACF,MAAMC,WAAW,GAAGzB,kBAAkB;;IAEtC;IACA;IACA;IACA;IACA;IACA,CAAC,YAAY;MACX,IAAI;QACF,MAAMmB,SAAS,CAACP,IAAI,CAAC;QACrBJ,MAAM,CAACkB,KAAK,CACV,4EACF,CAAC;MACH,CAAC,CAAC,OAAOC,CAAC,EAAE;QACVnB,MAAM,CAACoB,KAAK,CAAC,iCAAiC,EAAED,CAAC,CAAC;MACpD;IACF,CAAC,EAAE,CAAC;IAEJ,IAAI;MACF,MAAML,SAAS;IACjB,CAAC,SAAS;MACR;MACA;MACA,IAAItB,kBAAkB,KAAKyB,WAAW,EAAE;QACtCzB,kBAAkB,GAAGD,SAAS;MAChC;IACF;EACF,CACF,CAAC;AACH;AAEAG,qCAAqC,CAAC,CAAC","ignoreList":[]}
|