@wazo/sdk 0.37.19 → 0.37.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/dist/wazo-sdk.js +5 -5
- package/esm/__tests__/api-client.test.js +70 -5
- package/esm/__tests__/web-rtc-client.test.js +111 -67
- package/esm/api/agentd.js +25 -2
- package/esm/api/amid.js +25 -2
- package/esm/api/application.js +25 -2
- package/esm/api/auth.js +25 -2
- package/esm/api/call-logd.js +32 -2
- package/esm/api/calld.js +35 -2
- package/esm/api/chatd.js +32 -2
- package/esm/api/confd.js +47 -5
- package/esm/api/ctid-ng.js +35 -2
- package/esm/api/dird.js +28 -2
- package/esm/api/webhookd.js +25 -2
- package/esm/api-client.js +70 -5
- package/esm/checker/Checker.js +113 -67
- package/esm/checker/checks/aor.js +70 -5
- package/esm/checker/checks/api.js +70 -5
- package/esm/checker/checks/index.js +113 -67
- package/esm/checker/checks/wazo-websocket.js +27 -2
- package/esm/checker/checks/webrtc-transport.js +111 -67
- package/esm/checker/checks/webrtc.js +111 -67
- package/esm/domain/AdHocAPIConference.js +70 -5
- package/esm/domain/Call.js +3 -0
- package/esm/domain/CallLog.js +7 -0
- package/esm/domain/ChatMessage.js +4 -0
- package/esm/domain/ChatRoom.js +3 -0
- package/esm/domain/Contact.js +3 -0
- package/esm/domain/Features.js +70 -5
- package/esm/domain/Meeting.js +17 -1
- package/esm/domain/Phone/CTIPhone.js +74 -5
- package/esm/domain/Phone/WebRTCPhone.js +50 -16
- package/esm/domain/Recording.js +3 -0
- package/esm/domain/Voicemail.js +3 -0
- package/esm/domain/__tests__/Call.test.js +3 -0
- package/esm/domain/__tests__/CallLog.test.js +7 -0
- package/esm/domain/__tests__/Contact.test.js +3 -0
- package/esm/domain/__tests__/Voicemail.test.js +3 -0
- package/esm/index.js +147 -80
- package/esm/lib/WazoSessionDescriptionHandler.js +25 -40
- package/esm/service/CallApi.js +70 -5
- package/esm/service/IssueReporter.js +25 -2
- package/esm/service/__tests__/IssueReporter.test.js +25 -2
- package/esm/service/getApiClient.js +70 -5
- package/esm/simple/Auth.js +147 -80
- package/esm/simple/Configuration.js +147 -80
- package/esm/simple/Directory.js +70 -5
- package/esm/simple/Phone.js +147 -80
- package/esm/simple/Websocket.js +28 -2
- package/esm/simple/index.js +147 -80
- package/esm/simple/room/LocalParticipant.js +147 -80
- package/esm/simple/room/Participant.js +147 -80
- package/esm/simple/room/RemoteParticipant.js +147 -80
- package/esm/simple/room/Room.js +147 -80
- package/esm/simple/room/SipRoom.js +147 -80
- package/esm/simple/room/Stream.js +147 -80
- package/esm/simple/room/__tests__/RemoteParticipant.test.js +147 -80
- package/esm/simple/utils.js +147 -80
- package/esm/utils/__tests__/api-requester.test.js +25 -2
- package/esm/utils/api-requester.js +25 -2
- package/esm/web-rtc-client.js +111 -67
- package/esm/websocket-client.js +28 -3
- package/lib/__tests__/api-client.test.js +70 -5
- package/lib/__tests__/web-rtc-client.test.js +111 -67
- package/lib/api/agentd.js +25 -2
- package/lib/api/amid.js +25 -2
- package/lib/api/application.js +25 -2
- package/lib/api/auth.js +25 -2
- package/lib/api/call-logd.js +32 -2
- package/lib/api/calld.js +35 -2
- package/lib/api/chatd.js +32 -2
- package/lib/api/confd.js +47 -5
- package/lib/api/ctid-ng.js +35 -2
- package/lib/api/dird.js +28 -2
- package/lib/api/webhookd.js +25 -2
- package/lib/api-client.js +70 -5
- package/lib/checker/Checker.js +113 -67
- package/lib/checker/checks/aor.js +70 -5
- package/lib/checker/checks/api.js +70 -5
- package/lib/checker/checks/index.js +113 -67
- package/lib/checker/checks/wazo-websocket.js +27 -2
- package/lib/checker/checks/webrtc-transport.js +111 -67
- package/lib/checker/checks/webrtc.js +111 -67
- package/lib/domain/AdHocAPIConference.js +70 -5
- package/lib/domain/Call.js +3 -0
- package/lib/domain/CallLog.js +7 -0
- package/lib/domain/ChatMessage.js +4 -0
- package/lib/domain/ChatRoom.js +3 -0
- package/lib/domain/Contact.js +3 -0
- package/lib/domain/Features.js +70 -5
- package/lib/domain/Meeting.js +17 -1
- package/lib/domain/Phone/CTIPhone.js +74 -5
- package/lib/domain/Phone/WebRTCPhone.js +50 -16
- package/lib/domain/Recording.js +3 -0
- package/lib/domain/Voicemail.js +3 -0
- package/lib/domain/__tests__/Call.test.js +3 -0
- package/lib/domain/__tests__/CallLog.test.js +7 -0
- package/lib/domain/__tests__/Contact.test.js +3 -0
- package/lib/domain/__tests__/Voicemail.test.js +3 -0
- package/lib/index.js +147 -80
- package/lib/lib/WazoSessionDescriptionHandler.js +25 -40
- package/lib/service/CallApi.js +70 -5
- package/lib/service/IssueReporter.js +25 -2
- package/lib/service/__tests__/IssueReporter.test.js +25 -2
- package/lib/service/getApiClient.js +70 -5
- package/lib/simple/Auth.js +147 -80
- package/lib/simple/Configuration.js +147 -80
- package/lib/simple/Directory.js +70 -5
- package/lib/simple/Phone.js +147 -80
- package/lib/simple/Websocket.js +28 -2
- package/lib/simple/index.js +147 -80
- package/lib/simple/room/LocalParticipant.js +147 -80
- package/lib/simple/room/Participant.js +147 -80
- package/lib/simple/room/RemoteParticipant.js +147 -80
- package/lib/simple/room/Room.js +147 -80
- package/lib/simple/room/SipRoom.js +147 -80
- package/lib/simple/room/Stream.js +147 -80
- package/lib/simple/room/__tests__/RemoteParticipant.test.js +147 -80
- package/lib/simple/utils.js +147 -80
- package/lib/utils/__tests__/api-requester.test.js +25 -2
- package/lib/utils/api-requester.js +25 -2
- package/lib/web-rtc-client.js +111 -67
- package/lib/websocket-client.js +28 -2
- package/package.json +2 -2
- package/src/api/confd.js +5 -2
- package/src/domain/Call.js +3 -0
- package/src/domain/CallLog.js +4 -0
- package/src/domain/ChatMessage.js +4 -0
- package/src/domain/ChatRoom.js +3 -0
- package/src/domain/Contact.js +3 -0
- package/src/domain/Meeting.js +17 -1
- package/src/domain/Phone/CTIPhone.js +4 -0
- package/src/domain/Phone/Phone.js +2 -0
- package/src/domain/Phone/WebRTCPhone.js +25 -14
- package/src/domain/Recording.js +3 -0
- package/src/domain/Voicemail.js +3 -0
- package/src/lib/WazoSessionDescriptionHandler.js +1 -35
- package/src/service/IssueReporter.js +25 -2
- package/src/simple/Phone.js +5 -0
- package/src/types/WebSocketMessage.js +5 -1
- package/src/web-rtc-client.js +41 -24
- package/src/websocket-client.js +2 -0
package/esm/web-rtc-client.js
CHANGED
|
@@ -412,6 +412,7 @@ class IssueReporter {
|
|
|
412
412
|
|
|
413
413
|
|
|
414
414
|
|
|
415
|
+
|
|
415
416
|
|
|
416
417
|
constructor() {
|
|
417
418
|
addLevelsTo(this);
|
|
@@ -423,12 +424,17 @@ class IssueReporter {
|
|
|
423
424
|
this.bufferTimeout = null;
|
|
424
425
|
this._boundProcessBuffer = this._processBuffer.bind(this);
|
|
425
426
|
this._boundParseLoggerBody = this._parseLoggerBody.bind(this);
|
|
427
|
+
this._callback = null;
|
|
426
428
|
}
|
|
427
429
|
|
|
428
430
|
init() {
|
|
429
431
|
this._catchConsole();
|
|
430
432
|
}
|
|
431
433
|
|
|
434
|
+
setCallback(cb ) {
|
|
435
|
+
this._callback = cb;
|
|
436
|
+
}
|
|
437
|
+
|
|
432
438
|
configureRemoteClient(configuration = { tag: 'wazo-sdk', host: null, port: null, level: null, extra: {} }) {
|
|
433
439
|
this.remoteClientConfiguration = configuration;
|
|
434
440
|
}
|
|
@@ -464,6 +470,7 @@ class IssueReporter {
|
|
|
464
470
|
|
|
465
471
|
// Handle category label
|
|
466
472
|
let category = null;
|
|
473
|
+
let skipSendToRemote = false;
|
|
467
474
|
let extra = {};
|
|
468
475
|
if (args[0].indexOf(CATEGORY_PREFIX) === 0) {
|
|
469
476
|
category = args[0].split('=')[1];
|
|
@@ -479,6 +486,7 @@ class IssueReporter {
|
|
|
479
486
|
errorMessage: lastArg.message,
|
|
480
487
|
errorStack: lastArg.stack,
|
|
481
488
|
errorType: lastArg.constructor.name,
|
|
489
|
+
skipSendToRemote: lastArg.skipSendToRemote,
|
|
482
490
|
};
|
|
483
491
|
} else {
|
|
484
492
|
extra = lastArg;
|
|
@@ -487,6 +495,11 @@ class IssueReporter {
|
|
|
487
495
|
args.splice(1, 1);
|
|
488
496
|
}
|
|
489
497
|
|
|
498
|
+
if (extra.skipSendToRemote) {
|
|
499
|
+
skipSendToRemote = true;
|
|
500
|
+
delete extra.skipSendToRemote;
|
|
501
|
+
}
|
|
502
|
+
|
|
490
503
|
const date = moment().format('YYYY-MM-DD HH:mm:ss.SSS');
|
|
491
504
|
const message = args.join(', ');
|
|
492
505
|
let consoleMessage = message;
|
|
@@ -507,7 +520,13 @@ class IssueReporter {
|
|
|
507
520
|
const oldMethod = this.oldConsoleMethods[consoleLevel] || this.oldConsoleMethods.log;
|
|
508
521
|
oldMethod.apply(oldMethod, [date, consoleMessage]);
|
|
509
522
|
|
|
510
|
-
this.
|
|
523
|
+
if (this._callback) {
|
|
524
|
+
this._callback(level, consoleMessage);
|
|
525
|
+
}
|
|
526
|
+
|
|
527
|
+
if (!skipSendToRemote) {
|
|
528
|
+
this._sendToRemoteLogger(level, { date, message, category, ...extra });
|
|
529
|
+
}
|
|
511
530
|
}
|
|
512
531
|
|
|
513
532
|
logRequest(url , options , response , start ) {
|
|
@@ -652,7 +671,11 @@ class IssueReporter {
|
|
|
652
671
|
},
|
|
653
672
|
// $FlowFixMe
|
|
654
673
|
body,
|
|
655
|
-
}).catch(() => {
|
|
674
|
+
}).catch((e ) => {
|
|
675
|
+
// $FlowFixMe
|
|
676
|
+
e.skipSendToRemote = true;
|
|
677
|
+
this.log('error', this._makeCategory('grafana'), 'Sending log to grafana, error', e);
|
|
678
|
+
|
|
656
679
|
setTimeout(() => {
|
|
657
680
|
if (isArray) {
|
|
658
681
|
payload = payload.map(message => {
|
|
@@ -701,10 +724,6 @@ const getSrflxOrRelay = (candidates ) =>
|
|
|
701
724
|
candidates
|
|
702
725
|
.filter(candidate => candidate && (candidate.type === 'srflx' || candidate.type === 'relay'));
|
|
703
726
|
|
|
704
|
-
const areCandidateValid = (candidates ) =>
|
|
705
|
-
getSrflxOrRelay(candidates)
|
|
706
|
-
.length > 0;
|
|
707
|
-
|
|
708
727
|
const getVideoDirection = (sdp ) => {
|
|
709
728
|
const parsedSdp = sdpParser.parse(sdp);
|
|
710
729
|
const videoMedia = parsedSdp.media.find(media => media.type === 'video');
|
|
@@ -757,8 +776,6 @@ const fixSdp = (sdp , candidates , forcePort = true)
|
|
|
757
776
|
/* global RTCSessionDescriptionInit, navigator */
|
|
758
777
|
|
|
759
778
|
const wazoLogger = IssueReporter$1 ? IssueReporter$1.loggerFor('webrtc-sdh') : console;
|
|
760
|
-
const MAX_WAIT_FOR_ICE_TRIES = 20;
|
|
761
|
-
const WAIT_FOR_ICE_TIMEOUT = 500;
|
|
762
779
|
|
|
763
780
|
// Customized mediaStreamFactory allowing to send screensharing stream directory when upgrading
|
|
764
781
|
const wazoMediaStreamFactory = (constraints ) => {
|
|
@@ -948,38 +965,6 @@ class WazoSessionDescriptionHandler extends SessionDescriptionHandler {
|
|
|
948
965
|
this._peerConnection = undefined;
|
|
949
966
|
}
|
|
950
967
|
|
|
951
|
-
async _waitForValidGatheredIce() {
|
|
952
|
-
let tries = 0;
|
|
953
|
-
|
|
954
|
-
while (!areCandidateValid(this.gatheredCandidates) && tries < MAX_WAIT_FOR_ICE_TRIES) {
|
|
955
|
-
wazoLogger.trace('SessionDescriptionHandler._waitForValidGatheredIce, waiting for ice', {
|
|
956
|
-
tries,
|
|
957
|
-
max: MAX_WAIT_FOR_ICE_TRIES,
|
|
958
|
-
});
|
|
959
|
-
|
|
960
|
-
tries++;
|
|
961
|
-
|
|
962
|
-
// eslint-disable-next-line no-await-in-loop
|
|
963
|
-
await new Promise(resolve => setTimeout(resolve, WAIT_FOR_ICE_TIMEOUT));
|
|
964
|
-
}
|
|
965
|
-
|
|
966
|
-
if (tries >= MAX_WAIT_FOR_ICE_TRIES) {
|
|
967
|
-
const errorMsg = 'No valid candidates found, can\'t answer the call';
|
|
968
|
-
const error = new Error(errorMsg);
|
|
969
|
-
wazoLogger.error(errorMsg, { tries, max: MAX_WAIT_FOR_ICE_TRIES });
|
|
970
|
-
|
|
971
|
-
// Emit an error, because sip.js catches the exception and switch to status Terminated.
|
|
972
|
-
this.eventEmitter.emit('error', error);
|
|
973
|
-
|
|
974
|
-
wazoLogger.error('No valid candidates found', { tries, candidates: JSON.stringify(this.gatheredCandidates) });
|
|
975
|
-
}
|
|
976
|
-
|
|
977
|
-
// eslint-disable-next-line
|
|
978
|
-
wazoLogger.trace('Found valid candidates', { tries, candidates: JSON.stringify(this.gatheredCandidates) });
|
|
979
|
-
|
|
980
|
-
return this.getLocalSessionDescription();
|
|
981
|
-
}
|
|
982
|
-
|
|
983
968
|
// Overridden to send `inactive` in conference
|
|
984
969
|
updateDirection(options , isConference = false,
|
|
985
970
|
audioOnly = false) {
|
|
@@ -2089,6 +2074,9 @@ class Contact {
|
|
|
2089
2074
|
}
|
|
2090
2075
|
|
|
2091
2076
|
static parseMany(response ) {
|
|
2077
|
+
if (!response || !response.results) {
|
|
2078
|
+
return [];
|
|
2079
|
+
}
|
|
2092
2080
|
return response.results.map(r => Contact.parse(r, response.column_types));
|
|
2093
2081
|
}
|
|
2094
2082
|
|
|
@@ -3195,11 +3183,27 @@ class Meeting {
|
|
|
3195
3183
|
});
|
|
3196
3184
|
}
|
|
3197
3185
|
|
|
3186
|
+
static parseMany(items ) {
|
|
3187
|
+
if (!items) {
|
|
3188
|
+
return [];
|
|
3189
|
+
}
|
|
3190
|
+
return items.map(plain => Meeting.parse(plain));
|
|
3191
|
+
}
|
|
3192
|
+
|
|
3198
3193
|
static newFrom(meeting ) {
|
|
3199
3194
|
return newFrom(meeting, Meeting);
|
|
3200
3195
|
}
|
|
3201
3196
|
|
|
3202
|
-
constructor({
|
|
3197
|
+
constructor({
|
|
3198
|
+
uuid,
|
|
3199
|
+
name,
|
|
3200
|
+
guestSipAuthorization,
|
|
3201
|
+
ownerUuids,
|
|
3202
|
+
port,
|
|
3203
|
+
uri,
|
|
3204
|
+
number,
|
|
3205
|
+
persistent,
|
|
3206
|
+
} = {}) {
|
|
3203
3207
|
this.guestSipAuthorization = guestSipAuthorization;
|
|
3204
3208
|
this.uri = uri;
|
|
3205
3209
|
this.name = name;
|
|
@@ -3285,8 +3289,11 @@ var confdMethods = (client , baseUrl ) => ({
|
|
|
3285
3289
|
}
|
|
3286
3290
|
},
|
|
3287
3291
|
|
|
3288
|
-
|
|
3289
|
-
client.
|
|
3292
|
+
getMyMeetings: () =>
|
|
3293
|
+
client.get(`${baseUrl}/users/me/meetings`).then(response => Meeting.parseMany(response.items)),
|
|
3294
|
+
|
|
3295
|
+
createMyMeeting: (name , persistent ) =>
|
|
3296
|
+
client.post(`${baseUrl}/users/me/meetings`, { name, persistent }).then(Meeting.parse),
|
|
3290
3297
|
|
|
3291
3298
|
deleteMyMeeting: (meetingUuid ) =>
|
|
3292
3299
|
client.delete(`${baseUrl}/users/me/meetings/${meetingUuid}`, null),
|
|
@@ -3382,6 +3389,10 @@ class ChatMessage {
|
|
|
3382
3389
|
|
|
3383
3390
|
|
|
3384
3391
|
static parseMany(plain ) {
|
|
3392
|
+
if (!plain || !plain.items) {
|
|
3393
|
+
return [];
|
|
3394
|
+
}
|
|
3395
|
+
|
|
3385
3396
|
return plain.items.map(item => ChatMessage.parse(item));
|
|
3386
3397
|
}
|
|
3387
3398
|
|
|
@@ -3491,6 +3502,9 @@ class Voicemail {
|
|
|
3491
3502
|
}
|
|
3492
3503
|
|
|
3493
3504
|
static parseMany(plain ) {
|
|
3505
|
+
if (!plain) {
|
|
3506
|
+
return [];
|
|
3507
|
+
}
|
|
3494
3508
|
const plainUnread = plain.folders.filter(folder => folder.type === 'new')[0].messages;
|
|
3495
3509
|
const plainRead = plain.folders.filter(folder => folder.type === 'old')[0].messages;
|
|
3496
3510
|
|
|
@@ -3600,6 +3614,9 @@ class Call {
|
|
|
3600
3614
|
|
|
3601
3615
|
|
|
3602
3616
|
static parseMany(plain ) {
|
|
3617
|
+
if (!plain) {
|
|
3618
|
+
return [];
|
|
3619
|
+
}
|
|
3603
3620
|
return plain.map((plainCall ) => Call.parse(plainCall));
|
|
3604
3621
|
}
|
|
3605
3622
|
|
|
@@ -3772,6 +3789,9 @@ class Recording {
|
|
|
3772
3789
|
|
|
3773
3790
|
|
|
3774
3791
|
static parseMany(recordings = []) {
|
|
3792
|
+
if (!recordings) {
|
|
3793
|
+
return [];
|
|
3794
|
+
}
|
|
3775
3795
|
return recordings.map(item => Recording.parse(item));
|
|
3776
3796
|
}
|
|
3777
3797
|
|
|
@@ -3873,6 +3893,10 @@ class CallLog {
|
|
|
3873
3893
|
}
|
|
3874
3894
|
|
|
3875
3895
|
static parseMany(plain ) {
|
|
3896
|
+
if (!plain || !plain.items) {
|
|
3897
|
+
return [];
|
|
3898
|
+
}
|
|
3899
|
+
|
|
3876
3900
|
return plain.items.map(item => CallLog.parse(item));
|
|
3877
3901
|
}
|
|
3878
3902
|
|
|
@@ -4445,6 +4469,9 @@ class ChatRoom {
|
|
|
4445
4469
|
|
|
4446
4470
|
|
|
4447
4471
|
static parseMany(plain ) {
|
|
4472
|
+
if (!plain || !plain.items) {
|
|
4473
|
+
return [];
|
|
4474
|
+
}
|
|
4448
4475
|
return plain.items.map(item => ChatRoom.parse(item));
|
|
4449
4476
|
}
|
|
4450
4477
|
|
|
@@ -5701,7 +5728,9 @@ class WebRTCClient extends Emitter {
|
|
|
5701
5728
|
const inviteOptions = {
|
|
5702
5729
|
requestDelegate: {
|
|
5703
5730
|
onAccept: (response ) => {
|
|
5704
|
-
session.sessionDescriptionHandler.peerConnection
|
|
5731
|
+
if (session.sessionDescriptionHandler.peerConnection) {
|
|
5732
|
+
session.sessionDescriptionHandler.peerConnection.sfu = conference;
|
|
5733
|
+
}
|
|
5705
5734
|
this._onAccepted(session, response.session, true);
|
|
5706
5735
|
},
|
|
5707
5736
|
onReject: (response ) => {
|
|
@@ -6573,6 +6602,16 @@ class WebRTCClient extends Emitter {
|
|
|
6573
6602
|
return this.hasRemoteVideo(sessionId) ? this.getRemoteStream(sessionId) : null;
|
|
6574
6603
|
}
|
|
6575
6604
|
|
|
6605
|
+
// Useful in a react-native environment when remoteMediaStream is not updated
|
|
6606
|
+
getRemoteVideoStreamFromPc(sessionId ) {
|
|
6607
|
+
const pc = this.getPeerConnection(sessionId);
|
|
6608
|
+
if (!pc) {
|
|
6609
|
+
return null;
|
|
6610
|
+
}
|
|
6611
|
+
|
|
6612
|
+
return pc.getRemoteStreams().find(stream => !!stream.getVideoTracks().length);
|
|
6613
|
+
}
|
|
6614
|
+
|
|
6576
6615
|
hasVideo(sessionId ) {
|
|
6577
6616
|
return this.hasLocalVideo(sessionId) || this.hasRemoteVideo(sessionId);
|
|
6578
6617
|
}
|
|
@@ -7083,6 +7122,7 @@ class WebRTCClient extends Emitter {
|
|
|
7083
7122
|
session.sessionDescriptionHandler.remoteMediaStream.onaddtrack = onTrack;
|
|
7084
7123
|
|
|
7085
7124
|
pc.oniceconnectionstatechange = () => {
|
|
7125
|
+
logger.info('on ice connection state changed', { state: pc.iceConnectionState });
|
|
7086
7126
|
if (pc.iceConnectionState === 'disconnected') {
|
|
7087
7127
|
this.eventEmitter.emit(ON_DISCONNECTED);
|
|
7088
7128
|
}
|
|
@@ -7311,25 +7351,25 @@ class WebRTCClient extends Emitter {
|
|
|
7311
7351
|
|
|
7312
7352
|
stats.forEach(report => {
|
|
7313
7353
|
if (report.type === 'outbound-rtp' && report.kind === 'audio') {
|
|
7314
|
-
audioBytesSent += report.bytesSent + report.headerBytesSent;
|
|
7354
|
+
audioBytesSent += Number(report.bytesSent) + Number(report.headerBytesSent);
|
|
7315
7355
|
}
|
|
7316
7356
|
if (report.type === 'remote-outbound-rtp' && report.kind === 'audio') {
|
|
7317
|
-
audioBytesSent += report.bytesSent;
|
|
7357
|
+
audioBytesSent += Number(report.bytesSent);
|
|
7318
7358
|
}
|
|
7319
7359
|
if (report.type === 'outbound-rtp' && report.kind === 'video') {
|
|
7320
|
-
videoBytesSent += report.bytesSent + report.headerBytesSent;
|
|
7360
|
+
videoBytesSent += Number(report.bytesSent) + Number(report.headerBytesSent);
|
|
7321
7361
|
}
|
|
7322
7362
|
if (report.type === 'inbound-rtp' && report.kind === 'audio') {
|
|
7323
|
-
packetsLost += report.packetsLost;
|
|
7324
|
-
networkStats.packetsReceived = report.packetsReceived;
|
|
7325
|
-
audioBytesReceived += report.bytesReceived + report.headerBytesReceived;
|
|
7363
|
+
packetsLost += Number(report.packetsLost);
|
|
7364
|
+
networkStats.packetsReceived = Number(report.packetsReceived);
|
|
7365
|
+
audioBytesReceived += Number(report.bytesReceived) + Number(report.headerBytesReceived);
|
|
7326
7366
|
}
|
|
7327
7367
|
if (report.type === 'inbound-rtp' && report.kind === 'video') {
|
|
7328
|
-
videoBytesReceived += report.bytesReceived + report.headerBytesReceived;
|
|
7368
|
+
videoBytesReceived += Number(report.bytesReceived) + Number(report.headerBytesReceived);
|
|
7329
7369
|
}
|
|
7330
7370
|
if (report.type === 'outbound-rtp' && report.kind === 'video') {
|
|
7331
7371
|
if ('framesPerSecond' in report) {
|
|
7332
|
-
networkStats.framesPerSecond = report.framesPerSecond;
|
|
7372
|
+
networkStats.framesPerSecond = Number(report.framesPerSecond);
|
|
7333
7373
|
}
|
|
7334
7374
|
if ('framerateMean' in report) {
|
|
7335
7375
|
// framerateMean is only available in FF
|
|
@@ -7337,32 +7377,36 @@ class WebRTCClient extends Emitter {
|
|
|
7337
7377
|
}
|
|
7338
7378
|
}
|
|
7339
7379
|
if (report.type === 'remote-inbound-rtp' && report.kind === 'audio') {
|
|
7340
|
-
packetsLost += report.packetsLost;
|
|
7341
|
-
networkStats.roundTripTime = report.roundTripTime;
|
|
7342
|
-
networkStats.jitter = report.jitter;
|
|
7380
|
+
packetsLost += Number(report.packetsLost);
|
|
7381
|
+
networkStats.roundTripTime = Number(report.roundTripTime);
|
|
7382
|
+
networkStats.jitter = Number(report.jitter);
|
|
7343
7383
|
}
|
|
7344
7384
|
if (report.type === 'remote-inbound-rtp' && report.kind === 'video') {
|
|
7345
|
-
packetsLost += report.packetsLost;
|
|
7385
|
+
packetsLost += Number(report.packetsLost);
|
|
7346
7386
|
}
|
|
7347
7387
|
if (report.type === 'transport') {
|
|
7348
|
-
transportSent += report.bytesSent;
|
|
7349
|
-
transportReceived += report.bytesReceived;
|
|
7388
|
+
transportSent += Number(report.bytesSent);
|
|
7389
|
+
transportReceived += Number(report.bytesReceived);
|
|
7350
7390
|
}
|
|
7351
7391
|
});
|
|
7352
7392
|
|
|
7353
7393
|
networkStats.packetsLost = packetsLost;
|
|
7354
|
-
networkStats.
|
|
7394
|
+
networkStats.totalAudioBytesSent = audioBytesSent;
|
|
7395
|
+
networkStats.audioBytesSent = audioBytesSent - lastAudioSent;
|
|
7396
|
+
networkStats.totalAudioBytesReceived = audioBytesReceived - lastAudioReceived;
|
|
7355
7397
|
networkStats.audioBytesReceived = audioBytesReceived;
|
|
7356
|
-
networkStats.
|
|
7357
|
-
networkStats.
|
|
7398
|
+
networkStats.totalVideoBytesSent = videoBytesSent;
|
|
7399
|
+
networkStats.videoBytesSent = videoBytesSent - lastVideoSent;
|
|
7400
|
+
networkStats.totalVideoBytesReceived = videoBytesReceived;
|
|
7401
|
+
networkStats.videoBytesReceived = videoBytesReceived - lastVideoReceived;
|
|
7402
|
+
networkStats.totalTransportSent = transportSent - lastTransportSent;
|
|
7358
7403
|
networkStats.transportSent = transportSent;
|
|
7359
|
-
networkStats.
|
|
7360
|
-
|
|
7361
|
-
const bandwidth = (networkStats.audioBytesSent - lastAudioSent) + (networkStats.videoBytesSent - lastVideoSent)
|
|
7362
|
-
+ (networkStats.audioBytesReceived - lastAudioReceived) + (networkStats.videoBytesReceived - lastVideoReceived)
|
|
7363
|
-
+ (networkStats.transportReceived - lastTransportReceived) + (networkStats.transportSent - lastTransportSent);
|
|
7404
|
+
networkStats.totalTransportReceived = transportReceived;
|
|
7405
|
+
networkStats.transportReceived = transportReceived - lastTransportReceived;
|
|
7364
7406
|
|
|
7365
|
-
networkStats.bandwidth =
|
|
7407
|
+
networkStats.bandwidth = networkStats.audioBytesSent + networkStats.audioBytesReceived
|
|
7408
|
+
+ networkStats.videoBytesSent + networkStats.videoBytesReceived + networkStats.transportReceived
|
|
7409
|
+
+ networkStats.transportSent;
|
|
7366
7410
|
|
|
7367
7411
|
this.eventEmitter.emit(ON_NETWORK_STATS, session, networkStats, this.sessionNetworkStats[sessionId]);
|
|
7368
7412
|
this.sessionNetworkStats[sessionId].push(networkStats);
|
package/esm/websocket-client.js
CHANGED
|
@@ -121,6 +121,7 @@ class IssueReporter {
|
|
|
121
121
|
|
|
122
122
|
|
|
123
123
|
|
|
124
|
+
|
|
124
125
|
|
|
125
126
|
constructor() {
|
|
126
127
|
addLevelsTo(this);
|
|
@@ -132,12 +133,17 @@ class IssueReporter {
|
|
|
132
133
|
this.bufferTimeout = null;
|
|
133
134
|
this._boundProcessBuffer = this._processBuffer.bind(this);
|
|
134
135
|
this._boundParseLoggerBody = this._parseLoggerBody.bind(this);
|
|
136
|
+
this._callback = null;
|
|
135
137
|
}
|
|
136
138
|
|
|
137
139
|
init() {
|
|
138
140
|
this._catchConsole();
|
|
139
141
|
}
|
|
140
142
|
|
|
143
|
+
setCallback(cb ) {
|
|
144
|
+
this._callback = cb;
|
|
145
|
+
}
|
|
146
|
+
|
|
141
147
|
configureRemoteClient(configuration = { tag: 'wazo-sdk', host: null, port: null, level: null, extra: {} }) {
|
|
142
148
|
this.remoteClientConfiguration = configuration;
|
|
143
149
|
}
|
|
@@ -173,6 +179,7 @@ class IssueReporter {
|
|
|
173
179
|
|
|
174
180
|
// Handle category label
|
|
175
181
|
let category = null;
|
|
182
|
+
let skipSendToRemote = false;
|
|
176
183
|
let extra = {};
|
|
177
184
|
if (args[0].indexOf(CATEGORY_PREFIX) === 0) {
|
|
178
185
|
category = args[0].split('=')[1];
|
|
@@ -188,6 +195,7 @@ class IssueReporter {
|
|
|
188
195
|
errorMessage: lastArg.message,
|
|
189
196
|
errorStack: lastArg.stack,
|
|
190
197
|
errorType: lastArg.constructor.name,
|
|
198
|
+
skipSendToRemote: lastArg.skipSendToRemote,
|
|
191
199
|
};
|
|
192
200
|
} else {
|
|
193
201
|
extra = lastArg;
|
|
@@ -196,6 +204,11 @@ class IssueReporter {
|
|
|
196
204
|
args.splice(1, 1);
|
|
197
205
|
}
|
|
198
206
|
|
|
207
|
+
if (extra.skipSendToRemote) {
|
|
208
|
+
skipSendToRemote = true;
|
|
209
|
+
delete extra.skipSendToRemote;
|
|
210
|
+
}
|
|
211
|
+
|
|
199
212
|
const date = moment().format('YYYY-MM-DD HH:mm:ss.SSS');
|
|
200
213
|
const message = args.join(', ');
|
|
201
214
|
let consoleMessage = message;
|
|
@@ -216,7 +229,13 @@ class IssueReporter {
|
|
|
216
229
|
const oldMethod = this.oldConsoleMethods[consoleLevel] || this.oldConsoleMethods.log;
|
|
217
230
|
oldMethod.apply(oldMethod, [date, consoleMessage]);
|
|
218
231
|
|
|
219
|
-
this.
|
|
232
|
+
if (this._callback) {
|
|
233
|
+
this._callback(level, consoleMessage);
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
if (!skipSendToRemote) {
|
|
237
|
+
this._sendToRemoteLogger(level, { date, message, category, ...extra });
|
|
238
|
+
}
|
|
220
239
|
}
|
|
221
240
|
|
|
222
241
|
logRequest(url , options , response , start ) {
|
|
@@ -361,7 +380,11 @@ class IssueReporter {
|
|
|
361
380
|
},
|
|
362
381
|
// $FlowFixMe
|
|
363
382
|
body,
|
|
364
|
-
}).catch(() => {
|
|
383
|
+
}).catch((e ) => {
|
|
384
|
+
// $FlowFixMe
|
|
385
|
+
e.skipSendToRemote = true;
|
|
386
|
+
this.log('error', this._makeCategory('grafana'), 'Sending log to grafana, error', e);
|
|
387
|
+
|
|
365
388
|
setTimeout(() => {
|
|
366
389
|
if (isArray) {
|
|
367
390
|
payload = payload.map(message => {
|
|
@@ -578,6 +601,7 @@ const AGENT_PAUSED = 'agent_paused';
|
|
|
578
601
|
const AGENT_UNPAUSED = 'agent_unpaused';
|
|
579
602
|
const CONFERENCE_ADHOC_PARTICIPANT_LEFT = 'conference_adhoc_participant_left';
|
|
580
603
|
const CONFERENCE_ADHOC_DELETED = 'conference_adhoc_deleted';
|
|
604
|
+
const MEETING_USER_PROGRESS = 'meeting_user_progress';
|
|
581
605
|
|
|
582
606
|
const BLACKLIST_EVENTS = [
|
|
583
607
|
CHAT_MESSAGE_SENT,
|
|
@@ -928,7 +952,8 @@ WebSocketClient.eventLists = [
|
|
|
928
952
|
AGENT_UNPAUSED,
|
|
929
953
|
CONFERENCE_ADHOC_PARTICIPANT_LEFT,
|
|
930
954
|
CONFERENCE_ADHOC_DELETED,
|
|
955
|
+
MEETING_USER_PROGRESS,
|
|
931
956
|
];
|
|
932
957
|
|
|
933
958
|
export default WebSocketClient;
|
|
934
|
-
export { AGENT_PAUSED, AGENT_STATUS_UPDATE, AGENT_UNPAUSED, APPLICATION_CALL_ANSWERED, APPLICATION_CALL_DELETED, APPLICATION_CALL_DTMF_RECEIVED, APPLICATION_CALL_ENTERED, APPLICATION_CALL_INITIATED, APPLICATION_CALL_UPDATED, APPLICATION_DESTINATION_NODE_CREATED, APPLICATION_NODE_CREATED, APPLICATION_NODE_DELETED, APPLICATION_NODE_UPDATED, APPLICATION_PLAYBACK_CREATED, APPLICATION_PLAYBACK_DELETED, APPLICATION_PROGRESS_STARTED, APPLICATION_PROGRESS_STOPPED, APPLICATION_SNOOP_CREATED, APPLICATION_SNOOP_DELETED, APPLICATION_SNOOP_UPDATED, APPLICATION_USER_OUTGOING_CALL_CREATED, AUTH_SESSION_EXPIRE_SOON, AUTH_USER_EXTERNAL_AUTH_ADDED, AUTH_USER_EXTERNAL_AUTH_DELETED, CALL_ANSWERED, CALL_CREATED, CALL_DTMF_CREATED, CALL_ENDED, CALL_HELD, CALL_LOG_USER_CREATED, CALL_RESUMED, CALL_UPDATED, CHATD_PRESENCE_UPDATED, CHATD_USER_ROOM_CREATED, CHATD_USER_ROOM_MESSAGE_CREATED, CHAT_MESSAGE_RECEIVED, CHAT_MESSAGE_SENT, CONFERENCE_ADHOC_DELETED, CONFERENCE_ADHOC_PARTICIPANT_LEFT, CONFERENCE_USER_PARTICIPANT_JOINED, CONFERENCE_USER_PARTICIPANT_LEFT, CONFERENCE_USER_PARTICIPANT_TALK_STARTED, CONFERENCE_USER_PARTICIPANT_TALK_STOPPED, ENDPOINT_STATUS_UPDATE, FAVORITE_ADDED, FAVORITE_DELETED, FAX_OUTBOUND_USER_CREATED, FAX_OUTBOUND_USER_FAILED, FAX_OUTBOUND_USER_SUCCEEDED, HEARTBEAT_ENGINE_VERSION, LINE_STATUS_UPDATED, MEETING_USER_PARTICIPANT_JOINED, MEETING_USER_PARTICIPANT_LEFT, SOCKET_EVENTS, SWITCHBOARD_HELD_CALLS_UPDATED, SWITCHBOARD_HELD_CALL_ANSWERED, SWITCHBOARD_QUEUED_CALLS_UPDATED, SWITCHBOARD_QUEUED_CALL_ANSWERED, TRUNK_STATUS_UPDATED, USERS_FORWARDS_BUSY_UPDATED, USERS_FORWARDS_NOANSWER_UPDATED, USERS_FORWARDS_UNCONDITIONAL_UPDATED, USERS_SERVICES_DND_UPDATED, USER_STATUS_UPDATE, USER_VOICEMAIL_MESSAGE_CREATED, USER_VOICEMAIL_MESSAGE_DELETED, USER_VOICEMAIL_MESSAGE_UPDATED };
|
|
959
|
+
export { AGENT_PAUSED, AGENT_STATUS_UPDATE, AGENT_UNPAUSED, APPLICATION_CALL_ANSWERED, APPLICATION_CALL_DELETED, APPLICATION_CALL_DTMF_RECEIVED, APPLICATION_CALL_ENTERED, APPLICATION_CALL_INITIATED, APPLICATION_CALL_UPDATED, APPLICATION_DESTINATION_NODE_CREATED, APPLICATION_NODE_CREATED, APPLICATION_NODE_DELETED, APPLICATION_NODE_UPDATED, APPLICATION_PLAYBACK_CREATED, APPLICATION_PLAYBACK_DELETED, APPLICATION_PROGRESS_STARTED, APPLICATION_PROGRESS_STOPPED, APPLICATION_SNOOP_CREATED, APPLICATION_SNOOP_DELETED, APPLICATION_SNOOP_UPDATED, APPLICATION_USER_OUTGOING_CALL_CREATED, AUTH_SESSION_EXPIRE_SOON, AUTH_USER_EXTERNAL_AUTH_ADDED, AUTH_USER_EXTERNAL_AUTH_DELETED, CALL_ANSWERED, CALL_CREATED, CALL_DTMF_CREATED, CALL_ENDED, CALL_HELD, CALL_LOG_USER_CREATED, CALL_RESUMED, CALL_UPDATED, CHATD_PRESENCE_UPDATED, CHATD_USER_ROOM_CREATED, CHATD_USER_ROOM_MESSAGE_CREATED, CHAT_MESSAGE_RECEIVED, CHAT_MESSAGE_SENT, CONFERENCE_ADHOC_DELETED, CONFERENCE_ADHOC_PARTICIPANT_LEFT, CONFERENCE_USER_PARTICIPANT_JOINED, CONFERENCE_USER_PARTICIPANT_LEFT, CONFERENCE_USER_PARTICIPANT_TALK_STARTED, CONFERENCE_USER_PARTICIPANT_TALK_STOPPED, ENDPOINT_STATUS_UPDATE, FAVORITE_ADDED, FAVORITE_DELETED, FAX_OUTBOUND_USER_CREATED, FAX_OUTBOUND_USER_FAILED, FAX_OUTBOUND_USER_SUCCEEDED, HEARTBEAT_ENGINE_VERSION, LINE_STATUS_UPDATED, MEETING_USER_PARTICIPANT_JOINED, MEETING_USER_PARTICIPANT_LEFT, MEETING_USER_PROGRESS, SOCKET_EVENTS, SWITCHBOARD_HELD_CALLS_UPDATED, SWITCHBOARD_HELD_CALL_ANSWERED, SWITCHBOARD_QUEUED_CALLS_UPDATED, SWITCHBOARD_QUEUED_CALL_ANSWERED, TRUNK_STATUS_UPDATED, USERS_FORWARDS_BUSY_UPDATED, USERS_FORWARDS_NOANSWER_UPDATED, USERS_FORWARDS_UNCONDITIONAL_UPDATED, USERS_SERVICES_DND_UPDATED, USER_STATUS_UPDATE, USER_VOICEMAIL_MESSAGE_CREATED, USER_VOICEMAIL_MESSAGE_DELETED, USER_VOICEMAIL_MESSAGE_UPDATED };
|
|
@@ -136,6 +136,7 @@ class IssueReporter {
|
|
|
136
136
|
|
|
137
137
|
|
|
138
138
|
|
|
139
|
+
|
|
139
140
|
|
|
140
141
|
constructor() {
|
|
141
142
|
addLevelsTo(this);
|
|
@@ -147,12 +148,17 @@ class IssueReporter {
|
|
|
147
148
|
this.bufferTimeout = null;
|
|
148
149
|
this._boundProcessBuffer = this._processBuffer.bind(this);
|
|
149
150
|
this._boundParseLoggerBody = this._parseLoggerBody.bind(this);
|
|
151
|
+
this._callback = null;
|
|
150
152
|
}
|
|
151
153
|
|
|
152
154
|
init() {
|
|
153
155
|
this._catchConsole();
|
|
154
156
|
}
|
|
155
157
|
|
|
158
|
+
setCallback(cb ) {
|
|
159
|
+
this._callback = cb;
|
|
160
|
+
}
|
|
161
|
+
|
|
156
162
|
configureRemoteClient(configuration = { tag: 'wazo-sdk', host: null, port: null, level: null, extra: {} }) {
|
|
157
163
|
this.remoteClientConfiguration = configuration;
|
|
158
164
|
}
|
|
@@ -188,6 +194,7 @@ class IssueReporter {
|
|
|
188
194
|
|
|
189
195
|
// Handle category label
|
|
190
196
|
let category = null;
|
|
197
|
+
let skipSendToRemote = false;
|
|
191
198
|
let extra = {};
|
|
192
199
|
if (args[0].indexOf(CATEGORY_PREFIX) === 0) {
|
|
193
200
|
category = args[0].split('=')[1];
|
|
@@ -203,6 +210,7 @@ class IssueReporter {
|
|
|
203
210
|
errorMessage: lastArg.message,
|
|
204
211
|
errorStack: lastArg.stack,
|
|
205
212
|
errorType: lastArg.constructor.name,
|
|
213
|
+
skipSendToRemote: lastArg.skipSendToRemote,
|
|
206
214
|
};
|
|
207
215
|
} else {
|
|
208
216
|
extra = lastArg;
|
|
@@ -211,6 +219,11 @@ class IssueReporter {
|
|
|
211
219
|
args.splice(1, 1);
|
|
212
220
|
}
|
|
213
221
|
|
|
222
|
+
if (extra.skipSendToRemote) {
|
|
223
|
+
skipSendToRemote = true;
|
|
224
|
+
delete extra.skipSendToRemote;
|
|
225
|
+
}
|
|
226
|
+
|
|
214
227
|
const date = moment__default['default']().format('YYYY-MM-DD HH:mm:ss.SSS');
|
|
215
228
|
const message = args.join(', ');
|
|
216
229
|
let consoleMessage = message;
|
|
@@ -231,7 +244,13 @@ class IssueReporter {
|
|
|
231
244
|
const oldMethod = this.oldConsoleMethods[consoleLevel] || this.oldConsoleMethods.log;
|
|
232
245
|
oldMethod.apply(oldMethod, [date, consoleMessage]);
|
|
233
246
|
|
|
234
|
-
this.
|
|
247
|
+
if (this._callback) {
|
|
248
|
+
this._callback(level, consoleMessage);
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
if (!skipSendToRemote) {
|
|
252
|
+
this._sendToRemoteLogger(level, { date, message, category, ...extra });
|
|
253
|
+
}
|
|
235
254
|
}
|
|
236
255
|
|
|
237
256
|
logRequest(url , options , response , start ) {
|
|
@@ -376,7 +395,11 @@ class IssueReporter {
|
|
|
376
395
|
},
|
|
377
396
|
// $FlowFixMe
|
|
378
397
|
body,
|
|
379
|
-
}).catch(() => {
|
|
398
|
+
}).catch((e ) => {
|
|
399
|
+
// $FlowFixMe
|
|
400
|
+
e.skipSendToRemote = true;
|
|
401
|
+
this.log('error', this._makeCategory('grafana'), 'Sending log to grafana, error', e);
|
|
402
|
+
|
|
380
403
|
setTimeout(() => {
|
|
381
404
|
if (isArray) {
|
|
382
405
|
payload = payload.map(message => {
|
|
@@ -1514,6 +1537,9 @@ class Contact {
|
|
|
1514
1537
|
}
|
|
1515
1538
|
|
|
1516
1539
|
static parseMany(response ) {
|
|
1540
|
+
if (!response || !response.results) {
|
|
1541
|
+
return [];
|
|
1542
|
+
}
|
|
1517
1543
|
return response.results.map(r => Contact.parse(r, response.column_types));
|
|
1518
1544
|
}
|
|
1519
1545
|
|
|
@@ -2620,11 +2646,27 @@ class Meeting {
|
|
|
2620
2646
|
});
|
|
2621
2647
|
}
|
|
2622
2648
|
|
|
2649
|
+
static parseMany(items ) {
|
|
2650
|
+
if (!items) {
|
|
2651
|
+
return [];
|
|
2652
|
+
}
|
|
2653
|
+
return items.map(plain => Meeting.parse(plain));
|
|
2654
|
+
}
|
|
2655
|
+
|
|
2623
2656
|
static newFrom(meeting ) {
|
|
2624
2657
|
return newFrom(meeting, Meeting);
|
|
2625
2658
|
}
|
|
2626
2659
|
|
|
2627
|
-
constructor({
|
|
2660
|
+
constructor({
|
|
2661
|
+
uuid,
|
|
2662
|
+
name,
|
|
2663
|
+
guestSipAuthorization,
|
|
2664
|
+
ownerUuids,
|
|
2665
|
+
port,
|
|
2666
|
+
uri,
|
|
2667
|
+
number,
|
|
2668
|
+
persistent,
|
|
2669
|
+
} = {}) {
|
|
2628
2670
|
this.guestSipAuthorization = guestSipAuthorization;
|
|
2629
2671
|
this.uri = uri;
|
|
2630
2672
|
this.name = name;
|
|
@@ -2710,8 +2752,11 @@ var confdMethods = (client , baseUrl ) => ({
|
|
|
2710
2752
|
}
|
|
2711
2753
|
},
|
|
2712
2754
|
|
|
2713
|
-
|
|
2714
|
-
client.
|
|
2755
|
+
getMyMeetings: () =>
|
|
2756
|
+
client.get(`${baseUrl}/users/me/meetings`).then(response => Meeting.parseMany(response.items)),
|
|
2757
|
+
|
|
2758
|
+
createMyMeeting: (name , persistent ) =>
|
|
2759
|
+
client.post(`${baseUrl}/users/me/meetings`, { name, persistent }).then(Meeting.parse),
|
|
2715
2760
|
|
|
2716
2761
|
deleteMyMeeting: (meetingUuid ) =>
|
|
2717
2762
|
client.delete(`${baseUrl}/users/me/meetings/${meetingUuid}`, null),
|
|
@@ -2807,6 +2852,10 @@ class ChatMessage {
|
|
|
2807
2852
|
|
|
2808
2853
|
|
|
2809
2854
|
static parseMany(plain ) {
|
|
2855
|
+
if (!plain || !plain.items) {
|
|
2856
|
+
return [];
|
|
2857
|
+
}
|
|
2858
|
+
|
|
2810
2859
|
return plain.items.map(item => ChatMessage.parse(item));
|
|
2811
2860
|
}
|
|
2812
2861
|
|
|
@@ -2916,6 +2965,9 @@ class Voicemail {
|
|
|
2916
2965
|
}
|
|
2917
2966
|
|
|
2918
2967
|
static parseMany(plain ) {
|
|
2968
|
+
if (!plain) {
|
|
2969
|
+
return [];
|
|
2970
|
+
}
|
|
2919
2971
|
const plainUnread = plain.folders.filter(folder => folder.type === 'new')[0].messages;
|
|
2920
2972
|
const plainRead = plain.folders.filter(folder => folder.type === 'old')[0].messages;
|
|
2921
2973
|
|
|
@@ -3025,6 +3077,9 @@ class Call {
|
|
|
3025
3077
|
|
|
3026
3078
|
|
|
3027
3079
|
static parseMany(plain ) {
|
|
3080
|
+
if (!plain) {
|
|
3081
|
+
return [];
|
|
3082
|
+
}
|
|
3028
3083
|
return plain.map((plainCall ) => Call.parse(plainCall));
|
|
3029
3084
|
}
|
|
3030
3085
|
|
|
@@ -3197,6 +3252,9 @@ class Recording {
|
|
|
3197
3252
|
|
|
3198
3253
|
|
|
3199
3254
|
static parseMany(recordings = []) {
|
|
3255
|
+
if (!recordings) {
|
|
3256
|
+
return [];
|
|
3257
|
+
}
|
|
3200
3258
|
return recordings.map(item => Recording.parse(item));
|
|
3201
3259
|
}
|
|
3202
3260
|
|
|
@@ -3298,6 +3356,10 @@ class CallLog {
|
|
|
3298
3356
|
}
|
|
3299
3357
|
|
|
3300
3358
|
static parseMany(plain ) {
|
|
3359
|
+
if (!plain || !plain.items) {
|
|
3360
|
+
return [];
|
|
3361
|
+
}
|
|
3362
|
+
|
|
3301
3363
|
return plain.items.map(item => CallLog.parse(item));
|
|
3302
3364
|
}
|
|
3303
3365
|
|
|
@@ -3870,6 +3932,9 @@ class ChatRoom {
|
|
|
3870
3932
|
|
|
3871
3933
|
|
|
3872
3934
|
static parseMany(plain ) {
|
|
3935
|
+
if (!plain || !plain.items) {
|
|
3936
|
+
return [];
|
|
3937
|
+
}
|
|
3873
3938
|
return plain.items.map(item => ChatRoom.parse(item));
|
|
3874
3939
|
}
|
|
3875
3940
|
|