@telnyx/react-voice-commons-sdk 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. package/TelnyxVoiceCommons.podspec +32 -0
  2. package/ios/CallKitBridge.m +44 -0
  3. package/ios/CallKitBridge.swift +879 -0
  4. package/ios/README.md +211 -0
  5. package/ios/VoicePnBridge.m +31 -0
  6. package/ios/VoicePnBridge.swift +87 -0
  7. package/lib/callkit/callkit-coordinator.d.ts +126 -0
  8. package/lib/callkit/callkit-coordinator.js +728 -0
  9. package/lib/callkit/callkit.d.ts +49 -0
  10. package/lib/callkit/callkit.js +262 -0
  11. package/lib/callkit/index.d.ts +4 -0
  12. package/lib/callkit/index.js +15 -0
  13. package/lib/callkit/use-callkit-coordinator.d.ts +21 -0
  14. package/lib/callkit/use-callkit-coordinator.js +53 -0
  15. package/lib/callkit/use-callkit.d.ts +28 -0
  16. package/lib/callkit/use-callkit.js +279 -0
  17. package/lib/context/TelnyxVoiceContext.d.ts +18 -0
  18. package/lib/context/TelnyxVoiceContext.js +18 -0
  19. package/lib/hooks/use-callkit-coordinator.d.ts +13 -0
  20. package/lib/hooks/use-callkit-coordinator.js +48 -0
  21. package/lib/hooks/useAppReadyNotifier.d.ts +9 -0
  22. package/lib/hooks/useAppReadyNotifier.js +25 -0
  23. package/lib/hooks/useAppStateHandler.d.ts +16 -0
  24. package/lib/hooks/useAppStateHandler.js +105 -0
  25. package/lib/index.d.ts +24 -0
  26. package/lib/index.js +66 -0
  27. package/lib/internal/CallKitHandler.d.ts +17 -0
  28. package/lib/internal/CallKitHandler.js +110 -0
  29. package/lib/internal/callkit-manager.d.ts +69 -0
  30. package/lib/internal/callkit-manager.js +326 -0
  31. package/lib/internal/calls/call-state-controller.d.ts +92 -0
  32. package/lib/internal/calls/call-state-controller.js +294 -0
  33. package/lib/internal/session/session-manager.d.ts +87 -0
  34. package/lib/internal/session/session-manager.js +385 -0
  35. package/lib/internal/user-defaults-helpers.d.ts +10 -0
  36. package/lib/internal/user-defaults-helpers.js +69 -0
  37. package/lib/internal/voice-pn-bridge.d.ts +14 -0
  38. package/lib/internal/voice-pn-bridge.js +5 -0
  39. package/lib/models/call-state.d.ts +61 -0
  40. package/lib/models/call-state.js +87 -0
  41. package/lib/models/call.d.ts +145 -0
  42. package/lib/models/call.js +372 -0
  43. package/lib/models/config.d.ts +64 -0
  44. package/lib/models/config.js +92 -0
  45. package/lib/models/connection-state.d.ts +34 -0
  46. package/lib/models/connection-state.js +50 -0
  47. package/lib/telnyx-voice-app.d.ts +48 -0
  48. package/lib/telnyx-voice-app.js +486 -0
  49. package/lib/telnyx-voip-client.d.ts +184 -0
  50. package/lib/telnyx-voip-client.js +386 -0
  51. package/package.json +104 -0
  52. package/src/callkit/callkit-coordinator.ts +846 -0
  53. package/src/callkit/callkit.ts +322 -0
  54. package/src/callkit/index.ts +4 -0
  55. package/src/callkit/use-callkit.ts +345 -0
  56. package/src/context/TelnyxVoiceContext.tsx +33 -0
  57. package/src/hooks/use-callkit-coordinator.ts +60 -0
  58. package/src/hooks/useAppReadyNotifier.ts +25 -0
  59. package/src/hooks/useAppStateHandler.ts +134 -0
  60. package/src/index.ts +56 -0
  61. package/src/internal/CallKitHandler.tsx +149 -0
  62. package/src/internal/callkit-manager.ts +335 -0
  63. package/src/internal/calls/call-state-controller.ts +384 -0
  64. package/src/internal/session/session-manager.ts +467 -0
  65. package/src/internal/user-defaults-helpers.ts +58 -0
  66. package/src/internal/voice-pn-bridge.ts +18 -0
  67. package/src/models/call-state.ts +98 -0
  68. package/src/models/call.ts +388 -0
  69. package/src/models/config.ts +125 -0
  70. package/src/models/connection-state.ts +50 -0
  71. package/src/telnyx-voice-app.tsx +690 -0
  72. package/src/telnyx-voip-client.ts +475 -0
  73. package/src/types/telnyx-sdk.d.ts +79 -0
