@telnyx/react-voice-commons-sdk 0.1.0 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/README.md +483 -0
  2. package/TelnyxVoiceCommons.podspec +31 -31
  3. package/ios/CallKitBridge.m +43 -43
  4. package/ios/CallKitBridge.swift +879 -879
  5. package/ios/VoicePnBridge.m +30 -30
  6. package/ios/VoicePnBridge.swift +86 -86
  7. package/lib/callkit/callkit-coordinator.d.ts +117 -113
  8. package/lib/callkit/callkit-coordinator.js +727 -681
  9. package/lib/callkit/callkit.d.ts +41 -41
  10. package/lib/callkit/callkit.js +242 -252
  11. package/lib/callkit/index.js +47 -15
  12. package/lib/callkit/use-callkit.d.ts +19 -19
  13. package/lib/callkit/use-callkit.js +310 -270
  14. package/lib/context/TelnyxVoiceContext.d.ts +9 -9
  15. package/lib/context/TelnyxVoiceContext.js +13 -10
  16. package/lib/hooks/use-callkit-coordinator.d.ts +17 -9
  17. package/lib/hooks/use-callkit-coordinator.js +50 -45
  18. package/lib/hooks/useAppReadyNotifier.js +15 -13
  19. package/lib/hooks/useAppStateHandler.d.ts +11 -6
  20. package/lib/hooks/useAppStateHandler.js +110 -95
  21. package/lib/index.d.ts +21 -3
  22. package/lib/index.js +201 -50
  23. package/lib/internal/CallKitHandler.d.ts +6 -6
  24. package/lib/internal/CallKitHandler.js +104 -96
  25. package/lib/internal/callkit-manager.d.ts +57 -57
  26. package/lib/internal/callkit-manager.js +316 -299
  27. package/lib/internal/calls/call-state-controller.d.ts +86 -81
  28. package/lib/internal/calls/call-state-controller.js +307 -269
  29. package/lib/internal/session/session-manager.d.ts +75 -75
  30. package/lib/internal/session/session-manager.js +424 -350
  31. package/lib/internal/user-defaults-helpers.js +39 -49
  32. package/lib/internal/voice-pn-bridge.d.ts +11 -11
  33. package/lib/internal/voice-pn-bridge.js +3 -3
  34. package/lib/models/call-state.d.ts +44 -44
  35. package/lib/models/call-state.js +68 -66
  36. package/lib/models/call.d.ts +133 -133
  37. package/lib/models/call.js +382 -354
  38. package/lib/models/config.d.ts +18 -11
  39. package/lib/models/config.js +35 -37
  40. package/lib/models/connection-state.d.ts +10 -10
  41. package/lib/models/connection-state.js +16 -16
  42. package/lib/telnyx-voice-app.d.ts +28 -28
  43. package/lib/telnyx-voice-app.js +482 -424
  44. package/lib/telnyx-voip-client.d.ts +167 -155
  45. package/lib/telnyx-voip-client.js +392 -331
  46. package/package.json +1 -1
  47. package/src/telnyx-voip-client.ts +64 -0
