@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
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Base64 } from 'js-base64';
|
|
2
2
|
import moment from 'moment';
|
|
3
|
-
import {
|
|
3
|
+
import { jws, b64utoutf8, KEYUTIL } from 'jsrsasign';
|
|
4
4
|
import { SessionState } from 'sip.js/lib/api/session-state';
|
|
5
5
|
import EventEmitter from 'events';
|
|
6
6
|
import { jsonToGraphQLQuery } from 'json-to-graphql-query/lib/jsonToGraphQLQuery';
|
|
@@ -148,6 +148,7 @@ class IssueReporter {
|
|
|
148
148
|
|
|
149
149
|
|
|
150
150
|
|
|
151
|
+
|
|
151
152
|
|
|
152
153
|
constructor() {
|
|
153
154
|
addLevelsTo(this);
|
|
@@ -159,12 +160,17 @@ class IssueReporter {
|
|
|
159
160
|
this.bufferTimeout = null;
|
|
160
161
|
this._boundProcessBuffer = this._processBuffer.bind(this);
|
|
161
162
|
this._boundParseLoggerBody = this._parseLoggerBody.bind(this);
|
|
163
|
+
this._callback = null;
|
|
162
164
|
}
|
|
163
165
|
|
|
164
166
|
init() {
|
|
165
167
|
this._catchConsole();
|
|
166
168
|
}
|
|
167
169
|
|
|
170
|
+
setCallback(cb ) {
|
|
171
|
+
this._callback = cb;
|
|
172
|
+
}
|
|
173
|
+
|
|
168
174
|
configureRemoteClient(configuration = { tag: 'wazo-sdk', host: null, port: null, level: null, extra: {} }) {
|
|
169
175
|
this.remoteClientConfiguration = configuration;
|
|
170
176
|
}
|
|
@@ -200,6 +206,7 @@ class IssueReporter {
|
|
|
200
206
|
|
|
201
207
|
// Handle category label
|
|
202
208
|
let category = null;
|
|
209
|
+
let skipSendToRemote = false;
|
|
203
210
|
let extra = {};
|
|
204
211
|
if (args[0].indexOf(CATEGORY_PREFIX) === 0) {
|
|
205
212
|
category = args[0].split('=')[1];
|
|
@@ -215,6 +222,7 @@ class IssueReporter {
|
|
|
215
222
|
errorMessage: lastArg.message,
|
|
216
223
|
errorStack: lastArg.stack,
|
|
217
224
|
errorType: lastArg.constructor.name,
|
|
225
|
+
skipSendToRemote: lastArg.skipSendToRemote,
|
|
218
226
|
};
|
|
219
227
|
} else {
|
|
220
228
|
extra = lastArg;
|
|
@@ -223,6 +231,11 @@ class IssueReporter {
|
|
|
223
231
|
args.splice(1, 1);
|
|
224
232
|
}
|
|
225
233
|
|
|
234
|
+
if (extra.skipSendToRemote) {
|
|
235
|
+
skipSendToRemote = true;
|
|
236
|
+
delete extra.skipSendToRemote;
|
|
237
|
+
}
|
|
238
|
+
|
|
226
239
|
const date = moment().format('YYYY-MM-DD HH:mm:ss.SSS');
|
|
227
240
|
const message = args.join(', ');
|
|
228
241
|
let consoleMessage = message;
|
|
@@ -243,7 +256,13 @@ class IssueReporter {
|
|
|
243
256
|
const oldMethod = this.oldConsoleMethods[consoleLevel] || this.oldConsoleMethods.log;
|
|
244
257
|
oldMethod.apply(oldMethod, [date, consoleMessage]);
|
|
245
258
|
|
|
246
|
-
this.
|
|
259
|
+
if (this._callback) {
|
|
260
|
+
this._callback(level, consoleMessage);
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
if (!skipSendToRemote) {
|
|
264
|
+
this._sendToRemoteLogger(level, { date, message, category, ...extra });
|
|
265
|
+
}
|
|
247
266
|
}
|
|
248
267
|
|
|
249
268
|
logRequest(url , options , response , start ) {
|
|
@@ -388,7 +407,11 @@ class IssueReporter {
|
|
|
388
407
|
},
|
|
389
408
|
// $FlowFixMe
|
|
390
409
|
body,
|
|
391
|
-
}).catch(() => {
|
|
410
|
+
}).catch((e ) => {
|
|
411
|
+
// $FlowFixMe
|
|
412
|
+
e.skipSendToRemote = true;
|
|
413
|
+
this.log('error', this._makeCategory('grafana'), 'Sending log to grafana, error', e);
|
|
414
|
+
|
|
392
415
|
setTimeout(() => {
|
|
393
416
|
if (isArray) {
|
|
394
417
|
payload = payload.map(message => {
|
|
@@ -400,7 +423,7 @@ class IssueReporter {
|
|
|
400
423
|
payload._retry = retry + 1;
|
|
401
424
|
}
|
|
402
425
|
|
|
403
|
-
this._sendDebugToGrafana(
|
|
426
|
+
this._sendDebugToGrafana(payload, retry + 1);
|
|
404
427
|
}, 5000 + retry * 1000);
|
|
405
428
|
});
|
|
406
429
|
}
|
|
@@ -2603,7 +2626,8 @@ class ExternalApp {
|
|
|
2603
2626
|
|
|
2604
2627
|
|
|
2605
2628
|
|
|
2606
|
-
|
|
2629
|
+
|
|
2630
|
+
|
|
2607
2631
|
|
|
2608
2632
|
|
|
2609
2633
|
class Meeting {
|
|
@@ -2615,6 +2639,7 @@ class Meeting {
|
|
|
2615
2639
|
|
|
2616
2640
|
|
|
2617
2641
|
|
|
2642
|
+
|
|
2618
2643
|
|
|
2619
2644
|
|
|
2620
2645
|
static parse(plain ) {
|
|
@@ -2626,14 +2651,28 @@ class Meeting {
|
|
|
2626
2651
|
port: plain.port,
|
|
2627
2652
|
uuid: plain.uuid,
|
|
2628
2653
|
number: plain.number,
|
|
2654
|
+
persistent: plain.persistent,
|
|
2629
2655
|
});
|
|
2630
2656
|
}
|
|
2631
2657
|
|
|
2658
|
+
static parseMany(items ) {
|
|
2659
|
+
return items.map(plain => Meeting.parse(plain));
|
|
2660
|
+
}
|
|
2661
|
+
|
|
2632
2662
|
static newFrom(meeting ) {
|
|
2633
2663
|
return newFrom(meeting, Meeting);
|
|
2634
2664
|
}
|
|
2635
2665
|
|
|
2636
|
-
constructor({
|
|
2666
|
+
constructor({
|
|
2667
|
+
uuid,
|
|
2668
|
+
name,
|
|
2669
|
+
guestSipAuthorization,
|
|
2670
|
+
ownerUuids,
|
|
2671
|
+
port,
|
|
2672
|
+
uri,
|
|
2673
|
+
number,
|
|
2674
|
+
persistent,
|
|
2675
|
+
} = {}) {
|
|
2637
2676
|
this.guestSipAuthorization = guestSipAuthorization;
|
|
2638
2677
|
this.uri = uri;
|
|
2639
2678
|
this.name = name;
|
|
@@ -2641,6 +2680,7 @@ class Meeting {
|
|
|
2641
2680
|
this.port = port;
|
|
2642
2681
|
this.uuid = uuid;
|
|
2643
2682
|
this.number = number;
|
|
2683
|
+
this.persistent = persistent;
|
|
2644
2684
|
|
|
2645
2685
|
// Useful to compare instead of instanceof with minified code
|
|
2646
2686
|
this.type = 'Meeting';
|
|
@@ -2718,8 +2758,11 @@ var confdMethods = (client , baseUrl ) => ({
|
|
|
2718
2758
|
}
|
|
2719
2759
|
},
|
|
2720
2760
|
|
|
2721
|
-
|
|
2722
|
-
client.
|
|
2761
|
+
getMyMeetings: () =>
|
|
2762
|
+
client.get(`${baseUrl}/users/me/meetings`).then(response => Meeting.parseMany(response.items)),
|
|
2763
|
+
|
|
2764
|
+
createMyMeeting: (name , persistent ) =>
|
|
2765
|
+
client.post(`${baseUrl}/users/me/meetings`, { name, persistent }).then(Meeting.parse),
|
|
2723
2766
|
|
|
2724
2767
|
deleteMyMeeting: (meetingUuid ) =>
|
|
2725
2768
|
client.delete(`${baseUrl}/users/me/meetings/${meetingUuid}`, null),
|
|
@@ -3230,7 +3273,7 @@ class Recording {
|
|
|
3230
3273
|
|
|
3231
3274
|
|
|
3232
3275
|
|
|
3233
|
-
static parseMany(recordings
|
|
3276
|
+
static parseMany(recordings = []) {
|
|
3234
3277
|
return recordings.map(item => Recording.parse(item));
|
|
3235
3278
|
}
|
|
3236
3279
|
|
|
@@ -3356,7 +3399,7 @@ class CallLog {
|
|
|
3356
3399
|
duration: (plain.duration || 0) * 1000, // duration is in seconds
|
|
3357
3400
|
start: moment(plain.start).toDate(),
|
|
3358
3401
|
end: plain.end ? moment(plain.end).toDate() : null,
|
|
3359
|
-
recordings: Recording.parseMany(plain.recordings),
|
|
3402
|
+
recordings: Recording.parseMany(plain.recordings || []),
|
|
3360
3403
|
});
|
|
3361
3404
|
}
|
|
3362
3405
|
|
|
@@ -4899,6 +4942,7 @@ const AGENT_PAUSED = 'agent_paused';
|
|
|
4899
4942
|
const AGENT_UNPAUSED = 'agent_unpaused';
|
|
4900
4943
|
const CONFERENCE_ADHOC_PARTICIPANT_LEFT = 'conference_adhoc_participant_left';
|
|
4901
4944
|
const CONFERENCE_ADHOC_DELETED = 'conference_adhoc_deleted';
|
|
4945
|
+
const MEETING_USER_PROGRESS = 'meeting_user_progress';
|
|
4902
4946
|
|
|
4903
4947
|
const BLACKLIST_EVENTS = [
|
|
4904
4948
|
CHAT_MESSAGE_SENT,
|
|
@@ -5249,6 +5293,7 @@ WebSocketClient.eventLists = [
|
|
|
5249
5293
|
AGENT_UNPAUSED,
|
|
5250
5294
|
CONFERENCE_ADHOC_PARTICIPANT_LEFT,
|
|
5251
5295
|
CONFERENCE_ADHOC_DELETED,
|
|
5296
|
+
MEETING_USER_PROGRESS,
|
|
5252
5297
|
];
|
|
5253
5298
|
|
|
5254
5299
|
var wazoWebsocket = {
|
|
@@ -6277,7 +6322,9 @@ class WebRTCClient extends Emitter {
|
|
|
6277
6322
|
const inviteOptions = {
|
|
6278
6323
|
requestDelegate: {
|
|
6279
6324
|
onAccept: (response ) => {
|
|
6280
|
-
session.sessionDescriptionHandler.peerConnection
|
|
6325
|
+
if (session.sessionDescriptionHandler.peerConnection) {
|
|
6326
|
+
session.sessionDescriptionHandler.peerConnection.sfu = conference;
|
|
6327
|
+
}
|
|
6281
6328
|
this._onAccepted(session, response.session, true);
|
|
6282
6329
|
},
|
|
6283
6330
|
onReject: (response ) => {
|
|
@@ -6613,7 +6660,7 @@ class WebRTCClient extends Emitter {
|
|
|
6613
6660
|
// We search for the last transceiver without `video-` in the mid (video- means remote transceiver)
|
|
6614
6661
|
const transceivers = pc.getTransceivers();
|
|
6615
6662
|
const transceiverIdx = lastIndexOf(transceivers, transceiver =>
|
|
6616
|
-
transceiver.sender.track === null && transceiver.mid.indexOf('video') === -1);
|
|
6663
|
+
transceiver.sender.track === null && transceiver.mid && transceiver.mid.indexOf('video') === -1);
|
|
6617
6664
|
|
|
6618
6665
|
videoSender = transceiverIdx !== -1 ? transceivers[transceiverIdx].sender : null;
|
|
6619
6666
|
} else {
|
|
@@ -7149,6 +7196,16 @@ class WebRTCClient extends Emitter {
|
|
|
7149
7196
|
return this.hasRemoteVideo(sessionId) ? this.getRemoteStream(sessionId) : null;
|
|
7150
7197
|
}
|
|
7151
7198
|
|
|
7199
|
+
// Useful in a react-native environment when remoteMediaStream is not updated
|
|
7200
|
+
getRemoteVideoStreamFromPc(sessionId ) {
|
|
7201
|
+
const pc = this.getPeerConnection(sessionId);
|
|
7202
|
+
if (!pc) {
|
|
7203
|
+
return null;
|
|
7204
|
+
}
|
|
7205
|
+
|
|
7206
|
+
return pc.getRemoteStreams().find(stream => !!stream.getVideoTracks().length);
|
|
7207
|
+
}
|
|
7208
|
+
|
|
7152
7209
|
hasVideo(sessionId ) {
|
|
7153
7210
|
return this.hasLocalVideo(sessionId) || this.hasRemoteVideo(sessionId);
|
|
7154
7211
|
}
|
|
@@ -7659,6 +7716,7 @@ class WebRTCClient extends Emitter {
|
|
|
7659
7716
|
session.sessionDescriptionHandler.remoteMediaStream.onaddtrack = onTrack;
|
|
7660
7717
|
|
|
7661
7718
|
pc.oniceconnectionstatechange = () => {
|
|
7719
|
+
logger.info('on ice connection state changed', { state: pc.iceConnectionState });
|
|
7662
7720
|
if (pc.iceConnectionState === 'disconnected') {
|
|
7663
7721
|
this.eventEmitter.emit(ON_DISCONNECTED);
|
|
7664
7722
|
}
|
|
@@ -7927,18 +7985,22 @@ class WebRTCClient extends Emitter {
|
|
|
7927
7985
|
});
|
|
7928
7986
|
|
|
7929
7987
|
networkStats.packetsLost = packetsLost;
|
|
7930
|
-
networkStats.
|
|
7988
|
+
networkStats.totalAudioBytesSent = audioBytesSent;
|
|
7989
|
+
networkStats.audioBytesSent = audioBytesSent - lastAudioSent;
|
|
7990
|
+
networkStats.totalAudioBytesReceived = audioBytesReceived - lastAudioReceived;
|
|
7931
7991
|
networkStats.audioBytesReceived = audioBytesReceived;
|
|
7932
|
-
networkStats.
|
|
7933
|
-
networkStats.
|
|
7992
|
+
networkStats.totalVideoBytesSent = videoBytesSent;
|
|
7993
|
+
networkStats.videoBytesSent = videoBytesSent - lastVideoSent;
|
|
7994
|
+
networkStats.totalVideoBytesReceived = videoBytesReceived;
|
|
7995
|
+
networkStats.videoBytesReceived = videoBytesReceived - lastVideoReceived;
|
|
7996
|
+
networkStats.totalTransportSent = transportSent - lastTransportSent;
|
|
7934
7997
|
networkStats.transportSent = transportSent;
|
|
7935
|
-
networkStats.
|
|
7936
|
-
|
|
7937
|
-
const bandwidth = (networkStats.audioBytesSent - lastAudioSent) + (networkStats.videoBytesSent - lastVideoSent)
|
|
7938
|
-
+ (networkStats.audioBytesReceived - lastAudioReceived) + (networkStats.videoBytesReceived - lastVideoReceived)
|
|
7939
|
-
+ (networkStats.transportReceived - lastTransportReceived) + (networkStats.transportSent - lastTransportSent);
|
|
7998
|
+
networkStats.totalTransportReceived = transportReceived;
|
|
7999
|
+
networkStats.transportReceived = transportReceived - lastTransportReceived;
|
|
7940
8000
|
|
|
7941
|
-
networkStats.bandwidth =
|
|
8001
|
+
networkStats.bandwidth = networkStats.audioBytesSent + networkStats.audioBytesReceived
|
|
8002
|
+
+ networkStats.videoBytesSent + networkStats.videoBytesReceived + networkStats.transportReceived
|
|
8003
|
+
+ networkStats.transportSent;
|
|
7942
8004
|
|
|
7943
8005
|
this.eventEmitter.emit(ON_NETWORK_STATS, session, networkStats, this.sessionNetworkStats[sessionId]);
|
|
7944
8006
|
this.sessionNetworkStats[sessionId].push(networkStats);
|
|
@@ -8223,4 +8285,4 @@ var index = [
|
|
|
8223
8285
|
iceIpv4,
|
|
8224
8286
|
];
|
|
8225
8287
|
|
|
8226
|
-
export
|
|
8288
|
+
export default index;
|
|
@@ -121,6 +121,7 @@ class IssueReporter {
|
|
|
121
121
|
|
|
122
122
|
|
|
123
123
|
|
|
124
|
+
|
|
124
125
|
|
|
125
126
|
constructor() {
|
|
126
127
|
addLevelsTo(this);
|
|
@@ -132,12 +133,17 @@ class IssueReporter {
|
|
|
132
133
|
this.bufferTimeout = null;
|
|
133
134
|
this._boundProcessBuffer = this._processBuffer.bind(this);
|
|
134
135
|
this._boundParseLoggerBody = this._parseLoggerBody.bind(this);
|
|
136
|
+
this._callback = null;
|
|
135
137
|
}
|
|
136
138
|
|
|
137
139
|
init() {
|
|
138
140
|
this._catchConsole();
|
|
139
141
|
}
|
|
140
142
|
|
|
143
|
+
setCallback(cb ) {
|
|
144
|
+
this._callback = cb;
|
|
145
|
+
}
|
|
146
|
+
|
|
141
147
|
configureRemoteClient(configuration = { tag: 'wazo-sdk', host: null, port: null, level: null, extra: {} }) {
|
|
142
148
|
this.remoteClientConfiguration = configuration;
|
|
143
149
|
}
|
|
@@ -173,6 +179,7 @@ class IssueReporter {
|
|
|
173
179
|
|
|
174
180
|
// Handle category label
|
|
175
181
|
let category = null;
|
|
182
|
+
let skipSendToRemote = false;
|
|
176
183
|
let extra = {};
|
|
177
184
|
if (args[0].indexOf(CATEGORY_PREFIX) === 0) {
|
|
178
185
|
category = args[0].split('=')[1];
|
|
@@ -188,6 +195,7 @@ class IssueReporter {
|
|
|
188
195
|
errorMessage: lastArg.message,
|
|
189
196
|
errorStack: lastArg.stack,
|
|
190
197
|
errorType: lastArg.constructor.name,
|
|
198
|
+
skipSendToRemote: lastArg.skipSendToRemote,
|
|
191
199
|
};
|
|
192
200
|
} else {
|
|
193
201
|
extra = lastArg;
|
|
@@ -196,6 +204,11 @@ class IssueReporter {
|
|
|
196
204
|
args.splice(1, 1);
|
|
197
205
|
}
|
|
198
206
|
|
|
207
|
+
if (extra.skipSendToRemote) {
|
|
208
|
+
skipSendToRemote = true;
|
|
209
|
+
delete extra.skipSendToRemote;
|
|
210
|
+
}
|
|
211
|
+
|
|
199
212
|
const date = moment().format('YYYY-MM-DD HH:mm:ss.SSS');
|
|
200
213
|
const message = args.join(', ');
|
|
201
214
|
let consoleMessage = message;
|
|
@@ -216,7 +229,13 @@ class IssueReporter {
|
|
|
216
229
|
const oldMethod = this.oldConsoleMethods[consoleLevel] || this.oldConsoleMethods.log;
|
|
217
230
|
oldMethod.apply(oldMethod, [date, consoleMessage]);
|
|
218
231
|
|
|
219
|
-
this.
|
|
232
|
+
if (this._callback) {
|
|
233
|
+
this._callback(level, consoleMessage);
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
if (!skipSendToRemote) {
|
|
237
|
+
this._sendToRemoteLogger(level, { date, message, category, ...extra });
|
|
238
|
+
}
|
|
220
239
|
}
|
|
221
240
|
|
|
222
241
|
logRequest(url , options , response , start ) {
|
|
@@ -361,7 +380,11 @@ class IssueReporter {
|
|
|
361
380
|
},
|
|
362
381
|
// $FlowFixMe
|
|
363
382
|
body,
|
|
364
|
-
}).catch(() => {
|
|
383
|
+
}).catch((e ) => {
|
|
384
|
+
// $FlowFixMe
|
|
385
|
+
e.skipSendToRemote = true;
|
|
386
|
+
this.log('error', this._makeCategory('grafana'), 'Sending log to grafana, error', e);
|
|
387
|
+
|
|
365
388
|
setTimeout(() => {
|
|
366
389
|
if (isArray) {
|
|
367
390
|
payload = payload.map(message => {
|
|
@@ -373,7 +396,7 @@ class IssueReporter {
|
|
|
373
396
|
payload._retry = retry + 1;
|
|
374
397
|
}
|
|
375
398
|
|
|
376
|
-
this._sendDebugToGrafana(
|
|
399
|
+
this._sendDebugToGrafana(payload, retry + 1);
|
|
377
400
|
}, 5000 + retry * 1000);
|
|
378
401
|
});
|
|
379
402
|
}
|
|
@@ -578,6 +601,7 @@ const AGENT_PAUSED = 'agent_paused';
|
|
|
578
601
|
const AGENT_UNPAUSED = 'agent_unpaused';
|
|
579
602
|
const CONFERENCE_ADHOC_PARTICIPANT_LEFT = 'conference_adhoc_participant_left';
|
|
580
603
|
const CONFERENCE_ADHOC_DELETED = 'conference_adhoc_deleted';
|
|
604
|
+
const MEETING_USER_PROGRESS = 'meeting_user_progress';
|
|
581
605
|
|
|
582
606
|
const BLACKLIST_EVENTS = [
|
|
583
607
|
CHAT_MESSAGE_SENT,
|
|
@@ -928,6 +952,7 @@ WebSocketClient.eventLists = [
|
|
|
928
952
|
AGENT_UNPAUSED,
|
|
929
953
|
CONFERENCE_ADHOC_PARTICIPANT_LEFT,
|
|
930
954
|
CONFERENCE_ADHOC_DELETED,
|
|
955
|
+
MEETING_USER_PROGRESS,
|
|
931
956
|
];
|
|
932
957
|
|
|
933
958
|
var wazoWebsocket = {
|
|
@@ -968,4 +993,4 @@ var wazoWebsocket = {
|
|
|
968
993
|
}),
|
|
969
994
|
};
|
|
970
995
|
|
|
971
|
-
export
|
|
996
|
+
export default wazoWebsocket;
|
|
@@ -19,7 +19,7 @@ import 'sip.js/lib/platform/web/session-description-handler/session-description-
|
|
|
19
19
|
import moment from 'moment';
|
|
20
20
|
import { Base64 } from 'js-base64';
|
|
21
21
|
import sdpParser from 'sdp-transform';
|
|
22
|
-
import {
|
|
22
|
+
import { jws, b64utoutf8, KEYUTIL } from 'jsrsasign';
|
|
23
23
|
import { jsonToGraphQLQuery } from 'json-to-graphql-query/lib/jsonToGraphQLQuery';
|
|
24
24
|
|
|
25
25
|
/* */
|
|
@@ -412,6 +412,7 @@ class IssueReporter {
|
|
|
412
412
|
|
|
413
413
|
|
|
414
414
|
|
|
415
|
+
|
|
415
416
|
|
|
416
417
|
constructor() {
|
|
417
418
|
addLevelsTo(this);
|
|
@@ -423,12 +424,17 @@ class IssueReporter {
|
|
|
423
424
|
this.bufferTimeout = null;
|
|
424
425
|
this._boundProcessBuffer = this._processBuffer.bind(this);
|
|
425
426
|
this._boundParseLoggerBody = this._parseLoggerBody.bind(this);
|
|
427
|
+
this._callback = null;
|
|
426
428
|
}
|
|
427
429
|
|
|
428
430
|
init() {
|
|
429
431
|
this._catchConsole();
|
|
430
432
|
}
|
|
431
433
|
|
|
434
|
+
setCallback(cb ) {
|
|
435
|
+
this._callback = cb;
|
|
436
|
+
}
|
|
437
|
+
|
|
432
438
|
configureRemoteClient(configuration = { tag: 'wazo-sdk', host: null, port: null, level: null, extra: {} }) {
|
|
433
439
|
this.remoteClientConfiguration = configuration;
|
|
434
440
|
}
|
|
@@ -464,6 +470,7 @@ class IssueReporter {
|
|
|
464
470
|
|
|
465
471
|
// Handle category label
|
|
466
472
|
let category = null;
|
|
473
|
+
let skipSendToRemote = false;
|
|
467
474
|
let extra = {};
|
|
468
475
|
if (args[0].indexOf(CATEGORY_PREFIX) === 0) {
|
|
469
476
|
category = args[0].split('=')[1];
|
|
@@ -479,6 +486,7 @@ class IssueReporter {
|
|
|
479
486
|
errorMessage: lastArg.message,
|
|
480
487
|
errorStack: lastArg.stack,
|
|
481
488
|
errorType: lastArg.constructor.name,
|
|
489
|
+
skipSendToRemote: lastArg.skipSendToRemote,
|
|
482
490
|
};
|
|
483
491
|
} else {
|
|
484
492
|
extra = lastArg;
|
|
@@ -487,6 +495,11 @@ class IssueReporter {
|
|
|
487
495
|
args.splice(1, 1);
|
|
488
496
|
}
|
|
489
497
|
|
|
498
|
+
if (extra.skipSendToRemote) {
|
|
499
|
+
skipSendToRemote = true;
|
|
500
|
+
delete extra.skipSendToRemote;
|
|
501
|
+
}
|
|
502
|
+
|
|
490
503
|
const date = moment().format('YYYY-MM-DD HH:mm:ss.SSS');
|
|
491
504
|
const message = args.join(', ');
|
|
492
505
|
let consoleMessage = message;
|
|
@@ -507,7 +520,13 @@ class IssueReporter {
|
|
|
507
520
|
const oldMethod = this.oldConsoleMethods[consoleLevel] || this.oldConsoleMethods.log;
|
|
508
521
|
oldMethod.apply(oldMethod, [date, consoleMessage]);
|
|
509
522
|
|
|
510
|
-
this.
|
|
523
|
+
if (this._callback) {
|
|
524
|
+
this._callback(level, consoleMessage);
|
|
525
|
+
}
|
|
526
|
+
|
|
527
|
+
if (!skipSendToRemote) {
|
|
528
|
+
this._sendToRemoteLogger(level, { date, message, category, ...extra });
|
|
529
|
+
}
|
|
511
530
|
}
|
|
512
531
|
|
|
513
532
|
logRequest(url , options , response , start ) {
|
|
@@ -652,7 +671,11 @@ class IssueReporter {
|
|
|
652
671
|
},
|
|
653
672
|
// $FlowFixMe
|
|
654
673
|
body,
|
|
655
|
-
}).catch(() => {
|
|
674
|
+
}).catch((e ) => {
|
|
675
|
+
// $FlowFixMe
|
|
676
|
+
e.skipSendToRemote = true;
|
|
677
|
+
this.log('error', this._makeCategory('grafana'), 'Sending log to grafana, error', e);
|
|
678
|
+
|
|
656
679
|
setTimeout(() => {
|
|
657
680
|
if (isArray) {
|
|
658
681
|
payload = payload.map(message => {
|
|
@@ -664,7 +687,7 @@ class IssueReporter {
|
|
|
664
687
|
payload._retry = retry + 1;
|
|
665
688
|
}
|
|
666
689
|
|
|
667
|
-
this._sendDebugToGrafana(
|
|
690
|
+
this._sendDebugToGrafana(payload, retry + 1);
|
|
668
691
|
}, 5000 + retry * 1000);
|
|
669
692
|
});
|
|
670
693
|
}
|
|
@@ -3166,7 +3189,8 @@ class ExternalApp {
|
|
|
3166
3189
|
|
|
3167
3190
|
|
|
3168
3191
|
|
|
3169
|
-
|
|
3192
|
+
|
|
3193
|
+
|
|
3170
3194
|
|
|
3171
3195
|
|
|
3172
3196
|
class Meeting {
|
|
@@ -3178,6 +3202,7 @@ class Meeting {
|
|
|
3178
3202
|
|
|
3179
3203
|
|
|
3180
3204
|
|
|
3205
|
+
|
|
3181
3206
|
|
|
3182
3207
|
|
|
3183
3208
|
static parse(plain ) {
|
|
@@ -3189,14 +3214,28 @@ class Meeting {
|
|
|
3189
3214
|
port: plain.port,
|
|
3190
3215
|
uuid: plain.uuid,
|
|
3191
3216
|
number: plain.number,
|
|
3217
|
+
persistent: plain.persistent,
|
|
3192
3218
|
});
|
|
3193
3219
|
}
|
|
3194
3220
|
|
|
3221
|
+
static parseMany(items ) {
|
|
3222
|
+
return items.map(plain => Meeting.parse(plain));
|
|
3223
|
+
}
|
|
3224
|
+
|
|
3195
3225
|
static newFrom(meeting ) {
|
|
3196
3226
|
return newFrom(meeting, Meeting);
|
|
3197
3227
|
}
|
|
3198
3228
|
|
|
3199
|
-
constructor({
|
|
3229
|
+
constructor({
|
|
3230
|
+
uuid,
|
|
3231
|
+
name,
|
|
3232
|
+
guestSipAuthorization,
|
|
3233
|
+
ownerUuids,
|
|
3234
|
+
port,
|
|
3235
|
+
uri,
|
|
3236
|
+
number,
|
|
3237
|
+
persistent,
|
|
3238
|
+
} = {}) {
|
|
3200
3239
|
this.guestSipAuthorization = guestSipAuthorization;
|
|
3201
3240
|
this.uri = uri;
|
|
3202
3241
|
this.name = name;
|
|
@@ -3204,6 +3243,7 @@ class Meeting {
|
|
|
3204
3243
|
this.port = port;
|
|
3205
3244
|
this.uuid = uuid;
|
|
3206
3245
|
this.number = number;
|
|
3246
|
+
this.persistent = persistent;
|
|
3207
3247
|
|
|
3208
3248
|
// Useful to compare instead of instanceof with minified code
|
|
3209
3249
|
this.type = 'Meeting';
|
|
@@ -3281,8 +3321,11 @@ var confdMethods = (client , baseUrl ) => ({
|
|
|
3281
3321
|
}
|
|
3282
3322
|
},
|
|
3283
3323
|
|
|
3284
|
-
|
|
3285
|
-
client.
|
|
3324
|
+
getMyMeetings: () =>
|
|
3325
|
+
client.get(`${baseUrl}/users/me/meetings`).then(response => Meeting.parseMany(response.items)),
|
|
3326
|
+
|
|
3327
|
+
createMyMeeting: (name , persistent ) =>
|
|
3328
|
+
client.post(`${baseUrl}/users/me/meetings`, { name, persistent }).then(Meeting.parse),
|
|
3286
3329
|
|
|
3287
3330
|
deleteMyMeeting: (meetingUuid ) =>
|
|
3288
3331
|
client.delete(`${baseUrl}/users/me/meetings/${meetingUuid}`, null),
|
|
@@ -3767,7 +3810,7 @@ class Recording {
|
|
|
3767
3810
|
|
|
3768
3811
|
|
|
3769
3812
|
|
|
3770
|
-
static parseMany(recordings
|
|
3813
|
+
static parseMany(recordings = []) {
|
|
3771
3814
|
return recordings.map(item => Recording.parse(item));
|
|
3772
3815
|
}
|
|
3773
3816
|
|
|
@@ -3893,7 +3936,7 @@ class CallLog {
|
|
|
3893
3936
|
duration: (plain.duration || 0) * 1000, // duration is in seconds
|
|
3894
3937
|
start: moment(plain.start).toDate(),
|
|
3895
3938
|
end: plain.end ? moment(plain.end).toDate() : null,
|
|
3896
|
-
recordings: Recording.parseMany(plain.recordings),
|
|
3939
|
+
recordings: Recording.parseMany(plain.recordings || []),
|
|
3897
3940
|
});
|
|
3898
3941
|
}
|
|
3899
3942
|
|
|
@@ -5694,7 +5737,9 @@ class WebRTCClient extends Emitter {
|
|
|
5694
5737
|
const inviteOptions = {
|
|
5695
5738
|
requestDelegate: {
|
|
5696
5739
|
onAccept: (response ) => {
|
|
5697
|
-
session.sessionDescriptionHandler.peerConnection
|
|
5740
|
+
if (session.sessionDescriptionHandler.peerConnection) {
|
|
5741
|
+
session.sessionDescriptionHandler.peerConnection.sfu = conference;
|
|
5742
|
+
}
|
|
5698
5743
|
this._onAccepted(session, response.session, true);
|
|
5699
5744
|
},
|
|
5700
5745
|
onReject: (response ) => {
|
|
@@ -6030,7 +6075,7 @@ class WebRTCClient extends Emitter {
|
|
|
6030
6075
|
// We search for the last transceiver without `video-` in the mid (video- means remote transceiver)
|
|
6031
6076
|
const transceivers = pc.getTransceivers();
|
|
6032
6077
|
const transceiverIdx = lastIndexOf(transceivers, transceiver =>
|
|
6033
|
-
transceiver.sender.track === null && transceiver.mid.indexOf('video') === -1);
|
|
6078
|
+
transceiver.sender.track === null && transceiver.mid && transceiver.mid.indexOf('video') === -1);
|
|
6034
6079
|
|
|
6035
6080
|
videoSender = transceiverIdx !== -1 ? transceivers[transceiverIdx].sender : null;
|
|
6036
6081
|
} else {
|
|
@@ -6566,6 +6611,16 @@ class WebRTCClient extends Emitter {
|
|
|
6566
6611
|
return this.hasRemoteVideo(sessionId) ? this.getRemoteStream(sessionId) : null;
|
|
6567
6612
|
}
|
|
6568
6613
|
|
|
6614
|
+
// Useful in a react-native environment when remoteMediaStream is not updated
|
|
6615
|
+
getRemoteVideoStreamFromPc(sessionId ) {
|
|
6616
|
+
const pc = this.getPeerConnection(sessionId);
|
|
6617
|
+
if (!pc) {
|
|
6618
|
+
return null;
|
|
6619
|
+
}
|
|
6620
|
+
|
|
6621
|
+
return pc.getRemoteStreams().find(stream => !!stream.getVideoTracks().length);
|
|
6622
|
+
}
|
|
6623
|
+
|
|
6569
6624
|
hasVideo(sessionId ) {
|
|
6570
6625
|
return this.hasLocalVideo(sessionId) || this.hasRemoteVideo(sessionId);
|
|
6571
6626
|
}
|
|
@@ -7076,6 +7131,7 @@ class WebRTCClient extends Emitter {
|
|
|
7076
7131
|
session.sessionDescriptionHandler.remoteMediaStream.onaddtrack = onTrack;
|
|
7077
7132
|
|
|
7078
7133
|
pc.oniceconnectionstatechange = () => {
|
|
7134
|
+
logger.info('on ice connection state changed', { state: pc.iceConnectionState });
|
|
7079
7135
|
if (pc.iceConnectionState === 'disconnected') {
|
|
7080
7136
|
this.eventEmitter.emit(ON_DISCONNECTED);
|
|
7081
7137
|
}
|
|
@@ -7344,18 +7400,22 @@ class WebRTCClient extends Emitter {
|
|
|
7344
7400
|
});
|
|
7345
7401
|
|
|
7346
7402
|
networkStats.packetsLost = packetsLost;
|
|
7347
|
-
networkStats.
|
|
7403
|
+
networkStats.totalAudioBytesSent = audioBytesSent;
|
|
7404
|
+
networkStats.audioBytesSent = audioBytesSent - lastAudioSent;
|
|
7405
|
+
networkStats.totalAudioBytesReceived = audioBytesReceived - lastAudioReceived;
|
|
7348
7406
|
networkStats.audioBytesReceived = audioBytesReceived;
|
|
7349
|
-
networkStats.
|
|
7350
|
-
networkStats.
|
|
7407
|
+
networkStats.totalVideoBytesSent = videoBytesSent;
|
|
7408
|
+
networkStats.videoBytesSent = videoBytesSent - lastVideoSent;
|
|
7409
|
+
networkStats.totalVideoBytesReceived = videoBytesReceived;
|
|
7410
|
+
networkStats.videoBytesReceived = videoBytesReceived - lastVideoReceived;
|
|
7411
|
+
networkStats.totalTransportSent = transportSent - lastTransportSent;
|
|
7351
7412
|
networkStats.transportSent = transportSent;
|
|
7352
|
-
networkStats.
|
|
7353
|
-
|
|
7354
|
-
const bandwidth = (networkStats.audioBytesSent - lastAudioSent) + (networkStats.videoBytesSent - lastVideoSent)
|
|
7355
|
-
+ (networkStats.audioBytesReceived - lastAudioReceived) + (networkStats.videoBytesReceived - lastVideoReceived)
|
|
7356
|
-
+ (networkStats.transportReceived - lastTransportReceived) + (networkStats.transportSent - lastTransportSent);
|
|
7413
|
+
networkStats.totalTransportReceived = transportReceived;
|
|
7414
|
+
networkStats.transportReceived = transportReceived - lastTransportReceived;
|
|
7357
7415
|
|
|
7358
|
-
networkStats.bandwidth =
|
|
7416
|
+
networkStats.bandwidth = networkStats.audioBytesSent + networkStats.audioBytesReceived
|
|
7417
|
+
+ networkStats.videoBytesSent + networkStats.videoBytesReceived + networkStats.transportReceived
|
|
7418
|
+
+ networkStats.transportSent;
|
|
7359
7419
|
|
|
7360
7420
|
this.eventEmitter.emit(ON_NETWORK_STATS, session, networkStats, this.sessionNetworkStats[sessionId]);
|
|
7361
7421
|
this.sessionNetworkStats[sessionId].push(networkStats);
|
|
@@ -7400,4 +7460,4 @@ var webrtcTransport = {
|
|
|
7400
7460
|
}),
|
|
7401
7461
|
};
|
|
7402
7462
|
|
|
7403
|
-
export
|
|
7463
|
+
export default webrtcTransport;
|