@stream-io/video-react-native-sdk 1.22.1-alpha.1 → 1.22.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/CHANGELOG.md +2816 -0
- package/dist/commonjs/components/Participant/ParticipantView/VideoRenderer/TrackSubscriber.js +79 -0
- package/dist/commonjs/components/Participant/ParticipantView/VideoRenderer/TrackSubscriber.js.map +1 -0
- package/dist/commonjs/components/Participant/ParticipantView/{VideoRenderer.js → VideoRenderer/index.js} +16 -88
- package/dist/commonjs/components/Participant/ParticipantView/VideoRenderer/index.js.map +1 -0
- package/dist/commonjs/version.js +1 -1
- package/dist/commonjs/version.js.map +1 -1
- package/dist/module/components/Participant/ParticipantView/VideoRenderer/TrackSubscriber.js +73 -0
- package/dist/module/components/Participant/ParticipantView/VideoRenderer/TrackSubscriber.js.map +1 -0
- package/dist/module/components/Participant/ParticipantView/{VideoRenderer.js → VideoRenderer/index.js} +16 -89
- package/dist/module/components/Participant/ParticipantView/VideoRenderer/index.js.map +1 -0
- package/dist/module/version.js +1 -1
- package/dist/module/version.js.map +1 -1
- package/dist/typescript/components/Participant/ParticipantView/VideoRenderer/TrackSubscriber.d.ts +25 -0
- package/dist/typescript/components/Participant/ParticipantView/VideoRenderer/TrackSubscriber.d.ts.map +1 -0
- package/dist/typescript/components/Participant/ParticipantView/{VideoRenderer.d.ts → VideoRenderer/index.d.ts} +2 -2
- package/dist/typescript/components/Participant/ParticipantView/VideoRenderer/index.d.ts.map +1 -0
- package/dist/typescript/version.d.ts +1 -1
- package/dist/typescript/version.d.ts.map +1 -1
- package/ios/StreamInCallManager.swift +2 -2
- package/package.json +6 -6
- package/src/components/Participant/ParticipantView/VideoRenderer/TrackSubscriber.tsx +125 -0
- package/src/components/Participant/ParticipantView/{VideoRenderer.tsx → VideoRenderer/index.tsx} +18 -107
- package/src/version.ts +1 -1
- package/dist/commonjs/components/Participant/ParticipantView/VideoRenderer.js.map +0 -1
- package/dist/module/components/Participant/ParticipantView/VideoRenderer.js.map +0 -1
- package/dist/typescript/components/Participant/ParticipantView/VideoRenderer.d.ts.map +0 -1
- package/ios/StreamVideoReactNative.xcodeproj/project.xcworkspace/xcuserdata/santhoshvaiyapuri.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
- package/ios/StreamVideoReactNative.xcodeproj/xcuserdata/santhoshvaiyapuri.xcuserdatad/xcschemes/xcschememanagement.plist +0 -14
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var _react = require("react");
|
|
8
|
+
var _videoClient = require("@stream-io/video-client");
|
|
9
|
+
var _rxjs = require("rxjs");
|
|
10
|
+
/**
|
|
11
|
+
* This component is used to subscribe to the video + audio track of the participant in the following cases:
|
|
12
|
+
* 1. When the participant starts publishing the video track
|
|
13
|
+
* 2. When the participant changes the video track dimensions
|
|
14
|
+
* 3. When the participant becomes visible
|
|
15
|
+
* 4. On joined callingState, this handles reconnection
|
|
16
|
+
|
|
17
|
+
* This component is used to unsubscribe to video track and subscribe only to the audio track of the participant (by passing undefined dimensions) in the following cases:
|
|
18
|
+
* 1. When the participant stops publishing the video track
|
|
19
|
+
* 2. When the participant becomes invisible
|
|
20
|
+
*/
|
|
21
|
+
const TrackSubscriber = /*#__PURE__*/(0, _react.forwardRef)((props, ref) => {
|
|
22
|
+
const {
|
|
23
|
+
call,
|
|
24
|
+
participantSessionId,
|
|
25
|
+
trackType,
|
|
26
|
+
isVisible
|
|
27
|
+
} = props;
|
|
28
|
+
const dimensions$ = (0, _react.useMemo)(() => {
|
|
29
|
+
return new _rxjs.BehaviorSubject(undefined);
|
|
30
|
+
}, []);
|
|
31
|
+
(0, _react.useEffect)(() => {
|
|
32
|
+
const requestTrackWithDimensions = (debounceType, dimension) => {
|
|
33
|
+
if (dimension && (dimension.width === 0 || dimension.height === 0)) {
|
|
34
|
+
// ignore 0x0 dimensions. this can happen when the video element
|
|
35
|
+
// is not visible (e.g., has display: none).
|
|
36
|
+
// we treat this as "unsubscription" as we don't want to keep
|
|
37
|
+
// consuming bandwidth for a video that is not visible on the screen.
|
|
38
|
+
dimension = undefined;
|
|
39
|
+
}
|
|
40
|
+
call.state.updateParticipantTracks(trackType, {
|
|
41
|
+
[participantSessionId]: {
|
|
42
|
+
dimension
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
call.dynascaleManager.applyTrackSubscriptions(debounceType);
|
|
46
|
+
};
|
|
47
|
+
const isPublishingTrack$ = call.state.participants$.pipe((0, _rxjs.map)(ps => ps.find(p => p.sessionId === participantSessionId)), (0, _rxjs.takeWhile)(p => !!p), (0, _rxjs.distinctUntilChanged)(), (0, _rxjs.distinctUntilKeyChanged)('publishedTracks'), (0, _rxjs.map)(p => trackType === 'videoTrack' ? (0, _videoClient.hasVideo)(p) : (0, _videoClient.hasScreenShare)(p)), (0, _rxjs.distinctUntilChanged)());
|
|
48
|
+
const isJoinedState$ = call.state.callingState$.pipe((0, _rxjs.map)(callingState => callingState === _videoClient.CallingState.JOINED));
|
|
49
|
+
const subscription = (0, _rxjs.combineLatest)([dimensions$, isPublishingTrack$, isJoinedState$]).subscribe(([dimension, isPublishing, isJoined]) => {
|
|
50
|
+
if (isJoined && isPublishing && !isVisible) {
|
|
51
|
+
// the participant is publishing and we are not visible, so we unsubscribe from the video track
|
|
52
|
+
requestTrackWithDimensions(_videoClient.DebounceType.FAST, undefined);
|
|
53
|
+
} else if (isJoined && isPublishing && isVisible && dimension) {
|
|
54
|
+
// the participant is publishing and we are visible and have valid dimensions, so we subscribe to the video track
|
|
55
|
+
requestTrackWithDimensions(_videoClient.DebounceType.IMMEDIATE, dimension);
|
|
56
|
+
} else if (isJoined && !isPublishing) {
|
|
57
|
+
// the participant stopped publishing a track, so we unsubscribe from the video track
|
|
58
|
+
requestTrackWithDimensions(_videoClient.DebounceType.FAST, undefined);
|
|
59
|
+
}
|
|
60
|
+
// if isPublishing but no dimension yet, we wait for dimensions
|
|
61
|
+
});
|
|
62
|
+
return () => {
|
|
63
|
+
subscription.unsubscribe();
|
|
64
|
+
};
|
|
65
|
+
}, [call, participantSessionId, trackType, isVisible, dimensions$]);
|
|
66
|
+
(0, _react.useImperativeHandle)(ref, () => ({
|
|
67
|
+
onLayoutUpdate: event => {
|
|
68
|
+
const dimension = {
|
|
69
|
+
width: Math.trunc(event.nativeEvent.layout.width),
|
|
70
|
+
height: Math.trunc(event.nativeEvent.layout.height)
|
|
71
|
+
};
|
|
72
|
+
dimensions$.next(dimension);
|
|
73
|
+
}
|
|
74
|
+
}), [dimensions$]);
|
|
75
|
+
return null;
|
|
76
|
+
});
|
|
77
|
+
TrackSubscriber.displayName = 'TrackSubscriber';
|
|
78
|
+
var _default = exports.default = TrackSubscriber;
|
|
79
|
+
//# sourceMappingURL=TrackSubscriber.js.map
|
package/dist/commonjs/components/Participant/ParticipantView/VideoRenderer/TrackSubscriber.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_react","require","_videoClient","_rxjs","TrackSubscriber","forwardRef","props","ref","call","participantSessionId","trackType","isVisible","dimensions$","useMemo","BehaviorSubject","undefined","useEffect","requestTrackWithDimensions","debounceType","dimension","width","height","state","updateParticipantTracks","dynascaleManager","applyTrackSubscriptions","isPublishingTrack$","participants$","pipe","map","ps","find","p","sessionId","takeWhile","distinctUntilChanged","distinctUntilKeyChanged","hasVideo","hasScreenShare","isJoinedState$","callingState$","callingState","CallingState","JOINED","subscription","combineLatest","subscribe","isPublishing","isJoined","DebounceType","FAST","IMMEDIATE","unsubscribe","useImperativeHandle","onLayoutUpdate","event","Math","trunc","nativeEvent","layout","next","displayName","_default","exports","default"],"sourceRoot":"../../../../../../src","sources":["components/Participant/ParticipantView/VideoRenderer/TrackSubscriber.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -9,10 +9,12 @@ var _reactNative = require("react-native");
|
|
|
9
9
|
var _reactNativeWebrtc = require("@stream-io/react-native-webrtc");
|
|
10
10
|
var _videoClient = require("@stream-io/video-client");
|
|
11
11
|
var _videoReactBindings = require("@stream-io/video-react-bindings");
|
|
12
|
-
var _ParticipantVideoFallback = require("
|
|
13
|
-
var _ThemeContext = require("
|
|
14
|
-
var _useTrackDimensions = require("
|
|
15
|
-
var _ScreenshotIosContext = require("
|
|
12
|
+
var _ParticipantVideoFallback = require("../ParticipantVideoFallback");
|
|
13
|
+
var _ThemeContext = require("../../../../contexts/ThemeContext");
|
|
14
|
+
var _useTrackDimensions = require("../../../../hooks/useTrackDimensions");
|
|
15
|
+
var _ScreenshotIosContext = require("../../../../contexts/internal/ScreenshotIosContext");
|
|
16
|
+
var _TrackSubscriber = _interopRequireDefault(require("./TrackSubscriber"));
|
|
17
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
16
18
|
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
|
|
17
19
|
const DEFAULT_VIEWPORT_VISIBILITY_STATE = {
|
|
18
20
|
videoTrack: _videoClient.VisibilityState.UNKNOWN,
|
|
@@ -43,16 +45,13 @@ const VideoRenderer = ({
|
|
|
43
45
|
} = (0, _ThemeContext.useTheme)();
|
|
44
46
|
const call = (0, _videoReactBindings.useCall)();
|
|
45
47
|
const {
|
|
46
|
-
useCallCallingState,
|
|
47
48
|
useCameraState,
|
|
48
49
|
useIncomingVideoSettings
|
|
49
50
|
} = (0, _videoReactBindings.useCallStateHooks)();
|
|
51
|
+
const trackSubscriberRef = (0, _react.useRef)(null);
|
|
50
52
|
const {
|
|
51
53
|
isParticipantVideoEnabled
|
|
52
54
|
} = useIncomingVideoSettings();
|
|
53
|
-
const callingState = useCallCallingState();
|
|
54
|
-
const pendingVideoLayoutRef = (0, _react.useRef)(undefined);
|
|
55
|
-
const subscribedVideoLayoutRef = (0, _react.useRef)(undefined);
|
|
56
55
|
const {
|
|
57
56
|
direction
|
|
58
57
|
} = useCameraState();
|
|
@@ -72,7 +71,6 @@ const VideoRenderer = ({
|
|
|
72
71
|
} = participant;
|
|
73
72
|
const isScreenSharing = trackType === 'screenShareTrack';
|
|
74
73
|
const isPublishingVideoTrack = isScreenSharing ? (0, _videoClient.hasScreenShare)(participant) : (0, _videoClient.hasVideo)(participant);
|
|
75
|
-
const hasJoinedCall = callingState === _videoClient.CallingState.JOINED;
|
|
76
74
|
const videoStreamToRender = isScreenSharing ? screenShareStream : videoStream;
|
|
77
75
|
const canShowVideo = !!videoStreamToRender && isVisible && isPublishingVideoTrack && !(0, _videoClient.hasPausedTrack)(participant, trackType) && isParticipantVideoEnabled(participant.sessionId);
|
|
78
76
|
(0, _react.useEffect)(() => {
|
|
@@ -131,91 +129,21 @@ const VideoRenderer = ({
|
|
|
131
129
|
}
|
|
132
130
|
}));
|
|
133
131
|
}
|
|
134
|
-
if (subscribedVideoLayoutRef.current) {
|
|
135
|
-
// when video is enabled again, we want to use the last subscribed dimension to resubscribe
|
|
136
|
-
pendingVideoLayoutRef.current = subscribedVideoLayoutRef.current;
|
|
137
|
-
subscribedVideoLayoutRef.current = undefined;
|
|
138
|
-
}
|
|
139
132
|
}
|
|
140
133
|
}, [sessionId, viewportVisibilityState, isVisible, call, trackType, isLocalParticipant]);
|
|
141
|
-
(0, _react.useEffect)(() => {
|
|
142
|
-
if (!hasJoinedCall && subscribedVideoLayoutRef.current) {
|
|
143
|
-
// when call is joined again, we want to use the last subscribed dimension to resubscribe
|
|
144
|
-
pendingVideoLayoutRef.current = subscribedVideoLayoutRef.current;
|
|
145
|
-
subscribedVideoLayoutRef.current = undefined;
|
|
146
|
-
}
|
|
147
|
-
}, [hasJoinedCall]);
|
|
148
|
-
|
|
149
|
-
/**
|
|
150
|
-
* This effect updates the subscription either
|
|
151
|
-
* 1. when video tracks are published and was unpublished before
|
|
152
|
-
* 2. when the view's visibility changes
|
|
153
|
-
* 3. when call was rejoined
|
|
154
|
-
*/
|
|
155
|
-
(0, _react.useEffect)(() => {
|
|
156
|
-
if (!call || isLocalParticipant) {
|
|
157
|
-
return;
|
|
158
|
-
}
|
|
159
|
-
// NOTE: We only want to update the subscription if the pendingVideoLayoutRef is set
|
|
160
|
-
const updateIsNeeded = pendingVideoLayoutRef.current;
|
|
161
|
-
if (!updateIsNeeded || !isPublishingVideoTrack || !hasJoinedCall) {
|
|
162
|
-
return;
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
// NOTE: When the view is not visible, we want to subscribe to audio only.
|
|
166
|
-
// We unsubscribe their video by setting the dimension to undefined
|
|
167
|
-
const dimension = isVisible ? pendingVideoLayoutRef.current : undefined;
|
|
168
|
-
call.state.updateParticipantTracks(trackType, {
|
|
169
|
-
[sessionId]: {
|
|
170
|
-
dimension
|
|
171
|
-
}
|
|
172
|
-
});
|
|
173
|
-
call.dynascaleManager.applyTrackSubscriptions();
|
|
174
|
-
if (dimension) {
|
|
175
|
-
subscribedVideoLayoutRef.current = pendingVideoLayoutRef.current;
|
|
176
|
-
pendingVideoLayoutRef.current = undefined;
|
|
177
|
-
}
|
|
178
|
-
}, [call, isPublishingVideoTrack, trackType, isVisible, sessionId, hasJoinedCall, isLocalParticipant]);
|
|
179
|
-
(0, _react.useEffect)(() => {
|
|
180
|
-
return () => {
|
|
181
|
-
subscribedVideoLayoutRef.current = undefined;
|
|
182
|
-
pendingVideoLayoutRef.current = undefined;
|
|
183
|
-
};
|
|
184
|
-
}, [trackType, sessionId]);
|
|
185
134
|
const onLayout = event => {
|
|
186
|
-
|
|
187
|
-
return;
|
|
188
|
-
}
|
|
189
|
-
const dimension = {
|
|
190
|
-
width: Math.trunc(event.nativeEvent.layout.width),
|
|
191
|
-
height: Math.trunc(event.nativeEvent.layout.height)
|
|
192
|
-
};
|
|
193
|
-
|
|
194
|
-
// NOTE: If the participant hasn't published a video track yet,
|
|
195
|
-
// or the view is not viewable, we store the dimensions and handle it
|
|
196
|
-
// when the track is published or the video is enabled.
|
|
197
|
-
if (!isPublishingVideoTrack || !isVisible || !hasJoinedCall) {
|
|
198
|
-
pendingVideoLayoutRef.current = dimension;
|
|
199
|
-
return;
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
// NOTE: We don't want to update the subscription if the dimension hasn't changed
|
|
203
|
-
if (subscribedVideoLayoutRef.current?.width === dimension.width && subscribedVideoLayoutRef.current?.height === dimension.height) {
|
|
204
|
-
return;
|
|
205
|
-
}
|
|
206
|
-
call.state.updateParticipantTracks(trackType, {
|
|
207
|
-
[sessionId]: {
|
|
208
|
-
dimension
|
|
209
|
-
}
|
|
210
|
-
});
|
|
211
|
-
call.dynascaleManager.applyTrackSubscriptions();
|
|
212
|
-
subscribedVideoLayoutRef.current = dimension;
|
|
213
|
-
pendingVideoLayoutRef.current = undefined;
|
|
135
|
+
trackSubscriberRef.current?.onLayoutUpdate(event);
|
|
214
136
|
};
|
|
215
137
|
return /*#__PURE__*/_react.default.createElement(_reactNative.View, {
|
|
216
138
|
onLayout: onLayout,
|
|
217
139
|
style: [styles.container, videoRenderer.container]
|
|
218
|
-
},
|
|
140
|
+
}, call && !isLocalParticipant && /*#__PURE__*/_react.default.createElement(_TrackSubscriber.default, {
|
|
141
|
+
ref: trackSubscriberRef,
|
|
142
|
+
call: call,
|
|
143
|
+
participantSessionId: sessionId,
|
|
144
|
+
trackType: trackType,
|
|
145
|
+
isVisible: isVisible
|
|
146
|
+
}), canShowVideo && videoStreamToRender && (objectFit || isVideoDimensionsValid) ? /*#__PURE__*/_react.default.createElement(_reactNativeWebrtc.RTCView, {
|
|
219
147
|
style: [styles.videoStream, videoRenderer.videoStream],
|
|
220
148
|
streamURL: videoStreamToRender.toURL(),
|
|
221
149
|
mirror: mirror,
|
|
@@ -235,4 +163,4 @@ const styles = _reactNative.StyleSheet.create({
|
|
|
235
163
|
..._reactNative.StyleSheet.absoluteFillObject
|
|
236
164
|
}
|
|
237
165
|
});
|
|
238
|
-
//# sourceMappingURL=
|
|
166
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_react","_interopRequireWildcard","require","_reactNative","_reactNativeWebrtc","_videoClient","_videoReactBindings","_ParticipantVideoFallback","_ThemeContext","_useTrackDimensions","_ScreenshotIosContext","_TrackSubscriber","_interopRequireDefault","e","__esModule","default","t","WeakMap","r","n","o","i","f","__proto__","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","DEFAULT_VIEWPORT_VISIBILITY_STATE","videoTrack","VisibilityState","UNKNOWN","screenShareTrack","VideoRenderer","trackType","participant","isVisible","ParticipantVideoFallback","DefaultParticipantVideoFallback","objectFit","videoZOrder","theme","videoRenderer","useTheme","useCall","useCameraState","useIncomingVideoSettings","useCallStateHooks","trackSubscriberRef","useRef","isParticipantVideoEnabled","direction","viewRef","register","registerIosScreenshot","deregister","deregisterIosScreenshot","useScreenshotIosContext","videoDimensions","useTrackDimensions","isVideoDimensionsValid","width","height","isLocalParticipant","sessionId","viewportVisibilityState","videoStream","screenShareStream","isScreenSharing","isPublishingVideoTrack","hasScreenShare","hasVideo","videoStreamToRender","canShowVideo","hasPausedTrack","useEffect","Platform","OS","mirror","VISIBLE","state","updateParticipant","p","INVISIBLE","onLayout","event","current","onLayoutUpdate","createElement","View","style","styles","container","ref","participantSessionId","RTCView","streamURL","toURL","zOrder","exports","StyleSheet","create","absoluteFillObject"],"sourceRoot":"../../../../../../src","sources":["components/Participant/ParticipantView/VideoRenderer/index.tsx"],"mappings":"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","ignoreList":[]}
|
package/dist/commonjs/version.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["version","exports"],"sourceRoot":"../../src","sources":["version.ts"],"mappings":";;;;;;AAAO,MAAMA,OAAO,GAAAC,OAAA,CAAAD,OAAA,GAAG,
|
|
1
|
+
{"version":3,"names":["version","exports"],"sourceRoot":"../../src","sources":["version.ts"],"mappings":";;;;;;AAAO,MAAMA,OAAO,GAAAC,OAAA,CAAAD,OAAA,GAAG,QAAQ","ignoreList":[]}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { forwardRef, useImperativeHandle, useEffect, useMemo } from 'react';
|
|
2
|
+
import { CallingState, hasScreenShare, hasVideo, DebounceType } from '@stream-io/video-client';
|
|
3
|
+
import { BehaviorSubject, combineLatest, distinctUntilChanged, distinctUntilKeyChanged, map, takeWhile } from 'rxjs';
|
|
4
|
+
/**
|
|
5
|
+
* This component is used to subscribe to the video + audio track of the participant in the following cases:
|
|
6
|
+
* 1. When the participant starts publishing the video track
|
|
7
|
+
* 2. When the participant changes the video track dimensions
|
|
8
|
+
* 3. When the participant becomes visible
|
|
9
|
+
* 4. On joined callingState, this handles reconnection
|
|
10
|
+
|
|
11
|
+
* This component is used to unsubscribe to video track and subscribe only to the audio track of the participant (by passing undefined dimensions) in the following cases:
|
|
12
|
+
* 1. When the participant stops publishing the video track
|
|
13
|
+
* 2. When the participant becomes invisible
|
|
14
|
+
*/
|
|
15
|
+
const TrackSubscriber = /*#__PURE__*/forwardRef((props, ref) => {
|
|
16
|
+
const {
|
|
17
|
+
call,
|
|
18
|
+
participantSessionId,
|
|
19
|
+
trackType,
|
|
20
|
+
isVisible
|
|
21
|
+
} = props;
|
|
22
|
+
const dimensions$ = useMemo(() => {
|
|
23
|
+
return new BehaviorSubject(undefined);
|
|
24
|
+
}, []);
|
|
25
|
+
useEffect(() => {
|
|
26
|
+
const requestTrackWithDimensions = (debounceType, dimension) => {
|
|
27
|
+
if (dimension && (dimension.width === 0 || dimension.height === 0)) {
|
|
28
|
+
// ignore 0x0 dimensions. this can happen when the video element
|
|
29
|
+
// is not visible (e.g., has display: none).
|
|
30
|
+
// we treat this as "unsubscription" as we don't want to keep
|
|
31
|
+
// consuming bandwidth for a video that is not visible on the screen.
|
|
32
|
+
dimension = undefined;
|
|
33
|
+
}
|
|
34
|
+
call.state.updateParticipantTracks(trackType, {
|
|
35
|
+
[participantSessionId]: {
|
|
36
|
+
dimension
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
call.dynascaleManager.applyTrackSubscriptions(debounceType);
|
|
40
|
+
};
|
|
41
|
+
const isPublishingTrack$ = call.state.participants$.pipe(map(ps => ps.find(p => p.sessionId === participantSessionId)), takeWhile(p => !!p), distinctUntilChanged(), distinctUntilKeyChanged('publishedTracks'), map(p => trackType === 'videoTrack' ? hasVideo(p) : hasScreenShare(p)), distinctUntilChanged());
|
|
42
|
+
const isJoinedState$ = call.state.callingState$.pipe(map(callingState => callingState === CallingState.JOINED));
|
|
43
|
+
const subscription = combineLatest([dimensions$, isPublishingTrack$, isJoinedState$]).subscribe(([dimension, isPublishing, isJoined]) => {
|
|
44
|
+
if (isJoined && isPublishing && !isVisible) {
|
|
45
|
+
// the participant is publishing and we are not visible, so we unsubscribe from the video track
|
|
46
|
+
requestTrackWithDimensions(DebounceType.FAST, undefined);
|
|
47
|
+
} else if (isJoined && isPublishing && isVisible && dimension) {
|
|
48
|
+
// the participant is publishing and we are visible and have valid dimensions, so we subscribe to the video track
|
|
49
|
+
requestTrackWithDimensions(DebounceType.IMMEDIATE, dimension);
|
|
50
|
+
} else if (isJoined && !isPublishing) {
|
|
51
|
+
// the participant stopped publishing a track, so we unsubscribe from the video track
|
|
52
|
+
requestTrackWithDimensions(DebounceType.FAST, undefined);
|
|
53
|
+
}
|
|
54
|
+
// if isPublishing but no dimension yet, we wait for dimensions
|
|
55
|
+
});
|
|
56
|
+
return () => {
|
|
57
|
+
subscription.unsubscribe();
|
|
58
|
+
};
|
|
59
|
+
}, [call, participantSessionId, trackType, isVisible, dimensions$]);
|
|
60
|
+
useImperativeHandle(ref, () => ({
|
|
61
|
+
onLayoutUpdate: event => {
|
|
62
|
+
const dimension = {
|
|
63
|
+
width: Math.trunc(event.nativeEvent.layout.width),
|
|
64
|
+
height: Math.trunc(event.nativeEvent.layout.height)
|
|
65
|
+
};
|
|
66
|
+
dimensions$.next(dimension);
|
|
67
|
+
}
|
|
68
|
+
}), [dimensions$]);
|
|
69
|
+
return null;
|
|
70
|
+
});
|
|
71
|
+
TrackSubscriber.displayName = 'TrackSubscriber';
|
|
72
|
+
export default TrackSubscriber;
|
|
73
|
+
//# sourceMappingURL=TrackSubscriber.js.map
|
package/dist/module/components/Participant/ParticipantView/VideoRenderer/TrackSubscriber.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["forwardRef","useImperativeHandle","useEffect","useMemo","CallingState","hasScreenShare","hasVideo","DebounceType","BehaviorSubject","combineLatest","distinctUntilChanged","distinctUntilKeyChanged","map","takeWhile","TrackSubscriber","props","ref","call","participantSessionId","trackType","isVisible","dimensions$","undefined","requestTrackWithDimensions","debounceType","dimension","width","height","state","updateParticipantTracks","dynascaleManager","applyTrackSubscriptions","isPublishingTrack$","participants$","pipe","ps","find","p","sessionId","isJoinedState$","callingState$","callingState","JOINED","subscription","subscribe","isPublishing","isJoined","FAST","IMMEDIATE","unsubscribe","onLayoutUpdate","event","Math","trunc","nativeEvent","layout","next","displayName"],"sourceRoot":"../../../../../../src","sources":["components/Participant/ParticipantView/VideoRenderer/TrackSubscriber.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import React, { useEffect, useRef } from 'react';
|
|
2
2
|
import { Platform, StyleSheet, View } from 'react-native';
|
|
3
3
|
import { RTCView } from '@stream-io/react-native-webrtc';
|
|
4
|
-
import {
|
|
4
|
+
import { hasPausedTrack, hasScreenShare, hasVideo, VisibilityState } from '@stream-io/video-client';
|
|
5
5
|
import { useCall, useCallStateHooks } from '@stream-io/video-react-bindings';
|
|
6
|
-
import { ParticipantVideoFallback as DefaultParticipantVideoFallback } from '
|
|
7
|
-
import { useTheme } from '
|
|
8
|
-
import { useTrackDimensions } from '
|
|
9
|
-
import { useScreenshotIosContext } from '
|
|
6
|
+
import { ParticipantVideoFallback as DefaultParticipantVideoFallback } from '../ParticipantVideoFallback';
|
|
7
|
+
import { useTheme } from '../../../../contexts/ThemeContext';
|
|
8
|
+
import { useTrackDimensions } from '../../../../hooks/useTrackDimensions';
|
|
9
|
+
import { useScreenshotIosContext } from '../../../../contexts/internal/ScreenshotIosContext';
|
|
10
|
+
import TrackSubscriber from './TrackSubscriber';
|
|
10
11
|
const DEFAULT_VIEWPORT_VISIBILITY_STATE = {
|
|
11
12
|
videoTrack: VisibilityState.UNKNOWN,
|
|
12
13
|
screenShareTrack: VisibilityState.UNKNOWN
|
|
@@ -36,16 +37,13 @@ export const VideoRenderer = ({
|
|
|
36
37
|
} = useTheme();
|
|
37
38
|
const call = useCall();
|
|
38
39
|
const {
|
|
39
|
-
useCallCallingState,
|
|
40
40
|
useCameraState,
|
|
41
41
|
useIncomingVideoSettings
|
|
42
42
|
} = useCallStateHooks();
|
|
43
|
+
const trackSubscriberRef = useRef(null);
|
|
43
44
|
const {
|
|
44
45
|
isParticipantVideoEnabled
|
|
45
46
|
} = useIncomingVideoSettings();
|
|
46
|
-
const callingState = useCallCallingState();
|
|
47
|
-
const pendingVideoLayoutRef = useRef(undefined);
|
|
48
|
-
const subscribedVideoLayoutRef = useRef(undefined);
|
|
49
47
|
const {
|
|
50
48
|
direction
|
|
51
49
|
} = useCameraState();
|
|
@@ -65,7 +63,6 @@ export const VideoRenderer = ({
|
|
|
65
63
|
} = participant;
|
|
66
64
|
const isScreenSharing = trackType === 'screenShareTrack';
|
|
67
65
|
const isPublishingVideoTrack = isScreenSharing ? hasScreenShare(participant) : hasVideo(participant);
|
|
68
|
-
const hasJoinedCall = callingState === CallingState.JOINED;
|
|
69
66
|
const videoStreamToRender = isScreenSharing ? screenShareStream : videoStream;
|
|
70
67
|
const canShowVideo = !!videoStreamToRender && isVisible && isPublishingVideoTrack && !hasPausedTrack(participant, trackType) && isParticipantVideoEnabled(participant.sessionId);
|
|
71
68
|
useEffect(() => {
|
|
@@ -124,91 +121,21 @@ export const VideoRenderer = ({
|
|
|
124
121
|
}
|
|
125
122
|
}));
|
|
126
123
|
}
|
|
127
|
-
if (subscribedVideoLayoutRef.current) {
|
|
128
|
-
// when video is enabled again, we want to use the last subscribed dimension to resubscribe
|
|
129
|
-
pendingVideoLayoutRef.current = subscribedVideoLayoutRef.current;
|
|
130
|
-
subscribedVideoLayoutRef.current = undefined;
|
|
131
|
-
}
|
|
132
124
|
}
|
|
133
125
|
}, [sessionId, viewportVisibilityState, isVisible, call, trackType, isLocalParticipant]);
|
|
134
|
-
useEffect(() => {
|
|
135
|
-
if (!hasJoinedCall && subscribedVideoLayoutRef.current) {
|
|
136
|
-
// when call is joined again, we want to use the last subscribed dimension to resubscribe
|
|
137
|
-
pendingVideoLayoutRef.current = subscribedVideoLayoutRef.current;
|
|
138
|
-
subscribedVideoLayoutRef.current = undefined;
|
|
139
|
-
}
|
|
140
|
-
}, [hasJoinedCall]);
|
|
141
|
-
|
|
142
|
-
/**
|
|
143
|
-
* This effect updates the subscription either
|
|
144
|
-
* 1. when video tracks are published and was unpublished before
|
|
145
|
-
* 2. when the view's visibility changes
|
|
146
|
-
* 3. when call was rejoined
|
|
147
|
-
*/
|
|
148
|
-
useEffect(() => {
|
|
149
|
-
if (!call || isLocalParticipant) {
|
|
150
|
-
return;
|
|
151
|
-
}
|
|
152
|
-
// NOTE: We only want to update the subscription if the pendingVideoLayoutRef is set
|
|
153
|
-
const updateIsNeeded = pendingVideoLayoutRef.current;
|
|
154
|
-
if (!updateIsNeeded || !isPublishingVideoTrack || !hasJoinedCall) {
|
|
155
|
-
return;
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
// NOTE: When the view is not visible, we want to subscribe to audio only.
|
|
159
|
-
// We unsubscribe their video by setting the dimension to undefined
|
|
160
|
-
const dimension = isVisible ? pendingVideoLayoutRef.current : undefined;
|
|
161
|
-
call.state.updateParticipantTracks(trackType, {
|
|
162
|
-
[sessionId]: {
|
|
163
|
-
dimension
|
|
164
|
-
}
|
|
165
|
-
});
|
|
166
|
-
call.dynascaleManager.applyTrackSubscriptions();
|
|
167
|
-
if (dimension) {
|
|
168
|
-
subscribedVideoLayoutRef.current = pendingVideoLayoutRef.current;
|
|
169
|
-
pendingVideoLayoutRef.current = undefined;
|
|
170
|
-
}
|
|
171
|
-
}, [call, isPublishingVideoTrack, trackType, isVisible, sessionId, hasJoinedCall, isLocalParticipant]);
|
|
172
|
-
useEffect(() => {
|
|
173
|
-
return () => {
|
|
174
|
-
subscribedVideoLayoutRef.current = undefined;
|
|
175
|
-
pendingVideoLayoutRef.current = undefined;
|
|
176
|
-
};
|
|
177
|
-
}, [trackType, sessionId]);
|
|
178
126
|
const onLayout = event => {
|
|
179
|
-
|
|
180
|
-
return;
|
|
181
|
-
}
|
|
182
|
-
const dimension = {
|
|
183
|
-
width: Math.trunc(event.nativeEvent.layout.width),
|
|
184
|
-
height: Math.trunc(event.nativeEvent.layout.height)
|
|
185
|
-
};
|
|
186
|
-
|
|
187
|
-
// NOTE: If the participant hasn't published a video track yet,
|
|
188
|
-
// or the view is not viewable, we store the dimensions and handle it
|
|
189
|
-
// when the track is published or the video is enabled.
|
|
190
|
-
if (!isPublishingVideoTrack || !isVisible || !hasJoinedCall) {
|
|
191
|
-
pendingVideoLayoutRef.current = dimension;
|
|
192
|
-
return;
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
// NOTE: We don't want to update the subscription if the dimension hasn't changed
|
|
196
|
-
if (subscribedVideoLayoutRef.current?.width === dimension.width && subscribedVideoLayoutRef.current?.height === dimension.height) {
|
|
197
|
-
return;
|
|
198
|
-
}
|
|
199
|
-
call.state.updateParticipantTracks(trackType, {
|
|
200
|
-
[sessionId]: {
|
|
201
|
-
dimension
|
|
202
|
-
}
|
|
203
|
-
});
|
|
204
|
-
call.dynascaleManager.applyTrackSubscriptions();
|
|
205
|
-
subscribedVideoLayoutRef.current = dimension;
|
|
206
|
-
pendingVideoLayoutRef.current = undefined;
|
|
127
|
+
trackSubscriberRef.current?.onLayoutUpdate(event);
|
|
207
128
|
};
|
|
208
129
|
return /*#__PURE__*/React.createElement(View, {
|
|
209
130
|
onLayout: onLayout,
|
|
210
131
|
style: [styles.container, videoRenderer.container]
|
|
211
|
-
},
|
|
132
|
+
}, call && !isLocalParticipant && /*#__PURE__*/React.createElement(TrackSubscriber, {
|
|
133
|
+
ref: trackSubscriberRef,
|
|
134
|
+
call: call,
|
|
135
|
+
participantSessionId: sessionId,
|
|
136
|
+
trackType: trackType,
|
|
137
|
+
isVisible: isVisible
|
|
138
|
+
}), canShowVideo && videoStreamToRender && (objectFit || isVideoDimensionsValid) ? /*#__PURE__*/React.createElement(RTCView, {
|
|
212
139
|
style: [styles.videoStream, videoRenderer.videoStream],
|
|
213
140
|
streamURL: videoStreamToRender.toURL(),
|
|
214
141
|
mirror: mirror,
|
|
@@ -227,4 +154,4 @@ const styles = StyleSheet.create({
|
|
|
227
154
|
...StyleSheet.absoluteFillObject
|
|
228
155
|
}
|
|
229
156
|
});
|
|
230
|
-
//# sourceMappingURL=
|
|
157
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["React","useEffect","useRef","Platform","StyleSheet","View","RTCView","hasPausedTrack","hasScreenShare","hasVideo","VisibilityState","useCall","useCallStateHooks","ParticipantVideoFallback","DefaultParticipantVideoFallback","useTheme","useTrackDimensions","useScreenshotIosContext","TrackSubscriber","DEFAULT_VIEWPORT_VISIBILITY_STATE","videoTrack","UNKNOWN","screenShareTrack","VideoRenderer","trackType","participant","isVisible","objectFit","videoZOrder","theme","videoRenderer","call","useCameraState","useIncomingVideoSettings","trackSubscriberRef","isParticipantVideoEnabled","direction","viewRef","register","registerIosScreenshot","deregister","deregisterIosScreenshot","videoDimensions","isVideoDimensionsValid","width","height","isLocalParticipant","sessionId","viewportVisibilityState","videoStream","screenShareStream","isScreenSharing","isPublishingVideoTrack","videoStreamToRender","canShowVideo","OS","mirror","VISIBLE","state","updateParticipant","p","INVISIBLE","onLayout","event","current","onLayoutUpdate","createElement","style","styles","container","ref","participantSessionId","streamURL","toURL","zOrder","create","absoluteFillObject"],"sourceRoot":"../../../../../../src","sources":["components/Participant/ParticipantView/VideoRenderer/index.tsx"],"mappings":"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","ignoreList":[]}
|
package/dist/module/version.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export const version = '1.22.1
|
|
1
|
+
export const version = '1.22.1';
|
|
2
2
|
//# sourceMappingURL=version.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["version"],"sourceRoot":"../../src","sources":["version.ts"],"mappings":"AAAA,OAAO,MAAMA,OAAO,GAAG,
|
|
1
|
+
{"version":3,"names":["version"],"sourceRoot":"../../src","sources":["version.ts"],"mappings":"AAAA,OAAO,MAAMA,OAAO,GAAG,QAAQ","ignoreList":[]}
|
package/dist/typescript/components/Participant/ParticipantView/VideoRenderer/TrackSubscriber.d.ts
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { LayoutChangeEvent } from 'react-native';
|
|
2
|
+
import { Call, type VideoTrackType } from '@stream-io/video-client';
|
|
3
|
+
export type TrackSubscriberHandle = {
|
|
4
|
+
onLayoutUpdate: (event: LayoutChangeEvent) => void;
|
|
5
|
+
};
|
|
6
|
+
type TrackSubscriberProps = {
|
|
7
|
+
participantSessionId: string;
|
|
8
|
+
call: Call;
|
|
9
|
+
trackType: VideoTrackType;
|
|
10
|
+
isVisible: boolean;
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* This component is used to subscribe to the video + audio track of the participant in the following cases:
|
|
14
|
+
* 1. When the participant starts publishing the video track
|
|
15
|
+
* 2. When the participant changes the video track dimensions
|
|
16
|
+
* 3. When the participant becomes visible
|
|
17
|
+
* 4. On joined callingState, this handles reconnection
|
|
18
|
+
|
|
19
|
+
* This component is used to unsubscribe to video track and subscribe only to the audio track of the participant (by passing undefined dimensions) in the following cases:
|
|
20
|
+
* 1. When the participant stops publishing the video track
|
|
21
|
+
* 2. When the participant becomes invisible
|
|
22
|
+
*/
|
|
23
|
+
declare const TrackSubscriber: import("react").ForwardRefExoticComponent<TrackSubscriberProps & import("react").RefAttributes<TrackSubscriberHandle>>;
|
|
24
|
+
export default TrackSubscriber;
|
|
25
|
+
//# sourceMappingURL=TrackSubscriber.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TrackSubscriber.d.ts","sourceRoot":"","sources":["../../../../../../src/components/Participant/ParticipantView/VideoRenderer/TrackSubscriber.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EACL,IAAI,EAKJ,KAAK,cAAc,EAEpB,MAAM,yBAAyB,CAAC;AASjC,MAAM,MAAM,qBAAqB,GAAG;IAClC,cAAc,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,CAAC;CACpD,CAAC;AAEF,KAAK,oBAAoB,GAAG;IAC1B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,IAAI,EAAE,IAAI,CAAC;IACX,SAAS,EAAE,cAAc,CAAC;IAC1B,SAAS,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF;;;;;;;;;;EAUE;AACF,QAAA,MAAM,eAAe,wHA+EpB,CAAC;AAIF,eAAe,eAAe,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
import type { ParticipantViewProps } from '
|
|
2
|
+
import type { ParticipantViewProps } from '../ParticipantView';
|
|
3
3
|
/**
|
|
4
4
|
* Props for the VideoRenderer component.
|
|
5
5
|
*/
|
|
@@ -10,4 +10,4 @@ export type VideoRendererProps = Pick<ParticipantViewProps, 'ParticipantVideoFal
|
|
|
10
10
|
* It internally used `RTCView` to render video stream.
|
|
11
11
|
*/
|
|
12
12
|
export declare const VideoRenderer: ({ trackType, participant, isVisible, ParticipantVideoFallback, objectFit, videoZOrder, }: VideoRendererProps) => React.JSX.Element;
|
|
13
|
-
//# sourceMappingURL=
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/components/Participant/ParticipantView/VideoRenderer/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA4B,MAAM,OAAO,CAAC;AAIjD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAuB/D;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAAG,IAAI,CACnC,oBAAoB,EAClB,0BAA0B,GAC1B,WAAW,GACX,aAAa,GACb,WAAW,GACX,WAAW,GACX,aAAa,CAChB,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,aAAa,GAAI,0FAO3B,kBAAkB,sBA6KpB,CAAC"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const version = "1.22.1
|
|
1
|
+
export declare const version = "1.22.1";
|
|
2
2
|
//# sourceMappingURL=version.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,OAAO,
|
|
1
|
+
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,OAAO,WAAW,CAAC"}
|
|
@@ -19,7 +19,7 @@ enum DefaultAudioDevice {
|
|
|
19
19
|
@objc(StreamInCallManager)
|
|
20
20
|
class StreamInCallManager: RCTEventEmitter {
|
|
21
21
|
|
|
22
|
-
private let audioSessionQueue = DispatchQueue(label: "io.getstream.rn.audioSessionQueue"
|
|
22
|
+
private let audioSessionQueue = DispatchQueue(label: "io.getstream.rn.audioSessionQueue")
|
|
23
23
|
|
|
24
24
|
private var audioManagerActivated = false
|
|
25
25
|
private var callAudioRole: CallAudioRole = .communicator
|
|
@@ -142,7 +142,6 @@ class StreamInCallManager: RCTEventEmitter {
|
|
|
142
142
|
|
|
143
143
|
if currentCategory != intendedCategory.rawValue || currentMode != intendedMode.rawValue || currentOptions != intendedOptions || !currentIsActive {
|
|
144
144
|
session.lockForConfiguration()
|
|
145
|
-
defer { session.unlockForConfiguration() }
|
|
146
145
|
do {
|
|
147
146
|
try session.setCategory(intendedCategory, mode: intendedMode, options: intendedOptions)
|
|
148
147
|
try session.setActive(true)
|
|
@@ -157,6 +156,7 @@ class StreamInCallManager: RCTEventEmitter {
|
|
|
157
156
|
log("configureAudioSession: Error setting mode: \(error.localizedDescription)")
|
|
158
157
|
}
|
|
159
158
|
}
|
|
159
|
+
session.unlockForConfiguration()
|
|
160
160
|
} else {
|
|
161
161
|
log("configureAudioSession: no change needed")
|
|
162
162
|
}
|