@azure/communication-react 1.21.0-alpha-202411050016 → 1.21.0-alpha-202411070016
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/dist/communication-react.d.ts +96 -31
- package/dist/dist-cjs/communication-react/{ChatMessageComponentAsRichTextEditBox-CjlQQrAc.js → ChatMessageComponentAsRichTextEditBox-DA7CJian.js} +3 -3
- package/dist/dist-cjs/communication-react/{ChatMessageComponentAsRichTextEditBox-CjlQQrAc.js.map → ChatMessageComponentAsRichTextEditBox-DA7CJian.js.map} +1 -1
- package/dist/dist-cjs/communication-react/{RichTextSendBoxWrapper-CEFO0M1q.js → RichTextSendBoxWrapper-B35hPtZ7.js} +2 -2
- package/dist/dist-cjs/communication-react/{RichTextSendBoxWrapper-CEFO0M1q.js.map → RichTextSendBoxWrapper-B35hPtZ7.js.map} +1 -1
- package/dist/dist-cjs/communication-react/{index-BkinusDu.js → index-DKFJEPz7.js} +655 -129
- package/dist/dist-cjs/communication-react/index-DKFJEPz7.js.map +1 -0
- package/dist/dist-cjs/communication-react/index.js +1 -1
- package/dist/dist-esm/acs-ui-common/src/telemetryVersion.js +1 -1
- package/dist/dist-esm/acs-ui-common/src/telemetryVersion.js.map +1 -1
- package/dist/dist-esm/calling-stateful-client/src/CallClientState.d.ts +60 -31
- package/dist/dist-esm/calling-stateful-client/src/CallClientState.js.map +1 -1
- package/dist/dist-esm/calling-stateful-client/src/CallContext.d.ts +13 -2
- package/dist/dist-esm/calling-stateful-client/src/CallContext.js +106 -5
- package/dist/dist-esm/calling-stateful-client/src/CallContext.js.map +1 -1
- package/dist/dist-esm/calling-stateful-client/src/CallFeatureStreamUtils.d.ts +14 -0
- package/dist/dist-esm/calling-stateful-client/src/CallFeatureStreamUtils.js +207 -0
- package/dist/dist-esm/calling-stateful-client/src/CallFeatureStreamUtils.js.map +1 -0
- package/dist/dist-esm/calling-stateful-client/src/CallSubscriber.d.ts +1 -0
- package/dist/dist-esm/calling-stateful-client/src/CallSubscriber.js +7 -1
- package/dist/dist-esm/calling-stateful-client/src/CallSubscriber.js.map +1 -1
- package/dist/dist-esm/calling-stateful-client/src/Converter.d.ts +6 -0
- package/dist/dist-esm/calling-stateful-client/src/Converter.js +18 -2
- package/dist/dist-esm/calling-stateful-client/src/Converter.js.map +1 -1
- package/dist/dist-esm/calling-stateful-client/src/InternalCallContext.d.ts +9 -0
- package/dist/dist-esm/calling-stateful-client/src/InternalCallContext.js +50 -0
- package/dist/dist-esm/calling-stateful-client/src/InternalCallContext.js.map +1 -1
- package/dist/dist-esm/calling-stateful-client/src/MediaAccessSubscriber.d.ts +16 -0
- package/dist/dist-esm/calling-stateful-client/src/MediaAccessSubscriber.js +26 -0
- package/dist/dist-esm/calling-stateful-client/src/MediaAccessSubscriber.js.map +1 -0
- package/dist/dist-esm/calling-stateful-client/src/StatefulCallClient.d.ts +33 -2
- package/dist/dist-esm/calling-stateful-client/src/StatefulCallClient.js +17 -0
- package/dist/dist-esm/calling-stateful-client/src/StatefulCallClient.js.map +1 -1
- package/dist/dist-esm/calling-stateful-client/src/StreamUtils.d.ts +1 -2
- package/dist/dist-esm/calling-stateful-client/src/StreamUtils.js +10 -0
- package/dist/dist-esm/calling-stateful-client/src/StreamUtils.js.map +1 -1
- package/dist/dist-esm/calling-stateful-client/src/TogetherModeSubscriber.d.ts +9 -4
- package/dist/dist-esm/calling-stateful-client/src/TogetherModeSubscriber.js +38 -9
- package/dist/dist-esm/calling-stateful-client/src/TogetherModeSubscriber.js.map +1 -1
- package/dist/dist-esm/calling-stateful-client/src/TogetherModeVideoStreamSubscriber.d.ts +18 -0
- package/dist/dist-esm/calling-stateful-client/src/TogetherModeVideoStreamSubscriber.js +34 -0
- package/dist/dist-esm/calling-stateful-client/src/TogetherModeVideoStreamSubscriber.js.map +1 -0
- package/dist/dist-esm/calling-stateful-client/src/index-public.d.ts +2 -1
- package/dist/dist-esm/calling-stateful-client/src/index-public.js.map +1 -1
- package/dist/dist-esm/react-components/src/components/CaptionsBanner.js +3 -3
- package/dist/dist-esm/react-components/src/components/CaptionsBanner.js.map +1 -1
- package/dist/dist-esm/react-components/src/components/ChatMessage/MyMessageComponents/ChatMessageComponentAsRichTextEditBox.js +1 -1
- package/dist/dist-esm/react-components/src/components/ChatMessage/MyMessageComponents/ChatMessageComponentAsRichTextEditBox.js.map +1 -1
- package/dist/dist-esm/react-components/src/components/TroubleshootingGuideErrorBar.js +4 -3
- package/dist/dist-esm/react-components/src/components/TroubleshootingGuideErrorBar.js.map +1 -1
- package/dist/dist-esm/react-components/src/components/VideoGallery/FloatingLocalVideo.js +1 -1
- package/dist/dist-esm/react-components/src/components/VideoGallery/FloatingLocalVideo.js.map +1 -1
- package/dist/dist-esm/react-components/src/components/VideoGallery.js +1 -1
- package/dist/dist-esm/react-components/src/components/VideoGallery.js.map +1 -1
- package/dist/dist-esm/react-components/src/components/VideoTile.js +13 -11
- package/dist/dist-esm/react-components/src/components/VideoTile.js.map +1 -1
- package/dist/dist-esm/react-components/src/components/styles/Captions.style.js +9 -2
- package/dist/dist-esm/react-components/src/components/styles/Captions.style.js.map +1 -1
- package/dist/dist-esm/react-components/src/components/styles/MessageBarLink.styles.d.ts +11 -0
- package/dist/dist-esm/react-components/src/components/styles/MessageBarLink.styles.js +21 -0
- package/dist/dist-esm/react-components/src/components/styles/MessageBarLink.styles.js.map +1 -0
- package/dist/dist-esm/react-components/src/components/styles/VideoTile.styles.d.ts +2 -0
- package/dist/dist-esm/react-components/src/components/styles/VideoTile.styles.js +6 -0
- package/dist/dist-esm/react-components/src/components/styles/VideoTile.styles.js.map +1 -1
- package/dist/dist-esm/react-composites/src/composites/CallComposite/components/SidePane/SidePane.js +4 -2
- package/dist/dist-esm/react-composites/src/composites/CallComposite/components/SidePane/SidePane.js.map +1 -1
- package/dist/dist-esm/react-composites/src/composites/CallComposite/styles/CallConfiguration.styles.js +4 -2
- package/dist/dist-esm/react-composites/src/composites/CallComposite/styles/CallConfiguration.styles.js.map +1 -1
- package/dist/dist-esm/react-composites/src/composites/common/SidePaneHeader.js +6 -2
- package/dist/dist-esm/react-composites/src/composites/common/SidePaneHeader.js.map +1 -1
- package/dist/dist-esm/react-composites/src/composites/common/styles/Pane.styles.d.ts +3 -1
- package/dist/dist-esm/react-composites/src/composites/common/styles/Pane.styles.js +9 -1
- package/dist/dist-esm/react-composites/src/composites/common/styles/Pane.styles.js.map +1 -1
- package/package.json +2 -2
- package/dist/dist-cjs/communication-react/index-BkinusDu.js.map +0 -1
@@ -12,6 +12,9 @@ export class InternalCallContext {
|
|
12
12
|
this._remoteRenderInfos = new Map();
|
13
13
|
// <CallId, <MediaStreamType, LocalRenderInfo>>.
|
14
14
|
this._localRenderInfos = new Map();
|
15
|
+
/* @conditional-compile-remove(together-mode) */
|
16
|
+
// <CallId, <featureName, <MediaStreamType, CallFeatureRenderInfo>>>.
|
17
|
+
this._callFeatureRenderInfos = new Map();
|
15
18
|
// Used for keeping track of rendered LocalVideoStreams that are not part of a Call.
|
16
19
|
this._unparentedRenderInfos = new Map();
|
17
20
|
this._callIdHistory = new CallIdHistory();
|
@@ -31,6 +34,13 @@ export class InternalCallContext {
|
|
31
34
|
this._localRenderInfos.delete(oldCallId);
|
32
35
|
this._localRenderInfos.set(newCallId, localRenderInfos);
|
33
36
|
}
|
37
|
+
/* @conditional-compile-remove(together-mode) */
|
38
|
+
const callFeatureRenderInfos = this._callFeatureRenderInfos.get(oldCallId);
|
39
|
+
/* @conditional-compile-remove(together-mode) */
|
40
|
+
if (callFeatureRenderInfos) {
|
41
|
+
this._callFeatureRenderInfos.delete(oldCallId);
|
42
|
+
this._callFeatureRenderInfos.set(newCallId, callFeatureRenderInfos);
|
43
|
+
}
|
34
44
|
}
|
35
45
|
getCallIds() {
|
36
46
|
return this._remoteRenderInfos.keys();
|
@@ -129,6 +139,46 @@ export class InternalCallContext {
|
|
129
139
|
clearCallRelatedState() {
|
130
140
|
this._remoteRenderInfos.clear();
|
131
141
|
this._localRenderInfos.clear();
|
142
|
+
/* @conditional-compile-remove(together-mode) */
|
143
|
+
this._callFeatureRenderInfos.clear();
|
144
|
+
}
|
145
|
+
/* @conditional-compile-remove(together-mode) */
|
146
|
+
getCallFeatureRenderInfosForCall(callId) {
|
147
|
+
return this._callFeatureRenderInfos.get(this._callIdHistory.latestCallId(callId));
|
148
|
+
}
|
149
|
+
/* @conditional-compile-remove(together-mode) */
|
150
|
+
getCallFeatureRenderInfo(callId, featureNameKey, streamKey) {
|
151
|
+
var _a, _b;
|
152
|
+
const callFeatureRenderInfosForCall = (_b = (_a = this._callFeatureRenderInfos
|
153
|
+
.get(this._callIdHistory.latestCallId(callId))) === null || _a === void 0 ? void 0 : _a.get(featureNameKey)) === null || _b === void 0 ? void 0 : _b.get(streamKey);
|
154
|
+
if (!callFeatureRenderInfosForCall) {
|
155
|
+
return undefined;
|
156
|
+
}
|
157
|
+
return callFeatureRenderInfosForCall;
|
158
|
+
}
|
159
|
+
/* @conditional-compile-remove(together-mode) */
|
160
|
+
setCallFeatureRenderInfo(callId, featureNameKey, streamKey, stream, status, renderer) {
|
161
|
+
let callRenderInfos = this._callFeatureRenderInfos.get(this._callIdHistory.latestCallId(callId));
|
162
|
+
if (!callRenderInfos) {
|
163
|
+
callRenderInfos = new Map();
|
164
|
+
// If the callId is not found, create a new map for the callId.
|
165
|
+
this._callFeatureRenderInfos.set(this._callIdHistory.latestCallId(callId), callRenderInfos);
|
166
|
+
}
|
167
|
+
let featureRenderInfos = callRenderInfos.get(featureNameKey);
|
168
|
+
if (!featureRenderInfos) {
|
169
|
+
featureRenderInfos = new Map();
|
170
|
+
callRenderInfos.set(featureNameKey, featureRenderInfos);
|
171
|
+
}
|
172
|
+
featureRenderInfos.set(streamKey, { stream, status, renderer });
|
173
|
+
}
|
174
|
+
/* @conditional-compile-remove(together-mode) */
|
175
|
+
deleteCallFeatureRenderInfo(callId, featureName, streamKey) {
|
176
|
+
var _a;
|
177
|
+
const callFeatureRenderInfoForCall = this._callFeatureRenderInfos.get(this._callIdHistory.latestCallId(callId));
|
178
|
+
if (!callFeatureRenderInfoForCall || !callFeatureRenderInfoForCall.get(featureName)) {
|
179
|
+
return;
|
180
|
+
}
|
181
|
+
(_a = callFeatureRenderInfoForCall.get(featureName)) === null || _a === void 0 ? void 0 : _a.delete(streamKey);
|
132
182
|
}
|
133
183
|
}
|
134
184
|
//# sourceMappingURL=InternalCallContext.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"InternalCallContext.js","sourceRoot":"","sources":["../../../../../calling-stateful-client/src/InternalCallContext.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport {\n LocalVideoStream,\n MediaStreamType,\n RemoteVideoStream,\n VideoStreamRenderer\n} from '@azure/communication-calling';\nimport { LocalVideoStreamState } from './CallClientState';\nimport type { CallContext } from './CallContext';\nimport { CallIdHistory } from './CallIdHistory';\n\nimport { LocalVideoStreamVideoEffectsSubscriber } from './LocalVideoStreamVideoEffectsSubscriber';\n\nimport { Features } from '@azure/communication-calling';\n\n/**\n * Internally tracked render status. Stores the status of a video render of a stream as rendering could take a long\n * time.\n *\n * 'NotRendered' - the stream has not yet been rendered\n * 'Rendering' - the stream is currently rendering\n * 'Rendered' - the stream has been rendered\n * 'Stopping' - the stream is currently rendering but has been signaled to stop\n */\nexport type RenderStatus = 'NotRendered' | 'Rendering' | 'Rendered' | 'Stopping';\n\n/**\n * Internal container to hold common state needed to keep track of renders.\n */\nexport interface RenderInfo<T> {\n status: RenderStatus;\n renderer: VideoStreamRenderer | undefined;\n stream: T;\n}\n\n/**\n * Internally used to keep track of the status, renderer, and awaiting promise, associated with a LocalVideoStream.\n */\nexport type LocalRenderInfo = RenderInfo<LocalVideoStream>;\n\n/**\n * Internally used to keep track of the status, renderer, and awaiting promise, associated with a RemoteVideoStream.\n */\nexport type RemoteRenderInfo = RenderInfo<RemoteVideoStream>;\n\n/**\n * Contains internal data used between different Declarative components to share data.\n */\nexport class InternalCallContext {\n // <CallId, <ParticipantKey, <StreamId, RemoteRenderInfo>>\n private _remoteRenderInfos = new Map<string, Map<string, Map<number, RemoteRenderInfo>>>();\n\n // <CallId, <MediaStreamType, LocalRenderInfo>>.\n private _localRenderInfos = new Map<string, Map<MediaStreamType, LocalRenderInfo>>();\n\n // Used for keeping track of rendered LocalVideoStreams that are not part of a Call.\n private _unparentedRenderInfos = new Map<MediaStreamType, LocalRenderInfo>();\n private _callIdHistory = new CallIdHistory();\n\n // Used for keeping track of video effects subscribers that are not part of a Call.\n // The key is the stream ID. We assume each stream ID\n\n private _unparentedViewVideoEffectsSubscriber = new Map<string, LocalVideoStreamVideoEffectsSubscriber | undefined>();\n\n public setCallId(newCallId: string, oldCallId: string): void {\n this._callIdHistory.updateCallIdHistory(newCallId, oldCallId);\n const remoteRenderInfos = this._remoteRenderInfos.get(oldCallId);\n if (remoteRenderInfos) {\n this._remoteRenderInfos.delete(oldCallId);\n this._remoteRenderInfos.set(newCallId, remoteRenderInfos);\n }\n\n const localRenderInfos = this._localRenderInfos.get(oldCallId);\n if (localRenderInfos) {\n this._localRenderInfos.delete(oldCallId);\n this._localRenderInfos.set(newCallId, localRenderInfos);\n }\n }\n\n public getCallIds(): IterableIterator<string> {\n return this._remoteRenderInfos.keys();\n }\n\n public getRemoteRenderInfoForCall(callId: string): Map<string, Map<number, RemoteRenderInfo>> | undefined {\n return this._remoteRenderInfos.get(this._callIdHistory.latestCallId(callId));\n }\n\n public getRemoteRenderInfoForParticipant(\n callId: string,\n participantKey: string,\n streamId: number\n ): RemoteRenderInfo | undefined {\n const callRenderInfos = this._remoteRenderInfos.get(this._callIdHistory.latestCallId(callId));\n if (!callRenderInfos) {\n return undefined;\n }\n const participantRenderInfos = callRenderInfos.get(participantKey);\n if (!participantRenderInfos) {\n return undefined;\n }\n return participantRenderInfos.get(streamId);\n }\n\n public setRemoteRenderInfo(\n callId: string,\n participantKey: string,\n streamId: number,\n stream: RemoteVideoStream,\n status: RenderStatus,\n renderer: VideoStreamRenderer | undefined\n ): void {\n let callRenderInfos = this._remoteRenderInfos.get(this._callIdHistory.latestCallId(callId));\n if (!callRenderInfos) {\n callRenderInfos = new Map<string, Map<number, RemoteRenderInfo>>();\n this._remoteRenderInfos.set(this._callIdHistory.latestCallId(callId), callRenderInfos);\n }\n\n let participantRenderInfos = callRenderInfos.get(participantKey);\n if (!participantRenderInfos) {\n participantRenderInfos = new Map<number, RemoteRenderInfo>();\n callRenderInfos.set(participantKey, participantRenderInfos);\n }\n\n participantRenderInfos.set(streamId, { stream, status, renderer });\n }\n\n public deleteRemoteRenderInfo(callId: string, participantKey: string, streamId: number): void {\n const callRenderInfos = this._remoteRenderInfos.get(this._callIdHistory.latestCallId(callId));\n if (!callRenderInfos) {\n return;\n }\n\n const participantRenderInfos = callRenderInfos.get(participantKey);\n if (!participantRenderInfos) {\n return;\n }\n\n participantRenderInfos.delete(streamId);\n }\n\n public setLocalRenderInfo(\n callId: string,\n streamKey: MediaStreamType,\n stream: LocalVideoStream,\n status: RenderStatus,\n renderer: VideoStreamRenderer | undefined\n ): void {\n let localRenderInfosForCall = this._localRenderInfos.get(this._callIdHistory.latestCallId(callId));\n if (!localRenderInfosForCall) {\n localRenderInfosForCall = new Map<MediaStreamType, LocalRenderInfo>();\n this._localRenderInfos.set(this._callIdHistory.latestCallId(callId), localRenderInfosForCall);\n }\n\n localRenderInfosForCall.set(streamKey, { stream, status, renderer });\n }\n\n public getLocalRenderInfosForCall(callId: string): Map<MediaStreamType, LocalRenderInfo> | undefined {\n return this._localRenderInfos.get(this._callIdHistory.latestCallId(callId));\n }\n\n public getLocalRenderInfo(callId: string, streamKey: MediaStreamType): LocalRenderInfo | undefined {\n const localRenderInfosForCall = this._localRenderInfos.get(this._callIdHistory.latestCallId(callId));\n if (!localRenderInfosForCall) {\n return undefined;\n }\n\n return localRenderInfosForCall.get(streamKey);\n }\n\n public deleteLocalRenderInfo(callId: string, streamKey: MediaStreamType): void {\n const localRenderInfoForCall = this._localRenderInfos.get(this._callIdHistory.latestCallId(callId));\n if (!localRenderInfoForCall) {\n return;\n }\n\n localRenderInfoForCall.delete(streamKey);\n }\n\n public getUnparentedRenderInfo(localVideoStream: LocalVideoStreamState): LocalRenderInfo | undefined {\n return this._unparentedRenderInfos.get(localVideoStream.mediaStreamType);\n }\n\n public getUnparentedRenderInfos(): LocalVideoStream[] {\n return [...this._unparentedRenderInfos].map(([, renderInfo]) => renderInfo.stream);\n }\n\n public setUnparentedRenderInfo(\n statefulStream: LocalVideoStreamState,\n stream: LocalVideoStream,\n status: RenderStatus,\n renderer: VideoStreamRenderer | undefined\n ): void {\n this._unparentedRenderInfos.set(statefulStream.mediaStreamType, { stream, status, renderer });\n }\n\n public deleteUnparentedRenderInfo(localVideoStream: LocalVideoStreamState): void {\n this._unparentedViewVideoEffectsSubscriber.get(localVideoStream.mediaStreamType)?.unsubscribe();\n\n this._unparentedRenderInfos.delete(localVideoStream.mediaStreamType);\n }\n\n public subscribeToUnparentedViewVideoEffects(localVideoStream: LocalVideoStream, callContext: CallContext): void {\n {\n // Ensure we aren't setting multiple subscriptions\n this._unparentedViewVideoEffectsSubscriber.get(localVideoStream.mediaStreamType)?.unsubscribe();\n this._unparentedViewVideoEffectsSubscriber.set(\n localVideoStream.mediaStreamType,\n new LocalVideoStreamVideoEffectsSubscriber({\n parent: 'unparented',\n context: callContext,\n localVideoStream: localVideoStream,\n localVideoStreamEffectsAPI: localVideoStream.feature(Features.VideoEffects)\n })\n );\n }\n }\n\n // UnparentedRenderInfos are not cleared as they are not part of the Call state.\n public clearCallRelatedState(): void {\n this._remoteRenderInfos.clear();\n this._localRenderInfos.clear();\n }\n}\n"]}
|
1
|
+
{"version":3,"file":"InternalCallContext.js","sourceRoot":"","sources":["../../../../../calling-stateful-client/src/InternalCallContext.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport {\n LocalVideoStream,\n MediaStreamType,\n RemoteVideoStream,\n VideoStreamRenderer\n} from '@azure/communication-calling';\nimport { LocalVideoStreamState } from './CallClientState';\nimport type { CallContext } from './CallContext';\nimport { CallIdHistory } from './CallIdHistory';\n\nimport { LocalVideoStreamVideoEffectsSubscriber } from './LocalVideoStreamVideoEffectsSubscriber';\n\nimport { Features } from '@azure/communication-calling';\n\n/**\n * Internally tracked render status. Stores the status of a video render of a stream as rendering could take a long\n * time.\n *\n * 'NotRendered' - the stream has not yet been rendered\n * 'Rendering' - the stream is currently rendering\n * 'Rendered' - the stream has been rendered\n * 'Stopping' - the stream is currently rendering but has been signaled to stop\n */\nexport type RenderStatus = 'NotRendered' | 'Rendering' | 'Rendered' | 'Stopping';\n\n/**\n * Internal container to hold common state needed to keep track of renders.\n */\nexport interface RenderInfo<T> {\n status: RenderStatus;\n renderer: VideoStreamRenderer | undefined;\n stream: T;\n}\n\n/**\n * Internally used to keep track of the status, renderer, and awaiting promise, associated with a LocalVideoStream.\n */\nexport type LocalRenderInfo = RenderInfo<LocalVideoStream>;\n\n/**\n * Internally used to keep track of the status, renderer, and awaiting promise, associated with a RemoteVideoStream.\n */\nexport type RemoteRenderInfo = RenderInfo<RemoteVideoStream>;\n\n/* @conditional-compile-remove(together-mode) */\n/**\n * Internally used to keep track of the status, renderer, and awaiting promise, associated with a CallFeatureVideoStream.\n */\nexport type CallFeatureRenderInfo = RenderInfo<RemoteVideoStream>;\n\n/**\n * Contains internal data used between different Declarative components to share data.\n */\nexport class InternalCallContext {\n // <CallId, <ParticipantKey, <StreamId, RemoteRenderInfo>>\n private _remoteRenderInfos = new Map<string, Map<string, Map<number, RemoteRenderInfo>>>();\n\n // <CallId, <MediaStreamType, LocalRenderInfo>>.\n private _localRenderInfos = new Map<string, Map<MediaStreamType, LocalRenderInfo>>();\n\n /* @conditional-compile-remove(together-mode) */\n // <CallId, <featureName, <MediaStreamType, CallFeatureRenderInfo>>>.\n private _callFeatureRenderInfos = new Map<string, Map<string, Map<MediaStreamType, CallFeatureRenderInfo>>>();\n\n // Used for keeping track of rendered LocalVideoStreams that are not part of a Call.\n private _unparentedRenderInfos = new Map<MediaStreamType, LocalRenderInfo>();\n private _callIdHistory = new CallIdHistory();\n\n // Used for keeping track of video effects subscribers that are not part of a Call.\n // The key is the stream ID. We assume each stream ID\n\n private _unparentedViewVideoEffectsSubscriber = new Map<string, LocalVideoStreamVideoEffectsSubscriber | undefined>();\n\n public setCallId(newCallId: string, oldCallId: string): void {\n this._callIdHistory.updateCallIdHistory(newCallId, oldCallId);\n const remoteRenderInfos = this._remoteRenderInfos.get(oldCallId);\n if (remoteRenderInfos) {\n this._remoteRenderInfos.delete(oldCallId);\n this._remoteRenderInfos.set(newCallId, remoteRenderInfos);\n }\n\n const localRenderInfos = this._localRenderInfos.get(oldCallId);\n if (localRenderInfos) {\n this._localRenderInfos.delete(oldCallId);\n this._localRenderInfos.set(newCallId, localRenderInfos);\n }\n /* @conditional-compile-remove(together-mode) */\n const callFeatureRenderInfos = this._callFeatureRenderInfos.get(oldCallId);\n /* @conditional-compile-remove(together-mode) */\n if (callFeatureRenderInfos) {\n this._callFeatureRenderInfos.delete(oldCallId);\n this._callFeatureRenderInfos.set(newCallId, callFeatureRenderInfos);\n }\n }\n\n public getCallIds(): IterableIterator<string> {\n return this._remoteRenderInfos.keys();\n }\n\n public getRemoteRenderInfoForCall(callId: string): Map<string, Map<number, RemoteRenderInfo>> | undefined {\n return this._remoteRenderInfos.get(this._callIdHistory.latestCallId(callId));\n }\n\n public getRemoteRenderInfoForParticipant(\n callId: string,\n participantKey: string,\n streamId: number\n ): RemoteRenderInfo | undefined {\n const callRenderInfos = this._remoteRenderInfos.get(this._callIdHistory.latestCallId(callId));\n if (!callRenderInfos) {\n return undefined;\n }\n const participantRenderInfos = callRenderInfos.get(participantKey);\n if (!participantRenderInfos) {\n return undefined;\n }\n return participantRenderInfos.get(streamId);\n }\n\n public setRemoteRenderInfo(\n callId: string,\n participantKey: string,\n streamId: number,\n stream: RemoteVideoStream,\n status: RenderStatus,\n renderer: VideoStreamRenderer | undefined\n ): void {\n let callRenderInfos = this._remoteRenderInfos.get(this._callIdHistory.latestCallId(callId));\n if (!callRenderInfos) {\n callRenderInfos = new Map<string, Map<number, RemoteRenderInfo>>();\n this._remoteRenderInfos.set(this._callIdHistory.latestCallId(callId), callRenderInfos);\n }\n\n let participantRenderInfos = callRenderInfos.get(participantKey);\n if (!participantRenderInfos) {\n participantRenderInfos = new Map<number, RemoteRenderInfo>();\n callRenderInfos.set(participantKey, participantRenderInfos);\n }\n\n participantRenderInfos.set(streamId, { stream, status, renderer });\n }\n\n public deleteRemoteRenderInfo(callId: string, participantKey: string, streamId: number): void {\n const callRenderInfos = this._remoteRenderInfos.get(this._callIdHistory.latestCallId(callId));\n if (!callRenderInfos) {\n return;\n }\n\n const participantRenderInfos = callRenderInfos.get(participantKey);\n if (!participantRenderInfos) {\n return;\n }\n\n participantRenderInfos.delete(streamId);\n }\n\n public setLocalRenderInfo(\n callId: string,\n streamKey: MediaStreamType,\n stream: LocalVideoStream,\n status: RenderStatus,\n renderer: VideoStreamRenderer | undefined\n ): void {\n let localRenderInfosForCall = this._localRenderInfos.get(this._callIdHistory.latestCallId(callId));\n if (!localRenderInfosForCall) {\n localRenderInfosForCall = new Map<MediaStreamType, LocalRenderInfo>();\n this._localRenderInfos.set(this._callIdHistory.latestCallId(callId), localRenderInfosForCall);\n }\n\n localRenderInfosForCall.set(streamKey, { stream, status, renderer });\n }\n\n public getLocalRenderInfosForCall(callId: string): Map<MediaStreamType, LocalRenderInfo> | undefined {\n return this._localRenderInfos.get(this._callIdHistory.latestCallId(callId));\n }\n\n public getLocalRenderInfo(callId: string, streamKey: MediaStreamType): LocalRenderInfo | undefined {\n const localRenderInfosForCall = this._localRenderInfos.get(this._callIdHistory.latestCallId(callId));\n if (!localRenderInfosForCall) {\n return undefined;\n }\n\n return localRenderInfosForCall.get(streamKey);\n }\n\n public deleteLocalRenderInfo(callId: string, streamKey: MediaStreamType): void {\n const localRenderInfoForCall = this._localRenderInfos.get(this._callIdHistory.latestCallId(callId));\n if (!localRenderInfoForCall) {\n return;\n }\n\n localRenderInfoForCall.delete(streamKey);\n }\n\n public getUnparentedRenderInfo(localVideoStream: LocalVideoStreamState): LocalRenderInfo | undefined {\n return this._unparentedRenderInfos.get(localVideoStream.mediaStreamType);\n }\n\n public getUnparentedRenderInfos(): LocalVideoStream[] {\n return [...this._unparentedRenderInfos].map(([, renderInfo]) => renderInfo.stream);\n }\n\n public setUnparentedRenderInfo(\n statefulStream: LocalVideoStreamState,\n stream: LocalVideoStream,\n status: RenderStatus,\n renderer: VideoStreamRenderer | undefined\n ): void {\n this._unparentedRenderInfos.set(statefulStream.mediaStreamType, { stream, status, renderer });\n }\n\n public deleteUnparentedRenderInfo(localVideoStream: LocalVideoStreamState): void {\n this._unparentedViewVideoEffectsSubscriber.get(localVideoStream.mediaStreamType)?.unsubscribe();\n\n this._unparentedRenderInfos.delete(localVideoStream.mediaStreamType);\n }\n\n public subscribeToUnparentedViewVideoEffects(localVideoStream: LocalVideoStream, callContext: CallContext): void {\n {\n // Ensure we aren't setting multiple subscriptions\n this._unparentedViewVideoEffectsSubscriber.get(localVideoStream.mediaStreamType)?.unsubscribe();\n this._unparentedViewVideoEffectsSubscriber.set(\n localVideoStream.mediaStreamType,\n new LocalVideoStreamVideoEffectsSubscriber({\n parent: 'unparented',\n context: callContext,\n localVideoStream: localVideoStream,\n localVideoStreamEffectsAPI: localVideoStream.feature(Features.VideoEffects)\n })\n );\n }\n }\n\n // UnparentedRenderInfos are not cleared as they are not part of the Call state.\n public clearCallRelatedState(): void {\n this._remoteRenderInfos.clear();\n this._localRenderInfos.clear();\n /* @conditional-compile-remove(together-mode) */\n this._callFeatureRenderInfos.clear();\n }\n\n /* @conditional-compile-remove(together-mode) */\n public getCallFeatureRenderInfosForCall(\n callId: string\n ): Map<string, Map<MediaStreamType, CallFeatureRenderInfo>> | undefined {\n return this._callFeatureRenderInfos.get(this._callIdHistory.latestCallId(callId));\n }\n\n /* @conditional-compile-remove(together-mode) */\n public getCallFeatureRenderInfo(\n callId: string,\n featureNameKey: string,\n streamKey: MediaStreamType\n ): CallFeatureRenderInfo | undefined {\n const callFeatureRenderInfosForCall = this._callFeatureRenderInfos\n .get(this._callIdHistory.latestCallId(callId))\n ?.get(featureNameKey)\n ?.get(streamKey);\n if (!callFeatureRenderInfosForCall) {\n return undefined;\n }\n return callFeatureRenderInfosForCall;\n }\n\n /* @conditional-compile-remove(together-mode) */\n public setCallFeatureRenderInfo(\n callId: string,\n featureNameKey: string,\n streamKey: MediaStreamType,\n stream: RemoteVideoStream,\n status: RenderStatus,\n renderer: VideoStreamRenderer | undefined\n ): void {\n let callRenderInfos = this._callFeatureRenderInfos.get(this._callIdHistory.latestCallId(callId));\n if (!callRenderInfos) {\n callRenderInfos = new Map<string, Map<MediaStreamType, CallFeatureRenderInfo>>();\n // If the callId is not found, create a new map for the callId.\n this._callFeatureRenderInfos.set(this._callIdHistory.latestCallId(callId), callRenderInfos);\n }\n let featureRenderInfos = callRenderInfos.get(featureNameKey);\n if (!featureRenderInfos) {\n featureRenderInfos = new Map<MediaStreamType, CallFeatureRenderInfo>();\n callRenderInfos.set(featureNameKey, featureRenderInfos);\n }\n featureRenderInfos.set(streamKey, { stream, status, renderer });\n }\n\n /* @conditional-compile-remove(together-mode) */\n public deleteCallFeatureRenderInfo(callId: string, featureName: string, streamKey: MediaStreamType): void {\n const callFeatureRenderInfoForCall = this._callFeatureRenderInfos.get(this._callIdHistory.latestCallId(callId));\n if (!callFeatureRenderInfoForCall || !callFeatureRenderInfoForCall.get(featureName)) {\n return;\n }\n\n callFeatureRenderInfoForCall.get(featureName)?.delete(streamKey);\n }\n}\n"]}
|
@@ -0,0 +1,16 @@
|
|
1
|
+
import { MediaAccessCallFeature } from '@azure/communication-calling';
|
2
|
+
import { CallContext } from './CallContext';
|
3
|
+
import { CallIdRef } from './CallIdRef';
|
4
|
+
/**
|
5
|
+
* @private
|
6
|
+
*/
|
7
|
+
export declare class MediaAccessSubscriber {
|
8
|
+
private _callIdRef;
|
9
|
+
private _context;
|
10
|
+
private _mediaAccessCallFeature;
|
11
|
+
constructor(callIdRef: CallIdRef, context: CallContext, mediaAccessCallFeature: MediaAccessCallFeature);
|
12
|
+
private subscribe;
|
13
|
+
unsubscribe: () => void;
|
14
|
+
private mediaAccessChanged;
|
15
|
+
}
|
16
|
+
//# sourceMappingURL=MediaAccessSubscriber.d.ts.map
|
@@ -0,0 +1,26 @@
|
|
1
|
+
// Copyright (c) Microsoft Corporation.
|
2
|
+
// Licensed under the MIT License.
|
3
|
+
/* @conditional-compile-remove(media-access) */
|
4
|
+
/**
|
5
|
+
* @private
|
6
|
+
*/
|
7
|
+
export class MediaAccessSubscriber {
|
8
|
+
constructor(callIdRef, context, mediaAccessCallFeature) {
|
9
|
+
this.subscribe = () => {
|
10
|
+
this._mediaAccessCallFeature.on('mediaAccessChanged', this.mediaAccessChanged);
|
11
|
+
};
|
12
|
+
this.unsubscribe = () => {
|
13
|
+
this._mediaAccessCallFeature.off('mediaAccessChanged', this.mediaAccessChanged);
|
14
|
+
};
|
15
|
+
this.mediaAccessChanged = (data) => {
|
16
|
+
this._context.setMediaAccesses(this._callIdRef.callId, data.mediaAccesses);
|
17
|
+
};
|
18
|
+
this._callIdRef = callIdRef;
|
19
|
+
this._context = context;
|
20
|
+
this._mediaAccessCallFeature = mediaAccessCallFeature;
|
21
|
+
const mediaAccesses = this._mediaAccessCallFeature.getRemoteParticipantsMediaAccess();
|
22
|
+
this._context.setMediaAccesses(this._callIdRef.callId, mediaAccesses);
|
23
|
+
this.subscribe();
|
24
|
+
}
|
25
|
+
}
|
26
|
+
//# sourceMappingURL=MediaAccessSubscriber.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"MediaAccessSubscriber.js","sourceRoot":"","sources":["../../../../../calling-stateful-client/src/MediaAccessSubscriber.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AASlC,+CAA+C;AAC/C;;GAEG;AACH,MAAM,OAAO,qBAAqB;IAKhC,YAAY,SAAoB,EAAE,OAAoB,EAAE,sBAA8C;QAU9F,cAAS,GAAG,GAAS,EAAE;YAC7B,IAAI,CAAC,uBAAuB,CAAC,EAAE,CAAC,oBAAoB,EAAE,IAAI,CAAC,kBAAkB,CAAC,CAAC;QACjF,CAAC,CAAC;QAEK,gBAAW,GAAG,GAAS,EAAE;YAC9B,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,oBAAoB,EAAE,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAClF,CAAC,CAAC;QAEM,uBAAkB,GAAG,CAAC,IAA6B,EAAQ,EAAE;YACnE,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QAC7E,CAAC,CAAC;QAnBA,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QAC5B,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;QACxB,IAAI,CAAC,uBAAuB,GAAG,sBAAsB,CAAC;QAEtD,MAAM,aAAa,GAAG,IAAI,CAAC,uBAAuB,CAAC,gCAAgC,EAAE,CAAC;QACtF,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;QACtE,IAAI,CAAC,SAAS,EAAE,CAAC;IACnB,CAAC;CAaF","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/* @conditional-compile-remove(media-access) */\nimport { MediaAccessCallFeature, MediaAccessChangedEvent } from '@azure/communication-calling';\n/* @conditional-compile-remove(media-access) */\nimport { CallContext } from './CallContext';\n/* @conditional-compile-remove(media-access) */\nimport { CallIdRef } from './CallIdRef';\n\n/* @conditional-compile-remove(media-access) */\n/**\n * @private\n */\nexport class MediaAccessSubscriber {\n private _callIdRef: CallIdRef;\n private _context: CallContext;\n private _mediaAccessCallFeature: MediaAccessCallFeature;\n\n constructor(callIdRef: CallIdRef, context: CallContext, mediaAccessCallFeature: MediaAccessCallFeature) {\n this._callIdRef = callIdRef;\n this._context = context;\n this._mediaAccessCallFeature = mediaAccessCallFeature;\n\n const mediaAccesses = this._mediaAccessCallFeature.getRemoteParticipantsMediaAccess();\n this._context.setMediaAccesses(this._callIdRef.callId, mediaAccesses);\n this.subscribe();\n }\n\n private subscribe = (): void => {\n this._mediaAccessCallFeature.on('mediaAccessChanged', this.mediaAccessChanged);\n };\n\n public unsubscribe = (): void => {\n this._mediaAccessCallFeature.off('mediaAccessChanged', this.mediaAccessChanged);\n };\n\n private mediaAccessChanged = (data: MediaAccessChangedEvent): void => {\n this._context.setMediaAccesses(this._callIdRef.callId, data.mediaAccesses);\n };\n}\n"]}
|
@@ -1,6 +1,6 @@
|
|
1
1
|
import { CallClient, CallClientOptions, CreateViewOptions } from '@azure/communication-calling';
|
2
2
|
import { CallClientState, LocalVideoStreamState, RemoteVideoStreamState } from './CallClientState';
|
3
|
-
import {
|
3
|
+
import { CallFeatureStreamState } from './CallClientState';
|
4
4
|
import { CallContext } from './CallContext';
|
5
5
|
import { DeclarativeCallAgent } from './CallAgentDeclarative';
|
6
6
|
import { InternalCallContext } from './InternalCallContext';
|
@@ -94,7 +94,7 @@ export interface StatefulCallClient extends CallClient {
|
|
94
94
|
* @param stream - The LocalVideoStreamState or RemoteVideoStreamState to start rendering.
|
95
95
|
* @param options - Options that are passed to the {@link @azure/communication-calling#VideoStreamRenderer}.
|
96
96
|
*/
|
97
|
-
createView(callId: string | undefined, participantId: CommunicationIdentifier | undefined, stream: LocalVideoStreamState | RemoteVideoStreamState
|
97
|
+
createView(callId: string | undefined, participantId: CommunicationIdentifier | undefined, stream: LocalVideoStreamState | RemoteVideoStreamState, options?: CreateViewOptions): Promise<CreateViewResult | undefined>;
|
98
98
|
/**
|
99
99
|
* Stops rendering a {@link RemoteVideoStreamState} or {@link LocalVideoStreamState} and removes the
|
100
100
|
* {@link VideoStreamRendererView} from the relevant {@link RemoteVideoStreamState} in {@link CallClientState} or
|
@@ -120,6 +120,37 @@ export interface StatefulCallClient extends CallClient {
|
|
120
120
|
* @param stream - The LocalVideoStreamState or RemoteVideoStreamState to dispose.
|
121
121
|
*/
|
122
122
|
disposeView(callId: string | undefined, participantId: CommunicationIdentifier | undefined, stream: LocalVideoStreamState | RemoteVideoStreamState): void;
|
123
|
+
/**
|
124
|
+
* Renders a {@link CallFeatureStreamState}
|
125
|
+
* {@link VideoStreamRendererViewState} under the relevant {@link CallFeatureStreamState}
|
126
|
+
* {@link @azure/communication-calling#VideoStreamRenderer.createView}.
|
127
|
+
*
|
128
|
+
* Scenario 1: Render CallFeatureStreamState
|
129
|
+
* - CallId is required and stream of type CallFeatureStreamState is required
|
130
|
+
* - Resulting {@link VideoStreamRendererViewState} is stored in the given callId and participantId in
|
131
|
+
* {@link CallClientState}
|
132
|
+
*
|
133
|
+
* @param callId - CallId for the given stream. Can be undefined if the stream is not part of any call.
|
134
|
+
* @param stream - The LocalVideoStreamState or RemoteVideoStreamState to start rendering.
|
135
|
+
* @param options - Options that are passed to the {@link @azure/communication-calling#VideoStreamRenderer}.
|
136
|
+
* @beta
|
137
|
+
*/
|
138
|
+
createView(callId: string, stream: CallFeatureStreamState, options?: CreateViewOptions): Promise<CreateViewResult | undefined>;
|
139
|
+
/**
|
140
|
+
* Stops rendering a {@link CallFeatureStreamState} and removes the
|
141
|
+
* {@link VideoStreamRendererView} from the relevant {@link CallFeatureStreamState} in {@link CallClientState} or
|
142
|
+
* {@link @azure/communication-calling#VideoStreamRenderer.dispose}.
|
143
|
+
*
|
144
|
+
* Its important to disposeView to clean up resources properly.
|
145
|
+
*
|
146
|
+
* Scenario 1: Dispose CallFeatureStreamState
|
147
|
+
* - CallId is required and stream of type CallFeatureStreamState is required
|
148
|
+
*
|
149
|
+
* @param callId - CallId for the given stream. Can be undefined if the stream is not part of any call.
|
150
|
+
* @param stream - The LocalVideoStreamState or RemoteVideoStreamState to dispose.
|
151
|
+
* @beta
|
152
|
+
*/
|
153
|
+
disposeView(callId: string, stream: CallFeatureStreamState): void;
|
123
154
|
/**
|
124
155
|
* The CallAgent is used to handle calls.
|
125
156
|
* To create the CallAgent, pass a CommunicationTokenCredential object provided from SDK.
|
@@ -20,6 +20,8 @@ import { toFlatCommunicationIdentifier, _getApplicationId } from "../../acs-ui-c
|
|
20
20
|
import { callingStatefulLogger } from './Logger';
|
21
21
|
import { teamsCallAgentDeclaratify } from './TeamsCallAgentDeclarative';
|
22
22
|
import { videoStreamRendererViewDeclaratify } from './VideoStreamRendererViewDeclarative';
|
23
|
+
/* @conditional-compile-remove(together-mode) */
|
24
|
+
import { createView as createCallFeatureView, disposeView as disposeCallFeatureView } from './CallFeatureStreamUtils';
|
23
25
|
/**
|
24
26
|
* ProxyCallClient proxies CallClient {@link @azure/communication-calling#CallClient} and subscribes to all events that
|
25
27
|
* affect state. ProxyCallClient keeps its own copy of the call state and when state is updated, ProxyCallClient emits
|
@@ -158,6 +160,14 @@ export const createStatefulCallClientWithDeps = (callClient, context, internalCo
|
|
158
160
|
return result;
|
159
161
|
})
|
160
162
|
});
|
163
|
+
/* @conditional-compile-remove(together-mode) */
|
164
|
+
Object.defineProperty(callClient, 'createCallFeatureView', {
|
165
|
+
configurable: false,
|
166
|
+
value: (callId, stream, options) => __awaiter(void 0, void 0, void 0, function* () {
|
167
|
+
const result = yield createCallFeatureView(context, internalContext, callId, stream, options);
|
168
|
+
return result;
|
169
|
+
})
|
170
|
+
});
|
161
171
|
Object.defineProperty(callClient, 'disposeView', {
|
162
172
|
configurable: false,
|
163
173
|
value: (callId, participantId, stream) => {
|
@@ -165,6 +175,13 @@ export const createStatefulCallClientWithDeps = (callClient, context, internalCo
|
|
165
175
|
disposeView(context, internalContext, callId, participantIdKind, stream);
|
166
176
|
}
|
167
177
|
});
|
178
|
+
/* @conditional-compile-remove(together-mode) */
|
179
|
+
Object.defineProperty(callClient, 'disposeCallFeatureView', {
|
180
|
+
configurable: false,
|
181
|
+
value: (callId, stream) => {
|
182
|
+
disposeCallFeatureView(context, internalContext, callId, stream);
|
183
|
+
}
|
184
|
+
});
|
168
185
|
const newStatefulCallClient = new Proxy(callClient, new ProxyCallClient(context, internalContext));
|
169
186
|
// Populate initial state
|
170
187
|
newStatefulCallClient.feature(Features.DebugInfo).getEnvironmentInfo();
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"StatefulCallClient.js","sourceRoot":"","sources":["../../../../../calling-stateful-client/src/StatefulCallClient.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport { deviceManagerDeclaratify } from './DeviceManagerDeclarative';\nimport {\n CallClient,\n CallClientOptions,\n CreateViewOptions,\n DeviceManager,\n Features\n} from '@azure/communication-calling';\nimport { CallClientState, LocalVideoStreamState, RemoteVideoStreamState } from './CallClientState';\n/* @conditional-compile-remove(together-mode) */\nimport { TogetherModeStreamState } from './CallClientState';\nimport { CallContext } from './CallContext';\nimport { callAgentDeclaratify, DeclarativeCallAgent } from './CallAgentDeclarative';\nimport { InternalCallContext } from './InternalCallContext';\nimport { createView, disposeView, CreateViewResult } from './StreamUtils';\nimport { CommunicationIdentifier, CommunicationUserIdentifier, getIdentifierKind } from '@azure/communication-common';\nimport {\n toFlatCommunicationIdentifier,\n _getApplicationId,\n _TelemetryImplementationHint\n} from '@internal/acs-ui-common';\nimport { callingStatefulLogger } from './Logger';\nimport { DeclarativeTeamsCallAgent, teamsCallAgentDeclaratify } from './TeamsCallAgentDeclarative';\nimport { MicrosoftTeamsUserIdentifier } from '@azure/communication-common';\nimport { videoStreamRendererViewDeclaratify } from './VideoStreamRendererViewDeclarative';\n\n/**\n * Defines the methods that allow CallClient {@link @azure/communication-calling#CallClient} to be used statefully.\n * The interface provides access to proxied state and also allows registering a handler for state change events. For\n * state definition see {@link CallClientState}.\n *\n * State change events are driven by:\n * - Returned data from {@link @azure/communication-calling#DeviceManager} APIs.\n * - Returned data from {@link @azure/communication-calling#CallAgent} APIs.\n * - Listeners automatically attached to various azure communication-calling objects:\n * - CallAgent 'incomingCall'\n * - CallAgent 'callsUpdated'\n * - DeviceManager 'videoDevicesUpdated'\n * - DeviceManager 'audioDevicesUpdated\n * - DeviceManager 'selectedMicrophoneChanged'\n * - DeviceManager 'selectedSpeakerChanged'\n * - Call 'stateChanged'\n * - Call 'idChanged'\n * - Call 'isMutedChanged'\n * - Call 'isScreenSharingOnChanged'\n * - Call 'remoteParticipantsUpdated'\n * - Call 'localVideoStreamsUpdated'\n * - IncomingCall 'callEnded'\n * - RemoteParticipant 'stateChanged'\n * - RemoteParticipant 'isMutedChanged'\n * - RemoteParticipant 'displayNameChanged'\n * - RemoteParticipant 'isSpeakingChanged'\n * - RemoteParticipant 'videoStreamsUpdated'\n * - RemoteVideoStream 'isAvailableChanged'\n * - TranscriptionCallFeature 'isTranscriptionActiveChanged'\n * - RecordingCallFeature 'isRecordingActiveChanged'\n * - LocalRecordingCallFeature 'isLocalRecordingActiveChanged'\n * - RaiseHandCallFeature 'raisedHandEvent'\n * - RaiseHandCallFeature 'loweredHandEvent'\n * - PPTLiveCallFeature 'isAciveChanged'\n * - ReactionCallFeature 'reaction'\n *\n * @public\n */\nexport interface StatefulCallClient extends CallClient {\n /**\n * Holds all the state that we could proxy from CallClient {@link @azure/communication-calling#CallClient} as\n * CallClientState {@link CallClientState}.\n */\n getState(): CallClientState;\n /**\n * Allows a handler to be registered for 'stateChanged' events.\n *\n * @param handler - Callback to receive the state.\n */\n onStateChange(handler: (state: CallClientState) => void): void;\n /**\n * Allows unregistering for 'stateChanged' events.\n *\n * @param handler - Original callback to be unsubscribed.\n */\n offStateChange(handler: (state: CallClientState) => void): void;\n /**\n * Renders a {@link RemoteVideoStreamState} or {@link LocalVideoStreamState} and stores the resulting\n * {@link VideoStreamRendererViewState} under the relevant {@link RemoteVideoStreamState} or\n * {@link LocalVideoStreamState} or as unparented view in the state. Under the hood calls\n * {@link @azure/communication-calling#VideoStreamRenderer.createView}.\n *\n * Scenario 1: Render RemoteVideoStreamState\n * - CallId is required, participantId is required, and stream of type RemoteVideoStreamState is required\n * - Resulting {@link VideoStreamRendererViewState} is stored in the given callId and participantId in\n * {@link CallClientState}\n *\n * Scenario 2: Render LocalVideoStreamState for a call\n * - CallId is required, participantId must be undefined, and stream of type LocalVideoStreamState is required.\n * - The {@link @azure/communication-calling#Call.localVideoStreams} must already be started using\n * {@link @azure/communication-calling#Call.startVideo}.\n * - Resulting {@link VideoStreamRendererViewState} is stored in the given callId {@link CallState.localVideoStreams}\n * in {@link CallClientState}.\n *\n * - Scenario 2: Render LocalVideoStreamState not part of a call (example rendering camera for local preview)\n * - CallId must be undefined, participantId must be undefined, and stream of type LocalVideoStreamState is required.\n * - Resulting {@link VideoStreamRendererViewState} is stored in under the given LocalVideoStreamState in\n * {@link CallClientState.deviceManager.unparentedViews}\n *\n * @param callId - CallId for the given stream. Can be undefined if the stream is not part of any call.\n * @param participantId - {@link RemoteParticipant.identifier} associated with the given RemoteVideoStreamState. Could\n * be undefined if rendering LocalVideoStreamState.\n * @param stream - The LocalVideoStreamState or RemoteVideoStreamState to start rendering.\n * @param options - Options that are passed to the {@link @azure/communication-calling#VideoStreamRenderer}.\n */\n createView(\n callId: string | undefined,\n participantId: CommunicationIdentifier | undefined,\n stream:\n | LocalVideoStreamState\n | RemoteVideoStreamState\n | /* @conditional-compile-remove(together-mode) */ TogetherModeStreamState,\n options?: CreateViewOptions\n ): Promise<CreateViewResult | undefined>;\n /**\n * Stops rendering a {@link RemoteVideoStreamState} or {@link LocalVideoStreamState} and removes the\n * {@link VideoStreamRendererView} from the relevant {@link RemoteVideoStreamState} in {@link CallClientState} or\n * {@link LocalVideoStream} in {@link CallClientState} or appropriate\n * {@link CallClientState.deviceManager.unparentedViews} Under the hood calls\n * {@link @azure/communication-calling#VideoStreamRenderer.dispose}.\n *\n * Its important to disposeView to clean up resources properly.\n *\n * Scenario 1: Dispose RemoteVideoStreamState\n * - CallId is required, participantId is required, and stream of type RemoteVideoStreamState is required\n *\n * Scenario 2: Dispose LocalVideoStreamState for a call\n * - CallId is required, participantId must be undefined, and stream of type LocalVideoStreamState is required.\n *\n * - Scenario 2: Dispose LocalVideoStreamState not part of a call\n * - CallId must be undefined, participantId must be undefined, and stream of type LocalVideoStreamState is required.\n * - LocalVideoStreamState must be the original one passed to createView.\n *\n * @param callId - CallId for the given stream. Can be undefined if the stream is not part of any call.\n * @param participantId - {@link RemoteParticipant.identifier} associated with the given RemoteVideoStreamState. Could\n * be undefined if disposing LocalVideoStreamState.\n * @param stream - The LocalVideoStreamState or RemoteVideoStreamState to dispose.\n */\n disposeView(\n callId: string | undefined,\n participantId: CommunicationIdentifier | undefined,\n stream: LocalVideoStreamState | RemoteVideoStreamState\n ): void;\n\n /**\n * The CallAgent is used to handle calls.\n * To create the CallAgent, pass a CommunicationTokenCredential object provided from SDK.\n * - The CallClient can only have one active CallAgent instance at a time.\n * - You can create a new CallClient instance to create a new CallAgent.\n * - You can dispose of a CallClient's current active CallAgent, and call the CallClient's\n * createCallAgent() method again to create a new CallAgent.\n * @param tokenCredential - The token credential. Use AzureCommunicationTokenCredential from `@azure/communication-common` to create a credential.\n * @param options - The CallAgentOptions for additional options like display name.\n * @public\n */\n createCallAgent(...args: Parameters<CallClient['createCallAgent']>): Promise<DeclarativeCallAgent>;\n\n /**\n * The TeamsCallAgent is used to handle calls.\n * To create the TeamsCallAgent, pass a CommunicationTokenCredential object provided from SDK.\n * - The CallClient can only have one active TeamsCallAgent instance at a time.\n * - You can create a new CallClient instance to create a new TeamsCallAgent.\n * - You can dispose of a CallClient's current active TeamsCallAgent, and call the CallClient's\n * createTeamsCallAgent() method again to create a new TeamsCallAgent.\n * @param tokenCredential - The token credential. Use AzureCommunicationTokenCredential from `@azure/communication-common` to create a credential.\n * @param options - The TeamsCallAgentOptions for additional options like display name.\n * @public\n */\n createTeamsCallAgent(...args: Parameters<CallClient['createTeamsCallAgent']>): Promise<DeclarativeTeamsCallAgent>;\n}\n\n/**\n * A function to modify the state of the StatefulCallClient.\n *\n * Provided as a callback to the {@link StatefulCallClient.modifyState} method.\n *\n * The function must modify the provided state in place as much as possible.\n * Making large modifications can lead to bad performance by causing spurious rerendering of the UI.\n *\n * Consider using commonly used modifier functions exported from this package.\n */\nexport type CallStateModifier = (state: CallClientState) => void;\n\n/**\n * ProxyCallClient proxies CallClient {@link @azure/communication-calling#CallClient} and subscribes to all events that\n * affect state. ProxyCallClient keeps its own copy of the call state and when state is updated, ProxyCallClient emits\n * the event 'stateChanged'.\n */\nclass ProxyCallClient implements ProxyHandler<CallClient> {\n private _context: CallContext;\n private _internalContext: InternalCallContext;\n private _callAgent: DeclarativeCallAgent | DeclarativeTeamsCallAgent | undefined;\n private _deviceManager: DeviceManager | undefined;\n private _sdkDeviceManager: DeviceManager | undefined;\n\n constructor(context: CallContext, internalContext: InternalCallContext) {\n this._context = context;\n this._internalContext = internalContext;\n }\n\n public get<P extends keyof CallClient>(target: CallClient, prop: P): any {\n switch (prop) {\n case 'createCallAgent': {\n return this._context.withAsyncErrorTeedToState(\n async (...args: Parameters<CallClient['createCallAgent']>): Promise<DeclarativeCallAgent> => {\n // createCallAgent will throw an exception if the previous callAgent was not disposed. If the previous\n // callAgent was disposed then it would have unsubscribed to events so we can just create a new declarative\n // callAgent if the createCallAgent succeeds.\n const callAgent = await target.createCallAgent(...args);\n this._callAgent = callAgentDeclaratify(callAgent, this._context, this._internalContext);\n this._context.setCallAgent({\n displayName: this._callAgent.displayName\n });\n return this._callAgent;\n },\n 'CallClient.createCallAgent'\n );\n }\n case 'createTeamsCallAgent': {\n return this._context.withAsyncErrorTeedToState(\n async (...args: Parameters<CallClient['createTeamsCallAgent']>): Promise<DeclarativeTeamsCallAgent> => {\n // createCallAgent will throw an exception if the previous callAgent was not disposed. If the previous\n // callAgent was disposed then it would have unsubscribed to events so we can just create a new declarative\n // callAgent if the createCallAgent succeeds.\n const callAgent = await target.createTeamsCallAgent(...args);\n this._callAgent = teamsCallAgentDeclaratify(callAgent, this._context, this._internalContext);\n this._context.setCallAgent({\n displayName: undefined\n });\n return this._callAgent;\n },\n 'CallClient.createTeamsCallAgent'\n );\n }\n case 'getDeviceManager': {\n return this._context.withAsyncErrorTeedToState(async () => {\n // As of writing, the SDK always returns the same instance of DeviceManager so we keep a reference of\n // DeviceManager and if it does not change we return the cached DeclarativeDeviceManager. If it does not we'll\n // throw an error that indicate we need to fix this issue as our implementation has diverged from the SDK.\n const deviceManager = await target.getDeviceManager();\n if (this._sdkDeviceManager) {\n if (this._sdkDeviceManager === deviceManager) {\n return this._deviceManager;\n } else {\n throw new Error(\n 'Multiple DeviceManager not supported. This means a incompatible version of communication-calling is ' +\n 'used OR calling declarative was not properly updated to communication-calling version.'\n );\n }\n } else {\n this._sdkDeviceManager = deviceManager;\n }\n this._deviceManager = deviceManagerDeclaratify(deviceManager, this._context, this._internalContext);\n return this._deviceManager;\n }, 'CallClient.getDeviceManager');\n }\n case 'feature': {\n return this._context.withErrorTeedToState((...args: Parameters<CallClient['feature']>) => {\n if (args[0] === Features.DebugInfo) {\n const feature = target.feature(Features.DebugInfo);\n /**\n * add to this object if we want to proxy anything else off the DebugInfo feature object.\n */\n return {\n ...feature,\n getEnvironmentInfo: async () => {\n const environmentInfo = await feature.getEnvironmentInfo();\n this._context.setEnvironmentInfo(environmentInfo);\n return environmentInfo;\n }\n };\n }\n return Reflect.get(target, prop);\n }, 'CallClient.feature');\n }\n default:\n return Reflect.get(target, prop);\n }\n }\n}\n\n/**\n * Arguments to construct the StatefulCallClient.\n *\n * @public\n */\nexport type StatefulCallClientArgs = {\n /**\n * UserId from SDK. This is provided for developer convenience to easily access the userId from the\n * state. It is not used by StatefulCallClient.\n */\n userId: CommunicationUserIdentifier | MicrosoftTeamsUserIdentifier;\n};\n\n/**\n * Options to construct the StatefulCallClient with.\n *\n * @public\n */\nexport type StatefulCallClientOptions = {\n /**\n * Options to construct the {@link @axure/communication-calling#CallClient} with.\n */\n callClientOptions: CallClientOptions;\n /**\n * Sets the max listeners limit of the 'stateChange' event. Defaults to the node.js EventEmitter.defaultMaxListeners\n * if not specified.\n */\n maxStateChangeListeners?: number;\n};\n\n/**\n * Creates a StatefulCallClient {@link StatefulCallClient} by proxying CallClient\n * {@link @azure/communication-calling#CallClient} with ProxyCallClient {@link ProxyCallClient} which then allows access\n * to state in a declarative way.\n *\n * It is important to use the {@link @azure/communication-calling#DeviceManager} and\n * {@link @azure/communication-calling#CallAgent} and {@link @azure/communication-calling#Call} (and etc.) that are\n * obtained from the StatefulCallClient in order for their state changes to be proxied properly.\n *\n * @param args - {@link StatefulCallClientArgs}\n * @param options - {@link StatefulCallClientOptions}\n *\n * @public\n */\nexport const createStatefulCallClient = (\n args: StatefulCallClientArgs,\n options?: StatefulCallClientOptions\n): StatefulCallClient => {\n return _createStatefulCallClientInner(args, options);\n};\n\n/**\n * This inner function is used to allow injection of TelemetryImplementationHint without changing the public API.\n *\n * @internal\n */\nexport const _createStatefulCallClientInner = (\n args: StatefulCallClientArgs,\n options?: StatefulCallClientOptions,\n telemetryImplementationHint: _TelemetryImplementationHint = 'StatefulComponents'\n): StatefulCallClient => {\n callingStatefulLogger.info(\n `Creating calling stateful client using library version: ${_getApplicationId(telemetryImplementationHint)}`\n );\n return createStatefulCallClientWithDeps(\n new CallClient(withTelemetryTag(telemetryImplementationHint, options?.callClientOptions)),\n new CallContext(getIdentifierKind(args.userId), options?.maxStateChangeListeners),\n new InternalCallContext()\n );\n};\n\n/**\n * Package-internal version of createStatefulCallClient that allows dependency injection.\n *\n * This function should not be exported from the package.\n */\nexport const createStatefulCallClientWithDeps = (\n callClient: CallClient,\n context: CallContext,\n internalContext: InternalCallContext\n): StatefulCallClient => {\n Object.defineProperty(callClient, 'getState', {\n configurable: false,\n value: () => context.getState()\n });\n Object.defineProperty(callClient, 'onStateChange', {\n configurable: false,\n value: (handler: (state: CallClientState) => void) => context.onStateChange(handler)\n });\n Object.defineProperty(callClient, 'offStateChange', {\n configurable: false,\n value: (handler: (state: CallClientState) => void) => context.offStateChange(handler)\n });\n Object.defineProperty(callClient, 'createView', {\n configurable: false,\n value: async (\n callId: string | undefined,\n participantId: CommunicationIdentifier | undefined,\n stream: LocalVideoStreamState | RemoteVideoStreamState,\n options?: CreateViewOptions\n ): Promise<CreateViewResult | undefined> => {\n const participantIdKind = participantId ? getIdentifierKind(participantId) : undefined;\n const result = await createView(context, internalContext, callId, participantIdKind, stream, options);\n // We only need to declaratify the VideoStreamRendererView object for remote participants. Because the updateScalingMode only needs to be called on remote participant stream views.\n if ('id' in stream && callId && participantId && result) {\n const participantKey = toFlatCommunicationIdentifier(participantId);\n result.view = videoStreamRendererViewDeclaratify(result.view, context, callId, participantKey, stream.id);\n }\n return result;\n }\n });\n Object.defineProperty(callClient, 'disposeView', {\n configurable: false,\n value: (\n callId: string | undefined,\n participantId: CommunicationIdentifier | undefined,\n stream: LocalVideoStreamState | RemoteVideoStreamState\n ): void => {\n const participantIdKind = participantId ? getIdentifierKind(participantId) : undefined;\n disposeView(context, internalContext, callId, participantIdKind, stream);\n }\n });\n\n const newStatefulCallClient = new Proxy(\n callClient,\n new ProxyCallClient(context, internalContext)\n ) as StatefulCallClient;\n\n // Populate initial state\n newStatefulCallClient.feature(Features.DebugInfo).getEnvironmentInfo();\n\n return newStatefulCallClient;\n};\n\nconst withTelemetryTag = (\n telemetryImplementationHint: _TelemetryImplementationHint,\n options?: CallClientOptions\n): CallClientOptions => {\n const tags = options?.diagnostics?.tags ?? [];\n tags.push(_getApplicationId(telemetryImplementationHint));\n return {\n ...options,\n diagnostics: {\n ...options?.diagnostics,\n tags\n }\n };\n};\n"]}
|
1
|
+
{"version":3,"file":"StatefulCallClient.js","sourceRoot":"","sources":["../../../../../calling-stateful-client/src/StatefulCallClient.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport { deviceManagerDeclaratify } from './DeviceManagerDeclarative';\nimport {\n CallClient,\n CallClientOptions,\n CreateViewOptions,\n DeviceManager,\n Features\n} from '@azure/communication-calling';\nimport { CallClientState, LocalVideoStreamState, RemoteVideoStreamState } from './CallClientState';\n/* @conditional-compile-remove(together-mode) */\nimport { CallFeatureStreamState } from './CallClientState';\nimport { CallContext } from './CallContext';\nimport { callAgentDeclaratify, DeclarativeCallAgent } from './CallAgentDeclarative';\nimport { InternalCallContext } from './InternalCallContext';\nimport { createView, disposeView, CreateViewResult } from './StreamUtils';\nimport { CommunicationIdentifier, CommunicationUserIdentifier, getIdentifierKind } from '@azure/communication-common';\nimport {\n toFlatCommunicationIdentifier,\n _getApplicationId,\n _TelemetryImplementationHint\n} from '@internal/acs-ui-common';\nimport { callingStatefulLogger } from './Logger';\nimport { DeclarativeTeamsCallAgent, teamsCallAgentDeclaratify } from './TeamsCallAgentDeclarative';\nimport { MicrosoftTeamsUserIdentifier } from '@azure/communication-common';\nimport { videoStreamRendererViewDeclaratify } from './VideoStreamRendererViewDeclarative';\n/* @conditional-compile-remove(together-mode) */\nimport { createView as createCallFeatureView, disposeView as disposeCallFeatureView } from './CallFeatureStreamUtils';\n\n/**\n * Defines the methods that allow CallClient {@link @azure/communication-calling#CallClient} to be used statefully.\n * The interface provides access to proxied state and also allows registering a handler for state change events. For\n * state definition see {@link CallClientState}.\n *\n * State change events are driven by:\n * - Returned data from {@link @azure/communication-calling#DeviceManager} APIs.\n * - Returned data from {@link @azure/communication-calling#CallAgent} APIs.\n * - Listeners automatically attached to various azure communication-calling objects:\n * - CallAgent 'incomingCall'\n * - CallAgent 'callsUpdated'\n * - DeviceManager 'videoDevicesUpdated'\n * - DeviceManager 'audioDevicesUpdated\n * - DeviceManager 'selectedMicrophoneChanged'\n * - DeviceManager 'selectedSpeakerChanged'\n * - Call 'stateChanged'\n * - Call 'idChanged'\n * - Call 'isMutedChanged'\n * - Call 'isScreenSharingOnChanged'\n * - Call 'remoteParticipantsUpdated'\n * - Call 'localVideoStreamsUpdated'\n * - IncomingCall 'callEnded'\n * - RemoteParticipant 'stateChanged'\n * - RemoteParticipant 'isMutedChanged'\n * - RemoteParticipant 'displayNameChanged'\n * - RemoteParticipant 'isSpeakingChanged'\n * - RemoteParticipant 'videoStreamsUpdated'\n * - RemoteVideoStream 'isAvailableChanged'\n * - TranscriptionCallFeature 'isTranscriptionActiveChanged'\n * - RecordingCallFeature 'isRecordingActiveChanged'\n * - LocalRecordingCallFeature 'isLocalRecordingActiveChanged'\n * - RaiseHandCallFeature 'raisedHandEvent'\n * - RaiseHandCallFeature 'loweredHandEvent'\n * - PPTLiveCallFeature 'isAciveChanged'\n * - ReactionCallFeature 'reaction'\n *\n * @public\n */\nexport interface StatefulCallClient extends CallClient {\n /**\n * Holds all the state that we could proxy from CallClient {@link @azure/communication-calling#CallClient} as\n * CallClientState {@link CallClientState}.\n */\n getState(): CallClientState;\n /**\n * Allows a handler to be registered for 'stateChanged' events.\n *\n * @param handler - Callback to receive the state.\n */\n onStateChange(handler: (state: CallClientState) => void): void;\n /**\n * Allows unregistering for 'stateChanged' events.\n *\n * @param handler - Original callback to be unsubscribed.\n */\n offStateChange(handler: (state: CallClientState) => void): void;\n /**\n * Renders a {@link RemoteVideoStreamState} or {@link LocalVideoStreamState} and stores the resulting\n * {@link VideoStreamRendererViewState} under the relevant {@link RemoteVideoStreamState} or\n * {@link LocalVideoStreamState} or as unparented view in the state. Under the hood calls\n * {@link @azure/communication-calling#VideoStreamRenderer.createView}.\n *\n * Scenario 1: Render RemoteVideoStreamState\n * - CallId is required, participantId is required, and stream of type RemoteVideoStreamState is required\n * - Resulting {@link VideoStreamRendererViewState} is stored in the given callId and participantId in\n * {@link CallClientState}\n *\n * Scenario 2: Render LocalVideoStreamState for a call\n * - CallId is required, participantId must be undefined, and stream of type LocalVideoStreamState is required.\n * - The {@link @azure/communication-calling#Call.localVideoStreams} must already be started using\n * {@link @azure/communication-calling#Call.startVideo}.\n * - Resulting {@link VideoStreamRendererViewState} is stored in the given callId {@link CallState.localVideoStreams}\n * in {@link CallClientState}.\n *\n * - Scenario 2: Render LocalVideoStreamState not part of a call (example rendering camera for local preview)\n * - CallId must be undefined, participantId must be undefined, and stream of type LocalVideoStreamState is required.\n * - Resulting {@link VideoStreamRendererViewState} is stored in under the given LocalVideoStreamState in\n * {@link CallClientState.deviceManager.unparentedViews}\n *\n * @param callId - CallId for the given stream. Can be undefined if the stream is not part of any call.\n * @param participantId - {@link RemoteParticipant.identifier} associated with the given RemoteVideoStreamState. Could\n * be undefined if rendering LocalVideoStreamState.\n * @param stream - The LocalVideoStreamState or RemoteVideoStreamState to start rendering.\n * @param options - Options that are passed to the {@link @azure/communication-calling#VideoStreamRenderer}.\n */\n createView(\n callId: string | undefined,\n participantId: CommunicationIdentifier | undefined,\n stream: LocalVideoStreamState | RemoteVideoStreamState,\n options?: CreateViewOptions\n ): Promise<CreateViewResult | undefined>;\n /**\n * Stops rendering a {@link RemoteVideoStreamState} or {@link LocalVideoStreamState} and removes the\n * {@link VideoStreamRendererView} from the relevant {@link RemoteVideoStreamState} in {@link CallClientState} or\n * {@link LocalVideoStream} in {@link CallClientState} or appropriate\n * {@link CallClientState.deviceManager.unparentedViews} Under the hood calls\n * {@link @azure/communication-calling#VideoStreamRenderer.dispose}.\n *\n * Its important to disposeView to clean up resources properly.\n *\n * Scenario 1: Dispose RemoteVideoStreamState\n * - CallId is required, participantId is required, and stream of type RemoteVideoStreamState is required\n *\n * Scenario 2: Dispose LocalVideoStreamState for a call\n * - CallId is required, participantId must be undefined, and stream of type LocalVideoStreamState is required.\n *\n * - Scenario 2: Dispose LocalVideoStreamState not part of a call\n * - CallId must be undefined, participantId must be undefined, and stream of type LocalVideoStreamState is required.\n * - LocalVideoStreamState must be the original one passed to createView.\n *\n * @param callId - CallId for the given stream. Can be undefined if the stream is not part of any call.\n * @param participantId - {@link RemoteParticipant.identifier} associated with the given RemoteVideoStreamState. Could\n * be undefined if disposing LocalVideoStreamState.\n * @param stream - The LocalVideoStreamState or RemoteVideoStreamState to dispose.\n */\n disposeView(\n callId: string | undefined,\n participantId: CommunicationIdentifier | undefined,\n stream: LocalVideoStreamState | RemoteVideoStreamState\n ): void;\n\n /* @conditional-compile-remove(together-mode) */\n /**\n * Renders a {@link CallFeatureStreamState}\n * {@link VideoStreamRendererViewState} under the relevant {@link CallFeatureStreamState}\n * {@link @azure/communication-calling#VideoStreamRenderer.createView}.\n *\n * Scenario 1: Render CallFeatureStreamState\n * - CallId is required and stream of type CallFeatureStreamState is required\n * - Resulting {@link VideoStreamRendererViewState} is stored in the given callId and participantId in\n * {@link CallClientState}\n *\n * @param callId - CallId for the given stream. Can be undefined if the stream is not part of any call.\n * @param stream - The LocalVideoStreamState or RemoteVideoStreamState to start rendering.\n * @param options - Options that are passed to the {@link @azure/communication-calling#VideoStreamRenderer}.\n * @beta\n */\n createView(\n callId: string,\n stream: CallFeatureStreamState,\n options?: CreateViewOptions\n ): Promise<CreateViewResult | undefined>;\n\n /* @conditional-compile-remove(together-mode) */\n /**\n * Stops rendering a {@link CallFeatureStreamState} and removes the\n * {@link VideoStreamRendererView} from the relevant {@link CallFeatureStreamState} in {@link CallClientState} or\n * {@link @azure/communication-calling#VideoStreamRenderer.dispose}.\n *\n * Its important to disposeView to clean up resources properly.\n *\n * Scenario 1: Dispose CallFeatureStreamState\n * - CallId is required and stream of type CallFeatureStreamState is required\n *\n * @param callId - CallId for the given stream. Can be undefined if the stream is not part of any call.\n * @param stream - The LocalVideoStreamState or RemoteVideoStreamState to dispose.\n * @beta\n */\n disposeView(callId: string, stream: CallFeatureStreamState): void;\n /**\n * The CallAgent is used to handle calls.\n * To create the CallAgent, pass a CommunicationTokenCredential object provided from SDK.\n * - The CallClient can only have one active CallAgent instance at a time.\n * - You can create a new CallClient instance to create a new CallAgent.\n * - You can dispose of a CallClient's current active CallAgent, and call the CallClient's\n * createCallAgent() method again to create a new CallAgent.\n * @param tokenCredential - The token credential. Use AzureCommunicationTokenCredential from `@azure/communication-common` to create a credential.\n * @param options - The CallAgentOptions for additional options like display name.\n * @public\n */\n createCallAgent(...args: Parameters<CallClient['createCallAgent']>): Promise<DeclarativeCallAgent>;\n\n /**\n * The TeamsCallAgent is used to handle calls.\n * To create the TeamsCallAgent, pass a CommunicationTokenCredential object provided from SDK.\n * - The CallClient can only have one active TeamsCallAgent instance at a time.\n * - You can create a new CallClient instance to create a new TeamsCallAgent.\n * - You can dispose of a CallClient's current active TeamsCallAgent, and call the CallClient's\n * createTeamsCallAgent() method again to create a new TeamsCallAgent.\n * @param tokenCredential - The token credential. Use AzureCommunicationTokenCredential from `@azure/communication-common` to create a credential.\n * @param options - The TeamsCallAgentOptions for additional options like display name.\n * @public\n */\n createTeamsCallAgent(...args: Parameters<CallClient['createTeamsCallAgent']>): Promise<DeclarativeTeamsCallAgent>;\n}\n\n/**\n * A function to modify the state of the StatefulCallClient.\n *\n * Provided as a callback to the {@link StatefulCallClient.modifyState} method.\n *\n * The function must modify the provided state in place as much as possible.\n * Making large modifications can lead to bad performance by causing spurious rerendering of the UI.\n *\n * Consider using commonly used modifier functions exported from this package.\n */\nexport type CallStateModifier = (state: CallClientState) => void;\n\n/**\n * ProxyCallClient proxies CallClient {@link @azure/communication-calling#CallClient} and subscribes to all events that\n * affect state. ProxyCallClient keeps its own copy of the call state and when state is updated, ProxyCallClient emits\n * the event 'stateChanged'.\n */\nclass ProxyCallClient implements ProxyHandler<CallClient> {\n private _context: CallContext;\n private _internalContext: InternalCallContext;\n private _callAgent: DeclarativeCallAgent | DeclarativeTeamsCallAgent | undefined;\n private _deviceManager: DeviceManager | undefined;\n private _sdkDeviceManager: DeviceManager | undefined;\n\n constructor(context: CallContext, internalContext: InternalCallContext) {\n this._context = context;\n this._internalContext = internalContext;\n }\n\n public get<P extends keyof CallClient>(target: CallClient, prop: P): any {\n switch (prop) {\n case 'createCallAgent': {\n return this._context.withAsyncErrorTeedToState(\n async (...args: Parameters<CallClient['createCallAgent']>): Promise<DeclarativeCallAgent> => {\n // createCallAgent will throw an exception if the previous callAgent was not disposed. If the previous\n // callAgent was disposed then it would have unsubscribed to events so we can just create a new declarative\n // callAgent if the createCallAgent succeeds.\n const callAgent = await target.createCallAgent(...args);\n this._callAgent = callAgentDeclaratify(callAgent, this._context, this._internalContext);\n this._context.setCallAgent({\n displayName: this._callAgent.displayName\n });\n return this._callAgent;\n },\n 'CallClient.createCallAgent'\n );\n }\n case 'createTeamsCallAgent': {\n return this._context.withAsyncErrorTeedToState(\n async (...args: Parameters<CallClient['createTeamsCallAgent']>): Promise<DeclarativeTeamsCallAgent> => {\n // createCallAgent will throw an exception if the previous callAgent was not disposed. If the previous\n // callAgent was disposed then it would have unsubscribed to events so we can just create a new declarative\n // callAgent if the createCallAgent succeeds.\n const callAgent = await target.createTeamsCallAgent(...args);\n this._callAgent = teamsCallAgentDeclaratify(callAgent, this._context, this._internalContext);\n this._context.setCallAgent({\n displayName: undefined\n });\n return this._callAgent;\n },\n 'CallClient.createTeamsCallAgent'\n );\n }\n case 'getDeviceManager': {\n return this._context.withAsyncErrorTeedToState(async () => {\n // As of writing, the SDK always returns the same instance of DeviceManager so we keep a reference of\n // DeviceManager and if it does not change we return the cached DeclarativeDeviceManager. If it does not we'll\n // throw an error that indicate we need to fix this issue as our implementation has diverged from the SDK.\n const deviceManager = await target.getDeviceManager();\n if (this._sdkDeviceManager) {\n if (this._sdkDeviceManager === deviceManager) {\n return this._deviceManager;\n } else {\n throw new Error(\n 'Multiple DeviceManager not supported. This means a incompatible version of communication-calling is ' +\n 'used OR calling declarative was not properly updated to communication-calling version.'\n );\n }\n } else {\n this._sdkDeviceManager = deviceManager;\n }\n this._deviceManager = deviceManagerDeclaratify(deviceManager, this._context, this._internalContext);\n return this._deviceManager;\n }, 'CallClient.getDeviceManager');\n }\n case 'feature': {\n return this._context.withErrorTeedToState((...args: Parameters<CallClient['feature']>) => {\n if (args[0] === Features.DebugInfo) {\n const feature = target.feature(Features.DebugInfo);\n /**\n * add to this object if we want to proxy anything else off the DebugInfo feature object.\n */\n return {\n ...feature,\n getEnvironmentInfo: async () => {\n const environmentInfo = await feature.getEnvironmentInfo();\n this._context.setEnvironmentInfo(environmentInfo);\n return environmentInfo;\n }\n };\n }\n return Reflect.get(target, prop);\n }, 'CallClient.feature');\n }\n default:\n return Reflect.get(target, prop);\n }\n }\n}\n\n/**\n * Arguments to construct the StatefulCallClient.\n *\n * @public\n */\nexport type StatefulCallClientArgs = {\n /**\n * UserId from SDK. This is provided for developer convenience to easily access the userId from the\n * state. It is not used by StatefulCallClient.\n */\n userId: CommunicationUserIdentifier | MicrosoftTeamsUserIdentifier;\n};\n\n/**\n * Options to construct the StatefulCallClient with.\n *\n * @public\n */\nexport type StatefulCallClientOptions = {\n /**\n * Options to construct the {@link @axure/communication-calling#CallClient} with.\n */\n callClientOptions: CallClientOptions;\n /**\n * Sets the max listeners limit of the 'stateChange' event. Defaults to the node.js EventEmitter.defaultMaxListeners\n * if not specified.\n */\n maxStateChangeListeners?: number;\n};\n\n/**\n * Creates a StatefulCallClient {@link StatefulCallClient} by proxying CallClient\n * {@link @azure/communication-calling#CallClient} with ProxyCallClient {@link ProxyCallClient} which then allows access\n * to state in a declarative way.\n *\n * It is important to use the {@link @azure/communication-calling#DeviceManager} and\n * {@link @azure/communication-calling#CallAgent} and {@link @azure/communication-calling#Call} (and etc.) that are\n * obtained from the StatefulCallClient in order for their state changes to be proxied properly.\n *\n * @param args - {@link StatefulCallClientArgs}\n * @param options - {@link StatefulCallClientOptions}\n *\n * @public\n */\nexport const createStatefulCallClient = (\n args: StatefulCallClientArgs,\n options?: StatefulCallClientOptions\n): StatefulCallClient => {\n return _createStatefulCallClientInner(args, options);\n};\n\n/**\n * This inner function is used to allow injection of TelemetryImplementationHint without changing the public API.\n *\n * @internal\n */\nexport const _createStatefulCallClientInner = (\n args: StatefulCallClientArgs,\n options?: StatefulCallClientOptions,\n telemetryImplementationHint: _TelemetryImplementationHint = 'StatefulComponents'\n): StatefulCallClient => {\n callingStatefulLogger.info(\n `Creating calling stateful client using library version: ${_getApplicationId(telemetryImplementationHint)}`\n );\n return createStatefulCallClientWithDeps(\n new CallClient(withTelemetryTag(telemetryImplementationHint, options?.callClientOptions)),\n new CallContext(getIdentifierKind(args.userId), options?.maxStateChangeListeners),\n new InternalCallContext()\n );\n};\n\n/**\n * Package-internal version of createStatefulCallClient that allows dependency injection.\n *\n * This function should not be exported from the package.\n */\nexport const createStatefulCallClientWithDeps = (\n callClient: CallClient,\n context: CallContext,\n internalContext: InternalCallContext\n): StatefulCallClient => {\n Object.defineProperty(callClient, 'getState', {\n configurable: false,\n value: () => context.getState()\n });\n Object.defineProperty(callClient, 'onStateChange', {\n configurable: false,\n value: (handler: (state: CallClientState) => void) => context.onStateChange(handler)\n });\n Object.defineProperty(callClient, 'offStateChange', {\n configurable: false,\n value: (handler: (state: CallClientState) => void) => context.offStateChange(handler)\n });\n Object.defineProperty(callClient, 'createView', {\n configurable: false,\n value: async (\n callId: string | undefined,\n participantId: CommunicationIdentifier | undefined,\n stream: LocalVideoStreamState | RemoteVideoStreamState,\n options?: CreateViewOptions\n ): Promise<CreateViewResult | undefined> => {\n const participantIdKind = participantId ? getIdentifierKind(participantId) : undefined;\n const result = await createView(context, internalContext, callId, participantIdKind, stream, options);\n // We only need to declaratify the VideoStreamRendererView object for remote participants. Because the updateScalingMode only needs to be called on remote participant stream views.\n if ('id' in stream && callId && participantId && result) {\n const participantKey = toFlatCommunicationIdentifier(participantId);\n result.view = videoStreamRendererViewDeclaratify(result.view, context, callId, participantKey, stream.id);\n }\n return result;\n }\n });\n /* @conditional-compile-remove(together-mode) */\n Object.defineProperty(callClient, 'createCallFeatureView', {\n configurable: false,\n value: async (\n callId: string | undefined,\n stream: CallFeatureStreamState,\n options?: CreateViewOptions\n ): Promise<CreateViewResult | undefined> => {\n const result = await createCallFeatureView(context, internalContext, callId, stream, options);\n return result;\n }\n });\n Object.defineProperty(callClient, 'disposeView', {\n configurable: false,\n value: (\n callId: string | undefined,\n participantId: CommunicationIdentifier | undefined,\n stream: LocalVideoStreamState | RemoteVideoStreamState\n ): void => {\n const participantIdKind = participantId ? getIdentifierKind(participantId) : undefined;\n disposeView(context, internalContext, callId, participantIdKind, stream);\n }\n });\n /* @conditional-compile-remove(together-mode) */\n Object.defineProperty(callClient, 'disposeCallFeatureView', {\n configurable: false,\n value: (callId: string | undefined, stream: CallFeatureStreamState): void => {\n disposeCallFeatureView(context, internalContext, callId, stream);\n }\n });\n\n const newStatefulCallClient = new Proxy(\n callClient,\n new ProxyCallClient(context, internalContext)\n ) as StatefulCallClient;\n\n // Populate initial state\n newStatefulCallClient.feature(Features.DebugInfo).getEnvironmentInfo();\n\n return newStatefulCallClient;\n};\n\nconst withTelemetryTag = (\n telemetryImplementationHint: _TelemetryImplementationHint,\n options?: CallClientOptions\n): CallClientOptions => {\n const tags = options?.diagnostics?.tags ?? [];\n tags.push(_getApplicationId(telemetryImplementationHint));\n return {\n ...options,\n diagnostics: {\n ...options?.diagnostics,\n tags\n }\n };\n};\n"]}
|
@@ -1,7 +1,6 @@
|
|
1
1
|
import { CreateViewOptions, VideoStreamRenderer, VideoStreamRendererView } from '@azure/communication-calling';
|
2
2
|
import { CommunicationIdentifierKind } from '@azure/communication-common';
|
3
3
|
import { LocalVideoStreamState, RemoteVideoStreamState } from './CallClientState';
|
4
|
-
import { TogetherModeStreamState } from './CallClientState';
|
5
4
|
import { CallContext } from './CallContext';
|
6
5
|
import { InternalCallContext } from './InternalCallContext';
|
7
6
|
/**
|
@@ -16,7 +15,7 @@ export type CreateViewResult = {
|
|
16
15
|
/**
|
17
16
|
* @private
|
18
17
|
*/
|
19
|
-
export declare function createView(context: CallContext, internalContext: InternalCallContext, callId: string | undefined, participantId: CommunicationIdentifierKind | string | undefined, stream: LocalVideoStreamState | RemoteVideoStreamState
|
18
|
+
export declare function createView(context: CallContext, internalContext: InternalCallContext, callId: string | undefined, participantId: CommunicationIdentifierKind | string | undefined, stream: LocalVideoStreamState | RemoteVideoStreamState, options?: CreateViewOptions): Promise<CreateViewResult | undefined>;
|
20
19
|
/**
|
21
20
|
* @private
|
22
21
|
*/
|
@@ -368,6 +368,16 @@ export function disposeAllViewsFromCall(context, internalContext, callId) {
|
|
368
368
|
}
|
369
369
|
}
|
370
370
|
}
|
371
|
+
/* @conditional-compile-remove(together-mode) */
|
372
|
+
const callFeatureStreams = internalContext.getCallFeatureRenderInfosForCall(callId);
|
373
|
+
/* @conditional-compile-remove(together-mode) */
|
374
|
+
if (callFeatureStreams) {
|
375
|
+
for (const featureStreams of callFeatureStreams.values()) {
|
376
|
+
for (const streamAndRenderer of featureStreams.values()) {
|
377
|
+
disposeView(context, internalContext, callId, undefined, convertSdkRemoteStreamToDeclarativeRemoteStream(streamAndRenderer.stream));
|
378
|
+
}
|
379
|
+
}
|
380
|
+
}
|
371
381
|
}
|
372
382
|
/**
|
373
383
|
* @private
|