@exotel-npm-dev/webrtc-client-sdk 1.0.21 → 1.0.23
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/Changelog +6 -0
- package/dist/exotelsdk.js +178 -73
- package/dist/exotelsdk.js.map +1 -1
- package/package.json +2 -2
- package/src/api/LogManager.js +40 -0
- package/src/api/callAPI/Call.js +17 -10
- package/src/listeners/ExWebClient.js +39 -18
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@exotel-npm-dev/webrtc-client-sdk",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.23",
|
|
4
4
|
"description": "client sdk for webrtc based on webrtc core sdk",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"scripts": {
|
|
@@ -29,6 +29,6 @@
|
|
|
29
29
|
"webpack-cli": "^4.10.0"
|
|
30
30
|
},
|
|
31
31
|
"dependencies": {
|
|
32
|
-
"@exotel-npm-dev/webrtc-core-sdk": "^1.0.
|
|
32
|
+
"@exotel-npm-dev/webrtc-core-sdk": "^1.0.20"
|
|
33
33
|
}
|
|
34
34
|
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
const MAX_LOG_LINES = 1000;
|
|
2
|
+
const LOG_STORAGE_KEY = 'webrtc_sdk_logs';
|
|
3
|
+
|
|
4
|
+
const LogManager = {
|
|
5
|
+
onLog(level, msg, args = []) {
|
|
6
|
+
const timestamp = new Date().toISOString();
|
|
7
|
+
const line = `[${timestamp}] [${level.toUpperCase()}] ${msg} ${args.map(arg => JSON.stringify(arg)).join(" ")}`.trim();
|
|
8
|
+
|
|
9
|
+
let logs = JSON.parse(localStorage.getItem(LOG_STORAGE_KEY)) || [];
|
|
10
|
+
logs.push(line);
|
|
11
|
+
if (logs.length > MAX_LOG_LINES) {
|
|
12
|
+
logs = logs.slice(-MAX_LOG_LINES); // rotate
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
localStorage.setItem(LOG_STORAGE_KEY, JSON.stringify(logs));
|
|
16
|
+
},
|
|
17
|
+
|
|
18
|
+
getLogs() {
|
|
19
|
+
return JSON.parse(localStorage.getItem(LOG_STORAGE_KEY)) || [];
|
|
20
|
+
},
|
|
21
|
+
|
|
22
|
+
downloadLogs(filename) {
|
|
23
|
+
if (!filename) {
|
|
24
|
+
const now = new Date();
|
|
25
|
+
const formattedDate = now.toISOString().split('T')[0]; // Gets YYYY-MM-DD
|
|
26
|
+
filename = `webrtc_sdk_logs_${formattedDate}.txt`;
|
|
27
|
+
}
|
|
28
|
+
const blob = new Blob([LogManager.getLogs().join('\n')], { type: 'text/plain' });
|
|
29
|
+
const url = URL.createObjectURL(blob);
|
|
30
|
+
|
|
31
|
+
const a = document.createElement('a');
|
|
32
|
+
a.href = url;
|
|
33
|
+
a.download = filename;
|
|
34
|
+
a.click();
|
|
35
|
+
URL.revokeObjectURL(url);
|
|
36
|
+
},
|
|
37
|
+
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
export default LogManager;
|
package/src/api/callAPI/Call.js
CHANGED
|
@@ -24,27 +24,34 @@ export function Call() {
|
|
|
24
24
|
/**
|
|
25
25
|
* When agent clicks on mute
|
|
26
26
|
*/
|
|
27
|
-
logger.log('
|
|
28
|
-
|
|
29
|
-
webrtcSIPPhone.webRTCMuteUnmute(null);
|
|
27
|
+
logger.log('Call: MuteToggle');
|
|
28
|
+
webrtcSIPPhone.webRTCMuteUnmute();
|
|
30
29
|
}
|
|
31
30
|
|
|
32
31
|
this.Mute = function () {
|
|
33
32
|
/**
|
|
34
33
|
* When agent clicks on mute
|
|
35
34
|
*/
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
35
|
+
var isMicEnabled = webrtcSIPPhone.getMuteStatus();
|
|
36
|
+
logger.log('Call: Mute: isMicEnabled: ', isMicEnabled);
|
|
37
|
+
if (isMicEnabled) {
|
|
38
|
+
webrtcSIPPhone.muteAction(true);
|
|
39
|
+
} else {
|
|
40
|
+
logger.log('Call: Mute: Already muted');
|
|
41
|
+
}
|
|
39
42
|
}
|
|
40
|
-
|
|
43
|
+
|
|
41
44
|
this.UnMute = function () {
|
|
42
45
|
/**
|
|
43
46
|
* When agent clicks on mute
|
|
44
47
|
*/
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
+
var isMicEnabled = webrtcSIPPhone.getMuteStatus();
|
|
49
|
+
logger.log('Call: UnMute: isMicEnabled: ', isMicEnabled);
|
|
50
|
+
if (isMicEnabled) {
|
|
51
|
+
logger.log('Call: Unmute: Already unmuted');
|
|
52
|
+
} else {
|
|
53
|
+
webrtcSIPPhone.muteAction(false);
|
|
54
|
+
}
|
|
48
55
|
}
|
|
49
56
|
|
|
50
57
|
this.HoldToggle = function () {
|
|
@@ -12,6 +12,7 @@ import { webrtcTroubleshooterEventBus } from "./Callback";
|
|
|
12
12
|
|
|
13
13
|
import { webrtcSIPPhone } from '@exotel-npm-dev/webrtc-core-sdk';
|
|
14
14
|
import { CallDetails } from "../api/callAPI/CallDetails";
|
|
15
|
+
import LogManager from '../api/LogManager.js';
|
|
15
16
|
|
|
16
17
|
var intervalId;
|
|
17
18
|
var intervalIDMap = new Map();
|
|
@@ -67,7 +68,7 @@ export function ExDelegationHandler(exClient_) {
|
|
|
67
68
|
}
|
|
68
69
|
|
|
69
70
|
this.onCallStatSipJsSessionEvent = function (ev) {
|
|
70
|
-
logger.log("delegationHandler: onCallStatSipJsSessionEvent
|
|
71
|
+
logger.log("delegationHandler: onCallStatSipJsSessionEvent",ev);
|
|
71
72
|
}
|
|
72
73
|
|
|
73
74
|
this.sendWebRTCEventsToFSM = function (eventType, sipMethod) {
|
|
@@ -224,6 +225,21 @@ export class ExotelWebClient {
|
|
|
224
225
|
//this.webRTCPhones = {};
|
|
225
226
|
|
|
226
227
|
sipAccountInfo = null;
|
|
228
|
+
clientSDKLoggerCallback = null;
|
|
229
|
+
|
|
230
|
+
constructor() {
|
|
231
|
+
/*
|
|
232
|
+
Register the logger callback and emit the onLog event
|
|
233
|
+
*/
|
|
234
|
+
logger.registerLoggerCallback(function (type, message, args) {
|
|
235
|
+
|
|
236
|
+
LogManager.onLog(type, message, args);
|
|
237
|
+
if (this.clientSDKLoggerCallback)
|
|
238
|
+
this.clientSDKLoggerCallback("log", arg1, args);
|
|
239
|
+
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
|
|
227
243
|
|
|
228
244
|
initWebrtc = (sipAccountInfo_,
|
|
229
245
|
RegisterEventCallBack, CallListenerCallback, SessionCallback) => {
|
|
@@ -244,7 +260,7 @@ export class ExotelWebClient {
|
|
|
244
260
|
this.call = new Call();
|
|
245
261
|
}
|
|
246
262
|
|
|
247
|
-
logger.log("Exotel Client Initialised with " + JSON.stringify(sipAccountInfo_))
|
|
263
|
+
logger.log("ExWebClient: initWebrtc: Exotel Client Initialised with " + JSON.stringify(sipAccountInfo_))
|
|
248
264
|
this.sipAccountInfo = sipAccountInfo_;
|
|
249
265
|
if (!this.sipAccountInfo["userName"] || !this.sipAccountInfo["sipdomain"] || !this.sipAccountInfo["port"]) {
|
|
250
266
|
return false;
|
|
@@ -253,16 +269,16 @@ export class ExotelWebClient {
|
|
|
253
269
|
|
|
254
270
|
callbacks.initializeCallback(CallListenerCallback);
|
|
255
271
|
registerCallback.initializeRegisterCallback(RegisterEventCallBack);
|
|
256
|
-
logger.log("Initializing session callback")
|
|
272
|
+
logger.log("ExWebClient: initWebrtc: Initializing session callback")
|
|
257
273
|
sessionCallback.initializeSessionCallback(SessionCallback);
|
|
258
274
|
this.setEventListener(this.eventListener);
|
|
259
275
|
return true;
|
|
260
276
|
};
|
|
261
277
|
|
|
262
278
|
DoRegister = () => {
|
|
263
|
-
logger.log("ExWebClient:DoRegister Entry")
|
|
279
|
+
logger.log("ExWebClient: DoRegister: Entry")
|
|
264
280
|
if (!this.isReadyToRegister) {
|
|
265
|
-
logger.warn("ExWebClient:DoRegister SDK is not ready to register");
|
|
281
|
+
logger.warn("ExWebClient: DoRegister: SDK is not ready to register");
|
|
266
282
|
return false;
|
|
267
283
|
}
|
|
268
284
|
DoRegisterRL(this.sipAccountInfo, this);
|
|
@@ -270,7 +286,7 @@ export class ExotelWebClient {
|
|
|
270
286
|
};
|
|
271
287
|
|
|
272
288
|
UnRegister = () => {
|
|
273
|
-
logger.log("ExWebClient:UnRegister Entry")
|
|
289
|
+
logger.log("ExWebClient: UnRegister: Entry")
|
|
274
290
|
UnRegisterRL(this.sipAccountInfo, this)
|
|
275
291
|
};
|
|
276
292
|
|
|
@@ -343,7 +359,7 @@ export class ExotelWebClient {
|
|
|
343
359
|
|
|
344
360
|
registerEventCallback = (event, phone, param) => {
|
|
345
361
|
|
|
346
|
-
logger.log("
|
|
362
|
+
logger.log("ExWebClient: registerEventCallback: Received ---> " + event + 'phone....', phone + 'param....', param)
|
|
347
363
|
if (event === "connected") {
|
|
348
364
|
/**
|
|
349
365
|
* When registration is successful then send the phone number of the same to UI
|
|
@@ -351,7 +367,7 @@ export class ExotelWebClient {
|
|
|
351
367
|
this.eventListener.onInitializationSuccess(phone);
|
|
352
368
|
this.registrationInProgress = false;
|
|
353
369
|
if (this.unregisterInitiated) {
|
|
354
|
-
logger.log("ExWebClient:registerEventCallback unregistering due to unregisterInitiated");
|
|
370
|
+
logger.log("ExWebClient: registerEventCallback: unregistering due to unregisterInitiated");
|
|
355
371
|
this.unregisterInitiated = false;
|
|
356
372
|
this.unregister();
|
|
357
373
|
}
|
|
@@ -366,7 +382,7 @@ export class ExotelWebClient {
|
|
|
366
382
|
this.isReadyToRegister = true;
|
|
367
383
|
}
|
|
368
384
|
if (this.shouldAutoRetry) {
|
|
369
|
-
logger.log("ExWebClient:registerEventCallback Autoretrying");
|
|
385
|
+
logger.log("ExWebClient: registerEventCallback: Autoretrying");
|
|
370
386
|
DoRegisterRL(this.sipAccountInfo, this, 5000);
|
|
371
387
|
}
|
|
372
388
|
} else if (event === "sent_request") {
|
|
@@ -383,7 +399,7 @@ export class ExotelWebClient {
|
|
|
383
399
|
* @param {*} param
|
|
384
400
|
*/
|
|
385
401
|
callEventCallback = (event, phone, param) => {
|
|
386
|
-
logger.log("
|
|
402
|
+
logger.log("ExWebClient: callEventCallback: Received ---> " + event + 'param sent....' + param + 'for phone....' + phone)
|
|
387
403
|
if (event === "i_new_call") {
|
|
388
404
|
this.callListener.onIncomingCall(param, phone)
|
|
389
405
|
} else if (event === "connected") {
|
|
@@ -408,7 +424,7 @@ export class ExotelWebClient {
|
|
|
408
424
|
* @param {*} sipAccountInfo
|
|
409
425
|
*/
|
|
410
426
|
unregister = (sipAccountInfo) => {
|
|
411
|
-
logger.log("ExWebClient:unregister Entry");
|
|
427
|
+
logger.log("ExWebClient: unregister: Entry");
|
|
412
428
|
this.shouldAutoRetry = false;
|
|
413
429
|
this.unregisterInitiated = true;
|
|
414
430
|
if (!this.registrationInProgress) {
|
|
@@ -420,7 +436,7 @@ export class ExotelWebClient {
|
|
|
420
436
|
|
|
421
437
|
|
|
422
438
|
webRTCStatusCallbackHandler = (msg1, arg1) => {
|
|
423
|
-
logger.log("webRTCStatusCallbackHandler: " + msg1 + " " + arg1)
|
|
439
|
+
logger.log("ExWebClient: webRTCStatusCallbackHandler: " + msg1 + " " + arg1)
|
|
424
440
|
};
|
|
425
441
|
|
|
426
442
|
/**
|
|
@@ -449,7 +465,7 @@ export class ExotelWebClient {
|
|
|
449
465
|
'contactHost': ''
|
|
450
466
|
}
|
|
451
467
|
|
|
452
|
-
logger.log('Sending register for the number..', subscriberName);
|
|
468
|
+
logger.log('ExWebClient: initialize: Sending register for the number..', subscriberName);
|
|
453
469
|
|
|
454
470
|
fetchPublicIP(sipAccountInfo);
|
|
455
471
|
|
|
@@ -557,28 +573,33 @@ export class ExotelWebClient {
|
|
|
557
573
|
}
|
|
558
574
|
})
|
|
559
575
|
.catch(function (error) {
|
|
560
|
-
logger.log("something went wrong during checkClientStatus ", error);
|
|
576
|
+
logger.log("ExWebClient: checkClientStatus: something went wrong during checkClientStatus ", error);
|
|
561
577
|
callback("media_permission_denied");
|
|
562
578
|
});
|
|
563
579
|
};
|
|
564
580
|
|
|
565
581
|
changeAudioInputDevice(deviceId, onSuccess, onError) {
|
|
566
|
-
logger.log(`
|
|
582
|
+
logger.log(`ExWebClient: changeAudioInputDevice: Entry`);
|
|
567
583
|
webrtcSIPPhone.changeAudioInputDevice(deviceId, onSuccess, onError);
|
|
568
584
|
}
|
|
569
585
|
|
|
570
586
|
changeAudioOutputDevice(deviceId, onSuccess, onError) {
|
|
571
|
-
logger.log(`
|
|
587
|
+
logger.log(`ExWebClient: changeAudioOutputDevice: Entry`);
|
|
572
588
|
webrtcSIPPhone.changeAudioOutputDevice(deviceId, onSuccess, onError);
|
|
573
589
|
}
|
|
574
590
|
|
|
591
|
+
downloadLogs() {
|
|
592
|
+
logger.log(`ExWebClient: downloadLogs: Entry`);
|
|
593
|
+
LogManager.downloadLogs();
|
|
594
|
+
}
|
|
595
|
+
|
|
575
596
|
setPreferredCodec(codecName) {
|
|
576
|
-
logger.log("ExWebClient:setPreferredCodec
|
|
597
|
+
logger.log("ExWebClient: setPreferredCodec: Entry");
|
|
577
598
|
webrtcSIPPhone.setPreferredCodec(codecName);
|
|
578
599
|
}
|
|
579
600
|
|
|
580
601
|
registerLoggerCallback(callback) {
|
|
581
|
-
|
|
602
|
+
this.clientSDKLoggerCallback = callback;
|
|
582
603
|
}
|
|
583
604
|
|
|
584
605
|
registerAudioDeviceChangeCallback(audioInputDeviceChangeCallback, audioOutputDeviceChangeCallback, onDeviceChangeCallback) {
|