@@ -0,0 +1,49 @@
1
+ export declare enum CallEndReason {
2
+ Failed = 1,
3
+ RemoteEnded = 2,
4
+ Unanswered = 3,
5
+ AnsweredElsewhere = 4,
6
+ DeclinedElsewhere = 5
7
+ }
8
+ export interface CallKitEvent {
9
+ callUUID: string;
10
+ [key: string]: any;
11
+ }
12
+ declare class CallKitManager {
13
+ private bridge;
14
+ private eventEmitter;
15
+ private listeners;
16
+ /**
17
+ * Normalize UUID to lowercase for consistent handling in React Native
18
+ * iOS CallKit provides UUIDs in uppercase, but we want to use lowercase throughout React Native
19
+ */
20
+ private normalizeUUID;
21
+ /**
22
+ * Denormalize UUID back to uppercase for iOS CallKit bridge calls
23
+ * iOS CallKit expects UUIDs in uppercase format
24
+ */
25
+ private denormalizeUUID;
26
+ /**
27
+ * Normalize event object by converting callUUID to lowercase
28
+ */
29
+ private normalizeEvent;
30
+ constructor();
31
+ private setupEventListeners;
32
+ private notifyListeners;
33
+ startOutgoingCall(callUUID: string, handle: string, displayName: string): Promise<boolean>;
34
+ reportIncomingCall(callUUID: string, handle: string, displayName: string): Promise<boolean>;
35
+ answerCall(callUUID: string): Promise<boolean>;
36
+ endCall(callUUID: string): Promise<boolean>;
37
+ reportCallConnected(callUUID: string): Promise<boolean>;
38
+ reportCallEnded(callUUID: string, reason?: CallEndReason): Promise<boolean>;
39
+ updateCall(callUUID: string, displayName: string, handle: string): Promise<boolean>;
40
+ getActiveCalls(): Promise<any[]>;
41
+ onStartCall(listener: (event: CallKitEvent) => void): () => void;
42
+ onAnswerCall(listener: (event: CallKitEvent) => void): () => void;
43
+ onEndCall(listener: (event: CallKitEvent) => void): () => void;
44
+ onReceivePush(listener: (event: CallKitEvent) => void): () => void;
45
+ generateCallUUID(): string;
46
+ isAvailable(): boolean;
47
+ }
48
+ export declare const CallKit: CallKitManager;
49
+ export default CallKit;
@@ -0,0 +1,262 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CallKit = exports.CallEndReason = void 0;
4
+ const react_native_1 = require("react-native");
5
+ // Call end reasons
6
+ var CallEndReason;
7
+ (function (CallEndReason) {
8
+ CallEndReason[CallEndReason["Failed"] = 1] = "Failed";
9
+ CallEndReason[CallEndReason["RemoteEnded"] = 2] = "RemoteEnded";
10
+ CallEndReason[CallEndReason["Unanswered"] = 3] = "Unanswered";
11
+ CallEndReason[CallEndReason["AnsweredElsewhere"] = 4] = "AnsweredElsewhere";
12
+ CallEndReason[CallEndReason["DeclinedElsewhere"] = 5] = "DeclinedElsewhere";
13
+ })(CallEndReason || (exports.CallEndReason = CallEndReason = {}));
14
+ class CallKitManager {
15
+ /**
16
+ * Normalize UUID to lowercase for consistent handling in React Native
17
+ * iOS CallKit provides UUIDs in uppercase, but we want to use lowercase throughout React Native
18
+ */
19
+ normalizeUUID(uuid) {
20
+ return uuid.toLowerCase();
21
+ }
22
+ /**
23
+ * Denormalize UUID back to uppercase for iOS CallKit bridge calls
24
+ * iOS CallKit expects UUIDs in uppercase format
25
+ */
26
+ denormalizeUUID(uuid) {
27
+ return uuid.toUpperCase();
28
+ }
29
+ /**
30
+ * Normalize event object by converting callUUID to lowercase
31
+ */
32
+ normalizeEvent(event) {
33
+ return {
34
+ ...event,
35
+ callUUID: this.normalizeUUID(event.callUUID),
36
+ };
37
+ }
38
+ constructor() {
39
+ this.bridge = null;
40
+ this.eventEmitter = null;
41
+ this.listeners = new Map();
42
+ if (react_native_1.Platform.OS === 'ios') {
43
+ const { CallKitBridge } = react_native_1.NativeModules;
44
+ if (CallKitBridge) {
45
+ this.bridge = CallKitBridge;
46
+ this.eventEmitter = new react_native_1.NativeEventEmitter(CallKitBridge);
47
+ this.setupEventListeners();
48
+ }
49
+ else {
50
+ console.warn('CallKit: CallKitBridge not available');
51
+ }
52
+ }
53
+ }
54
+ setupEventListeners() {
55
+ if (!this.eventEmitter)
56
+ return;
57
+ // Listen for CallKit actions - normalize UUIDs to lowercase for React Native
58
+ this.eventEmitter.addListener('CallKitDidReceiveStartCallAction', (event) => {
59
+ const normalizedEvent = this.normalizeEvent(event);
60
+ console.log('CallKit: Received start call action', normalizedEvent);
61
+ this.notifyListeners('startCall', normalizedEvent);
62
+ });
63
+ this.eventEmitter.addListener('CallKitDidPerformAnswerCallAction', (event) => {
64
+ const normalizedEvent = this.normalizeEvent(event);
65
+ console.log('CallKit: Received answer call action', normalizedEvent);
66
+ this.notifyListeners('answerCall', normalizedEvent);
67
+ });
68
+ this.eventEmitter.addListener('CallKitDidPerformEndCallAction', (event) => {
69
+ const normalizedEvent = this.normalizeEvent(event);
70
+ console.log('CallKit: Received end call action', normalizedEvent);
71
+ this.notifyListeners('endCall', normalizedEvent);
72
+ });
73
+ this.eventEmitter.addListener('CallKitDidReceivePush', (event) => {
74
+ const normalizedEvent = this.normalizeEvent(event);
75
+ console.log('CallKit: Received push notification event', normalizedEvent);
76
+ this.notifyListeners('receivePush', normalizedEvent);
77
+ });
78
+ }
79
+ notifyListeners(eventType, event) {
80
+ const listener = this.listeners.get(eventType);
81
+ if (listener) {
82
+ listener(event);
83
+ }
84
+ }
85
+ // Public API methods
86
+ async startOutgoingCall(callUUID, handle, displayName) {
87
+ if (!this.bridge || react_native_1.Platform.OS !== 'ios') {
88
+ console.warn('CallKit: Not available on this platform');
89
+ return false;
90
+ }
91
+ try {
92
+ // Convert to uppercase for iOS CallKit bridge
93
+ const uppercaseUUID = this.denormalizeUUID(callUUID);
94
+ console.log('CallKit: Starting outgoing call', {
95
+ callUUID: uppercaseUUID,
96
+ handle,
97
+ displayName,
98
+ });
99
+ const result = await this.bridge.startOutgoingCall(uppercaseUUID, handle, displayName);
100
+ console.log('CallKit: Outgoing call started successfully', result);
101
+ return result.success;
102
+ }
103
+ catch (error) {
104
+ console.error('CallKit: Failed to start outgoing call', error);
105
+ return false;
106
+ }
107
+ }
108
+ async reportIncomingCall(callUUID, handle, displayName) {
109
+ if (!this.bridge || react_native_1.Platform.OS !== 'ios') {
110
+ console.warn('CallKit: Not available on this platform');
111
+ return false;
112
+ }
113
+ try {
114
+ // Convert to uppercase for iOS CallKit bridge
115
+ const uppercaseUUID = this.denormalizeUUID(callUUID);
116
+ console.log('CallKit: Reporting incoming call', {
117
+ callUUID: uppercaseUUID,
118
+ handle,
119
+ displayName,
120
+ });
121
+ const result = await this.bridge.reportIncomingCall(uppercaseUUID, handle, displayName);
122
+ console.log('CallKit: Incoming call reported successfully', result);
123
+ return result.success;
124
+ }
125
+ catch (error) {
126
+ console.error('CallKit: Failed to report incoming call', error);
127
+ return false;
128
+ }
129
+ }
130
+ async answerCall(callUUID) {
131
+ if (!this.bridge || react_native_1.Platform.OS !== 'ios') {
132
+ console.warn('CallKit: Not available on this platform');
133
+ return false;
134
+ }
135
+ try {
136
+ // Convert to uppercase for iOS CallKit bridge
137
+ const uppercaseUUID = this.denormalizeUUID(callUUID);
138
+ console.log('CallKit: Answering call', { callUUID: uppercaseUUID });
139
+ const result = await this.bridge.answerCall(uppercaseUUID);
140
+ console.log('CallKit: Call answered successfully', result);
141
+ return result.success;
142
+ }
143
+ catch (error) {
144
+ console.error('CallKit: Failed to answer call', error);
145
+ return false;
146
+ }
147
+ }
148
+ async endCall(callUUID) {
149
+ if (!this.bridge || react_native_1.Platform.OS !== 'ios') {
150
+ console.warn('CallKit: Not available on this platform');
151
+ return false;
152
+ }
153
+ try {
154
+ // Convert to uppercase for iOS CallKit bridge
155
+ const uppercaseUUID = this.denormalizeUUID(callUUID);
156
+ console.log('CallKit: Ending call', { callUUID: uppercaseUUID });
157
+ const result = await this.bridge.endCall(uppercaseUUID);
158
+ console.log('CallKit: Call ended successfully', result);
159
+ return result.success;
160
+ }
161
+ catch (error) {
162
+ console.error('CallKit: Failed to end call', error);
163
+ return false;
164
+ }
165
+ }
166
+ async reportCallConnected(callUUID) {
167
+ if (!this.bridge || react_native_1.Platform.OS !== 'ios') {
168
+ return false;
169
+ }
170
+ try {
171
+ // Convert to uppercase for iOS CallKit bridge
172
+ const uppercaseUUID = this.denormalizeUUID(callUUID);
173
+ console.log('CallKit: Reporting call connected', { callUUID: uppercaseUUID });
174
+ const result = await this.bridge.reportCallConnected(uppercaseUUID);
175
+ console.log('CallKit: Call connected reported successfully', result);
176
+ return result.success;
177
+ }
178
+ catch (error) {
179
+ console.error('CallKit: Failed to report call connected', error);
180
+ return false;
181
+ }
182
+ }
183
+ async reportCallEnded(callUUID, reason = CallEndReason.RemoteEnded) {
184
+ if (!this.bridge || react_native_1.Platform.OS !== 'ios') {
185
+ return false;
186
+ }
187
+ try {
188
+ // Convert to uppercase for iOS CallKit bridge
189
+ const uppercaseUUID = this.denormalizeUUID(callUUID);
190
+ console.log('CallKit: Reporting call ended', { callUUID: uppercaseUUID, reason });
191
+ const result = await this.bridge.reportCallEnded(uppercaseUUID, reason);
192
+ console.log('CallKit: Call ended reported successfully', result);
193
+ return result.success;
194
+ }
195
+ catch (error) {
196
+ console.error('CallKit: Failed to report call ended', error);
197
+ return false;
198
+ }
199
+ }
200
+ async updateCall(callUUID, displayName, handle) {
201
+ if (!this.bridge || react_native_1.Platform.OS !== 'ios') {
202
+ return false;
203
+ }
204
+ try {
205
+ // Convert to uppercase for iOS CallKit bridge
206
+ const uppercaseUUID = this.denormalizeUUID(callUUID);
207
+ console.log('CallKit: Updating call', { callUUID: uppercaseUUID, displayName, handle });
208
+ const result = await this.bridge.updateCall(uppercaseUUID, displayName, handle);
209
+ console.log('CallKit: Call updated successfully', result);
210
+ return result.success;
211
+ }
212
+ catch (error) {
213
+ console.error('CallKit: Failed to update call', error);
214
+ return false;
215
+ }
216
+ }
217
+ async getActiveCalls() {
218
+ if (!this.bridge || react_native_1.Platform.OS !== 'ios') {
219
+ return [];
220
+ }
221
+ try {
222
+ const calls = await this.bridge.getActiveCalls();
223
+ console.log('CallKit: Active calls retrieved', calls);
224
+ return calls;
225
+ }
226
+ catch (error) {
227
+ console.error('CallKit: Failed to get active calls', error);
228
+ return [];
229
+ }
230
+ }
231
+ // Event listener management
232
+ onStartCall(listener) {
233
+ this.listeners.set('startCall', listener);
234
+ return () => this.listeners.delete('startCall');
235
+ }
236
+ onAnswerCall(listener) {
237
+ this.listeners.set('answerCall', listener);
238
+ return () => this.listeners.delete('answerCall');
239
+ }
240
+ onEndCall(listener) {
241
+ this.listeners.set('endCall', listener);
242
+ return () => this.listeners.delete('endCall');
243
+ }
244
+ onReceivePush(listener) {
245
+ this.listeners.set('receivePush', listener);
246
+ return () => this.listeners.delete('receivePush');
247
+ }
248
+ // Utility methods
249
+ generateCallUUID() {
250
+ return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
251
+ const r = (Math.random() * 16) | 0;
252
+ const v = c === 'x' ? r : (r & 0x3) | 0x8;
253
+ return v.toString(16);
254
+ });
255
+ }
256
+ isAvailable() {
257
+ return react_native_1.Platform.OS === 'ios' && this.bridge !== null;
258
+ }
259
+ }
260
+ // Export singleton instance
261
+ exports.CallKit = new CallKitManager();
262
+ exports.default = exports.CallKit;
@@ -0,0 +1,4 @@
1
+ export { default as CallKit, CallEndReason, type CallKitEvent } from './callkit';
2
+ export { default as callKitCoordinator } from './callkit-coordinator';
3
+ export { useCallKit } from './use-callkit';
4
+ export { useCallKitCoordinator } from '../hooks/use-callkit-coordinator';
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.useCallKitCoordinator = exports.useCallKit = exports.callKitCoordinator = exports.CallEndReason = exports.CallKit = void 0;
7
+ var callkit_1 = require("./callkit");
8
+ Object.defineProperty(exports, "CallKit", { enumerable: true, get: function () { return __importDefault(callkit_1).default; } });
9
+ Object.defineProperty(exports, "CallEndReason", { enumerable: true, get: function () { return callkit_1.CallEndReason; } });
10
+ var callkit_coordinator_1 = require("./callkit-coordinator");
11
+ Object.defineProperty(exports, "callKitCoordinator", { enumerable: true, get: function () { return __importDefault(callkit_coordinator_1).default; } });
12
+ var use_callkit_1 = require("./use-callkit");
13
+ Object.defineProperty(exports, "useCallKit", { enumerable: true, get: function () { return use_callkit_1.useCallKit; } });
14
+ var use_callkit_coordinator_1 = require("../hooks/use-callkit-coordinator");
15
+ Object.defineProperty(exports, "useCallKitCoordinator", { enumerable: true, get: function () { return use_callkit_coordinator_1.useCallKitCoordinator; } });
@@ -0,0 +1,21 @@
1
+ import { Call } from '@telnyx/react-native-voice-sdk';
2
+ import { TelnyxVoipClient } from '../telnyx-voip-client';
3
+ export declare function useCallKitCoordinator(): {
4
+ reportIncomingCall: (
5
+ call: Call,
6
+ callerName: string,
7
+ callerNumber: string
8
+ ) => Promise<string | null>;
9
+ startOutgoingCall: (
10
+ call: Call,
11
+ destinationNumber: string,
12
+ displayName?: string
13
+ ) => Promise<string | null>;
14
+ answerCallFromUI: (call: Call) => Promise<boolean>;
15
+ endCallFromUI: (call: Call) => Promise<boolean>;
16
+ getCallKitUUID: (call: Call) => string | null;
17
+ getWebRTCCall: (callKitUUID: string) => Call | null;
18
+ linkExistingCallKitCall: (call: Call, callKitUUID: string) => void;
19
+ isAvailable: () => boolean;
20
+ setVoipClient: (voipClient: TelnyxVoipClient) => void;
21
+ };
@@ -0,0 +1,53 @@
1
+ 'use strict';
2
+ var __importDefault =
3
+ (this && this.__importDefault) ||
4
+ function (mod) {
5
+ return mod && mod.__esModule ? mod : { default: mod };
6
+ };
7
+ Object.defineProperty(exports, '__esModule', { value: true });
8
+ exports.useCallKitCoordinator = useCallKitCoordinator;
9
+ const react_1 = require('react');
10
+ const callkit_coordinator_1 = __importDefault(require('./callkit-coordinator'));
11
+ function useCallKitCoordinator() {
12
+ const reportIncomingCall = (0, react_1.useCallback)(async (call, callerName, callerNumber) => {
13
+ return callkit_coordinator_1.default.reportIncomingCall(call, callerName, callerNumber);
14
+ }, []);
15
+ const startOutgoingCall = (0, react_1.useCallback)(
16
+ async (call, destinationNumber, displayName) => {
17
+ return callkit_coordinator_1.default.startOutgoingCall(call, destinationNumber, displayName);
18
+ },
19
+ []
20
+ );
21
+ const answerCallFromUI = (0, react_1.useCallback)(async (call) => {
22
+ return callkit_coordinator_1.default.answerCallFromUI(call);
23
+ }, []);
24
+ const endCallFromUI = (0, react_1.useCallback)(async (call) => {
25
+ return callkit_coordinator_1.default.endCallFromUI(call);
26
+ }, []);
27
+ const getCallKitUUID = (0, react_1.useCallback)((call) => {
28
+ return callkit_coordinator_1.default.getCallKitUUID(call);
29
+ }, []);
30
+ const getWebRTCCall = (0, react_1.useCallback)((callKitUUID) => {
31
+ return callkit_coordinator_1.default.getWebRTCCall(callKitUUID);
32
+ }, []);
33
+ const linkExistingCallKitCall = (0, react_1.useCallback)((call, callKitUUID) => {
34
+ callkit_coordinator_1.default.linkExistingCallKitCall(call, callKitUUID);
35
+ }, []);
36
+ const isAvailable = (0, react_1.useCallback)(() => {
37
+ return callkit_coordinator_1.default.isAvailable();
38
+ }, []);
39
+ const setVoipClient = (0, react_1.useCallback)((voipClient) => {
40
+ callkit_coordinator_1.default.setVoipClient(voipClient);
41
+ }, []);
42
+ return {
43
+ reportIncomingCall,
44
+ startOutgoingCall,
45
+ answerCallFromUI,
46
+ endCallFromUI,
47
+ getCallKitUUID,
48
+ getWebRTCCall,
49
+ linkExistingCallKitCall,
50
+ isAvailable,
51
+ setVoipClient,
52
+ };
53
+ }
@@ -0,0 +1,28 @@
1
+ import { Call } from '@telnyx/react-native-voice-sdk';
2
+ import { CallEndReason } from './callkit';
3
+ interface UseCallKitOptions {
4
+ onAnswerCall?: (callUUID: string) => void;
5
+ onEndCall?: (callUUID: string) => void;
6
+ onStartCall?: (callUUID: string) => void;
7
+ }
8
+ interface CallKitCall {
9
+ uuid: string;
10
+ handle: string;
11
+ displayName: string;
12
+ isActive: boolean;
13
+ direction: 'incoming' | 'outgoing';
14
+ }
15
+ export declare function useCallKit(options?: UseCallKitOptions): {
16
+ isAvailable: boolean;
17
+ activeCalls: CallKitCall[];
18
+ startOutgoingCall: (call: Call, handle?: string, displayName?: string) => Promise<string | null>;
19
+ reportIncomingCall: (call: Call, handle?: string, displayName?: string) => Promise<string | null>;
20
+ answerCall: (callUUID: string) => Promise<boolean>;
21
+ endCall: (callUUID: string, reason?: CallEndReason) => Promise<boolean>;
22
+ reportCallConnected: (callUUID: string) => Promise<boolean>;
23
+ updateCall: (callUUID: string, displayName: string, handle: string) => Promise<boolean>;
24
+ getCallKitUUID: (call: Call) => string | null;
25
+ integrateCall: (call: Call, direction: "incoming" | "outgoing") => Promise<string>;
26
+ generateCallUUID: () => string;
27
+ };
28
+ export {};