@dora-cell/sdk 0.1.1-beta.6 → 0.1.1-beta.9

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.d.mts CHANGED
@@ -14,7 +14,13 @@ interface DirectCredentialsAuth {
14
14
  password: string;
15
15
  wsUrl: string;
16
16
  }
17
- type AuthConfig = ApiTokenAuth | DirectCredentialsAuth;
17
+ interface ExtensionAuth {
18
+ type: 'extension';
19
+ extension: string;
20
+ password?: string;
21
+ sipDomain?: string;
22
+ }
23
+ type AuthConfig = ApiTokenAuth | DirectCredentialsAuth | ExtensionAuth;
18
24
  interface DoraCellConfig {
19
25
  auth: AuthConfig;
20
26
  sipServer?: string;
package/dist/index.d.ts CHANGED
@@ -14,7 +14,13 @@ interface DirectCredentialsAuth {
14
14
  password: string;
15
15
  wsUrl: string;
16
16
  }
17
- type AuthConfig = ApiTokenAuth | DirectCredentialsAuth;
17
+ interface ExtensionAuth {
18
+ type: 'extension';
19
+ extension: string;
20
+ password?: string;
21
+ sipDomain?: string;
22
+ }
23
+ type AuthConfig = ApiTokenAuth | DirectCredentialsAuth | ExtensionAuth;
18
24
  interface DoraCellConfig {
19
25
  auth: AuthConfig;
20
26
  sipServer?: string;
package/dist/index.js CHANGED
@@ -45,7 +45,11 @@ var ApiTokenAuthProvider = class {
45
45
  constructor(apiToken, apiBaseUrl) {
46
46
  this.credentials = null;
47
47
  this.apiToken = apiToken;
48
- this.apiBaseUrl = apiBaseUrl || process.env.NEXT_PUBLIC_BASE_API_URL || "";
48
+ let defaultBaseUrl = "";
49
+ if (typeof process !== "undefined" && process.env) {
50
+ defaultBaseUrl = process.env.NEXT_PUBLIC_BASE_API_URL || "";
51
+ }
52
+ this.apiBaseUrl = apiBaseUrl || defaultBaseUrl;
49
53
  }
50
54
  async authenticate(config) {
51
55
  if (config.type !== "api-token") {
@@ -133,12 +137,43 @@ var DirectCredentialsAuthProvider = class {
133
137
  return this.credentials !== null;
134
138
  }
135
139
  };
140
+ var DEFAULT_WSS_URL = "wss://cell.usedora.com:8089";
141
+ var DEFAULT_SIP_IP = "64.227.10.164";
142
+ var DEFAULT_PASSWORD = "1234";
143
+ var ExtensionAuthProvider = class {
144
+ constructor() {
145
+ this.credentials = null;
146
+ }
147
+ async authenticate(config) {
148
+ if (config.type !== "extension") {
149
+ throw new AuthenticationError("Invalid auth config type for ExtensionAuthProvider");
150
+ }
151
+ const extension = config.extension;
152
+ const password = config.password || DEFAULT_PASSWORD;
153
+ const wsUrl = DEFAULT_WSS_URL;
154
+ const sipDomain = config.sipDomain || DEFAULT_SIP_IP;
155
+ const sipUri = `sip:${extension}@${sipDomain}`;
156
+ this.credentials = {
157
+ wsUrl,
158
+ sipUri,
159
+ password,
160
+ sipDomain,
161
+ extensions: [{ extension, displayName: `Ext ${extension}`, isPrimary: true }]
162
+ };
163
+ return this.credentials;
164
+ }
165
+ isAuthenticated() {
166
+ return this.credentials !== null;
167
+ }
168
+ };
136
169
  function createAuthProvider(config) {
137
170
  switch (config.type) {
138
171
  case "api-token":
139
172
  return new ApiTokenAuthProvider(config.apiToken, config.apiBaseUrl);
140
173
  case "direct":
141
174
  return new DirectCredentialsAuthProvider();
175
+ case "extension":
176
+ return new ExtensionAuthProvider();
142
177
  default:
143
178
  throw new AuthenticationError("Unknown authentication type");
144
179
  }
@@ -620,9 +655,14 @@ var DoraCell = class {
620
655
  this.events.emit("error", error);
621
656
  }
622
657
  getDefaultTurnServers() {
623
- const turnUri = process.env.NEXT_PUBLIC_TURN_URI || "turn:64.227.10.164:3478";
624
- const turnUser = process.env.NEXT_PUBLIC_TURN_USER || "02018890089";
625
- const turnPass = process.env.NEXT_PUBLIC_TURN_PASS || "dora12345";
658
+ let turnUri = "turn:64.227.10.164:3478";
659
+ let turnUser = "02018890089";
660
+ let turnPass = "dora12345";
661
+ if (typeof process !== "undefined" && process.env) {
662
+ turnUri = process.env.NEXT_PUBLIC_TURN_URI || turnUri;
663
+ turnUser = process.env.NEXT_PUBLIC_TURN_USER || turnUser;
664
+ turnPass = process.env.NEXT_PUBLIC_TURN_PASS || turnPass;
665
+ }
626
666
  return [
627
667
  {
628
668
  urls: turnUri,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/types/index.ts","../src/core/AuthProvider.ts","../src/utils/phoneFormatter.ts","../src/core/CallManager.ts","../src/core/DoraCell.ts"],"names":["EventEmitter","JsSIP"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Core TypeScript type definitions for Dora Cell SDK\n */\n\n// ============================================\n// Configuration Types\n// ============================================\n\nexport interface ApiTokenAuth {\n type: 'api-token';\n apiToken: string;\n apiBaseUrl?: string;\n}\n\nexport interface DirectCredentialsAuth {\n type: 'direct';\n sipUri: string;\n password: string;\n wsUrl: string;\n}\n\nexport type AuthConfig = ApiTokenAuth | DirectCredentialsAuth;\n\nexport interface DoraCellConfig {\n auth: AuthConfig;\n sipServer?: string;\n turnServers?: RTCIceServer[];\n debug?: boolean;\n autoSelectExtension?: boolean; // Auto-select first available extension\n}\n\n// ============================================\n// SIP Credentials\n// ============================================\n\nexport interface SipCredentials {\n wsUrl: string;\n sipUri: string;\n password: string;\n sipDomain?: string;\n extensions?: Extension[];\n expiresIn?: number;\n}\n\nexport interface Extension {\n extension: string;\n displayName?: string;\n isPrimary?: boolean;\n}\n\n// ============================================\n// Call Types\n// ============================================\n\nexport type CallStatus = 'idle' | 'connecting' | 'ringing' | 'ongoing' | 'ended';\n\nexport type CallDirection = 'inbound' | 'outbound';\n\nexport interface CallOptions {\n extension?: string; // Specific extension to use for this call\n mediaConstraints?: MediaStreamConstraints;\n}\n\nexport interface Call {\n id: string;\n status: CallStatus;\n direction: CallDirection;\n remoteNumber: string;\n localExtension: string;\n duration: number;\n startTime?: number;\n endTime?: number;\n\n // Methods\n mute(): void;\n unmute(): void;\n hangup(): void;\n isMuted(): boolean;\n}\n\n// ============================================\n// Connection Status\n// ============================================\n\nexport type ConnectionStatus =\n | 'disconnected'\n | 'connecting'\n | 'connected'\n | 'registered'\n | 'registrationFailed';\n\nexport interface ConnectionState {\n status: ConnectionStatus;\n extension?: string;\n error?: string;\n}\n\n// ============================================\n// Events\n// ============================================\n\nexport type DoraCellEventMap = {\n 'connection:status': (state: ConnectionState) => void;\n 'call:incoming': (call: Call) => void;\n 'call:outgoing': (call: Call) => void;\n 'call:ringing': (call: Call) => void;\n 'call:connected': (call: Call) => void;\n 'call:ended': (call: Call, reason?: string) => void;\n 'call:failed': (call: Call, error: string) => void;\n 'error': (error: Error) => void;\n};\n\nexport type DoraCellEvent = keyof DoraCellEventMap;\n\n// ============================================\n// API Response Types\n// ============================================\n\nexport interface ApiTokenResponse {\n ws_url?: string;\n wsUrl?: string;\n sip_uri?: string;\n sipUri?: string;\n password?: string;\n sip_domain?: string;\n sipDomain?: string;\n extensions?: Extension[];\n expires_in?: number;\n expiresIn?: number;\n}\n\n// ============================================\n// Error Types\n// ============================================\n\nexport class DoraCellError extends Error {\n constructor(\n message: string,\n public code?: string,\n public details?: any\n ) {\n super(message);\n this.name = 'DoraCellError';\n }\n}\n\nexport class AuthenticationError extends DoraCellError {\n constructor(message: string, details?: any) {\n super(message, 'AUTH_ERROR', details);\n this.name = 'AuthenticationError';\n }\n}\n\nexport class CallError extends DoraCellError {\n constructor(message: string, details?: any) {\n super(message, 'CALL_ERROR', details);\n this.name = 'CallError';\n }\n}\n\nexport class ConnectionError extends DoraCellError {\n constructor(message: string, details?: any) {\n super(message, 'CONNECTION_ERROR', details);\n this.name = 'ConnectionError';\n }\n}\n","/**\n * Authentication provider for API token-based authentication\n */\n\nimport type {\n AuthConfig,\n SipCredentials,\n ApiTokenResponse,\n Extension,\n} from '../types';\nimport { AuthenticationError } from '../types';\n\nexport interface AuthProvider {\n authenticate(config: AuthConfig): Promise<SipCredentials>;\n refreshCredentials?(): Promise<SipCredentials>;\n isAuthenticated(): boolean;\n}\n\n/**\n * API Token Authentication Provider\n * Exchanges API token for SIP credentials via backend API\n */\nexport class ApiTokenAuthProvider implements AuthProvider {\n private credentials: SipCredentials | null = null;\n private apiToken: string;\n private apiBaseUrl: string;\n\n constructor(apiToken: string, apiBaseUrl?: string) {\n this.apiToken = apiToken;\n this.apiBaseUrl = apiBaseUrl || process.env.NEXT_PUBLIC_BASE_API_URL || '';\n }\n\n async authenticate(config: AuthConfig): Promise<SipCredentials> {\n if (config.type !== 'api-token') {\n throw new AuthenticationError('Invalid auth config type for ApiTokenAuthProvider');\n }\n\n try {\n const response = await fetch(`${this.apiBaseUrl}/api/sip-credentials`, {\n method: 'GET',\n headers: {\n 'Authorization': `Bearer ${this.apiToken}`,\n 'Content-Type': 'application/json',\n 'Accept': 'application/json',\n },\n credentials: 'include',\n });\n\n if (!response.ok) {\n if (response.status === 401 || response.status === 403) {\n throw new AuthenticationError(\n 'Invalid API token or insufficient permissions',\n { status: response.status }\n );\n }\n throw new AuthenticationError(\n `Failed to fetch SIP credentials: ${response.status}`,\n { status: response.status }\n );\n }\n\n const data: ApiTokenResponse = await response.json();\n this.credentials = this.parseCredentials(data);\n return this.credentials;\n } catch (error) {\n if (error instanceof AuthenticationError) {\n throw error;\n }\n throw new AuthenticationError(\n `Authentication failed: ${error instanceof Error ? error.message : 'Unknown error'}`,\n { originalError: error }\n );\n }\n }\n\n async refreshCredentials(): Promise<SipCredentials> {\n // Re-authenticate to get fresh credentials\n return this.authenticate({ type: 'api-token', apiToken: this.apiToken });\n }\n\n isAuthenticated(): boolean {\n return this.credentials !== null;\n }\n\n private parseCredentials(data: ApiTokenResponse): SipCredentials {\n const wsUrl = data.ws_url || data.wsUrl;\n const sipUri = data.sip_uri || data.sipUri;\n const password = data.password;\n const sipDomain = data.sip_domain || data.sipDomain;\n const extensions = data.extensions;\n const expiresIn = data.expires_in || data.expiresIn;\n\n if (!wsUrl || !sipUri) {\n throw new AuthenticationError(\n 'Invalid credentials response: missing ws_url or sip_uri'\n );\n }\n\n return {\n wsUrl,\n sipUri,\n password: password || '',\n sipDomain,\n extensions,\n expiresIn,\n };\n }\n}\n\n/**\n * Direct Credentials Authentication Provider\n * Uses credentials provided directly in configuration\n */\nexport class DirectCredentialsAuthProvider implements AuthProvider {\n private credentials: SipCredentials | null = null;\n\n async authenticate(config: AuthConfig): Promise<SipCredentials> {\n if (config.type !== 'direct') {\n throw new AuthenticationError('Invalid auth config type for DirectCredentialsAuthProvider');\n }\n\n this.credentials = {\n wsUrl: config.wsUrl,\n sipUri: config.sipUri,\n password: config.password,\n };\n\n return this.credentials;\n }\n\n isAuthenticated(): boolean {\n return this.credentials !== null;\n }\n}\n\n/**\n * Factory function to create appropriate auth provider\n */\nexport function createAuthProvider(config: AuthConfig): AuthProvider {\n switch (config.type) {\n case 'api-token':\n return new ApiTokenAuthProvider(config.apiToken, config.apiBaseUrl);\n case 'direct':\n return new DirectCredentialsAuthProvider();\n default:\n throw new AuthenticationError('Unknown authentication type');\n }\n}\n","/**\n * Phone number formatting utilities\n * Extracted from JsSIPProvider.tsx\n */\n\n/**\n * Format a phone number to SIP URI format\n * Handles Nigerian numbers, international format, and local extensions\n */\nexport function formatPhoneToSIP(phone: string, sipDomain: string): string {\n // Strip all non-numeric characters\n let cleaned = phone.replace(/\\D/g, '');\n\n // Case 1: Short local extension (like \"101\", \"102\", etc.)\n if (cleaned.length <= 4) {\n return `sip:${cleaned}@${sipDomain}`;\n }\n\n // Case 2: Nigerian number starting with 0 (like \"08012345678\")\n if (cleaned.startsWith('0')) {\n cleaned = '234' + cleaned.substring(1);\n return `sip:${cleaned}@${sipDomain}`;\n }\n\n // Case 3: Already in international format (starts with 234)\n if (cleaned.startsWith('234')) {\n return `sip:${cleaned}@${sipDomain}`;\n }\n\n // Case 4: Any other number - assume it needs 234 prefix\n cleaned = '234' + cleaned;\n return `sip:${cleaned}@${sipDomain}`;\n}\n\n/**\n * Normalize a phone number to E.164 format\n */\nexport function normalizePhoneNumber(\n phone: string,\n countryCode: string = '234'\n): string {\n let cleaned = phone.replace(/\\D/g, '');\n\n // If it's a short extension, return as-is\n if (cleaned.length <= 4) {\n return cleaned;\n }\n\n // Remove leading 0 and add country code\n if (cleaned.startsWith('0')) {\n return countryCode + cleaned.substring(1);\n }\n\n // If already has country code, return as-is\n if (cleaned.startsWith(countryCode)) {\n return cleaned;\n }\n\n // Otherwise add country code\n return countryCode + cleaned;\n}\n\n/**\n * Extract extension/number from SIP URI\n */\nexport function extractNumberFromSipUri(sipUri: string): string {\n const match = sipUri.match(/sip:([^@]+)@/);\n return match ? match[1] : sipUri;\n}\n\n/**\n * Validate phone number format\n */\nexport function isValidPhoneNumber(phone: string, minLength: number = 3): boolean {\n const cleaned = phone.replace(/\\D/g, '');\n return cleaned.length >= minLength;\n}\n","/**\n * Call Manager - Handles individual call sessions\n * Extracted and refactored from JsSIPProvider.tsx\n */\n\nimport type {\n Call,\n CallStatus,\n CallDirection,\n CallOptions,\n SipCredentials,\n} from '../types';\nimport { CallError } from '../types';\nimport { formatPhoneToSIP } from '../utils/phoneFormatter';\nimport EventEmitter from 'eventemitter3';\n\nexport interface CallConfig {\n pcConfig: RTCConfiguration;\n mediaConstraints?: MediaStreamConstraints;\n}\n\nexport class CallSession implements Call {\n public id: string;\n public status: CallStatus = 'idle';\n public direction: CallDirection;\n public remoteNumber: string;\n public localExtension: string;\n public duration: number = 0;\n public startTime?: number;\n public endTime?: number;\n\n private session: any; // JsSIP RTCSession\n private _isMuted: boolean = false;\n private remoteStreamValue: MediaStream | null = null;\n private durationInterval?: number;\n private events: EventEmitter;\n\n constructor(\n session: any,\n direction: CallDirection,\n remoteNumber: string,\n localExtension: string,\n events: EventEmitter\n ) {\n this.id = this.generateCallId();\n this.session = session;\n this.direction = direction;\n this.remoteNumber = remoteNumber;\n this.localExtension = localExtension;\n this.events = events;\n\n this.setupSessionHandlers();\n }\n\n private generateCallId(): string {\n return `call_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n }\n\n private setupSessionHandlers(): void {\n // Progress event (ringing)\n this.session.on('progress', (evt: any) => {\n const code = evt.response?.status_code;\n if (code === 180 || code === 183) {\n this.status = 'ringing';\n this.events.emit('call:ringing', this);\n }\n });\n\n // Call confirmed (connected)\n this.session.on('confirmed', () => {\n this.status = 'ongoing';\n this.startTime = Date.now();\n this.startDurationTimer();\n this.events.emit('call:connected', this);\n });\n\n // Peer connection setup\n this.session.on('peerconnection', (evt: any) => {\n evt.peerconnection.ontrack = (event: any) => {\n if (event.streams && event.streams[0]) {\n this.remoteStreamValue = event.streams[0];\n }\n };\n });\n\n // Call ended\n this.session.on('ended', (evt: any) => {\n this.handleCallEnd(evt?.cause);\n });\n\n // Call failed\n this.session.on('failed', (evt: any) => {\n this.handleCallEnd(evt?.cause || 'Call failed');\n });\n\n // Call rejected\n this.session.on('rejected', (evt: any) => {\n this.handleCallEnd(evt?.cause || 'Call rejected');\n });\n }\n\n private handleCallEnd(reason?: string): void {\n this.status = 'ended';\n this.endTime = Date.now();\n this.stopDurationTimer();\n this.remoteStreamValue = null;\n this._isMuted = false;\n this.events.emit('call:ended', this, reason);\n }\n\n private startDurationTimer(): void {\n this.durationInterval = window.setInterval(() => {\n if (this.startTime) {\n this.duration = Math.floor((Date.now() - this.startTime) / 1000);\n }\n }, 1000);\n }\n\n private stopDurationTimer(): void {\n if (this.durationInterval) {\n clearInterval(this.durationInterval);\n this.durationInterval = undefined;\n }\n }\n\n // Public methods\n mute(): void {\n if (this.session && !this._isMuted) {\n this.session.mute({ audio: true });\n this._isMuted = true;\n }\n }\n\n unmute(): void {\n if (this.session && this._isMuted) {\n this.session.unmute({ audio: true });\n this._isMuted = false;\n }\n }\n\n hangup(): void {\n if (this.session) {\n this.session.terminate();\n }\n }\n\n isMuted(): boolean {\n return this._isMuted;\n }\n\n getRemoteStream(): MediaStream | null {\n return this.remoteStreamValue;\n }\n\n getFormattedDuration(): string {\n const mm = String(Math.floor(this.duration / 60)).padStart(2, '0');\n const ss = String(this.duration % 60).padStart(2, '0');\n return `${mm}:${ss}`;\n }\n\n destroy(): void {\n this.stopDurationTimer();\n this.session = null;\n this.remoteStreamValue = null;\n }\n}\n\n/**\n * Call Manager - Manages call sessions and JsSIP integration\n */\nexport class CallManager {\n private ua: any | null = null; // JsSIP User Agent\n private currentCall: CallSession | null = null;\n private credentials: SipCredentials;\n private events: EventEmitter;\n private callConfig: CallConfig;\n\n constructor(\n credentials: SipCredentials,\n events: EventEmitter,\n callConfig: CallConfig\n ) {\n this.credentials = credentials;\n this.events = events;\n this.callConfig = callConfig;\n }\n\n setUserAgent(ua: any): void {\n this.ua = ua;\n }\n\n /**\n * Initiate an outbound call\n */\n async initiateCall(\n targetNumber: string,\n options?: CallOptions\n ): Promise<CallSession> {\n if (!this.ua) {\n throw new CallError('User Agent not initialized');\n }\n\n if (this.currentCall && this.currentCall.status !== 'ended') {\n throw new CallError('A call is already in progress');\n }\n\n try {\n // Request microphone permission\n await navigator.mediaDevices.getUserMedia({ audio: true });\n\n // Determine which extension to use\n const extension = options?.extension || this.getDefaultExtension();\n\n // Format the target number to SIP URI\n const sipDomain = this.extractDomain(this.credentials.sipUri);\n const sipTarget = formatPhoneToSIP(targetNumber, sipDomain);\n\n // Initiate the call\n const session = this.ua.call(sipTarget, {\n mediaConstraints: options?.mediaConstraints || { audio: true },\n pcConfig: this.callConfig.pcConfig,\n });\n\n // Create call session\n const call = new CallSession(\n session,\n 'outbound',\n targetNumber,\n extension,\n this.events\n );\n\n call.status = 'connecting';\n this.currentCall = call;\n this.events.emit('call:outgoing', call);\n\n return call;\n } catch (error) {\n throw new CallError(\n `Failed to initiate call: ${error instanceof Error ? error.message : 'Unknown error'}`,\n { originalError: error }\n );\n }\n }\n\n /**\n * Answer an incoming call\n */\n answerCall(session: any): CallSession {\n if (!session) {\n throw new CallError('No session provided');\n }\n\n try {\n const remoteUri = session.remote_identity?.uri?.toString() || 'Unknown';\n const extension = this.getDefaultExtension();\n\n session.answer({\n mediaConstraints: { audio: true },\n pcConfig: this.callConfig.pcConfig,\n });\n\n const call = new CallSession(\n session,\n 'inbound',\n remoteUri,\n extension,\n this.events\n );\n\n this.currentCall = call;\n return call;\n } catch (error) {\n throw new CallError(\n `Failed to answer call: ${error instanceof Error ? error.message : 'Unknown error'}`,\n { originalError: error }\n );\n }\n }\n\n /**\n * Handle incoming call from JsSIP\n */\n handleIncomingCall(session: any): CallSession {\n const remoteUri = session.remote_identity?.uri?.toString() || 'Unknown';\n const extension = this.getDefaultExtension();\n\n const call = new CallSession(\n session,\n 'inbound',\n remoteUri,\n extension,\n this.events\n );\n\n call.status = 'ringing';\n this.currentCall = call;\n this.events.emit('call:incoming', call);\n\n return call;\n }\n\n getCurrentCall(): CallSession | null {\n return this.currentCall;\n }\n\n clearCurrentCall(): void {\n if (this.currentCall) {\n this.currentCall.destroy();\n this.currentCall = null;\n }\n }\n\n private getDefaultExtension(): string {\n // Auto-select first extension if available\n if (this.credentials.extensions && this.credentials.extensions.length > 0) {\n return this.credentials.extensions[0].extension;\n }\n // Fallback to extracting from sipUri\n return this.extractExtension(this.credentials.sipUri);\n }\n\n private extractExtension(sipUri: string): string {\n const match = sipUri.match(/sip:([^@]+)@/);\n return match ? match[1] : 'unknown';\n }\n\n private extractDomain(sipUri: string): string {\n const match = sipUri.match(/@(.+)$/);\n return match ? match[1] : '';\n }\n\n destroy(): void {\n this.clearCurrentCall();\n this.ua = null;\n }\n}\n","/**\n * Dora Cell SDK - Main entry point\n * Framework-agnostic VoIP calling SDK using JsSIP\n */\n\nimport JsSIP from 'jssip';\nimport EventEmitter from 'eventemitter3';\nimport type {\n DoraCellConfig,\n DoraCellEventMap,\n DoraCellEvent,\n ConnectionStatus,\n ConnectionState,\n Call,\n CallOptions,\n SipCredentials,\n} from '../types';\nimport { ConnectionError, CallError } from '../types';\nimport { createAuthProvider, AuthProvider } from './AuthProvider';\nimport { CallManager } from './CallManager';\n\nexport class DoraCell {\n private config: DoraCellConfig;\n private events: EventEmitter;\n private authProvider: AuthProvider;\n private credentials: SipCredentials | null = null;\n private ua: any | null = null; // JsSIP User Agent\n private callManager: CallManager | null = null;\n private connectionStatus: ConnectionStatus = 'disconnected';\n private retryCount: number = 0;\n private maxRetries: number = 3;\n\n constructor(config: DoraCellConfig) {\n this.config = {\n autoSelectExtension: true,\n debug: false,\n ...config,\n };\n\n this.events = new EventEmitter();\n this.authProvider = createAuthProvider(config.auth);\n\n // Enable JsSIP debugging if requested\n if (this.config.debug) {\n JsSIP.debug.enable('JsSIP:*');\n }\n }\n\n /**\n * Initialize the SDK - authenticate and connect to SIP server\n */\n async initialize(): Promise<void> {\n try {\n // Step 1: Authenticate and get SIP credentials\n this.credentials = await this.authProvider.authenticate(this.config.auth);\n\n // Step 2: Initialize JsSIP User Agent\n await this.initializeUserAgent();\n\n // Step 3: Initialize Call Manager\n this.initializeCallManager();\n\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n this.emitError(new ConnectionError(`Initialization failed: ${errorMessage}`));\n throw error;\n }\n }\n\n private async initializeUserAgent(): Promise<void> {\n if (!this.credentials) {\n throw new ConnectionError('No credentials available');\n }\n\n try {\n // Create WebSocket connection\n const socket = new JsSIP.WebSocketInterface(this.credentials.wsUrl);\n\n // Build TURN/STUN configuration\n const pcConfig: RTCConfiguration = {\n iceServers: this.config.turnServers || this.getDefaultTurnServers(),\n };\n\n // Create User Agent configuration\n const uaConfig: any = {\n uri: this.credentials.sipUri,\n password: this.credentials.password,\n sockets: [socket],\n register: true,\n display_name: this.getDisplayName(),\n session_timers: false,\n use_preloaded_route: false,\n pcConfig: pcConfig,\n instance_id: this.generateInstanceId(),\n };\n\n // Create User Agent\n this.ua = new JsSIP.UA(uaConfig);\n\n // Set up UA event handlers\n this.setupUserAgentHandlers();\n\n // Start the UA\n this.ua.start();\n\n } catch (error) {\n throw new ConnectionError(\n `Failed to initialize User Agent: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n }\n }\n\n private setupUserAgentHandlers(): void {\n if (!this.ua) return;\n\n this.ua.on('connected', () => {\n this.connectionStatus = 'connected';\n this.emitConnectionStatus();\n });\n\n this.ua.on('disconnected', () => {\n this.connectionStatus = 'disconnected';\n this.emitConnectionStatus();\n });\n\n this.ua.on('registered', () => {\n this.connectionStatus = 'registered';\n this.retryCount = 0;\n this.emitConnectionStatus();\n });\n\n this.ua.on('registrationFailed', (e: any) => {\n this.connectionStatus = 'registrationFailed';\n this.emitConnectionStatus(e.cause);\n\n // Retry logic\n if (this.retryCount < this.maxRetries) {\n this.retryCount++;\n setTimeout(() => {\n this.ua?.register();\n }, 3000);\n }\n });\n\n this.ua.on('newRTCSession', (e: any) => {\n const session = e.session;\n\n if (session.direction === 'incoming') {\n // Handle incoming call\n this.callManager?.handleIncomingCall(session);\n }\n });\n }\n\n private initializeCallManager(): void {\n if (!this.credentials) {\n throw new ConnectionError('No credentials available for call manager');\n }\n\n const pcConfig: RTCConfiguration = {\n iceServers: this.config.turnServers || this.getDefaultTurnServers(),\n };\n\n this.callManager = new CallManager(\n this.credentials,\n this.events,\n { pcConfig }\n );\n\n this.callManager.setUserAgent(this.ua);\n }\n\n /**\n * Make an outbound call\n */\n async call(phoneNumber: string, options?: CallOptions): Promise<Call> {\n if (!this.callManager) {\n throw new CallError('SDK not initialized. Call initialize() first.');\n }\n\n if (this.connectionStatus !== 'registered') {\n throw new CallError('Not registered to SIP server');\n }\n\n return this.callManager.initiateCall(phoneNumber, options);\n }\n\n /**\n * Answer an incoming call\n */\n answerCall(): void {\n const currentCall = this.callManager?.getCurrentCall();\n\n if (!currentCall) {\n throw new CallError('No incoming call to answer');\n }\n\n if (currentCall.direction !== 'inbound') {\n throw new CallError('Current call is not an incoming call');\n }\n\n // The CallSession will handle answering via its internal session\n // This is already set up in CallManager.handleIncomingCall\n }\n\n /**\n * Hangup the current call\n */\n hangup(): void {\n const currentCall = this.callManager?.getCurrentCall();\n\n if (!currentCall) {\n throw new CallError('No active call to hang up');\n }\n\n currentCall.hangup();\n }\n\n /**\n * Get current call\n */\n getCurrentCall(): Call | null {\n return this.callManager?.getCurrentCall() || null;\n }\n\n /**\n * Get connection status\n */\n getStatus(): ConnectionStatus {\n return this.connectionStatus;\n }\n\n /**\n * Get available extensions\n */\n getExtensions(): string[] {\n if (!this.credentials?.extensions) {\n return [];\n }\n return this.credentials.extensions.map(ext => ext.extension);\n }\n\n /**\n * Event listener management\n */\n on<K extends DoraCellEvent>(event: K, handler: DoraCellEventMap[K]): void {\n this.events.on(event, handler as any);\n }\n\n off<K extends DoraCellEvent>(event: K, handler: DoraCellEventMap[K]): void {\n this.events.off(event, handler as any);\n }\n\n once<K extends DoraCellEvent>(event: K, handler: DoraCellEventMap[K]): void {\n this.events.once(event, handler as any);\n }\n\n /**\n * Cleanup and destroy the SDK instance\n */\n destroy(): void {\n if (this.ua) {\n this.ua.stop();\n this.ua = null;\n }\n\n if (this.callManager) {\n this.callManager.destroy();\n this.callManager = null;\n }\n\n this.events.removeAllListeners();\n this.connectionStatus = 'disconnected';\n this.credentials = null;\n }\n\n // Helper methods\n private emitConnectionStatus(error?: string): void {\n const state: ConnectionState = {\n status: this.connectionStatus,\n extension: this.credentials?.extensions?.[0]?.extension,\n error,\n };\n this.events.emit('connection:status', state);\n }\n\n private emitError(error: Error): void {\n this.events.emit('error', error);\n }\n\n private getDefaultTurnServers(): RTCIceServer[] {\n const turnUri = process.env.NEXT_PUBLIC_TURN_URI || 'turn:64.227.10.164:3478';\n const turnUser = process.env.NEXT_PUBLIC_TURN_USER || '02018890089';\n const turnPass = process.env.NEXT_PUBLIC_TURN_PASS || 'dora12345';\n\n return [\n {\n urls: turnUri,\n username: turnUser,\n credential: turnPass,\n },\n ];\n }\n\n private getDisplayName(): string {\n if (this.credentials?.extensions?.[0]?.displayName) {\n return this.credentials.extensions[0].displayName;\n }\n if (this.credentials?.extensions?.[0]?.extension) {\n return `Ext ${this.credentials.extensions[0].extension}`;\n }\n return 'Dora Cell User';\n }\n\n private generateInstanceId(): string {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n}\n\nexport default DoraCell;\n"]}
1
+ {"version":3,"sources":["../src/types/index.ts","../src/core/AuthProvider.ts","../src/utils/phoneFormatter.ts","../src/core/CallManager.ts","../src/core/DoraCell.ts"],"names":["EventEmitter","JsSIP"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Core TypeScript type definitions for Dora Cell SDK\n */\n\n// ============================================\n// Configuration Types\n// ============================================\n\nexport interface ApiTokenAuth {\n type: 'api-token';\n apiToken: string;\n apiBaseUrl?: string;\n}\n\nexport interface DirectCredentialsAuth {\n type: 'direct';\n sipUri: string;\n password: string;\n wsUrl: string;\n}\n\nexport interface ExtensionAuth {\n type: 'extension';\n extension: string;\n // Optional overrides for advanced cases\n password?: string;\n sipDomain?: string;\n}\n\nexport type AuthConfig = ApiTokenAuth | DirectCredentialsAuth | ExtensionAuth;\n\nexport interface DoraCellConfig {\n auth: AuthConfig;\n sipServer?: string;\n turnServers?: RTCIceServer[];\n debug?: boolean;\n autoSelectExtension?: boolean; // Auto-select first available extension\n}\n\n// ============================================\n// SIP Credentials\n// ============================================\n\nexport interface SipCredentials {\n wsUrl: string;\n sipUri: string;\n password: string;\n sipDomain?: string;\n extensions?: Extension[];\n expiresIn?: number;\n}\n\nexport interface Extension {\n extension: string;\n displayName?: string;\n isPrimary?: boolean;\n}\n\n// ============================================\n// Call Types\n// ============================================\n\nexport type CallStatus = 'idle' | 'connecting' | 'ringing' | 'ongoing' | 'ended';\n\nexport type CallDirection = 'inbound' | 'outbound';\n\nexport interface CallOptions {\n extension?: string; // Specific extension to use for this call\n mediaConstraints?: MediaStreamConstraints;\n}\n\nexport interface Call {\n id: string;\n status: CallStatus;\n direction: CallDirection;\n remoteNumber: string;\n localExtension: string;\n duration: number;\n startTime?: number;\n endTime?: number;\n\n // Methods\n mute(): void;\n unmute(): void;\n hangup(): void;\n isMuted(): boolean;\n}\n\n// ============================================\n// Connection Status\n// ============================================\n\nexport type ConnectionStatus =\n | 'disconnected'\n | 'connecting'\n | 'connected'\n | 'registered'\n | 'registrationFailed';\n\nexport interface ConnectionState {\n status: ConnectionStatus;\n extension?: string;\n error?: string;\n}\n\n// ============================================\n// Events\n// ============================================\n\nexport type DoraCellEventMap = {\n 'connection:status': (state: ConnectionState) => void;\n 'call:incoming': (call: Call) => void;\n 'call:outgoing': (call: Call) => void;\n 'call:ringing': (call: Call) => void;\n 'call:connected': (call: Call) => void;\n 'call:ended': (call: Call, reason?: string) => void;\n 'call:failed': (call: Call, error: string) => void;\n 'error': (error: Error) => void;\n};\n\nexport type DoraCellEvent = keyof DoraCellEventMap;\n\n// ============================================\n// API Response Types\n// ============================================\n\nexport interface ApiTokenResponse {\n ws_url?: string;\n wsUrl?: string;\n sip_uri?: string;\n sipUri?: string;\n password?: string;\n sip_domain?: string;\n sipDomain?: string;\n extensions?: Extension[];\n expires_in?: number;\n expiresIn?: number;\n}\n\n// ============================================\n// Error Types\n// ============================================\n\nexport class DoraCellError extends Error {\n constructor(\n message: string,\n public code?: string,\n public details?: any\n ) {\n super(message);\n this.name = 'DoraCellError';\n }\n}\n\nexport class AuthenticationError extends DoraCellError {\n constructor(message: string, details?: any) {\n super(message, 'AUTH_ERROR', details);\n this.name = 'AuthenticationError';\n }\n}\n\nexport class CallError extends DoraCellError {\n constructor(message: string, details?: any) {\n super(message, 'CALL_ERROR', details);\n this.name = 'CallError';\n }\n}\n\nexport class ConnectionError extends DoraCellError {\n constructor(message: string, details?: any) {\n super(message, 'CONNECTION_ERROR', details);\n this.name = 'ConnectionError';\n }\n}\n","/**\n * Authentication provider for API token-based authentication\n */\n\nimport type {\n AuthConfig,\n SipCredentials,\n ApiTokenResponse,\n Extension,\n} from '../types';\nimport { AuthenticationError } from '../types';\n\nexport interface AuthProvider {\n authenticate(config: AuthConfig): Promise<SipCredentials>;\n refreshCredentials?(): Promise<SipCredentials>;\n isAuthenticated(): boolean;\n}\n\n/**\n * API Token Authentication Provider\n * Exchanges API token for SIP credentials via backend API\n */\nexport class ApiTokenAuthProvider implements AuthProvider {\n private credentials: SipCredentials | null = null;\n private apiToken: string;\n private apiBaseUrl: string;\n\n constructor(apiToken: string, apiBaseUrl?: string) {\n this.apiToken = apiToken;\n let defaultBaseUrl = '';\n if (typeof process !== 'undefined' && process.env) {\n defaultBaseUrl = process.env.NEXT_PUBLIC_BASE_API_URL || '';\n }\n this.apiBaseUrl = apiBaseUrl || defaultBaseUrl;\n }\n\n async authenticate(config: AuthConfig): Promise<SipCredentials> {\n if (config.type !== 'api-token') {\n throw new AuthenticationError('Invalid auth config type for ApiTokenAuthProvider');\n }\n\n try {\n const response = await fetch(`${this.apiBaseUrl}/api/sip-credentials`, {\n method: 'GET',\n headers: {\n 'Authorization': `Bearer ${this.apiToken}`,\n 'Content-Type': 'application/json',\n 'Accept': 'application/json',\n },\n credentials: 'include',\n });\n\n if (!response.ok) {\n if (response.status === 401 || response.status === 403) {\n throw new AuthenticationError(\n 'Invalid API token or insufficient permissions',\n { status: response.status }\n );\n }\n throw new AuthenticationError(\n `Failed to fetch SIP credentials: ${response.status}`,\n { status: response.status }\n );\n }\n\n const data: ApiTokenResponse = await response.json();\n this.credentials = this.parseCredentials(data);\n return this.credentials;\n } catch (error) {\n if (error instanceof AuthenticationError) {\n throw error;\n }\n throw new AuthenticationError(\n `Authentication failed: ${error instanceof Error ? error.message : 'Unknown error'}`,\n { originalError: error }\n );\n }\n }\n\n async refreshCredentials(): Promise<SipCredentials> {\n // Re-authenticate to get fresh credentials\n return this.authenticate({ type: 'api-token', apiToken: this.apiToken });\n }\n\n isAuthenticated(): boolean {\n return this.credentials !== null;\n }\n\n private parseCredentials(data: ApiTokenResponse): SipCredentials {\n const wsUrl = data.ws_url || data.wsUrl;\n const sipUri = data.sip_uri || data.sipUri;\n const password = data.password;\n const sipDomain = data.sip_domain || data.sipDomain;\n const extensions = data.extensions;\n const expiresIn = data.expires_in || data.expiresIn;\n\n if (!wsUrl || !sipUri) {\n throw new AuthenticationError(\n 'Invalid credentials response: missing ws_url or sip_uri'\n );\n }\n\n return {\n wsUrl,\n sipUri,\n password: password || '',\n sipDomain,\n extensions,\n expiresIn,\n };\n }\n}\n\n/**\n * Direct Credentials Authentication Provider\n * Uses credentials provided directly in configuration\n */\nexport class DirectCredentialsAuthProvider implements AuthProvider {\n private credentials: SipCredentials | null = null;\n\n async authenticate(config: AuthConfig): Promise<SipCredentials> {\n if (config.type !== 'direct') {\n throw new AuthenticationError('Invalid auth config type for DirectCredentialsAuthProvider');\n }\n\n this.credentials = {\n wsUrl: config.wsUrl,\n sipUri: config.sipUri,\n password: config.password,\n };\n\n return this.credentials;\n }\n\n isAuthenticated(): boolean {\n return this.credentials !== null;\n }\n}\n\n/**\n * Extension Authentication Provider\n * Simplified plug-and-play authentication using just an extension number.\n * Uses default Dora Cell infrastructure configuration.\n */\nconst DEFAULT_WSS_URL = 'wss://cell.usedora.com:8089';\nconst DEFAULT_SIP_IP = '64.227.10.164';\nconst DEFAULT_PASSWORD = '1234';\n\nexport class ExtensionAuthProvider implements AuthProvider {\n private credentials: SipCredentials | null = null;\n\n async authenticate(config: AuthConfig): Promise<SipCredentials> {\n if (config.type !== 'extension') {\n throw new AuthenticationError('Invalid auth config type for ExtensionAuthProvider');\n }\n\n const extension = config.extension;\n const password = config.password || DEFAULT_PASSWORD;\n const wsUrl = DEFAULT_WSS_URL;\n const sipDomain = config.sipDomain || DEFAULT_SIP_IP;\n\n const sipUri = `sip:${extension}@${sipDomain}`;\n\n this.credentials = {\n wsUrl,\n sipUri,\n password,\n sipDomain,\n extensions: [{ extension, displayName: `Ext ${extension}`, isPrimary: true }]\n };\n\n return this.credentials;\n }\n\n isAuthenticated(): boolean {\n return this.credentials !== null;\n }\n}\n\n/**\n * Factory function to create appropriate auth provider\n */\nexport function createAuthProvider(config: AuthConfig): AuthProvider {\n switch (config.type) {\n case 'api-token':\n return new ApiTokenAuthProvider(config.apiToken, config.apiBaseUrl);\n case 'direct':\n return new DirectCredentialsAuthProvider();\n case 'extension':\n return new ExtensionAuthProvider();\n default:\n throw new AuthenticationError('Unknown authentication type');\n }\n}\n","/**\n * Phone number formatting utilities\n * Extracted from JsSIPProvider.tsx\n */\n\n/**\n * Format a phone number to SIP URI format\n * Handles Nigerian numbers, international format, and local extensions\n */\nexport function formatPhoneToSIP(phone: string, sipDomain: string): string {\n // Strip all non-numeric characters\n let cleaned = phone.replace(/\\D/g, '');\n\n // Case 1: Short local extension (like \"101\", \"102\", etc.)\n if (cleaned.length <= 4) {\n return `sip:${cleaned}@${sipDomain}`;\n }\n\n // Case 2: Nigerian number starting with 0 (like \"08012345678\")\n if (cleaned.startsWith('0')) {\n cleaned = '234' + cleaned.substring(1);\n return `sip:${cleaned}@${sipDomain}`;\n }\n\n // Case 3: Already in international format (starts with 234)\n if (cleaned.startsWith('234')) {\n return `sip:${cleaned}@${sipDomain}`;\n }\n\n // Case 4: Any other number - assume it needs 234 prefix\n cleaned = '234' + cleaned;\n return `sip:${cleaned}@${sipDomain}`;\n}\n\n/**\n * Normalize a phone number to E.164 format\n */\nexport function normalizePhoneNumber(\n phone: string,\n countryCode: string = '234'\n): string {\n let cleaned = phone.replace(/\\D/g, '');\n\n // If it's a short extension, return as-is\n if (cleaned.length <= 4) {\n return cleaned;\n }\n\n // Remove leading 0 and add country code\n if (cleaned.startsWith('0')) {\n return countryCode + cleaned.substring(1);\n }\n\n // If already has country code, return as-is\n if (cleaned.startsWith(countryCode)) {\n return cleaned;\n }\n\n // Otherwise add country code\n return countryCode + cleaned;\n}\n\n/**\n * Extract extension/number from SIP URI\n */\nexport function extractNumberFromSipUri(sipUri: string): string {\n const match = sipUri.match(/sip:([^@]+)@/);\n return match ? match[1] : sipUri;\n}\n\n/**\n * Validate phone number format\n */\nexport function isValidPhoneNumber(phone: string, minLength: number = 3): boolean {\n const cleaned = phone.replace(/\\D/g, '');\n return cleaned.length >= minLength;\n}\n","/**\n * Call Manager - Handles individual call sessions\n * Extracted and refactored from JsSIPProvider.tsx\n */\n\nimport type {\n Call,\n CallStatus,\n CallDirection,\n CallOptions,\n SipCredentials,\n} from '../types';\nimport { CallError } from '../types';\nimport { formatPhoneToSIP } from '../utils/phoneFormatter';\nimport EventEmitter from 'eventemitter3';\n\nexport interface CallConfig {\n pcConfig: RTCConfiguration;\n mediaConstraints?: MediaStreamConstraints;\n}\n\nexport class CallSession implements Call {\n public id: string;\n public status: CallStatus = 'idle';\n public direction: CallDirection;\n public remoteNumber: string;\n public localExtension: string;\n public duration: number = 0;\n public startTime?: number;\n public endTime?: number;\n\n private session: any; // JsSIP RTCSession\n private _isMuted: boolean = false;\n private remoteStreamValue: MediaStream | null = null;\n private durationInterval?: number;\n private events: EventEmitter;\n\n constructor(\n session: any,\n direction: CallDirection,\n remoteNumber: string,\n localExtension: string,\n events: EventEmitter\n ) {\n this.id = this.generateCallId();\n this.session = session;\n this.direction = direction;\n this.remoteNumber = remoteNumber;\n this.localExtension = localExtension;\n this.events = events;\n\n this.setupSessionHandlers();\n }\n\n private generateCallId(): string {\n return `call_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n }\n\n private setupSessionHandlers(): void {\n // Progress event (ringing)\n this.session.on('progress', (evt: any) => {\n const code = evt.response?.status_code;\n if (code === 180 || code === 183) {\n this.status = 'ringing';\n this.events.emit('call:ringing', this);\n }\n });\n\n // Call confirmed (connected)\n this.session.on('confirmed', () => {\n this.status = 'ongoing';\n this.startTime = Date.now();\n this.startDurationTimer();\n this.events.emit('call:connected', this);\n });\n\n // Peer connection setup\n this.session.on('peerconnection', (evt: any) => {\n evt.peerconnection.ontrack = (event: any) => {\n if (event.streams && event.streams[0]) {\n this.remoteStreamValue = event.streams[0];\n }\n };\n });\n\n // Call ended\n this.session.on('ended', (evt: any) => {\n this.handleCallEnd(evt?.cause);\n });\n\n // Call failed\n this.session.on('failed', (evt: any) => {\n this.handleCallEnd(evt?.cause || 'Call failed');\n });\n\n // Call rejected\n this.session.on('rejected', (evt: any) => {\n this.handleCallEnd(evt?.cause || 'Call rejected');\n });\n }\n\n private handleCallEnd(reason?: string): void {\n this.status = 'ended';\n this.endTime = Date.now();\n this.stopDurationTimer();\n this.remoteStreamValue = null;\n this._isMuted = false;\n this.events.emit('call:ended', this, reason);\n }\n\n private startDurationTimer(): void {\n this.durationInterval = window.setInterval(() => {\n if (this.startTime) {\n this.duration = Math.floor((Date.now() - this.startTime) / 1000);\n }\n }, 1000);\n }\n\n private stopDurationTimer(): void {\n if (this.durationInterval) {\n clearInterval(this.durationInterval);\n this.durationInterval = undefined;\n }\n }\n\n // Public methods\n mute(): void {\n if (this.session && !this._isMuted) {\n this.session.mute({ audio: true });\n this._isMuted = true;\n }\n }\n\n unmute(): void {\n if (this.session && this._isMuted) {\n this.session.unmute({ audio: true });\n this._isMuted = false;\n }\n }\n\n hangup(): void {\n if (this.session) {\n this.session.terminate();\n }\n }\n\n isMuted(): boolean {\n return this._isMuted;\n }\n\n getRemoteStream(): MediaStream | null {\n return this.remoteStreamValue;\n }\n\n getFormattedDuration(): string {\n const mm = String(Math.floor(this.duration / 60)).padStart(2, '0');\n const ss = String(this.duration % 60).padStart(2, '0');\n return `${mm}:${ss}`;\n }\n\n destroy(): void {\n this.stopDurationTimer();\n this.session = null;\n this.remoteStreamValue = null;\n }\n}\n\n/**\n * Call Manager - Manages call sessions and JsSIP integration\n */\nexport class CallManager {\n private ua: any | null = null; // JsSIP User Agent\n private currentCall: CallSession | null = null;\n private credentials: SipCredentials;\n private events: EventEmitter;\n private callConfig: CallConfig;\n\n constructor(\n credentials: SipCredentials,\n events: EventEmitter,\n callConfig: CallConfig\n ) {\n this.credentials = credentials;\n this.events = events;\n this.callConfig = callConfig;\n }\n\n setUserAgent(ua: any): void {\n this.ua = ua;\n }\n\n /**\n * Initiate an outbound call\n */\n async initiateCall(\n targetNumber: string,\n options?: CallOptions\n ): Promise<CallSession> {\n if (!this.ua) {\n throw new CallError('User Agent not initialized');\n }\n\n if (this.currentCall && this.currentCall.status !== 'ended') {\n throw new CallError('A call is already in progress');\n }\n\n try {\n // Request microphone permission\n await navigator.mediaDevices.getUserMedia({ audio: true });\n\n // Determine which extension to use\n const extension = options?.extension || this.getDefaultExtension();\n\n // Format the target number to SIP URI\n const sipDomain = this.extractDomain(this.credentials.sipUri);\n const sipTarget = formatPhoneToSIP(targetNumber, sipDomain);\n\n // Initiate the call\n const session = this.ua.call(sipTarget, {\n mediaConstraints: options?.mediaConstraints || { audio: true },\n pcConfig: this.callConfig.pcConfig,\n });\n\n // Create call session\n const call = new CallSession(\n session,\n 'outbound',\n targetNumber,\n extension,\n this.events\n );\n\n call.status = 'connecting';\n this.currentCall = call;\n this.events.emit('call:outgoing', call);\n\n return call;\n } catch (error) {\n throw new CallError(\n `Failed to initiate call: ${error instanceof Error ? error.message : 'Unknown error'}`,\n { originalError: error }\n );\n }\n }\n\n /**\n * Answer an incoming call\n */\n answerCall(session: any): CallSession {\n if (!session) {\n throw new CallError('No session provided');\n }\n\n try {\n const remoteUri = session.remote_identity?.uri?.toString() || 'Unknown';\n const extension = this.getDefaultExtension();\n\n session.answer({\n mediaConstraints: { audio: true },\n pcConfig: this.callConfig.pcConfig,\n });\n\n const call = new CallSession(\n session,\n 'inbound',\n remoteUri,\n extension,\n this.events\n );\n\n this.currentCall = call;\n return call;\n } catch (error) {\n throw new CallError(\n `Failed to answer call: ${error instanceof Error ? error.message : 'Unknown error'}`,\n { originalError: error }\n );\n }\n }\n\n /**\n * Handle incoming call from JsSIP\n */\n handleIncomingCall(session: any): CallSession {\n const remoteUri = session.remote_identity?.uri?.toString() || 'Unknown';\n const extension = this.getDefaultExtension();\n\n const call = new CallSession(\n session,\n 'inbound',\n remoteUri,\n extension,\n this.events\n );\n\n call.status = 'ringing';\n this.currentCall = call;\n this.events.emit('call:incoming', call);\n\n return call;\n }\n\n getCurrentCall(): CallSession | null {\n return this.currentCall;\n }\n\n clearCurrentCall(): void {\n if (this.currentCall) {\n this.currentCall.destroy();\n this.currentCall = null;\n }\n }\n\n private getDefaultExtension(): string {\n // Auto-select first extension if available\n if (this.credentials.extensions && this.credentials.extensions.length > 0) {\n return this.credentials.extensions[0].extension;\n }\n // Fallback to extracting from sipUri\n return this.extractExtension(this.credentials.sipUri);\n }\n\n private extractExtension(sipUri: string): string {\n const match = sipUri.match(/sip:([^@]+)@/);\n return match ? match[1] : 'unknown';\n }\n\n private extractDomain(sipUri: string): string {\n const match = sipUri.match(/@(.+)$/);\n return match ? match[1] : '';\n }\n\n destroy(): void {\n this.clearCurrentCall();\n this.ua = null;\n }\n}\n","/**\n * Dora Cell SDK - Main entry point\n * Framework-agnostic VoIP calling SDK using JsSIP\n */\n\nimport JsSIP from 'jssip';\nimport EventEmitter from 'eventemitter3';\nimport type {\n DoraCellConfig,\n DoraCellEventMap,\n DoraCellEvent,\n ConnectionStatus,\n ConnectionState,\n Call,\n CallOptions,\n SipCredentials,\n} from '../types';\nimport { ConnectionError, CallError } from '../types';\nimport { createAuthProvider, AuthProvider } from './AuthProvider';\nimport { CallManager } from './CallManager';\n\nexport class DoraCell {\n private config: DoraCellConfig;\n private events: EventEmitter;\n private authProvider: AuthProvider;\n private credentials: SipCredentials | null = null;\n private ua: any | null = null; // JsSIP User Agent\n private callManager: CallManager | null = null;\n private connectionStatus: ConnectionStatus = 'disconnected';\n private retryCount: number = 0;\n private maxRetries: number = 3;\n\n constructor(config: DoraCellConfig) {\n this.config = {\n autoSelectExtension: true,\n debug: false,\n ...config,\n };\n\n this.events = new EventEmitter();\n this.authProvider = createAuthProvider(config.auth);\n\n // Enable JsSIP debugging if requested\n if (this.config.debug) {\n JsSIP.debug.enable('JsSIP:*');\n }\n }\n\n /**\n * Initialize the SDK - authenticate and connect to SIP server\n */\n async initialize(): Promise<void> {\n try {\n // Step 1: Authenticate and get SIP credentials\n this.credentials = await this.authProvider.authenticate(this.config.auth);\n\n // Step 2: Initialize JsSIP User Agent\n await this.initializeUserAgent();\n\n // Step 3: Initialize Call Manager\n this.initializeCallManager();\n\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n this.emitError(new ConnectionError(`Initialization failed: ${errorMessage}`));\n throw error;\n }\n }\n\n private async initializeUserAgent(): Promise<void> {\n if (!this.credentials) {\n throw new ConnectionError('No credentials available');\n }\n\n try {\n // Create WebSocket connection\n const socket = new JsSIP.WebSocketInterface(this.credentials.wsUrl);\n\n // Build TURN/STUN configuration\n const pcConfig: RTCConfiguration = {\n iceServers: this.config.turnServers || this.getDefaultTurnServers(),\n };\n\n // Create User Agent configuration\n const uaConfig: any = {\n uri: this.credentials.sipUri,\n password: this.credentials.password,\n sockets: [socket],\n register: true,\n display_name: this.getDisplayName(),\n session_timers: false,\n use_preloaded_route: false,\n pcConfig: pcConfig,\n instance_id: this.generateInstanceId(),\n };\n\n // Create User Agent\n this.ua = new JsSIP.UA(uaConfig);\n\n // Set up UA event handlers\n this.setupUserAgentHandlers();\n\n // Start the UA\n this.ua.start();\n\n } catch (error) {\n throw new ConnectionError(\n `Failed to initialize User Agent: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n }\n }\n\n private setupUserAgentHandlers(): void {\n if (!this.ua) return;\n\n this.ua.on('connected', () => {\n this.connectionStatus = 'connected';\n this.emitConnectionStatus();\n });\n\n this.ua.on('disconnected', () => {\n this.connectionStatus = 'disconnected';\n this.emitConnectionStatus();\n });\n\n this.ua.on('registered', () => {\n this.connectionStatus = 'registered';\n this.retryCount = 0;\n this.emitConnectionStatus();\n });\n\n this.ua.on('registrationFailed', (e: any) => {\n this.connectionStatus = 'registrationFailed';\n this.emitConnectionStatus(e.cause);\n\n // Retry logic\n if (this.retryCount < this.maxRetries) {\n this.retryCount++;\n setTimeout(() => {\n this.ua?.register();\n }, 3000);\n }\n });\n\n this.ua.on('newRTCSession', (e: any) => {\n const session = e.session;\n\n if (session.direction === 'incoming') {\n // Handle incoming call\n this.callManager?.handleIncomingCall(session);\n }\n });\n }\n\n private initializeCallManager(): void {\n if (!this.credentials) {\n throw new ConnectionError('No credentials available for call manager');\n }\n\n const pcConfig: RTCConfiguration = {\n iceServers: this.config.turnServers || this.getDefaultTurnServers(),\n };\n\n this.callManager = new CallManager(\n this.credentials,\n this.events,\n { pcConfig }\n );\n\n this.callManager.setUserAgent(this.ua);\n }\n\n /**\n * Make an outbound call\n */\n async call(phoneNumber: string, options?: CallOptions): Promise<Call> {\n if (!this.callManager) {\n throw new CallError('SDK not initialized. Call initialize() first.');\n }\n\n if (this.connectionStatus !== 'registered') {\n throw new CallError('Not registered to SIP server');\n }\n\n return this.callManager.initiateCall(phoneNumber, options);\n }\n\n /**\n * Answer an incoming call\n */\n answerCall(): void {\n const currentCall = this.callManager?.getCurrentCall();\n\n if (!currentCall) {\n throw new CallError('No incoming call to answer');\n }\n\n if (currentCall.direction !== 'inbound') {\n throw new CallError('Current call is not an incoming call');\n }\n\n // The CallSession will handle answering via its internal session\n // This is already set up in CallManager.handleIncomingCall\n }\n\n /**\n * Hangup the current call\n */\n hangup(): void {\n const currentCall = this.callManager?.getCurrentCall();\n\n if (!currentCall) {\n throw new CallError('No active call to hang up');\n }\n\n currentCall.hangup();\n }\n\n /**\n * Get current call\n */\n getCurrentCall(): Call | null {\n return this.callManager?.getCurrentCall() || null;\n }\n\n /**\n * Get connection status\n */\n getStatus(): ConnectionStatus {\n return this.connectionStatus;\n }\n\n /**\n * Get available extensions\n */\n getExtensions(): string[] {\n if (!this.credentials?.extensions) {\n return [];\n }\n return this.credentials.extensions.map(ext => ext.extension);\n }\n\n /**\n * Event listener management\n */\n on<K extends DoraCellEvent>(event: K, handler: DoraCellEventMap[K]): void {\n this.events.on(event, handler as any);\n }\n\n off<K extends DoraCellEvent>(event: K, handler: DoraCellEventMap[K]): void {\n this.events.off(event, handler as any);\n }\n\n once<K extends DoraCellEvent>(event: K, handler: DoraCellEventMap[K]): void {\n this.events.once(event, handler as any);\n }\n\n /**\n * Cleanup and destroy the SDK instance\n */\n destroy(): void {\n if (this.ua) {\n this.ua.stop();\n this.ua = null;\n }\n\n if (this.callManager) {\n this.callManager.destroy();\n this.callManager = null;\n }\n\n this.events.removeAllListeners();\n this.connectionStatus = 'disconnected';\n this.credentials = null;\n }\n\n // Helper methods\n private emitConnectionStatus(error?: string): void {\n const state: ConnectionState = {\n status: this.connectionStatus,\n extension: this.credentials?.extensions?.[0]?.extension,\n error,\n };\n this.events.emit('connection:status', state);\n }\n\n private emitError(error: Error): void {\n this.events.emit('error', error);\n }\n\n private getDefaultTurnServers(): RTCIceServer[] {\n let turnUri = 'turn:64.227.10.164:3478';\n let turnUser = '02018890089';\n let turnPass = 'dora12345';\n\n if (typeof process !== 'undefined' && process.env) {\n turnUri = process.env.NEXT_PUBLIC_TURN_URI || turnUri;\n turnUser = process.env.NEXT_PUBLIC_TURN_USER || turnUser;\n turnPass = process.env.NEXT_PUBLIC_TURN_PASS || turnPass;\n }\n\n return [\n {\n urls: turnUri,\n username: turnUser,\n credential: turnPass,\n },\n ];\n }\n\n private getDisplayName(): string {\n if (this.credentials?.extensions?.[0]?.displayName) {\n return this.credentials.extensions[0].displayName;\n }\n if (this.credentials?.extensions?.[0]?.extension) {\n return `Ext ${this.credentials.extensions[0].extension}`;\n }\n return 'Dora Cell User';\n }\n\n private generateInstanceId(): string {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n}\n\nexport default DoraCell;\n"]}
package/dist/index.mjs CHANGED
@@ -36,7 +36,11 @@ var ApiTokenAuthProvider = class {
36
36
  constructor(apiToken, apiBaseUrl) {
37
37
  this.credentials = null;
38
38
  this.apiToken = apiToken;
39
- this.apiBaseUrl = apiBaseUrl || process.env.NEXT_PUBLIC_BASE_API_URL || "";
39
+ let defaultBaseUrl = "";
40
+ if (typeof process !== "undefined" && process.env) {
41
+ defaultBaseUrl = process.env.NEXT_PUBLIC_BASE_API_URL || "";
42
+ }
43
+ this.apiBaseUrl = apiBaseUrl || defaultBaseUrl;
40
44
  }
41
45
  async authenticate(config) {
42
46
  if (config.type !== "api-token") {
@@ -124,12 +128,43 @@ var DirectCredentialsAuthProvider = class {
124
128
  return this.credentials !== null;
125
129
  }
126
130
  };
131
+ var DEFAULT_WSS_URL = "wss://cell.usedora.com:8089";
132
+ var DEFAULT_SIP_IP = "64.227.10.164";
133
+ var DEFAULT_PASSWORD = "1234";
134
+ var ExtensionAuthProvider = class {
135
+ constructor() {
136
+ this.credentials = null;
137
+ }
138
+ async authenticate(config) {
139
+ if (config.type !== "extension") {
140
+ throw new AuthenticationError("Invalid auth config type for ExtensionAuthProvider");
141
+ }
142
+ const extension = config.extension;
143
+ const password = config.password || DEFAULT_PASSWORD;
144
+ const wsUrl = DEFAULT_WSS_URL;
145
+ const sipDomain = config.sipDomain || DEFAULT_SIP_IP;
146
+ const sipUri = `sip:${extension}@${sipDomain}`;
147
+ this.credentials = {
148
+ wsUrl,
149
+ sipUri,
150
+ password,
151
+ sipDomain,
152
+ extensions: [{ extension, displayName: `Ext ${extension}`, isPrimary: true }]
153
+ };
154
+ return this.credentials;
155
+ }
156
+ isAuthenticated() {
157
+ return this.credentials !== null;
158
+ }
159
+ };
127
160
  function createAuthProvider(config) {
128
161
  switch (config.type) {
129
162
  case "api-token":
130
163
  return new ApiTokenAuthProvider(config.apiToken, config.apiBaseUrl);
131
164
  case "direct":
132
165
  return new DirectCredentialsAuthProvider();
166
+ case "extension":
167
+ return new ExtensionAuthProvider();
133
168
  default:
134
169
  throw new AuthenticationError("Unknown authentication type");
135
170
  }
@@ -611,9 +646,14 @@ var DoraCell = class {
611
646
  this.events.emit("error", error);
612
647
  }
613
648
  getDefaultTurnServers() {
614
- const turnUri = process.env.NEXT_PUBLIC_TURN_URI || "turn:64.227.10.164:3478";
615
- const turnUser = process.env.NEXT_PUBLIC_TURN_USER || "02018890089";
616
- const turnPass = process.env.NEXT_PUBLIC_TURN_PASS || "dora12345";
649
+ let turnUri = "turn:64.227.10.164:3478";
650
+ let turnUser = "02018890089";
651
+ let turnPass = "dora12345";
652
+ if (typeof process !== "undefined" && process.env) {
653
+ turnUri = process.env.NEXT_PUBLIC_TURN_URI || turnUri;
654
+ turnUser = process.env.NEXT_PUBLIC_TURN_USER || turnUser;
655
+ turnPass = process.env.NEXT_PUBLIC_TURN_PASS || turnPass;
656
+ }
617
657
  return [
618
658
  {
619
659
  urls: turnUri,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/types/index.ts","../src/core/AuthProvider.ts","../src/utils/phoneFormatter.ts","../src/core/CallManager.ts","../src/core/DoraCell.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Core TypeScript type definitions for Dora Cell SDK\n */\n\n// ============================================\n// Configuration Types\n// ============================================\n\nexport interface ApiTokenAuth {\n type: 'api-token';\n apiToken: string;\n apiBaseUrl?: string;\n}\n\nexport interface DirectCredentialsAuth {\n type: 'direct';\n sipUri: string;\n password: string;\n wsUrl: string;\n}\n\nexport type AuthConfig = ApiTokenAuth | DirectCredentialsAuth;\n\nexport interface DoraCellConfig {\n auth: AuthConfig;\n sipServer?: string;\n turnServers?: RTCIceServer[];\n debug?: boolean;\n autoSelectExtension?: boolean; // Auto-select first available extension\n}\n\n// ============================================\n// SIP Credentials\n// ============================================\n\nexport interface SipCredentials {\n wsUrl: string;\n sipUri: string;\n password: string;\n sipDomain?: string;\n extensions?: Extension[];\n expiresIn?: number;\n}\n\nexport interface Extension {\n extension: string;\n displayName?: string;\n isPrimary?: boolean;\n}\n\n// ============================================\n// Call Types\n// ============================================\n\nexport type CallStatus = 'idle' | 'connecting' | 'ringing' | 'ongoing' | 'ended';\n\nexport type CallDirection = 'inbound' | 'outbound';\n\nexport interface CallOptions {\n extension?: string; // Specific extension to use for this call\n mediaConstraints?: MediaStreamConstraints;\n}\n\nexport interface Call {\n id: string;\n status: CallStatus;\n direction: CallDirection;\n remoteNumber: string;\n localExtension: string;\n duration: number;\n startTime?: number;\n endTime?: number;\n\n // Methods\n mute(): void;\n unmute(): void;\n hangup(): void;\n isMuted(): boolean;\n}\n\n// ============================================\n// Connection Status\n// ============================================\n\nexport type ConnectionStatus =\n | 'disconnected'\n | 'connecting'\n | 'connected'\n | 'registered'\n | 'registrationFailed';\n\nexport interface ConnectionState {\n status: ConnectionStatus;\n extension?: string;\n error?: string;\n}\n\n// ============================================\n// Events\n// ============================================\n\nexport type DoraCellEventMap = {\n 'connection:status': (state: ConnectionState) => void;\n 'call:incoming': (call: Call) => void;\n 'call:outgoing': (call: Call) => void;\n 'call:ringing': (call: Call) => void;\n 'call:connected': (call: Call) => void;\n 'call:ended': (call: Call, reason?: string) => void;\n 'call:failed': (call: Call, error: string) => void;\n 'error': (error: Error) => void;\n};\n\nexport type DoraCellEvent = keyof DoraCellEventMap;\n\n// ============================================\n// API Response Types\n// ============================================\n\nexport interface ApiTokenResponse {\n ws_url?: string;\n wsUrl?: string;\n sip_uri?: string;\n sipUri?: string;\n password?: string;\n sip_domain?: string;\n sipDomain?: string;\n extensions?: Extension[];\n expires_in?: number;\n expiresIn?: number;\n}\n\n// ============================================\n// Error Types\n// ============================================\n\nexport class DoraCellError extends Error {\n constructor(\n message: string,\n public code?: string,\n public details?: any\n ) {\n super(message);\n this.name = 'DoraCellError';\n }\n}\n\nexport class AuthenticationError extends DoraCellError {\n constructor(message: string, details?: any) {\n super(message, 'AUTH_ERROR', details);\n this.name = 'AuthenticationError';\n }\n}\n\nexport class CallError extends DoraCellError {\n constructor(message: string, details?: any) {\n super(message, 'CALL_ERROR', details);\n this.name = 'CallError';\n }\n}\n\nexport class ConnectionError extends DoraCellError {\n constructor(message: string, details?: any) {\n super(message, 'CONNECTION_ERROR', details);\n this.name = 'ConnectionError';\n }\n}\n","/**\n * Authentication provider for API token-based authentication\n */\n\nimport type {\n AuthConfig,\n SipCredentials,\n ApiTokenResponse,\n Extension,\n} from '../types';\nimport { AuthenticationError } from '../types';\n\nexport interface AuthProvider {\n authenticate(config: AuthConfig): Promise<SipCredentials>;\n refreshCredentials?(): Promise<SipCredentials>;\n isAuthenticated(): boolean;\n}\n\n/**\n * API Token Authentication Provider\n * Exchanges API token for SIP credentials via backend API\n */\nexport class ApiTokenAuthProvider implements AuthProvider {\n private credentials: SipCredentials | null = null;\n private apiToken: string;\n private apiBaseUrl: string;\n\n constructor(apiToken: string, apiBaseUrl?: string) {\n this.apiToken = apiToken;\n this.apiBaseUrl = apiBaseUrl || process.env.NEXT_PUBLIC_BASE_API_URL || '';\n }\n\n async authenticate(config: AuthConfig): Promise<SipCredentials> {\n if (config.type !== 'api-token') {\n throw new AuthenticationError('Invalid auth config type for ApiTokenAuthProvider');\n }\n\n try {\n const response = await fetch(`${this.apiBaseUrl}/api/sip-credentials`, {\n method: 'GET',\n headers: {\n 'Authorization': `Bearer ${this.apiToken}`,\n 'Content-Type': 'application/json',\n 'Accept': 'application/json',\n },\n credentials: 'include',\n });\n\n if (!response.ok) {\n if (response.status === 401 || response.status === 403) {\n throw new AuthenticationError(\n 'Invalid API token or insufficient permissions',\n { status: response.status }\n );\n }\n throw new AuthenticationError(\n `Failed to fetch SIP credentials: ${response.status}`,\n { status: response.status }\n );\n }\n\n const data: ApiTokenResponse = await response.json();\n this.credentials = this.parseCredentials(data);\n return this.credentials;\n } catch (error) {\n if (error instanceof AuthenticationError) {\n throw error;\n }\n throw new AuthenticationError(\n `Authentication failed: ${error instanceof Error ? error.message : 'Unknown error'}`,\n { originalError: error }\n );\n }\n }\n\n async refreshCredentials(): Promise<SipCredentials> {\n // Re-authenticate to get fresh credentials\n return this.authenticate({ type: 'api-token', apiToken: this.apiToken });\n }\n\n isAuthenticated(): boolean {\n return this.credentials !== null;\n }\n\n private parseCredentials(data: ApiTokenResponse): SipCredentials {\n const wsUrl = data.ws_url || data.wsUrl;\n const sipUri = data.sip_uri || data.sipUri;\n const password = data.password;\n const sipDomain = data.sip_domain || data.sipDomain;\n const extensions = data.extensions;\n const expiresIn = data.expires_in || data.expiresIn;\n\n if (!wsUrl || !sipUri) {\n throw new AuthenticationError(\n 'Invalid credentials response: missing ws_url or sip_uri'\n );\n }\n\n return {\n wsUrl,\n sipUri,\n password: password || '',\n sipDomain,\n extensions,\n expiresIn,\n };\n }\n}\n\n/**\n * Direct Credentials Authentication Provider\n * Uses credentials provided directly in configuration\n */\nexport class DirectCredentialsAuthProvider implements AuthProvider {\n private credentials: SipCredentials | null = null;\n\n async authenticate(config: AuthConfig): Promise<SipCredentials> {\n if (config.type !== 'direct') {\n throw new AuthenticationError('Invalid auth config type for DirectCredentialsAuthProvider');\n }\n\n this.credentials = {\n wsUrl: config.wsUrl,\n sipUri: config.sipUri,\n password: config.password,\n };\n\n return this.credentials;\n }\n\n isAuthenticated(): boolean {\n return this.credentials !== null;\n }\n}\n\n/**\n * Factory function to create appropriate auth provider\n */\nexport function createAuthProvider(config: AuthConfig): AuthProvider {\n switch (config.type) {\n case 'api-token':\n return new ApiTokenAuthProvider(config.apiToken, config.apiBaseUrl);\n case 'direct':\n return new DirectCredentialsAuthProvider();\n default:\n throw new AuthenticationError('Unknown authentication type');\n }\n}\n","/**\n * Phone number formatting utilities\n * Extracted from JsSIPProvider.tsx\n */\n\n/**\n * Format a phone number to SIP URI format\n * Handles Nigerian numbers, international format, and local extensions\n */\nexport function formatPhoneToSIP(phone: string, sipDomain: string): string {\n // Strip all non-numeric characters\n let cleaned = phone.replace(/\\D/g, '');\n\n // Case 1: Short local extension (like \"101\", \"102\", etc.)\n if (cleaned.length <= 4) {\n return `sip:${cleaned}@${sipDomain}`;\n }\n\n // Case 2: Nigerian number starting with 0 (like \"08012345678\")\n if (cleaned.startsWith('0')) {\n cleaned = '234' + cleaned.substring(1);\n return `sip:${cleaned}@${sipDomain}`;\n }\n\n // Case 3: Already in international format (starts with 234)\n if (cleaned.startsWith('234')) {\n return `sip:${cleaned}@${sipDomain}`;\n }\n\n // Case 4: Any other number - assume it needs 234 prefix\n cleaned = '234' + cleaned;\n return `sip:${cleaned}@${sipDomain}`;\n}\n\n/**\n * Normalize a phone number to E.164 format\n */\nexport function normalizePhoneNumber(\n phone: string,\n countryCode: string = '234'\n): string {\n let cleaned = phone.replace(/\\D/g, '');\n\n // If it's a short extension, return as-is\n if (cleaned.length <= 4) {\n return cleaned;\n }\n\n // Remove leading 0 and add country code\n if (cleaned.startsWith('0')) {\n return countryCode + cleaned.substring(1);\n }\n\n // If already has country code, return as-is\n if (cleaned.startsWith(countryCode)) {\n return cleaned;\n }\n\n // Otherwise add country code\n return countryCode + cleaned;\n}\n\n/**\n * Extract extension/number from SIP URI\n */\nexport function extractNumberFromSipUri(sipUri: string): string {\n const match = sipUri.match(/sip:([^@]+)@/);\n return match ? match[1] : sipUri;\n}\n\n/**\n * Validate phone number format\n */\nexport function isValidPhoneNumber(phone: string, minLength: number = 3): boolean {\n const cleaned = phone.replace(/\\D/g, '');\n return cleaned.length >= minLength;\n}\n","/**\n * Call Manager - Handles individual call sessions\n * Extracted and refactored from JsSIPProvider.tsx\n */\n\nimport type {\n Call,\n CallStatus,\n CallDirection,\n CallOptions,\n SipCredentials,\n} from '../types';\nimport { CallError } from '../types';\nimport { formatPhoneToSIP } from '../utils/phoneFormatter';\nimport EventEmitter from 'eventemitter3';\n\nexport interface CallConfig {\n pcConfig: RTCConfiguration;\n mediaConstraints?: MediaStreamConstraints;\n}\n\nexport class CallSession implements Call {\n public id: string;\n public status: CallStatus = 'idle';\n public direction: CallDirection;\n public remoteNumber: string;\n public localExtension: string;\n public duration: number = 0;\n public startTime?: number;\n public endTime?: number;\n\n private session: any; // JsSIP RTCSession\n private _isMuted: boolean = false;\n private remoteStreamValue: MediaStream | null = null;\n private durationInterval?: number;\n private events: EventEmitter;\n\n constructor(\n session: any,\n direction: CallDirection,\n remoteNumber: string,\n localExtension: string,\n events: EventEmitter\n ) {\n this.id = this.generateCallId();\n this.session = session;\n this.direction = direction;\n this.remoteNumber = remoteNumber;\n this.localExtension = localExtension;\n this.events = events;\n\n this.setupSessionHandlers();\n }\n\n private generateCallId(): string {\n return `call_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n }\n\n private setupSessionHandlers(): void {\n // Progress event (ringing)\n this.session.on('progress', (evt: any) => {\n const code = evt.response?.status_code;\n if (code === 180 || code === 183) {\n this.status = 'ringing';\n this.events.emit('call:ringing', this);\n }\n });\n\n // Call confirmed (connected)\n this.session.on('confirmed', () => {\n this.status = 'ongoing';\n this.startTime = Date.now();\n this.startDurationTimer();\n this.events.emit('call:connected', this);\n });\n\n // Peer connection setup\n this.session.on('peerconnection', (evt: any) => {\n evt.peerconnection.ontrack = (event: any) => {\n if (event.streams && event.streams[0]) {\n this.remoteStreamValue = event.streams[0];\n }\n };\n });\n\n // Call ended\n this.session.on('ended', (evt: any) => {\n this.handleCallEnd(evt?.cause);\n });\n\n // Call failed\n this.session.on('failed', (evt: any) => {\n this.handleCallEnd(evt?.cause || 'Call failed');\n });\n\n // Call rejected\n this.session.on('rejected', (evt: any) => {\n this.handleCallEnd(evt?.cause || 'Call rejected');\n });\n }\n\n private handleCallEnd(reason?: string): void {\n this.status = 'ended';\n this.endTime = Date.now();\n this.stopDurationTimer();\n this.remoteStreamValue = null;\n this._isMuted = false;\n this.events.emit('call:ended', this, reason);\n }\n\n private startDurationTimer(): void {\n this.durationInterval = window.setInterval(() => {\n if (this.startTime) {\n this.duration = Math.floor((Date.now() - this.startTime) / 1000);\n }\n }, 1000);\n }\n\n private stopDurationTimer(): void {\n if (this.durationInterval) {\n clearInterval(this.durationInterval);\n this.durationInterval = undefined;\n }\n }\n\n // Public methods\n mute(): void {\n if (this.session && !this._isMuted) {\n this.session.mute({ audio: true });\n this._isMuted = true;\n }\n }\n\n unmute(): void {\n if (this.session && this._isMuted) {\n this.session.unmute({ audio: true });\n this._isMuted = false;\n }\n }\n\n hangup(): void {\n if (this.session) {\n this.session.terminate();\n }\n }\n\n isMuted(): boolean {\n return this._isMuted;\n }\n\n getRemoteStream(): MediaStream | null {\n return this.remoteStreamValue;\n }\n\n getFormattedDuration(): string {\n const mm = String(Math.floor(this.duration / 60)).padStart(2, '0');\n const ss = String(this.duration % 60).padStart(2, '0');\n return `${mm}:${ss}`;\n }\n\n destroy(): void {\n this.stopDurationTimer();\n this.session = null;\n this.remoteStreamValue = null;\n }\n}\n\n/**\n * Call Manager - Manages call sessions and JsSIP integration\n */\nexport class CallManager {\n private ua: any | null = null; // JsSIP User Agent\n private currentCall: CallSession | null = null;\n private credentials: SipCredentials;\n private events: EventEmitter;\n private callConfig: CallConfig;\n\n constructor(\n credentials: SipCredentials,\n events: EventEmitter,\n callConfig: CallConfig\n ) {\n this.credentials = credentials;\n this.events = events;\n this.callConfig = callConfig;\n }\n\n setUserAgent(ua: any): void {\n this.ua = ua;\n }\n\n /**\n * Initiate an outbound call\n */\n async initiateCall(\n targetNumber: string,\n options?: CallOptions\n ): Promise<CallSession> {\n if (!this.ua) {\n throw new CallError('User Agent not initialized');\n }\n\n if (this.currentCall && this.currentCall.status !== 'ended') {\n throw new CallError('A call is already in progress');\n }\n\n try {\n // Request microphone permission\n await navigator.mediaDevices.getUserMedia({ audio: true });\n\n // Determine which extension to use\n const extension = options?.extension || this.getDefaultExtension();\n\n // Format the target number to SIP URI\n const sipDomain = this.extractDomain(this.credentials.sipUri);\n const sipTarget = formatPhoneToSIP(targetNumber, sipDomain);\n\n // Initiate the call\n const session = this.ua.call(sipTarget, {\n mediaConstraints: options?.mediaConstraints || { audio: true },\n pcConfig: this.callConfig.pcConfig,\n });\n\n // Create call session\n const call = new CallSession(\n session,\n 'outbound',\n targetNumber,\n extension,\n this.events\n );\n\n call.status = 'connecting';\n this.currentCall = call;\n this.events.emit('call:outgoing', call);\n\n return call;\n } catch (error) {\n throw new CallError(\n `Failed to initiate call: ${error instanceof Error ? error.message : 'Unknown error'}`,\n { originalError: error }\n );\n }\n }\n\n /**\n * Answer an incoming call\n */\n answerCall(session: any): CallSession {\n if (!session) {\n throw new CallError('No session provided');\n }\n\n try {\n const remoteUri = session.remote_identity?.uri?.toString() || 'Unknown';\n const extension = this.getDefaultExtension();\n\n session.answer({\n mediaConstraints: { audio: true },\n pcConfig: this.callConfig.pcConfig,\n });\n\n const call = new CallSession(\n session,\n 'inbound',\n remoteUri,\n extension,\n this.events\n );\n\n this.currentCall = call;\n return call;\n } catch (error) {\n throw new CallError(\n `Failed to answer call: ${error instanceof Error ? error.message : 'Unknown error'}`,\n { originalError: error }\n );\n }\n }\n\n /**\n * Handle incoming call from JsSIP\n */\n handleIncomingCall(session: any): CallSession {\n const remoteUri = session.remote_identity?.uri?.toString() || 'Unknown';\n const extension = this.getDefaultExtension();\n\n const call = new CallSession(\n session,\n 'inbound',\n remoteUri,\n extension,\n this.events\n );\n\n call.status = 'ringing';\n this.currentCall = call;\n this.events.emit('call:incoming', call);\n\n return call;\n }\n\n getCurrentCall(): CallSession | null {\n return this.currentCall;\n }\n\n clearCurrentCall(): void {\n if (this.currentCall) {\n this.currentCall.destroy();\n this.currentCall = null;\n }\n }\n\n private getDefaultExtension(): string {\n // Auto-select first extension if available\n if (this.credentials.extensions && this.credentials.extensions.length > 0) {\n return this.credentials.extensions[0].extension;\n }\n // Fallback to extracting from sipUri\n return this.extractExtension(this.credentials.sipUri);\n }\n\n private extractExtension(sipUri: string): string {\n const match = sipUri.match(/sip:([^@]+)@/);\n return match ? match[1] : 'unknown';\n }\n\n private extractDomain(sipUri: string): string {\n const match = sipUri.match(/@(.+)$/);\n return match ? match[1] : '';\n }\n\n destroy(): void {\n this.clearCurrentCall();\n this.ua = null;\n }\n}\n","/**\n * Dora Cell SDK - Main entry point\n * Framework-agnostic VoIP calling SDK using JsSIP\n */\n\nimport JsSIP from 'jssip';\nimport EventEmitter from 'eventemitter3';\nimport type {\n DoraCellConfig,\n DoraCellEventMap,\n DoraCellEvent,\n ConnectionStatus,\n ConnectionState,\n Call,\n CallOptions,\n SipCredentials,\n} from '../types';\nimport { ConnectionError, CallError } from '../types';\nimport { createAuthProvider, AuthProvider } from './AuthProvider';\nimport { CallManager } from './CallManager';\n\nexport class DoraCell {\n private config: DoraCellConfig;\n private events: EventEmitter;\n private authProvider: AuthProvider;\n private credentials: SipCredentials | null = null;\n private ua: any | null = null; // JsSIP User Agent\n private callManager: CallManager | null = null;\n private connectionStatus: ConnectionStatus = 'disconnected';\n private retryCount: number = 0;\n private maxRetries: number = 3;\n\n constructor(config: DoraCellConfig) {\n this.config = {\n autoSelectExtension: true,\n debug: false,\n ...config,\n };\n\n this.events = new EventEmitter();\n this.authProvider = createAuthProvider(config.auth);\n\n // Enable JsSIP debugging if requested\n if (this.config.debug) {\n JsSIP.debug.enable('JsSIP:*');\n }\n }\n\n /**\n * Initialize the SDK - authenticate and connect to SIP server\n */\n async initialize(): Promise<void> {\n try {\n // Step 1: Authenticate and get SIP credentials\n this.credentials = await this.authProvider.authenticate(this.config.auth);\n\n // Step 2: Initialize JsSIP User Agent\n await this.initializeUserAgent();\n\n // Step 3: Initialize Call Manager\n this.initializeCallManager();\n\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n this.emitError(new ConnectionError(`Initialization failed: ${errorMessage}`));\n throw error;\n }\n }\n\n private async initializeUserAgent(): Promise<void> {\n if (!this.credentials) {\n throw new ConnectionError('No credentials available');\n }\n\n try {\n // Create WebSocket connection\n const socket = new JsSIP.WebSocketInterface(this.credentials.wsUrl);\n\n // Build TURN/STUN configuration\n const pcConfig: RTCConfiguration = {\n iceServers: this.config.turnServers || this.getDefaultTurnServers(),\n };\n\n // Create User Agent configuration\n const uaConfig: any = {\n uri: this.credentials.sipUri,\n password: this.credentials.password,\n sockets: [socket],\n register: true,\n display_name: this.getDisplayName(),\n session_timers: false,\n use_preloaded_route: false,\n pcConfig: pcConfig,\n instance_id: this.generateInstanceId(),\n };\n\n // Create User Agent\n this.ua = new JsSIP.UA(uaConfig);\n\n // Set up UA event handlers\n this.setupUserAgentHandlers();\n\n // Start the UA\n this.ua.start();\n\n } catch (error) {\n throw new ConnectionError(\n `Failed to initialize User Agent: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n }\n }\n\n private setupUserAgentHandlers(): void {\n if (!this.ua) return;\n\n this.ua.on('connected', () => {\n this.connectionStatus = 'connected';\n this.emitConnectionStatus();\n });\n\n this.ua.on('disconnected', () => {\n this.connectionStatus = 'disconnected';\n this.emitConnectionStatus();\n });\n\n this.ua.on('registered', () => {\n this.connectionStatus = 'registered';\n this.retryCount = 0;\n this.emitConnectionStatus();\n });\n\n this.ua.on('registrationFailed', (e: any) => {\n this.connectionStatus = 'registrationFailed';\n this.emitConnectionStatus(e.cause);\n\n // Retry logic\n if (this.retryCount < this.maxRetries) {\n this.retryCount++;\n setTimeout(() => {\n this.ua?.register();\n }, 3000);\n }\n });\n\n this.ua.on('newRTCSession', (e: any) => {\n const session = e.session;\n\n if (session.direction === 'incoming') {\n // Handle incoming call\n this.callManager?.handleIncomingCall(session);\n }\n });\n }\n\n private initializeCallManager(): void {\n if (!this.credentials) {\n throw new ConnectionError('No credentials available for call manager');\n }\n\n const pcConfig: RTCConfiguration = {\n iceServers: this.config.turnServers || this.getDefaultTurnServers(),\n };\n\n this.callManager = new CallManager(\n this.credentials,\n this.events,\n { pcConfig }\n );\n\n this.callManager.setUserAgent(this.ua);\n }\n\n /**\n * Make an outbound call\n */\n async call(phoneNumber: string, options?: CallOptions): Promise<Call> {\n if (!this.callManager) {\n throw new CallError('SDK not initialized. Call initialize() first.');\n }\n\n if (this.connectionStatus !== 'registered') {\n throw new CallError('Not registered to SIP server');\n }\n\n return this.callManager.initiateCall(phoneNumber, options);\n }\n\n /**\n * Answer an incoming call\n */\n answerCall(): void {\n const currentCall = this.callManager?.getCurrentCall();\n\n if (!currentCall) {\n throw new CallError('No incoming call to answer');\n }\n\n if (currentCall.direction !== 'inbound') {\n throw new CallError('Current call is not an incoming call');\n }\n\n // The CallSession will handle answering via its internal session\n // This is already set up in CallManager.handleIncomingCall\n }\n\n /**\n * Hangup the current call\n */\n hangup(): void {\n const currentCall = this.callManager?.getCurrentCall();\n\n if (!currentCall) {\n throw new CallError('No active call to hang up');\n }\n\n currentCall.hangup();\n }\n\n /**\n * Get current call\n */\n getCurrentCall(): Call | null {\n return this.callManager?.getCurrentCall() || null;\n }\n\n /**\n * Get connection status\n */\n getStatus(): ConnectionStatus {\n return this.connectionStatus;\n }\n\n /**\n * Get available extensions\n */\n getExtensions(): string[] {\n if (!this.credentials?.extensions) {\n return [];\n }\n return this.credentials.extensions.map(ext => ext.extension);\n }\n\n /**\n * Event listener management\n */\n on<K extends DoraCellEvent>(event: K, handler: DoraCellEventMap[K]): void {\n this.events.on(event, handler as any);\n }\n\n off<K extends DoraCellEvent>(event: K, handler: DoraCellEventMap[K]): void {\n this.events.off(event, handler as any);\n }\n\n once<K extends DoraCellEvent>(event: K, handler: DoraCellEventMap[K]): void {\n this.events.once(event, handler as any);\n }\n\n /**\n * Cleanup and destroy the SDK instance\n */\n destroy(): void {\n if (this.ua) {\n this.ua.stop();\n this.ua = null;\n }\n\n if (this.callManager) {\n this.callManager.destroy();\n this.callManager = null;\n }\n\n this.events.removeAllListeners();\n this.connectionStatus = 'disconnected';\n this.credentials = null;\n }\n\n // Helper methods\n private emitConnectionStatus(error?: string): void {\n const state: ConnectionState = {\n status: this.connectionStatus,\n extension: this.credentials?.extensions?.[0]?.extension,\n error,\n };\n this.events.emit('connection:status', state);\n }\n\n private emitError(error: Error): void {\n this.events.emit('error', error);\n }\n\n private getDefaultTurnServers(): RTCIceServer[] {\n const turnUri = process.env.NEXT_PUBLIC_TURN_URI || 'turn:64.227.10.164:3478';\n const turnUser = process.env.NEXT_PUBLIC_TURN_USER || '02018890089';\n const turnPass = process.env.NEXT_PUBLIC_TURN_PASS || 'dora12345';\n\n return [\n {\n urls: turnUri,\n username: turnUser,\n credential: turnPass,\n },\n ];\n }\n\n private getDisplayName(): string {\n if (this.credentials?.extensions?.[0]?.displayName) {\n return this.credentials.extensions[0].displayName;\n }\n if (this.credentials?.extensions?.[0]?.extension) {\n return `Ext ${this.credentials.extensions[0].extension}`;\n }\n return 'Dora Cell User';\n }\n\n private generateInstanceId(): string {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n}\n\nexport default DoraCell;\n"]}
1
+ {"version":3,"sources":["../src/types/index.ts","../src/core/AuthProvider.ts","../src/utils/phoneFormatter.ts","../src/core/CallManager.ts","../src/core/DoraCell.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Core TypeScript type definitions for Dora Cell SDK\n */\n\n// ============================================\n// Configuration Types\n// ============================================\n\nexport interface ApiTokenAuth {\n type: 'api-token';\n apiToken: string;\n apiBaseUrl?: string;\n}\n\nexport interface DirectCredentialsAuth {\n type: 'direct';\n sipUri: string;\n password: string;\n wsUrl: string;\n}\n\nexport interface ExtensionAuth {\n type: 'extension';\n extension: string;\n // Optional overrides for advanced cases\n password?: string;\n sipDomain?: string;\n}\n\nexport type AuthConfig = ApiTokenAuth | DirectCredentialsAuth | ExtensionAuth;\n\nexport interface DoraCellConfig {\n auth: AuthConfig;\n sipServer?: string;\n turnServers?: RTCIceServer[];\n debug?: boolean;\n autoSelectExtension?: boolean; // Auto-select first available extension\n}\n\n// ============================================\n// SIP Credentials\n// ============================================\n\nexport interface SipCredentials {\n wsUrl: string;\n sipUri: string;\n password: string;\n sipDomain?: string;\n extensions?: Extension[];\n expiresIn?: number;\n}\n\nexport interface Extension {\n extension: string;\n displayName?: string;\n isPrimary?: boolean;\n}\n\n// ============================================\n// Call Types\n// ============================================\n\nexport type CallStatus = 'idle' | 'connecting' | 'ringing' | 'ongoing' | 'ended';\n\nexport type CallDirection = 'inbound' | 'outbound';\n\nexport interface CallOptions {\n extension?: string; // Specific extension to use for this call\n mediaConstraints?: MediaStreamConstraints;\n}\n\nexport interface Call {\n id: string;\n status: CallStatus;\n direction: CallDirection;\n remoteNumber: string;\n localExtension: string;\n duration: number;\n startTime?: number;\n endTime?: number;\n\n // Methods\n mute(): void;\n unmute(): void;\n hangup(): void;\n isMuted(): boolean;\n}\n\n// ============================================\n// Connection Status\n// ============================================\n\nexport type ConnectionStatus =\n | 'disconnected'\n | 'connecting'\n | 'connected'\n | 'registered'\n | 'registrationFailed';\n\nexport interface ConnectionState {\n status: ConnectionStatus;\n extension?: string;\n error?: string;\n}\n\n// ============================================\n// Events\n// ============================================\n\nexport type DoraCellEventMap = {\n 'connection:status': (state: ConnectionState) => void;\n 'call:incoming': (call: Call) => void;\n 'call:outgoing': (call: Call) => void;\n 'call:ringing': (call: Call) => void;\n 'call:connected': (call: Call) => void;\n 'call:ended': (call: Call, reason?: string) => void;\n 'call:failed': (call: Call, error: string) => void;\n 'error': (error: Error) => void;\n};\n\nexport type DoraCellEvent = keyof DoraCellEventMap;\n\n// ============================================\n// API Response Types\n// ============================================\n\nexport interface ApiTokenResponse {\n ws_url?: string;\n wsUrl?: string;\n sip_uri?: string;\n sipUri?: string;\n password?: string;\n sip_domain?: string;\n sipDomain?: string;\n extensions?: Extension[];\n expires_in?: number;\n expiresIn?: number;\n}\n\n// ============================================\n// Error Types\n// ============================================\n\nexport class DoraCellError extends Error {\n constructor(\n message: string,\n public code?: string,\n public details?: any\n ) {\n super(message);\n this.name = 'DoraCellError';\n }\n}\n\nexport class AuthenticationError extends DoraCellError {\n constructor(message: string, details?: any) {\n super(message, 'AUTH_ERROR', details);\n this.name = 'AuthenticationError';\n }\n}\n\nexport class CallError extends DoraCellError {\n constructor(message: string, details?: any) {\n super(message, 'CALL_ERROR', details);\n this.name = 'CallError';\n }\n}\n\nexport class ConnectionError extends DoraCellError {\n constructor(message: string, details?: any) {\n super(message, 'CONNECTION_ERROR', details);\n this.name = 'ConnectionError';\n }\n}\n","/**\n * Authentication provider for API token-based authentication\n */\n\nimport type {\n AuthConfig,\n SipCredentials,\n ApiTokenResponse,\n Extension,\n} from '../types';\nimport { AuthenticationError } from '../types';\n\nexport interface AuthProvider {\n authenticate(config: AuthConfig): Promise<SipCredentials>;\n refreshCredentials?(): Promise<SipCredentials>;\n isAuthenticated(): boolean;\n}\n\n/**\n * API Token Authentication Provider\n * Exchanges API token for SIP credentials via backend API\n */\nexport class ApiTokenAuthProvider implements AuthProvider {\n private credentials: SipCredentials | null = null;\n private apiToken: string;\n private apiBaseUrl: string;\n\n constructor(apiToken: string, apiBaseUrl?: string) {\n this.apiToken = apiToken;\n let defaultBaseUrl = '';\n if (typeof process !== 'undefined' && process.env) {\n defaultBaseUrl = process.env.NEXT_PUBLIC_BASE_API_URL || '';\n }\n this.apiBaseUrl = apiBaseUrl || defaultBaseUrl;\n }\n\n async authenticate(config: AuthConfig): Promise<SipCredentials> {\n if (config.type !== 'api-token') {\n throw new AuthenticationError('Invalid auth config type for ApiTokenAuthProvider');\n }\n\n try {\n const response = await fetch(`${this.apiBaseUrl}/api/sip-credentials`, {\n method: 'GET',\n headers: {\n 'Authorization': `Bearer ${this.apiToken}`,\n 'Content-Type': 'application/json',\n 'Accept': 'application/json',\n },\n credentials: 'include',\n });\n\n if (!response.ok) {\n if (response.status === 401 || response.status === 403) {\n throw new AuthenticationError(\n 'Invalid API token or insufficient permissions',\n { status: response.status }\n );\n }\n throw new AuthenticationError(\n `Failed to fetch SIP credentials: ${response.status}`,\n { status: response.status }\n );\n }\n\n const data: ApiTokenResponse = await response.json();\n this.credentials = this.parseCredentials(data);\n return this.credentials;\n } catch (error) {\n if (error instanceof AuthenticationError) {\n throw error;\n }\n throw new AuthenticationError(\n `Authentication failed: ${error instanceof Error ? error.message : 'Unknown error'}`,\n { originalError: error }\n );\n }\n }\n\n async refreshCredentials(): Promise<SipCredentials> {\n // Re-authenticate to get fresh credentials\n return this.authenticate({ type: 'api-token', apiToken: this.apiToken });\n }\n\n isAuthenticated(): boolean {\n return this.credentials !== null;\n }\n\n private parseCredentials(data: ApiTokenResponse): SipCredentials {\n const wsUrl = data.ws_url || data.wsUrl;\n const sipUri = data.sip_uri || data.sipUri;\n const password = data.password;\n const sipDomain = data.sip_domain || data.sipDomain;\n const extensions = data.extensions;\n const expiresIn = data.expires_in || data.expiresIn;\n\n if (!wsUrl || !sipUri) {\n throw new AuthenticationError(\n 'Invalid credentials response: missing ws_url or sip_uri'\n );\n }\n\n return {\n wsUrl,\n sipUri,\n password: password || '',\n sipDomain,\n extensions,\n expiresIn,\n };\n }\n}\n\n/**\n * Direct Credentials Authentication Provider\n * Uses credentials provided directly in configuration\n */\nexport class DirectCredentialsAuthProvider implements AuthProvider {\n private credentials: SipCredentials | null = null;\n\n async authenticate(config: AuthConfig): Promise<SipCredentials> {\n if (config.type !== 'direct') {\n throw new AuthenticationError('Invalid auth config type for DirectCredentialsAuthProvider');\n }\n\n this.credentials = {\n wsUrl: config.wsUrl,\n sipUri: config.sipUri,\n password: config.password,\n };\n\n return this.credentials;\n }\n\n isAuthenticated(): boolean {\n return this.credentials !== null;\n }\n}\n\n/**\n * Extension Authentication Provider\n * Simplified plug-and-play authentication using just an extension number.\n * Uses default Dora Cell infrastructure configuration.\n */\nconst DEFAULT_WSS_URL = 'wss://cell.usedora.com:8089';\nconst DEFAULT_SIP_IP = '64.227.10.164';\nconst DEFAULT_PASSWORD = '1234';\n\nexport class ExtensionAuthProvider implements AuthProvider {\n private credentials: SipCredentials | null = null;\n\n async authenticate(config: AuthConfig): Promise<SipCredentials> {\n if (config.type !== 'extension') {\n throw new AuthenticationError('Invalid auth config type for ExtensionAuthProvider');\n }\n\n const extension = config.extension;\n const password = config.password || DEFAULT_PASSWORD;\n const wsUrl = DEFAULT_WSS_URL;\n const sipDomain = config.sipDomain || DEFAULT_SIP_IP;\n\n const sipUri = `sip:${extension}@${sipDomain}`;\n\n this.credentials = {\n wsUrl,\n sipUri,\n password,\n sipDomain,\n extensions: [{ extension, displayName: `Ext ${extension}`, isPrimary: true }]\n };\n\n return this.credentials;\n }\n\n isAuthenticated(): boolean {\n return this.credentials !== null;\n }\n}\n\n/**\n * Factory function to create appropriate auth provider\n */\nexport function createAuthProvider(config: AuthConfig): AuthProvider {\n switch (config.type) {\n case 'api-token':\n return new ApiTokenAuthProvider(config.apiToken, config.apiBaseUrl);\n case 'direct':\n return new DirectCredentialsAuthProvider();\n case 'extension':\n return new ExtensionAuthProvider();\n default:\n throw new AuthenticationError('Unknown authentication type');\n }\n}\n","/**\n * Phone number formatting utilities\n * Extracted from JsSIPProvider.tsx\n */\n\n/**\n * Format a phone number to SIP URI format\n * Handles Nigerian numbers, international format, and local extensions\n */\nexport function formatPhoneToSIP(phone: string, sipDomain: string): string {\n // Strip all non-numeric characters\n let cleaned = phone.replace(/\\D/g, '');\n\n // Case 1: Short local extension (like \"101\", \"102\", etc.)\n if (cleaned.length <= 4) {\n return `sip:${cleaned}@${sipDomain}`;\n }\n\n // Case 2: Nigerian number starting with 0 (like \"08012345678\")\n if (cleaned.startsWith('0')) {\n cleaned = '234' + cleaned.substring(1);\n return `sip:${cleaned}@${sipDomain}`;\n }\n\n // Case 3: Already in international format (starts with 234)\n if (cleaned.startsWith('234')) {\n return `sip:${cleaned}@${sipDomain}`;\n }\n\n // Case 4: Any other number - assume it needs 234 prefix\n cleaned = '234' + cleaned;\n return `sip:${cleaned}@${sipDomain}`;\n}\n\n/**\n * Normalize a phone number to E.164 format\n */\nexport function normalizePhoneNumber(\n phone: string,\n countryCode: string = '234'\n): string {\n let cleaned = phone.replace(/\\D/g, '');\n\n // If it's a short extension, return as-is\n if (cleaned.length <= 4) {\n return cleaned;\n }\n\n // Remove leading 0 and add country code\n if (cleaned.startsWith('0')) {\n return countryCode + cleaned.substring(1);\n }\n\n // If already has country code, return as-is\n if (cleaned.startsWith(countryCode)) {\n return cleaned;\n }\n\n // Otherwise add country code\n return countryCode + cleaned;\n}\n\n/**\n * Extract extension/number from SIP URI\n */\nexport function extractNumberFromSipUri(sipUri: string): string {\n const match = sipUri.match(/sip:([^@]+)@/);\n return match ? match[1] : sipUri;\n}\n\n/**\n * Validate phone number format\n */\nexport function isValidPhoneNumber(phone: string, minLength: number = 3): boolean {\n const cleaned = phone.replace(/\\D/g, '');\n return cleaned.length >= minLength;\n}\n","/**\n * Call Manager - Handles individual call sessions\n * Extracted and refactored from JsSIPProvider.tsx\n */\n\nimport type {\n Call,\n CallStatus,\n CallDirection,\n CallOptions,\n SipCredentials,\n} from '../types';\nimport { CallError } from '../types';\nimport { formatPhoneToSIP } from '../utils/phoneFormatter';\nimport EventEmitter from 'eventemitter3';\n\nexport interface CallConfig {\n pcConfig: RTCConfiguration;\n mediaConstraints?: MediaStreamConstraints;\n}\n\nexport class CallSession implements Call {\n public id: string;\n public status: CallStatus = 'idle';\n public direction: CallDirection;\n public remoteNumber: string;\n public localExtension: string;\n public duration: number = 0;\n public startTime?: number;\n public endTime?: number;\n\n private session: any; // JsSIP RTCSession\n private _isMuted: boolean = false;\n private remoteStreamValue: MediaStream | null = null;\n private durationInterval?: number;\n private events: EventEmitter;\n\n constructor(\n session: any,\n direction: CallDirection,\n remoteNumber: string,\n localExtension: string,\n events: EventEmitter\n ) {\n this.id = this.generateCallId();\n this.session = session;\n this.direction = direction;\n this.remoteNumber = remoteNumber;\n this.localExtension = localExtension;\n this.events = events;\n\n this.setupSessionHandlers();\n }\n\n private generateCallId(): string {\n return `call_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n }\n\n private setupSessionHandlers(): void {\n // Progress event (ringing)\n this.session.on('progress', (evt: any) => {\n const code = evt.response?.status_code;\n if (code === 180 || code === 183) {\n this.status = 'ringing';\n this.events.emit('call:ringing', this);\n }\n });\n\n // Call confirmed (connected)\n this.session.on('confirmed', () => {\n this.status = 'ongoing';\n this.startTime = Date.now();\n this.startDurationTimer();\n this.events.emit('call:connected', this);\n });\n\n // Peer connection setup\n this.session.on('peerconnection', (evt: any) => {\n evt.peerconnection.ontrack = (event: any) => {\n if (event.streams && event.streams[0]) {\n this.remoteStreamValue = event.streams[0];\n }\n };\n });\n\n // Call ended\n this.session.on('ended', (evt: any) => {\n this.handleCallEnd(evt?.cause);\n });\n\n // Call failed\n this.session.on('failed', (evt: any) => {\n this.handleCallEnd(evt?.cause || 'Call failed');\n });\n\n // Call rejected\n this.session.on('rejected', (evt: any) => {\n this.handleCallEnd(evt?.cause || 'Call rejected');\n });\n }\n\n private handleCallEnd(reason?: string): void {\n this.status = 'ended';\n this.endTime = Date.now();\n this.stopDurationTimer();\n this.remoteStreamValue = null;\n this._isMuted = false;\n this.events.emit('call:ended', this, reason);\n }\n\n private startDurationTimer(): void {\n this.durationInterval = window.setInterval(() => {\n if (this.startTime) {\n this.duration = Math.floor((Date.now() - this.startTime) / 1000);\n }\n }, 1000);\n }\n\n private stopDurationTimer(): void {\n if (this.durationInterval) {\n clearInterval(this.durationInterval);\n this.durationInterval = undefined;\n }\n }\n\n // Public methods\n mute(): void {\n if (this.session && !this._isMuted) {\n this.session.mute({ audio: true });\n this._isMuted = true;\n }\n }\n\n unmute(): void {\n if (this.session && this._isMuted) {\n this.session.unmute({ audio: true });\n this._isMuted = false;\n }\n }\n\n hangup(): void {\n if (this.session) {\n this.session.terminate();\n }\n }\n\n isMuted(): boolean {\n return this._isMuted;\n }\n\n getRemoteStream(): MediaStream | null {\n return this.remoteStreamValue;\n }\n\n getFormattedDuration(): string {\n const mm = String(Math.floor(this.duration / 60)).padStart(2, '0');\n const ss = String(this.duration % 60).padStart(2, '0');\n return `${mm}:${ss}`;\n }\n\n destroy(): void {\n this.stopDurationTimer();\n this.session = null;\n this.remoteStreamValue = null;\n }\n}\n\n/**\n * Call Manager - Manages call sessions and JsSIP integration\n */\nexport class CallManager {\n private ua: any | null = null; // JsSIP User Agent\n private currentCall: CallSession | null = null;\n private credentials: SipCredentials;\n private events: EventEmitter;\n private callConfig: CallConfig;\n\n constructor(\n credentials: SipCredentials,\n events: EventEmitter,\n callConfig: CallConfig\n ) {\n this.credentials = credentials;\n this.events = events;\n this.callConfig = callConfig;\n }\n\n setUserAgent(ua: any): void {\n this.ua = ua;\n }\n\n /**\n * Initiate an outbound call\n */\n async initiateCall(\n targetNumber: string,\n options?: CallOptions\n ): Promise<CallSession> {\n if (!this.ua) {\n throw new CallError('User Agent not initialized');\n }\n\n if (this.currentCall && this.currentCall.status !== 'ended') {\n throw new CallError('A call is already in progress');\n }\n\n try {\n // Request microphone permission\n await navigator.mediaDevices.getUserMedia({ audio: true });\n\n // Determine which extension to use\n const extension = options?.extension || this.getDefaultExtension();\n\n // Format the target number to SIP URI\n const sipDomain = this.extractDomain(this.credentials.sipUri);\n const sipTarget = formatPhoneToSIP(targetNumber, sipDomain);\n\n // Initiate the call\n const session = this.ua.call(sipTarget, {\n mediaConstraints: options?.mediaConstraints || { audio: true },\n pcConfig: this.callConfig.pcConfig,\n });\n\n // Create call session\n const call = new CallSession(\n session,\n 'outbound',\n targetNumber,\n extension,\n this.events\n );\n\n call.status = 'connecting';\n this.currentCall = call;\n this.events.emit('call:outgoing', call);\n\n return call;\n } catch (error) {\n throw new CallError(\n `Failed to initiate call: ${error instanceof Error ? error.message : 'Unknown error'}`,\n { originalError: error }\n );\n }\n }\n\n /**\n * Answer an incoming call\n */\n answerCall(session: any): CallSession {\n if (!session) {\n throw new CallError('No session provided');\n }\n\n try {\n const remoteUri = session.remote_identity?.uri?.toString() || 'Unknown';\n const extension = this.getDefaultExtension();\n\n session.answer({\n mediaConstraints: { audio: true },\n pcConfig: this.callConfig.pcConfig,\n });\n\n const call = new CallSession(\n session,\n 'inbound',\n remoteUri,\n extension,\n this.events\n );\n\n this.currentCall = call;\n return call;\n } catch (error) {\n throw new CallError(\n `Failed to answer call: ${error instanceof Error ? error.message : 'Unknown error'}`,\n { originalError: error }\n );\n }\n }\n\n /**\n * Handle incoming call from JsSIP\n */\n handleIncomingCall(session: any): CallSession {\n const remoteUri = session.remote_identity?.uri?.toString() || 'Unknown';\n const extension = this.getDefaultExtension();\n\n const call = new CallSession(\n session,\n 'inbound',\n remoteUri,\n extension,\n this.events\n );\n\n call.status = 'ringing';\n this.currentCall = call;\n this.events.emit('call:incoming', call);\n\n return call;\n }\n\n getCurrentCall(): CallSession | null {\n return this.currentCall;\n }\n\n clearCurrentCall(): void {\n if (this.currentCall) {\n this.currentCall.destroy();\n this.currentCall = null;\n }\n }\n\n private getDefaultExtension(): string {\n // Auto-select first extension if available\n if (this.credentials.extensions && this.credentials.extensions.length > 0) {\n return this.credentials.extensions[0].extension;\n }\n // Fallback to extracting from sipUri\n return this.extractExtension(this.credentials.sipUri);\n }\n\n private extractExtension(sipUri: string): string {\n const match = sipUri.match(/sip:([^@]+)@/);\n return match ? match[1] : 'unknown';\n }\n\n private extractDomain(sipUri: string): string {\n const match = sipUri.match(/@(.+)$/);\n return match ? match[1] : '';\n }\n\n destroy(): void {\n this.clearCurrentCall();\n this.ua = null;\n }\n}\n","/**\n * Dora Cell SDK - Main entry point\n * Framework-agnostic VoIP calling SDK using JsSIP\n */\n\nimport JsSIP from 'jssip';\nimport EventEmitter from 'eventemitter3';\nimport type {\n DoraCellConfig,\n DoraCellEventMap,\n DoraCellEvent,\n ConnectionStatus,\n ConnectionState,\n Call,\n CallOptions,\n SipCredentials,\n} from '../types';\nimport { ConnectionError, CallError } from '../types';\nimport { createAuthProvider, AuthProvider } from './AuthProvider';\nimport { CallManager } from './CallManager';\n\nexport class DoraCell {\n private config: DoraCellConfig;\n private events: EventEmitter;\n private authProvider: AuthProvider;\n private credentials: SipCredentials | null = null;\n private ua: any | null = null; // JsSIP User Agent\n private callManager: CallManager | null = null;\n private connectionStatus: ConnectionStatus = 'disconnected';\n private retryCount: number = 0;\n private maxRetries: number = 3;\n\n constructor(config: DoraCellConfig) {\n this.config = {\n autoSelectExtension: true,\n debug: false,\n ...config,\n };\n\n this.events = new EventEmitter();\n this.authProvider = createAuthProvider(config.auth);\n\n // Enable JsSIP debugging if requested\n if (this.config.debug) {\n JsSIP.debug.enable('JsSIP:*');\n }\n }\n\n /**\n * Initialize the SDK - authenticate and connect to SIP server\n */\n async initialize(): Promise<void> {\n try {\n // Step 1: Authenticate and get SIP credentials\n this.credentials = await this.authProvider.authenticate(this.config.auth);\n\n // Step 2: Initialize JsSIP User Agent\n await this.initializeUserAgent();\n\n // Step 3: Initialize Call Manager\n this.initializeCallManager();\n\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n this.emitError(new ConnectionError(`Initialization failed: ${errorMessage}`));\n throw error;\n }\n }\n\n private async initializeUserAgent(): Promise<void> {\n if (!this.credentials) {\n throw new ConnectionError('No credentials available');\n }\n\n try {\n // Create WebSocket connection\n const socket = new JsSIP.WebSocketInterface(this.credentials.wsUrl);\n\n // Build TURN/STUN configuration\n const pcConfig: RTCConfiguration = {\n iceServers: this.config.turnServers || this.getDefaultTurnServers(),\n };\n\n // Create User Agent configuration\n const uaConfig: any = {\n uri: this.credentials.sipUri,\n password: this.credentials.password,\n sockets: [socket],\n register: true,\n display_name: this.getDisplayName(),\n session_timers: false,\n use_preloaded_route: false,\n pcConfig: pcConfig,\n instance_id: this.generateInstanceId(),\n };\n\n // Create User Agent\n this.ua = new JsSIP.UA(uaConfig);\n\n // Set up UA event handlers\n this.setupUserAgentHandlers();\n\n // Start the UA\n this.ua.start();\n\n } catch (error) {\n throw new ConnectionError(\n `Failed to initialize User Agent: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n }\n }\n\n private setupUserAgentHandlers(): void {\n if (!this.ua) return;\n\n this.ua.on('connected', () => {\n this.connectionStatus = 'connected';\n this.emitConnectionStatus();\n });\n\n this.ua.on('disconnected', () => {\n this.connectionStatus = 'disconnected';\n this.emitConnectionStatus();\n });\n\n this.ua.on('registered', () => {\n this.connectionStatus = 'registered';\n this.retryCount = 0;\n this.emitConnectionStatus();\n });\n\n this.ua.on('registrationFailed', (e: any) => {\n this.connectionStatus = 'registrationFailed';\n this.emitConnectionStatus(e.cause);\n\n // Retry logic\n if (this.retryCount < this.maxRetries) {\n this.retryCount++;\n setTimeout(() => {\n this.ua?.register();\n }, 3000);\n }\n });\n\n this.ua.on('newRTCSession', (e: any) => {\n const session = e.session;\n\n if (session.direction === 'incoming') {\n // Handle incoming call\n this.callManager?.handleIncomingCall(session);\n }\n });\n }\n\n private initializeCallManager(): void {\n if (!this.credentials) {\n throw new ConnectionError('No credentials available for call manager');\n }\n\n const pcConfig: RTCConfiguration = {\n iceServers: this.config.turnServers || this.getDefaultTurnServers(),\n };\n\n this.callManager = new CallManager(\n this.credentials,\n this.events,\n { pcConfig }\n );\n\n this.callManager.setUserAgent(this.ua);\n }\n\n /**\n * Make an outbound call\n */\n async call(phoneNumber: string, options?: CallOptions): Promise<Call> {\n if (!this.callManager) {\n throw new CallError('SDK not initialized. Call initialize() first.');\n }\n\n if (this.connectionStatus !== 'registered') {\n throw new CallError('Not registered to SIP server');\n }\n\n return this.callManager.initiateCall(phoneNumber, options);\n }\n\n /**\n * Answer an incoming call\n */\n answerCall(): void {\n const currentCall = this.callManager?.getCurrentCall();\n\n if (!currentCall) {\n throw new CallError('No incoming call to answer');\n }\n\n if (currentCall.direction !== 'inbound') {\n throw new CallError('Current call is not an incoming call');\n }\n\n // The CallSession will handle answering via its internal session\n // This is already set up in CallManager.handleIncomingCall\n }\n\n /**\n * Hangup the current call\n */\n hangup(): void {\n const currentCall = this.callManager?.getCurrentCall();\n\n if (!currentCall) {\n throw new CallError('No active call to hang up');\n }\n\n currentCall.hangup();\n }\n\n /**\n * Get current call\n */\n getCurrentCall(): Call | null {\n return this.callManager?.getCurrentCall() || null;\n }\n\n /**\n * Get connection status\n */\n getStatus(): ConnectionStatus {\n return this.connectionStatus;\n }\n\n /**\n * Get available extensions\n */\n getExtensions(): string[] {\n if (!this.credentials?.extensions) {\n return [];\n }\n return this.credentials.extensions.map(ext => ext.extension);\n }\n\n /**\n * Event listener management\n */\n on<K extends DoraCellEvent>(event: K, handler: DoraCellEventMap[K]): void {\n this.events.on(event, handler as any);\n }\n\n off<K extends DoraCellEvent>(event: K, handler: DoraCellEventMap[K]): void {\n this.events.off(event, handler as any);\n }\n\n once<K extends DoraCellEvent>(event: K, handler: DoraCellEventMap[K]): void {\n this.events.once(event, handler as any);\n }\n\n /**\n * Cleanup and destroy the SDK instance\n */\n destroy(): void {\n if (this.ua) {\n this.ua.stop();\n this.ua = null;\n }\n\n if (this.callManager) {\n this.callManager.destroy();\n this.callManager = null;\n }\n\n this.events.removeAllListeners();\n this.connectionStatus = 'disconnected';\n this.credentials = null;\n }\n\n // Helper methods\n private emitConnectionStatus(error?: string): void {\n const state: ConnectionState = {\n status: this.connectionStatus,\n extension: this.credentials?.extensions?.[0]?.extension,\n error,\n };\n this.events.emit('connection:status', state);\n }\n\n private emitError(error: Error): void {\n this.events.emit('error', error);\n }\n\n private getDefaultTurnServers(): RTCIceServer[] {\n let turnUri = 'turn:64.227.10.164:3478';\n let turnUser = '02018890089';\n let turnPass = 'dora12345';\n\n if (typeof process !== 'undefined' && process.env) {\n turnUri = process.env.NEXT_PUBLIC_TURN_URI || turnUri;\n turnUser = process.env.NEXT_PUBLIC_TURN_USER || turnUser;\n turnPass = process.env.NEXT_PUBLIC_TURN_PASS || turnPass;\n }\n\n return [\n {\n urls: turnUri,\n username: turnUser,\n credential: turnPass,\n },\n ];\n }\n\n private getDisplayName(): string {\n if (this.credentials?.extensions?.[0]?.displayName) {\n return this.credentials.extensions[0].displayName;\n }\n if (this.credentials?.extensions?.[0]?.extension) {\n return `Ext ${this.credentials.extensions[0].extension}`;\n }\n return 'Dora Cell User';\n }\n\n private generateInstanceId(): string {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n}\n\nexport default DoraCell;\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dora-cell/sdk",
3
- "version": "0.1.1-beta.6",
3
+ "version": "0.1.1-beta.9",
4
4
  "description": "VoIP calling SDK for Dora Cell - Make calls from any JavaScript application",
5
5
  "main": "./dist/index.cjs",
6
6
  "module": "./dist/index.mjs",