@wazo/sdk 0.37.17 → 0.37.21
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 +3 -3
- package/esm/__tests__/api-client.test.js +52 -9
- package/esm/__tests__/web-rtc-client.test.js +96 -21
- package/esm/api/agentd.js +26 -3
- package/esm/api/amid.js +26 -3
- package/esm/api/application.js +26 -3
- package/esm/api/auth.js +26 -3
- package/esm/api/call-logd.js +28 -5
- package/esm/api/calld.js +26 -3
- package/esm/api/chatd.js +26 -3
- package/esm/api/confd.js +50 -7
- package/esm/api/ctid-ng.js +26 -3
- package/esm/api/dird.js +26 -3
- package/esm/api/webhookd.js +26 -3
- package/esm/api-client.js +52 -9
- package/esm/checker/Checker.js +98 -21
- package/esm/checker/checks/aor.js +52 -9
- package/esm/checker/checks/api.js +52 -9
- package/esm/checker/checks/index.js +98 -21
- package/esm/checker/checks/wazo-websocket.js +28 -3
- package/esm/checker/checks/webrtc-transport.js +96 -21
- package/esm/checker/checks/webrtc.js +96 -21
- package/esm/domain/AdHocAPIConference.js +52 -9
- package/esm/domain/CallLog.js +2 -2
- package/esm/domain/Features.js +52 -9
- package/esm/domain/Meeting.js +19 -2
- package/esm/domain/Phone/CTIPhone.js +52 -9
- package/esm/domain/Phone/WebRTCPhone.js +41 -5
- package/esm/domain/Recording.js +1 -1
- package/esm/domain/__tests__/CallLog.test.js +2 -2
- package/esm/index.js +119 -22
- package/esm/lib/WazoSessionDescriptionHandler.js +26 -3
- package/esm/service/CallApi.js +52 -9
- package/esm/service/IssueReporter.js +26 -3
- package/esm/service/__tests__/IssueReporter.test.js +26 -3
- package/esm/service/getApiClient.js +52 -9
- package/esm/simple/Auth.js +119 -22
- package/esm/simple/Configuration.js +119 -22
- package/esm/simple/Directory.js +52 -9
- package/esm/simple/Phone.js +119 -22
- package/esm/simple/Websocket.js +29 -3
- package/esm/simple/index.js +119 -22
- package/esm/simple/room/LocalParticipant.js +119 -22
- package/esm/simple/room/Participant.js +119 -22
- package/esm/simple/room/RemoteParticipant.js +119 -22
- package/esm/simple/room/Room.js +119 -22
- package/esm/simple/room/SipRoom.js +119 -22
- package/esm/simple/room/Stream.js +119 -22
- package/esm/simple/room/__tests__/RemoteParticipant.test.js +119 -22
- package/esm/simple/utils.js +119 -22
- package/esm/utils/__tests__/api-requester.test.js +26 -3
- package/esm/utils/api-requester.js +26 -3
- package/esm/web-rtc-client.js +96 -21
- package/esm/websocket-client.js +29 -4
- package/lib/__tests__/api-client.test.js +52 -9
- package/lib/__tests__/web-rtc-client.test.js +96 -21
- package/lib/api/agentd.js +26 -3
- package/lib/api/amid.js +26 -3
- package/lib/api/application.js +26 -3
- package/lib/api/auth.js +26 -3
- package/lib/api/call-logd.js +28 -5
- package/lib/api/calld.js +26 -3
- package/lib/api/chatd.js +26 -3
- package/lib/api/confd.js +50 -7
- package/lib/api/ctid-ng.js +26 -3
- package/lib/api/dird.js +26 -3
- package/lib/api/webhookd.js +26 -3
- package/lib/api-client.js +52 -9
- package/lib/checker/Checker.js +98 -21
- package/lib/checker/checks/aor.js +52 -9
- package/lib/checker/checks/api.js +52 -9
- package/lib/checker/checks/index.js +98 -21
- package/lib/checker/checks/wazo-websocket.js +28 -3
- package/lib/checker/checks/webrtc-transport.js +96 -21
- package/lib/checker/checks/webrtc.js +96 -21
- package/lib/domain/AdHocAPIConference.js +52 -9
- package/lib/domain/CallLog.js +2 -2
- package/lib/domain/Features.js +52 -9
- package/lib/domain/Meeting.js +19 -2
- package/lib/domain/Phone/CTIPhone.js +52 -9
- package/lib/domain/Phone/WebRTCPhone.js +41 -4
- package/lib/domain/Recording.js +1 -1
- package/lib/domain/__tests__/CallLog.test.js +2 -2
- package/lib/index.js +119 -22
- package/lib/lib/WazoSessionDescriptionHandler.js +26 -3
- package/lib/service/CallApi.js +52 -9
- package/lib/service/IssueReporter.js +26 -3
- package/lib/service/__tests__/IssueReporter.test.js +26 -3
- package/lib/service/getApiClient.js +52 -9
- package/lib/simple/Auth.js +119 -22
- package/lib/simple/Configuration.js +119 -22
- package/lib/simple/Directory.js +52 -9
- package/lib/simple/Phone.js +119 -22
- package/lib/simple/Websocket.js +29 -3
- package/lib/simple/index.js +119 -22
- package/lib/simple/room/LocalParticipant.js +119 -22
- package/lib/simple/room/Participant.js +119 -22
- package/lib/simple/room/RemoteParticipant.js +119 -22
- package/lib/simple/room/Room.js +119 -22
- package/lib/simple/room/SipRoom.js +119 -22
- package/lib/simple/room/Stream.js +119 -22
- package/lib/simple/room/__tests__/RemoteParticipant.test.js +119 -22
- package/lib/simple/utils.js +119 -22
- package/lib/utils/__tests__/api-requester.test.js +26 -3
- package/lib/utils/api-requester.js +26 -3
- package/lib/web-rtc-client.js +96 -21
- package/lib/websocket-client.js +29 -3
- 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 +14 -1
- 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 +44 -12
- 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,6 +504,11 @@ class IssueReporter {
|
|
|
496
504
|
args.splice(1, 1);
|
|
497
505
|
}
|
|
498
506
|
|
|
507
|
+
if (extra.skipSendToRemote) {
|
|
508
|
+
skipSendToRemote = true;
|
|
509
|
+
delete extra.skipSendToRemote;
|
|
510
|
+
}
|
|
511
|
+
|
|
499
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;
|
|
@@ -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
|
}
|
|
@@ -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),
|
|
@@ -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
|
|
|
@@ -3902,7 +3945,7 @@ class CallLog {
|
|
|
3902
3945
|
duration: (plain.duration || 0) * 1000, // duration is in seconds
|
|
3903
3946
|
start: moment__default['default'](plain.start).toDate(),
|
|
3904
3947
|
end: plain.end ? moment__default['default'](plain.end).toDate() : null,
|
|
3905
|
-
recordings: Recording.parseMany(plain.recordings),
|
|
3948
|
+
recordings: Recording.parseMany(plain.recordings || []),
|
|
3906
3949
|
});
|
|
3907
3950
|
}
|
|
3908
3951
|
|
|
@@ -5297,6 +5340,7 @@ const ON_REINVITE = 'reinvite';
|
|
|
5297
5340
|
const ON_ERROR = 'onError';
|
|
5298
5341
|
const ON_SCREEN_SHARING_REINVITE = 'onScreenSharingReinvite';
|
|
5299
5342
|
const ON_NETWORK_STATS = 'onNetworkStats';
|
|
5343
|
+
const ON_DISCONNECTED = 'onDisconnected';
|
|
5300
5344
|
class CanceledCallError extends Error {}
|
|
5301
5345
|
|
|
5302
5346
|
const MAX_REGISTER_TRIES = 10;
|
|
@@ -5370,6 +5414,7 @@ class WebRTCClient extends Emitter {
|
|
|
5370
5414
|
|
|
5371
5415
|
|
|
5372
5416
|
|
|
5417
|
+
|
|
5373
5418
|
|
|
5374
5419
|
static isAPrivateIp(ip ) {
|
|
5375
5420
|
const regex = /^(?:10|127|172\.(?:1[6-9]|2[0-9]|3[01])|192\.168)\..*/;
|
|
@@ -5435,6 +5480,7 @@ class WebRTCClient extends Emitter {
|
|
|
5435
5480
|
this.ON_ERROR = ON_ERROR;
|
|
5436
5481
|
this.ON_SCREEN_SHARING_REINVITE = ON_SCREEN_SHARING_REINVITE;
|
|
5437
5482
|
this.ON_NETWORK_STATS = ON_NETWORK_STATS;
|
|
5483
|
+
this.ON_DISCONNECTED = ON_DISCONNECTED;
|
|
5438
5484
|
}
|
|
5439
5485
|
|
|
5440
5486
|
configureMedia(media ) {
|
|
@@ -5700,7 +5746,9 @@ class WebRTCClient extends Emitter {
|
|
|
5700
5746
|
const inviteOptions = {
|
|
5701
5747
|
requestDelegate: {
|
|
5702
5748
|
onAccept: (response ) => {
|
|
5703
|
-
session.sessionDescriptionHandler.peerConnection
|
|
5749
|
+
if (session.sessionDescriptionHandler.peerConnection) {
|
|
5750
|
+
session.sessionDescriptionHandler.peerConnection.sfu = conference;
|
|
5751
|
+
}
|
|
5704
5752
|
this._onAccepted(session, response.session, true);
|
|
5705
5753
|
},
|
|
5706
5754
|
onReject: (response ) => {
|
|
@@ -6036,7 +6084,7 @@ class WebRTCClient extends Emitter {
|
|
|
6036
6084
|
// We search for the last transceiver without `video-` in the mid (video- means remote transceiver)
|
|
6037
6085
|
const transceivers = pc.getTransceivers();
|
|
6038
6086
|
const transceiverIdx = lastIndexOf(transceivers, transceiver =>
|
|
6039
|
-
transceiver.sender.track === null && transceiver.mid.indexOf('video') === -1);
|
|
6087
|
+
transceiver.sender.track === null && transceiver.mid && transceiver.mid.indexOf('video') === -1);
|
|
6040
6088
|
|
|
6041
6089
|
videoSender = transceiverIdx !== -1 ? transceivers[transceiverIdx].sender : null;
|
|
6042
6090
|
} else {
|
|
@@ -6572,6 +6620,16 @@ class WebRTCClient extends Emitter {
|
|
|
6572
6620
|
return this.hasRemoteVideo(sessionId) ? this.getRemoteStream(sessionId) : null;
|
|
6573
6621
|
}
|
|
6574
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
|
+
|
|
6575
6633
|
hasVideo(sessionId ) {
|
|
6576
6634
|
return this.hasLocalVideo(sessionId) || this.hasRemoteVideo(sessionId);
|
|
6577
6635
|
}
|
|
@@ -7061,6 +7119,7 @@ class WebRTCClient extends Emitter {
|
|
|
7061
7119
|
|
|
7062
7120
|
this.updateRemoteStream(this.getSipSessionId(session));
|
|
7063
7121
|
|
|
7122
|
+
const pc = session.sessionDescriptionHandler.peerConnection;
|
|
7064
7123
|
const onTrack = (event ) => {
|
|
7065
7124
|
const isAudioOnly = this._isAudioOnly(session);
|
|
7066
7125
|
const { kind, label, readyState, id, muted } = event.track;
|
|
@@ -7080,6 +7139,12 @@ class WebRTCClient extends Emitter {
|
|
|
7080
7139
|
|
|
7081
7140
|
session.sessionDescriptionHandler.remoteMediaStream.onaddtrack = onTrack;
|
|
7082
7141
|
|
|
7142
|
+
pc.oniceconnectionstatechange = () => {
|
|
7143
|
+
if (pc.iceConnectionState === 'disconnected') {
|
|
7144
|
+
this.eventEmitter.emit(ON_DISCONNECTED);
|
|
7145
|
+
}
|
|
7146
|
+
};
|
|
7147
|
+
|
|
7083
7148
|
if (withEvent) {
|
|
7084
7149
|
this.eventEmitter.emit(ACCEPTED, session, sessionDialog);
|
|
7085
7150
|
}
|
|
@@ -7299,6 +7364,7 @@ class WebRTCClient extends Emitter {
|
|
|
7299
7364
|
let videoBytesReceived = 0;
|
|
7300
7365
|
let transportSent = 0;
|
|
7301
7366
|
let transportReceived = 0;
|
|
7367
|
+
let packetsLost = 0;
|
|
7302
7368
|
|
|
7303
7369
|
stats.forEach(report => {
|
|
7304
7370
|
if (report.type === 'outbound-rtp' && report.kind === 'audio') {
|
|
@@ -7311,7 +7377,7 @@ class WebRTCClient extends Emitter {
|
|
|
7311
7377
|
videoBytesSent += report.bytesSent + report.headerBytesSent;
|
|
7312
7378
|
}
|
|
7313
7379
|
if (report.type === 'inbound-rtp' && report.kind === 'audio') {
|
|
7314
|
-
|
|
7380
|
+
packetsLost += report.packetsLost;
|
|
7315
7381
|
networkStats.packetsReceived = report.packetsReceived;
|
|
7316
7382
|
audioBytesReceived += report.bytesReceived + report.headerBytesReceived;
|
|
7317
7383
|
}
|
|
@@ -7328,27 +7394,36 @@ class WebRTCClient extends Emitter {
|
|
|
7328
7394
|
}
|
|
7329
7395
|
}
|
|
7330
7396
|
if (report.type === 'remote-inbound-rtp' && report.kind === 'audio') {
|
|
7397
|
+
packetsLost += report.packetsLost;
|
|
7331
7398
|
networkStats.roundTripTime = report.roundTripTime;
|
|
7332
7399
|
networkStats.jitter = report.jitter;
|
|
7333
7400
|
}
|
|
7401
|
+
if (report.type === 'remote-inbound-rtp' && report.kind === 'video') {
|
|
7402
|
+
packetsLost += report.packetsLost;
|
|
7403
|
+
}
|
|
7334
7404
|
if (report.type === 'transport') {
|
|
7335
7405
|
transportSent += report.bytesSent;
|
|
7336
7406
|
transportReceived += report.bytesReceived;
|
|
7337
7407
|
}
|
|
7338
7408
|
});
|
|
7339
7409
|
|
|
7340
|
-
networkStats.
|
|
7410
|
+
networkStats.packetsLost = packetsLost;
|
|
7411
|
+
networkStats.totalAudioBytesSent = audioBytesSent;
|
|
7412
|
+
networkStats.audioBytesSent = audioBytesSent - lastAudioSent;
|
|
7413
|
+
networkStats.totalAudioBytesReceived = audioBytesReceived - lastAudioReceived;
|
|
7341
7414
|
networkStats.audioBytesReceived = audioBytesReceived;
|
|
7342
|
-
networkStats.
|
|
7343
|
-
networkStats.
|
|
7415
|
+
networkStats.totalVideoBytesSent = videoBytesSent;
|
|
7416
|
+
networkStats.videoBytesSent = videoBytesSent - lastVideoSent;
|
|
7417
|
+
networkStats.totalVideoBytesReceived = videoBytesReceived;
|
|
7418
|
+
networkStats.videoBytesReceived = videoBytesReceived - lastVideoReceived;
|
|
7419
|
+
networkStats.totalTransportSent = transportSent - lastTransportSent;
|
|
7344
7420
|
networkStats.transportSent = transportSent;
|
|
7345
|
-
networkStats.
|
|
7346
|
-
|
|
7347
|
-
const bandwidth = (networkStats.audioBytesSent - lastAudioSent) + (networkStats.videoBytesSent - lastVideoSent)
|
|
7348
|
-
+ (networkStats.audioBytesReceived - lastAudioReceived) + (networkStats.videoBytesReceived - lastVideoReceived)
|
|
7349
|
-
+ (networkStats.transportReceived - lastTransportReceived) + (networkStats.transportSent - lastTransportSent);
|
|
7421
|
+
networkStats.totalTransportReceived = transportReceived;
|
|
7422
|
+
networkStats.transportReceived = transportReceived - lastTransportReceived;
|
|
7350
7423
|
|
|
7351
|
-
networkStats.bandwidth =
|
|
7424
|
+
networkStats.bandwidth = networkStats.audioBytesSent + networkStats.audioBytesReceived
|
|
7425
|
+
+ networkStats.videoBytesSent + networkStats.videoBytesReceived + networkStats.transportReceived
|
|
7426
|
+
+ networkStats.transportSent;
|
|
7352
7427
|
|
|
7353
7428
|
this.eventEmitter.emit(ON_NETWORK_STATS, session, networkStats, this.sessionNetworkStats[sessionId]);
|
|
7354
7429
|
this.sessionNetworkStats[sessionId].push(networkStats);
|
|
@@ -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,6 +504,11 @@ class IssueReporter {
|
|
|
496
504
|
args.splice(1, 1);
|
|
497
505
|
}
|
|
498
506
|
|
|
507
|
+
if (extra.skipSendToRemote) {
|
|
508
|
+
skipSendToRemote = true;
|
|
509
|
+
delete extra.skipSendToRemote;
|
|
510
|
+
}
|
|
511
|
+
|
|
499
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;
|
|
@@ -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
|
}
|
|
@@ -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),
|
|
@@ -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
|
|
|
@@ -3902,7 +3945,7 @@ class CallLog {
|
|
|
3902
3945
|
duration: (plain.duration || 0) * 1000, // duration is in seconds
|
|
3903
3946
|
start: moment__default['default'](plain.start).toDate(),
|
|
3904
3947
|
end: plain.end ? moment__default['default'](plain.end).toDate() : null,
|
|
3905
|
-
recordings: Recording.parseMany(plain.recordings),
|
|
3948
|
+
recordings: Recording.parseMany(plain.recordings || []),
|
|
3906
3949
|
});
|
|
3907
3950
|
}
|
|
3908
3951
|
|
|
@@ -5297,6 +5340,7 @@ const ON_REINVITE = 'reinvite';
|
|
|
5297
5340
|
const ON_ERROR = 'onError';
|
|
5298
5341
|
const ON_SCREEN_SHARING_REINVITE = 'onScreenSharingReinvite';
|
|
5299
5342
|
const ON_NETWORK_STATS = 'onNetworkStats';
|
|
5343
|
+
const ON_DISCONNECTED = 'onDisconnected';
|
|
5300
5344
|
class CanceledCallError extends Error {}
|
|
5301
5345
|
|
|
5302
5346
|
const MAX_REGISTER_TRIES = 10;
|
|
@@ -5370,6 +5414,7 @@ class WebRTCClient extends Emitter {
|
|
|
5370
5414
|
|
|
5371
5415
|
|
|
5372
5416
|
|
|
5417
|
+
|
|
5373
5418
|
|
|
5374
5419
|
static isAPrivateIp(ip ) {
|
|
5375
5420
|
const regex = /^(?:10|127|172\.(?:1[6-9]|2[0-9]|3[01])|192\.168)\..*/;
|
|
@@ -5435,6 +5480,7 @@ class WebRTCClient extends Emitter {
|
|
|
5435
5480
|
this.ON_ERROR = ON_ERROR;
|
|
5436
5481
|
this.ON_SCREEN_SHARING_REINVITE = ON_SCREEN_SHARING_REINVITE;
|
|
5437
5482
|
this.ON_NETWORK_STATS = ON_NETWORK_STATS;
|
|
5483
|
+
this.ON_DISCONNECTED = ON_DISCONNECTED;
|
|
5438
5484
|
}
|
|
5439
5485
|
|
|
5440
5486
|
configureMedia(media ) {
|
|
@@ -5700,7 +5746,9 @@ class WebRTCClient extends Emitter {
|
|
|
5700
5746
|
const inviteOptions = {
|
|
5701
5747
|
requestDelegate: {
|
|
5702
5748
|
onAccept: (response ) => {
|
|
5703
|
-
session.sessionDescriptionHandler.peerConnection
|
|
5749
|
+
if (session.sessionDescriptionHandler.peerConnection) {
|
|
5750
|
+
session.sessionDescriptionHandler.peerConnection.sfu = conference;
|
|
5751
|
+
}
|
|
5704
5752
|
this._onAccepted(session, response.session, true);
|
|
5705
5753
|
},
|
|
5706
5754
|
onReject: (response ) => {
|
|
@@ -6036,7 +6084,7 @@ class WebRTCClient extends Emitter {
|
|
|
6036
6084
|
// We search for the last transceiver without `video-` in the mid (video- means remote transceiver)
|
|
6037
6085
|
const transceivers = pc.getTransceivers();
|
|
6038
6086
|
const transceiverIdx = lastIndexOf(transceivers, transceiver =>
|
|
6039
|
-
transceiver.sender.track === null && transceiver.mid.indexOf('video') === -1);
|
|
6087
|
+
transceiver.sender.track === null && transceiver.mid && transceiver.mid.indexOf('video') === -1);
|
|
6040
6088
|
|
|
6041
6089
|
videoSender = transceiverIdx !== -1 ? transceivers[transceiverIdx].sender : null;
|
|
6042
6090
|
} else {
|
|
@@ -6572,6 +6620,16 @@ class WebRTCClient extends Emitter {
|
|
|
6572
6620
|
return this.hasRemoteVideo(sessionId) ? this.getRemoteStream(sessionId) : null;
|
|
6573
6621
|
}
|
|
6574
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
|
+
|
|
6575
6633
|
hasVideo(sessionId ) {
|
|
6576
6634
|
return this.hasLocalVideo(sessionId) || this.hasRemoteVideo(sessionId);
|
|
6577
6635
|
}
|
|
@@ -7061,6 +7119,7 @@ class WebRTCClient extends Emitter {
|
|
|
7061
7119
|
|
|
7062
7120
|
this.updateRemoteStream(this.getSipSessionId(session));
|
|
7063
7121
|
|
|
7122
|
+
const pc = session.sessionDescriptionHandler.peerConnection;
|
|
7064
7123
|
const onTrack = (event ) => {
|
|
7065
7124
|
const isAudioOnly = this._isAudioOnly(session);
|
|
7066
7125
|
const { kind, label, readyState, id, muted } = event.track;
|
|
@@ -7080,6 +7139,12 @@ class WebRTCClient extends Emitter {
|
|
|
7080
7139
|
|
|
7081
7140
|
session.sessionDescriptionHandler.remoteMediaStream.onaddtrack = onTrack;
|
|
7082
7141
|
|
|
7142
|
+
pc.oniceconnectionstatechange = () => {
|
|
7143
|
+
if (pc.iceConnectionState === 'disconnected') {
|
|
7144
|
+
this.eventEmitter.emit(ON_DISCONNECTED);
|
|
7145
|
+
}
|
|
7146
|
+
};
|
|
7147
|
+
|
|
7083
7148
|
if (withEvent) {
|
|
7084
7149
|
this.eventEmitter.emit(ACCEPTED, session, sessionDialog);
|
|
7085
7150
|
}
|
|
@@ -7299,6 +7364,7 @@ class WebRTCClient extends Emitter {
|
|
|
7299
7364
|
let videoBytesReceived = 0;
|
|
7300
7365
|
let transportSent = 0;
|
|
7301
7366
|
let transportReceived = 0;
|
|
7367
|
+
let packetsLost = 0;
|
|
7302
7368
|
|
|
7303
7369
|
stats.forEach(report => {
|
|
7304
7370
|
if (report.type === 'outbound-rtp' && report.kind === 'audio') {
|
|
@@ -7311,7 +7377,7 @@ class WebRTCClient extends Emitter {
|
|
|
7311
7377
|
videoBytesSent += report.bytesSent + report.headerBytesSent;
|
|
7312
7378
|
}
|
|
7313
7379
|
if (report.type === 'inbound-rtp' && report.kind === 'audio') {
|
|
7314
|
-
|
|
7380
|
+
packetsLost += report.packetsLost;
|
|
7315
7381
|
networkStats.packetsReceived = report.packetsReceived;
|
|
7316
7382
|
audioBytesReceived += report.bytesReceived + report.headerBytesReceived;
|
|
7317
7383
|
}
|
|
@@ -7328,27 +7394,36 @@ class WebRTCClient extends Emitter {
|
|
|
7328
7394
|
}
|
|
7329
7395
|
}
|
|
7330
7396
|
if (report.type === 'remote-inbound-rtp' && report.kind === 'audio') {
|
|
7397
|
+
packetsLost += report.packetsLost;
|
|
7331
7398
|
networkStats.roundTripTime = report.roundTripTime;
|
|
7332
7399
|
networkStats.jitter = report.jitter;
|
|
7333
7400
|
}
|
|
7401
|
+
if (report.type === 'remote-inbound-rtp' && report.kind === 'video') {
|
|
7402
|
+
packetsLost += report.packetsLost;
|
|
7403
|
+
}
|
|
7334
7404
|
if (report.type === 'transport') {
|
|
7335
7405
|
transportSent += report.bytesSent;
|
|
7336
7406
|
transportReceived += report.bytesReceived;
|
|
7337
7407
|
}
|
|
7338
7408
|
});
|
|
7339
7409
|
|
|
7340
|
-
networkStats.
|
|
7410
|
+
networkStats.packetsLost = packetsLost;
|
|
7411
|
+
networkStats.totalAudioBytesSent = audioBytesSent;
|
|
7412
|
+
networkStats.audioBytesSent = audioBytesSent - lastAudioSent;
|
|
7413
|
+
networkStats.totalAudioBytesReceived = audioBytesReceived - lastAudioReceived;
|
|
7341
7414
|
networkStats.audioBytesReceived = audioBytesReceived;
|
|
7342
|
-
networkStats.
|
|
7343
|
-
networkStats.
|
|
7415
|
+
networkStats.totalVideoBytesSent = videoBytesSent;
|
|
7416
|
+
networkStats.videoBytesSent = videoBytesSent - lastVideoSent;
|
|
7417
|
+
networkStats.totalVideoBytesReceived = videoBytesReceived;
|
|
7418
|
+
networkStats.videoBytesReceived = videoBytesReceived - lastVideoReceived;
|
|
7419
|
+
networkStats.totalTransportSent = transportSent - lastTransportSent;
|
|
7344
7420
|
networkStats.transportSent = transportSent;
|
|
7345
|
-
networkStats.
|
|
7346
|
-
|
|
7347
|
-
const bandwidth = (networkStats.audioBytesSent - lastAudioSent) + (networkStats.videoBytesSent - lastVideoSent)
|
|
7348
|
-
+ (networkStats.audioBytesReceived - lastAudioReceived) + (networkStats.videoBytesReceived - lastVideoReceived)
|
|
7349
|
-
+ (networkStats.transportReceived - lastTransportReceived) + (networkStats.transportSent - lastTransportSent);
|
|
7421
|
+
networkStats.totalTransportReceived = transportReceived;
|
|
7422
|
+
networkStats.transportReceived = transportReceived - lastTransportReceived;
|
|
7350
7423
|
|
|
7351
|
-
networkStats.bandwidth =
|
|
7424
|
+
networkStats.bandwidth = networkStats.audioBytesSent + networkStats.audioBytesReceived
|
|
7425
|
+
+ networkStats.videoBytesSent + networkStats.videoBytesReceived + networkStats.transportReceived
|
|
7426
|
+
+ networkStats.transportSent;
|
|
7352
7427
|
|
|
7353
7428
|
this.eventEmitter.emit(ON_NETWORK_STATS, session, networkStats, this.sessionNetworkStats[sessionId]);
|
|
7354
7429
|
this.sessionNetworkStats[sessionId].push(networkStats);
|