zerorate-react-native-voip-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 (100) hide show
  1. package/LICENSE +21 -0
  2. package/lib/commonjs/adapters/LiveKitRNAdapter.js +186 -0
  3. package/lib/commonjs/adapters/LiveKitRNAdapter.js.map +1 -0
  4. package/lib/commonjs/components/ActiveCallModal.js +129 -0
  5. package/lib/commonjs/components/ActiveCallModal.js.map +1 -0
  6. package/lib/commonjs/components/IncomingCallModal.js +86 -0
  7. package/lib/commonjs/components/IncomingCallModal.js.map +1 -0
  8. package/lib/commonjs/components/VoIPProvider.js +34 -0
  9. package/lib/commonjs/components/VoIPProvider.js.map +1 -0
  10. package/lib/commonjs/context/VoIPContext.js +17 -0
  11. package/lib/commonjs/context/VoIPContext.js.map +1 -0
  12. package/lib/commonjs/core/APIClient.js +107 -0
  13. package/lib/commonjs/core/APIClient.js.map +1 -0
  14. package/lib/commonjs/core/EventEmitter.js +33 -0
  15. package/lib/commonjs/core/EventEmitter.js.map +1 -0
  16. package/lib/commonjs/core/RNAudioManager.js +40 -0
  17. package/lib/commonjs/core/RNAudioManager.js.map +1 -0
  18. package/lib/commonjs/core/RNCallManager.js +335 -0
  19. package/lib/commonjs/core/RNCallManager.js.map +1 -0
  20. package/lib/commonjs/core/RNVoIPClient.js +135 -0
  21. package/lib/commonjs/core/RNVoIPClient.js.map +1 -0
  22. package/lib/commonjs/core/WebSocketManager.js +160 -0
  23. package/lib/commonjs/core/WebSocketManager.js.map +1 -0
  24. package/lib/commonjs/hooks/useVoIP.js +104 -0
  25. package/lib/commonjs/hooks/useVoIP.js.map +1 -0
  26. package/lib/commonjs/index.js +136 -0
  27. package/lib/commonjs/index.js.map +1 -0
  28. package/lib/commonjs/types.js +2 -0
  29. package/lib/commonjs/types.js.map +1 -0
  30. package/lib/module/adapters/LiveKitRNAdapter.js +179 -0
  31. package/lib/module/adapters/LiveKitRNAdapter.js.map +1 -0
  32. package/lib/module/components/ActiveCallModal.js +121 -0
  33. package/lib/module/components/ActiveCallModal.js.map +1 -0
  34. package/lib/module/components/IncomingCallModal.js +78 -0
  35. package/lib/module/components/IncomingCallModal.js.map +1 -0
  36. package/lib/module/components/VoIPProvider.js +27 -0
  37. package/lib/module/components/VoIPProvider.js.map +1 -0
  38. package/lib/module/context/VoIPContext.js +10 -0
  39. package/lib/module/context/VoIPContext.js.map +1 -0
  40. package/lib/module/core/APIClient.js +100 -0
  41. package/lib/module/core/APIClient.js.map +1 -0
  42. package/lib/module/core/EventEmitter.js +26 -0
  43. package/lib/module/core/EventEmitter.js.map +1 -0
  44. package/lib/module/core/RNAudioManager.js +32 -0
  45. package/lib/module/core/RNAudioManager.js.map +1 -0
  46. package/lib/module/core/RNCallManager.js +328 -0
  47. package/lib/module/core/RNCallManager.js.map +1 -0
  48. package/lib/module/core/RNVoIPClient.js +128 -0
  49. package/lib/module/core/RNVoIPClient.js.map +1 -0
  50. package/lib/module/core/WebSocketManager.js +153 -0
  51. package/lib/module/core/WebSocketManager.js.map +1 -0
  52. package/lib/module/hooks/useVoIP.js +98 -0
  53. package/lib/module/hooks/useVoIP.js.map +1 -0
  54. package/lib/module/index.js +12 -0
  55. package/lib/module/index.js.map +1 -0
  56. package/lib/module/types.js +2 -0
  57. package/lib/module/types.js.map +1 -0
  58. package/lib/typescript/adapters/LiveKitRNAdapter.d.ts +23 -0
  59. package/lib/typescript/adapters/LiveKitRNAdapter.d.ts.map +1 -0
  60. package/lib/typescript/components/ActiveCallModal.d.ts +14 -0
  61. package/lib/typescript/components/ActiveCallModal.d.ts.map +1 -0
  62. package/lib/typescript/components/IncomingCallModal.d.ts +10 -0
  63. package/lib/typescript/components/IncomingCallModal.d.ts.map +1 -0
  64. package/lib/typescript/components/VoIPProvider.d.ts +9 -0
  65. package/lib/typescript/components/VoIPProvider.d.ts.map +1 -0
  66. package/lib/typescript/context/VoIPContext.d.ts +21 -0
  67. package/lib/typescript/context/VoIPContext.d.ts.map +1 -0
  68. package/lib/typescript/core/APIClient.d.ts +17 -0
  69. package/lib/typescript/core/APIClient.d.ts.map +1 -0
  70. package/lib/typescript/core/EventEmitter.d.ts +10 -0
  71. package/lib/typescript/core/EventEmitter.d.ts.map +1 -0
  72. package/lib/typescript/core/RNAudioManager.d.ts +13 -0
  73. package/lib/typescript/core/RNAudioManager.d.ts.map +1 -0
  74. package/lib/typescript/core/RNCallManager.d.ts +39 -0
  75. package/lib/typescript/core/RNCallManager.d.ts.map +1 -0
  76. package/lib/typescript/core/RNVoIPClient.d.ts +38 -0
  77. package/lib/typescript/core/RNVoIPClient.d.ts.map +1 -0
  78. package/lib/typescript/core/WebSocketManager.d.ts +27 -0
  79. package/lib/typescript/core/WebSocketManager.d.ts.map +1 -0
  80. package/lib/typescript/hooks/useVoIP.d.ts +21 -0
  81. package/lib/typescript/hooks/useVoIP.d.ts.map +1 -0
  82. package/lib/typescript/index.d.ts +12 -0
  83. package/lib/typescript/index.d.ts.map +1 -0
  84. package/lib/typescript/types.d.ts +53 -0
  85. package/lib/typescript/types.d.ts.map +1 -0
  86. package/package.json +103 -0
  87. package/src/adapters/LiveKitRNAdapter.ts +199 -0
  88. package/src/components/ActiveCallModal.tsx +158 -0
  89. package/src/components/IncomingCallModal.tsx +75 -0
  90. package/src/components/VoIPProvider.tsx +41 -0
  91. package/src/context/VoIPContext.tsx +36 -0
  92. package/src/core/APIClient.ts +123 -0
  93. package/src/core/EventEmitter.ts +31 -0
  94. package/src/core/RNAudioManager.ts +37 -0
  95. package/src/core/RNCallManager.ts +340 -0
  96. package/src/core/RNVoIPClient.ts +183 -0
  97. package/src/core/WebSocketManager.ts +169 -0
  98. package/src/hooks/useVoIP.ts +114 -0
  99. package/src/index.ts +11 -0
  100. package/src/types.ts +89 -0