@@ -1,31 +1,31 @@
1
- #import <React/RCTBridgeModule.h>
2
-
3
- @interface RCT_EXTERN_MODULE(VoicePnBridge, NSObject)
4
-
5
- RCT_EXTERN_METHOD(getPendingPushAction:(RCTPromiseResolveBlock)resolve
6
- rejecter:(RCTPromiseRejectBlock)reject)
7
-
8
- RCT_EXTERN_METHOD(setPendingPushAction:(NSString *)action
9
- metadata:(NSString *)metadata
10
- resolver:(RCTPromiseResolveBlock)resolve
11
- rejecter:(RCTPromiseRejectBlock)reject)
12
-
13
- RCT_EXTERN_METHOD(clearPendingPushAction:(RCTPromiseResolveBlock)resolve
14
- rejecter:(RCTPromiseRejectBlock)reject)
15
-
16
- RCT_EXTERN_METHOD(getVoipToken:(RCTPromiseResolveBlock)resolve
17
- rejecter:(RCTPromiseRejectBlock)reject)
18
-
19
- RCT_EXTERN_METHOD(getPendingVoipPush:(RCTPromiseResolveBlock)resolve
20
- rejecter:(RCTPromiseRejectBlock)reject)
21
-
22
- RCT_EXTERN_METHOD(clearPendingVoipPush:(RCTPromiseResolveBlock)resolve
23
- rejecter:(RCTPromiseRejectBlock)reject)
24
-
25
- RCT_EXTERN_METHOD(getPendingVoipAction:(RCTPromiseResolveBlock)resolve
26
- rejecter:(RCTPromiseRejectBlock)reject)
27
-
28
- RCT_EXTERN_METHOD(clearPendingVoipAction:(RCTPromiseResolveBlock)resolve
29
- rejecter:(RCTPromiseRejectBlock)reject)
30
-
1
+ #import <React/RCTBridgeModule.h>
2
+
3
+ @interface RCT_EXTERN_MODULE(VoicePnBridge, NSObject)
4
+
5
+ RCT_EXTERN_METHOD(getPendingPushAction:(RCTPromiseResolveBlock)resolve
6
+ rejecter:(RCTPromiseRejectBlock)reject)
7
+
8
+ RCT_EXTERN_METHOD(setPendingPushAction:(NSString *)action
9
+ metadata:(NSString *)metadata
10
+ resolver:(RCTPromiseResolveBlock)resolve
11
+ rejecter:(RCTPromiseRejectBlock)reject)
12
+
13
+ RCT_EXTERN_METHOD(clearPendingPushAction:(RCTPromiseResolveBlock)resolve
14
+ rejecter:(RCTPromiseRejectBlock)reject)
15
+
16
+ RCT_EXTERN_METHOD(getVoipToken:(RCTPromiseResolveBlock)resolve
17
+ rejecter:(RCTPromiseRejectBlock)reject)
18
+
19
+ RCT_EXTERN_METHOD(getPendingVoipPush:(RCTPromiseResolveBlock)resolve
20
+ rejecter:(RCTPromiseRejectBlock)reject)
21
+
22
+ RCT_EXTERN_METHOD(clearPendingVoipPush:(RCTPromiseResolveBlock)resolve
23
+ rejecter:(RCTPromiseRejectBlock)reject)
24
+
25
+ RCT_EXTERN_METHOD(getPendingVoipAction:(RCTPromiseResolveBlock)resolve
26
+ rejecter:(RCTPromiseRejectBlock)reject)
27
+
28
+ RCT_EXTERN_METHOD(clearPendingVoipAction:(RCTPromiseResolveBlock)resolve
29
+ rejecter:(RCTPromiseRejectBlock)reject)
30
+
31
31
  @end
