@webex/contact-center 3.12.0-llmrefactor.1 → 3.12.0-llmrefactor.10
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/.sdd/manifest.json +7 -5
- package/ai-docs/ARCHITECTURE.md +1 -1
- package/ai-docs/CONTRACTS.md +8 -3
- package/ai-docs/SECURITY.md +1 -1
- package/ai-docs/contact-center-spec.md +22 -4
- package/ai-docs/features/consult-transfer-list-policy/spec/feature-spec.md +362 -0
- package/dist/cc.js +544 -12
- package/dist/cc.js.map +1 -1
- package/dist/config.js +7 -0
- package/dist/config.js.map +1 -1
- package/dist/constants.js +10 -2
- package/dist/constants.js.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/metrics/MetricsManager.js +16 -0
- package/dist/metrics/MetricsManager.js.map +1 -1
- package/dist/metrics/behavioral-events.js +104 -0
- package/dist/metrics/behavioral-events.js.map +1 -1
- package/dist/metrics/constants.js +18 -0
- package/dist/metrics/constants.js.map +1 -1
- package/dist/services/AddressBook.js +18 -15
- package/dist/services/AddressBook.js.map +1 -1
- package/dist/services/AnswerCallOnWebexService.js +202 -0
- package/dist/services/AnswerCallOnWebexService.js.map +1 -0
- package/dist/services/EntryPoint.js +46 -68
- package/dist/services/EntryPoint.js.map +1 -1
- package/dist/services/Queue.js +27 -22
- package/dist/services/Queue.js.map +1 -1
- package/dist/services/WebexCrossClientService.js +222 -0
- package/dist/services/WebexCrossClientService.js.map +1 -0
- package/dist/services/WxAppTelephonyMercurySync.js +108 -0
- package/dist/services/WxAppTelephonyMercurySync.js.map +1 -0
- package/dist/services/config/Util.js +3 -0
- package/dist/services/config/Util.js.map +1 -1
- package/dist/services/config/constants.js +10 -6
- package/dist/services/config/constants.js.map +1 -1
- package/dist/services/config/types.js +4 -0
- package/dist/services/config/types.js.map +1 -1
- package/dist/services/core/Err.js.map +1 -1
- package/dist/services/core/WebexRequest.js +6 -2
- package/dist/services/core/WebexRequest.js.map +1 -1
- package/dist/services/core/aqm-reqs.js +28 -14
- package/dist/services/core/aqm-reqs.js.map +1 -1
- package/dist/services/core/types.js.map +1 -1
- package/dist/services/task/Task.js +73 -7
- package/dist/services/task/Task.js.map +1 -1
- package/dist/services/task/TaskFactory.js +8 -4
- package/dist/services/task/TaskFactory.js.map +1 -1
- package/dist/services/task/TaskManager.js +490 -21
- package/dist/services/task/TaskManager.js.map +1 -1
- package/dist/services/task/WebexCallingUtils.js +70 -0
- package/dist/services/task/WebexCallingUtils.js.map +1 -0
- package/dist/services/task/constants.js +4 -1
- package/dist/services/task/constants.js.map +1 -1
- package/dist/services/task/contact.js +29 -0
- package/dist/services/task/contact.js.map +1 -1
- package/dist/services/task/digital/Digital.js +3 -2
- package/dist/services/task/digital/Digital.js.map +1 -1
- package/dist/services/task/state-machine/TaskStateMachine.js +162 -53
- package/dist/services/task/state-machine/TaskStateMachine.js.map +1 -1
- package/dist/services/task/state-machine/actions.js +6 -1
- package/dist/services/task/state-machine/actions.js.map +1 -1
- package/dist/services/task/state-machine/guards.js +7 -10
- package/dist/services/task/state-machine/guards.js.map +1 -1
- package/dist/services/task/state-machine/types.js.map +1 -1
- package/dist/services/task/state-machine/uiControlsComputer.js +118 -18
- package/dist/services/task/state-machine/uiControlsComputer.js.map +1 -1
- package/dist/services/task/types.js +16 -1
- package/dist/services/task/types.js.map +1 -1
- package/dist/services/task/voice/Voice.js +456 -15
- package/dist/services/task/voice/Voice.js.map +1 -1
- package/dist/services/task/voice/WebRTC.js +4 -1
- package/dist/services/task/voice/WebRTC.js.map +1 -1
- package/dist/services/task/voice/wxAppVoiceMethods.js +354 -0
- package/dist/services/task/voice/wxAppVoiceMethods.js.map +1 -0
- package/dist/services/wxAppDiagnosticLogging.js +122 -0
- package/dist/services/wxAppDiagnosticLogging.js.map +1 -0
- package/dist/services/wxAppTelephonyUtils.js +19 -0
- package/dist/services/wxAppTelephonyUtils.js.map +1 -0
- package/dist/types/cc.d.ts +78 -4
- package/dist/types/config.d.ts +7 -0
- package/dist/types/constants.d.ts +8 -0
- package/dist/types/index.d.ts +3 -1
- package/dist/types/metrics/MetricsManager.d.ts +6 -0
- package/dist/types/metrics/constants.d.ts +17 -0
- package/dist/types/services/AddressBook.d.ts +2 -1
- package/dist/types/services/AnswerCallOnWebexService.d.ts +38 -0
- package/dist/types/services/EntryPoint.d.ts +7 -5
- package/dist/types/services/Queue.d.ts +5 -3
- package/dist/types/services/WebexCrossClientService.d.ts +32 -0
- package/dist/types/services/WxAppTelephonyMercurySync.d.ts +28 -0
- package/dist/types/services/config/constants.d.ts +8 -5
- package/dist/types/services/config/types.d.ts +17 -4
- package/dist/types/services/core/Err.d.ts +2 -0
- package/dist/types/services/core/WebexRequest.d.ts +1 -0
- package/dist/types/services/core/types.d.ts +2 -0
- package/dist/types/services/task/Task.d.ts +20 -2
- package/dist/types/services/task/TaskFactory.d.ts +2 -1
- package/dist/types/services/task/WebexCallingUtils.d.ts +11 -0
- package/dist/types/services/task/constants.d.ts +3 -0
- package/dist/types/services/task/contact.d.ts +4 -0
- package/dist/types/services/task/digital/Digital.d.ts +2 -2
- package/dist/types/services/task/state-machine/TaskStateMachine.d.ts +304 -56
- package/dist/types/services/task/state-machine/guards.d.ts +6 -5
- package/dist/types/services/task/state-machine/types.d.ts +9 -1
- package/dist/types/services/task/types.d.ts +81 -4
- package/dist/types/services/task/voice/Voice.d.ts +52 -9
- package/dist/types/services/task/voice/WebRTC.d.ts +2 -2
- package/dist/types/services/task/voice/wxAppVoiceMethods.d.ts +55 -0
- package/dist/types/services/wxAppDiagnosticLogging.d.ts +51 -0
- package/dist/types/services/wxAppTelephonyUtils.d.ts +5 -0
- package/dist/types/types.d.ts +14 -8
- package/dist/types/utils/PageCache.d.ts +20 -3
- package/dist/types.js +7 -2
- package/dist/types.js.map +1 -1
- package/dist/utils/PageCache.js +19 -5
- package/dist/utils/PageCache.js.map +1 -1
- package/dist/webex.js +1 -1
- package/package.json +8 -8
- package/src/cc.ts +657 -12
- package/src/config.ts +7 -0
- package/src/constants.ts +8 -0
- package/src/index.ts +2 -0
- package/src/metrics/MetricsManager.ts +16 -0
- package/src/metrics/ai-docs/metrics-spec.md +78 -10
- package/src/metrics/behavioral-events.ts +106 -0
- package/src/metrics/constants.ts +20 -0
- package/src/services/AddressBook.ts +17 -6
- package/src/services/AnswerCallOnWebexService.ts +239 -0
- package/src/services/EntryPoint.ts +59 -60
- package/src/services/Queue.ts +29 -12
- package/src/services/WebexCrossClientService.ts +293 -0
- package/src/services/WxAppTelephonyMercurySync.ts +142 -0
- package/src/services/agent/ai-docs/agent-spec.md +1 -0
- package/src/services/ai-docs/AGENTS.md +10 -10
- package/src/services/ai-docs/services-spec.md +6 -1
- package/src/services/config/Util.ts +3 -0
- package/src/services/config/ai-docs/AGENTS.md +1 -1
- package/src/services/config/ai-docs/ARCHITECTURE.md +2 -2
- package/src/services/config/ai-docs/config-spec.md +6 -0
- package/src/services/config/constants.ts +10 -6
- package/src/services/config/types.ts +16 -4
- package/src/services/core/Err.ts +1 -0
- package/src/services/core/WebexRequest.ts +3 -1
- package/src/services/core/ai-docs/core-spec.md +5 -1
- package/src/services/core/aqm-reqs.ts +30 -15
- package/src/services/core/types.ts +2 -0
- package/src/services/task/Task.ts +79 -8
- package/src/services/task/TaskFactory.ts +8 -3
- package/src/services/task/TaskManager.ts +716 -17
- package/src/services/task/WebexCallingUtils.ts +136 -0
- package/src/services/task/ai-docs/ARCHITECTURE.md +1 -0
- package/src/services/task/ai-docs/task-spec.md +156 -3
- package/src/services/task/constants.ts +3 -0
- package/src/services/task/contact.ts +30 -0
- package/src/services/task/digital/Digital.ts +4 -2
- package/src/services/task/state-machine/TaskStateMachine.ts +235 -81
- package/src/services/task/state-machine/actions.ts +5 -2
- package/src/services/task/state-machine/ai-docs/AGENTS.md +6 -4
- package/src/services/task/state-machine/ai-docs/ARCHITECTURE.md +35 -16
- package/src/services/task/state-machine/ai-docs/task-state-machine-spec.md +103 -33
- package/src/services/task/state-machine/guards.ts +7 -10
- package/src/services/task/state-machine/types.ts +16 -1
- package/src/services/task/state-machine/uiControlsComputer.ts +206 -32
- package/src/services/task/types.ts +114 -4
- package/src/services/task/voice/Voice.ts +595 -14
- package/src/services/task/voice/WebRTC.ts +5 -1
- package/src/services/task/voice/wxAppVoiceMethods.ts +516 -0
- package/src/services/wxAppDiagnosticLogging.ts +174 -0
- package/src/services/wxAppTelephonyUtils.ts +14 -0
- package/src/types.ts +33 -9
- package/src/utils/AGENTS.md +21 -10
- package/src/utils/PageCache.ts +38 -5
- package/src/utils/ai-docs/utils-spec.md +21 -11
- package/test/unit/spec/cc.ts +1522 -19
- package/test/unit/spec/metrics/MetricsManager.ts +25 -0
- package/test/unit/spec/metrics/behavioral-events.ts +60 -0
- package/test/unit/spec/services/AddressBook.ts +37 -6
- package/test/unit/spec/services/AnswerCallOnWebexService.ts +264 -0
- package/test/unit/spec/services/EntryPoint.ts +87 -40
- package/test/unit/spec/services/Queue.ts +123 -12
- package/test/unit/spec/services/WebexCrossClientService.ts +467 -0
- package/test/unit/spec/services/WxAppTelephonyMercurySync.ts +136 -0
- package/test/unit/spec/services/config/Util.ts +85 -0
- package/test/unit/spec/services/core/WebexRequest.ts +3 -1
- package/test/unit/spec/services/core/aqm-reqs.ts +113 -1
- package/test/unit/spec/services/task/Task.ts +274 -6
- package/test/unit/spec/services/task/TaskFactory.ts +39 -2
- package/test/unit/spec/services/task/TaskManager.ts +1717 -9
- package/test/unit/spec/services/task/WebexCallingUtils.ts +153 -0
- package/test/unit/spec/services/task/contact.ts +33 -0
- package/test/unit/spec/services/task/state-machine/TaskStateMachine.ts +1485 -109
- package/test/unit/spec/services/task/state-machine/guards.ts +210 -8
- package/test/unit/spec/services/task/state-machine/uiControlsComputer.ts +445 -7
- package/test/unit/spec/services/task/voice/Voice.ts +1412 -0
- package/test/unit/spec/services/task/voice/wxAppVoiceMethods.ts +603 -0
- package/test/unit/spec/services/wxAppDiagnosticLogging.ts +143 -0
- package/umd/contact-center.min.js +2 -2
- package/umd/contact-center.min.js.map +1 -1
package/dist/cc.js
CHANGED
|
@@ -19,6 +19,10 @@ var _Utils = require("./services/core/Utils");
|
|
|
19
19
|
var _types3 = require("./services/config/types");
|
|
20
20
|
var _TaskManager = _interopRequireDefault(require("./services/task/TaskManager"));
|
|
21
21
|
var _WebCallingService = _interopRequireDefault(require("./services/WebCallingService"));
|
|
22
|
+
var _AnswerCallOnWebexService = _interopRequireDefault(require("./services/AnswerCallOnWebexService"));
|
|
23
|
+
var _WebexCrossClientService = _interopRequireDefault(require("./services/WebexCrossClientService"));
|
|
24
|
+
var _WxAppTelephonyMercurySync = _interopRequireDefault(require("./services/WxAppTelephonyMercurySync"));
|
|
25
|
+
var _wxAppDiagnosticLogging = require("./services/wxAppDiagnosticLogging");
|
|
22
26
|
var _types4 = require("./services/task/types");
|
|
23
27
|
var _MetricsManager = _interopRequireDefault(require("./metrics/MetricsManager"));
|
|
24
28
|
var _constants4 = require("./metrics/constants");
|
|
@@ -185,6 +189,29 @@ class ContactCenter extends _webexCore.WebexPlugin {
|
|
|
185
189
|
* @private
|
|
186
190
|
*/
|
|
187
191
|
|
|
192
|
+
/**
|
|
193
|
+
* REST telephony for wxApp thick-client answer (WXCC-6026)
|
|
194
|
+
* @private
|
|
195
|
+
*/
|
|
196
|
+
|
|
197
|
+
/**
|
|
198
|
+
* usersub cross-client state for Webex App toast suppression
|
|
199
|
+
* @private
|
|
200
|
+
*/
|
|
201
|
+
|
|
202
|
+
/**
|
|
203
|
+
* Mercury telephony mute sync for wxApp thick-client answer
|
|
204
|
+
* @private
|
|
205
|
+
*/
|
|
206
|
+
|
|
207
|
+
/** True when wxApp mute sync opened Mercury (Extension/DN-only profiles). */
|
|
208
|
+
wxAppMercuryConnectedByCc = false;
|
|
209
|
+
|
|
210
|
+
/** True when wxApp mute sync registered the Webex device. */
|
|
211
|
+
wxAppDeviceRegisteredByCc = false;
|
|
212
|
+
static WXAPP_FALSE_PUBLISH_RETRY_DELAY_MS = 30_000;
|
|
213
|
+
static WXAPP_FALSE_PUBLISH_MAX_RETRIES = 3;
|
|
214
|
+
|
|
188
215
|
/**
|
|
189
216
|
* Core service managers for Contact Center operations
|
|
190
217
|
* Includes agent, connection, and configuration services
|
|
@@ -345,11 +372,15 @@ class ContactCenter extends _webexCore.WebexPlugin {
|
|
|
345
372
|
connectionConfig: this.getConnectionConfig()
|
|
346
373
|
});
|
|
347
374
|
this.webCallingService = new _WebCallingService.default(this.$webex);
|
|
375
|
+
this.answerCallOnWebexService = new _AnswerCallOnWebexService.default(this.$webex);
|
|
376
|
+
this.webexCrossClientService = new _WebexCrossClientService.default(this.$webex);
|
|
377
|
+
this.wxAppTelephonyMercurySync = new _WxAppTelephonyMercurySync.default(this.$webex);
|
|
348
378
|
this.apiAIAssistant = new _ApiAiAssistant.ApiAIAssistant(this.$webex);
|
|
349
379
|
this.metricsManager = _MetricsManager.default.getInstance({
|
|
350
380
|
webex: this.$webex
|
|
351
381
|
});
|
|
352
382
|
this.taskManager = _TaskManager.default.getTaskManager(this.apiAIAssistant, this.services.contact, this.webCallingService, this.services.webSocketManager, this.services.rtdWebSocketManager);
|
|
383
|
+
this.taskManager.setAnswerCallOnWebexService(this.answerCallOnWebexService);
|
|
353
384
|
this.incomingTaskListener();
|
|
354
385
|
|
|
355
386
|
// Initialize API instances
|
|
@@ -541,6 +572,11 @@ class ContactCenter extends _webexCore.WebexPlugin {
|
|
|
541
572
|
this.services.webSocketManager.off('message', this.handleWebsocketMessage);
|
|
542
573
|
this.services.rtdWebSocketManager.off('message', this.handleRTDWebsocketMessage);
|
|
543
574
|
this.services.connectionService.off('connectionLost', this.handleConnectionLost);
|
|
575
|
+
const {
|
|
576
|
+
publishError: wxAppPublishError
|
|
577
|
+
} = await this.teardownWxAppLocalState({
|
|
578
|
+
clearInitFlag: true
|
|
579
|
+
});
|
|
544
580
|
if (this.agentConfig.webRtcEnabled && this.agentConfig.loginVoiceOptions.includes(_types.LoginOption.BROWSER)) {
|
|
545
581
|
if (this.$webex.internal.mercury.connected) {
|
|
546
582
|
this.$webex.internal.mercury.off('online');
|
|
@@ -566,6 +602,9 @@ class ContactCenter extends _webexCore.WebexPlugin {
|
|
|
566
602
|
|
|
567
603
|
// Clear any cached agent configuration
|
|
568
604
|
this.agentConfig = null;
|
|
605
|
+
if (wxAppPublishError) {
|
|
606
|
+
throw wxAppPublishError;
|
|
607
|
+
}
|
|
569
608
|
_loggerProxy.default.log('Deregistered successfully', {
|
|
570
609
|
module: _constants.CC_FILE,
|
|
571
610
|
method: _constants.METHODS.DEREGISTER
|
|
@@ -619,6 +658,12 @@ class ContactCenter extends _webexCore.WebexPlugin {
|
|
|
619
658
|
* ```
|
|
620
659
|
*/
|
|
621
660
|
async getBuddyAgents(data) {
|
|
661
|
+
const {
|
|
662
|
+
action,
|
|
663
|
+
state,
|
|
664
|
+
mediaType = 'telephony'
|
|
665
|
+
} = data;
|
|
666
|
+
const buddyAgentState = state ?? (action === 'Transfer' ? _constants2.AGENT_STATE_AVAILABLE : undefined);
|
|
622
667
|
_loggerProxy.default.info('Fetching buddy agents', {
|
|
623
668
|
module: _constants.CC_FILE,
|
|
624
669
|
method: _constants.METHODS.GET_BUDDY_AGENTS
|
|
@@ -628,13 +673,16 @@ class ContactCenter extends _webexCore.WebexPlugin {
|
|
|
628
673
|
const resp = await this.services.agent.buddyAgents({
|
|
629
674
|
data: {
|
|
630
675
|
agentProfileId: this.agentConfig.agentProfileID,
|
|
631
|
-
|
|
676
|
+
mediaType,
|
|
677
|
+
...(buddyAgentState ? {
|
|
678
|
+
state: buddyAgentState
|
|
679
|
+
} : {})
|
|
632
680
|
}
|
|
633
681
|
});
|
|
634
682
|
this.metricsManager.trackEvent(_constants4.METRIC_EVENT_NAMES.FETCH_BUDDY_AGENTS_SUCCESS, {
|
|
635
683
|
..._MetricsManager.default.getCommonTrackingFieldForAQMResponse(resp),
|
|
636
|
-
mediaType
|
|
637
|
-
buddyAgentState
|
|
684
|
+
mediaType,
|
|
685
|
+
buddyAgentState,
|
|
638
686
|
buddyAgentCount: resp.data.agentList.length
|
|
639
687
|
}, ['operational']);
|
|
640
688
|
_loggerProxy.default.log(`Successfully retrieved ${resp.data.agentList.length} buddy agents`, {
|
|
@@ -647,8 +695,8 @@ class ContactCenter extends _webexCore.WebexPlugin {
|
|
|
647
695
|
const failureResp = error.details;
|
|
648
696
|
this.metricsManager.trackEvent(_constants4.METRIC_EVENT_NAMES.FETCH_BUDDY_AGENTS_FAILED, {
|
|
649
697
|
..._MetricsManager.default.getCommonTrackingFieldForAQMResponseFailed(failureResp),
|
|
650
|
-
mediaType
|
|
651
|
-
buddyAgentState
|
|
698
|
+
mediaType,
|
|
699
|
+
buddyAgentState
|
|
652
700
|
}, ['operational']);
|
|
653
701
|
const {
|
|
654
702
|
error: detailedError
|
|
@@ -685,7 +733,14 @@ class ContactCenter extends _webexCore.WebexPlugin {
|
|
|
685
733
|
isEndConsultEnabled: this.agentConfig.isEndConsultEnabled,
|
|
686
734
|
webRtcEnabled: this.agentConfig.webRtcEnabled,
|
|
687
735
|
autoWrapup: this.agentConfig.wrapUpData?.wrapUpProps?.autoWrapup ?? false,
|
|
688
|
-
aiFeature: this.agentConfig.aiFeature
|
|
736
|
+
aiFeature: this.agentConfig.aiFeature,
|
|
737
|
+
consultTransfer: {
|
|
738
|
+
allowConsultToQueue: this.agentConfig.allowConsultToQueue,
|
|
739
|
+
accessQueue: this.agentConfig.accessQueue,
|
|
740
|
+
accessEntryPoint: this.agentConfig.accessEntryPoint,
|
|
741
|
+
accessBuddyTeam: this.agentConfig.accessBuddyTeam
|
|
742
|
+
},
|
|
743
|
+
enableWxBetterTogether: this.isWxBetterTogetherEnabled()
|
|
689
744
|
};
|
|
690
745
|
this.taskManager.setConfigFlags(configFlags);
|
|
691
746
|
// TODO: Make profile a singleton to make it available throughout app/sdk so we dont need to inject info everywhere
|
|
@@ -807,13 +862,15 @@ class ContactCenter extends _webexCore.WebexPlugin {
|
|
|
807
862
|
throw error;
|
|
808
863
|
}
|
|
809
864
|
}
|
|
865
|
+
const deviceId = this.getDeviceId(data.loginOption, data.dialNumber);
|
|
810
866
|
const loginResponse = await this.services.agent.stationLogin({
|
|
811
867
|
data: {
|
|
812
|
-
|
|
868
|
+
// BROWSER DN must be webrtc-{agentId} so VPOP/RTMS do not treat a bare UUID as PSTN.
|
|
869
|
+
dialNumber: data.loginOption === _types.LoginOption.BROWSER ? deviceId : data.dialNumber,
|
|
813
870
|
teamId: data.teamId,
|
|
814
871
|
deviceType: data.loginOption,
|
|
815
872
|
isExtension: data.loginOption === _types.LoginOption.EXTENSION,
|
|
816
|
-
deviceId
|
|
873
|
+
deviceId,
|
|
817
874
|
roles: [_constants3.AGENT],
|
|
818
875
|
teamName: _constants.EMPTY_STRING,
|
|
819
876
|
siteId: _constants.EMPTY_STRING,
|
|
@@ -846,6 +903,13 @@ class ContactCenter extends _webexCore.WebexPlugin {
|
|
|
846
903
|
notifsTrackingId: resp.trackingId
|
|
847
904
|
};
|
|
848
905
|
this.webCallingService.setLoginOption(data.loginOption);
|
|
906
|
+
if (this.agentConfig) {
|
|
907
|
+
this.agentConfig.deviceType = data.loginOption;
|
|
908
|
+
if (data.loginOption === _types.LoginOption.AGENT_DN || data.loginOption === _types.LoginOption.EXTENSION) {
|
|
909
|
+
this.agentConfig.defaultDn = data.dialNumber;
|
|
910
|
+
this.agentConfig.dn = data.dialNumber;
|
|
911
|
+
}
|
|
912
|
+
}
|
|
849
913
|
this.metricsManager.trackEvent(_constants4.METRIC_EVENT_NAMES.STATION_LOGIN_SUCCESS, {
|
|
850
914
|
..._MetricsManager.default.getCommonTrackingFieldForAQMResponse(resp),
|
|
851
915
|
loginType: data.loginOption,
|
|
@@ -858,6 +922,7 @@ class ContactCenter extends _webexCore.WebexPlugin {
|
|
|
858
922
|
method: _constants.METHODS.STATION_LOGIN,
|
|
859
923
|
trackingId: resp.trackingId
|
|
860
924
|
});
|
|
925
|
+
await this.ensureWxAppPostStationLogin();
|
|
861
926
|
return response;
|
|
862
927
|
} catch (error) {
|
|
863
928
|
const failure = error.details;
|
|
@@ -912,6 +977,7 @@ class ContactCenter extends _webexCore.WebexPlugin {
|
|
|
912
977
|
if (this.webCallingService) {
|
|
913
978
|
this.webCallingService.deregisterWebCallingLine();
|
|
914
979
|
}
|
|
980
|
+
await this.teardownWxAppLocalState();
|
|
915
981
|
_loggerProxy.default.log(`Agent station logout completed successfully`, {
|
|
916
982
|
module: _constants.CC_FILE,
|
|
917
983
|
method: _constants.METHODS.STATION_LOGOUT,
|
|
@@ -1170,6 +1236,471 @@ class ContactCenter extends _webexCore.WebexPlugin {
|
|
|
1170
1236
|
}
|
|
1171
1237
|
}
|
|
1172
1238
|
|
|
1239
|
+
/**
|
|
1240
|
+
* Whether wxApp thick-client answer is enabled for this SDK instance.
|
|
1241
|
+
* @public
|
|
1242
|
+
*/
|
|
1243
|
+
isWxBetterTogetherEnabled() {
|
|
1244
|
+
return this.$config?.enableWxBetterTogether === true;
|
|
1245
|
+
}
|
|
1246
|
+
|
|
1247
|
+
/**
|
|
1248
|
+
* Current station login option (Extension, Dial Number, or Browser/Desktop).
|
|
1249
|
+
* Prefer webCallingService — updated on every stationLogin before wxApp hooks run.
|
|
1250
|
+
* @private
|
|
1251
|
+
*/
|
|
1252
|
+
getCurrentStationLoginOption() {
|
|
1253
|
+
return this.webCallingService?.loginOption ?? this.agentConfig?.deviceType;
|
|
1254
|
+
}
|
|
1255
|
+
|
|
1256
|
+
/**
|
|
1257
|
+
* wxApp thick-client answer is supported for Extension and Dial Number station login only —
|
|
1258
|
+
* not Browser/Desktop (WebRTC) login.
|
|
1259
|
+
* @private
|
|
1260
|
+
*/
|
|
1261
|
+
assertWxAppStationLoginSupportedForEnable() {
|
|
1262
|
+
const loginOption = this.getCurrentStationLoginOption();
|
|
1263
|
+
if (loginOption !== _types.LoginOption.EXTENSION && loginOption !== _types.LoginOption.AGENT_DN) {
|
|
1264
|
+
throw new Error('setManageWebexCallingInWxcc requires EXTENSION or AGENT_DN station login. Complete station login before enabling.');
|
|
1265
|
+
}
|
|
1266
|
+
}
|
|
1267
|
+
|
|
1268
|
+
/**
|
|
1269
|
+
* Clears runtime wxApp config after logout/deregister so stale flags do not apply on relogin.
|
|
1270
|
+
* @private
|
|
1271
|
+
*/
|
|
1272
|
+
resetEnableWxBetterTogetherConfig() {
|
|
1273
|
+
if (this.$config) {
|
|
1274
|
+
this.$config.enableWxBetterTogether = false;
|
|
1275
|
+
}
|
|
1276
|
+
this.taskManager.applyEnableWxBetterTogether(false);
|
|
1277
|
+
}
|
|
1278
|
+
|
|
1279
|
+
/**
|
|
1280
|
+
* Runtime enable/disable for wxApp Better Together (toast suppression + Mercury mute sync).
|
|
1281
|
+
*
|
|
1282
|
+
* **Phase 1 (WXCC-6026 / MMT): NOT part of the public host contract.**
|
|
1283
|
+
* Hosts must set `webexConfig.cc.enableWxBetterTogether` before `webex.init()` / `cc.register()`.
|
|
1284
|
+
* To change the flag after the SDK is initialized, re-init the SDK with the updated config.
|
|
1285
|
+
*
|
|
1286
|
+
* **Supported public read API:** {@link isWxBetterTogetherEnabled}.
|
|
1287
|
+
* **Supported telephony API:** unified `task.accept()`, `task.decline()`, `task.toggleMute()`,
|
|
1288
|
+
* `task.transmitDtmf()` — SDK routes wxApp calls internally when the init flag is active.
|
|
1289
|
+
*
|
|
1290
|
+
* **Production lifecycle does not call this method.** Station login, silent relogin, logout,
|
|
1291
|
+
* and deregister use {@link ensureWxAppPostStationLogin} and {@link teardownWxAppLocalState}
|
|
1292
|
+
* (usersub publish + Mercury subscribe/unsubscribe based on the init flag).
|
|
1293
|
+
*
|
|
1294
|
+
* This setter remains as a **private implementation** for Phase 2 runtime toggle and unit tests.
|
|
1295
|
+
* It updates `$config.enableWxBetterTogether`, TaskManager flags, cross-client usersub
|
|
1296
|
+
* (`answer-calls-on-wxcc`), and Mercury mute sync; rolls back config on publish/connect failure.
|
|
1297
|
+
*
|
|
1298
|
+
* @param enabled - `true` to enable wxApp answer + usersub suppression; `false` to disable and tear down.
|
|
1299
|
+
* @throws When enabling without login, on unsupported BROWSER station login, or when usersub/Mercury init fails.
|
|
1300
|
+
* @internal
|
|
1301
|
+
* @see enableWxBetterTogether (CCPluginConfig init flag)
|
|
1302
|
+
* @see ensureWxAppPostStationLogin
|
|
1303
|
+
* @see teardownWxAppLocalState
|
|
1304
|
+
*/
|
|
1305
|
+
async setManageWebexCallingInWxcc(enabled) {
|
|
1306
|
+
if (enabled && !this.$webex.internal.device?.userId) {
|
|
1307
|
+
throw new Error('Cannot publish answer-calls-on-wxcc: user is not logged in');
|
|
1308
|
+
}
|
|
1309
|
+
if (enabled) {
|
|
1310
|
+
this.assertWxAppStationLoginSupportedForEnable();
|
|
1311
|
+
}
|
|
1312
|
+
const previousEnabled = this.isWxBetterTogetherEnabled();
|
|
1313
|
+
if (this.$config) {
|
|
1314
|
+
this.$config.enableWxBetterTogether = enabled;
|
|
1315
|
+
}
|
|
1316
|
+
this.taskManager.applyEnableWxBetterTogether(enabled);
|
|
1317
|
+
let publishedEnable = false;
|
|
1318
|
+
try {
|
|
1319
|
+
if (enabled) {
|
|
1320
|
+
await this.ensureWxAppMercuryAndSubscribe();
|
|
1321
|
+
await this.publishAnswerOnWebexCrossClientState(true);
|
|
1322
|
+
publishedEnable = true;
|
|
1323
|
+
this.taskManager.syncWxAppMuteFromCallDetailsForAllTasks();
|
|
1324
|
+
} else {
|
|
1325
|
+
await this.publishAnswerOnWebexCrossClientState(false);
|
|
1326
|
+
this.wxAppTelephonyMercurySync.unsubscribe();
|
|
1327
|
+
await this.releaseWxAppMercuryResources();
|
|
1328
|
+
}
|
|
1329
|
+
} catch (error) {
|
|
1330
|
+
if (publishedEnable) {
|
|
1331
|
+
await this.revertWxAppCrossClientPublish();
|
|
1332
|
+
} else if (enabled) {
|
|
1333
|
+
this.wxAppTelephonyMercurySync.unsubscribe();
|
|
1334
|
+
await this.releaseWxAppMercuryResources();
|
|
1335
|
+
}
|
|
1336
|
+
if (this.$config) {
|
|
1337
|
+
this.$config.enableWxBetterTogether = previousEnabled;
|
|
1338
|
+
}
|
|
1339
|
+
this.taskManager.applyEnableWxBetterTogether(previousEnabled);
|
|
1340
|
+
throw error;
|
|
1341
|
+
}
|
|
1342
|
+
}
|
|
1343
|
+
getWxAppTelephonyTaskType() {
|
|
1344
|
+
const loginOption = this.getCurrentStationLoginOption();
|
|
1345
|
+
if (loginOption === _types.LoginOption.BROWSER) {
|
|
1346
|
+
return 'WebRTC';
|
|
1347
|
+
}
|
|
1348
|
+
if (loginOption === _types.LoginOption.EXTENSION || loginOption === _types.LoginOption.AGENT_DN) {
|
|
1349
|
+
return 'Voice';
|
|
1350
|
+
}
|
|
1351
|
+
return 'unknown';
|
|
1352
|
+
}
|
|
1353
|
+
async ensureWxAppPostStationLogin() {
|
|
1354
|
+
const loginOption = this.getCurrentStationLoginOption();
|
|
1355
|
+
const flagEnabled = this.isWxBetterTogetherEnabled();
|
|
1356
|
+
const telephonyTaskType = this.getWxAppTelephonyTaskType();
|
|
1357
|
+
if (loginOption === _types.LoginOption.BROWSER) {
|
|
1358
|
+
if (flagEnabled) {
|
|
1359
|
+
(0, _wxAppDiagnosticLogging.logWxAppSessionReadiness)({
|
|
1360
|
+
enableWxBetterTogether: true,
|
|
1361
|
+
loginOption,
|
|
1362
|
+
wxAppHooksApplied: false,
|
|
1363
|
+
usersubPublished: false,
|
|
1364
|
+
mercurySubscribed: false,
|
|
1365
|
+
telephonyTaskType,
|
|
1366
|
+
skipReason: 'unsupported_browser_login'
|
|
1367
|
+
});
|
|
1368
|
+
this.metricsManager.trackEvent(_constants4.METRIC_EVENT_NAMES.WXAPP_SESSION_SKIPPED, {
|
|
1369
|
+
loginOption,
|
|
1370
|
+
enableWxBetterTogether: true,
|
|
1371
|
+
skipReason: 'unsupported_browser_login'
|
|
1372
|
+
}, ['operational', 'behavioral']);
|
|
1373
|
+
}
|
|
1374
|
+
return;
|
|
1375
|
+
}
|
|
1376
|
+
let publishedEnable = false;
|
|
1377
|
+
let wxAppInitStage = 'mercury';
|
|
1378
|
+
try {
|
|
1379
|
+
if (flagEnabled) {
|
|
1380
|
+
this.metricsManager.timeEvent([_constants4.METRIC_EVENT_NAMES.WXAPP_SESSION_INIT_SUCCESS, _constants4.METRIC_EVENT_NAMES.WXAPP_SESSION_INIT_FAILED]);
|
|
1381
|
+
await this.ensureWxAppMercuryAndSubscribe();
|
|
1382
|
+
wxAppInitStage = 'publish';
|
|
1383
|
+
await this.publishAnswerOnWebexCrossClientState(true);
|
|
1384
|
+
publishedEnable = true;
|
|
1385
|
+
this.taskManager.syncWxAppMuteFromCallDetailsForAllTasks();
|
|
1386
|
+
const mercurySubscribed = this.wxAppTelephonyMercurySync.isSubscribed();
|
|
1387
|
+
const usersubPublished = this.webexCrossClientService.isAnswerCallsStateActive();
|
|
1388
|
+
(0, _wxAppDiagnosticLogging.logWxAppSessionReadiness)({
|
|
1389
|
+
enableWxBetterTogether: true,
|
|
1390
|
+
loginOption,
|
|
1391
|
+
wxAppHooksApplied: true,
|
|
1392
|
+
usersubPublished,
|
|
1393
|
+
mercurySubscribed,
|
|
1394
|
+
telephonyTaskType
|
|
1395
|
+
});
|
|
1396
|
+
const sessionInitReady = mercurySubscribed && usersubPublished;
|
|
1397
|
+
if (sessionInitReady) {
|
|
1398
|
+
this.metricsManager.trackEvent(_constants4.METRIC_EVENT_NAMES.WXAPP_SESSION_INIT_SUCCESS, {
|
|
1399
|
+
loginOption,
|
|
1400
|
+
enableWxBetterTogether: true
|
|
1401
|
+
}, ['operational', 'behavioral']);
|
|
1402
|
+
} else {
|
|
1403
|
+
this.metricsManager.trackEvent(_constants4.METRIC_EVENT_NAMES.WXAPP_SESSION_INIT_FAILED, {
|
|
1404
|
+
loginOption,
|
|
1405
|
+
enableWxBetterTogether: true,
|
|
1406
|
+
skipReason: !usersubPublished ? 'usersub_not_published' : 'mercury_not_subscribed'
|
|
1407
|
+
}, ['operational', 'behavioral']);
|
|
1408
|
+
}
|
|
1409
|
+
} else {
|
|
1410
|
+
await this.ensureWxAppDeviceRegistered();
|
|
1411
|
+
await this.publishAnswerOnWebexCrossClientState(false, {
|
|
1412
|
+
force: true
|
|
1413
|
+
});
|
|
1414
|
+
this.webexCrossClientService.teardown();
|
|
1415
|
+
this.wxAppTelephonyMercurySync.unsubscribe();
|
|
1416
|
+
await this.releaseWxAppMercuryResources();
|
|
1417
|
+
(0, _wxAppDiagnosticLogging.logWxAppSessionReadiness)({
|
|
1418
|
+
enableWxBetterTogether: false,
|
|
1419
|
+
loginOption,
|
|
1420
|
+
wxAppHooksApplied: true,
|
|
1421
|
+
usersubPublished: false,
|
|
1422
|
+
mercurySubscribed: false,
|
|
1423
|
+
telephonyTaskType,
|
|
1424
|
+
skipReason: 'flag_disabled'
|
|
1425
|
+
});
|
|
1426
|
+
this.metricsManager.trackEvent(_constants4.METRIC_EVENT_NAMES.WXAPP_SESSION_SKIPPED, {
|
|
1427
|
+
loginOption,
|
|
1428
|
+
enableWxBetterTogether: false,
|
|
1429
|
+
skipReason: 'flag_disabled'
|
|
1430
|
+
}, ['operational', 'behavioral']);
|
|
1431
|
+
}
|
|
1432
|
+
} catch (error) {
|
|
1433
|
+
_loggerProxy.default.error(`Failed to initialize wxApp post-station-login: ${error}`, {
|
|
1434
|
+
module: _constants.CC_FILE,
|
|
1435
|
+
method: _constants.METHODS.STATION_LOGIN
|
|
1436
|
+
});
|
|
1437
|
+
if (flagEnabled) {
|
|
1438
|
+
const sessionInitFailureReason = wxAppInitStage === 'mercury' ? 'mercury_subscribe_failed' : 'publish_failed';
|
|
1439
|
+
this.metricsManager.trackEvent(_constants4.METRIC_EVENT_NAMES.WXAPP_SESSION_INIT_FAILED, {
|
|
1440
|
+
loginOption,
|
|
1441
|
+
enableWxBetterTogether: true,
|
|
1442
|
+
skipReason: sessionInitFailureReason,
|
|
1443
|
+
error: error instanceof Error ? error.toString() : String(error)
|
|
1444
|
+
}, ['operational', 'behavioral']);
|
|
1445
|
+
(0, _wxAppDiagnosticLogging.logWxAppSessionReadiness)({
|
|
1446
|
+
enableWxBetterTogether: true,
|
|
1447
|
+
loginOption,
|
|
1448
|
+
wxAppHooksApplied: false,
|
|
1449
|
+
usersubPublished: publishedEnable && this.webexCrossClientService.isAnswerCallsStateActive(),
|
|
1450
|
+
mercurySubscribed: this.wxAppTelephonyMercurySync.isSubscribed(),
|
|
1451
|
+
telephonyTaskType,
|
|
1452
|
+
skipReason: sessionInitFailureReason
|
|
1453
|
+
});
|
|
1454
|
+
if (publishedEnable) {
|
|
1455
|
+
await this.revertWxAppCrossClientPublish();
|
|
1456
|
+
} else {
|
|
1457
|
+
this.wxAppTelephonyMercurySync.unsubscribe();
|
|
1458
|
+
await this.releaseWxAppMercuryResources();
|
|
1459
|
+
}
|
|
1460
|
+
this.resetEnableWxBetterTogetherConfig();
|
|
1461
|
+
} else {
|
|
1462
|
+
this.scheduleForcedFalsePublishRetry();
|
|
1463
|
+
}
|
|
1464
|
+
}
|
|
1465
|
+
}
|
|
1466
|
+
clearWxAppFalsePublishRetryTimer() {
|
|
1467
|
+
if (this.wxAppFalsePublishRetryTimer) {
|
|
1468
|
+
clearTimeout(this.wxAppFalsePublishRetryTimer);
|
|
1469
|
+
this.wxAppFalsePublishRetryTimer = undefined;
|
|
1470
|
+
}
|
|
1471
|
+
}
|
|
1472
|
+
scheduleForcedFalsePublishRetry(retryAttempt = 0) {
|
|
1473
|
+
this.scheduleFalsePublishRetry(retryAttempt, {
|
|
1474
|
+
requireDisabled: true
|
|
1475
|
+
});
|
|
1476
|
+
}
|
|
1477
|
+
|
|
1478
|
+
/**
|
|
1479
|
+
* Retries compensating false publish after rollback failure, regardless of enabled flag.
|
|
1480
|
+
* @private
|
|
1481
|
+
*/
|
|
1482
|
+
scheduleCompensatingFalsePublishRetry(retryAttempt = 0) {
|
|
1483
|
+
this.scheduleFalsePublishRetry(retryAttempt);
|
|
1484
|
+
}
|
|
1485
|
+
scheduleFalsePublishRetry(retryAttempt = 0, options = {}) {
|
|
1486
|
+
if (retryAttempt >= ContactCenter.WXAPP_FALSE_PUBLISH_MAX_RETRIES) {
|
|
1487
|
+
return;
|
|
1488
|
+
}
|
|
1489
|
+
if (options?.requireDisabled && this.isWxBetterTogetherEnabled()) {
|
|
1490
|
+
return;
|
|
1491
|
+
}
|
|
1492
|
+
this.clearWxAppFalsePublishRetryTimer();
|
|
1493
|
+
this.wxAppFalsePublishRetryTimer = setTimeout(async () => {
|
|
1494
|
+
this.wxAppFalsePublishRetryTimer = undefined;
|
|
1495
|
+
if (options?.requireDisabled && this.isWxBetterTogetherEnabled()) {
|
|
1496
|
+
return;
|
|
1497
|
+
}
|
|
1498
|
+
if (!options?.requireDisabled && this.isWxBetterTogetherEnabled() && this.webexCrossClientService.isAnswerCallsStateActive()) {
|
|
1499
|
+
return;
|
|
1500
|
+
}
|
|
1501
|
+
try {
|
|
1502
|
+
await this.ensureWxAppDeviceRegistered();
|
|
1503
|
+
await this.publishAnswerOnWebexCrossClientState(false, {
|
|
1504
|
+
force: true
|
|
1505
|
+
});
|
|
1506
|
+
this.webexCrossClientService.teardown();
|
|
1507
|
+
this.wxAppTelephonyMercurySync.unsubscribe();
|
|
1508
|
+
await this.releaseWxAppMercuryResources();
|
|
1509
|
+
} catch (retryError) {
|
|
1510
|
+
_loggerProxy.default.error(`Failed to retry forced answer-calls-on-wxcc false publish: ${retryError}`, {
|
|
1511
|
+
module: _constants.CC_FILE,
|
|
1512
|
+
method: _constants.METHODS.SET_MANAGE_WEBEX_CALLING_IN_WXCC
|
|
1513
|
+
});
|
|
1514
|
+
this.scheduleFalsePublishRetry(retryAttempt + 1, options);
|
|
1515
|
+
}
|
|
1516
|
+
}, ContactCenter.WXAPP_FALSE_PUBLISH_RETRY_DELAY_MS);
|
|
1517
|
+
}
|
|
1518
|
+
|
|
1519
|
+
/**
|
|
1520
|
+
* Best-effort rollback when usersub true was published but wxApp setup did not complete.
|
|
1521
|
+
* @private
|
|
1522
|
+
*/
|
|
1523
|
+
async revertWxAppCrossClientPublish() {
|
|
1524
|
+
try {
|
|
1525
|
+
await this.publishAnswerOnWebexCrossClientState(false, {
|
|
1526
|
+
force: true
|
|
1527
|
+
});
|
|
1528
|
+
} catch (error) {
|
|
1529
|
+
_loggerProxy.default.error(`Failed to publish compensating answer-calls-on-wxcc false during wxApp rollback: ${error}`, {
|
|
1530
|
+
module: _constants.CC_FILE,
|
|
1531
|
+
method: _constants.METHODS.SET_MANAGE_WEBEX_CALLING_IN_WXCC
|
|
1532
|
+
});
|
|
1533
|
+
this.scheduleCompensatingFalsePublishRetry();
|
|
1534
|
+
}
|
|
1535
|
+
this.webexCrossClientService.teardown();
|
|
1536
|
+
this.wxAppTelephonyMercurySync.unsubscribe();
|
|
1537
|
+
await this.releaseWxAppMercuryResources();
|
|
1538
|
+
}
|
|
1539
|
+
async ensureWxAppDeviceRegistered() {
|
|
1540
|
+
const device = this.$webex.internal.device;
|
|
1541
|
+
if (device && !device.registered && device.register) {
|
|
1542
|
+
await device.register();
|
|
1543
|
+
this.wxAppDeviceRegisteredByCc = true;
|
|
1544
|
+
_loggerProxy.default.log('WxApp: device registered for cross-client publish', {
|
|
1545
|
+
module: _constants.CC_FILE,
|
|
1546
|
+
method: _constants.METHODS.ENSURE_WXAPP_MERCURY_CONNECTED
|
|
1547
|
+
});
|
|
1548
|
+
}
|
|
1549
|
+
}
|
|
1550
|
+
async ensureWxAppMercuryConnected() {
|
|
1551
|
+
const mercury = this.$webex.internal.mercury;
|
|
1552
|
+
await this.ensureWxAppDeviceRegistered();
|
|
1553
|
+
if (mercury && !mercury.connected) {
|
|
1554
|
+
await mercury.connect();
|
|
1555
|
+
this.wxAppMercuryConnectedByCc = true;
|
|
1556
|
+
_loggerProxy.default.log('WxApp mute sync: mercury connected', {
|
|
1557
|
+
module: _constants.CC_FILE,
|
|
1558
|
+
method: _constants.METHODS.ENSURE_WXAPP_MERCURY_CONNECTED
|
|
1559
|
+
});
|
|
1560
|
+
}
|
|
1561
|
+
}
|
|
1562
|
+
|
|
1563
|
+
/**
|
|
1564
|
+
* Disconnects Mercury and unregisters the device when wxApp mute sync opened them.
|
|
1565
|
+
* @private
|
|
1566
|
+
*/
|
|
1567
|
+
async releaseWxAppMercuryResources() {
|
|
1568
|
+
const mercury = this.$webex.internal.mercury;
|
|
1569
|
+
const device = this.$webex.internal.device;
|
|
1570
|
+
if (this.wxAppMercuryConnectedByCc && mercury?.connected) {
|
|
1571
|
+
try {
|
|
1572
|
+
await mercury.disconnect();
|
|
1573
|
+
this.wxAppMercuryConnectedByCc = false;
|
|
1574
|
+
_loggerProxy.default.log('WxApp mute sync: mercury disconnected', {
|
|
1575
|
+
module: _constants.CC_FILE,
|
|
1576
|
+
method: _constants.METHODS.ENSURE_WXAPP_MERCURY_CONNECTED
|
|
1577
|
+
});
|
|
1578
|
+
} catch (error) {
|
|
1579
|
+
_loggerProxy.default.error(`Failed to disconnect wxApp Mercury: ${error}`, {
|
|
1580
|
+
module: _constants.CC_FILE,
|
|
1581
|
+
method: _constants.METHODS.ENSURE_WXAPP_MERCURY_CONNECTED
|
|
1582
|
+
});
|
|
1583
|
+
}
|
|
1584
|
+
}
|
|
1585
|
+
if (this.wxAppDeviceRegisteredByCc && device?.registered && device.unregister) {
|
|
1586
|
+
try {
|
|
1587
|
+
// @ts-ignore
|
|
1588
|
+
await device.unregister();
|
|
1589
|
+
this.wxAppDeviceRegisteredByCc = false;
|
|
1590
|
+
_loggerProxy.default.log('WxApp mute sync: device unregistered', {
|
|
1591
|
+
module: _constants.CC_FILE,
|
|
1592
|
+
method: _constants.METHODS.ENSURE_WXAPP_MERCURY_CONNECTED
|
|
1593
|
+
});
|
|
1594
|
+
} catch (error) {
|
|
1595
|
+
_loggerProxy.default.error(`Failed to unregister wxApp device: ${error}`, {
|
|
1596
|
+
module: _constants.CC_FILE,
|
|
1597
|
+
method: _constants.METHODS.ENSURE_WXAPP_MERCURY_CONNECTED
|
|
1598
|
+
});
|
|
1599
|
+
}
|
|
1600
|
+
} else if (this.wxAppDeviceRegisteredByCc) {
|
|
1601
|
+
this.wxAppDeviceRegisteredByCc = false;
|
|
1602
|
+
}
|
|
1603
|
+
}
|
|
1604
|
+
|
|
1605
|
+
/**
|
|
1606
|
+
* Clears wxApp runtime state and feature-owned resources. Publish failures are logged;
|
|
1607
|
+
* optional rethrow for deregister when callers need to surface usersub errors.
|
|
1608
|
+
* @private
|
|
1609
|
+
*/
|
|
1610
|
+
async teardownWxAppLocalState(options) {
|
|
1611
|
+
this.clearWxAppFalsePublishRetryTimer();
|
|
1612
|
+
let publishError;
|
|
1613
|
+
try {
|
|
1614
|
+
const shouldForceFalsePublish = this.isWxBetterTogetherEnabled() || this.webexCrossClientService.isAnswerCallsStateActive();
|
|
1615
|
+
await this.publishAnswerOnWebexCrossClientState(false, {
|
|
1616
|
+
force: shouldForceFalsePublish
|
|
1617
|
+
});
|
|
1618
|
+
} catch (error) {
|
|
1619
|
+
publishError = error;
|
|
1620
|
+
_loggerProxy.default.error(`Failed to publish answer-calls-on-wxcc false during wxApp teardown: ${error}`, {
|
|
1621
|
+
module: _constants.CC_FILE,
|
|
1622
|
+
method: _constants.METHODS.SET_MANAGE_WEBEX_CALLING_IN_WXCC
|
|
1623
|
+
});
|
|
1624
|
+
}
|
|
1625
|
+
this.webexCrossClientService.teardown();
|
|
1626
|
+
this.wxAppTelephonyMercurySync.unsubscribe();
|
|
1627
|
+
await this.releaseWxAppMercuryResources();
|
|
1628
|
+
if (options?.clearInitFlag) {
|
|
1629
|
+
this.resetEnableWxBetterTogetherConfig();
|
|
1630
|
+
}
|
|
1631
|
+
if (publishError) {
|
|
1632
|
+
this.scheduleCompensatingFalsePublishRetry();
|
|
1633
|
+
}
|
|
1634
|
+
if (options?.rethrowPublishError && publishError) {
|
|
1635
|
+
throw publishError;
|
|
1636
|
+
}
|
|
1637
|
+
return {
|
|
1638
|
+
publishError: publishError ?? undefined
|
|
1639
|
+
};
|
|
1640
|
+
}
|
|
1641
|
+
async ensureWxAppMercuryAndSubscribe() {
|
|
1642
|
+
if (!this.isWxBetterTogetherEnabled()) {
|
|
1643
|
+
return;
|
|
1644
|
+
}
|
|
1645
|
+
if (this.getCurrentStationLoginOption() === _types.LoginOption.BROWSER) {
|
|
1646
|
+
return;
|
|
1647
|
+
}
|
|
1648
|
+
const agentId = this.agentConfig?.agentId;
|
|
1649
|
+
if (!agentId) {
|
|
1650
|
+
_loggerProxy.default.error('Cannot subscribe wxApp mute sync: agentId unavailable', {
|
|
1651
|
+
module: _constants.CC_FILE,
|
|
1652
|
+
method: _constants.METHODS.SYNC_WXAPP_MUTE_FROM_MERCURY
|
|
1653
|
+
});
|
|
1654
|
+
this.metricsManager.trackEvent(_constants4.METRIC_EVENT_NAMES.WXAPP_MERCURY_SUBSCRIBE_FAILED, {
|
|
1655
|
+
error: 'agentId unavailable'
|
|
1656
|
+
}, ['operational', 'behavioral']);
|
|
1657
|
+
return;
|
|
1658
|
+
}
|
|
1659
|
+
try {
|
|
1660
|
+
await this.ensureWxAppMercuryConnected();
|
|
1661
|
+
this.wxAppTelephonyMercurySync.subscribe(agentId, (callId, muted) => {
|
|
1662
|
+
this.taskManager.applyWxAppMuteStateFromSync(callId, muted);
|
|
1663
|
+
});
|
|
1664
|
+
} catch (error) {
|
|
1665
|
+
_loggerProxy.default.error(`Failed to ensure wxApp Mercury mute sync: ${error}`, {
|
|
1666
|
+
module: _constants.CC_FILE,
|
|
1667
|
+
method: _constants.METHODS.SYNC_WXAPP_MUTE_FROM_MERCURY
|
|
1668
|
+
});
|
|
1669
|
+
this.metricsManager.trackEvent(_constants4.METRIC_EVENT_NAMES.WXAPP_MERCURY_SUBSCRIBE_FAILED, {
|
|
1670
|
+
error: error instanceof Error ? error.toString() : String(error)
|
|
1671
|
+
}, ['operational', 'behavioral']);
|
|
1672
|
+
this.wxAppTelephonyMercurySync.unsubscribe();
|
|
1673
|
+
await this.releaseWxAppMercuryResources();
|
|
1674
|
+
throw error;
|
|
1675
|
+
}
|
|
1676
|
+
}
|
|
1677
|
+
async publishAnswerOnWebexCrossClientState(enable, options) {
|
|
1678
|
+
if (enable && !this.isWxBetterTogetherEnabled()) {
|
|
1679
|
+
return;
|
|
1680
|
+
}
|
|
1681
|
+
if (!enable && !options?.force && !this.webexCrossClientService.isAnswerCallsStateActive()) {
|
|
1682
|
+
return;
|
|
1683
|
+
}
|
|
1684
|
+
const userId = this.$webex.internal.device?.userId;
|
|
1685
|
+
if (!userId) {
|
|
1686
|
+
if (enable && this.isWxBetterTogetherEnabled()) {
|
|
1687
|
+
this.metricsManager.trackEvent(_constants4.METRIC_EVENT_NAMES.WXAPP_USERSUB_PUBLISH_FAILED, {
|
|
1688
|
+
enableWxBetterTogether: true,
|
|
1689
|
+
skipReason: 'user_id_unavailable',
|
|
1690
|
+
error: 'User ID is unavailable for cross-client publish'
|
|
1691
|
+
}, ['operational', 'behavioral']);
|
|
1692
|
+
}
|
|
1693
|
+
return;
|
|
1694
|
+
}
|
|
1695
|
+
await this.webexCrossClientService.setManageWebexCallingInWxcc(enable, {
|
|
1696
|
+
userId,
|
|
1697
|
+
trackPublishMetrics: true
|
|
1698
|
+
});
|
|
1699
|
+
if (enable) {
|
|
1700
|
+
this.clearWxAppFalsePublishRetryTimer();
|
|
1701
|
+
}
|
|
1702
|
+
}
|
|
1703
|
+
|
|
1173
1704
|
/**
|
|
1174
1705
|
* Initializes event listeners for the Contact Center service
|
|
1175
1706
|
* Sets up handlers for connection state changes and other core events
|
|
@@ -1268,6 +1799,7 @@ class ContactCenter extends _webexCore.WebexPlugin {
|
|
|
1268
1799
|
}
|
|
1269
1800
|
this.agentConfig.lastStateAuxCodeId = auxCodeId;
|
|
1270
1801
|
this.agentConfig.isAgentLoggedIn = true;
|
|
1802
|
+
await this.ensureWxAppPostStationLogin();
|
|
1271
1803
|
_loggerProxy.default.log(`Silent relogin process completed successfully with login Option: ${reLoginResponse.data.deviceType} teamId: ${reLoginResponse.data.teamId}`, {
|
|
1272
1804
|
module: _constants.CC_FILE,
|
|
1273
1805
|
method: _constants.METHODS.SILENT_RELOGIN,
|
|
@@ -1884,8 +2416,8 @@ class ContactCenter extends _webexCore.WebexPlugin {
|
|
|
1884
2416
|
}
|
|
1885
2417
|
|
|
1886
2418
|
/**
|
|
1887
|
-
* Returns paginated entry points
|
|
1888
|
-
*
|
|
2419
|
+
* Returns paginated entry points using the EntryPoint service defaults.
|
|
2420
|
+
* Existing request parameters can override those defaults.
|
|
1889
2421
|
* @public
|
|
1890
2422
|
*/
|
|
1891
2423
|
async getEntryPoints(params = {}) {
|
|
@@ -1893,8 +2425,8 @@ class ContactCenter extends _webexCore.WebexPlugin {
|
|
|
1893
2425
|
}
|
|
1894
2426
|
|
|
1895
2427
|
/**
|
|
1896
|
-
* Returns paginated contact service queues
|
|
1897
|
-
*
|
|
2428
|
+
* Returns paginated contact service queues using the Queue service defaults.
|
|
2429
|
+
* Existing request parameters can override those defaults.
|
|
1898
2430
|
* @public
|
|
1899
2431
|
*/
|
|
1900
2432
|
async getQueues(params = {}) {
|