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.
- package/LICENSE +21 -0
- package/lib/commonjs/adapters/LiveKitRNAdapter.js +186 -0
- package/lib/commonjs/adapters/LiveKitRNAdapter.js.map +1 -0
- package/lib/commonjs/components/ActiveCallModal.js +129 -0
- package/lib/commonjs/components/ActiveCallModal.js.map +1 -0
- package/lib/commonjs/components/IncomingCallModal.js +86 -0
- package/lib/commonjs/components/IncomingCallModal.js.map +1 -0
- package/lib/commonjs/components/VoIPProvider.js +34 -0
- package/lib/commonjs/components/VoIPProvider.js.map +1 -0
- package/lib/commonjs/context/VoIPContext.js +17 -0
- package/lib/commonjs/context/VoIPContext.js.map +1 -0
- package/lib/commonjs/core/APIClient.js +107 -0
- package/lib/commonjs/core/APIClient.js.map +1 -0
- package/lib/commonjs/core/EventEmitter.js +33 -0
- package/lib/commonjs/core/EventEmitter.js.map +1 -0
- package/lib/commonjs/core/RNAudioManager.js +40 -0
- package/lib/commonjs/core/RNAudioManager.js.map +1 -0
- package/lib/commonjs/core/RNCallManager.js +335 -0
- package/lib/commonjs/core/RNCallManager.js.map +1 -0
- package/lib/commonjs/core/RNVoIPClient.js +135 -0
- package/lib/commonjs/core/RNVoIPClient.js.map +1 -0
- package/lib/commonjs/core/WebSocketManager.js +160 -0
- package/lib/commonjs/core/WebSocketManager.js.map +1 -0
- package/lib/commonjs/hooks/useVoIP.js +104 -0
- package/lib/commonjs/hooks/useVoIP.js.map +1 -0
- package/lib/commonjs/index.js +136 -0
- package/lib/commonjs/index.js.map +1 -0
- package/lib/commonjs/types.js +2 -0
- package/lib/commonjs/types.js.map +1 -0
- package/lib/module/adapters/LiveKitRNAdapter.js +179 -0
- package/lib/module/adapters/LiveKitRNAdapter.js.map +1 -0
- package/lib/module/components/ActiveCallModal.js +121 -0
- package/lib/module/components/ActiveCallModal.js.map +1 -0
- package/lib/module/components/IncomingCallModal.js +78 -0
- package/lib/module/components/IncomingCallModal.js.map +1 -0
- package/lib/module/components/VoIPProvider.js +27 -0
- package/lib/module/components/VoIPProvider.js.map +1 -0
- package/lib/module/context/VoIPContext.js +10 -0
- package/lib/module/context/VoIPContext.js.map +1 -0
- package/lib/module/core/APIClient.js +100 -0
- package/lib/module/core/APIClient.js.map +1 -0
- package/lib/module/core/EventEmitter.js +26 -0
- package/lib/module/core/EventEmitter.js.map +1 -0
- package/lib/module/core/RNAudioManager.js +32 -0
- package/lib/module/core/RNAudioManager.js.map +1 -0
- package/lib/module/core/RNCallManager.js +328 -0
- package/lib/module/core/RNCallManager.js.map +1 -0
- package/lib/module/core/RNVoIPClient.js +128 -0
- package/lib/module/core/RNVoIPClient.js.map +1 -0
- package/lib/module/core/WebSocketManager.js +153 -0
- package/lib/module/core/WebSocketManager.js.map +1 -0
- package/lib/module/hooks/useVoIP.js +98 -0
- package/lib/module/hooks/useVoIP.js.map +1 -0
- package/lib/module/index.js +12 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/types.js +2 -0
- package/lib/module/types.js.map +1 -0
- package/lib/typescript/adapters/LiveKitRNAdapter.d.ts +23 -0
- package/lib/typescript/adapters/LiveKitRNAdapter.d.ts.map +1 -0
- package/lib/typescript/components/ActiveCallModal.d.ts +14 -0
- package/lib/typescript/components/ActiveCallModal.d.ts.map +1 -0
- package/lib/typescript/components/IncomingCallModal.d.ts +10 -0
- package/lib/typescript/components/IncomingCallModal.d.ts.map +1 -0
- package/lib/typescript/components/VoIPProvider.d.ts +9 -0
- package/lib/typescript/components/VoIPProvider.d.ts.map +1 -0
- package/lib/typescript/context/VoIPContext.d.ts +21 -0
- package/lib/typescript/context/VoIPContext.d.ts.map +1 -0
- package/lib/typescript/core/APIClient.d.ts +17 -0
- package/lib/typescript/core/APIClient.d.ts.map +1 -0
- package/lib/typescript/core/EventEmitter.d.ts +10 -0
- package/lib/typescript/core/EventEmitter.d.ts.map +1 -0
- package/lib/typescript/core/RNAudioManager.d.ts +13 -0
- package/lib/typescript/core/RNAudioManager.d.ts.map +1 -0
- package/lib/typescript/core/RNCallManager.d.ts +39 -0
- package/lib/typescript/core/RNCallManager.d.ts.map +1 -0
- package/lib/typescript/core/RNVoIPClient.d.ts +38 -0
- package/lib/typescript/core/RNVoIPClient.d.ts.map +1 -0
- package/lib/typescript/core/WebSocketManager.d.ts +27 -0
- package/lib/typescript/core/WebSocketManager.d.ts.map +1 -0
- package/lib/typescript/hooks/useVoIP.d.ts +21 -0
- package/lib/typescript/hooks/useVoIP.d.ts.map +1 -0
- package/lib/typescript/index.d.ts +12 -0
- package/lib/typescript/index.d.ts.map +1 -0
- package/lib/typescript/types.d.ts +53 -0
- package/lib/typescript/types.d.ts.map +1 -0
- package/package.json +103 -0
- package/src/adapters/LiveKitRNAdapter.ts +199 -0
- package/src/components/ActiveCallModal.tsx +158 -0
- package/src/components/IncomingCallModal.tsx +75 -0
- package/src/components/VoIPProvider.tsx +41 -0
- package/src/context/VoIPContext.tsx +36 -0
- package/src/core/APIClient.ts +123 -0
- package/src/core/EventEmitter.ts +31 -0
- package/src/core/RNAudioManager.ts +37 -0
- package/src/core/RNCallManager.ts +340 -0
- package/src/core/RNVoIPClient.ts +183 -0
- package/src/core/WebSocketManager.ts +169 -0
- package/src/hooks/useVoIP.ts +114 -0
- package/src/index.ts +11 -0
- 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":[]}
|