@azure/communication-react 1.5.1-alpha-202301260015 → 1.5.1-alpha-202302010014

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.
@@ -2,5 +2,5 @@
2
2
  // Copyright (c) Microsoft Corporation.
3
3
  // Licensed under the MIT license.
4
4
  // GENERATED FILE. DO NOT EDIT MANUALLY.
5
- module.exports = '1.5.1-alpha-202301260015';
5
+ module.exports = '1.5.1-alpha-202302010014';
6
6
  //# sourceMappingURL=telemetryVersion.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"telemetryVersion.js","sourceRoot":"","sources":["../../../../../acs-ui-common/src/telemetryVersion.js"],"names":[],"mappings":";AAAA,uCAAuC;AACvC,kCAAkC;AAElC,wCAAwC;AAExC,MAAM,CAAC,OAAO,GAAG,0BAA0B,CAAC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n// GENERATED FILE. DO NOT EDIT MANUALLY.\n\nmodule.exports = '1.5.1-alpha-202301260015';\n"]}
1
+ {"version":3,"file":"telemetryVersion.js","sourceRoot":"","sources":["../../../../../acs-ui-common/src/telemetryVersion.js"],"names":[],"mappings":";AAAA,uCAAuC;AACvC,kCAAkC;AAElC,wCAAwC;AAExC,MAAM,CAAC,OAAO,GAAG,0BAA0B,CAAC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n// GENERATED FILE. DO NOT EDIT MANUALLY.\n\nmodule.exports = '1.5.1-alpha-202302010014';\n"]}
@@ -72,4 +72,6 @@ export declare const getCallState: (state: CallClientState, props: CallingBaseSe
72
72
  * @private
73
73
  */
74
74
  export declare const getEnvironmentInfo: (state: CallClientState) => undefined | /* @conditional-compile-remove(unsupported-browser) */ EnvironmentInfo;
75
+ /** @private */
76
+ export declare const getParticipantCount: (state: CallClientState, props: CallingBaseSelectorProps) => number | undefined;
75
77
  //# sourceMappingURL=baseSelectors.d.ts.map
@@ -68,4 +68,11 @@ export const getEnvironmentInfo = (state) => {
68
68
  return state.environmentInfo;
69
69
  return undefined;
70
70
  };
71
+ /** @private */
72
+ export const getParticipantCount = (state, props) => {
73
+ var _a;
74
+ /* @conditional-compile-remove(total-participant-count) */
75
+ return (_a = state.calls[props.callId]) === null || _a === void 0 ? void 0 : _a.totalParticipantCount;
76
+ return undefined;
77
+ };
71
78
  //# sourceMappingURL=baseSelectors.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"baseSelectors.js","sourceRoot":"","sources":["../../../../../calling-component-bindings/src/baseSelectors.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\nimport { DominantSpeakersInfo } from '@azure/communication-calling';\n/* @conditional-compile-remove(unsupported-browser) */\nimport { EnvironmentInfo } from '@azure/communication-calling';\n/* @conditional-compile-remove(rooms) */\nimport { ParticipantRole } from '@azure/communication-calling';\nimport { toFlatCommunicationIdentifier } from '@internal/acs-ui-common';\nimport {\n CallClientState,\n DeviceManagerState,\n RemoteParticipantState,\n LocalVideoStreamState,\n CallErrors,\n DiagnosticsCallFeatureState\n} from '@internal/calling-stateful-client';\n\n/**\n * Common props used to reference calling declarative client state.\n *\n * @public\n */\nexport type CallingBaseSelectorProps = {\n callId: string;\n};\n\n/**\n * @private\n */\nexport const getDeviceManager = (state: CallClientState): DeviceManagerState => state.deviceManager;\n\n/* @conditional-compile-remove(rooms) */\n/**\n * @private\n */\nexport const getRole = (state: CallClientState, props: CallingBaseSelectorProps): ParticipantRole | undefined =>\n state.calls[props.callId]?.role;\n\n/**\n * @private\n */\nexport const getCallExists = (state: CallClientState, props: CallingBaseSelectorProps): boolean =>\n !!state.calls[props.callId];\n\n/**\n * @private\n */\nexport const getDominantSpeakers = (\n state: CallClientState,\n props: CallingBaseSelectorProps\n): undefined | DominantSpeakersInfo => state.calls[props.callId]?.dominantSpeakers;\n\n/**\n * @private\n */\nexport const getRemoteParticipants = (\n state: CallClientState,\n props: CallingBaseSelectorProps\n):\n | {\n [keys: string]: RemoteParticipantState;\n }\n | undefined => {\n return state.calls[props.callId]?.remoteParticipants;\n};\n\n/**\n * @private\n */\nexport const getIsScreenSharingOn = (state: CallClientState, props: CallingBaseSelectorProps): boolean | undefined =>\n state.calls[props.callId]?.isScreenSharingOn;\n\n/**\n * @private\n */\nexport const getIsMuted = (state: CallClientState, props: CallingBaseSelectorProps): boolean | undefined =>\n state.calls[props.callId]?.isMuted;\n\n/**\n * @private\n */\nexport const getLocalVideoStreams = (\n state: CallClientState,\n props: CallingBaseSelectorProps\n): LocalVideoStreamState[] | undefined => state.calls[props.callId]?.localVideoStreams;\n\n/**\n * @private\n */\nexport const getScreenShareRemoteParticipant = (\n state: CallClientState,\n props: CallingBaseSelectorProps\n): string | undefined => state.calls[props.callId]?.screenShareRemoteParticipant;\n\n/**\n * @private\n */\nexport const getDisplayName = (state: CallClientState): string | undefined => state.callAgent?.displayName;\n\n/**\n * @private\n */\nexport const getIdentifier = (state: CallClientState): string => toFlatCommunicationIdentifier(state.userId);\n\n/**\n * @private\n */\nexport const getLatestErrors = (state: CallClientState): CallErrors => state.latestErrors;\n\n/**\n * @private\n */\nexport const getDiagnostics = (\n state: CallClientState,\n props: CallingBaseSelectorProps\n): DiagnosticsCallFeatureState | undefined => state.calls[props.callId]?.diagnostics;\n\n/* @conditional-compile-remove(PSTN-calls) */\n/**\n * @private\n */\nexport const getCallState = (state: CallClientState, props: CallingBaseSelectorProps): string =>\n state.calls[props.callId]?.state;\n\n/**\n * @private\n */\nexport const getEnvironmentInfo = (\n state: CallClientState\n): undefined | /* @conditional-compile-remove(unsupported-browser) */ EnvironmentInfo => {\n /* @conditional-compile-remove(unsupported-browser) */\n return state.environmentInfo;\n return undefined;\n};\n\"../../acs-ui-common/src\"\"../../calling-stateful-client/src\""]}
1
+ {"version":3,"file":"baseSelectors.js","sourceRoot":"","sources":["../../../../../calling-component-bindings/src/baseSelectors.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\nimport { DominantSpeakersInfo } from '@azure/communication-calling';\n/* @conditional-compile-remove(unsupported-browser) */\nimport { EnvironmentInfo } from '@azure/communication-calling';\n/* @conditional-compile-remove(rooms) */\nimport { ParticipantRole } from '@azure/communication-calling';\nimport { toFlatCommunicationIdentifier } from '@internal/acs-ui-common';\nimport {\n CallClientState,\n DeviceManagerState,\n RemoteParticipantState,\n LocalVideoStreamState,\n CallErrors,\n DiagnosticsCallFeatureState\n} from '@internal/calling-stateful-client';\n\n/**\n * Common props used to reference calling declarative client state.\n *\n * @public\n */\nexport type CallingBaseSelectorProps = {\n callId: string;\n};\n\n/**\n * @private\n */\nexport const getDeviceManager = (state: CallClientState): DeviceManagerState => state.deviceManager;\n\n/* @conditional-compile-remove(rooms) */\n/**\n * @private\n */\nexport const getRole = (state: CallClientState, props: CallingBaseSelectorProps): ParticipantRole | undefined =>\n state.calls[props.callId]?.role;\n\n/**\n * @private\n */\nexport const getCallExists = (state: CallClientState, props: CallingBaseSelectorProps): boolean =>\n !!state.calls[props.callId];\n\n/**\n * @private\n */\nexport const getDominantSpeakers = (\n state: CallClientState,\n props: CallingBaseSelectorProps\n): undefined | DominantSpeakersInfo => state.calls[props.callId]?.dominantSpeakers;\n\n/**\n * @private\n */\nexport const getRemoteParticipants = (\n state: CallClientState,\n props: CallingBaseSelectorProps\n):\n | {\n [keys: string]: RemoteParticipantState;\n }\n | undefined => {\n return state.calls[props.callId]?.remoteParticipants;\n};\n\n/**\n * @private\n */\nexport const getIsScreenSharingOn = (state: CallClientState, props: CallingBaseSelectorProps): boolean | undefined =>\n state.calls[props.callId]?.isScreenSharingOn;\n\n/**\n * @private\n */\nexport const getIsMuted = (state: CallClientState, props: CallingBaseSelectorProps): boolean | undefined =>\n state.calls[props.callId]?.isMuted;\n\n/**\n * @private\n */\nexport const getLocalVideoStreams = (\n state: CallClientState,\n props: CallingBaseSelectorProps\n): LocalVideoStreamState[] | undefined => state.calls[props.callId]?.localVideoStreams;\n\n/**\n * @private\n */\nexport const getScreenShareRemoteParticipant = (\n state: CallClientState,\n props: CallingBaseSelectorProps\n): string | undefined => state.calls[props.callId]?.screenShareRemoteParticipant;\n\n/**\n * @private\n */\nexport const getDisplayName = (state: CallClientState): string | undefined => state.callAgent?.displayName;\n\n/**\n * @private\n */\nexport const getIdentifier = (state: CallClientState): string => toFlatCommunicationIdentifier(state.userId);\n\n/**\n * @private\n */\nexport const getLatestErrors = (state: CallClientState): CallErrors => state.latestErrors;\n\n/**\n * @private\n */\nexport const getDiagnostics = (\n state: CallClientState,\n props: CallingBaseSelectorProps\n): DiagnosticsCallFeatureState | undefined => state.calls[props.callId]?.diagnostics;\n\n/* @conditional-compile-remove(PSTN-calls) */\n/**\n * @private\n */\nexport const getCallState = (state: CallClientState, props: CallingBaseSelectorProps): string =>\n state.calls[props.callId]?.state;\n\n/**\n * @private\n */\nexport const getEnvironmentInfo = (\n state: CallClientState\n): undefined | /* @conditional-compile-remove(unsupported-browser) */ EnvironmentInfo => {\n /* @conditional-compile-remove(unsupported-browser) */\n return state.environmentInfo;\n return undefined;\n};\n\n/** @private */\nexport const getParticipantCount = (state: CallClientState, props: CallingBaseSelectorProps): number | undefined => {\n /* @conditional-compile-remove(total-participant-count) */\n return state.calls[props.callId]?.totalParticipantCount;\n return undefined;\n};\n\"../../acs-ui-common/src\"\"../../calling-stateful-client/src\""]}
@@ -255,6 +255,10 @@ export interface CallState {
255
255
  * Proxy of {@link @azure/communication-calling#Call.role}.
256
256
  */
257
257
  role?: ParticipantRole;
258
+ /**
259
+ * Proxy of {@link @azure/communication-calling#Call.totalParticipantCount}.
260
+ */
261
+ totalParticipantCount?: number;
258
262
  }
259
263
  /**
260
264
  * State only version of {@link @azure/communication-calling#IncomingCall}. {@link StatefulCallClient} will
@@ -1 +1 @@
1
- {"version":3,"file":"CallClientState.js","sourceRoot":"","sources":["../../../../../calling-stateful-client/src/CallClientState.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAgdlC;;;;GAIG;AACH,MAAM,OAAO,SAAU,SAAQ,KAAK;IAclC,YAAY,MAAuB,EAAE,UAAiB,EAAE,SAAgB;QACtE,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,8EAA8E;QAC9E,IAAI,CAAC,SAAS,GAAG,SAAS,aAAT,SAAS,cAAT,SAAS,GAAI,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QACnD,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC;QACxB,IAAI,CAAC,OAAO,GAAG,GAAG,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;IAC9D,CAAC;CACF","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\nimport {\n AudioDeviceInfo,\n CallDirection,\n CallEndReason,\n CallerInfo,\n CallState as CallStatus,\n DeviceAccess,\n DominantSpeakersInfo,\n LatestMediaDiagnostics,\n LatestNetworkDiagnostics,\n MediaStreamType,\n RemoteParticipantState as RemoteParticipantStatus,\n ScalingMode,\n VideoDeviceInfo\n} from '@azure/communication-calling';\n/* @conditional-compile-remove(teams-identity-support) */\nimport { CallKind } from '@azure/communication-calling';\n/* @conditional-compile-remove(unsupported-browser) */\nimport { EnvironmentInfo } from '@azure/communication-calling';\n/* @conditional-compile-remove(rooms) */\nimport { ParticipantRole } from '@azure/communication-calling';\nimport {\n CommunicationUserKind,\n MicrosoftTeamsUserKind,\n PhoneNumberKind,\n UnknownIdentifierKind,\n CommunicationIdentifierKind\n} from '@azure/communication-common';\n\n/**\n * State only version of {@link @azure/communication-calling#CallAgent} except calls is moved to be a child directly of\n * {@link CallClientState} and not included here. The reason to have CallAgent's state proxied is to provide access to\n * displayName. We don't flatten CallAgent.displayName and put it in CallClientState because it would be ambiguious that\n * displayName is actually reliant on the creation/existence of CallAgent to be available.\n *\n * @public\n */\nexport interface CallAgentState {\n /**\n * Proxy of {@link @azure/communication-calling#CallAgent.displayName}.\n */\n displayName?: string;\n}\n\n/**\n * State only version of {@link @azure/communication-calling#TranscriptionCallFeature}. {@link StatefulCallClient} will\n * automatically listen for transcription state of the call and update the state exposed by {@link StatefulCallClient}\n * accordingly.\n *\n * @public\n */\nexport interface TranscriptionCallFeatureState {\n /**\n * Proxy of {@link @azure/communication-calling#TranscriptionCallFeature.isTranscriptionActive}.\n */\n isTranscriptionActive: boolean;\n}\n\n/**\n * State only version of {@link @azure/communication-calling#RecordingCallFeature}. {@link StatefulCallClient} will\n * automatically listen for recording state of the call and update the state exposed by {@link StatefulCallClient} accordingly.\n *\n * @public\n */\nexport interface RecordingCallFeatureState {\n /**\n * Proxy of {@link @azure/communication-calling#RecordingCallFeature.isRecordingActive}.\n */\n isRecordingActive: boolean;\n}\n\n/**\n * State only version of {@link @azure/communication-calling#LocalVideoStream}.\n *\n * @public\n */\nexport interface LocalVideoStreamState {\n /**\n * Proxy of {@link @azure/communication-calling#LocalVideoStream.source}.\n */\n source: VideoDeviceInfo;\n /**\n * Proxy of {@link @azure/communication-calling#LocalVideoStream.mediaStreamType}.\n */\n mediaStreamType: MediaStreamType;\n /**\n * {@link VideoStreamRendererView} that is managed by createView/disposeView in {@link StatefulCallClient}\n * API. This can be undefined if the stream has not yet been rendered and defined after createView creates the view.\n */\n view?: VideoStreamRendererViewState;\n}\n\n/**\n * State only version of {@link @azure/communication-calling#RemoteVideoStream}.\n *\n * @public\n */\nexport interface RemoteVideoStreamState {\n /**\n * Proxy of {@link @azure/communication-calling#RemoteVideoStream.id}.\n */\n id: number;\n /**\n * Proxy of {@link @azure/communication-calling#RemoteVideoStream.mediaStreamType}.\n */\n mediaStreamType: MediaStreamType;\n /**\n * Proxy of {@link @azure/communication-calling#RemoteVideoStream.isAvailable}.\n */\n isAvailable: boolean;\n /**\n * Proxy of {@link @azure/communication-calling#RemoteVideoStream.isReceiving}.\n * @beta\n */\n /* @conditional-compile-remove(video-stream-is-receiving-flag) */\n isReceiving: boolean;\n /**\n * {@link VideoStreamRendererView} that is managed by createView/disposeView in {@link StatefulCallClient}\n * API. This can be undefined if the stream has not yet been rendered and defined after createView creates the view.\n */\n view?: VideoStreamRendererViewState;\n}\n\n/**\n * State only version of {@link @azure/communication-calling#VideoStreamRendererView}. This property is added to the state exposed\n * by {@link StatefulCallClient} by {@link StatefulCallClient.createView} and removed by {@link StatefulCallClient.disposeView}.\n *\n * @public\n */\nexport interface VideoStreamRendererViewState {\n /**\n * Proxy of {@link @azure/communication-calling#VideoStreamRendererView.scalingMode}.\n */\n scalingMode: ScalingMode;\n /**\n * Proxy of {@link @azure/communication-calling#VideoStreamRendererView.isMirrored}.\n */\n isMirrored: boolean;\n /**\n * Proxy of {@link @azure/communication-calling#VideoStreamRendererView.target}.\n */\n target: HTMLElement;\n}\n\n/**\n * State only version of {@link @azure/communication-calling#RemoteParticipant}. {@link StatefulCallClient} will\n * automatically retrieve RemoteParticipants and add their state to the state exposed by {@link StatefulCallClient}.\n *\n * @public\n */\nexport interface RemoteParticipantState {\n /**\n * Proxy of {@link @azure/communication-calling#RemoteParticipant.identifier}.\n */\n identifier: CommunicationUserKind | PhoneNumberKind | MicrosoftTeamsUserKind | UnknownIdentifierKind;\n /**\n * Proxy of {@link @azure/communication-calling#RemoteParticipant.displayName}.\n */\n displayName?: string;\n /**\n * Proxy of {@link @azure/communication-calling#RemoteParticipant.state}.\n */\n state: RemoteParticipantStatus;\n /**\n * Proxy of {@link @azure/communication-calling#RemoteParticipant.callEndReason}.\n */\n callEndReason?: CallEndReason;\n /**\n * Proxy of {@link @azure/communication-calling#RemoteParticipant.videoStreams} as an object with\n * {@link RemoteVideoStream} fields keyed by {@link @azure/communication-calling#RemoteVideoStream.id}.\n */\n videoStreams: { [key: number]: RemoteVideoStreamState };\n /**\n * Proxy of {@link @azure/communication-calling#RemoteParticipant.isMuted}.\n */\n isMuted: boolean;\n /**\n * Proxy of {@link @azure/communication-calling#RemoteParticipant.isSpeaking}.\n */\n isSpeaking: boolean;\n /* @conditional-compile-remove(rooms) */\n /**\n * Proxy of {@link @azure/communication-calling#RemoteParticipant.role}.\n */\n role?: ParticipantRole;\n}\n\n/**\n * State only version of {@link @azure/communication-calling#Call}. {@link StatefulCallClient} will automatically\n * retrieve Call's state and add it to the state exposed by {@link StatefulCallClient}.\n *\n * @public\n */\nexport interface CallState {\n /**\n * Proxy of {@link @azure/communication-calling#Call.id}.\n */\n id: string;\n /* @conditional-compile-remove(teams-identity-support) */\n /**\n * Type of the call.\n */\n kind: CallKind;\n /**\n * Proxy of {@link @azure/communication-calling#Call.callerInfo}.\n */\n callerInfo: CallerInfo;\n /**\n * Proxy of {@link @azure/communication-calling#Call.state}.\n */\n state: CallStatus;\n /**\n * Proxy of {@link @azure/communication-calling#Call.callEndReason}.\n */\n callEndReason?: CallEndReason;\n /**\n * Proxy of {@link @azure/communication-calling#Call.direction}.\n */\n direction: CallDirection;\n /**\n * Proxy of {@link @azure/communication-calling#Call.isMuted}.\n */\n isMuted: boolean;\n /**\n * Proxy of {@link @azure/communication-calling#Call.isScreenSharingOn}.\n */\n isScreenSharingOn: boolean;\n /**\n * Proxy of {@link @azure/communication-calling#DominantSpeakersInfo }.\n */\n dominantSpeakers?: DominantSpeakersInfo;\n /**\n * Proxy of {@link @azure/communication-calling#Call.localVideoStreams}.\n */\n localVideoStreams: LocalVideoStreamState[];\n /**\n * Proxy of {@link @azure/communication-calling#Call.remoteParticipants}.\n * Object with {@link RemoteParticipant} fields keyed by flattened {@link RemoteParticipantState.identifier}.\n * To obtain a flattened {@link RemoteParticipantState.identifier}, use\n * {@link @azure/communication-react#toFlatCommunicationIdentifier}.\n */\n remoteParticipants: { [keys: string]: RemoteParticipantState };\n /**\n * Stores remote participants that have left the call so that the callEndReason could be retrieved.\n * Object with {@link RemoteParticipant} fields keyed by flattened {@link RemoteParticipantState.identifier}.\n * To obtain a flattened {@link RemoteParticipantState.identifier}, use\n * {@link @azure/communication-react#toFlatCommunicationIdentifier}.\n */\n remoteParticipantsEnded: { [keys: string]: RemoteParticipantState };\n /**\n * Proxy of {@link @azure/communication-calling#TranscriptionCallFeature}.\n */\n transcription: TranscriptionCallFeatureState;\n /**\n * Proxy of {@link @azure/communication-calling#RecordingCallFeature}.\n */\n recording: RecordingCallFeatureState;\n /**\n * Stores the currently active screenshare participant's key. If there is no screenshare active, then this will be\n * undefined. You can use this key to access the remoteParticipant data in {@link CallState.remoteParticipants} object.\n *\n * Note this only applies to ScreenShare in RemoteParticipant. A local ScreenShare being active will not affect this\n * property.\n *\n * This property is added by the stateful layer and is not a proxy of SDK state\n */\n screenShareRemoteParticipant?: string;\n /**\n * Stores the local date when the call started on the client. This property is added by the stateful layer and is not\n * a proxy of SDK state.\n */\n startTime: Date;\n /**\n * Stores the local date when the call ended on the client. This property is added by the stateful layer and is not\n * a proxy of SDK state.\n */\n endTime: Date | undefined;\n\n /**\n * Stores the latest call diagnostics.\n */\n diagnostics: DiagnosticsCallFeatureState;\n /* @conditional-compile-remove(rooms) */\n /**\n * Proxy of {@link @azure/communication-calling#Call.role}.\n */\n role?: ParticipantRole;\n}\n\n/**\n * State only version of {@link @azure/communication-calling#IncomingCall}. {@link StatefulCallClient} will\n * automatically detect incoming calls and add their state to the state exposed by {@link StatefulCallClient}.\n *\n * @public\n */\nexport interface IncomingCallState {\n /**\n * Proxy of {@link @azure/communication-calling#IncomingCall.id}.\n */\n id: string;\n /**\n * Proxy of {@link @azure/communication-calling#IncomingCall.callerInfo}.\n */\n callerInfo: CallerInfo;\n /**\n * Set to the state returned by 'callEnded' event on {@link @azure/communication-calling#IncomingCall} when received.\n * This property is added by the stateful layer and is not a proxy of SDK state.\n */\n callEndReason?: CallEndReason;\n /**\n * Stores the local date when the call started on the client. This property is added by the stateful layer and is not\n * a proxy of SDK state.\n */\n startTime: Date;\n /**\n * Stores the local date when the call ended on the client. This property is added by the stateful layer and is not a\n * proxy of SDK state. It is undefined if the call is not ended yet.\n */\n endTime?: Date;\n}\n\n/**\n * This type is meant to encapsulate all the state inside {@link @azure/communication-calling#DeviceManager}. For\n * optional parameters they may not be available until permission is granted by the user. The cameras, microphones,\n * speakers, and deviceAccess states will be empty until the corresponding\n * {@link @azure/communication-calling#DeviceManager}'s getCameras, getMicrophones, getSpeakers, and askDevicePermission\n * APIs are called and completed.\n *\n * @public\n */\nexport type DeviceManagerState = {\n /**\n * Proxy of {@link @azure/communication-calling#DeviceManager.isSpeakerSelectionAvailable}.\n */\n isSpeakerSelectionAvailable: boolean;\n /**\n * Proxy of {@link @azure/communication-calling#DeviceManager.selectedMicrophone}.\n */\n selectedMicrophone?: AudioDeviceInfo;\n /**\n * Proxy of {@link @azure/communication-calling#DeviceManager.selectedSpeaker}.\n */\n selectedSpeaker?: AudioDeviceInfo;\n /**\n * Stores the selected camera device info. This is added by the stateful layer and does not exist in the Calling SDK.\n * It is meant as a convenience to the developer. It must be explicitly set before it has any value and does not\n * persist across instances of the {@link StatefulCallClient}. The developer controls entirely what this value holds\n * at any time.\n */\n selectedCamera?: VideoDeviceInfo;\n /**\n * Stores any cameras data returned from {@link @azure/communication-calling#DeviceManager.getCameras}.\n */\n cameras: VideoDeviceInfo[];\n /**\n * Stores any microphones data returned from {@link @azure/communication-calling#DeviceManager.getMicrophones}.\n */\n microphones: AudioDeviceInfo[];\n /**\n * Stores any speakers data returned from {@link @azure/communication-calling#DeviceManager.getSpeakers}.\n */\n speakers: AudioDeviceInfo[];\n /**\n * Stores deviceAccess data returned from {@link @azure/communication-calling#DeviceManager.askDevicePermission}.\n */\n deviceAccess?: DeviceAccess;\n /**\n * Stores created views that are not associated with any CallState (when {@link StatefulCallClient.createView} is\n * called with undefined callId, undefined participantId, and defined LocalVideoStream).\n *\n * The values in this array are generated internally when {@link StatefulCallClient.createView} is called and are\n * considered immutable.\n */\n unparentedViews: LocalVideoStreamState[];\n};\n\n/**\n * Container for all of the state data proxied by {@link StatefulCallClient}. The calls, callsEnded, incomingCalls, and\n * incomingCallsEnded states will be automatically provided if a callAgent has been created. The deviceManager will be\n * empty initially until populated see {@link DeviceManagerState}. The userId state is provided as a convenience for the\n * developer and is completely controled and set by the developer.\n *\n * @public\n */\nexport interface CallClientState {\n /**\n * Proxy of {@link @azure/communication-calling#CallAgent.calls} as an object with CallState {@link CallState} fields.\n * It is keyed by {@link @azure/communication-calling#Call.id}. Please note that\n * {@link @azure/communication-calling#Call.id} could change. You should not cache the id itself but the entire\n * {@link @azure/communication-calling#Call} and then use the id contained to look up data in this map.\n */\n calls: { [key: string]: CallState };\n /**\n * Calls that have ended are stored here so the callEndReason could be checked.\n * It is an object with {@link @azure/communication-calling#Call.id} keys and {@link CallState} values.\n *\n * Only {@link MAX_CALL_HISTORY_LENGTH} Calls are kept in the history. Oldest calls are evicted if required.\n */\n callsEnded: { [key: string]: CallState };\n /**\n * Proxy of {@link @azure/communication-calling#IncomingCall} as an object with {@link IncomingCall} fields.\n * It is keyed by {@link @azure/communication-calling#IncomingCall.id}.\n */\n incomingCalls: { [key: string]: IncomingCallState };\n /**\n * Incoming Calls that have ended are stored here so the callEndReason could be checked.\n * It is an as an object with {@link @azure/communication-calling#Call.id} keys and {@link IncomingCall} values.\n *\n * Only {@link MAX_CALL_HISTORY_LENGTH} Calls are kept in the history. Oldest calls are evicted if required.\n */\n incomingCallsEnded: { [key: string]: IncomingCallState };\n /**\n * Proxy of {@link @azure/communication-calling#DeviceManager}. Please review {@link DeviceManagerState}.\n */\n deviceManager: DeviceManagerState;\n /**\n * Proxy of {@link @azure/communication-calling#CallAgent}. Please review {@link CallAgentState}.\n */\n callAgent?: CallAgentState;\n /**\n * Stores a userId. This is not used by the {@link StatefulCallClient} and is provided here as a convenience for the\n * developer for easier access to userId. Must be passed in at initialization of the {@link StatefulCallClient}.\n * Completely controlled by the developer.\n */\n userId: CommunicationIdentifierKind;\n /**\n * Stores the latest error for each API method.\n *\n * See documentation of {@Link CallErrors} for details.\n */\n latestErrors: CallErrors;\n /* @conditional-compile-remove(PSTN-calls) */\n /**\n * A phone number in E.164 format that will be used to represent callers identity.\n * For example, using the alternateCallerId to add a participant using PSTN, this number will\n * be used as the caller id in the PSTN call.\n */\n alternateCallerId?: string;\n /* @conditional-compile-remove(unsupported-browser) */\n /**\n * state to track the environment that the stateful client was made in is supported\n */\n environmentInfo?: EnvironmentInfo;\n}\n\n/**\n * Errors teed from API calls to the Calling SDK.\n *\n * Each property in the object stores the latest error for a particular SDK API method.\n *\n * Errors from this object can be cleared using the {@link newClearCallErrorsModifier}.\n * Additionally, errors are automatically cleared when:\n * - The state is cleared.\n * - Subsequent calls to related API methods succeed.\n * See documentation of individual stateful client methods for details on when errors may be automatically cleared.\n *\n * @public\n */\nexport type CallErrors = {\n [target in CallErrorTarget]: CallError;\n};\n\n/**\n * Error thrown from failed stateful API methods.\n *\n * @public\n */\nexport class CallError extends Error {\n /**\n * The API method target that failed.\n */\n public target: CallErrorTarget;\n /**\n * Error thrown by the failed SDK method.\n */\n public innerError: Error;\n /**\n * Timestamp added to the error by the stateful layer.\n */\n public timestamp: Date;\n\n constructor(target: CallErrorTarget, innerError: Error, timestamp?: Date) {\n super();\n this.target = target;\n this.innerError = innerError;\n // Testing note: It is easier to mock Date::now() than the Date() constructor.\n this.timestamp = timestamp ?? new Date(Date.now());\n this.name = 'CallError';\n this.message = `${this.target}: ${this.innerError.message}`;\n }\n}\n\n/**\n * String literal type for all permissible keys in {@Link CallErrors}.\n *\n * @public\n */\nexport type CallErrorTarget =\n | 'Call.addParticipant'\n | /* @conditional-compile-remove(calling-beta-sdk) */ 'Call.dispose'\n | 'Call.feature'\n | 'Call.hangUp'\n | 'Call.hold'\n | 'Call.mute'\n | /* @conditional-compile-remove(calling-beta-sdk) */ 'Call.muteIncomingAudio'\n | 'Call.off'\n | 'Call.on'\n | 'Call.removeParticipant'\n | 'Call.resume'\n | 'Call.sendDtmf'\n | /* @conditional-compile-remove(calling-beta-sdk) */ 'Call.startAudio'\n | 'Call.startScreenSharing'\n | 'Call.startVideo'\n | 'Call.stopScreenSharing'\n | /* @conditional-compile-remove(calling-beta-sdk) */ 'Call.stopAudio'\n | 'Call.stopVideo'\n | 'Call.unmute'\n | /* @conditional-compile-remove(calling-beta-sdk) */ 'Call.unmuteIncomingAudio'\n | 'CallAgent.dispose'\n | 'CallAgent.feature'\n | 'CallAgent.join'\n | 'CallAgent.off'\n | 'CallAgent.on'\n | 'CallAgent.startCall'\n | 'CallClient.createCallAgent'\n | /* @conditional-compile-remove(calling-beta-sdk) */ /* @conditional-compile-remove(teams-identity-support) */ 'CallClient.createTeamsCallAgent'\n | 'CallClient.feature'\n | 'CallClient.getDeviceManager'\n | /* @conditional-compile-remove(calling-beta-sdk) */ 'CallClient.getEnvironmentInfo'\n | 'DeviceManager.askDevicePermission'\n | 'DeviceManager.getCameras'\n | 'DeviceManager.getMicrophones'\n | 'DeviceManager.getSpeakers'\n | 'DeviceManager.off'\n | 'DeviceManager.on'\n | 'DeviceManager.selectMicrophone'\n | 'DeviceManager.selectSpeaker'\n | 'IncomingCall.accept'\n | 'IncomingCall.reject'\n | /* @conditional-compile-remove(calling-beta-sdk) */ /* @conditional-compile-remove(teams-identity-support) */ 'TeamsCall.addParticipant';\n\n/**\n * State only proxy for {@link @azure/communication-calling#DiagnosticsCallFeature}.\n *\n * @public\n */\nexport interface DiagnosticsCallFeatureState {\n /**\n * Stores diagnostics related to network conditions.\n */\n network: NetworkDiagnosticsState;\n\n /**\n * Stores diagnostics related to media quality.\n */\n media: MediaDiagnosticsState;\n}\n\n/**\n * State only proxy for {@link @azure/communication-calling#NetworkDiagnostics}.\n *\n * @public\n */\nexport interface NetworkDiagnosticsState {\n latest: LatestNetworkDiagnostics;\n}\n\n/**\n * State only proxy for {@link @azure/communication-calling#MediaDiagnostics}.\n *\n * @public\n */\nexport interface MediaDiagnosticsState {\n latest: LatestMediaDiagnostics;\n}\n"]}
1
+ {"version":3,"file":"CallClientState.js","sourceRoot":"","sources":["../../../../../calling-stateful-client/src/CallClientState.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAsdlC;;;;GAIG;AACH,MAAM,OAAO,SAAU,SAAQ,KAAK;IAclC,YAAY,MAAuB,EAAE,UAAiB,EAAE,SAAgB;QACtE,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,8EAA8E;QAC9E,IAAI,CAAC,SAAS,GAAG,SAAS,aAAT,SAAS,cAAT,SAAS,GAAI,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QACnD,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC;QACxB,IAAI,CAAC,OAAO,GAAG,GAAG,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;IAC9D,CAAC;CACF","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\nimport {\n AudioDeviceInfo,\n CallDirection,\n CallEndReason,\n CallerInfo,\n CallState as CallStatus,\n DeviceAccess,\n DominantSpeakersInfo,\n LatestMediaDiagnostics,\n LatestNetworkDiagnostics,\n MediaStreamType,\n RemoteParticipantState as RemoteParticipantStatus,\n ScalingMode,\n VideoDeviceInfo\n} from '@azure/communication-calling';\n/* @conditional-compile-remove(teams-identity-support) */\nimport { CallKind } from '@azure/communication-calling';\n/* @conditional-compile-remove(unsupported-browser) */\nimport { EnvironmentInfo } from '@azure/communication-calling';\n/* @conditional-compile-remove(rooms) */\nimport { ParticipantRole } from '@azure/communication-calling';\nimport {\n CommunicationUserKind,\n MicrosoftTeamsUserKind,\n PhoneNumberKind,\n UnknownIdentifierKind,\n CommunicationIdentifierKind\n} from '@azure/communication-common';\n\n/**\n * State only version of {@link @azure/communication-calling#CallAgent} except calls is moved to be a child directly of\n * {@link CallClientState} and not included here. The reason to have CallAgent's state proxied is to provide access to\n * displayName. We don't flatten CallAgent.displayName and put it in CallClientState because it would be ambiguious that\n * displayName is actually reliant on the creation/existence of CallAgent to be available.\n *\n * @public\n */\nexport interface CallAgentState {\n /**\n * Proxy of {@link @azure/communication-calling#CallAgent.displayName}.\n */\n displayName?: string;\n}\n\n/**\n * State only version of {@link @azure/communication-calling#TranscriptionCallFeature}. {@link StatefulCallClient} will\n * automatically listen for transcription state of the call and update the state exposed by {@link StatefulCallClient}\n * accordingly.\n *\n * @public\n */\nexport interface TranscriptionCallFeatureState {\n /**\n * Proxy of {@link @azure/communication-calling#TranscriptionCallFeature.isTranscriptionActive}.\n */\n isTranscriptionActive: boolean;\n}\n\n/**\n * State only version of {@link @azure/communication-calling#RecordingCallFeature}. {@link StatefulCallClient} will\n * automatically listen for recording state of the call and update the state exposed by {@link StatefulCallClient} accordingly.\n *\n * @public\n */\nexport interface RecordingCallFeatureState {\n /**\n * Proxy of {@link @azure/communication-calling#RecordingCallFeature.isRecordingActive}.\n */\n isRecordingActive: boolean;\n}\n\n/**\n * State only version of {@link @azure/communication-calling#LocalVideoStream}.\n *\n * @public\n */\nexport interface LocalVideoStreamState {\n /**\n * Proxy of {@link @azure/communication-calling#LocalVideoStream.source}.\n */\n source: VideoDeviceInfo;\n /**\n * Proxy of {@link @azure/communication-calling#LocalVideoStream.mediaStreamType}.\n */\n mediaStreamType: MediaStreamType;\n /**\n * {@link VideoStreamRendererView} that is managed by createView/disposeView in {@link StatefulCallClient}\n * API. This can be undefined if the stream has not yet been rendered and defined after createView creates the view.\n */\n view?: VideoStreamRendererViewState;\n}\n\n/**\n * State only version of {@link @azure/communication-calling#RemoteVideoStream}.\n *\n * @public\n */\nexport interface RemoteVideoStreamState {\n /**\n * Proxy of {@link @azure/communication-calling#RemoteVideoStream.id}.\n */\n id: number;\n /**\n * Proxy of {@link @azure/communication-calling#RemoteVideoStream.mediaStreamType}.\n */\n mediaStreamType: MediaStreamType;\n /**\n * Proxy of {@link @azure/communication-calling#RemoteVideoStream.isAvailable}.\n */\n isAvailable: boolean;\n /**\n * Proxy of {@link @azure/communication-calling#RemoteVideoStream.isReceiving}.\n * @beta\n */\n /* @conditional-compile-remove(video-stream-is-receiving-flag) */\n isReceiving: boolean;\n /**\n * {@link VideoStreamRendererView} that is managed by createView/disposeView in {@link StatefulCallClient}\n * API. This can be undefined if the stream has not yet been rendered and defined after createView creates the view.\n */\n view?: VideoStreamRendererViewState;\n}\n\n/**\n * State only version of {@link @azure/communication-calling#VideoStreamRendererView}. This property is added to the state exposed\n * by {@link StatefulCallClient} by {@link StatefulCallClient.createView} and removed by {@link StatefulCallClient.disposeView}.\n *\n * @public\n */\nexport interface VideoStreamRendererViewState {\n /**\n * Proxy of {@link @azure/communication-calling#VideoStreamRendererView.scalingMode}.\n */\n scalingMode: ScalingMode;\n /**\n * Proxy of {@link @azure/communication-calling#VideoStreamRendererView.isMirrored}.\n */\n isMirrored: boolean;\n /**\n * Proxy of {@link @azure/communication-calling#VideoStreamRendererView.target}.\n */\n target: HTMLElement;\n}\n\n/**\n * State only version of {@link @azure/communication-calling#RemoteParticipant}. {@link StatefulCallClient} will\n * automatically retrieve RemoteParticipants and add their state to the state exposed by {@link StatefulCallClient}.\n *\n * @public\n */\nexport interface RemoteParticipantState {\n /**\n * Proxy of {@link @azure/communication-calling#RemoteParticipant.identifier}.\n */\n identifier: CommunicationUserKind | PhoneNumberKind | MicrosoftTeamsUserKind | UnknownIdentifierKind;\n /**\n * Proxy of {@link @azure/communication-calling#RemoteParticipant.displayName}.\n */\n displayName?: string;\n /**\n * Proxy of {@link @azure/communication-calling#RemoteParticipant.state}.\n */\n state: RemoteParticipantStatus;\n /**\n * Proxy of {@link @azure/communication-calling#RemoteParticipant.callEndReason}.\n */\n callEndReason?: CallEndReason;\n /**\n * Proxy of {@link @azure/communication-calling#RemoteParticipant.videoStreams} as an object with\n * {@link RemoteVideoStream} fields keyed by {@link @azure/communication-calling#RemoteVideoStream.id}.\n */\n videoStreams: { [key: number]: RemoteVideoStreamState };\n /**\n * Proxy of {@link @azure/communication-calling#RemoteParticipant.isMuted}.\n */\n isMuted: boolean;\n /**\n * Proxy of {@link @azure/communication-calling#RemoteParticipant.isSpeaking}.\n */\n isSpeaking: boolean;\n /* @conditional-compile-remove(rooms) */\n /**\n * Proxy of {@link @azure/communication-calling#RemoteParticipant.role}.\n */\n role?: ParticipantRole;\n}\n\n/**\n * State only version of {@link @azure/communication-calling#Call}. {@link StatefulCallClient} will automatically\n * retrieve Call's state and add it to the state exposed by {@link StatefulCallClient}.\n *\n * @public\n */\nexport interface CallState {\n /**\n * Proxy of {@link @azure/communication-calling#Call.id}.\n */\n id: string;\n /* @conditional-compile-remove(teams-identity-support) */\n /**\n * Type of the call.\n */\n kind: CallKind;\n /**\n * Proxy of {@link @azure/communication-calling#Call.callerInfo}.\n */\n callerInfo: CallerInfo;\n /**\n * Proxy of {@link @azure/communication-calling#Call.state}.\n */\n state: CallStatus;\n /**\n * Proxy of {@link @azure/communication-calling#Call.callEndReason}.\n */\n callEndReason?: CallEndReason;\n /**\n * Proxy of {@link @azure/communication-calling#Call.direction}.\n */\n direction: CallDirection;\n /**\n * Proxy of {@link @azure/communication-calling#Call.isMuted}.\n */\n isMuted: boolean;\n /**\n * Proxy of {@link @azure/communication-calling#Call.isScreenSharingOn}.\n */\n isScreenSharingOn: boolean;\n /**\n * Proxy of {@link @azure/communication-calling#DominantSpeakersInfo }.\n */\n dominantSpeakers?: DominantSpeakersInfo;\n /**\n * Proxy of {@link @azure/communication-calling#Call.localVideoStreams}.\n */\n localVideoStreams: LocalVideoStreamState[];\n /**\n * Proxy of {@link @azure/communication-calling#Call.remoteParticipants}.\n * Object with {@link RemoteParticipant} fields keyed by flattened {@link RemoteParticipantState.identifier}.\n * To obtain a flattened {@link RemoteParticipantState.identifier}, use\n * {@link @azure/communication-react#toFlatCommunicationIdentifier}.\n */\n remoteParticipants: { [keys: string]: RemoteParticipantState };\n /**\n * Stores remote participants that have left the call so that the callEndReason could be retrieved.\n * Object with {@link RemoteParticipant} fields keyed by flattened {@link RemoteParticipantState.identifier}.\n * To obtain a flattened {@link RemoteParticipantState.identifier}, use\n * {@link @azure/communication-react#toFlatCommunicationIdentifier}.\n */\n remoteParticipantsEnded: { [keys: string]: RemoteParticipantState };\n /**\n * Proxy of {@link @azure/communication-calling#TranscriptionCallFeature}.\n */\n transcription: TranscriptionCallFeatureState;\n /**\n * Proxy of {@link @azure/communication-calling#RecordingCallFeature}.\n */\n recording: RecordingCallFeatureState;\n /**\n * Stores the currently active screenshare participant's key. If there is no screenshare active, then this will be\n * undefined. You can use this key to access the remoteParticipant data in {@link CallState.remoteParticipants} object.\n *\n * Note this only applies to ScreenShare in RemoteParticipant. A local ScreenShare being active will not affect this\n * property.\n *\n * This property is added by the stateful layer and is not a proxy of SDK state\n */\n screenShareRemoteParticipant?: string;\n /**\n * Stores the local date when the call started on the client. This property is added by the stateful layer and is not\n * a proxy of SDK state.\n */\n startTime: Date;\n /**\n * Stores the local date when the call ended on the client. This property is added by the stateful layer and is not\n * a proxy of SDK state.\n */\n endTime: Date | undefined;\n\n /**\n * Stores the latest call diagnostics.\n */\n diagnostics: DiagnosticsCallFeatureState;\n /* @conditional-compile-remove(rooms) */\n /**\n * Proxy of {@link @azure/communication-calling#Call.role}.\n */\n role?: ParticipantRole;\n\n /* @conditional-compile-remove(total-participant-count) */\n /**\n * Proxy of {@link @azure/communication-calling#Call.totalParticipantCount}.\n */\n totalParticipantCount?: number;\n}\n\n/**\n * State only version of {@link @azure/communication-calling#IncomingCall}. {@link StatefulCallClient} will\n * automatically detect incoming calls and add their state to the state exposed by {@link StatefulCallClient}.\n *\n * @public\n */\nexport interface IncomingCallState {\n /**\n * Proxy of {@link @azure/communication-calling#IncomingCall.id}.\n */\n id: string;\n /**\n * Proxy of {@link @azure/communication-calling#IncomingCall.callerInfo}.\n */\n callerInfo: CallerInfo;\n /**\n * Set to the state returned by 'callEnded' event on {@link @azure/communication-calling#IncomingCall} when received.\n * This property is added by the stateful layer and is not a proxy of SDK state.\n */\n callEndReason?: CallEndReason;\n /**\n * Stores the local date when the call started on the client. This property is added by the stateful layer and is not\n * a proxy of SDK state.\n */\n startTime: Date;\n /**\n * Stores the local date when the call ended on the client. This property is added by the stateful layer and is not a\n * proxy of SDK state. It is undefined if the call is not ended yet.\n */\n endTime?: Date;\n}\n\n/**\n * This type is meant to encapsulate all the state inside {@link @azure/communication-calling#DeviceManager}. For\n * optional parameters they may not be available until permission is granted by the user. The cameras, microphones,\n * speakers, and deviceAccess states will be empty until the corresponding\n * {@link @azure/communication-calling#DeviceManager}'s getCameras, getMicrophones, getSpeakers, and askDevicePermission\n * APIs are called and completed.\n *\n * @public\n */\nexport type DeviceManagerState = {\n /**\n * Proxy of {@link @azure/communication-calling#DeviceManager.isSpeakerSelectionAvailable}.\n */\n isSpeakerSelectionAvailable: boolean;\n /**\n * Proxy of {@link @azure/communication-calling#DeviceManager.selectedMicrophone}.\n */\n selectedMicrophone?: AudioDeviceInfo;\n /**\n * Proxy of {@link @azure/communication-calling#DeviceManager.selectedSpeaker}.\n */\n selectedSpeaker?: AudioDeviceInfo;\n /**\n * Stores the selected camera device info. This is added by the stateful layer and does not exist in the Calling SDK.\n * It is meant as a convenience to the developer. It must be explicitly set before it has any value and does not\n * persist across instances of the {@link StatefulCallClient}. The developer controls entirely what this value holds\n * at any time.\n */\n selectedCamera?: VideoDeviceInfo;\n /**\n * Stores any cameras data returned from {@link @azure/communication-calling#DeviceManager.getCameras}.\n */\n cameras: VideoDeviceInfo[];\n /**\n * Stores any microphones data returned from {@link @azure/communication-calling#DeviceManager.getMicrophones}.\n */\n microphones: AudioDeviceInfo[];\n /**\n * Stores any speakers data returned from {@link @azure/communication-calling#DeviceManager.getSpeakers}.\n */\n speakers: AudioDeviceInfo[];\n /**\n * Stores deviceAccess data returned from {@link @azure/communication-calling#DeviceManager.askDevicePermission}.\n */\n deviceAccess?: DeviceAccess;\n /**\n * Stores created views that are not associated with any CallState (when {@link StatefulCallClient.createView} is\n * called with undefined callId, undefined participantId, and defined LocalVideoStream).\n *\n * The values in this array are generated internally when {@link StatefulCallClient.createView} is called and are\n * considered immutable.\n */\n unparentedViews: LocalVideoStreamState[];\n};\n\n/**\n * Container for all of the state data proxied by {@link StatefulCallClient}. The calls, callsEnded, incomingCalls, and\n * incomingCallsEnded states will be automatically provided if a callAgent has been created. The deviceManager will be\n * empty initially until populated see {@link DeviceManagerState}. The userId state is provided as a convenience for the\n * developer and is completely controled and set by the developer.\n *\n * @public\n */\nexport interface CallClientState {\n /**\n * Proxy of {@link @azure/communication-calling#CallAgent.calls} as an object with CallState {@link CallState} fields.\n * It is keyed by {@link @azure/communication-calling#Call.id}. Please note that\n * {@link @azure/communication-calling#Call.id} could change. You should not cache the id itself but the entire\n * {@link @azure/communication-calling#Call} and then use the id contained to look up data in this map.\n */\n calls: { [key: string]: CallState };\n /**\n * Calls that have ended are stored here so the callEndReason could be checked.\n * It is an object with {@link @azure/communication-calling#Call.id} keys and {@link CallState} values.\n *\n * Only {@link MAX_CALL_HISTORY_LENGTH} Calls are kept in the history. Oldest calls are evicted if required.\n */\n callsEnded: { [key: string]: CallState };\n /**\n * Proxy of {@link @azure/communication-calling#IncomingCall} as an object with {@link IncomingCall} fields.\n * It is keyed by {@link @azure/communication-calling#IncomingCall.id}.\n */\n incomingCalls: { [key: string]: IncomingCallState };\n /**\n * Incoming Calls that have ended are stored here so the callEndReason could be checked.\n * It is an as an object with {@link @azure/communication-calling#Call.id} keys and {@link IncomingCall} values.\n *\n * Only {@link MAX_CALL_HISTORY_LENGTH} Calls are kept in the history. Oldest calls are evicted if required.\n */\n incomingCallsEnded: { [key: string]: IncomingCallState };\n /**\n * Proxy of {@link @azure/communication-calling#DeviceManager}. Please review {@link DeviceManagerState}.\n */\n deviceManager: DeviceManagerState;\n /**\n * Proxy of {@link @azure/communication-calling#CallAgent}. Please review {@link CallAgentState}.\n */\n callAgent?: CallAgentState;\n /**\n * Stores a userId. This is not used by the {@link StatefulCallClient} and is provided here as a convenience for the\n * developer for easier access to userId. Must be passed in at initialization of the {@link StatefulCallClient}.\n * Completely controlled by the developer.\n */\n userId: CommunicationIdentifierKind;\n /**\n * Stores the latest error for each API method.\n *\n * See documentation of {@Link CallErrors} for details.\n */\n latestErrors: CallErrors;\n /* @conditional-compile-remove(PSTN-calls) */\n /**\n * A phone number in E.164 format that will be used to represent callers identity.\n * For example, using the alternateCallerId to add a participant using PSTN, this number will\n * be used as the caller id in the PSTN call.\n */\n alternateCallerId?: string;\n /* @conditional-compile-remove(unsupported-browser) */\n /**\n * state to track the environment that the stateful client was made in is supported\n */\n environmentInfo?: EnvironmentInfo;\n}\n\n/**\n * Errors teed from API calls to the Calling SDK.\n *\n * Each property in the object stores the latest error for a particular SDK API method.\n *\n * Errors from this object can be cleared using the {@link newClearCallErrorsModifier}.\n * Additionally, errors are automatically cleared when:\n * - The state is cleared.\n * - Subsequent calls to related API methods succeed.\n * See documentation of individual stateful client methods for details on when errors may be automatically cleared.\n *\n * @public\n */\nexport type CallErrors = {\n [target in CallErrorTarget]: CallError;\n};\n\n/**\n * Error thrown from failed stateful API methods.\n *\n * @public\n */\nexport class CallError extends Error {\n /**\n * The API method target that failed.\n */\n public target: CallErrorTarget;\n /**\n * Error thrown by the failed SDK method.\n */\n public innerError: Error;\n /**\n * Timestamp added to the error by the stateful layer.\n */\n public timestamp: Date;\n\n constructor(target: CallErrorTarget, innerError: Error, timestamp?: Date) {\n super();\n this.target = target;\n this.innerError = innerError;\n // Testing note: It is easier to mock Date::now() than the Date() constructor.\n this.timestamp = timestamp ?? new Date(Date.now());\n this.name = 'CallError';\n this.message = `${this.target}: ${this.innerError.message}`;\n }\n}\n\n/**\n * String literal type for all permissible keys in {@Link CallErrors}.\n *\n * @public\n */\nexport type CallErrorTarget =\n | 'Call.addParticipant'\n | /* @conditional-compile-remove(calling-beta-sdk) */ 'Call.dispose'\n | 'Call.feature'\n | 'Call.hangUp'\n | 'Call.hold'\n | 'Call.mute'\n | /* @conditional-compile-remove(calling-beta-sdk) */ 'Call.muteIncomingAudio'\n | 'Call.off'\n | 'Call.on'\n | 'Call.removeParticipant'\n | 'Call.resume'\n | 'Call.sendDtmf'\n | /* @conditional-compile-remove(calling-beta-sdk) */ 'Call.startAudio'\n | 'Call.startScreenSharing'\n | 'Call.startVideo'\n | 'Call.stopScreenSharing'\n | /* @conditional-compile-remove(calling-beta-sdk) */ 'Call.stopAudio'\n | 'Call.stopVideo'\n | 'Call.unmute'\n | /* @conditional-compile-remove(calling-beta-sdk) */ 'Call.unmuteIncomingAudio'\n | 'CallAgent.dispose'\n | 'CallAgent.feature'\n | 'CallAgent.join'\n | 'CallAgent.off'\n | 'CallAgent.on'\n | 'CallAgent.startCall'\n | 'CallClient.createCallAgent'\n | /* @conditional-compile-remove(calling-beta-sdk) */ /* @conditional-compile-remove(teams-identity-support) */ 'CallClient.createTeamsCallAgent'\n | 'CallClient.feature'\n | 'CallClient.getDeviceManager'\n | /* @conditional-compile-remove(calling-beta-sdk) */ 'CallClient.getEnvironmentInfo'\n | 'DeviceManager.askDevicePermission'\n | 'DeviceManager.getCameras'\n | 'DeviceManager.getMicrophones'\n | 'DeviceManager.getSpeakers'\n | 'DeviceManager.off'\n | 'DeviceManager.on'\n | 'DeviceManager.selectMicrophone'\n | 'DeviceManager.selectSpeaker'\n | 'IncomingCall.accept'\n | 'IncomingCall.reject'\n | /* @conditional-compile-remove(calling-beta-sdk) */ /* @conditional-compile-remove(teams-identity-support) */ 'TeamsCall.addParticipant';\n\n/**\n * State only proxy for {@link @azure/communication-calling#DiagnosticsCallFeature}.\n *\n * @public\n */\nexport interface DiagnosticsCallFeatureState {\n /**\n * Stores diagnostics related to network conditions.\n */\n network: NetworkDiagnosticsState;\n\n /**\n * Stores diagnostics related to media quality.\n */\n media: MediaDiagnosticsState;\n}\n\n/**\n * State only proxy for {@link @azure/communication-calling#NetworkDiagnostics}.\n *\n * @public\n */\nexport interface NetworkDiagnosticsState {\n latest: LatestNetworkDiagnostics;\n}\n\n/**\n * State only proxy for {@link @azure/communication-calling#MediaDiagnostics}.\n *\n * @public\n */\nexport interface MediaDiagnosticsState {\n latest: LatestMediaDiagnostics;\n}\n"]}
@@ -36,6 +36,7 @@ export declare class CallContext {
36
36
  setCallLocalVideoStream(callId: string, streams: LocalVideoStreamState[]): void;
37
37
  setCallIsMicrophoneMuted(callId: string, isMicrophoneMuted: boolean): void;
38
38
  setRole(callId: string, role: ParticipantRole): void;
39
+ setTotalParticipantCount(callId: string, totalParticipantCount: number): void;
39
40
  setCallDominantSpeakers(callId: string, dominantSpeakers: DominantSpeakersInfo): void;
40
41
  setCallRecordingActive(callId: string, isRecordingActive: boolean): void;
41
42
  setCallTranscriptionActive(callId: string, isTranscriptionActive: boolean): void;
@@ -108,6 +108,8 @@ export class CallContext {
108
108
  existingCall.recording.isRecordingActive = call.recording.isRecordingActive;
109
109
  /* @conditional-compile-remove(rooms) */
110
110
  existingCall.role = call.role;
111
+ /* @conditional-compile-remove(total-participant-count) */
112
+ existingCall.totalParticipantCount = call.totalParticipantCount;
111
113
  // We don't update the startTime and endTime if we are updating an existing active call
112
114
  }
113
115
  else {
@@ -221,6 +223,15 @@ export class CallContext {
221
223
  }
222
224
  });
223
225
  }
226
+ /* @conditional-compile-remove(total-participant-count) */
227
+ setTotalParticipantCount(callId, totalParticipantCount) {
228
+ this.modifyState((draft) => {
229
+ const call = draft.calls[this._callIdHistory.latestCallId(callId)];
230
+ if (call) {
231
+ call.totalParticipantCount = totalParticipantCount;
232
+ }
233
+ });
234
+ }
224
235
  setCallDominantSpeakers(callId, dominantSpeakers) {
225
236
  this.modifyState((draft) => {
226
237
  const call = draft.calls[this._callIdHistory.latestCallId(callId)];
@@ -1 +1 @@
1
- {"version":3,"file":"CallContext.js","sourceRoot":"","sources":["../../../../../calling-stateful-client/src/CallContext.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\nimport { CommunicationIdentifierKind } from '@azure/communication-common';\nimport {\n AudioDeviceInfo,\n DeviceAccess,\n DominantSpeakersInfo,\n ScalingMode,\n VideoDeviceInfo\n} from '@azure/communication-calling';\n/* @conditional-compile-remove(unsupported-browser) */\nimport { EnvironmentInfo } from '@azure/communication-calling';\n/* @conditional-compile-remove(rooms) */\nimport { ParticipantRole } from '@azure/communication-calling';\nimport { AzureLogger, createClientLogger, getLogLevel } from '@azure/logger';\nimport EventEmitter from 'events';\nimport { enableMapSet, enablePatches, Patch, produce } from 'immer';\nimport {\n CallEndReason,\n CallState as CallStatus,\n RemoteParticipantState as RemoteParticipantStatus\n} from '@azure/communication-calling';\nimport { _safeJSONStringify, toFlatCommunicationIdentifier } from '@internal/acs-ui-common';\nimport {\n CallState,\n CallClientState,\n LocalVideoStreamState,\n RemoteParticipantState,\n RemoteVideoStreamState,\n IncomingCallState,\n VideoStreamRendererViewState,\n CallAgentState,\n CallErrors,\n CallErrorTarget,\n CallError\n} from './CallClientState';\nimport { callingStatefulLogger } from './Logger';\nimport { CallIdHistory } from './CallIdHistory';\n\nenableMapSet();\n// Needed to generate state diff for verbose logging.\nenablePatches();\n\n// TODO: How can we make this configurable?\n/**\n * @private\n */\nexport const MAX_CALL_HISTORY_LENGTH = 10;\n\n/**\n * @private\n */\nexport class CallContext {\n private _logger: AzureLogger;\n private _state: CallClientState;\n private _emitter: EventEmitter;\n private _atomicId: number;\n private _callIdHistory: CallIdHistory = new CallIdHistory();\n\n constructor(\n userId: CommunicationIdentifierKind,\n maxListeners = 50,\n /* @conditional-compile-remove(PSTN-calls) */ alternateCallerId?: string\n ) {\n this._logger = createClientLogger('communication-react:calling-context');\n this._state = {\n calls: {},\n callsEnded: {},\n incomingCalls: {},\n incomingCallsEnded: {},\n deviceManager: {\n isSpeakerSelectionAvailable: false,\n cameras: [],\n microphones: [],\n speakers: [],\n unparentedViews: []\n },\n callAgent: undefined,\n userId: userId,\n /* @conditional-compile-remove(unsupported-browser) */ environmentInfo: undefined,\n /* @conditional-compile-remove(PSTN-calls) */ alternateCallerId: alternateCallerId,\n latestErrors: {} as CallErrors\n };\n this._emitter = new EventEmitter();\n this._emitter.setMaxListeners(maxListeners);\n this._atomicId = 0;\n }\n\n public getState(): CallClientState {\n return this._state;\n }\n\n public modifyState(modifier: (draft: CallClientState) => void): void {\n const priorState = this._state;\n this._state = produce(this._state, modifier, (patches: Patch[]) => {\n if (getLogLevel() === 'verbose') {\n // Log to `info` because AzureLogger.verbose() doesn't show up in console.\n this._logger.info(`State change: ${_safeJSONStringify(patches)}`);\n }\n });\n if (this._state !== priorState) {\n this._emitter.emit('stateChanged', this._state);\n }\n }\n\n public onStateChange(handler: (state: CallClientState) => void): void {\n this._emitter.on('stateChanged', handler);\n }\n\n public offStateChange(handler: (state: CallClientState) => void): void {\n this._emitter.off('stateChanged', handler);\n }\n\n // Disposing of the CallAgentDeclarative will not clear the state. If we create a new CallAgentDeclarative, we should\n // make sure the state is clean because any left over state (if previous CallAgentDeclarative was disposed) may be\n // invalid.\n public clearCallRelatedState(): void {\n this.modifyState((draft: CallClientState) => {\n draft.calls = {};\n draft.incomingCalls = {};\n draft.callsEnded = {};\n draft.incomingCallsEnded = {};\n });\n }\n\n public setCallAgent(callAgent: CallAgentState): void {\n this.modifyState((draft: CallClientState) => {\n draft.callAgent = callAgent;\n });\n }\n\n public setCall(call: CallState): void {\n this.modifyState((draft: CallClientState) => {\n const latestCallId = this._callIdHistory.latestCallId(call.id);\n const existingCall = draft.calls[latestCallId];\n if (existingCall) {\n existingCall.callerInfo = call.callerInfo;\n existingCall.state = call.state;\n existingCall.callEndReason = call.callEndReason;\n existingCall.direction = call.direction;\n existingCall.isMuted = call.isMuted;\n existingCall.isScreenSharingOn = call.isScreenSharingOn;\n existingCall.localVideoStreams = call.localVideoStreams;\n existingCall.remoteParticipants = call.remoteParticipants;\n existingCall.transcription.isTranscriptionActive = call.transcription.isTranscriptionActive;\n existingCall.recording.isRecordingActive = call.recording.isRecordingActive;\n /* @conditional-compile-remove(rooms) */\n existingCall.role = call.role;\n // We don't update the startTime and endTime if we are updating an existing active call\n } else {\n draft.calls[latestCallId] = call;\n }\n });\n }\n\n public removeCall(callId: string): void {\n this.modifyState((draft: CallClientState) => {\n delete draft.calls[this._callIdHistory.latestCallId(callId)];\n });\n }\n\n public setCallEnded(callId: string, callEndReason: CallEndReason | undefined): void {\n const latestCallId = this._callIdHistory.latestCallId(callId);\n this.modifyState((draft: CallClientState) => {\n const call = draft.calls[latestCallId];\n if (call) {\n call.endTime = new Date();\n call.callEndReason = callEndReason;\n delete draft.calls[latestCallId];\n // Performance note: This loop should run only once because the number of entries\n // is never allowed to exceed MAX_CALL_HISTORY_LENGTH. A loop is used for correctness.\n while (Object.keys(draft.callsEnded).length >= MAX_CALL_HISTORY_LENGTH) {\n delete draft.callsEnded[findOldestCallEnded(draft.callsEnded)];\n }\n draft.callsEnded[latestCallId] = call;\n }\n });\n }\n\n public setCallState(callId: string, state: CallStatus): void {\n this.modifyState((draft: CallClientState) => {\n const call = draft.calls[this._callIdHistory.latestCallId(callId)];\n if (call) {\n call.state = state;\n }\n });\n }\n\n public setCallId(newCallId: string, oldCallId: string): void {\n this._callIdHistory.updateCallIdHistory(newCallId, oldCallId);\n this.modifyState((draft: CallClientState) => {\n const call = draft.calls[oldCallId];\n if (call) {\n call.id = newCallId;\n delete draft.calls[oldCallId];\n draft.calls[newCallId] = call;\n }\n });\n }\n\n /* @conditional-compile-remove(unsupported-browser) */\n public setEnvironmentInfo(envInfo: EnvironmentInfo): void {\n this.modifyState((draft: CallClientState) => {\n draft.environmentInfo = envInfo;\n });\n }\n\n public setCallIsScreenSharingOn(callId: string, isScreenSharingOn: boolean): void {\n this.modifyState((draft: CallClientState) => {\n const call = draft.calls[this._callIdHistory.latestCallId(callId)];\n if (call) {\n call.isScreenSharingOn = isScreenSharingOn;\n }\n });\n }\n\n public setCallRemoteParticipants(\n callId: string,\n addRemoteParticipant: RemoteParticipantState[],\n removeRemoteParticipant: string[]\n ): void {\n this.modifyState((draft: CallClientState) => {\n const call = draft.calls[this._callIdHistory.latestCallId(callId)];\n if (call) {\n removeRemoteParticipant.forEach((id: string) => {\n delete call.remoteParticipants[id];\n });\n addRemoteParticipant.forEach((participant: RemoteParticipantState) => {\n call.remoteParticipants[toFlatCommunicationIdentifier(participant.identifier)] = participant;\n });\n }\n });\n }\n\n public setCallRemoteParticipantsEnded(\n callId: string,\n addRemoteParticipant: RemoteParticipantState[],\n removeRemoteParticipant: string[]\n ): void {\n this.modifyState((draft: CallClientState) => {\n const call = draft.calls[this._callIdHistory.latestCallId(callId)];\n if (call) {\n removeRemoteParticipant.forEach((id: string) => {\n delete call.remoteParticipantsEnded[id];\n });\n addRemoteParticipant.forEach((participant: RemoteParticipantState) => {\n call.remoteParticipantsEnded[toFlatCommunicationIdentifier(participant.identifier)] = participant;\n });\n }\n });\n }\n\n public setCallLocalVideoStream(callId: string, streams: LocalVideoStreamState[]): void {\n this.modifyState((draft: CallClientState) => {\n const call = draft.calls[this._callIdHistory.latestCallId(callId)];\n if (call) {\n call.localVideoStreams = streams;\n }\n });\n }\n\n public setCallIsMicrophoneMuted(callId: string, isMicrophoneMuted: boolean): void {\n this.modifyState((draft: CallClientState) => {\n const call = draft.calls[this._callIdHistory.latestCallId(callId)];\n if (call) {\n call.isMuted = isMicrophoneMuted;\n }\n });\n }\n\n /* @conditional-compile-remove(rooms) */\n public setRole(callId: string, role: ParticipantRole): void {\n this.modifyState((draft: CallClientState) => {\n const call = draft.calls[this._callIdHistory.latestCallId(callId)];\n if (call) {\n call.role = role;\n }\n });\n }\n\n public setCallDominantSpeakers(callId: string, dominantSpeakers: DominantSpeakersInfo): void {\n this.modifyState((draft: CallClientState) => {\n const call = draft.calls[this._callIdHistory.latestCallId(callId)];\n if (call) {\n call.dominantSpeakers = dominantSpeakers;\n }\n });\n }\n\n public setCallRecordingActive(callId: string, isRecordingActive: boolean): void {\n this.modifyState((draft: CallClientState) => {\n const call = draft.calls[this._callIdHistory.latestCallId(callId)];\n if (call) {\n call.recording.isRecordingActive = isRecordingActive;\n }\n });\n }\n\n public setCallTranscriptionActive(callId: string, isTranscriptionActive: boolean): void {\n this.modifyState((draft: CallClientState) => {\n const call = draft.calls[this._callIdHistory.latestCallId(callId)];\n if (call) {\n call.transcription.isTranscriptionActive = isTranscriptionActive;\n }\n });\n }\n\n public setCallScreenShareParticipant(callId: string, participantKey: string | undefined): void {\n this.modifyState((draft: CallClientState) => {\n const call = draft.calls[this._callIdHistory.latestCallId(callId)];\n if (call) {\n call.screenShareRemoteParticipant = participantKey;\n }\n });\n }\n\n public setLocalVideoStreamRendererView(callId: string, view: VideoStreamRendererViewState | undefined): void {\n this.modifyState((draft: CallClientState) => {\n const call = draft.calls[this._callIdHistory.latestCallId(callId)];\n if (call) {\n if (call.localVideoStreams.length > 0) {\n call.localVideoStreams[0].view = view;\n }\n }\n });\n }\n\n public setParticipantState(callId: string, participantKey: string, state: RemoteParticipantStatus): void {\n this.modifyState((draft: CallClientState) => {\n const call = draft.calls[this._callIdHistory.latestCallId(callId)];\n if (call) {\n const participant = call.remoteParticipants[participantKey];\n if (participant) {\n participant.state = state;\n }\n }\n });\n }\n\n public setParticipantIsMuted(callId: string, participantKey: string, muted: boolean): void {\n this.modifyState((draft: CallClientState) => {\n const call = draft.calls[this._callIdHistory.latestCallId(callId)];\n if (call) {\n const participant = call.remoteParticipants[participantKey];\n if (participant) {\n participant.isMuted = muted;\n }\n }\n });\n }\n\n /* @conditional-compile-remove(rooms) */\n public setParticipantRole(callId: string, participantKey: string, role: ParticipantRole): void {\n this.modifyState((draft: CallClientState) => {\n const call = draft.calls[this._callIdHistory.latestCallId(callId)];\n if (call) {\n const participant = call.remoteParticipants[participantKey];\n if (participant) {\n participant.role = role;\n }\n }\n });\n }\n\n public setParticipantDisplayName(callId: string, participantKey: string, displayName: string): void {\n this.modifyState((draft: CallClientState) => {\n const call = draft.calls[this._callIdHistory.latestCallId(callId)];\n if (call) {\n const participant = call.remoteParticipants[participantKey];\n if (participant) {\n participant.displayName = displayName;\n }\n }\n });\n }\n\n public setParticipantIsSpeaking(callId: string, participantKey: string, isSpeaking: boolean): void {\n this.modifyState((draft: CallClientState) => {\n const call = draft.calls[this._callIdHistory.latestCallId(callId)];\n if (call) {\n const participant = call.remoteParticipants[participantKey];\n if (participant) {\n participant.isSpeaking = isSpeaking;\n }\n }\n });\n }\n\n public setParticipantVideoStream(callId: string, participantKey: string, stream: RemoteVideoStreamState): void {\n this.modifyState((draft: CallClientState) => {\n const call = draft.calls[this._callIdHistory.latestCallId(callId)];\n if (call) {\n const participant = call.remoteParticipants[participantKey];\n if (participant) {\n // Set is called by subscriber will not modify any rendered stream so if there is existing stream only\n // modify the values that subscriber has access to.\n const existingStream = participant.videoStreams[stream.id];\n if (existingStream) {\n existingStream.isAvailable = stream.isAvailable;\n /* @conditional-compile-remove(video-stream-is-receiving-flag) */\n existingStream.isReceiving = stream.isReceiving;\n existingStream.mediaStreamType = stream.mediaStreamType;\n } else {\n participant.videoStreams[stream.id] = stream;\n }\n }\n }\n });\n }\n\n public setRemoteVideoStreamIsAvailable(\n callId: string,\n participantKey: string,\n streamId: number,\n isAvailable: boolean\n ): void {\n this.modifyState((draft: CallClientState) => {\n const call = draft.calls[this._callIdHistory.latestCallId(callId)];\n if (call) {\n const participant = call.remoteParticipants[participantKey];\n if (participant) {\n const stream = participant.videoStreams[streamId];\n if (stream) {\n stream.isAvailable = isAvailable;\n }\n }\n }\n });\n }\n\n /* @conditional-compile-remove(video-stream-is-receiving-flag) */\n public setRemoteVideoStreamIsReceiving(\n callId: string,\n participantKey: string,\n streamId: number,\n isReceiving: boolean\n ): void {\n this.modifyState((draft: CallClientState) => {\n const call = draft.calls[this._callIdHistory.latestCallId(callId)];\n if (call) {\n const participant = call.remoteParticipants[participantKey];\n if (participant) {\n const stream = participant.videoStreams[streamId];\n if (stream) {\n stream.isReceiving = isReceiving;\n }\n }\n }\n });\n }\n\n public setRemoteVideoStreams(\n callId: string,\n participantKey: string,\n addRemoteVideoStream: RemoteVideoStreamState[],\n removeRemoteVideoStream: number[]\n ): void {\n this.modifyState((draft: CallClientState) => {\n const call = draft.calls[this._callIdHistory.latestCallId(callId)];\n if (call) {\n const participant = call.remoteParticipants[participantKey];\n if (participant) {\n for (const id of removeRemoteVideoStream) {\n delete participant.videoStreams[id];\n }\n\n for (const newStream of addRemoteVideoStream) {\n // This should only be called by the subscriber and some properties are add by other components so if the\n // stream already exists, only update the values that subscriber knows about.\n const stream = participant.videoStreams[newStream.id];\n if (stream) {\n stream.mediaStreamType = newStream.mediaStreamType;\n stream.isAvailable = newStream.isAvailable;\n /* @conditional-compile-remove(video-stream-is-receiving-flag) */\n stream.isReceiving = newStream.isReceiving;\n } else {\n participant.videoStreams[newStream.id] = newStream;\n }\n }\n }\n }\n });\n }\n\n public setRemoteVideoStreamRendererView(\n callId: string,\n participantKey: string,\n streamId: number,\n view: VideoStreamRendererViewState | undefined\n ): void {\n this.modifyState((draft: CallClientState) => {\n const call = draft.calls[this._callIdHistory.latestCallId(callId)];\n if (call) {\n const participant = call.remoteParticipants[participantKey];\n if (participant) {\n const stream = participant.videoStreams[streamId];\n if (stream) {\n stream.view = view;\n }\n }\n }\n });\n }\n\n public setRemoteVideoStreamViewScalingMode(\n callId: string,\n participantKey: string,\n streamId: number,\n scalingMode: ScalingMode\n ): void {\n this.modifyState((draft: CallClientState) => {\n const call = draft.calls[this._callIdHistory.latestCallId(callId)];\n if (call) {\n const participant = call.remoteParticipants[participantKey];\n if (participant) {\n const stream = participant.videoStreams[streamId];\n if (stream && stream.view) {\n stream.view.scalingMode = scalingMode;\n }\n }\n }\n });\n }\n\n public setIncomingCall(call: IncomingCallState): void {\n this.modifyState((draft: CallClientState) => {\n const existingCall = draft.incomingCalls[call.id];\n if (existingCall) {\n existingCall.callerInfo = call.callerInfo;\n } else {\n draft.incomingCalls[call.id] = call;\n }\n });\n }\n\n public removeIncomingCall(callId: string): void {\n this.modifyState((draft: CallClientState) => {\n delete draft.incomingCalls[callId];\n });\n }\n\n public setIncomingCallEnded(callId: string, callEndReason: CallEndReason | undefined): void {\n this.modifyState((draft: CallClientState) => {\n const call = draft.incomingCalls[callId];\n if (call) {\n call.endTime = new Date();\n call.callEndReason = callEndReason;\n delete draft.incomingCalls[callId];\n // Performance note: This loop should run only once because the number of entries\n // is never allowed to exceed MAX_CALL_HISTORY_LENGTH. A loop is used for correctness.\n while (Object.keys(draft.incomingCallsEnded).length >= MAX_CALL_HISTORY_LENGTH) {\n delete draft.incomingCallsEnded[findOldestCallEnded(draft.incomingCallsEnded)];\n }\n draft.incomingCallsEnded[callId] = call;\n }\n });\n }\n\n public setDeviceManagerIsSpeakerSelectionAvailable(isSpeakerSelectionAvailable: boolean): void {\n this.modifyState((draft: CallClientState) => {\n draft.deviceManager.isSpeakerSelectionAvailable = isSpeakerSelectionAvailable;\n });\n }\n\n public setDeviceManagerSelectedMicrophone(selectedMicrophone?: AudioDeviceInfo): void {\n this.modifyState((draft: CallClientState) => {\n draft.deviceManager.selectedMicrophone = selectedMicrophone;\n });\n }\n\n public setDeviceManagerSelectedSpeaker(selectedSpeaker?: AudioDeviceInfo): void {\n this.modifyState((draft: CallClientState) => {\n draft.deviceManager.selectedSpeaker = selectedSpeaker;\n });\n }\n\n public setDeviceManagerSelectedCamera(selectedCamera?: VideoDeviceInfo): void {\n this.modifyState((draft: CallClientState) => {\n draft.deviceManager.selectedCamera = selectedCamera;\n });\n }\n\n public setDeviceManagerCameras(cameras: VideoDeviceInfo[]): void {\n this.modifyState((draft: CallClientState) => {\n /**\n * SDK initializes cameras with one dummy camera with value { id: 'camera:id', name: '', deviceType: 'USBCamera' } immediately after\n * camera permissions are granted. So selectedCamera will have this value before the actual cameras are obtained. Therefore we should reset\n * selectedCamera to the first camera when there are cameras AND when current selectedCamera does not exist in the new array of cameras *\n */\n if (cameras.length > 0 && !cameras.some((camera) => camera.id === draft.deviceManager.selectedCamera?.id)) {\n draft.deviceManager.selectedCamera = cameras[0];\n }\n draft.deviceManager.cameras = cameras;\n });\n }\n\n public setDeviceManagerMicrophones(microphones: AudioDeviceInfo[]): void {\n this.modifyState((draft: CallClientState) => {\n draft.deviceManager.microphones = microphones;\n });\n }\n\n public setDeviceManagerSpeakers(speakers: AudioDeviceInfo[]): void {\n this.modifyState((draft: CallClientState) => {\n draft.deviceManager.speakers = speakers;\n });\n }\n\n public setDeviceManagerDeviceAccess(deviceAccess: DeviceAccess): void {\n this.modifyState((draft: CallClientState) => {\n draft.deviceManager.deviceAccess = deviceAccess;\n });\n }\n\n public setDeviceManagerUnparentedView(\n localVideoStream: LocalVideoStreamState,\n view: VideoStreamRendererViewState | undefined\n ): void {\n this.modifyState((draft: CallClientState) => {\n draft.deviceManager.unparentedViews.push({\n source: localVideoStream.source,\n mediaStreamType: localVideoStream.mediaStreamType,\n view: view\n });\n });\n }\n\n public deleteDeviceManagerUnparentedView(localVideoStream: LocalVideoStreamState): void {\n this.modifyState((draft: CallClientState) => {\n const foundIndex = draft.deviceManager.unparentedViews.findIndex(\n (stream) =>\n stream.source.id === localVideoStream.source.id && stream.mediaStreamType === localVideoStream.mediaStreamType\n );\n if (foundIndex !== -1) {\n draft.deviceManager.unparentedViews.splice(foundIndex, 1);\n }\n });\n }\n\n public getAndIncrementAtomicId(): number {\n const id = this._atomicId;\n this._atomicId++;\n return id;\n }\n\n /**\n * Tees any errors encountered in an async function to the state.\n *\n * @param action Async function to execute.\n * @param target The error target to tee error to.\n * @returns Result of calling `f`. Also re-raises any exceptions thrown from `f`.\n * @throws CallError. Exceptions thrown from `f` are tagged with the failed `target.\n */\n public withAsyncErrorTeedToState<Args extends unknown[], R>(\n action: (...args: Args) => Promise<R>,\n target: CallErrorTarget\n ): (...args: Args) => Promise<R> {\n return async (...args: Args): Promise<R> => {\n try {\n return await action(...args);\n } catch (error) {\n const callError = toCallError(target, error);\n this.setLatestError(target, callError);\n throw callError;\n }\n };\n }\n\n /**\n * Tees any errors encountered in an function to the state.\n *\n * @param action Function to execute.\n * @param target The error target to tee error to.\n * @returns Result of calling `f`. Also re-raises any exceptions thrown from `f`.\n * @throws CallError. Exceptions thrown from `f` are tagged with the failed `target.\n */\n public withErrorTeedToState<Args extends unknown[], R>(\n action: (...args: Args) => R,\n target: CallErrorTarget\n ): (...args: Args) => R {\n return (...args: Args): R => {\n try {\n callingStatefulLogger.info(`Calling stateful client target function called: ${target}`);\n return action(...args);\n } catch (error) {\n const callError = toCallError(target, error);\n this.setLatestError(target, callError);\n throw callError;\n }\n };\n }\n\n private setLatestError(target: CallErrorTarget, error: CallError): void {\n this.modifyState((draft: CallClientState) => {\n draft.latestErrors[target] = error;\n });\n }\n}\n\nconst toCallError = (target: CallErrorTarget, error: unknown): CallError => {\n if (error instanceof Error) {\n return new CallError(target, error);\n }\n return new CallError(target, new Error(error as string));\n};\n\nconst findOldestCallEnded = (calls: { [key: string]: { endTime?: Date } }): string => {\n const callEntries = Object.entries(calls);\n let [oldestCallId, oldestCall] = callEntries[0];\n if (oldestCall.endTime === undefined) {\n return oldestCallId;\n }\n for (const [callId, call] of callEntries.slice(1)) {\n if (call.endTime === undefined) {\n return callId;\n }\n if ((call.endTime?.getTime() ?? 0) < (oldestCall.endTime?.getTime() ?? 0)) {\n [oldestCallId, oldestCall] = [callId, call];\n }\n }\n return oldestCallId;\n};\n\"../../acs-ui-common/src\""]}
1
+ {"version":3,"file":"CallContext.js","sourceRoot":"","sources":["../../../../../calling-stateful-client/src/CallContext.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\nimport { CommunicationIdentifierKind } from '@azure/communication-common';\nimport {\n AudioDeviceInfo,\n DeviceAccess,\n DominantSpeakersInfo,\n ScalingMode,\n VideoDeviceInfo\n} from '@azure/communication-calling';\n/* @conditional-compile-remove(unsupported-browser) */\nimport { EnvironmentInfo } from '@azure/communication-calling';\n/* @conditional-compile-remove(rooms) */\nimport { ParticipantRole } from '@azure/communication-calling';\nimport { AzureLogger, createClientLogger, getLogLevel } from '@azure/logger';\nimport EventEmitter from 'events';\nimport { enableMapSet, enablePatches, Patch, produce } from 'immer';\nimport {\n CallEndReason,\n CallState as CallStatus,\n RemoteParticipantState as RemoteParticipantStatus\n} from '@azure/communication-calling';\nimport { _safeJSONStringify, toFlatCommunicationIdentifier } from '@internal/acs-ui-common';\nimport {\n CallState,\n CallClientState,\n LocalVideoStreamState,\n RemoteParticipantState,\n RemoteVideoStreamState,\n IncomingCallState,\n VideoStreamRendererViewState,\n CallAgentState,\n CallErrors,\n CallErrorTarget,\n CallError\n} from './CallClientState';\nimport { callingStatefulLogger } from './Logger';\nimport { CallIdHistory } from './CallIdHistory';\n\nenableMapSet();\n// Needed to generate state diff for verbose logging.\nenablePatches();\n\n// TODO: How can we make this configurable?\n/**\n * @private\n */\nexport const MAX_CALL_HISTORY_LENGTH = 10;\n\n/**\n * @private\n */\nexport class CallContext {\n private _logger: AzureLogger;\n private _state: CallClientState;\n private _emitter: EventEmitter;\n private _atomicId: number;\n private _callIdHistory: CallIdHistory = new CallIdHistory();\n\n constructor(\n userId: CommunicationIdentifierKind,\n maxListeners = 50,\n /* @conditional-compile-remove(PSTN-calls) */ alternateCallerId?: string\n ) {\n this._logger = createClientLogger('communication-react:calling-context');\n this._state = {\n calls: {},\n callsEnded: {},\n incomingCalls: {},\n incomingCallsEnded: {},\n deviceManager: {\n isSpeakerSelectionAvailable: false,\n cameras: [],\n microphones: [],\n speakers: [],\n unparentedViews: []\n },\n callAgent: undefined,\n userId: userId,\n /* @conditional-compile-remove(unsupported-browser) */ environmentInfo: undefined,\n /* @conditional-compile-remove(PSTN-calls) */ alternateCallerId: alternateCallerId,\n latestErrors: {} as CallErrors\n };\n this._emitter = new EventEmitter();\n this._emitter.setMaxListeners(maxListeners);\n this._atomicId = 0;\n }\n\n public getState(): CallClientState {\n return this._state;\n }\n\n public modifyState(modifier: (draft: CallClientState) => void): void {\n const priorState = this._state;\n this._state = produce(this._state, modifier, (patches: Patch[]) => {\n if (getLogLevel() === 'verbose') {\n // Log to `info` because AzureLogger.verbose() doesn't show up in console.\n this._logger.info(`State change: ${_safeJSONStringify(patches)}`);\n }\n });\n if (this._state !== priorState) {\n this._emitter.emit('stateChanged', this._state);\n }\n }\n\n public onStateChange(handler: (state: CallClientState) => void): void {\n this._emitter.on('stateChanged', handler);\n }\n\n public offStateChange(handler: (state: CallClientState) => void): void {\n this._emitter.off('stateChanged', handler);\n }\n\n // Disposing of the CallAgentDeclarative will not clear the state. If we create a new CallAgentDeclarative, we should\n // make sure the state is clean because any left over state (if previous CallAgentDeclarative was disposed) may be\n // invalid.\n public clearCallRelatedState(): void {\n this.modifyState((draft: CallClientState) => {\n draft.calls = {};\n draft.incomingCalls = {};\n draft.callsEnded = {};\n draft.incomingCallsEnded = {};\n });\n }\n\n public setCallAgent(callAgent: CallAgentState): void {\n this.modifyState((draft: CallClientState) => {\n draft.callAgent = callAgent;\n });\n }\n\n public setCall(call: CallState): void {\n this.modifyState((draft: CallClientState) => {\n const latestCallId = this._callIdHistory.latestCallId(call.id);\n const existingCall = draft.calls[latestCallId];\n if (existingCall) {\n existingCall.callerInfo = call.callerInfo;\n existingCall.state = call.state;\n existingCall.callEndReason = call.callEndReason;\n existingCall.direction = call.direction;\n existingCall.isMuted = call.isMuted;\n existingCall.isScreenSharingOn = call.isScreenSharingOn;\n existingCall.localVideoStreams = call.localVideoStreams;\n existingCall.remoteParticipants = call.remoteParticipants;\n existingCall.transcription.isTranscriptionActive = call.transcription.isTranscriptionActive;\n existingCall.recording.isRecordingActive = call.recording.isRecordingActive;\n /* @conditional-compile-remove(rooms) */\n existingCall.role = call.role;\n /* @conditional-compile-remove(total-participant-count) */\n existingCall.totalParticipantCount = call.totalParticipantCount;\n // We don't update the startTime and endTime if we are updating an existing active call\n } else {\n draft.calls[latestCallId] = call;\n }\n });\n }\n\n public removeCall(callId: string): void {\n this.modifyState((draft: CallClientState) => {\n delete draft.calls[this._callIdHistory.latestCallId(callId)];\n });\n }\n\n public setCallEnded(callId: string, callEndReason: CallEndReason | undefined): void {\n const latestCallId = this._callIdHistory.latestCallId(callId);\n this.modifyState((draft: CallClientState) => {\n const call = draft.calls[latestCallId];\n if (call) {\n call.endTime = new Date();\n call.callEndReason = callEndReason;\n delete draft.calls[latestCallId];\n // Performance note: This loop should run only once because the number of entries\n // is never allowed to exceed MAX_CALL_HISTORY_LENGTH. A loop is used for correctness.\n while (Object.keys(draft.callsEnded).length >= MAX_CALL_HISTORY_LENGTH) {\n delete draft.callsEnded[findOldestCallEnded(draft.callsEnded)];\n }\n draft.callsEnded[latestCallId] = call;\n }\n });\n }\n\n public setCallState(callId: string, state: CallStatus): void {\n this.modifyState((draft: CallClientState) => {\n const call = draft.calls[this._callIdHistory.latestCallId(callId)];\n if (call) {\n call.state = state;\n }\n });\n }\n\n public setCallId(newCallId: string, oldCallId: string): void {\n this._callIdHistory.updateCallIdHistory(newCallId, oldCallId);\n this.modifyState((draft: CallClientState) => {\n const call = draft.calls[oldCallId];\n if (call) {\n call.id = newCallId;\n delete draft.calls[oldCallId];\n draft.calls[newCallId] = call;\n }\n });\n }\n\n /* @conditional-compile-remove(unsupported-browser) */\n public setEnvironmentInfo(envInfo: EnvironmentInfo): void {\n this.modifyState((draft: CallClientState) => {\n draft.environmentInfo = envInfo;\n });\n }\n\n public setCallIsScreenSharingOn(callId: string, isScreenSharingOn: boolean): void {\n this.modifyState((draft: CallClientState) => {\n const call = draft.calls[this._callIdHistory.latestCallId(callId)];\n if (call) {\n call.isScreenSharingOn = isScreenSharingOn;\n }\n });\n }\n\n public setCallRemoteParticipants(\n callId: string,\n addRemoteParticipant: RemoteParticipantState[],\n removeRemoteParticipant: string[]\n ): void {\n this.modifyState((draft: CallClientState) => {\n const call = draft.calls[this._callIdHistory.latestCallId(callId)];\n if (call) {\n removeRemoteParticipant.forEach((id: string) => {\n delete call.remoteParticipants[id];\n });\n addRemoteParticipant.forEach((participant: RemoteParticipantState) => {\n call.remoteParticipants[toFlatCommunicationIdentifier(participant.identifier)] = participant;\n });\n }\n });\n }\n\n public setCallRemoteParticipantsEnded(\n callId: string,\n addRemoteParticipant: RemoteParticipantState[],\n removeRemoteParticipant: string[]\n ): void {\n this.modifyState((draft: CallClientState) => {\n const call = draft.calls[this._callIdHistory.latestCallId(callId)];\n if (call) {\n removeRemoteParticipant.forEach((id: string) => {\n delete call.remoteParticipantsEnded[id];\n });\n addRemoteParticipant.forEach((participant: RemoteParticipantState) => {\n call.remoteParticipantsEnded[toFlatCommunicationIdentifier(participant.identifier)] = participant;\n });\n }\n });\n }\n\n public setCallLocalVideoStream(callId: string, streams: LocalVideoStreamState[]): void {\n this.modifyState((draft: CallClientState) => {\n const call = draft.calls[this._callIdHistory.latestCallId(callId)];\n if (call) {\n call.localVideoStreams = streams;\n }\n });\n }\n\n public setCallIsMicrophoneMuted(callId: string, isMicrophoneMuted: boolean): void {\n this.modifyState((draft: CallClientState) => {\n const call = draft.calls[this._callIdHistory.latestCallId(callId)];\n if (call) {\n call.isMuted = isMicrophoneMuted;\n }\n });\n }\n\n /* @conditional-compile-remove(rooms) */\n public setRole(callId: string, role: ParticipantRole): void {\n this.modifyState((draft: CallClientState) => {\n const call = draft.calls[this._callIdHistory.latestCallId(callId)];\n if (call) {\n call.role = role;\n }\n });\n }\n\n /* @conditional-compile-remove(total-participant-count) */\n public setTotalParticipantCount(callId: string, totalParticipantCount: number): void {\n this.modifyState((draft: CallClientState) => {\n const call = draft.calls[this._callIdHistory.latestCallId(callId)];\n if (call) {\n call.totalParticipantCount = totalParticipantCount;\n }\n });\n }\n\n public setCallDominantSpeakers(callId: string, dominantSpeakers: DominantSpeakersInfo): void {\n this.modifyState((draft: CallClientState) => {\n const call = draft.calls[this._callIdHistory.latestCallId(callId)];\n if (call) {\n call.dominantSpeakers = dominantSpeakers;\n }\n });\n }\n\n public setCallRecordingActive(callId: string, isRecordingActive: boolean): void {\n this.modifyState((draft: CallClientState) => {\n const call = draft.calls[this._callIdHistory.latestCallId(callId)];\n if (call) {\n call.recording.isRecordingActive = isRecordingActive;\n }\n });\n }\n\n public setCallTranscriptionActive(callId: string, isTranscriptionActive: boolean): void {\n this.modifyState((draft: CallClientState) => {\n const call = draft.calls[this._callIdHistory.latestCallId(callId)];\n if (call) {\n call.transcription.isTranscriptionActive = isTranscriptionActive;\n }\n });\n }\n\n public setCallScreenShareParticipant(callId: string, participantKey: string | undefined): void {\n this.modifyState((draft: CallClientState) => {\n const call = draft.calls[this._callIdHistory.latestCallId(callId)];\n if (call) {\n call.screenShareRemoteParticipant = participantKey;\n }\n });\n }\n\n public setLocalVideoStreamRendererView(callId: string, view: VideoStreamRendererViewState | undefined): void {\n this.modifyState((draft: CallClientState) => {\n const call = draft.calls[this._callIdHistory.latestCallId(callId)];\n if (call) {\n if (call.localVideoStreams.length > 0) {\n call.localVideoStreams[0].view = view;\n }\n }\n });\n }\n\n public setParticipantState(callId: string, participantKey: string, state: RemoteParticipantStatus): void {\n this.modifyState((draft: CallClientState) => {\n const call = draft.calls[this._callIdHistory.latestCallId(callId)];\n if (call) {\n const participant = call.remoteParticipants[participantKey];\n if (participant) {\n participant.state = state;\n }\n }\n });\n }\n\n public setParticipantIsMuted(callId: string, participantKey: string, muted: boolean): void {\n this.modifyState((draft: CallClientState) => {\n const call = draft.calls[this._callIdHistory.latestCallId(callId)];\n if (call) {\n const participant = call.remoteParticipants[participantKey];\n if (participant) {\n participant.isMuted = muted;\n }\n }\n });\n }\n\n /* @conditional-compile-remove(rooms) */\n public setParticipantRole(callId: string, participantKey: string, role: ParticipantRole): void {\n this.modifyState((draft: CallClientState) => {\n const call = draft.calls[this._callIdHistory.latestCallId(callId)];\n if (call) {\n const participant = call.remoteParticipants[participantKey];\n if (participant) {\n participant.role = role;\n }\n }\n });\n }\n\n public setParticipantDisplayName(callId: string, participantKey: string, displayName: string): void {\n this.modifyState((draft: CallClientState) => {\n const call = draft.calls[this._callIdHistory.latestCallId(callId)];\n if (call) {\n const participant = call.remoteParticipants[participantKey];\n if (participant) {\n participant.displayName = displayName;\n }\n }\n });\n }\n\n public setParticipantIsSpeaking(callId: string, participantKey: string, isSpeaking: boolean): void {\n this.modifyState((draft: CallClientState) => {\n const call = draft.calls[this._callIdHistory.latestCallId(callId)];\n if (call) {\n const participant = call.remoteParticipants[participantKey];\n if (participant) {\n participant.isSpeaking = isSpeaking;\n }\n }\n });\n }\n\n public setParticipantVideoStream(callId: string, participantKey: string, stream: RemoteVideoStreamState): void {\n this.modifyState((draft: CallClientState) => {\n const call = draft.calls[this._callIdHistory.latestCallId(callId)];\n if (call) {\n const participant = call.remoteParticipants[participantKey];\n if (participant) {\n // Set is called by subscriber will not modify any rendered stream so if there is existing stream only\n // modify the values that subscriber has access to.\n const existingStream = participant.videoStreams[stream.id];\n if (existingStream) {\n existingStream.isAvailable = stream.isAvailable;\n /* @conditional-compile-remove(video-stream-is-receiving-flag) */\n existingStream.isReceiving = stream.isReceiving;\n existingStream.mediaStreamType = stream.mediaStreamType;\n } else {\n participant.videoStreams[stream.id] = stream;\n }\n }\n }\n });\n }\n\n public setRemoteVideoStreamIsAvailable(\n callId: string,\n participantKey: string,\n streamId: number,\n isAvailable: boolean\n ): void {\n this.modifyState((draft: CallClientState) => {\n const call = draft.calls[this._callIdHistory.latestCallId(callId)];\n if (call) {\n const participant = call.remoteParticipants[participantKey];\n if (participant) {\n const stream = participant.videoStreams[streamId];\n if (stream) {\n stream.isAvailable = isAvailable;\n }\n }\n }\n });\n }\n\n /* @conditional-compile-remove(video-stream-is-receiving-flag) */\n public setRemoteVideoStreamIsReceiving(\n callId: string,\n participantKey: string,\n streamId: number,\n isReceiving: boolean\n ): void {\n this.modifyState((draft: CallClientState) => {\n const call = draft.calls[this._callIdHistory.latestCallId(callId)];\n if (call) {\n const participant = call.remoteParticipants[participantKey];\n if (participant) {\n const stream = participant.videoStreams[streamId];\n if (stream) {\n stream.isReceiving = isReceiving;\n }\n }\n }\n });\n }\n\n public setRemoteVideoStreams(\n callId: string,\n participantKey: string,\n addRemoteVideoStream: RemoteVideoStreamState[],\n removeRemoteVideoStream: number[]\n ): void {\n this.modifyState((draft: CallClientState) => {\n const call = draft.calls[this._callIdHistory.latestCallId(callId)];\n if (call) {\n const participant = call.remoteParticipants[participantKey];\n if (participant) {\n for (const id of removeRemoteVideoStream) {\n delete participant.videoStreams[id];\n }\n\n for (const newStream of addRemoteVideoStream) {\n // This should only be called by the subscriber and some properties are add by other components so if the\n // stream already exists, only update the values that subscriber knows about.\n const stream = participant.videoStreams[newStream.id];\n if (stream) {\n stream.mediaStreamType = newStream.mediaStreamType;\n stream.isAvailable = newStream.isAvailable;\n /* @conditional-compile-remove(video-stream-is-receiving-flag) */\n stream.isReceiving = newStream.isReceiving;\n } else {\n participant.videoStreams[newStream.id] = newStream;\n }\n }\n }\n }\n });\n }\n\n public setRemoteVideoStreamRendererView(\n callId: string,\n participantKey: string,\n streamId: number,\n view: VideoStreamRendererViewState | undefined\n ): void {\n this.modifyState((draft: CallClientState) => {\n const call = draft.calls[this._callIdHistory.latestCallId(callId)];\n if (call) {\n const participant = call.remoteParticipants[participantKey];\n if (participant) {\n const stream = participant.videoStreams[streamId];\n if (stream) {\n stream.view = view;\n }\n }\n }\n });\n }\n\n public setRemoteVideoStreamViewScalingMode(\n callId: string,\n participantKey: string,\n streamId: number,\n scalingMode: ScalingMode\n ): void {\n this.modifyState((draft: CallClientState) => {\n const call = draft.calls[this._callIdHistory.latestCallId(callId)];\n if (call) {\n const participant = call.remoteParticipants[participantKey];\n if (participant) {\n const stream = participant.videoStreams[streamId];\n if (stream && stream.view) {\n stream.view.scalingMode = scalingMode;\n }\n }\n }\n });\n }\n\n public setIncomingCall(call: IncomingCallState): void {\n this.modifyState((draft: CallClientState) => {\n const existingCall = draft.incomingCalls[call.id];\n if (existingCall) {\n existingCall.callerInfo = call.callerInfo;\n } else {\n draft.incomingCalls[call.id] = call;\n }\n });\n }\n\n public removeIncomingCall(callId: string): void {\n this.modifyState((draft: CallClientState) => {\n delete draft.incomingCalls[callId];\n });\n }\n\n public setIncomingCallEnded(callId: string, callEndReason: CallEndReason | undefined): void {\n this.modifyState((draft: CallClientState) => {\n const call = draft.incomingCalls[callId];\n if (call) {\n call.endTime = new Date();\n call.callEndReason = callEndReason;\n delete draft.incomingCalls[callId];\n // Performance note: This loop should run only once because the number of entries\n // is never allowed to exceed MAX_CALL_HISTORY_LENGTH. A loop is used for correctness.\n while (Object.keys(draft.incomingCallsEnded).length >= MAX_CALL_HISTORY_LENGTH) {\n delete draft.incomingCallsEnded[findOldestCallEnded(draft.incomingCallsEnded)];\n }\n draft.incomingCallsEnded[callId] = call;\n }\n });\n }\n\n public setDeviceManagerIsSpeakerSelectionAvailable(isSpeakerSelectionAvailable: boolean): void {\n this.modifyState((draft: CallClientState) => {\n draft.deviceManager.isSpeakerSelectionAvailable = isSpeakerSelectionAvailable;\n });\n }\n\n public setDeviceManagerSelectedMicrophone(selectedMicrophone?: AudioDeviceInfo): void {\n this.modifyState((draft: CallClientState) => {\n draft.deviceManager.selectedMicrophone = selectedMicrophone;\n });\n }\n\n public setDeviceManagerSelectedSpeaker(selectedSpeaker?: AudioDeviceInfo): void {\n this.modifyState((draft: CallClientState) => {\n draft.deviceManager.selectedSpeaker = selectedSpeaker;\n });\n }\n\n public setDeviceManagerSelectedCamera(selectedCamera?: VideoDeviceInfo): void {\n this.modifyState((draft: CallClientState) => {\n draft.deviceManager.selectedCamera = selectedCamera;\n });\n }\n\n public setDeviceManagerCameras(cameras: VideoDeviceInfo[]): void {\n this.modifyState((draft: CallClientState) => {\n /**\n * SDK initializes cameras with one dummy camera with value { id: 'camera:id', name: '', deviceType: 'USBCamera' } immediately after\n * camera permissions are granted. So selectedCamera will have this value before the actual cameras are obtained. Therefore we should reset\n * selectedCamera to the first camera when there are cameras AND when current selectedCamera does not exist in the new array of cameras *\n */\n if (cameras.length > 0 && !cameras.some((camera) => camera.id === draft.deviceManager.selectedCamera?.id)) {\n draft.deviceManager.selectedCamera = cameras[0];\n }\n draft.deviceManager.cameras = cameras;\n });\n }\n\n public setDeviceManagerMicrophones(microphones: AudioDeviceInfo[]): void {\n this.modifyState((draft: CallClientState) => {\n draft.deviceManager.microphones = microphones;\n });\n }\n\n public setDeviceManagerSpeakers(speakers: AudioDeviceInfo[]): void {\n this.modifyState((draft: CallClientState) => {\n draft.deviceManager.speakers = speakers;\n });\n }\n\n public setDeviceManagerDeviceAccess(deviceAccess: DeviceAccess): void {\n this.modifyState((draft: CallClientState) => {\n draft.deviceManager.deviceAccess = deviceAccess;\n });\n }\n\n public setDeviceManagerUnparentedView(\n localVideoStream: LocalVideoStreamState,\n view: VideoStreamRendererViewState | undefined\n ): void {\n this.modifyState((draft: CallClientState) => {\n draft.deviceManager.unparentedViews.push({\n source: localVideoStream.source,\n mediaStreamType: localVideoStream.mediaStreamType,\n view: view\n });\n });\n }\n\n public deleteDeviceManagerUnparentedView(localVideoStream: LocalVideoStreamState): void {\n this.modifyState((draft: CallClientState) => {\n const foundIndex = draft.deviceManager.unparentedViews.findIndex(\n (stream) =>\n stream.source.id === localVideoStream.source.id && stream.mediaStreamType === localVideoStream.mediaStreamType\n );\n if (foundIndex !== -1) {\n draft.deviceManager.unparentedViews.splice(foundIndex, 1);\n }\n });\n }\n\n public getAndIncrementAtomicId(): number {\n const id = this._atomicId;\n this._atomicId++;\n return id;\n }\n\n /**\n * Tees any errors encountered in an async function to the state.\n *\n * @param action Async function to execute.\n * @param target The error target to tee error to.\n * @returns Result of calling `f`. Also re-raises any exceptions thrown from `f`.\n * @throws CallError. Exceptions thrown from `f` are tagged with the failed `target.\n */\n public withAsyncErrorTeedToState<Args extends unknown[], R>(\n action: (...args: Args) => Promise<R>,\n target: CallErrorTarget\n ): (...args: Args) => Promise<R> {\n return async (...args: Args): Promise<R> => {\n try {\n return await action(...args);\n } catch (error) {\n const callError = toCallError(target, error);\n this.setLatestError(target, callError);\n throw callError;\n }\n };\n }\n\n /**\n * Tees any errors encountered in an function to the state.\n *\n * @param action Function to execute.\n * @param target The error target to tee error to.\n * @returns Result of calling `f`. Also re-raises any exceptions thrown from `f`.\n * @throws CallError. Exceptions thrown from `f` are tagged with the failed `target.\n */\n public withErrorTeedToState<Args extends unknown[], R>(\n action: (...args: Args) => R,\n target: CallErrorTarget\n ): (...args: Args) => R {\n return (...args: Args): R => {\n try {\n callingStatefulLogger.info(`Calling stateful client target function called: ${target}`);\n return action(...args);\n } catch (error) {\n const callError = toCallError(target, error);\n this.setLatestError(target, callError);\n throw callError;\n }\n };\n }\n\n private setLatestError(target: CallErrorTarget, error: CallError): void {\n this.modifyState((draft: CallClientState) => {\n draft.latestErrors[target] = error;\n });\n }\n}\n\nconst toCallError = (target: CallErrorTarget, error: unknown): CallError => {\n if (error instanceof Error) {\n return new CallError(target, error);\n }\n return new CallError(target, new Error(error as string));\n};\n\nconst findOldestCallEnded = (calls: { [key: string]: { endTime?: Date } }): string => {\n const callEntries = Object.entries(calls);\n let [oldestCallId, oldestCall] = callEntries[0];\n if (oldestCall.endTime === undefined) {\n return oldestCallId;\n }\n for (const [callId, call] of callEntries.slice(1)) {\n if (call.endTime === undefined) {\n return callId;\n }\n if ((call.endTime?.getTime() ?? 0) < (oldestCall.endTime?.getTime() ?? 0)) {\n [oldestCallId, oldestCall] = [callId, call];\n }\n }\n return oldestCallId;\n};\n\"../../acs-ui-common/src\""]}
@@ -25,6 +25,7 @@ export declare class CallSubscriber {
25
25
  private isScreenSharingOnChanged;
26
26
  private isMuteChanged;
27
27
  private callRoleChangedHandler;
28
+ private totalParticipantCountChangedHandler;
28
29
  private remoteParticipantsUpdated;
29
30
  private localVideoStreamsUpdated;
30
31
  private dominantSpeakersChanged;
@@ -25,6 +25,8 @@ export class CallSubscriber {
25
25
  /* @conditional-compile-remove(rooms) */
26
26
  this._call.on('roleChanged', this.callRoleChangedHandler);
27
27
  this._call.feature(Features.DominantSpeakers).on('dominantSpeakersChanged', this.dominantSpeakersChanged);
28
+ /* @conditional-compile-remove(total-participant-count) */
29
+ this._call.on('totalParticipantCountChanged', this.totalParticipantCountChangedHandler);
28
30
  // At time of writing only one LocalVideoStream is supported by SDK.
29
31
  if (this._call.localVideoStreams.length > 0) {
30
32
  this._internalContext.setLocalRenderInfo(this._callIdRef.callId, this._call.localVideoStreams[0], 'NotRendered', undefined);
@@ -45,6 +47,8 @@ export class CallSubscriber {
45
47
  this._call.off('isMutedChanged', this.isMuteChanged);
46
48
  /* @conditional-compile-remove(rooms) */
47
49
  this._call.off('roleChanged', this.callRoleChangedHandler);
50
+ /* @conditional-compile-remove(total-participant-count) */
51
+ this._call.off('totalParticipantCountChanged', this.totalParticipantCountChangedHandler);
48
52
  this._participantSubscribers.forEach((participantSubscriber) => {
49
53
  participantSubscriber.unsubscribe();
50
54
  });
@@ -77,6 +81,10 @@ export class CallSubscriber {
77
81
  this.callRoleChangedHandler = () => {
78
82
  this._context.setRole(this._callIdRef.callId, this._call.role);
79
83
  };
84
+ /* @conditional-compile-remove(total-participant-count) */
85
+ this.totalParticipantCountChangedHandler = () => {
86
+ this._context.setTotalParticipantCount(this._callIdRef.callId, this._call.totalParticipantCount);
87
+ };
80
88
  this.remoteParticipantsUpdated = (event) => {
81
89
  event.added.forEach((participant) => {
82
90
  this.addParticipantListener(participant);
@@ -1 +1 @@
1
- {"version":3,"file":"CallSubscriber.js","sourceRoot":"","sources":["../../../../../calling-stateful-client/src/CallSubscriber.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\nimport { Features, LocalVideoStream, RemoteParticipant } from '@azure/communication-calling';\nimport { toFlatCommunicationIdentifier } from '@internal/acs-ui-common';\nimport { CallCommon } from './BetaToStableTypes';\nimport { CallContext } from './CallContext';\nimport { CallIdRef } from './CallIdRef';\nimport {\n convertSdkLocalStreamToDeclarativeLocalStream,\n convertSdkParticipantToDeclarativeParticipant\n} from './Converter';\nimport { InternalCallContext } from './InternalCallContext';\nimport { ParticipantSubscriber } from './ParticipantSubscriber';\nimport { RecordingSubscriber } from './RecordingSubscriber';\nimport { disposeView } from './StreamUtils';\nimport { TranscriptionSubscriber } from './TranscriptionSubscriber';\nimport { UserFacingDiagnosticsSubscriber } from './UserFacingDiagnosticsSubscriber';\n\n/**\n * Keeps track of the listeners assigned to a particular call because when we get an event from SDK, it doesn't tell us\n * which call it is for. If we keep track of this then we know which call in the state that needs an update and also\n * which property of that call. Also we can use this when unregistering to a call.\n */\nexport class CallSubscriber {\n private _call: CallCommon;\n private _callIdRef: CallIdRef;\n private _context: CallContext;\n private _internalContext: InternalCallContext;\n\n private _diagnosticsSubscriber: UserFacingDiagnosticsSubscriber;\n private _participantSubscribers: Map<string, ParticipantSubscriber>;\n private _recordingSubscriber: RecordingSubscriber;\n private _transcriptionSubscriber: TranscriptionSubscriber;\n\n constructor(call: CallCommon, context: CallContext, internalContext: InternalCallContext) {\n this._call = call;\n this._callIdRef = { callId: call.id };\n this._context = context;\n this._internalContext = internalContext;\n\n this._diagnosticsSubscriber = new UserFacingDiagnosticsSubscriber(\n this._callIdRef,\n this._context,\n this._call.feature(Features.UserFacingDiagnostics)\n );\n this._participantSubscribers = new Map<string, ParticipantSubscriber>();\n this._recordingSubscriber = new RecordingSubscriber(\n this._callIdRef,\n this._context,\n this._call.feature(Features.Recording)\n );\n this._transcriptionSubscriber = new TranscriptionSubscriber(\n this._callIdRef,\n this._context,\n this._call.feature(Features.Transcription)\n );\n\n this.subscribe();\n }\n\n private subscribe = (): void => {\n this._call.on('stateChanged', this.stateChanged);\n this._call.on('idChanged', this.idChanged);\n this._call.on('isScreenSharingOnChanged', this.isScreenSharingOnChanged);\n this._call.on('remoteParticipantsUpdated', this.remoteParticipantsUpdated);\n this._call.on('localVideoStreamsUpdated', this.localVideoStreamsUpdated);\n this._call.on('isMutedChanged', this.isMuteChanged);\n /* @conditional-compile-remove(rooms) */\n this._call.on('roleChanged', this.callRoleChangedHandler);\n this._call.feature(Features.DominantSpeakers).on('dominantSpeakersChanged', this.dominantSpeakersChanged);\n\n // At time of writing only one LocalVideoStream is supported by SDK.\n if (this._call.localVideoStreams.length > 0) {\n this._internalContext.setLocalRenderInfo(\n this._callIdRef.callId,\n this._call.localVideoStreams[0],\n 'NotRendered',\n undefined\n );\n }\n\n if (this._call.remoteParticipants.length > 0) {\n this._call.remoteParticipants.forEach((participant: RemoteParticipant) => {\n this.addParticipantListener(participant);\n });\n\n this._context.setCallRemoteParticipants(\n this._callIdRef.callId,\n this._call.remoteParticipants.map(convertSdkParticipantToDeclarativeParticipant),\n []\n );\n }\n };\n\n public unsubscribe = (): void => {\n this._call.off('stateChanged', this.stateChanged);\n this._call.off('idChanged', this.idChanged);\n this._call.off('isScreenSharingOnChanged', this.isScreenSharingOnChanged);\n this._call.off('remoteParticipantsUpdated', this.remoteParticipantsUpdated);\n this._call.off('localVideoStreamsUpdated', this.localVideoStreamsUpdated);\n this._call.off('isMutedChanged', this.isMuteChanged);\n /* @conditional-compile-remove(rooms) */\n this._call.off('roleChanged', this.callRoleChangedHandler);\n\n this._participantSubscribers.forEach((participantSubscriber: ParticipantSubscriber) => {\n participantSubscriber.unsubscribe();\n });\n this._participantSubscribers.clear();\n\n // If we are unsubscribing that means we no longer want to display any video for this call (callEnded or callAgent\n // disposed) and we should not be updating it any more. So if video is rendering we stop rendering.\n if (this._call.localVideoStreams && this._call.localVideoStreams[0]) {\n disposeView(\n this._context,\n this._internalContext,\n this._callIdRef.callId,\n undefined,\n convertSdkLocalStreamToDeclarativeLocalStream(this._call.localVideoStreams[0])\n );\n }\n\n this._internalContext.deleteLocalRenderInfo(this._callIdRef.callId);\n\n this._diagnosticsSubscriber.unsubscribe();\n this._recordingSubscriber.unsubscribe();\n this._transcriptionSubscriber.unsubscribe();\n };\n\n private addParticipantListener(participant: RemoteParticipant): void {\n const participantKey = toFlatCommunicationIdentifier(participant.identifier);\n this._participantSubscribers.get(participantKey)?.unsubscribe();\n this._participantSubscribers.set(\n participantKey,\n new ParticipantSubscriber(this._callIdRef, participant, this._context, this._internalContext)\n );\n }\n\n private removeParticipantListener(participant: RemoteParticipant): void {\n const participantKey = toFlatCommunicationIdentifier(participant.identifier);\n const participantSubscriber = this._participantSubscribers.get(participantKey);\n if (participantSubscriber) {\n participantSubscriber.unsubscribe();\n this._participantSubscribers.delete(participantKey);\n }\n }\n\n private stateChanged = (): void => {\n this._context.setCallState(this._callIdRef.callId, this._call.state);\n };\n\n private idChanged = (): void => {\n this._internalContext.setCallId(this._call.id, this._callIdRef.callId);\n this._context.setCallId(this._call.id, this._callIdRef.callId);\n this._callIdRef.callId = this._call.id;\n };\n\n private isScreenSharingOnChanged = (): void => {\n this._context.setCallIsScreenSharingOn(this._callIdRef.callId, this._call.isScreenSharingOn);\n };\n\n private isMuteChanged = (): void => {\n this._context.setCallIsMicrophoneMuted(this._callIdRef.callId, this._call.isMuted);\n };\n\n /* @conditional-compile-remove(rooms) */\n private callRoleChangedHandler = (): void => {\n this._context.setRole(this._callIdRef.callId, this._call.role);\n };\n\n private remoteParticipantsUpdated = (event: { added: RemoteParticipant[]; removed: RemoteParticipant[] }): void => {\n event.added.forEach((participant: RemoteParticipant) => {\n this.addParticipantListener(participant);\n });\n event.removed.forEach((participant: RemoteParticipant) => {\n this.removeParticipantListener(participant);\n });\n\n // Remove any added participants from remoteParticipantsEnded if they are there and add any removed participants to\n // remoteParticipantsEnded.\n this._context.setCallRemoteParticipantsEnded(\n this._callIdRef.callId,\n event.removed.map(convertSdkParticipantToDeclarativeParticipant),\n event.added.map((participant: RemoteParticipant) => {\n return toFlatCommunicationIdentifier(participant.identifier);\n })\n );\n\n // Add added participants to remoteParticipants and remove removed participants from remoteParticipants.\n this._context.setCallRemoteParticipants(\n this._callIdRef.callId,\n event.added.map(convertSdkParticipantToDeclarativeParticipant),\n event.removed.map((participant: RemoteParticipant) => {\n return toFlatCommunicationIdentifier(participant.identifier);\n })\n );\n };\n\n private localVideoStreamsUpdated = (event: { added: LocalVideoStream[]; removed: LocalVideoStream[] }): void => {\n // At time of writing only one LocalVideoStream is supported by SDK.\n if (event.added.length > 0) {\n const localVideoStreams = [convertSdkLocalStreamToDeclarativeLocalStream(this._call.localVideoStreams[0])];\n // IMPORTANT: The internalContext should be set before context. This is done to ensure that the internal context\n // has the required data when component re-renders due to external state changes.\n this._internalContext.setLocalRenderInfo(\n this._callIdRef.callId,\n this._call.localVideoStreams[0],\n 'NotRendered',\n undefined\n );\n this._context.setCallLocalVideoStream(this._callIdRef.callId, [...localVideoStreams]);\n }\n if (event.removed.length > 0) {\n disposeView(\n this._context,\n this._internalContext,\n this._callIdRef.callId,\n undefined,\n convertSdkLocalStreamToDeclarativeLocalStream(event.removed[0])\n );\n this._internalContext.deleteLocalRenderInfo(this._callIdRef.callId);\n this._context.setCallLocalVideoStream(this._callIdRef.callId, []);\n }\n };\n\n private dominantSpeakersChanged = (): void => {\n const dominantSpeakers = this._call.feature(Features.DominantSpeakers).dominantSpeakers;\n this._context.setCallDominantSpeakers(this._callIdRef.callId, dominantSpeakers);\n };\n}\n\"../../acs-ui-common/src\""]}
1
+ {"version":3,"file":"CallSubscriber.js","sourceRoot":"","sources":["../../../../../calling-stateful-client/src/CallSubscriber.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\nimport { Features, LocalVideoStream, RemoteParticipant } from '@azure/communication-calling';\nimport { toFlatCommunicationIdentifier } from '@internal/acs-ui-common';\nimport { CallCommon } from './BetaToStableTypes';\nimport { CallContext } from './CallContext';\nimport { CallIdRef } from './CallIdRef';\nimport {\n convertSdkLocalStreamToDeclarativeLocalStream,\n convertSdkParticipantToDeclarativeParticipant\n} from './Converter';\nimport { InternalCallContext } from './InternalCallContext';\nimport { ParticipantSubscriber } from './ParticipantSubscriber';\nimport { RecordingSubscriber } from './RecordingSubscriber';\nimport { disposeView } from './StreamUtils';\nimport { TranscriptionSubscriber } from './TranscriptionSubscriber';\nimport { UserFacingDiagnosticsSubscriber } from './UserFacingDiagnosticsSubscriber';\n\n/**\n * Keeps track of the listeners assigned to a particular call because when we get an event from SDK, it doesn't tell us\n * which call it is for. If we keep track of this then we know which call in the state that needs an update and also\n * which property of that call. Also we can use this when unregistering to a call.\n */\nexport class CallSubscriber {\n private _call: CallCommon;\n private _callIdRef: CallIdRef;\n private _context: CallContext;\n private _internalContext: InternalCallContext;\n\n private _diagnosticsSubscriber: UserFacingDiagnosticsSubscriber;\n private _participantSubscribers: Map<string, ParticipantSubscriber>;\n private _recordingSubscriber: RecordingSubscriber;\n private _transcriptionSubscriber: TranscriptionSubscriber;\n\n constructor(call: CallCommon, context: CallContext, internalContext: InternalCallContext) {\n this._call = call;\n this._callIdRef = { callId: call.id };\n this._context = context;\n this._internalContext = internalContext;\n\n this._diagnosticsSubscriber = new UserFacingDiagnosticsSubscriber(\n this._callIdRef,\n this._context,\n this._call.feature(Features.UserFacingDiagnostics)\n );\n this._participantSubscribers = new Map<string, ParticipantSubscriber>();\n this._recordingSubscriber = new RecordingSubscriber(\n this._callIdRef,\n this._context,\n this._call.feature(Features.Recording)\n );\n this._transcriptionSubscriber = new TranscriptionSubscriber(\n this._callIdRef,\n this._context,\n this._call.feature(Features.Transcription)\n );\n\n this.subscribe();\n }\n\n private subscribe = (): void => {\n this._call.on('stateChanged', this.stateChanged);\n this._call.on('idChanged', this.idChanged);\n this._call.on('isScreenSharingOnChanged', this.isScreenSharingOnChanged);\n this._call.on('remoteParticipantsUpdated', this.remoteParticipantsUpdated);\n this._call.on('localVideoStreamsUpdated', this.localVideoStreamsUpdated);\n this._call.on('isMutedChanged', this.isMuteChanged);\n /* @conditional-compile-remove(rooms) */\n this._call.on('roleChanged', this.callRoleChangedHandler);\n this._call.feature(Features.DominantSpeakers).on('dominantSpeakersChanged', this.dominantSpeakersChanged);\n /* @conditional-compile-remove(total-participant-count) */\n this._call.on('totalParticipantCountChanged', this.totalParticipantCountChangedHandler);\n\n // At time of writing only one LocalVideoStream is supported by SDK.\n if (this._call.localVideoStreams.length > 0) {\n this._internalContext.setLocalRenderInfo(\n this._callIdRef.callId,\n this._call.localVideoStreams[0],\n 'NotRendered',\n undefined\n );\n }\n\n if (this._call.remoteParticipants.length > 0) {\n this._call.remoteParticipants.forEach((participant: RemoteParticipant) => {\n this.addParticipantListener(participant);\n });\n\n this._context.setCallRemoteParticipants(\n this._callIdRef.callId,\n this._call.remoteParticipants.map(convertSdkParticipantToDeclarativeParticipant),\n []\n );\n }\n };\n\n public unsubscribe = (): void => {\n this._call.off('stateChanged', this.stateChanged);\n this._call.off('idChanged', this.idChanged);\n this._call.off('isScreenSharingOnChanged', this.isScreenSharingOnChanged);\n this._call.off('remoteParticipantsUpdated', this.remoteParticipantsUpdated);\n this._call.off('localVideoStreamsUpdated', this.localVideoStreamsUpdated);\n this._call.off('isMutedChanged', this.isMuteChanged);\n /* @conditional-compile-remove(rooms) */\n this._call.off('roleChanged', this.callRoleChangedHandler);\n /* @conditional-compile-remove(total-participant-count) */\n this._call.off('totalParticipantCountChanged', this.totalParticipantCountChangedHandler);\n\n this._participantSubscribers.forEach((participantSubscriber: ParticipantSubscriber) => {\n participantSubscriber.unsubscribe();\n });\n this._participantSubscribers.clear();\n\n // If we are unsubscribing that means we no longer want to display any video for this call (callEnded or callAgent\n // disposed) and we should not be updating it any more. So if video is rendering we stop rendering.\n if (this._call.localVideoStreams && this._call.localVideoStreams[0]) {\n disposeView(\n this._context,\n this._internalContext,\n this._callIdRef.callId,\n undefined,\n convertSdkLocalStreamToDeclarativeLocalStream(this._call.localVideoStreams[0])\n );\n }\n\n this._internalContext.deleteLocalRenderInfo(this._callIdRef.callId);\n\n this._diagnosticsSubscriber.unsubscribe();\n this._recordingSubscriber.unsubscribe();\n this._transcriptionSubscriber.unsubscribe();\n };\n\n private addParticipantListener(participant: RemoteParticipant): void {\n const participantKey = toFlatCommunicationIdentifier(participant.identifier);\n this._participantSubscribers.get(participantKey)?.unsubscribe();\n this._participantSubscribers.set(\n participantKey,\n new ParticipantSubscriber(this._callIdRef, participant, this._context, this._internalContext)\n );\n }\n\n private removeParticipantListener(participant: RemoteParticipant): void {\n const participantKey = toFlatCommunicationIdentifier(participant.identifier);\n const participantSubscriber = this._participantSubscribers.get(participantKey);\n if (participantSubscriber) {\n participantSubscriber.unsubscribe();\n this._participantSubscribers.delete(participantKey);\n }\n }\n\n private stateChanged = (): void => {\n this._context.setCallState(this._callIdRef.callId, this._call.state);\n };\n\n private idChanged = (): void => {\n this._internalContext.setCallId(this._call.id, this._callIdRef.callId);\n this._context.setCallId(this._call.id, this._callIdRef.callId);\n this._callIdRef.callId = this._call.id;\n };\n\n private isScreenSharingOnChanged = (): void => {\n this._context.setCallIsScreenSharingOn(this._callIdRef.callId, this._call.isScreenSharingOn);\n };\n\n private isMuteChanged = (): void => {\n this._context.setCallIsMicrophoneMuted(this._callIdRef.callId, this._call.isMuted);\n };\n\n /* @conditional-compile-remove(rooms) */\n private callRoleChangedHandler = (): void => {\n this._context.setRole(this._callIdRef.callId, this._call.role);\n };\n\n /* @conditional-compile-remove(total-participant-count) */\n private totalParticipantCountChangedHandler = (): void => {\n this._context.setTotalParticipantCount(this._callIdRef.callId, this._call.totalParticipantCount);\n };\n\n private remoteParticipantsUpdated = (event: { added: RemoteParticipant[]; removed: RemoteParticipant[] }): void => {\n event.added.forEach((participant: RemoteParticipant) => {\n this.addParticipantListener(participant);\n });\n event.removed.forEach((participant: RemoteParticipant) => {\n this.removeParticipantListener(participant);\n });\n\n // Remove any added participants from remoteParticipantsEnded if they are there and add any removed participants to\n // remoteParticipantsEnded.\n this._context.setCallRemoteParticipantsEnded(\n this._callIdRef.callId,\n event.removed.map(convertSdkParticipantToDeclarativeParticipant),\n event.added.map((participant: RemoteParticipant) => {\n return toFlatCommunicationIdentifier(participant.identifier);\n })\n );\n\n // Add added participants to remoteParticipants and remove removed participants from remoteParticipants.\n this._context.setCallRemoteParticipants(\n this._callIdRef.callId,\n event.added.map(convertSdkParticipantToDeclarativeParticipant),\n event.removed.map((participant: RemoteParticipant) => {\n return toFlatCommunicationIdentifier(participant.identifier);\n })\n );\n };\n\n private localVideoStreamsUpdated = (event: { added: LocalVideoStream[]; removed: LocalVideoStream[] }): void => {\n // At time of writing only one LocalVideoStream is supported by SDK.\n if (event.added.length > 0) {\n const localVideoStreams = [convertSdkLocalStreamToDeclarativeLocalStream(this._call.localVideoStreams[0])];\n // IMPORTANT: The internalContext should be set before context. This is done to ensure that the internal context\n // has the required data when component re-renders due to external state changes.\n this._internalContext.setLocalRenderInfo(\n this._callIdRef.callId,\n this._call.localVideoStreams[0],\n 'NotRendered',\n undefined\n );\n this._context.setCallLocalVideoStream(this._callIdRef.callId, [...localVideoStreams]);\n }\n if (event.removed.length > 0) {\n disposeView(\n this._context,\n this._internalContext,\n this._callIdRef.callId,\n undefined,\n convertSdkLocalStreamToDeclarativeLocalStream(event.removed[0])\n );\n this._internalContext.deleteLocalRenderInfo(this._callIdRef.callId);\n this._context.setCallLocalVideoStream(this._callIdRef.callId, []);\n }\n };\n\n private dominantSpeakersChanged = (): void => {\n const dominantSpeakers = this._call.feature(Features.DominantSpeakers).dominantSpeakers;\n this._context.setCallDominantSpeakers(this._callIdRef.callId, dominantSpeakers);\n };\n}\n\"../../acs-ui-common/src\""]}