From e3f6d7a513204c68daf80557453fa5953a80af51 Mon Sep 17 00:00:00 2001 From: vivek bhadola Date: Mon, 20 Jan 2025 15:26:30 +0530 Subject: [PATCH 1/7] NTP-27557 | Ameyo Extension Deprecation --- packages/adapter-ameyo/lib/api.ts | 34 ++++---- packages/adapter-ameyo/lib/main.ts | 87 ++++++++----------- packages/common/lib/types/GenericFunction.ts | 7 ++ packages/common/lib/types/Request.ts | 21 +++++ packages/common/lib/types/RequestType.ts | 8 -- packages/common/lib/utils/getResponse.ts | 85 ++++++++++++++++++ .../lib/utils/getResponseWithoutCors.ts | 38 -------- 7 files changed, 165 insertions(+), 115 deletions(-) create mode 100644 packages/common/lib/types/GenericFunction.ts create mode 100644 packages/common/lib/types/Request.ts delete mode 100644 packages/common/lib/types/RequestType.ts create mode 100644 packages/common/lib/utils/getResponse.ts delete mode 100644 packages/common/lib/utils/getResponseWithoutCors.ts diff --git a/packages/adapter-ameyo/lib/api.ts b/packages/adapter-ameyo/lib/api.ts index 16f3933..6d2f73c 100644 --- a/packages/adapter-ameyo/lib/api.ts +++ b/packages/adapter-ameyo/lib/api.ts @@ -1,6 +1,6 @@ -import getResponseWithoutCors from "@universal-call-sdk/common/lib/utils/getResponseWithoutCors.ts"; +import getResponse from "@universal-call-sdk/common/lib/utils/getResponse.ts"; import {CallTransferData, RequestKeys} from "./types"; -import RequestType from "@universal-call-sdk/common/lib/types/RequestType.ts"; +import { RequestType } from "@universal-call-sdk/common/lib/types/Request.ts"; import {v4 as uuid} from 'uuid'; @@ -9,7 +9,7 @@ export const loginInAmeyo = (userId: string, password: string) => { if(!userId || !password) { return } - return getResponseWithoutCors({ + return getResponse({ url: `${window.BASE_AMEYO_URL}/ameyorestapi/userLogin/login`, method: 'POST', requestKey: RequestKeys.AMEYO_LOGIN, @@ -30,7 +30,7 @@ export const loginInAmeyo = (userId: string, password: string) => { }; export const maintainHeartbeat = (sessionId: string, webcoreTimestamp: string, counter: number) => { const HEART_BEAT_REQUEST_TEXT = `7|0|8|${window.BASE_AMEYO_URL}/app/application_ui/|93B024BCBAF3AE5EFEC49890FE64CF5F|com.drishti.ameyo.common.ui.rpc.CommonGwtRpcService|keepAliveWithPingPush|java.lang.String/2004016611|java.lang.Integer/3438268394|${sessionId}|${webcoreTimestamp}|1|2|3|4|3|5|5|6|7|8|6|${counter}|${sessionId}|`; - setInterval(() => getResponseWithoutCors({ + setInterval(() => getResponse({ url: `${window.BASE_AMEYO_URL}/ameyo40/service`, method: 'POST', requestKey: RequestKeys.AMEYO_HEARTBEAT, @@ -44,7 +44,7 @@ export const maintainHeartbeat = (sessionId: string, webcoreTimestamp: string, c }; export const setAgentOnBreak = (sessionId: string) => { - return getResponseWithoutCors({ + return getResponse({ url: `${window.BASE_AMEYO_URL}/ameyorestapi/cc/userBreak`, method: 'POST', requestKey: RequestKeys.AMEYO_ON_BREAK, @@ -62,7 +62,7 @@ export const setAgentOnBreak = (sessionId: string) => { export const attachOmniqueService = (sessionId: string, userId: string, campaignId: string) => { const OMNIQUEUE_TEXT = `7|0|9|${window.BASE_AMEYO_URL}/app/application_ui/|5B1786BFF89E87DC6EAAACDE629A89E2|com.drishti.ameyo.omniqueue.shared.CommonGwtRpcService|selectCamapign|java.lang.String/2004016611|[Ljava.lang.Integer;/1574882222|${sessionId}|${userId}|java.lang.Integer/3438268394|1|2|3|4|3|5|5|6|7|8|6|1|9|${campaignId}|${sessionId}|`; - return getResponseWithoutCors({ + return getResponse({ url: `${window.BASE_AMEYO_URL}/ameyoomniqueue/service`, method: 'POST', requestKey: RequestKeys.OMNIQUEUE_SERVICE, @@ -76,7 +76,7 @@ export const attachOmniqueService = (sessionId: string, userId: string, campaign }; export const setAgentActive = (sessionId: string) => { - return getResponseWithoutCors({ + return getResponse({ url: `${window.BASE_AMEYO_URL}/ameyorestapi/cc/userReady`, method: 'POST', requestKey: RequestKeys.AMEYO_AVAILABLE, @@ -92,7 +92,7 @@ export const setAgentActive = (sessionId: string) => { }; export const getSipAccountInfo = (sessionId: string, userId: string) => { - return getResponseWithoutCors({ + return getResponse({ url: `${window.BASE_AMEYO_URL}/ameyorestapi/voice/sipAccountInfos/getSipAccountInfo?info=false`, method: 'GET', requestKey: RequestKeys.SIP_ACCOUNT_INFO, @@ -106,7 +106,7 @@ export const getSipAccountInfo = (sessionId: string, userId: string) => { }; export const autoSelectExtension = (sessionId: string, userId: string) => { - return getResponseWithoutCors({ + return getResponse({ url: `${window.BASE_AMEYO_URL}/ameyorestapi/voice/autoSelectExtension`, method: 'POST', requestKey: RequestKeys.AUTO_SELECT_EXTENSION, @@ -123,7 +123,7 @@ export const autoSelectExtension = (sessionId: string, userId: string) => { export const selectCampaign = (sessionId: string, userId: string, campaignId: string) => { const SELECT_CAMPAIGN_TEXT = `7|0|9|${window.BASE_AMEYO_URL}/app/application_ui/|5B1786BFF89E87DC6EAAACDE629A89E2|com.drishti.ameyo.omniqueue.shared.CommonGwtRpcService|selectCamapign|java.lang.String/2004016611|[Ljava.lang.Integer;/1574882222|${sessionId}|${userId}|java.lang.Integer/3438268394|1|2|3|4|3|5|5|6|7|8|6|1|9|${campaignId}|${sessionId}|`; - return getResponseWithoutCors({ + return getResponse({ url: `${window.BASE_AMEYO_URL}/ameyoomniqueue/service`, method: 'POST', requestKey: RequestKeys.SELECT_CAMPAIGN, @@ -137,7 +137,7 @@ export const selectCampaign = (sessionId: string, userId: string, campaignId: st }; export const setAutoStatus = (sessionId: string) => { - return getResponseWithoutCors({ + return getResponse({ url: `${window.BASE_AMEYO_URL}/ameyorestapi/cc/setAutoStatusForUser`, method: 'POST', requestKey: RequestKeys.SET_AUTO_STATUS, @@ -150,7 +150,7 @@ export const setAutoStatus = (sessionId: string) => { }; export const ameyoHangupUser = (sessionId: string, userCRTObjectId: string) => { - return getResponseWithoutCors({ + return getResponse({ url: `${window.BASE_AMEYO_URL}/ameyorestapi/voice/hangupUser`, method: 'POST', requestKey: RequestKeys.HANGUP_USER, @@ -163,7 +163,7 @@ export const ameyoHangupUser = (sessionId: string, userCRTObjectId: string) => { }; export const ameyoDisposeCall = (sessionId: string, campaignId: string, crtObjectId: string, userCRTObjectId: string) => { - return getResponseWithoutCors({ + return getResponse({ url: `${window.BASE_AMEYO_URL}/ameyorestapi/voice/disposeCall`, method: 'POST', requestKey: RequestKeys.DISPOSE_CALL, @@ -185,7 +185,7 @@ export const ameyoDisposeCall = (sessionId: string, campaignId: string, crtObjec }; export const getCampaignId = (sessionId: string) => { - return getResponseWithoutCors({ + return getResponse({ url: `${window.BASE_AMEYO_URL}/ameyorestapi/sessionData/getAllSessionData`, method: 'GET', requestKey: RequestKeys.GET_CAMPAIGN_ID, @@ -198,7 +198,7 @@ export const getCampaignId = (sessionId: string) => { } export const getAllAgentsForTransferCall = (sessionId: string) => { - return getResponseWithoutCors({ + return getResponse({ url: `${window.BASE_AMEYO_URL}/ameyorestapi/voice/getAllUserCampaignVoicePresencesByContactCenterId`, method: 'GET', requestKey: RequestKeys.GET_AGENTS_FOR_CALL_TRANSFER, @@ -212,7 +212,7 @@ export const getAllAgentsForTransferCall = (sessionId: string) => { export const logoutFromAmeyo = (sessionId: string) => { const LOGOUT_PAYLOAD_TEXT = `7|0|7|${window.BASE_AMEYO_URL}/app/application_ui/|C066834E4747CF348FD8D1A68865C24D|com.drishti.ameyo.common.ui.rpc.CommonGwtRpcService|doLogout|java.lang.String/2004016611|${sessionId}|Logout from UI|1|2|3|4|2|5|5|6|7|${sessionId}|`; - return getResponseWithoutCors({ + return getResponse({ url: `${window.BASE_AMEYO_URL}/ameyo40/service`, method: 'POST', requestKey: RequestKeys.LOGOUT_FROM_AMEYO, @@ -227,7 +227,7 @@ export const logoutFromAmeyo = (sessionId: string) => { export const transferCallToAgent = (data: CallTransferData, sessionId: string, crtObjectId: string, userCRTObjectId: string, campaignId: string) => { - return getResponseWithoutCors({ + return getResponse({ url: `${window.BASE_AMEYO_URL}/ameyorestapi/voice/transferToUserInDifferentCampaign`, method: 'POST', requestKey: RequestKeys.TRANSFER_CALL_TO_AGENT, diff --git a/packages/adapter-ameyo/lib/main.ts b/packages/adapter-ameyo/lib/main.ts index 1dc9464..b2a0f7b 100644 --- a/packages/adapter-ameyo/lib/main.ts +++ b/packages/adapter-ameyo/lib/main.ts @@ -1,4 +1,5 @@ import IAdapter from "@universal-call-sdk/common/lib/Interfaces/IAdapter"; +import GenericFunction from "@universal-call-sdk/common/lib/types/GenericFunction"; import GenericObject from "@universal-call-sdk/common/lib/types/GenericObject"; import { AmeyoInitializationOptions, @@ -143,8 +144,9 @@ class AmeyoAdapter implements IAdapter { } }; - private initializeAmeyo = (): void => { - loginInAmeyo(this.userName.toLowerCase(), this.password); + private initializeAmeyo = async (): Promise => { + const res = await loginInAmeyo(this.userName.toLowerCase(), this.password); + if (res) this.handleApiResponse(res, this.handleLoginResponse); }; private handleMessage = async ({data}: MessageEvent): Promise => { @@ -154,9 +156,6 @@ class AmeyoAdapter implements IAdapter { } switch (data.type) { - case MessagingType.SET_RESPONSE_WITHOUT_CORS: - await this.handleCorsBypassResponse(data); - break; case MessagingType.ON_AMEYO_CALL_INCOMING: this.handleCallIncoming(data); break; @@ -207,36 +206,13 @@ class AmeyoAdapter implements IAdapter { }); } - private async handleCorsBypassResponse(payload: GenericObject): Promise { + private handleApiResponse = async ( + payload: GenericObject, + apiHandler: GenericFunction + ): Promise => { + apiHandler(payload); this.trackApiMetrics(payload); - - switch (payload?.data?.requestKey) { - case RequestKeys.AMEYO_LOGIN: - await this.handleLoginResponse(payload); - break; - case RequestKeys.SIP_ACCOUNT_INFO: - await this.handleSipAccountInfo(payload); - break; - case RequestKeys.GET_CAMPAIGN_ID: - await this.handleCampaignId(payload); - break; - case RequestKeys.AMEYO_AVAILABLE: - this.handleAgentAvailable(); - break; - case RequestKeys.OMNIQUEUE_SERVICE: - await this.handleOmniQueueService(); - break; - case RequestKeys.SELECT_CAMPAIGN: - await this.handleCampaignSelection(); - break; - case RequestKeys.AMEYO_ON_BREAK: - this.handleAgentBreak(); - break; - case RequestKeys.GET_AGENTS_FOR_CALL_TRANSFER: - this.handleAgentsForTransfer(payload); - break; - } - } + }; private trackApiMetrics(payload: GenericObject): void { if (payload?.data?.requestKey !== RequestKeys.AMEYO_HEARTBEAT && !payload?.data?.err) { @@ -266,7 +242,7 @@ class AmeyoAdapter implements IAdapter { } } - private async handleLoginResponse(payload: GenericObject): Promise { + private handleLoginResponse = async (payload: GenericObject): Promise => { if (payload?.data?.err) { console.log('Login failed:', payload?.data?.err); this.callbacks.onLoginFailed(payload?.err); @@ -275,12 +251,13 @@ class AmeyoAdapter implements IAdapter { const sessionId = payload?.data?.response?.userSessionInfo?.sessionId; this.sessionId = sessionId; - await getSipAccountInfo(sessionId, this.userName?.toLowerCase()); + const res = await getSipAccountInfo(sessionId, this.userName?.toLowerCase()); + this.handleApiResponse(res, this.handleSipAccountInfo); registerEventProcessor(this.eventListenerUrl, sessionId); maintainHeartbeat(this.sessionId, window?.listenerName || '', 0); } - private async handleSipAccountInfo(payload: GenericObject): Promise { + private handleSipAccountInfo = async (payload: GenericObject): Promise => { const response = payload?.data?.response; this.initializeSipStack({ accountName: response?.accountName, @@ -290,28 +267,31 @@ class AmeyoAdapter implements IAdapter { }); this.sipAccountInfo = payload?.data?.response; console.log('sip account info', this.sipAccountInfo) - await getCampaignId(this.sessionId); + const res = await getCampaignId(this.sessionId); + this.handleApiResponse(res, this.handleCampaignId); await setAutoStatus(this.sessionId); } - private async handleCampaignId(payload: GenericObject): Promise { + private handleCampaignId = async (payload: GenericObject): Promise => { this.campaignId = payload?.data?.response?.campaignInfos?.[0]?.campaignId; - await attachOmniqueService(this.sessionId, this.userName.toLowerCase(), this.campaignId); + const res = await attachOmniqueService(this.sessionId, this.userName.toLowerCase(), this.campaignId); + this.handleApiResponse(res, this.handleOmniQueueService); } - private handleAgentAvailable(): void { + private handleAgentAvailable = (_: GenericObject): void => { setAutoStatus(this.sessionId); } - private handleAgentBreak(): void { + private handleAgentBreak = (_: GenericObject): void => { setAutoStatus(this.sessionId); } - private async handleOmniQueueService(): Promise { - await selectCampaign(this.sessionId, this.userName.toLowerCase(), this.campaignId); + private handleOmniQueueService = async (_: GenericObject): Promise => { + const res = await selectCampaign(this.sessionId, this.userName.toLowerCase(), this.campaignId); + this.handleApiResponse(res, this.handleCampaignSelection); } - private async handleCampaignSelection(): Promise { + private handleCampaignSelection = async (_: GenericObject): Promise => { await autoSelectExtension(this.sessionId, this.userName.toLowerCase()); this.callbacks.onAdapterReady(); this.currentCallState = CALL_STATES.IDLE; @@ -324,7 +304,7 @@ class AmeyoAdapter implements IAdapter { window.postMessage({type: 'onAmeyoAvailabiltyChange', data: this.isAgentAvailable,}); } - private handleAgentsForTransfer(payload: GenericObject): void { + private handleAgentsForTransfer = (payload: GenericObject): void => { this.callbacks.onAgentsForCallTransfer(payload?.data?.response); } @@ -372,12 +352,14 @@ class AmeyoAdapter implements IAdapter { ); } - public setOnBreak(): void { - setAgentOnBreak(this.sessionId); + public async setOnBreak(): Promise { + const res = await setAgentOnBreak(this.sessionId); + this.handleApiResponse(res, this.handleAgentBreak); } - public setAvailable(): void { - setAgentActive(this.sessionId); + public async setAvailable(): Promise { + const res = await setAgentActive(this.sessionId); + this.handleApiResponse(res, this.handleAgentAvailable); } public muteCall(): void { @@ -396,8 +378,9 @@ class AmeyoAdapter implements IAdapter { return this.currentCallState; } - public getAvailableAgentsForCallTransfer(): void { - getAllAgentsForTransferCall(this.sessionId); + public async getAvailableAgentsForCallTransfer(): Promise { + const res = await getAllAgentsForTransferCall(this.sessionId); + this.handleApiResponse(res,this.handleAgentsForTransfer); } public transferCallToAgent(data: CallTransferData): void { diff --git a/packages/common/lib/types/GenericFunction.ts b/packages/common/lib/types/GenericFunction.ts new file mode 100644 index 0000000..2c7ddad --- /dev/null +++ b/packages/common/lib/types/GenericFunction.ts @@ -0,0 +1,7 @@ +import GenericObject from "./GenericObject"; + +type GenericFunction = +| ((payload: GenericObject) => void) +| ((payload: GenericObject) => Promise); + +export default GenericFunction; \ No newline at end of file diff --git a/packages/common/lib/types/Request.ts b/packages/common/lib/types/Request.ts new file mode 100644 index 0000000..74c4cb3 --- /dev/null +++ b/packages/common/lib/types/Request.ts @@ -0,0 +1,21 @@ +export type Request = { + url: string; + method: string; + data ?:Record | string; + requestKey: string; + requestType ?: RequestType; + headers ?: Record | null; +} + +export enum RequestType { + JSON = 'JSON', + RAW = 'RAW' +} + +export enum METHODS { + GET = "GET", + POST = "POST", + PUT = "PUT", + DELETE = "DELETE", +} + diff --git a/packages/common/lib/types/RequestType.ts b/packages/common/lib/types/RequestType.ts deleted file mode 100644 index a53da88..0000000 --- a/packages/common/lib/types/RequestType.ts +++ /dev/null @@ -1,8 +0,0 @@ -enum RequestType { - JSON = 'JSON', - RAW = 'RAW' -} - - -export default RequestType; - diff --git a/packages/common/lib/utils/getResponse.ts b/packages/common/lib/utils/getResponse.ts new file mode 100644 index 0000000..ed7ab1b --- /dev/null +++ b/packages/common/lib/utils/getResponse.ts @@ -0,0 +1,85 @@ +import { METHODS, Request, RequestType } from "../types/Request"; + +const getFetchResponse = async ( + url: string, + method: string, + data: any, + requestType: RequestType, + headers: any +) => { + const fetchOptions = { + method, + headers: { + "Content-Type": + requestType === RequestType.JSON ? "application/json" : "text/plain", + ...headers, + }, + ...(method !== METHODS.GET && { body: data }), + }; + try { + const res = await fetch(url, fetchOptions); + if (!res.ok) { + return { error: res }; + } + + const contentType = res.headers.get("Content-Type") || ""; + + if ( + requestType === RequestType.JSON && + contentType.includes("application/json") + ) { + return await res.json(); + } else if ( + contentType.includes("text/plain") || + requestType !== RequestType.JSON + ) { + return await res.text(); + } else { + throw new Error(`Unsupported Content-Type: ${contentType}`); + } + } catch (err) { + console.error("Response is not a valid JSON or text", err); + return { error: "Failed to parse response" }; + } +}; + +export const getResponse = async ({ + url, + method, + requestKey, + requestType = RequestType.JSON, + headers = null, + data = {}, +}: Request) => { + const requestPayload = + requestType === RequestType.RAW ? data : JSON.stringify(data); + try { + const response = await getFetchResponse( + url, + method, + requestPayload, + requestType, + headers || {} + ); + if (response?.error) { + console.error(response.error); + return { + data: { + requestKey: requestKey, + response: response, + }, + }; + } + return { + data: { + requestKey: requestKey, + response: response, + }, + }; + } catch (error) { + console.error("Fetch error:", error); + throw error; + } +}; + +export default getResponse; \ No newline at end of file diff --git a/packages/common/lib/utils/getResponseWithoutCors.ts b/packages/common/lib/utils/getResponseWithoutCors.ts deleted file mode 100644 index b3eef43..0000000 --- a/packages/common/lib/utils/getResponseWithoutCors.ts +++ /dev/null @@ -1,38 +0,0 @@ -import RequestType from "../types/RequestType.ts"; - -enum MessagingType { - GET_RESPONSE_WITHOUT_CORS = 'getResponseWithoutCors', - SET_RESPONSE_WITHOUT_CORS = 'setResponseWithoutCors', -} - - -type GetResponseWithoutCors = { - url: string; - method: string; - data ?:Record | string; - requestKey: string; - requestType ?: RequestType; - headers ?: Record | null; -} - -export const getResponseWithoutCors = ({ - url, - method, - data = {}, - requestKey, - requestType = RequestType.JSON, - headers = null}: GetResponseWithoutCors) => { - window.postMessage({ - type: MessagingType.GET_RESPONSE_WITHOUT_CORS, - data: { - url, - method, - data, - requestKey, - requestType, - headers - } - }); -}; - -export default getResponseWithoutCors; \ No newline at end of file From 4b60c2f164d2317d494670e5c8e3654791a31f53 Mon Sep 17 00:00:00 2001 From: vivek bhadola Date: Mon, 20 Jan 2025 15:48:25 +0530 Subject: [PATCH 2/7] NTP-27557 | Minor change --- packages/common/lib/utils/getResponse.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/common/lib/utils/getResponse.ts b/packages/common/lib/utils/getResponse.ts index ed7ab1b..6528498 100644 --- a/packages/common/lib/utils/getResponse.ts +++ b/packages/common/lib/utils/getResponse.ts @@ -30,8 +30,8 @@ const getFetchResponse = async ( ) { return await res.json(); } else if ( - contentType.includes("text/plain") || - requestType !== RequestType.JSON + contentType.includes("text/plain") && + requestType == RequestType.RAW ) { return await res.text(); } else { From 3358f262d7d212fe05cd518b9410a573f577c9a8 Mon Sep 17 00:00:00 2001 From: vivek bhadola Date: Wed, 22 Jan 2025 14:44:40 +0530 Subject: [PATCH 3/7] NTP-27557 | Agent transfer handling --- packages/adapter-ameyo/lib/api.ts | 32 ++++----- packages/adapter-ameyo/lib/main.ts | 16 +---- packages/adapter-ameyo/lib/types.ts | 1 - packages/common/lib/Interfaces/IAdapter.ts | 5 +- packages/common/lib/types/Request.ts | 4 +- .../utils/{getResponse.ts => apiHelper.ts} | 66 ++++++++++--------- packages/core/lib/types.ts | 18 +++++ packages/core/lib/useCallSdk.ts | 11 +--- 8 files changed, 80 insertions(+), 73 deletions(-) rename packages/common/lib/utils/{getResponse.ts => apiHelper.ts} (53%) diff --git a/packages/adapter-ameyo/lib/api.ts b/packages/adapter-ameyo/lib/api.ts index 6d2f73c..43e8dea 100644 --- a/packages/adapter-ameyo/lib/api.ts +++ b/packages/adapter-ameyo/lib/api.ts @@ -1,4 +1,4 @@ -import getResponse from "@universal-call-sdk/common/lib/utils/getResponse.ts"; +import apiHelper from "@universal-call-sdk/common/lib/utils/apiHelper.ts"; import {CallTransferData, RequestKeys} from "./types"; import { RequestType } from "@universal-call-sdk/common/lib/types/Request.ts"; import {v4 as uuid} from 'uuid'; @@ -9,7 +9,7 @@ export const loginInAmeyo = (userId: string, password: string) => { if(!userId || !password) { return } - return getResponse({ + return apiHelper({ url: `${window.BASE_AMEYO_URL}/ameyorestapi/userLogin/login`, method: 'POST', requestKey: RequestKeys.AMEYO_LOGIN, @@ -30,7 +30,7 @@ export const loginInAmeyo = (userId: string, password: string) => { }; export const maintainHeartbeat = (sessionId: string, webcoreTimestamp: string, counter: number) => { const HEART_BEAT_REQUEST_TEXT = `7|0|8|${window.BASE_AMEYO_URL}/app/application_ui/|93B024BCBAF3AE5EFEC49890FE64CF5F|com.drishti.ameyo.common.ui.rpc.CommonGwtRpcService|keepAliveWithPingPush|java.lang.String/2004016611|java.lang.Integer/3438268394|${sessionId}|${webcoreTimestamp}|1|2|3|4|3|5|5|6|7|8|6|${counter}|${sessionId}|`; - setInterval(() => getResponse({ + setInterval(() => apiHelper({ url: `${window.BASE_AMEYO_URL}/ameyo40/service`, method: 'POST', requestKey: RequestKeys.AMEYO_HEARTBEAT, @@ -44,7 +44,7 @@ export const maintainHeartbeat = (sessionId: string, webcoreTimestamp: string, c }; export const setAgentOnBreak = (sessionId: string) => { - return getResponse({ + return apiHelper({ url: `${window.BASE_AMEYO_URL}/ameyorestapi/cc/userBreak`, method: 'POST', requestKey: RequestKeys.AMEYO_ON_BREAK, @@ -62,7 +62,7 @@ export const setAgentOnBreak = (sessionId: string) => { export const attachOmniqueService = (sessionId: string, userId: string, campaignId: string) => { const OMNIQUEUE_TEXT = `7|0|9|${window.BASE_AMEYO_URL}/app/application_ui/|5B1786BFF89E87DC6EAAACDE629A89E2|com.drishti.ameyo.omniqueue.shared.CommonGwtRpcService|selectCamapign|java.lang.String/2004016611|[Ljava.lang.Integer;/1574882222|${sessionId}|${userId}|java.lang.Integer/3438268394|1|2|3|4|3|5|5|6|7|8|6|1|9|${campaignId}|${sessionId}|`; - return getResponse({ + return apiHelper({ url: `${window.BASE_AMEYO_URL}/ameyoomniqueue/service`, method: 'POST', requestKey: RequestKeys.OMNIQUEUE_SERVICE, @@ -76,7 +76,7 @@ export const attachOmniqueService = (sessionId: string, userId: string, campaign }; export const setAgentActive = (sessionId: string) => { - return getResponse({ + return apiHelper({ url: `${window.BASE_AMEYO_URL}/ameyorestapi/cc/userReady`, method: 'POST', requestKey: RequestKeys.AMEYO_AVAILABLE, @@ -92,7 +92,7 @@ export const setAgentActive = (sessionId: string) => { }; export const getSipAccountInfo = (sessionId: string, userId: string) => { - return getResponse({ + return apiHelper({ url: `${window.BASE_AMEYO_URL}/ameyorestapi/voice/sipAccountInfos/getSipAccountInfo?info=false`, method: 'GET', requestKey: RequestKeys.SIP_ACCOUNT_INFO, @@ -106,7 +106,7 @@ export const getSipAccountInfo = (sessionId: string, userId: string) => { }; export const autoSelectExtension = (sessionId: string, userId: string) => { - return getResponse({ + return apiHelper({ url: `${window.BASE_AMEYO_URL}/ameyorestapi/voice/autoSelectExtension`, method: 'POST', requestKey: RequestKeys.AUTO_SELECT_EXTENSION, @@ -123,7 +123,7 @@ export const autoSelectExtension = (sessionId: string, userId: string) => { export const selectCampaign = (sessionId: string, userId: string, campaignId: string) => { const SELECT_CAMPAIGN_TEXT = `7|0|9|${window.BASE_AMEYO_URL}/app/application_ui/|5B1786BFF89E87DC6EAAACDE629A89E2|com.drishti.ameyo.omniqueue.shared.CommonGwtRpcService|selectCamapign|java.lang.String/2004016611|[Ljava.lang.Integer;/1574882222|${sessionId}|${userId}|java.lang.Integer/3438268394|1|2|3|4|3|5|5|6|7|8|6|1|9|${campaignId}|${sessionId}|`; - return getResponse({ + return apiHelper({ url: `${window.BASE_AMEYO_URL}/ameyoomniqueue/service`, method: 'POST', requestKey: RequestKeys.SELECT_CAMPAIGN, @@ -137,7 +137,7 @@ export const selectCampaign = (sessionId: string, userId: string, campaignId: st }; export const setAutoStatus = (sessionId: string) => { - return getResponse({ + return apiHelper({ url: `${window.BASE_AMEYO_URL}/ameyorestapi/cc/setAutoStatusForUser`, method: 'POST', requestKey: RequestKeys.SET_AUTO_STATUS, @@ -150,7 +150,7 @@ export const setAutoStatus = (sessionId: string) => { }; export const ameyoHangupUser = (sessionId: string, userCRTObjectId: string) => { - return getResponse({ + return apiHelper({ url: `${window.BASE_AMEYO_URL}/ameyorestapi/voice/hangupUser`, method: 'POST', requestKey: RequestKeys.HANGUP_USER, @@ -163,7 +163,7 @@ export const ameyoHangupUser = (sessionId: string, userCRTObjectId: string) => { }; export const ameyoDisposeCall = (sessionId: string, campaignId: string, crtObjectId: string, userCRTObjectId: string) => { - return getResponse({ + return apiHelper({ url: `${window.BASE_AMEYO_URL}/ameyorestapi/voice/disposeCall`, method: 'POST', requestKey: RequestKeys.DISPOSE_CALL, @@ -185,7 +185,7 @@ export const ameyoDisposeCall = (sessionId: string, campaignId: string, crtObjec }; export const getCampaignId = (sessionId: string) => { - return getResponse({ + return apiHelper({ url: `${window.BASE_AMEYO_URL}/ameyorestapi/sessionData/getAllSessionData`, method: 'GET', requestKey: RequestKeys.GET_CAMPAIGN_ID, @@ -198,7 +198,7 @@ export const getCampaignId = (sessionId: string) => { } export const getAllAgentsForTransferCall = (sessionId: string) => { - return getResponse({ + return apiHelper({ url: `${window.BASE_AMEYO_URL}/ameyorestapi/voice/getAllUserCampaignVoicePresencesByContactCenterId`, method: 'GET', requestKey: RequestKeys.GET_AGENTS_FOR_CALL_TRANSFER, @@ -212,7 +212,7 @@ export const getAllAgentsForTransferCall = (sessionId: string) => { export const logoutFromAmeyo = (sessionId: string) => { const LOGOUT_PAYLOAD_TEXT = `7|0|7|${window.BASE_AMEYO_URL}/app/application_ui/|C066834E4747CF348FD8D1A68865C24D|com.drishti.ameyo.common.ui.rpc.CommonGwtRpcService|doLogout|java.lang.String/2004016611|${sessionId}|Logout from UI|1|2|3|4|2|5|5|6|7|${sessionId}|`; - return getResponse({ + return apiHelper({ url: `${window.BASE_AMEYO_URL}/ameyo40/service`, method: 'POST', requestKey: RequestKeys.LOGOUT_FROM_AMEYO, @@ -227,7 +227,7 @@ export const logoutFromAmeyo = (sessionId: string) => { export const transferCallToAgent = (data: CallTransferData, sessionId: string, crtObjectId: string, userCRTObjectId: string, campaignId: string) => { - return getResponse({ + return apiHelper({ url: `${window.BASE_AMEYO_URL}/ameyorestapi/voice/transferToUserInDifferentCampaign`, method: 'POST', requestKey: RequestKeys.TRANSFER_CALL_TO_AGENT, diff --git a/packages/adapter-ameyo/lib/main.ts b/packages/adapter-ameyo/lib/main.ts index b2a0f7b..6cee9b1 100644 --- a/packages/adapter-ameyo/lib/main.ts +++ b/packages/adapter-ameyo/lib/main.ts @@ -85,8 +85,6 @@ class AmeyoAdapter implements IAdapter { }, onLoginFailed: () => { }, - onAgentsForCallTransfer: () => { - }, onCallTransferStatus: () => { } }; @@ -304,10 +302,6 @@ class AmeyoAdapter implements IAdapter { window.postMessage({type: 'onAmeyoAvailabiltyChange', data: this.isAgentAvailable,}); } - private handleAgentsForTransfer = (payload: GenericObject): void => { - this.callbacks.onAgentsForCallTransfer(payload?.data?.response); - } - private handleCallIncoming(data: GenericObject): void { this.callbacks.onCallIncoming(data?.data); this.currentCallState = CALL_STATES.CALL_INCOMING; @@ -378,9 +372,8 @@ class AmeyoAdapter implements IAdapter { return this.currentCallState; } - public async getAvailableAgentsForCallTransfer(): Promise { - const res = await getAllAgentsForTransferCall(this.sessionId); - this.handleApiResponse(res,this.handleAgentsForTransfer); + public async getAvailableAgentsForCallTransfer(): Promise { + return getAllAgentsForTransferCall(this.sessionId); } public transferCallToAgent(data: CallTransferData): void { @@ -421,11 +414,6 @@ class AmeyoAdapter implements IAdapter { public registerOnLoginFailedListener(callback: () => void): void { this.callbacks.onLoginFailed = callback; } - - public registerOnAgentsForCallTransfer(callback: (data: GenericObject) => void): void { - this.callbacks.onAgentsForCallTransfer = callback; - } - public registerOnCallTransferStatus(callback: (data: GenericObject) => void): void { this.callbacks.onCallTransferStatus = callback; } diff --git a/packages/adapter-ameyo/lib/types.ts b/packages/adapter-ameyo/lib/types.ts index 36817a3..e51cea1 100644 --- a/packages/adapter-ameyo/lib/types.ts +++ b/packages/adapter-ameyo/lib/types.ts @@ -73,7 +73,6 @@ export type CallbackFunctions = { onAgentAvailabilityChange: (isAgentAvailable: boolean, reason: string) => void; onForcedLogout: () => void; onLoginFailed: (err: GenericObject) => void; - onAgentsForCallTransfer: (data: GenericObject) => void; onCallTransferStatus: (data: GenericObject) => void; }; diff --git a/packages/common/lib/Interfaces/IAdapter.ts b/packages/common/lib/Interfaces/IAdapter.ts index 1a49183..74baa30 100644 --- a/packages/common/lib/Interfaces/IAdapter.ts +++ b/packages/common/lib/Interfaces/IAdapter.ts @@ -11,7 +11,6 @@ class IAdapter { registerOnAgentAvailabilityChange(callback: (isAgentAvailable: boolean, reason: string) => void) {callback(false, '')} registerOnForcedLogoutListener(callback:()=>void) {callback()} registerOnLoginFailedListener(callback:()=>void) {callback()} - registerOnAgentsForCallTransfer(callback: (data : GenericObject) => void) {callback({})} registerOnCallTransferStatus(callback: (data: GenericObject) => void) {callback({})} acceptCall() {} rejectCall() {} @@ -30,7 +29,9 @@ class IAdapter { getAgentAvailability(): boolean {return false} getLatestCallState(): CALL_STATES {return CALL_STATES.IDLE} - getAvailableAgentsForCallTransfer() {} + getAvailableAgentsForCallTransfer(): Promise { + return Promise.resolve(new Response()); + } transferCallToAgent(data: GenericObject) {console.log("transfer call", data)} } diff --git a/packages/common/lib/types/Request.ts b/packages/common/lib/types/Request.ts index 74c4cb3..09da60d 100644 --- a/packages/common/lib/types/Request.ts +++ b/packages/common/lib/types/Request.ts @@ -1,8 +1,10 @@ +import { RequestKeys } from "@universal-call-sdk/adapter-ameyo/lib/types"; + export type Request = { url: string; method: string; data ?:Record | string; - requestKey: string; + requestKey: RequestKeys; requestType ?: RequestType; headers ?: Record | null; } diff --git a/packages/common/lib/utils/getResponse.ts b/packages/common/lib/utils/apiHelper.ts similarity index 53% rename from packages/common/lib/utils/getResponse.ts rename to packages/common/lib/utils/apiHelper.ts index 6528498..067ecaf 100644 --- a/packages/common/lib/utils/getResponse.ts +++ b/packages/common/lib/utils/apiHelper.ts @@ -1,13 +1,18 @@ +import { RequestKeys } from "@universal-call-sdk/adapter-ameyo/lib/types"; import { METHODS, Request, RequestType } from "../types/Request"; -const getFetchResponse = async ( +const handleError = (context: string, error: unknown): void => { + console.error(`[${context}]`, error); +}; + +const getFetchResponse = async( url: string, method: string, data: any, requestType: RequestType, - headers: any -) => { - const fetchOptions = { + headers: Record +): Promise => { + const fetchOptions: RequestInit = { method, headers: { "Content-Type": @@ -16,44 +21,51 @@ const getFetchResponse = async ( }, ...(method !== METHODS.GET && { body: data }), }; + try { const res = await fetch(url, fetchOptions); + if (!res.ok) { - return { error: res }; + throw new Error(`HTTP error! Status: ${res.status} ${res.statusText}`); } const contentType = res.headers.get("Content-Type") || ""; - if ( - requestType === RequestType.JSON && - contentType.includes("application/json") - ) { + if (contentType.includes("application/json")) { return await res.json(); - } else if ( - contentType.includes("text/plain") && - requestType == RequestType.RAW - ) { + } else if (contentType.includes("text/plain")) { return await res.text(); } else { throw new Error(`Unsupported Content-Type: ${contentType}`); } } catch (err) { - console.error("Response is not a valid JSON or text", err); - return { error: "Failed to parse response" }; + handleError("Fetch error:", err); + return null; } }; -export const getResponse = async ({ +export const apiHelper = async({ url, method, requestKey, requestType = RequestType.JSON, - headers = null, + headers = {}, data = {}, }: Request) => { const requestPayload = requestType === RequestType.RAW ? data : JSON.stringify(data); + try { + if (requestKey === RequestKeys.GET_AGENTS_FOR_CALL_TRANSFER) { + return getFetchResponse( + url, + method, + requestPayload, + requestType, + headers || {} + ); + } + const response = await getFetchResponse( url, method, @@ -61,25 +73,17 @@ export const getResponse = async ({ requestType, headers || {} ); - if (response?.error) { - console.error(response.error); - return { - data: { - requestKey: requestKey, - response: response, - }, - }; - } + return { data: { - requestKey: requestKey, - response: response, + requestKey, + response, }, }; } catch (error) { - console.error("Fetch error:", error); - throw error; + handleError("Response error:", error); + return null; } }; -export default getResponse; \ No newline at end of file +export default apiHelper; diff --git a/packages/core/lib/types.ts b/packages/core/lib/types.ts index 056992e..1aff828 100644 --- a/packages/core/lib/types.ts +++ b/packages/core/lib/types.ts @@ -8,4 +8,22 @@ export type StateType = { isCallConnected: boolean, isCallDisconnected: boolean, callStartTime: number, +} + +interface Campaign { + campaignId: number; + campaignName: string; + campaignType: string; +} +export interface Agent { + userId: string; + userName: string; + userType: string; + sessionId: string; + crtObjectId: string; + isOnBreak: boolean; + isOnAutoCall: boolean; + isPresent: boolean; + statusDescription: string; + campaignList: Campaign[]; } \ No newline at end of file diff --git a/packages/core/lib/useCallSdk.ts b/packages/core/lib/useCallSdk.ts index b60a0b1..484aea1 100644 --- a/packages/core/lib/useCallSdk.ts +++ b/packages/core/lib/useCallSdk.ts @@ -1,5 +1,5 @@ import {useEffect, useReducer} from 'react'; -import {GenericObject, StateType} from "./types.ts"; +import {Agent, GenericObject, StateType} from "./types.ts"; import IAdapter from "@universal-call-sdk/common/lib/Interfaces/IAdapter.ts"; import MetricsProcessor from "@universal-call-sdk/common/lib/utils/metricsProcessor.ts"; import ClickStreamProcessor from "@universal-call-sdk/common/lib/utils/clickStreamProcessor.ts"; @@ -123,10 +123,6 @@ function UseCallSdk({AdapterClass, adapterOptions, metricsConfig, clickStreamCon adapter?.registerOnForcedLogoutListener(callback); } - function registerOnAgentsForCallTransfer(callback: (data: GenericObject) => void) { - adapter?.registerOnAgentsForCallTransfer(callback); - } - function registerOnCallTransferStatus(callback: (data: GenericObject) => void) { adapter?.registerOnCallTransferStatus(callback); } @@ -189,8 +185,8 @@ function UseCallSdk({AdapterClass, adapterOptions, metricsConfig, clickStreamCon return adapter.getLatestCallState(); } - function getAvailableAgentsForCallTransfer() { - adapter.getAvailableAgentsForCallTransfer(); + function getAvailableAgentsForCallTransfer(): Promise { + return adapter.getAvailableAgentsForCallTransfer(); } function transferCallToAgent(data: GenericObject) { @@ -204,7 +200,6 @@ function UseCallSdk({AdapterClass, adapterOptions, metricsConfig, clickStreamCon registerOnCallDisconnected, registerOnAgentAvailabilityChange, registerOnForcedLogoutListener, - registerOnAgentsForCallTransfer, registerOnCallTransferStatus, registerOnLoginFailedListener, acceptCall, From 2ab165d06e5d98f14fcafc8d07b74a4da994455f Mon Sep 17 00:00:00 2001 From: vivek bhadola Date: Thu, 23 Jan 2025 16:16:45 +0530 Subject: [PATCH 4/7] NTP-27557 | Handling api calls together --- packages/adapter-ameyo/lib/main.ts | 68 +++++++++++--------- packages/common/lib/types/GenericFunction.ts | 7 -- packages/common/lib/types/Request.ts | 5 ++ packages/common/lib/utils/apiHelper.ts | 42 ++++++++---- 4 files changed, 72 insertions(+), 50 deletions(-) delete mode 100644 packages/common/lib/types/GenericFunction.ts diff --git a/packages/adapter-ameyo/lib/main.ts b/packages/adapter-ameyo/lib/main.ts index 6cee9b1..eafc7b6 100644 --- a/packages/adapter-ameyo/lib/main.ts +++ b/packages/adapter-ameyo/lib/main.ts @@ -1,11 +1,9 @@ import IAdapter from "@universal-call-sdk/common/lib/Interfaces/IAdapter"; -import GenericFunction from "@universal-call-sdk/common/lib/types/GenericFunction"; import GenericObject from "@universal-call-sdk/common/lib/types/GenericObject"; import { AmeyoInitializationOptions, CALL_STATES, CallbackFunctions, CallTransferData, - RequestKeys, SipAccountInfo, StateType } from "./types"; @@ -143,8 +141,25 @@ class AmeyoAdapter implements IAdapter { }; private initializeAmeyo = async (): Promise => { - const res = await loginInAmeyo(this.userName.toLowerCase(), this.password); - if (res) this.handleApiResponse(res, this.handleLoginResponse); + try { + const loginResponse: GenericObject = await loginInAmeyo(this.userName.toLowerCase(), this.password); + if (!loginResponse) { + console.error("Invalid username or password"); + return; + } + this.trackApiMetrics(loginResponse); + const sipInfoResponse: GenericObject | undefined = await this.handleLoginResponse(loginResponse); + if (!sipInfoResponse) { + console.error("Login failed: Invalid response"); + return; + } + const campaignIdResponse: GenericObject = await this.handleSipAccountInfo(sipInfoResponse); + await this.handleCampaignId(campaignIdResponse); + await this.handleOmniQueueService(); + await this.handleCampaignSelection(); + } catch (error) { + console.error("Error during Ameyo initialization:", error); + } }; private handleMessage = async ({data}: MessageEvent): Promise => { @@ -204,16 +219,8 @@ class AmeyoAdapter implements IAdapter { }); } - private handleApiResponse = async ( - payload: GenericObject, - apiHandler: GenericFunction - ): Promise => { - apiHandler(payload); - this.trackApiMetrics(payload); - }; - private trackApiMetrics(payload: GenericObject): void { - if (payload?.data?.requestKey !== RequestKeys.AMEYO_HEARTBEAT && !payload?.data?.err) { + if (!payload?.data?.err) { this.metricProcessor?.pushCounterMetric({ metricName: 'ameyo-api-call-count', flow: 'api-call-count', @@ -225,9 +232,7 @@ class AmeyoAdapter implements IAdapter { subFlow: payload?.data?.requestKey, value: payload?.data?.time / 1000 || 0 }); - } - - if (payload?.data?.err) { + } else { this.metricProcessor?.pushCounterMetric({ metricName: 'ameyo-api-err-count', flow: 'api-error-count', @@ -240,7 +245,7 @@ class AmeyoAdapter implements IAdapter { } } - private handleLoginResponse = async (payload: GenericObject): Promise => { + private handleLoginResponse = async (payload: GenericObject): Promise => { if (payload?.data?.err) { console.log('Login failed:', payload?.data?.err); this.callbacks.onLoginFailed(payload?.err); @@ -250,12 +255,13 @@ class AmeyoAdapter implements IAdapter { const sessionId = payload?.data?.response?.userSessionInfo?.sessionId; this.sessionId = sessionId; const res = await getSipAccountInfo(sessionId, this.userName?.toLowerCase()); - this.handleApiResponse(res, this.handleSipAccountInfo); + this.trackApiMetrics(res); registerEventProcessor(this.eventListenerUrl, sessionId); maintainHeartbeat(this.sessionId, window?.listenerName || '', 0); + return res; } - private handleSipAccountInfo = async (payload: GenericObject): Promise => { + private handleSipAccountInfo = async (payload: GenericObject): Promise => { const response = payload?.data?.response; this.initializeSipStack({ accountName: response?.accountName, @@ -266,31 +272,33 @@ class AmeyoAdapter implements IAdapter { this.sipAccountInfo = payload?.data?.response; console.log('sip account info', this.sipAccountInfo) const res = await getCampaignId(this.sessionId); - this.handleApiResponse(res, this.handleCampaignId); + this.trackApiMetrics(res); await setAutoStatus(this.sessionId); + return res; } private handleCampaignId = async (payload: GenericObject): Promise => { this.campaignId = payload?.data?.response?.campaignInfos?.[0]?.campaignId; const res = await attachOmniqueService(this.sessionId, this.userName.toLowerCase(), this.campaignId); - this.handleApiResponse(res, this.handleOmniQueueService); + this.trackApiMetrics(res); } - private handleAgentAvailable = (_: GenericObject): void => { + private handleAgentAvailable = (): void => { setAutoStatus(this.sessionId); } - private handleAgentBreak = (_: GenericObject): void => { + private handleAgentBreak = (): void => { setAutoStatus(this.sessionId); } - private handleOmniQueueService = async (_: GenericObject): Promise => { + private handleOmniQueueService = async (): Promise => { const res = await selectCampaign(this.sessionId, this.userName.toLowerCase(), this.campaignId); - this.handleApiResponse(res, this.handleCampaignSelection); + this.trackApiMetrics(res); } - private handleCampaignSelection = async (_: GenericObject): Promise => { - await autoSelectExtension(this.sessionId, this.userName.toLowerCase()); + private handleCampaignSelection = async (): Promise => { + const res = await autoSelectExtension(this.sessionId, this.userName.toLowerCase()); + this.trackApiMetrics(res); this.callbacks.onAdapterReady(); this.currentCallState = CALL_STATES.IDLE; window.postMessage({type: 'onAmeyoAvailabiltyChange', data: false}); @@ -348,12 +356,14 @@ class AmeyoAdapter implements IAdapter { public async setOnBreak(): Promise { const res = await setAgentOnBreak(this.sessionId); - this.handleApiResponse(res, this.handleAgentBreak); + this.trackApiMetrics(res); + this.handleAgentBreak(); } public async setAvailable(): Promise { const res = await setAgentActive(this.sessionId); - this.handleApiResponse(res, this.handleAgentAvailable); + this.trackApiMetrics(res); + this.handleAgentAvailable(); } public muteCall(): void { diff --git a/packages/common/lib/types/GenericFunction.ts b/packages/common/lib/types/GenericFunction.ts deleted file mode 100644 index 2c7ddad..0000000 --- a/packages/common/lib/types/GenericFunction.ts +++ /dev/null @@ -1,7 +0,0 @@ -import GenericObject from "./GenericObject"; - -type GenericFunction = -| ((payload: GenericObject) => void) -| ((payload: GenericObject) => Promise); - -export default GenericFunction; \ No newline at end of file diff --git a/packages/common/lib/types/Request.ts b/packages/common/lib/types/Request.ts index 09da60d..38090ce 100644 --- a/packages/common/lib/types/Request.ts +++ b/packages/common/lib/types/Request.ts @@ -21,3 +21,8 @@ export enum METHODS { DELETE = "DELETE", } +export enum ContentType { + JSON = "application/json", + TEXT = "text/plain", +} + diff --git a/packages/common/lib/utils/apiHelper.ts b/packages/common/lib/utils/apiHelper.ts index 067ecaf..05662c2 100644 --- a/packages/common/lib/utils/apiHelper.ts +++ b/packages/common/lib/utils/apiHelper.ts @@ -1,9 +1,5 @@ import { RequestKeys } from "@universal-call-sdk/adapter-ameyo/lib/types"; -import { METHODS, Request, RequestType } from "../types/Request"; - -const handleError = (context: string, error: unknown): void => { - console.error(`[${context}]`, error); -}; +import { ContentType, METHODS, Request, RequestType } from "../types/Request"; const getFetchResponse = async( url: string, @@ -16,7 +12,7 @@ const getFetchResponse = async( method, headers: { "Content-Type": - requestType === RequestType.JSON ? "application/json" : "text/plain", + requestType === RequestType.JSON ? ContentType.JSON : ContentType.TEXT, ...headers, }, ...(method !== METHODS.GET && { body: data }), @@ -26,21 +22,25 @@ const getFetchResponse = async( const res = await fetch(url, fetchOptions); if (!res.ok) { - throw new Error(`HTTP error! Status: ${res.status} ${res.statusText}`); + return { + error: res, + }; } const contentType = res.headers.get("Content-Type") || ""; - if (contentType.includes("application/json")) { + if (contentType.includes(ContentType.JSON)) { return await res.json(); - } else if (contentType.includes("text/plain")) { + } else if (contentType.includes(ContentType.TEXT)) { return await res.text(); } else { throw new Error(`Unsupported Content-Type: ${contentType}`); } } catch (err) { - handleError("Fetch error:", err); - return null; + console.error("Fetch error:", err); + return { + error: err, + }; } }; @@ -74,15 +74,29 @@ export const apiHelper = async({ headers || {} ); + if (response?.error) { + return { + data: { + requestKey, + err: response, + } + }; + } + return { data: { requestKey, response, - }, + } }; } catch (error) { - handleError("Response error:", error); - return null; + console.error("Response error:", error); + return { + data: { + requestKey, + err: error, + } + }; } }; From 064aec1d1ecddbf4647d9b783cfbfeb424d49097 Mon Sep 17 00:00:00 2001 From: vivek bhadola Date: Fri, 24 Jan 2025 20:10:14 +0530 Subject: [PATCH 5/7] NTP-27557 | package --- packages/adapter-ameyo/package.json | 4 ++-- packages/common/package.json | 2 +- packages/core/package.json | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/adapter-ameyo/package.json b/packages/adapter-ameyo/package.json index 0282e62..cd6f215 100644 --- a/packages/adapter-ameyo/package.json +++ b/packages/adapter-ameyo/package.json @@ -1,6 +1,6 @@ { "name": "@universal-call-sdk/adapter-ameyo", - "version": "1.1.33", + "version": "1.2.0", "type": "module", "scripts": { "dev": "vite", @@ -9,7 +9,7 @@ "preview": "vite preview" }, "dependencies": { - "@universal-call-sdk/common": "^1.1.18", + "@universal-call-sdk/common": "^1.2.0", "uuid": "^11.0.3" }, "devDependencies": { diff --git a/packages/common/package.json b/packages/common/package.json index c92cdec..dba8f92 100644 --- a/packages/common/package.json +++ b/packages/common/package.json @@ -1,6 +1,6 @@ { "name": "@universal-call-sdk/common", - "version": "1.1.18", + "version": "1.2.0", "type": "module", "scripts": { "dev": "vite", diff --git a/packages/core/package.json b/packages/core/package.json index 33ceac9..ed5634f 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@universal-call-sdk/core", - "version": "1.1.15", + "version": "1.2.0", "type": "module", "scripts": { "dev": "vite", From fd75f12b93ae42145d4e17fcf8b16e91f5922a4b Mon Sep 17 00:00:00 2001 From: "varnit.goyal" Date: Fri, 24 Jan 2025 14:43:26 +0000 Subject: [PATCH 6/7] Publish - @universal-call-sdk/adapter-ameyo@1.2.1 - @universal-call-sdk/common@1.2.1 - @universal-call-sdk/core@1.2.1 --- packages/adapter-ameyo/CHANGELOG.md | 8 ++++++++ packages/adapter-ameyo/package.json | 4 ++-- packages/common/CHANGELOG.md | 8 ++++++++ packages/common/package.json | 2 +- packages/core/CHANGELOG.md | 8 ++++++++ packages/core/package.json | 2 +- 6 files changed, 28 insertions(+), 4 deletions(-) diff --git a/packages/adapter-ameyo/CHANGELOG.md b/packages/adapter-ameyo/CHANGELOG.md index 719c50e..54f2800 100644 --- a/packages/adapter-ameyo/CHANGELOG.md +++ b/packages/adapter-ameyo/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## 1.2.1 (2025-01-24) + +**Note:** Version bump only for package @universal-call-sdk/adapter-ameyo + + + + + ## 1.1.33 (2025-01-17) **Note:** Version bump only for package @universal-call-sdk/adapter-ameyo diff --git a/packages/adapter-ameyo/package.json b/packages/adapter-ameyo/package.json index cd6f215..02a701f 100644 --- a/packages/adapter-ameyo/package.json +++ b/packages/adapter-ameyo/package.json @@ -1,6 +1,6 @@ { "name": "@universal-call-sdk/adapter-ameyo", - "version": "1.2.0", + "version": "1.2.1", "type": "module", "scripts": { "dev": "vite", @@ -9,7 +9,7 @@ "preview": "vite preview" }, "dependencies": { - "@universal-call-sdk/common": "^1.2.0", + "@universal-call-sdk/common": "^1.2.1", "uuid": "^11.0.3" }, "devDependencies": { diff --git a/packages/common/CHANGELOG.md b/packages/common/CHANGELOG.md index 7780371..b33641b 100644 --- a/packages/common/CHANGELOG.md +++ b/packages/common/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## 1.2.1 (2025-01-24) + +**Note:** Version bump only for package @universal-call-sdk/common + + + + + ## 1.1.18 (2025-01-17) **Note:** Version bump only for package @universal-call-sdk/common diff --git a/packages/common/package.json b/packages/common/package.json index dba8f92..4b2ea65 100644 --- a/packages/common/package.json +++ b/packages/common/package.json @@ -1,6 +1,6 @@ { "name": "@universal-call-sdk/common", - "version": "1.2.0", + "version": "1.2.1", "type": "module", "scripts": { "dev": "vite", diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index 0aee68e..755cc86 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## 1.2.1 (2025-01-24) + +**Note:** Version bump only for package @universal-call-sdk/core + + + + + ## 1.1.15 (2025-01-17) **Note:** Version bump only for package @universal-call-sdk/core diff --git a/packages/core/package.json b/packages/core/package.json index ed5634f..1fe911e 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@universal-call-sdk/core", - "version": "1.2.0", + "version": "1.2.1", "type": "module", "scripts": { "dev": "vite", From 00a61850c4d978226ebf00a18b14fd80fc354619 Mon Sep 17 00:00:00 2001 From: vivek bhadola Date: Tue, 28 Jan 2025 20:17:22 +0530 Subject: [PATCH 7/7] NTP-27557 | package bump --- packages/adapter-ameyo/package.json | 4 ++-- packages/common/package.json | 2 +- packages/core/package.json | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/adapter-ameyo/package.json b/packages/adapter-ameyo/package.json index 02a701f..30fb3e8 100644 --- a/packages/adapter-ameyo/package.json +++ b/packages/adapter-ameyo/package.json @@ -1,6 +1,6 @@ { "name": "@universal-call-sdk/adapter-ameyo", - "version": "1.2.1", + "version": "2.0.0", "type": "module", "scripts": { "dev": "vite", @@ -9,7 +9,7 @@ "preview": "vite preview" }, "dependencies": { - "@universal-call-sdk/common": "^1.2.1", + "@universal-call-sdk/common": "^2.0.0", "uuid": "^11.0.3" }, "devDependencies": { diff --git a/packages/common/package.json b/packages/common/package.json index 4b2ea65..628e497 100644 --- a/packages/common/package.json +++ b/packages/common/package.json @@ -1,6 +1,6 @@ { "name": "@universal-call-sdk/common", - "version": "1.2.1", + "version": "2.0.0", "type": "module", "scripts": { "dev": "vite", diff --git a/packages/core/package.json b/packages/core/package.json index 1fe911e..5c6d467 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@universal-call-sdk/core", - "version": "1.2.1", + "version": "2.0.0", "type": "module", "scripts": { "dev": "vite",