@webex/contact-center 3.12.0-next.158 → 3.12.0-next.159

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.
Files changed (41) hide show
  1. package/ai-docs/contact-center-spec.md +3 -0
  2. package/dist/cc.js +10 -2
  3. package/dist/cc.js.map +1 -1
  4. package/dist/services/ApiAiAssistant.js +18 -0
  5. package/dist/services/ApiAiAssistant.js.map +1 -1
  6. package/dist/services/WebCallingService.js +10 -2
  7. package/dist/services/WebCallingService.js.map +1 -1
  8. package/dist/services/constants.js +11 -1
  9. package/dist/services/constants.js.map +1 -1
  10. package/dist/services/core/Utils.js +21 -1
  11. package/dist/services/core/Utils.js.map +1 -1
  12. package/dist/services/core/aqm-reqs.js +7 -15
  13. package/dist/services/core/aqm-reqs.js.map +1 -1
  14. package/dist/services/core/constants.js +9 -1
  15. package/dist/services/core/constants.js.map +1 -1
  16. package/dist/services/core/websocket/WebSocketManager.js +17 -1
  17. package/dist/services/core/websocket/WebSocketManager.js.map +1 -1
  18. package/dist/types/services/ApiAiAssistant.d.ts +9 -0
  19. package/dist/types/services/constants.d.ts +9 -0
  20. package/dist/types/services/core/Utils.d.ts +8 -0
  21. package/dist/types/services/core/constants.d.ts +7 -0
  22. package/dist/webex.js +1 -1
  23. package/package.json +1 -1
  24. package/src/cc.ts +15 -2
  25. package/src/services/ApiAiAssistant.ts +24 -0
  26. package/src/services/WebCallingService.ts +16 -2
  27. package/src/services/ai-docs/services-spec.md +8 -1
  28. package/src/services/constants.ts +10 -0
  29. package/src/services/core/Utils.ts +24 -0
  30. package/src/services/core/ai-docs/core-spec.md +23 -13
  31. package/src/services/core/aqm-reqs.ts +6 -15
  32. package/src/services/core/constants.ts +8 -0
  33. package/src/services/core/websocket/WebSocketManager.ts +26 -2
  34. package/test/unit/spec/cc.ts +21 -0
  35. package/test/unit/spec/services/ApiAiAssistant.ts +13 -0
  36. package/test/unit/spec/services/WebCallingService.ts +38 -0
  37. package/test/unit/spec/services/core/Utils.ts +22 -0
  38. package/test/unit/spec/services/core/aqm-reqs.ts +29 -0
  39. package/test/unit/spec/services/core/websocket/WebSocketManager.ts +64 -14
  40. package/umd/contact-center.min.js +2 -2
  41. package/umd/contact-center.min.js.map +1 -1
