@azure/communication-react 1.14.0-alpha-202403140012 → 1.14.0-alpha-202403160012
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/communication-react.d.ts +39 -1
- package/dist/dist-cjs/communication-react/{RichTextSendBoxWrapper-D1KqCTKr.js → RichTextSendBoxWrapper-BCdGFyar.js} +2 -2
- package/dist/dist-cjs/communication-react/{RichTextSendBoxWrapper-D1KqCTKr.js.map → RichTextSendBoxWrapper-BCdGFyar.js.map} +1 -1
- package/dist/dist-cjs/communication-react/{index-DikMcJD4.js → index-BfFCLrEO.js} +538 -337
- package/dist/dist-cjs/communication-react/index-BfFCLrEO.js.map +1 -0
- package/dist/dist-cjs/communication-react/index.js +1 -1
- package/dist/dist-esm/acs-ui-common/src/telemetryVersion.js +1 -1
- package/dist/dist-esm/acs-ui-common/src/telemetryVersion.js.map +1 -1
- package/dist/dist-esm/calling-component-bindings/src/baseSelectors.js +0 -3
- package/dist/dist-esm/calling-component-bindings/src/baseSelectors.js.map +1 -1
- package/dist/dist-esm/calling-component-bindings/src/callControlSelectors.js +0 -3
- package/dist/dist-esm/calling-component-bindings/src/callControlSelectors.js.map +1 -1
- package/dist/dist-esm/calling-component-bindings/src/handlers/createCommonHandlers.js +0 -7
- package/dist/dist-esm/calling-component-bindings/src/handlers/createCommonHandlers.js.map +1 -1
- package/dist/dist-esm/calling-component-bindings/src/hooks/usePropsFor.js +3 -11
- package/dist/dist-esm/calling-component-bindings/src/hooks/usePropsFor.js.map +1 -1
- package/dist/dist-esm/calling-component-bindings/src/participantListSelector.js +3 -9
- package/dist/dist-esm/calling-component-bindings/src/participantListSelector.js.map +1 -1
- package/dist/dist-esm/calling-component-bindings/src/utils/participantListSelectorUtils.js.map +1 -1
- package/dist/dist-esm/calling-component-bindings/src/utils/videoGalleryUtils.js +5 -16
- package/dist/dist-esm/calling-component-bindings/src/utils/videoGalleryUtils.js.map +1 -1
- package/dist/dist-esm/calling-component-bindings/src/videoGallerySelector.js +4 -17
- package/dist/dist-esm/calling-component-bindings/src/videoGallerySelector.js.map +1 -1
- package/dist/dist-esm/calling-stateful-client/src/CallClientState.d.ts +35 -0
- package/dist/dist-esm/calling-stateful-client/src/CallClientState.js.map +1 -1
- package/dist/dist-esm/calling-stateful-client/src/CallContext.d.ts +8 -1
- package/dist/dist-esm/calling-stateful-client/src/CallContext.js +42 -9
- package/dist/dist-esm/calling-stateful-client/src/CallContext.js.map +1 -1
- package/dist/dist-esm/calling-stateful-client/src/CallDeclarativeCommon.js +46 -1
- package/dist/dist-esm/calling-stateful-client/src/CallDeclarativeCommon.js.map +1 -1
- package/dist/dist-esm/calling-stateful-client/src/CallSubscriber.d.ts +3 -1
- package/dist/dist-esm/calling-stateful-client/src/CallSubscriber.js +24 -14
- package/dist/dist-esm/calling-stateful-client/src/CallSubscriber.js.map +1 -1
- package/dist/dist-esm/calling-stateful-client/src/CaptionsSubscriber.d.ts +16 -1
- package/dist/dist-esm/calling-stateful-client/src/CaptionsSubscriber.js +38 -2
- package/dist/dist-esm/calling-stateful-client/src/CaptionsSubscriber.js.map +1 -1
- package/dist/dist-esm/calling-stateful-client/src/Converter.d.ts +6 -1
- package/dist/dist-esm/calling-stateful-client/src/Converter.js +11 -6
- package/dist/dist-esm/calling-stateful-client/src/Converter.js.map +1 -1
- package/dist/dist-esm/calling-stateful-client/src/LocalRecordingSubscriber.d.ts +17 -0
- package/dist/dist-esm/calling-stateful-client/src/LocalRecordingSubscriber.js +36 -0
- package/dist/dist-esm/calling-stateful-client/src/LocalRecordingSubscriber.js.map +1 -0
- package/dist/dist-esm/calling-stateful-client/src/OptimalVideoCountSubscriber.js +0 -1
- package/dist/dist-esm/calling-stateful-client/src/OptimalVideoCountSubscriber.js.map +1 -1
- package/dist/dist-esm/calling-stateful-client/src/RaiseHandSubscriber.js +0 -2
- package/dist/dist-esm/calling-stateful-client/src/RaiseHandSubscriber.js.map +1 -1
- package/dist/dist-esm/calling-stateful-client/src/RecordingSubscriber.d.ts +1 -0
- package/dist/dist-esm/calling-stateful-client/src/RecordingSubscriber.js +11 -0
- package/dist/dist-esm/calling-stateful-client/src/RecordingSubscriber.js.map +1 -1
- package/dist/dist-esm/calling-stateful-client/src/StatefulCallClient.d.ts +1 -0
- package/dist/dist-esm/calling-stateful-client/src/StatefulCallClient.js.map +1 -1
- package/dist/dist-esm/calling-stateful-client/src/index-public.d.ts +1 -0
- package/dist/dist-esm/calling-stateful-client/src/index-public.js.map +1 -1
- package/dist/dist-esm/chat-component-bindings/src/messageThreadSelector.js +1 -1
- package/dist/dist-esm/chat-component-bindings/src/messageThreadSelector.js.map +1 -1
- package/dist/dist-esm/chat-stateful-client/src/ChatContext.js +6 -2
- package/dist/dist-esm/chat-stateful-client/src/ChatContext.js.map +1 -1
- package/dist/dist-esm/chat-stateful-client/src/types/ChatMessageWithStatus.d.ts +1 -1
- package/dist/dist-esm/chat-stateful-client/src/types/ChatMessageWithStatus.js.map +1 -1
- package/dist/dist-esm/communication-react/src/index.js +0 -1
- package/dist/dist-esm/communication-react/src/index.js.map +1 -1
- package/dist/dist-esm/react-components/src/components/CaptionsSettingsModal.js +5 -2
- package/dist/dist-esm/react-components/src/components/CaptionsSettingsModal.js.map +1 -1
- package/dist/dist-esm/react-components/src/components/Drawer/DrawerMenu.js +19 -8
- package/dist/dist-esm/react-components/src/components/Drawer/DrawerMenu.js.map +1 -1
- package/dist/dist-esm/react-components/src/components/Drawer/DrawerMenuItem.d.ts +4 -0
- package/dist/dist-esm/react-components/src/components/Drawer/DrawerMenuItem.js.map +1 -1
- package/dist/dist-esm/react-components/src/components/Drawer/ReactionDrawerMenuItem.d.ts +29 -0
- package/dist/dist-esm/react-components/src/components/Drawer/ReactionDrawerMenuItem.js +60 -0
- package/dist/dist-esm/react-components/src/components/Drawer/ReactionDrawerMenuItem.js.map +1 -0
- package/dist/dist-esm/react-components/src/components/Drawer/index.d.ts +2 -0
- package/dist/dist-esm/react-components/src/components/Drawer/index.js +2 -0
- package/dist/dist-esm/react-components/src/components/Drawer/index.js.map +1 -1
- package/dist/dist-esm/react-components/src/components/ImageOverlay.js +16 -8
- package/dist/dist-esm/react-components/src/components/ImageOverlay.js.map +1 -1
- package/dist/dist-esm/react-components/src/components/LocalVideoTile.js +2 -6
- package/dist/dist-esm/react-components/src/components/LocalVideoTile.js.map +1 -1
- package/dist/dist-esm/react-components/src/components/ParticipantList.js +3 -17
- package/dist/dist-esm/react-components/src/components/ParticipantList.js.map +1 -1
- package/dist/dist-esm/react-components/src/components/RaiseHandButton.js +0 -7
- package/dist/dist-esm/react-components/src/components/RaiseHandButton.js.map +1 -1
- package/dist/dist-esm/react-components/src/components/RemoteVideoTile.js +1 -3
- package/dist/dist-esm/react-components/src/components/RemoteVideoTile.js.map +1 -1
- package/dist/dist-esm/react-components/src/components/VideoGallery.js +1 -3
- package/dist/dist-esm/react-components/src/components/VideoGallery.js.map +1 -1
- package/dist/dist-esm/react-components/src/components/VideoTile.js +3 -9
- package/dist/dist-esm/react-components/src/components/VideoTile.js.map +1 -1
- package/dist/dist-esm/react-components/src/components/assets/RaisedHandIcon.js +0 -2
- package/dist/dist-esm/react-components/src/components/assets/RaisedHandIcon.js.map +1 -1
- package/dist/dist-esm/react-components/src/components/index.js +0 -1
- package/dist/dist-esm/react-components/src/components/index.js.map +1 -1
- package/dist/dist-esm/react-components/src/components/styles/ReactionButton.styles.d.ts +12 -0
- package/dist/dist-esm/react-components/src/components/styles/ReactionButton.styles.js +47 -3
- package/dist/dist-esm/react-components/src/components/styles/ReactionButton.styles.js.map +1 -1
- package/dist/dist-esm/react-components/src/index.js.map +1 -1
- package/dist/dist-esm/react-components/src/localization/LocalizationProvider.js.map +1 -1
- package/dist/dist-esm/react-components/src/theming/icons.js +0 -5
- package/dist/dist-esm/react-components/src/theming/icons.js.map +1 -1
- package/dist/dist-esm/react-components/src/theming/themes.js +1 -3
- package/dist/dist-esm/react-components/src/theming/themes.js.map +1 -1
- package/dist/dist-esm/react-components/src/types/ParticipantListParticipant.js.map +1 -1
- package/dist/dist-esm/react-components/src/types/VideoGalleryParticipant.js.map +1 -1
- package/dist/dist-esm/react-composites/src/composites/CallComposite/adapter/AzureCommunicationCallAdapter.d.ts +1 -0
- package/dist/dist-esm/react-composites/src/composites/CallComposite/adapter/AzureCommunicationCallAdapter.js +43 -18
- package/dist/dist-esm/react-composites/src/composites/CallComposite/adapter/AzureCommunicationCallAdapter.js.map +1 -1
- package/dist/dist-esm/react-composites/src/composites/CallComposite/adapter/CallAdapter.js.map +1 -1
- package/dist/dist-esm/react-composites/src/composites/CallComposite/components/CallArrangement.js +11 -3
- package/dist/dist-esm/react-composites/src/composites/CallComposite/components/CallArrangement.js.map +1 -1
- package/dist/dist-esm/react-composites/src/composites/CallComposite/components/CallControls.js +1 -15
- package/dist/dist-esm/react-composites/src/composites/CallComposite/components/CallControls.js.map +1 -1
- package/dist/dist-esm/react-composites/src/composites/CallComposite/components/LocalAndRemotePIP.js +0 -2
- package/dist/dist-esm/react-composites/src/composites/CallComposite/components/LocalAndRemotePIP.js.map +1 -1
- package/dist/dist-esm/react-composites/src/composites/CallComposite/components/buttons/RaiseHand.js +0 -8
- package/dist/dist-esm/react-composites/src/composites/CallComposite/components/buttons/RaiseHand.js.map +1 -1
- package/dist/dist-esm/react-composites/src/composites/CallComposite/hooks/useHandlers.js +0 -3
- package/dist/dist-esm/react-composites/src/composites/CallComposite/hooks/useHandlers.js.map +1 -1
- package/dist/dist-esm/react-composites/src/composites/CallComposite/selectors/baseSelectors.js +0 -1
- package/dist/dist-esm/react-composites/src/composites/CallComposite/selectors/baseSelectors.js.map +1 -1
- package/dist/dist-esm/react-composites/src/composites/CallComposite/selectors/localAndRemotePIPSelector.js +1 -9
- package/dist/dist-esm/react-composites/src/composites/CallComposite/selectors/localAndRemotePIPSelector.js.map +1 -1
- package/dist/dist-esm/react-composites/src/composites/CallWithChatComposite/CallWithChatComposite.js +0 -3
- package/dist/dist-esm/react-composites/src/composites/CallWithChatComposite/CallWithChatComposite.js.map +1 -1
- package/dist/dist-esm/react-composites/src/composites/CallWithChatComposite/adapter/AzureCommunicationCallWithChatAdapter.js +0 -4
- package/dist/dist-esm/react-composites/src/composites/CallWithChatComposite/adapter/AzureCommunicationCallWithChatAdapter.js.map +1 -1
- package/dist/dist-esm/react-composites/src/composites/CallWithChatComposite/adapter/CallWithChatAdapter.js.map +1 -1
- package/dist/dist-esm/react-composites/src/composites/CallWithChatComposite/adapter/CallWithChatBackedCallAdapter.js +0 -2
- package/dist/dist-esm/react-composites/src/composites/CallWithChatComposite/adapter/CallWithChatBackedCallAdapter.js.map +1 -1
- package/dist/dist-esm/react-composites/src/composites/CallWithChatComposite/index.js.map +1 -1
- package/dist/dist-esm/react-composites/src/composites/ChatComposite/ChatScreen.js +1 -1
- package/dist/dist-esm/react-composites/src/composites/ChatComposite/ChatScreen.js.map +1 -1
- package/dist/dist-esm/react-composites/src/composites/common/AvatarPersona.js +1 -6
- package/dist/dist-esm/react-composites/src/composites/common/AvatarPersona.js.map +1 -1
- package/dist/dist-esm/react-composites/src/composites/common/CaptionsBanner.d.ts +1 -0
- package/dist/dist-esm/react-composites/src/composites/common/CaptionsBanner.js +1 -1
- package/dist/dist-esm/react-composites/src/composites/common/CaptionsBanner.js.map +1 -1
- package/dist/dist-esm/react-composites/src/composites/common/ControlBar/CommonCallControlBar.d.ts +1 -0
- package/dist/dist-esm/react-composites/src/composites/common/ControlBar/CommonCallControlBar.js +3 -6
- package/dist/dist-esm/react-composites/src/composites/common/ControlBar/CommonCallControlBar.js.map +1 -1
- package/dist/dist-esm/react-composites/src/composites/common/ControlBar/DesktopMoreButton.js +0 -5
- package/dist/dist-esm/react-composites/src/composites/common/ControlBar/DesktopMoreButton.js.map +1 -1
- package/dist/dist-esm/react-composites/src/composites/common/Drawer/MoreDrawer.d.ts +4 -0
- package/dist/dist-esm/react-composites/src/composites/common/Drawer/MoreDrawer.js +32 -33
- package/dist/dist-esm/react-composites/src/composites/common/Drawer/MoreDrawer.js.map +1 -1
- package/dist/dist-esm/react-composites/src/composites/common/Drawer/PreparedMoreDrawer.d.ts +3 -0
- package/dist/dist-esm/react-composites/src/composites/common/Drawer/PreparedMoreDrawer.js.map +1 -1
- package/dist/dist-esm/react-composites/src/composites/common/ParticipantContainer.js +1 -3
- package/dist/dist-esm/react-composites/src/composites/common/ParticipantContainer.js.map +1 -1
- package/dist/dist-esm/react-composites/src/composites/common/icons.js +0 -1
- package/dist/dist-esm/react-composites/src/composites/common/icons.js.map +1 -1
- package/dist/dist-esm/react-composites/src/composites/common/types/CommonCallControlOptions.js.map +1 -1
- package/dist/dist-esm/react-composites/src/composites/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/dist-cjs/communication-react/index-DikMcJD4.js.map +0 -1
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"RaiseHandSubscriber.js","sourceRoot":"","sources":["../../../../../calling-stateful-client/src/RaiseHandSubscriber.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;
|
1
|
+
{"version":3,"file":"RaiseHandSubscriber.js","sourceRoot":"","sources":["../../../../../calling-stateful-client/src/RaiseHandSubscriber.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAKlC,OAAO,EAAE,6BAA6B,EAAE,gCAAgC;AACxE;;GAEG;AACH,MAAM,OAAO,mBAAmB;IAK9B,YAAY,SAAoB,EAAE,OAAoB,EAAE,SAA+B;QAQ/E,cAAS,GAAG,GAAS,EAAE;YAC7B,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,iBAAiB,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;YACvD,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,kBAAkB,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QAC3D,CAAC,CAAC;QAEK,gBAAW,GAAG,GAAS,EAAE;YAC9B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,iBAAiB,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;YACxD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,kBAAkB,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QAC5D,CAAC,CAAC;QAEM,eAAU,GAAG,GAAS,EAAE;YAC9B,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,cAAc,EAAE,CAAC,CAAC;YAC3F,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,UAAU,CAAC,cAAc,EAAE,EAAE,CAAC;gBAC1D,IAAI,CAAC,QAAQ,CAAC,0BAA0B,CACtC,IAAI,CAAC,UAAU,CAAC,MAAM,EACtB,6BAA6B,CAAC,UAAU,CAAC,UAAU,CAAC,EACpD,UAAU,CACX,CAAC;YACJ,CAAC;QACH,CAAC,CAAC;QAEM,gBAAW,GAAG,CAAC,KAA6B,EAAQ,EAAE;YAC5D,IAAI,CAAC,UAAU,EAAE,CAAC;YAElB,IAAI,CAAC,QAAQ,CAAC,0BAA0B,CACtC,IAAI,CAAC,UAAU,CAAC,MAAM,EACtB,6BAA6B,CAAC,KAAK,CAAC,UAAU,CAAC,EAC/C,SAAS,CACV,CAAC;QACJ,CAAC,CAAC;QApCA,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QAC5B,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;QACxB,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QAE5B,IAAI,CAAC,SAAS,EAAE,CAAC;IACnB,CAAC;CAgCF","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport { RaiseHandCallFeature, RaisedHandChangedEvent } from '@azure/communication-calling';\nimport { CallContext } from './CallContext';\nimport { CallIdRef } from './CallIdRef';\nimport { toFlatCommunicationIdentifier } from '@internal/acs-ui-common';\n/**\n * @private\n */\nexport class RaiseHandSubscriber {\n private _callIdRef: CallIdRef;\n private _context: CallContext;\n private _raiseHand: RaiseHandCallFeature;\n\n constructor(callIdRef: CallIdRef, context: CallContext, raiseHand: RaiseHandCallFeature) {\n this._callIdRef = callIdRef;\n this._context = context;\n this._raiseHand = raiseHand;\n\n this.subscribe();\n }\n\n private subscribe = (): void => {\n this._raiseHand.on('raisedHandEvent', this.raisedHand);\n this._raiseHand.on('loweredHandEvent', this.loweredHand);\n };\n\n public unsubscribe = (): void => {\n this._raiseHand.off('raisedHandEvent', this.raisedHand);\n this._raiseHand.off('loweredHandEvent', this.loweredHand);\n };\n\n private raisedHand = (): void => {\n this._context.setCallRaisedHands(this._callIdRef.callId, this._raiseHand.getRaisedHands());\n for (const raisedHand of this._raiseHand.getRaisedHands()) {\n this._context.setParticipantIsRaisedHand(\n this._callIdRef.callId,\n toFlatCommunicationIdentifier(raisedHand.identifier),\n raisedHand\n );\n }\n };\n\n private loweredHand = (event: RaisedHandChangedEvent): void => {\n this.raisedHand();\n\n this._context.setParticipantIsRaisedHand(\n this._callIdRef.callId,\n toFlatCommunicationIdentifier(event.identifier),\n undefined\n );\n };\n}\n"]}
|
@@ -7,13 +7,21 @@ export class RecordingSubscriber {
|
|
7
7
|
constructor(callIdRef, context, recording) {
|
8
8
|
this.subscribe = () => {
|
9
9
|
this._recording.on('isRecordingActiveChanged', this.isAvailableChanged);
|
10
|
+
/* @conditional-compile-remove(local-recording-notification) */
|
11
|
+
this._recording.on('recordingsUpdated', this.isRecordingsUpdated);
|
10
12
|
};
|
11
13
|
this.unsubscribe = () => {
|
12
14
|
this._recording.off('isRecordingActiveChanged', this.isAvailableChanged);
|
15
|
+
/* @conditional-compile-remove(local-recording-notification) */
|
16
|
+
this._recording.off('recordingsUpdated', this.isRecordingsUpdated);
|
13
17
|
};
|
14
18
|
this.isAvailableChanged = () => {
|
15
19
|
this._context.setCallRecordingActive(this._callIdRef.callId, this._recording.isRecordingActive);
|
16
20
|
};
|
21
|
+
/* @conditional-compile-remove(local-recording-notification) */
|
22
|
+
this.isRecordingsUpdated = (data) => {
|
23
|
+
this._context.setCallRecordingInfos(this._callIdRef.callId, this._recording.recordings, data.removed);
|
24
|
+
};
|
17
25
|
this._callIdRef = callIdRef;
|
18
26
|
this._context = context;
|
19
27
|
this._recording = recording;
|
@@ -21,6 +29,9 @@ export class RecordingSubscriber {
|
|
21
29
|
// be an event for it.
|
22
30
|
if (this._recording.isRecordingActive) {
|
23
31
|
this._context.setCallRecordingActive(this._callIdRef.callId, this._recording.isRecordingActive);
|
32
|
+
/* @conditional-compile-remove(local-recording-notification) */
|
33
|
+
// recordings getter only returns a list of active recordings, so we can set the list of recordings here
|
34
|
+
this._context.setCallRecordingInfos(this._callIdRef.callId, this._recording.recordings, []);
|
24
35
|
}
|
25
36
|
this.subscribe();
|
26
37
|
}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"RecordingSubscriber.js","sourceRoot":"","sources":["../../../../../calling-stateful-client/src/RecordingSubscriber.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;
|
1
|
+
{"version":3,"file":"RecordingSubscriber.js","sourceRoot":"","sources":["../../../../../calling-stateful-client/src/RecordingSubscriber.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAQlC;;GAEG;AACH,MAAM,OAAO,mBAAmB;IAK9B,YAAY,SAAoB,EAAE,OAAoB,EAAE,SAA+B;QAiB/E,cAAS,GAAG,GAAS,EAAE;YAC7B,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,0BAA0B,EAAE,IAAI,CAAC,kBAAkB,CAAC,CAAC;YACxE,+DAA+D;YAC/D,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,mBAAmB,EAAE,IAAI,CAAC,mBAAmB,CAAC,CAAC;QACpE,CAAC,CAAC;QAEK,gBAAW,GAAG,GAAS,EAAE;YAC9B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,0BAA0B,EAAE,IAAI,CAAC,kBAAkB,CAAC,CAAC;YACzE,+DAA+D;YAC/D,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,mBAAmB,EAAE,IAAI,CAAC,mBAAmB,CAAC,CAAC;QACrE,CAAC,CAAC;QAEM,uBAAkB,GAAG,GAAS,EAAE;YACtC,IAAI,CAAC,QAAQ,CAAC,sBAAsB,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC;QAClG,CAAC,CAAC;QAEF,+DAA+D;QACvD,wBAAmB,GAAG,CAAC,IAA0D,EAAQ,EAAE;YACjG,IAAI,CAAC,QAAQ,CAAC,qBAAqB,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QACxG,CAAC,CAAC;QAnCA,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QAC5B,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;QACxB,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QAE5B,+GAA+G;QAC/G,sBAAsB;QACtB,IAAI,IAAI,CAAC,UAAU,CAAC,iBAAiB,EAAE,CAAC;YACtC,IAAI,CAAC,QAAQ,CAAC,sBAAsB,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC;YAChG,+DAA+D;YAC/D,wGAAwG;YACxG,IAAI,CAAC,QAAQ,CAAC,qBAAqB,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QAC9F,CAAC;QAED,IAAI,CAAC,SAAS,EAAE,CAAC;IACnB,CAAC;CAsBF","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport { RecordingCallFeature } from '@azure/communication-calling';\nimport { CallContext } from './CallContext';\nimport { CallIdRef } from './CallIdRef';\n/* @conditional-compile-remove(local-recording-notification) */\nimport { RecordingInfo } from '@azure/communication-calling';\n\n/**\n * @private\n */\nexport class RecordingSubscriber {\n private _callIdRef: CallIdRef;\n private _context: CallContext;\n private _recording: RecordingCallFeature;\n\n constructor(callIdRef: CallIdRef, context: CallContext, recording: RecordingCallFeature) {\n this._callIdRef = callIdRef;\n this._context = context;\n this._recording = recording;\n\n // If recording as already started when we joined the call, make sure it is reflected in state as there may not\n // be an event for it.\n if (this._recording.isRecordingActive) {\n this._context.setCallRecordingActive(this._callIdRef.callId, this._recording.isRecordingActive);\n /* @conditional-compile-remove(local-recording-notification) */\n // recordings getter only returns a list of active recordings, so we can set the list of recordings here\n this._context.setCallRecordingInfos(this._callIdRef.callId, this._recording.recordings, []);\n }\n\n this.subscribe();\n }\n\n private subscribe = (): void => {\n this._recording.on('isRecordingActiveChanged', this.isAvailableChanged);\n /* @conditional-compile-remove(local-recording-notification) */\n this._recording.on('recordingsUpdated', this.isRecordingsUpdated);\n };\n\n public unsubscribe = (): void => {\n this._recording.off('isRecordingActiveChanged', this.isAvailableChanged);\n /* @conditional-compile-remove(local-recording-notification) */\n this._recording.off('recordingsUpdated', this.isRecordingsUpdated);\n };\n\n private isAvailableChanged = (): void => {\n this._context.setCallRecordingActive(this._callIdRef.callId, this._recording.isRecordingActive);\n };\n\n /* @conditional-compile-remove(local-recording-notification) */\n private isRecordingsUpdated = (data: { added: RecordingInfo[]; removed: RecordingInfo[] }): void => {\n this._context.setCallRecordingInfos(this._callIdRef.callId, this._recording.recordings, data.removed);\n };\n}\n"]}
|
@@ -37,6 +37,7 @@ import { MicrosoftTeamsUserIdentifier } from '@azure/communication-common';
|
|
37
37
|
* - RemoteVideoStream 'isAvailableChanged'
|
38
38
|
* - TranscriptionCallFeature 'isTranscriptionActiveChanged'
|
39
39
|
* - RecordingCallFeature 'isRecordingActiveChanged'
|
40
|
+
* - LocalRecordingCallFeature 'isLocalRecordingActiveChanged'
|
40
41
|
* - RaiseHandCallFeature 'raisedHandEvent'
|
41
42
|
* - RaiseHandCallFeature 'loweredHandEvent'
|
42
43
|
* - PPTLiveCallFeature 'isAciveChanged'
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"StatefulCallClient.js","sourceRoot":"","sources":["../../../../../calling-stateful-client/src/StatefulCallClient.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport { deviceManagerDeclaratify } from './DeviceManagerDeclarative';\nimport { CallClient, CallClientOptions, CreateViewOptions, DeviceManager } from '@azure/communication-calling';\n/* @conditional-compile-remove(unsupported-browser) */\nimport { Features } from '@azure/communication-calling';\nimport { CallClientState, LocalVideoStreamState, RemoteVideoStreamState } from './CallClientState';\nimport { CallContext } from './CallContext';\nimport { callAgentDeclaratify, DeclarativeCallAgent } from './CallAgentDeclarative';\nimport { InternalCallContext } from './InternalCallContext';\nimport { createView, disposeView, CreateViewResult } from './StreamUtils';\nimport { CommunicationIdentifier, CommunicationUserIdentifier, getIdentifierKind } from '@azure/communication-common';\nimport {\n toFlatCommunicationIdentifier,\n _getApplicationId,\n _TelemetryImplementationHint\n} from '@internal/acs-ui-common';\nimport { callingStatefulLogger } from './Logger';\n/* @conditional-compile-remove(teams-identity-support) */\nimport { DeclarativeTeamsCallAgent, teamsCallAgentDeclaratify } from './TeamsCallAgentDeclarative';\n/* @conditional-compile-remove(teams-identity-support) */\nimport { MicrosoftTeamsUserIdentifier } from '@azure/communication-common';\nimport { videoStreamRendererViewDeclaratify } from './VideoStreamRendererViewDeclarative';\n\n/**\n * Defines the methods that allow CallClient {@link @azure/communication-calling#CallClient} to be used statefully.\n * The interface provides access to proxied state and also allows registering a handler for state change events. For\n * state definition see {@link CallClientState}.\n *\n * State change events are driven by:\n * - Returned data from {@link @azure/communication-calling#DeviceManager} APIs.\n * - Returned data from {@link @azure/communication-calling#CallAgent} APIs.\n * - Listeners automatically attached to various azure communication-calling objects:\n * - CallAgent 'incomingCall'\n * - CallAgent 'callsUpdated'\n * - DeviceManager 'videoDevicesUpdated'\n * - DeviceManager 'audioDevicesUpdated\n * - DeviceManager 'selectedMicrophoneChanged'\n * - DeviceManager 'selectedSpeakerChanged'\n * - Call 'stateChanged'\n * - Call 'idChanged'\n * - Call 'isMutedChanged'\n * - Call 'isScreenSharingOnChanged'\n * - Call 'remoteParticipantsUpdated'\n * - Call 'localVideoStreamsUpdated'\n * - IncomingCall 'callEnded'\n * - RemoteParticipant 'stateChanged'\n * - RemoteParticipant 'isMutedChanged'\n * - RemoteParticipant 'displayNameChanged'\n * - RemoteParticipant 'isSpeakingChanged'\n * - RemoteParticipant 'videoStreamsUpdated'\n * - RemoteVideoStream 'isAvailableChanged'\n * - TranscriptionCallFeature 'isTranscriptionActiveChanged'\n * - RecordingCallFeature 'isRecordingActiveChanged'\n * - RaiseHandCallFeature 'raisedHandEvent'\n * - RaiseHandCallFeature 'loweredHandEvent'\n * - PPTLiveCallFeature 'isAciveChanged'\n * - ReactionCallFeature 'reaction'\n *\n * @public\n */\nexport interface StatefulCallClient extends CallClient {\n /**\n * Holds all the state that we could proxy from CallClient {@link @azure/communication-calling#CallClient} as\n * CallClientState {@link CallClientState}.\n */\n getState(): CallClientState;\n /**\n * Allows a handler to be registered for 'stateChanged' events.\n *\n * @param handler - Callback to receive the state.\n */\n onStateChange(handler: (state: CallClientState) => void): void;\n /**\n * Allows unregistering for 'stateChanged' events.\n *\n * @param handler - Original callback to be unsubscribed.\n */\n offStateChange(handler: (state: CallClientState) => void): void;\n /**\n * Renders a {@link RemoteVideoStreamState} or {@link LocalVideoStreamState} and stores the resulting\n * {@link VideoStreamRendererViewState} under the relevant {@link RemoteVideoStreamState} or\n * {@link LocalVideoStreamState} or as unparented view in the state. Under the hood calls\n * {@link @azure/communication-calling#VideoStreamRenderer.createView}.\n *\n * Scenario 1: Render RemoteVideoStreamState\n * - CallId is required, participantId is required, and stream of type RemoteVideoStreamState is required\n * - Resulting {@link VideoStreamRendererViewState} is stored in the given callId and participantId in\n * {@link CallClientState}\n *\n * Scenario 2: Render LocalVideoStreamState for a call\n * - CallId is required, participantId must be undefined, and stream of type LocalVideoStreamState is required.\n * - The {@link @azure/communication-calling#Call.localVideoStreams} must already be started using\n * {@link @azure/communication-calling#Call.startVideo}.\n * - Resulting {@link VideoStreamRendererViewState} is stored in the given callId {@link CallState.localVideoStreams}\n * in {@link CallClientState}.\n *\n * - Scenario 2: Render LocalVideoStreamState not part of a call (example rendering camera for local preview)\n * - CallId must be undefined, participantId must be undefined, and stream of type LocalVideoStreamState is required.\n * - Resulting {@link VideoStreamRendererViewState} is stored in under the given LocalVideoStreamState in\n * {@link CallClientState.deviceManager.unparentedViews}\n *\n * @param callId - CallId for the given stream. Can be undefined if the stream is not part of any call.\n * @param participantId - {@link RemoteParticipant.identifier} associated with the given RemoteVideoStreamState. Could\n * be undefined if rendering LocalVideoStreamState.\n * @param stream - The LocalVideoStreamState or RemoteVideoStreamState to start rendering.\n * @param options - Options that are passed to the {@link @azure/communication-calling#VideoStreamRenderer}.\n */\n createView(\n callId: string | undefined,\n participantId: CommunicationIdentifier | undefined,\n stream: LocalVideoStreamState | RemoteVideoStreamState,\n options?: CreateViewOptions\n ): Promise<CreateViewResult | undefined>;\n /**\n * Stops rendering a {@link RemoteVideoStreamState} or {@link LocalVideoStreamState} and removes the\n * {@link VideoStreamRendererView} from the relevant {@link RemoteVideoStreamState} in {@link CallClientState} or\n * {@link LocalVideoStream} in {@link CallClientState} or appropriate\n * {@link CallClientState.deviceManager.unparentedViews} Under the hood calls\n * {@link @azure/communication-calling#VideoStreamRenderer.dispose}.\n *\n * Its important to disposeView to clean up resources properly.\n *\n * Scenario 1: Dispose RemoteVideoStreamState\n * - CallId is required, participantId is required, and stream of type RemoteVideoStreamState is required\n *\n * Scenario 2: Dispose LocalVideoStreamState for a call\n * - CallId is required, participantId must be undefined, and stream of type LocalVideoStreamState is required.\n *\n * - Scenario 2: Dispose LocalVideoStreamState not part of a call\n * - CallId must be undefined, participantId must be undefined, and stream of type LocalVideoStreamState is required.\n * - LocalVideoStreamState must be the original one passed to createView.\n *\n * @param callId - CallId for the given stream. Can be undefined if the stream is not part of any call.\n * @param participantId - {@link RemoteParticipant.identifier} associated with the given RemoteVideoStreamState. Could\n * be undefined if disposing LocalVideoStreamState.\n * @param stream - The LocalVideoStreamState or RemoteVideoStreamState to dispose.\n */\n disposeView(\n callId: string | undefined,\n participantId: CommunicationIdentifier | undefined,\n stream: LocalVideoStreamState | RemoteVideoStreamState\n ): void;\n\n /** @conditional-compile-remove(one-to-n-calling) */\n /**\n * The CallAgent is used to handle calls.\n * To create the CallAgent, pass a CommunicationTokenCredential object provided from SDK.\n * - The CallClient can only have one active CallAgent instance at a time.\n * - You can create a new CallClient instance to create a new CallAgent.\n * - You can dispose of a CallClient's current active CallAgent, and call the CallClient's\n * createCallAgent() method again to create a new CallAgent.\n * @param tokenCredential - The token credential. Use AzureCommunicationTokenCredential from `@azure/communication-common` to create a credential.\n * @param options - The CallAgentOptions for additional options like display name.\n * @public\n */\n createCallAgent(...args: Parameters<CallClient['createCallAgent']>): Promise<DeclarativeCallAgent>;\n}\n\n/**\n * A function to modify the state of the StatefulCallClient.\n *\n * Provided as a callback to the {@link StatefulCallClient.modifyState} method.\n *\n * The function must modify the provided state in place as much as possible.\n * Making large modifications can lead to bad performance by causing spurious rerendering of the UI.\n *\n * Consider using commonly used modifier functions exported from this package.\n */\nexport type CallStateModifier = (state: CallClientState) => void;\n\n/**\n * ProxyCallClient proxies CallClient {@link @azure/communication-calling#CallClient} and subscribes to all events that\n * affect state. ProxyCallClient keeps its own copy of the call state and when state is updated, ProxyCallClient emits\n * the event 'stateChanged'.\n */\nclass ProxyCallClient implements ProxyHandler<CallClient> {\n private _context: CallContext;\n private _internalContext: InternalCallContext;\n private _callAgent:\n | DeclarativeCallAgent\n | /* @conditional-compile-remove(teams-identity-support) */ DeclarativeTeamsCallAgent\n | undefined;\n private _deviceManager: DeviceManager | undefined;\n private _sdkDeviceManager: DeviceManager | undefined;\n\n constructor(context: CallContext, internalContext: InternalCallContext) {\n this._context = context;\n this._internalContext = internalContext;\n }\n\n public get<P extends keyof CallClient>(target: CallClient, prop: P): any {\n switch (prop) {\n case 'createCallAgent': {\n return this._context.withAsyncErrorTeedToState(\n async (...args: Parameters<CallClient['createCallAgent']>): Promise<DeclarativeCallAgent> => {\n // createCallAgent will throw an exception if the previous callAgent was not disposed. If the previous\n // callAgent was disposed then it would have unsubscribed to events so we can just create a new declarative\n // callAgent if the createCallAgent succeeds.\n const callAgent = await target.createCallAgent(...args);\n this._callAgent = callAgentDeclaratify(callAgent, this._context, this._internalContext);\n this._context.setCallAgent({\n displayName: this._callAgent.displayName\n });\n return this._callAgent;\n },\n 'CallClient.createCallAgent'\n );\n }\n case 'createTeamsCallAgent': {\n /* @conditional-compile-remove(teams-identity-support) */ return this._context.withAsyncErrorTeedToState(\n async (...args: Parameters<CallClient['createTeamsCallAgent']>): Promise<DeclarativeTeamsCallAgent> => {\n // createCallAgent will throw an exception if the previous callAgent was not disposed. If the previous\n // callAgent was disposed then it would have unsubscribed to events so we can just create a new declarative\n // callAgent if the createCallAgent succeeds.\n const callAgent = await target.createTeamsCallAgent(...args);\n this._callAgent = teamsCallAgentDeclaratify(callAgent, this._context, this._internalContext);\n this._context.setCallAgent({\n displayName: undefined\n });\n return this._callAgent;\n },\n 'CallClient.createTeamsCallAgent'\n );\n return Reflect.get(target, prop);\n }\n case 'getDeviceManager': {\n return this._context.withAsyncErrorTeedToState(async () => {\n // As of writing, the SDK always returns the same instance of DeviceManager so we keep a reference of\n // DeviceManager and if it does not change we return the cached DeclarativeDeviceManager. If it does not we'll\n // throw an error that indicate we need to fix this issue as our implementation has diverged from the SDK.\n const deviceManager = await target.getDeviceManager();\n if (this._sdkDeviceManager) {\n if (this._sdkDeviceManager === deviceManager) {\n return this._deviceManager;\n } else {\n throw new Error(\n 'Multiple DeviceManager not supported. This means a incompatible version of communication-calling is ' +\n 'used OR calling declarative was not properly updated to communication-calling version.'\n );\n }\n } else {\n this._sdkDeviceManager = deviceManager;\n }\n this._deviceManager = deviceManagerDeclaratify(deviceManager, this._context, this._internalContext);\n return this._deviceManager;\n }, 'CallClient.getDeviceManager');\n }\n case 'feature': {\n /* @conditional-compile-remove(unsupported-browser) */\n return this._context.withErrorTeedToState((...args: Parameters<CallClient['feature']>) => {\n if (args[0] === Features.DebugInfo) {\n const feature = target.feature(Features.DebugInfo);\n /**\n * add to this object if we want to proxy anything else off the DebugInfo feature object.\n */\n return {\n ...feature,\n getEnvironmentInfo: async () => {\n const environmentInfo = await feature.getEnvironmentInfo();\n this._context.setEnvironmentInfo(environmentInfo);\n return environmentInfo;\n }\n };\n }\n return Reflect.get(target, prop);\n }, 'CallClient.feature');\n }\n default:\n return Reflect.get(target, prop);\n }\n }\n}\n\n/**\n * Arguments to construct the StatefulCallClient.\n *\n * @public\n */\nexport type StatefulCallClientArgs = {\n /**\n * UserId from SDK. This is provided for developer convenience to easily access the userId from the\n * state. It is not used by StatefulCallClient.\n */\n userId:\n | CommunicationUserIdentifier\n | /* @conditional-compile-remove(teams-identity-support) */ MicrosoftTeamsUserIdentifier;\n /* @conditional-compile-remove(PSTN-calls) */\n /**\n * A phone number in E.164 format that will be used to represent the callers identity. This number is required\n * to start a PSTN call.\n *\n * example: +11234567\n *\n * This is not a cached value from the headless calling client.\n */\n alternateCallerId?: string;\n};\n\n/**\n * Options to construct the StatefulCallClient with.\n *\n * @public\n */\nexport type StatefulCallClientOptions = {\n /**\n * Options to construct the {@link @axure/communication-calling#CallClient} with.\n */\n callClientOptions: CallClientOptions;\n /**\n * Sets the max listeners limit of the 'stateChange' event. Defaults to the node.js EventEmitter.defaultMaxListeners\n * if not specified.\n */\n maxStateChangeListeners?: number;\n};\n\n/**\n * Creates a StatefulCallClient {@link StatefulCallClient} by proxying CallClient\n * {@link @azure/communication-calling#CallClient} with ProxyCallClient {@link ProxyCallClient} which then allows access\n * to state in a declarative way.\n *\n * It is important to use the {@link @azure/communication-calling#DeviceManager} and\n * {@link @azure/communication-calling#CallAgent} and {@link @azure/communication-calling#Call} (and etc.) that are\n * obtained from the StatefulCallClient in order for their state changes to be proxied properly.\n *\n * @param args - {@link StatefulCallClientArgs}\n * @param options - {@link StatefulCallClientOptions}\n *\n * @public\n */\nexport const createStatefulCallClient = (\n args: StatefulCallClientArgs,\n options?: StatefulCallClientOptions\n): StatefulCallClient => {\n return _createStatefulCallClientInner(args, options);\n};\n\n/**\n * This inner function is used to allow injection of TelemetryImplementationHint without changing the public API.\n *\n * @internal\n */\nexport const _createStatefulCallClientInner = (\n args: StatefulCallClientArgs,\n options?: StatefulCallClientOptions,\n telemetryImplementationHint: _TelemetryImplementationHint = 'StatefulComponents'\n): StatefulCallClient => {\n callingStatefulLogger.info(\n `Creating calling stateful client using library version: ${_getApplicationId(telemetryImplementationHint)}`\n );\n return createStatefulCallClientWithDeps(\n new CallClient(withTelemetryTag(telemetryImplementationHint, options?.callClientOptions)),\n new CallContext(\n getIdentifierKind(args.userId),\n options?.maxStateChangeListeners,\n /* @conditional-compile-remove(PSTN-calls) */ args.alternateCallerId\n ),\n new InternalCallContext()\n );\n};\n\n/**\n * Package-internal version of createStatefulCallClient that allows dependency injection.\n *\n * This function should not be exported from the package.\n */\nexport const createStatefulCallClientWithDeps = (\n callClient: CallClient,\n context: CallContext,\n internalContext: InternalCallContext\n): StatefulCallClient => {\n Object.defineProperty(callClient, 'getState', {\n configurable: false,\n value: () => context.getState()\n });\n Object.defineProperty(callClient, 'onStateChange', {\n configurable: false,\n value: (handler: (state: CallClientState) => void) => context.onStateChange(handler)\n });\n Object.defineProperty(callClient, 'offStateChange', {\n configurable: false,\n value: (handler: (state: CallClientState) => void) => context.offStateChange(handler)\n });\n Object.defineProperty(callClient, 'createView', {\n configurable: false,\n value: async (\n callId: string | undefined,\n participantId: CommunicationIdentifier | undefined,\n stream: LocalVideoStreamState | RemoteVideoStreamState,\n options?: CreateViewOptions\n ): Promise<CreateViewResult | undefined> => {\n const participantIdKind = participantId ? getIdentifierKind(participantId) : undefined;\n const result = await createView(context, internalContext, callId, participantIdKind, stream, options);\n // We only need to declaratify the VideoStreamRendererView object for remote participants. Because the updateScalingMode only needs to be called on remote participant stream views.\n if ('id' in stream && callId && participantId && result) {\n const participantKey = toFlatCommunicationIdentifier(participantId);\n result.view = videoStreamRendererViewDeclaratify(result.view, context, callId, participantKey, stream.id);\n }\n return result;\n }\n });\n Object.defineProperty(callClient, 'disposeView', {\n configurable: false,\n value: (\n callId: string | undefined,\n participantId: CommunicationIdentifier | undefined,\n stream: LocalVideoStreamState | RemoteVideoStreamState\n ): void => {\n const participantIdKind = participantId ? getIdentifierKind(participantId) : undefined;\n disposeView(context, internalContext, callId, participantIdKind, stream);\n }\n });\n\n return new Proxy(callClient, new ProxyCallClient(context, internalContext)) as StatefulCallClient;\n};\n\nconst withTelemetryTag = (\n telemetryImplementationHint: _TelemetryImplementationHint,\n options?: CallClientOptions\n): CallClientOptions => {\n const tags = options?.diagnostics?.tags ?? [];\n tags.push(_getApplicationId(telemetryImplementationHint));\n return {\n ...options,\n diagnostics: {\n ...options?.diagnostics,\n tags\n }\n };\n};\n"]}
|
1
|
+
{"version":3,"file":"StatefulCallClient.js","sourceRoot":"","sources":["../../../../../calling-stateful-client/src/StatefulCallClient.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport { deviceManagerDeclaratify } from './DeviceManagerDeclarative';\nimport { CallClient, CallClientOptions, CreateViewOptions, DeviceManager } from '@azure/communication-calling';\n/* @conditional-compile-remove(unsupported-browser) */\nimport { Features } from '@azure/communication-calling';\nimport { CallClientState, LocalVideoStreamState, RemoteVideoStreamState } from './CallClientState';\nimport { CallContext } from './CallContext';\nimport { callAgentDeclaratify, DeclarativeCallAgent } from './CallAgentDeclarative';\nimport { InternalCallContext } from './InternalCallContext';\nimport { createView, disposeView, CreateViewResult } from './StreamUtils';\nimport { CommunicationIdentifier, CommunicationUserIdentifier, getIdentifierKind } from '@azure/communication-common';\nimport {\n toFlatCommunicationIdentifier,\n _getApplicationId,\n _TelemetryImplementationHint\n} from '@internal/acs-ui-common';\nimport { callingStatefulLogger } from './Logger';\n/* @conditional-compile-remove(teams-identity-support) */\nimport { DeclarativeTeamsCallAgent, teamsCallAgentDeclaratify } from './TeamsCallAgentDeclarative';\n/* @conditional-compile-remove(teams-identity-support) */\nimport { MicrosoftTeamsUserIdentifier } from '@azure/communication-common';\nimport { videoStreamRendererViewDeclaratify } from './VideoStreamRendererViewDeclarative';\n\n/**\n * Defines the methods that allow CallClient {@link @azure/communication-calling#CallClient} to be used statefully.\n * The interface provides access to proxied state and also allows registering a handler for state change events. For\n * state definition see {@link CallClientState}.\n *\n * State change events are driven by:\n * - Returned data from {@link @azure/communication-calling#DeviceManager} APIs.\n * - Returned data from {@link @azure/communication-calling#CallAgent} APIs.\n * - Listeners automatically attached to various azure communication-calling objects:\n * - CallAgent 'incomingCall'\n * - CallAgent 'callsUpdated'\n * - DeviceManager 'videoDevicesUpdated'\n * - DeviceManager 'audioDevicesUpdated\n * - DeviceManager 'selectedMicrophoneChanged'\n * - DeviceManager 'selectedSpeakerChanged'\n * - Call 'stateChanged'\n * - Call 'idChanged'\n * - Call 'isMutedChanged'\n * - Call 'isScreenSharingOnChanged'\n * - Call 'remoteParticipantsUpdated'\n * - Call 'localVideoStreamsUpdated'\n * - IncomingCall 'callEnded'\n * - RemoteParticipant 'stateChanged'\n * - RemoteParticipant 'isMutedChanged'\n * - RemoteParticipant 'displayNameChanged'\n * - RemoteParticipant 'isSpeakingChanged'\n * - RemoteParticipant 'videoStreamsUpdated'\n * - RemoteVideoStream 'isAvailableChanged'\n * - TranscriptionCallFeature 'isTranscriptionActiveChanged'\n * - RecordingCallFeature 'isRecordingActiveChanged'\n * - LocalRecordingCallFeature 'isLocalRecordingActiveChanged'\n * - RaiseHandCallFeature 'raisedHandEvent'\n * - RaiseHandCallFeature 'loweredHandEvent'\n * - PPTLiveCallFeature 'isAciveChanged'\n * - ReactionCallFeature 'reaction'\n *\n * @public\n */\nexport interface StatefulCallClient extends CallClient {\n /**\n * Holds all the state that we could proxy from CallClient {@link @azure/communication-calling#CallClient} as\n * CallClientState {@link CallClientState}.\n */\n getState(): CallClientState;\n /**\n * Allows a handler to be registered for 'stateChanged' events.\n *\n * @param handler - Callback to receive the state.\n */\n onStateChange(handler: (state: CallClientState) => void): void;\n /**\n * Allows unregistering for 'stateChanged' events.\n *\n * @param handler - Original callback to be unsubscribed.\n */\n offStateChange(handler: (state: CallClientState) => void): void;\n /**\n * Renders a {@link RemoteVideoStreamState} or {@link LocalVideoStreamState} and stores the resulting\n * {@link VideoStreamRendererViewState} under the relevant {@link RemoteVideoStreamState} or\n * {@link LocalVideoStreamState} or as unparented view in the state. Under the hood calls\n * {@link @azure/communication-calling#VideoStreamRenderer.createView}.\n *\n * Scenario 1: Render RemoteVideoStreamState\n * - CallId is required, participantId is required, and stream of type RemoteVideoStreamState is required\n * - Resulting {@link VideoStreamRendererViewState} is stored in the given callId and participantId in\n * {@link CallClientState}\n *\n * Scenario 2: Render LocalVideoStreamState for a call\n * - CallId is required, participantId must be undefined, and stream of type LocalVideoStreamState is required.\n * - The {@link @azure/communication-calling#Call.localVideoStreams} must already be started using\n * {@link @azure/communication-calling#Call.startVideo}.\n * - Resulting {@link VideoStreamRendererViewState} is stored in the given callId {@link CallState.localVideoStreams}\n * in {@link CallClientState}.\n *\n * - Scenario 2: Render LocalVideoStreamState not part of a call (example rendering camera for local preview)\n * - CallId must be undefined, participantId must be undefined, and stream of type LocalVideoStreamState is required.\n * - Resulting {@link VideoStreamRendererViewState} is stored in under the given LocalVideoStreamState in\n * {@link CallClientState.deviceManager.unparentedViews}\n *\n * @param callId - CallId for the given stream. Can be undefined if the stream is not part of any call.\n * @param participantId - {@link RemoteParticipant.identifier} associated with the given RemoteVideoStreamState. Could\n * be undefined if rendering LocalVideoStreamState.\n * @param stream - The LocalVideoStreamState or RemoteVideoStreamState to start rendering.\n * @param options - Options that are passed to the {@link @azure/communication-calling#VideoStreamRenderer}.\n */\n createView(\n callId: string | undefined,\n participantId: CommunicationIdentifier | undefined,\n stream: LocalVideoStreamState | RemoteVideoStreamState,\n options?: CreateViewOptions\n ): Promise<CreateViewResult | undefined>;\n /**\n * Stops rendering a {@link RemoteVideoStreamState} or {@link LocalVideoStreamState} and removes the\n * {@link VideoStreamRendererView} from the relevant {@link RemoteVideoStreamState} in {@link CallClientState} or\n * {@link LocalVideoStream} in {@link CallClientState} or appropriate\n * {@link CallClientState.deviceManager.unparentedViews} Under the hood calls\n * {@link @azure/communication-calling#VideoStreamRenderer.dispose}.\n *\n * Its important to disposeView to clean up resources properly.\n *\n * Scenario 1: Dispose RemoteVideoStreamState\n * - CallId is required, participantId is required, and stream of type RemoteVideoStreamState is required\n *\n * Scenario 2: Dispose LocalVideoStreamState for a call\n * - CallId is required, participantId must be undefined, and stream of type LocalVideoStreamState is required.\n *\n * - Scenario 2: Dispose LocalVideoStreamState not part of a call\n * - CallId must be undefined, participantId must be undefined, and stream of type LocalVideoStreamState is required.\n * - LocalVideoStreamState must be the original one passed to createView.\n *\n * @param callId - CallId for the given stream. Can be undefined if the stream is not part of any call.\n * @param participantId - {@link RemoteParticipant.identifier} associated with the given RemoteVideoStreamState. Could\n * be undefined if disposing LocalVideoStreamState.\n * @param stream - The LocalVideoStreamState or RemoteVideoStreamState to dispose.\n */\n disposeView(\n callId: string | undefined,\n participantId: CommunicationIdentifier | undefined,\n stream: LocalVideoStreamState | RemoteVideoStreamState\n ): void;\n\n /** @conditional-compile-remove(one-to-n-calling) */\n /**\n * The CallAgent is used to handle calls.\n * To create the CallAgent, pass a CommunicationTokenCredential object provided from SDK.\n * - The CallClient can only have one active CallAgent instance at a time.\n * - You can create a new CallClient instance to create a new CallAgent.\n * - You can dispose of a CallClient's current active CallAgent, and call the CallClient's\n * createCallAgent() method again to create a new CallAgent.\n * @param tokenCredential - The token credential. Use AzureCommunicationTokenCredential from `@azure/communication-common` to create a credential.\n * @param options - The CallAgentOptions for additional options like display name.\n * @public\n */\n createCallAgent(...args: Parameters<CallClient['createCallAgent']>): Promise<DeclarativeCallAgent>;\n}\n\n/**\n * A function to modify the state of the StatefulCallClient.\n *\n * Provided as a callback to the {@link StatefulCallClient.modifyState} method.\n *\n * The function must modify the provided state in place as much as possible.\n * Making large modifications can lead to bad performance by causing spurious rerendering of the UI.\n *\n * Consider using commonly used modifier functions exported from this package.\n */\nexport type CallStateModifier = (state: CallClientState) => void;\n\n/**\n * ProxyCallClient proxies CallClient {@link @azure/communication-calling#CallClient} and subscribes to all events that\n * affect state. ProxyCallClient keeps its own copy of the call state and when state is updated, ProxyCallClient emits\n * the event 'stateChanged'.\n */\nclass ProxyCallClient implements ProxyHandler<CallClient> {\n private _context: CallContext;\n private _internalContext: InternalCallContext;\n private _callAgent:\n | DeclarativeCallAgent\n | /* @conditional-compile-remove(teams-identity-support) */ DeclarativeTeamsCallAgent\n | undefined;\n private _deviceManager: DeviceManager | undefined;\n private _sdkDeviceManager: DeviceManager | undefined;\n\n constructor(context: CallContext, internalContext: InternalCallContext) {\n this._context = context;\n this._internalContext = internalContext;\n }\n\n public get<P extends keyof CallClient>(target: CallClient, prop: P): any {\n switch (prop) {\n case 'createCallAgent': {\n return this._context.withAsyncErrorTeedToState(\n async (...args: Parameters<CallClient['createCallAgent']>): Promise<DeclarativeCallAgent> => {\n // createCallAgent will throw an exception if the previous callAgent was not disposed. If the previous\n // callAgent was disposed then it would have unsubscribed to events so we can just create a new declarative\n // callAgent if the createCallAgent succeeds.\n const callAgent = await target.createCallAgent(...args);\n this._callAgent = callAgentDeclaratify(callAgent, this._context, this._internalContext);\n this._context.setCallAgent({\n displayName: this._callAgent.displayName\n });\n return this._callAgent;\n },\n 'CallClient.createCallAgent'\n );\n }\n case 'createTeamsCallAgent': {\n /* @conditional-compile-remove(teams-identity-support) */ return this._context.withAsyncErrorTeedToState(\n async (...args: Parameters<CallClient['createTeamsCallAgent']>): Promise<DeclarativeTeamsCallAgent> => {\n // createCallAgent will throw an exception if the previous callAgent was not disposed. If the previous\n // callAgent was disposed then it would have unsubscribed to events so we can just create a new declarative\n // callAgent if the createCallAgent succeeds.\n const callAgent = await target.createTeamsCallAgent(...args);\n this._callAgent = teamsCallAgentDeclaratify(callAgent, this._context, this._internalContext);\n this._context.setCallAgent({\n displayName: undefined\n });\n return this._callAgent;\n },\n 'CallClient.createTeamsCallAgent'\n );\n return Reflect.get(target, prop);\n }\n case 'getDeviceManager': {\n return this._context.withAsyncErrorTeedToState(async () => {\n // As of writing, the SDK always returns the same instance of DeviceManager so we keep a reference of\n // DeviceManager and if it does not change we return the cached DeclarativeDeviceManager. If it does not we'll\n // throw an error that indicate we need to fix this issue as our implementation has diverged from the SDK.\n const deviceManager = await target.getDeviceManager();\n if (this._sdkDeviceManager) {\n if (this._sdkDeviceManager === deviceManager) {\n return this._deviceManager;\n } else {\n throw new Error(\n 'Multiple DeviceManager not supported. This means a incompatible version of communication-calling is ' +\n 'used OR calling declarative was not properly updated to communication-calling version.'\n );\n }\n } else {\n this._sdkDeviceManager = deviceManager;\n }\n this._deviceManager = deviceManagerDeclaratify(deviceManager, this._context, this._internalContext);\n return this._deviceManager;\n }, 'CallClient.getDeviceManager');\n }\n case 'feature': {\n /* @conditional-compile-remove(unsupported-browser) */\n return this._context.withErrorTeedToState((...args: Parameters<CallClient['feature']>) => {\n if (args[0] === Features.DebugInfo) {\n const feature = target.feature(Features.DebugInfo);\n /**\n * add to this object if we want to proxy anything else off the DebugInfo feature object.\n */\n return {\n ...feature,\n getEnvironmentInfo: async () => {\n const environmentInfo = await feature.getEnvironmentInfo();\n this._context.setEnvironmentInfo(environmentInfo);\n return environmentInfo;\n }\n };\n }\n return Reflect.get(target, prop);\n }, 'CallClient.feature');\n }\n default:\n return Reflect.get(target, prop);\n }\n }\n}\n\n/**\n * Arguments to construct the StatefulCallClient.\n *\n * @public\n */\nexport type StatefulCallClientArgs = {\n /**\n * UserId from SDK. This is provided for developer convenience to easily access the userId from the\n * state. It is not used by StatefulCallClient.\n */\n userId:\n | CommunicationUserIdentifier\n | /* @conditional-compile-remove(teams-identity-support) */ MicrosoftTeamsUserIdentifier;\n /* @conditional-compile-remove(PSTN-calls) */\n /**\n * A phone number in E.164 format that will be used to represent the callers identity. This number is required\n * to start a PSTN call.\n *\n * example: +11234567\n *\n * This is not a cached value from the headless calling client.\n */\n alternateCallerId?: string;\n};\n\n/**\n * Options to construct the StatefulCallClient with.\n *\n * @public\n */\nexport type StatefulCallClientOptions = {\n /**\n * Options to construct the {@link @axure/communication-calling#CallClient} with.\n */\n callClientOptions: CallClientOptions;\n /**\n * Sets the max listeners limit of the 'stateChange' event. Defaults to the node.js EventEmitter.defaultMaxListeners\n * if not specified.\n */\n maxStateChangeListeners?: number;\n};\n\n/**\n * Creates a StatefulCallClient {@link StatefulCallClient} by proxying CallClient\n * {@link @azure/communication-calling#CallClient} with ProxyCallClient {@link ProxyCallClient} which then allows access\n * to state in a declarative way.\n *\n * It is important to use the {@link @azure/communication-calling#DeviceManager} and\n * {@link @azure/communication-calling#CallAgent} and {@link @azure/communication-calling#Call} (and etc.) that are\n * obtained from the StatefulCallClient in order for their state changes to be proxied properly.\n *\n * @param args - {@link StatefulCallClientArgs}\n * @param options - {@link StatefulCallClientOptions}\n *\n * @public\n */\nexport const createStatefulCallClient = (\n args: StatefulCallClientArgs,\n options?: StatefulCallClientOptions\n): StatefulCallClient => {\n return _createStatefulCallClientInner(args, options);\n};\n\n/**\n * This inner function is used to allow injection of TelemetryImplementationHint without changing the public API.\n *\n * @internal\n */\nexport const _createStatefulCallClientInner = (\n args: StatefulCallClientArgs,\n options?: StatefulCallClientOptions,\n telemetryImplementationHint: _TelemetryImplementationHint = 'StatefulComponents'\n): StatefulCallClient => {\n callingStatefulLogger.info(\n `Creating calling stateful client using library version: ${_getApplicationId(telemetryImplementationHint)}`\n );\n return createStatefulCallClientWithDeps(\n new CallClient(withTelemetryTag(telemetryImplementationHint, options?.callClientOptions)),\n new CallContext(\n getIdentifierKind(args.userId),\n options?.maxStateChangeListeners,\n /* @conditional-compile-remove(PSTN-calls) */ args.alternateCallerId\n ),\n new InternalCallContext()\n );\n};\n\n/**\n * Package-internal version of createStatefulCallClient that allows dependency injection.\n *\n * This function should not be exported from the package.\n */\nexport const createStatefulCallClientWithDeps = (\n callClient: CallClient,\n context: CallContext,\n internalContext: InternalCallContext\n): StatefulCallClient => {\n Object.defineProperty(callClient, 'getState', {\n configurable: false,\n value: () => context.getState()\n });\n Object.defineProperty(callClient, 'onStateChange', {\n configurable: false,\n value: (handler: (state: CallClientState) => void) => context.onStateChange(handler)\n });\n Object.defineProperty(callClient, 'offStateChange', {\n configurable: false,\n value: (handler: (state: CallClientState) => void) => context.offStateChange(handler)\n });\n Object.defineProperty(callClient, 'createView', {\n configurable: false,\n value: async (\n callId: string | undefined,\n participantId: CommunicationIdentifier | undefined,\n stream: LocalVideoStreamState | RemoteVideoStreamState,\n options?: CreateViewOptions\n ): Promise<CreateViewResult | undefined> => {\n const participantIdKind = participantId ? getIdentifierKind(participantId) : undefined;\n const result = await createView(context, internalContext, callId, participantIdKind, stream, options);\n // We only need to declaratify the VideoStreamRendererView object for remote participants. Because the updateScalingMode only needs to be called on remote participant stream views.\n if ('id' in stream && callId && participantId && result) {\n const participantKey = toFlatCommunicationIdentifier(participantId);\n result.view = videoStreamRendererViewDeclaratify(result.view, context, callId, participantKey, stream.id);\n }\n return result;\n }\n });\n Object.defineProperty(callClient, 'disposeView', {\n configurable: false,\n value: (\n callId: string | undefined,\n participantId: CommunicationIdentifier | undefined,\n stream: LocalVideoStreamState | RemoteVideoStreamState\n ): void => {\n const participantIdKind = participantId ? getIdentifierKind(participantId) : undefined;\n disposeView(context, internalContext, callId, participantIdKind, stream);\n }\n });\n\n return new Proxy(callClient, new ProxyCallClient(context, internalContext)) as StatefulCallClient;\n};\n\nconst withTelemetryTag = (\n telemetryImplementationHint: _TelemetryImplementationHint,\n options?: CallClientOptions\n): CallClientOptions => {\n const tags = options?.diagnostics?.tags ?? [];\n tags.push(_getApplicationId(telemetryImplementationHint));\n return {\n ...options,\n diagnostics: {\n ...options?.diagnostics,\n tags\n }\n };\n};\n"]}
|
@@ -15,4 +15,5 @@ export type { OptimalVideoCountFeatureState } from './CallClientState';
|
|
15
15
|
export type { PPTLiveCallFeatureState } from './CallClientState';
|
16
16
|
export type { ReactionState } from './CallClientState';
|
17
17
|
export type { SpotlightCallFeatureState, SpotlightState } from './CallClientState';
|
18
|
+
export type { LocalRecordingCallFeatureState } from './CallClientState';
|
18
19
|
//# sourceMappingURL=index-public.d.ts.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"index-public.js","sourceRoot":"","sources":["../../../../../calling-stateful-client/src/index-public.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAElC,OAAO,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nexport { createStatefulCallClient } from './StatefulCallClient';\nexport type { StatefulCallClient, StatefulCallClientArgs, StatefulCallClientOptions } from './StatefulCallClient';\nexport type { StatefulDeviceManager } from './DeviceManagerDeclarative';\nexport type {\n CallAgentState,\n CallClientState,\n CallError,\n CallErrors,\n CallErrorTarget,\n CallState,\n DeviceManagerState,\n DiagnosticsCallFeatureState,\n IncomingCallState,\n LocalVideoStreamState,\n MediaDiagnosticsState,\n NetworkDiagnosticsState,\n RecordingCallFeatureState as RecordingCallFeature,\n RemoteParticipantState,\n RemoteVideoStreamState,\n TranscriptionCallFeatureState as TranscriptionCallFeature,\n VideoStreamRendererViewState\n} from './CallClientState';\nexport type { CreateViewResult } from './StreamUtils';\
|
1
|
+
{"version":3,"file":"index-public.js","sourceRoot":"","sources":["../../../../../calling-stateful-client/src/index-public.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAElC,OAAO,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nexport { createStatefulCallClient } from './StatefulCallClient';\nexport type { StatefulCallClient, StatefulCallClientArgs, StatefulCallClientOptions } from './StatefulCallClient';\nexport type { StatefulDeviceManager } from './DeviceManagerDeclarative';\nexport type {\n CallAgentState,\n CallClientState,\n CallError,\n CallErrors,\n CallErrorTarget,\n CallState,\n DeviceManagerState,\n DiagnosticsCallFeatureState,\n IncomingCallState,\n LocalVideoStreamState,\n MediaDiagnosticsState,\n NetworkDiagnosticsState,\n RecordingCallFeatureState as RecordingCallFeature,\n RemoteParticipantState,\n RemoteVideoStreamState,\n TranscriptionCallFeatureState as TranscriptionCallFeature,\n VideoStreamRendererViewState\n} from './CallClientState';\nexport type { CreateViewResult } from './StreamUtils';\nexport type { RaiseHandCallFeatureState as RaiseHandCallFeature } from './CallClientState';\nexport type { RaisedHandState } from './CallClientState';\n/* @conditional-compile-remove(one-to-n-calling) */\nexport type { DeclarativeCallAgent, IncomingCallManagement } from './CallAgentDeclarative';\n/* @conditional-compile-remove(one-to-n-calling) */\nexport type { DeclarativeIncomingCall } from './IncomingCallDeclarative';\n/* @conditional-compile-remove(video-background-effects) */\nexport type { LocalVideoStreamVideoEffectsState } from './CallClientState';\n/* @conditional-compile-remove(capabilities) */\nexport type { CapabilitiesFeatureState } from './CallClientState';\n/* @conditional-compile-remove(close-captions) */\nexport type { CaptionsCallFeatureState, CaptionsInfo } from './CallClientState';\n/* @conditional-compile-remove(call-transfer) */\nexport type { AcceptedTransfer, TransferFeatureState as TransferFeature } from './CallClientState';\nexport type { OptimalVideoCountFeatureState } from './CallClientState';\n/* @conditional-compile-remove(ppt-live) */\nexport type { PPTLiveCallFeatureState } from './CallClientState';\n/* @conditional-compile-remove(reaction) */\nexport type { ReactionState } from './CallClientState';\n/* @conditional-compile-remove(spotlight) */\nexport type { SpotlightCallFeatureState, SpotlightState } from './CallClientState';\n/* @conditional-compile-remove(local-recording-notification) */\nexport type { LocalRecordingCallFeatureState } from './CallClientState';\n"]}
|
@@ -133,7 +133,7 @@ const generateImageAttachmentImgHtml = (message, attachment) => {
|
|
133
133
|
const getResourceSourceUrl = (result) => {
|
134
134
|
let src = '';
|
135
135
|
if (result) {
|
136
|
-
if (result.error) {
|
136
|
+
if (result.error || !result.sourceUrl) {
|
137
137
|
// In case of an error we set src to some invalid value to show broken image
|
138
138
|
src = 'blob://';
|
139
139
|
}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"messageThreadSelector.js","sourceRoot":"","sources":["../../../../../chat-component-bindings/src/messageThreadSelector.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport {\n ChatBaseSelectorProps,\n getChatMessages,\n getIsLargeGroup,\n getLatestReadTime,\n getParticipants,\n getReadReceipts,\n getUserId\n} from './baseSelectors';\nimport { toFlatCommunicationIdentifier } from '@internal/acs-ui-common';\nimport { ChatClientState, ChatMessageWithStatus, ResourceFetchResult } from '@internal/chat-stateful-client';\nimport { memoizeFnAll } from '@internal/acs-ui-common';\nimport {\n ChatMessage,\n Message,\n CommunicationParticipant,\n SystemMessage,\n MessageContentType,\n ReadReceiptsBySenderId\n} from '@internal/react-components';\n/* @conditional-compile-remove(data-loss-prevention) */\nimport { BlockedMessage } from '@internal/react-components';\nimport { createSelector } from 'reselect';\n/* @conditional-compile-remove(data-loss-prevention) */\nimport { DEFAULT_DATA_LOSS_PREVENTION_POLICY_URL } from './utils/constants';\nimport { ACSKnownMessageType } from './utils/constants';\nimport { updateMessagesWithAttached } from './utils/updateMessagesWithAttached';\n/* @conditional-compile-remove(file-sharing) */\nimport { AttachmentMetadata } from '@internal/react-components';\nimport { ChatAttachment } from '@azure/communication-chat';\nimport type { ChatParticipant } from '@azure/communication-chat';\n/* @conditional-compile-remove(file-sharing) */\nimport { ChatAttachmentType } from '@internal/react-components';\n\nconst memoizedAllConvertChatMessage = memoizeFnAll(\n (\n _key: string,\n chatMessage: ChatMessageWithStatus,\n userId: string,\n isSeen: boolean,\n isLargeGroup: boolean\n ): Message => {\n const messageType = chatMessage.type.toLowerCase();\n /* @conditional-compile-remove(data-loss-prevention) */\n if (chatMessage.policyViolation) {\n return convertToUiBlockedMessage(chatMessage, userId, isSeen, isLargeGroup);\n }\n if (\n messageType === ACSKnownMessageType.text ||\n messageType === ACSKnownMessageType.richtextHtml ||\n messageType === ACSKnownMessageType.html\n ) {\n return convertToUiChatMessage(chatMessage, userId, isSeen, isLargeGroup);\n } else {\n return convertToUiSystemMessage(chatMessage);\n }\n }\n);\n\n/* @conditional-compile-remove(file-sharing) */\nconst extractAttachedFilesMetadata = (metadata: Record<string, string>): AttachmentMetadata[] => {\n const fileMetadata = metadata.fileSharingMetadata;\n if (!fileMetadata) {\n return [];\n }\n try {\n return JSON.parse(fileMetadata);\n } catch (e) {\n console.error(e);\n return [];\n }\n};\n/* @conditional-compile-remove(file-sharing) */\nconst extractTeamsAttachmentsMetadata = (\n attachments: ChatAttachment[]\n): {\n /* @conditional-compile-remove(file-sharing) */ files: AttachmentMetadata[];\n} => {\n /* @conditional-compile-remove(file-sharing) */\n const files: AttachmentMetadata[] = [];\n attachments.forEach((attachment) => {\n const attachmentType = attachment.attachmentType as ChatAttachmentType;\n /* @conditional-compile-remove(file-sharing) */\n const contentType = extractAttachmentContentTypeFromName(attachment.name);\n /* @conditional-compile-remove(file-sharing) */\n if (attachmentType === 'file') {\n files.push({\n id: attachment.id,\n name: attachment.name ?? '',\n extension: contentType ?? '',\n url: extractAttachmentUrl(attachment),\n payload: { teamsFileAttachment: 'true' }\n });\n }\n });\n return {\n /* @conditional-compile-remove(file-sharing) */ files\n };\n};\n\n/* @conditional-compile-remove(data-loss-prevention) */\nconst convertToUiBlockedMessage = (\n message: ChatMessageWithStatus,\n userId: string,\n isSeen: boolean,\n isLargeGroup: boolean\n): BlockedMessage => {\n const messageSenderId = message.sender !== undefined ? toFlatCommunicationIdentifier(message.sender) : userId;\n return {\n messageType: 'blocked',\n createdOn: message.createdOn,\n warningText: undefined,\n status: !isLargeGroup && message.status === 'delivered' && isSeen ? 'seen' : message.status,\n senderDisplayName: message.senderDisplayName,\n senderId: messageSenderId,\n messageId: message.id,\n deletedOn: message.deletedOn,\n mine: messageSenderId === userId,\n link: DEFAULT_DATA_LOSS_PREVENTION_POLICY_URL\n };\n};\n\n/* @conditional-compile-remove(file-sharing) */\nconst extractAttachmentUrl = (attachment: ChatAttachment): string => {\n return attachment.previewUrl ? attachment.previewUrl : attachment.url || '';\n};\nconst processChatMessageContent = (message: ChatMessageWithStatus): string | undefined => {\n let content = message.content?.message;\n /* @conditional-compile-remove(teams-inline-images-and-file-sharing) */\n\n if (\n message.content?.attachments &&\n message.content?.attachments.length > 0 &&\n sanitizedMessageContentType(message.type).includes('html')\n ) {\n const attachments: ChatAttachment[] = message.content?.attachments;\n // Fill in the src here\n /* @conditional-compile-remove(teams-inline-images-and-file-sharing) */\n if (content) {\n const document = new DOMParser().parseFromString(content ?? '', 'text/html');\n document.querySelectorAll('img').forEach((img) => {\n const attachmentPreviewUrl = attachments.find((attachment) => attachment.id === img.id)?.previewUrl;\n if (attachmentPreviewUrl) {\n const resourceCache = message.resourceCache?.[attachmentPreviewUrl];\n img.src = getResourceSourceUrl(resourceCache);\n }\n });\n content = document.body.innerHTML;\n }\n\n const teamsImageHtmlContent = attachments\n .filter(\n (attachment) =>\n attachment.attachmentType === 'image' &&\n attachment.previewUrl !== undefined &&\n !message.content?.message?.includes(attachment.id)\n )\n .map((attachment) => generateImageAttachmentImgHtml(message, attachment))\n .join('');\n if (teamsImageHtmlContent) {\n return (content ?? '') + teamsImageHtmlContent;\n }\n }\n return content;\n};\n\n/* @conditional-compile-remove(teams-inline-images-and-file-sharing) */\nconst generateImageAttachmentImgHtml = (message: ChatMessageWithStatus, attachment: ChatAttachment): string => {\n if (attachment.previewUrl !== undefined) {\n const contentType = extractAttachmentContentTypeFromName(attachment.name);\n const resourceCache = message.resourceCache?.[attachment.previewUrl];\n const src = getResourceSourceUrl(resourceCache);\n\n return `\\r\\n<p><img alt=\"image\" src=\"${src}\" itemscope=\"${contentType}\" id=\"${attachment.id}\"></p>`;\n }\n\n return '';\n};\n\n/* @conditional-compile-remove(teams-inline-images-and-file-sharing) */\nconst getResourceSourceUrl = (result?: ResourceFetchResult): string => {\n let src = '';\n if (result) {\n if (result.error) {\n // In case of an error we set src to some invalid value to show broken image\n src = 'blob://';\n } else {\n src = result.sourceUrl;\n }\n }\n return src;\n};\n\n/* @conditional-compile-remove(teams-inline-images-and-file-sharing) */\nconst extractAttachmentContentTypeFromName = (name?: string): string => {\n if (name === undefined) {\n return '';\n }\n const indexOfLastDot = name.lastIndexOf('.');\n if (indexOfLastDot === undefined || indexOfLastDot < 0) {\n return '';\n }\n const contentType = name.substring(indexOfLastDot + 1);\n return contentType;\n};\n\n/* @conditional-compile-remove(file-sharing) */\nconst extractAttachmentsMetadata = (message: ChatMessageWithStatus): { files: AttachmentMetadata[] } => {\n let files: AttachmentMetadata[] = [];\n if (message.metadata) {\n files = files.concat(extractAttachedFilesMetadata(message.metadata));\n }\n if (message.content?.attachments) {\n const teamsAttachments = extractTeamsAttachmentsMetadata(message.content?.attachments);\n files = files.concat(teamsAttachments.files);\n }\n return { files };\n};\nconst convertToUiChatMessage = (\n message: ChatMessageWithStatus,\n userId: string,\n isSeen: boolean,\n isLargeGroup: boolean\n): ChatMessage => {\n const messageSenderId = message.sender !== undefined ? toFlatCommunicationIdentifier(message.sender) : userId;\n /* @conditional-compile-remove(file-sharing) */\n const { files } = extractAttachmentsMetadata(message);\n return {\n messageType: 'chat',\n createdOn: message.createdOn,\n content: processChatMessageContent(message),\n contentType: sanitizedMessageContentType(message.type),\n status: !isLargeGroup && message.status === 'delivered' && isSeen ? 'seen' : message.status,\n senderDisplayName: message.senderDisplayName,\n senderId: messageSenderId,\n messageId: message.id,\n clientMessageId: message.clientMessageId,\n editedOn: message.editedOn,\n deletedOn: message.deletedOn,\n mine: messageSenderId === userId,\n metadata: message.metadata,\n /* @conditional-compile-remove(file-sharing) */\n files\n };\n};\nconst convertToUiSystemMessage = (message: ChatMessageWithStatus): SystemMessage => {\n const systemMessageType = message.type;\n if (systemMessageType === 'participantAdded' || systemMessageType === 'participantRemoved') {\n return {\n messageType: 'system',\n systemMessageType,\n createdOn: message.createdOn,\n participants:\n message.content?.participants\n // TODO: In our moderator logic, we use undefined name as our displayName for moderator, which should be filtered out\n // Once we have a better solution to identify the moderator, remove this line\n ?.filter((participant: ChatParticipant) => participant.displayName && participant.displayName !== '')\n .map(\n (participant: ChatParticipant): CommunicationParticipant => ({\n userId: toFlatCommunicationIdentifier(participant.id),\n displayName: participant.displayName\n })\n ) ?? [],\n messageId: message.id,\n iconName: systemMessageType === 'participantAdded' ? 'PeopleAdd' : 'PeopleBlock'\n };\n } else {\n // Only topic updated type left, according to ACSKnown type\n return {\n messageType: 'system',\n systemMessageType: 'topicUpdated',\n createdOn: message.createdOn,\n topic: message.content?.topic ?? '',\n messageId: message.id,\n iconName: 'Edit'\n };\n }\n};\n\n/**\n * Selector type for {@link MessageThread} component.\n *\n * @public\n */\nexport type MessageThreadSelector = (\n state: ChatClientState,\n props: ChatBaseSelectorProps\n) => {\n userId: string;\n showMessageStatus: boolean;\n messages: Message[];\n};\n\n/** Returns `true` if the message has participants and at least one participant has a display name. */\nconst hasValidParticipant = (chatMessage: ChatMessageWithStatus): boolean =>\n !!chatMessage.content?.participants && chatMessage.content.participants.some((p: ChatParticipant) => !!p.displayName);\n\n/**\n *\n * @private\n */\nexport const messageThreadSelectorWithThread: () => MessageThreadSelector = () =>\n createSelector(\n [getUserId, getChatMessages, getLatestReadTime, getIsLargeGroup, getReadReceipts, getParticipants],\n (userId, chatMessages, latestReadTime, isLargeGroup, readReceipts, participants) => {\n // We can't get displayName in teams meeting interop for now, disable rr feature when it is teams interop\n const isTeamsInterop = Object.values(participants).find((p) => 'microsoftTeamsUserId' in p.id) !== undefined;\n\n // get number of participants\n // filter out the non valid participants (no display name)\n // Read Receipt details will be disabled when participant count is 0\n const participantCount = isTeamsInterop\n ? undefined\n : Object.values(participants).filter((p) => p.displayName && p.displayName !== '').length;\n\n // creating key value pairs of senderID: last read message information\n\n const readReceiptsBySenderId: ReadReceiptsBySenderId = {};\n\n // readReceiptsBySenderId[senderID] gets updated every time a new message is read by this sender\n // in this way we can make sure that we are only saving the latest read message id and read on time for each sender\n readReceipts\n .filter((r) => r.sender && toFlatCommunicationIdentifier(r.sender) !== userId)\n .forEach((r) => {\n readReceiptsBySenderId[toFlatCommunicationIdentifier(r.sender)] = {\n lastReadMessage: r.chatMessageId,\n displayName: participants[toFlatCommunicationIdentifier(r.sender)]?.displayName ?? ''\n };\n });\n\n // A function takes parameter above and generate return value\n const convertedMessages = memoizedAllConvertChatMessage((memoizedFn) =>\n Object.values(chatMessages)\n .filter(\n (message) =>\n message.type.toLowerCase() === ACSKnownMessageType.text ||\n message.type.toLowerCase() === ACSKnownMessageType.richtextHtml ||\n message.type.toLowerCase() === ACSKnownMessageType.html ||\n (message.type === ACSKnownMessageType.participantAdded && hasValidParticipant(message)) ||\n (message.type === ACSKnownMessageType.participantRemoved && hasValidParticipant(message)) ||\n // TODO: Add support for topicUpdated system messages in MessageThread component.\n // message.type === ACSKnownMessageType.topicUpdated ||\n message.clientMessageId !== undefined\n )\n .filter(isMessageValidToRender)\n .map((message) => {\n return memoizedFn(\n message.id ?? message.clientMessageId,\n message,\n userId,\n message.createdOn <= latestReadTime,\n isLargeGroup\n );\n })\n );\n updateMessagesWithAttached(convertedMessages);\n return {\n userId,\n showMessageStatus: true,\n messages: convertedMessages,\n participantCount,\n readReceiptsBySenderId\n };\n }\n );\nconst sanitizedMessageContentType = (type: string): MessageContentType => {\n const lowerCaseType = type.toLowerCase();\n return lowerCaseType === 'text' || lowerCaseType === 'html' || lowerCaseType === 'richtext/html'\n ? lowerCaseType\n : 'unknown';\n};\nconst isMessageValidToRender = (message: ChatMessageWithStatus): boolean => {\n if (message.deletedOn) {\n return false;\n }\n if (\n message.metadata?.fileSharingMetadata ||\n /* @conditional-compile-remove(teams-inline-images-and-file-sharing) */ message.content?.attachments\n ) {\n return true;\n }\n /* @conditional-compile-remove(data-loss-prevention) */\n if (message.policyViolation) {\n return true;\n }\n return !!(message.content && message.content?.message !== '');\n};\n\n/**\n * Selector for {@link MessageThread} component.\n *\n * @public\n */\nexport const messageThreadSelector: MessageThreadSelector = messageThreadSelectorWithThread();\n"]}
|
1
|
+
{"version":3,"file":"messageThreadSelector.js","sourceRoot":"","sources":["../../../../../chat-component-bindings/src/messageThreadSelector.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport {\n ChatBaseSelectorProps,\n getChatMessages,\n getIsLargeGroup,\n getLatestReadTime,\n getParticipants,\n getReadReceipts,\n getUserId\n} from './baseSelectors';\nimport { toFlatCommunicationIdentifier } from '@internal/acs-ui-common';\nimport { ChatClientState, ChatMessageWithStatus, ResourceFetchResult } from '@internal/chat-stateful-client';\nimport { memoizeFnAll } from '@internal/acs-ui-common';\nimport {\n ChatMessage,\n Message,\n CommunicationParticipant,\n SystemMessage,\n MessageContentType,\n ReadReceiptsBySenderId\n} from '@internal/react-components';\n/* @conditional-compile-remove(data-loss-prevention) */\nimport { BlockedMessage } from '@internal/react-components';\nimport { createSelector } from 'reselect';\n/* @conditional-compile-remove(data-loss-prevention) */\nimport { DEFAULT_DATA_LOSS_PREVENTION_POLICY_URL } from './utils/constants';\nimport { ACSKnownMessageType } from './utils/constants';\nimport { updateMessagesWithAttached } from './utils/updateMessagesWithAttached';\n/* @conditional-compile-remove(file-sharing) */\nimport { AttachmentMetadata } from '@internal/react-components';\nimport { ChatAttachment } from '@azure/communication-chat';\nimport type { ChatParticipant } from '@azure/communication-chat';\n/* @conditional-compile-remove(file-sharing) */\nimport { ChatAttachmentType } from '@internal/react-components';\n\nconst memoizedAllConvertChatMessage = memoizeFnAll(\n (\n _key: string,\n chatMessage: ChatMessageWithStatus,\n userId: string,\n isSeen: boolean,\n isLargeGroup: boolean\n ): Message => {\n const messageType = chatMessage.type.toLowerCase();\n /* @conditional-compile-remove(data-loss-prevention) */\n if (chatMessage.policyViolation) {\n return convertToUiBlockedMessage(chatMessage, userId, isSeen, isLargeGroup);\n }\n if (\n messageType === ACSKnownMessageType.text ||\n messageType === ACSKnownMessageType.richtextHtml ||\n messageType === ACSKnownMessageType.html\n ) {\n return convertToUiChatMessage(chatMessage, userId, isSeen, isLargeGroup);\n } else {\n return convertToUiSystemMessage(chatMessage);\n }\n }\n);\n\n/* @conditional-compile-remove(file-sharing) */\nconst extractAttachedFilesMetadata = (metadata: Record<string, string>): AttachmentMetadata[] => {\n const fileMetadata = metadata.fileSharingMetadata;\n if (!fileMetadata) {\n return [];\n }\n try {\n return JSON.parse(fileMetadata);\n } catch (e) {\n console.error(e);\n return [];\n }\n};\n/* @conditional-compile-remove(file-sharing) */\nconst extractTeamsAttachmentsMetadata = (\n attachments: ChatAttachment[]\n): {\n /* @conditional-compile-remove(file-sharing) */ files: AttachmentMetadata[];\n} => {\n /* @conditional-compile-remove(file-sharing) */\n const files: AttachmentMetadata[] = [];\n attachments.forEach((attachment) => {\n const attachmentType = attachment.attachmentType as ChatAttachmentType;\n /* @conditional-compile-remove(file-sharing) */\n const contentType = extractAttachmentContentTypeFromName(attachment.name);\n /* @conditional-compile-remove(file-sharing) */\n if (attachmentType === 'file') {\n files.push({\n id: attachment.id,\n name: attachment.name ?? '',\n extension: contentType ?? '',\n url: extractAttachmentUrl(attachment),\n payload: { teamsFileAttachment: 'true' }\n });\n }\n });\n return {\n /* @conditional-compile-remove(file-sharing) */ files\n };\n};\n\n/* @conditional-compile-remove(data-loss-prevention) */\nconst convertToUiBlockedMessage = (\n message: ChatMessageWithStatus,\n userId: string,\n isSeen: boolean,\n isLargeGroup: boolean\n): BlockedMessage => {\n const messageSenderId = message.sender !== undefined ? toFlatCommunicationIdentifier(message.sender) : userId;\n return {\n messageType: 'blocked',\n createdOn: message.createdOn,\n warningText: undefined,\n status: !isLargeGroup && message.status === 'delivered' && isSeen ? 'seen' : message.status,\n senderDisplayName: message.senderDisplayName,\n senderId: messageSenderId,\n messageId: message.id,\n deletedOn: message.deletedOn,\n mine: messageSenderId === userId,\n link: DEFAULT_DATA_LOSS_PREVENTION_POLICY_URL\n };\n};\n\n/* @conditional-compile-remove(file-sharing) */\nconst extractAttachmentUrl = (attachment: ChatAttachment): string => {\n return attachment.previewUrl ? attachment.previewUrl : attachment.url || '';\n};\nconst processChatMessageContent = (message: ChatMessageWithStatus): string | undefined => {\n let content = message.content?.message;\n /* @conditional-compile-remove(teams-inline-images-and-file-sharing) */\n\n if (\n message.content?.attachments &&\n message.content?.attachments.length > 0 &&\n sanitizedMessageContentType(message.type).includes('html')\n ) {\n const attachments: ChatAttachment[] = message.content?.attachments;\n // Fill in the src here\n /* @conditional-compile-remove(teams-inline-images-and-file-sharing) */\n if (content) {\n const document = new DOMParser().parseFromString(content ?? '', 'text/html');\n document.querySelectorAll('img').forEach((img) => {\n const attachmentPreviewUrl = attachments.find((attachment) => attachment.id === img.id)?.previewUrl;\n if (attachmentPreviewUrl) {\n const resourceCache = message.resourceCache?.[attachmentPreviewUrl];\n img.src = getResourceSourceUrl(resourceCache);\n }\n });\n content = document.body.innerHTML;\n }\n\n const teamsImageHtmlContent = attachments\n .filter(\n (attachment) =>\n attachment.attachmentType === 'image' &&\n attachment.previewUrl !== undefined &&\n !message.content?.message?.includes(attachment.id)\n )\n .map((attachment) => generateImageAttachmentImgHtml(message, attachment))\n .join('');\n if (teamsImageHtmlContent) {\n return (content ?? '') + teamsImageHtmlContent;\n }\n }\n return content;\n};\n\n/* @conditional-compile-remove(teams-inline-images-and-file-sharing) */\nconst generateImageAttachmentImgHtml = (message: ChatMessageWithStatus, attachment: ChatAttachment): string => {\n if (attachment.previewUrl !== undefined) {\n const contentType = extractAttachmentContentTypeFromName(attachment.name);\n const resourceCache = message.resourceCache?.[attachment.previewUrl];\n const src = getResourceSourceUrl(resourceCache);\n\n return `\\r\\n<p><img alt=\"image\" src=\"${src}\" itemscope=\"${contentType}\" id=\"${attachment.id}\"></p>`;\n }\n\n return '';\n};\n\n/* @conditional-compile-remove(teams-inline-images-and-file-sharing) */\nconst getResourceSourceUrl = (result?: ResourceFetchResult): string => {\n let src = '';\n if (result) {\n if (result.error || !result.sourceUrl) {\n // In case of an error we set src to some invalid value to show broken image\n src = 'blob://';\n } else {\n src = result.sourceUrl;\n }\n }\n return src;\n};\n\n/* @conditional-compile-remove(teams-inline-images-and-file-sharing) */\nconst extractAttachmentContentTypeFromName = (name?: string): string => {\n if (name === undefined) {\n return '';\n }\n const indexOfLastDot = name.lastIndexOf('.');\n if (indexOfLastDot === undefined || indexOfLastDot < 0) {\n return '';\n }\n const contentType = name.substring(indexOfLastDot + 1);\n return contentType;\n};\n\n/* @conditional-compile-remove(file-sharing) */\nconst extractAttachmentsMetadata = (message: ChatMessageWithStatus): { files: AttachmentMetadata[] } => {\n let files: AttachmentMetadata[] = [];\n if (message.metadata) {\n files = files.concat(extractAttachedFilesMetadata(message.metadata));\n }\n if (message.content?.attachments) {\n const teamsAttachments = extractTeamsAttachmentsMetadata(message.content?.attachments);\n files = files.concat(teamsAttachments.files);\n }\n return { files };\n};\nconst convertToUiChatMessage = (\n message: ChatMessageWithStatus,\n userId: string,\n isSeen: boolean,\n isLargeGroup: boolean\n): ChatMessage => {\n const messageSenderId = message.sender !== undefined ? toFlatCommunicationIdentifier(message.sender) : userId;\n /* @conditional-compile-remove(file-sharing) */\n const { files } = extractAttachmentsMetadata(message);\n return {\n messageType: 'chat',\n createdOn: message.createdOn,\n content: processChatMessageContent(message),\n contentType: sanitizedMessageContentType(message.type),\n status: !isLargeGroup && message.status === 'delivered' && isSeen ? 'seen' : message.status,\n senderDisplayName: message.senderDisplayName,\n senderId: messageSenderId,\n messageId: message.id,\n clientMessageId: message.clientMessageId,\n editedOn: message.editedOn,\n deletedOn: message.deletedOn,\n mine: messageSenderId === userId,\n metadata: message.metadata,\n /* @conditional-compile-remove(file-sharing) */\n files\n };\n};\nconst convertToUiSystemMessage = (message: ChatMessageWithStatus): SystemMessage => {\n const systemMessageType = message.type;\n if (systemMessageType === 'participantAdded' || systemMessageType === 'participantRemoved') {\n return {\n messageType: 'system',\n systemMessageType,\n createdOn: message.createdOn,\n participants:\n message.content?.participants\n // TODO: In our moderator logic, we use undefined name as our displayName for moderator, which should be filtered out\n // Once we have a better solution to identify the moderator, remove this line\n ?.filter((participant: ChatParticipant) => participant.displayName && participant.displayName !== '')\n .map(\n (participant: ChatParticipant): CommunicationParticipant => ({\n userId: toFlatCommunicationIdentifier(participant.id),\n displayName: participant.displayName\n })\n ) ?? [],\n messageId: message.id,\n iconName: systemMessageType === 'participantAdded' ? 'PeopleAdd' : 'PeopleBlock'\n };\n } else {\n // Only topic updated type left, according to ACSKnown type\n return {\n messageType: 'system',\n systemMessageType: 'topicUpdated',\n createdOn: message.createdOn,\n topic: message.content?.topic ?? '',\n messageId: message.id,\n iconName: 'Edit'\n };\n }\n};\n\n/**\n * Selector type for {@link MessageThread} component.\n *\n * @public\n */\nexport type MessageThreadSelector = (\n state: ChatClientState,\n props: ChatBaseSelectorProps\n) => {\n userId: string;\n showMessageStatus: boolean;\n messages: Message[];\n};\n\n/** Returns `true` if the message has participants and at least one participant has a display name. */\nconst hasValidParticipant = (chatMessage: ChatMessageWithStatus): boolean =>\n !!chatMessage.content?.participants && chatMessage.content.participants.some((p: ChatParticipant) => !!p.displayName);\n\n/**\n *\n * @private\n */\nexport const messageThreadSelectorWithThread: () => MessageThreadSelector = () =>\n createSelector(\n [getUserId, getChatMessages, getLatestReadTime, getIsLargeGroup, getReadReceipts, getParticipants],\n (userId, chatMessages, latestReadTime, isLargeGroup, readReceipts, participants) => {\n // We can't get displayName in teams meeting interop for now, disable rr feature when it is teams interop\n const isTeamsInterop = Object.values(participants).find((p) => 'microsoftTeamsUserId' in p.id) !== undefined;\n\n // get number of participants\n // filter out the non valid participants (no display name)\n // Read Receipt details will be disabled when participant count is 0\n const participantCount = isTeamsInterop\n ? undefined\n : Object.values(participants).filter((p) => p.displayName && p.displayName !== '').length;\n\n // creating key value pairs of senderID: last read message information\n\n const readReceiptsBySenderId: ReadReceiptsBySenderId = {};\n\n // readReceiptsBySenderId[senderID] gets updated every time a new message is read by this sender\n // in this way we can make sure that we are only saving the latest read message id and read on time for each sender\n readReceipts\n .filter((r) => r.sender && toFlatCommunicationIdentifier(r.sender) !== userId)\n .forEach((r) => {\n readReceiptsBySenderId[toFlatCommunicationIdentifier(r.sender)] = {\n lastReadMessage: r.chatMessageId,\n displayName: participants[toFlatCommunicationIdentifier(r.sender)]?.displayName ?? ''\n };\n });\n\n // A function takes parameter above and generate return value\n const convertedMessages = memoizedAllConvertChatMessage((memoizedFn) =>\n Object.values(chatMessages)\n .filter(\n (message) =>\n message.type.toLowerCase() === ACSKnownMessageType.text ||\n message.type.toLowerCase() === ACSKnownMessageType.richtextHtml ||\n message.type.toLowerCase() === ACSKnownMessageType.html ||\n (message.type === ACSKnownMessageType.participantAdded && hasValidParticipant(message)) ||\n (message.type === ACSKnownMessageType.participantRemoved && hasValidParticipant(message)) ||\n // TODO: Add support for topicUpdated system messages in MessageThread component.\n // message.type === ACSKnownMessageType.topicUpdated ||\n message.clientMessageId !== undefined\n )\n .filter(isMessageValidToRender)\n .map((message) => {\n return memoizedFn(\n message.id ?? message.clientMessageId,\n message,\n userId,\n message.createdOn <= latestReadTime,\n isLargeGroup\n );\n })\n );\n updateMessagesWithAttached(convertedMessages);\n return {\n userId,\n showMessageStatus: true,\n messages: convertedMessages,\n participantCount,\n readReceiptsBySenderId\n };\n }\n );\nconst sanitizedMessageContentType = (type: string): MessageContentType => {\n const lowerCaseType = type.toLowerCase();\n return lowerCaseType === 'text' || lowerCaseType === 'html' || lowerCaseType === 'richtext/html'\n ? lowerCaseType\n : 'unknown';\n};\nconst isMessageValidToRender = (message: ChatMessageWithStatus): boolean => {\n if (message.deletedOn) {\n return false;\n }\n if (\n message.metadata?.fileSharingMetadata ||\n /* @conditional-compile-remove(teams-inline-images-and-file-sharing) */ message.content?.attachments\n ) {\n return true;\n }\n /* @conditional-compile-remove(data-loss-prevention) */\n if (message.policyViolation) {\n return true;\n }\n return !!(message.content && message.content?.message !== '');\n};\n\n/**\n * Selector for {@link MessageThread} component.\n *\n * @public\n */\nexport const messageThreadSelector: MessageThreadSelector = messageThreadSelectorWithThread();\n"]}
|
@@ -79,7 +79,9 @@ export class ChatContext {
|
|
79
79
|
if (cache) {
|
80
80
|
Object.keys(cache).forEach((resourceUrl) => {
|
81
81
|
const resource = cache[resourceUrl];
|
82
|
-
|
82
|
+
if (resource.sourceUrl) {
|
83
|
+
URL.revokeObjectURL(resource.sourceUrl);
|
84
|
+
}
|
83
85
|
});
|
84
86
|
}
|
85
87
|
thread.chatMessages[messageId].resourceCache = undefined;
|
@@ -120,7 +122,9 @@ export class ChatContext {
|
|
120
122
|
}
|
121
123
|
if (message && message.resourceCache && message.resourceCache[resourceUrl]) {
|
122
124
|
const resource = message.resourceCache[resourceUrl];
|
123
|
-
|
125
|
+
if (resource.sourceUrl) {
|
126
|
+
URL.revokeObjectURL(resource.sourceUrl);
|
127
|
+
}
|
124
128
|
delete message.resourceCache[resourceUrl];
|
125
129
|
}
|
126
130
|
});
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"ChatContext.js","sourceRoot":"","sources":["../../../../../chat-stateful-client/src/ChatContext.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport EventEmitter from 'events';\nimport { enableMapSet, enablePatches, produce, Patch } from 'immer';\nimport {\n ChatClientState,\n ChatErrors,\n ChatThreadClientState,\n ChatThreadProperties,\n ChatErrorTarget,\n ChatError\n} from './ChatClientState';\nimport { ChatMessageWithStatus } from './types/ChatMessageWithStatus';\nimport { ChatMessageReadReceipt, ChatParticipant } from '@azure/communication-chat';\nimport { CommunicationIdentifierKind, UnknownIdentifierKind } from '@azure/communication-common';\nimport { AzureLogger, createClientLogger, getLogLevel } from '@azure/logger';\nimport { _safeJSONStringify, toFlatCommunicationIdentifier } from '@internal/acs-ui-common';\nimport { Constants } from './Constants';\nimport { TypingIndicatorReceivedEvent } from '@azure/communication-chat';\nimport { chatStatefulLogger } from './Logger';\n/* @conditional-compile-remove(teams-inline-images-and-file-sharing) */\nimport type { CommunicationTokenCredential } from '@azure/communication-common';\n/* @conditional-compile-remove(teams-inline-images-and-file-sharing) */\nimport { ResourceDownloadQueue, fetchImageSource } from './ResourceDownloadQueue';\n\nenableMapSet();\n// Needed to generate state diff for verbose logging.\nenablePatches();\n\n/**\n * @internal\n */\nexport class ChatContext {\n private _state: ChatClientState = {\n userId: { id: '' } as UnknownIdentifierKind,\n displayName: '',\n threads: {},\n latestErrors: {} as ChatErrors\n };\n private _batchMode = false;\n private _logger: AzureLogger;\n private _emitter: EventEmitter;\n private typingIndicatorInterval: number | undefined = undefined;\n /* @conditional-compile-remove(teams-inline-images-and-file-sharing) */\n private _inlineImageQueue: ResourceDownloadQueue | undefined = undefined;\n /* @conditional-compile-remove(teams-inline-images-and-file-sharing) */\n private _fullsizeImageQueue: ResourceDownloadQueue | undefined = undefined;\n constructor(\n maxListeners?: number,\n /* @conditional-compile-remove(teams-inline-images-and-file-sharing) */ credential?: CommunicationTokenCredential,\n /* @conditional-compile-remove(teams-inline-images-and-file-sharing) */ endpoint?: string\n ) {\n this._logger = createClientLogger('communication-react:chat-context');\n this._emitter = new EventEmitter();\n /* @conditional-compile-remove(teams-inline-images-and-file-sharing) */\n if (credential) {\n this._inlineImageQueue = new ResourceDownloadQueue(this, { credential, endpoint: endpoint ?? '' });\n this._fullsizeImageQueue = new ResourceDownloadQueue(this, { credential, endpoint: endpoint ?? '' });\n }\n if (maxListeners) {\n this._emitter.setMaxListeners(maxListeners);\n }\n }\n\n public getState(): ChatClientState {\n return this._state;\n }\n\n public modifyState(modifier: (draft: ChatClientState) => 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._batchMode && this._state !== priorState) {\n this._emitter.emit('stateChanged', this._state);\n }\n }\n\n /* @conditional-compile-remove(teams-inline-images-and-file-sharing) */\n public dispose(): void {\n this.modifyState((draft: ChatClientState) => {\n this._inlineImageQueue?.cancelAllRequests();\n this._fullsizeImageQueue?.cancelAllRequests();\n Object.keys(draft.threads).forEach((threadId) => {\n const thread = draft.threads[threadId];\n Object.keys(thread.chatMessages).forEach((messageId) => {\n const cache = thread.chatMessages[messageId].resourceCache;\n if (cache) {\n Object.keys(cache).forEach((resourceUrl) => {\n const resource = cache[resourceUrl];\n URL.revokeObjectURL(resource.sourceUrl);\n });\n }\n thread.chatMessages[messageId].resourceCache = undefined;\n });\n });\n });\n // Any item in queue should be removed.\n }\n /* @conditional-compile-remove(teams-inline-images-and-file-sharing) */\n public async downloadResourceToCache(threadId: string, messageId: string, resourceUrl: string): Promise<void> {\n let message = this.getState().threads[threadId]?.chatMessages[messageId];\n if (message && this._fullsizeImageQueue) {\n if (!message.resourceCache) {\n message = { ...message, resourceCache: {} };\n }\n // Need to discuss retry logic in case of failure\n this._fullsizeImageQueue.addMessage(message);\n await this._fullsizeImageQueue.startQueue(threadId, fetchImageSource, {\n singleUrl: resourceUrl\n });\n }\n }\n /* @conditional-compile-remove(teams-inline-images-and-file-sharing) */\n public removeResourceFromCache(threadId: string, messageId: string, resourceUrl: string): void {\n this.modifyState((draft: ChatClientState) => {\n const message = draft.threads[threadId]?.chatMessages[messageId];\n if (message && this._fullsizeImageQueue && this._fullsizeImageQueue.containsMessageWithSameAttachments(message)) {\n this._fullsizeImageQueue?.cancelRequest(resourceUrl);\n } else if (\n message &&\n this._inlineImageQueue &&\n this._inlineImageQueue.containsMessageWithSameAttachments(message)\n ) {\n this._inlineImageQueue?.cancelRequest(resourceUrl);\n }\n if (message && message.resourceCache && message.resourceCache[resourceUrl]) {\n const resource = message.resourceCache[resourceUrl];\n URL.revokeObjectURL(resource.sourceUrl);\n delete message.resourceCache[resourceUrl];\n }\n });\n }\n\n public setThread(threadId: string, threadState: ChatThreadClientState): void {\n this.modifyState((draft: ChatClientState) => {\n draft.threads[threadId] = threadState;\n });\n }\n\n public createThread(threadId: string, properties?: ChatThreadProperties): void {\n this.modifyState((draft: ChatClientState) => {\n draft.threads[threadId] = {\n chatMessages: {},\n threadId: threadId,\n properties: properties,\n participants: {},\n readReceipts: [],\n typingIndicators: [],\n latestReadTime: new Date(0)\n };\n });\n }\n\n public updateChatConfig(userId: CommunicationIdentifierKind, displayName: string): void {\n this.modifyState((draft: ChatClientState) => {\n draft.displayName = displayName;\n draft.userId = userId;\n });\n }\n\n public createThreadIfNotExist(threadId: string, properties?: ChatThreadProperties): boolean {\n const exists = Object.prototype.hasOwnProperty.call(this.getState().threads, threadId);\n if (!exists) {\n this.createThread(threadId, properties);\n return true;\n }\n return false;\n }\n\n public updateThread(threadId: string, properties?: ChatThreadProperties): void {\n this.modifyState((draft: ChatClientState) => {\n const thread = draft.threads[threadId];\n if (thread) {\n thread.properties = properties;\n }\n });\n }\n\n public updateThreadTopic(threadId: string, topic?: string): void {\n this.modifyState((draft: ChatClientState) => {\n if (topic === undefined) {\n return;\n }\n const thread = draft.threads[threadId];\n if (thread && !thread.properties) {\n thread.properties = { topic: topic };\n } else if (thread && thread.properties) {\n thread.properties.topic = topic;\n }\n });\n }\n\n public deleteThread(threadId: string): void {\n this.modifyState((draft: ChatClientState) => {\n const thread = draft.threads[threadId];\n if (thread) {\n delete draft.threads[threadId];\n }\n });\n }\n\n public setChatMessages(threadId: string, messages: { [key: string]: ChatMessageWithStatus }): void {\n this.modifyState((draft: ChatClientState) => {\n const threadState = draft.threads[threadId];\n if (threadState) {\n threadState.chatMessages = messages;\n }\n\n // remove typing indicator when receive messages\n const thread = draft.threads[threadId];\n if (thread) {\n for (const message of Object.values(messages)) {\n this.filterTypingIndicatorForUser(thread, message.sender);\n }\n }\n });\n }\n\n public updateChatMessageContent(threadId: string, messagesId: string, content: string | undefined): void {\n this.modifyState((draft: ChatClientState) => {\n const chatMessage = draft.threads[threadId]?.chatMessages[messagesId];\n if (chatMessage) {\n if (!chatMessage.content) {\n chatMessage.content = {};\n }\n chatMessage.content.message = content;\n }\n });\n }\n\n public deleteLocalMessage(threadId: string, localId: string): boolean {\n let localMessageDeleted = false;\n this.modifyState((draft: ChatClientState) => {\n const chatMessages = draft.threads[threadId]?.chatMessages;\n const message: ChatMessageWithStatus | undefined = chatMessages ? chatMessages[localId] : undefined;\n if (chatMessages && message && message.clientMessageId) {\n delete chatMessages[message.clientMessageId];\n localMessageDeleted = true;\n }\n });\n return localMessageDeleted;\n }\n\n public deleteMessage(threadId: string, id: string): void {\n this.modifyState((draft: ChatClientState) => {\n const chatMessages = draft.threads[threadId]?.chatMessages;\n if (chatMessages) {\n delete chatMessages[id];\n }\n });\n }\n\n public setParticipant(threadId: string, participant: ChatParticipant): void {\n this.modifyState((draft: ChatClientState) => {\n const participants = draft.threads[threadId]?.participants;\n if (participants) {\n participants[toFlatCommunicationIdentifier(participant.id)] = participant;\n }\n });\n }\n\n public setParticipants(threadId: string, participants: ChatParticipant[]): void {\n this.modifyState((draft: ChatClientState) => {\n const participantsMap = draft.threads[threadId]?.participants;\n if (participantsMap) {\n for (const participant of participants) {\n participantsMap[toFlatCommunicationIdentifier(participant.id)] = participant;\n }\n }\n });\n }\n\n public deleteParticipants(threadId: string, participantIds: CommunicationIdentifierKind[]): void {\n this.modifyState((draft: ChatClientState) => {\n const participants = draft.threads[threadId]?.participants;\n if (participants) {\n participantIds.forEach((id) => {\n delete participants[toFlatCommunicationIdentifier(id)];\n });\n }\n });\n }\n\n public deleteParticipant(threadId: string, participantId: CommunicationIdentifierKind): void {\n this.modifyState((draft: ChatClientState) => {\n const participants = draft.threads[threadId]?.participants;\n if (participants) {\n delete participants[toFlatCommunicationIdentifier(participantId)];\n }\n });\n }\n\n public addReadReceipt(threadId: string, readReceipt: ChatMessageReadReceipt): void {\n this.modifyState((draft: ChatClientState) => {\n const thread = draft.threads[threadId];\n const readReceipts = thread?.readReceipts;\n if (thread && readReceipts) {\n // TODO(prprabhu): Replace `this.getState()` with `draft`?\n if (readReceipt.sender !== this.getState().userId && thread.latestReadTime < readReceipt.readOn) {\n thread.latestReadTime = readReceipt.readOn;\n }\n readReceipts.push(readReceipt);\n }\n });\n }\n\n private startTypingIndicatorCleanUp(): void {\n if (this.typingIndicatorInterval) {\n return;\n }\n this.typingIndicatorInterval = window.setInterval(() => {\n let isTypingActive = false;\n this.modifyState((draft: ChatClientState) => {\n for (const thread of Object.values(draft.threads)) {\n const filteredTypingIndicators = thread.typingIndicators.filter((typingIndicator) => {\n const timeGap = Date.now() - typingIndicator.receivedOn.getTime();\n return timeGap < Constants.TYPING_INDICATOR_MAINTAIN_TIME;\n });\n\n if (thread.typingIndicators.length !== filteredTypingIndicators.length) {\n thread.typingIndicators = filteredTypingIndicators;\n }\n if (thread.typingIndicators.length > 0) {\n isTypingActive = true;\n }\n }\n });\n\n if (!isTypingActive && this.typingIndicatorInterval) {\n window.clearInterval(this.typingIndicatorInterval);\n this.typingIndicatorInterval = undefined;\n }\n }, 1000);\n }\n\n public addTypingIndicator(threadId: string, typingIndicator: TypingIndicatorReceivedEvent): void {\n this.modifyState((draft: ChatClientState) => {\n const thread = draft.threads[threadId];\n if (thread) {\n const typingIndicators = thread.typingIndicators;\n typingIndicators.push(typingIndicator);\n }\n });\n\n // Make sure we only maintain a period of typing indicator for perf purposes\n this.startTypingIndicatorCleanUp();\n }\n\n public setChatMessage(threadId: string, message: ChatMessageWithStatus): void {\n /* @conditional-compile-remove(teams-inline-images-and-file-sharing) */\n this.parseAttachments(threadId, message);\n const { id: messageId, clientMessageId } = message;\n if (messageId || clientMessageId) {\n this.modifyState((draft: ChatClientState) => {\n const threadMessages = draft.threads[threadId]?.chatMessages;\n const isLocalIdInMap = threadMessages && clientMessageId && threadMessages[clientMessageId];\n const messageKey = !messageId || isLocalIdInMap ? clientMessageId : messageId;\n\n if (threadMessages && messageKey) {\n threadMessages[messageKey] = message;\n }\n\n // remove typing indicator when receive a message from a user\n const thread = draft.threads[threadId];\n if (thread) {\n this.filterTypingIndicatorForUser(thread, message.sender);\n }\n });\n }\n }\n\n /* @conditional-compile-remove(teams-inline-images-and-file-sharing) */\n private parseAttachments(threadId: string, message: ChatMessageWithStatus): void {\n const attachments = message.content?.attachments;\n if (message.type === 'html' && attachments && attachments.length > 0) {\n if (\n this._inlineImageQueue &&\n !this._inlineImageQueue.containsMessageWithSameAttachments(message) &&\n message.resourceCache === undefined\n ) {\n // Need to discuss retry logic in case of failure\n this._inlineImageQueue.addMessage(message);\n this._inlineImageQueue.startQueue(threadId, fetchImageSource);\n }\n }\n }\n\n /**\n * Tees any errors encountered in an async function to the state.\n *\n * @param f 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 ChatError. Exceptions thrown from `f` are tagged with the failed `target.\n */\n public withAsyncErrorTeedToState<Args extends unknown[], R>(\n f: (...args: Args) => Promise<R>,\n target: ChatErrorTarget\n ): (...args: Args) => Promise<R> {\n return async (...args: Args): Promise<R> => {\n try {\n return await f(...args);\n } catch (error) {\n const chatError = toChatError(target, error);\n this.setLatestError(target, chatError);\n throw chatError;\n }\n };\n }\n\n /**\n * Tees any errors encountered in an function to the state.\n *\n * @param f 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 ChatError. Exceptions thrown from `f` are tagged with the failed `target.\n */\n public withErrorTeedToState<Args extends unknown[], R>(\n f: (...args: Args) => R,\n target: ChatErrorTarget\n ): (...args: Args) => R {\n return (...args: Args): R => {\n try {\n chatStatefulLogger.info(`Chat stateful client target function called: ${target}`);\n return f(...args);\n } catch (error) {\n const chatError = toChatError(target, error);\n this.setLatestError(target, chatError);\n throw chatError;\n }\n };\n }\n\n private setLatestError(target: ChatErrorTarget, error: ChatError): void {\n this.modifyState((draft: ChatClientState) => {\n draft.latestErrors[target] = error;\n });\n }\n\n // This is a mutating function, only use it inside of a produce() function\n private filterTypingIndicatorForUser(thread: ChatThreadClientState, userId?: CommunicationIdentifierKind): void {\n if (!userId) {\n return;\n }\n const typingIndicators = thread.typingIndicators;\n const userIdAsKey = toFlatCommunicationIdentifier(userId);\n const filteredTypingIndicators = typingIndicators.filter(\n (typingIndicator) => toFlatCommunicationIdentifier(typingIndicator.sender) !== userIdAsKey\n );\n if (filteredTypingIndicators.length !== typingIndicators.length) {\n thread.typingIndicators = filteredTypingIndicators;\n }\n }\n\n /**\n * Batch updates to minimize `stateChanged` events across related operations.\n *\n * - A maximum of one `stateChanged` event is emitted, at the end of the operations.\n * - No `stateChanged` event is emitted if the state did not change through the operations.\n * - In case of an exception, state is reset to the prior value and no `stateChanged` event is emitted.\n *\n * All operations finished in this batch should be synchronous.\n * This function is not reentrant -- do not call batch() from within another batch().\n */\n public batch(operations: () => void): void {\n if (this._batchMode) {\n throw new Error('batch() called from within another batch()');\n }\n\n this._batchMode = true;\n const priorState = this._state;\n try {\n operations();\n if (this._state !== priorState) {\n this._emitter.emit('stateChanged', this._state);\n }\n } catch (e) {\n this._state = priorState;\n if (getLogLevel() === 'verbose') {\n this._logger.warning(`State rollback to: ${_safeJSONStringify(priorState)}`);\n }\n throw e;\n } finally {\n this._batchMode = false;\n }\n }\n\n public onStateChange(handler: (state: ChatClientState) => void): void {\n this._emitter.on('stateChanged', handler);\n }\n\n public offStateChange(handler: (state: ChatClientState) => void): void {\n this._emitter.off('stateChanged', handler);\n }\n}\n\nconst toChatError = (target: ChatErrorTarget, error: unknown): ChatError => {\n if (error instanceof Error) {\n return new ChatError(target, error);\n }\n return new ChatError(target, new Error(`${error}`));\n};\n"]}
|
1
|
+
{"version":3,"file":"ChatContext.js","sourceRoot":"","sources":["../../../../../chat-stateful-client/src/ChatContext.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;;;;;;;;;;AAElC,OAAO,YAAY,MAAM,QAAQ,CAAC;AAClC,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,OAAO,EAAS,MAAM,OAAO,CAAC;AACpE,OAAO,EAML,SAAS,EACV,MAAM,mBAAmB,CAAC;AAI3B,OAAO,EAAe,kBAAkB,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC7E,OAAO,EAAE,kBAAkB,EAAE,6BAA6B,EAAE,gCAAgC;AAC5F,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAG9C,uEAAuE;AACvE,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAElF,YAAY,EAAE,CAAC;AACf,qDAAqD;AACrD,aAAa,EAAE,CAAC;AAEhB;;GAEG;AACH,MAAM,OAAO,WAAW;IAetB,YACE,YAAqB;IACrB,uEAAuE,CAAC,UAAyC;IACjH,uEAAuE,CAAC,QAAiB;QAjBnF,WAAM,GAAoB;YAChC,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,EAA2B;YAC3C,WAAW,EAAE,EAAE;YACf,OAAO,EAAE,EAAE;YACX,YAAY,EAAE,EAAgB;SAC/B,CAAC;QACM,eAAU,GAAG,KAAK,CAAC;QAGnB,4BAAuB,GAAuB,SAAS,CAAC;QAChE,uEAAuE;QAC/D,sBAAiB,GAAsC,SAAS,CAAC;QACzE,uEAAuE;QAC/D,wBAAmB,GAAsC,SAAS,CAAC;QAMzE,IAAI,CAAC,OAAO,GAAG,kBAAkB,CAAC,kCAAkC,CAAC,CAAC;QACtE,IAAI,CAAC,QAAQ,GAAG,IAAI,YAAY,EAAE,CAAC;QACnC,uEAAuE;QACvE,IAAI,UAAU,EAAE,CAAC;YACf,IAAI,CAAC,iBAAiB,GAAG,IAAI,qBAAqB,CAAC,IAAI,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,aAAR,QAAQ,cAAR,QAAQ,GAAI,EAAE,EAAE,CAAC,CAAC;YACnG,IAAI,CAAC,mBAAmB,GAAG,IAAI,qBAAqB,CAAC,IAAI,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,aAAR,QAAQ,cAAR,QAAQ,GAAI,EAAE,EAAE,CAAC,CAAC;QACvG,CAAC;QACD,IAAI,YAAY,EAAE,CAAC;YACjB,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;IAEM,QAAQ;QACb,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAEM,WAAW,CAAC,QAA0C;QAC3D,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC;QAC/B,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,OAAgB,EAAE,EAAE;YAChE,IAAI,WAAW,EAAE,KAAK,SAAS,EAAE,CAAC;gBAChC,0EAA0E;gBAC1E,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,iBAAiB,kBAAkB,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACpE,CAAC;QACH,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;YACnD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;IAED,uEAAuE;IAChE,OAAO;QACZ,IAAI,CAAC,WAAW,CAAC,CAAC,KAAsB,EAAE,EAAE;;YAC1C,MAAA,IAAI,CAAC,iBAAiB,0CAAE,iBAAiB,EAAE,CAAC;YAC5C,MAAA,IAAI,CAAC,mBAAmB,0CAAE,iBAAiB,EAAE,CAAC;YAC9C,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE;gBAC9C,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;gBACvC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE;oBACrD,MAAM,KAAK,GAAG,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,aAAa,CAAC;oBAC3D,IAAI,KAAK,EAAE,CAAC;wBACV,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,EAAE;4BACzC,MAAM,QAAQ,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC;4BACpC,IAAI,QAAQ,CAAC,SAAS,EAAE,CAAC;gCACvB,GAAG,CAAC,eAAe,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;4BAC1C,CAAC;wBACH,CAAC,CAAC,CAAC;oBACL,CAAC;oBACD,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,aAAa,GAAG,SAAS,CAAC;gBAC3D,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QACH,uCAAuC;IACzC,CAAC;IACD,uEAAuE;IAC1D,uBAAuB,CAAC,QAAgB,EAAE,SAAiB,EAAE,WAAmB;;;YAC3F,IAAI,OAAO,GAAG,MAAA,IAAI,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,0CAAE,YAAY,CAAC,SAAS,CAAC,CAAC;YACzE,IAAI,OAAO,IAAI,IAAI,CAAC,mBAAmB,EAAE,CAAC;gBACxC,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC;oBAC3B,OAAO,mCAAQ,OAAO,KAAE,aAAa,EAAE,EAAE,GAAE,CAAC;gBAC9C,CAAC;gBACD,iDAAiD;gBACjD,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;gBAC7C,MAAM,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC,QAAQ,EAAE,gBAAgB,EAAE;oBACpE,SAAS,EAAE,WAAW;iBACvB,CAAC,CAAC;YACL,CAAC;;KACF;IACD,uEAAuE;IAChE,uBAAuB,CAAC,QAAgB,EAAE,SAAiB,EAAE,WAAmB;QACrF,IAAI,CAAC,WAAW,CAAC,CAAC,KAAsB,EAAE,EAAE;;YAC1C,MAAM,OAAO,GAAG,MAAA,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,0CAAE,YAAY,CAAC,SAAS,CAAC,CAAC;YACjE,IAAI,OAAO,IAAI,IAAI,CAAC,mBAAmB,IAAI,IAAI,CAAC,mBAAmB,CAAC,kCAAkC,CAAC,OAAO,CAAC,EAAE,CAAC;gBAChH,MAAA,IAAI,CAAC,mBAAmB,0CAAE,aAAa,CAAC,WAAW,CAAC,CAAC;YACvD,CAAC;iBAAM,IACL,OAAO;gBACP,IAAI,CAAC,iBAAiB;gBACtB,IAAI,CAAC,iBAAiB,CAAC,kCAAkC,CAAC,OAAO,CAAC,EAClE,CAAC;gBACD,MAAA,IAAI,CAAC,iBAAiB,0CAAE,aAAa,CAAC,WAAW,CAAC,CAAC;YACrD,CAAC;YACD,IAAI,OAAO,IAAI,OAAO,CAAC,aAAa,IAAI,OAAO,CAAC,aAAa,CAAC,WAAW,CAAC,EAAE,CAAC;gBAC3E,MAAM,QAAQ,GAAG,OAAO,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;gBACpD,IAAI,QAAQ,CAAC,SAAS,EAAE,CAAC;oBACvB,GAAG,CAAC,eAAe,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;gBAC1C,CAAC;gBAED,OAAO,OAAO,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;YAC5C,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,SAAS,CAAC,QAAgB,EAAE,WAAkC;QACnE,IAAI,CAAC,WAAW,CAAC,CAAC,KAAsB,EAAE,EAAE;YAC1C,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,WAAW,CAAC;QACxC,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,YAAY,CAAC,QAAgB,EAAE,UAAiC;QACrE,IAAI,CAAC,WAAW,CAAC,CAAC,KAAsB,EAAE,EAAE;YAC1C,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG;gBACxB,YAAY,EAAE,EAAE;gBAChB,QAAQ,EAAE,QAAQ;gBAClB,UAAU,EAAE,UAAU;gBACtB,YAAY,EAAE,EAAE;gBAChB,YAAY,EAAE,EAAE;gBAChB,gBAAgB,EAAE,EAAE;gBACpB,cAAc,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC;aAC5B,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,gBAAgB,CAAC,MAAmC,EAAE,WAAmB;QAC9E,IAAI,CAAC,WAAW,CAAC,CAAC,KAAsB,EAAE,EAAE;YAC1C,KAAK,CAAC,WAAW,GAAG,WAAW,CAAC;YAChC,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC;QACxB,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,sBAAsB,CAAC,QAAgB,EAAE,UAAiC;QAC/E,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QACvF,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;YACxC,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAEM,YAAY,CAAC,QAAgB,EAAE,UAAiC;QACrE,IAAI,CAAC,WAAW,CAAC,CAAC,KAAsB,EAAE,EAAE;YAC1C,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YACvC,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,CAAC,UAAU,GAAG,UAAU,CAAC;YACjC,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,iBAAiB,CAAC,QAAgB,EAAE,KAAc;QACvD,IAAI,CAAC,WAAW,CAAC,CAAC,KAAsB,EAAE,EAAE;YAC1C,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,OAAO;YACT,CAAC;YACD,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YACvC,IAAI,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;gBACjC,MAAM,CAAC,UAAU,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;YACvC,CAAC;iBAAM,IAAI,MAAM,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;gBACvC,MAAM,CAAC,UAAU,CAAC,KAAK,GAAG,KAAK,CAAC;YAClC,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,YAAY,CAAC,QAAgB;QAClC,IAAI,CAAC,WAAW,CAAC,CAAC,KAAsB,EAAE,EAAE;YAC1C,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YACvC,IAAI,MAAM,EAAE,CAAC;gBACX,OAAO,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YACjC,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,eAAe,CAAC,QAAgB,EAAE,QAAkD;QACzF,IAAI,CAAC,WAAW,CAAC,CAAC,KAAsB,EAAE,EAAE;YAC1C,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YAC5C,IAAI,WAAW,EAAE,CAAC;gBAChB,WAAW,CAAC,YAAY,GAAG,QAAQ,CAAC;YACtC,CAAC;YAED,gDAAgD;YAChD,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YACvC,IAAI,MAAM,EAAE,CAAC;gBACX,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC9C,IAAI,CAAC,4BAA4B,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;gBAC5D,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,wBAAwB,CAAC,QAAgB,EAAE,UAAkB,EAAE,OAA2B;QAC/F,IAAI,CAAC,WAAW,CAAC,CAAC,KAAsB,EAAE,EAAE;;YAC1C,MAAM,WAAW,GAAG,MAAA,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,0CAAE,YAAY,CAAC,UAAU,CAAC,CAAC;YACtE,IAAI,WAAW,EAAE,CAAC;gBAChB,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;oBACzB,WAAW,CAAC,OAAO,GAAG,EAAE,CAAC;gBAC3B,CAAC;gBACD,WAAW,CAAC,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC;YACxC,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,kBAAkB,CAAC,QAAgB,EAAE,OAAe;QACzD,IAAI,mBAAmB,GAAG,KAAK,CAAC;QAChC,IAAI,CAAC,WAAW,CAAC,CAAC,KAAsB,EAAE,EAAE;;YAC1C,MAAM,YAAY,GAAG,MAAA,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,0CAAE,YAAY,CAAC;YAC3D,MAAM,OAAO,GAAsC,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YACpG,IAAI,YAAY,IAAI,OAAO,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;gBACvD,OAAO,YAAY,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;gBAC7C,mBAAmB,GAAG,IAAI,CAAC;YAC7B,CAAC;QACH,CAAC,CAAC,CAAC;QACH,OAAO,mBAAmB,CAAC;IAC7B,CAAC;IAEM,aAAa,CAAC,QAAgB,EAAE,EAAU;QAC/C,IAAI,CAAC,WAAW,CAAC,CAAC,KAAsB,EAAE,EAAE;;YAC1C,MAAM,YAAY,GAAG,MAAA,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,0CAAE,YAAY,CAAC;YAC3D,IAAI,YAAY,EAAE,CAAC;gBACjB,OAAO,YAAY,CAAC,EAAE,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,cAAc,CAAC,QAAgB,EAAE,WAA4B;QAClE,IAAI,CAAC,WAAW,CAAC,CAAC,KAAsB,EAAE,EAAE;;YAC1C,MAAM,YAAY,GAAG,MAAA,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,0CAAE,YAAY,CAAC;YAC3D,IAAI,YAAY,EAAE,CAAC;gBACjB,YAAY,CAAC,6BAA6B,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,GAAG,WAAW,CAAC;YAC5E,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,eAAe,CAAC,QAAgB,EAAE,YAA+B;QACtE,IAAI,CAAC,WAAW,CAAC,CAAC,KAAsB,EAAE,EAAE;;YAC1C,MAAM,eAAe,GAAG,MAAA,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,0CAAE,YAAY,CAAC;YAC9D,IAAI,eAAe,EAAE,CAAC;gBACpB,KAAK,MAAM,WAAW,IAAI,YAAY,EAAE,CAAC;oBACvC,eAAe,CAAC,6BAA6B,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,GAAG,WAAW,CAAC;gBAC/E,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,kBAAkB,CAAC,QAAgB,EAAE,cAA6C;QACvF,IAAI,CAAC,WAAW,CAAC,CAAC,KAAsB,EAAE,EAAE;;YAC1C,MAAM,YAAY,GAAG,MAAA,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,0CAAE,YAAY,CAAC;YAC3D,IAAI,YAAY,EAAE,CAAC;gBACjB,cAAc,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE;oBAC5B,OAAO,YAAY,CAAC,6BAA6B,CAAC,EAAE,CAAC,CAAC,CAAC;gBACzD,CAAC,CAAC,CAAC;YACL,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,iBAAiB,CAAC,QAAgB,EAAE,aAA0C;QACnF,IAAI,CAAC,WAAW,CAAC,CAAC,KAAsB,EAAE,EAAE;;YAC1C,MAAM,YAAY,GAAG,MAAA,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,0CAAE,YAAY,CAAC;YAC3D,IAAI,YAAY,EAAE,CAAC;gBACjB,OAAO,YAAY,CAAC,6BAA6B,CAAC,aAAa,CAAC,CAAC,CAAC;YACpE,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,cAAc,CAAC,QAAgB,EAAE,WAAmC;QACzE,IAAI,CAAC,WAAW,CAAC,CAAC,KAAsB,EAAE,EAAE;YAC1C,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YACvC,MAAM,YAAY,GAAG,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,YAAY,CAAC;YAC1C,IAAI,MAAM,IAAI,YAAY,EAAE,CAAC;gBAC3B,0DAA0D;gBAC1D,IAAI,WAAW,CAAC,MAAM,KAAK,IAAI,CAAC,QAAQ,EAAE,CAAC,MAAM,IAAI,MAAM,CAAC,cAAc,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC;oBAChG,MAAM,CAAC,cAAc,GAAG,WAAW,CAAC,MAAM,CAAC;gBAC7C,CAAC;gBACD,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACjC,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,2BAA2B;QACjC,IAAI,IAAI,CAAC,uBAAuB,EAAE,CAAC;YACjC,OAAO;QACT,CAAC;QACD,IAAI,CAAC,uBAAuB,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE;YACrD,IAAI,cAAc,GAAG,KAAK,CAAC;YAC3B,IAAI,CAAC,WAAW,CAAC,CAAC,KAAsB,EAAE,EAAE;gBAC1C,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;oBAClD,MAAM,wBAAwB,GAAG,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,eAAe,EAAE,EAAE;wBAClF,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,eAAe,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;wBAClE,OAAO,OAAO,GAAG,SAAS,CAAC,8BAA8B,CAAC;oBAC5D,CAAC,CAAC,CAAC;oBAEH,IAAI,MAAM,CAAC,gBAAgB,CAAC,MAAM,KAAK,wBAAwB,CAAC,MAAM,EAAE,CAAC;wBACvE,MAAM,CAAC,gBAAgB,GAAG,wBAAwB,CAAC;oBACrD,CAAC;oBACD,IAAI,MAAM,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBACvC,cAAc,GAAG,IAAI,CAAC;oBACxB,CAAC;gBACH,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,uBAAuB,EAAE,CAAC;gBACpD,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;gBACnD,IAAI,CAAC,uBAAuB,GAAG,SAAS,CAAC;YAC3C,CAAC;QACH,CAAC,EAAE,IAAI,CAAC,CAAC;IACX,CAAC;IAEM,kBAAkB,CAAC,QAAgB,EAAE,eAA6C;QACvF,IAAI,CAAC,WAAW,CAAC,CAAC,KAAsB,EAAE,EAAE;YAC1C,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YACvC,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC;gBACjD,gBAAgB,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YACzC,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,4EAA4E;QAC5E,IAAI,CAAC,2BAA2B,EAAE,CAAC;IACrC,CAAC;IAEM,cAAc,CAAC,QAAgB,EAAE,OAA8B;QACpE,uEAAuE;QACvE,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACzC,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC;QACnD,IAAI,SAAS,IAAI,eAAe,EAAE,CAAC;YACjC,IAAI,CAAC,WAAW,CAAC,CAAC,KAAsB,EAAE,EAAE;;gBAC1C,MAAM,cAAc,GAAG,MAAA,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,0CAAE,YAAY,CAAC;gBAC7D,MAAM,cAAc,GAAG,cAAc,IAAI,eAAe,IAAI,cAAc,CAAC,eAAe,CAAC,CAAC;gBAC5F,MAAM,UAAU,GAAG,CAAC,SAAS,IAAI,cAAc,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,SAAS,CAAC;gBAE9E,IAAI,cAAc,IAAI,UAAU,EAAE,CAAC;oBACjC,cAAc,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC;gBACvC,CAAC;gBAED,6DAA6D;gBAC7D,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;gBACvC,IAAI,MAAM,EAAE,CAAC;oBACX,IAAI,CAAC,4BAA4B,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;gBAC5D,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,uEAAuE;IAC/D,gBAAgB,CAAC,QAAgB,EAAE,OAA8B;;QACvE,MAAM,WAAW,GAAG,MAAA,OAAO,CAAC,OAAO,0CAAE,WAAW,CAAC;QACjD,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,IAAI,WAAW,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrE,IACE,IAAI,CAAC,iBAAiB;gBACtB,CAAC,IAAI,CAAC,iBAAiB,CAAC,kCAAkC,CAAC,OAAO,CAAC;gBACnE,OAAO,CAAC,aAAa,KAAK,SAAS,EACnC,CAAC;gBACD,iDAAiD;gBACjD,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;gBAC3C,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC;YAChE,CAAC;QACH,CAAC;IACH,CAAC;IAED;;;;;;;OAOG;IACI,yBAAyB,CAC9B,CAAgC,EAChC,MAAuB;QAEvB,OAAO,CAAO,GAAG,IAAU,EAAc,EAAE;YACzC,IAAI,CAAC;gBACH,OAAO,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;YAC1B,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,SAAS,GAAG,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;gBAC7C,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;gBACvC,MAAM,SAAS,CAAC;YAClB,CAAC;QACH,CAAC,CAAA,CAAC;IACJ,CAAC;IAED;;;;;;;OAOG;IACI,oBAAoB,CACzB,CAAuB,EACvB,MAAuB;QAEvB,OAAO,CAAC,GAAG,IAAU,EAAK,EAAE;YAC1B,IAAI,CAAC;gBACH,kBAAkB,CAAC,IAAI,CAAC,gDAAgD,MAAM,EAAE,CAAC,CAAC;gBAClF,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;YACpB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,SAAS,GAAG,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;gBAC7C,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;gBACvC,MAAM,SAAS,CAAC;YAClB,CAAC;QACH,CAAC,CAAC;IACJ,CAAC;IAEO,cAAc,CAAC,MAAuB,EAAE,KAAgB;QAC9D,IAAI,CAAC,WAAW,CAAC,CAAC,KAAsB,EAAE,EAAE;YAC1C,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC;QACrC,CAAC,CAAC,CAAC;IACL,CAAC;IAED,0EAA0E;IAClE,4BAA4B,CAAC,MAA6B,EAAE,MAAoC;QACtG,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO;QACT,CAAC;QACD,MAAM,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC;QACjD,MAAM,WAAW,GAAG,6BAA6B,CAAC,MAAM,CAAC,CAAC;QAC1D,MAAM,wBAAwB,GAAG,gBAAgB,CAAC,MAAM,CACtD,CAAC,eAAe,EAAE,EAAE,CAAC,6BAA6B,CAAC,eAAe,CAAC,MAAM,CAAC,KAAK,WAAW,CAC3F,CAAC;QACF,IAAI,wBAAwB,CAAC,MAAM,KAAK,gBAAgB,CAAC,MAAM,EAAE,CAAC;YAChE,MAAM,CAAC,gBAAgB,GAAG,wBAAwB,CAAC;QACrD,CAAC;IACH,CAAC;IAED;;;;;;;;;OASG;IACI,KAAK,CAAC,UAAsB;QACjC,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAChE,CAAC;QAED,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC;QAC/B,IAAI,CAAC;YACH,UAAU,EAAE,CAAC;YACb,IAAI,IAAI,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;gBAC/B,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YAClD,CAAC;QACH,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,CAAC,MAAM,GAAG,UAAU,CAAC;YACzB,IAAI,WAAW,EAAE,KAAK,SAAS,EAAE,CAAC;gBAChC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,sBAAsB,kBAAkB,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;YAC/E,CAAC;YACD,MAAM,CAAC,CAAC;QACV,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QAC1B,CAAC;IACH,CAAC;IAEM,aAAa,CAAC,OAAyC;QAC5D,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;IAC5C,CAAC;IAEM,cAAc,CAAC,OAAyC;QAC7D,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;IAC7C,CAAC;CACF;AAED,MAAM,WAAW,GAAG,CAAC,MAAuB,EAAE,KAAc,EAAa,EAAE;IACzE,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,OAAO,IAAI,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACtC,CAAC;IACD,OAAO,IAAI,SAAS,CAAC,MAAM,EAAE,IAAI,KAAK,CAAC,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC;AACtD,CAAC,CAAC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport EventEmitter from 'events';\nimport { enableMapSet, enablePatches, produce, Patch } from 'immer';\nimport {\n ChatClientState,\n ChatErrors,\n ChatThreadClientState,\n ChatThreadProperties,\n ChatErrorTarget,\n ChatError\n} from './ChatClientState';\nimport { ChatMessageWithStatus } from './types/ChatMessageWithStatus';\nimport { ChatMessageReadReceipt, ChatParticipant } from '@azure/communication-chat';\nimport { CommunicationIdentifierKind, UnknownIdentifierKind } from '@azure/communication-common';\nimport { AzureLogger, createClientLogger, getLogLevel } from '@azure/logger';\nimport { _safeJSONStringify, toFlatCommunicationIdentifier } from '@internal/acs-ui-common';\nimport { Constants } from './Constants';\nimport { TypingIndicatorReceivedEvent } from '@azure/communication-chat';\nimport { chatStatefulLogger } from './Logger';\n/* @conditional-compile-remove(teams-inline-images-and-file-sharing) */\nimport type { CommunicationTokenCredential } from '@azure/communication-common';\n/* @conditional-compile-remove(teams-inline-images-and-file-sharing) */\nimport { ResourceDownloadQueue, fetchImageSource } from './ResourceDownloadQueue';\n\nenableMapSet();\n// Needed to generate state diff for verbose logging.\nenablePatches();\n\n/**\n * @internal\n */\nexport class ChatContext {\n private _state: ChatClientState = {\n userId: { id: '' } as UnknownIdentifierKind,\n displayName: '',\n threads: {},\n latestErrors: {} as ChatErrors\n };\n private _batchMode = false;\n private _logger: AzureLogger;\n private _emitter: EventEmitter;\n private typingIndicatorInterval: number | undefined = undefined;\n /* @conditional-compile-remove(teams-inline-images-and-file-sharing) */\n private _inlineImageQueue: ResourceDownloadQueue | undefined = undefined;\n /* @conditional-compile-remove(teams-inline-images-and-file-sharing) */\n private _fullsizeImageQueue: ResourceDownloadQueue | undefined = undefined;\n constructor(\n maxListeners?: number,\n /* @conditional-compile-remove(teams-inline-images-and-file-sharing) */ credential?: CommunicationTokenCredential,\n /* @conditional-compile-remove(teams-inline-images-and-file-sharing) */ endpoint?: string\n ) {\n this._logger = createClientLogger('communication-react:chat-context');\n this._emitter = new EventEmitter();\n /* @conditional-compile-remove(teams-inline-images-and-file-sharing) */\n if (credential) {\n this._inlineImageQueue = new ResourceDownloadQueue(this, { credential, endpoint: endpoint ?? '' });\n this._fullsizeImageQueue = new ResourceDownloadQueue(this, { credential, endpoint: endpoint ?? '' });\n }\n if (maxListeners) {\n this._emitter.setMaxListeners(maxListeners);\n }\n }\n\n public getState(): ChatClientState {\n return this._state;\n }\n\n public modifyState(modifier: (draft: ChatClientState) => 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._batchMode && this._state !== priorState) {\n this._emitter.emit('stateChanged', this._state);\n }\n }\n\n /* @conditional-compile-remove(teams-inline-images-and-file-sharing) */\n public dispose(): void {\n this.modifyState((draft: ChatClientState) => {\n this._inlineImageQueue?.cancelAllRequests();\n this._fullsizeImageQueue?.cancelAllRequests();\n Object.keys(draft.threads).forEach((threadId) => {\n const thread = draft.threads[threadId];\n Object.keys(thread.chatMessages).forEach((messageId) => {\n const cache = thread.chatMessages[messageId].resourceCache;\n if (cache) {\n Object.keys(cache).forEach((resourceUrl) => {\n const resource = cache[resourceUrl];\n if (resource.sourceUrl) {\n URL.revokeObjectURL(resource.sourceUrl);\n }\n });\n }\n thread.chatMessages[messageId].resourceCache = undefined;\n });\n });\n });\n // Any item in queue should be removed.\n }\n /* @conditional-compile-remove(teams-inline-images-and-file-sharing) */\n public async downloadResourceToCache(threadId: string, messageId: string, resourceUrl: string): Promise<void> {\n let message = this.getState().threads[threadId]?.chatMessages[messageId];\n if (message && this._fullsizeImageQueue) {\n if (!message.resourceCache) {\n message = { ...message, resourceCache: {} };\n }\n // Need to discuss retry logic in case of failure\n this._fullsizeImageQueue.addMessage(message);\n await this._fullsizeImageQueue.startQueue(threadId, fetchImageSource, {\n singleUrl: resourceUrl\n });\n }\n }\n /* @conditional-compile-remove(teams-inline-images-and-file-sharing) */\n public removeResourceFromCache(threadId: string, messageId: string, resourceUrl: string): void {\n this.modifyState((draft: ChatClientState) => {\n const message = draft.threads[threadId]?.chatMessages[messageId];\n if (message && this._fullsizeImageQueue && this._fullsizeImageQueue.containsMessageWithSameAttachments(message)) {\n this._fullsizeImageQueue?.cancelRequest(resourceUrl);\n } else if (\n message &&\n this._inlineImageQueue &&\n this._inlineImageQueue.containsMessageWithSameAttachments(message)\n ) {\n this._inlineImageQueue?.cancelRequest(resourceUrl);\n }\n if (message && message.resourceCache && message.resourceCache[resourceUrl]) {\n const resource = message.resourceCache[resourceUrl];\n if (resource.sourceUrl) {\n URL.revokeObjectURL(resource.sourceUrl);\n }\n\n delete message.resourceCache[resourceUrl];\n }\n });\n }\n\n public setThread(threadId: string, threadState: ChatThreadClientState): void {\n this.modifyState((draft: ChatClientState) => {\n draft.threads[threadId] = threadState;\n });\n }\n\n public createThread(threadId: string, properties?: ChatThreadProperties): void {\n this.modifyState((draft: ChatClientState) => {\n draft.threads[threadId] = {\n chatMessages: {},\n threadId: threadId,\n properties: properties,\n participants: {},\n readReceipts: [],\n typingIndicators: [],\n latestReadTime: new Date(0)\n };\n });\n }\n\n public updateChatConfig(userId: CommunicationIdentifierKind, displayName: string): void {\n this.modifyState((draft: ChatClientState) => {\n draft.displayName = displayName;\n draft.userId = userId;\n });\n }\n\n public createThreadIfNotExist(threadId: string, properties?: ChatThreadProperties): boolean {\n const exists = Object.prototype.hasOwnProperty.call(this.getState().threads, threadId);\n if (!exists) {\n this.createThread(threadId, properties);\n return true;\n }\n return false;\n }\n\n public updateThread(threadId: string, properties?: ChatThreadProperties): void {\n this.modifyState((draft: ChatClientState) => {\n const thread = draft.threads[threadId];\n if (thread) {\n thread.properties = properties;\n }\n });\n }\n\n public updateThreadTopic(threadId: string, topic?: string): void {\n this.modifyState((draft: ChatClientState) => {\n if (topic === undefined) {\n return;\n }\n const thread = draft.threads[threadId];\n if (thread && !thread.properties) {\n thread.properties = { topic: topic };\n } else if (thread && thread.properties) {\n thread.properties.topic = topic;\n }\n });\n }\n\n public deleteThread(threadId: string): void {\n this.modifyState((draft: ChatClientState) => {\n const thread = draft.threads[threadId];\n if (thread) {\n delete draft.threads[threadId];\n }\n });\n }\n\n public setChatMessages(threadId: string, messages: { [key: string]: ChatMessageWithStatus }): void {\n this.modifyState((draft: ChatClientState) => {\n const threadState = draft.threads[threadId];\n if (threadState) {\n threadState.chatMessages = messages;\n }\n\n // remove typing indicator when receive messages\n const thread = draft.threads[threadId];\n if (thread) {\n for (const message of Object.values(messages)) {\n this.filterTypingIndicatorForUser(thread, message.sender);\n }\n }\n });\n }\n\n public updateChatMessageContent(threadId: string, messagesId: string, content: string | undefined): void {\n this.modifyState((draft: ChatClientState) => {\n const chatMessage = draft.threads[threadId]?.chatMessages[messagesId];\n if (chatMessage) {\n if (!chatMessage.content) {\n chatMessage.content = {};\n }\n chatMessage.content.message = content;\n }\n });\n }\n\n public deleteLocalMessage(threadId: string, localId: string): boolean {\n let localMessageDeleted = false;\n this.modifyState((draft: ChatClientState) => {\n const chatMessages = draft.threads[threadId]?.chatMessages;\n const message: ChatMessageWithStatus | undefined = chatMessages ? chatMessages[localId] : undefined;\n if (chatMessages && message && message.clientMessageId) {\n delete chatMessages[message.clientMessageId];\n localMessageDeleted = true;\n }\n });\n return localMessageDeleted;\n }\n\n public deleteMessage(threadId: string, id: string): void {\n this.modifyState((draft: ChatClientState) => {\n const chatMessages = draft.threads[threadId]?.chatMessages;\n if (chatMessages) {\n delete chatMessages[id];\n }\n });\n }\n\n public setParticipant(threadId: string, participant: ChatParticipant): void {\n this.modifyState((draft: ChatClientState) => {\n const participants = draft.threads[threadId]?.participants;\n if (participants) {\n participants[toFlatCommunicationIdentifier(participant.id)] = participant;\n }\n });\n }\n\n public setParticipants(threadId: string, participants: ChatParticipant[]): void {\n this.modifyState((draft: ChatClientState) => {\n const participantsMap = draft.threads[threadId]?.participants;\n if (participantsMap) {\n for (const participant of participants) {\n participantsMap[toFlatCommunicationIdentifier(participant.id)] = participant;\n }\n }\n });\n }\n\n public deleteParticipants(threadId: string, participantIds: CommunicationIdentifierKind[]): void {\n this.modifyState((draft: ChatClientState) => {\n const participants = draft.threads[threadId]?.participants;\n if (participants) {\n participantIds.forEach((id) => {\n delete participants[toFlatCommunicationIdentifier(id)];\n });\n }\n });\n }\n\n public deleteParticipant(threadId: string, participantId: CommunicationIdentifierKind): void {\n this.modifyState((draft: ChatClientState) => {\n const participants = draft.threads[threadId]?.participants;\n if (participants) {\n delete participants[toFlatCommunicationIdentifier(participantId)];\n }\n });\n }\n\n public addReadReceipt(threadId: string, readReceipt: ChatMessageReadReceipt): void {\n this.modifyState((draft: ChatClientState) => {\n const thread = draft.threads[threadId];\n const readReceipts = thread?.readReceipts;\n if (thread && readReceipts) {\n // TODO(prprabhu): Replace `this.getState()` with `draft`?\n if (readReceipt.sender !== this.getState().userId && thread.latestReadTime < readReceipt.readOn) {\n thread.latestReadTime = readReceipt.readOn;\n }\n readReceipts.push(readReceipt);\n }\n });\n }\n\n private startTypingIndicatorCleanUp(): void {\n if (this.typingIndicatorInterval) {\n return;\n }\n this.typingIndicatorInterval = window.setInterval(() => {\n let isTypingActive = false;\n this.modifyState((draft: ChatClientState) => {\n for (const thread of Object.values(draft.threads)) {\n const filteredTypingIndicators = thread.typingIndicators.filter((typingIndicator) => {\n const timeGap = Date.now() - typingIndicator.receivedOn.getTime();\n return timeGap < Constants.TYPING_INDICATOR_MAINTAIN_TIME;\n });\n\n if (thread.typingIndicators.length !== filteredTypingIndicators.length) {\n thread.typingIndicators = filteredTypingIndicators;\n }\n if (thread.typingIndicators.length > 0) {\n isTypingActive = true;\n }\n }\n });\n\n if (!isTypingActive && this.typingIndicatorInterval) {\n window.clearInterval(this.typingIndicatorInterval);\n this.typingIndicatorInterval = undefined;\n }\n }, 1000);\n }\n\n public addTypingIndicator(threadId: string, typingIndicator: TypingIndicatorReceivedEvent): void {\n this.modifyState((draft: ChatClientState) => {\n const thread = draft.threads[threadId];\n if (thread) {\n const typingIndicators = thread.typingIndicators;\n typingIndicators.push(typingIndicator);\n }\n });\n\n // Make sure we only maintain a period of typing indicator for perf purposes\n this.startTypingIndicatorCleanUp();\n }\n\n public setChatMessage(threadId: string, message: ChatMessageWithStatus): void {\n /* @conditional-compile-remove(teams-inline-images-and-file-sharing) */\n this.parseAttachments(threadId, message);\n const { id: messageId, clientMessageId } = message;\n if (messageId || clientMessageId) {\n this.modifyState((draft: ChatClientState) => {\n const threadMessages = draft.threads[threadId]?.chatMessages;\n const isLocalIdInMap = threadMessages && clientMessageId && threadMessages[clientMessageId];\n const messageKey = !messageId || isLocalIdInMap ? clientMessageId : messageId;\n\n if (threadMessages && messageKey) {\n threadMessages[messageKey] = message;\n }\n\n // remove typing indicator when receive a message from a user\n const thread = draft.threads[threadId];\n if (thread) {\n this.filterTypingIndicatorForUser(thread, message.sender);\n }\n });\n }\n }\n\n /* @conditional-compile-remove(teams-inline-images-and-file-sharing) */\n private parseAttachments(threadId: string, message: ChatMessageWithStatus): void {\n const attachments = message.content?.attachments;\n if (message.type === 'html' && attachments && attachments.length > 0) {\n if (\n this._inlineImageQueue &&\n !this._inlineImageQueue.containsMessageWithSameAttachments(message) &&\n message.resourceCache === undefined\n ) {\n // Need to discuss retry logic in case of failure\n this._inlineImageQueue.addMessage(message);\n this._inlineImageQueue.startQueue(threadId, fetchImageSource);\n }\n }\n }\n\n /**\n * Tees any errors encountered in an async function to the state.\n *\n * @param f 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 ChatError. Exceptions thrown from `f` are tagged with the failed `target.\n */\n public withAsyncErrorTeedToState<Args extends unknown[], R>(\n f: (...args: Args) => Promise<R>,\n target: ChatErrorTarget\n ): (...args: Args) => Promise<R> {\n return async (...args: Args): Promise<R> => {\n try {\n return await f(...args);\n } catch (error) {\n const chatError = toChatError(target, error);\n this.setLatestError(target, chatError);\n throw chatError;\n }\n };\n }\n\n /**\n * Tees any errors encountered in an function to the state.\n *\n * @param f 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 ChatError. Exceptions thrown from `f` are tagged with the failed `target.\n */\n public withErrorTeedToState<Args extends unknown[], R>(\n f: (...args: Args) => R,\n target: ChatErrorTarget\n ): (...args: Args) => R {\n return (...args: Args): R => {\n try {\n chatStatefulLogger.info(`Chat stateful client target function called: ${target}`);\n return f(...args);\n } catch (error) {\n const chatError = toChatError(target, error);\n this.setLatestError(target, chatError);\n throw chatError;\n }\n };\n }\n\n private setLatestError(target: ChatErrorTarget, error: ChatError): void {\n this.modifyState((draft: ChatClientState) => {\n draft.latestErrors[target] = error;\n });\n }\n\n // This is a mutating function, only use it inside of a produce() function\n private filterTypingIndicatorForUser(thread: ChatThreadClientState, userId?: CommunicationIdentifierKind): void {\n if (!userId) {\n return;\n }\n const typingIndicators = thread.typingIndicators;\n const userIdAsKey = toFlatCommunicationIdentifier(userId);\n const filteredTypingIndicators = typingIndicators.filter(\n (typingIndicator) => toFlatCommunicationIdentifier(typingIndicator.sender) !== userIdAsKey\n );\n if (filteredTypingIndicators.length !== typingIndicators.length) {\n thread.typingIndicators = filteredTypingIndicators;\n }\n }\n\n /**\n * Batch updates to minimize `stateChanged` events across related operations.\n *\n * - A maximum of one `stateChanged` event is emitted, at the end of the operations.\n * - No `stateChanged` event is emitted if the state did not change through the operations.\n * - In case of an exception, state is reset to the prior value and no `stateChanged` event is emitted.\n *\n * All operations finished in this batch should be synchronous.\n * This function is not reentrant -- do not call batch() from within another batch().\n */\n public batch(operations: () => void): void {\n if (this._batchMode) {\n throw new Error('batch() called from within another batch()');\n }\n\n this._batchMode = true;\n const priorState = this._state;\n try {\n operations();\n if (this._state !== priorState) {\n this._emitter.emit('stateChanged', this._state);\n }\n } catch (e) {\n this._state = priorState;\n if (getLogLevel() === 'verbose') {\n this._logger.warning(`State rollback to: ${_safeJSONStringify(priorState)}`);\n }\n throw e;\n } finally {\n this._batchMode = false;\n }\n }\n\n public onStateChange(handler: (state: ChatClientState) => void): void {\n this._emitter.on('stateChanged', handler);\n }\n\n public offStateChange(handler: (state: ChatClientState) => void): void {\n this._emitter.off('stateChanged', handler);\n }\n}\n\nconst toChatError = (target: ChatErrorTarget, error: unknown): ChatError => {\n if (error instanceof Error) {\n return new ChatError(target, error);\n }\n return new ChatError(target, new Error(`${error}`));\n};\n"]}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"ChatMessageWithStatus.js","sourceRoot":"","sources":["../../../../../../chat-stateful-client/src/types/ChatMessageWithStatus.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport { ChatMessage } from '@azure/communication-chat';\nimport { MessageStatus } from '@internal/acs-ui-common';\n\n/**\n * An extension to {@link @azure/communication-chat#ChatMessage} that stores\n * client-side only metadata for chat messages.\n *\n * TODO: The name has bitrotted. Rename me.\n *\n * @public\n */\nexport type ChatMessageWithStatus = ChatMessage & {\n clientMessageId?: string;\n status: MessageStatus;\n /* @conditional-compile-remove(data-loss-prevention) */\n policyViolation?: boolean;\n /* @conditional-compile-remove(teams-inline-images-and-file-sharing) */\n resourceCache?: Record<string, ResourceFetchResult>;\n};\n/* @conditional-compile-remove(teams-inline-images-and-file-sharing) */\n/**\n * Result of the Resource downloaded from stateful client\n * @public\n */\nexport type ResourceFetchResult = {\n sourceUrl
|
1
|
+
{"version":3,"file":"ChatMessageWithStatus.js","sourceRoot":"","sources":["../../../../../../chat-stateful-client/src/types/ChatMessageWithStatus.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport { ChatMessage } from '@azure/communication-chat';\nimport { MessageStatus } from '@internal/acs-ui-common';\n\n/**\n * An extension to {@link @azure/communication-chat#ChatMessage} that stores\n * client-side only metadata for chat messages.\n *\n * TODO: The name has bitrotted. Rename me.\n *\n * @public\n */\nexport type ChatMessageWithStatus = ChatMessage & {\n clientMessageId?: string;\n status: MessageStatus;\n /* @conditional-compile-remove(data-loss-prevention) */\n policyViolation?: boolean;\n /* @conditional-compile-remove(teams-inline-images-and-file-sharing) */\n resourceCache?: Record<string, ResourceFetchResult>;\n};\n/* @conditional-compile-remove(teams-inline-images-and-file-sharing) */\n/**\n * Result of the Resource downloaded from stateful client\n * @public\n */\nexport type ResourceFetchResult = {\n sourceUrl?: string;\n error?: Error;\n};\n"]}
|