@wazo/sdk 0.37.16 → 0.37.20
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 +9 -5
- package/esm/__tests__/web-rtc-client.test.js +69 -19
- package/esm/api/agentd.js +1 -1
- package/esm/api/amid.js +1 -1
- package/esm/api/application.js +1 -1
- package/esm/api/auth.js +1 -1
- package/esm/api/call-logd.js +3 -3
- package/esm/api/calld.js +1 -1
- package/esm/api/chatd.js +1 -1
- package/esm/api/confd.js +7 -3
- package/esm/api/ctid-ng.js +1 -1
- package/esm/api/dird.js +1 -1
- package/esm/api/webhookd.js +1 -1
- package/esm/api-client.js +9 -5
- package/esm/checker/Checker.js +69 -19
- package/esm/checker/checks/aor.js +9 -5
- package/esm/checker/checks/api.js +9 -5
- package/esm/checker/checks/index.js +69 -19
- package/esm/checker/checks/wazo-websocket.js +1 -1
- package/esm/checker/checks/webrtc-transport.js +69 -19
- package/esm/checker/checks/webrtc.js +69 -19
- package/esm/domain/AdHocAPIConference.js +9 -5
- package/esm/domain/CallLog.js +2 -2
- package/esm/domain/Features.js +9 -5
- package/esm/domain/Meeting.js +6 -2
- package/esm/domain/Phone/CTIPhone.js +9 -5
- package/esm/domain/Phone/WebRTCPhone.js +9 -2
- package/esm/domain/Recording.js +1 -1
- package/esm/domain/__tests__/CallLog.test.js +2 -2
- package/esm/index.js +77 -19
- package/esm/lib/WazoSessionDescriptionHandler.js +1 -1
- package/esm/service/CallApi.js +9 -5
- package/esm/service/IssueReporter.js +1 -1
- package/esm/service/__tests__/IssueReporter.test.js +1 -1
- package/esm/service/getApiClient.js +9 -5
- package/esm/simple/Auth.js +77 -19
- package/esm/simple/Configuration.js +77 -19
- package/esm/simple/Directory.js +9 -5
- package/esm/simple/Phone.js +77 -19
- package/esm/simple/Websocket.js +1 -1
- package/esm/simple/index.js +77 -19
- package/esm/simple/room/LocalParticipant.js +77 -19
- package/esm/simple/room/Participant.js +77 -19
- package/esm/simple/room/RemoteParticipant.js +77 -19
- package/esm/simple/room/Room.js +77 -19
- package/esm/simple/room/SipRoom.js +77 -19
- package/esm/simple/room/Stream.js +77 -19
- package/esm/simple/room/__tests__/RemoteParticipant.test.js +77 -19
- package/esm/simple/utils.js +77 -19
- package/esm/utils/__tests__/api-requester.test.js +1 -1
- package/esm/utils/api-requester.js +1 -1
- package/esm/web-rtc-client.js +69 -19
- package/esm/websocket-client.js +1 -1
- package/lib/__tests__/api-client.test.js +9 -5
- package/lib/__tests__/web-rtc-client.test.js +69 -19
- package/lib/api/agentd.js +1 -1
- package/lib/api/amid.js +1 -1
- package/lib/api/application.js +1 -1
- package/lib/api/auth.js +1 -1
- package/lib/api/call-logd.js +3 -3
- package/lib/api/calld.js +1 -1
- package/lib/api/chatd.js +1 -1
- package/lib/api/confd.js +7 -3
- package/lib/api/ctid-ng.js +1 -1
- package/lib/api/dird.js +1 -1
- package/lib/api/webhookd.js +1 -1
- package/lib/api-client.js +9 -5
- package/lib/checker/Checker.js +69 -19
- package/lib/checker/checks/aor.js +9 -5
- package/lib/checker/checks/api.js +9 -5
- package/lib/checker/checks/index.js +69 -19
- package/lib/checker/checks/wazo-websocket.js +1 -1
- package/lib/checker/checks/webrtc-transport.js +69 -19
- package/lib/checker/checks/webrtc.js +69 -19
- package/lib/domain/AdHocAPIConference.js +9 -5
- package/lib/domain/CallLog.js +2 -2
- package/lib/domain/Features.js +9 -5
- package/lib/domain/Meeting.js +6 -2
- package/lib/domain/Phone/CTIPhone.js +9 -5
- package/lib/domain/Phone/WebRTCPhone.js +9 -1
- package/lib/domain/Recording.js +1 -1
- package/lib/domain/__tests__/CallLog.test.js +2 -2
- package/lib/index.js +77 -19
- package/lib/lib/WazoSessionDescriptionHandler.js +1 -1
- package/lib/service/CallApi.js +9 -5
- package/lib/service/IssueReporter.js +1 -1
- package/lib/service/__tests__/IssueReporter.test.js +1 -1
- package/lib/service/getApiClient.js +9 -5
- package/lib/simple/Auth.js +77 -19
- package/lib/simple/Configuration.js +77 -19
- package/lib/simple/Directory.js +9 -5
- package/lib/simple/Phone.js +77 -19
- package/lib/simple/Websocket.js +1 -1
- package/lib/simple/index.js +77 -19
- package/lib/simple/room/LocalParticipant.js +77 -19
- package/lib/simple/room/Participant.js +77 -19
- package/lib/simple/room/RemoteParticipant.js +77 -19
- package/lib/simple/room/Room.js +77 -19
- package/lib/simple/room/SipRoom.js +77 -19
- package/lib/simple/room/Stream.js +77 -19
- package/lib/simple/room/__tests__/RemoteParticipant.test.js +77 -19
- package/lib/simple/utils.js +77 -19
- package/lib/utils/__tests__/api-requester.test.js +1 -1
- package/lib/utils/api-requester.js +1 -1
- package/lib/web-rtc-client.js +69 -19
- package/lib/websocket-client.js +1 -1
- package/package.json +2 -2
- package/src/domain/CallLog.js +1 -1
- package/src/domain/Meeting.js +6 -2
- package/src/domain/Phone/WebRTCPhone.js +7 -0
- package/src/domain/Recording.js +1 -1
- package/src/service/IssueReporter.js +1 -1
- package/src/web-rtc-client.js +60 -14
package/esm/web-rtc-client.js
CHANGED
|
@@ -664,7 +664,7 @@ class IssueReporter {
|
|
|
664
664
|
payload._retry = retry + 1;
|
|
665
665
|
}
|
|
666
666
|
|
|
667
|
-
this._sendDebugToGrafana(
|
|
667
|
+
this._sendDebugToGrafana(payload, retry + 1);
|
|
668
668
|
}, 5000 + retry * 1000);
|
|
669
669
|
});
|
|
670
670
|
}
|
|
@@ -3166,7 +3166,8 @@ class ExternalApp {
|
|
|
3166
3166
|
|
|
3167
3167
|
|
|
3168
3168
|
|
|
3169
|
-
|
|
3169
|
+
|
|
3170
|
+
|
|
3170
3171
|
|
|
3171
3172
|
|
|
3172
3173
|
class Meeting {
|
|
@@ -3178,6 +3179,7 @@ class Meeting {
|
|
|
3178
3179
|
|
|
3179
3180
|
|
|
3180
3181
|
|
|
3182
|
+
|
|
3181
3183
|
|
|
3182
3184
|
|
|
3183
3185
|
static parse(plain ) {
|
|
@@ -3189,6 +3191,7 @@ class Meeting {
|
|
|
3189
3191
|
port: plain.port,
|
|
3190
3192
|
uuid: plain.uuid,
|
|
3191
3193
|
number: plain.number,
|
|
3194
|
+
persistent: plain.persistent,
|
|
3192
3195
|
});
|
|
3193
3196
|
}
|
|
3194
3197
|
|
|
@@ -3196,7 +3199,7 @@ class Meeting {
|
|
|
3196
3199
|
return newFrom(meeting, Meeting);
|
|
3197
3200
|
}
|
|
3198
3201
|
|
|
3199
|
-
constructor({ uuid, name, guestSipAuthorization, ownerUuids, port, uri, number } = {}) {
|
|
3202
|
+
constructor({ uuid, name, guestSipAuthorization, ownerUuids, port, uri, number, persistent } = {}) {
|
|
3200
3203
|
this.guestSipAuthorization = guestSipAuthorization;
|
|
3201
3204
|
this.uri = uri;
|
|
3202
3205
|
this.name = name;
|
|
@@ -3204,6 +3207,7 @@ class Meeting {
|
|
|
3204
3207
|
this.port = port;
|
|
3205
3208
|
this.uuid = uuid;
|
|
3206
3209
|
this.number = number;
|
|
3210
|
+
this.persistent = persistent;
|
|
3207
3211
|
|
|
3208
3212
|
// Useful to compare instead of instanceof with minified code
|
|
3209
3213
|
this.type = 'Meeting';
|
|
@@ -3767,7 +3771,7 @@ class Recording {
|
|
|
3767
3771
|
|
|
3768
3772
|
|
|
3769
3773
|
|
|
3770
|
-
static parseMany(recordings
|
|
3774
|
+
static parseMany(recordings = []) {
|
|
3771
3775
|
return recordings.map(item => Recording.parse(item));
|
|
3772
3776
|
}
|
|
3773
3777
|
|
|
@@ -3893,7 +3897,7 @@ class CallLog {
|
|
|
3893
3897
|
duration: (plain.duration || 0) * 1000, // duration is in seconds
|
|
3894
3898
|
start: moment(plain.start).toDate(),
|
|
3895
3899
|
end: plain.end ? moment(plain.end).toDate() : null,
|
|
3896
|
-
recordings: Recording.parseMany(plain.recordings),
|
|
3900
|
+
recordings: Recording.parseMany(plain.recordings || []),
|
|
3897
3901
|
});
|
|
3898
3902
|
}
|
|
3899
3903
|
|
|
@@ -5288,6 +5292,7 @@ const ON_REINVITE = 'reinvite';
|
|
|
5288
5292
|
const ON_ERROR = 'onError';
|
|
5289
5293
|
const ON_SCREEN_SHARING_REINVITE = 'onScreenSharingReinvite';
|
|
5290
5294
|
const ON_NETWORK_STATS = 'onNetworkStats';
|
|
5295
|
+
const ON_DISCONNECTED = 'onDisconnected';
|
|
5291
5296
|
|
|
5292
5297
|
const events = [REGISTERED, UNREGISTERED, REGISTRATION_FAILED, INVITE];
|
|
5293
5298
|
const transportEvents = [CONNECTED, DISCONNECTED, TRANSPORT_ERROR, MESSAGE];
|
|
@@ -5364,6 +5369,7 @@ class WebRTCClient extends Emitter {
|
|
|
5364
5369
|
|
|
5365
5370
|
|
|
5366
5371
|
|
|
5372
|
+
|
|
5367
5373
|
|
|
5368
5374
|
static isAPrivateIp(ip ) {
|
|
5369
5375
|
const regex = /^(?:10|127|172\.(?:1[6-9]|2[0-9]|3[01])|192\.168)\..*/;
|
|
@@ -5429,6 +5435,7 @@ class WebRTCClient extends Emitter {
|
|
|
5429
5435
|
this.ON_ERROR = ON_ERROR;
|
|
5430
5436
|
this.ON_SCREEN_SHARING_REINVITE = ON_SCREEN_SHARING_REINVITE;
|
|
5431
5437
|
this.ON_NETWORK_STATS = ON_NETWORK_STATS;
|
|
5438
|
+
this.ON_DISCONNECTED = ON_DISCONNECTED;
|
|
5432
5439
|
}
|
|
5433
5440
|
|
|
5434
5441
|
configureMedia(media ) {
|
|
@@ -6030,7 +6037,7 @@ class WebRTCClient extends Emitter {
|
|
|
6030
6037
|
// We search for the last transceiver without `video-` in the mid (video- means remote transceiver)
|
|
6031
6038
|
const transceivers = pc.getTransceivers();
|
|
6032
6039
|
const transceiverIdx = lastIndexOf(transceivers, transceiver =>
|
|
6033
|
-
transceiver.sender.track === null && transceiver.mid.indexOf('video') === -1);
|
|
6040
|
+
transceiver.sender.track === null && transceiver.mid && transceiver.mid.indexOf('video') === -1);
|
|
6034
6041
|
|
|
6035
6042
|
videoSender = transceiverIdx !== -1 ? transceivers[transceiverIdx].sender : null;
|
|
6036
6043
|
} else {
|
|
@@ -6276,10 +6283,13 @@ class WebRTCClient extends Emitter {
|
|
|
6276
6283
|
return null;
|
|
6277
6284
|
}
|
|
6278
6285
|
|
|
6279
|
-
// let's update the local value
|
|
6280
|
-
if (this.audio
|
|
6281
|
-
|
|
6282
|
-
|
|
6286
|
+
// let's update the local audio value
|
|
6287
|
+
if (this.audio) {
|
|
6288
|
+
this.audio = {
|
|
6289
|
+
deviceId: {
|
|
6290
|
+
exact: id,
|
|
6291
|
+
},
|
|
6292
|
+
};
|
|
6283
6293
|
}
|
|
6284
6294
|
|
|
6285
6295
|
if (session) {
|
|
@@ -6292,6 +6302,9 @@ class WebRTCClient extends Emitter {
|
|
|
6292
6302
|
const sender = pc && pc.getSenders().find(s => audioTrack && s && s.track && s.track.kind === audioTrack.kind);
|
|
6293
6303
|
|
|
6294
6304
|
if (sender) {
|
|
6305
|
+
if (sender.track) {
|
|
6306
|
+
audioTrack.enabled = sender.track.enabled;
|
|
6307
|
+
}
|
|
6295
6308
|
sender.replaceTrack(audioTrack);
|
|
6296
6309
|
}
|
|
6297
6310
|
|
|
@@ -6316,7 +6329,7 @@ class WebRTCClient extends Emitter {
|
|
|
6316
6329
|
return null;
|
|
6317
6330
|
}
|
|
6318
6331
|
|
|
6319
|
-
// let's update the local value
|
|
6332
|
+
// let's update the local video value
|
|
6320
6333
|
if (this.video) {
|
|
6321
6334
|
this.video = {
|
|
6322
6335
|
deviceId: {
|
|
@@ -6351,12 +6364,21 @@ class WebRTCClient extends Emitter {
|
|
|
6351
6364
|
return navigator.mediaDevices.getUserMedia(constraints).then(async stream => {
|
|
6352
6365
|
const videoTrack = stream.getVideoTracks()[0];
|
|
6353
6366
|
let sender = pc && pc.getSenders().find(s => videoTrack && s && s.track && s.track.kind === videoTrack.kind);
|
|
6367
|
+
let wasTrackEnabled = false;
|
|
6354
6368
|
if (!sender) {
|
|
6355
6369
|
sender = pc && pc.getSenders().find(s => !s.track);
|
|
6356
6370
|
}
|
|
6357
6371
|
|
|
6358
6372
|
if (sender) {
|
|
6359
|
-
|
|
6373
|
+
// No video track means video not enabled
|
|
6374
|
+
wasTrackEnabled = sender.track ? sender.track.enabled : false;
|
|
6375
|
+
videoTrack.enabled = wasTrackEnabled;
|
|
6376
|
+
|
|
6377
|
+
if (!wasTrackEnabled) {
|
|
6378
|
+
videoTrack.stop();
|
|
6379
|
+
}
|
|
6380
|
+
|
|
6381
|
+
sender.replaceTrack(wasTrackEnabled ? videoTrack : null);
|
|
6360
6382
|
}
|
|
6361
6383
|
|
|
6362
6384
|
// let's update the local stream
|
|
@@ -7040,6 +7062,7 @@ class WebRTCClient extends Emitter {
|
|
|
7040
7062
|
|
|
7041
7063
|
this.updateRemoteStream(this.getSipSessionId(session));
|
|
7042
7064
|
|
|
7065
|
+
const pc = session.sessionDescriptionHandler.peerConnection;
|
|
7043
7066
|
const onTrack = (event ) => {
|
|
7044
7067
|
const isAudioOnly = this._isAudioOnly(session);
|
|
7045
7068
|
const { kind, label, readyState, id, muted } = event.track;
|
|
@@ -7059,6 +7082,12 @@ class WebRTCClient extends Emitter {
|
|
|
7059
7082
|
|
|
7060
7083
|
session.sessionDescriptionHandler.remoteMediaStream.onaddtrack = onTrack;
|
|
7061
7084
|
|
|
7085
|
+
pc.oniceconnectionstatechange = () => {
|
|
7086
|
+
if (pc.iceConnectionState === 'disconnected') {
|
|
7087
|
+
this.eventEmitter.emit(ON_DISCONNECTED);
|
|
7088
|
+
}
|
|
7089
|
+
};
|
|
7090
|
+
|
|
7062
7091
|
if (withEvent) {
|
|
7063
7092
|
this.eventEmitter.emit(ACCEPTED, session, sessionDialog);
|
|
7064
7093
|
}
|
|
@@ -7270,25 +7299,33 @@ class WebRTCClient extends Emitter {
|
|
|
7270
7299
|
const lastVideoSent = lastNetworkStats ? lastNetworkStats.videoBytesSent : 0;
|
|
7271
7300
|
const lastAudioReceived = lastNetworkStats ? lastNetworkStats.audioBytesReceived : 0;
|
|
7272
7301
|
const lastVideoReceived = lastNetworkStats ? lastNetworkStats.videoBytesReceived : 0;
|
|
7302
|
+
const lastTransportSent = lastNetworkStats ? lastNetworkStats.transportSent : 0;
|
|
7303
|
+
const lastTransportReceived = lastNetworkStats ? lastNetworkStats.transportReceived : 0;
|
|
7273
7304
|
let audioBytesSent = 0;
|
|
7274
7305
|
let audioBytesReceived = 0;
|
|
7275
7306
|
let videoBytesSent = 0;
|
|
7276
7307
|
let videoBytesReceived = 0;
|
|
7308
|
+
let transportSent = 0;
|
|
7309
|
+
let transportReceived = 0;
|
|
7310
|
+
let packetsLost = 0;
|
|
7277
7311
|
|
|
7278
7312
|
stats.forEach(report => {
|
|
7279
7313
|
if (report.type === 'outbound-rtp' && report.kind === 'audio') {
|
|
7314
|
+
audioBytesSent += report.bytesSent + report.headerBytesSent;
|
|
7315
|
+
}
|
|
7316
|
+
if (report.type === 'remote-outbound-rtp' && report.kind === 'audio') {
|
|
7280
7317
|
audioBytesSent += report.bytesSent;
|
|
7281
7318
|
}
|
|
7282
7319
|
if (report.type === 'outbound-rtp' && report.kind === 'video') {
|
|
7283
|
-
videoBytesSent += report.bytesSent;
|
|
7320
|
+
videoBytesSent += report.bytesSent + report.headerBytesSent;
|
|
7284
7321
|
}
|
|
7285
7322
|
if (report.type === 'inbound-rtp' && report.kind === 'audio') {
|
|
7286
|
-
|
|
7323
|
+
packetsLost += report.packetsLost;
|
|
7287
7324
|
networkStats.packetsReceived = report.packetsReceived;
|
|
7288
|
-
audioBytesReceived += report.bytesReceived;
|
|
7325
|
+
audioBytesReceived += report.bytesReceived + report.headerBytesReceived;
|
|
7289
7326
|
}
|
|
7290
7327
|
if (report.type === 'inbound-rtp' && report.kind === 'video') {
|
|
7291
|
-
videoBytesReceived += report.bytesReceived;
|
|
7328
|
+
videoBytesReceived += report.bytesReceived + report.headerBytesReceived;
|
|
7292
7329
|
}
|
|
7293
7330
|
if (report.type === 'outbound-rtp' && report.kind === 'video') {
|
|
7294
7331
|
if ('framesPerSecond' in report) {
|
|
@@ -7300,19 +7337,32 @@ class WebRTCClient extends Emitter {
|
|
|
7300
7337
|
}
|
|
7301
7338
|
}
|
|
7302
7339
|
if (report.type === 'remote-inbound-rtp' && report.kind === 'audio') {
|
|
7340
|
+
packetsLost += report.packetsLost;
|
|
7303
7341
|
networkStats.roundTripTime = report.roundTripTime;
|
|
7304
7342
|
networkStats.jitter = report.jitter;
|
|
7305
7343
|
}
|
|
7344
|
+
if (report.type === 'remote-inbound-rtp' && report.kind === 'video') {
|
|
7345
|
+
packetsLost += report.packetsLost;
|
|
7346
|
+
}
|
|
7347
|
+
if (report.type === 'transport') {
|
|
7348
|
+
transportSent += report.bytesSent;
|
|
7349
|
+
transportReceived += report.bytesReceived;
|
|
7350
|
+
}
|
|
7306
7351
|
});
|
|
7307
7352
|
|
|
7353
|
+
networkStats.packetsLost = packetsLost;
|
|
7308
7354
|
networkStats.audioBytesSent = audioBytesSent;
|
|
7309
7355
|
networkStats.audioBytesReceived = audioBytesReceived;
|
|
7310
7356
|
networkStats.videoBytesSent = videoBytesSent;
|
|
7311
7357
|
networkStats.videoBytesReceived = videoBytesReceived;
|
|
7358
|
+
networkStats.transportSent = transportSent;
|
|
7359
|
+
networkStats.transportReceived = transportReceived;
|
|
7360
|
+
|
|
7361
|
+
const bandwidth = (networkStats.audioBytesSent - lastAudioSent) + (networkStats.videoBytesSent - lastVideoSent)
|
|
7362
|
+
+ (networkStats.audioBytesReceived - lastAudioReceived) + (networkStats.videoBytesReceived - lastVideoReceived)
|
|
7363
|
+
+ (networkStats.transportReceived - lastTransportReceived) + (networkStats.transportSent - lastTransportSent);
|
|
7312
7364
|
|
|
7313
|
-
networkStats.bandwidth =
|
|
7314
|
-
+ (networkStats.videoBytesSent - lastVideoSent) + (networkStats.audioBytesReceived - lastAudioReceived)
|
|
7315
|
-
+ (networkStats.videoBytesReceived - lastVideoReceived);
|
|
7365
|
+
networkStats.bandwidth = bandwidth;
|
|
7316
7366
|
|
|
7317
7367
|
this.eventEmitter.emit(ON_NETWORK_STATS, session, networkStats, this.sessionNetworkStats[sessionId]);
|
|
7318
7368
|
this.sessionNetworkStats[sessionId].push(networkStats);
|
package/esm/websocket-client.js
CHANGED
|
@@ -388,7 +388,7 @@ class IssueReporter {
|
|
|
388
388
|
payload._retry = retry + 1;
|
|
389
389
|
}
|
|
390
390
|
|
|
391
|
-
this._sendDebugToGrafana(
|
|
391
|
+
this._sendDebugToGrafana(payload, retry + 1);
|
|
392
392
|
}, 5000 + retry * 1000);
|
|
393
393
|
});
|
|
394
394
|
}
|
|
@@ -2591,7 +2591,8 @@ class ExternalApp {
|
|
|
2591
2591
|
|
|
2592
2592
|
|
|
2593
2593
|
|
|
2594
|
-
|
|
2594
|
+
|
|
2595
|
+
|
|
2595
2596
|
|
|
2596
2597
|
|
|
2597
2598
|
class Meeting {
|
|
@@ -2603,6 +2604,7 @@ class Meeting {
|
|
|
2603
2604
|
|
|
2604
2605
|
|
|
2605
2606
|
|
|
2607
|
+
|
|
2606
2608
|
|
|
2607
2609
|
|
|
2608
2610
|
static parse(plain ) {
|
|
@@ -2614,6 +2616,7 @@ class Meeting {
|
|
|
2614
2616
|
port: plain.port,
|
|
2615
2617
|
uuid: plain.uuid,
|
|
2616
2618
|
number: plain.number,
|
|
2619
|
+
persistent: plain.persistent,
|
|
2617
2620
|
});
|
|
2618
2621
|
}
|
|
2619
2622
|
|
|
@@ -2621,7 +2624,7 @@ class Meeting {
|
|
|
2621
2624
|
return newFrom(meeting, Meeting);
|
|
2622
2625
|
}
|
|
2623
2626
|
|
|
2624
|
-
constructor({ uuid, name, guestSipAuthorization, ownerUuids, port, uri, number } = {}) {
|
|
2627
|
+
constructor({ uuid, name, guestSipAuthorization, ownerUuids, port, uri, number, persistent } = {}) {
|
|
2625
2628
|
this.guestSipAuthorization = guestSipAuthorization;
|
|
2626
2629
|
this.uri = uri;
|
|
2627
2630
|
this.name = name;
|
|
@@ -2629,6 +2632,7 @@ class Meeting {
|
|
|
2629
2632
|
this.port = port;
|
|
2630
2633
|
this.uuid = uuid;
|
|
2631
2634
|
this.number = number;
|
|
2635
|
+
this.persistent = persistent;
|
|
2632
2636
|
|
|
2633
2637
|
// Useful to compare instead of instanceof with minified code
|
|
2634
2638
|
this.type = 'Meeting';
|
|
@@ -3192,7 +3196,7 @@ class Recording {
|
|
|
3192
3196
|
|
|
3193
3197
|
|
|
3194
3198
|
|
|
3195
|
-
static parseMany(recordings
|
|
3199
|
+
static parseMany(recordings = []) {
|
|
3196
3200
|
return recordings.map(item => Recording.parse(item));
|
|
3197
3201
|
}
|
|
3198
3202
|
|
|
@@ -3318,7 +3322,7 @@ class CallLog {
|
|
|
3318
3322
|
duration: (plain.duration || 0) * 1000, // duration is in seconds
|
|
3319
3323
|
start: moment__default['default'](plain.start).toDate(),
|
|
3320
3324
|
end: plain.end ? moment__default['default'](plain.end).toDate() : null,
|
|
3321
|
-
recordings: Recording.parseMany(plain.recordings),
|
|
3325
|
+
recordings: Recording.parseMany(plain.recordings || []),
|
|
3322
3326
|
});
|
|
3323
3327
|
}
|
|
3324
3328
|
|
|
@@ -673,7 +673,7 @@ class IssueReporter {
|
|
|
673
673
|
payload._retry = retry + 1;
|
|
674
674
|
}
|
|
675
675
|
|
|
676
|
-
this._sendDebugToGrafana(
|
|
676
|
+
this._sendDebugToGrafana(payload, retry + 1);
|
|
677
677
|
}, 5000 + retry * 1000);
|
|
678
678
|
});
|
|
679
679
|
}
|
|
@@ -3175,7 +3175,8 @@ class ExternalApp {
|
|
|
3175
3175
|
|
|
3176
3176
|
|
|
3177
3177
|
|
|
3178
|
-
|
|
3178
|
+
|
|
3179
|
+
|
|
3179
3180
|
|
|
3180
3181
|
|
|
3181
3182
|
class Meeting {
|
|
@@ -3187,6 +3188,7 @@ class Meeting {
|
|
|
3187
3188
|
|
|
3188
3189
|
|
|
3189
3190
|
|
|
3191
|
+
|
|
3190
3192
|
|
|
3191
3193
|
|
|
3192
3194
|
static parse(plain ) {
|
|
@@ -3198,6 +3200,7 @@ class Meeting {
|
|
|
3198
3200
|
port: plain.port,
|
|
3199
3201
|
uuid: plain.uuid,
|
|
3200
3202
|
number: plain.number,
|
|
3203
|
+
persistent: plain.persistent,
|
|
3201
3204
|
});
|
|
3202
3205
|
}
|
|
3203
3206
|
|
|
@@ -3205,7 +3208,7 @@ class Meeting {
|
|
|
3205
3208
|
return newFrom(meeting, Meeting);
|
|
3206
3209
|
}
|
|
3207
3210
|
|
|
3208
|
-
constructor({ uuid, name, guestSipAuthorization, ownerUuids, port, uri, number } = {}) {
|
|
3211
|
+
constructor({ uuid, name, guestSipAuthorization, ownerUuids, port, uri, number, persistent } = {}) {
|
|
3209
3212
|
this.guestSipAuthorization = guestSipAuthorization;
|
|
3210
3213
|
this.uri = uri;
|
|
3211
3214
|
this.name = name;
|
|
@@ -3213,6 +3216,7 @@ class Meeting {
|
|
|
3213
3216
|
this.port = port;
|
|
3214
3217
|
this.uuid = uuid;
|
|
3215
3218
|
this.number = number;
|
|
3219
|
+
this.persistent = persistent;
|
|
3216
3220
|
|
|
3217
3221
|
// Useful to compare instead of instanceof with minified code
|
|
3218
3222
|
this.type = 'Meeting';
|
|
@@ -3776,7 +3780,7 @@ class Recording {
|
|
|
3776
3780
|
|
|
3777
3781
|
|
|
3778
3782
|
|
|
3779
|
-
static parseMany(recordings
|
|
3783
|
+
static parseMany(recordings = []) {
|
|
3780
3784
|
return recordings.map(item => Recording.parse(item));
|
|
3781
3785
|
}
|
|
3782
3786
|
|
|
@@ -3902,7 +3906,7 @@ class CallLog {
|
|
|
3902
3906
|
duration: (plain.duration || 0) * 1000, // duration is in seconds
|
|
3903
3907
|
start: moment__default['default'](plain.start).toDate(),
|
|
3904
3908
|
end: plain.end ? moment__default['default'](plain.end).toDate() : null,
|
|
3905
|
-
recordings: Recording.parseMany(plain.recordings),
|
|
3909
|
+
recordings: Recording.parseMany(plain.recordings || []),
|
|
3906
3910
|
});
|
|
3907
3911
|
}
|
|
3908
3912
|
|
|
@@ -5297,6 +5301,7 @@ const ON_REINVITE = 'reinvite';
|
|
|
5297
5301
|
const ON_ERROR = 'onError';
|
|
5298
5302
|
const ON_SCREEN_SHARING_REINVITE = 'onScreenSharingReinvite';
|
|
5299
5303
|
const ON_NETWORK_STATS = 'onNetworkStats';
|
|
5304
|
+
const ON_DISCONNECTED = 'onDisconnected';
|
|
5300
5305
|
class CanceledCallError extends Error {}
|
|
5301
5306
|
|
|
5302
5307
|
const MAX_REGISTER_TRIES = 10;
|
|
@@ -5370,6 +5375,7 @@ class WebRTCClient extends Emitter {
|
|
|
5370
5375
|
|
|
5371
5376
|
|
|
5372
5377
|
|
|
5378
|
+
|
|
5373
5379
|
|
|
5374
5380
|
static isAPrivateIp(ip ) {
|
|
5375
5381
|
const regex = /^(?:10|127|172\.(?:1[6-9]|2[0-9]|3[01])|192\.168)\..*/;
|
|
@@ -5435,6 +5441,7 @@ class WebRTCClient extends Emitter {
|
|
|
5435
5441
|
this.ON_ERROR = ON_ERROR;
|
|
5436
5442
|
this.ON_SCREEN_SHARING_REINVITE = ON_SCREEN_SHARING_REINVITE;
|
|
5437
5443
|
this.ON_NETWORK_STATS = ON_NETWORK_STATS;
|
|
5444
|
+
this.ON_DISCONNECTED = ON_DISCONNECTED;
|
|
5438
5445
|
}
|
|
5439
5446
|
|
|
5440
5447
|
configureMedia(media ) {
|
|
@@ -6036,7 +6043,7 @@ class WebRTCClient extends Emitter {
|
|
|
6036
6043
|
// We search for the last transceiver without `video-` in the mid (video- means remote transceiver)
|
|
6037
6044
|
const transceivers = pc.getTransceivers();
|
|
6038
6045
|
const transceiverIdx = lastIndexOf(transceivers, transceiver =>
|
|
6039
|
-
transceiver.sender.track === null && transceiver.mid.indexOf('video') === -1);
|
|
6046
|
+
transceiver.sender.track === null && transceiver.mid && transceiver.mid.indexOf('video') === -1);
|
|
6040
6047
|
|
|
6041
6048
|
videoSender = transceiverIdx !== -1 ? transceivers[transceiverIdx].sender : null;
|
|
6042
6049
|
} else {
|
|
@@ -6282,10 +6289,13 @@ class WebRTCClient extends Emitter {
|
|
|
6282
6289
|
return null;
|
|
6283
6290
|
}
|
|
6284
6291
|
|
|
6285
|
-
// let's update the local value
|
|
6286
|
-
if (this.audio
|
|
6287
|
-
|
|
6288
|
-
|
|
6292
|
+
// let's update the local audio value
|
|
6293
|
+
if (this.audio) {
|
|
6294
|
+
this.audio = {
|
|
6295
|
+
deviceId: {
|
|
6296
|
+
exact: id,
|
|
6297
|
+
},
|
|
6298
|
+
};
|
|
6289
6299
|
}
|
|
6290
6300
|
|
|
6291
6301
|
if (session) {
|
|
@@ -6298,6 +6308,9 @@ class WebRTCClient extends Emitter {
|
|
|
6298
6308
|
const sender = pc && pc.getSenders().find(s => audioTrack && s && s.track && s.track.kind === audioTrack.kind);
|
|
6299
6309
|
|
|
6300
6310
|
if (sender) {
|
|
6311
|
+
if (sender.track) {
|
|
6312
|
+
audioTrack.enabled = sender.track.enabled;
|
|
6313
|
+
}
|
|
6301
6314
|
sender.replaceTrack(audioTrack);
|
|
6302
6315
|
}
|
|
6303
6316
|
|
|
@@ -6322,7 +6335,7 @@ class WebRTCClient extends Emitter {
|
|
|
6322
6335
|
return null;
|
|
6323
6336
|
}
|
|
6324
6337
|
|
|
6325
|
-
// let's update the local value
|
|
6338
|
+
// let's update the local video value
|
|
6326
6339
|
if (this.video) {
|
|
6327
6340
|
this.video = {
|
|
6328
6341
|
deviceId: {
|
|
@@ -6357,12 +6370,21 @@ class WebRTCClient extends Emitter {
|
|
|
6357
6370
|
return navigator.mediaDevices.getUserMedia(constraints).then(async stream => {
|
|
6358
6371
|
const videoTrack = stream.getVideoTracks()[0];
|
|
6359
6372
|
let sender = pc && pc.getSenders().find(s => videoTrack && s && s.track && s.track.kind === videoTrack.kind);
|
|
6373
|
+
let wasTrackEnabled = false;
|
|
6360
6374
|
if (!sender) {
|
|
6361
6375
|
sender = pc && pc.getSenders().find(s => !s.track);
|
|
6362
6376
|
}
|
|
6363
6377
|
|
|
6364
6378
|
if (sender) {
|
|
6365
|
-
|
|
6379
|
+
// No video track means video not enabled
|
|
6380
|
+
wasTrackEnabled = sender.track ? sender.track.enabled : false;
|
|
6381
|
+
videoTrack.enabled = wasTrackEnabled;
|
|
6382
|
+
|
|
6383
|
+
if (!wasTrackEnabled) {
|
|
6384
|
+
videoTrack.stop();
|
|
6385
|
+
}
|
|
6386
|
+
|
|
6387
|
+
sender.replaceTrack(wasTrackEnabled ? videoTrack : null);
|
|
6366
6388
|
}
|
|
6367
6389
|
|
|
6368
6390
|
// let's update the local stream
|
|
@@ -7046,6 +7068,7 @@ class WebRTCClient extends Emitter {
|
|
|
7046
7068
|
|
|
7047
7069
|
this.updateRemoteStream(this.getSipSessionId(session));
|
|
7048
7070
|
|
|
7071
|
+
const pc = session.sessionDescriptionHandler.peerConnection;
|
|
7049
7072
|
const onTrack = (event ) => {
|
|
7050
7073
|
const isAudioOnly = this._isAudioOnly(session);
|
|
7051
7074
|
const { kind, label, readyState, id, muted } = event.track;
|
|
@@ -7065,6 +7088,12 @@ class WebRTCClient extends Emitter {
|
|
|
7065
7088
|
|
|
7066
7089
|
session.sessionDescriptionHandler.remoteMediaStream.onaddtrack = onTrack;
|
|
7067
7090
|
|
|
7091
|
+
pc.oniceconnectionstatechange = () => {
|
|
7092
|
+
if (pc.iceConnectionState === 'disconnected') {
|
|
7093
|
+
this.eventEmitter.emit(ON_DISCONNECTED);
|
|
7094
|
+
}
|
|
7095
|
+
};
|
|
7096
|
+
|
|
7068
7097
|
if (withEvent) {
|
|
7069
7098
|
this.eventEmitter.emit(ACCEPTED, session, sessionDialog);
|
|
7070
7099
|
}
|
|
@@ -7276,25 +7305,33 @@ class WebRTCClient extends Emitter {
|
|
|
7276
7305
|
const lastVideoSent = lastNetworkStats ? lastNetworkStats.videoBytesSent : 0;
|
|
7277
7306
|
const lastAudioReceived = lastNetworkStats ? lastNetworkStats.audioBytesReceived : 0;
|
|
7278
7307
|
const lastVideoReceived = lastNetworkStats ? lastNetworkStats.videoBytesReceived : 0;
|
|
7308
|
+
const lastTransportSent = lastNetworkStats ? lastNetworkStats.transportSent : 0;
|
|
7309
|
+
const lastTransportReceived = lastNetworkStats ? lastNetworkStats.transportReceived : 0;
|
|
7279
7310
|
let audioBytesSent = 0;
|
|
7280
7311
|
let audioBytesReceived = 0;
|
|
7281
7312
|
let videoBytesSent = 0;
|
|
7282
7313
|
let videoBytesReceived = 0;
|
|
7314
|
+
let transportSent = 0;
|
|
7315
|
+
let transportReceived = 0;
|
|
7316
|
+
let packetsLost = 0;
|
|
7283
7317
|
|
|
7284
7318
|
stats.forEach(report => {
|
|
7285
7319
|
if (report.type === 'outbound-rtp' && report.kind === 'audio') {
|
|
7320
|
+
audioBytesSent += report.bytesSent + report.headerBytesSent;
|
|
7321
|
+
}
|
|
7322
|
+
if (report.type === 'remote-outbound-rtp' && report.kind === 'audio') {
|
|
7286
7323
|
audioBytesSent += report.bytesSent;
|
|
7287
7324
|
}
|
|
7288
7325
|
if (report.type === 'outbound-rtp' && report.kind === 'video') {
|
|
7289
|
-
videoBytesSent += report.bytesSent;
|
|
7326
|
+
videoBytesSent += report.bytesSent + report.headerBytesSent;
|
|
7290
7327
|
}
|
|
7291
7328
|
if (report.type === 'inbound-rtp' && report.kind === 'audio') {
|
|
7292
|
-
|
|
7329
|
+
packetsLost += report.packetsLost;
|
|
7293
7330
|
networkStats.packetsReceived = report.packetsReceived;
|
|
7294
|
-
audioBytesReceived += report.bytesReceived;
|
|
7331
|
+
audioBytesReceived += report.bytesReceived + report.headerBytesReceived;
|
|
7295
7332
|
}
|
|
7296
7333
|
if (report.type === 'inbound-rtp' && report.kind === 'video') {
|
|
7297
|
-
videoBytesReceived += report.bytesReceived;
|
|
7334
|
+
videoBytesReceived += report.bytesReceived + report.headerBytesReceived;
|
|
7298
7335
|
}
|
|
7299
7336
|
if (report.type === 'outbound-rtp' && report.kind === 'video') {
|
|
7300
7337
|
if ('framesPerSecond' in report) {
|
|
@@ -7306,19 +7343,32 @@ class WebRTCClient extends Emitter {
|
|
|
7306
7343
|
}
|
|
7307
7344
|
}
|
|
7308
7345
|
if (report.type === 'remote-inbound-rtp' && report.kind === 'audio') {
|
|
7346
|
+
packetsLost += report.packetsLost;
|
|
7309
7347
|
networkStats.roundTripTime = report.roundTripTime;
|
|
7310
7348
|
networkStats.jitter = report.jitter;
|
|
7311
7349
|
}
|
|
7350
|
+
if (report.type === 'remote-inbound-rtp' && report.kind === 'video') {
|
|
7351
|
+
packetsLost += report.packetsLost;
|
|
7352
|
+
}
|
|
7353
|
+
if (report.type === 'transport') {
|
|
7354
|
+
transportSent += report.bytesSent;
|
|
7355
|
+
transportReceived += report.bytesReceived;
|
|
7356
|
+
}
|
|
7312
7357
|
});
|
|
7313
7358
|
|
|
7359
|
+
networkStats.packetsLost = packetsLost;
|
|
7314
7360
|
networkStats.audioBytesSent = audioBytesSent;
|
|
7315
7361
|
networkStats.audioBytesReceived = audioBytesReceived;
|
|
7316
7362
|
networkStats.videoBytesSent = videoBytesSent;
|
|
7317
7363
|
networkStats.videoBytesReceived = videoBytesReceived;
|
|
7364
|
+
networkStats.transportSent = transportSent;
|
|
7365
|
+
networkStats.transportReceived = transportReceived;
|
|
7366
|
+
|
|
7367
|
+
const bandwidth = (networkStats.audioBytesSent - lastAudioSent) + (networkStats.videoBytesSent - lastVideoSent)
|
|
7368
|
+
+ (networkStats.audioBytesReceived - lastAudioReceived) + (networkStats.videoBytesReceived - lastVideoReceived)
|
|
7369
|
+
+ (networkStats.transportReceived - lastTransportReceived) + (networkStats.transportSent - lastTransportSent);
|
|
7318
7370
|
|
|
7319
|
-
networkStats.bandwidth =
|
|
7320
|
-
+ (networkStats.videoBytesSent - lastVideoSent) + (networkStats.audioBytesReceived - lastAudioReceived)
|
|
7321
|
-
+ (networkStats.videoBytesReceived - lastVideoReceived);
|
|
7371
|
+
networkStats.bandwidth = bandwidth;
|
|
7322
7372
|
|
|
7323
7373
|
this.eventEmitter.emit(ON_NETWORK_STATS, session, networkStats, this.sessionNetworkStats[sessionId]);
|
|
7324
7374
|
this.sessionNetworkStats[sessionId].push(networkStats);
|
package/lib/api/agentd.js
CHANGED
package/lib/api/amid.js
CHANGED
package/lib/api/application.js
CHANGED
package/lib/api/auth.js
CHANGED
package/lib/api/call-logd.js
CHANGED
|
@@ -324,7 +324,7 @@ class IssueReporter {
|
|
|
324
324
|
payload._retry = retry + 1;
|
|
325
325
|
}
|
|
326
326
|
|
|
327
|
-
this._sendDebugToGrafana(
|
|
327
|
+
this._sendDebugToGrafana(payload, retry + 1);
|
|
328
328
|
}, 5000 + retry * 1000);
|
|
329
329
|
});
|
|
330
330
|
}
|
|
@@ -426,7 +426,7 @@ class Recording {
|
|
|
426
426
|
|
|
427
427
|
|
|
428
428
|
|
|
429
|
-
static parseMany(recordings
|
|
429
|
+
static parseMany(recordings = []) {
|
|
430
430
|
return recordings.map(item => Recording.parse(item));
|
|
431
431
|
}
|
|
432
432
|
|
|
@@ -552,7 +552,7 @@ class CallLog {
|
|
|
552
552
|
duration: (plain.duration || 0) * 1000, // duration is in seconds
|
|
553
553
|
start: moment__default['default'](plain.start).toDate(),
|
|
554
554
|
end: plain.end ? moment__default['default'](plain.end).toDate() : null,
|
|
555
|
-
recordings: Recording.parseMany(plain.recordings),
|
|
555
|
+
recordings: Recording.parseMany(plain.recordings || []),
|
|
556
556
|
});
|
|
557
557
|
}
|
|
558
558
|
|
package/lib/api/calld.js
CHANGED