@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
|
@@ -21,7 +21,7 @@ export const useCallingExpWithCallingStateEffect = () => {
|
|
|
21
21
|
} = useCallStateHooks();
|
|
22
22
|
const activeCall = useCall();
|
|
23
23
|
const {
|
|
24
|
-
|
|
24
|
+
optimisticStatus,
|
|
25
25
|
microphone
|
|
26
26
|
} = useMicrophoneState();
|
|
27
27
|
const callMembers = useCallMembers();
|
|
@@ -31,7 +31,7 @@ export const useCallingExpWithCallingStateEffect = () => {
|
|
|
31
31
|
const callCustomDisplayName = activeCall?.state.custom?.display_name;
|
|
32
32
|
const currentUserId = activeCall?.currentUserId;
|
|
33
33
|
const isIncoming = activeCall?.ringing && !activeCall?.isCreatedByMe || false;
|
|
34
|
-
const callDisplayName = useMemo(() => callCustomDisplayName
|
|
34
|
+
const callDisplayName = useMemo(() => callCustomDisplayName || getCallDisplayName(callMembers, participants, currentUserId), [callMembers, participants, currentUserId, callCustomDisplayName]);
|
|
35
35
|
useEffect(() => {
|
|
36
36
|
const callingx = getCallingxLibIfAvailable();
|
|
37
37
|
if (!callingx?.isSetup || !activeCall) {
|
|
@@ -81,7 +81,9 @@ export const useCallingExpWithCallingStateEffect = () => {
|
|
|
81
81
|
logger.debug(`useCallingExpWithCallingStateEffect:No active call cid to update callingx: ${activeCallCid} isCallTracked: ${isCallTracked}`);
|
|
82
82
|
return;
|
|
83
83
|
}
|
|
84
|
-
callingx.updateDisplay(activeCallCid, createdByUserId ?? callDisplayName, callDisplayName, isIncoming)
|
|
84
|
+
callingx.updateDisplay(activeCallCid, createdByUserId ?? callDisplayName, callDisplayName, isIncoming).catch(error => {
|
|
85
|
+
logger.debug(`useCallingExpWithCallingStateEffect: Error updating display in callingx: ${activeCallCid}`, error);
|
|
86
|
+
});
|
|
85
87
|
}, [activeCallCid, createdByUserId, callDisplayName, isIncoming]);
|
|
86
88
|
|
|
87
89
|
// Sync microphone mute state from app → CallKit
|
|
@@ -95,8 +97,12 @@ export const useCallingExpWithCallingStateEffect = () => {
|
|
|
95
97
|
logger.debug(`useCallingExpWithCallingStateEffect: No active call cid to set muted in calling exp: ${activeCallCid} isCallTracked: ${isCallTracked}`);
|
|
96
98
|
return;
|
|
97
99
|
}
|
|
98
|
-
|
|
99
|
-
|
|
100
|
+
if (optimisticStatus === undefined) {
|
|
101
|
+
logger.debug(`useCallingExpWithCallingStateEffect: mic status is not resolved yet, skipping mute sync for: ${activeCallCid}`);
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
callingx.setMutedCall(activeCallCid, optimisticStatus === 'disabled');
|
|
105
|
+
}, [activeCallCid, optimisticStatus]);
|
|
100
106
|
|
|
101
107
|
// Sync mute state from CallKit → app (only for system-initiated mute actions)
|
|
102
108
|
useEffect(() => {
|
|
@@ -120,7 +126,7 @@ export const useCallingExpWithCallingStateEffect = () => {
|
|
|
120
126
|
logger.debug(`useCallingExpWithCallingStateEffect: No active call cid to set muted in calling exp: ${activeCallCid} isCallTracked: ${isCallTracked} callId: ${callId}`);
|
|
121
127
|
return;
|
|
122
128
|
}
|
|
123
|
-
const isCurrentlyMuted = microphone.state.
|
|
129
|
+
const isCurrentlyMuted = microphone.state.optimisticStatus === 'disabled';
|
|
124
130
|
if (isCurrentlyMuted === muted) {
|
|
125
131
|
logger.debug(`useCallingExpWithCallingStateEffect: Mic toggle is already in the desired state: ${muted} for call: ${activeCallCid}`);
|
|
126
132
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["CallingState","videoLoggerSystem","useCall","useCallStateHooks","useEffect","useMemo","Platform","AudioDeviceModule","filter","take","getCallDisplayName","getCallingxLibIfAvailable","logger","getLogger","useCallingExpWithCallingStateEffect","useMicrophoneState","useParticipants","useCallMembers","activeCall","
|
|
1
|
+
{"version":3,"names":["CallingState","videoLoggerSystem","useCall","useCallStateHooks","useEffect","useMemo","Platform","AudioDeviceModule","filter","take","getCallDisplayName","getCallingxLibIfAvailable","logger","getLogger","useCallingExpWithCallingStateEffect","useMicrophoneState","useParticipants","useCallMembers","activeCall","optimisticStatus","microphone","callMembers","participants","activeCallCid","cid","createdByUserId","state","createdBy","id","callCustomDisplayName","custom","display_name","currentUserId","isIncoming","ringing","isCreatedByMe","callDisplayName","callingx","isSetup","shouldMakeCallActive","call","isOngoingCallsEnabled","subscription","callingState$","pipe","callingState","JOINED","isCallTracked","subscribe","setCurrentCallActive","unsubscribe","debug","endCallWithReason","catch","error","updateDisplay","undefined","setMutedCall","addEventListener","event","callId","muted","isCurrentlyMuted","disable","enable","remove","activateSubscription","tracer","trace","deactivateSubscription","OS","timeouts","Set","traceRecordingState","trigger","status","isRecording","isEngineRunning","isMicrophoneMuted","warn","scheduleCheck","delayMs","timeout","setTimeout","delete","add","joinedSubscription","activationSubscription","forEach","clearTimeout","clear"],"sourceRoot":"../../../../src","sources":["hooks/push/useCallingExpWithCallingStateEffect.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -5,7 +5,7 @@ import { useEffect, useRef } from 'react';
|
|
|
5
5
|
import { StreamVideoRN } from '../utils';
|
|
6
6
|
import { AppState, NativeModules, PermissionsAndroid, Platform } from 'react-native';
|
|
7
7
|
import { CallingState, videoLoggerSystem } from '@stream-io/video-client';
|
|
8
|
-
import { keepCallAliveCallRef } from '../utils/keepCallAliveHeadlessTask';
|
|
8
|
+
import { endKeepCallAliveHeadlessTask, keepCallAliveCallRef } from '../utils/keepCallAliveHeadlessTask';
|
|
9
9
|
import { getCallingxLibIfAvailable } from '../utils/push/libs';
|
|
10
10
|
async function stopForegroundServiceNoThrow() {
|
|
11
11
|
const logger = videoLoggerSystem.getLogger('stopForegroundServiceNoThrow');
|
|
@@ -15,6 +15,10 @@ async function stopForegroundServiceNoThrow() {
|
|
|
15
15
|
logger.warn('Failed to stop keep-call-alive foreground service', e);
|
|
16
16
|
}
|
|
17
17
|
}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* @returns true when the native foreground service was asked to start.
|
|
21
|
+
*/
|
|
18
22
|
async function startForegroundService(call_cid) {
|
|
19
23
|
const logger = videoLoggerSystem.getLogger('startForegroundService');
|
|
20
24
|
const isCallAliveConfigured = await (async () => {
|
|
@@ -26,14 +30,14 @@ async function startForegroundService(call_cid) {
|
|
|
26
30
|
}
|
|
27
31
|
})();
|
|
28
32
|
if (!isCallAliveConfigured) {
|
|
29
|
-
logger.
|
|
30
|
-
return;
|
|
33
|
+
logger.warn('KeepCallAlive is not configured, the call will not survive the app going to the ' + 'background: audio publishing stops and the user is eventually dropped from the call. ' + 'Declare android.permission.FOREGROUND_SERVICE and ' + 'android.permission.FOREGROUND_SERVICE_MEDIA_PLAYBACK in the app manifest (see logcat, ' + 'tag StreamVideoReactNative, for the exact list of missing permissions).');
|
|
34
|
+
return false;
|
|
31
35
|
}
|
|
32
36
|
// Check for notification permission (Android 13+) before starting the service.
|
|
33
37
|
const hasPostNotificationsPermission = Number(Platform.Version) < 33 || (await PermissionsAndroid.check(PermissionsAndroid.PERMISSIONS.POST_NOTIFICATIONS));
|
|
34
38
|
if (!hasPostNotificationsPermission) {
|
|
35
39
|
logger.info('Notification permission not granted, can not start foreground service to keep the call alive');
|
|
36
|
-
return;
|
|
40
|
+
return false;
|
|
37
41
|
}
|
|
38
42
|
const videoConfig = StreamVideoRN.getConfig();
|
|
39
43
|
const foregroundServiceConfig = videoConfig.foregroundService;
|
|
@@ -44,12 +48,25 @@ async function startForegroundService(call_cid) {
|
|
|
44
48
|
// NOTE: we use requestAnimationFrame to ensure that the foreground service is started after all the current UI operations are done
|
|
45
49
|
// this is a workaround for the crash - android.app.RemoteServiceException$ForegroundServiceDidNotStartInTimeException: Context.startForegroundService() did not then call Service.startForeground()
|
|
46
50
|
// this crash was reproducible only in some android devices
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
51
|
+
return new Promise(resolve => {
|
|
52
|
+
requestAnimationFrame(async () => {
|
|
53
|
+
// The service declares the camera/microphone foreground service types, which are
|
|
54
|
+
// while-in-use permissions: Android requires startForegroundService() to be called while the
|
|
55
|
+
// app has a visible activity, otherwise the start is rejected. The frame we deferred to can
|
|
56
|
+
// land after the app left the foreground, so re-check before calling native.
|
|
57
|
+
if (AppState.currentState !== 'active') {
|
|
58
|
+
logger.info('App is no longer in the foreground, not starting the keep-call-alive foreground service');
|
|
59
|
+
resolve(false);
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
try {
|
|
63
|
+
await NativeModules.StreamVideoReactNative.startKeepCallAliveService(call_cid, channel.id, channel.name, notificationTexts.title, notificationTexts.body, smallIconName ?? null);
|
|
64
|
+
resolve(true);
|
|
65
|
+
} catch (e) {
|
|
66
|
+
logger.warn('Failed to start keep-call-alive foreground service', e);
|
|
67
|
+
resolve(false);
|
|
68
|
+
}
|
|
69
|
+
});
|
|
53
70
|
});
|
|
54
71
|
}
|
|
55
72
|
|
|
@@ -110,8 +127,15 @@ export const useAndroidKeepCallAliveEffect = () => {
|
|
|
110
127
|
if (foregroundServiceStartedRef.current) {
|
|
111
128
|
return;
|
|
112
129
|
}
|
|
113
|
-
|
|
114
|
-
|
|
130
|
+
try {
|
|
131
|
+
// only mark as started when native actually accepted the start, so that a later render
|
|
132
|
+
// while still joined can retry.
|
|
133
|
+
foregroundServiceStartedRef.current = await startForegroundService(activeCallCid);
|
|
134
|
+
} catch (e) {
|
|
135
|
+
// run() is intentionally not awaited, so anything thrown here would surface as an
|
|
136
|
+
// unhandled rejection. Leave the ref false so a later render can retry.
|
|
137
|
+
videoLoggerSystem.getLogger('useAndroidKeepCallAliveEffect').warn('Failed to start the keep-call-alive foreground service', e);
|
|
138
|
+
}
|
|
115
139
|
};
|
|
116
140
|
|
|
117
141
|
// ensure that app is active before running the function
|
|
@@ -130,6 +154,8 @@ export const useAndroidKeepCallAliveEffect = () => {
|
|
|
130
154
|
} else if (isCallEnded) {
|
|
131
155
|
if (foregroundServiceStartedRef.current) {
|
|
132
156
|
keepCallAliveCallRef.current = undefined;
|
|
157
|
+
// let the headless task resolve so RN unwinds it, then stop the foreground service
|
|
158
|
+
endKeepCallAliveHeadlessTask();
|
|
133
159
|
// stop foreground service when the call is not active
|
|
134
160
|
stopForegroundServiceNoThrow();
|
|
135
161
|
foregroundServiceStartedRef.current = false;
|
|
@@ -142,6 +168,7 @@ export const useAndroidKeepCallAliveEffect = () => {
|
|
|
142
168
|
// stop foreground service when this effect is unmounted
|
|
143
169
|
if (foregroundServiceStartedRef.current) {
|
|
144
170
|
keepCallAliveCallRef.current = undefined;
|
|
171
|
+
endKeepCallAliveHeadlessTask();
|
|
145
172
|
stopForegroundServiceNoThrow();
|
|
146
173
|
foregroundServiceStartedRef.current = false;
|
|
147
174
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["useCall","useCallStateHooks","useEffect","useRef","StreamVideoRN","AppState","NativeModules","PermissionsAndroid","Platform","CallingState","videoLoggerSystem","keepCallAliveCallRef","getCallingxLibIfAvailable","stopForegroundServiceNoThrow","logger","getLogger","StreamVideoReactNative","stopKeepCallAliveService","e","warn","startForegroundService","call_cid","isCallAliveConfigured","
|
|
1
|
+
{"version":3,"names":["useCall","useCallStateHooks","useEffect","useRef","StreamVideoRN","AppState","NativeModules","PermissionsAndroid","Platform","CallingState","videoLoggerSystem","endKeepCallAliveHeadlessTask","keepCallAliveCallRef","getCallingxLibIfAvailable","stopForegroundServiceNoThrow","logger","getLogger","StreamVideoReactNative","stopKeepCallAliveService","e","warn","startForegroundService","call_cid","isCallAliveConfigured","hasPostNotificationsPermission","Number","Version","check","PERMISSIONS","POST_NOTIFICATIONS","info","videoConfig","getConfig","foregroundServiceConfig","foregroundService","notificationTexts","android","channel","smallIconName","push","smallIcon","Promise","resolve","requestAnimationFrame","currentState","startKeepCallAliveService","id","name","title","body","useAndroidKeepCallAliveEffect","foregroundServiceStartedRef","callingxKeepAliveOwnerRef","undefined","call","current","activeCallCid","cid","useCallCallingState","callingState","isCallJoined","JOINED","isRingingCall","ringing","shouldStartForegroundService","OS","callingx","isCallingxManaged","isSetup","isOngoingCallsEnabled","isCallEnded","IDLE","LEFT","currentOwner","releaseBackgroundTask","catch","owner","acquireBackgroundTask","run","sub","addEventListener","nextAppState","remove"],"sourceRoot":"../../../src","sources":["hooks/useAndroidKeepCallAliveEffect.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -2,56 +2,29 @@
|
|
|
2
2
|
|
|
3
3
|
import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
|
4
4
|
import { NativeModules } from 'react-native';
|
|
5
|
-
import {
|
|
6
|
-
import { CallingState, videoLoggerSystem } from '@stream-io/video-client';
|
|
5
|
+
import { CallingState, DEFAULT_LOOPBACK_RECORDING_DURATION_MS, LOOPBACK_STREAMS_WAIT_TIMEOUT_MS, clampLoopbackRecordingDuration, getLoopbackStreams, videoLoggerSystem, waitForLoopbackStreams, withLoopbackAudioEnabled } from '@stream-io/video-client';
|
|
7
6
|
import { useCall, useCallStateHooks } from '@stream-io/video-react-bindings';
|
|
8
7
|
|
|
9
8
|
/** @internal */
|
|
10
9
|
const {
|
|
11
10
|
StreamVideoReactNative
|
|
12
11
|
} = NativeModules;
|
|
13
|
-
|
|
14
|
-
// Upper bound on how long `startRecording` will wait for the SFU to
|
|
15
|
-
// echo loopback tracks back via the Subscriber. Tuned generously since
|
|
16
|
-
// this includes connection setup; consumers that want shorter feedback
|
|
17
|
-
// should call `stopRecording` to cancel the wait early.
|
|
18
|
-
const STREAMS_WAIT_TIMEOUT_MS = 10 * 1000;
|
|
19
|
-
const DEFAULT_RECORDING_DURATION = 10 * 1000;
|
|
20
|
-
const MIN_RECORDING_DURATION = 5 * 1000;
|
|
21
|
-
const MAX_RECORDING_DURATION = 2 * 60 * 1000;
|
|
22
|
-
/**
|
|
23
|
-
* Records the SFU loopback streams (audio + video) on the local participant
|
|
24
|
-
* to a local MP4 file. Designed for the `allowOwnTracksLoopback` pre-call test mode:
|
|
25
|
-
* the SFU echoes the caller's published tracks back through the Subscriber
|
|
26
|
-
* peer connection. The hook identifies the loopback streams on the local
|
|
27
|
-
* participant by reference inequality against
|
|
28
|
-
* `call.camera.state.mediaStream` / `call.microphone.state.mediaStream` —
|
|
29
|
-
* the canonical references to the local capture — and captures them.
|
|
30
|
-
*/
|
|
12
|
+
/** Records SFU loopback streams to a local MP4 file. */
|
|
31
13
|
export function useLoopbackRecording() {
|
|
32
14
|
const call = useCall();
|
|
33
15
|
const {
|
|
34
16
|
useCallCallingState,
|
|
35
17
|
useParticipantCount,
|
|
36
|
-
useLocalParticipant
|
|
37
|
-
useCameraState,
|
|
38
|
-
useMicrophoneState
|
|
18
|
+
useLocalParticipant
|
|
39
19
|
} = useCallStateHooks();
|
|
40
20
|
const callingState = useCallCallingState();
|
|
41
21
|
const participantCount = useParticipantCount();
|
|
42
22
|
const localParticipant = useLocalParticipant();
|
|
43
|
-
const {
|
|
44
|
-
mediaStream: cameraStream
|
|
45
|
-
} = useCameraState();
|
|
46
|
-
const {
|
|
47
|
-
mediaStream: microphoneStream
|
|
48
|
-
} = useMicrophoneState();
|
|
49
23
|
const [recordingState, setRecordingState] = useState('idle');
|
|
50
24
|
const recordingStateRef = useRef('idle');
|
|
51
25
|
const isMountedRef = useRef(true);
|
|
52
|
-
// Used to abort the awaiting-streams wait on stop / leave / unmount.
|
|
53
26
|
const awaitAbortRef = useRef(null);
|
|
54
|
-
const loopbackStreams = useMemo(() =>
|
|
27
|
+
const loopbackStreams = useMemo(() => getLoopbackStreams(call, localParticipant), [call, localParticipant]);
|
|
55
28
|
const updateState = useCallback(next => {
|
|
56
29
|
recordingStateRef.current = next;
|
|
57
30
|
if (isMountedRef.current) {
|
|
@@ -77,7 +50,7 @@ export function useLoopbackRecording() {
|
|
|
77
50
|
}, []);
|
|
78
51
|
const startRecording = useCallback(async ({
|
|
79
52
|
includeVideo = true,
|
|
80
|
-
maxDurationMs =
|
|
53
|
+
maxDurationMs = DEFAULT_LOOPBACK_RECORDING_DURATION_MS
|
|
81
54
|
} = {}) => {
|
|
82
55
|
if (!call) {
|
|
83
56
|
return null;
|
|
@@ -92,51 +65,30 @@ export function useLoopbackRecording() {
|
|
|
92
65
|
}
|
|
93
66
|
awaitAbortRef.current = new AbortController();
|
|
94
67
|
updateState('awaiting-streams');
|
|
95
|
-
let audioTrack;
|
|
96
68
|
try {
|
|
97
69
|
const streams = await waitForLoopbackStreams(call, {
|
|
98
70
|
includeVideo,
|
|
99
71
|
signal: awaitAbortRef.current.signal,
|
|
100
|
-
timeoutMs:
|
|
72
|
+
timeoutMs: LOOPBACK_STREAMS_WAIT_TIMEOUT_MS
|
|
101
73
|
});
|
|
102
74
|
if (streams === null) {
|
|
103
75
|
videoLoggerSystem.getLogger('useLoopbackRecording').warn('timed out waiting for loopback streams');
|
|
104
76
|
return null;
|
|
105
77
|
}
|
|
106
|
-
audioTrack = streams.audioTrack;
|
|
107
|
-
const videoTrackId = streams.videoTrack?.id;
|
|
108
|
-
|
|
109
|
-
// The loopback audio track lands disabled (the SDK default-mutes
|
|
110
|
-
// it to prevent echo). Enable it so the native recording
|
|
111
|
-
// pipeline receives PCM; `finally` returns it to muted.
|
|
112
|
-
if (audioTrack) {
|
|
113
|
-
audioTrack.enabled = true;
|
|
114
|
-
}
|
|
115
78
|
updateState('recording');
|
|
116
|
-
const clampedDuration = Math.min(MAX_RECORDING_DURATION, Math.max(MIN_RECORDING_DURATION, maxDurationMs));
|
|
117
|
-
|
|
118
|
-
// Pre-size the native encoder to the publisher's max video
|
|
119
|
-
// publish-option dimension. Without this, the encoder locks to
|
|
120
|
-
// whatever the SFU happens to echo *first* and stays there for the
|
|
121
|
-
// rest of the recording even after the network improves and
|
|
122
|
-
// higher layers arrive.
|
|
123
79
|
const publishMaxDim = call.getMaxVideoPublishDimension();
|
|
124
80
|
try {
|
|
125
|
-
|
|
126
|
-
videoTrackId,
|
|
127
|
-
maxDurationMs:
|
|
81
|
+
return await withLoopbackAudioEnabled(streams, () => StreamVideoReactNative.startTrackRecording({
|
|
82
|
+
videoTrackId: streams.videoTrack?.id,
|
|
83
|
+
maxDurationMs: clampLoopbackRecordingDuration(maxDurationMs),
|
|
128
84
|
targetWidth: publishMaxDim?.width,
|
|
129
85
|
targetHeight: publishMaxDim?.height
|
|
130
|
-
});
|
|
131
|
-
return uri;
|
|
86
|
+
}));
|
|
132
87
|
} catch (error) {
|
|
133
88
|
videoLoggerSystem.getLogger('useLoopbackRecording').error('failed to start recording', error);
|
|
134
89
|
throw new Error('failed to start recording');
|
|
135
90
|
}
|
|
136
91
|
} finally {
|
|
137
|
-
if (audioTrack) {
|
|
138
|
-
audioTrack.enabled = false;
|
|
139
|
-
}
|
|
140
92
|
awaitAbortRef.current = null;
|
|
141
93
|
updateState('idle');
|
|
142
94
|
}
|
|
@@ -158,21 +110,12 @@ export function useLoopbackRecording() {
|
|
|
158
110
|
throw new Error('failed to get recordings');
|
|
159
111
|
}
|
|
160
112
|
}, []);
|
|
161
|
-
|
|
162
|
-
// Auto-stop on call leave / end. Aborts an awaiting-streams wait or
|
|
163
|
-
// signals native finalisation depending on which phase we're in.
|
|
164
|
-
// Without this, leaving the call mid-recording would leave native
|
|
165
|
-
// encoders mid-write while the SFU subscriber tracks end under their
|
|
166
|
-
// feet — undefined final file state.
|
|
167
113
|
useEffect(() => {
|
|
168
114
|
if (callingState === CallingState.LEFT || callingState === CallingState.IDLE) {
|
|
169
115
|
videoLoggerSystem.getLogger('useLoopbackRecording').debug('auto-stopping recording on call leave / end');
|
|
170
116
|
stopRecording().catch(() => {});
|
|
171
117
|
}
|
|
172
118
|
}, [callingState, stopRecording]);
|
|
173
|
-
|
|
174
|
-
// Auto-stop if another participant joins. Loopback recording is a
|
|
175
|
-
// single-user pre-call test.
|
|
176
119
|
useEffect(() => {
|
|
177
120
|
if (recordingState !== 'idle' && participantCount > 1) {
|
|
178
121
|
stopRecording().catch(() => {});
|
|
@@ -197,64 +140,4 @@ export function useLoopbackRecording() {
|
|
|
197
140
|
loopbackAudioStream: loopbackStreams.loopbackAudioStream
|
|
198
141
|
};
|
|
199
142
|
}
|
|
200
|
-
function getLoopbackStreamsFor(participant, cameraStream, microphoneStream) {
|
|
201
|
-
return {
|
|
202
|
-
loopbackVideoStream: participant?.videoStream && participant.videoStream !== cameraStream ? participant.videoStream : undefined,
|
|
203
|
-
loopbackAudioStream: participant?.audioStream && participant.audioStream !== microphoneStream ? participant.audioStream : undefined
|
|
204
|
-
};
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
/**
|
|
208
|
-
* Subscribe to `localParticipant$` and resolve once the requested loopback
|
|
209
|
-
* streams are present on the participant. Aborts cleanly on `signal`
|
|
210
|
-
* (resolves `null`) and rejects on timeout.
|
|
211
|
-
*/
|
|
212
|
-
function waitForLoopbackStreams(call, opts) {
|
|
213
|
-
return new Promise((resolve, reject) => {
|
|
214
|
-
const initial = getLoopbackStreams(call.state.localParticipant, call.camera.state.mediaStream, call.microphone.state.mediaStream, opts.includeVideo);
|
|
215
|
-
if (initial) {
|
|
216
|
-
resolve(initial);
|
|
217
|
-
return;
|
|
218
|
-
}
|
|
219
|
-
const cleanup = () => {
|
|
220
|
-
subscription.unsubscribe();
|
|
221
|
-
if (timeoutId !== undefined) {
|
|
222
|
-
clearTimeout(timeoutId);
|
|
223
|
-
}
|
|
224
|
-
opts.signal.removeEventListener('abort', onAbort);
|
|
225
|
-
};
|
|
226
|
-
const onAbort = () => {
|
|
227
|
-
cleanup();
|
|
228
|
-
resolve(null);
|
|
229
|
-
};
|
|
230
|
-
opts.signal.addEventListener('abort', onAbort);
|
|
231
|
-
const timeoutId = setTimeout(() => {
|
|
232
|
-
cleanup();
|
|
233
|
-
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.'));
|
|
234
|
-
}, opts.timeoutMs);
|
|
235
|
-
const subscription = combineLatest([call.state.localParticipant$, call.camera.state.mediaStream$, call.microphone.state.mediaStream$]).subscribe(([participant, cameraStream, microphoneStream]) => {
|
|
236
|
-
const ready = getLoopbackStreams(participant, cameraStream, microphoneStream, opts.includeVideo);
|
|
237
|
-
if (ready) {
|
|
238
|
-
cleanup();
|
|
239
|
-
resolve(ready);
|
|
240
|
-
}
|
|
241
|
-
});
|
|
242
|
-
});
|
|
243
|
-
}
|
|
244
|
-
function getLoopbackStreams(participant, cameraStream, microphoneStream, includeVideo) {
|
|
245
|
-
if (!participant) return undefined;
|
|
246
|
-
const {
|
|
247
|
-
loopbackAudioStream,
|
|
248
|
-
loopbackVideoStream
|
|
249
|
-
} = getLoopbackStreamsFor(participant, cameraStream, microphoneStream);
|
|
250
|
-
const audioTrack = loopbackAudioStream?.getAudioTracks()[0];
|
|
251
|
-
const videoTrack = includeVideo ? loopbackVideoStream?.getVideoTracks()[0] : undefined;
|
|
252
|
-
if (!audioTrack || includeVideo && !videoTrack) {
|
|
253
|
-
return undefined;
|
|
254
|
-
}
|
|
255
|
-
return {
|
|
256
|
-
audioTrack,
|
|
257
|
-
videoTrack
|
|
258
|
-
};
|
|
259
|
-
}
|
|
260
143
|
//# sourceMappingURL=useLoopbackRecording.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["useCallback","useEffect","useMemo","useRef","useState","NativeModules","
|
|
1
|
+
{"version":3,"names":["useCallback","useEffect","useMemo","useRef","useState","NativeModules","CallingState","DEFAULT_LOOPBACK_RECORDING_DURATION_MS","LOOPBACK_STREAMS_WAIT_TIMEOUT_MS","clampLoopbackRecordingDuration","getLoopbackStreams","videoLoggerSystem","waitForLoopbackStreams","withLoopbackAudioEnabled","useCall","useCallStateHooks","StreamVideoReactNative","useLoopbackRecording","call","useCallCallingState","useParticipantCount","useLocalParticipant","callingState","participantCount","localParticipant","recordingState","setRecordingState","recordingStateRef","isMountedRef","awaitAbortRef","loopbackStreams","updateState","next","current","stopRecording","getLogger","debug","abort","stopTrackRecording","error","Error","startRecording","includeVideo","maxDurationMs","warn","state","AbortController","streams","signal","timeoutMs","publishMaxDim","getMaxVideoPublishDimension","startTrackRecording","videoTrackId","videoTrack","id","targetWidth","width","targetHeight","height","clearRecordings","clearStreamRecordings","getRecordings","list","getStreamRecordings","LEFT","IDLE","catch","loopbackVideoStream","loopbackAudioStream"],"sourceRoot":"../../../src","sources":["hooks/useLoopbackRecording.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import pushLogoutCallbacks from '../internal/pushLogoutCallback';
|
|
4
4
|
import { setupIosVoipPushEvents } from '../push/setupIosVoipPushEvents';
|
|
5
|
+
import { setupAndroidPushEvents } from '../push/setupAndroidPushEvents';
|
|
5
6
|
import { setupCallingExpEvents } from '../push/setupCallingExpEvents';
|
|
6
7
|
import { extractCallingExpOptions, getCallingxLib } from '../push/libs/callingx';
|
|
7
8
|
import { NativeModules, Platform } from 'react-native';
|
|
@@ -104,6 +105,7 @@ export class StreamVideoRN {
|
|
|
104
105
|
}
|
|
105
106
|
setupCallingExpEvents(pushConfig);
|
|
106
107
|
setupIosVoipPushEvents(pushConfig);
|
|
108
|
+
setupAndroidPushEvents(pushConfig);
|
|
107
109
|
}
|
|
108
110
|
static getConfig() {
|
|
109
111
|
return this.config;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["pushLogoutCallbacks","setupIosVoipPushEvents","setupCallingExpEvents","extractCallingExpOptions","getCallingxLib","NativeModules","Platform","videoLoggerSystem","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","getLogger","info","JSON","stringify","options","setup","Error","getConfig","onPushLogout","callbacks","current","resolve","all","map","callback","then","clearPushLogoutCallbacks","playBusyTone","StreamVideoReactNative","stopBusyTone","androidHasAudioOutputHardware","OS","hasAudioOutputHardware","androidHasMicrophoneHardware","hasMicrophoneHardware","androidHasCameraHardware","hasCameraHardware"],"sourceRoot":"../../../../src","sources":["utils/StreamVideoRN/index.ts"],"mappings":"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
|
|
1
|
+
{"version":3,"names":["pushLogoutCallbacks","setupIosVoipPushEvents","setupAndroidPushEvents","setupCallingExpEvents","extractCallingExpOptions","getCallingxLib","NativeModules","Platform","videoLoggerSystem","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","getLogger","info","JSON","stringify","options","setup","Error","getConfig","onPushLogout","callbacks","current","resolve","all","map","callback","then","clearPushLogoutCallbacks","playBusyTone","StreamVideoReactNative","stopBusyTone","androidHasAudioOutputHardware","OS","hasAudioOutputHardware","androidHasMicrophoneHardware","hasMicrophoneHardware","androidHasCameraHardware","hasCameraHardware"],"sourceRoot":"../../../../src","sources":["utils/StreamVideoRN/index.ts"],"mappings":"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","ignoreList":[]}
|