@zyratalk1/zyra-twilio-wrapper 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +75 -0
- package/dist/index.d.mts +407 -0
- package/dist/index.d.ts +407 -0
- package/dist/index.js +2039 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +2002 -0
- package/dist/index.mjs.map +1 -0
- package/eslint.config.js +21 -0
- package/index.js +16 -0
- package/package.json +50 -0
- package/tsconfig.json +15 -0
- package/tsup.config.ts +25 -0
- package/types/interface.ts +322 -0
- package/utils/errorHandler.ts +37 -0
- package/utils/helper.ts +20 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../utils/helper.ts","../src/react-native-voip-sdk/bridge/event-emitter.ts","../src/react-native-voip-sdk/bridge/twilio-voice-adapter.ts","../src/react-native-voip-sdk/bridge/native-module.ts","../src/react-native-voip-sdk/bridge/index.ts","../src/react-native-voip-sdk/core/auth/authManager.ts","../src/react-native-voip-sdk/core/call-engine/callEngine.ts","../src/react-native-voip-sdk/core/config/configService.ts","../src/parseRules.ts","../src/routingConfig.ts","../src/webhook.ts","../src/welcomeMessageConfig.ts","../src/react-native-voip-sdk/core/conference/conferenceManager.ts","../src/react-native-voip-sdk/core/retry/retryPolicy.ts","../src/react-native-voip-sdk/js/public-api.ts","../src/index.ts"],"sourcesContent":["// src/utils/helper.ts\n\nimport type { CallResponse } from \"../types/interface\"; // adjust path if needed\n\n/**\n * Helper to create success result\n */\nexport function createSuccessResult<T>(message: string, data: T): CallResponse<T> {\n return { success : true, message : message, data };\n}\n\n/**\n * Helper to create error result\n */\nexport function createErrorResult<T = void>(error: Error | string): CallResponse<T> {\n return {\n success: false,\n error: error instanceof Error ? error : new Error(error),\n };\n}","import type { SDKEventName } from \"../core/types\";\n\ntype EventPayload = Record<string, unknown>;\ntype Listener = (payload: EventPayload) => void;\n\nexport class BridgeEventEmitter {\n private listeners = new Map<string, Set<Listener>>();\n\n public on(eventName: SDKEventName | string, listener: Listener): () => void {\n const set = this.listeners.get(eventName) ?? new Set<Listener>();\n set.add(listener);\n this.listeners.set(eventName, set);\n\n return () => this.off(eventName, listener);\n }\n\n public off(eventName: SDKEventName | string, listener: Listener): void {\n const set = this.listeners.get(eventName);\n if (!set) return;\n set.delete(listener);\n if (set.size === 0) {\n this.listeners.delete(eventName);\n }\n }\n\n public emit(eventName: SDKEventName | string, payload: EventPayload): void {\n const set = this.listeners.get(eventName);\n if (!set) return;\n set.forEach((listener) => listener(payload));\n }\n\n public removeAllListeners(): void {\n this.listeners.clear();\n }\n}\n\n","import axios, { AxiosInstance } from \"axios\";\nimport { NativeModules, Platform } from \"react-native\";\nimport { Voice } from \"@twilio/voice-react-native-sdk\";\nimport type {\n AuthPayload,\n CallSession,\n ConsumerAuth,\n NativeCommandResult,\n NativeModule,\n Participant,\n SDKConfig,\n SDKEventName,\n} from \"../core/types\";\n\ntype Listener = (payload: Record<string, unknown>) => void;\n\ninterface TrackedCall {\n callId: string;\n callSid: string | null;\n call: any;\n direction: \"INBOUND\" | \"OUTBOUND\";\n /** Original conf_xxx name used for hold/resume/merge — never mutated after startCall */\n conferenceName: string | null;\n /** Raw response from outgoingCall.getConferenceId — read-only, not used for API calls */\n conferenceDetail: Record<string, unknown> | null;\n}\n\nexport class TwilioVoiceAdapter implements NativeModule {\n private readonly voice = new Voice();\n private readonly axiosInstance: AxiosInstance = axios.create();\n private sdkConfig: SDKConfig | null = null;\n private listeners = new Map<string, Set<Listener>>();\n private callInvites = new Map<string, any>();\n private calls = new Map<string, TrackedCall>();\n private started = false;\n private defaultConferenceName = \"\";\n private runtimeAccessToken: string | null = null;\n private isVoiceRegistered = false;\n\n public async initializeSDK(config: SDKConfig): Promise<NativeCommandResult> {\n console.log(\"[VOIP SDK] connect() called\");\n this.sdkConfig = config;\n this.runtimeAccessToken = config.accessToken ?? null;\n this.defaultConferenceName = `conf_${config.consumerId}_${Date.now()}`;\n this.axiosInstance.defaults.baseURL = config.serverUrl;\n\n if (!this.started) {\n this.bindVoiceEvents();\n this.started = true;\n }\n\n try {\n const token = this.getVoiceAccessToken();\n if (!token) {\n this.emit(\"onError\", {\n scope: \"voice_register\",\n message:\n \"Twilio access token not provided. SDK initialized for config APIs only.\",\n });\n return { success: true, data: {} };\n }\n await this.registerVoiceClient(token);\n } catch (error) {\n console.error(\"[VOIP SDK] connect() failed\", error);\n this.emit(\"onError\", {\n scope: \"voice_register\",\n message: error instanceof Error ? error.message : String(error),\n });\n }\n\n return { success: true, data: {} };\n }\n\n public async authenticate(\n payload?: AuthPayload\n ): Promise<NativeCommandResult<ConsumerAuth>> {\n console.log(\"[VOIP SDK] auth started\");\n if (!this.sdkConfig) {\n return { success: false, error: \"SDK not initialized\" };\n }\n\n try {\n this.captureAccessToken(payload);\n console.log(\"[VOIP DEBUG] token validation\", {\n hasPayloadToken: Boolean(payload?.accessToken),\n hasRuntimeToken: Boolean(this.runtimeAccessToken),\n });\n const res = await this.axiosInstance.post(\n `${this.sdkConfig.serverUrl}/voipSdk.verifySdkToken`,\n payload ?? {},\n {\n headers: {\n Authorization: `Bearer ${this.sdkConfig.sdkToken}`,\n },\n }\n );\n\n const verified = Boolean(res?.data?.result?.data?.verified);\n if (!verified) {\n return { success: false, error: \"Invalid SDK token\" };\n }\n\n // Web SDK parity:\n // If caller did not provide an access token, fetch one from backend\n // using the verified SDK token + identity.\n if (!this.getVoiceAccessToken()) {\n const generatedToken = await this.generateVoiceAccessToken();\n this.runtimeAccessToken = generatedToken;\n }\n\n const tokenForVoice = this.getVoiceAccessToken();\n if (tokenForVoice) {\n try {\n await this.registerVoiceClient(tokenForVoice);\n } catch (error) {\n // Do not fail authentication when push/voice registration is unavailable.\n // This keeps config/outbound APIs usable and matches previous RN behavior.\n this.emit(\"onError\", {\n scope: \"voice_register\",\n message:\n error instanceof Error\n ? error.message\n : \"Voice register failed after auth\",\n });\n console.error(\"[VOIP SDK] voice registration warning after auth\", error);\n }\n }\n\n const auth: ConsumerAuth = {\n consumerId: this.sdkConfig.consumerId,\n accessToken: this.getVoiceAccessToken() ?? this.sdkConfig.sdkToken,\n expiresAt: Date.now() + 55 * 60 * 1000,\n scopes: [\"voice:call\", \"voice:conference\"],\n };\n\n this.emit(\"onAuthStateChanged\", { state: \"AUTHENTICATED\" });\n console.log(\"[VOIP SDK] auth success\");\n return { success: true, data: auth };\n } catch (error) {\n console.error(\"[VOIP SDK] auth failed\", error);\n return {\n success: false,\n error: error instanceof Error ? error.message : \"Authentication failed\",\n };\n }\n }\n\n public async refreshAuth(): Promise<NativeCommandResult<ConsumerAuth>> {\n if (!this.sdkConfig) {\n return { success: false, error: \"SDK not initialized\" };\n }\n\n const auth: ConsumerAuth = {\n consumerId: this.sdkConfig.consumerId,\n accessToken: this.getVoiceAccessToken() ?? this.sdkConfig.sdkToken,\n expiresAt: Date.now() + 55 * 60 * 1000,\n scopes: [\"voice:call\", \"voice:conference\"],\n };\n return { success: true, data: auth };\n }\n\n public async startCall(input: {\n number: string;\n callId: string;\n }): Promise<NativeCommandResult<CallSession>> {\n console.log(\"[VOIP SDK] startCall() invoked\", { callId: input.callId, number: input.number });\n if (!this.sdkConfig) {\n return { success: false, error: \"SDK not initialized\" };\n }\n\n try {\n if (!this.isVoiceNativeModuleAvailable()) {\n return {\n success: false,\n error:\n \"Twilio native module not available (TwilioVoiceReactNative). Rebuild app and verify native linking.\",\n };\n }\n\n const token = this.getVoiceAccessToken();\n if (!token) {\n return {\n success: false,\n error:\n \"Twilio access token missing. Pass accessToken in constructor or authenticate({ accessToken }).\",\n };\n }\n\n // One conference name per outbound leg so parallel `voice.connect` sessions stay isolated\n // (hold / addNewCallee / backend signaling use this name per tracked call).\n const conferenceName = `conf_${this.sdkConfig.consumerId}_${input.callId}`;\n // Twilio RN SDK voice.connect(token, { params: Record<string,string> })\n // `params` is forwarded to the TwiML application as custom parameters,\n // matching the web SDK's device.connect({ params: { To, conferenceName } }) behaviour.\n console.log(\"[VOIP SDK] voice.connect() params\", {\n To: input.number,\n conferenceName,\n });\n const call = await this.voice.connect(token, {\n params: {\n To: input.number,\n conferenceName,\n },\n });\n\n const callSid = this.readCallSid(call);\n const tracked: TrackedCall = {\n callId: input.callId,\n callSid,\n call,\n direction: \"OUTBOUND\",\n conferenceName,\n conferenceDetail: null,\n };\n this.calls.set(input.callId, tracked);\n this.bindCallEvents(input.callId, call);\n console.log(\"[VOIP SDK] call request sent\", { callId: input.callId });\n\n const session: CallSession = {\n callId: input.callId,\n direction: \"OUTBOUND\",\n status: \"DIALING\",\n participants: [],\n conferenceRoomId: null,\n };\n\n return { success: true, data: session };\n } catch (error) {\n console.error(\"[VOIP SDK] startCall() failed\", error);\n return {\n success: false,\n error: error instanceof Error ? error.message : \"Failed to start call\",\n };\n }\n }\n\n public async rejectCall(input: { callId: string }): Promise<NativeCommandResult> {\n console.log(\"[VOIP SDK] rejectCall() invoked\", { callId: input.callId });\n const invite = this.callInvites.get(input.callId);\n if (!invite) {\n return { success: false, error: \"Incoming call invite not found\" };\n }\n try {\n if (typeof invite.reject === \"function\") {\n await invite.reject();\n }\n this.callInvites.delete(input.callId);\n this.emit(\"onCallEnded\", { callId: input.callId, reason: \"rejected\" });\n return { success: true, data: {} };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : \"Failed to reject call\",\n };\n }\n }\n\n public async answerCall(input: {\n callId: string;\n }): Promise<NativeCommandResult> {\n console.log(\"[VOIP DEBUG] call accepted flow start\", { callId: input.callId });\n try {\n const invite = this.callInvites.get(input.callId);\n if (!invite) {\n return { success: false, error: \"Incoming call invite not found\" };\n }\n\n const call = await invite.accept();\n const tracked: TrackedCall = {\n callId: input.callId,\n callSid: this.readCallSid(call) ?? input.callId,\n call,\n direction: \"INBOUND\",\n conferenceName: this.defaultConferenceName,\n conferenceDetail: null,\n };\n this.calls.set(input.callId, tracked);\n this.callInvites.delete(input.callId);\n this.bindCallEvents(input.callId, call);\n console.log(\"[VOIP DEBUG] call accepted\", { callId: input.callId });\n return { success: true, data: {} };\n } catch (error) {\n console.error(\"[VOIP DEBUG] call accepted failure\", error);\n return {\n success: false,\n error: error instanceof Error ? error.message : \"Failed to answer call\",\n };\n }\n }\n\n public async endCall(input: { callId: string }): Promise<NativeCommandResult> {\n console.log(\"[VOIP SDK] endCall() invoked\", { callId: input.callId });\n const tracked = this.calls.get(input.callId);\n if (!tracked) return { success: false, error: \"Call not found\" };\n\n try {\n await tracked.call.disconnect();\n this.calls.delete(input.callId);\n this.emit(\"onCallEnded\", { callId: input.callId });\n console.log(\"[VOIP SDK] call ended\", { callId: input.callId });\n return { success: true, data: {} };\n } catch (error) {\n console.error(\"[VOIP SDK] endCall() failed\", error);\n return {\n success: false,\n error: error instanceof Error ? error.message : \"Failed to end call\",\n };\n }\n }\n\n public async toggleMute(input: {\n callId: string;\n mute: boolean;\n }): Promise<NativeCommandResult> {\n console.log(\"[VOIP SDK] toggleMute() invoked\", { callId: input.callId, mute: input.mute });\n const tracked = this.calls.get(input.callId);\n if (!tracked) {\n return { success: false, error: \"No active call to mute/unmute\" };\n }\n try {\n if (typeof tracked.call.mute === \"function\") {\n await tracked.call.mute(input.mute);\n } else if (typeof tracked.call.isMuted === \"function\") {\n const current = tracked.call.isMuted();\n if (current !== input.mute) {\n await tracked.call.mute(input.mute);\n }\n }\n console.log(\"[VOIP SDK] toggleMute() success\", { callId: input.callId, mute: input.mute });\n return { success: true, data: {} };\n } catch (error) {\n console.error(\"[VOIP SDK] toggleMute() failed\", error);\n return {\n success: false,\n error: error instanceof Error ? error.message : \"Failed to toggle mute\",\n };\n }\n }\n\n public async holdCall(input: { callId: string }): Promise<NativeCommandResult> {\n return this.postCallControl(input.callId, \"outgoingCall.hold\", {\n waitUrl: this.sdkConfig?.waitUrl ?? \"https://api.twilio.com/cowbell.mp3\",\n });\n }\n\n public async resumeCall(input: {\n callId: string;\n }): Promise<NativeCommandResult> {\n return this.postCallControl(input.callId, \"outgoingCall.unhold\");\n }\n\n /**\n * Hold the active call then dial `newParticipantNo` into the same conference.\n *\n * Web SDK parity:\n * OUTBOUND active call → holdAndAddParticipant()\n * step 1: outgoingCall.hold (same as hold())\n * step 2: outgoingCall.addNewCallee { conferenceName, newParticipantNo }\n *\n * INBOUND active call → holdAndAddParticipantIncoming()\n * step 1: outgoingCall.hold (same as hold())\n * step 2: outgoingCall.addNewCalleeIncoming { callSid, newParticipantNo }\n */\n public async addNewCallee(input: {\n callId: string;\n newParticipantNo: string;\n }): Promise<NativeCommandResult> {\n if (!this.sdkConfig) {\n return { success: false, error: \"SDK not initialized\" };\n }\n\n const tracked = this.calls.get(input.callId);\n if (!tracked) {\n return { success: false, error: \"Active call not found\" };\n }\n if (!input.newParticipantNo) {\n return { success: false, error: \"Participant number is required\" };\n }\n\n try {\n // Step 1: Hold the current call (mirrors web SDK hold() call)\n const holdResult = await this.postCallControl(\n input.callId,\n \"outgoingCall.hold\",\n {\n waitUrl: this.sdkConfig.waitUrl ?? \"https://api.twilio.com/cowbell.mp3\",\n }\n );\n if (!holdResult.success) {\n return { success: false, error: holdResult.error ?? \"Failed to hold call before adding participant\" };\n }\n\n // Step 2: Add participant — endpoint differs by call direction\n const callSid = tracked.callSid ?? input.callId;\n const conferenceName = tracked.conferenceName ?? this.defaultConferenceName;\n\n let payload: Record<string, string>;\n let endpoint: string;\n\n if (tracked.direction === \"INBOUND\") {\n // outgoingCall.addNewCalleeIncoming: { callSid, newParticipantNo }\n endpoint = \"outgoingCall.addNewCalleeIncoming\";\n payload = { callSid, newParticipantNo: input.newParticipantNo };\n } else {\n // outgoingCall.addNewCallee: { conferenceName, newParticipantNo }\n endpoint = \"outgoingCall.addNewCallee\";\n payload = { conferenceName, newParticipantNo: input.newParticipantNo };\n }\n\n console.log(\"[VOIP SDK] addNewCallee() start\", {\n callId: input.callId,\n direction: tracked.direction,\n endpoint,\n newParticipantNo: input.newParticipantNo,\n });\n\n await this.axiosInstance.post(\n `${this.sdkConfig.serverUrl}/${endpoint}`,\n payload,\n { headers: { Authorization: `Bearer ${this.sdkConfig.sdkToken}` } }\n );\n\n this.emit(\"onParticipantJoined\", { callId: input.callId, number: input.newParticipantNo });\n console.log(\"[VOIP SDK] addNewCallee() success\", { callId: input.callId, endpoint });\n return { success: true, data: {} };\n } catch (error) {\n console.error(\"[VOIP SDK] addNewCallee() failed\", error);\n return {\n success: false,\n error: error instanceof Error ? error.message : \"Failed to add participant\",\n };\n }\n }\n\n public async mergeCall(input: {\n callId: string;\n }): Promise<NativeCommandResult<CallSession>> {\n const control = await this.postCallControl(input.callId, \"outgoingCall.unhold\");\n if (!control.success) {\n return {\n success: false,\n error: control.error ?? \"Failed to merge call\",\n };\n }\n\n const existing = this.calls.get(input.callId);\n const session: CallSession = {\n callId: input.callId,\n direction: existing?.direction ?? \"OUTBOUND\",\n status: \"MERGED\",\n participants: [],\n conferenceRoomId: null,\n };\n return { success: true, data: session };\n }\n\n public async getParticipants(input: {\n callId: string;\n }): Promise<NativeCommandResult<Participant[]>> {\n if (!this.sdkConfig) {\n return { success: false, error: \"SDK not initialized\" };\n }\n\n try {\n const tracked = this.calls.get(input.callId);\n const conferenceSid = tracked?.conferenceName ?? input.callId;\n const res = await this.axiosInstance.post(\n `${this.sdkConfig.serverUrl}/outgoingCall.getParticipants`,\n { conferenceSid },\n {\n headers: {\n Authorization: `Bearer ${this.sdkConfig.sdkToken}`,\n },\n }\n );\n\n const participants = (res?.data?.result?.data?.participants ??\n []) as Participant[];\n return { success: true, data: participants };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : \"Failed to fetch participants\",\n };\n }\n }\n\n public async getConferenceId(input: {\n conferenceName: string;\n }): Promise<NativeCommandResult<Record<string, unknown>>> {\n if (!this.sdkConfig) {\n return { success: false, error: \"SDK not initialized\" };\n }\n console.log(\"[VOIP SDK] getConferenceId() invoked\", { conferenceName: input.conferenceName });\n try {\n const res = await this.axiosInstance.post(\n `${this.sdkConfig.serverUrl}/outgoingCall.getConferenceId`,\n { conferenceName: input.conferenceName },\n { headers: { Authorization: `Bearer ${this.sdkConfig.sdkToken}` } }\n );\n const conferenceDetail = res?.data?.result?.data ?? null;\n console.log(\"[VOIP SDK] getConferenceId() success\", { conferenceDetail });\n return { success: true, data: conferenceDetail };\n } catch (error) {\n console.error(\"[VOIP SDK] getConferenceId() failed\", error);\n return {\n success: false,\n error: error instanceof Error ? error.message : \"Failed to fetch conference ID\",\n };\n }\n }\n\n public async getParticipantsByCallSid(input: {\n callSid: string;\n }): Promise<NativeCommandResult<Participant[]>> {\n if (!this.sdkConfig) {\n return { success: false, error: \"SDK not initialized\" };\n }\n console.log(\"[VOIP SDK] getParticipantsByCallSid() invoked\", { callSid: input.callSid });\n try {\n const res = await this.axiosInstance.post(\n `${this.sdkConfig.serverUrl}/outgoingCall.getConferenceCallsByConferenceId`,\n { callSid: input.callSid },\n { headers: { Authorization: `Bearer ${this.sdkConfig.sdkToken}` } }\n );\n const participants = (res?.data?.result?.data ?? []) as Participant[];\n console.log(\"[VOIP SDK] getParticipantsByCallSid() success\", { count: participants.length });\n return { success: true, data: participants };\n } catch (error) {\n console.error(\"[VOIP SDK] getParticipantsByCallSid() failed\", error);\n return {\n success: false,\n error: error instanceof Error ? error.message : \"Failed to fetch participants\",\n };\n }\n }\n\n public async removeParticipant(input: {\n conferenceSid: string;\n callSid: string;\n }): Promise<NativeCommandResult> {\n if (!this.sdkConfig) {\n return { success: false, error: \"SDK not initialized\" };\n }\n console.log(\"[VOIP SDK] removeParticipant() invoked\", {\n conferenceSid: input.conferenceSid,\n callSid: input.callSid,\n });\n try {\n await this.axiosInstance.post(\n `${this.sdkConfig.serverUrl}/outgoingCall.removeParticipant`,\n {\n conferenceSid: input.conferenceSid,\n callSid: input.callSid,\n },\n { headers: { Authorization: `Bearer ${this.sdkConfig.sdkToken}` } }\n );\n this.emit(\"onParticipantLeft\", { participantId: input.callSid });\n console.log(\"[VOIP SDK] removeParticipant() success\");\n return { success: true, data: {} };\n } catch (error) {\n console.error(\"[VOIP SDK] removeParticipant() failed\", error);\n return {\n success: false,\n error: error instanceof Error ? error.message : \"Failed to remove participant\",\n };\n }\n }\n\n public async disconnectParticipant(input: {\n participantId: string;\n }): Promise<NativeCommandResult> {\n if (!this.sdkConfig) {\n return { success: false, error: \"SDK not initialized\" };\n }\n\n try {\n await this.axiosInstance.post(\n `${this.sdkConfig.serverUrl}/outgoingCall.removeParticipant`,\n {\n conferenceSid: this.defaultConferenceName,\n callSid: input.participantId,\n },\n {\n headers: {\n Authorization: `Bearer ${this.sdkConfig.sdkToken}`,\n },\n }\n );\n this.emit(\"onParticipantLeft\", { participantId: input.participantId });\n return { success: true, data: {} };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : \"Failed to disconnect participant\",\n };\n }\n }\n\n public addListener(\n eventName: string,\n callback: (payload: Record<string, unknown>) => void\n ): { remove: () => void } {\n const set = this.listeners.get(eventName) ?? new Set<Listener>();\n set.add(callback);\n this.listeners.set(eventName, set);\n return {\n remove: () => {\n const active = this.listeners.get(eventName);\n if (!active) return;\n active.delete(callback);\n if (active.size === 0) {\n this.listeners.delete(eventName);\n }\n },\n };\n }\n\n private emit(eventName: SDKEventName, payload: Record<string, unknown>): void {\n const set = this.listeners.get(eventName);\n if (!set) return;\n set.forEach((listener) => listener(payload));\n }\n\n private bindVoiceEvents(): void {\n this.voice.on(Voice.Event.CallInvite, (invite: any) => {\n const callId = this.readInviteSid(invite) ?? `incoming_${Date.now()}`;\n const from: string =\n (typeof invite.getFrom === \"function\" ? invite.getFrom() : null) ?? \"Unknown\";\n const to: string =\n (typeof invite.getTo === \"function\" ? invite.getTo() : null) ?? \"\";\n console.log(\"[VOIP SDK] received call event\", { callId, from, to });\n this.callInvites.set(callId, invite);\n this.emit(\"onCallRinging\", { callId, direction: \"INBOUND\", from, to });\n\n invite.on(\"cancelled\", () => {\n this.callInvites.delete(callId);\n this.emit(\"onMissedCall\", { callId });\n this.emit(\"onCallEnded\", { callId, reason: \"cancelled\" });\n });\n });\n\n if (typeof (this.voice as any).on === \"function\") {\n (this.voice as any).on(Voice.Event.Registered, () => {\n console.log(\"[VOIP SDK] Device registered (onReady)\");\n this.emit(\"onReady\", {});\n });\n }\n\n this.voice.on(Voice.Event.Error, (error: any) => {\n console.error(\"[VOIP DEBUG] websocket state\", {\n state: \"ERROR\",\n message: error?.message ?? String(error),\n });\n this.emit(\"onError\", {\n scope: \"voice\",\n message: error?.message ?? String(error),\n });\n });\n }\n\n private bindCallEvents(callId: string, call: any): void {\n call.on(\"ringing\", () => {\n console.log(\"[VOIP DEBUG] call ringing\", { callId });\n this.emit(\"onCallStateChanged\", { callId, status: \"RINGING\" });\n });\n call.on(\"connected\", () => {\n console.log(\"[VOIP DEBUG] media stream started\", { callId });\n\n // Capture the real Twilio CallSid (mirrors web SDK conn.on(\"accept\") → conn.parameters.CallSid).\n const tracked = this.calls.get(callId);\n let liveSid: string | null = null;\n if (tracked) {\n liveSid = this.readCallSid(call);\n if (liveSid) {\n tracked.callSid = liveSid;\n this.calls.set(callId, tracked);\n console.log(\"[VOIP DEBUG] callSid captured on connect\", { callId, callSid: liveSid });\n }\n\n // Fetch conference details from backend so hold/resume/merge have the correct conferenceName.\n this.fetchConferenceId(callId, tracked.conferenceName ?? this.defaultConferenceName).catch(\n (err) => console.warn(\"[VOIP SDK] getConferenceId failed after connect\", err)\n );\n }\n\n // Include the real callSid in the event so the UI layer can update activeCall.callId.\n // Falls back to the internal callId so recipients always have a non-null identifier.\n this.emit(\"onCallConnected\", { callId, callSid: liveSid ?? callId, status: \"CONNECTED\" });\n this.emit(\"onCallStateChanged\", { callId, callSid: liveSid ?? callId, status: \"CONNECTED\" });\n });\n call.on(\"reconnecting\", () => {\n console.log(\"[VOIP DEBUG] reconnect attempt\", { callId });\n this.emit(\"onCallStateChanged\", { callId, status: \"RECONNECTING\" });\n });\n call.on(\"disconnected\", (error: any) => {\n this.calls.delete(callId);\n this.emit(\"onCallEnded\", {\n callId,\n reason: error?.message ?? null,\n });\n console.log(\"[VOIP DEBUG] call ended\", {\n callId,\n reason: error?.message ?? null,\n });\n });\n call.on(\"connectFailure\", (error: any) => {\n const reason = error?.message ?? String(error);\n console.error(\"[VOIP DEBUG] call connect failure\", { callId, message: reason });\n // Clean up the tracked call so it doesn't linger\n this.calls.delete(callId);\n // Signal the UI to reset (DIALING → IDLE) before surfacing the error\n this.emit(\"onCallEnded\", { callId, reason });\n this.emit(\"onError\", {\n scope: \"call_connect\",\n callId,\n message: reason,\n });\n });\n }\n\n private async fetchConferenceId(callId: string, conferenceName: string): Promise<void> {\n if (!this.sdkConfig) return;\n console.log(\"[VOIP SDK] fetchConferenceId() start\", { callId, conferenceName });\n try {\n const res = await this.axiosInstance.post(\n `${this.sdkConfig.serverUrl}/outgoingCall.getConferenceId`,\n { conferenceName },\n { headers: { Authorization: `Bearer ${this.sdkConfig.sdkToken}` } }\n );\n const conferenceDetail = res?.data?.result?.data ?? null;\n const tracked = this.calls.get(callId);\n if (tracked && conferenceDetail) {\n // Store conference detail for informational use only.\n // conferenceName is intentionally NOT updated — the original conf_xxx name must\n // be preserved for hold/resume/merge calls, mirroring the web SDK which always\n // uses this.conferenceName (set in the constructor) and never mutates it.\n tracked.conferenceDetail = conferenceDetail as Record<string, unknown>;\n this.calls.set(callId, tracked);\n console.log(\"[VOIP SDK] conference detail stored\", { callId, conferenceDetail });\n }\n this.emit(\"onCallStateChanged\", {\n callId,\n status: \"CONNECTED\",\n conferenceDetail,\n });\n } catch (err) {\n console.warn(\"[VOIP SDK] fetchConferenceId() failed\", err);\n }\n }\n\n private readCallSid(call: any): string | null {\n if (!call) return null;\n if (typeof call.getSid === \"function\") {\n const sid = call.getSid();\n return typeof sid === \"string\" ? sid : null;\n }\n return null;\n }\n\n private readInviteSid(invite: any): string | null {\n if (!invite) return null;\n if (typeof invite.getCallSid === \"function\") {\n const sid = invite.getCallSid();\n return typeof sid === \"string\" ? sid : null;\n }\n return null;\n }\n\n private async postCallControl(\n callId: string,\n endpoint: \"outgoingCall.hold\" | \"outgoingCall.unhold\",\n extraPayload?: Record<string, unknown>\n ): Promise<NativeCommandResult> {\n console.log(\"[VOIP SDK] postCallControl() start\", { callId, endpoint });\n if (!this.sdkConfig) {\n return { success: false, error: \"SDK not initialized\" };\n }\n\n const tracked = this.calls.get(callId);\n const callSid = tracked?.callSid ?? callId;\n const conferenceName = tracked?.conferenceName ?? this.defaultConferenceName;\n\n try {\n await this.axiosInstance.post(\n `${this.sdkConfig.serverUrl}/${endpoint}`,\n {\n callSid,\n conferenceName,\n ...(extraPayload ?? {}),\n },\n {\n headers: {\n Authorization: `Bearer ${this.sdkConfig.sdkToken}`,\n },\n }\n );\n console.log(\"[VOIP SDK] postCallControl() success\", { callId, endpoint });\n return { success: true, data: {} };\n } catch (error) {\n console.error(\"[VOIP SDK] postCallControl() failed\", error);\n return {\n success: false,\n error: error instanceof Error ? error.message : \"Call control failed\",\n };\n }\n }\n\n private captureAccessToken(payload?: AuthPayload): void {\n if (!payload) return;\n console.log(\"[VOIP DEBUG] captureAccessToken() invoked\");\n if (typeof payload.accessToken === \"string\" && payload.accessToken.trim()) {\n this.runtimeAccessToken = payload.accessToken.trim();\n return;\n }\n\n const tokenFromMetadata = payload.metadata?.accessToken;\n if (\n typeof tokenFromMetadata === \"string\" &&\n tokenFromMetadata.trim().length > 0\n ) {\n this.runtimeAccessToken = tokenFromMetadata.trim();\n }\n }\n\n private async generateVoiceAccessToken(): Promise<string> {\n if (!this.sdkConfig) {\n throw new Error(\"SDK not initialized\");\n }\n\n const payload = {\n identity: this.sdkConfig.identity,\n ttl: 3600,\n incomingAllow: true,\n };\n\n console.log(\"[VOIP DEBUG] token generation start\");\n const res = await this.axiosInstance.post(\n `${this.sdkConfig.serverUrl}/voipSdk.generateToken`,\n payload,\n {\n headers: {\n Authorization: `Bearer ${this.sdkConfig.sdkToken}`,\n },\n }\n );\n\n const token =\n res?.data?.result?.data?.token ??\n res?.data?.result?.token ??\n res?.data?.token;\n\n if (typeof token !== \"string\" || token.trim().length === 0) {\n throw new Error(\"Token generation failed: empty access token\");\n }\n\n console.log(\"[VOIP DEBUG] token generation success\");\n return token.trim();\n }\n\n private async registerVoiceClient(token: string): Promise<void> {\n if (!this.isVoiceNativeModuleAvailable()) {\n throw new Error(\n \"Twilio native module not available (TwilioVoiceReactNative). Rebuild app after installing @twilio/voice-react-native-sdk.\"\n );\n }\n\n try {\n const shouldRegisterOnAndroid =\n Platform.OS !== \"android\" ||\n Boolean(\n (this.sdkConfig as SDKConfig & { enableAndroidVoiceRegister?: boolean } | null)\n ?.enableAndroidVoiceRegister\n );\n\n if (!shouldRegisterOnAndroid) {\n console.warn(\n \"[VOIP SDK] Android voice.register() skipped to prevent crash. Enable `enableAndroidVoiceRegister` only after Firebase + Twilio incoming-call push setup.\"\n );\n this.isVoiceRegistered = false;\n return;\n }\n\n if (Platform.OS === \"ios\") {\n await this.voice.initializePushRegistry();\n }\n // Registration can fail if push transport isn't configured.\n // Keep SDK usable for outgoing/config flows when push setup is missing.\n await this.voice.register(token);\n this.isVoiceRegistered = true;\n console.log(\"[VOIP SDK] websocket connected\");\n } catch (error) {\n this.isVoiceRegistered = false;\n throw error;\n }\n }\n\n private isVoiceNativeModuleAvailable(): boolean {\n return Boolean((NativeModules as Record<string, unknown>)?.TwilioVoiceReactNative);\n }\n\n private getVoiceAccessToken(): string | null {\n if (this.runtimeAccessToken && this.runtimeAccessToken.trim()) {\n return this.runtimeAccessToken.trim();\n }\n if (this.sdkConfig?.accessToken && this.sdkConfig.accessToken.trim()) {\n return this.sdkConfig.accessToken.trim();\n }\n return null;\n }\n}\n\n","import type { NativeModule } from \"../core/types\";\nimport { TwilioVoiceAdapter } from \"./twilio-voice-adapter\";\n\nconst defaultNativeModule = new TwilioVoiceAdapter();\n\nexport function resolveNativeModule(custom?: NativeModule): NativeModule {\n if (custom) return custom;\n return defaultNativeModule;\n}\n\n","import { BridgeEventEmitter } from \"./event-emitter\";\nimport { resolveNativeModule } from \"./native-module\";\nimport type { NativeModule, SDKEventName } from \"../core/types\";\n\nexport class BridgeClient {\n public readonly events = new BridgeEventEmitter();\n public readonly nativeModule: NativeModule;\n private nativeSubscriptions: Array<{ remove: () => void }> = [];\n\n constructor(nativeModule?: NativeModule) {\n this.nativeModule = resolveNativeModule(nativeModule);\n console.log(\"[VOIP SDK] BridgeClient initialized\");\n this.subscribeToNativeEvents();\n }\n\n public on(eventName: SDKEventName | string, listener: (payload: Record<string, unknown>) => void): () => void {\n return this.events.on(eventName, listener);\n }\n\n public emit(eventName: SDKEventName | string, payload: Record<string, unknown>): void {\n console.log(\"[VOIP EVENT] bridge emit\", { eventName, payload });\n this.events.emit(eventName, payload);\n }\n\n public destroy(): void {\n this.nativeSubscriptions.forEach((sub) => sub.remove());\n this.nativeSubscriptions = [];\n this.events.removeAllListeners();\n }\n\n private subscribeToNativeEvents(): void {\n if (!this.nativeModule.addListener) return;\n\n const sdkEvents: SDKEventName[] = [\n \"onReady\",\n \"onCallRinging\",\n \"onCallConnected\",\n \"onParticipantJoined\",\n \"onParticipantLeft\",\n \"onCallEnded\",\n \"onCallStateChanged\",\n \"onAuthStateChanged\",\n \"onMissedCall\",\n \"onError\",\n ];\n\n sdkEvents.forEach((eventName) => {\n const sub = this.nativeModule.addListener?.(eventName, (payload) => {\n console.log(\"[VOIP EVENT] native event\", { eventName, payload });\n this.events.emit(eventName, payload);\n });\n if (sub) {\n this.nativeSubscriptions.push(sub);\n }\n });\n }\n}\n\n","import type { AuthPayload, AuthState, ConsumerAuth } from \"../types\";\nimport { RetryPolicy } from \"../retry/retryPolicy\";\n\ninterface AuthTransport {\n authenticate(payload?: AuthPayload): Promise<{ success: boolean; data?: ConsumerAuth; error?: string }>;\n refreshAuth?(): Promise<{ success: boolean; data?: ConsumerAuth; error?: string }>;\n}\n\nexport class AuthManager {\n private authState: AuthState = \"UNAUTHENTICATED\";\n private auth: ConsumerAuth | null = null;\n private refreshTimer: ReturnType<typeof setTimeout> | null = null;\n\n constructor(\n private readonly transport: AuthTransport,\n private readonly retry: RetryPolicy,\n private readonly emit: (eventName: string, payload: Record<string, unknown>) => void\n ) {}\n\n public getState(): AuthState {\n return this.authState;\n }\n\n public getAuth(): ConsumerAuth | null {\n return this.auth;\n }\n\n public async authenticate(payload?: AuthPayload): Promise<ConsumerAuth> {\n console.log(\"[VOIP SDK] auth started\");\n console.log(\"[VOIP DEBUG] token validation\", {\n hasAccessToken: Boolean(payload?.accessToken),\n });\n this.setState(\"AUTHENTICATING\");\n const result = await this.retry.execute(\n async () => this.transport.authenticate(payload),\n { operation: \"token_exchange\" }\n );\n\n if (!result.success || !result.data) {\n this.setState(\"UNAUTHENTICATED\");\n console.error(\"[VOIP SDK] auth failed\", {\n message: result.error ?? \"Authentication failed\",\n });\n throw new Error(result.error ?? \"Authentication failed\");\n }\n\n this.auth = result.data;\n this.setState(\"AUTHENTICATED\");\n this.scheduleRefresh();\n console.log(\"[VOIP SDK] auth success\", {\n consumerId: result.data.consumerId,\n expiresAt: result.data.expiresAt,\n });\n return result.data;\n }\n\n public async refreshIfNeeded(): Promise<void> {\n console.log(\"[VOIP DEBUG] refreshIfNeeded() start\");\n if (!this.auth) {\n this.setState(\"EXPIRED\");\n throw new Error(\"No auth session to refresh\");\n }\n\n if (!this.transport.refreshAuth) return;\n this.setState(\"REFRESHING\");\n\n const result = await this.retry.execute(\n async () => this.transport.refreshAuth?.() ?? { success: false, error: \"refresh not supported\" },\n { operation: \"token_refresh\" }\n );\n\n const data = result.success ? (result as { data?: ConsumerAuth }).data : undefined;\n const error = !result.success ? (result as { error?: string }).error : undefined;\n\n if (!result.success || !data) {\n this.auth = null;\n this.setState(\"EXPIRED\");\n console.error(\"[VOIP DEBUG] token refresh failed\", {\n message: error ?? \"Token refresh failed\",\n });\n throw new Error(error ?? \"Token refresh failed\");\n }\n\n this.auth = data;\n this.setState(\"AUTHENTICATED\");\n this.scheduleRefresh();\n console.log(\"[VOIP DEBUG] token refresh success\");\n }\n\n public destroy(): void {\n if (this.refreshTimer) {\n clearTimeout(this.refreshTimer);\n this.refreshTimer = null;\n }\n this.auth = null;\n this.setState(\"UNAUTHENTICATED\");\n }\n\n private setState(nextState: AuthState): void {\n this.authState = nextState;\n this.emit(\"onAuthStateChanged\", { state: nextState });\n }\n\n private scheduleRefresh(): void {\n if (!this.auth?.expiresAt) return;\n if (this.refreshTimer) clearTimeout(this.refreshTimer);\n\n const now = Date.now();\n const refreshAt = Math.max(now, this.auth.expiresAt - 2 * 60 * 1000);\n const delay = Math.max(1_000, refreshAt - now);\n\n this.refreshTimer = setTimeout(() => {\n void this.refreshIfNeeded().catch((error) => {\n this.emit(\"onError\", {\n scope: \"auth\",\n message: error instanceof Error ? error.message : String(error),\n });\n });\n }, delay);\n }\n}\n\n","import { RetryPolicy } from \"../retry/retryPolicy\";\nimport type { CallSession, CallState, NativeModule } from \"../types\";\n\nexport class CallEngine {\n private sessions = new Map<string, CallSession>();\n\n constructor(\n private readonly nativeModule: NativeModule,\n private readonly retry: RetryPolicy,\n private readonly emit: (eventName: string, payload: Record<string, unknown>) => void\n ) {}\n\n public getSession(callId: string): CallSession | undefined {\n return this.sessions.get(callId);\n }\n\n public async startCall(number: string): Promise<CallSession> {\n console.log(\"[VOIP SDK] startCall() invoked\", { number });\n const callId = `call_${Date.now()}_${Math.floor(Math.random() * 1000)}`;\n const result = await this.retry.execute(\n async () => this.nativeModule.startCall({ number, callId }),\n { operation: \"call_setup\" }\n );\n\n if (!result.success || !result.data) {\n console.error(\"[VOIP SDK] call request failed\", {\n message: result.error ?? \"Failed to start call\",\n });\n throw new Error(result.error ?? \"Failed to start call\");\n }\n\n console.log(\"[VOIP DEBUG] dial request success\", {\n callId: result.data.callId,\n });\n this.sessions.set(result.data.callId, result.data);\n this.emit(\"onCallStateChanged\", {\n callId: result.data.callId,\n status: result.data.status,\n direction: result.data.direction,\n });\n return result.data;\n }\n\n public async answerCall(callId: string): Promise<void> {\n await this.execCallCommand(\"answerCall\", callId, \"ANSWERED\");\n }\n\n public async endCall(callId: string): Promise<void> {\n console.log(\"[VOIP SDK] endCall() invoked\", { callId });\n await this.execCallCommand(\"endCall\", callId, \"ENDED\");\n console.log(\"[VOIP DEBUG] call ended\", { callId });\n this.emit(\"onCallEnded\", { callId });\n }\n\n public async holdCall(callId: string): Promise<void> {\n await this.execCallCommand(\"holdCall\", callId, \"ON_HOLD\");\n }\n\n public async resumeCall(callId: string): Promise<void> {\n await this.execCallCommand(\"resumeCall\", callId, \"RESUMED\");\n }\n\n public async toggleMute(callId: string, mute: boolean): Promise<void> {\n console.log(\"[VOIP SDK] toggleMute() invoked\", { callId, mute });\n if (!this.nativeModule.toggleMute) {\n throw new Error(\"toggleMute not supported by native module\");\n }\n const result = await this.retry.execute(\n async () => this.nativeModule.toggleMute!({ callId, mute }),\n { operation: \"call_control_toggleMute\" }\n );\n if (!result.success) {\n throw new Error(result.error ?? \"Failed to toggle mute\");\n }\n this.emit(\"onCallStateChanged\", { callId, muted: mute });\n console.log(\"[VOIP SDK] toggleMute() success\", { callId, mute });\n }\n\n public async mergeCall(callId: string): Promise<CallSession> {\n const result = await this.retry.execute(\n async () => this.nativeModule.mergeCall({ callId }),\n { operation: \"merge_call\" }\n );\n\n if (!result.success || !result.data) {\n throw new Error(result.error ?? \"Failed to merge call\");\n }\n\n this.sessions.set(result.data.callId, result.data);\n this.emit(\"onCallStateChanged\", {\n callId: result.data.callId,\n status: result.data.status,\n direction: result.data.direction,\n });\n return result.data;\n }\n\n private async execCallCommand(\n methodName: \"answerCall\" | \"endCall\" | \"holdCall\" | \"resumeCall\",\n callId: string,\n status: CallState\n ): Promise<void> {\n console.log(\"[VOIP SDK] call control start\", { methodName, callId, status });\n const result = await this.retry.execute(\n async () => this.nativeModule[methodName]({ callId }),\n { operation: `call_control_${methodName}` }\n );\n\n if (!result.success) {\n console.error(\"[VOIP SDK] call control failure\", {\n methodName,\n callId,\n message: result.error ?? `Failed ${methodName}`,\n });\n throw new Error(result.error ?? `Failed ${methodName}`);\n }\n\n const existing = this.sessions.get(callId);\n if (existing) {\n existing.status = status;\n this.sessions.set(callId, existing);\n }\n\n this.emit(\"onCallStateChanged\", { callId, status });\n console.log(\"[VOIP SDK] call control success\", { methodName, callId, status });\n }\n}\n\n","import axios, { AxiosInstance } from \"axios\";\nimport type { CallResponse, SetRoutingConfigInput, SetRoutingConfigResult, WelcomeConfigResult, CreateParseRuleInput, ListParseRulesInput, ListParseRulesResult, WebhookConfigResult } from \"../../../../types/interface\";\nimport { createParseRule, listParseRules } from \"../../../parseRules\";\nimport { getRoutingConfig, setRoutingConfig } from \"../../../routingConfig\";\nimport { deregisterWebhook, isWebhookConfigured, registerWebhook } from \"../../../webhook\";\nimport { welcomeMessageConfig } from \"../../../welcomeMessageConfig\";\n\ninterface ConfigDeps {\n serverUrl: string;\n sdkToken: string;\n ensureAuthenticated: () => void;\n}\n\nexport class ConfigService {\n private readonly axiosInstance: AxiosInstance;\n\n constructor(private readonly deps: ConfigDeps) {\n this.axiosInstance = axios.create();\n this.axiosInstance.defaults.baseURL = deps.serverUrl;\n }\n\n public setAccessToken(token: string): void {\n this.axiosInstance.defaults.headers.common.Authorization = `Bearer ${token}`;\n }\n\n public async getRoutingConfig() {\n return getRoutingConfig(this.withDeps());\n }\n\n public async setRoutingConfig(\n input: SetRoutingConfigInput\n ): Promise<CallResponse<SetRoutingConfigResult>> {\n return setRoutingConfig(this.withDeps(), input);\n }\n\n public async createParseRule(input: CreateParseRuleInput) {\n return createParseRule(this.withDeps(), input);\n }\n\n public async listParseRules(\n input?: ListParseRulesInput\n ): Promise<CallResponse<ListParseRulesResult>> {\n return listParseRules(this.withDeps(), input);\n }\n\n public async registerWebhook(\n webhookUrl: string\n ): Promise<CallResponse<{ webhookUrl: string }>> {\n return registerWebhook(this.withDeps(), webhookUrl);\n }\n\n public async deregisterWebhook(): Promise<CallResponse<null>> {\n return deregisterWebhook(this.withDeps());\n }\n\n public async isWebhookConfigured(): Promise<CallResponse<WebhookConfigResult>> {\n return isWebhookConfigured(this.withDeps());\n }\n\n public async welcomeMessageConfig(\n welcomeType: \"audio\" | \"tts\",\n welcomeMessage: string\n ): Promise<CallResponse<WelcomeConfigResult>> {\n return welcomeMessageConfig(this.withDeps(), { welcomeType, welcomeMessage });\n }\n\n private withDeps() {\n return {\n axiosInstance: this.axiosInstance,\n serverUrl: this.deps.serverUrl,\n sdkToken: this.deps.sdkToken,\n ensureAuthenticated: this.deps.ensureAuthenticated,\n };\n }\n}\n\n","import { createErrorResult, createSuccessResult } from \"../utils/helper\";\nimport type {\n CallResponse,\n ParseRuleDeps,\n ParseRuleRow,\n CreateParseRuleResult,\n CreateParseRuleInput,\n ListParseRulesInput,\n ListParseRulesResult,\n RoutingConfigDeps,\n} from \"../types/interface\";\n\n/* ------------------------------------------------------------------ */\n/* API: Create / Replace Parse Rules */\n/* ------------------------------------------------------------------ */\n\nexport async function createParseRule(\n deps: RoutingConfigDeps,\n input: CreateParseRuleInput\n): Promise<CallResponse<CreateParseRuleResult[]>> {\n deps.ensureAuthenticated();\n\n try {\n const res = await deps.axiosInstance.post(\n `${deps.serverUrl}/voipSdk.createParseRule`,\n input,\n {\n headers: {\n Authorization: `Bearer ${deps.sdkToken}`,\n },\n }\n );\n\n const data = res?.data?.result ?? res?.data ?? null;\n\n if (!data) {\n throw new Error(\"Invalid response from server\");\n }\n\n return createSuccessResult(\n \"Parse rule configuration created successfully\",\n data\n );\n } catch (error) {\n return createErrorResult(\n error instanceof Error\n ? error.message\n : \"Failed to create parse rule configuration\"\n );\n }\n}\n\n\n/* ------------------------------------------------------------------ */\n/* API: List Parse Rules (with filters & pagination) */\n/* ------------------------------------------------------------------ */\n\nexport async function listParseRules(\n deps: ParseRuleDeps,\n input?: ListParseRulesInput\n): Promise<CallResponse<ListParseRulesResult>> {\n deps.ensureAuthenticated();\n\n try {\n const res = await deps.axiosInstance.post(\n `${deps.serverUrl}/voipSdk.listParseRules`,\n input ?? {},\n {\n headers: {\n Authorization: `Bearer ${deps.sdkToken}`,\n },\n }\n );\n\n const data = res?.data?.result ?? res?.data ?? null;\n if (!data) {\n throw new Error(\"Invalid response from server\");\n }\n\n return createSuccessResult(\n \"Parse rules fetched successfully\",\n data\n );\n } catch (error) {\n return createErrorResult(\n error instanceof Error\n ? error.message\n : \"Failed to list parse rules\"\n );\n }\n}\n","import { createErrorResult, createSuccessResult } from \"../utils/helper\";\nimport type {\n CallResponse,\n RoutingMember,\n GetRoutingConfigResult,\n SetRoutingConfigInput,\n SetRoutingConfigResult,\n RoutingConfigDeps,\n} from \"../types/interface\";\n\n/* ------------------------------------------------------------------ */\n/* API: Get Routing Config */\n/* ------------------------------------------------------------------ */\n\nexport async function getRoutingConfig(\n deps: RoutingConfigDeps\n): Promise<CallResponse<GetRoutingConfigResult>> {\n deps.ensureAuthenticated();\n\n try {\n const res = await deps.axiosInstance.get(\n `${deps.serverUrl}/voipSdk.getRoutingConfig`,\n {\n headers: {\n Authorization: `Bearer ${deps.sdkToken}`,\n },\n }\n );\n\n const data = res?.data?.result ?? res?.data ?? null;\n if (!data) {\n throw new Error(\"Invalid response from server\");\n }\n\n return createSuccessResult(\n \"Routing configuration fetched successfully\",\n data\n );\n } catch (error) {\n return createErrorResult(\n error instanceof Error\n ? error.message\n : \"Failed to fetch routing configuration\"\n );\n }\n}\n\n/* ------------------------------------------------------------------ */\n/* API: Set Routing Config */\n/* ------------------------------------------------------------------ */\n\nexport async function setRoutingConfig(\n deps: RoutingConfigDeps,\n input: SetRoutingConfigInput\n): Promise<CallResponse<SetRoutingConfigResult>> {\n deps.ensureAuthenticated();\n\n try {\n const res = await deps.axiosInstance.post(\n `${deps.serverUrl}/voipSdk.setRoutingConfig`,\n input,\n {\n headers: {\n Authorization: `Bearer ${deps.sdkToken}`,\n },\n }\n );\n\n const data = res?.data?.result ?? res?.data ?? null;\n if (!data) {\n throw new Error(\"Invalid response from server\");\n }\n\n return createSuccessResult(\n data.message || \"Routing configuration updated successfully\",\n data\n );\n } catch (error) {\n return createErrorResult(\n error instanceof Error\n ? error.message\n : \"Failed to update routing configuration\"\n );\n }\n}\n","import type { AxiosInstance } from \"axios\";\nimport { createErrorResult, createSuccessResult } from \"../utils/helper\";\nimport type {\n CallResponse,\n DeregisterWebhookPayload,\n RegisterWebhookPayload,\n WebhookConfigResult,\n} from \"../types/interface\";\n\nexport interface WebhookDeps {\n axiosInstance: AxiosInstance;\n serverUrl: string;\n sdkToken: string;\n ensureAuthenticated: () => void;\n}\n\nexport function validateWebhookUrl(webhookUrl: string): string {\n const trimmed = (webhookUrl ?? \"\").trim();\n if (!trimmed) throw new Error(\"Webhook URL is required\");\n\n let parsed: URL;\n try {\n parsed = new URL(trimmed);\n } catch {\n throw new Error(\"Invalid webhook URL\");\n }\n\n if (parsed.protocol !== \"https:\" && parsed.protocol !== \"http:\") {\n throw new Error(\"Webhook URL must start with http:// or https://\");\n }\n\n return parsed.toString();\n}\n\nexport async function registerWebhook(\n deps: WebhookDeps,\n webhookUrl: string\n): Promise<CallResponse<{ webhookUrl: string }>> {\n deps.ensureAuthenticated();\n\n try {\n const normalizedUrl = validateWebhookUrl(webhookUrl);\n const payload: RegisterWebhookPayload = { webhookUrl: normalizedUrl };\n\n await deps.axiosInstance.post(\n `${deps.serverUrl}/voipSdk.registerWebhook`,\n payload,\n { headers: { Authorization: `Bearer ${deps.sdkToken}` } }\n );\n\n return createSuccessResult(\"Webhook registered\", { webhookUrl: normalizedUrl });\n } catch (error) {\n return createErrorResult(\n error instanceof Error ? error : \"Webhook registration failed\"\n );\n }\n}\n\nexport async function deregisterWebhook(\n deps: WebhookDeps\n): Promise<CallResponse<null>> {\n deps.ensureAuthenticated();\n\n try {\n const payload: DeregisterWebhookPayload = {};\n\n await deps.axiosInstance.post(\n `${deps.serverUrl}/voipSdk.deRegisterWebHook`,\n payload,\n { headers: { Authorization: `Bearer ${deps.sdkToken}` } }\n );\n\n return createSuccessResult(\"Webhook deregistered\", null);\n } catch (error) {\n return createErrorResult(\n error instanceof Error ? error : \"Webhook deregistration failed\"\n );\n }\n}\n\nexport async function isWebhookConfigured(\n deps: WebhookDeps\n): Promise<CallResponse<WebhookConfigResult>> {\n deps.ensureAuthenticated();\n\n try {\n const res = await deps.axiosInstance.get(\n `${deps.serverUrl}/voipSdk.isConfiguredWebhookUrl`,\n { headers: { Authorization: `Bearer ${deps.sdkToken}` } }\n );\n\n const data = res?.data?.result?.data ?? res?.data?.data ?? null;\n const rawUrl =\n (data?.webhookUrl as string | undefined) ??\n (data?.url as string | undefined) ??\n (typeof data === \"string\" ? data : undefined);\n\n const url = rawUrl ? String(rawUrl) : null;\n const configured = Boolean(url);\n\n const result: WebhookConfigResult = { configured, webhookUrl: url };\n\n return createSuccessResult(\"Webhook configuration fetched\", result);\n } catch (error) {\n return createErrorResult(\n error instanceof Error ? error : \"Webhook configuration check failed\"\n );\n }\n}\n\n","import { createErrorResult, createSuccessResult } from \"../utils/helper\";\nimport type { CallResponse } from \"../types/interface\";\nimport type {\n WelcomeConfigResult,\n UpsertWelcomeConfigInput,\n WelcomeConfigDeps\n} from \"../types/interface\";\n\n\n/**\n * -------------------------\n * Validation helpers\n * -------------------------\n */\nfunction isUrl(value: string): boolean {\n try {\n const url = new URL(value);\n return url.protocol === \"http:\" || url.protocol === \"https:\";\n } catch {\n return false;\n }\n}\n\nfunction isAudioLikeInput(value: string): boolean {\n return (\n value.startsWith(\"http://\") ||\n value.startsWith(\"https://\") ||\n value.startsWith(\"data:audio/\")\n );\n}\n\nexport function validateWelcomeConfigInput(\n input: UpsertWelcomeConfigInput\n): UpsertWelcomeConfigInput {\n const welcomeMessage = input.welcomeMessage?.trim();\n\n if (!welcomeMessage) {\n throw new Error(\"Payload is missing or empty. welcomeMessage is required.\");\n }\n\n if (input.welcomeType === \"tts\") {\n if (isAudioLikeInput(welcomeMessage)) {\n throw new Error(\n \"welcomeType is tts but input appears to be audio. Only text is allowed for TTS.\"\n );\n }\n }\n\n if (input.welcomeType === \"audio\") {\n if (!isUrl(welcomeMessage)) {\n throw new Error(\n \"welcomeType is audio but welcomeMessage must be a valid URL (e.g. S3 URL).\"\n );\n }\n }\n\n return {\n welcomeType: input.welcomeType,\n welcomeMessage,\n };\n}\n\n/**\n * -------------------------\n * API: Welcome Message Config\n * -------------------------\n */\nexport async function welcomeMessageConfig(\n deps: WelcomeConfigDeps,\n input: UpsertWelcomeConfigInput\n): Promise<CallResponse<WelcomeConfigResult>> {\n deps.ensureAuthenticated();\n\n try {\n const payload = validateWelcomeConfigInput(input);\n\n const res = await deps.axiosInstance.post(\n `${deps.serverUrl}/voipSdk.welcomeMessageConfig`,\n payload,\n {\n headers: {\n Authorization: `Bearer ${deps.sdkToken}`,\n },\n }\n );\n\n const data =\n res?.data?.result ??\n res?.data ??\n null;\n\n if (!data) {\n throw new Error(\"Invalid response from server\");\n }\n\n return createSuccessResult(\n data.message || \"Welcome configuration updated successfully\",\n {\n success: data.success,\n message: data.message,\n welcomeType: data.welcomeType,\n routingConfigId: data.routingConfigId,\n }\n );\n } catch (error) {\n return createErrorResult(\n error instanceof Error ? error : \"Failed to upsert welcome configuration\"\n );\n }\n}\n","import { RetryPolicy } from \"../retry/retryPolicy\";\nimport type { NativeModule, Participant } from \"../types\";\n\nexport class ConferenceManager {\n constructor(\n private readonly nativeModule: NativeModule,\n private readonly retry: RetryPolicy,\n private readonly emit: (eventName: string, payload: Record<string, unknown>) => void\n ) {}\n\n public async getParticipants(callId: string): Promise<Participant[]> {\n const result = await this.retry.execute(\n async () => this.nativeModule.getParticipants({ callId }),\n { operation: \"participant_fetch\" }\n );\n\n if (!result.success || !result.data) {\n throw new Error(result.error ?? \"Failed to fetch participants\");\n }\n return result.data;\n }\n\n public async disconnectParticipant(participantId: string): Promise<void> {\n const result = await this.retry.execute(\n async () => this.nativeModule.disconnectParticipant({ participantId }),\n { operation: \"participant_disconnect\" }\n );\n\n if (!result.success) {\n throw new Error(result.error ?? \"Failed to disconnect participant\");\n }\n\n this.emit(\"onParticipantLeft\", { participantId });\n }\n}\n\n","import type { RetryContext, RetryPolicyConfig } from \"../types\";\n\nconst DEFAULT_RETRY_POLICY: RetryPolicyConfig = {\n maxRetries: 4,\n baseDelayMs: 400,\n maxDelayMs: 8_000,\n jitterRatio: 0.25,\n circuitBreakerThreshold: 5,\n circuitBreakerCooldownMs: 15_000,\n};\n\nfunction wait(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport class CircuitBreaker {\n private failureCount = 0;\n private openedAt = 0;\n\n constructor(\n private readonly threshold: number,\n private readonly cooldownMs: number\n ) {}\n\n public canExecute(): boolean {\n if (this.failureCount < this.threshold) return true;\n if (Date.now() - this.openedAt > this.cooldownMs) {\n this.failureCount = 0;\n this.openedAt = 0;\n return true;\n }\n return false;\n }\n\n public recordSuccess(): void {\n this.failureCount = 0;\n this.openedAt = 0;\n }\n\n public recordFailure(): void {\n this.failureCount += 1;\n if (this.failureCount >= this.threshold && this.openedAt === 0) {\n this.openedAt = Date.now();\n }\n }\n}\n\nexport class RetryPolicy {\n private readonly config: RetryPolicyConfig;\n private readonly breaker: CircuitBreaker;\n\n constructor(config?: Partial<RetryPolicyConfig>) {\n this.config = { ...DEFAULT_RETRY_POLICY, ...config };\n this.breaker = new CircuitBreaker(\n this.config.circuitBreakerThreshold,\n this.config.circuitBreakerCooldownMs\n );\n }\n\n public async execute<T>(\n task: () => Promise<T>,\n context: RetryContext\n ): Promise<T> {\n console.log(\"[VOIP DEBUG] retry.execute() start\", {\n operation: context.operation,\n maxRetries: this.config.maxRetries,\n });\n if (!this.breaker.canExecute()) {\n console.error(\"[VOIP DEBUG] circuit breaker open\", {\n operation: context.operation,\n });\n throw new Error(`Circuit open for operation: ${context.operation}`);\n }\n\n let attempt = 0;\n let lastError: unknown;\n\n while (attempt <= this.config.maxRetries) {\n try {\n if (attempt > 0) {\n console.log(\"[VOIP DEBUG] reconnect attempt\", {\n operation: context.operation,\n retryCount: attempt,\n });\n }\n const result = await task();\n this.breaker.recordSuccess();\n console.log(\"[VOIP DEBUG] retry.execute() success\", {\n operation: context.operation,\n attempt,\n });\n return result;\n } catch (error) {\n lastError = error;\n this.breaker.recordFailure();\n console.error(\"[VOIP DEBUG] retry.execute() failure\", {\n operation: context.operation,\n attempt,\n message: error instanceof Error ? error.message : String(error),\n });\n\n if (attempt === this.config.maxRetries) break;\n\n const baseDelay = Math.min(\n this.config.baseDelayMs * 2 ** attempt,\n this.config.maxDelayMs\n );\n const jitter =\n baseDelay * this.config.jitterRatio * (Math.random() * 2 - 1);\n const delay = Math.max(0, Math.floor(baseDelay + jitter));\n\n console.log(\"[VOIP DEBUG] websocket state\", {\n operation: context.operation,\n state: \"RETRY_WAIT\",\n delayMs: delay,\n });\n await wait(delay);\n attempt += 1;\n }\n }\n\n console.error(\"[VOIP DEBUG] retry.execute() exhausted\", {\n operation: context.operation,\n });\n throw lastError instanceof Error\n ? lastError\n : new Error(`Retry failed for operation: ${context.operation}`);\n }\n}\n\n","import { createErrorResult, createSuccessResult } from \"../../../utils/helper\";\nimport type {\n CallResponse,\n Config,\n CreateParseRuleInput,\n ListParseRulesInput,\n SetRoutingConfigInput,\n} from \"../../../types/interface\";\nimport { BridgeClient } from \"../bridge\";\nimport { AuthManager } from \"../core/auth/authManager\";\nimport { CallEngine } from \"../core/call-engine/callEngine\";\nimport { ConfigService } from \"../core/config/configService\";\nimport { ConferenceManager } from \"../core/conference/conferenceManager\";\nimport { RetryPolicy } from \"../core/retry/retryPolicy\";\nimport type {\n AuthPayload,\n CallSession,\n MakeCallOptions,\n NativeModule,\n Participant,\n SDKConfig,\n SDKEventName,\n} from \"../core/types\";\n\nfunction logVoipDebug(message: string, payload?: Record<string, unknown>): void {\n if (payload) {\n console.log(`[VOIP SDK] ${message}`, payload);\n return;\n }\n console.log(`[VOIP SDK] ${message}`);\n}\n\nexport class ReactNativeVoipSdk {\n private readonly sdkConfig: SDKConfig;\n protected readonly bridge: BridgeClient;\n private readonly retry: RetryPolicy;\n private readonly authManager: AuthManager;\n private readonly callEngine: CallEngine;\n private readonly conferenceManager: ConferenceManager;\n private readonly configService: ConfigService;\n private initialized = false;\n protected activeCallId: string | null = null;\n /** Tracks every in-flight call leg (parallel or single); kept in sync with native `onCallEnded`. */\n protected activeCallIds = new Set<string>();\n private unsubscribeOnCallEnded: (() => void) | null = null;\n protected internalConferenceName: string;\n\n constructor(config: Config, nativeModule?: NativeModule) {\n logVoipDebug(\"constructor() invoked\", {\n hasServerUrl: Boolean(config.serverUrl),\n hasIdentity: Boolean(config.identity),\n hasSdkToken: Boolean(config.sdkToken),\n hasAccessToken: Boolean(config.accessToken),\n });\n\n this.internalConferenceName = `conf_${config.identity}_${Date.now()}`;\n\n this.sdkConfig = {\n serverUrl: config.serverUrl,\n consumerId: config.identity,\n identity: config.identity,\n sdkToken: config.sdkToken,\n accessToken: config.accessToken,\n waitUrl: config.waitUrl,\n };\n\n this.bridge = new BridgeClient(nativeModule);\n this.retry = new RetryPolicy(config.retry);\n\n this.authManager = new AuthManager(\n {\n authenticate: async (payload?: AuthPayload) =>\n this.bridge.nativeModule.authenticate(payload),\n refreshAuth: async () =>\n this.bridge.nativeModule.refreshAuth?.() ?? {\n success: false,\n error: \"Native refreshAuth not implemented\",\n },\n },\n this.retry,\n (eventName, payload) => this.bridge.emit(eventName, payload)\n );\n\n this.callEngine = new CallEngine(\n this.bridge.nativeModule,\n this.retry,\n (eventName, payload) => this.bridge.emit(eventName, payload)\n );\n\n this.conferenceManager = new ConferenceManager(\n this.bridge.nativeModule,\n this.retry,\n (eventName, payload) => this.bridge.emit(eventName, payload)\n );\n\n this.configService = new ConfigService({\n serverUrl: this.sdkConfig.serverUrl,\n sdkToken: this.sdkConfig.sdkToken,\n ensureAuthenticated: this.ensureAuthenticated.bind(this),\n });\n\n // Subscribe to the onCallEnded event to update the active call ids and active call id\n this.unsubscribeOnCallEnded = this.bridge.on(\"onCallEnded\", (payload) => {\n const callId = typeof payload.callId === \"string\" ? payload.callId : null;\n if (!callId) return;\n this.activeCallIds.delete(callId);\n if (this.activeCallId === callId) {\n this.activeCallId = this.pickNextActiveCallId();\n }\n });\n }\n\n public on(eventName: SDKEventName | string, listener: (payload: Record<string, unknown>) => void): () => void {\n return this.bridge.on(eventName, listener);\n }\n\n public async initializeSDK(config?: Partial<SDKConfig>): Promise<void> {\n logVoipDebug(\"initializeSDK() called\");\n if (this.initialized) return;\n const mergedConfig = { ...this.sdkConfig, ...config };\n const result = await this.bridge.nativeModule.initializeSDK(mergedConfig);\n if (!result.success) {\n logVoipDebug(\"initializeSDK() failed\", {\n error: result.error ?? \"Failed to initialize native VOIP SDK\",\n });\n throw new Error(result.error ?? \"Failed to initialize native VOIP SDK\");\n }\n this.initialized = true;\n logVoipDebug(\"initializeSDK() success\");\n }\n\n public async authenticate(payload?: AuthPayload) {\n logVoipDebug(\"authenticate() start\", {\n hasAccessToken: Boolean(payload?.accessToken),\n });\n const auth = await this.authManager.authenticate(payload);\n this.configService.setAccessToken(auth.accessToken);\n logVoipDebug(\"authenticate() success\", {\n consumerId: auth.consumerId,\n expiresAt: auth.expiresAt,\n });\n return auth;\n }\n\n public async startCall(number: string): Promise<CallSession> {\n logVoipDebug(\"startCall() invoked\", { number });\n this.ensureAuthenticated();\n const session = await this.callEngine.startCall(number);\n this.activeCallIds.add(session.callId);\n this.activeCallId = session.callId;\n logVoipDebug(\"startCall() success\", { callId: session.callId });\n return session;\n }\n\n public async answerCall(callId: string): Promise<void> {\n this.ensureAuthenticated();\n await this.callEngine.answerCall(callId);\n }\n\n public async endCall(callId: string): Promise<void> {\n logVoipDebug(\"endCall() invoked\", { callId });\n this.ensureAuthenticated();\n await this.callEngine.endCall(callId);\n this.activeCallIds.delete(callId);\n if (this.activeCallId === callId) {\n this.activeCallId = this.pickNextActiveCallId();\n }\n logVoipDebug(\"endCall() success\", { callId });\n }\n\n public async holdCall(callId: string): Promise<void> {\n this.ensureAuthenticated();\n await this.callEngine.holdCall(callId);\n }\n\n public async resumeCall(callId: string): Promise<void> {\n this.ensureAuthenticated();\n await this.callEngine.resumeCall(callId);\n }\n\n public async mergeCall(callId: string): Promise<CallSession> {\n this.ensureAuthenticated();\n return this.callEngine.mergeCall(callId);\n }\n\n public async getParticipants(callId: string): Promise<Participant[]> {\n this.ensureAuthenticated();\n return this.conferenceManager.getParticipants(callId);\n }\n\n public async disconnectParticipant(participantId: string): Promise<void> {\n this.ensureAuthenticated();\n await this.conferenceManager.disconnectParticipant(participantId);\n }\n\n // Backward-compatible aliases\n public async init(): Promise<void> {\n return this.initializeSDK();\n }\n\n public async verifySDKToken(): Promise<boolean> {\n try {\n await this.authenticate();\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Start a call or add to a conference.\n * Use `makeCall(to, { parallel: true })` (or `addCall(to)`) while a call is active to open a second\n * independent leg; failures on that leg are isolated to its `callId` in `onError` / `onCallEnded`.\n */\n public async makeCall(to: string, options?: MakeCallOptions): Promise<CallResponse<CallSession>> {\n logVoipDebug(\"makeCall() start\", {\n to,\n hasActiveCall: Boolean(this.activeCallId),\n parallel: Boolean(options?.parallel),\n });\n try {\n const destination = to.trim();\n if (!destination) {\n return createErrorResult(\"Destination required\");\n }\n\n // ── Path A: No active call — start a fresh outgoing call ─────────────────\n // Mirrors: web SDK `if (!this.activeConnection) { conn = device.connect(...) }`\n if (!this.activeCallId) {\n const data = await this.startCall(destination);\n logVoipDebug(\"makeCall() new call started\", { callId: data.callId });\n return createSuccessResult(\"Call started\", data);\n }\n\n // ── Path A2: Parallel second leg (same Twilio device, separate `voice.connect`) ─────────\n if (options?.parallel) {\n const data = await this.startCall(destination);\n logVoipDebug(\"makeCall() parallel call started\", { callId: data.callId });\n return createSuccessResult(\"Parallel call started\", data);\n }\n\n // ── Path B: Active call exists — hold it and add participant ──────────────\n // Mirrors: web SDK `holdAndAddParticipant(activeConnection.parameters.CallSid, to)`\n // For OUTBOUND calls → POST outgoingCall.addNewCallee\n // For INBOUND calls → POST outgoingCall.addNewCalleeIncoming\n if (!this.bridge.nativeModule.addNewCallee) {\n return createErrorResult(\"addNewCallee not supported by native module\");\n }\n\n const result = await this.bridge.nativeModule.addNewCallee({\n callId: this.activeCallId,\n newParticipantNo: destination,\n });\n\n if (!result.success) {\n logVoipDebug(\"makeCall() addNewCallee failed\", { error: result.error });\n return createErrorResult(result.error ?? \"Failed to add participant\");\n }\n\n // Return the existing call session so the UI layer keeps the same activeCall.\n const existingSession = this.callEngine.getSession(this.activeCallId);\n const session: CallSession = existingSession ?? {\n callId: this.activeCallId,\n direction: \"OUTBOUND\",\n status: \"MERGED\",\n participants: [],\n conferenceRoomId: null,\n };\n\n logVoipDebug(\"makeCall() participant added\", {\n callId: this.activeCallId,\n newParticipantNo: destination,\n });\n return createSuccessResult(\"Participant added\", session);\n } catch (error) {\n logVoipDebug(\"makeCall() failure\", {\n message: error instanceof Error ? error.message : String(error),\n });\n return createErrorResult(error instanceof Error ? error : \"Failed to start call\");\n }\n }\n\n /** Start a parallel outbound call while another call is active (alias for `makeCall(to, { parallel: true })`). */\n public async addCall(to: string): Promise<CallResponse<CallSession>> {\n return this.makeCall(to, { parallel: true });\n }\n\n /** All active call legs (parallel-aware). */\n public getActiveCallIds(): string[] {\n return [...this.activeCallIds];\n }\n\n public async acceptCall(callId?: string): Promise<CallResponse<null>> {\n try {\n const id = callId ?? this.activeCallId;\n if (!id) return createErrorResult(\"No active call to answer\");\n await this.answerCall(id);\n return createSuccessResult(\"Call accepted\", null);\n } catch (error) {\n return createErrorResult(error instanceof Error ? error : \"Failed to accept call\");\n }\n }\n\n public async rejectCall(callId: string): Promise<CallResponse<null>> {\n try {\n if (!this.bridge.nativeModule.rejectCall) {\n return createErrorResult(\"rejectCall not supported by native module\");\n }\n const result = await this.bridge.nativeModule.rejectCall({ callId });\n if (!result.success) {\n return createErrorResult(result.error ?? \"Failed to reject call\");\n }\n return createSuccessResult(\"Call rejected\", null);\n } catch (error) {\n return createErrorResult(error instanceof Error ? error : \"Failed to reject call\");\n }\n }\n\n public async hangup(callId?: string): Promise<CallResponse<null>> {\n try {\n const id = callId ?? this.activeCallId;\n if (!id) return createErrorResult(\"No active call to end\");\n await this.endCall(id);\n return createSuccessResult(\"Call ended\", null);\n } catch (error) {\n return createErrorResult(error instanceof Error ? error : \"Failed to end call\");\n }\n }\n\n public async hold(callId: string): Promise<CallResponse<null>> {\n try {\n await this.holdCall(callId);\n return createSuccessResult(\"Call held successfully\", null);\n } catch (error) {\n return createErrorResult(error instanceof Error ? error : \"Failed to hold call\");\n }\n }\n\n public async resume(callId: string): Promise<CallResponse<null>> {\n try {\n await this.resumeCall(callId);\n return createSuccessResult(\"Call resumed successfully\", null);\n } catch (error) {\n return createErrorResult(error instanceof Error ? error : \"Failed to resume call\");\n }\n }\n\n public async merge(callId: string): Promise<CallResponse<CallSession>> {\n try {\n const data = await this.mergeCall(callId);\n return createSuccessResult(\"Call merged successfully\", data);\n } catch (error) {\n return createErrorResult(error instanceof Error ? error : \"Failed to merge call\");\n }\n }\n\n public async toggleMute(mute: boolean, callId?: string): Promise<CallResponse<null>> {\n const id = callId ?? this.activeCallId;\n logVoipDebug(\"toggleMute() invoked\", { mute, callId: id, hasActiveCall: Boolean(this.activeCallId) });\n try {\n if (!id) return createErrorResult(\"No active call\");\n await this.callEngine.toggleMute(id, mute);\n return createSuccessResult(`Mute ${mute}`, null);\n } catch (error) {\n return createErrorResult(error instanceof Error ? error : \"Failed to toggle mute\");\n }\n }\n\n public async makeCallIncoming(\n to: string,\n callSid: string\n ): Promise<CallResponse<CallSession>> {\n logVoipDebug(\"makeCallIncoming() start\", { to, callSid, hasActiveCall: Boolean(this.activeCallId) });\n try {\n const destination = to.trim();\n if (!destination) return createErrorResult(\"Destination required\");\n\n if (!this.activeCallId) {\n const data = await this.startCall(destination);\n logVoipDebug(\"makeCallIncoming() new call started\", { callId: data.callId });\n return createSuccessResult(\"Call started\", data);\n }\n\n await this.holdAndAddParticipantIncoming(callSid, destination);\n const existingSession = this.callEngine.getSession(this.activeCallId);\n const session: CallSession = existingSession ?? {\n callId: this.activeCallId,\n direction: \"INBOUND\",\n status: \"MERGED\",\n participants: [],\n conferenceRoomId: null,\n };\n logVoipDebug(\"makeCallIncoming() participant added\", { callId: this.activeCallId });\n return createSuccessResult(\"Participant added\", session);\n } catch (error) {\n logVoipDebug(\"makeCallIncoming() failure\", {\n message: error instanceof Error ? error.message : String(error),\n });\n return createErrorResult(error instanceof Error ? error : \"Failed to start incoming call\");\n }\n }\n\n public async holdAndAddParticipant(\n callSid: string,\n number: string\n ): Promise<CallResponse<unknown>> {\n logVoipDebug(\"holdAndAddParticipant() invoked\", { callSid, number });\n this.ensureAuthenticated();\n try {\n if (!callSid) throw new Error(\"callSid is required.\");\n if (!number) throw new Error(\"Participant number is required.\");\n if (!this.internalConferenceName) throw new Error(\"conferenceName is not set.\");\n\n if (this.bridge.nativeModule.addNewCallee) {\n const id = this.activeCallId ?? callSid;\n const result = await this.bridge.nativeModule.addNewCallee({\n callId: id,\n newParticipantNo: number,\n });\n if (!result.success) {\n return createErrorResult(result.error ?? \"Failed to add participant\");\n }\n return createSuccessResult(\"Participant added successfully\", result.data ?? {});\n }\n\n const holdId = this.activeCallId ?? callSid;\n await this.holdCall(holdId);\n\n const configService = this.configService as any;\n const axiosInst = configService.axiosInstance ?? configService.deps?.axiosInstance;\n if (!axiosInst) throw new Error(\"HTTP client not available\");\n\n const res = await axiosInst.post(\n `${this.sdkConfig.serverUrl}/outgoingCall.addNewCallee`,\n { conferenceName: this.internalConferenceName, newParticipantNo: number },\n { headers: { Authorization: `Bearer ${this.sdkConfig.sdkToken}` } }\n );\n return createSuccessResult(\"Participant added successfully\", res?.data?.result ?? res?.data);\n } catch (error) {\n return createErrorResult(error instanceof Error ? error : \"Failed to add participant\");\n }\n }\n\n public async holdAndAddParticipantIncoming(\n callSid: string,\n number: string\n ): Promise<CallResponse<unknown>> {\n logVoipDebug(\"holdAndAddParticipantIncoming() invoked\", { callSid, number });\n this.ensureAuthenticated();\n try {\n if (!callSid) throw new Error(\"callSid is required.\");\n if (!number) throw new Error(\"Participant number is required.\");\n\n if (this.bridge.nativeModule.addNewCallee) {\n const id = this.activeCallId ?? callSid;\n const result = await this.bridge.nativeModule.addNewCallee({\n callId: id,\n newParticipantNo: number,\n });\n if (!result.success) {\n return createErrorResult(result.error ?? \"Failed to add participant\");\n }\n return createSuccessResult(\"Participant added successfully\", result.data ?? {});\n }\n\n const holdId = this.activeCallId ?? callSid;\n await this.holdCall(holdId);\n\n const configService = this.configService as any;\n const axiosInst = configService.axiosInstance ?? configService.deps?.axiosInstance;\n if (!axiosInst) throw new Error(\"HTTP client not available\");\n\n const res = await axiosInst.post(\n `${this.sdkConfig.serverUrl}/outgoingCall.addNewCalleeIncoming`,\n { callSid, newParticipantNo: number },\n { headers: { Authorization: `Bearer ${this.sdkConfig.sdkToken}` } }\n );\n return createSuccessResult(\"Participant added successfully\", res?.data?.result ?? res?.data);\n } catch (error) {\n return createErrorResult(error instanceof Error ? error : \"Failed to add participant\");\n }\n }\n\n public async getConferenceId(): Promise<CallResponse<unknown>> {\n logVoipDebug(\"getConferenceId() invoked\");\n this.ensureAuthenticated();\n try {\n if (!this.internalConferenceName) {\n throw new Error(\"conferenceName is required to fetch conference details.\");\n }\n\n if (this.bridge.nativeModule.getConferenceId) {\n const result = await this.bridge.nativeModule.getConferenceId({\n conferenceName: this.internalConferenceName,\n });\n if (!result.success) {\n return createErrorResult(result.error ?? \"Failed to fetch conference details\");\n }\n return createSuccessResult(\"Conference fetched successfully\", result.data ?? null);\n }\n\n return createErrorResult(\"getConferenceId not supported\");\n } catch (error) {\n return createErrorResult(error instanceof Error ? error : \"Failed to fetch conference details\");\n }\n }\n\n public async getParticipantsIncoming(callSid: string): Promise<CallResponse<unknown>> {\n logVoipDebug(\"getParticipantsIncoming() invoked\", { callSid });\n this.ensureAuthenticated();\n try {\n if (this.bridge.nativeModule.getParticipantsByCallSid) {\n const result = await this.bridge.nativeModule.getParticipantsByCallSid({ callSid });\n if (!result.success) {\n return createErrorResult(result.error ?? \"Failed to fetch participants\");\n }\n return createSuccessResult(\"Participants fetched successfully\", result.data ?? []);\n }\n return createErrorResult(\"getParticipantsByCallSid not supported\");\n } catch (error) {\n return createErrorResult(error instanceof Error ? error : \"Failed to fetch participants\");\n }\n }\n\n public async getParticipantsOutgoing(callSid: string): Promise<CallResponse<unknown>> {\n logVoipDebug(\"getParticipantsOutgoing() invoked\", { callSid });\n this.ensureAuthenticated();\n try {\n if (this.bridge.nativeModule.getParticipantsByCallSid) {\n const result = await this.bridge.nativeModule.getParticipantsByCallSid({ callSid });\n if (!result.success) {\n return createErrorResult(result.error ?? \"Failed to fetch participants\");\n }\n return createSuccessResult(\"Participants fetched successfully\", result.data ?? []);\n }\n return createErrorResult(\"getParticipantsByCallSid not supported\");\n } catch (error) {\n return createErrorResult(error instanceof Error ? error : \"Failed to fetch participants\");\n }\n }\n\n public async removeParticipant(\n conferenceSid: string,\n callSid: string\n ): Promise<CallResponse<unknown>> {\n logVoipDebug(\"removeParticipant() invoked\", { conferenceSid, callSid });\n this.ensureAuthenticated();\n try {\n if (!conferenceSid) throw new Error(\"conferenceSid is required.\");\n if (!callSid) throw new Error(\"callSid is required.\");\n\n if (this.bridge.nativeModule.removeParticipant) {\n const result = await this.bridge.nativeModule.removeParticipant({ conferenceSid, callSid });\n if (!result.success) {\n return createErrorResult(result.error ?? \"Failed to remove participant\");\n }\n return createSuccessResult(\"Participant removed successfully\", result.data ?? {});\n }\n\n await this.disconnectParticipant(callSid);\n return createSuccessResult(\"Participant removed successfully\", null);\n } catch (error) {\n return createErrorResult(error instanceof Error ? error : \"Failed to remove participant\");\n }\n }\n\n public async getRoutingConfig() {\n return this.configService.getRoutingConfig();\n }\n\n public async setRoutingConfig(input: SetRoutingConfigInput) {\n return this.configService.setRoutingConfig(input);\n }\n\n public async createParseRule(input: CreateParseRuleInput) {\n return this.configService.createParseRule(input);\n }\n\n public async listParseRules(input?: ListParseRulesInput) {\n return this.configService.listParseRules(input);\n }\n\n public async registerWebhook(webhookUrl: string) {\n return this.configService.registerWebhook(webhookUrl);\n }\n\n public async deregisterWebhook() {\n return this.configService.deregisterWebhook();\n }\n\n public async isWebhookConfigured() {\n return this.configService.isWebhookConfigured();\n }\n\n public async welcomeMessageConfig(\n welcomeType: \"audio\" | \"tts\",\n welcomeMessage: string\n ) {\n return this.configService.welcomeMessageConfig(welcomeType, welcomeMessage);\n }\n\n public destroy(): void {\n logVoipDebug(\"destroy() invoked\");\n this.unsubscribeOnCallEnded?.();\n this.unsubscribeOnCallEnded = null;\n this.authManager.destroy();\n this.bridge.destroy();\n this.initialized = false;\n this.activeCallId = null;\n this.activeCallIds.clear();\n logVoipDebug(\"destroy() completed\");\n }\n\n private pickNextActiveCallId(): string | null {\n if (this.activeCallIds.size === 0) return null;\n return this.activeCallIds.values().next().value ?? null;\n }\n\n private ensureAuthenticated(): void {\n if (this.authManager.getState() !== \"AUTHENTICATED\") {\n throw new Error(\"SDK not authenticated.\");\n }\n }\n}\n\n","import { ReactNativeVoipSdk } from \"./react-native-voip-sdk\";\nimport type { Config, TwilioConference, TwilioConferenceParticipant } from \"../types/interface\";\nimport type { NativeModule } from \"./react-native-voip-sdk/core/types\";\n\nexport { ReactNativeVoipSdk };\nexport * from \"./react-native-voip-sdk\";\n\n/**\n * Backward-compatible wrapper class retaining the original export name.\n * Existing consumers can continue to construct `new ZyraTwilioWrapper(config)`.\n */\nexport default class ZyraTwilioWrapper extends ReactNativeVoipSdk {\n public activeCallSid: string | null = null;\n public conferenceName: string;\n public conferenceDetail: TwilioConference | null = null;\n public participants: TwilioConferenceParticipant[] = [];\n public waitUrl = \"https://api.twilio.com/cowbell.mp3\";\n\n public onReady?: () => void;\n public onIncoming?: (payload: Record<string, unknown>) => void;\n public onDisconnect?: () => void;\n public onError?: (error: Error) => void;\n public onConnect?: (payload: Record<string, unknown>) => void;\n public onMissedCall?: () => void;\n\n constructor(config: Config, nativeModule?: NativeModule) {\n super(config, nativeModule);\n\n this.conferenceName = this.internalConferenceName;\n this.waitUrl = config.waitUrl ?? this.waitUrl;\n\n this.on(\"onReady\", () => this.onReady?.());\n\n this.on(\"onCallRinging\", (payload) => this.onIncoming?.(payload));\n\n this.on(\"onCallConnected\", (payload) => {\n if (typeof payload.callSid === \"string\") {\n this.activeCallSid = payload.callSid;\n }\n if (payload.conferenceDetail) {\n this.conferenceDetail = payload.conferenceDetail as unknown as TwilioConference;\n }\n this.onConnect?.(payload);\n });\n\n this.on(\"onCallEnded\", () => {\n if (this.getActiveCallIds().length === 0) {\n this.activeCallSid = null;\n this.onDisconnect?.();\n }\n });\n\n this.on(\"onMissedCall\", () => {\n this.activeCallSid = null;\n this.onMissedCall?.();\n });\n\n this.on(\"onError\", (payload) => {\n const message =\n typeof payload.message === \"string\"\n ? payload.message\n : \"Unknown SDK error\";\n this.onError?.(new Error(message));\n });\n }\n\n public override destroy(): void {\n this.activeCallSid = null;\n this.conferenceDetail = null;\n this.participants = [];\n super.destroy();\n }\n}\n\n"],"mappings":"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","names":["axios","axios"]}
|
package/eslint.config.js
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
// eslint.config.js
|
|
2
|
+
export default [
|
|
3
|
+
{
|
|
4
|
+
files: ["**/*.js"],
|
|
5
|
+
languageOptions: {
|
|
6
|
+
ecmaVersion: "latest",
|
|
7
|
+
sourceType: "module",
|
|
8
|
+
globals: {
|
|
9
|
+
console: "readonly",
|
|
10
|
+
module: "readonly",
|
|
11
|
+
require: "readonly",
|
|
12
|
+
__dirname: "readonly"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
rules: {
|
|
16
|
+
semi: ["error", "always"],
|
|
17
|
+
quotes: ["error", "double"]
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
];
|
|
21
|
+
|
package/index.js
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
const sdkModule = require("./dist/index.js");
|
|
2
|
+
|
|
3
|
+
const defaultExport =
|
|
4
|
+
sdkModule && typeof sdkModule === "object" && "default" in sdkModule
|
|
5
|
+
? sdkModule.default
|
|
6
|
+
: sdkModule;
|
|
7
|
+
|
|
8
|
+
module.exports = defaultExport;
|
|
9
|
+
module.exports.default = defaultExport;
|
|
10
|
+
|
|
11
|
+
if (sdkModule && typeof sdkModule === "object") {
|
|
12
|
+
Object.keys(sdkModule).forEach((key) => {
|
|
13
|
+
module.exports[key] = sdkModule[key];
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
|
package/package.json
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@zyratalk1/zyra-twilio-wrapper",
|
|
3
|
+
"version": "1.2.0",
|
|
4
|
+
"description": "React Native VOIP SDK bridge wrapper for Android and iOS",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"module": "dist/index.mjs",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"scripts": {
|
|
9
|
+
"test": "echo \"Error: no test specified\" && exit 1",
|
|
10
|
+
"build": "tsup",
|
|
11
|
+
"dev": "tsup --watch",
|
|
12
|
+
"clean": "rm -rf dist",
|
|
13
|
+
"lint": "eslint ."
|
|
14
|
+
},
|
|
15
|
+
"author": "",
|
|
16
|
+
"license": "ISC",
|
|
17
|
+
"keywords": [
|
|
18
|
+
"react-native",
|
|
19
|
+
"android",
|
|
20
|
+
"ios",
|
|
21
|
+
"voice",
|
|
22
|
+
"sdk",
|
|
23
|
+
"typescript",
|
|
24
|
+
"wrapper"
|
|
25
|
+
],
|
|
26
|
+
"exports": {
|
|
27
|
+
".": {
|
|
28
|
+
"require": "./dist/index.js",
|
|
29
|
+
"import": "./dist/index.mjs"
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
"dependencies": {
|
|
33
|
+
"@twilio/voice-react-native-sdk": "^1.7.0",
|
|
34
|
+
"axios": "^1.12.2",
|
|
35
|
+
"dotenv": "^17.2.3",
|
|
36
|
+
"eslint": "^9.37.0",
|
|
37
|
+
"pnpm": "^10.28.0",
|
|
38
|
+
"tsup": "^8.5.0",
|
|
39
|
+
"typescript": "^5.9.3",
|
|
40
|
+
"winston": "^3.18.3",
|
|
41
|
+
"winston-daily-rotate-file": "^5.0.0"
|
|
42
|
+
},
|
|
43
|
+
"peerDependencies": {
|
|
44
|
+
"react": "*",
|
|
45
|
+
"react-native": "*"
|
|
46
|
+
},
|
|
47
|
+
"devDependencies": {
|
|
48
|
+
"@types/node": "^24.7.2"
|
|
49
|
+
}
|
|
50
|
+
}
|
package/tsconfig.json
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{"compilerOptions": {
|
|
2
|
+
"target": "ES2020",
|
|
3
|
+
"module": "ESNext",
|
|
4
|
+
"moduleResolution": "Node",
|
|
5
|
+
"declaration": true,
|
|
6
|
+
"declarationMap": true,
|
|
7
|
+
"outDir": "dist",
|
|
8
|
+
"strict": true,
|
|
9
|
+
"esModuleInterop": true,
|
|
10
|
+
"skipLibCheck": true,
|
|
11
|
+
"resolveJsonModule": true
|
|
12
|
+
},
|
|
13
|
+
"include": ["src"],
|
|
14
|
+
"exclude": ["node_modules", "dist"]
|
|
15
|
+
}
|
package/tsup.config.ts
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { defineConfig } from "tsup";
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
export default defineConfig({
|
|
5
|
+
entry: ["src/index.ts"],
|
|
6
|
+
format: ["cjs", "esm"], // ✅ build both CommonJS and ES modules
|
|
7
|
+
dts: true, // ✅ generate type declarations
|
|
8
|
+
sourcemap: true,
|
|
9
|
+
clean: true,
|
|
10
|
+
outDir: "dist",
|
|
11
|
+
splitting: false, // disable code splitting for CJS compat
|
|
12
|
+
minify: false // optional
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
// import { defineConfig } from "tsup";
|
|
16
|
+
|
|
17
|
+
// export default defineConfig({
|
|
18
|
+
// entry: ["src/ZyraTwilioWrapper.ts"],
|
|
19
|
+
// format: ["esm", "cjs"],
|
|
20
|
+
// dts: true, // generate .d.ts types
|
|
21
|
+
// sourcemap: true,
|
|
22
|
+
// clean: true,
|
|
23
|
+
// minify: false,
|
|
24
|
+
// external: ["@twilio/voice-sdk"],
|
|
25
|
+
// });
|