@wazo/sdk 0.37.18 → 0.37.22
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 +13 -5
- package/esm/__tests__/api-client.test.js +52 -9
- package/esm/__tests__/web-rtc-client.test.js +80 -20
- package/esm/api/agentd.js +27 -4
- package/esm/api/amid.js +27 -4
- package/esm/api/application.js +27 -4
- package/esm/api/auth.js +29 -5
- package/esm/api/call-logd.js +29 -6
- package/esm/api/calld.js +27 -4
- package/esm/api/chatd.js +27 -4
- package/esm/api/confd.js +51 -8
- package/esm/api/ctid-ng.js +27 -4
- package/esm/api/dird.js +27 -4
- package/esm/api/webhookd.js +27 -4
- package/esm/api-client.js +54 -11
- package/esm/checker/Checker.js +83 -21
- package/esm/checker/checks/aor.js +54 -11
- package/esm/checker/checks/api.js +54 -11
- package/esm/checker/checks/ice-ipv4.js +1 -1
- package/esm/checker/checks/index.js +84 -22
- package/esm/checker/checks/symmetric-nat.js +1 -1
- package/esm/checker/checks/wazo-websocket.js +29 -4
- package/esm/checker/checks/webrtc-transport.js +82 -22
- package/esm/checker/checks/webrtc.js +82 -22
- package/esm/domain/AdHocAPIConference.js +54 -11
- package/esm/domain/Agent.js +1 -1
- package/esm/domain/BadResponse.js +1 -1
- package/esm/domain/Call.js +1 -1
- package/esm/domain/CallLog.js +3 -3
- package/esm/domain/CallSession.js +1 -1
- package/esm/domain/ChatMessage.js +1 -1
- package/esm/domain/ChatRoom.js +1 -1
- package/esm/domain/Contact.js +2 -1
- package/esm/domain/Country.js +1 -1
- package/esm/domain/Device/DebugDevice.js +1 -1
- package/esm/domain/ExternalApp.js +1 -1
- package/esm/domain/Features.js +54 -10
- package/esm/domain/ForwardOption.js +2 -1
- package/esm/domain/IndirectTransfer.js +1 -1
- package/esm/domain/Line.js +1 -1
- package/esm/domain/Meeting.js +20 -3
- package/esm/domain/NotificationOptions.js +1 -1
- package/esm/domain/Phone/CTIPhone.js +55 -11
- package/esm/domain/Phone/WebRTCPhone.js +39 -6
- package/esm/domain/Profile.js +2 -1
- package/esm/domain/Recording.js +2 -2
- package/esm/domain/Relocation.js +1 -1
- package/esm/domain/Room.js +1 -1
- package/esm/domain/ServerError.js +1 -1
- package/esm/domain/Session.js +2 -2
- package/esm/domain/SipLine.js +1 -1
- package/esm/domain/Subscription.js +1 -1
- package/esm/domain/SwitchboardCall.js +1 -1
- package/esm/domain/Voicemail.js +1 -1
- package/esm/domain/__tests__/CallLog.test.js +2 -2
- package/esm/index.js +101 -24
- package/esm/lib/WazoSessionDescriptionHandler.js +28 -4
- package/esm/service/CallApi.js +54 -11
- package/esm/service/IssueReporter.js +27 -4
- package/esm/service/__tests__/IssueReporter.test.js +26 -3
- package/esm/service/getApiClient.js +55 -11
- package/esm/simple/Auth.js +101 -23
- package/esm/simple/Configuration.js +100 -23
- package/esm/simple/Directory.js +53 -10
- package/esm/simple/Phone.js +100 -23
- package/esm/simple/Websocket.js +30 -4
- package/esm/simple/index.js +100 -23
- package/esm/simple/room/LocalParticipant.js +113 -40
- package/esm/simple/room/Participant.js +112 -37
- package/esm/simple/room/RemoteParticipant.js +114 -41
- package/esm/simple/room/Room.js +113 -37
- package/esm/simple/room/SipRoom.js +101 -26
- package/esm/simple/room/Stream.js +101 -26
- package/esm/simple/room/__tests__/RemoteParticipant.test.js +99 -22
- package/esm/simple/utils.js +99 -22
- package/esm/utils/Emitter.js +1 -1
- package/esm/utils/Heartbeat.js +1 -1
- package/esm/utils/__tests__/api-requester.test.js +26 -3
- package/esm/utils/api-requester.js +28 -4
- package/esm/utils/compare-version.js +1 -1
- package/esm/utils/isMobile.js +1 -1
- package/esm/utils/new-from.js +1 -1
- package/esm/utils/once.js +1 -1
- package/esm/utils/update-from.js +1 -1
- package/esm/web-rtc-client.js +83 -22
- package/esm/websocket-client.js +30 -4
- package/lib/__tests__/api-client.test.js +61 -18
- package/lib/__tests__/web-rtc-client.test.js +97 -37
- package/lib/api/agentd.js +27 -4
- package/lib/api/amid.js +27 -4
- package/lib/api/application.js +27 -4
- package/lib/api/auth.js +28 -5
- package/lib/api/call-logd.js +34 -11
- package/lib/api/calld.js +30 -7
- package/lib/api/chatd.js +28 -5
- package/lib/api/confd.js +51 -8
- package/lib/api/ctid-ng.js +30 -7
- package/lib/api/dird.js +27 -4
- package/lib/api/webhookd.js +27 -4
- package/lib/api-client.js +61 -18
- package/lib/checker/Checker.js +100 -38
- package/lib/checker/checks/aor.js +61 -18
- package/lib/checker/checks/api.js +61 -18
- package/lib/checker/checks/index.js +100 -38
- package/lib/checker/checks/wazo-websocket.js +31 -6
- package/lib/checker/checks/webrtc-transport.js +97 -37
- package/lib/checker/checks/webrtc.js +97 -37
- package/lib/domain/AdHocAPIConference.js +61 -18
- package/lib/domain/Call.js +1 -1
- package/lib/domain/CallLog.js +7 -7
- package/lib/domain/ChatMessage.js +1 -1
- package/lib/domain/Contact.js +1 -1
- package/lib/domain/Features.js +62 -19
- package/lib/domain/ForwardOption.js +1 -1
- package/lib/domain/Meeting.js +19 -2
- package/lib/domain/Phone/CTIPhone.js +63 -20
- package/lib/domain/Phone/WebRTCPhone.js +40 -8
- package/lib/domain/Profile.js +1 -1
- package/lib/domain/Recording.js +3 -3
- package/lib/domain/Voicemail.js +1 -1
- package/lib/domain/__tests__/Call.test.js +1 -1
- package/lib/domain/__tests__/CallLog.test.js +13 -13
- package/lib/domain/__tests__/Voicemail.test.js +1 -1
- package/lib/index.js +120 -43
- package/lib/lib/WazoSessionDescriptionHandler.js +32 -9
- package/lib/service/CallApi.js +61 -18
- package/lib/service/IssueReporter.js +27 -4
- package/lib/service/__tests__/IssueReporter.test.js +27 -4
- package/lib/service/getApiClient.js +62 -19
- package/lib/simple/Auth.js +119 -42
- package/lib/simple/Configuration.js +118 -41
- package/lib/simple/Directory.js +61 -18
- package/lib/simple/Phone.js +118 -41
- package/lib/simple/Websocket.js +32 -6
- package/lib/simple/index.js +118 -41
- package/lib/simple/room/LocalParticipant.js +132 -59
- package/lib/simple/room/Participant.js +130 -55
- package/lib/simple/room/RemoteParticipant.js +133 -60
- package/lib/simple/room/Room.js +131 -56
- package/lib/simple/room/SipRoom.js +120 -45
- package/lib/simple/room/Stream.js +120 -45
- package/lib/simple/room/__tests__/RemoteParticipant.test.js +118 -41
- package/lib/simple/utils.js +118 -41
- package/lib/utils/Emitter.js +1 -1
- package/lib/utils/PhoneNumberUtil.js +2 -2
- package/lib/utils/__tests__/PhoneNumberUtil.test.js +2 -2
- package/lib/utils/__tests__/api-requester.test.js +27 -4
- package/lib/utils/__tests__/sdp.test.js +12 -12
- package/lib/utils/api-requester.js +28 -5
- package/lib/utils/sdp.js +10 -10
- package/lib/web-rtc-client.js +98 -38
- package/lib/websocket-client.js +33 -7
- package/package.json +2 -2
- package/src/api/confd.js +5 -2
- package/src/domain/CallLog.js +1 -1
- package/src/domain/Meeting.js +19 -2
- package/src/domain/Phone/WebRTCPhone.js +11 -2
- package/src/domain/Recording.js +1 -1
- package/src/service/IssueReporter.js +26 -3
- package/src/simple/Phone.js +5 -0
- package/src/types/WebSocketMessage.js +5 -1
- package/src/web-rtc-client.js +28 -11
- package/src/websocket-client.js +2 -0
|
@@ -421,6 +421,7 @@ class IssueReporter {
|
|
|
421
421
|
|
|
422
422
|
|
|
423
423
|
|
|
424
|
+
|
|
424
425
|
|
|
425
426
|
constructor() {
|
|
426
427
|
addLevelsTo(this);
|
|
@@ -432,12 +433,17 @@ class IssueReporter {
|
|
|
432
433
|
this.bufferTimeout = null;
|
|
433
434
|
this._boundProcessBuffer = this._processBuffer.bind(this);
|
|
434
435
|
this._boundParseLoggerBody = this._parseLoggerBody.bind(this);
|
|
436
|
+
this._callback = null;
|
|
435
437
|
}
|
|
436
438
|
|
|
437
439
|
init() {
|
|
438
440
|
this._catchConsole();
|
|
439
441
|
}
|
|
440
442
|
|
|
443
|
+
setCallback(cb ) {
|
|
444
|
+
this._callback = cb;
|
|
445
|
+
}
|
|
446
|
+
|
|
441
447
|
configureRemoteClient(configuration = { tag: 'wazo-sdk', host: null, port: null, level: null, extra: {} }) {
|
|
442
448
|
this.remoteClientConfiguration = configuration;
|
|
443
449
|
}
|
|
@@ -473,6 +479,7 @@ class IssueReporter {
|
|
|
473
479
|
|
|
474
480
|
// Handle category label
|
|
475
481
|
let category = null;
|
|
482
|
+
let skipSendToRemote = false;
|
|
476
483
|
let extra = {};
|
|
477
484
|
if (args[0].indexOf(CATEGORY_PREFIX) === 0) {
|
|
478
485
|
category = args[0].split('=')[1];
|
|
@@ -488,6 +495,7 @@ class IssueReporter {
|
|
|
488
495
|
errorMessage: lastArg.message,
|
|
489
496
|
errorStack: lastArg.stack,
|
|
490
497
|
errorType: lastArg.constructor.name,
|
|
498
|
+
skipSendToRemote: lastArg.skipSendToRemote,
|
|
491
499
|
};
|
|
492
500
|
} else {
|
|
493
501
|
extra = lastArg;
|
|
@@ -496,7 +504,12 @@ class IssueReporter {
|
|
|
496
504
|
args.splice(1, 1);
|
|
497
505
|
}
|
|
498
506
|
|
|
499
|
-
|
|
507
|
+
if (extra.skipSendToRemote) {
|
|
508
|
+
skipSendToRemote = true;
|
|
509
|
+
delete extra.skipSendToRemote;
|
|
510
|
+
}
|
|
511
|
+
|
|
512
|
+
const date = moment__default['default']().format('YYYY-MM-DD HH:mm:ss.SSS');
|
|
500
513
|
const message = args.join(', ');
|
|
501
514
|
let consoleMessage = message;
|
|
502
515
|
|
|
@@ -516,7 +529,13 @@ class IssueReporter {
|
|
|
516
529
|
const oldMethod = this.oldConsoleMethods[consoleLevel] || this.oldConsoleMethods.log;
|
|
517
530
|
oldMethod.apply(oldMethod, [date, consoleMessage]);
|
|
518
531
|
|
|
519
|
-
this.
|
|
532
|
+
if (this._callback) {
|
|
533
|
+
this._callback(level, consoleMessage);
|
|
534
|
+
}
|
|
535
|
+
|
|
536
|
+
if (!skipSendToRemote) {
|
|
537
|
+
this._sendToRemoteLogger(level, { date, message, category, ...extra });
|
|
538
|
+
}
|
|
520
539
|
}
|
|
521
540
|
|
|
522
541
|
logRequest(url , options , response , start ) {
|
|
@@ -661,7 +680,11 @@ class IssueReporter {
|
|
|
661
680
|
},
|
|
662
681
|
// $FlowFixMe
|
|
663
682
|
body,
|
|
664
|
-
}).catch(() => {
|
|
683
|
+
}).catch((e ) => {
|
|
684
|
+
// $FlowFixMe
|
|
685
|
+
e.skipSendToRemote = true;
|
|
686
|
+
this.log('error', this._makeCategory('grafana'), 'Sending log to grafana, error', e);
|
|
687
|
+
|
|
665
688
|
setTimeout(() => {
|
|
666
689
|
if (isArray) {
|
|
667
690
|
payload = payload.map(message => {
|
|
@@ -673,7 +696,7 @@ class IssueReporter {
|
|
|
673
696
|
payload._retry = retry + 1;
|
|
674
697
|
}
|
|
675
698
|
|
|
676
|
-
this._sendDebugToGrafana(
|
|
699
|
+
this._sendDebugToGrafana(payload, retry + 1);
|
|
677
700
|
}, 5000 + retry * 1000);
|
|
678
701
|
});
|
|
679
702
|
}
|
|
@@ -701,7 +724,7 @@ const parseCandidate = (candidate ) => {
|
|
|
701
724
|
if (!candidate) {
|
|
702
725
|
return null;
|
|
703
726
|
}
|
|
704
|
-
const result = sdpParser__default[
|
|
727
|
+
const result = sdpParser__default['default'].parse(candidate.indexOf('a=') === 0 ? candidate : `a=${candidate}`);
|
|
705
728
|
|
|
706
729
|
return result.candidates ? result.candidates[0] : null;
|
|
707
730
|
};
|
|
@@ -715,7 +738,7 @@ const areCandidateValid = (candidates ) =>
|
|
|
715
738
|
.length > 0;
|
|
716
739
|
|
|
717
740
|
const getVideoDirection = (sdp ) => {
|
|
718
|
-
const parsedSdp = sdpParser__default[
|
|
741
|
+
const parsedSdp = sdpParser__default['default'].parse(sdp);
|
|
719
742
|
const videoMedia = parsedSdp.media.find(media => media.type === 'video');
|
|
720
743
|
if (!videoMedia) {
|
|
721
744
|
return null;
|
|
@@ -729,14 +752,14 @@ const hasAnActiveVideo = (sdp ) => {
|
|
|
729
752
|
return false;
|
|
730
753
|
}
|
|
731
754
|
|
|
732
|
-
const parsedSdp = sdpParser__default[
|
|
755
|
+
const parsedSdp = sdpParser__default['default'].parse(sdp);
|
|
733
756
|
|
|
734
757
|
return !!parsedSdp.media.find(media =>
|
|
735
758
|
media.type === 'video' && media.port > 10 && (!media.direction || media.direction !== 'inactive'));
|
|
736
759
|
};
|
|
737
760
|
|
|
738
761
|
const fixSdp = (sdp , candidates , forcePort = true) => {
|
|
739
|
-
const parsedSdp = sdpParser__default[
|
|
762
|
+
const parsedSdp = sdpParser__default['default'].parse(sdp);
|
|
740
763
|
const mainCandidate = getSrflxOrRelay(candidates)[0];
|
|
741
764
|
const ip = mainCandidate ? mainCandidate.ip : null;
|
|
742
765
|
|
|
@@ -754,7 +777,7 @@ const fixSdp = (sdp , candidates , forcePort = true)
|
|
|
754
777
|
};
|
|
755
778
|
});
|
|
756
779
|
|
|
757
|
-
let fixed = sdpParser__default[
|
|
780
|
+
let fixed = sdpParser__default['default'].write(parsedSdp);
|
|
758
781
|
|
|
759
782
|
if (ip) {
|
|
760
783
|
fixed = fixed.replace(/IN IP4 0.0.0.0/g, `IN IP4 ${ip}`);
|
|
@@ -800,7 +823,7 @@ class WazoSessionDescriptionHandler extends sessionDescriptionHandler.SessionDes
|
|
|
800
823
|
) {
|
|
801
824
|
super(logger, mediaStreamFactory, sessionDescriptionHandlerConfiguration);
|
|
802
825
|
|
|
803
|
-
this.eventEmitter = new EventEmitter__default[
|
|
826
|
+
this.eventEmitter = new EventEmitter__default['default']();
|
|
804
827
|
this.isWeb = isWeb;
|
|
805
828
|
this.session = session;
|
|
806
829
|
}
|
|
@@ -1239,7 +1262,7 @@ class Emitter {
|
|
|
1239
1262
|
|
|
1240
1263
|
|
|
1241
1264
|
constructor() {
|
|
1242
|
-
this.eventEmitter = new EventEmitter__default[
|
|
1265
|
+
this.eventEmitter = new EventEmitter__default['default']();
|
|
1243
1266
|
}
|
|
1244
1267
|
|
|
1245
1268
|
on(event , callback ) {
|
|
@@ -3175,7 +3198,8 @@ class ExternalApp {
|
|
|
3175
3198
|
|
|
3176
3199
|
|
|
3177
3200
|
|
|
3178
|
-
|
|
3201
|
+
|
|
3202
|
+
|
|
3179
3203
|
|
|
3180
3204
|
|
|
3181
3205
|
class Meeting {
|
|
@@ -3187,6 +3211,7 @@ class Meeting {
|
|
|
3187
3211
|
|
|
3188
3212
|
|
|
3189
3213
|
|
|
3214
|
+
|
|
3190
3215
|
|
|
3191
3216
|
|
|
3192
3217
|
static parse(plain ) {
|
|
@@ -3198,14 +3223,28 @@ class Meeting {
|
|
|
3198
3223
|
port: plain.port,
|
|
3199
3224
|
uuid: plain.uuid,
|
|
3200
3225
|
number: plain.number,
|
|
3226
|
+
persistent: plain.persistent,
|
|
3201
3227
|
});
|
|
3202
3228
|
}
|
|
3203
3229
|
|
|
3230
|
+
static parseMany(items ) {
|
|
3231
|
+
return items.map(plain => Meeting.parse(plain));
|
|
3232
|
+
}
|
|
3233
|
+
|
|
3204
3234
|
static newFrom(meeting ) {
|
|
3205
3235
|
return newFrom(meeting, Meeting);
|
|
3206
3236
|
}
|
|
3207
3237
|
|
|
3208
|
-
constructor({
|
|
3238
|
+
constructor({
|
|
3239
|
+
uuid,
|
|
3240
|
+
name,
|
|
3241
|
+
guestSipAuthorization,
|
|
3242
|
+
ownerUuids,
|
|
3243
|
+
port,
|
|
3244
|
+
uri,
|
|
3245
|
+
number,
|
|
3246
|
+
persistent,
|
|
3247
|
+
} = {}) {
|
|
3209
3248
|
this.guestSipAuthorization = guestSipAuthorization;
|
|
3210
3249
|
this.uri = uri;
|
|
3211
3250
|
this.name = name;
|
|
@@ -3213,6 +3252,7 @@ class Meeting {
|
|
|
3213
3252
|
this.port = port;
|
|
3214
3253
|
this.uuid = uuid;
|
|
3215
3254
|
this.number = number;
|
|
3255
|
+
this.persistent = persistent;
|
|
3216
3256
|
|
|
3217
3257
|
// Useful to compare instead of instanceof with minified code
|
|
3218
3258
|
this.type = 'Meeting';
|
|
@@ -3290,8 +3330,11 @@ var confdMethods = (client , baseUrl ) => ({
|
|
|
3290
3330
|
}
|
|
3291
3331
|
},
|
|
3292
3332
|
|
|
3293
|
-
|
|
3294
|
-
client.
|
|
3333
|
+
getMyMeetings: () =>
|
|
3334
|
+
client.get(`${baseUrl}/users/me/meetings`).then(response => Meeting.parseMany(response.items)),
|
|
3335
|
+
|
|
3336
|
+
createMyMeeting: (name , persistent ) =>
|
|
3337
|
+
client.post(`${baseUrl}/users/me/meetings`, { name, persistent }).then(Meeting.parse),
|
|
3295
3338
|
|
|
3296
3339
|
deleteMyMeeting: (meetingUuid ) =>
|
|
3297
3340
|
client.delete(`${baseUrl}/users/me/meetings/${meetingUuid}`, null),
|
|
@@ -3393,7 +3436,7 @@ class ChatMessage {
|
|
|
3393
3436
|
static parse(plain ) {
|
|
3394
3437
|
return new ChatMessage({
|
|
3395
3438
|
uuid: plain.uuid,
|
|
3396
|
-
date: moment__default[
|
|
3439
|
+
date: moment__default['default'](plain.created_at).toDate(),
|
|
3397
3440
|
content: plain.content,
|
|
3398
3441
|
alias: plain.alias,
|
|
3399
3442
|
userUuid: plain.user_uuid,
|
|
@@ -3485,7 +3528,7 @@ class Voicemail {
|
|
|
3485
3528
|
static parse(plain ) {
|
|
3486
3529
|
return new Voicemail({
|
|
3487
3530
|
id: plain.id,
|
|
3488
|
-
date: moment__default[
|
|
3531
|
+
date: moment__default['default'](plain.timestamp * 1000).toDate(),
|
|
3489
3532
|
duration: plain.duration * 1000,
|
|
3490
3533
|
caller: {
|
|
3491
3534
|
name: plain.caller_id_name,
|
|
@@ -3622,7 +3665,7 @@ class Call {
|
|
|
3622
3665
|
onHold: plain.on_hold,
|
|
3623
3666
|
status: plain.status,
|
|
3624
3667
|
lineId: plain.line_id,
|
|
3625
|
-
startingTime: moment__default[
|
|
3668
|
+
startingTime: moment__default['default'](plain.creation_time).toDate(),
|
|
3626
3669
|
talkingToIds: Object.keys(plain.talking_to || {}),
|
|
3627
3670
|
recording: plain.record_state === RECORD_STATE_ACTIVE,
|
|
3628
3671
|
});
|
|
@@ -3776,7 +3819,7 @@ class Recording {
|
|
|
3776
3819
|
|
|
3777
3820
|
|
|
3778
3821
|
|
|
3779
|
-
static parseMany(recordings
|
|
3822
|
+
static parseMany(recordings = []) {
|
|
3780
3823
|
return recordings.map(item => Recording.parse(item));
|
|
3781
3824
|
}
|
|
3782
3825
|
|
|
@@ -3784,8 +3827,8 @@ class Recording {
|
|
|
3784
3827
|
return new Recording({
|
|
3785
3828
|
deleted: plain.deleted,
|
|
3786
3829
|
fileName: plain.filename,
|
|
3787
|
-
end: plain.end_time ? moment__default[
|
|
3788
|
-
start: moment__default[
|
|
3830
|
+
end: plain.end_time ? moment__default['default'](plain.end_time).toDate() : null,
|
|
3831
|
+
start: moment__default['default'](plain.start_time).toDate(),
|
|
3789
3832
|
uuid: plain.uuid,
|
|
3790
3833
|
});
|
|
3791
3834
|
}
|
|
@@ -3883,7 +3926,7 @@ class CallLog {
|
|
|
3883
3926
|
|
|
3884
3927
|
static parse(plain ) {
|
|
3885
3928
|
return new CallLog({
|
|
3886
|
-
answer: plain.answer ? moment__default[
|
|
3929
|
+
answer: plain.answer ? moment__default['default'](plain.answer).toDate() : null,
|
|
3887
3930
|
answered: plain.answered,
|
|
3888
3931
|
callDirection: plain.call_direction,
|
|
3889
3932
|
destination: {
|
|
@@ -3900,9 +3943,9 @@ class CallLog {
|
|
|
3900
3943
|
},
|
|
3901
3944
|
id: plain.id,
|
|
3902
3945
|
duration: (plain.duration || 0) * 1000, // duration is in seconds
|
|
3903
|
-
start: moment__default[
|
|
3904
|
-
end: plain.end ? moment__default[
|
|
3905
|
-
recordings: Recording.parseMany(plain.recordings),
|
|
3946
|
+
start: moment__default['default'](plain.start).toDate(),
|
|
3947
|
+
end: plain.end ? moment__default['default'](plain.end).toDate() : null,
|
|
3948
|
+
recordings: Recording.parseMany(plain.recordings || []),
|
|
3906
3949
|
});
|
|
3907
3950
|
}
|
|
3908
3951
|
|
|
@@ -5703,7 +5746,9 @@ class WebRTCClient extends Emitter {
|
|
|
5703
5746
|
const inviteOptions = {
|
|
5704
5747
|
requestDelegate: {
|
|
5705
5748
|
onAccept: (response ) => {
|
|
5706
|
-
session.sessionDescriptionHandler.peerConnection
|
|
5749
|
+
if (session.sessionDescriptionHandler.peerConnection) {
|
|
5750
|
+
session.sessionDescriptionHandler.peerConnection.sfu = conference;
|
|
5751
|
+
}
|
|
5707
5752
|
this._onAccepted(session, response.session, true);
|
|
5708
5753
|
},
|
|
5709
5754
|
onReject: (response ) => {
|
|
@@ -6039,7 +6084,7 @@ class WebRTCClient extends Emitter {
|
|
|
6039
6084
|
// We search for the last transceiver without `video-` in the mid (video- means remote transceiver)
|
|
6040
6085
|
const transceivers = pc.getTransceivers();
|
|
6041
6086
|
const transceiverIdx = lastIndexOf(transceivers, transceiver =>
|
|
6042
|
-
transceiver.sender.track === null && transceiver.mid.indexOf('video') === -1);
|
|
6087
|
+
transceiver.sender.track === null && transceiver.mid && transceiver.mid.indexOf('video') === -1);
|
|
6043
6088
|
|
|
6044
6089
|
videoSender = transceiverIdx !== -1 ? transceivers[transceiverIdx].sender : null;
|
|
6045
6090
|
} else {
|
|
@@ -6575,6 +6620,16 @@ class WebRTCClient extends Emitter {
|
|
|
6575
6620
|
return this.hasRemoteVideo(sessionId) ? this.getRemoteStream(sessionId) : null;
|
|
6576
6621
|
}
|
|
6577
6622
|
|
|
6623
|
+
// Useful in a react-native environment when remoteMediaStream is not updated
|
|
6624
|
+
getRemoteVideoStreamFromPc(sessionId ) {
|
|
6625
|
+
const pc = this.getPeerConnection(sessionId);
|
|
6626
|
+
if (!pc) {
|
|
6627
|
+
return null;
|
|
6628
|
+
}
|
|
6629
|
+
|
|
6630
|
+
return pc.getRemoteStreams().find(stream => !!stream.getVideoTracks().length);
|
|
6631
|
+
}
|
|
6632
|
+
|
|
6578
6633
|
hasVideo(sessionId ) {
|
|
6579
6634
|
return this.hasLocalVideo(sessionId) || this.hasRemoteVideo(sessionId);
|
|
6580
6635
|
}
|
|
@@ -7085,6 +7140,7 @@ class WebRTCClient extends Emitter {
|
|
|
7085
7140
|
session.sessionDescriptionHandler.remoteMediaStream.onaddtrack = onTrack;
|
|
7086
7141
|
|
|
7087
7142
|
pc.oniceconnectionstatechange = () => {
|
|
7143
|
+
logger.info('on ice connection state changed', { state: pc.iceConnectionState });
|
|
7088
7144
|
if (pc.iceConnectionState === 'disconnected') {
|
|
7089
7145
|
this.eventEmitter.emit(ON_DISCONNECTED);
|
|
7090
7146
|
}
|
|
@@ -7244,7 +7300,7 @@ class WebRTCClient extends Emitter {
|
|
|
7244
7300
|
}
|
|
7245
7301
|
const sessionId = this.getSipSessionId(session);
|
|
7246
7302
|
|
|
7247
|
-
getStats__default[
|
|
7303
|
+
getStats__default['default'](pc, (result ) => {
|
|
7248
7304
|
const { results, internal, nomore, ...stats } = result;
|
|
7249
7305
|
this.statsIntervals[sessionId] = nomore;
|
|
7250
7306
|
|
|
@@ -7353,18 +7409,22 @@ class WebRTCClient extends Emitter {
|
|
|
7353
7409
|
});
|
|
7354
7410
|
|
|
7355
7411
|
networkStats.packetsLost = packetsLost;
|
|
7356
|
-
networkStats.
|
|
7412
|
+
networkStats.totalAudioBytesSent = audioBytesSent;
|
|
7413
|
+
networkStats.audioBytesSent = audioBytesSent - lastAudioSent;
|
|
7414
|
+
networkStats.totalAudioBytesReceived = audioBytesReceived - lastAudioReceived;
|
|
7357
7415
|
networkStats.audioBytesReceived = audioBytesReceived;
|
|
7358
|
-
networkStats.
|
|
7359
|
-
networkStats.
|
|
7416
|
+
networkStats.totalVideoBytesSent = videoBytesSent;
|
|
7417
|
+
networkStats.videoBytesSent = videoBytesSent - lastVideoSent;
|
|
7418
|
+
networkStats.totalVideoBytesReceived = videoBytesReceived;
|
|
7419
|
+
networkStats.videoBytesReceived = videoBytesReceived - lastVideoReceived;
|
|
7420
|
+
networkStats.totalTransportSent = transportSent - lastTransportSent;
|
|
7360
7421
|
networkStats.transportSent = transportSent;
|
|
7361
|
-
networkStats.
|
|
7362
|
-
|
|
7363
|
-
const bandwidth = (networkStats.audioBytesSent - lastAudioSent) + (networkStats.videoBytesSent - lastVideoSent)
|
|
7364
|
-
+ (networkStats.audioBytesReceived - lastAudioReceived) + (networkStats.videoBytesReceived - lastVideoReceived)
|
|
7365
|
-
+ (networkStats.transportReceived - lastTransportReceived) + (networkStats.transportSent - lastTransportSent);
|
|
7422
|
+
networkStats.totalTransportReceived = transportReceived;
|
|
7423
|
+
networkStats.transportReceived = transportReceived - lastTransportReceived;
|
|
7366
7424
|
|
|
7367
|
-
networkStats.bandwidth =
|
|
7425
|
+
networkStats.bandwidth = networkStats.audioBytesSent + networkStats.audioBytesReceived
|
|
7426
|
+
+ networkStats.videoBytesSent + networkStats.videoBytesReceived + networkStats.transportReceived
|
|
7427
|
+
+ networkStats.transportSent;
|
|
7368
7428
|
|
|
7369
7429
|
this.eventEmitter.emit(ON_NETWORK_STATS, session, networkStats, this.sessionNetworkStats[sessionId]);
|
|
7370
7430
|
this.sessionNetworkStats[sessionId].push(networkStats);
|
|
@@ -99,7 +99,7 @@ class Call {
|
|
|
99
99
|
onHold: plain.on_hold,
|
|
100
100
|
status: plain.status,
|
|
101
101
|
lineId: plain.line_id,
|
|
102
|
-
startingTime: moment__default[
|
|
102
|
+
startingTime: moment__default['default'](plain.creation_time).toDate(),
|
|
103
103
|
talkingToIds: Object.keys(plain.talking_to || {}),
|
|
104
104
|
recording: plain.record_state === RECORD_STATE_ACTIVE,
|
|
105
105
|
});
|
|
@@ -353,6 +353,7 @@ class IssueReporter {
|
|
|
353
353
|
|
|
354
354
|
|
|
355
355
|
|
|
356
|
+
|
|
356
357
|
|
|
357
358
|
constructor() {
|
|
358
359
|
addLevelsTo(this);
|
|
@@ -364,12 +365,17 @@ class IssueReporter {
|
|
|
364
365
|
this.bufferTimeout = null;
|
|
365
366
|
this._boundProcessBuffer = this._processBuffer.bind(this);
|
|
366
367
|
this._boundParseLoggerBody = this._parseLoggerBody.bind(this);
|
|
368
|
+
this._callback = null;
|
|
367
369
|
}
|
|
368
370
|
|
|
369
371
|
init() {
|
|
370
372
|
this._catchConsole();
|
|
371
373
|
}
|
|
372
374
|
|
|
375
|
+
setCallback(cb ) {
|
|
376
|
+
this._callback = cb;
|
|
377
|
+
}
|
|
378
|
+
|
|
373
379
|
configureRemoteClient(configuration = { tag: 'wazo-sdk', host: null, port: null, level: null, extra: {} }) {
|
|
374
380
|
this.remoteClientConfiguration = configuration;
|
|
375
381
|
}
|
|
@@ -405,6 +411,7 @@ class IssueReporter {
|
|
|
405
411
|
|
|
406
412
|
// Handle category label
|
|
407
413
|
let category = null;
|
|
414
|
+
let skipSendToRemote = false;
|
|
408
415
|
let extra = {};
|
|
409
416
|
if (args[0].indexOf(CATEGORY_PREFIX) === 0) {
|
|
410
417
|
category = args[0].split('=')[1];
|
|
@@ -420,6 +427,7 @@ class IssueReporter {
|
|
|
420
427
|
errorMessage: lastArg.message,
|
|
421
428
|
errorStack: lastArg.stack,
|
|
422
429
|
errorType: lastArg.constructor.name,
|
|
430
|
+
skipSendToRemote: lastArg.skipSendToRemote,
|
|
423
431
|
};
|
|
424
432
|
} else {
|
|
425
433
|
extra = lastArg;
|
|
@@ -428,7 +436,12 @@ class IssueReporter {
|
|
|
428
436
|
args.splice(1, 1);
|
|
429
437
|
}
|
|
430
438
|
|
|
431
|
-
|
|
439
|
+
if (extra.skipSendToRemote) {
|
|
440
|
+
skipSendToRemote = true;
|
|
441
|
+
delete extra.skipSendToRemote;
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
const date = moment__default['default']().format('YYYY-MM-DD HH:mm:ss.SSS');
|
|
432
445
|
const message = args.join(', ');
|
|
433
446
|
let consoleMessage = message;
|
|
434
447
|
|
|
@@ -448,7 +461,13 @@ class IssueReporter {
|
|
|
448
461
|
const oldMethod = this.oldConsoleMethods[consoleLevel] || this.oldConsoleMethods.log;
|
|
449
462
|
oldMethod.apply(oldMethod, [date, consoleMessage]);
|
|
450
463
|
|
|
451
|
-
this.
|
|
464
|
+
if (this._callback) {
|
|
465
|
+
this._callback(level, consoleMessage);
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
if (!skipSendToRemote) {
|
|
469
|
+
this._sendToRemoteLogger(level, { date, message, category, ...extra });
|
|
470
|
+
}
|
|
452
471
|
}
|
|
453
472
|
|
|
454
473
|
logRequest(url , options , response , start ) {
|
|
@@ -593,7 +612,11 @@ class IssueReporter {
|
|
|
593
612
|
},
|
|
594
613
|
// $FlowFixMe
|
|
595
614
|
body,
|
|
596
|
-
}).catch(() => {
|
|
615
|
+
}).catch((e ) => {
|
|
616
|
+
// $FlowFixMe
|
|
617
|
+
e.skipSendToRemote = true;
|
|
618
|
+
this.log('error', this._makeCategory('grafana'), 'Sending log to grafana, error', e);
|
|
619
|
+
|
|
597
620
|
setTimeout(() => {
|
|
598
621
|
if (isArray) {
|
|
599
622
|
payload = payload.map(message => {
|
|
@@ -605,7 +628,7 @@ class IssueReporter {
|
|
|
605
628
|
payload._retry = retry + 1;
|
|
606
629
|
}
|
|
607
630
|
|
|
608
|
-
this._sendDebugToGrafana(
|
|
631
|
+
this._sendDebugToGrafana(payload, retry + 1);
|
|
609
632
|
}, 5000 + retry * 1000);
|
|
610
633
|
});
|
|
611
634
|
}
|
|
@@ -2797,7 +2820,8 @@ class ExternalApp {
|
|
|
2797
2820
|
|
|
2798
2821
|
|
|
2799
2822
|
|
|
2800
|
-
|
|
2823
|
+
|
|
2824
|
+
|
|
2801
2825
|
|
|
2802
2826
|
|
|
2803
2827
|
class Meeting {
|
|
@@ -2809,6 +2833,7 @@ class Meeting {
|
|
|
2809
2833
|
|
|
2810
2834
|
|
|
2811
2835
|
|
|
2836
|
+
|
|
2812
2837
|
|
|
2813
2838
|
|
|
2814
2839
|
static parse(plain ) {
|
|
@@ -2820,14 +2845,28 @@ class Meeting {
|
|
|
2820
2845
|
port: plain.port,
|
|
2821
2846
|
uuid: plain.uuid,
|
|
2822
2847
|
number: plain.number,
|
|
2848
|
+
persistent: plain.persistent,
|
|
2823
2849
|
});
|
|
2824
2850
|
}
|
|
2825
2851
|
|
|
2852
|
+
static parseMany(items ) {
|
|
2853
|
+
return items.map(plain => Meeting.parse(plain));
|
|
2854
|
+
}
|
|
2855
|
+
|
|
2826
2856
|
static newFrom(meeting ) {
|
|
2827
2857
|
return newFrom(meeting, Meeting);
|
|
2828
2858
|
}
|
|
2829
2859
|
|
|
2830
|
-
constructor({
|
|
2860
|
+
constructor({
|
|
2861
|
+
uuid,
|
|
2862
|
+
name,
|
|
2863
|
+
guestSipAuthorization,
|
|
2864
|
+
ownerUuids,
|
|
2865
|
+
port,
|
|
2866
|
+
uri,
|
|
2867
|
+
number,
|
|
2868
|
+
persistent,
|
|
2869
|
+
} = {}) {
|
|
2831
2870
|
this.guestSipAuthorization = guestSipAuthorization;
|
|
2832
2871
|
this.uri = uri;
|
|
2833
2872
|
this.name = name;
|
|
@@ -2835,6 +2874,7 @@ class Meeting {
|
|
|
2835
2874
|
this.port = port;
|
|
2836
2875
|
this.uuid = uuid;
|
|
2837
2876
|
this.number = number;
|
|
2877
|
+
this.persistent = persistent;
|
|
2838
2878
|
|
|
2839
2879
|
// Useful to compare instead of instanceof with minified code
|
|
2840
2880
|
this.type = 'Meeting';
|
|
@@ -2912,8 +2952,11 @@ var confdMethods = (client , baseUrl ) => ({
|
|
|
2912
2952
|
}
|
|
2913
2953
|
},
|
|
2914
2954
|
|
|
2915
|
-
|
|
2916
|
-
client.
|
|
2955
|
+
getMyMeetings: () =>
|
|
2956
|
+
client.get(`${baseUrl}/users/me/meetings`).then(response => Meeting.parseMany(response.items)),
|
|
2957
|
+
|
|
2958
|
+
createMyMeeting: (name , persistent ) =>
|
|
2959
|
+
client.post(`${baseUrl}/users/me/meetings`, { name, persistent }).then(Meeting.parse),
|
|
2917
2960
|
|
|
2918
2961
|
deleteMyMeeting: (meetingUuid ) =>
|
|
2919
2962
|
client.delete(`${baseUrl}/users/me/meetings/${meetingUuid}`, null),
|
|
@@ -3015,7 +3058,7 @@ class ChatMessage {
|
|
|
3015
3058
|
static parse(plain ) {
|
|
3016
3059
|
return new ChatMessage({
|
|
3017
3060
|
uuid: plain.uuid,
|
|
3018
|
-
date: moment__default[
|
|
3061
|
+
date: moment__default['default'](plain.created_at).toDate(),
|
|
3019
3062
|
content: plain.content,
|
|
3020
3063
|
alias: plain.alias,
|
|
3021
3064
|
userUuid: plain.user_uuid,
|
|
@@ -3107,7 +3150,7 @@ class Voicemail {
|
|
|
3107
3150
|
static parse(plain ) {
|
|
3108
3151
|
return new Voicemail({
|
|
3109
3152
|
id: plain.id,
|
|
3110
|
-
date: moment__default[
|
|
3153
|
+
date: moment__default['default'](plain.timestamp * 1000).toDate(),
|
|
3111
3154
|
duration: plain.duration * 1000,
|
|
3112
3155
|
caller: {
|
|
3113
3156
|
name: plain.caller_id_name,
|
|
@@ -3192,7 +3235,7 @@ class Recording {
|
|
|
3192
3235
|
|
|
3193
3236
|
|
|
3194
3237
|
|
|
3195
|
-
static parseMany(recordings
|
|
3238
|
+
static parseMany(recordings = []) {
|
|
3196
3239
|
return recordings.map(item => Recording.parse(item));
|
|
3197
3240
|
}
|
|
3198
3241
|
|
|
@@ -3200,8 +3243,8 @@ class Recording {
|
|
|
3200
3243
|
return new Recording({
|
|
3201
3244
|
deleted: plain.deleted,
|
|
3202
3245
|
fileName: plain.filename,
|
|
3203
|
-
end: plain.end_time ? moment__default[
|
|
3204
|
-
start: moment__default[
|
|
3246
|
+
end: plain.end_time ? moment__default['default'](plain.end_time).toDate() : null,
|
|
3247
|
+
start: moment__default['default'](plain.start_time).toDate(),
|
|
3205
3248
|
uuid: plain.uuid,
|
|
3206
3249
|
});
|
|
3207
3250
|
}
|
|
@@ -3299,7 +3342,7 @@ class CallLog {
|
|
|
3299
3342
|
|
|
3300
3343
|
static parse(plain ) {
|
|
3301
3344
|
return new CallLog({
|
|
3302
|
-
answer: plain.answer ? moment__default[
|
|
3345
|
+
answer: plain.answer ? moment__default['default'](plain.answer).toDate() : null,
|
|
3303
3346
|
answered: plain.answered,
|
|
3304
3347
|
callDirection: plain.call_direction,
|
|
3305
3348
|
destination: {
|
|
@@ -3316,9 +3359,9 @@ class CallLog {
|
|
|
3316
3359
|
},
|
|
3317
3360
|
id: plain.id,
|
|
3318
3361
|
duration: (plain.duration || 0) * 1000, // duration is in seconds
|
|
3319
|
-
start: moment__default[
|
|
3320
|
-
end: plain.end ? moment__default[
|
|
3321
|
-
recordings: Recording.parseMany(plain.recordings),
|
|
3362
|
+
start: moment__default['default'](plain.start).toDate(),
|
|
3363
|
+
end: plain.end ? moment__default['default'](plain.end).toDate() : null,
|
|
3364
|
+
recordings: Recording.parseMany(plain.recordings || []),
|
|
3322
3365
|
});
|
|
3323
3366
|
}
|
|
3324
3367
|
|
package/lib/domain/Call.js
CHANGED
|
@@ -94,7 +94,7 @@ class Call {
|
|
|
94
94
|
onHold: plain.on_hold,
|
|
95
95
|
status: plain.status,
|
|
96
96
|
lineId: plain.line_id,
|
|
97
|
-
startingTime: moment__default[
|
|
97
|
+
startingTime: moment__default['default'](plain.creation_time).toDate(),
|
|
98
98
|
talkingToIds: Object.keys(plain.talking_to || {}),
|
|
99
99
|
recording: plain.record_state === RECORD_STATE_ACTIVE,
|
|
100
100
|
});
|
package/lib/domain/CallLog.js
CHANGED
|
@@ -59,7 +59,7 @@ class Recording {
|
|
|
59
59
|
|
|
60
60
|
|
|
61
61
|
|
|
62
|
-
static parseMany(recordings
|
|
62
|
+
static parseMany(recordings = []) {
|
|
63
63
|
return recordings.map(item => Recording.parse(item));
|
|
64
64
|
}
|
|
65
65
|
|
|
@@ -67,8 +67,8 @@ class Recording {
|
|
|
67
67
|
return new Recording({
|
|
68
68
|
deleted: plain.deleted,
|
|
69
69
|
fileName: plain.filename,
|
|
70
|
-
end: plain.end_time ? moment__default[
|
|
71
|
-
start: moment__default[
|
|
70
|
+
end: plain.end_time ? moment__default['default'](plain.end_time).toDate() : null,
|
|
71
|
+
start: moment__default['default'](plain.start_time).toDate(),
|
|
72
72
|
uuid: plain.uuid,
|
|
73
73
|
});
|
|
74
74
|
}
|
|
@@ -166,7 +166,7 @@ class CallLog {
|
|
|
166
166
|
|
|
167
167
|
static parse(plain ) {
|
|
168
168
|
return new CallLog({
|
|
169
|
-
answer: plain.answer ? moment__default[
|
|
169
|
+
answer: plain.answer ? moment__default['default'](plain.answer).toDate() : null,
|
|
170
170
|
answered: plain.answered,
|
|
171
171
|
callDirection: plain.call_direction,
|
|
172
172
|
destination: {
|
|
@@ -183,9 +183,9 @@ class CallLog {
|
|
|
183
183
|
},
|
|
184
184
|
id: plain.id,
|
|
185
185
|
duration: (plain.duration || 0) * 1000, // duration is in seconds
|
|
186
|
-
start: moment__default[
|
|
187
|
-
end: plain.end ? moment__default[
|
|
188
|
-
recordings: Recording.parseMany(plain.recordings),
|
|
186
|
+
start: moment__default['default'](plain.start).toDate(),
|
|
187
|
+
end: plain.end ? moment__default['default'](plain.end).toDate() : null,
|
|
188
|
+
recordings: Recording.parseMany(plain.recordings || []),
|
|
189
189
|
});
|
|
190
190
|
}
|
|
191
191
|
|
|
@@ -64,7 +64,7 @@ class ChatMessage {
|
|
|
64
64
|
static parse(plain ) {
|
|
65
65
|
return new ChatMessage({
|
|
66
66
|
uuid: plain.uuid,
|
|
67
|
-
date: moment__default[
|
|
67
|
+
date: moment__default['default'](plain.created_at).toDate(),
|
|
68
68
|
content: plain.content,
|
|
69
69
|
alias: plain.alias,
|
|
70
70
|
userUuid: plain.user_uuid,
|
package/lib/domain/Contact.js
CHANGED