@tarunzyraclavis/zyra-twilio-wrapper 1.0.8 → 1.0.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -154,15 +154,13 @@ var ZyraTwilioWrapper = class {
154
154
  async generateToken() {
155
155
  try {
156
156
  const payload = {
157
- json: {
158
- identity: this.identity,
159
- ttl: 3600,
160
- incomingAllow: true
161
- }
157
+ identity: this.identity,
158
+ ttl: 3600,
159
+ incomingAllow: true
162
160
  };
163
161
  console.log("Generating token with payload:", payload);
164
162
  const res = await this.axiosInstance.post(
165
- `https://nextdev.zyratalk.com/api/trpc/voipSdk.generateToken`,
163
+ `${this.serverUrl}/voipSdk.generateToken`,
166
164
  payload
167
165
  );
168
166
  const token = res?.data?.result?.data?.token;
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../utils/errorHandler.ts","../utils/helper.ts"],"sourcesContent":["import axios from \"axios\";\r\nimport { Device, Call } from \"@twilio/voice-sdk\";\r\nimport { handleAxiosError } from \"../utils/errorHandler\";\r\nimport {\r\n AddParticipantPayload,\r\n CallResponse,\r\n Config,\r\n GetConferencePayload,\r\n GetConferenceResult,\r\n GetParticipantsPayload,\r\n GetParticipantsResult,\r\n HoldAndAddResult,\r\n HoldCallPayload,\r\n HoldPayload,\r\n RemoveParticipantPayload,\r\n RemoveParticipantResult,\r\n ResumeCallPayload,\r\n TokenRequestPayload,\r\n TokenResponse,\r\n TwilioConference,\r\n TwilioConferenceParticipant,\r\n} from \"../types/interface\";\r\nimport { createSuccessResult, createErrorResult } from \"../utils/helper\";\r\n\r\nexport default class ZyraTwilioWrapper {\r\n private readonly serverUrl: string;\r\n private readonly identity: string;\r\n private readonly sdkToken: string;\r\n\r\n private device: Device | null = null;\r\n private activeConnection: Call | null = null;\r\n\r\n private isInitialized = false;\r\n private isInitializing = false;\r\n private isAuthenticated = false;\r\n\r\n private axiosInstance = axios.create();\r\n\r\n public activeCallSid: string | null = null;\r\n public conferenceName: string;\r\n public conferenceDetail: TwilioConference | null = null;\r\n public participants: TwilioConferenceParticipant[] = [];\r\n public waitUrl = \"https://api.twilio.com/cowbell.mp3\";\r\n\r\n // Optional event handlers\r\n public onReady?: () => void;\r\n public onIncoming?: (conn: Call) => void;\r\n public onDisconnect?: () => void;\r\n public onError?: (error: Error) => void;\r\n public onConnect?: (conn: Call) => void;\r\n public onMissedCall?: () => void;\r\n\r\n constructor(config: Config) {\r\n this.serverUrl = config.serverUrl;\r\n this.identity = config.identity;\r\n this.sdkToken = config.sdkToken;\r\n this.waitUrl = config.waitUrl || this.waitUrl;\r\n\r\n // safer conference name\r\n this.conferenceName = `conf_${this.identity}_${Date.now()}`;\r\n }\r\n\r\n /* ------------------------------------------------------------------ */\r\n /* AUTH */\r\n /* ------------------------------------------------------------------ */\r\n\r\n private setupAxiosAuth(token: string) {\r\n this.axiosInstance.defaults.headers.common[\"Authorization\"] = `Bearer ${token}`;\r\n }\r\n\r\n private ensureAuthenticated() {\r\n if (!this.isAuthenticated) {\r\n throw new Error(\"SDK not authenticated.\");\r\n }\r\n }\r\n\r\n public async verifySDKToken(): Promise<boolean> {\r\n if (!this.sdkToken) {\r\n throw new Error(\"SDK token not provided\");\r\n }\r\n\r\n try {\r\n const res = await this.axiosInstance.post(\r\n `${this.serverUrl}/voipSdk.verifySdkToken`,\r\n {},\r\n { headers: { Authorization: `Bearer ${this.sdkToken}` } }\r\n );\r\n\r\n console.log(\"verifySDKToken :\", res.data.result.data.verified);\r\n\r\n if (res?.data?.result?.data?.verified) {\r\n this.isAuthenticated = true;\r\n this.setupAxiosAuth(this.sdkToken);\r\n console.info(\"[verifySDKToken] SDK token verified\");\r\n return true;\r\n }\r\n\r\n throw new Error(\"Invalid SDK token\");\r\n } catch (error) {\r\n this.isAuthenticated = false;\r\n throw new Error(\"SDK authentication failed\");\r\n }\r\n }\r\n\r\n // /**\r\n // * Initialize the Twilio device and get token\r\n // */\r\n /**\r\n * Initialize the SDK. Can only be called once.\r\n * \r\n * @throws {Error} If already initialized or initialization fails\r\n * @returns Promise that resolves when initialization is complete\r\n */\r\n public async init(): Promise<void> {\r\n this.ensureAuthenticated();\r\n\r\n if (this.isInitialized) {\r\n throw new Error(\"SDK already initialized\");\r\n }\r\n\r\n if (this.isInitializing) {\r\n throw new Error(\"SDK initialization already in progress\");\r\n }\r\n\r\n this.isInitializing = true;\r\n\r\n try {\r\n const token = await this.generateToken();\r\n this.device = new Device(token, { logLevel: \"info\" });\r\n\r\n this.setupDeviceEventHandlers();\r\n await this.device.register();\r\n\r\n this.isInitialized = true;\r\n console.info(\"[init] Device registered\");\r\n } finally {\r\n this.isInitializing = false;\r\n }\r\n }\r\n // Private methods for get token for initialize the device\r\n\r\n private async generateToken(): Promise<string> {\r\n try {\r\n const payload: TokenRequestPayload = {\r\n json: {\r\n identity: this.identity,\r\n ttl: 3600,\r\n incomingAllow: true,\r\n },\r\n };\r\n\r\n console.log(\"Generating token with payload:\", payload);\r\n\r\n const res = await this.axiosInstance.post<TokenResponse>(\r\n `https://nextdev.zyratalk.com/api/trpc/voipSdk.generateToken`,\r\n payload\r\n ); // This will be changed to this.serverUrl in production\r\n\r\n const token = res?.data?.result?.data?.token;\r\n if (!token) throw new Error(\"Token missing\");\r\n\r\n return token;\r\n } catch (error) {\r\n handleAxiosError(error, this.onError, \"Token generation failed\");\r\n throw error;\r\n }\r\n }\r\n\r\n private setupDeviceEventHandlers() {\r\n if (!this.device) return;\r\n\r\n this.device.on(\"registered\", () => this.onReady?.());\r\n\r\n this.device.on(\"incoming\", (conn: Call) => {\r\n this.activeConnection = conn;\r\n\r\n conn.on(\"cancel\", () => {\r\n this.activeConnection = null;\r\n this.onMissedCall?.();\r\n });\r\n\r\n conn.on(\"reject\", () => (this.activeConnection = null));\r\n conn.on(\"accept\", () => console.info(\"[Device] Call accepted\"));\r\n\r\n this.onIncoming?.(conn);\r\n });\r\n\r\n this.device.on(\"connect\", (conn: Call) => {\r\n this.activeConnection = conn;\r\n this.onConnect?.(conn);\r\n });\r\n\r\n this.device.on(\"disconnect\", () => {\r\n this.activeConnection = null;\r\n this.onDisconnect?.();\r\n });\r\n\r\n this.device.on(\"error\", (error: Error) => {\r\n handleAxiosError(error, this.onError, \"Device error\");\r\n });\r\n\r\n this.device.on(\"tokenWillExpire\", async () => {\r\n const token = await this.generateToken();\r\n this.device?.updateToken(token);\r\n });\r\n }\r\n\r\n /* ------------------------------------------------------------------ */\r\n /* CALL CONTROL */\r\n /* ------------------------------------------------------------------ */\r\n\r\n /**\r\n * Make an outgoing call or add participant to an existing call\r\n */\r\n\r\n public async makeCall(to: string): Promise<CallResponse<Call>> {\r\n this.ensureAuthenticated();\r\n\r\n if (!this.device) return createErrorResult(\"Device not initialized\");\r\n if (!to) return createErrorResult(\"Destination required\");\r\n\r\n if (!this.activeConnection) {\r\n const conn = await this.device.connect({\r\n params: { To: to, conferenceName: this.conferenceName },\r\n });\r\n\r\n this.activeConnection = conn;\r\n\r\n conn.on(\"accept\", async () => {\r\n this.activeCallSid = conn.parameters?.CallSid ?? null;\r\n await this.getConferenceId();\r\n });\r\n\r\n return createSuccessResult(\"Call started\", conn);\r\n }\r\n\r\n await this.holdAndAddParticipant(\r\n this.activeConnection.parameters.CallSid,\r\n to\r\n );\r\n\r\n return createSuccessResult(\"Participant added\", this.activeConnection);\r\n }\r\n\r\n /**\r\n * Accept incoming call\r\n */\r\n\r\n public acceptCall(): CallResponse<Call> {\r\n if (!this.activeConnection) {\r\n return createErrorResult(\"No incoming call\");\r\n }\r\n\r\n this.activeConnection.accept();\r\n return createSuccessResult(\"Call accepted\", this.activeConnection);\r\n }\r\n\r\n /**\r\n * Hang up active call\r\n */\r\n\r\n public hangup(): CallResponse<null> {\r\n if (!this.device) return createErrorResult(\"Device not initialized\");\r\n\r\n this.device.disconnectAll();\r\n this.activeConnection = null;\r\n\r\n return createSuccessResult(\"Call ended\", null);\r\n }\r\n\r\n /**\r\n * Reject incoming call\r\n */\r\n\r\n public rejectCall(): CallResponse<null> {\r\n if (!this.activeConnection) return createErrorResult(\"No call to reject\");\r\n\r\n this.activeConnection.reject();\r\n this.activeConnection = null;\r\n\r\n return createSuccessResult(\"Call rejected\", null);\r\n }\r\n\r\n /**\r\n * Toggle mute/unmute\r\n */\r\n\r\n public toggleMute(mute: boolean): CallResponse<Call> {\r\n if (!this.activeConnection) return createErrorResult(\"No active call\");\r\n\r\n this.activeConnection.mute(mute);\r\n return createSuccessResult(`Mute ${mute}`, this.activeConnection);\r\n }\r\n\r\n /* ------------------------------------------------------------------ */\r\n /* CONFERENCE API */\r\n /* ------------------------------------------------------------------ */\r\n\r\n /**\r\n * Hold a call\r\n */\r\n public async hold(callSid: string) {\r\n this.ensureAuthenticated();\r\n\r\n const payload: HoldCallPayload = {\r\n callSid,\r\n conferenceName: this.conferenceName,\r\n waitUrl: this.waitUrl,\r\n };\r\n\r\n await this.axiosInstance.post(`${this.serverUrl}/outgoingCall.hold`, payload);\r\n return createSuccessResult(\"Call held\", this.activeConnection);\r\n }\r\n\r\n /**\r\n * Resume a held call\r\n */\r\n\r\n public async resume(callSid: string) {\r\n this.ensureAuthenticated();\r\n\r\n const payload: ResumeCallPayload = {\r\n callSid,\r\n conferenceName: this.conferenceName,\r\n };\r\n\r\n await this.axiosInstance.post(\r\n `${this.serverUrl}/outgoingCall.unhold`,\r\n payload\r\n );\r\n\r\n return createSuccessResult(\"Call resumed\", this.activeConnection);\r\n }\r\n\r\n /**\r\n * Hold active call and add a new participant\r\n */\r\n\r\n public async holdAndAddParticipant(callSid: string, number: string) {\r\n this.ensureAuthenticated();\r\n\r\n await this.hold(callSid);\r\n\r\n const payload: AddParticipantPayload = {\r\n conferenceName: this.conferenceName,\r\n newParticipantNo: number,\r\n };\r\n\r\n const res = await this.axiosInstance.post(\r\n `${this.serverUrl}/outgoingCall.addNewCallee`,\r\n payload\r\n );\r\n\r\n return createSuccessResult(\"Participant added\", res.data);\r\n }\r\n\r\n /**\r\n * Fetch conference details\r\n */\r\n\r\n public async getConferenceId() {\r\n this.ensureAuthenticated();\r\n\r\n const payload: GetConferencePayload = {\r\n conferenceName: this.conferenceName,\r\n };\r\n\r\n const res = await this.axiosInstance.post(\r\n `${this.serverUrl}/outgoingCall.getConferenceId`,\r\n payload\r\n );\r\n\r\n this.conferenceDetail = res?.data?.result?.data ?? null;\r\n return createSuccessResult(\"Conference fetched\", this.conferenceDetail);\r\n }\r\n /**\r\n * Get participants of a conference\r\n */\r\n public async getParticipants(conferenceSid: string) {\r\n this.ensureAuthenticated();\r\n\r\n const payload: GetParticipantsPayload = { conferenceSid };\r\n\r\n const res = await this.axiosInstance.post(\r\n `${this.serverUrl}/outgoingCall.getParticipants`,\r\n payload\r\n );\r\n\r\n this.participants = res?.data?.result?.data?.participants ?? [];\r\n return createSuccessResult(\"Participants fetched\", this.participants);\r\n }\r\n\r\n /**\r\n * Remove a participant from a conference\r\n */ public async removeParticipant(conferenceSid: string, callSid: string) {\r\n this.ensureAuthenticated();\r\n\r\n const payload: RemoveParticipantPayload = { conferenceSid, callSid };\r\n\r\n const res = await this.axiosInstance.post(\r\n `${this.serverUrl}/outgoingCall.removeParticipant`,\r\n payload\r\n );\r\n\r\n return createSuccessResult(\"Participant removed\", res.data);\r\n }\r\n\r\n /* ------------------------------------------------------------------ */\r\n /* CLEANUP */\r\n /* ------------------------------------------------------------------ */\r\n\r\n public destroy() {\r\n if (this.device) {\r\n this.device.removeAllListeners();\r\n this.device.destroy();\r\n this.device = null;\r\n }\r\n\r\n this.activeConnection = null;\r\n this.isInitialized = false;\r\n this.isInitializing = false;\r\n this.isAuthenticated = false;\r\n }\r\n}\r\n","import axios, { AxiosError } from \"axios\";\r\n\r\n/**\r\n * Handles errors from Axios requests in a consistent way.\r\n * \r\n * @param error - The error thrown by Axios or any other source.\r\n * @param onErrorCallback - Optional callback to handle the error externally.\r\n * @param contextMessage - Optional custom message to provide context for the error.\r\n */\r\nexport function handleAxiosError(\r\n error: unknown,\r\n onErrorCallback?: (error: Error) => void,\r\n contextMessage = \"Request failed\"\r\n): void {\r\n let finalError: Error;\r\n\r\n if (axios.isAxiosError(error)) {\r\n const axiosError = error as AxiosError;\r\n const status = axiosError.response?.status ?? \"Unknown\";\r\n const statusText = axiosError.response?.statusText ?? \"No status text\";\r\n const responseData = axiosError.response?.data\r\n ? JSON.stringify(axiosError.response.data)\r\n : \"No response data\";\r\n\r\n finalError = new Error(\r\n `[AxiosError] ${contextMessage}: ${status} ${statusText} | Response: ${responseData}`\r\n );\r\n } else if (error instanceof Error) {\r\n finalError = new Error(`[Error] ${contextMessage}: ${error.message}`);\r\n } else {\r\n finalError = new Error(`[Unknown Error] ${contextMessage}: ${String(error)}`);\r\n }\r\n\r\n console.error(finalError); // Optional: log for debugging\r\n onErrorCallback?.(finalError);\r\n}\r\n\r\n","// src/utils/helper.ts\r\n\r\nimport type { CallResponse } from \"../types/interface\"; // adjust path if needed\r\n\r\n/**\r\n * Helper to create success result\r\n */\r\nexport function createSuccessResult<T>(message: string, data: T): CallResponse<T> {\r\n return { success : true, message : message, data };\r\n}\r\n\r\n/**\r\n * Helper to create error result\r\n */\r\nexport function createErrorResult<T = void>(error: Error | string): CallResponse<T> {\r\n return {\r\n success: false,\r\n error: error instanceof Error ? error : new Error(error),\r\n };\r\n}"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAAA,gBAAkB;AAClB,uBAA6B;;;ACD7B,mBAAkC;AAS3B,SAAS,iBACd,OACA,iBACA,iBAAiB,kBACX;AACN,MAAI;AAEJ,MAAI,aAAAC,QAAM,aAAa,KAAK,GAAG;AAC7B,UAAM,aAAa;AACnB,UAAM,SAAS,WAAW,UAAU,UAAU;AAC9C,UAAM,aAAa,WAAW,UAAU,cAAc;AACtD,UAAM,eAAe,WAAW,UAAU,OACtC,KAAK,UAAU,WAAW,SAAS,IAAI,IACvC;AAEJ,iBAAa,IAAI;AAAA,MACf,gBAAgB,cAAc,KAAK,MAAM,IAAI,UAAU,gBAAgB,YAAY;AAAA,IACrF;AAAA,EACF,WAAW,iBAAiB,OAAO;AACjC,iBAAa,IAAI,MAAM,WAAW,cAAc,KAAK,MAAM,OAAO,EAAE;AAAA,EACtE,OAAO;AACL,iBAAa,IAAI,MAAM,mBAAmB,cAAc,KAAK,OAAO,KAAK,CAAC,EAAE;AAAA,EAC9E;AAEA,UAAQ,MAAM,UAAU;AACxB,oBAAkB,UAAU;AAC9B;;;AC5BO,SAAS,oBAAuB,SAAiB,MAA0B;AAChF,SAAO,EAAE,SAAU,MAAM,SAAmB,KAAK;AACnD;AAKO,SAAS,kBAA4B,OAAwC;AAClF,SAAO;AAAA,IACL,SAAS;AAAA,IACT,OAAO,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,KAAK;AAAA,EACzD;AACF;;;AFKA,IAAqB,oBAArB,MAAuC;AAAA,EA4BnC,YAAY,QAAgB;AAvB5B,SAAQ,SAAwB;AAChC,SAAQ,mBAAgC;AAExC,SAAQ,gBAAgB;AACxB,SAAQ,iBAAiB;AACzB,SAAQ,kBAAkB;AAE1B,SAAQ,gBAAgB,cAAAC,QAAM,OAAO;AAErC,SAAO,gBAA+B;AAEtC,SAAO,mBAA4C;AACnD,SAAO,eAA8C,CAAC;AACtD,SAAO,UAAU;AAWb,SAAK,YAAY,OAAO;AACxB,SAAK,WAAW,OAAO;AACvB,SAAK,WAAW,OAAO;AACvB,SAAK,UAAU,OAAO,WAAW,KAAK;AAGtC,SAAK,iBAAiB,QAAQ,KAAK,QAAQ,IAAI,KAAK,IAAI,CAAC;AAAA,EAC7D;AAAA;AAAA;AAAA;AAAA,EAMQ,eAAe,OAAe;AAClC,SAAK,cAAc,SAAS,QAAQ,OAAO,eAAe,IAAI,UAAU,KAAK;AAAA,EACjF;AAAA,EAEQ,sBAAsB;AAC1B,QAAI,CAAC,KAAK,iBAAiB;AACvB,YAAM,IAAI,MAAM,wBAAwB;AAAA,IAC5C;AAAA,EACJ;AAAA,EAEA,MAAa,iBAAmC;AAC5C,QAAI,CAAC,KAAK,UAAU;AAChB,YAAM,IAAI,MAAM,wBAAwB;AAAA,IAC5C;AAEA,QAAI;AACA,YAAM,MAAM,MAAM,KAAK,cAAc;AAAA,QACjC,GAAG,KAAK,SAAS;AAAA,QACjB,CAAC;AAAA,QACD,EAAE,SAAS,EAAE,eAAe,UAAU,KAAK,QAAQ,GAAG,EAAE;AAAA,MAC5D;AAEA,cAAQ,IAAI,oBAAoB,IAAI,KAAK,OAAO,KAAK,QAAQ;AAE7D,UAAI,KAAK,MAAM,QAAQ,MAAM,UAAU;AACnC,aAAK,kBAAkB;AACvB,aAAK,eAAe,KAAK,QAAQ;AACjC,gBAAQ,KAAK,qCAAqC;AAClD,eAAO;AAAA,MACX;AAEA,YAAM,IAAI,MAAM,mBAAmB;AAAA,IACvC,SAAS,OAAO;AACZ,WAAK,kBAAkB;AACvB,YAAM,IAAI,MAAM,2BAA2B;AAAA,IAC/C;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAa,OAAsB;AAC/B,SAAK,oBAAoB;AAEzB,QAAI,KAAK,eAAe;AACpB,YAAM,IAAI,MAAM,yBAAyB;AAAA,IAC7C;AAEA,QAAI,KAAK,gBAAgB;AACrB,YAAM,IAAI,MAAM,wCAAwC;AAAA,IAC5D;AAEA,SAAK,iBAAiB;AAEtB,QAAI;AACA,YAAM,QAAQ,MAAM,KAAK,cAAc;AACvC,WAAK,SAAS,IAAI,wBAAO,OAAO,EAAE,UAAU,OAAO,CAAC;AAEpD,WAAK,yBAAyB;AAC9B,YAAM,KAAK,OAAO,SAAS;AAE3B,WAAK,gBAAgB;AACrB,cAAQ,KAAK,0BAA0B;AAAA,IAC3C,UAAE;AACE,WAAK,iBAAiB;AAAA,IAC1B;AAAA,EACJ;AAAA;AAAA,EAGA,MAAc,gBAAiC;AAC3C,QAAI;AACA,YAAM,UAA+B;AAAA,QACjC,MAAM;AAAA,UACF,UAAU,KAAK;AAAA,UACf,KAAK;AAAA,UACL,eAAe;AAAA,QACnB;AAAA,MACJ;AAEA,cAAQ,IAAI,kCAAkC,OAAO;AAErD,YAAM,MAAM,MAAM,KAAK,cAAc;AAAA,QACjC;AAAA,QACA;AAAA,MACJ;AAEA,YAAM,QAAQ,KAAK,MAAM,QAAQ,MAAM;AACvC,UAAI,CAAC,MAAO,OAAM,IAAI,MAAM,eAAe;AAE3C,aAAO;AAAA,IACX,SAAS,OAAO;AACZ,uBAAiB,OAAO,KAAK,SAAS,yBAAyB;AAC/D,YAAM;AAAA,IACV;AAAA,EACJ;AAAA,EAEQ,2BAA2B;AAC/B,QAAI,CAAC,KAAK,OAAQ;AAElB,SAAK,OAAO,GAAG,cAAc,MAAM,KAAK,UAAU,CAAC;AAEnD,SAAK,OAAO,GAAG,YAAY,CAAC,SAAe;AACvC,WAAK,mBAAmB;AAExB,WAAK,GAAG,UAAU,MAAM;AACpB,aAAK,mBAAmB;AACxB,aAAK,eAAe;AAAA,MACxB,CAAC;AAED,WAAK,GAAG,UAAU,MAAO,KAAK,mBAAmB,IAAK;AACtD,WAAK,GAAG,UAAU,MAAM,QAAQ,KAAK,wBAAwB,CAAC;AAE9D,WAAK,aAAa,IAAI;AAAA,IAC1B,CAAC;AAED,SAAK,OAAO,GAAG,WAAW,CAAC,SAAe;AACtC,WAAK,mBAAmB;AACxB,WAAK,YAAY,IAAI;AAAA,IACzB,CAAC;AAED,SAAK,OAAO,GAAG,cAAc,MAAM;AAC/B,WAAK,mBAAmB;AACxB,WAAK,eAAe;AAAA,IACxB,CAAC;AAED,SAAK,OAAO,GAAG,SAAS,CAAC,UAAiB;AACtC,uBAAiB,OAAO,KAAK,SAAS,cAAc;AAAA,IACxD,CAAC;AAED,SAAK,OAAO,GAAG,mBAAmB,YAAY;AAC1C,YAAM,QAAQ,MAAM,KAAK,cAAc;AACvC,WAAK,QAAQ,YAAY,KAAK;AAAA,IAClC,CAAC;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAa,SAAS,IAAyC;AAC3D,SAAK,oBAAoB;AAEzB,QAAI,CAAC,KAAK,OAAQ,QAAO,kBAAkB,wBAAwB;AACnE,QAAI,CAAC,GAAI,QAAO,kBAAkB,sBAAsB;AAExD,QAAI,CAAC,KAAK,kBAAkB;AACxB,YAAM,OAAO,MAAM,KAAK,OAAO,QAAQ;AAAA,QACnC,QAAQ,EAAE,IAAI,IAAI,gBAAgB,KAAK,eAAe;AAAA,MAC1D,CAAC;AAED,WAAK,mBAAmB;AAExB,WAAK,GAAG,UAAU,YAAY;AAC1B,aAAK,gBAAgB,KAAK,YAAY,WAAW;AACjD,cAAM,KAAK,gBAAgB;AAAA,MAC/B,CAAC;AAED,aAAO,oBAAoB,gBAAgB,IAAI;AAAA,IACnD;AAEA,UAAM,KAAK;AAAA,MACP,KAAK,iBAAiB,WAAW;AAAA,MACjC;AAAA,IACJ;AAEA,WAAO,oBAAoB,qBAAqB,KAAK,gBAAgB;AAAA,EACzE;AAAA;AAAA;AAAA;AAAA,EAMO,aAAiC;AACpC,QAAI,CAAC,KAAK,kBAAkB;AACxB,aAAO,kBAAkB,kBAAkB;AAAA,IAC/C;AAEA,SAAK,iBAAiB,OAAO;AAC7B,WAAO,oBAAoB,iBAAiB,KAAK,gBAAgB;AAAA,EACrE;AAAA;AAAA;AAAA;AAAA,EAMO,SAA6B;AAChC,QAAI,CAAC,KAAK,OAAQ,QAAO,kBAAkB,wBAAwB;AAEnE,SAAK,OAAO,cAAc;AAC1B,SAAK,mBAAmB;AAExB,WAAO,oBAAoB,cAAc,IAAI;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA,EAMO,aAAiC;AACpC,QAAI,CAAC,KAAK,iBAAkB,QAAO,kBAAkB,mBAAmB;AAExE,SAAK,iBAAiB,OAAO;AAC7B,SAAK,mBAAmB;AAExB,WAAO,oBAAoB,iBAAiB,IAAI;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA,EAMO,WAAW,MAAmC;AACjD,QAAI,CAAC,KAAK,iBAAkB,QAAO,kBAAkB,gBAAgB;AAErE,SAAK,iBAAiB,KAAK,IAAI;AAC/B,WAAO,oBAAoB,QAAQ,IAAI,IAAI,KAAK,gBAAgB;AAAA,EACpE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAa,KAAK,SAAiB;AAC/B,SAAK,oBAAoB;AAEzB,UAAM,UAA2B;AAAA,MAC7B;AAAA,MACA,gBAAgB,KAAK;AAAA,MACrB,SAAS,KAAK;AAAA,IAClB;AAEA,UAAM,KAAK,cAAc,KAAK,GAAG,KAAK,SAAS,sBAAsB,OAAO;AAC5E,WAAO,oBAAoB,aAAa,KAAK,gBAAgB;AAAA,EACjE;AAAA;AAAA;AAAA;AAAA,EAMA,MAAa,OAAO,SAAiB;AACjC,SAAK,oBAAoB;AAEzB,UAAM,UAA6B;AAAA,MAC/B;AAAA,MACA,gBAAgB,KAAK;AAAA,IACzB;AAEA,UAAM,KAAK,cAAc;AAAA,MACrB,GAAG,KAAK,SAAS;AAAA,MACjB;AAAA,IACJ;AAEA,WAAO,oBAAoB,gBAAgB,KAAK,gBAAgB;AAAA,EACpE;AAAA;AAAA;AAAA;AAAA,EAMA,MAAa,sBAAsB,SAAiB,QAAgB;AAChE,SAAK,oBAAoB;AAEzB,UAAM,KAAK,KAAK,OAAO;AAEvB,UAAM,UAAiC;AAAA,MACnC,gBAAgB,KAAK;AAAA,MACrB,kBAAkB;AAAA,IACtB;AAEA,UAAM,MAAM,MAAM,KAAK,cAAc;AAAA,MACjC,GAAG,KAAK,SAAS;AAAA,MACjB;AAAA,IACJ;AAEA,WAAO,oBAAoB,qBAAqB,IAAI,IAAI;AAAA,EAC5D;AAAA;AAAA;AAAA;AAAA,EAMA,MAAa,kBAAkB;AAC3B,SAAK,oBAAoB;AAEzB,UAAM,UAAgC;AAAA,MAClC,gBAAgB,KAAK;AAAA,IACzB;AAEA,UAAM,MAAM,MAAM,KAAK,cAAc;AAAA,MACjC,GAAG,KAAK,SAAS;AAAA,MACjB;AAAA,IACJ;AAEA,SAAK,mBAAmB,KAAK,MAAM,QAAQ,QAAQ;AACnD,WAAO,oBAAoB,sBAAsB,KAAK,gBAAgB;AAAA,EAC1E;AAAA;AAAA;AAAA;AAAA,EAIA,MAAa,gBAAgB,eAAuB;AAChD,SAAK,oBAAoB;AAEzB,UAAM,UAAkC,EAAE,cAAc;AAExD,UAAM,MAAM,MAAM,KAAK,cAAc;AAAA,MACjC,GAAG,KAAK,SAAS;AAAA,MACjB;AAAA,IACJ;AAEA,SAAK,eAAe,KAAK,MAAM,QAAQ,MAAM,gBAAgB,CAAC;AAC9D,WAAO,oBAAoB,wBAAwB,KAAK,YAAY;AAAA,EACxE;AAAA;AAAA;AAAA;AAAA,EAIK,MAAa,kBAAkB,eAAuB,SAAiB;AACxE,SAAK,oBAAoB;AAEzB,UAAM,UAAoC,EAAE,eAAe,QAAQ;AAEnE,UAAM,MAAM,MAAM,KAAK,cAAc;AAAA,MACjC,GAAG,KAAK,SAAS;AAAA,MACjB;AAAA,IACJ;AAEA,WAAO,oBAAoB,uBAAuB,IAAI,IAAI;AAAA,EAC9D;AAAA;AAAA;AAAA;AAAA,EAMO,UAAU;AACb,QAAI,KAAK,QAAQ;AACb,WAAK,OAAO,mBAAmB;AAC/B,WAAK,OAAO,QAAQ;AACpB,WAAK,SAAS;AAAA,IAClB;AAEA,SAAK,mBAAmB;AACxB,SAAK,gBAAgB;AACrB,SAAK,iBAAiB;AACtB,SAAK,kBAAkB;AAAA,EAC3B;AACJ;","names":["import_axios","axios","axios"]}
1
+ {"version":3,"sources":["../src/index.ts","../utils/errorHandler.ts","../utils/helper.ts"],"sourcesContent":["import axios from \"axios\";\r\nimport { Device, Call } from \"@twilio/voice-sdk\";\r\nimport { handleAxiosError } from \"../utils/errorHandler\";\r\nimport {\r\n AddParticipantPayload,\r\n CallResponse,\r\n Config,\r\n GetConferencePayload,\r\n GetConferenceResult,\r\n GetParticipantsPayload,\r\n GetParticipantsResult,\r\n HoldAndAddResult,\r\n HoldCallPayload,\r\n HoldPayload,\r\n RemoveParticipantPayload,\r\n RemoveParticipantResult,\r\n ResumeCallPayload,\r\n TokenRequestPayload,\r\n TokenResponse,\r\n TwilioConference,\r\n TwilioConferenceParticipant,\r\n} from \"../types/interface\";\r\nimport { createSuccessResult, createErrorResult } from \"../utils/helper\";\r\n\r\nexport default class ZyraTwilioWrapper {\r\n private readonly serverUrl: string;\r\n private readonly identity: string;\r\n private readonly sdkToken: string;\r\n\r\n private device: Device | null = null;\r\n private activeConnection: Call | null = null;\r\n\r\n private isInitialized = false;\r\n private isInitializing = false;\r\n private isAuthenticated = false;\r\n\r\n private axiosInstance = axios.create();\r\n\r\n public activeCallSid: string | null = null;\r\n public conferenceName: string;\r\n public conferenceDetail: TwilioConference | null = null;\r\n public participants: TwilioConferenceParticipant[] = [];\r\n public waitUrl = \"https://api.twilio.com/cowbell.mp3\";\r\n\r\n // Optional event handlers\r\n public onReady?: () => void;\r\n public onIncoming?: (conn: Call) => void;\r\n public onDisconnect?: () => void;\r\n public onError?: (error: Error) => void;\r\n public onConnect?: (conn: Call) => void;\r\n public onMissedCall?: () => void;\r\n\r\n constructor(config: Config) {\r\n this.serverUrl = config.serverUrl;\r\n this.identity = config.identity;\r\n this.sdkToken = config.sdkToken;\r\n this.waitUrl = config.waitUrl || this.waitUrl;\r\n\r\n // safer conference name\r\n this.conferenceName = `conf_${this.identity}_${Date.now()}`;\r\n }\r\n\r\n /* ------------------------------------------------------------------ */\r\n /* AUTH */\r\n /* ------------------------------------------------------------------ */\r\n\r\n private setupAxiosAuth(token: string) {\r\n this.axiosInstance.defaults.headers.common[\"Authorization\"] = `Bearer ${token}`;\r\n }\r\n\r\n private ensureAuthenticated() {\r\n if (!this.isAuthenticated) {\r\n throw new Error(\"SDK not authenticated.\");\r\n }\r\n }\r\n\r\n public async verifySDKToken(): Promise<boolean> {\r\n if (!this.sdkToken) {\r\n throw new Error(\"SDK token not provided\");\r\n }\r\n\r\n try {\r\n const res = await this.axiosInstance.post(\r\n `${this.serverUrl}/voipSdk.verifySdkToken`,\r\n {},\r\n { headers: { Authorization: `Bearer ${this.sdkToken}` } }\r\n );\r\n\r\n console.log(\"verifySDKToken :\", res.data.result.data.verified);\r\n\r\n if (res?.data?.result?.data?.verified) {\r\n this.isAuthenticated = true;\r\n this.setupAxiosAuth(this.sdkToken);\r\n console.info(\"[verifySDKToken] SDK token verified\");\r\n return true;\r\n }\r\n\r\n throw new Error(\"Invalid SDK token\");\r\n } catch (error) {\r\n this.isAuthenticated = false;\r\n throw new Error(\"SDK authentication failed\");\r\n }\r\n }\r\n\r\n // /**\r\n // * Initialize the Twilio device and get token\r\n // */\r\n /**\r\n * Initialize the SDK. Can only be called once.\r\n * \r\n * @throws {Error} If already initialized or initialization fails\r\n * @returns Promise that resolves when initialization is complete\r\n */\r\n public async init(): Promise<void> {\r\n this.ensureAuthenticated();\r\n\r\n if (this.isInitialized) {\r\n throw new Error(\"SDK already initialized\");\r\n }\r\n\r\n if (this.isInitializing) {\r\n throw new Error(\"SDK initialization already in progress\");\r\n }\r\n\r\n this.isInitializing = true;\r\n\r\n try {\r\n const token = await this.generateToken();\r\n this.device = new Device(token, { logLevel: \"info\" });\r\n\r\n this.setupDeviceEventHandlers();\r\n await this.device.register();\r\n\r\n this.isInitialized = true;\r\n console.info(\"[init] Device registered\");\r\n } finally {\r\n this.isInitializing = false;\r\n }\r\n }\r\n // Private methods for get token for initialize the device\r\n\r\n private async generateToken(): Promise<string> {\r\n try {\r\n const payload: TokenRequestPayload = {\r\n identity: this.identity,\r\n ttl: 3600,\r\n incomingAllow: true,\r\n };\r\n\r\n console.log(\"Generating token with payload:\", payload);\r\n\r\n const res = await this.axiosInstance.post<TokenResponse>(\r\n `${this.serverUrl}/voipSdk.generateToken`,\r\n payload\r\n ); // This will be changed to this.serverUrl in production\r\n\r\n const token = res?.data?.result?.data?.token;\r\n if (!token) throw new Error(\"Token missing\");\r\n\r\n return token;\r\n } catch (error) {\r\n handleAxiosError(error, this.onError, \"Token generation failed\");\r\n throw error;\r\n }\r\n }\r\n\r\n private setupDeviceEventHandlers() {\r\n if (!this.device) return;\r\n\r\n this.device.on(\"registered\", () => this.onReady?.());\r\n\r\n this.device.on(\"incoming\", (conn: Call) => {\r\n this.activeConnection = conn;\r\n\r\n conn.on(\"cancel\", () => {\r\n this.activeConnection = null;\r\n this.onMissedCall?.();\r\n });\r\n\r\n conn.on(\"reject\", () => (this.activeConnection = null));\r\n conn.on(\"accept\", () => console.info(\"[Device] Call accepted\"));\r\n\r\n this.onIncoming?.(conn);\r\n });\r\n\r\n this.device.on(\"connect\", (conn: Call) => {\r\n this.activeConnection = conn;\r\n this.onConnect?.(conn);\r\n });\r\n\r\n this.device.on(\"disconnect\", () => {\r\n this.activeConnection = null;\r\n this.onDisconnect?.();\r\n });\r\n\r\n this.device.on(\"error\", (error: Error) => {\r\n handleAxiosError(error, this.onError, \"Device error\");\r\n });\r\n\r\n this.device.on(\"tokenWillExpire\", async () => {\r\n const token = await this.generateToken();\r\n this.device?.updateToken(token);\r\n });\r\n }\r\n\r\n /* ------------------------------------------------------------------ */\r\n /* CALL CONTROL */\r\n /* ------------------------------------------------------------------ */\r\n\r\n /**\r\n * Make an outgoing call or add participant to an existing call\r\n */\r\n\r\n public async makeCall(to: string): Promise<CallResponse<Call>> {\r\n this.ensureAuthenticated();\r\n\r\n if (!this.device) return createErrorResult(\"Device not initialized\");\r\n if (!to) return createErrorResult(\"Destination required\");\r\n\r\n if (!this.activeConnection) {\r\n const conn = await this.device.connect({\r\n params: { To: to, conferenceName: this.conferenceName },\r\n });\r\n\r\n this.activeConnection = conn;\r\n\r\n conn.on(\"accept\", async () => {\r\n this.activeCallSid = conn.parameters?.CallSid ?? null;\r\n await this.getConferenceId();\r\n });\r\n\r\n return createSuccessResult(\"Call started\", conn);\r\n }\r\n\r\n await this.holdAndAddParticipant(\r\n this.activeConnection.parameters.CallSid,\r\n to\r\n );\r\n\r\n return createSuccessResult(\"Participant added\", this.activeConnection);\r\n }\r\n\r\n /**\r\n * Accept incoming call\r\n */\r\n\r\n public acceptCall(): CallResponse<Call> {\r\n if (!this.activeConnection) {\r\n return createErrorResult(\"No incoming call\");\r\n }\r\n\r\n this.activeConnection.accept();\r\n return createSuccessResult(\"Call accepted\", this.activeConnection);\r\n }\r\n\r\n /**\r\n * Hang up active call\r\n */\r\n\r\n public hangup(): CallResponse<null> {\r\n if (!this.device) return createErrorResult(\"Device not initialized\");\r\n\r\n this.device.disconnectAll();\r\n this.activeConnection = null;\r\n\r\n return createSuccessResult(\"Call ended\", null);\r\n }\r\n\r\n /**\r\n * Reject incoming call\r\n */\r\n\r\n public rejectCall(): CallResponse<null> {\r\n if (!this.activeConnection) return createErrorResult(\"No call to reject\");\r\n\r\n this.activeConnection.reject();\r\n this.activeConnection = null;\r\n\r\n return createSuccessResult(\"Call rejected\", null);\r\n }\r\n\r\n /**\r\n * Toggle mute/unmute\r\n */\r\n\r\n public toggleMute(mute: boolean): CallResponse<Call> {\r\n if (!this.activeConnection) return createErrorResult(\"No active call\");\r\n\r\n this.activeConnection.mute(mute);\r\n return createSuccessResult(`Mute ${mute}`, this.activeConnection);\r\n }\r\n\r\n /* ------------------------------------------------------------------ */\r\n /* CONFERENCE API */\r\n /* ------------------------------------------------------------------ */\r\n\r\n /**\r\n * Hold a call\r\n */\r\n public async hold(callSid: string) {\r\n this.ensureAuthenticated();\r\n\r\n const payload: HoldCallPayload = {\r\n callSid,\r\n conferenceName: this.conferenceName,\r\n waitUrl: this.waitUrl,\r\n };\r\n\r\n await this.axiosInstance.post(`${this.serverUrl}/outgoingCall.hold`, payload);\r\n return createSuccessResult(\"Call held\", this.activeConnection);\r\n }\r\n\r\n /**\r\n * Resume a held call\r\n */\r\n\r\n public async resume(callSid: string) {\r\n this.ensureAuthenticated();\r\n\r\n const payload: ResumeCallPayload = {\r\n callSid,\r\n conferenceName: this.conferenceName,\r\n };\r\n\r\n await this.axiosInstance.post(\r\n `${this.serverUrl}/outgoingCall.unhold`,\r\n payload\r\n );\r\n\r\n return createSuccessResult(\"Call resumed\", this.activeConnection);\r\n }\r\n\r\n /**\r\n * Hold active call and add a new participant\r\n */\r\n\r\n public async holdAndAddParticipant(callSid: string, number: string) {\r\n this.ensureAuthenticated();\r\n\r\n await this.hold(callSid);\r\n\r\n const payload: AddParticipantPayload = {\r\n conferenceName: this.conferenceName,\r\n newParticipantNo: number,\r\n };\r\n\r\n const res = await this.axiosInstance.post(\r\n `${this.serverUrl}/outgoingCall.addNewCallee`,\r\n payload\r\n );\r\n\r\n return createSuccessResult(\"Participant added\", res.data);\r\n }\r\n\r\n /**\r\n * Fetch conference details\r\n */\r\n\r\n public async getConferenceId() {\r\n this.ensureAuthenticated();\r\n\r\n const payload: GetConferencePayload = {\r\n conferenceName: this.conferenceName,\r\n };\r\n\r\n const res = await this.axiosInstance.post(\r\n `${this.serverUrl}/outgoingCall.getConferenceId`,\r\n payload\r\n );\r\n\r\n this.conferenceDetail = res?.data?.result?.data ?? null;\r\n return createSuccessResult(\"Conference fetched\", this.conferenceDetail);\r\n }\r\n /**\r\n * Get participants of a conference\r\n */\r\n public async getParticipants(conferenceSid: string) {\r\n this.ensureAuthenticated();\r\n\r\n const payload: GetParticipantsPayload = { conferenceSid };\r\n\r\n const res = await this.axiosInstance.post(\r\n `${this.serverUrl}/outgoingCall.getParticipants`,\r\n payload\r\n );\r\n\r\n this.participants = res?.data?.result?.data?.participants ?? [];\r\n return createSuccessResult(\"Participants fetched\", this.participants);\r\n }\r\n\r\n /**\r\n * Remove a participant from a conference\r\n */ public async removeParticipant(conferenceSid: string, callSid: string) {\r\n this.ensureAuthenticated();\r\n\r\n const payload: RemoveParticipantPayload = { conferenceSid, callSid };\r\n\r\n const res = await this.axiosInstance.post(\r\n `${this.serverUrl}/outgoingCall.removeParticipant`,\r\n payload\r\n );\r\n\r\n return createSuccessResult(\"Participant removed\", res.data);\r\n }\r\n\r\n /* ------------------------------------------------------------------ */\r\n /* CLEANUP */\r\n /* ------------------------------------------------------------------ */\r\n\r\n public destroy() {\r\n if (this.device) {\r\n this.device.removeAllListeners();\r\n this.device.destroy();\r\n this.device = null;\r\n }\r\n\r\n this.activeConnection = null;\r\n this.isInitialized = false;\r\n this.isInitializing = false;\r\n this.isAuthenticated = false;\r\n }\r\n}\r\n","import axios, { AxiosError } from \"axios\";\r\n\r\n/**\r\n * Handles errors from Axios requests in a consistent way.\r\n * \r\n * @param error - The error thrown by Axios or any other source.\r\n * @param onErrorCallback - Optional callback to handle the error externally.\r\n * @param contextMessage - Optional custom message to provide context for the error.\r\n */\r\nexport function handleAxiosError(\r\n error: unknown,\r\n onErrorCallback?: (error: Error) => void,\r\n contextMessage = \"Request failed\"\r\n): void {\r\n let finalError: Error;\r\n\r\n if (axios.isAxiosError(error)) {\r\n const axiosError = error as AxiosError;\r\n const status = axiosError.response?.status ?? \"Unknown\";\r\n const statusText = axiosError.response?.statusText ?? \"No status text\";\r\n const responseData = axiosError.response?.data\r\n ? JSON.stringify(axiosError.response.data)\r\n : \"No response data\";\r\n\r\n finalError = new Error(\r\n `[AxiosError] ${contextMessage}: ${status} ${statusText} | Response: ${responseData}`\r\n );\r\n } else if (error instanceof Error) {\r\n finalError = new Error(`[Error] ${contextMessage}: ${error.message}`);\r\n } else {\r\n finalError = new Error(`[Unknown Error] ${contextMessage}: ${String(error)}`);\r\n }\r\n\r\n console.error(finalError); // Optional: log for debugging\r\n onErrorCallback?.(finalError);\r\n}\r\n\r\n","// src/utils/helper.ts\r\n\r\nimport type { CallResponse } from \"../types/interface\"; // adjust path if needed\r\n\r\n/**\r\n * Helper to create success result\r\n */\r\nexport function createSuccessResult<T>(message: string, data: T): CallResponse<T> {\r\n return { success : true, message : message, data };\r\n}\r\n\r\n/**\r\n * Helper to create error result\r\n */\r\nexport function createErrorResult<T = void>(error: Error | string): CallResponse<T> {\r\n return {\r\n success: false,\r\n error: error instanceof Error ? error : new Error(error),\r\n };\r\n}"],"mappings":"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","names":["import_axios","axios","axios"]}
package/dist/index.mjs CHANGED
@@ -120,15 +120,13 @@ var ZyraTwilioWrapper = class {
120
120
  async generateToken() {
121
121
  try {
122
122
  const payload = {
123
- json: {
124
- identity: this.identity,
125
- ttl: 3600,
126
- incomingAllow: true
127
- }
123
+ identity: this.identity,
124
+ ttl: 3600,
125
+ incomingAllow: true
128
126
  };
129
127
  console.log("Generating token with payload:", payload);
130
128
  const res = await this.axiosInstance.post(
131
- `https://nextdev.zyratalk.com/api/trpc/voipSdk.generateToken`,
129
+ `${this.serverUrl}/voipSdk.generateToken`,
132
130
  payload
133
131
  );
134
132
  const token = res?.data?.result?.data?.token;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../utils/errorHandler.ts","../utils/helper.ts"],"sourcesContent":["import axios from \"axios\";\r\nimport { Device, Call } from \"@twilio/voice-sdk\";\r\nimport { handleAxiosError } from \"../utils/errorHandler\";\r\nimport {\r\n AddParticipantPayload,\r\n CallResponse,\r\n Config,\r\n GetConferencePayload,\r\n GetConferenceResult,\r\n GetParticipantsPayload,\r\n GetParticipantsResult,\r\n HoldAndAddResult,\r\n HoldCallPayload,\r\n HoldPayload,\r\n RemoveParticipantPayload,\r\n RemoveParticipantResult,\r\n ResumeCallPayload,\r\n TokenRequestPayload,\r\n TokenResponse,\r\n TwilioConference,\r\n TwilioConferenceParticipant,\r\n} from \"../types/interface\";\r\nimport { createSuccessResult, createErrorResult } from \"../utils/helper\";\r\n\r\nexport default class ZyraTwilioWrapper {\r\n private readonly serverUrl: string;\r\n private readonly identity: string;\r\n private readonly sdkToken: string;\r\n\r\n private device: Device | null = null;\r\n private activeConnection: Call | null = null;\r\n\r\n private isInitialized = false;\r\n private isInitializing = false;\r\n private isAuthenticated = false;\r\n\r\n private axiosInstance = axios.create();\r\n\r\n public activeCallSid: string | null = null;\r\n public conferenceName: string;\r\n public conferenceDetail: TwilioConference | null = null;\r\n public participants: TwilioConferenceParticipant[] = [];\r\n public waitUrl = \"https://api.twilio.com/cowbell.mp3\";\r\n\r\n // Optional event handlers\r\n public onReady?: () => void;\r\n public onIncoming?: (conn: Call) => void;\r\n public onDisconnect?: () => void;\r\n public onError?: (error: Error) => void;\r\n public onConnect?: (conn: Call) => void;\r\n public onMissedCall?: () => void;\r\n\r\n constructor(config: Config) {\r\n this.serverUrl = config.serverUrl;\r\n this.identity = config.identity;\r\n this.sdkToken = config.sdkToken;\r\n this.waitUrl = config.waitUrl || this.waitUrl;\r\n\r\n // safer conference name\r\n this.conferenceName = `conf_${this.identity}_${Date.now()}`;\r\n }\r\n\r\n /* ------------------------------------------------------------------ */\r\n /* AUTH */\r\n /* ------------------------------------------------------------------ */\r\n\r\n private setupAxiosAuth(token: string) {\r\n this.axiosInstance.defaults.headers.common[\"Authorization\"] = `Bearer ${token}`;\r\n }\r\n\r\n private ensureAuthenticated() {\r\n if (!this.isAuthenticated) {\r\n throw new Error(\"SDK not authenticated.\");\r\n }\r\n }\r\n\r\n public async verifySDKToken(): Promise<boolean> {\r\n if (!this.sdkToken) {\r\n throw new Error(\"SDK token not provided\");\r\n }\r\n\r\n try {\r\n const res = await this.axiosInstance.post(\r\n `${this.serverUrl}/voipSdk.verifySdkToken`,\r\n {},\r\n { headers: { Authorization: `Bearer ${this.sdkToken}` } }\r\n );\r\n\r\n console.log(\"verifySDKToken :\", res.data.result.data.verified);\r\n\r\n if (res?.data?.result?.data?.verified) {\r\n this.isAuthenticated = true;\r\n this.setupAxiosAuth(this.sdkToken);\r\n console.info(\"[verifySDKToken] SDK token verified\");\r\n return true;\r\n }\r\n\r\n throw new Error(\"Invalid SDK token\");\r\n } catch (error) {\r\n this.isAuthenticated = false;\r\n throw new Error(\"SDK authentication failed\");\r\n }\r\n }\r\n\r\n // /**\r\n // * Initialize the Twilio device and get token\r\n // */\r\n /**\r\n * Initialize the SDK. Can only be called once.\r\n * \r\n * @throws {Error} If already initialized or initialization fails\r\n * @returns Promise that resolves when initialization is complete\r\n */\r\n public async init(): Promise<void> {\r\n this.ensureAuthenticated();\r\n\r\n if (this.isInitialized) {\r\n throw new Error(\"SDK already initialized\");\r\n }\r\n\r\n if (this.isInitializing) {\r\n throw new Error(\"SDK initialization already in progress\");\r\n }\r\n\r\n this.isInitializing = true;\r\n\r\n try {\r\n const token = await this.generateToken();\r\n this.device = new Device(token, { logLevel: \"info\" });\r\n\r\n this.setupDeviceEventHandlers();\r\n await this.device.register();\r\n\r\n this.isInitialized = true;\r\n console.info(\"[init] Device registered\");\r\n } finally {\r\n this.isInitializing = false;\r\n }\r\n }\r\n // Private methods for get token for initialize the device\r\n\r\n private async generateToken(): Promise<string> {\r\n try {\r\n const payload: TokenRequestPayload = {\r\n json: {\r\n identity: this.identity,\r\n ttl: 3600,\r\n incomingAllow: true,\r\n },\r\n };\r\n\r\n console.log(\"Generating token with payload:\", payload);\r\n\r\n const res = await this.axiosInstance.post<TokenResponse>(\r\n `https://nextdev.zyratalk.com/api/trpc/voipSdk.generateToken`,\r\n payload\r\n ); // This will be changed to this.serverUrl in production\r\n\r\n const token = res?.data?.result?.data?.token;\r\n if (!token) throw new Error(\"Token missing\");\r\n\r\n return token;\r\n } catch (error) {\r\n handleAxiosError(error, this.onError, \"Token generation failed\");\r\n throw error;\r\n }\r\n }\r\n\r\n private setupDeviceEventHandlers() {\r\n if (!this.device) return;\r\n\r\n this.device.on(\"registered\", () => this.onReady?.());\r\n\r\n this.device.on(\"incoming\", (conn: Call) => {\r\n this.activeConnection = conn;\r\n\r\n conn.on(\"cancel\", () => {\r\n this.activeConnection = null;\r\n this.onMissedCall?.();\r\n });\r\n\r\n conn.on(\"reject\", () => (this.activeConnection = null));\r\n conn.on(\"accept\", () => console.info(\"[Device] Call accepted\"));\r\n\r\n this.onIncoming?.(conn);\r\n });\r\n\r\n this.device.on(\"connect\", (conn: Call) => {\r\n this.activeConnection = conn;\r\n this.onConnect?.(conn);\r\n });\r\n\r\n this.device.on(\"disconnect\", () => {\r\n this.activeConnection = null;\r\n this.onDisconnect?.();\r\n });\r\n\r\n this.device.on(\"error\", (error: Error) => {\r\n handleAxiosError(error, this.onError, \"Device error\");\r\n });\r\n\r\n this.device.on(\"tokenWillExpire\", async () => {\r\n const token = await this.generateToken();\r\n this.device?.updateToken(token);\r\n });\r\n }\r\n\r\n /* ------------------------------------------------------------------ */\r\n /* CALL CONTROL */\r\n /* ------------------------------------------------------------------ */\r\n\r\n /**\r\n * Make an outgoing call or add participant to an existing call\r\n */\r\n\r\n public async makeCall(to: string): Promise<CallResponse<Call>> {\r\n this.ensureAuthenticated();\r\n\r\n if (!this.device) return createErrorResult(\"Device not initialized\");\r\n if (!to) return createErrorResult(\"Destination required\");\r\n\r\n if (!this.activeConnection) {\r\n const conn = await this.device.connect({\r\n params: { To: to, conferenceName: this.conferenceName },\r\n });\r\n\r\n this.activeConnection = conn;\r\n\r\n conn.on(\"accept\", async () => {\r\n this.activeCallSid = conn.parameters?.CallSid ?? null;\r\n await this.getConferenceId();\r\n });\r\n\r\n return createSuccessResult(\"Call started\", conn);\r\n }\r\n\r\n await this.holdAndAddParticipant(\r\n this.activeConnection.parameters.CallSid,\r\n to\r\n );\r\n\r\n return createSuccessResult(\"Participant added\", this.activeConnection);\r\n }\r\n\r\n /**\r\n * Accept incoming call\r\n */\r\n\r\n public acceptCall(): CallResponse<Call> {\r\n if (!this.activeConnection) {\r\n return createErrorResult(\"No incoming call\");\r\n }\r\n\r\n this.activeConnection.accept();\r\n return createSuccessResult(\"Call accepted\", this.activeConnection);\r\n }\r\n\r\n /**\r\n * Hang up active call\r\n */\r\n\r\n public hangup(): CallResponse<null> {\r\n if (!this.device) return createErrorResult(\"Device not initialized\");\r\n\r\n this.device.disconnectAll();\r\n this.activeConnection = null;\r\n\r\n return createSuccessResult(\"Call ended\", null);\r\n }\r\n\r\n /**\r\n * Reject incoming call\r\n */\r\n\r\n public rejectCall(): CallResponse<null> {\r\n if (!this.activeConnection) return createErrorResult(\"No call to reject\");\r\n\r\n this.activeConnection.reject();\r\n this.activeConnection = null;\r\n\r\n return createSuccessResult(\"Call rejected\", null);\r\n }\r\n\r\n /**\r\n * Toggle mute/unmute\r\n */\r\n\r\n public toggleMute(mute: boolean): CallResponse<Call> {\r\n if (!this.activeConnection) return createErrorResult(\"No active call\");\r\n\r\n this.activeConnection.mute(mute);\r\n return createSuccessResult(`Mute ${mute}`, this.activeConnection);\r\n }\r\n\r\n /* ------------------------------------------------------------------ */\r\n /* CONFERENCE API */\r\n /* ------------------------------------------------------------------ */\r\n\r\n /**\r\n * Hold a call\r\n */\r\n public async hold(callSid: string) {\r\n this.ensureAuthenticated();\r\n\r\n const payload: HoldCallPayload = {\r\n callSid,\r\n conferenceName: this.conferenceName,\r\n waitUrl: this.waitUrl,\r\n };\r\n\r\n await this.axiosInstance.post(`${this.serverUrl}/outgoingCall.hold`, payload);\r\n return createSuccessResult(\"Call held\", this.activeConnection);\r\n }\r\n\r\n /**\r\n * Resume a held call\r\n */\r\n\r\n public async resume(callSid: string) {\r\n this.ensureAuthenticated();\r\n\r\n const payload: ResumeCallPayload = {\r\n callSid,\r\n conferenceName: this.conferenceName,\r\n };\r\n\r\n await this.axiosInstance.post(\r\n `${this.serverUrl}/outgoingCall.unhold`,\r\n payload\r\n );\r\n\r\n return createSuccessResult(\"Call resumed\", this.activeConnection);\r\n }\r\n\r\n /**\r\n * Hold active call and add a new participant\r\n */\r\n\r\n public async holdAndAddParticipant(callSid: string, number: string) {\r\n this.ensureAuthenticated();\r\n\r\n await this.hold(callSid);\r\n\r\n const payload: AddParticipantPayload = {\r\n conferenceName: this.conferenceName,\r\n newParticipantNo: number,\r\n };\r\n\r\n const res = await this.axiosInstance.post(\r\n `${this.serverUrl}/outgoingCall.addNewCallee`,\r\n payload\r\n );\r\n\r\n return createSuccessResult(\"Participant added\", res.data);\r\n }\r\n\r\n /**\r\n * Fetch conference details\r\n */\r\n\r\n public async getConferenceId() {\r\n this.ensureAuthenticated();\r\n\r\n const payload: GetConferencePayload = {\r\n conferenceName: this.conferenceName,\r\n };\r\n\r\n const res = await this.axiosInstance.post(\r\n `${this.serverUrl}/outgoingCall.getConferenceId`,\r\n payload\r\n );\r\n\r\n this.conferenceDetail = res?.data?.result?.data ?? null;\r\n return createSuccessResult(\"Conference fetched\", this.conferenceDetail);\r\n }\r\n /**\r\n * Get participants of a conference\r\n */\r\n public async getParticipants(conferenceSid: string) {\r\n this.ensureAuthenticated();\r\n\r\n const payload: GetParticipantsPayload = { conferenceSid };\r\n\r\n const res = await this.axiosInstance.post(\r\n `${this.serverUrl}/outgoingCall.getParticipants`,\r\n payload\r\n );\r\n\r\n this.participants = res?.data?.result?.data?.participants ?? [];\r\n return createSuccessResult(\"Participants fetched\", this.participants);\r\n }\r\n\r\n /**\r\n * Remove a participant from a conference\r\n */ public async removeParticipant(conferenceSid: string, callSid: string) {\r\n this.ensureAuthenticated();\r\n\r\n const payload: RemoveParticipantPayload = { conferenceSid, callSid };\r\n\r\n const res = await this.axiosInstance.post(\r\n `${this.serverUrl}/outgoingCall.removeParticipant`,\r\n payload\r\n );\r\n\r\n return createSuccessResult(\"Participant removed\", res.data);\r\n }\r\n\r\n /* ------------------------------------------------------------------ */\r\n /* CLEANUP */\r\n /* ------------------------------------------------------------------ */\r\n\r\n public destroy() {\r\n if (this.device) {\r\n this.device.removeAllListeners();\r\n this.device.destroy();\r\n this.device = null;\r\n }\r\n\r\n this.activeConnection = null;\r\n this.isInitialized = false;\r\n this.isInitializing = false;\r\n this.isAuthenticated = false;\r\n }\r\n}\r\n","import axios, { AxiosError } from \"axios\";\r\n\r\n/**\r\n * Handles errors from Axios requests in a consistent way.\r\n * \r\n * @param error - The error thrown by Axios or any other source.\r\n * @param onErrorCallback - Optional callback to handle the error externally.\r\n * @param contextMessage - Optional custom message to provide context for the error.\r\n */\r\nexport function handleAxiosError(\r\n error: unknown,\r\n onErrorCallback?: (error: Error) => void,\r\n contextMessage = \"Request failed\"\r\n): void {\r\n let finalError: Error;\r\n\r\n if (axios.isAxiosError(error)) {\r\n const axiosError = error as AxiosError;\r\n const status = axiosError.response?.status ?? \"Unknown\";\r\n const statusText = axiosError.response?.statusText ?? \"No status text\";\r\n const responseData = axiosError.response?.data\r\n ? JSON.stringify(axiosError.response.data)\r\n : \"No response data\";\r\n\r\n finalError = new Error(\r\n `[AxiosError] ${contextMessage}: ${status} ${statusText} | Response: ${responseData}`\r\n );\r\n } else if (error instanceof Error) {\r\n finalError = new Error(`[Error] ${contextMessage}: ${error.message}`);\r\n } else {\r\n finalError = new Error(`[Unknown Error] ${contextMessage}: ${String(error)}`);\r\n }\r\n\r\n console.error(finalError); // Optional: log for debugging\r\n onErrorCallback?.(finalError);\r\n}\r\n\r\n","// src/utils/helper.ts\r\n\r\nimport type { CallResponse } from \"../types/interface\"; // adjust path if needed\r\n\r\n/**\r\n * Helper to create success result\r\n */\r\nexport function createSuccessResult<T>(message: string, data: T): CallResponse<T> {\r\n return { success : true, message : message, data };\r\n}\r\n\r\n/**\r\n * Helper to create error result\r\n */\r\nexport function createErrorResult<T = void>(error: Error | string): CallResponse<T> {\r\n return {\r\n success: false,\r\n error: error instanceof Error ? error : new Error(error),\r\n };\r\n}"],"mappings":"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","names":["axios","axios"]}
1
+ {"version":3,"sources":["../src/index.ts","../utils/errorHandler.ts","../utils/helper.ts"],"sourcesContent":["import axios from \"axios\";\r\nimport { Device, Call } from \"@twilio/voice-sdk\";\r\nimport { handleAxiosError } from \"../utils/errorHandler\";\r\nimport {\r\n AddParticipantPayload,\r\n CallResponse,\r\n Config,\r\n GetConferencePayload,\r\n GetConferenceResult,\r\n GetParticipantsPayload,\r\n GetParticipantsResult,\r\n HoldAndAddResult,\r\n HoldCallPayload,\r\n HoldPayload,\r\n RemoveParticipantPayload,\r\n RemoveParticipantResult,\r\n ResumeCallPayload,\r\n TokenRequestPayload,\r\n TokenResponse,\r\n TwilioConference,\r\n TwilioConferenceParticipant,\r\n} from \"../types/interface\";\r\nimport { createSuccessResult, createErrorResult } from \"../utils/helper\";\r\n\r\nexport default class ZyraTwilioWrapper {\r\n private readonly serverUrl: string;\r\n private readonly identity: string;\r\n private readonly sdkToken: string;\r\n\r\n private device: Device | null = null;\r\n private activeConnection: Call | null = null;\r\n\r\n private isInitialized = false;\r\n private isInitializing = false;\r\n private isAuthenticated = false;\r\n\r\n private axiosInstance = axios.create();\r\n\r\n public activeCallSid: string | null = null;\r\n public conferenceName: string;\r\n public conferenceDetail: TwilioConference | null = null;\r\n public participants: TwilioConferenceParticipant[] = [];\r\n public waitUrl = \"https://api.twilio.com/cowbell.mp3\";\r\n\r\n // Optional event handlers\r\n public onReady?: () => void;\r\n public onIncoming?: (conn: Call) => void;\r\n public onDisconnect?: () => void;\r\n public onError?: (error: Error) => void;\r\n public onConnect?: (conn: Call) => void;\r\n public onMissedCall?: () => void;\r\n\r\n constructor(config: Config) {\r\n this.serverUrl = config.serverUrl;\r\n this.identity = config.identity;\r\n this.sdkToken = config.sdkToken;\r\n this.waitUrl = config.waitUrl || this.waitUrl;\r\n\r\n // safer conference name\r\n this.conferenceName = `conf_${this.identity}_${Date.now()}`;\r\n }\r\n\r\n /* ------------------------------------------------------------------ */\r\n /* AUTH */\r\n /* ------------------------------------------------------------------ */\r\n\r\n private setupAxiosAuth(token: string) {\r\n this.axiosInstance.defaults.headers.common[\"Authorization\"] = `Bearer ${token}`;\r\n }\r\n\r\n private ensureAuthenticated() {\r\n if (!this.isAuthenticated) {\r\n throw new Error(\"SDK not authenticated.\");\r\n }\r\n }\r\n\r\n public async verifySDKToken(): Promise<boolean> {\r\n if (!this.sdkToken) {\r\n throw new Error(\"SDK token not provided\");\r\n }\r\n\r\n try {\r\n const res = await this.axiosInstance.post(\r\n `${this.serverUrl}/voipSdk.verifySdkToken`,\r\n {},\r\n { headers: { Authorization: `Bearer ${this.sdkToken}` } }\r\n );\r\n\r\n console.log(\"verifySDKToken :\", res.data.result.data.verified);\r\n\r\n if (res?.data?.result?.data?.verified) {\r\n this.isAuthenticated = true;\r\n this.setupAxiosAuth(this.sdkToken);\r\n console.info(\"[verifySDKToken] SDK token verified\");\r\n return true;\r\n }\r\n\r\n throw new Error(\"Invalid SDK token\");\r\n } catch (error) {\r\n this.isAuthenticated = false;\r\n throw new Error(\"SDK authentication failed\");\r\n }\r\n }\r\n\r\n // /**\r\n // * Initialize the Twilio device and get token\r\n // */\r\n /**\r\n * Initialize the SDK. Can only be called once.\r\n * \r\n * @throws {Error} If already initialized or initialization fails\r\n * @returns Promise that resolves when initialization is complete\r\n */\r\n public async init(): Promise<void> {\r\n this.ensureAuthenticated();\r\n\r\n if (this.isInitialized) {\r\n throw new Error(\"SDK already initialized\");\r\n }\r\n\r\n if (this.isInitializing) {\r\n throw new Error(\"SDK initialization already in progress\");\r\n }\r\n\r\n this.isInitializing = true;\r\n\r\n try {\r\n const token = await this.generateToken();\r\n this.device = new Device(token, { logLevel: \"info\" });\r\n\r\n this.setupDeviceEventHandlers();\r\n await this.device.register();\r\n\r\n this.isInitialized = true;\r\n console.info(\"[init] Device registered\");\r\n } finally {\r\n this.isInitializing = false;\r\n }\r\n }\r\n // Private methods for get token for initialize the device\r\n\r\n private async generateToken(): Promise<string> {\r\n try {\r\n const payload: TokenRequestPayload = {\r\n identity: this.identity,\r\n ttl: 3600,\r\n incomingAllow: true,\r\n };\r\n\r\n console.log(\"Generating token with payload:\", payload);\r\n\r\n const res = await this.axiosInstance.post<TokenResponse>(\r\n `${this.serverUrl}/voipSdk.generateToken`,\r\n payload\r\n ); // This will be changed to this.serverUrl in production\r\n\r\n const token = res?.data?.result?.data?.token;\r\n if (!token) throw new Error(\"Token missing\");\r\n\r\n return token;\r\n } catch (error) {\r\n handleAxiosError(error, this.onError, \"Token generation failed\");\r\n throw error;\r\n }\r\n }\r\n\r\n private setupDeviceEventHandlers() {\r\n if (!this.device) return;\r\n\r\n this.device.on(\"registered\", () => this.onReady?.());\r\n\r\n this.device.on(\"incoming\", (conn: Call) => {\r\n this.activeConnection = conn;\r\n\r\n conn.on(\"cancel\", () => {\r\n this.activeConnection = null;\r\n this.onMissedCall?.();\r\n });\r\n\r\n conn.on(\"reject\", () => (this.activeConnection = null));\r\n conn.on(\"accept\", () => console.info(\"[Device] Call accepted\"));\r\n\r\n this.onIncoming?.(conn);\r\n });\r\n\r\n this.device.on(\"connect\", (conn: Call) => {\r\n this.activeConnection = conn;\r\n this.onConnect?.(conn);\r\n });\r\n\r\n this.device.on(\"disconnect\", () => {\r\n this.activeConnection = null;\r\n this.onDisconnect?.();\r\n });\r\n\r\n this.device.on(\"error\", (error: Error) => {\r\n handleAxiosError(error, this.onError, \"Device error\");\r\n });\r\n\r\n this.device.on(\"tokenWillExpire\", async () => {\r\n const token = await this.generateToken();\r\n this.device?.updateToken(token);\r\n });\r\n }\r\n\r\n /* ------------------------------------------------------------------ */\r\n /* CALL CONTROL */\r\n /* ------------------------------------------------------------------ */\r\n\r\n /**\r\n * Make an outgoing call or add participant to an existing call\r\n */\r\n\r\n public async makeCall(to: string): Promise<CallResponse<Call>> {\r\n this.ensureAuthenticated();\r\n\r\n if (!this.device) return createErrorResult(\"Device not initialized\");\r\n if (!to) return createErrorResult(\"Destination required\");\r\n\r\n if (!this.activeConnection) {\r\n const conn = await this.device.connect({\r\n params: { To: to, conferenceName: this.conferenceName },\r\n });\r\n\r\n this.activeConnection = conn;\r\n\r\n conn.on(\"accept\", async () => {\r\n this.activeCallSid = conn.parameters?.CallSid ?? null;\r\n await this.getConferenceId();\r\n });\r\n\r\n return createSuccessResult(\"Call started\", conn);\r\n }\r\n\r\n await this.holdAndAddParticipant(\r\n this.activeConnection.parameters.CallSid,\r\n to\r\n );\r\n\r\n return createSuccessResult(\"Participant added\", this.activeConnection);\r\n }\r\n\r\n /**\r\n * Accept incoming call\r\n */\r\n\r\n public acceptCall(): CallResponse<Call> {\r\n if (!this.activeConnection) {\r\n return createErrorResult(\"No incoming call\");\r\n }\r\n\r\n this.activeConnection.accept();\r\n return createSuccessResult(\"Call accepted\", this.activeConnection);\r\n }\r\n\r\n /**\r\n * Hang up active call\r\n */\r\n\r\n public hangup(): CallResponse<null> {\r\n if (!this.device) return createErrorResult(\"Device not initialized\");\r\n\r\n this.device.disconnectAll();\r\n this.activeConnection = null;\r\n\r\n return createSuccessResult(\"Call ended\", null);\r\n }\r\n\r\n /**\r\n * Reject incoming call\r\n */\r\n\r\n public rejectCall(): CallResponse<null> {\r\n if (!this.activeConnection) return createErrorResult(\"No call to reject\");\r\n\r\n this.activeConnection.reject();\r\n this.activeConnection = null;\r\n\r\n return createSuccessResult(\"Call rejected\", null);\r\n }\r\n\r\n /**\r\n * Toggle mute/unmute\r\n */\r\n\r\n public toggleMute(mute: boolean): CallResponse<Call> {\r\n if (!this.activeConnection) return createErrorResult(\"No active call\");\r\n\r\n this.activeConnection.mute(mute);\r\n return createSuccessResult(`Mute ${mute}`, this.activeConnection);\r\n }\r\n\r\n /* ------------------------------------------------------------------ */\r\n /* CONFERENCE API */\r\n /* ------------------------------------------------------------------ */\r\n\r\n /**\r\n * Hold a call\r\n */\r\n public async hold(callSid: string) {\r\n this.ensureAuthenticated();\r\n\r\n const payload: HoldCallPayload = {\r\n callSid,\r\n conferenceName: this.conferenceName,\r\n waitUrl: this.waitUrl,\r\n };\r\n\r\n await this.axiosInstance.post(`${this.serverUrl}/outgoingCall.hold`, payload);\r\n return createSuccessResult(\"Call held\", this.activeConnection);\r\n }\r\n\r\n /**\r\n * Resume a held call\r\n */\r\n\r\n public async resume(callSid: string) {\r\n this.ensureAuthenticated();\r\n\r\n const payload: ResumeCallPayload = {\r\n callSid,\r\n conferenceName: this.conferenceName,\r\n };\r\n\r\n await this.axiosInstance.post(\r\n `${this.serverUrl}/outgoingCall.unhold`,\r\n payload\r\n );\r\n\r\n return createSuccessResult(\"Call resumed\", this.activeConnection);\r\n }\r\n\r\n /**\r\n * Hold active call and add a new participant\r\n */\r\n\r\n public async holdAndAddParticipant(callSid: string, number: string) {\r\n this.ensureAuthenticated();\r\n\r\n await this.hold(callSid);\r\n\r\n const payload: AddParticipantPayload = {\r\n conferenceName: this.conferenceName,\r\n newParticipantNo: number,\r\n };\r\n\r\n const res = await this.axiosInstance.post(\r\n `${this.serverUrl}/outgoingCall.addNewCallee`,\r\n payload\r\n );\r\n\r\n return createSuccessResult(\"Participant added\", res.data);\r\n }\r\n\r\n /**\r\n * Fetch conference details\r\n */\r\n\r\n public async getConferenceId() {\r\n this.ensureAuthenticated();\r\n\r\n const payload: GetConferencePayload = {\r\n conferenceName: this.conferenceName,\r\n };\r\n\r\n const res = await this.axiosInstance.post(\r\n `${this.serverUrl}/outgoingCall.getConferenceId`,\r\n payload\r\n );\r\n\r\n this.conferenceDetail = res?.data?.result?.data ?? null;\r\n return createSuccessResult(\"Conference fetched\", this.conferenceDetail);\r\n }\r\n /**\r\n * Get participants of a conference\r\n */\r\n public async getParticipants(conferenceSid: string) {\r\n this.ensureAuthenticated();\r\n\r\n const payload: GetParticipantsPayload = { conferenceSid };\r\n\r\n const res = await this.axiosInstance.post(\r\n `${this.serverUrl}/outgoingCall.getParticipants`,\r\n payload\r\n );\r\n\r\n this.participants = res?.data?.result?.data?.participants ?? [];\r\n return createSuccessResult(\"Participants fetched\", this.participants);\r\n }\r\n\r\n /**\r\n * Remove a participant from a conference\r\n */ public async removeParticipant(conferenceSid: string, callSid: string) {\r\n this.ensureAuthenticated();\r\n\r\n const payload: RemoveParticipantPayload = { conferenceSid, callSid };\r\n\r\n const res = await this.axiosInstance.post(\r\n `${this.serverUrl}/outgoingCall.removeParticipant`,\r\n payload\r\n );\r\n\r\n return createSuccessResult(\"Participant removed\", res.data);\r\n }\r\n\r\n /* ------------------------------------------------------------------ */\r\n /* CLEANUP */\r\n /* ------------------------------------------------------------------ */\r\n\r\n public destroy() {\r\n if (this.device) {\r\n this.device.removeAllListeners();\r\n this.device.destroy();\r\n this.device = null;\r\n }\r\n\r\n this.activeConnection = null;\r\n this.isInitialized = false;\r\n this.isInitializing = false;\r\n this.isAuthenticated = false;\r\n }\r\n}\r\n","import axios, { AxiosError } from \"axios\";\r\n\r\n/**\r\n * Handles errors from Axios requests in a consistent way.\r\n * \r\n * @param error - The error thrown by Axios or any other source.\r\n * @param onErrorCallback - Optional callback to handle the error externally.\r\n * @param contextMessage - Optional custom message to provide context for the error.\r\n */\r\nexport function handleAxiosError(\r\n error: unknown,\r\n onErrorCallback?: (error: Error) => void,\r\n contextMessage = \"Request failed\"\r\n): void {\r\n let finalError: Error;\r\n\r\n if (axios.isAxiosError(error)) {\r\n const axiosError = error as AxiosError;\r\n const status = axiosError.response?.status ?? \"Unknown\";\r\n const statusText = axiosError.response?.statusText ?? \"No status text\";\r\n const responseData = axiosError.response?.data\r\n ? JSON.stringify(axiosError.response.data)\r\n : \"No response data\";\r\n\r\n finalError = new Error(\r\n `[AxiosError] ${contextMessage}: ${status} ${statusText} | Response: ${responseData}`\r\n );\r\n } else if (error instanceof Error) {\r\n finalError = new Error(`[Error] ${contextMessage}: ${error.message}`);\r\n } else {\r\n finalError = new Error(`[Unknown Error] ${contextMessage}: ${String(error)}`);\r\n }\r\n\r\n console.error(finalError); // Optional: log for debugging\r\n onErrorCallback?.(finalError);\r\n}\r\n\r\n","// src/utils/helper.ts\r\n\r\nimport type { CallResponse } from \"../types/interface\"; // adjust path if needed\r\n\r\n/**\r\n * Helper to create success result\r\n */\r\nexport function createSuccessResult<T>(message: string, data: T): CallResponse<T> {\r\n return { success : true, message : message, data };\r\n}\r\n\r\n/**\r\n * Helper to create error result\r\n */\r\nexport function createErrorResult<T = void>(error: Error | string): CallResponse<T> {\r\n return {\r\n success: false,\r\n error: error instanceof Error ? error : new Error(error),\r\n };\r\n}"],"mappings":";AAAA,OAAOA,YAAW;AAClB,SAAS,cAAoB;;;ACD7B,OAAO,WAA2B;AAS3B,SAAS,iBACd,OACA,iBACA,iBAAiB,kBACX;AACN,MAAI;AAEJ,MAAI,MAAM,aAAa,KAAK,GAAG;AAC7B,UAAM,aAAa;AACnB,UAAM,SAAS,WAAW,UAAU,UAAU;AAC9C,UAAM,aAAa,WAAW,UAAU,cAAc;AACtD,UAAM,eAAe,WAAW,UAAU,OACtC,KAAK,UAAU,WAAW,SAAS,IAAI,IACvC;AAEJ,iBAAa,IAAI;AAAA,MACf,gBAAgB,cAAc,KAAK,MAAM,IAAI,UAAU,gBAAgB,YAAY;AAAA,IACrF;AAAA,EACF,WAAW,iBAAiB,OAAO;AACjC,iBAAa,IAAI,MAAM,WAAW,cAAc,KAAK,MAAM,OAAO,EAAE;AAAA,EACtE,OAAO;AACL,iBAAa,IAAI,MAAM,mBAAmB,cAAc,KAAK,OAAO,KAAK,CAAC,EAAE;AAAA,EAC9E;AAEA,UAAQ,MAAM,UAAU;AACxB,oBAAkB,UAAU;AAC9B;;;AC5BO,SAAS,oBAAuB,SAAiB,MAA0B;AAChF,SAAO,EAAE,SAAU,MAAM,SAAmB,KAAK;AACnD;AAKO,SAAS,kBAA4B,OAAwC;AAClF,SAAO;AAAA,IACL,SAAS;AAAA,IACT,OAAO,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,KAAK;AAAA,EACzD;AACF;;;AFKA,IAAqB,oBAArB,MAAuC;AAAA,EA4BnC,YAAY,QAAgB;AAvB5B,SAAQ,SAAwB;AAChC,SAAQ,mBAAgC;AAExC,SAAQ,gBAAgB;AACxB,SAAQ,iBAAiB;AACzB,SAAQ,kBAAkB;AAE1B,SAAQ,gBAAgBC,OAAM,OAAO;AAErC,SAAO,gBAA+B;AAEtC,SAAO,mBAA4C;AACnD,SAAO,eAA8C,CAAC;AACtD,SAAO,UAAU;AAWb,SAAK,YAAY,OAAO;AACxB,SAAK,WAAW,OAAO;AACvB,SAAK,WAAW,OAAO;AACvB,SAAK,UAAU,OAAO,WAAW,KAAK;AAGtC,SAAK,iBAAiB,QAAQ,KAAK,QAAQ,IAAI,KAAK,IAAI,CAAC;AAAA,EAC7D;AAAA;AAAA;AAAA;AAAA,EAMQ,eAAe,OAAe;AAClC,SAAK,cAAc,SAAS,QAAQ,OAAO,eAAe,IAAI,UAAU,KAAK;AAAA,EACjF;AAAA,EAEQ,sBAAsB;AAC1B,QAAI,CAAC,KAAK,iBAAiB;AACvB,YAAM,IAAI,MAAM,wBAAwB;AAAA,IAC5C;AAAA,EACJ;AAAA,EAEA,MAAa,iBAAmC;AAC5C,QAAI,CAAC,KAAK,UAAU;AAChB,YAAM,IAAI,MAAM,wBAAwB;AAAA,IAC5C;AAEA,QAAI;AACA,YAAM,MAAM,MAAM,KAAK,cAAc;AAAA,QACjC,GAAG,KAAK,SAAS;AAAA,QACjB,CAAC;AAAA,QACD,EAAE,SAAS,EAAE,eAAe,UAAU,KAAK,QAAQ,GAAG,EAAE;AAAA,MAC5D;AAEA,cAAQ,IAAI,oBAAoB,IAAI,KAAK,OAAO,KAAK,QAAQ;AAE7D,UAAI,KAAK,MAAM,QAAQ,MAAM,UAAU;AACnC,aAAK,kBAAkB;AACvB,aAAK,eAAe,KAAK,QAAQ;AACjC,gBAAQ,KAAK,qCAAqC;AAClD,eAAO;AAAA,MACX;AAEA,YAAM,IAAI,MAAM,mBAAmB;AAAA,IACvC,SAAS,OAAO;AACZ,WAAK,kBAAkB;AACvB,YAAM,IAAI,MAAM,2BAA2B;AAAA,IAC/C;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAa,OAAsB;AAC/B,SAAK,oBAAoB;AAEzB,QAAI,KAAK,eAAe;AACpB,YAAM,IAAI,MAAM,yBAAyB;AAAA,IAC7C;AAEA,QAAI,KAAK,gBAAgB;AACrB,YAAM,IAAI,MAAM,wCAAwC;AAAA,IAC5D;AAEA,SAAK,iBAAiB;AAEtB,QAAI;AACA,YAAM,QAAQ,MAAM,KAAK,cAAc;AACvC,WAAK,SAAS,IAAI,OAAO,OAAO,EAAE,UAAU,OAAO,CAAC;AAEpD,WAAK,yBAAyB;AAC9B,YAAM,KAAK,OAAO,SAAS;AAE3B,WAAK,gBAAgB;AACrB,cAAQ,KAAK,0BAA0B;AAAA,IAC3C,UAAE;AACE,WAAK,iBAAiB;AAAA,IAC1B;AAAA,EACJ;AAAA;AAAA,EAGA,MAAc,gBAAiC;AAC3C,QAAI;AACA,YAAM,UAA+B;AAAA,QAC7B,UAAU,KAAK;AAAA,QACf,KAAK;AAAA,QACL,eAAe;AAAA,MACvB;AAEA,cAAQ,IAAI,kCAAkC,OAAO;AAErD,YAAM,MAAM,MAAM,KAAK,cAAc;AAAA,QACjC,GAAG,KAAK,SAAS;AAAA,QACjB;AAAA,MACJ;AAEA,YAAM,QAAQ,KAAK,MAAM,QAAQ,MAAM;AACvC,UAAI,CAAC,MAAO,OAAM,IAAI,MAAM,eAAe;AAE3C,aAAO;AAAA,IACX,SAAS,OAAO;AACZ,uBAAiB,OAAO,KAAK,SAAS,yBAAyB;AAC/D,YAAM;AAAA,IACV;AAAA,EACJ;AAAA,EAEQ,2BAA2B;AAC/B,QAAI,CAAC,KAAK,OAAQ;AAElB,SAAK,OAAO,GAAG,cAAc,MAAM,KAAK,UAAU,CAAC;AAEnD,SAAK,OAAO,GAAG,YAAY,CAAC,SAAe;AACvC,WAAK,mBAAmB;AAExB,WAAK,GAAG,UAAU,MAAM;AACpB,aAAK,mBAAmB;AACxB,aAAK,eAAe;AAAA,MACxB,CAAC;AAED,WAAK,GAAG,UAAU,MAAO,KAAK,mBAAmB,IAAK;AACtD,WAAK,GAAG,UAAU,MAAM,QAAQ,KAAK,wBAAwB,CAAC;AAE9D,WAAK,aAAa,IAAI;AAAA,IAC1B,CAAC;AAED,SAAK,OAAO,GAAG,WAAW,CAAC,SAAe;AACtC,WAAK,mBAAmB;AACxB,WAAK,YAAY,IAAI;AAAA,IACzB,CAAC;AAED,SAAK,OAAO,GAAG,cAAc,MAAM;AAC/B,WAAK,mBAAmB;AACxB,WAAK,eAAe;AAAA,IACxB,CAAC;AAED,SAAK,OAAO,GAAG,SAAS,CAAC,UAAiB;AACtC,uBAAiB,OAAO,KAAK,SAAS,cAAc;AAAA,IACxD,CAAC;AAED,SAAK,OAAO,GAAG,mBAAmB,YAAY;AAC1C,YAAM,QAAQ,MAAM,KAAK,cAAc;AACvC,WAAK,QAAQ,YAAY,KAAK;AAAA,IAClC,CAAC;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAa,SAAS,IAAyC;AAC3D,SAAK,oBAAoB;AAEzB,QAAI,CAAC,KAAK,OAAQ,QAAO,kBAAkB,wBAAwB;AACnE,QAAI,CAAC,GAAI,QAAO,kBAAkB,sBAAsB;AAExD,QAAI,CAAC,KAAK,kBAAkB;AACxB,YAAM,OAAO,MAAM,KAAK,OAAO,QAAQ;AAAA,QACnC,QAAQ,EAAE,IAAI,IAAI,gBAAgB,KAAK,eAAe;AAAA,MAC1D,CAAC;AAED,WAAK,mBAAmB;AAExB,WAAK,GAAG,UAAU,YAAY;AAC1B,aAAK,gBAAgB,KAAK,YAAY,WAAW;AACjD,cAAM,KAAK,gBAAgB;AAAA,MAC/B,CAAC;AAED,aAAO,oBAAoB,gBAAgB,IAAI;AAAA,IACnD;AAEA,UAAM,KAAK;AAAA,MACP,KAAK,iBAAiB,WAAW;AAAA,MACjC;AAAA,IACJ;AAEA,WAAO,oBAAoB,qBAAqB,KAAK,gBAAgB;AAAA,EACzE;AAAA;AAAA;AAAA;AAAA,EAMO,aAAiC;AACpC,QAAI,CAAC,KAAK,kBAAkB;AACxB,aAAO,kBAAkB,kBAAkB;AAAA,IAC/C;AAEA,SAAK,iBAAiB,OAAO;AAC7B,WAAO,oBAAoB,iBAAiB,KAAK,gBAAgB;AAAA,EACrE;AAAA;AAAA;AAAA;AAAA,EAMO,SAA6B;AAChC,QAAI,CAAC,KAAK,OAAQ,QAAO,kBAAkB,wBAAwB;AAEnE,SAAK,OAAO,cAAc;AAC1B,SAAK,mBAAmB;AAExB,WAAO,oBAAoB,cAAc,IAAI;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA,EAMO,aAAiC;AACpC,QAAI,CAAC,KAAK,iBAAkB,QAAO,kBAAkB,mBAAmB;AAExE,SAAK,iBAAiB,OAAO;AAC7B,SAAK,mBAAmB;AAExB,WAAO,oBAAoB,iBAAiB,IAAI;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA,EAMO,WAAW,MAAmC;AACjD,QAAI,CAAC,KAAK,iBAAkB,QAAO,kBAAkB,gBAAgB;AAErE,SAAK,iBAAiB,KAAK,IAAI;AAC/B,WAAO,oBAAoB,QAAQ,IAAI,IAAI,KAAK,gBAAgB;AAAA,EACpE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAa,KAAK,SAAiB;AAC/B,SAAK,oBAAoB;AAEzB,UAAM,UAA2B;AAAA,MAC7B;AAAA,MACA,gBAAgB,KAAK;AAAA,MACrB,SAAS,KAAK;AAAA,IAClB;AAEA,UAAM,KAAK,cAAc,KAAK,GAAG,KAAK,SAAS,sBAAsB,OAAO;AAC5E,WAAO,oBAAoB,aAAa,KAAK,gBAAgB;AAAA,EACjE;AAAA;AAAA;AAAA;AAAA,EAMA,MAAa,OAAO,SAAiB;AACjC,SAAK,oBAAoB;AAEzB,UAAM,UAA6B;AAAA,MAC/B;AAAA,MACA,gBAAgB,KAAK;AAAA,IACzB;AAEA,UAAM,KAAK,cAAc;AAAA,MACrB,GAAG,KAAK,SAAS;AAAA,MACjB;AAAA,IACJ;AAEA,WAAO,oBAAoB,gBAAgB,KAAK,gBAAgB;AAAA,EACpE;AAAA;AAAA;AAAA;AAAA,EAMA,MAAa,sBAAsB,SAAiB,QAAgB;AAChE,SAAK,oBAAoB;AAEzB,UAAM,KAAK,KAAK,OAAO;AAEvB,UAAM,UAAiC;AAAA,MACnC,gBAAgB,KAAK;AAAA,MACrB,kBAAkB;AAAA,IACtB;AAEA,UAAM,MAAM,MAAM,KAAK,cAAc;AAAA,MACjC,GAAG,KAAK,SAAS;AAAA,MACjB;AAAA,IACJ;AAEA,WAAO,oBAAoB,qBAAqB,IAAI,IAAI;AAAA,EAC5D;AAAA;AAAA;AAAA;AAAA,EAMA,MAAa,kBAAkB;AAC3B,SAAK,oBAAoB;AAEzB,UAAM,UAAgC;AAAA,MAClC,gBAAgB,KAAK;AAAA,IACzB;AAEA,UAAM,MAAM,MAAM,KAAK,cAAc;AAAA,MACjC,GAAG,KAAK,SAAS;AAAA,MACjB;AAAA,IACJ;AAEA,SAAK,mBAAmB,KAAK,MAAM,QAAQ,QAAQ;AACnD,WAAO,oBAAoB,sBAAsB,KAAK,gBAAgB;AAAA,EAC1E;AAAA;AAAA;AAAA;AAAA,EAIA,MAAa,gBAAgB,eAAuB;AAChD,SAAK,oBAAoB;AAEzB,UAAM,UAAkC,EAAE,cAAc;AAExD,UAAM,MAAM,MAAM,KAAK,cAAc;AAAA,MACjC,GAAG,KAAK,SAAS;AAAA,MACjB;AAAA,IACJ;AAEA,SAAK,eAAe,KAAK,MAAM,QAAQ,MAAM,gBAAgB,CAAC;AAC9D,WAAO,oBAAoB,wBAAwB,KAAK,YAAY;AAAA,EACxE;AAAA;AAAA;AAAA;AAAA,EAIK,MAAa,kBAAkB,eAAuB,SAAiB;AACxE,SAAK,oBAAoB;AAEzB,UAAM,UAAoC,EAAE,eAAe,QAAQ;AAEnE,UAAM,MAAM,MAAM,KAAK,cAAc;AAAA,MACjC,GAAG,KAAK,SAAS;AAAA,MACjB;AAAA,IACJ;AAEA,WAAO,oBAAoB,uBAAuB,IAAI,IAAI;AAAA,EAC9D;AAAA;AAAA;AAAA;AAAA,EAMO,UAAU;AACb,QAAI,KAAK,QAAQ;AACb,WAAK,OAAO,mBAAmB;AAC/B,WAAK,OAAO,QAAQ;AACpB,WAAK,SAAS;AAAA,IAClB;AAEA,SAAK,mBAAmB;AACxB,SAAK,gBAAgB;AACrB,SAAK,iBAAiB;AACtB,SAAK,kBAAkB;AAAA,EAC3B;AACJ;","names":["axios","axios"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tarunzyraclavis/zyra-twilio-wrapper",
3
- "version": "1.0.8",
3
+ "version": "1.0.10",
4
4
  "description": "Twilio Voice SDK Wrapper for browser app",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",
package/src/index.ts CHANGED
@@ -142,17 +142,15 @@ export default class ZyraTwilioWrapper {
142
142
  private async generateToken(): Promise<string> {
143
143
  try {
144
144
  const payload: TokenRequestPayload = {
145
- json: {
146
145
  identity: this.identity,
147
146
  ttl: 3600,
148
147
  incomingAllow: true,
149
- },
150
148
  };
151
149
 
152
150
  console.log("Generating token with payload:", payload);
153
151
 
154
152
  const res = await this.axiosInstance.post<TokenResponse>(
155
- `https://nextdev.zyratalk.com/api/trpc/voipSdk.generateToken`,
153
+ `${this.serverUrl}/voipSdk.generateToken`,
156
154
  payload
157
155
  ); // This will be changed to this.serverUrl in production
158
156
 
@@ -48,11 +48,9 @@ export interface TwilioConferenceDetails {
48
48
  }
49
49
 
50
50
  export interface TokenRequestPayload {
51
- json: {
52
- identity: string;
53
- ttl: number;
54
- incomingAllow: boolean;
55
- };
51
+ identity: string;
52
+ ttl: number;
53
+ incomingAllow: boolean;
56
54
  }
57
55
 
58
56
  export interface TokenResponse {
@@ -121,6 +119,6 @@ export interface RemoveParticipantResult extends CallResult {
121
119
  data?: any;
122
120
  }
123
121
 
124
- export type CallResponse<T = void> =
122
+ export type CallResponse<T = void> =
125
123
  | { success: true; message: string; data: T }
126
124
  | { success: false; error: Error };