@cemscale-voip/voip-sdk 1.25.1 → 1.25.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.
package/dist/webrtc.js ADDED
@@ -0,0 +1,624 @@
1
+ // ============================================================
2
+ // @cemscale/voip-sdk — WebRTC SIP Client (SIP.js 0.21 wrapper)
3
+ // ============================================================
4
+ import { UserAgent, Registerer, RegistererState, Invitation, Inviter, SessionState } from 'sip.js';
5
+ /**
6
+ * WebRTCPhone wraps SIP.js 0.21 to provide a high-level phone interface.
7
+ *
8
+ * Hold uses the native SIP.js `sessionDescriptionHandlerOptionsReInvite.hold`
9
+ * API, which internally calls `SessionDescriptionHandler.updateDirection()` to
10
+ * set transceiver directions correctly before generating the SDP offer.
11
+ *
12
+ * Transfer uses SIP REFER (blind) or REFER with Replaces (attended).
13
+ *
14
+ * Usage:
15
+ * const phone = new WebRTCPhone({
16
+ * sipDomain: 'demo.sip.cemscale.com',
17
+ * wsUri: 'wss://sip.cemscale.com/ws',
18
+ * extension: '1001',
19
+ * password: 'secret',
20
+ * });
21
+ * await phone.start();
22
+ * phone.on('incomingCall', (call) => { ... });
23
+ * phone.call('1002');
24
+ */
25
+ export class WebRTCPhone {
26
+ config;
27
+ ua = null;
28
+ registerer = null;
29
+ currentSession = null;
30
+ currentCallInfo = null;
31
+ heldState = false;
32
+ mutedState = false;
33
+ holdPending = false;
34
+ listeners = new Map();
35
+ audioElement;
36
+ registered = false;
37
+ constructor(config) {
38
+ this.config = config;
39
+ this.audioElement = config.audioElement || document.createElement('audio');
40
+ this.audioElement.autoplay = true;
41
+ }
42
+ // -------------------------------------------------------------------
43
+ // Event emitter
44
+ // -------------------------------------------------------------------
45
+ on(event, callback) {
46
+ if (!this.listeners.has(event)) {
47
+ this.listeners.set(event, new Set());
48
+ }
49
+ this.listeners.get(event).add(callback);
50
+ return () => {
51
+ this.listeners.get(event)?.delete(callback);
52
+ };
53
+ }
54
+ emit(event, ...args) {
55
+ const handlers = this.listeners.get(event);
56
+ if (handlers) {
57
+ for (const handler of handlers) {
58
+ try {
59
+ handler(...args);
60
+ }
61
+ catch (err) {
62
+ console.error(`[WebRTCPhone] Event handler error for "${event}":`, err);
63
+ }
64
+ }
65
+ }
66
+ }
67
+ // -------------------------------------------------------------------
68
+ // Lifecycle
69
+ // -------------------------------------------------------------------
70
+ /** Start the SIP User Agent and register */
71
+ async start() {
72
+ const uri = UserAgent.makeURI(`sip:${this.config.extension}@${this.config.sipDomain}`);
73
+ if (!uri) {
74
+ throw new Error(`Invalid SIP URI: sip:${this.config.extension}@${this.config.sipDomain}`);
75
+ }
76
+ const iceServers = this.config.turnServers || [
77
+ { urls: 'stun:stun.l.google.com:19302' },
78
+ ];
79
+ this.ua = new UserAgent({
80
+ uri,
81
+ transportOptions: {
82
+ server: this.config.wsUri,
83
+ connectionTimeout: 10,
84
+ keepAliveInterval: 25,
85
+ reconnectionAttempts: 3,
86
+ reconnectionDelay: 4,
87
+ },
88
+ authorizationUsername: this.config.extension,
89
+ authorizationPassword: this.config.password,
90
+ displayName: this.config.displayName || this.config.extension,
91
+ sessionDescriptionHandlerFactoryOptions: {
92
+ peerConnectionConfiguration: {
93
+ iceServers,
94
+ },
95
+ },
96
+ delegate: {
97
+ onInvite: (invitation) => {
98
+ this.handleIncomingCall(invitation);
99
+ },
100
+ },
101
+ logLevel: 'warn',
102
+ });
103
+ await this.ua.start();
104
+ // Monitor transport connect/disconnect for auto-re-registration
105
+ if (this.ua.transport) {
106
+ const transport = this.ua.transport;
107
+ const origOnDisconnect = transport.onDisconnect;
108
+ transport.onDisconnect = (error) => {
109
+ this.registered = false;
110
+ this.emit('unregistered');
111
+ console.warn('[WebRTCPhone] Transport disconnected', error?.message || '');
112
+ if (origOnDisconnect)
113
+ origOnDisconnect.call(transport, error);
114
+ };
115
+ const origOnConnect = transport.onConnect;
116
+ transport.onConnect = () => {
117
+ console.log('[WebRTCPhone] Transport reconnected, re-registering...');
118
+ if (origOnConnect)
119
+ origOnConnect.call(transport);
120
+ // Re-register after transport reconnects
121
+ if (this.registerer) {
122
+ this.registerer.register().catch((err) => {
123
+ console.error('[WebRTCPhone] Re-registration failed:', err);
124
+ this.emit('registrationFailed', err instanceof Error ? err : new Error(String(err)));
125
+ });
126
+ }
127
+ };
128
+ }
129
+ this.registerer = new Registerer(this.ua, { expires: 300 });
130
+ this.registerer.stateChange.addListener((state) => {
131
+ switch (state) {
132
+ case RegistererState.Registered:
133
+ this.registered = true;
134
+ this.emit('registered');
135
+ break;
136
+ case RegistererState.Unregistered:
137
+ case RegistererState.Terminated:
138
+ this.registered = false;
139
+ this.emit('unregistered');
140
+ break;
141
+ }
142
+ });
143
+ try {
144
+ await this.registerer.register();
145
+ }
146
+ catch (err) {
147
+ this.registered = false;
148
+ this.emit('registrationFailed', err instanceof Error ? err : new Error(String(err)));
149
+ throw err;
150
+ }
151
+ }
152
+ /** Stop the SIP User Agent */
153
+ async stop() {
154
+ if (this.currentSession) {
155
+ try {
156
+ await this.hangup();
157
+ }
158
+ catch { /* ignore */ }
159
+ }
160
+ if (this.registerer) {
161
+ try {
162
+ await this.registerer.unregister();
163
+ }
164
+ catch { /* ignore */ }
165
+ this.registerer = null;
166
+ }
167
+ if (this.ua) {
168
+ try {
169
+ await this.ua.stop();
170
+ }
171
+ catch { /* ignore */ }
172
+ this.ua = null;
173
+ }
174
+ this.registered = false;
175
+ this.currentSession = null;
176
+ this.currentCallInfo = null;
177
+ this.heldState = false;
178
+ this.mutedState = false;
179
+ }
180
+ isRegistered() {
181
+ return this.registered;
182
+ }
183
+ /** Get the SIP domain for this phone instance */
184
+ getSipDomain() {
185
+ return this.config.sipDomain;
186
+ }
187
+ /** Get the underlying SIP.js Session (for advanced use) */
188
+ getSession() {
189
+ return this.currentSession;
190
+ }
191
+ /** Get current call info (snapshot) */
192
+ getCurrentCall() {
193
+ return this.currentCallInfo ? { ...this.currentCallInfo } : null;
194
+ }
195
+ // -------------------------------------------------------------------
196
+ // Outbound calls
197
+ // -------------------------------------------------------------------
198
+ async call(target) {
199
+ if (!this.ua)
200
+ throw new Error('UserAgent not started. Call start() first.');
201
+ if (this.currentSession)
202
+ throw new Error('A call is already in progress.');
203
+ const targetUri = UserAgent.makeURI(`sip:${target}@${this.config.sipDomain}`);
204
+ if (!targetUri)
205
+ throw new Error(`Invalid target: ${target}`);
206
+ const inviter = new Inviter(this.ua, targetUri, {
207
+ sessionDescriptionHandlerOptions: {
208
+ constraints: { audio: true, video: false },
209
+ },
210
+ });
211
+ this.currentSession = inviter;
212
+ this.heldState = false;
213
+ this.mutedState = false;
214
+ this.currentCallInfo = {
215
+ id: inviter.id,
216
+ direction: 'outbound',
217
+ remoteIdentity: target,
218
+ remoteDisplayName: target,
219
+ state: 'connecting',
220
+ startTime: new Date(),
221
+ answerTime: null,
222
+ held: false,
223
+ muted: false,
224
+ dtmfSent: '',
225
+ };
226
+ this.setupSessionHandlers(inviter);
227
+ await inviter.invite();
228
+ this.emitCallState();
229
+ return { ...this.currentCallInfo };
230
+ }
231
+ // -------------------------------------------------------------------
232
+ // Inbound calls
233
+ // -------------------------------------------------------------------
234
+ handleIncomingCall(invitation) {
235
+ if (this.currentSession) {
236
+ // Reject with 486 Busy Here and notify consumer of missed call
237
+ invitation.reject({ statusCode: 486 });
238
+ const remoteUri = invitation.remoteIdentity.uri;
239
+ this.emit('callStateChanged', {
240
+ id: invitation.id,
241
+ direction: 'inbound',
242
+ remoteIdentity: remoteUri.user || 'unknown',
243
+ remoteDisplayName: invitation.remoteIdentity.displayName || remoteUri.user || 'unknown',
244
+ state: 'terminated',
245
+ startTime: new Date(),
246
+ answerTime: null,
247
+ held: false,
248
+ muted: false,
249
+ dtmfSent: '',
250
+ });
251
+ return;
252
+ }
253
+ this.currentSession = invitation;
254
+ this.heldState = false;
255
+ this.mutedState = false;
256
+ const remoteUri = invitation.remoteIdentity.uri;
257
+ this.currentCallInfo = {
258
+ id: invitation.id,
259
+ direction: 'inbound',
260
+ remoteIdentity: remoteUri.user || 'unknown',
261
+ remoteDisplayName: invitation.remoteIdentity.displayName || remoteUri.user || 'unknown',
262
+ state: 'ringing',
263
+ startTime: new Date(),
264
+ answerTime: null,
265
+ held: false,
266
+ muted: false,
267
+ dtmfSent: '',
268
+ };
269
+ this.setupSessionHandlers(invitation);
270
+ this.emit('incomingCall', { ...this.currentCallInfo });
271
+ if (this.config.autoAnswer) {
272
+ this.answer().catch((err) => {
273
+ this.emit('error', new Error(`Auto-answer failed: ${err.message}`));
274
+ });
275
+ }
276
+ }
277
+ async answer() {
278
+ if (!this.currentSession || !(this.currentSession instanceof Invitation)) {
279
+ throw new Error('No incoming call to answer');
280
+ }
281
+ await this.currentSession.accept({
282
+ sessionDescriptionHandlerOptions: {
283
+ constraints: { audio: true, video: false },
284
+ },
285
+ });
286
+ }
287
+ async reject() {
288
+ if (!this.currentSession || !(this.currentSession instanceof Invitation)) {
289
+ throw new Error('No incoming call to reject');
290
+ }
291
+ await this.currentSession.reject();
292
+ this.clearSession();
293
+ }
294
+ // -------------------------------------------------------------------
295
+ // Session controls
296
+ // -------------------------------------------------------------------
297
+ async hangup() {
298
+ if (!this.currentSession)
299
+ throw new Error('No active call');
300
+ const session = this.currentSession;
301
+ try {
302
+ switch (session.state) {
303
+ case SessionState.Initial:
304
+ case SessionState.Establishing:
305
+ if (session instanceof Inviter)
306
+ await session.cancel();
307
+ else if (session instanceof Invitation)
308
+ await session.reject();
309
+ break;
310
+ case SessionState.Established:
311
+ await session.bye();
312
+ break;
313
+ case SessionState.Terminated:
314
+ break;
315
+ default:
316
+ try {
317
+ await session.bye();
318
+ }
319
+ catch { /* ignore */ }
320
+ break;
321
+ }
322
+ }
323
+ catch (err) {
324
+ console.error('[WebRTCPhone] Hangup error:', err);
325
+ }
326
+ this.clearSession();
327
+ }
328
+ /**
329
+ * Hold/unhold the current call.
330
+ *
331
+ * Uses the SIP.js 0.21 native hold API:
332
+ * `session.sessionDescriptionHandlerOptionsReInvite.hold = true/false`
333
+ *
334
+ * SIP.js internally calls `SessionDescriptionHandler.updateDirection()` which
335
+ * correctly sets transceiver directions (sendonly for hold, sendrecv for resume)
336
+ * before generating the SDP offer. This is the same pattern used by SIP.js's
337
+ * own SessionManager.setHold().
338
+ *
339
+ * The re-INVITE is sent to FreeSWITCH which activates/deactivates music-on-hold.
340
+ */
341
+ async toggleHold() {
342
+ if (!this.currentSession || this.currentSession.state !== SessionState.Established) {
343
+ throw new Error('No established call to hold');
344
+ }
345
+ if (!this.currentCallInfo)
346
+ throw new Error('No call info');
347
+ if (this.holdPending)
348
+ throw new Error('Hold operation already in progress');
349
+ this.holdPending = true;
350
+ const newHeld = !this.heldState;
351
+ const session = this.currentSession;
352
+ // Step 1: Set hold flag on SDH options (SIP.js native API)
353
+ // This is read by SessionDescriptionHandler.updateDirection() when generating the offer
354
+ const sdhOptions = session.sessionDescriptionHandlerOptionsReInvite;
355
+ sdhOptions.hold = newHeld;
356
+ session.sessionDescriptionHandlerOptionsReInvite = sdhOptions;
357
+ // Step 2: Preemptively update state and disable/enable tracks
358
+ this.heldState = newHeld;
359
+ this.currentCallInfo.held = newHeld;
360
+ this.currentCallInfo.state = newHeld ? 'held' : 'established';
361
+ this.enableReceiverTracks(!newHeld);
362
+ this.enableSenderTracks(!newHeld && !this.mutedState);
363
+ this.emitCallState();
364
+ // Step 3: Send re-INVITE
365
+ try {
366
+ await session.invite({
367
+ requestDelegate: {
368
+ onAccept: () => {
369
+ console.log(`[WebRTCPhone] Hold ${newHeld ? 'ON' : 'OFF'}: accepted`);
370
+ this.holdPending = false;
371
+ // Confirm state — already set preemptively
372
+ this.emit('holdSucceeded', newHeld);
373
+ },
374
+ onReject: () => {
375
+ console.warn(`[WebRTCPhone] Hold re-INVITE rejected`);
376
+ this.holdPending = false;
377
+ this.revertHold(!newHeld);
378
+ this.emit('holdFailed', new Error('Hold re-INVITE rejected by server'));
379
+ },
380
+ },
381
+ });
382
+ }
383
+ catch (err) {
384
+ console.error('[WebRTCPhone] Hold re-INVITE failed:', err);
385
+ this.holdPending = false;
386
+ this.revertHold(!newHeld);
387
+ this.emit('holdFailed', new Error(`Hold failed: ${err.message}`));
388
+ throw err;
389
+ }
390
+ return newHeld;
391
+ }
392
+ /** Revert hold state after failure */
393
+ revertHold(revertTo) {
394
+ if (!this.currentSession || !this.currentCallInfo)
395
+ return;
396
+ const opts = this.currentSession.sessionDescriptionHandlerOptionsReInvite;
397
+ opts.hold = revertTo;
398
+ this.currentSession.sessionDescriptionHandlerOptionsReInvite = opts;
399
+ this.heldState = revertTo;
400
+ this.currentCallInfo.held = revertTo;
401
+ this.currentCallInfo.state = revertTo ? 'held' : 'established';
402
+ this.enableReceiverTracks(!revertTo);
403
+ this.enableSenderTracks(!revertTo && !this.mutedState);
404
+ this.emitCallState();
405
+ }
406
+ /** Mute/unmute local audio */
407
+ toggleMute() {
408
+ if (!this.currentSession || this.currentSession.state !== SessionState.Established) {
409
+ throw new Error('No established call to mute');
410
+ }
411
+ if (!this.currentCallInfo)
412
+ throw new Error('No call info');
413
+ this.mutedState = !this.mutedState;
414
+ this.enableSenderTracks(!this.mutedState && !this.heldState);
415
+ this.currentCallInfo.muted = this.mutedState;
416
+ this.emitCallState();
417
+ return this.mutedState;
418
+ }
419
+ /** Send a DTMF tone */
420
+ sendDtmf(tone) {
421
+ if (!this.currentSession || this.currentSession.state !== SessionState.Established) {
422
+ throw new Error('No established call for DTMF');
423
+ }
424
+ const pc = this.getPeerConnection();
425
+ if (pc) {
426
+ for (const sender of pc.getSenders()) {
427
+ if (sender.track?.kind === 'audio' && sender.dtmf) {
428
+ sender.dtmf.insertDTMF(tone, 100, 70);
429
+ if (this.currentCallInfo) {
430
+ this.currentCallInfo.dtmfSent += tone;
431
+ this.emitCallState();
432
+ }
433
+ return;
434
+ }
435
+ }
436
+ }
437
+ // Fallback: SIP INFO
438
+ this.currentSession.info({
439
+ requestOptions: {
440
+ body: {
441
+ contentDisposition: 'render',
442
+ contentType: 'application/dtmf-relay',
443
+ content: `Signal=${tone}\r\nDuration=100`,
444
+ },
445
+ },
446
+ });
447
+ if (this.currentCallInfo) {
448
+ this.currentCallInfo.dtmfSent += tone;
449
+ this.emitCallState();
450
+ }
451
+ }
452
+ /**
453
+ * Blind transfer: send SIP REFER to transfer the call to target.
454
+ * FreeSWITCH handles the actual transfer in its `transfer` dialplan context.
455
+ */
456
+ async blindTransfer(target) {
457
+ if (!this.currentSession || this.currentSession.state !== SessionState.Established) {
458
+ throw new Error('No established call to transfer');
459
+ }
460
+ const targetUri = UserAgent.makeURI(`sip:${target}@${this.config.sipDomain}`);
461
+ if (!targetUri)
462
+ throw new Error(`Invalid transfer target: ${target}`);
463
+ console.log(`[WebRTCPhone] Blind transfer to ${target}@${this.config.sipDomain}`);
464
+ await this.currentSession.refer(targetUri, {
465
+ requestDelegate: {
466
+ onAccept: () => {
467
+ console.log('[WebRTCPhone] REFER accepted');
468
+ this.emit('transferProgress', { state: 'accepted', message: 'Transfer accepted' });
469
+ },
470
+ onReject: () => {
471
+ console.warn('[WebRTCPhone] REFER rejected');
472
+ this.emit('transferProgress', { state: 'rejected', message: 'Transfer rejected' });
473
+ },
474
+ },
475
+ });
476
+ this.emit('transferProgress', { state: 'trying', message: `Transferring to ${target}...` });
477
+ }
478
+ /**
479
+ * Attended transfer: REFER with Replaces.
480
+ * Requires a second Session (the consultation call) that is already established.
481
+ */
482
+ async attendedTransfer(targetSession) {
483
+ if (!this.currentSession || this.currentSession.state !== SessionState.Established) {
484
+ throw new Error('No established call to transfer');
485
+ }
486
+ console.log('[WebRTCPhone] Attended transfer (REFER with Replaces)');
487
+ await this.currentSession.refer(targetSession, {
488
+ requestDelegate: {
489
+ onAccept: () => {
490
+ console.log('[WebRTCPhone] Attended REFER accepted');
491
+ this.emit('transferProgress', { state: 'accepted', message: 'Transfer completed' });
492
+ },
493
+ onReject: () => {
494
+ console.warn('[WebRTCPhone] Attended REFER rejected');
495
+ this.emit('transferProgress', { state: 'rejected', message: 'Transfer rejected' });
496
+ },
497
+ },
498
+ });
499
+ this.emit('transferProgress', { state: 'trying', message: 'Completing attended transfer...' });
500
+ }
501
+ // -------------------------------------------------------------------
502
+ // Internal helpers
503
+ // -------------------------------------------------------------------
504
+ setupSessionHandlers(session) {
505
+ session.stateChange.addListener((state) => {
506
+ if (!this.currentCallInfo)
507
+ return;
508
+ switch (state) {
509
+ case SessionState.Establishing:
510
+ this.currentCallInfo.state = 'connecting';
511
+ break;
512
+ case SessionState.Established:
513
+ this.currentCallInfo.state = 'established';
514
+ this.currentCallInfo.answerTime = new Date();
515
+ this.attachRemoteAudio(session);
516
+ break;
517
+ case SessionState.Terminating:
518
+ this.currentCallInfo.state = 'terminating';
519
+ break;
520
+ case SessionState.Terminated:
521
+ this.currentCallInfo.state = 'terminated';
522
+ this.emitCallState();
523
+ this.emit('callEnded', { ...this.currentCallInfo });
524
+ this.clearSession();
525
+ return;
526
+ }
527
+ this.emitCallState();
528
+ });
529
+ }
530
+ attachRemoteAudio(session) {
531
+ const pc = this.getPeerConnection(session);
532
+ if (!pc)
533
+ return;
534
+ const remoteStream = new MediaStream();
535
+ for (const receiver of pc.getReceivers()) {
536
+ if (receiver.track) {
537
+ remoteStream.addTrack(receiver.track);
538
+ }
539
+ }
540
+ // Listen for new tracks added during renegotiation (hold/unhold re-INVITE)
541
+ pc.ontrack = (event) => {
542
+ const stream = this.audioElement.srcObject;
543
+ if (stream && event.track) {
544
+ if (!stream.getTrackById(event.track.id)) {
545
+ stream.addTrack(event.track);
546
+ }
547
+ }
548
+ };
549
+ // Monitor ICE connection state for media path failures
550
+ pc.oniceconnectionstatechange = () => {
551
+ if (pc.iceConnectionState === 'failed') {
552
+ this.emit('error', new Error('ICE connection failed — media path lost'));
553
+ }
554
+ else if (pc.iceConnectionState === 'disconnected') {
555
+ console.warn('[WebRTCPhone] ICE disconnected — may recover');
556
+ }
557
+ };
558
+ this.audioElement.srcObject = remoteStream;
559
+ this.audioElement.play().catch((err) => {
560
+ console.warn('[WebRTCPhone] Autoplay blocked — user interaction required:', err?.message);
561
+ this.emit('error', new Error('Audio playback blocked by browser. Click the page to enable audio.'));
562
+ });
563
+ }
564
+ getPeerConnection(session) {
565
+ const s = session || this.currentSession;
566
+ if (!s)
567
+ return null;
568
+ const sdh = s.sessionDescriptionHandler;
569
+ if (!sdh)
570
+ return null;
571
+ return sdh.peerConnection || null;
572
+ }
573
+ enableSenderTracks(enabled) {
574
+ const pc = this.getPeerConnection();
575
+ if (!pc)
576
+ return;
577
+ for (const sender of pc.getSenders()) {
578
+ if (sender.track?.kind === 'audio') {
579
+ sender.track.enabled = enabled;
580
+ }
581
+ }
582
+ }
583
+ enableReceiverTracks(enabled) {
584
+ const pc = this.getPeerConnection();
585
+ if (!pc)
586
+ return;
587
+ for (const receiver of pc.getReceivers()) {
588
+ if (receiver.track?.kind === 'audio') {
589
+ receiver.track.enabled = enabled;
590
+ }
591
+ }
592
+ }
593
+ emitCallState() {
594
+ if (this.currentCallInfo) {
595
+ this.emit('callStateChanged', { ...this.currentCallInfo });
596
+ }
597
+ }
598
+ clearSession() {
599
+ this.currentSession = null;
600
+ this.currentCallInfo = null;
601
+ this.heldState = false;
602
+ this.mutedState = false;
603
+ this.holdPending = false;
604
+ }
605
+ /**
606
+ * Check if the browser has microphone permission.
607
+ * Call this before start() to provide a better UX when mic is denied.
608
+ */
609
+ static async checkMicrophoneAccess() {
610
+ try {
611
+ const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
612
+ stream.getTracks().forEach((t) => t.stop());
613
+ return true;
614
+ }
615
+ catch {
616
+ return false;
617
+ }
618
+ }
619
+ async destroy() {
620
+ await this.stop();
621
+ this.listeners.clear();
622
+ }
623
+ }
624
+ //# sourceMappingURL=webrtc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webrtc.js","sourceRoot":"","sources":["../src/webrtc.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cemscale-voip/voip-sdk",
3
- "version": "1.25.1",
3
+ "version": "1.25.2",
4
4
  "description": "VoIP SDK for CemScale multi-tenant platform — API client, WebRTC, React hooks",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",