@@ -43,6 +43,18 @@ class ApiAIAssistant {
43
43
  setAIFeatureFlags(aiFeature) {
44
44
  this.aiFeature = aiFeature;
45
45
  }
46
+
47
+ /**
48
+ * Validates a caller-supplied identifier (agentId/interactionId) before it is used to
49
+ * construct a request. Accepts a non-empty alphanumeric identifier that may contain
50
+ * hyphens or underscores.
51
+ * @param value - the identifier to validate
52
+ * @returns {boolean} true when the identifier is a non-empty, well-formed string
53
+ * @private
54
+ */
55
+ isValidTranscriptIdentifier(value) {
56
+ return typeof value === 'string' && /^[A-Za-z0-9_-]{1,128}$/.test(value);
57
+ }
46
58
  async sendWellnessBreakAction(action, method) {
47
59
  this.metricsManager.timeEvent([_constants.METRIC_EVENT_NAMES.AI_ASSISTANT_WELLNESS_ACTION_ACCEPTED, _constants.METRIC_EVENT_NAMES.AI_ASSISTANT_WELLNESS_ACTION_FAILED]);
48
60
  try {
@@ -471,6 +483,12 @@ class ApiAIAssistant {
471
483
  } = (0, _Utils.getErrorDetails)(new Error('REAL_TIME_TRANSCRIPTION_NOT_ENABLED'), _constants2.METHODS.FETCH_HISTORIC_TRANSCRIPTS, _constants2.CC_FILE);
472
484
  throw detailedError;
473
485
  }
486
+ if (!this.isValidTranscriptIdentifier(agentId) || !this.isValidTranscriptIdentifier(interactionId)) {
487
+ const {
488
+ error: detailedError
489
+ } = (0, _Utils.getErrorDetails)(new Error('INVALID_AGENT_ID_OR_INTERACTION_ID'), _constants2.METHODS.FETCH_HISTORIC_TRANSCRIPTS, _constants2.CC_FILE);
490
+ throw detailedError;
491
+ }
474
492
  try {
475
493
  const baseUrl = this.getBaseUrl();
476
494
  const orgId = this.webex.credentials.getOrgId();
@@ -1 +1 @@
1
- {"version":3,"names":["_uuid","require","_loggerProxy","_interopRequireDefault","_MetricsManager","_constants","_constants2","_types","_Utils","_constants3","e","__esModule","default","ApiAIAssistant","pendingRtdRequests","Map","createWellnessError","reason","error","Error","details","type","orgId","webex","credentials","getOrgId","trackingId","data","constructor","wellnessContextProvider","metricsManager","MetricsManager","getInstance","setAIFeatureFlags","aiFeature","sendWellnessBreakAction","action","method","timeEvent","METRIC_EVENT_NAMES","AI_ASSISTANT_WELLNESS_ACTION_ACCEPTED","AI_ASSISTANT_WELLNESS_ACTION_FAILED","context","agentId","trim","agentSessionId","isWellnessBreakEnabled","baseUrl","getBaseUrl","response","request","uri","AI_ASSISTANT_API_URLS","EVENT","HTTP_METHODS","POST","addAuthHeader","body","eventType","AIAssistantEventType","CUSTOM_EVENT","eventName","AIAssistantEventName","WELLNESS_BREAK_ACTION","eventDetails","actionTimeStamp","Date","now","statusCode","trackEvent","LoggerProxy","log","module","CC_FILE","message","String","detailedError","getErrorDetails","requestWellnessBreak","WELLNESS_BREAK_USER_ACTIONS","REQUESTED","METHODS","REQUEST_WELLNESS_BREAK","respondToWellnessBreak","params","ACCEPTED","REJECTED","NO_RESPONSE","includes","RESPOND_TO_WELLNESS_BREAK","wccApiGatewayUrl","internal","services","get","WCC_API_GATEWAY","AI_SUMMARY_ERROR_CODES","AI_ASSISTANT_BASE_URL_NOT_AVAILABLE","GET_BASE_URL","hostname","URL","toLowerCase","resolvedEnv","AI_ASSISTANT_ENV_MAP","AI_ASSISTANT_BASE_URL_TEMPLATE","replace","getRtdRequestKey","rtdEventType","correlationId","JSON","stringify","removeRtdRequest","settle","key","undefined","timeoutId","clearTimeout","delete","requestAndWaitForRtd","options","resolveResult","rejectResult","result","Promise","resolve","reject","previousRequest","setTimeout","currentRequest","createTimeoutError","timeoutMs","set","publishTimestamp","acknowledgement","then","sendEvent","interactionId","eventMetaData","timeout","catch","payload","all","resolveFromRtdEvent","clearAllRtdRequests","Array","from","values","forEach","languageCode","info","SEND_EVENT","AI_ASSISTANT_SEND_EVENT_SUCCESS","AI_ASSISTANT_SEND_EVENT_FAILED","getRealTimeAssistance","trimmedContext","uuidv4","ADD_SUGGESTIONS_EXTRA_CONTEXT","GET_SUGGESTIONS","loggerContext","GET_REAL_TIME_ASSISTANCE","AI_ASSISTANT_GET_REAL_TIME_ASSISTANCE_SUCCESS","AI_ASSISTANT_GET_REAL_TIME_ASSISTANCE_FAILED","suggestedResponses","enable","sendRealTimeAssistanceUserAction","adaptiveCardId","actionId","actionType","SEND_REAL_TIME_ASSISTANCE_USER_ACTION","AI_ASSISTANT_SEND_REAL_TIME_ASSISTANCE_USER_ACTION_SUCCESS","AI_ASSISTANT_SEND_REAL_TIME_ASSISTANCE_USER_ACTION_FAILED","SUGGESTED_RESPONSES_USER_ACTION","userAction","fetchHistoricTranscripts","FETCH_HISTORIC_TRANSCRIPTS","AI_ASSISTANT_FETCH_HISTORIC_TRANSCRIPTS_SUCCESS","AI_ASSISTANT_FETCH_HISTORIC_TRANSCRIPTS_FAILED","realtimeTranscripts","TRANSCRIPTS_LIST","exports","_default"],"sources":["ApiAiAssistant.ts"],"sourcesContent":["import {v4 as uuidv4} from 'uuid';\nimport LoggerProxy from '../logger-proxy';\nimport MetricsManager from '../metrics/MetricsManager';\nimport {METRIC_EVENT_NAMES} from '../metrics/constants';\nimport {AI_SUMMARY_ERROR_CODES, CC_FILE, METHODS} from '../constants';\nimport {\n HTTP_METHODS,\n WebexSDK,\n IHttpResponse,\n AIAssistantEventType,\n AIAssistantEventName,\n HistoricTranscriptsResponse,\n RealTimeAssistanceParams,\n RealTimeAssistanceUserActionParams,\n RespondToWellnessBreakParams,\n WellnessBreakUserAction,\n WELLNESS_BREAK_USER_ACTIONS,\n GenericError,\n} from '../types';\nimport {getErrorDetails} from './core/Utils';\nimport type {PendingRtdRequest, RtdRequestOptions} from './core/types';\nimport {\n AI_ASSISTANT_BASE_URL_TEMPLATE,\n AI_ASSISTANT_ENV_MAP,\n AI_ASSISTANT_API_URLS,\n WCC_API_GATEWAY,\n} from './constants';\nimport {AIFeatureFlags} from './config/types';\n\ntype WellnessBreakContextProvider = () => {\n isWellnessBreakEnabled: boolean;\n agentId?: string;\n agentSessionId?: string;\n};\n\n/**\n * ApiAIAssistant provides AI Assistant APIs for transcript controls.\n * @public\n */\nexport class ApiAIAssistant {\n private webex: WebexSDK;\n private metricsManager: MetricsManager;\n /** @internal Current AI flags from the agent configuration. */\n public aiFeature: AIFeatureFlags;\n private pendingRtdRequests = new Map<string, PendingRtdRequest<unknown>>();\n private readonly wellnessContextProvider?: WellnessBreakContextProvider;\n\n private createWellnessError(reason: string): GenericError {\n const error = new Error(reason) as GenericError;\n error.details = {\n type: 'SDK_VALIDATION_ERROR',\n orgId: this.webex.credentials.getOrgId(),\n trackingId: '',\n data: {reason},\n };\n\n return error;\n }\n\n constructor(webex: WebexSDK, wellnessContextProvider?: WellnessBreakContextProvider) {\n this.webex = webex;\n this.wellnessContextProvider = wellnessContextProvider;\n this.metricsManager = MetricsManager.getInstance({webex});\n }\n\n public setAIFeatureFlags(aiFeature: AIFeatureFlags): void {\n this.aiFeature = aiFeature;\n }\n\n private async sendWellnessBreakAction(\n action: WellnessBreakUserAction,\n method: string\n ): Promise<void> {\n this.metricsManager.timeEvent([\n METRIC_EVENT_NAMES.AI_ASSISTANT_WELLNESS_ACTION_ACCEPTED,\n METRIC_EVENT_NAMES.AI_ASSISTANT_WELLNESS_ACTION_FAILED,\n ]);\n\n try {\n const context = this.wellnessContextProvider?.();\n const agentId = context?.agentId?.trim();\n const agentSessionId = context?.agentSessionId?.trim();\n const orgId = this.webex.credentials.getOrgId()?.trim();\n\n if (context?.isWellnessBreakEnabled !== true) {\n throw this.createWellnessError('WELLNESS_BREAK_NOT_ENABLED');\n }\n if (!orgId) {\n throw this.createWellnessError('WELLNESS_BREAK_ORG_ID_REQUIRED');\n }\n if (!agentId) {\n throw this.createWellnessError('WELLNESS_BREAK_AGENT_ID_REQUIRED');\n }\n if (!agentSessionId) {\n throw this.createWellnessError('WELLNESS_BREAK_AGENT_SESSION_REQUIRED');\n }\n\n const baseUrl = this.getBaseUrl();\n const response = (await this.webex.request({\n uri: `${baseUrl}${AI_ASSISTANT_API_URLS.EVENT}`,\n method: HTTP_METHODS.POST,\n addAuthHeader: true,\n body: {\n agentId,\n orgId,\n eventType: AIAssistantEventType.CUSTOM_EVENT,\n eventName: AIAssistantEventName.WELLNESS_BREAK_ACTION,\n eventDetails: {\n data: {\n action,\n agentSessionId,\n actionTimeStamp: Date.now(),\n },\n },\n },\n })) as IHttpResponse;\n\n if (response.statusCode !== 202) {\n throw this.createWellnessError(\n `WELLNESS_BREAK_ACTION_UNEXPECTED_STATUS_${response.statusCode}`\n );\n }\n\n this.metricsManager.trackEvent(\n METRIC_EVENT_NAMES.AI_ASSISTANT_WELLNESS_ACTION_ACCEPTED,\n {action},\n ['operational']\n );\n LoggerProxy.log('Wellness action accepted by AI Assistant', {\n module: CC_FILE,\n method,\n data: {action},\n });\n } catch (error) {\n this.metricsManager.trackEvent(\n METRIC_EVENT_NAMES.AI_ASSISTANT_WELLNESS_ACTION_FAILED,\n {\n action,\n error: error instanceof Error ? error.message : String(error),\n },\n ['operational']\n );\n const {error: detailedError} = getErrorDetails(error, method, CC_FILE);\n throw detailedError;\n }\n }\n\n /**\n * Requests an Agent Wellness Break.\n * The promise resolves when the HTTP request is accepted with status 202; the later\n * approval or denial is delivered independently through a wellness notification.\n * @returns A promise that resolves with no value after HTTP acceptance\n * @throws Structured Contact Center error when disabled, stale, invalid, or delivery fails\n * @example\n * await webex.cc.apiAIAssistant.requestWellnessBreak();\n * @public\n */\n public async requestWellnessBreak(): Promise<void> {\n return this.sendWellnessBreakAction(\n WELLNESS_BREAK_USER_ACTIONS.REQUESTED,\n METHODS.REQUEST_WELLNESS_BREAK\n );\n }\n\n /**\n * Responds to a backend-provided Agent Wellness Break offer.\n * The promise resolves when the HTTP request is accepted with status 202 and does not\n * wait for a WebSocket completion event.\n * @param params - ACCEPTED, REJECTED, or NO_RESPONSE\n * @returns A promise that resolves with no value after HTTP acceptance\n * @throws Structured Contact Center error when disabled, stale, invalid, or delivery fails\n * @example\n * await webex.cc.apiAIAssistant.respondToWellnessBreak({\n * action: WELLNESS_BREAK_USER_ACTIONS.ACCEPTED,\n * });\n * @public\n */\n public async respondToWellnessBreak(params: RespondToWellnessBreakParams): Promise<void> {\n const {action} = params;\n if (\n ![\n WELLNESS_BREAK_USER_ACTIONS.ACCEPTED,\n WELLNESS_BREAK_USER_ACTIONS.REJECTED,\n WELLNESS_BREAK_USER_ACTIONS.NO_RESPONSE,\n ].includes(action)\n ) {\n const {error} = getErrorDetails(\n this.createWellnessError('WELLNESS_BREAK_ACTION_INVALID'),\n METHODS.RESPOND_TO_WELLNESS_BREAK,\n CC_FILE\n );\n throw error;\n }\n\n return this.sendWellnessBreakAction(action, METHODS.RESPOND_TO_WELLNESS_BREAK);\n }\n\n private getBaseUrl(): string {\n const wccApiGatewayUrl = this.webex.internal.services.get(WCC_API_GATEWAY) || '';\n\n if (!wccApiGatewayUrl) {\n const {error: detailedError} = getErrorDetails(\n new Error(AI_SUMMARY_ERROR_CODES.AI_ASSISTANT_BASE_URL_NOT_AVAILABLE),\n METHODS.GET_BASE_URL,\n CC_FILE\n );\n throw detailedError;\n }\n\n let hostname = '';\n try {\n hostname = new URL(wccApiGatewayUrl).hostname.toLowerCase();\n } catch (error) {\n hostname = wccApiGatewayUrl.toLowerCase();\n }\n\n const resolvedEnv = AI_ASSISTANT_ENV_MAP[hostname];\n\n if (!resolvedEnv) {\n const {error: detailedError} = getErrorDetails(\n new Error(AI_SUMMARY_ERROR_CODES.AI_ASSISTANT_BASE_URL_NOT_AVAILABLE),\n METHODS.GET_BASE_URL,\n CC_FILE\n );\n throw detailedError;\n }\n\n return AI_ASSISTANT_BASE_URL_TEMPLATE.replace('%s', resolvedEnv);\n }\n\n private static getRtdRequestKey(rtdEventType: string, correlationId: string): string {\n return JSON.stringify([rtdEventType, correlationId]);\n }\n\n private removeRtdRequest<T>(\n rtdEventType: string,\n correlationId: string,\n settle?: (request: PendingRtdRequest<T>) => void\n ): PendingRtdRequest<T> | undefined {\n const key = ApiAIAssistant.getRtdRequestKey(rtdEventType, correlationId);\n const request = this.pendingRtdRequests.get(key) as PendingRtdRequest<T> | undefined;\n\n if (!request) {\n return undefined;\n }\n\n if (request.timeoutId) {\n clearTimeout(request.timeoutId);\n }\n\n settle?.(request);\n this.pendingRtdRequests.delete(key);\n\n return request;\n }\n\n /** Sends an AI event and waits for its matching RTD response. @internal */\n public async requestAndWaitForRtd<T>(options: RtdRequestOptions): Promise<T> {\n const key = ApiAIAssistant.getRtdRequestKey(options.rtdEventType, options.correlationId);\n let resolveResult: (payload: T) => void = () => undefined;\n let rejectResult: (error: Error) => void = () => undefined;\n const result = new Promise<T>((resolve, reject) => {\n resolveResult = resolve;\n rejectResult = reject;\n });\n const previousRequest = this.pendingRtdRequests.get(key);\n if (previousRequest?.timeoutId) {\n clearTimeout(previousRequest.timeoutId);\n }\n const request: PendingRtdRequest<T> = {\n correlationId: options.correlationId,\n rtdEventType: options.rtdEventType,\n resolve: resolveResult,\n reject: rejectResult,\n };\n\n request.timeoutId = setTimeout(() => {\n this.removeRtdRequest<T>(options.rtdEventType, options.correlationId, (currentRequest) => {\n currentRequest.reject(options.createTimeoutError());\n });\n }, options.timeoutMs);\n this.pendingRtdRequests.set(key, request as PendingRtdRequest<unknown>);\n const publishTimestamp = options.publishTimestamp ?? Date.now();\n const acknowledgement = Promise.resolve()\n .then(() =>\n this.sendEvent(\n options.agentId,\n options.interactionId,\n options.eventType,\n options.eventName,\n options.eventMetaData,\n undefined,\n undefined,\n publishTimestamp,\n options.timeout\n )\n )\n .catch((error) => {\n this.removeRtdRequest(options.rtdEventType, options.correlationId);\n throw error;\n });\n\n const [payload] = await Promise.all([result, acknowledgement]);\n\n return payload;\n }\n\n /** Resolves a pending request from a parsed RTD event. @internal */\n public resolveFromRtdEvent<T>(\n rtdEventType: string,\n correlationId: string,\n payload: T\n ): 'resolved' | 'not-found' {\n const request = this.removeRtdRequest<T>(rtdEventType, correlationId, (currentRequest) => {\n currentRequest.resolve(payload);\n });\n\n return request ? 'resolved' : 'not-found';\n }\n\n /** Clears pending RTD requests when the RTD lifecycle ends. @internal */\n public clearAllRtdRequests(): void {\n Array.from(this.pendingRtdRequests.values()).forEach((request) => {\n this.removeRtdRequest(request.rtdEventType, request.correlationId, (currentRequest) => {\n currentRequest.reject(new Error('RTD request cleared'));\n });\n });\n }\n\n /**\n * Sends an event to the AI Assistant service.\n * @param agentId - agent identifier\n * @param interactionId - interaction/conversation identifier\n * @param eventType - the type of event (e.g. 'CUSTOM_EVENT')\n * @param eventName - the name of the event (e.g. 'GET_TRANSCRIPTS')\n * @param eventMetaData - event-specific fields to include in eventDetails.data\n * @param languageCode - language code within eventDetails.data\n * @param trackingId - tracking identifier within eventDetails.data\n */\n public async sendEvent(\n agentId: string,\n interactionId: string,\n eventType: AIAssistantEventType,\n eventName: AIAssistantEventName,\n eventMetaData?: Record<string, unknown>,\n languageCode?: string,\n trackingId?: string,\n publishTimestamp?: number,\n timeout?: number\n ): Promise<Record<string, unknown>> {\n LoggerProxy.info('Sending event', {\n module: CC_FILE,\n method: METHODS.SEND_EVENT,\n interactionId,\n data: {eventType, eventName, eventMetaData},\n });\n this.metricsManager.timeEvent([\n METRIC_EVENT_NAMES.AI_ASSISTANT_SEND_EVENT_SUCCESS,\n METRIC_EVENT_NAMES.AI_ASSISTANT_SEND_EVENT_FAILED,\n ]);\n\n try {\n const baseUrl = this.getBaseUrl();\n const orgId = this.webex.credentials.getOrgId();\n const data = {\n ...eventMetaData,\n interactionId,\n actionTimeStamp: String(Date.now()),\n languageCode,\n trackingId,\n };\n const response = (await this.webex.request({\n uri: `${baseUrl}${AI_ASSISTANT_API_URLS.EVENT}`,\n method: HTTP_METHODS.POST,\n addAuthHeader: true,\n ...(timeout !== undefined ? {timeout} : {}),\n body: {\n agentId,\n orgId,\n eventType,\n eventName,\n ...(publishTimestamp !== undefined ? {publishTimestamp} : {}),\n eventDetails: {\n data,\n },\n },\n })) as IHttpResponse;\n\n this.metricsManager.trackEvent(\n METRIC_EVENT_NAMES.AI_ASSISTANT_SEND_EVENT_SUCCESS,\n {agentId, orgId, interactionId, eventType, eventName},\n ['operational']\n );\n\n return response?.body || {};\n } catch (error) {\n this.metricsManager.trackEvent(\n METRIC_EVENT_NAMES.AI_ASSISTANT_SEND_EVENT_FAILED,\n {\n interactionId,\n eventType,\n eventName,\n error: error instanceof Error ? error.message : String(error),\n },\n ['operational']\n );\n\n const {error: detailedError} = getErrorDetails(error, METHODS.SEND_EVENT, CC_FILE);\n throw detailedError;\n }\n }\n\n /**\n * Requests real-time assistance for an interaction.\n *\n * @param params - Real-time assistance request parameters\n * @returns HTTP response body from the AI Assistant event API\n * @public\n */\n public async getRealTimeAssistance(params: RealTimeAssistanceParams) {\n const {agentId, interactionId, context} = params;\n const trimmedContext = context?.trim();\n const languageCode = params.languageCode ?? 'en';\n const trackingId = `WX_CC_SDK_${uuidv4()}`;\n const eventName = trimmedContext\n ? AIAssistantEventName.ADD_SUGGESTIONS_EXTRA_CONTEXT\n : AIAssistantEventName.GET_SUGGESTIONS;\n\n const loggerContext = {\n module: CC_FILE,\n method: METHODS.GET_REAL_TIME_ASSISTANCE,\n interactionId,\n trackingId,\n data: {eventName},\n };\n\n LoggerProxy.info('Requesting real-time assistance', loggerContext);\n\n this.metricsManager.timeEvent([\n METRIC_EVENT_NAMES.AI_ASSISTANT_GET_REAL_TIME_ASSISTANCE_SUCCESS,\n METRIC_EVENT_NAMES.AI_ASSISTANT_GET_REAL_TIME_ASSISTANCE_FAILED,\n ]);\n\n try {\n if (!this.aiFeature?.suggestedResponses?.enable) {\n const {error: detailedError} = getErrorDetails(\n new Error('SUGGESTED_RESPONSES_NOT_ENABLED'),\n METHODS.GET_REAL_TIME_ASSISTANCE,\n CC_FILE\n );\n throw detailedError;\n }\n\n const orgId = this.webex.credentials.getOrgId();\n\n const response = await this.sendEvent(\n agentId,\n interactionId,\n AIAssistantEventType.CUSTOM_EVENT,\n eventName,\n trimmedContext !== undefined ? {context: trimmedContext} : undefined,\n languageCode,\n trackingId\n );\n\n this.metricsManager.trackEvent(\n METRIC_EVENT_NAMES.AI_ASSISTANT_GET_REAL_TIME_ASSISTANCE_SUCCESS,\n {\n agentId,\n orgId,\n interactionId,\n eventName,\n trackingId,\n context,\n },\n ['operational']\n );\n LoggerProxy.log('Real-time assistance request succeeded', loggerContext);\n\n return response;\n } catch (error) {\n LoggerProxy.error('Real-time assistance request failed', {...loggerContext, error});\n this.metricsManager.trackEvent(\n METRIC_EVENT_NAMES.AI_ASSISTANT_GET_REAL_TIME_ASSISTANCE_FAILED,\n {\n agentId,\n interactionId,\n trackingId,\n eventName,\n error: error instanceof Error ? error.message : String(error),\n },\n ['operational']\n );\n\n const {error: detailedError} = getErrorDetails(\n error,\n METHODS.GET_REAL_TIME_ASSISTANCE,\n CC_FILE\n );\n throw detailedError;\n }\n }\n\n /**\n * Sends user action feedback for a real-time assistance adaptive card.\n *\n * @param params - Real-time assistance user action parameters\n * @returns HTTP response body from the AI Assistant event API\n * @public\n */\n public async sendRealTimeAssistanceUserAction(\n params: RealTimeAssistanceUserActionParams\n ): Promise<Record<string, unknown>> {\n const {agentId, interactionId, adaptiveCardId, actionId} = params;\n const actionType = 'Action.Submit';\n const languageCode = params.languageCode ?? 'en';\n const trackingId = `WX_CC_SDK_${uuidv4()}`;\n\n const loggerContext = {\n module: CC_FILE,\n method: METHODS.SEND_REAL_TIME_ASSISTANCE_USER_ACTION,\n interactionId,\n trackingId,\n data: {actionId, adaptiveCardId},\n };\n\n LoggerProxy.info('Sending real-time assistance user action', loggerContext);\n\n this.metricsManager.timeEvent([\n METRIC_EVENT_NAMES.AI_ASSISTANT_SEND_REAL_TIME_ASSISTANCE_USER_ACTION_SUCCESS,\n METRIC_EVENT_NAMES.AI_ASSISTANT_SEND_REAL_TIME_ASSISTANCE_USER_ACTION_FAILED,\n ]);\n\n try {\n if (!this.aiFeature?.suggestedResponses?.enable) {\n const {error: detailedError} = getErrorDetails(\n new Error('SUGGESTED_RESPONSES_NOT_ENABLED'),\n METHODS.SEND_REAL_TIME_ASSISTANCE_USER_ACTION,\n CC_FILE\n );\n throw detailedError;\n }\n\n const orgId = this.webex.credentials.getOrgId();\n const response = await this.sendEvent(\n agentId,\n interactionId,\n AIAssistantEventType.CUSTOM_EVENT,\n AIAssistantEventName.SUGGESTED_RESPONSES_USER_ACTION,\n {\n adaptiveCardId,\n userAction: {\n actionType,\n actionId,\n },\n },\n languageCode,\n trackingId\n );\n\n this.metricsManager.trackEvent(\n METRIC_EVENT_NAMES.AI_ASSISTANT_SEND_REAL_TIME_ASSISTANCE_USER_ACTION_SUCCESS,\n {\n agentId,\n orgId,\n interactionId,\n adaptiveCardId,\n actionId,\n trackingId,\n },\n ['operational']\n );\n LoggerProxy.log('Real-time assistance user action sent', loggerContext);\n\n return response;\n } catch (error) {\n LoggerProxy.error('Real-time assistance user action failed', {...loggerContext, error});\n this.metricsManager.trackEvent(\n METRIC_EVENT_NAMES.AI_ASSISTANT_SEND_REAL_TIME_ASSISTANCE_USER_ACTION_FAILED,\n {\n agentId,\n interactionId,\n adaptiveCardId,\n actionId,\n trackingId,\n error: error instanceof Error ? error.message : String(error),\n },\n ['operational']\n );\n\n const {error: detailedError} = getErrorDetails(\n error,\n METHODS.SEND_REAL_TIME_ASSISTANCE_USER_ACTION,\n CC_FILE\n );\n throw detailedError;\n }\n }\n\n /**\n * Fetches historic transcripts for an interaction.\n * This API is allowed only when real-time transcription feature is enabled.\n *\n * @param interactionId - interaction/conversation identifier\n */\n public async fetchHistoricTranscripts(\n agentId: string,\n interactionId: string\n ): Promise<HistoricTranscriptsResponse> {\n LoggerProxy.info('Fetching historic transcripts', {\n module: CC_FILE,\n method: METHODS.FETCH_HISTORIC_TRANSCRIPTS,\n interactionId,\n });\n this.metricsManager.timeEvent([\n METRIC_EVENT_NAMES.AI_ASSISTANT_FETCH_HISTORIC_TRANSCRIPTS_SUCCESS,\n METRIC_EVENT_NAMES.AI_ASSISTANT_FETCH_HISTORIC_TRANSCRIPTS_FAILED,\n ]);\n if (!this.aiFeature?.realtimeTranscripts?.enable) {\n const {error: detailedError} = getErrorDetails(\n new Error('REAL_TIME_TRANSCRIPTION_NOT_ENABLED'),\n METHODS.FETCH_HISTORIC_TRANSCRIPTS,\n CC_FILE\n );\n throw detailedError;\n }\n\n try {\n const baseUrl = this.getBaseUrl();\n const orgId = this.webex.credentials.getOrgId();\n const response = (await this.webex.request({\n uri: `${baseUrl}${AI_ASSISTANT_API_URLS.TRANSCRIPTS_LIST}`,\n method: HTTP_METHODS.POST,\n addAuthHeader: true,\n body: {\n agentId,\n orgId,\n interactionId,\n },\n })) as IHttpResponse;\n\n this.metricsManager.trackEvent(\n METRIC_EVENT_NAMES.AI_ASSISTANT_FETCH_HISTORIC_TRANSCRIPTS_SUCCESS,\n {agentId, orgId, interactionId},\n ['operational']\n );\n\n return response.body as HistoricTranscriptsResponse;\n } catch (error) {\n this.metricsManager.trackEvent(\n METRIC_EVENT_NAMES.AI_ASSISTANT_FETCH_HISTORIC_TRANSCRIPTS_FAILED,\n {\n interactionId,\n error: error instanceof Error ? error.message : String(error),\n },\n ['operational']\n );\n\n if (error instanceof Error) {\n throw error;\n }\n const {error: detailedError} = getErrorDetails(\n error,\n METHODS.FETCH_HISTORIC_TRANSCRIPTS,\n CC_FILE\n );\n throw detailedError;\n }\n }\n}\n\nexport default ApiAIAssistant;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_uuid","require","_loggerProxy","_interopRequireDefault","_MetricsManager","_constants","_constants2","_types","_Utils","_constants3","e","__esModule","default","ApiAIAssistant","pendingRtdRequests","Map","createWellnessError","reason","error","Error","details","type","orgId","webex","credentials","getOrgId","trackingId","data","constructor","wellnessContextProvider","metricsManager","MetricsManager","getInstance","setAIFeatureFlags","aiFeature","isValidTranscriptIdentifier","value","test","sendWellnessBreakAction","action","method","timeEvent","METRIC_EVENT_NAMES","AI_ASSISTANT_WELLNESS_ACTION_ACCEPTED","AI_ASSISTANT_WELLNESS_ACTION_FAILED","context","agentId","trim","agentSessionId","isWellnessBreakEnabled","baseUrl","getBaseUrl","response","request","uri","AI_ASSISTANT_API_URLS","EVENT","HTTP_METHODS","POST","addAuthHeader","body","eventType","AIAssistantEventType","CUSTOM_EVENT","eventName","AIAssistantEventName","WELLNESS_BREAK_ACTION","eventDetails","actionTimeStamp","Date","now","statusCode","trackEvent","LoggerProxy","log","module","CC_FILE","message","String","detailedError","getErrorDetails","requestWellnessBreak","WELLNESS_BREAK_USER_ACTIONS","REQUESTED","METHODS","REQUEST_WELLNESS_BREAK","respondToWellnessBreak","params","ACCEPTED","REJECTED","NO_RESPONSE","includes","RESPOND_TO_WELLNESS_BREAK","wccApiGatewayUrl","internal","services","get","WCC_API_GATEWAY","AI_SUMMARY_ERROR_CODES","AI_ASSISTANT_BASE_URL_NOT_AVAILABLE","GET_BASE_URL","hostname","URL","toLowerCase","resolvedEnv","AI_ASSISTANT_ENV_MAP","AI_ASSISTANT_BASE_URL_TEMPLATE","replace","getRtdRequestKey","rtdEventType","correlationId","JSON","stringify","removeRtdRequest","settle","key","undefined","timeoutId","clearTimeout","delete","requestAndWaitForRtd","options","resolveResult","rejectResult","result","Promise","resolve","reject","previousRequest","setTimeout","currentRequest","createTimeoutError","timeoutMs","set","publishTimestamp","acknowledgement","then","sendEvent","interactionId","eventMetaData","timeout","catch","payload","all","resolveFromRtdEvent","clearAllRtdRequests","Array","from","values","forEach","languageCode","info","SEND_EVENT","AI_ASSISTANT_SEND_EVENT_SUCCESS","AI_ASSISTANT_SEND_EVENT_FAILED","getRealTimeAssistance","trimmedContext","uuidv4","ADD_SUGGESTIONS_EXTRA_CONTEXT","GET_SUGGESTIONS","loggerContext","GET_REAL_TIME_ASSISTANCE","AI_ASSISTANT_GET_REAL_TIME_ASSISTANCE_SUCCESS","AI_ASSISTANT_GET_REAL_TIME_ASSISTANCE_FAILED","suggestedResponses","enable","sendRealTimeAssistanceUserAction","adaptiveCardId","actionId","actionType","SEND_REAL_TIME_ASSISTANCE_USER_ACTION","AI_ASSISTANT_SEND_REAL_TIME_ASSISTANCE_USER_ACTION_SUCCESS","AI_ASSISTANT_SEND_REAL_TIME_ASSISTANCE_USER_ACTION_FAILED","SUGGESTED_RESPONSES_USER_ACTION","userAction","fetchHistoricTranscripts","FETCH_HISTORIC_TRANSCRIPTS","AI_ASSISTANT_FETCH_HISTORIC_TRANSCRIPTS_SUCCESS","AI_ASSISTANT_FETCH_HISTORIC_TRANSCRIPTS_FAILED","realtimeTranscripts","TRANSCRIPTS_LIST","exports","_default"],"sources":["ApiAiAssistant.ts"],"sourcesContent":["import {v4 as uuidv4} from 'uuid';\nimport LoggerProxy from '../logger-proxy';\nimport MetricsManager from '../metrics/MetricsManager';\nimport {METRIC_EVENT_NAMES} from '../metrics/constants';\nimport {AI_SUMMARY_ERROR_CODES, CC_FILE, METHODS} from '../constants';\nimport {\n HTTP_METHODS,\n WebexSDK,\n IHttpResponse,\n AIAssistantEventType,\n AIAssistantEventName,\n HistoricTranscriptsResponse,\n RealTimeAssistanceParams,\n RealTimeAssistanceUserActionParams,\n RespondToWellnessBreakParams,\n WellnessBreakUserAction,\n WELLNESS_BREAK_USER_ACTIONS,\n GenericError,\n} from '../types';\nimport {getErrorDetails} from './core/Utils';\nimport type {PendingRtdRequest, RtdRequestOptions} from './core/types';\nimport {\n AI_ASSISTANT_BASE_URL_TEMPLATE,\n AI_ASSISTANT_ENV_MAP,\n AI_ASSISTANT_API_URLS,\n WCC_API_GATEWAY,\n} from './constants';\nimport {AIFeatureFlags} from './config/types';\n\ntype WellnessBreakContextProvider = () => {\n isWellnessBreakEnabled: boolean;\n agentId?: string;\n agentSessionId?: string;\n};\n\n/**\n * ApiAIAssistant provides AI Assistant APIs for transcript controls.\n * @public\n */\nexport class ApiAIAssistant {\n private webex: WebexSDK;\n private metricsManager: MetricsManager;\n /** @internal Current AI flags from the agent configuration. */\n public aiFeature: AIFeatureFlags;\n private pendingRtdRequests = new Map<string, PendingRtdRequest<unknown>>();\n private readonly wellnessContextProvider?: WellnessBreakContextProvider;\n\n private createWellnessError(reason: string): GenericError {\n const error = new Error(reason) as GenericError;\n error.details = {\n type: 'SDK_VALIDATION_ERROR',\n orgId: this.webex.credentials.getOrgId(),\n trackingId: '',\n data: {reason},\n };\n\n return error;\n }\n\n constructor(webex: WebexSDK, wellnessContextProvider?: WellnessBreakContextProvider) {\n this.webex = webex;\n this.wellnessContextProvider = wellnessContextProvider;\n this.metricsManager = MetricsManager.getInstance({webex});\n }\n\n public setAIFeatureFlags(aiFeature: AIFeatureFlags): void {\n this.aiFeature = aiFeature;\n }\n\n /**\n * Validates a caller-supplied identifier (agentId/interactionId) before it is used to\n * construct a request. Accepts a non-empty alphanumeric identifier that may contain\n * hyphens or underscores.\n * @param value - the identifier to validate\n * @returns {boolean} true when the identifier is a non-empty, well-formed string\n * @private\n */\n private isValidTranscriptIdentifier(value: unknown): boolean {\n return typeof value === 'string' && /^[A-Za-z0-9_-]{1,128}$/.test(value);\n }\n\n private async sendWellnessBreakAction(\n action: WellnessBreakUserAction,\n method: string\n ): Promise<void> {\n this.metricsManager.timeEvent([\n METRIC_EVENT_NAMES.AI_ASSISTANT_WELLNESS_ACTION_ACCEPTED,\n METRIC_EVENT_NAMES.AI_ASSISTANT_WELLNESS_ACTION_FAILED,\n ]);\n\n try {\n const context = this.wellnessContextProvider?.();\n const agentId = context?.agentId?.trim();\n const agentSessionId = context?.agentSessionId?.trim();\n const orgId = this.webex.credentials.getOrgId()?.trim();\n\n if (context?.isWellnessBreakEnabled !== true) {\n throw this.createWellnessError('WELLNESS_BREAK_NOT_ENABLED');\n }\n if (!orgId) {\n throw this.createWellnessError('WELLNESS_BREAK_ORG_ID_REQUIRED');\n }\n if (!agentId) {\n throw this.createWellnessError('WELLNESS_BREAK_AGENT_ID_REQUIRED');\n }\n if (!agentSessionId) {\n throw this.createWellnessError('WELLNESS_BREAK_AGENT_SESSION_REQUIRED');\n }\n\n const baseUrl = this.getBaseUrl();\n const response = (await this.webex.request({\n uri: `${baseUrl}${AI_ASSISTANT_API_URLS.EVENT}`,\n method: HTTP_METHODS.POST,\n addAuthHeader: true,\n body: {\n agentId,\n orgId,\n eventType: AIAssistantEventType.CUSTOM_EVENT,\n eventName: AIAssistantEventName.WELLNESS_BREAK_ACTION,\n eventDetails: {\n data: {\n action,\n agentSessionId,\n actionTimeStamp: Date.now(),\n },\n },\n },\n })) as IHttpResponse;\n\n if (response.statusCode !== 202) {\n throw this.createWellnessError(\n `WELLNESS_BREAK_ACTION_UNEXPECTED_STATUS_${response.statusCode}`\n );\n }\n\n this.metricsManager.trackEvent(\n METRIC_EVENT_NAMES.AI_ASSISTANT_WELLNESS_ACTION_ACCEPTED,\n {action},\n ['operational']\n );\n LoggerProxy.log('Wellness action accepted by AI Assistant', {\n module: CC_FILE,\n method,\n data: {action},\n });\n } catch (error) {\n this.metricsManager.trackEvent(\n METRIC_EVENT_NAMES.AI_ASSISTANT_WELLNESS_ACTION_FAILED,\n {\n action,\n error: error instanceof Error ? error.message : String(error),\n },\n ['operational']\n );\n const {error: detailedError} = getErrorDetails(error, method, CC_FILE);\n throw detailedError;\n }\n }\n\n /**\n * Requests an Agent Wellness Break.\n * The promise resolves when the HTTP request is accepted with status 202; the later\n * approval or denial is delivered independently through a wellness notification.\n * @returns A promise that resolves with no value after HTTP acceptance\n * @throws Structured Contact Center error when disabled, stale, invalid, or delivery fails\n * @example\n * await webex.cc.apiAIAssistant.requestWellnessBreak();\n * @public\n */\n public async requestWellnessBreak(): Promise<void> {\n return this.sendWellnessBreakAction(\n WELLNESS_BREAK_USER_ACTIONS.REQUESTED,\n METHODS.REQUEST_WELLNESS_BREAK\n );\n }\n\n /**\n * Responds to a backend-provided Agent Wellness Break offer.\n * The promise resolves when the HTTP request is accepted with status 202 and does not\n * wait for a WebSocket completion event.\n * @param params - ACCEPTED, REJECTED, or NO_RESPONSE\n * @returns A promise that resolves with no value after HTTP acceptance\n * @throws Structured Contact Center error when disabled, stale, invalid, or delivery fails\n * @example\n * await webex.cc.apiAIAssistant.respondToWellnessBreak({\n * action: WELLNESS_BREAK_USER_ACTIONS.ACCEPTED,\n * });\n * @public\n */\n public async respondToWellnessBreak(params: RespondToWellnessBreakParams): Promise<void> {\n const {action} = params;\n if (\n ![\n WELLNESS_BREAK_USER_ACTIONS.ACCEPTED,\n WELLNESS_BREAK_USER_ACTIONS.REJECTED,\n WELLNESS_BREAK_USER_ACTIONS.NO_RESPONSE,\n ].includes(action)\n ) {\n const {error} = getErrorDetails(\n this.createWellnessError('WELLNESS_BREAK_ACTION_INVALID'),\n METHODS.RESPOND_TO_WELLNESS_BREAK,\n CC_FILE\n );\n throw error;\n }\n\n return this.sendWellnessBreakAction(action, METHODS.RESPOND_TO_WELLNESS_BREAK);\n }\n\n private getBaseUrl(): string {\n const wccApiGatewayUrl = this.webex.internal.services.get(WCC_API_GATEWAY) || '';\n\n if (!wccApiGatewayUrl) {\n const {error: detailedError} = getErrorDetails(\n new Error(AI_SUMMARY_ERROR_CODES.AI_ASSISTANT_BASE_URL_NOT_AVAILABLE),\n METHODS.GET_BASE_URL,\n CC_FILE\n );\n throw detailedError;\n }\n\n let hostname = '';\n try {\n hostname = new URL(wccApiGatewayUrl).hostname.toLowerCase();\n } catch (error) {\n hostname = wccApiGatewayUrl.toLowerCase();\n }\n\n const resolvedEnv = AI_ASSISTANT_ENV_MAP[hostname];\n\n if (!resolvedEnv) {\n const {error: detailedError} = getErrorDetails(\n new Error(AI_SUMMARY_ERROR_CODES.AI_ASSISTANT_BASE_URL_NOT_AVAILABLE),\n METHODS.GET_BASE_URL,\n CC_FILE\n );\n throw detailedError;\n }\n\n return AI_ASSISTANT_BASE_URL_TEMPLATE.replace('%s', resolvedEnv);\n }\n\n private static getRtdRequestKey(rtdEventType: string, correlationId: string): string {\n return JSON.stringify([rtdEventType, correlationId]);\n }\n\n private removeRtdRequest<T>(\n rtdEventType: string,\n correlationId: string,\n settle?: (request: PendingRtdRequest<T>) => void\n ): PendingRtdRequest<T> | undefined {\n const key = ApiAIAssistant.getRtdRequestKey(rtdEventType, correlationId);\n const request = this.pendingRtdRequests.get(key) as PendingRtdRequest<T> | undefined;\n\n if (!request) {\n return undefined;\n }\n\n if (request.timeoutId) {\n clearTimeout(request.timeoutId);\n }\n\n settle?.(request);\n this.pendingRtdRequests.delete(key);\n\n return request;\n }\n\n /** Sends an AI event and waits for its matching RTD response. @internal */\n public async requestAndWaitForRtd<T>(options: RtdRequestOptions): Promise<T> {\n const key = ApiAIAssistant.getRtdRequestKey(options.rtdEventType, options.correlationId);\n let resolveResult: (payload: T) => void = () => undefined;\n let rejectResult: (error: Error) => void = () => undefined;\n const result = new Promise<T>((resolve, reject) => {\n resolveResult = resolve;\n rejectResult = reject;\n });\n const previousRequest = this.pendingRtdRequests.get(key);\n if (previousRequest?.timeoutId) {\n clearTimeout(previousRequest.timeoutId);\n }\n const request: PendingRtdRequest<T> = {\n correlationId: options.correlationId,\n rtdEventType: options.rtdEventType,\n resolve: resolveResult,\n reject: rejectResult,\n };\n\n request.timeoutId = setTimeout(() => {\n this.removeRtdRequest<T>(options.rtdEventType, options.correlationId, (currentRequest) => {\n currentRequest.reject(options.createTimeoutError());\n });\n }, options.timeoutMs);\n this.pendingRtdRequests.set(key, request as PendingRtdRequest<unknown>);\n const publishTimestamp = options.publishTimestamp ?? Date.now();\n const acknowledgement = Promise.resolve()\n .then(() =>\n this.sendEvent(\n options.agentId,\n options.interactionId,\n options.eventType,\n options.eventName,\n options.eventMetaData,\n undefined,\n undefined,\n publishTimestamp,\n options.timeout\n )\n )\n .catch((error) => {\n this.removeRtdRequest(options.rtdEventType, options.correlationId);\n throw error;\n });\n\n const [payload] = await Promise.all([result, acknowledgement]);\n\n return payload;\n }\n\n /** Resolves a pending request from a parsed RTD event. @internal */\n public resolveFromRtdEvent<T>(\n rtdEventType: string,\n correlationId: string,\n payload: T\n ): 'resolved' | 'not-found' {\n const request = this.removeRtdRequest<T>(rtdEventType, correlationId, (currentRequest) => {\n currentRequest.resolve(payload);\n });\n\n return request ? 'resolved' : 'not-found';\n }\n\n /** Clears pending RTD requests when the RTD lifecycle ends. @internal */\n public clearAllRtdRequests(): void {\n Array.from(this.pendingRtdRequests.values()).forEach((request) => {\n this.removeRtdRequest(request.rtdEventType, request.correlationId, (currentRequest) => {\n currentRequest.reject(new Error('RTD request cleared'));\n });\n });\n }\n\n /**\n * Sends an event to the AI Assistant service.\n * @param agentId - agent identifier\n * @param interactionId - interaction/conversation identifier\n * @param eventType - the type of event (e.g. 'CUSTOM_EVENT')\n * @param eventName - the name of the event (e.g. 'GET_TRANSCRIPTS')\n * @param eventMetaData - event-specific fields to include in eventDetails.data\n * @param languageCode - language code within eventDetails.data\n * @param trackingId - tracking identifier within eventDetails.data\n */\n public async sendEvent(\n agentId: string,\n interactionId: string,\n eventType: AIAssistantEventType,\n eventName: AIAssistantEventName,\n eventMetaData?: Record<string, unknown>,\n languageCode?: string,\n trackingId?: string,\n publishTimestamp?: number,\n timeout?: number\n ): Promise<Record<string, unknown>> {\n LoggerProxy.info('Sending event', {\n module: CC_FILE,\n method: METHODS.SEND_EVENT,\n interactionId,\n data: {eventType, eventName, eventMetaData},\n });\n this.metricsManager.timeEvent([\n METRIC_EVENT_NAMES.AI_ASSISTANT_SEND_EVENT_SUCCESS,\n METRIC_EVENT_NAMES.AI_ASSISTANT_SEND_EVENT_FAILED,\n ]);\n\n try {\n const baseUrl = this.getBaseUrl();\n const orgId = this.webex.credentials.getOrgId();\n const data = {\n ...eventMetaData,\n interactionId,\n actionTimeStamp: String(Date.now()),\n languageCode,\n trackingId,\n };\n const response = (await this.webex.request({\n uri: `${baseUrl}${AI_ASSISTANT_API_URLS.EVENT}`,\n method: HTTP_METHODS.POST,\n addAuthHeader: true,\n ...(timeout !== undefined ? {timeout} : {}),\n body: {\n agentId,\n orgId,\n eventType,\n eventName,\n ...(publishTimestamp !== undefined ? {publishTimestamp} : {}),\n eventDetails: {\n data,\n },\n },\n })) as IHttpResponse;\n\n this.metricsManager.trackEvent(\n METRIC_EVENT_NAMES.AI_ASSISTANT_SEND_EVENT_SUCCESS,\n {agentId, orgId, interactionId, eventType, eventName},\n ['operational']\n );\n\n return response?.body || {};\n } catch (error) {\n this.metricsManager.trackEvent(\n METRIC_EVENT_NAMES.AI_ASSISTANT_SEND_EVENT_FAILED,\n {\n interactionId,\n eventType,\n eventName,\n error: error instanceof Error ? error.message : String(error),\n },\n ['operational']\n );\n\n const {error: detailedError} = getErrorDetails(error, METHODS.SEND_EVENT, CC_FILE);\n throw detailedError;\n }\n }\n\n /**\n * Requests real-time assistance for an interaction.\n *\n * @param params - Real-time assistance request parameters\n * @returns HTTP response body from the AI Assistant event API\n * @public\n */\n public async getRealTimeAssistance(params: RealTimeAssistanceParams) {\n const {agentId, interactionId, context} = params;\n const trimmedContext = context?.trim();\n const languageCode = params.languageCode ?? 'en';\n const trackingId = `WX_CC_SDK_${uuidv4()}`;\n const eventName = trimmedContext\n ? AIAssistantEventName.ADD_SUGGESTIONS_EXTRA_CONTEXT\n : AIAssistantEventName.GET_SUGGESTIONS;\n\n const loggerContext = {\n module: CC_FILE,\n method: METHODS.GET_REAL_TIME_ASSISTANCE,\n interactionId,\n trackingId,\n data: {eventName},\n };\n\n LoggerProxy.info('Requesting real-time assistance', loggerContext);\n\n this.metricsManager.timeEvent([\n METRIC_EVENT_NAMES.AI_ASSISTANT_GET_REAL_TIME_ASSISTANCE_SUCCESS,\n METRIC_EVENT_NAMES.AI_ASSISTANT_GET_REAL_TIME_ASSISTANCE_FAILED,\n ]);\n\n try {\n if (!this.aiFeature?.suggestedResponses?.enable) {\n const {error: detailedError} = getErrorDetails(\n new Error('SUGGESTED_RESPONSES_NOT_ENABLED'),\n METHODS.GET_REAL_TIME_ASSISTANCE,\n CC_FILE\n );\n throw detailedError;\n }\n\n const orgId = this.webex.credentials.getOrgId();\n\n const response = await this.sendEvent(\n agentId,\n interactionId,\n AIAssistantEventType.CUSTOM_EVENT,\n eventName,\n trimmedContext !== undefined ? {context: trimmedContext} : undefined,\n languageCode,\n trackingId\n );\n\n this.metricsManager.trackEvent(\n METRIC_EVENT_NAMES.AI_ASSISTANT_GET_REAL_TIME_ASSISTANCE_SUCCESS,\n {\n agentId,\n orgId,\n interactionId,\n eventName,\n trackingId,\n context,\n },\n ['operational']\n );\n LoggerProxy.log('Real-time assistance request succeeded', loggerContext);\n\n return response;\n } catch (error) {\n LoggerProxy.error('Real-time assistance request failed', {...loggerContext, error});\n this.metricsManager.trackEvent(\n METRIC_EVENT_NAMES.AI_ASSISTANT_GET_REAL_TIME_ASSISTANCE_FAILED,\n {\n agentId,\n interactionId,\n trackingId,\n eventName,\n error: error instanceof Error ? error.message : String(error),\n },\n ['operational']\n );\n\n const {error: detailedError} = getErrorDetails(\n error,\n METHODS.GET_REAL_TIME_ASSISTANCE,\n CC_FILE\n );\n throw detailedError;\n }\n }\n\n /**\n * Sends user action feedback for a real-time assistance adaptive card.\n *\n * @param params - Real-time assistance user action parameters\n * @returns HTTP response body from the AI Assistant event API\n * @public\n */\n public async sendRealTimeAssistanceUserAction(\n params: RealTimeAssistanceUserActionParams\n ): Promise<Record<string, unknown>> {\n const {agentId, interactionId, adaptiveCardId, actionId} = params;\n const actionType = 'Action.Submit';\n const languageCode = params.languageCode ?? 'en';\n const trackingId = `WX_CC_SDK_${uuidv4()}`;\n\n const loggerContext = {\n module: CC_FILE,\n method: METHODS.SEND_REAL_TIME_ASSISTANCE_USER_ACTION,\n interactionId,\n trackingId,\n data: {actionId, adaptiveCardId},\n };\n\n LoggerProxy.info('Sending real-time assistance user action', loggerContext);\n\n this.metricsManager.timeEvent([\n METRIC_EVENT_NAMES.AI_ASSISTANT_SEND_REAL_TIME_ASSISTANCE_USER_ACTION_SUCCESS,\n METRIC_EVENT_NAMES.AI_ASSISTANT_SEND_REAL_TIME_ASSISTANCE_USER_ACTION_FAILED,\n ]);\n\n try {\n if (!this.aiFeature?.suggestedResponses?.enable) {\n const {error: detailedError} = getErrorDetails(\n new Error('SUGGESTED_RESPONSES_NOT_ENABLED'),\n METHODS.SEND_REAL_TIME_ASSISTANCE_USER_ACTION,\n CC_FILE\n );\n throw detailedError;\n }\n\n const orgId = this.webex.credentials.getOrgId();\n const response = await this.sendEvent(\n agentId,\n interactionId,\n AIAssistantEventType.CUSTOM_EVENT,\n AIAssistantEventName.SUGGESTED_RESPONSES_USER_ACTION,\n {\n adaptiveCardId,\n userAction: {\n actionType,\n actionId,\n },\n },\n languageCode,\n trackingId\n );\n\n this.metricsManager.trackEvent(\n METRIC_EVENT_NAMES.AI_ASSISTANT_SEND_REAL_TIME_ASSISTANCE_USER_ACTION_SUCCESS,\n {\n agentId,\n orgId,\n interactionId,\n adaptiveCardId,\n actionId,\n trackingId,\n },\n ['operational']\n );\n LoggerProxy.log('Real-time assistance user action sent', loggerContext);\n\n return response;\n } catch (error) {\n LoggerProxy.error('Real-time assistance user action failed', {...loggerContext, error});\n this.metricsManager.trackEvent(\n METRIC_EVENT_NAMES.AI_ASSISTANT_SEND_REAL_TIME_ASSISTANCE_USER_ACTION_FAILED,\n {\n agentId,\n interactionId,\n adaptiveCardId,\n actionId,\n trackingId,\n error: error instanceof Error ? error.message : String(error),\n },\n ['operational']\n );\n\n const {error: detailedError} = getErrorDetails(\n error,\n METHODS.SEND_REAL_TIME_ASSISTANCE_USER_ACTION,\n CC_FILE\n );\n throw detailedError;\n }\n }\n\n /**\n * Fetches historic transcripts for an interaction.\n * This API is allowed only when real-time transcription feature is enabled.\n *\n * @param interactionId - interaction/conversation identifier\n */\n public async fetchHistoricTranscripts(\n agentId: string,\n interactionId: string\n ): Promise<HistoricTranscriptsResponse> {\n LoggerProxy.info('Fetching historic transcripts', {\n module: CC_FILE,\n method: METHODS.FETCH_HISTORIC_TRANSCRIPTS,\n interactionId,\n });\n this.metricsManager.timeEvent([\n METRIC_EVENT_NAMES.AI_ASSISTANT_FETCH_HISTORIC_TRANSCRIPTS_SUCCESS,\n METRIC_EVENT_NAMES.AI_ASSISTANT_FETCH_HISTORIC_TRANSCRIPTS_FAILED,\n ]);\n if (!this.aiFeature?.realtimeTranscripts?.enable) {\n const {error: detailedError} = getErrorDetails(\n new Error('REAL_TIME_TRANSCRIPTION_NOT_ENABLED'),\n METHODS.FETCH_HISTORIC_TRANSCRIPTS,\n CC_FILE\n );\n throw detailedError;\n }\n\n if (\n !this.isValidTranscriptIdentifier(agentId) ||\n !this.isValidTranscriptIdentifier(interactionId)\n ) {\n const {error: detailedError} = getErrorDetails(\n new Error('INVALID_AGENT_ID_OR_INTERACTION_ID'),\n METHODS.FETCH_HISTORIC_TRANSCRIPTS,\n CC_FILE\n );\n throw detailedError;\n }\n\n try {\n const baseUrl = this.getBaseUrl();\n const orgId = this.webex.credentials.getOrgId();\n const response = (await this.webex.request({\n uri: `${baseUrl}${AI_ASSISTANT_API_URLS.TRANSCRIPTS_LIST}`,\n method: HTTP_METHODS.POST,\n addAuthHeader: true,\n body: {\n agentId,\n orgId,\n interactionId,\n },\n })) as IHttpResponse;\n\n this.metricsManager.trackEvent(\n METRIC_EVENT_NAMES.AI_ASSISTANT_FETCH_HISTORIC_TRANSCRIPTS_SUCCESS,\n {agentId, orgId, interactionId},\n ['operational']\n );\n\n return response.body as HistoricTranscriptsResponse;\n } catch (error) {\n this.metricsManager.trackEvent(\n METRIC_EVENT_NAMES.AI_ASSISTANT_FETCH_HISTORIC_TRANSCRIPTS_FAILED,\n {\n interactionId,\n error: error instanceof Error ? error.message : String(error),\n },\n ['operational']\n );\n\n if (error instanceof Error) {\n throw error;\n }\n const {error: detailedError} = getErrorDetails(\n error,\n METHODS.FETCH_HISTORIC_TRANSCRIPTS,\n CC_FILE\n );\n throw detailedError;\n }\n }\n}\n\nexport default ApiAIAssistant;\n"],"mappings":"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","ignoreList":[]}
@@ -9,6 +9,7 @@ var _calling = require("@webex/calling");
9
9
  var _constants = require("../constants");
10
10
  var _loggerProxy = _interopRequireDefault(require("../logger-proxy"));
11
11
  var _constants2 = require("./constants");
12
+ var _Utils = require("./core/Utils");
12
13
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
13
14
  /**
14
15
  * WebCallingService provides WebRTC calling functionality for Contact Center agents.
@@ -121,8 +122,15 @@ class WebCallingService extends _events.default {
121
122
  await this.webex.internal.services.waitForCatalog(_constants2.POST_AUTH);
122
123
  const rtmsURL = this.webex.internal.services.get(_constants2.WCC_CALLING_RTMS_DOMAIN);
123
124
  try {
124
- const url = new URL(rtmsURL);
125
- return url.hostname;
125
+ const hostname = new URL(rtmsURL).hostname.toLowerCase();
126
+ if (!(0, _Utils.isAllowedUrlHost)(rtmsURL, [_constants2.ALLOWED_RTMS_DOMAIN])) {
127
+ _loggerProxy.default.error(`Non-allow-listed RTMS host from u2c catalogue: ${hostname} so falling back to default domain`, {
128
+ module: _constants.WEB_CALLING_SERVICE_FILE,
129
+ method: _constants2.METHODS.GET_RTMS_DOMAIN
130
+ });
131
+ return _constants2.DEFAULT_RTMS_DOMAIN;
132
+ }
133
+ return hostname;
126
134
  } catch (error) {
127
135
  _loggerProxy.default.error(`Invalid URL from u2c catalogue: ${rtmsURL} so falling back to default domain`, {
128
136
  module: _constants.WEB_CALLING_SERVICE_FILE,
@@ -1 +1 @@
1
- {"version":3,"names":["_events","_interopRequireDefault","require","_calling","_constants","_loggerProxy","_constants2","e","__esModule","default","WebCallingService","EventEmitter","constructor","webex","callTaskMap","Map","setLoginOption","loginOption","handleMediaEvent","track","emit","CALL_EVENT_KEYS","REMOTE_MEDIA","handleDisconnectEvent","call","end","cleanUpCall","registerCallListeners","on","DISCONNECT","off","callId","getCallId","taskId","getTaskIdForCall","delete","getRTMSDomain","internal","services","waitForCatalog","POST_AUTH","rtmsURL","get","WCC_CALLING_RTMS_DOMAIN","url","URL","hostname","error","LoggerProxy","module","WEB_CALLING_SERVICE_FILE","method","METHODS","GET_RTMS_DOMAIN","DEFAULT_RTMS_DOMAIN","registerWebCallingLine","rtmsDomain","callingClientConfig","logger","level","LOGGER","INFO","serviceData","indicator","ServiceIndicator","CONTACT_CENTER","domain","callingClient","createClient","line","Object","values","getLines","LINE_EVENTS","UNREGISTERED","log","REGISTER_WEB_CALLING_LINE","INCOMING_CALL","Promise","resolve","reject","timeout","setTimeout","Error","TIMEOUT_DURATION","REGISTERED","deviceInfo","clearTimeout","mobiusDeviceId","register","deregisterWebCallingLine","DEREGISTER_WEBCALLING_LINE_MSG","DEREGISTER_WEB_CALLING_LINE","deregister","answerCall","localAudioStream","info","ANSWER_CALL","answer","muteUnmuteCall","MUTE_UNMUTE_CALL","mute","isCallMuted","isMuted","declineCall","DECLINE_CALL","mapCallToTask","set","exports"],"sources":["WebCallingService.ts"],"sourcesContent":["import EventEmitter from 'events';\nimport {\n createClient,\n ICall,\n ICallingClient,\n ILine,\n LINE_EVENTS,\n ServiceIndicator,\n LocalMicrophoneStream,\n CALL_EVENT_KEYS,\n LOGGER,\n} from '@webex/calling';\nimport {LoginOption, WebexSDK} from '../types';\nimport {TIMEOUT_DURATION, WEB_CALLING_SERVICE_FILE} from '../constants';\nimport LoggerProxy from '../logger-proxy';\nimport {\n DEFAULT_RTMS_DOMAIN,\n POST_AUTH,\n WCC_CALLING_RTMS_DOMAIN,\n DEREGISTER_WEBCALLING_LINE_MSG,\n METHODS,\n} from './constants';\n\n/**\n * WebCallingService provides WebRTC calling functionality for Contact Center agents.\n * It handles registration, call management, and media operations for voice interactions.\n * @internal\n */\nexport default class WebCallingService extends EventEmitter {\n /**\n * The CallingClient instance that manages WebRTC calling capabilities\n * @private\n */\n private callingClient: ICallingClient;\n\n /**\n * The Line instance that handles registration and incoming calls\n * @private\n */\n private line: ILine;\n\n /**\n * The current active call instance\n * @private\n */\n private call: ICall | undefined;\n\n /**\n * Reference to the WebexSDK instance\n * @private\n */\n private webex: WebexSDK;\n\n /**\n * The login option selected for this session\n * @private\n */\n public loginOption: LoginOption;\n\n /**\n * Map that associates call IDs with task IDs for correlation\n * @private\n */\n private callTaskMap: Map<string, string>;\n\n /**\n * Creates an instance of WebCallingService.\n * @param {WebexSDK} webex - The Webex SDK instance\n */\n constructor(webex: WebexSDK) {\n super();\n this.webex = webex;\n this.callTaskMap = new Map();\n }\n\n /**\n * Sets the login option for the current session\n * @param {LoginOption} loginOption - The login option to use\n * @private\n */\n public setLoginOption(loginOption: LoginOption): void {\n this.loginOption = loginOption;\n }\n\n /**\n * Handles remote media track events from the call\n * @param {MediaStreamTrack} track - The media track received\n * @private\n */\n private handleMediaEvent = (track: MediaStreamTrack): void => {\n this.emit(CALL_EVENT_KEYS.REMOTE_MEDIA, track);\n };\n\n /**\n * Handles disconnect events from the call\n * @private\n */\n private handleDisconnectEvent = (): void => {\n this.call.end();\n this.cleanUpCall();\n };\n\n /**\n * Registers event listeners for the current call\n * @private\n */\n private registerCallListeners(): void {\n // TODO: Add remaining call listeners here\n this.call.on(CALL_EVENT_KEYS.REMOTE_MEDIA, this.handleMediaEvent);\n this.call.on(CALL_EVENT_KEYS.DISCONNECT, this.handleDisconnectEvent);\n }\n\n /**\n * Cleans up resources associated with the current call\n * Removes event listeners and clears the call-task mapping\n * @private\n */\n public cleanUpCall(): void {\n if (this.call) {\n this.call.off(CALL_EVENT_KEYS.REMOTE_MEDIA, this.handleMediaEvent);\n this.call.off(CALL_EVENT_KEYS.DISCONNECT, this.handleDisconnectEvent);\n const callId = this.call.getCallId();\n const taskId = this.getTaskIdForCall(callId);\n\n if (taskId) {\n this.callTaskMap.delete(callId);\n }\n this.call = null;\n }\n }\n\n /**\n * Retrieves the RTMS domain to use for WebRTC connections\n * First tries to get it from the service catalog, then falls back to default\n * @private\n * @returns {Promise<string>} The RTMS domain to use\n */\n private async getRTMSDomain(): Promise<string> {\n await this.webex.internal.services.waitForCatalog(POST_AUTH);\n\n const rtmsURL = this.webex.internal.services.get(WCC_CALLING_RTMS_DOMAIN);\n\n try {\n const url = new URL(rtmsURL);\n\n return url.hostname;\n } catch (error) {\n LoggerProxy.error(\n `Invalid URL from u2c catalogue: ${rtmsURL} so falling back to default domain`,\n {\n module: WEB_CALLING_SERVICE_FILE,\n method: METHODS.GET_RTMS_DOMAIN,\n }\n );\n\n return DEFAULT_RTMS_DOMAIN;\n }\n }\n\n /**\n * Registers the WebCalling line for receiving calls\n * Sets up event listeners for line events and initializes the calling client\n *\n * @private\n * @returns {Promise<void>} A promise that resolves when registration is complete\n * @throws {Error} When registration times out\n */\n public async registerWebCallingLine(): Promise<void> {\n const rtmsDomain = await this.getRTMSDomain(); // get the RTMS domain from the u2c catalogue\n\n const callingClientConfig = {\n logger: {\n level: LOGGER.INFO,\n },\n serviceData: {\n indicator: ServiceIndicator.CONTACT_CENTER,\n domain: rtmsDomain,\n },\n };\n\n this.callingClient = await createClient(this.webex as any, callingClientConfig);\n this.line = Object.values(this.callingClient.getLines())[0];\n\n this.line.on(LINE_EVENTS.UNREGISTERED, () => {\n LoggerProxy.log(`WxCC-SDK: Desktop unregistered successfully`, {\n module: WEB_CALLING_SERVICE_FILE,\n method: METHODS.REGISTER_WEB_CALLING_LINE,\n });\n });\n\n // Start listening for incoming calls\n this.line.on(LINE_EVENTS.INCOMING_CALL, (call: ICall) => {\n this.call = call;\n this.emit(LINE_EVENTS.INCOMING_CALL, call);\n });\n\n return new Promise<void>((resolve, reject) => {\n const timeout = setTimeout(() => {\n reject(new Error('WebCallingService Registration timed out'));\n }, TIMEOUT_DURATION);\n\n this.line.on(LINE_EVENTS.REGISTERED, (deviceInfo: ILine) => {\n clearTimeout(timeout);\n LoggerProxy.log(\n `WxCC-SDK: Desktop registered successfully, mobiusDeviceId: ${deviceInfo.mobiusDeviceId}`,\n {module: WEB_CALLING_SERVICE_FILE, method: METHODS.REGISTER_WEB_CALLING_LINE}\n );\n resolve();\n });\n this.line.register();\n });\n }\n\n /**\n * Deregisters the WebCalling line\n * Cleans up any active calls and deregisters from the calling service\n *\n * @private\n * @returns {Promise<void>} A promise that resolves when deregistration is complete\n */\n public async deregisterWebCallingLine(): Promise<void> {\n LoggerProxy.log(DEREGISTER_WEBCALLING_LINE_MSG, {\n module: WEB_CALLING_SERVICE_FILE,\n method: METHODS.DEREGISTER_WEB_CALLING_LINE,\n });\n this.cleanUpCall();\n this.line?.deregister();\n }\n\n /**\n * Answers an incoming call with the provided audio stream\n *\n * @private\n * @param {LocalMicrophoneStream} localAudioStream - The local microphone stream to use\n * @param {string} taskId - The task ID associated with this call\n * @throws {Error} If answering the call fails\n */\n public answerCall(localAudioStream: LocalMicrophoneStream, taskId: string): void {\n if (this.call) {\n try {\n LoggerProxy.info(`Call answered: ${taskId}`, {\n module: WEB_CALLING_SERVICE_FILE,\n method: METHODS.ANSWER_CALL,\n });\n this.call.answer(localAudioStream);\n this.registerCallListeners();\n } catch (error) {\n LoggerProxy.error(`Failed to answer call for ${taskId}. Error: ${error}`, {\n module: WEB_CALLING_SERVICE_FILE,\n method: METHODS.ANSWER_CALL,\n });\n // Optionally, throw the error to allow the invoker to handle it\n throw error;\n }\n } else {\n LoggerProxy.log(`Cannot answer a non WebRtc Call: ${taskId}`, {\n module: WEB_CALLING_SERVICE_FILE,\n method: METHODS.ANSWER_CALL,\n });\n }\n }\n\n /**\n * Toggles the mute state of the current call\n *\n * @private\n * @param {LocalMicrophoneStream} localAudioStream - The local microphone stream to control\n */\n public muteUnmuteCall(localAudioStream: LocalMicrophoneStream): void {\n if (this.call) {\n LoggerProxy.info('Call mute or unmute requested!', {\n module: WEB_CALLING_SERVICE_FILE,\n method: METHODS.MUTE_UNMUTE_CALL,\n });\n this.call.mute(localAudioStream);\n } else {\n LoggerProxy.log(`Cannot mute a non WebRtc Call`, {\n module: WEB_CALLING_SERVICE_FILE,\n method: METHODS.MUTE_UNMUTE_CALL,\n });\n }\n }\n\n /**\n * Checks if the current call is muted\n *\n * @private\n * @returns {boolean} True if the call is muted, false otherwise or if no call exists\n */\n public isCallMuted(): boolean {\n if (this.call) {\n return this.call.isMuted();\n }\n\n return false;\n }\n\n /**\n * Declines or ends the current call\n *\n * @private\n * @param {string} taskId - The task ID associated with this call\n * @throws {Error} If ending the call fails\n */\n public declineCall(taskId: string): void {\n if (this.call) {\n try {\n LoggerProxy.info(`Call end requested: ${taskId}`, {\n module: WEB_CALLING_SERVICE_FILE,\n method: METHODS.DECLINE_CALL,\n });\n this.call.end();\n this.cleanUpCall();\n } catch (error) {\n LoggerProxy.error(`Failed to end call: ${taskId}. Error: ${error}`, {\n module: WEB_CALLING_SERVICE_FILE,\n method: METHODS.DECLINE_CALL,\n });\n // Optionally, throw the error to allow the invoker to handle it\n throw error;\n }\n } else {\n LoggerProxy.log(`Cannot end a non WebRtc Call: ${taskId}`, {\n module: WEB_CALLING_SERVICE_FILE,\n method: METHODS.DECLINE_CALL,\n });\n }\n }\n\n /**\n * Maps a call ID to a task ID for correlation\n *\n * @private\n * @param {string} callId - The unique call identifier\n * @param {string} taskId - The associated task identifier\n */\n public mapCallToTask(callId: string, taskId: string): void {\n this.callTaskMap.set(callId, taskId);\n }\n\n /**\n * Gets the task ID associated with a call ID\n *\n * @private\n * @param {string} callId - The call ID to look up\n * @returns {string|undefined} The associated task ID or undefined if not found\n */\n public getTaskIdForCall(callId: string): string | undefined {\n return this.callTaskMap.get(callId);\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_events","_interopRequireDefault","require","_calling","_constants","_loggerProxy","_constants2","_Utils","e","__esModule","default","WebCallingService","EventEmitter","constructor","webex","callTaskMap","Map","setLoginOption","loginOption","handleMediaEvent","track","emit","CALL_EVENT_KEYS","REMOTE_MEDIA","handleDisconnectEvent","call","end","cleanUpCall","registerCallListeners","on","DISCONNECT","off","callId","getCallId","taskId","getTaskIdForCall","delete","getRTMSDomain","internal","services","waitForCatalog","POST_AUTH","rtmsURL","get","WCC_CALLING_RTMS_DOMAIN","hostname","URL","toLowerCase","isAllowedUrlHost","ALLOWED_RTMS_DOMAIN","LoggerProxy","error","module","WEB_CALLING_SERVICE_FILE","method","METHODS","GET_RTMS_DOMAIN","DEFAULT_RTMS_DOMAIN","registerWebCallingLine","rtmsDomain","callingClientConfig","logger","level","LOGGER","INFO","serviceData","indicator","ServiceIndicator","CONTACT_CENTER","domain","callingClient","createClient","line","Object","values","getLines","LINE_EVENTS","UNREGISTERED","log","REGISTER_WEB_CALLING_LINE","INCOMING_CALL","Promise","resolve","reject","timeout","setTimeout","Error","TIMEOUT_DURATION","REGISTERED","deviceInfo","clearTimeout","mobiusDeviceId","register","deregisterWebCallingLine","DEREGISTER_WEBCALLING_LINE_MSG","DEREGISTER_WEB_CALLING_LINE","deregister","answerCall","localAudioStream","info","ANSWER_CALL","answer","muteUnmuteCall","MUTE_UNMUTE_CALL","mute","isCallMuted","isMuted","declineCall","DECLINE_CALL","mapCallToTask","set","exports"],"sources":["WebCallingService.ts"],"sourcesContent":["import EventEmitter from 'events';\nimport {\n createClient,\n ICall,\n ICallingClient,\n ILine,\n LINE_EVENTS,\n ServiceIndicator,\n LocalMicrophoneStream,\n CALL_EVENT_KEYS,\n LOGGER,\n} from '@webex/calling';\nimport {LoginOption, WebexSDK} from '../types';\nimport {TIMEOUT_DURATION, WEB_CALLING_SERVICE_FILE} from '../constants';\nimport LoggerProxy from '../logger-proxy';\nimport {\n DEFAULT_RTMS_DOMAIN,\n ALLOWED_RTMS_DOMAIN,\n POST_AUTH,\n WCC_CALLING_RTMS_DOMAIN,\n DEREGISTER_WEBCALLING_LINE_MSG,\n METHODS,\n} from './constants';\nimport {isAllowedUrlHost} from './core/Utils';\n\n/**\n * WebCallingService provides WebRTC calling functionality for Contact Center agents.\n * It handles registration, call management, and media operations for voice interactions.\n * @internal\n */\nexport default class WebCallingService extends EventEmitter {\n /**\n * The CallingClient instance that manages WebRTC calling capabilities\n * @private\n */\n private callingClient: ICallingClient;\n\n /**\n * The Line instance that handles registration and incoming calls\n * @private\n */\n private line: ILine;\n\n /**\n * The current active call instance\n * @private\n */\n private call: ICall | undefined;\n\n /**\n * Reference to the WebexSDK instance\n * @private\n */\n private webex: WebexSDK;\n\n /**\n * The login option selected for this session\n * @private\n */\n public loginOption: LoginOption;\n\n /**\n * Map that associates call IDs with task IDs for correlation\n * @private\n */\n private callTaskMap: Map<string, string>;\n\n /**\n * Creates an instance of WebCallingService.\n * @param {WebexSDK} webex - The Webex SDK instance\n */\n constructor(webex: WebexSDK) {\n super();\n this.webex = webex;\n this.callTaskMap = new Map();\n }\n\n /**\n * Sets the login option for the current session\n * @param {LoginOption} loginOption - The login option to use\n * @private\n */\n public setLoginOption(loginOption: LoginOption): void {\n this.loginOption = loginOption;\n }\n\n /**\n * Handles remote media track events from the call\n * @param {MediaStreamTrack} track - The media track received\n * @private\n */\n private handleMediaEvent = (track: MediaStreamTrack): void => {\n this.emit(CALL_EVENT_KEYS.REMOTE_MEDIA, track);\n };\n\n /**\n * Handles disconnect events from the call\n * @private\n */\n private handleDisconnectEvent = (): void => {\n this.call.end();\n this.cleanUpCall();\n };\n\n /**\n * Registers event listeners for the current call\n * @private\n */\n private registerCallListeners(): void {\n // TODO: Add remaining call listeners here\n this.call.on(CALL_EVENT_KEYS.REMOTE_MEDIA, this.handleMediaEvent);\n this.call.on(CALL_EVENT_KEYS.DISCONNECT, this.handleDisconnectEvent);\n }\n\n /**\n * Cleans up resources associated with the current call\n * Removes event listeners and clears the call-task mapping\n * @private\n */\n public cleanUpCall(): void {\n if (this.call) {\n this.call.off(CALL_EVENT_KEYS.REMOTE_MEDIA, this.handleMediaEvent);\n this.call.off(CALL_EVENT_KEYS.DISCONNECT, this.handleDisconnectEvent);\n const callId = this.call.getCallId();\n const taskId = this.getTaskIdForCall(callId);\n\n if (taskId) {\n this.callTaskMap.delete(callId);\n }\n this.call = null;\n }\n }\n\n /**\n * Retrieves the RTMS domain to use for WebRTC connections\n * First tries to get it from the service catalog, then falls back to default\n * @private\n * @returns {Promise<string>} The RTMS domain to use\n */\n private async getRTMSDomain(): Promise<string> {\n await this.webex.internal.services.waitForCatalog(POST_AUTH);\n\n const rtmsURL = this.webex.internal.services.get(WCC_CALLING_RTMS_DOMAIN);\n\n try {\n const hostname = new URL(rtmsURL).hostname.toLowerCase();\n\n if (!isAllowedUrlHost(rtmsURL, [ALLOWED_RTMS_DOMAIN])) {\n LoggerProxy.error(\n `Non-allow-listed RTMS host from u2c catalogue: ${hostname} so falling back to default domain`,\n {\n module: WEB_CALLING_SERVICE_FILE,\n method: METHODS.GET_RTMS_DOMAIN,\n }\n );\n\n return DEFAULT_RTMS_DOMAIN;\n }\n\n return hostname;\n } catch (error) {\n LoggerProxy.error(\n `Invalid URL from u2c catalogue: ${rtmsURL} so falling back to default domain`,\n {\n module: WEB_CALLING_SERVICE_FILE,\n method: METHODS.GET_RTMS_DOMAIN,\n }\n );\n\n return DEFAULT_RTMS_DOMAIN;\n }\n }\n\n /**\n * Registers the WebCalling line for receiving calls\n * Sets up event listeners for line events and initializes the calling client\n *\n * @private\n * @returns {Promise<void>} A promise that resolves when registration is complete\n * @throws {Error} When registration times out\n */\n public async registerWebCallingLine(): Promise<void> {\n const rtmsDomain = await this.getRTMSDomain(); // get the RTMS domain from the u2c catalogue\n\n const callingClientConfig = {\n logger: {\n level: LOGGER.INFO,\n },\n serviceData: {\n indicator: ServiceIndicator.CONTACT_CENTER,\n domain: rtmsDomain,\n },\n };\n\n this.callingClient = await createClient(this.webex as any, callingClientConfig);\n this.line = Object.values(this.callingClient.getLines())[0];\n\n this.line.on(LINE_EVENTS.UNREGISTERED, () => {\n LoggerProxy.log(`WxCC-SDK: Desktop unregistered successfully`, {\n module: WEB_CALLING_SERVICE_FILE,\n method: METHODS.REGISTER_WEB_CALLING_LINE,\n });\n });\n\n // Start listening for incoming calls\n this.line.on(LINE_EVENTS.INCOMING_CALL, (call: ICall) => {\n this.call = call;\n this.emit(LINE_EVENTS.INCOMING_CALL, call);\n });\n\n return new Promise<void>((resolve, reject) => {\n const timeout = setTimeout(() => {\n reject(new Error('WebCallingService Registration timed out'));\n }, TIMEOUT_DURATION);\n\n this.line.on(LINE_EVENTS.REGISTERED, (deviceInfo: ILine) => {\n clearTimeout(timeout);\n LoggerProxy.log(\n `WxCC-SDK: Desktop registered successfully, mobiusDeviceId: ${deviceInfo.mobiusDeviceId}`,\n {module: WEB_CALLING_SERVICE_FILE, method: METHODS.REGISTER_WEB_CALLING_LINE}\n );\n resolve();\n });\n this.line.register();\n });\n }\n\n /**\n * Deregisters the WebCalling line\n * Cleans up any active calls and deregisters from the calling service\n *\n * @private\n * @returns {Promise<void>} A promise that resolves when deregistration is complete\n */\n public async deregisterWebCallingLine(): Promise<void> {\n LoggerProxy.log(DEREGISTER_WEBCALLING_LINE_MSG, {\n module: WEB_CALLING_SERVICE_FILE,\n method: METHODS.DEREGISTER_WEB_CALLING_LINE,\n });\n this.cleanUpCall();\n this.line?.deregister();\n }\n\n /**\n * Answers an incoming call with the provided audio stream\n *\n * @private\n * @param {LocalMicrophoneStream} localAudioStream - The local microphone stream to use\n * @param {string} taskId - The task ID associated with this call\n * @throws {Error} If answering the call fails\n */\n public answerCall(localAudioStream: LocalMicrophoneStream, taskId: string): void {\n if (this.call) {\n try {\n LoggerProxy.info(`Call answered: ${taskId}`, {\n module: WEB_CALLING_SERVICE_FILE,\n method: METHODS.ANSWER_CALL,\n });\n this.call.answer(localAudioStream);\n this.registerCallListeners();\n } catch (error) {\n LoggerProxy.error(`Failed to answer call for ${taskId}. Error: ${error}`, {\n module: WEB_CALLING_SERVICE_FILE,\n method: METHODS.ANSWER_CALL,\n });\n // Optionally, throw the error to allow the invoker to handle it\n throw error;\n }\n } else {\n LoggerProxy.log(`Cannot answer a non WebRtc Call: ${taskId}`, {\n module: WEB_CALLING_SERVICE_FILE,\n method: METHODS.ANSWER_CALL,\n });\n }\n }\n\n /**\n * Toggles the mute state of the current call\n *\n * @private\n * @param {LocalMicrophoneStream} localAudioStream - The local microphone stream to control\n */\n public muteUnmuteCall(localAudioStream: LocalMicrophoneStream): void {\n if (this.call) {\n LoggerProxy.info('Call mute or unmute requested!', {\n module: WEB_CALLING_SERVICE_FILE,\n method: METHODS.MUTE_UNMUTE_CALL,\n });\n this.call.mute(localAudioStream);\n } else {\n LoggerProxy.log(`Cannot mute a non WebRtc Call`, {\n module: WEB_CALLING_SERVICE_FILE,\n method: METHODS.MUTE_UNMUTE_CALL,\n });\n }\n }\n\n /**\n * Checks if the current call is muted\n *\n * @private\n * @returns {boolean} True if the call is muted, false otherwise or if no call exists\n */\n public isCallMuted(): boolean {\n if (this.call) {\n return this.call.isMuted();\n }\n\n return false;\n }\n\n /**\n * Declines or ends the current call\n *\n * @private\n * @param {string} taskId - The task ID associated with this call\n * @throws {Error} If ending the call fails\n */\n public declineCall(taskId: string): void {\n if (this.call) {\n try {\n LoggerProxy.info(`Call end requested: ${taskId}`, {\n module: WEB_CALLING_SERVICE_FILE,\n method: METHODS.DECLINE_CALL,\n });\n this.call.end();\n this.cleanUpCall();\n } catch (error) {\n LoggerProxy.error(`Failed to end call: ${taskId}. Error: ${error}`, {\n module: WEB_CALLING_SERVICE_FILE,\n method: METHODS.DECLINE_CALL,\n });\n // Optionally, throw the error to allow the invoker to handle it\n throw error;\n }\n } else {\n LoggerProxy.log(`Cannot end a non WebRtc Call: ${taskId}`, {\n module: WEB_CALLING_SERVICE_FILE,\n method: METHODS.DECLINE_CALL,\n });\n }\n }\n\n /**\n * Maps a call ID to a task ID for correlation\n *\n * @private\n * @param {string} callId - The unique call identifier\n * @param {string} taskId - The associated task identifier\n */\n public mapCallToTask(callId: string, taskId: string): void {\n this.callTaskMap.set(callId, taskId);\n }\n\n /**\n * Gets the task ID associated with a call ID\n *\n * @private\n * @param {string} callId - The call ID to look up\n * @returns {string|undefined} The associated task ID or undefined if not found\n */\n public getTaskIdForCall(callId: string): string | undefined {\n return this.callTaskMap.get(callId);\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.WEB_RTC_PREFIX = exports.WEBSOCKET_EVENT_TIMEOUT = exports.WCC_CALLING_RTMS_DOMAIN = exports.WCC_API_GATEWAY = exports.SUBSCRIBE_API = exports.STATE_CHANGE_API = exports.RTD_SUBSCRIBE_API = exports.POST_AUTH = exports.METHODS = exports.LOGIN_API = exports.DEREGISTER_WEBCALLING_LINE_MSG = exports.DEFAULT_RTMS_DOMAIN = exports.AI_ASSISTANT_ENV_MAP = exports.AI_ASSISTANT_BASE_URL_TEMPLATE = exports.AI_ASSISTANT_API_URLS = exports.AGENT = void 0;
6
+ exports.WEB_RTC_PREFIX = exports.WEBSOCKET_EVENT_TIMEOUT = exports.WCC_CALLING_RTMS_DOMAIN = exports.WCC_API_GATEWAY = exports.SUBSCRIBE_API = exports.STATE_CHANGE_API = exports.RTD_SUBSCRIBE_API = exports.POST_AUTH = exports.METHODS = exports.LOGIN_API = exports.DEREGISTER_WEBCALLING_LINE_MSG = exports.DEFAULT_RTMS_DOMAIN = exports.ALLOWED_RTMS_DOMAIN = exports.AI_ASSISTANT_ENV_MAP = exports.AI_ASSISTANT_BASE_URL_TEMPLATE = exports.AI_ASSISTANT_API_URLS = exports.AGENT = void 0;
7
7
  /**
8
8
  * Post-authentication event name.
9
9
  * @type {string}
@@ -38,6 +38,16 @@ const WCC_CALLING_RTMS_DOMAIN = exports.WCC_CALLING_RTMS_DOMAIN = 'wcc-calling-r
38
38
  */
39
39
  const DEFAULT_RTMS_DOMAIN = exports.DEFAULT_RTMS_DOMAIN = 'rtw.prod-us1.rtmsprod.net';
40
40
 
41
+ /**
42
+ * Trusted domain suffix for RTMS hosts returned by the u2c service catalog. A catalog-provided
43
+ * RTMS host is only used when its hostname is, or is a subdomain of, this domain; otherwise
44
+ * `DEFAULT_RTMS_DOMAIN` is used.
45
+ * @type {string}
46
+ * @public
47
+ * @ignore
48
+ */
49
+ const ALLOWED_RTMS_DOMAIN = exports.ALLOWED_RTMS_DOMAIN = 'rtmsprod.net';
50
+
41
51
  /**
42
52
  * Timeout in milliseconds for WebSocket events.
43
53
  * @type {number}
@@ -1 +1 @@
1
- {"version":3,"names":["POST_AUTH","exports","WCC_API_GATEWAY","WCC_CALLING_RTMS_DOMAIN","DEFAULT_RTMS_DOMAIN","WEBSOCKET_EVENT_TIMEOUT","AGENT","SUBSCRIBE_API","RTD_SUBSCRIBE_API","LOGIN_API","WEB_RTC_PREFIX","STATE_CHANGE_API","DEREGISTER_WEBCALLING_LINE_MSG","METHODS","SET_LOGIN_OPTION","HANDLE_MEDIA_EVENT","HANDLE_DISCONNECT_EVENT","REGISTER_CALL_LISTENERS","CLEAN_UP_CALL","GET_RTMS_DOMAIN","REGISTER_WEB_CALLING_LINE","DEREGISTER_WEB_CALLING_LINE","ANSWER_CALL","MUTE_UNMUTE_CALL","IS_CALL_MUTED","DECLINE_CALL","MAP_CALL_TO_TASK","GET_TASK_ID_FOR_CALL","AI_ASSISTANT_API_URLS","EVENT","TRANSCRIPTS_LIST","AI_ASSISTANT_BASE_URL_TEMPLATE","AI_ASSISTANT_ENV_MAP"],"sources":["constants.ts"],"sourcesContent":["/**\n * Post-authentication event name.\n * @type {string}\n * @public\n * @example\n * if (event === POST_AUTH) { ... }\n * @ignore\n */\nexport const POST_AUTH = 'postauth';\n\n/**\n * API gateway identifier for Webex Contact Center.\n * @type {string}\n * @public\n * @ignore\n */\nexport const WCC_API_GATEWAY = 'wcc-api-gateway';\n\n/**\n * Domain identifier for WCC Calling RTMS.\n * @type {string}\n * @public\n * @ignore\n */\nexport const WCC_CALLING_RTMS_DOMAIN = 'wcc-calling-rtms-domain';\n\n/**\n * Default RTMS domain for production use.\n * @type {string}\n * @public\n * @ignore\n */\nexport const DEFAULT_RTMS_DOMAIN = 'rtw.prod-us1.rtmsprod.net';\n\n/**\n * Timeout in milliseconds for WebSocket events.\n * @type {number}\n * @public\n * @example\n * setTimeout(() => { ... }, WEBSOCKET_EVENT_TIMEOUT);\n * @ignore\n */\nexport const WEBSOCKET_EVENT_TIMEOUT = 20000;\n\n/**\n * Agent role identifier.\n * @type {string}\n * @public\n * @ignore\n */\nexport const AGENT = 'agent';\n\n// CC GATEWAY API URL PATHS\n/**\n * API path for notification subscription.\n * @type {string}\n * @public\n * @ignore\n */\nexport const SUBSCRIBE_API = 'v1/notification/subscribe';\n\n/**\n * API path for realtime transcription subscription.\n * @type {string}\n * @public\n * @ignore\n */\nexport const RTD_SUBSCRIBE_API = 'v1/realtime/subscribe';\n\n/**\n * API path for agent login.\n * @type {string}\n * @public\n * @ignore\n */\nexport const LOGIN_API = 'v1/agents/login';\n\n/**\n * Prefix for WebRTC-related API endpoints.\n * @type {string}\n * @public\n * @ignore\n */\nexport const WEB_RTC_PREFIX = 'webrtc-';\n\n/**\n * API path for agent session state changes.\n * @type {string}\n * @public\n * @ignore\n */\nexport const STATE_CHANGE_API = 'v1/agents/session/state';\n\n/**\n * Message for deregistering WebCalling line and cleaning up resources.\n * @type {string}\n * @public\n * @ignore\n */\nexport const DEREGISTER_WEBCALLING_LINE_MSG =\n 'Deregistering WebCalling line and cleaning up resources';\n\n// WebCallingService method names\nexport const METHODS = {\n SET_LOGIN_OPTION: 'setLoginOption',\n HANDLE_MEDIA_EVENT: 'handleMediaEvent',\n HANDLE_DISCONNECT_EVENT: 'handleDisconnectEvent',\n REGISTER_CALL_LISTENERS: 'registerCallListeners',\n CLEAN_UP_CALL: 'cleanUpCall',\n GET_RTMS_DOMAIN: 'getRTMSDomain',\n REGISTER_WEB_CALLING_LINE: 'registerWebCallingLine',\n DEREGISTER_WEB_CALLING_LINE: 'deregisterWebCallingLine',\n ANSWER_CALL: 'answerCall',\n MUTE_UNMUTE_CALL: 'muteUnmuteCall',\n IS_CALL_MUTED: 'isCallMuted',\n DECLINE_CALL: 'declineCall',\n MAP_CALL_TO_TASK: 'mapCallToTask',\n GET_TASK_ID_FOR_CALL: 'getTaskIdForCall',\n};\n\nexport const AI_ASSISTANT_API_URLS = {\n EVENT: '/event',\n TRANSCRIPTS_LIST: '/transcripts/list',\n};\n\nexport const AI_ASSISTANT_BASE_URL_TEMPLATE = 'https://api-ai-assistant.%s.ciscoccservice.com';\n\nexport const AI_ASSISTANT_ENV_MAP: Record<string, string> = {\n 'api.intgus1.ciscoccservice.com': 'intgus1',\n 'api.qaus1.ciscoccservice.com': 'qaus1',\n 'api.wxcc-us1.cisco.com': 'produs1',\n 'api.wxcc-eu1.cisco.com': 'prodeu1',\n 'api.wxcc-eu2.cisco.com': 'prodeu2',\n 'api.wxcc-anz1.cisco.com': 'prodanz1',\n 'api.wxcc-ca1.cisco.com': 'prodca1',\n 'api.wxcc-jp1.cisco.com': 'prodjp1',\n 'api.wxcc-sg1.cisco.com': 'prodsg1',\n 'api.wxcc-in1.cisco.com': 'prodin1',\n 'api.loadus1.cisco.com': 'loadus1',\n};\n"],"mappings":";;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAMA,SAAS,GAAAC,OAAA,CAAAD,SAAA,GAAG,UAAU;;AAEnC;AACA;AACA;AACA;AACA;AACA;AACO,MAAME,eAAe,GAAAD,OAAA,CAAAC,eAAA,GAAG,iBAAiB;;AAEhD;AACA;AACA;AACA;AACA;AACA;AACO,MAAMC,uBAAuB,GAAAF,OAAA,CAAAE,uBAAA,GAAG,yBAAyB;;AAEhE;AACA;AACA;AACA;AACA;AACA;AACO,MAAMC,mBAAmB,GAAAH,OAAA,CAAAG,mBAAA,GAAG,2BAA2B;;AAE9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAMC,uBAAuB,GAAAJ,OAAA,CAAAI,uBAAA,GAAG,KAAK;;AAE5C;AACA;AACA;AACA;AACA;AACA;AACO,MAAMC,KAAK,GAAAL,OAAA,CAAAK,KAAA,GAAG,OAAO;;AAE5B;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAMC,aAAa,GAAAN,OAAA,CAAAM,aAAA,GAAG,2BAA2B;;AAExD;AACA;AACA;AACA;AACA;AACA;AACO,MAAMC,iBAAiB,GAAAP,OAAA,CAAAO,iBAAA,GAAG,uBAAuB;;AAExD;AACA;AACA;AACA;AACA;AACA;AACO,MAAMC,SAAS,GAAAR,OAAA,CAAAQ,SAAA,GAAG,iBAAiB;;AAE1C;AACA;AACA;AACA;AACA;AACA;AACO,MAAMC,cAAc,GAAAT,OAAA,CAAAS,cAAA,GAAG,SAAS;;AAEvC;AACA;AACA;AACA;AACA;AACA;AACO,MAAMC,gBAAgB,GAAAV,OAAA,CAAAU,gBAAA,GAAG,yBAAyB;;AAEzD;AACA;AACA;AACA;AACA;AACA;AACO,MAAMC,8BAA8B,GAAAX,OAAA,CAAAW,8BAAA,GACzC,yDAAyD;;AAE3D;AACO,MAAMC,OAAO,GAAAZ,OAAA,CAAAY,OAAA,GAAG;EACrBC,gBAAgB,EAAE,gBAAgB;EAClCC,kBAAkB,EAAE,kBAAkB;EACtCC,uBAAuB,EAAE,uBAAuB;EAChDC,uBAAuB,EAAE,uBAAuB;EAChDC,aAAa,EAAE,aAAa;EAC5BC,eAAe,EAAE,eAAe;EAChCC,yBAAyB,EAAE,wBAAwB;EACnDC,2BAA2B,EAAE,0BAA0B;EACvDC,WAAW,EAAE,YAAY;EACzBC,gBAAgB,EAAE,gBAAgB;EAClCC,aAAa,EAAE,aAAa;EAC5BC,YAAY,EAAE,aAAa;EAC3BC,gBAAgB,EAAE,eAAe;EACjCC,oBAAoB,EAAE;AACxB,CAAC;AAEM,MAAMC,qBAAqB,GAAA3B,OAAA,CAAA2B,qBAAA,GAAG;EACnCC,KAAK,EAAE,QAAQ;EACfC,gBAAgB,EAAE;AACpB,CAAC;AAEM,MAAMC,8BAA8B,GAAA9B,OAAA,CAAA8B,8BAAA,GAAG,gDAAgD;AAEvF,MAAMC,oBAA4C,GAAA/B,OAAA,CAAA+B,oBAAA,GAAG;EAC1D,gCAAgC,EAAE,SAAS;EAC3C,8BAA8B,EAAE,OAAO;EACvC,wBAAwB,EAAE,SAAS;EACnC,wBAAwB,EAAE,SAAS;EACnC,wBAAwB,EAAE,SAAS;EACnC,yBAAyB,EAAE,UAAU;EACrC,wBAAwB,EAAE,SAAS;EACnC,wBAAwB,EAAE,SAAS;EACnC,wBAAwB,EAAE,SAAS;EACnC,wBAAwB,EAAE,SAAS;EACnC,uBAAuB,EAAE;AAC3B,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["POST_AUTH","exports","WCC_API_GATEWAY","WCC_CALLING_RTMS_DOMAIN","DEFAULT_RTMS_DOMAIN","ALLOWED_RTMS_DOMAIN","WEBSOCKET_EVENT_TIMEOUT","AGENT","SUBSCRIBE_API","RTD_SUBSCRIBE_API","LOGIN_API","WEB_RTC_PREFIX","STATE_CHANGE_API","DEREGISTER_WEBCALLING_LINE_MSG","METHODS","SET_LOGIN_OPTION","HANDLE_MEDIA_EVENT","HANDLE_DISCONNECT_EVENT","REGISTER_CALL_LISTENERS","CLEAN_UP_CALL","GET_RTMS_DOMAIN","REGISTER_WEB_CALLING_LINE","DEREGISTER_WEB_CALLING_LINE","ANSWER_CALL","MUTE_UNMUTE_CALL","IS_CALL_MUTED","DECLINE_CALL","MAP_CALL_TO_TASK","GET_TASK_ID_FOR_CALL","AI_ASSISTANT_API_URLS","EVENT","TRANSCRIPTS_LIST","AI_ASSISTANT_BASE_URL_TEMPLATE","AI_ASSISTANT_ENV_MAP"],"sources":["constants.ts"],"sourcesContent":["/**\n * Post-authentication event name.\n * @type {string}\n * @public\n * @example\n * if (event === POST_AUTH) { ... }\n * @ignore\n */\nexport const POST_AUTH = 'postauth';\n\n/**\n * API gateway identifier for Webex Contact Center.\n * @type {string}\n * @public\n * @ignore\n */\nexport const WCC_API_GATEWAY = 'wcc-api-gateway';\n\n/**\n * Domain identifier for WCC Calling RTMS.\n * @type {string}\n * @public\n * @ignore\n */\nexport const WCC_CALLING_RTMS_DOMAIN = 'wcc-calling-rtms-domain';\n\n/**\n * Default RTMS domain for production use.\n * @type {string}\n * @public\n * @ignore\n */\nexport const DEFAULT_RTMS_DOMAIN = 'rtw.prod-us1.rtmsprod.net';\n\n/**\n * Trusted domain suffix for RTMS hosts returned by the u2c service catalog. A catalog-provided\n * RTMS host is only used when its hostname is, or is a subdomain of, this domain; otherwise\n * `DEFAULT_RTMS_DOMAIN` is used.\n * @type {string}\n * @public\n * @ignore\n */\nexport const ALLOWED_RTMS_DOMAIN = 'rtmsprod.net';\n\n/**\n * Timeout in milliseconds for WebSocket events.\n * @type {number}\n * @public\n * @example\n * setTimeout(() => { ... }, WEBSOCKET_EVENT_TIMEOUT);\n * @ignore\n */\nexport const WEBSOCKET_EVENT_TIMEOUT = 20000;\n\n/**\n * Agent role identifier.\n * @type {string}\n * @public\n * @ignore\n */\nexport const AGENT = 'agent';\n\n// CC GATEWAY API URL PATHS\n/**\n * API path for notification subscription.\n * @type {string}\n * @public\n * @ignore\n */\nexport const SUBSCRIBE_API = 'v1/notification/subscribe';\n\n/**\n * API path for realtime transcription subscription.\n * @type {string}\n * @public\n * @ignore\n */\nexport const RTD_SUBSCRIBE_API = 'v1/realtime/subscribe';\n\n/**\n * API path for agent login.\n * @type {string}\n * @public\n * @ignore\n */\nexport const LOGIN_API = 'v1/agents/login';\n\n/**\n * Prefix for WebRTC-related API endpoints.\n * @type {string}\n * @public\n * @ignore\n */\nexport const WEB_RTC_PREFIX = 'webrtc-';\n\n/**\n * API path for agent session state changes.\n * @type {string}\n * @public\n * @ignore\n */\nexport const STATE_CHANGE_API = 'v1/agents/session/state';\n\n/**\n * Message for deregistering WebCalling line and cleaning up resources.\n * @type {string}\n * @public\n * @ignore\n */\nexport const DEREGISTER_WEBCALLING_LINE_MSG =\n 'Deregistering WebCalling line and cleaning up resources';\n\n// WebCallingService method names\nexport const METHODS = {\n SET_LOGIN_OPTION: 'setLoginOption',\n HANDLE_MEDIA_EVENT: 'handleMediaEvent',\n HANDLE_DISCONNECT_EVENT: 'handleDisconnectEvent',\n REGISTER_CALL_LISTENERS: 'registerCallListeners',\n CLEAN_UP_CALL: 'cleanUpCall',\n GET_RTMS_DOMAIN: 'getRTMSDomain',\n REGISTER_WEB_CALLING_LINE: 'registerWebCallingLine',\n DEREGISTER_WEB_CALLING_LINE: 'deregisterWebCallingLine',\n ANSWER_CALL: 'answerCall',\n MUTE_UNMUTE_CALL: 'muteUnmuteCall',\n IS_CALL_MUTED: 'isCallMuted',\n DECLINE_CALL: 'declineCall',\n MAP_CALL_TO_TASK: 'mapCallToTask',\n GET_TASK_ID_FOR_CALL: 'getTaskIdForCall',\n};\n\nexport const AI_ASSISTANT_API_URLS = {\n EVENT: '/event',\n TRANSCRIPTS_LIST: '/transcripts/list',\n};\n\nexport const AI_ASSISTANT_BASE_URL_TEMPLATE = 'https://api-ai-assistant.%s.ciscoccservice.com';\n\nexport const AI_ASSISTANT_ENV_MAP: Record<string, string> = {\n 'api.intgus1.ciscoccservice.com': 'intgus1',\n 'api.qaus1.ciscoccservice.com': 'qaus1',\n 'api.wxcc-us1.cisco.com': 'produs1',\n 'api.wxcc-eu1.cisco.com': 'prodeu1',\n 'api.wxcc-eu2.cisco.com': 'prodeu2',\n 'api.wxcc-anz1.cisco.com': 'prodanz1',\n 'api.wxcc-ca1.cisco.com': 'prodca1',\n 'api.wxcc-jp1.cisco.com': 'prodjp1',\n 'api.wxcc-sg1.cisco.com': 'prodsg1',\n 'api.wxcc-in1.cisco.com': 'prodin1',\n 'api.loadus1.cisco.com': 'loadus1',\n};\n"],"mappings":";;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAMA,SAAS,GAAAC,OAAA,CAAAD,SAAA,GAAG,UAAU;;AAEnC;AACA;AACA;AACA;AACA;AACA;AACO,MAAME,eAAe,GAAAD,OAAA,CAAAC,eAAA,GAAG,iBAAiB;;AAEhD;AACA;AACA;AACA;AACA;AACA;AACO,MAAMC,uBAAuB,GAAAF,OAAA,CAAAE,uBAAA,GAAG,yBAAyB;;AAEhE;AACA;AACA;AACA;AACA;AACA;AACO,MAAMC,mBAAmB,GAAAH,OAAA,CAAAG,mBAAA,GAAG,2BAA2B;;AAE9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAMC,mBAAmB,GAAAJ,OAAA,CAAAI,mBAAA,GAAG,cAAc;;AAEjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAMC,uBAAuB,GAAAL,OAAA,CAAAK,uBAAA,GAAG,KAAK;;AAE5C;AACA;AACA;AACA;AACA;AACA;AACO,MAAMC,KAAK,GAAAN,OAAA,CAAAM,KAAA,GAAG,OAAO;;AAE5B;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAMC,aAAa,GAAAP,OAAA,CAAAO,aAAA,GAAG,2BAA2B;;AAExD;AACA;AACA;AACA;AACA;AACA;AACO,MAAMC,iBAAiB,GAAAR,OAAA,CAAAQ,iBAAA,GAAG,uBAAuB;;AAExD;AACA;AACA;AACA;AACA;AACA;AACO,MAAMC,SAAS,GAAAT,OAAA,CAAAS,SAAA,GAAG,iBAAiB;;AAE1C;AACA;AACA;AACA;AACA;AACA;AACO,MAAMC,cAAc,GAAAV,OAAA,CAAAU,cAAA,GAAG,SAAS;;AAEvC;AACA;AACA;AACA;AACA;AACA;AACO,MAAMC,gBAAgB,GAAAX,OAAA,CAAAW,gBAAA,GAAG,yBAAyB;;AAEzD;AACA;AACA;AACA;AACA;AACA;AACO,MAAMC,8BAA8B,GAAAZ,OAAA,CAAAY,8BAAA,GACzC,yDAAyD;;AAE3D;AACO,MAAMC,OAAO,GAAAb,OAAA,CAAAa,OAAA,GAAG;EACrBC,gBAAgB,EAAE,gBAAgB;EAClCC,kBAAkB,EAAE,kBAAkB;EACtCC,uBAAuB,EAAE,uBAAuB;EAChDC,uBAAuB,EAAE,uBAAuB;EAChDC,aAAa,EAAE,aAAa;EAC5BC,eAAe,EAAE,eAAe;EAChCC,yBAAyB,EAAE,wBAAwB;EACnDC,2BAA2B,EAAE,0BAA0B;EACvDC,WAAW,EAAE,YAAY;EACzBC,gBAAgB,EAAE,gBAAgB;EAClCC,aAAa,EAAE,aAAa;EAC5BC,YAAY,EAAE,aAAa;EAC3BC,gBAAgB,EAAE,eAAe;EACjCC,oBAAoB,EAAE;AACxB,CAAC;AAEM,MAAMC,qBAAqB,GAAA5B,OAAA,CAAA4B,qBAAA,GAAG;EACnCC,KAAK,EAAE,QAAQ;EACfC,gBAAgB,EAAE;AACpB,CAAC;AAEM,MAAMC,8BAA8B,GAAA/B,OAAA,CAAA+B,8BAAA,GAAG,gDAAgD;AAEvF,MAAMC,oBAA4C,GAAAhC,OAAA,CAAAgC,oBAAA,GAAG;EAC1D,gCAAgC,EAAE,SAAS;EAC3C,8BAA8B,EAAE,OAAO;EACvC,wBAAwB,EAAE,SAAS;EACnC,wBAAwB,EAAE,SAAS;EACnC,wBAAwB,EAAE,SAAS;EACnC,yBAAyB,EAAE,UAAU;EACrC,wBAAwB,EAAE,SAAS;EACnC,wBAAwB,EAAE,SAAS;EACnC,wBAAwB,EAAE,SAAS;EACnC,wBAAwB,EAAE,SAAS;EACnC,uBAAuB,EAAE;AAC3B,CAAC","ignoreList":[]}
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.stripDialPlanChars = exports.isValidDialNumber = exports.isRecord = exports.getStationLoginErrorData = exports.getErrorDetails = exports.getDestAgentIdForCBT = exports.getConsultedAgentId = exports.generateTaskErrorObject = exports.deriveConsultTransferDestinationType = exports.createErrDetailsObject = exports.calculateDestType = exports.calculateDestAgentId = exports.buildConsultConferenceParamData = void 0;
6
+ exports.stripDialPlanChars = exports.isValidDialNumber = exports.isRecord = exports.isAllowedUrlHost = exports.getStationLoginErrorData = exports.getErrorDetails = exports.getDestAgentIdForCBT = exports.getConsultedAgentId = exports.generateTaskErrorObject = exports.deriveConsultTransferDestinationType = exports.createErrDetailsObject = exports.calculateDestType = exports.calculateDestAgentId = exports.buildConsultConferenceParamData = void 0;
7
7
  var Err = _interopRequireWildcard(require("./Err"));
8
8
  var _types = require("../../types");
9
9
  var _loggerProxy = _interopRequireDefault(require("../../logger-proxy"));
@@ -85,7 +85,27 @@ const isValidDialNumber = (input, dialPlanEntries) => {
85
85
  }
86
86
  });
87
87
  };
88
+
89
+ /**
90
+ * Checks whether a URL's hostname is, or is a subdomain of, one of the allowed domains.
91
+ *
92
+ * @param url - The candidate URL to validate
93
+ * @param allowedDomains - Domains (or domain suffixes) the URL's hostname must match
94
+ * @returns true when the URL parses and its hostname matches an allowed domain, false otherwise
95
+ */
88
96
  exports.isValidDialNumber = isValidDialNumber;
97
+ const isAllowedUrlHost = (url, allowedDomains) => {
98
+ if (!url) {
99
+ return false;
100
+ }
101
+ try {
102
+ const hostname = new URL(url).hostname.toLowerCase();
103
+ return allowedDomains.some(domain => hostname === domain || hostname.endsWith(`.${domain}`));
104
+ } catch (error) {
105
+ return false;
106
+ }
107
+ };
108
+ exports.isAllowedUrlHost = isAllowedUrlHost;
89
109
  const getStationLoginErrorData = (failure, loginOption) => {
90
110
  let duplicateLocationMessage = 'This value is already in use';
91
111
  if (loginOption === _types.LoginOption.EXTENSION) {