UNPKG

scv-connector-base

Version:
1,435 lines (1,328 loc) 50.8 kB
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <title>JSDoc: Source: types.js</title> <script src="scripts/prettify/prettify.js"> </script> <script src="scripts/prettify/lang-css.js"> </script> <!--[if lt IE 9]> <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script> <![endif]--> <link type="text/css" rel="stylesheet" href="styles/prettify-tomorrow.css"> <link type="text/css" rel="stylesheet" href="styles/jsdoc-default.css"> </head> <body> <div id="main"> <h1 class="page-title">Source: types.js</h1> <section> <article> <pre class="prettyprint source linenums"><code>/* * Copyright (c) 2021, salesforce.com, inc. * All rights reserved. * SPDX-License-Identifier: BSD-3-Clause * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/BSD-3-Clause */ /* eslint-disable no-unused-vars */ import constants from './constants.js'; import { downloadLogs } from './logger.js'; export const Constants = { /** * @enum {string} */ EVENT_TYPE: { VOICE: { CALL_STARTED: constants.EVENT_TYPE.VOICE.CALL_STARTED, QUEUED_CALL_STARTED: constants.EVENT_TYPE.VOICE.QUEUED_CALL_STARTED, CALL_CONNECTED: constants.EVENT_TYPE.VOICE.CALL_CONNECTED, HANGUP: constants.EVENT_TYPE.VOICE.HANGUP, MUTE_TOGGLE: constants.EVENT_TYPE.VOICE.MUTE_TOGGLE, HOLD_TOGGLE: constants.EVENT_TYPE.VOICE.HOLD_TOGGLE, RECORDING_TOGGLE: constants.EVENT_TYPE.VOICE.RECORDING_TOGGLE, PARTICIPANTS_SWAPPED: constants.EVENT_TYPE.VOICE.PARTICIPANTS_SWAPPED, PARTICIPANTS_CONFERENCED: constants.EVENT_TYPE.VOICE.PARTICIPANTS_CONFERENCED, PARTICIPANT_ADDED: constants.EVENT_TYPE.VOICE.PARTICIPANT_ADDED, PARTICIPANT_CONNECTED: constants.EVENT_TYPE.VOICE.PARTICIPANT_CONNECTED, PARTICIPANT_REMOVED: constants.EVENT_TYPE.VOICE.PARTICIPANT_REMOVED, AFTER_CALL_WORK_STARTED: constants.EVENT_TYPE.VOICE.AFTER_CALL_WORK_STARTED, WRAP_UP_ENDED: constants.EVENT_TYPE.VOICE.WRAP_UP_ENDED, AGENT_ERROR: constants.EVENT_TYPE.VOICE.AGENT_ERROR, SOFTPHONE_ERROR: constants.EVENT_TYPE.VOICE.SOFTPHONE_ERROR, UPDATE_AUDIO_STATS: constants.EVENT_TYPE.VOICE.UPDATE_AUDIO_STATS, SUPERVISOR_BARGED_IN: constants.EVENT_TYPE.VOICE.SUPERVISOR_BARGED_IN, SUPERVISOR_CALL_STARTED : constants.EVENT_TYPE.VOICE.SUPERVISOR_CALL_STARTED, SUPERVISOR_CALL_CONNECTED: constants.EVENT_TYPE.VOICE.SUPERVISOR_CALL_CONNECTED, SUPERVISOR_HANGUP : constants.EVENT_TYPE.VOICE.SUPERVISOR_HANGUP }, LOGIN_RESULT: constants.EVENT_TYPE.LOGIN_RESULT, LOGOUT_RESULT: constants.EVENT_TYPE.LOGOUT_RESULT, MESSAGE: constants.EVENT_TYPE.MESSAGE, SET_AGENT_STATUS: constants.EVENT_TYPE.SET_AGENT_STATUS, GET_AGENT_STATUS: constants.EVENT_TYPE.GET_AGENT_STATUS, STATE_CHANGE: constants.EVENT_TYPE.STATE_CHANGE, STORAGE_ACCESS_RESULT: constants.EVENT_TYPE.STORAGE_ACCESS_RESULT }, /** * @enum {string} */ ERROR_TYPE: { VOICE: { INVALID_PARTICIPANT: constants.ERROR_TYPE.VOICE.INVALID_PARTICIPANT, INVALID_DESTINATION: constants.ERROR_TYPE.VOICE.INVALID_DESTINATION, CAN_NOT_UPDATE_PHONE_NUMBER: constants.ERROR_TYPE.VOICE.CAN_NOT_UPDATE_PHONE_NUMBER, INVALID_PARAMS: constants.ERROR_TYPE.VOICE.INVALID_PARAMS }, GENERIC_ERROR: constants.ERROR_TYPE.GENERIC_ERROR, INVALID_AGENT_STATUS: constants.ERROR_TYPE.INVALID_AGENT_STATUS }, /** * @enum {string} */ AGENT_STATUS: { ...constants.AGENT_STATUS }, /** * @enum {string} */ PARTICIPANT_TYPE: { ...constants.PARTICIPANT_TYPE }, /** * @enum {string} */ CALL_TYPE: { ...constants.CALL_TYPE }, /** * @enum {string} */ DIALER_TYPE: { ...constants.DIALER_TYPE }, /** * @enum {string} */ CONTACT_TYPE: { ...constants.CONTACT_TYPE }, /** * @enum {string} */ CALL_STATE: { ...constants.CALL_STATE }, /** * @enum {string} */ HANGUP_REASON: { ...constants.HANGUP_REASON }, /** * @enum {string} */ PHONE_TYPE: { ...constants.PHONE_TYPE }, /** * @enum {String} */ AGENT_AVAILABILITY: { ...constants.AGENT_AVAILABILITY }, /** * @enum (String) */ REMOVE_PARTICIPANT_VARIANT: { ...constants.REMOVE_PARTICIPANT_VARIANT }, /** * @enum {String} */ LOG_LEVEL: { ...constants.LOG_LEVEL }, /** * @enum {String} */ CONTACTS_FILTER_TYPES: { ...constants.CONTACTS_FILTER_TYPES }, /** * @enum {String} */ WORK_EVENT: { ...constants.WORK_EVENT } }; /** * Class representing a Custom Error */ export class CustomError extends Error { /** * Create Phone * @param {object} param * @param {String} param.labelName * @param {String} param.namespace * @param {String} [param.message] */ constructor({ labelName, namespace, message }) { super(message); Validator.validateString(labelName); Validator.validateString(namespace); if (message) { Validator.validateString(message); } this.labelName = labelName; this.namespace = namespace; this.message = message; } } /** * Class representing a Phone type */ export class Phone { /** * Create Phone * @param {object} param * @param {PHONE_TYPE} param.type * @param {string} [param.number] */ constructor({ type, number}) { Validator.validateEnum(type, Object.values(constants.PHONE_TYPE)); if(number) { Validator.validateString(number); } this.type = type; this.number = number; } } /** * Class representing result type for mute() &amp; unmute() */ export class MuteToggleResult { /** * Create ActiveCallsResult * @param {object} param * @param {boolean} param.isMuted */ constructor({ isMuted }) { this.isMuted = isMuted; } } /** * Class representing result type for getActiveCalls() */ export class ActiveCallsResult { /** * Create ActiveCallsResult * @param {object} param * @param {PhoneCall[]} [param.activeCalls] */ constructor({ activeCalls = [] }) { if (activeCalls.length > 0) { activeCalls.forEach(activeCall => { Validator.validateClassObject(activeCall, PhoneCall); }); } this.activeCalls = activeCalls; } } /** * Class representing result type for getCapabilities() */ export class CapabilitiesResult { /** * Create CapabilitiesResult * @param {object} param * @param {boolean} [param.hasMute] * @param {boolean} [param.hasRecord] * @param {boolean} [param.hasMerge] * @param {boolean} [param.hasSwap] * @param {boolean} [param.hasSignedRecordingUrl] * @param {boolean} [param.debugEnabled] * @param {boolean} [param.hasContactSearch] True if getPhoneContacts uses the 'contain' filter * @param {boolean} [param.hasAgentAvailability] True if getPhoneContacts also provides agent availability, false if Salesforce provides it. * @param {boolean} [param.hasQueueWaitTime] True if getPhoneContacts also provides estimated queue wait time, false if Salesforce provides it. * @param {boolean} [param.supportsMos] True if vendor support MOS * @param {boolean} [param.hasSupervisorListenIn] True if vendor supports supervisor listening to a ongoing call * @param {boolean} [param.hasSupervisorBargeIn] True if vendor supports Supervisor barging into a ongoing call * @param {boolean} [param.hasBlindTransfer] True if vendor supports blind transfers * @param {boolean} [param.hasBlindTransfer] True if vendor supports transfer to omni flows * @param {boolean} [param.hasPendingStatusChange] True if vendor supports Pending Status Change * @param {boolean} [param.hasPhoneBook] True if vendor supports the phoneBook UI */ constructor({ hasMute = true, hasRecord = true, hasMerge = true, hasSwap = true, hasSignedRecordingUrl = false, debugEnabled = true, hasContactSearch = false, hasAgentAvailability = false, hasQueueWaitTime = false, supportsMos = false, hasSupervisorListenIn = false, hasSupervisorBargeIn = false, hasBlindTransfer = false, hasTransferToOmniFlow = false, hasPendingStatusChange=false, hasPhoneBook=false }) { Validator.validateBoolean(hasMute); Validator.validateBoolean(hasRecord); Validator.validateBoolean(hasMerge); Validator.validateBoolean(hasSwap); Validator.validateBoolean(hasSignedRecordingUrl); Validator.validateBoolean(debugEnabled); Validator.validateBoolean(hasContactSearch); Validator.validateBoolean(hasAgentAvailability); Validator.validateBoolean(hasQueueWaitTime); Validator.validateBoolean(supportsMos); Validator.validateBoolean(hasSupervisorListenIn); Validator.validateBoolean(hasSupervisorBargeIn); Validator.validateBoolean(hasBlindTransfer); Validator.validateBoolean(hasTransferToOmniFlow); Validator.validateBoolean(hasPendingStatusChange); Validator.validateBoolean(hasPhoneBook) this.hasMute = hasMute; this.hasRecord = hasRecord; this.hasMerge = hasMerge; this.hasSwap = hasSwap; this.hasSignedRecordingUrl = hasSignedRecordingUrl; this.debugEnabled = debugEnabled; this.hasContactSearch = hasContactSearch; this.hasAgentAvailability = hasAgentAvailability; this.hasQueueWaitTime = hasQueueWaitTime; this.supportsMos = supportsMos; this.hasSupervisorListenIn = hasSupervisorListenIn; this.hasSupervisorBargeIn = hasSupervisorBargeIn; this.hasBlindTransfer = hasBlindTransfer; this.hasTransferToOmniFlow = hasTransferToOmniFlow; this.hasPendingStatusChange = hasPendingStatusChange; this.hasPhoneBook = hasPhoneBook; } } /** * Class representing result type for getAgentConfig() */ export class AgentConfigResult { /** * Create AgentConfigResult * @param {object} param * @param {Phone[]} [param.phones] * @param {Phone} [param.selectedPhone] */ constructor({ phones = [constants.PHONE_TYPE.SOFT_PHONE], selectedPhone = new Phone({type: constants.PHONE_TYPE.SOFT_PHONE}) }) { Validator.validateClassObject(phones, Array); Validator.validateClassObject(selectedPhone, Phone); this.phones = phones; this.selectedPhone = selectedPhone; } } /** * Class representing AgentConfig type for setAgentConfig() */ export class AgentConfig { /** * Create AgentConfig * @param {object} param * @param {Phone} [param.selectedPhone] */ constructor({ selectedPhone }) { Validator.validateClassObject(selectedPhone, Phone); this.selectedPhone = selectedPhone; } } /** * Class representing result type for pauseRecording() &amp; resumeRecording */ export class RecordingToggleResult { /** * Create RecordingToggleResult * @param {object} param * @param {boolean} param.isRecordingPaused * @param {string} [param.contactId] * @param {string} [param.initialContactId] * @param {string} [param.instanceId] * @param {string} [param.region] */ constructor({ isRecordingPaused, contactId = null, initialContactId = null, instanceId = null, region = null }) { this.isRecordingPaused = isRecordingPaused; this.contactId = contactId; this.initialContactId = initialContactId; this.instanceId = instanceId; this.region = region; } } /** * Class representing result type for addParticipant() */ export class ParticipantResult { /** * Create ParticipantResult * @param {object} param * @param {boolean} param.initialCallHasEnded * @param {CallInfo} param.callInfo * @param {string} param.phoneNumber * @param {string} param.callId */ constructor({ initialCallHasEnded, callInfo, phoneNumber, callId }) { Validator.validateClassObject(callInfo, CallInfo); this.initialCallHasEnded = initialCallHasEnded; this.callInfo = callInfo; this.phoneNumber = phoneNumber; this.callId = callId; } } /** * Class representing result type for getPhoneContacts() */ export class PhoneContactsResult { /** * Create PhoneContactsResult * @param {object} param * @param {Contact[]} [param.contacts] * @param {Array} [param.contactTypes] */ constructor({ contacts = [], contactTypes = [] }) { if (contacts.length > 0) { contacts.forEach(contact => { Validator.validateClassObject(contact, Contact); }); } if (contactTypes.length > 0) { contactTypes.forEach(filterType => { Validator.validateEnum(filterType, Object.values(constants.CONTACT_TYPE)); }); } this.contacts = contacts; this.contactTypes = contactTypes; } } /** * Class representing result type for accept(), decline(), dial() */ export class CallResult { /** * Create CallResult * @param {object} param * @param {PhoneCall} [param.call] */ constructor({ call }) { if (call !== undefined) { Validator.validateClassObject(call, PhoneCall); } this.call = call; } } /** * Class representing result type for endCall(), hangup() */ export class HangupResult { /** * Create CallResult * @param {object} param * @param {PhoneCall[]|PhoneCall} param.calls - one or more calls (can be multiple calls in case of agent endcall/hangup) */ constructor({ calls }) { if (calls instanceof Array) { calls.forEach(call => Validator.validateClassObject(call, PhoneCall)); this.calls = calls; } else { Validator.validateClassObject(calls, PhoneCall); this.calls = [calls]; } } } /** * Class representing result type for hold() &amp; resume() */ export class HoldToggleResult { /** * Create HoldToggleResult * @param {object} param * @param {boolean} param.isThirdPartyOnHold * @param {boolean} param.isCustomerOnHold * @param {PhoneCall[]} [param.calls] */ constructor({ isThirdPartyOnHold, isCustomerOnHold, calls }) { if (calls) { Object.values(calls).forEach(call => { Validator.validateClassObject(call, PhoneCall); }); this.calls = calls; } this.isThirdPartyOnHold = isThirdPartyOnHold; this.isCustomerOnHold = isCustomerOnHold; } } /** * Class representing result type for getRecordingUrl */ export class SignedRecordingUrlResult { /** * Create SignedRecordingUrlResult * @param {object} param * @param {boolean} param.success * @param {string} [param.url] * @param {number} [param.duration] in seconds * @param {string} [param.callId] Salesforce callId of the voice call */ constructor({ success, url, duration, callId }) { if (success) { // For a successfull result, url is required Validator.validateString(url); Validator.validateString(callId); if (duration) { Validator.validateNumber(duration); } } this.success = success; this.url = url; this.duration = duration; this.callId = callId; } } /** * Class representing result type for init() */ export class InitResult { /** * Create InitResult * @param {object} param * @param {boolean} [param.showLogin] * @param {number} [param.loginFrameHeight] * @param {boolean} [param.isSilentLogin] * @param {boolean} [param.showStorageAccess] */ constructor({ showLogin = false, loginFrameHeight = 350, isSilentLogin = false, showStorageAccess = false }) { this.showLogin = showLogin; this.loginFrameHeight = loginFrameHeight; this.isSilentLogin = this.showLogin ? false : isSilentLogin; this.showStorageAccess = showStorageAccess; } } /** * Class representing dial options for outbound dialing */ export class DialOptions { /** * Create DialOptions * @param {boolean} [param.isCallback] */ constructor({ isCallback = false }) { this.isCallback = isCallback; } } /** * Class representing generic result type */ export class GenericResult { /** * Create GenericResult * @param {object} param * @param {boolean} param.success */ constructor({ success }) { this.success = success; } } /** * Class representing logout result type */ export class LogoutResult { /** * Create LogoutResult * @param {object} param * @param {boolean} param.success * @param {number} [param.loginFrameHeight] */ constructor({ success, loginFrameHeight = 350 }) { this.success = success; this.loginFrameHeight = loginFrameHeight; } } /** * Class representing callInfo class (call metadata) */ export class CallInfo { /** * Create CallInfo * @param {object} param * @param {boolean} param.isOnHold * @param {boolean} param.isRecordingPaused * @param {boolean} param.isMuted * @param {string} [param.initialCallId] * @param {Date} [param.callStateTimestamp] * @param {string} [param.queueName] * @param {string} [param.queueId] * @param {Date} [param.queueTimestamp] * @param {boolean} [param.isSoftphoneCall] - is it a softphone call * @param {boolean} [param.acceptEnabled] * @param {boolean} [param.declineEnabled] * @param {boolean} [param.muteEnabled] * @param {boolean} [param.swapEnabled] * @param {boolean} [param.conferenceEnabled] * @param {boolean} [param.holdEnabled] * @param {boolean} [param.recordEnabled] * @param {boolean} [param.addCallerEnabled] * @param {boolean} [param.extensionEnabled] * @param {boolean} [param.isReplayable] * @param {boolean} [param.isBargeable] * @param {boolean} [param.isExternalTransfer] * @param {boolean} [param.showMuteButton] * @param {boolean} [param.showRecordButton] * @param {boolean} [param.showAddCallerButton] * @param {boolean} [param.showAddBlindTransferButton] * @param {boolean} [param.showMergeButton] * @param {boolean} [param.showSwapButton] * @param {("ALWAYS"|"NEVER"|"ALWAYS_EXCEPT_ON_HOLD")} [param.removeParticipantVariant] - The type of remove participant variant when in a transfer call. * @param {String} [param.additionalFields] - Represents additional standard and custom fields in the voice call record, where each key-value pair value corresponds to a standard or custom field and its values. */ constructor({ callStateTimestamp = null, isOnHold, isMuted = false, isRecordingPaused = false, initialCallId, queueId = null, queueName = null, queueTimestamp = null, isSoftphoneCall = true, acceptEnabled = true, declineEnabled = true, muteEnabled = true, swapEnabled = true, conferenceEnabled = true, holdEnabled = true, recordEnabled = true, addCallerEnabled = true, extensionEnabled = true, isReplayable = true, isBargeable = false, isExternalTransfer, showMuteButton = true, showRecordButton = true, showAddCallerButton = true, showAddBlindTransferButton = true, showMergeButton = true, showSwapButton = true, removeParticipantVariant = Constants.REMOVE_PARTICIPANT_VARIANT.ALWAYS, additionalFields = null }) { if (callStateTimestamp) { Validator.validateDate(callStateTimestamp); } if (queueTimestamp) { Validator.validateDate(queueTimestamp); } if (queueId) { Validator.validateString(queueId); } if (queueName) { Validator.validateString(queueName); } Validator.validateBoolean(isRecordingPaused); Validator.validateBoolean(isMuted); Validator.validateBoolean(isSoftphoneCall); Validator.validateBoolean(acceptEnabled); Validator.validateBoolean(declineEnabled); Validator.validateBoolean(muteEnabled); Validator.validateBoolean(swapEnabled); Validator.validateBoolean(conferenceEnabled); Validator.validateBoolean(holdEnabled); Validator.validateBoolean(recordEnabled); Validator.validateBoolean(addCallerEnabled); Validator.validateBoolean(extensionEnabled); Validator.validateBoolean(isBargeable); Validator.validateBoolean(showMuteButton); Validator.validateBoolean(showRecordButton); Validator.validateBoolean(showAddCallerButton); Validator.validateBoolean(showAddBlindTransferButton); Validator.validateBoolean(showMergeButton); Validator.validateBoolean(showSwapButton); if (isExternalTransfer !== undefined) { Validator.validateBoolean(isExternalTransfer); } Validator.validateEnum(removeParticipantVariant, Object.values(constants.REMOVE_PARTICIPANT_VARIANT)); if (additionalFields) { Validator.validateString(additionalFields); } this.callStateTimestamp = callStateTimestamp; this.isRecordingPaused = isRecordingPaused; this.isMuted = isMuted; this.isOnHold = isOnHold; this.initialCallId = initialCallId; this.queueName = queueName; this.queueId = queueId; this.queueTimestamp = queueTimestamp; this.isSoftphoneCall = isSoftphoneCall; this.acceptEnabled = acceptEnabled; this.declineEnabled = declineEnabled; this.muteEnabled = muteEnabled; this.swapEnabled = swapEnabled; this.conferenceEnabled = conferenceEnabled; this.holdEnabled = holdEnabled; this.recordEnabled = recordEnabled; this.addCallerEnabled = addCallerEnabled; this.extensionEnabled = extensionEnabled; this.isReplayable = isReplayable; this.isBargeable = isBargeable; this.isExternalTransfer = isExternalTransfer; this.removeParticipantVariant = removeParticipantVariant; this.showMuteButton = showMuteButton; this.showRecordButton = showRecordButton; this.showAddCallerButton = showAddCallerButton; this.showAddBlindTransferButton = showAddBlindTransferButton; this.showMergeButton = showMergeButton; this.showSwapButton = showSwapButton; this.additionalFields = additionalFields; } } /** * Class representing a Contact. This object is used to represent * phone system contact or any call target */ export class Contact { /** * Create a Contact. * @param {object} param * @param {string} [param.id] - The unique contactId * @param {("PhoneBook"|"Queue"|"PhoneNumber"|"Agent")} [param.type] - The type of the contact, one of the CONTACT_TYPE values * @param {string} [param.name] - The label for this contact to be displayed in the UI * @param {string} [param.phoneNumber] - The phone number associcated with this contact * @param {string} [param.prefix] - Any prefix to be dialed before dialing the number (i.e. +1) * @param {string} [param.extension] - Any extension to be dialed after dialing the number * @param {string} [param.endpointARN] * @param {string} [param.queue] * @param {string} [param.availability] * @param {string} [param.recordId] - Salesforce RecordId * @param {string} [param.description] - Contact Description * @param {string} [param.queueWaitTime] - Estimated Queue Wait Time */ constructor({phoneNumber, id, type, name, prefix, extension, endpointARN, queue, availability, recordId, description, queueWaitTime}) { if (phoneNumber) { Validator.validateString(phoneNumber); } if (type) { Validator.validateEnum(type, Object.values(constants.CONTACT_TYPE)); } if (id) { Validator.validateString(id); } if (name) { Validator.validateString(name); } if (prefix) { Validator.validateString(prefix); } if (extension) { Validator.validateString(extension); } if (availability) { Validator.validateEnum(availability, Object.values(constants.AGENT_AVAILABILITY)); } if (recordId) { Validator.validateString(recordId); } if (description) { Validator.validateString(description); } if (queueWaitTime) { Validator.validateString(queueWaitTime); } this.phoneNumber = phoneNumber; this.id = id; this.type = type; this.name = name; this.prefix = prefix; this.extension = extension; this.endpointARN = endpointARN; this.queue = queue; if (constants.CONTACT_TYPE.AGENT === this.type) { this.availability = availability; } else { this.availability = null; } this.queueWaitTime = queueWaitTime; this.recordId = recordId; this.description = description; } } /** * Class representing PhoneCallAttributes */ export class PhoneCallAttributes { /** * Create PhoneCallAttributes. * @param {object} param * @param {string} [param.voiceCallId] - The voice call id * @param {PARTICIPANT_TYPE} [param.participantType] - The participant type of the call * @param {DIALER_TYPE} [param.dialerType] - The dialer type of the call * @param {string} [param.parentId] - The parent call id of the call * @param {boolean} [param.isOnHold] * @param {boolean} [param.hasSupervisorBargedIn] */ constructor({ voiceCallId, participantType, dialerType = Constants.DIALER_TYPE.NONE, parentId, isOnHold, hasSupervisorBargedIn = false }) { if (voiceCallId) { Validator.validateString(voiceCallId); } if (participantType) { Validator.validateEnum(participantType, Object.values(constants.PARTICIPANT_TYPE)); } if (parentId) { Validator.validateString(parentId); } if (isOnHold !== undefined) { Validator.validateBoolean(isOnHold); } Validator.validateBoolean(hasSupervisorBargedIn); Validator.validateEnum(dialerType, Object.values(constants.DIALER_TYPE)); this.voiceCallId = voiceCallId; this.participantType = participantType; this.parentId = parentId; this.isOnHold = isOnHold; this.dialerType = dialerType; this.hasSupervisorBargedIn = hasSupervisorBargedIn; } } /** * Class representing a PhoneCall. */ export class PhoneCall { /** * Create a PhoneCall. * @param {object} param * @param {string} [param.callId] - The unique callId. This is a required parameter * @param {CALL_TYPE} [param.callType] - The type of the call, one of the CALL_TYPE values * @param {Contact} [param.contact] - The Call Target / Contact * @param {string} [param.state] - The state of the call, i.e. ringing, connected, declined, failed * @param {PhoneCallAttributes} [param.callAttributes] - Any additional call attributes * @param {string} [param.phoneNumber] - The phone number associated with this call (usually external number) * @param {CallInfo} [param.callInfo] * @param {string} [param.reason] * @param {boolean} [param.closeCallOnError] * @param {string} [param.agentStatus] */ constructor({callId, callType, contact, state, callAttributes, phoneNumber, callInfo, reason, closeCallOnError, agentStatus }) { // TODO: Revisit the required fields if (callId) { Validator.validateString(callId); this.callId = callId; } if (callType) { Validator.validateEnum(callType, Object.values(constants.CALL_TYPE)); this.callType = callType; } if (phoneNumber) { Validator.validateString(phoneNumber); this.phoneNumber = phoneNumber; } if (callInfo) { Validator.validateClassObject(callInfo, CallInfo); this.callInfo = callInfo; } if (contact) { Validator.validateClassObject(contact, Contact); this.contact = contact; } if (reason) { this.reason = reason; } if (closeCallOnError) { this.closeCallOnError = closeCallOnError; } if (agentStatus) { this.agentStatus = agentStatus; } this.state = state; this.callAttributes = callAttributes; } } /** * Class representing a TelephonyConnector */ export class TelephonyConnector { /** * Get the currently active calls * @returns {Promise&lt;ActiveCallsResult>} * */ getActiveCalls() { throw new Error('Not implemented'); } /** * Accept call * @param {PhoneCall} call - The call to be accepted * @returns {Promise&lt;CallResult>} * */ acceptCall(call) { throw new Error('Not implemented'); } /** * Decline call * @param {PhoneCall} call - The call to be declined * @returns {Promise&lt;CallResult>} * */ declineCall(call) { throw new Error('Not implemented'); } /** * End call * @param {PhoneCall} call - The call to be ended * @param {AGENT_STATUS} agentStatus * @returns {Promise&lt;HangupResult>} * */ endCall(call, agentStatus) { throw new Error('Not implemented'); } /** * Mute call * @returns {Promise&lt;MuteToggleResult>} * */ mute() { throw new Error('Not implemented'); } /** * Unmute call * @returns {Promise&lt;MuteToggleResult>} * */ unmute() { throw new Error('Not implemented'); } /** * Hold call * @param {PhoneCall} call - The call to be held * @returns {Promise&lt;HoldToggleResult>} * */ hold(call) { throw new Error('Not implemented'); } /** * Resume call * @param {PhoneCall} call - The call to be resumed * @returns {Promise&lt;HoldToggleResult>} * */ resume(call) { throw new Error('Not implemented'); } /** * Dial out Number * @param {Contact} contact * @param {DialOptions} dialOptions * @returns {Promise&lt;CallResult>} * */ dial(contact, dialOptions) { throw new Error('Not implemented'); } /** * Send digits * @param {string} digits */ sendDigits(digits) { throw new Error('Not implemented'); } /** * Get phone contacts * @returns {Promise&lt;PhoneContactsResult>} */ getPhoneContacts() { throw new Error('Not implemented'); } /** * Swap calls * @param {PhoneCall} call1 * @param {PhoneCall} call2 * @returns {Promise&lt;HoldToggleResult>} */ swap(call1, call2) { throw new Error('Not implemented'); } /** * Conference calls * @param {PhoneCall[]} calls * @returns {Promise&lt;HoldToggleResult>} */ conference(calls) { throw new Error('Not implemented'); } /** * Add participant to call * @param {Contact} contact: The transfer target * @param {PhoneCall} parentCall: The call to which a participant will be added * @param {Boolean} isBlindTransfer: True if blind transfering a call and hanging up upon transfer * @returns {Promise&lt;ParticipantResult>} */ addParticipant(contact, parentCall, isBlindTransfer) { throw new Error('Not implemented'); } /** * Pause recording * @param {PhoneCall} call * @returns {Promise&lt;RecordingToggleResult>} */ pauseRecording(call) { throw new Error('Not implemented'); } /** * Resume recording * @param {PhoneCall} call * @returns {Promise&lt;RecordingToggleResult>} */ resumeRecording(call) { throw new Error('Not implemented'); } /** * Get agentConfig * @returns {Promise&lt;AgentConfigResult>} */ getAgentConfig() { throw new Error('Not implemented'); } /** * Set Agent Config * @param {AgentConfig} config * @returns {Promise&lt;GenericResult>} */ setAgentConfig(config) { throw new Error('Not implemented'); } /** * Get Capabilities * @returns {Promise&lt;CapabilitiesResult>} */ getCapabilities() { throw new Error('Not implemented'); } /** * Wrap up call * @param {PhoneCall} call */ wrapUpCall(call) { throw new Error('Not implemented'); } /** * Get the signed recording url * @param {String} recordingUrl * @param {String} vendorCallKey * @param {String} callId * @returns {Promise&lt;SignedRecordingUrlResult>} */ getSignedRecordingUrl(recordingUrl, vendorCallKey, callId) { throw new Error('Not implemented'); } /** * Supervise a call * @param {PhoneCall} call Call to be supervised */ superviseCall(call) { throw new Error('Not implemented'); } /** * Supervisor disconnects from a call * @param {PhoneCall} call Call to be disconnected */ supervisorDisconnect(call) { throw new Error('Not implemented'); } /** * Supervisor Barges into a ongoing call * @param {PhoneCall} call Call which supervisor barges in */ supervisorBargeIn(call) { throw new Error('Not implemented'); } } /** * Class representing a VendorConnector */ export class VendorConnector { /** * Initialize the connector * @param {object} connectorConfig * @returns {Promise&lt;InitResult>} * */ init(config) { throw new Error('Not implemented'); } /** * Gets the telephonyConnector * @returns {Promise&lt;TelephonyConnector>} * */ getTelephonyConnector() { throw new Error('Not implemented'); } /** * Sends non-voice agent work events to vendor such as work accepted, declined, etc * @param {AgentWork} agentWork * */ onAgentWorkEvent(agentWork) { throw new Error('Not implemented'); } /** * Set agent status * @param {string} agentStatus * @param {StatusInfo} statusInfo * @param {Boolean} enqueueNextState - flag to determine if this status change request should be enqueued if neccessary * @returns {Promise&lt;GenericResult>} * */ setAgentStatus(agentStatus, statusInfo, enqueueNextState) { throw new Error('Not implemented'); } /** * Get agent status * @returns {Promise&lt;AgentStatusInfo>} * */ getAgentStatus() { this.logMessageToVendor(constants.LOG_LEVEL.INFO, 'getAgentStatus API is NOT Implemented' ); } /** * Logout from Omni * @returns {Promise&lt;LogoutResult>} */ logout() { throw new Error('Not implemented'); } /** * Handle message from LWC/Aura component * @param {object} message */ handleMessage(message) { throw new Error('Not implemented'); } /** * Triggers a browser download for Vendor Logs * @param {String[]} logs Array of log messages. */ downloadLogs(logs) { downloadLogs(); } /** * Sends the logs with a logLevel and payload to the vendor connector. * Does a no-op, if not implemented. * @param {String} logLevel Log Level (INFO, WARN, ERROR) * @param {String} message Message to be logged * @param {Object} payload An optional payload to be logged */ logMessageToVendor(logLevel, message, payload) {} } export class Validator { static validateString(value) { if (typeof value !== 'string') { throw new Error(`Invalid argument. Expecting a string but got ${typeof value}`); } return this; } static validateNumber(value) { if (typeof value !== 'number') { throw new Error(`Invalid argument. Expecting a number but got ${typeof value}`); } return this; } static validateBoolean(value) { if (typeof value !== 'boolean') { throw new Error(`Invalid argument. Expecting a boolean but got ${typeof value}`); } return this; } static validateEnum(value, enumValues) { const regex = new RegExp(enumValues.join( "|" ), "i"); if (!regex.test(value)) { throw new Error(`Invalid argument. Expecting a value from ${JSON.stringify(enumValues)} but got ${value}`); } return this; } static validateDate(value) { if (!(value instanceof Date)) { throw new Error(`Invalid argument. Expecting a Date object but got ${typeof value}`); } return this; } static validateClassObject(object, className) { if (!(object instanceof className)) { throw new Error(`Invalid className. Expecting object of class ${className} but got ${typeof object}`); } return this; } } /** * Class representing an AgentWork */ export class AgentWork { /** * Create an AgentWork. * @param {object} param * @param {string} [param.workItemId] - Salesforce agent work item Id * @param {string} [param.workId] - Salesforce work Id * @param {WORK_EVENT} [param.workEvent] - The work lifecycle event */ constructor({ workItemId, workId, workEvent }) { Validator.validateEnum(workEvent, Object.values(constants.WORK_EVENT)); this.workEvent = workEvent; this.workItemId = workItemId; this.workId = workId; } } /** * Class representing an Agent status information. This object is used to represent * agent status information */ export class AgentStatusInfo { /** * Create a AgentStatusInfo. * @param {object} param * @param {string} [param.statusId] - The unique statusId (required) * @param {string} [param.statusApiName] - The status API name * @param {string} [param.statusName] - The label for this status to be displayed in the UI */ constructor({statusId, statusApiName, statusName}) { Validator.validateString(statusId); if (statusApiName) { Validator.validateString(statusApiName); } if (statusName) { Validator.validateString(statusName); } this.statusId = statusId; this.statusApiName = statusApiName; this.statusName = statusName; } } /** * Class representing an Agent Vendor status information. This object is used to represent * agent vendor side status information */ export class AgentVendorStatusInfo { /** * Create a AgentVendorStatusInfo. * @param {object} param * @param {string} [param.statusId] - The unique statusId (e.g agentStateARN) * @param {string} [param.statusType] - The agent's current availability state type * @param {string} [param.statusName] - The name of the agent's current availability state */ constructor({statusId, statusType, statusName}) { if (statusId) { Validator.validateString(statusId); } if (statusType) { Validator.validateString(statusType); } if (statusName) { Validator.validateString(statusName); } this.statusId = statusId; this.statusType = statusType; this.statusName = statusName; } } /** * NOTE: SALESFORCE INTERNAL USE ONLY * Class representing an State Change Result information. This object is used to represent * Agent State Change Infomation */ export class StateChangeResult { /** * Create a StateChangeResult. * @param {object} param * @param {AgentVendorStatusInfo} [param.newVendorStateInfo] - newStateName (e.g 'Available') (required), newStateType (e.g 'routable') * @param {AgentVendorStatusInfo} [param.oldVendorStateInfo] - oldStateName (e.g 'offline'), oldStateType (e.g 'Offline') */ constructor({newVendorStateInfo, oldVendorStateInfo}) { Validator.validateClassObject(newVendorStateInfo, AgentVendorStatusInfo); Validator.validateString(newVendorStateInfo.statusName); if (oldVendorStateInfo) { Validator.validateClassObject(oldVendorStateInfo, AgentVendorStatusInfo); } this.newVendorStateInfo = newVendorStateInfo; this.oldVendorStateInfo = oldVendorStateInfo; } } /** * Class representing a Supervised Call Info. This object is used to represent * information about a call that is being supervised by a supervisor. */ export class SupervisedCallInfo { /** * Create a AgentStatusInfo. * @param {object} param * @param {string} [param.callId] - The unique supervised vendor call ID (required) * @param {string} [param.voiceCallId] - The supervised salesforce voice call ID * @param {string} [param.callType] - The type of the call, one of the CALL_TYPE values * @param {string} [param.from] - From phone number (for Inbound calls) * @param {string} [param.to] - To phone number (for Outbound calls) * @param {string} [param.supervisorName] - The supervisor name (shown to the supervised agent on barge in) * @param {boolean} [param.isBargedIn] - True if the Supervisor has barged in, False if the supervisor is listening in. */ constructor({callId, voiceCallId, callType, from, to, supervisorName, isBargedIn}) { Validator.validateString(callId); this.callId = callId; this.voiceCallId = voiceCallId; this.callType = callType; this.from = from; this.to = to; this.supervisorName = supervisorName; this.isBargedIn = isBargedIn; } } /** * Class representing a Audio Stats, which contains array of AudioStats. This object is used to calculate the MOS Score */ export class AudioStats { /** * Create a AudioStats * @param {object} param * @param {string} [param.callId] - The unique callId. * @param {AudioStatsElement[]} param.stats - array of AudioStatsElement * @param {boolean} [param.isAudioStatsCompleted] - True if the audio stats is completed, will calculate MOS and update VoiceCall record */ constructor({ callId, stats, isAudioStatsCompleted }) { if (callId) { Validator.validateString(callId); this.callId = callId; } if (stats) { Validator.validateClassObject(stats, Array); stats.forEach(audioStatsElement => Validator.validateClassObject(audioStatsElement, AudioStatsElement)); this.stats = stats; } if (isAudioStatsCompleted) { Validator.validateBoolean(isAudioStatsCompleted); this.isAudioStatsCompleted = isAudioStatsCompleted; } } } /** * Class representing a Audio Stats Element. This object is used to calculate the MOS Score */ export class AudioStatsElement { /** * Create a AudioStatsElement * @param {object} param * @param {StatsInfo} [param.inputChannelStats] - the inputChannel stream stats * @param {StatsInfo} [param.outputChannelStats] - the ouputChannel stream stats */ constructor({inputChannelStats, outputChannelStats}) { if (inputChannelStats) { Validator.validateClassObject(inputChannelStats, StatsInfo); } if (outputChannelStats) { Validator.validateClassObject(outputChannelStats, StatsInfo); } this.inputChannelStats = inputChannelStats; this.outputChannelStats = outputChannelStats; } } /** * Class representing a Stream Stats. This object is used to calculate the MOS Score */ export class StatsInfo { /** * Create a StatsInfo * @param {object} param * @param {number} [param.packetsCount] - the packets count * @param {number} [param.packetsLost] - packets lost count * @param {number} [param.jitterBufferMillis] - jitter buffer in milliseconds * @param {number} [param.roundTripTimeMillis] - round trip time in milliseconds */ constructor({packetsCount, packetsLost, jitterBufferMillis, roundTripTimeMillis}) { packetsCount = (packetsCount == null || packetsCount &lt; 0) ? 0 : packetsCount; packetsLost = (packetsLost == null || packetsLost &lt; 0) ? 0 : packetsLost; jitterBufferMillis = (jitterBufferMillis == null || jitterBufferMillis &lt; 0) ? 0 : jitterBufferMillis; roundTripTimeMillis = (roundTripTimeMillis == null || roundTripTimeMillis &lt; 0) ? 0 : roundTripTimeMillis; this.statsCount = 0; this.packetsCount = packetsCount; this.packetsLost = packetsLost; this.jitterBufferMillis = jitterBufferMillis; this.roundTripTimeMillis = roundTripTimeMillis; } } /** * Class representing supervise call result */ export class SuperviseCallResult { /** * Create a SuperviseCallResult * @param {object} param * @param {PhoneCall} param.call */ constructor({call}) { Validator.validateClassObject(call, PhoneCall); this.call = call; } } /** * Class representing result type for supervisorDisconnected() */ export class SupervisorHangupResult extends HangupResult { /** * Create SupervisorHangupResult * @param {object} param * @param {PhoneCall[]|PhoneCall} param.calls - one or more calls when supervisor hangsup */ constructor({ calls }) { super({ calls }); } } /** * Class representing result type for STORAGE_ACCESS_RESULT * @param {object} param * @param {boolean} [param.success] * @param {boolean} [param.showLogin] * @param {number} [param.loginFrameHeight] */ export class ShowStorageAccessResult { constructor({success= false, showLogin = false, loginFrameHeight = 350 }) { this.success = success; this.showLogin = showLogin; this.loginFrameHeight = loginFrameHeight; } }</code></pre> </article> </section> </div> <nav> <h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="ActiveCallsResult.html">ActiveCallsResult</a></li><li><a href="AgentConfig.html">AgentConfig</a></li><li><a href="AgentConfigResult.html">AgentConfigResult</a></li><li><a href="AgentStatusInfo.html">AgentStatusInfo</a></li><li><a href="AgentVendorStatusInfo.html">AgentVendorStatusInfo</a></li><li><a href="AgentWork.html">AgentWork</a></li><li><a href="AudioStats.html">AudioStats</a></li><li><a href="AudioStatsElement.html">AudioStatsElement</a></li><li><a href="CallInfo.html">CallInfo</a></li><li><a href="CallResult.html">CallResult</a></li><li><a href="CapabilitiesResult.html">CapabilitiesResult</a></li><li><a href="Contact.html">Contact</a></li><li><a href="CustomError.html">CustomError</a></li><li><a href="DialOptions.html">DialOptions</a></li><li><a href="GenericResult.html">GenericResult</a></li><li><a href="HangupResult.html">HangupResult</a></li><li><a href="HoldToggleResult.html">HoldToggleResult</a></li><li><a href="InitResult.html">InitResult</a></li><li><a href="LogoutResult.html">LogoutResult</a></li><li><a href="MuteToggleResult.html">MuteToggleResult</a></li><li><a href="ParticipantResult.html">ParticipantResult</a></li><li><a href="Phone.html">Phone</a></li><li><a href="PhoneCall.html">PhoneCall</a></li><li><a href="PhoneCallAttributes.html">PhoneCallAttributes</a></li><li><a href="PhoneContactsResult.html">PhoneContactsResult</a></li><li><a href="RecordingToggleResult.html">RecordingToggleResult</a></li><li><a href="ShowStorageAccessResult.html">ShowStorageAccessResult</a></li><li><a href="SignedRecordingUrlResult.html">SignedRecordingUrlResult</a></li><li><a href="StateChangeResult.html">StateChangeResult</a></li><li><a href="StatsInfo.html">StatsInfo</a></li><li><a href="SuperviseCallResult.html">SuperviseCallResult</a></li><li><a href="SupervisedCallInfo.html">SupervisedCallInfo</a></li><li><a href="SupervisorHangupResult.html">SupervisorHangupResult</a></li><li><a href="TelephonyConnector.html">TelephonyConnector</a></li><li><a href="VendorConnector.html">VendorConnector</a></li></ul><h3>Global</h3><ul><li><a href="global.html#CONNECTOR_CONFIG_EXCEPTION_FIELDS">CONNECTOR_CONFIG_EXCEPTION_FIELDS</a></li><li><a href="global.html#CONNECTOR_CONFIG_EXPOSED_FIELDS">CONNECTOR_CONFIG_EXPOSED_FIELDS</a></li><li><a href="global.html#CONNECTOR_CONFIG_EXPOSED_FIELDS_STARTSWITH">CONNECTOR_CONFIG_EXPOSED_FIELDS_STARTSWITH</a></li><li><a href="global.html#dispatchCustomError">dispatchCustomError</a></li><li><a href="global.html#dispatchError">dispatchError</a></li><li><a href="global.html#dispatchEvent">dispatchEvent</a></li><li><a href="global.html#dispatchEventLog">dispatchEventLog</a></li><li><a href="global.html#downloadData">downloadData</a></li><li><a href="global.html#downloadLogs">downloadLogs</a></li><li><a href="global.html#getErrorMessage">getErrorMessage</a></li><li><a href="glo