@@ -0,0 +1,328 @@
1
+ import { EventEmitter } from "./EventEmitter";
2
+ export class RNCallManager extends EventEmitter {
3
+ state = "idle";
4
+ currentCall = null;
5
+ // private storageKey = "zrv:active-call";
6
+
7
+ constructor(apiClient, webSocketManager, liveKitManager, audioManager, userId, userName) {
8
+ super();
9
+ this.api = apiClient;
10
+ this.ws = webSocketManager;
11
+ this.livekit = liveKitManager;
12
+ this.audio = audioManager;
13
+ this.userId = userId;
14
+ this.userName = userName;
15
+ this.ws.on("message", m => this.handleSocketMessage(m));
16
+ }
17
+ getCallState() {
18
+ return this.state;
19
+ }
20
+ getCurrentCall() {
21
+ return this.currentCall;
22
+ }
23
+ persistActiveCall() {
24
+ // TODO: Implement AsyncStorage persistence if needed
25
+ }
26
+ clearPersistedCall() {
27
+ // TODO: Implement AsyncStorage persistence if needed
28
+ }
29
+ async resumeActiveCallIfAvailable() {
30
+ // TODO: Implement AsyncStorage persistence if needed
31
+ return false;
32
+ }
33
+ async initiateCall(calleeId, calleeName, options) {
34
+ if (this.state !== "idle") return;
35
+ this.setState("calling");
36
+ await this.audio.playOutgoing();
37
+ try {
38
+ const callType = (options === null || options === void 0 ? void 0 : options.callType) ?? "oneOnOne";
39
+ const isVideo = !!(options !== null && options !== void 0 && options.isVideo);
40
+ const businessId = options === null || options === void 0 ? void 0 : options.businessId;
41
+ if (callType === "oneOnOne") {
42
+ if (!calleeId || !calleeName) {
43
+ throw new Error("calleeId and calleeName are required for oneOnOne calls");
44
+ }
45
+ }
46
+ if (callType === "callCentre") {
47
+ if (!businessId) {
48
+ throw new Error("businessId is required for callCentre calls");
49
+ }
50
+ }
51
+ const res = await this.api.initiateCall({
52
+ callerId: this.userId,
53
+ callerName: this.userName,
54
+ ...(callType === "oneOnOne" ? {
55
+ calleeId,
56
+ calleeName
57
+ } : {
58
+ businessId
59
+ }),
60
+ callType,
61
+ isVideo
62
+ });
63
+ const call = {
64
+ callId: (res === null || res === void 0 ? void 0 : res.callId) ?? "",
65
+ roomName: (res === null || res === void 0 ? void 0 : res.roomName) ?? "",
66
+ token: (res === null || res === void 0 ? void 0 : res.token) ?? "",
67
+ livekitUrl: (res === null || res === void 0 ? void 0 : res.livekitUrl) ?? "",
68
+ participantId: this.userId,
69
+ participantName: this.userName,
70
+ ...(callType === "oneOnOne" ? {
71
+ calleeId,
72
+ calleeName
73
+ } : {}),
74
+ ...(callType === "callCentre" ? {
75
+ businessId
76
+ } : {}),
77
+ callType,
78
+ isVideo,
79
+ startTime: Date.now()
80
+ };
81
+ this.currentCall = call;
82
+ this.persistActiveCall();
83
+ } catch (e) {
84
+ this.audio.stop();
85
+ this.emit("call:error", {
86
+ error: e
87
+ });
88
+ this.setState("idle");
89
+ }
90
+ }
91
+ async acceptCall(callId) {
92
+ if (this.state !== "ringing") return;
93
+ const current = this.currentCall;
94
+ if (!current || current.callId !== callId) return;
95
+ try {
96
+ this.setState("connecting");
97
+ const res = await this.api.acceptCall(callId, this.userId);
98
+ this.currentCall = {
99
+ ...current,
100
+ roomName: res.roomName,
101
+ token: res.token,
102
+ livekitUrl: res.livekitUrl,
103
+ startTime: res.startedAt || res.timestamp || Date.now()
104
+ };
105
+ await this.livekit.connectToRoom(this.currentCall.livekitUrl, this.currentCall.token);
106
+ await this.livekit.enableMicrophone();
107
+ if (this.currentCall.isVideo) {
108
+ await this.livekit.enableVideo();
109
+ }
110
+ this.audio.stop();
111
+ this.setState("connected");
112
+ this.emit("call_accepted", {
113
+ callId: this.currentCall.callId
114
+ });
115
+ this.persistActiveCall();
116
+ } catch (e) {
117
+ if ((e === null || e === void 0 ? void 0 : e.status) === 409) {
118
+ this.emit("call_already_taken", {
119
+ callId
120
+ });
121
+ this.audio.stop();
122
+ this.cleanupCall();
123
+ return;
124
+ }
125
+ this.emit("call:error", {
126
+ callId,
127
+ error: e
128
+ });
129
+ }
130
+ }
131
+ async declineCall(callId) {
132
+ if (this.state !== "ringing") return;
133
+ try {
134
+ await this.api.declineCall(callId, this.userId);
135
+ this.audio.stop();
136
+ this.emit("call_declined", {
137
+ callId
138
+ });
139
+ this.cleanupCall();
140
+ } catch (e) {
141
+ this.emit("call:error", {
142
+ callId,
143
+ error: e
144
+ });
145
+ }
146
+ }
147
+ async endCall(callId) {
148
+ if (!this.currentCall || this.currentCall.callId !== callId) return;
149
+ if (this.state !== "connected" && this.state !== "connecting") return;
150
+ try {
151
+ await this.api.endCall(callId, this.userId);
152
+ } catch (_e) {
153
+ void 0;
154
+ }
155
+ this.finishCall();
156
+ }
157
+ async handleIncomingCall(data) {
158
+ if (this.state !== "idle") return;
159
+ this.setState("ringing");
160
+ await this.audio.playIncoming();
161
+ const call = {
162
+ callId: data.callId,
163
+ roomName: data.roomName ?? "",
164
+ token: data.token ?? "",
165
+ livekitUrl: data.livekitUrl ?? "",
166
+ participantId: data.callerId,
167
+ participantName: data.callerName,
168
+ businessId: data.businessId ?? undefined,
169
+ callType: data.callType ?? "oneOnOne",
170
+ isVideo: !!data.isVideo
171
+ };
172
+ this.currentCall = call;
173
+ this.emit("incoming_call", {
174
+ callId: call.callId,
175
+ callerId: call.participantId,
176
+ callerName: call.participantName,
177
+ businessId: call.businessId,
178
+ callType: call.callType,
179
+ isVideo: call.isVideo
180
+ });
181
+ }
182
+ async handleAccepted(payload) {
183
+ if (!this.currentCall) return;
184
+ if (this.state === "connected") return;
185
+ // Only the caller should join on server 'call_accepted' message.
186
+ // Callee already joined via acceptCall()
187
+ if (this.state !== "calling" && this.state !== "connecting") return;
188
+ try {
189
+ var _payload$data;
190
+ const callId = (payload === null || payload === void 0 ? void 0 : payload.callId) ?? (payload === null || payload === void 0 || (_payload$data = payload.data) === null || _payload$data === void 0 ? void 0 : _payload$data.callId) ?? this.currentCall.callId ?? "";
191
+
192
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
193
+ const patchFromPayload = src => {
194
+ if (!src) return;
195
+ const token = src.token ?? src.accessToken;
196
+ const livekitUrl = src.livekitUrl ?? src.url;
197
+ const roomName = src.roomName ?? src.room;
198
+ const startedAt = src.startedAt ?? src.timestamp;
199
+ this.currentCall = {
200
+ ...this.currentCall,
201
+ ...(roomName ? {
202
+ roomName
203
+ } : {}),
204
+ ...(token ? {
205
+ token
206
+ } : {}),
207
+ ...(livekitUrl ? {
208
+ livekitUrl
209
+ } : {}),
210
+ ...(startedAt ? {
211
+ startTime: startedAt
212
+ } : {})
213
+ };
214
+ };
215
+ patchFromPayload(payload);
216
+ patchFromPayload(payload === null || payload === void 0 ? void 0 : payload.data);
217
+ if ((!this.currentCall.token || !this.currentCall.livekitUrl) && callId) {
218
+ try {
219
+ const status = await this.api.getCallStatus(callId);
220
+ patchFromPayload(status);
221
+ patchFromPayload(status === null || status === void 0 ? void 0 : status.data);
222
+ } catch (_e) {
223
+ void 0;
224
+ }
225
+ }
226
+ if (!this.currentCall.token || !this.currentCall.livekitUrl) {
227
+ throw new Error("Missing LiveKit token or URL for call join");
228
+ }
229
+ this.setState("connecting");
230
+ await this.livekit.connectToRoom(this.currentCall.livekitUrl, this.currentCall.token);
231
+ await this.livekit.enableMicrophone();
232
+ if (this.currentCall.isVideo) {
233
+ await this.livekit.enableVideo();
234
+ }
235
+ this.audio.stop();
236
+ this.setState("connected");
237
+ this.emit("call_accepted", {
238
+ callId: this.currentCall.callId
239
+ });
240
+ this.persistActiveCall();
241
+ } catch (e) {
242
+ console.log(e);
243
+ this.emit("call:error", {
244
+ callId: this.currentCall.callId,
245
+ error: e
246
+ });
247
+ }
248
+ }
249
+ handleDeclined() {
250
+ if (!this.currentCall) return;
251
+ this.audio.stop();
252
+ this.emit("call_declined", {
253
+ callId: this.currentCall.callId
254
+ });
255
+ this.cleanupCall();
256
+ }
257
+ handleMissed() {
258
+ if (!this.currentCall) return;
259
+ this.audio.stop();
260
+ this.emit("call_missed", {
261
+ callId: this.currentCall.callId
262
+ });
263
+ this.cleanupCall();
264
+ }
265
+ handleEnded() {
266
+ if (!this.currentCall) return;
267
+ this.finishCall();
268
+ }
269
+
270
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
271
+ handleSocketMessage(message) {
272
+ const type = message === null || message === void 0 ? void 0 : message.type;
273
+ if (type === "incoming_call") this.handleIncomingCall(message.data ?? message);
274
+ if (type === "call_accepted") this.handleAccepted(message.data ?? message);
275
+ if (type === "call_declined") this.handleDeclined();
276
+ if (type === "call_missed") this.handleMissed();
277
+ if (type === "call_ended") this.handleEnded();
278
+ if (type === "call_taken") {
279
+ var _message$data;
280
+ const callId = (message === null || message === void 0 ? void 0 : message.callId) ?? (message === null || message === void 0 || (_message$data = message.data) === null || _message$data === void 0 ? void 0 : _message$data.callId);
281
+ this.emit("call_taken", {
282
+ callId,
283
+ userId: message === null || message === void 0 ? void 0 : message.userId
284
+ });
285
+ if (this.currentCall && this.currentCall.callId === callId) {
286
+ this.audio.stop();
287
+ this.cleanupCall();
288
+ }
289
+ }
290
+ if (type === "call_already_taken") {
291
+ var _message$data2;
292
+ const callId = (message === null || message === void 0 ? void 0 : message.callId) ?? (message === null || message === void 0 || (_message$data2 = message.data) === null || _message$data2 === void 0 ? void 0 : _message$data2.callId);
293
+ this.emit("call_already_taken", {
294
+ callId
295
+ });
296
+ if (this.currentCall && this.currentCall.callId === callId) {
297
+ this.audio.stop();
298
+ this.cleanupCall();
299
+ }
300
+ }
301
+ }
302
+ setState(next) {
303
+ const prev = this.state;
304
+ this.state = next;
305
+ this.emit("state:changed", {
306
+ oldState: prev,
307
+ newState: next
308
+ });
309
+ }
310
+ finishCall() {
311
+ var _this$currentCall, _this$currentCall2;
312
+ const callId = ((_this$currentCall = this.currentCall) === null || _this$currentCall === void 0 ? void 0 : _this$currentCall.callId) ?? "";
313
+ const start = ((_this$currentCall2 = this.currentCall) === null || _this$currentCall2 === void 0 ? void 0 : _this$currentCall2.startTime) ?? Date.now();
314
+ const duration = Math.max(0, Math.floor((Date.now() - start) / 1000));
315
+ this.livekit.disconnectFromRoom();
316
+ this.emit("call_ended", {
317
+ callId,
318
+ duration
319
+ });
320
+ this.cleanupCall();
321
+ }
322
+ cleanupCall() {
323
+ this.currentCall = null;
324
+ this.setState("idle");
325
+ this.clearPersistedCall();
326
+ }
327
+ }
328
+ //# sourceMappingURL=RNCallManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["EventEmitter","RNCallManager","state","currentCall","constructor","apiClient","webSocketManager","liveKitManager","audioManager","userId","userName","api","ws","livekit","audio","on","m","handleSocketMessage","getCallState","getCurrentCall","persistActiveCall","clearPersistedCall","resumeActiveCallIfAvailable","initiateCall","calleeId","calleeName","options","setState","playOutgoing","callType","isVideo","businessId","Error","res","callerId","callerName","call","callId","roomName","token","livekitUrl","participantId","participantName","startTime","Date","now","e","stop","emit","error","acceptCall","current","startedAt","timestamp","connectToRoom","enableMicrophone","enableVideo","status","cleanupCall","declineCall","endCall","_e","finishCall","handleIncomingCall","data","playIncoming","undefined","handleAccepted","payload","_payload$data","patchFromPayload","src","accessToken","url","room","getCallStatus","console","log","handleDeclined","handleMissed","handleEnded","message","type","_message$data","_message$data2","next","prev","oldState","newState","_this$currentCall","_this$currentCall2","start","duration","Math","max","floor","disconnectFromRoom"],"sourceRoot":"../../../src","sources":["core/RNCallManager.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,128 @@
1
+ import { EventEmitter } from "./EventEmitter";
2
+ import { WebSocketManager } from "./WebSocketManager";
3
+ import { APIClient } from "./APIClient";
4
+ import { LiveKitRNAdapter } from "../adapters/LiveKitRNAdapter";
5
+ import { RNAudioManager } from "./RNAudioManager";
6
+ import { RNCallManager } from "./RNCallManager";
7
+ export class RNVoIPClient {
8
+ emitter = new EventEmitter();
9
+ microphoneEnabled = true;
10
+ videoEnabled = false;
11
+ constructor(config) {
12
+ this.config = {
13
+ enableUI: true,
14
+ // In RN, UI is usually handled by user or separate components
15
+ autoReconnect: true,
16
+ debug: false,
17
+ ...config
18
+ };
19
+ this.ws = new WebSocketManager(this.config.wsUrl, this.config.authToken, !!this.config.autoReconnect, !!this.config.debug, this.config.userId);
20
+ this.api = new APIClient(this.config.backendUrl, this.config.authToken);
21
+ this.livekit = this.config.mediaAdapter ?? new LiveKitRNAdapter();
22
+ this.audio = new RNAudioManager(this.config.ringTones);
23
+ this.calls = new RNCallManager(this.api, this.ws, this.livekit, this.audio, this.config.userId, this.config.userName);
24
+ this.bindEvents();
25
+ this.audio.preloadRingtones();
26
+
27
+ // Check for existing call on startup
28
+ // setTimeout(() => {
29
+ // this.calls.resumeActiveCallIfAvailable();
30
+ // }, 0);
31
+ }
32
+ bindEvents() {
33
+ const forward = e => data => this.emitter.emit(e, data);
34
+ this.ws.on("connected", forward("connected"));
35
+ this.ws.on("disconnected", forward("disconnected"));
36
+ this.ws.on("reconnecting", forward("reconnecting"));
37
+ this.ws.on("error", forward("error"));
38
+ this.calls.on("state:changed", forward("state:changed"));
39
+ this.calls.on("incoming_call", forward("incoming_call"));
40
+ this.calls.on("call_taken", forward("call_taken"));
41
+ this.calls.on("call_already_taken", forward("call_already_taken"));
42
+ this.calls.on("call_started", forward("call_started"));
43
+ this.calls.on("call_accepted", forward("call_accepted"));
44
+ this.calls.on("call_declined", forward("call_declined"));
45
+ this.calls.on("call_missed", forward("call_missed"));
46
+ this.calls.on("call_ended", forward("call_ended"));
47
+ this.calls.on("call:error", forward("call:error"));
48
+ this.livekit.on("media:microphone-changed", data => {
49
+ this.microphoneEnabled = data.enabled;
50
+ this.emitter.emit("media:microphone-changed", data);
51
+ });
52
+ this.livekit.on("media:video-changed", data => {
53
+ this.videoEnabled = data.enabled;
54
+ this.emitter.emit("media:video-changed", data);
55
+ });
56
+ this.livekit.on("media:track-added", forward("media:track-added"));
57
+ this.livekit.on("media:track-removed", forward("media:track-removed"));
58
+ this.livekit.on("media:local-track-added", forward("media:local-track-added"));
59
+ this.livekit.on("media:local-track-removed", forward("media:local-track-removed"));
60
+ this.livekit.on("livekit:error", forward("error"));
61
+ }
62
+
63
+ // Public API
64
+
65
+ on(event, callback) {
66
+ this.emitter.on(event, callback);
67
+ }
68
+ off(event, callback) {
69
+ this.emitter.off(event, callback);
70
+ }
71
+ async connect() {
72
+ await this.ws.connect();
73
+ }
74
+ disconnect() {
75
+ var _this$calls$getCurren;
76
+ this.ws.disconnect();
77
+ this.calls.endCall(((_this$calls$getCurren = this.calls.getCurrentCall()) === null || _this$calls$getCurren === void 0 ? void 0 : _this$calls$getCurren.callId) ?? "");
78
+ }
79
+ async initiateCall(calleeId, calleeName, options) {
80
+ return this.calls.initiateCall(calleeId, calleeName, options ?? {});
81
+ }
82
+ async acceptCall(callId) {
83
+ return this.calls.acceptCall(callId);
84
+ }
85
+ async declineCall(callId) {
86
+ return this.calls.declineCall(callId);
87
+ }
88
+ async endCall(callId) {
89
+ return this.calls.endCall(callId);
90
+ }
91
+ async toggleMicrophone() {
92
+ return this.livekit.toggleMicrophone();
93
+ }
94
+ async toggleVideo() {
95
+ return this.livekit.toggleVideo();
96
+ }
97
+ isMicrophoneEnabled() {
98
+ return this.microphoneEnabled;
99
+ }
100
+ isVideoEnabled() {
101
+ return this.videoEnabled;
102
+ }
103
+ getCallState() {
104
+ return this.calls.getCallState();
105
+ }
106
+ getCurrentCall() {
107
+ return this.calls.getCurrentCall();
108
+ }
109
+ getLocalTracks() {
110
+ return this.livekit.getLocalTracks();
111
+ }
112
+ getRemoteTracks() {
113
+ return this.livekit.getRemoteTracks();
114
+ }
115
+ getParticipants() {
116
+ return this.livekit.getParticipants();
117
+ }
118
+ getLocalParticipant() {
119
+ return this.livekit.getLocalParticipant();
120
+ }
121
+ setAuthToken(token) {
122
+ this.config.authToken = token;
123
+ this.api.setAuthToken(token);
124
+ // WS might need reconnect if token changed?
125
+ // Usually token is for initial handshake.
126
+ }
127
+ }
128
+ //# sourceMappingURL=RNVoIPClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["EventEmitter","WebSocketManager","APIClient","LiveKitRNAdapter","RNAudioManager","RNCallManager","RNVoIPClient","emitter","microphoneEnabled","videoEnabled","constructor","config","enableUI","autoReconnect","debug","ws","wsUrl","authToken","userId","api","backendUrl","livekit","mediaAdapter","audio","ringTones","calls","userName","bindEvents","preloadRingtones","forward","e","data","emit","on","enabled","event","callback","off","connect","disconnect","_this$calls$getCurren","endCall","getCurrentCall","callId","initiateCall","calleeId","calleeName","options","acceptCall","declineCall","toggleMicrophone","toggleVideo","isMicrophoneEnabled","isVideoEnabled","getCallState","getLocalTracks","getRemoteTracks","getParticipants","getLocalParticipant","setAuthToken","token"],"sourceRoot":"../../../src","sources":["core/RNVoIPClient.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,153 @@
1
+ import { EventEmitter } from "./EventEmitter";
2
+ export class WebSocketManager extends EventEmitter {
3
+ state = "disconnected";
4
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
5
+ queue = [];
6
+ // ReturnType<typeof setTimeout>
7
+
8
+ // ReturnType<typeof setTimeout>
9
+ reconnectAttempts = 0;
10
+ constructor(wsUrl, authToken, autoReconnect = true, debug = false, userId) {
11
+ super();
12
+ this.url = wsUrl;
13
+ this.authToken = authToken;
14
+ this.autoReconnect = autoReconnect;
15
+ this.debug = debug;
16
+ this.userId = userId;
17
+ }
18
+ getState() {
19
+ return this.state;
20
+ }
21
+ isConnected() {
22
+ return this.state === "connected";
23
+ }
24
+ async connect() {
25
+ if (this.ws && (this.state === "connecting" || this.state === "connected")) return;
26
+ this.state = "connecting";
27
+ try {
28
+ this.ws = new WebSocket(this.url);
29
+ this.ws.onopen = () => {
30
+ this.state = "connected";
31
+ this.emit("connected");
32
+ // Send authenticate handshake as JSON
33
+ if (this.userId && this.authToken) {
34
+ this.send({
35
+ type: "authenticate",
36
+ userId: this.userId,
37
+ token: this.authToken
38
+ });
39
+ } else if (this.authToken) {
40
+ this.send({
41
+ type: "authenticate",
42
+ token: this.authToken
43
+ });
44
+ }
45
+ this.flushQueue();
46
+ this.startHeartbeat();
47
+ this.reconnectAttempts = 0;
48
+ };
49
+ this.ws.onmessage = ev => {
50
+ let parsed = null;
51
+ if (typeof ev.data === "string") {
52
+ try {
53
+ parsed = JSON.parse(ev.data);
54
+ } catch (_e) {
55
+ parsed = ev.data;
56
+ }
57
+ } else {
58
+ parsed = ev.data;
59
+ }
60
+ const t = parsed && typeof parsed === "object" ? parsed.type : undefined;
61
+ if (t === "pong" || t === "heartbeat_ack" || t === "heartbeat") {
62
+ if (this.pongTimeoutId) {
63
+ clearTimeout(this.pongTimeoutId);
64
+ this.pongTimeoutId = undefined;
65
+ }
66
+ return;
67
+ }
68
+ this.emit("message", parsed);
69
+ };
70
+ this.ws.onerror = e => {
71
+ this.state = "error";
72
+ this.emit("error", {
73
+ type: "network",
74
+ error: e
75
+ });
76
+ };
77
+ this.ws.onclose = () => {
78
+ this.stopHeartbeat();
79
+ const wasConnected = this.state === "connected";
80
+ this.state = "disconnected";
81
+ this.emit("disconnected");
82
+ if (this.autoReconnect) {
83
+ this.scheduleReconnect(wasConnected);
84
+ }
85
+ };
86
+ } catch (e) {
87
+ this.state = "error";
88
+ this.emit("error", {
89
+ type: "network",
90
+ error: e
91
+ });
92
+ }
93
+ }
94
+ disconnect() {
95
+ this.autoReconnect = false;
96
+ this.stopHeartbeat();
97
+ if (this.ws) {
98
+ this.ws.close();
99
+ this.ws = undefined;
100
+ }
101
+ this.state = "disconnected";
102
+ }
103
+ send(data) {
104
+ if (this.state === "connected" && this.ws) {
105
+ try {
106
+ this.ws.send(JSON.stringify(data));
107
+ } catch (e) {
108
+ if (this.debug) console.error("WS send error", e);
109
+ }
110
+ } else {
111
+ this.queue.push(data);
112
+ }
113
+ }
114
+ flushQueue() {
115
+ while (this.queue.length > 0 && this.state === "connected") {
116
+ const msg = this.queue.shift();
117
+ this.send(msg);
118
+ }
119
+ }
120
+ startHeartbeat() {
121
+ this.stopHeartbeat();
122
+ this.heartbeatId = setInterval(() => {
123
+ if (this.state === "connected") {
124
+ this.send({
125
+ type: "ping"
126
+ });
127
+ this.pongTimeoutId = setTimeout(() => {
128
+ // No pong received
129
+ if (this.ws) this.ws.close();
130
+ }, 5000);
131
+ }
132
+ }, 15000);
133
+ }
134
+ stopHeartbeat() {
135
+ if (this.heartbeatId) {
136
+ clearInterval(this.heartbeatId);
137
+ this.heartbeatId = undefined;
138
+ }
139
+ if (this.pongTimeoutId) {
140
+ clearTimeout(this.pongTimeoutId);
141
+ this.pongTimeoutId = undefined;
142
+ }
143
+ }
144
+ scheduleReconnect(wasConnected) {
145
+ // Use wasConnected to determine backoff strategy if needed
146
+ const delay = wasConnected ? 1000 : Math.min(1000 * Math.pow(2, this.reconnectAttempts), 30000);
147
+ this.reconnectAttempts++;
148
+ setTimeout(() => {
149
+ this.connect();
150
+ }, delay);
151
+ }
152
+ }
153
+ //# sourceMappingURL=WebSocketManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["EventEmitter","WebSocketManager","state","queue","reconnectAttempts","constructor","wsUrl","authToken","autoReconnect","debug","userId","url","getState","isConnected","connect","ws","WebSocket","onopen","emit","send","type","token","flushQueue","startHeartbeat","onmessage","ev","parsed","data","JSON","parse","_e","t","undefined","pongTimeoutId","clearTimeout","onerror","e","error","onclose","stopHeartbeat","wasConnected","scheduleReconnect","disconnect","close","stringify","console","push","length","msg","shift","heartbeatId","setInterval","setTimeout","clearInterval","delay","Math","min","pow"],"sourceRoot":"../../../src","sources":["core/WebSocketManager.ts"],"mappings":"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","ignoreList":[]}