@@ -1,87 +1,87 @@
1
- import Foundation
2
- import React
3
-
4
- @objc(VoicePnBridge)
5
- class VoicePnBridge: NSObject {
6
-
7
- @objc
8
- static func requiresMainQueueSetup() -> Bool {
9
- return false
10
- }
11
-
12
- // MARK: - UserDefaults-based methods for VoIP push handling
13
-
14
- @objc
15
- func getPendingPushAction(_ resolve: @escaping RCTPromiseResolveBlock, rejecter reject: @escaping RCTPromiseRejectBlock) {
16
- let action = UserDefaults.standard.string(forKey: "pending_push_action")
17
- let metadata = UserDefaults.standard.string(forKey: "pending_push_metadata")
18
-
19
- NSLog("[VoicePnBridge] getPendingPushAction - action: \(action ?? "nil"), metadata: \(metadata ?? "nil")")
20
-
21
- let result: [String: Any?] = [
22
- "action": action,
23
- "metadata": metadata
24
- ]
25
-
26
- resolve(result)
27
- }
28
-
29
- @objc
30
- func setPendingPushAction(_ action: String, metadata: String, resolver resolve: @escaping RCTPromiseResolveBlock, rejecter reject: @escaping RCTPromiseRejectBlock) {
31
- UserDefaults.standard.set(action, forKey: "pending_push_action")
32
- UserDefaults.standard.set(metadata, forKey: "pending_push_metadata")
33
- UserDefaults.standard.synchronize()
34
-
35
- NSLog("[VoicePnBridge] setPendingPushAction - action: \(action), metadata: \(metadata)")
36
- resolve(true)
37
- }
38
-
39
- @objc
40
- func clearPendingPushAction(_ resolve: @escaping RCTPromiseResolveBlock, rejecter reject: @escaping RCTPromiseRejectBlock) {
41
- UserDefaults.standard.removeObject(forKey: "pending_push_action")
42
- UserDefaults.standard.removeObject(forKey: "pending_push_metadata")
43
- UserDefaults.standard.synchronize()
44
-
45
- NSLog("[VoicePnBridge] clearPendingPushAction - cleared pending push data")
46
- resolve(true)
47
- }
48
-
49
- // MARK: - Additional UserDefaults methods from UserDefaultsModule
50
-
51
- @objc
52
- func getVoipToken(_ resolve: @escaping RCTPromiseResolveBlock, rejecter reject: @escaping RCTPromiseRejectBlock) {
53
- let token = UserDefaults.standard.string(forKey: "voip_push_token")
54
- NSLog("[VoicePnBridge] getVoipToken called. token=\(token ?? "(nil)")")
55
- resolve(token)
56
- }
57
-
58
- @objc
59
- func getPendingVoipPush(_ resolve: @escaping RCTPromiseResolveBlock, rejecter reject: @escaping RCTPromiseRejectBlock) {
60
- let pending = UserDefaults.standard.string(forKey: "pending_voip_push")
61
- NSLog("[VoicePnBridge] getPendingVoipPush called. pending=\(pending ?? "(nil)")")
62
- resolve(pending)
63
- }
64
-
65
- @objc
66
- func clearPendingVoipPush(_ resolve: @escaping RCTPromiseResolveBlock, rejecter reject: @escaping RCTPromiseRejectBlock) {
67
- UserDefaults.standard.removeObject(forKey: "pending_voip_push")
68
- UserDefaults.standard.synchronize()
69
- NSLog("[VoicePnBridge] clearPendingVoipPush called. Cleared key pending_voip_push")
70
- resolve(true)
71
- }
72
-
73
- @objc
74
- func getPendingVoipAction(_ resolve: @escaping RCTPromiseResolveBlock, rejecter reject: @escaping RCTPromiseRejectBlock) {
75
- let pending = UserDefaults.standard.string(forKey: "pending_voip_action")
76
- NSLog("[VoicePnBridge] getPendingVoipAction called. pending=\(pending ?? "(nil)")")
77
- resolve(pending)
78
- }
79
-
80
- @objc
81
- func clearPendingVoipAction(_ resolve: @escaping RCTPromiseResolveBlock, rejecter reject: @escaping RCTPromiseRejectBlock) {
82
- UserDefaults.standard.removeObject(forKey: "pending_voip_action")
83
- UserDefaults.standard.synchronize()
84
- NSLog("[VoicePnBridge] clearPendingVoipAction called. Cleared key pending_voip_action")
85
- resolve(true)
86
- }
1
+ import Foundation
2
+ import React
3
+
4
+ @objc(VoicePnBridge)
5
+ class VoicePnBridge: NSObject {
6
+
7
+ @objc
8
+ static func requiresMainQueueSetup() -> Bool {
9
+ return false
10
+ }
11
+
12
+ // MARK: - UserDefaults-based methods for VoIP push handling
13
+
14
+ @objc
15
+ func getPendingPushAction(_ resolve: @escaping RCTPromiseResolveBlock, rejecter reject: @escaping RCTPromiseRejectBlock) {
16
+ let action = UserDefaults.standard.string(forKey: "pending_push_action")
17
+ let metadata = UserDefaults.standard.string(forKey: "pending_push_metadata")
18
+
19
+ NSLog("[VoicePnBridge] getPendingPushAction - action: \(action ?? "nil"), metadata: \(metadata ?? "nil")")
20
+
21
+ let result: [String: Any?] = [
22
+ "action": action,
23
+ "metadata": metadata
24
+ ]
25
+
26
+ resolve(result)
27
+ }
28
+
29
+ @objc
30
+ func setPendingPushAction(_ action: String, metadata: String, resolver resolve: @escaping RCTPromiseResolveBlock, rejecter reject: @escaping RCTPromiseRejectBlock) {
31
+ UserDefaults.standard.set(action, forKey: "pending_push_action")
32
+ UserDefaults.standard.set(metadata, forKey: "pending_push_metadata")
33
+ UserDefaults.standard.synchronize()
34
+
35
+ NSLog("[VoicePnBridge] setPendingPushAction - action: \(action), metadata: \(metadata)")
36
+ resolve(true)
37
+ }
38
+
39
+ @objc
40
+ func clearPendingPushAction(_ resolve: @escaping RCTPromiseResolveBlock, rejecter reject: @escaping RCTPromiseRejectBlock) {
41
+ UserDefaults.standard.removeObject(forKey: "pending_push_action")
42
+ UserDefaults.standard.removeObject(forKey: "pending_push_metadata")
43
+ UserDefaults.standard.synchronize()
44
+
45
+ NSLog("[VoicePnBridge] clearPendingPushAction - cleared pending push data")
46
+ resolve(true)
47
+ }
48
+
49
+ // MARK: - Additional UserDefaults methods from UserDefaultsModule
50
+
51
+ @objc
52
+ func getVoipToken(_ resolve: @escaping RCTPromiseResolveBlock, rejecter reject: @escaping RCTPromiseRejectBlock) {
53
+ let token = UserDefaults.standard.string(forKey: "voip_push_token")
54
+ NSLog("[VoicePnBridge] getVoipToken called. token=\(token ?? "(nil)")")
55
+ resolve(token)
56
+ }
57
+
58
+ @objc
59
+ func getPendingVoipPush(_ resolve: @escaping RCTPromiseResolveBlock, rejecter reject: @escaping RCTPromiseRejectBlock) {
60
+ let pending = UserDefaults.standard.string(forKey: "pending_voip_push")
61
+ NSLog("[VoicePnBridge] getPendingVoipPush called. pending=\(pending ?? "(nil)")")
62
+ resolve(pending)
63
+ }
64
+
65
+ @objc
66
+ func clearPendingVoipPush(_ resolve: @escaping RCTPromiseResolveBlock, rejecter reject: @escaping RCTPromiseRejectBlock) {
67
+ UserDefaults.standard.removeObject(forKey: "pending_voip_push")
68
+ UserDefaults.standard.synchronize()
69
+ NSLog("[VoicePnBridge] clearPendingVoipPush called. Cleared key pending_voip_push")
70
+ resolve(true)
71
+ }
72
+
73
+ @objc
74
+ func getPendingVoipAction(_ resolve: @escaping RCTPromiseResolveBlock, rejecter reject: @escaping RCTPromiseRejectBlock) {
75
+ let pending = UserDefaults.standard.string(forKey: "pending_voip_action")
76
+ NSLog("[VoicePnBridge] getPendingVoipAction called. pending=\(pending ?? "(nil)")")
77
+ resolve(pending)
78
+ }
79
+
80
+ @objc
81
+ func clearPendingVoipAction(_ resolve: @escaping RCTPromiseResolveBlock, rejecter reject: @escaping RCTPromiseRejectBlock) {
82
+ UserDefaults.standard.removeObject(forKey: "pending_voip_action")
83
+ UserDefaults.standard.synchronize()
84
+ NSLog("[VoicePnBridge] clearPendingVoipAction called. Cleared key pending_voip_action")
85
+ resolve(true)
86
+ }
87
87
  }
@@ -8,119 +8,123 @@ import { TelnyxVoipClient } from '../telnyx-voip-client';
8
8
  * guidelines for proper CallKit integration.
9
9
  */
10
10
  declare class CallKitCoordinator {
11
- private static instance;
12
- private callMap;
13
- private processingCalls;
14
- private endedCalls;
15
- private connectedCalls;
16
- private isCallFromPush;
17
- private voipClient;
18
- static getInstance(): CallKitCoordinator;
19
- private constructor();
20
- private setupCallKitListeners;
21
- /**
22
- * Report an incoming call to CallKit (from push notification or socket)
23
- * For push notifications, the call is already reported - we just need to map it
24
- */
25
- reportIncomingCall(call: Call, callerName: string, callerNumber: string): Promise<string | null>;
26
- /**
27
- * Start an outgoing call through CallKit
28
- */
29
- startOutgoingCall(call: Call, destinationNumber: string, displayName?: string): Promise<string | null>;
30
- /**
31
- * Answer a call from the app UI (CallKit-first approach)
32
- */
33
- answerCallFromUI(call: Call): Promise<boolean>;
34
- /**
35
- * End a call from the app UI (CallKit-first approach)
36
- */
37
- endCallFromUI(call: Call): Promise<boolean>;
38
- /**
39
- * Handle CallKit answer action (triggered by CallKit)
40
- */
41
- handleCallKitAnswer(callKitUUID: string, event?: any): Promise<void>;
42
- /**
43
- * Handle CallKit end action (triggered by CallKit)
44
- */
45
- private handleCallKitEnd;
46
- /**
47
- * Handle CallKit start action (triggered by CallKit for outgoing calls)
48
- */
49
- private handleCallKitStart;
50
- /**
51
- * Handle CallKit push received event - when a VoIP push notification has been processed
52
- * This allows us to coordinate between the push notification and any subsequent WebRTC calls
53
- */
54
- handleCallKitPushReceived(callKitUUID: string, event?: any): Promise<void>;
55
- /**
56
- * Handle push notification answer - when user answers from CallKit but we don't have a WebRTC call yet
57
- * This is the iOS equivalent of the Android FCM handler
58
- */
59
- private handlePushNotificationAnswer;
60
- /**
61
- * Handle push notification reject - when user rejects from CallKit but we don't have a WebRTC call yet
62
- * This is the iOS equivalent of the Android FCM handler reject
63
- */
64
- private handlePushNotificationReject;
65
- /**
66
- * Set up listeners for WebRTC call state changes
67
- */
68
- private setupWebRTCCallListeners;
69
- /**
70
- * Clean up call mappings and listeners
71
- */
72
- private cleanupCall;
73
- /**
74
- * Get CallKit UUID for a WebRTC call
75
- */
76
- getCallKitUUID(call: Call): string | null;
77
- /**
78
- * Get WebRTC call for a CallKit UUID
79
- */
80
- getWebRTCCall(callKitUUID: string): Call | null;
81
- /**
82
- * Link an existing CallKit call (from push notification) with a WebRTC call
83
- * This should be called when a WebRTC call arrives that corresponds to an existing CallKit call
84
- */
85
- linkExistingCallKitCall(call: Call, callKitUUID: string): void;
86
- /**
87
- * Set the VoIP client reference for triggering reconnection
88
- */
89
- setVoipClient(voipClient: TelnyxVoipClient): void;
90
- /**
91
- * Helper method to handle auto-answer logic for push notification calls
92
- */
93
- private handleAutoAnswer;
94
- /**
95
- * Helper method to clean up push notification state
96
- */
97
- private cleanupPushNotificationState;
98
- /**
99
- * Get reference to the SDK client (for queuing actions when call doesn't exist yet)
100
- */
101
- private getSDKClient;
102
- /**
103
- * Check if app is in background and disconnect client if no active calls
104
- */
105
- private checkBackgroundDisconnection;
106
- /**
107
- * Reset only flags (keeping active call mappings intact)
108
- */
109
- resetFlags(): void;
110
- /**
111
- * Check if there are any calls currently being processed by CallKit
112
- * This helps prevent premature flag resets during CallKit operations
113
- */
114
- hasProcessingCalls(): boolean;
115
- /**
116
- * Check if there's currently a call from push notification being processed
117
- * This helps prevent disconnection during push call handling
118
- */
119
- getIsCallFromPush(): boolean;
120
- /**
121
- * Check if CallKit is available and coordinator is active
122
- */
123
- isAvailable(): boolean;
11
+ private static instance;
12
+ private callMap;
13
+ private processingCalls;
14
+ private endedCalls;
15
+ private connectedCalls;
16
+ private isCallFromPush;
17
+ private voipClient;
18
+ static getInstance(): CallKitCoordinator;
19
+ private constructor();
20
+ private setupCallKitListeners;
21
+ /**
22
+ * Report an incoming call to CallKit (from push notification or socket)
23
+ * For push notifications, the call is already reported - we just need to map it
24
+ */
25
+ reportIncomingCall(call: Call, callerName: string, callerNumber: string): Promise<string | null>;
26
+ /**
27
+ * Start an outgoing call through CallKit
28
+ */
29
+ startOutgoingCall(
30
+ call: Call,
31
+ destinationNumber: string,
32
+ displayName?: string
33
+ ): Promise<string | null>;
34
+ /**
35
+ * Answer a call from the app UI (CallKit-first approach)
36
+ */
37
+ answerCallFromUI(call: Call): Promise<boolean>;
38
+ /**
39
+ * End a call from the app UI (CallKit-first approach)
40
+ */
41
+ endCallFromUI(call: Call): Promise<boolean>;
42
+ /**
43
+ * Handle CallKit answer action (triggered by CallKit)
44
+ */
45
+ handleCallKitAnswer(callKitUUID: string, event?: any): Promise<void>;
46
+ /**
47
+ * Handle CallKit end action (triggered by CallKit)
48
+ */
49
+ private handleCallKitEnd;
50
+ /**
51
+ * Handle CallKit start action (triggered by CallKit for outgoing calls)
52
+ */
53
+ private handleCallKitStart;
54
+ /**
55
+ * Handle CallKit push received event - when a VoIP push notification has been processed
56
+ * This allows us to coordinate between the push notification and any subsequent WebRTC calls
57
+ */
58
+ handleCallKitPushReceived(callKitUUID: string, event?: any): Promise<void>;
59
+ /**
60
+ * Handle push notification answer - when user answers from CallKit but we don't have a WebRTC call yet
61
+ * This is the iOS equivalent of the Android FCM handler
62
+ */
63
+ private handlePushNotificationAnswer;
64
+ /**
65
+ * Handle push notification reject - when user rejects from CallKit but we don't have a WebRTC call yet
66
+ * This is the iOS equivalent of the Android FCM handler reject
67
+ */
68
+ private handlePushNotificationReject;
69
+ /**
70
+ * Set up listeners for WebRTC call state changes
71
+ */
72
+ private setupWebRTCCallListeners;
73
+ /**
74
+ * Clean up call mappings and listeners
75
+ */
76
+ private cleanupCall;
77
+ /**
78
+ * Get CallKit UUID for a WebRTC call
79
+ */
80
+ getCallKitUUID(call: Call): string | null;
81
+ /**
82
+ * Get WebRTC call for a CallKit UUID
83
+ */
84
+ getWebRTCCall(callKitUUID: string): Call | null;
85
+ /**
86
+ * Link an existing CallKit call (from push notification) with a WebRTC call
87
+ * This should be called when a WebRTC call arrives that corresponds to an existing CallKit call
88
+ */
89
+ linkExistingCallKitCall(call: Call, callKitUUID: string): void;
90
+ /**
91
+ * Set the VoIP client reference for triggering reconnection
92
+ */
93
+ setVoipClient(voipClient: TelnyxVoipClient): void;
94
+ /**
95
+ * Helper method to handle auto-answer logic for push notification calls
96
+ */
97
+ private handleAutoAnswer;
98
+ /**
99
+ * Helper method to clean up push notification state
100
+ */
101
+ private cleanupPushNotificationState;
102
+ /**
103
+ * Get reference to the SDK client (for queuing actions when call doesn't exist yet)
104
+ */
105
+ private getSDKClient;
106
+ /**
107
+ * Check if app is in background and disconnect client if no active calls
108
+ */
109
+ private checkBackgroundDisconnection;
110
+ /**
111
+ * Reset only flags (keeping active call mappings intact)
112
+ */
113
+ resetFlags(): void;
114
+ /**
115
+ * Check if there are any calls currently being processed by CallKit
116
+ * This helps prevent premature flag resets during CallKit operations
117
+ */
118
+ hasProcessingCalls(): boolean;
119
+ /**
120
+ * Check if there's currently a call from push notification being processed
121
+ * This helps prevent disconnection during push call handling
122
+ */
123
+ getIsCallFromPush(): boolean;
124
+ /**
125
+ * Check if CallKit is available and coordinator is active
126
+ */
127
+ isAvailable(): boolean;
124
128
  }
125
129
  export declare const callKitCoordinator: CallKitCoordinator;
126
130
  export default callKitCoordinator;