@webex/contact-center 3.9.0-next.9 → 3.10.0
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/cc.js +182 -47
- package/dist/cc.js.map +1 -1
- package/dist/constants.js +1 -0
- package/dist/constants.js.map +1 -1
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -1
- package/dist/logger-proxy.js +24 -1
- package/dist/logger-proxy.js.map +1 -1
- package/dist/metrics/behavioral-events.js +89 -0
- package/dist/metrics/behavioral-events.js.map +1 -1
- package/dist/metrics/constants.js +30 -2
- package/dist/metrics/constants.js.map +1 -1
- package/dist/services/AddressBook.js +271 -0
- package/dist/services/AddressBook.js.map +1 -0
- package/dist/services/EntryPoint.js +227 -0
- package/dist/services/EntryPoint.js.map +1 -0
- package/dist/services/Queue.js +261 -0
- package/dist/services/Queue.js.map +1 -0
- package/dist/services/config/constants.js +36 -2
- package/dist/services/config/constants.js.map +1 -1
- package/dist/services/config/index.js +29 -21
- package/dist/services/config/index.js.map +1 -1
- package/dist/services/config/types.js +33 -1
- package/dist/services/config/types.js.map +1 -1
- package/dist/services/core/Utils.js +42 -1
- package/dist/services/core/Utils.js.map +1 -1
- package/dist/services/task/TaskManager.js +113 -3
- package/dist/services/task/TaskManager.js.map +1 -1
- package/dist/services/task/TaskUtils.js +76 -0
- package/dist/services/task/TaskUtils.js.map +1 -0
- package/dist/services/task/constants.js +26 -1
- package/dist/services/task/constants.js.map +1 -1
- package/dist/services/task/contact.js +86 -0
- package/dist/services/task/contact.js.map +1 -1
- package/dist/services/task/index.js +241 -5
- package/dist/services/task/index.js.map +1 -1
- package/dist/services/task/types.js +14 -0
- package/dist/services/task/types.js.map +1 -1
- package/dist/types/cc.d.ts +115 -35
- package/dist/types/constants.d.ts +1 -0
- package/dist/types/index.d.ts +3 -2
- package/dist/types/metrics/constants.d.ts +24 -1
- package/dist/types/services/AddressBook.d.ts +74 -0
- package/dist/types/services/EntryPoint.d.ts +67 -0
- package/dist/types/services/Queue.d.ts +76 -0
- package/dist/types/services/config/constants.d.ts +35 -1
- package/dist/types/services/config/index.d.ts +6 -9
- package/dist/types/services/config/types.d.ts +79 -58
- package/dist/types/services/core/Utils.d.ts +14 -1
- package/dist/types/services/task/TaskUtils.d.ts +28 -0
- package/dist/types/services/task/constants.d.ts +23 -0
- package/dist/types/services/task/contact.d.ts +10 -0
- package/dist/types/services/task/index.d.ts +64 -1
- package/dist/types/services/task/types.d.ts +221 -19
- package/dist/types/types.d.ts +162 -0
- package/dist/types/utils/PageCache.d.ts +173 -0
- package/dist/types.js +17 -0
- package/dist/types.js.map +1 -1
- package/dist/utils/PageCache.js +192 -0
- package/dist/utils/PageCache.js.map +1 -0
- package/dist/webex.js +1 -1
- package/package.json +10 -9
- package/src/cc.ts +206 -52
- package/src/constants.ts +1 -0
- package/src/index.ts +16 -2
- package/src/logger-proxy.ts +24 -1
- package/src/metrics/behavioral-events.ts +94 -0
- package/src/metrics/constants.ts +34 -1
- package/src/services/AddressBook.ts +291 -0
- package/src/services/EntryPoint.ts +241 -0
- package/src/services/Queue.ts +277 -0
- package/src/services/config/constants.ts +42 -2
- package/src/services/config/index.ts +30 -30
- package/src/services/config/types.ts +59 -58
- package/src/services/core/Utils.ts +44 -0
- package/src/services/task/TaskManager.ts +122 -5
- package/src/services/task/TaskUtils.ts +81 -0
- package/src/services/task/constants.ts +25 -0
- package/src/services/task/contact.ts +80 -0
- package/src/services/task/index.ts +300 -4
- package/src/services/task/types.ts +239 -18
- package/src/types.ts +180 -0
- package/src/utils/PageCache.ts +252 -0
- package/test/unit/spec/cc.ts +282 -85
- package/test/unit/spec/metrics/behavioral-events.ts +42 -0
- package/test/unit/spec/services/AddressBook.ts +332 -0
- package/test/unit/spec/services/EntryPoint.ts +259 -0
- package/test/unit/spec/services/Queue.ts +323 -0
- package/test/unit/spec/services/config/index.ts +279 -65
- package/test/unit/spec/services/task/TaskManager.ts +382 -0
- package/test/unit/spec/services/task/TaskUtils.ts +131 -0
- package/test/unit/spec/services/task/contact.ts +31 -1
- package/test/unit/spec/services/task/index.ts +242 -8
- package/umd/contact-center.min.js +2 -2
- package/umd/contact-center.min.js.map +1 -1
|
@@ -12,6 +12,12 @@ import LoggerProxy from '../../logger-proxy';
|
|
|
12
12
|
import Task from '.';
|
|
13
13
|
import MetricsManager from '../../metrics/MetricsManager';
|
|
14
14
|
import {METRIC_EVENT_NAMES} from '../../metrics/constants';
|
|
15
|
+
import {
|
|
16
|
+
checkParticipantNotInInteraction,
|
|
17
|
+
getIsConferenceInProgress,
|
|
18
|
+
isParticipantInMainInteraction,
|
|
19
|
+
isPrimary,
|
|
20
|
+
} from './TaskUtils';
|
|
15
21
|
|
|
16
22
|
/** @internal */
|
|
17
23
|
export default class TaskManager extends EventEmitter {
|
|
@@ -28,6 +34,7 @@ export default class TaskManager extends EventEmitter {
|
|
|
28
34
|
private metricsManager: MetricsManager;
|
|
29
35
|
private static taskManager;
|
|
30
36
|
private wrapupData: WrapupData;
|
|
37
|
+
private agentId: string;
|
|
31
38
|
/**
|
|
32
39
|
* @param contact - Routing Contact layer. Talks to AQMReq layer to convert events to promises
|
|
33
40
|
* @param webCallingService - Webrtc Service Layer
|
|
@@ -52,6 +59,19 @@ export default class TaskManager extends EventEmitter {
|
|
|
52
59
|
this.wrapupData = wrapupData;
|
|
53
60
|
}
|
|
54
61
|
|
|
62
|
+
public setAgentId(agentId: string) {
|
|
63
|
+
this.agentId = agentId;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Gets the current agent ID
|
|
68
|
+
* @returns {string} The agent ID set for this task manager instance
|
|
69
|
+
* @public
|
|
70
|
+
*/
|
|
71
|
+
public getAgentId(): string {
|
|
72
|
+
return this.agentId;
|
|
73
|
+
}
|
|
74
|
+
|
|
55
75
|
private handleIncomingWebCall = (call: ICall) => {
|
|
56
76
|
const currentTask = Object.values(this.taskCollection).find(
|
|
57
77
|
(task) => task.data.interaction.mediaType === 'telephony'
|
|
@@ -114,10 +134,10 @@ export default class TaskManager extends EventEmitter {
|
|
|
114
134
|
{
|
|
115
135
|
...payload.data,
|
|
116
136
|
wrapUpRequired:
|
|
117
|
-
payload.data.interaction?.participants?.[
|
|
118
|
-
false,
|
|
137
|
+
payload.data.interaction?.participants?.[this.agentId]?.isWrapUp || false,
|
|
119
138
|
},
|
|
120
|
-
this.wrapupData
|
|
139
|
+
this.wrapupData,
|
|
140
|
+
this.agentId
|
|
121
141
|
);
|
|
122
142
|
this.taskCollection[payload.data.interactionId] = task;
|
|
123
143
|
// Condition 1: The state is=new i.e it is a incoming task
|
|
@@ -153,8 +173,9 @@ export default class TaskManager extends EventEmitter {
|
|
|
153
173
|
...payload.data,
|
|
154
174
|
isConsulted: false,
|
|
155
175
|
},
|
|
156
|
-
this.wrapupData
|
|
157
|
-
|
|
176
|
+
this.wrapupData,
|
|
177
|
+
this.agentId
|
|
178
|
+
);
|
|
158
179
|
this.taskCollection[payload.data.interactionId] = task;
|
|
159
180
|
if (
|
|
160
181
|
this.webCallingService.loginOption !== LoginOption.BROWSER ||
|
|
@@ -324,6 +345,102 @@ export default class TaskManager extends EventEmitter {
|
|
|
324
345
|
task = this.updateTaskData(task, payload.data);
|
|
325
346
|
task.emit(TASK_EVENTS.TASK_RECORDING_RESUME_FAILED, task);
|
|
326
347
|
break;
|
|
348
|
+
case CC_EVENTS.AGENT_CONSULT_CONFERENCING:
|
|
349
|
+
// Conference is being established - update task state and emit establishing event
|
|
350
|
+
task = this.updateTaskData(task, payload.data);
|
|
351
|
+
task.emit(TASK_EVENTS.TASK_CONFERENCE_ESTABLISHING, task);
|
|
352
|
+
break;
|
|
353
|
+
case CC_EVENTS.AGENT_CONSULT_CONFERENCED:
|
|
354
|
+
// Conference started successfully - update task state and emit event
|
|
355
|
+
task = this.updateTaskData(task, payload.data);
|
|
356
|
+
task.emit(TASK_EVENTS.TASK_CONFERENCE_STARTED, task);
|
|
357
|
+
break;
|
|
358
|
+
case CC_EVENTS.AGENT_CONSULT_CONFERENCE_FAILED:
|
|
359
|
+
// Conference failed - update task state and emit failure event
|
|
360
|
+
task = this.updateTaskData(task, payload.data);
|
|
361
|
+
task.emit(TASK_EVENTS.TASK_CONFERENCE_FAILED, task);
|
|
362
|
+
break;
|
|
363
|
+
case CC_EVENTS.AGENT_CONSULT_CONFERENCE_ENDED:
|
|
364
|
+
// Conference ended - update task state and emit event
|
|
365
|
+
task = this.updateTaskData(task, payload.data);
|
|
366
|
+
if (
|
|
367
|
+
!task ||
|
|
368
|
+
isPrimary(task, this.agentId) ||
|
|
369
|
+
isParticipantInMainInteraction(task, this.agentId)
|
|
370
|
+
) {
|
|
371
|
+
LoggerProxy.log('Primary or main interaction participant leaving conference');
|
|
372
|
+
} else {
|
|
373
|
+
this.removeTaskFromCollection(task);
|
|
374
|
+
}
|
|
375
|
+
task?.emit(TASK_EVENTS.TASK_CONFERENCE_ENDED, task);
|
|
376
|
+
break;
|
|
377
|
+
case CC_EVENTS.PARTICIPANT_JOINED_CONFERENCE: {
|
|
378
|
+
// Participant joined conference - update task state with participant information and emit event
|
|
379
|
+
// Pre-calculate isConferenceInProgress with updated data to avoid double update
|
|
380
|
+
const simulatedTaskForJoin = {
|
|
381
|
+
...task,
|
|
382
|
+
data: {...task.data, ...payload.data},
|
|
383
|
+
};
|
|
384
|
+
task = this.updateTaskData(task, {
|
|
385
|
+
...payload.data,
|
|
386
|
+
isConferenceInProgress: getIsConferenceInProgress(simulatedTaskForJoin),
|
|
387
|
+
});
|
|
388
|
+
task.emit(TASK_EVENTS.TASK_PARTICIPANT_JOINED, task);
|
|
389
|
+
break;
|
|
390
|
+
}
|
|
391
|
+
case CC_EVENTS.PARTICIPANT_LEFT_CONFERENCE: {
|
|
392
|
+
// Conference ended - update task state and emit event
|
|
393
|
+
// Pre-calculate isConferenceInProgress with updated data to avoid double update
|
|
394
|
+
const simulatedTaskForLeft = {
|
|
395
|
+
...task,
|
|
396
|
+
data: {...task.data, ...payload.data},
|
|
397
|
+
};
|
|
398
|
+
task = this.updateTaskData(task, {
|
|
399
|
+
...payload.data,
|
|
400
|
+
isConferenceInProgress: getIsConferenceInProgress(simulatedTaskForLeft),
|
|
401
|
+
});
|
|
402
|
+
if (checkParticipantNotInInteraction(task, this.agentId)) {
|
|
403
|
+
if (
|
|
404
|
+
isParticipantInMainInteraction(task, this.agentId) ||
|
|
405
|
+
isPrimary(task, this.agentId)
|
|
406
|
+
) {
|
|
407
|
+
LoggerProxy.log('Primary or main interaction participant leaving conference');
|
|
408
|
+
} else {
|
|
409
|
+
this.removeTaskFromCollection(task);
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
task.emit(TASK_EVENTS.TASK_PARTICIPANT_LEFT, task);
|
|
413
|
+
break;
|
|
414
|
+
}
|
|
415
|
+
case CC_EVENTS.PARTICIPANT_LEFT_CONFERENCE_FAILED:
|
|
416
|
+
// Conference exit failed - update task state and emit failure event
|
|
417
|
+
task = this.updateTaskData(task, payload.data);
|
|
418
|
+
task.emit(TASK_EVENTS.TASK_PARTICIPANT_LEFT_FAILED, task);
|
|
419
|
+
break;
|
|
420
|
+
case CC_EVENTS.AGENT_CONSULT_CONFERENCE_END_FAILED:
|
|
421
|
+
// Conference end failed - update task state with error details and emit failure event
|
|
422
|
+
task = this.updateTaskData(task, payload.data);
|
|
423
|
+
task.emit(TASK_EVENTS.TASK_CONFERENCE_END_FAILED, task);
|
|
424
|
+
break;
|
|
425
|
+
case CC_EVENTS.AGENT_CONFERENCE_TRANSFERRED:
|
|
426
|
+
// Conference was transferred - update task state and emit transfer success event
|
|
427
|
+
// Note: Backend should provide hasLeft and wrapUpRequired status
|
|
428
|
+
task = this.updateTaskData(task, payload.data);
|
|
429
|
+
task.emit(TASK_EVENTS.TASK_CONFERENCE_TRANSFERRED, task);
|
|
430
|
+
break;
|
|
431
|
+
case CC_EVENTS.AGENT_CONFERENCE_TRANSFER_FAILED:
|
|
432
|
+
// Conference transfer failed - update task state with error details and emit failure event
|
|
433
|
+
task = this.updateTaskData(task, payload.data);
|
|
434
|
+
task.emit(TASK_EVENTS.TASK_CONFERENCE_TRANSFER_FAILED, task);
|
|
435
|
+
break;
|
|
436
|
+
case CC_EVENTS.CONSULTED_PARTICIPANT_MOVING:
|
|
437
|
+
// Participant is being moved/transferred - update task state with movement info
|
|
438
|
+
task = this.updateTaskData(task, payload.data);
|
|
439
|
+
break;
|
|
440
|
+
case CC_EVENTS.PARTICIPANT_POST_CALL_ACTIVITY:
|
|
441
|
+
// Post-call activity for participant - update task state with activity details
|
|
442
|
+
task = this.updateTaskData(task, payload.data);
|
|
443
|
+
break;
|
|
327
444
|
default:
|
|
328
445
|
break;
|
|
329
446
|
}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/* eslint-disable import/prefer-default-export */
|
|
2
|
+
import {ITask} from './types';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Determines if the given agent is the primary agent (owner) of the task
|
|
6
|
+
* @param task - The task to check
|
|
7
|
+
* @param agentId - The agent ID to check for primary status
|
|
8
|
+
* @returns true if the agent is the primary agent, false otherwise
|
|
9
|
+
*/
|
|
10
|
+
export const isPrimary = (task: ITask, agentId: string): boolean => {
|
|
11
|
+
if (!task.data?.interaction?.owner) {
|
|
12
|
+
// Fall back to checking data.agentId when owner is not set
|
|
13
|
+
return task.data.agentId === agentId;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
return task.data.interaction.owner === agentId;
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Checks if the given agent is a participant in the main interaction (mainCall)
|
|
21
|
+
* @param task - The task to check
|
|
22
|
+
* @param agentId - The agent ID to check for participation
|
|
23
|
+
* @returns true if the agent is a participant in the main interaction, false otherwise
|
|
24
|
+
*/
|
|
25
|
+
export const isParticipantInMainInteraction = (task: ITask, agentId: string): boolean => {
|
|
26
|
+
if (!task?.data?.interaction?.media) {
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
return Object.values(task.data.interaction.media).some(
|
|
31
|
+
(mediaObj) =>
|
|
32
|
+
mediaObj && mediaObj.mType === 'mainCall' && mediaObj.participants?.includes(agentId)
|
|
33
|
+
);
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Checks if the given agent is not in the interaction or has left the interaction
|
|
38
|
+
* @param task - The task to check
|
|
39
|
+
* @param agentId - The agent ID to check
|
|
40
|
+
* @returns true if the agent is not in the interaction or has left, false otherwise
|
|
41
|
+
*/
|
|
42
|
+
export const checkParticipantNotInInteraction = (task: ITask, agentId: string): boolean => {
|
|
43
|
+
if (!task?.data?.interaction?.participants) {
|
|
44
|
+
return true;
|
|
45
|
+
}
|
|
46
|
+
const {data} = task;
|
|
47
|
+
|
|
48
|
+
return (
|
|
49
|
+
!(agentId in data.interaction.participants) ||
|
|
50
|
+
(agentId in data.interaction.participants && data.interaction.participants[agentId].hasLeft)
|
|
51
|
+
);
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Determines if a conference is currently in progress based on the number of active agent participants
|
|
56
|
+
* @param task - The task to check for conference status
|
|
57
|
+
* @returns true if there are 2 or more active agent participants in the main call, false otherwise
|
|
58
|
+
*/
|
|
59
|
+
export const getIsConferenceInProgress = (task: ITask): boolean => {
|
|
60
|
+
const mediaMainCall = task?.data?.interaction?.media?.[task?.data?.interactionId];
|
|
61
|
+
const participantsInMainCall = new Set(mediaMainCall?.participants);
|
|
62
|
+
const participants = task?.data?.interaction?.participants;
|
|
63
|
+
|
|
64
|
+
const agentParticipants = new Set();
|
|
65
|
+
if (participantsInMainCall.size > 0) {
|
|
66
|
+
participantsInMainCall.forEach((participantId: string) => {
|
|
67
|
+
const participant = participants?.[participantId];
|
|
68
|
+
if (
|
|
69
|
+
participant &&
|
|
70
|
+
participant.pType !== 'Customer' &&
|
|
71
|
+
participant.pType !== 'Supervisor' &&
|
|
72
|
+
!participant.hasLeft &&
|
|
73
|
+
participant.pType !== 'VVA'
|
|
74
|
+
) {
|
|
75
|
+
agentParticipants.add(participantId);
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
return agentParticipants.size >= 2;
|
|
81
|
+
};
|
|
@@ -17,9 +17,31 @@ export const PAUSE = '/record/pause';
|
|
|
17
17
|
export const RESUME = '/record/resume';
|
|
18
18
|
export const WRAPUP = '/wrapup';
|
|
19
19
|
export const END = '/end';
|
|
20
|
+
export const CONSULT_CONFERENCE = '/consult/conference';
|
|
21
|
+
export const CONFERENCE_EXIT = '/conference/exit';
|
|
22
|
+
export const CONFERENCE_TRANSFER = '/conference/transfer';
|
|
20
23
|
export const TASK_MANAGER_FILE = 'taskManager';
|
|
21
24
|
export const TASK_FILE = 'task';
|
|
22
25
|
|
|
26
|
+
/**
|
|
27
|
+
* Task data field names that should be preserved during reconciliation
|
|
28
|
+
* These fields are retained even if not present in new data during updates
|
|
29
|
+
*/
|
|
30
|
+
export const PRESERVED_TASK_DATA_FIELDS = {
|
|
31
|
+
/** Indicates if the task is in consultation state */
|
|
32
|
+
IS_CONSULTED: 'isConsulted',
|
|
33
|
+
/** Indicates if wrap-up is required for this task */
|
|
34
|
+
WRAP_UP_REQUIRED: 'wrapUpRequired',
|
|
35
|
+
/** Indicates if a conference is currently in progress (2+ active agents) */
|
|
36
|
+
IS_CONFERENCE_IN_PROGRESS: 'isConferenceInProgress',
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Array of task data field names that should not be deleted during reconciliation
|
|
41
|
+
* Used by reconcileData method to preserve important task state fields
|
|
42
|
+
*/
|
|
43
|
+
export const KEYS_TO_NOT_DELETE: string[] = Object.values(PRESERVED_TASK_DATA_FIELDS);
|
|
44
|
+
|
|
23
45
|
// METHOD NAMES
|
|
24
46
|
export const METHODS = {
|
|
25
47
|
// Task class methods
|
|
@@ -36,6 +58,9 @@ export const METHODS = {
|
|
|
36
58
|
END_CONSULT: 'endConsult',
|
|
37
59
|
TRANSFER: 'transfer',
|
|
38
60
|
CONSULT_TRANSFER: 'consultTransfer',
|
|
61
|
+
CONSULT_CONFERENCE: 'consultConference',
|
|
62
|
+
EXIT_CONFERENCE: 'exitConference',
|
|
63
|
+
TRANSFER_CONFERENCE: 'transferConference',
|
|
39
64
|
UPDATE_TASK_DATA: 'updateTaskData',
|
|
40
65
|
RECONCILE_DATA: 'reconcileData',
|
|
41
66
|
|
|
@@ -17,6 +17,9 @@ import {
|
|
|
17
17
|
TRANSFER,
|
|
18
18
|
UNHOLD,
|
|
19
19
|
WRAPUP,
|
|
20
|
+
CONSULT_CONFERENCE,
|
|
21
|
+
CONFERENCE_EXIT,
|
|
22
|
+
CONFERENCE_TRANSFER,
|
|
20
23
|
} from './constants';
|
|
21
24
|
import * as Contact from './types';
|
|
22
25
|
import {DESTINATION_TYPE} from './types';
|
|
@@ -425,5 +428,82 @@ export default function routingContact(aqm: AqmReqs) {
|
|
|
425
428
|
errId: 'Service.aqm.task.cancelCtq',
|
|
426
429
|
},
|
|
427
430
|
})),
|
|
431
|
+
|
|
432
|
+
/*
|
|
433
|
+
* Start consult conference
|
|
434
|
+
*/
|
|
435
|
+
consultConference: aqm.req(
|
|
436
|
+
(p: {interactionId: string; data: Contact.ConsultConferenceData}) => ({
|
|
437
|
+
url: `${TASK_API}${p.interactionId}${CONSULT_CONFERENCE}`,
|
|
438
|
+
data: p.data,
|
|
439
|
+
host: WCC_API_GATEWAY,
|
|
440
|
+
err,
|
|
441
|
+
notifSuccess: {
|
|
442
|
+
bind: {
|
|
443
|
+
type: TASK_MESSAGE_TYPE,
|
|
444
|
+
data: {
|
|
445
|
+
type: [CC_EVENTS.AGENT_CONSULT_CONFERENCED, CC_EVENTS.AGENT_CONSULT_CONFERENCING],
|
|
446
|
+
interactionId: p.interactionId,
|
|
447
|
+
}, // any of the two events can be received for API success event
|
|
448
|
+
},
|
|
449
|
+
msg: {} as Contact.AgentContact,
|
|
450
|
+
},
|
|
451
|
+
notifFail: {
|
|
452
|
+
bind: {
|
|
453
|
+
type: TASK_MESSAGE_TYPE,
|
|
454
|
+
data: {type: CC_EVENTS.AGENT_CONSULT_CONFERENCE_FAILED},
|
|
455
|
+
},
|
|
456
|
+
errId: 'Service.aqm.task.consultConference',
|
|
457
|
+
},
|
|
458
|
+
})
|
|
459
|
+
),
|
|
460
|
+
|
|
461
|
+
/*
|
|
462
|
+
* Exit conference
|
|
463
|
+
*/
|
|
464
|
+
exitConference: aqm.req((p: {interactionId: string}) => ({
|
|
465
|
+
url: `${TASK_API}${p.interactionId}${CONFERENCE_EXIT}`,
|
|
466
|
+
data: {},
|
|
467
|
+
host: WCC_API_GATEWAY,
|
|
468
|
+
err,
|
|
469
|
+
notifSuccess: {
|
|
470
|
+
bind: {
|
|
471
|
+
type: TASK_MESSAGE_TYPE,
|
|
472
|
+
data: {type: CC_EVENTS.PARTICIPANT_LEFT_CONFERENCE, interactionId: p.interactionId},
|
|
473
|
+
},
|
|
474
|
+
msg: {} as Contact.AgentContact,
|
|
475
|
+
},
|
|
476
|
+
notifFail: {
|
|
477
|
+
bind: {
|
|
478
|
+
type: TASK_MESSAGE_TYPE,
|
|
479
|
+
data: {type: CC_EVENTS.PARTICIPANT_LEFT_CONFERENCE_FAILED}, // to be finalized
|
|
480
|
+
},
|
|
481
|
+
errId: 'Service.aqm.task.consultConference',
|
|
482
|
+
},
|
|
483
|
+
})),
|
|
484
|
+
|
|
485
|
+
/*
|
|
486
|
+
* Transfer conference
|
|
487
|
+
*/
|
|
488
|
+
conferenceTransfer: aqm.req((p: {interactionId: string}) => ({
|
|
489
|
+
url: `${TASK_API}${p.interactionId}${CONFERENCE_TRANSFER}`,
|
|
490
|
+
data: {},
|
|
491
|
+
host: WCC_API_GATEWAY,
|
|
492
|
+
err,
|
|
493
|
+
notifSuccess: {
|
|
494
|
+
bind: {
|
|
495
|
+
type: TASK_MESSAGE_TYPE,
|
|
496
|
+
data: {type: CC_EVENTS.PARTICIPANT_LEFT_CONFERENCE, interactionId: p.interactionId},
|
|
497
|
+
},
|
|
498
|
+
msg: {} as Contact.AgentContact,
|
|
499
|
+
},
|
|
500
|
+
notifFail: {
|
|
501
|
+
bind: {
|
|
502
|
+
type: TASK_MESSAGE_TYPE,
|
|
503
|
+
data: {type: CC_EVENTS.AGENT_CONFERENCE_TRANSFER_FAILED},
|
|
504
|
+
},
|
|
505
|
+
errId: 'Service.aqm.task.consultConference',
|
|
506
|
+
},
|
|
507
|
+
})),
|
|
428
508
|
};
|
|
429
509
|
}
|