@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.
Files changed (29) hide show
  1. package/CHANGELOG.md +2816 -0
  2. package/dist/commonjs/components/Participant/ParticipantView/VideoRenderer/TrackSubscriber.js +79 -0
  3. package/dist/commonjs/components/Participant/ParticipantView/VideoRenderer/TrackSubscriber.js.map +1 -0
  4. package/dist/commonjs/components/Participant/ParticipantView/{VideoRenderer.js → VideoRenderer/index.js} +16 -88
  5. package/dist/commonjs/components/Participant/ParticipantView/VideoRenderer/index.js.map +1 -0
  6. package/dist/commonjs/version.js +1 -1
  7. package/dist/commonjs/version.js.map +1 -1
  8. package/dist/module/components/Participant/ParticipantView/VideoRenderer/TrackSubscriber.js +73 -0
  9. package/dist/module/components/Participant/ParticipantView/VideoRenderer/TrackSubscriber.js.map +1 -0
  10. package/dist/module/components/Participant/ParticipantView/{VideoRenderer.js → VideoRenderer/index.js} +16 -89
  11. package/dist/module/components/Participant/ParticipantView/VideoRenderer/index.js.map +1 -0
  12. package/dist/module/version.js +1 -1
  13. package/dist/module/version.js.map +1 -1
  14. package/dist/typescript/components/Participant/ParticipantView/VideoRenderer/TrackSubscriber.d.ts +25 -0
  15. package/dist/typescript/components/Participant/ParticipantView/VideoRenderer/TrackSubscriber.d.ts.map +1 -0
  16. package/dist/typescript/components/Participant/ParticipantView/{VideoRenderer.d.ts → VideoRenderer/index.d.ts} +2 -2
  17. package/dist/typescript/components/Participant/ParticipantView/VideoRenderer/index.d.ts.map +1 -0
  18. package/dist/typescript/version.d.ts +1 -1
  19. package/dist/typescript/version.d.ts.map +1 -1
  20. package/ios/StreamInCallManager.swift +2 -2
  21. package/package.json +6 -6
  22. package/src/components/Participant/ParticipantView/VideoRenderer/TrackSubscriber.tsx +125 -0
  23. package/src/components/Participant/ParticipantView/{VideoRenderer.tsx → VideoRenderer/index.tsx} +18 -107
  24. package/src/version.ts +1 -1
  25. package/dist/commonjs/components/Participant/ParticipantView/VideoRenderer.js.map +0 -1
  26. package/dist/module/components/Participant/ParticipantView/VideoRenderer.js.map +0 -1
  27. package/dist/typescript/components/Participant/ParticipantView/VideoRenderer.d.ts.map +0 -1
  28. package/ios/StreamVideoReactNative.xcodeproj/project.xcworkspace/xcuserdata/santhoshvaiyapuri.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  29. 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
@@ -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("./ParticipantVideoFallback");
13
- var _ThemeContext = require("../../../contexts/ThemeContext");
14
- var _useTrackDimensions = require("../../../hooks/useTrackDimensions");
15
- var _ScreenshotIosContext = require("../../../contexts/internal/ScreenshotIosContext");
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
- if (!call || isLocalParticipant) {
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
- }, canShowVideo && videoStreamToRender && (objectFit || isVideoDimensionsValid) ? /*#__PURE__*/_react.default.createElement(_reactNativeWebrtc.RTCView, {
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=VideoRenderer.js.map
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":[]}
@@ -4,5 +4,5 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.version = void 0;
7
- const version = exports.version = '1.22.1-alpha.1';
7
+ const version = exports.version = '1.22.1';
8
8
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["version","exports"],"sourceRoot":"../../src","sources":["version.ts"],"mappings":";;;;;;AAAO,MAAMA,OAAO,GAAAC,OAAA,CAAAD,OAAA,GAAG,gBAAgB","ignoreList":[]}
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
@@ -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 { CallingState, hasPausedTrack, hasScreenShare, hasVideo, VisibilityState } from '@stream-io/video-client';
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 './ParticipantVideoFallback';
7
- import { useTheme } from '../../../contexts/ThemeContext';
8
- import { useTrackDimensions } from '../../../hooks/useTrackDimensions';
9
- import { useScreenshotIosContext } from '../../../contexts/internal/ScreenshotIosContext';
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
- if (!call || isLocalParticipant) {
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
- }, canShowVideo && videoStreamToRender && (objectFit || isVideoDimensionsValid) ? /*#__PURE__*/React.createElement(RTCView, {
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=VideoRenderer.js.map
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":[]}
@@ -1,2 +1,2 @@
1
- export const version = '1.22.1-alpha.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,gBAAgB","ignoreList":[]}
1
+ {"version":3,"names":["version"],"sourceRoot":"../../src","sources":["version.ts"],"mappings":"AAAA,OAAO,MAAMA,OAAO,GAAG,QAAQ","ignoreList":[]}
@@ -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 './ParticipantView';
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=VideoRenderer.d.ts.map
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-alpha.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,mBAAmB,CAAC"}
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", qos: .userInitiated)
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
  }