@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
|
@@ -136,6 +136,7 @@ class IssueReporter {
|
|
|
136
136
|
|
|
137
137
|
|
|
138
138
|
|
|
139
|
+
|
|
139
140
|
|
|
140
141
|
constructor() {
|
|
141
142
|
addLevelsTo(this);
|
|
@@ -147,12 +148,17 @@ class IssueReporter {
|
|
|
147
148
|
this.bufferTimeout = null;
|
|
148
149
|
this._boundProcessBuffer = this._processBuffer.bind(this);
|
|
149
150
|
this._boundParseLoggerBody = this._parseLoggerBody.bind(this);
|
|
151
|
+
this._callback = null;
|
|
150
152
|
}
|
|
151
153
|
|
|
152
154
|
init() {
|
|
153
155
|
this._catchConsole();
|
|
154
156
|
}
|
|
155
157
|
|
|
158
|
+
setCallback(cb ) {
|
|
159
|
+
this._callback = cb;
|
|
160
|
+
}
|
|
161
|
+
|
|
156
162
|
configureRemoteClient(configuration = { tag: 'wazo-sdk', host: null, port: null, level: null, extra: {} }) {
|
|
157
163
|
this.remoteClientConfiguration = configuration;
|
|
158
164
|
}
|
|
@@ -188,6 +194,7 @@ class IssueReporter {
|
|
|
188
194
|
|
|
189
195
|
// Handle category label
|
|
190
196
|
let category = null;
|
|
197
|
+
let skipSendToRemote = false;
|
|
191
198
|
let extra = {};
|
|
192
199
|
if (args[0].indexOf(CATEGORY_PREFIX) === 0) {
|
|
193
200
|
category = args[0].split('=')[1];
|
|
@@ -203,6 +210,7 @@ class IssueReporter {
|
|
|
203
210
|
errorMessage: lastArg.message,
|
|
204
211
|
errorStack: lastArg.stack,
|
|
205
212
|
errorType: lastArg.constructor.name,
|
|
213
|
+
skipSendToRemote: lastArg.skipSendToRemote,
|
|
206
214
|
};
|
|
207
215
|
} else {
|
|
208
216
|
extra = lastArg;
|
|
@@ -211,7 +219,12 @@ class IssueReporter {
|
|
|
211
219
|
args.splice(1, 1);
|
|
212
220
|
}
|
|
213
221
|
|
|
214
|
-
|
|
222
|
+
if (extra.skipSendToRemote) {
|
|
223
|
+
skipSendToRemote = true;
|
|
224
|
+
delete extra.skipSendToRemote;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
const date = moment__default['default']().format('YYYY-MM-DD HH:mm:ss.SSS');
|
|
215
228
|
const message = args.join(', ');
|
|
216
229
|
let consoleMessage = message;
|
|
217
230
|
|
|
@@ -231,7 +244,13 @@ class IssueReporter {
|
|
|
231
244
|
const oldMethod = this.oldConsoleMethods[consoleLevel] || this.oldConsoleMethods.log;
|
|
232
245
|
oldMethod.apply(oldMethod, [date, consoleMessage]);
|
|
233
246
|
|
|
234
|
-
this.
|
|
247
|
+
if (this._callback) {
|
|
248
|
+
this._callback(level, consoleMessage);
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
if (!skipSendToRemote) {
|
|
252
|
+
this._sendToRemoteLogger(level, { date, message, category, ...extra });
|
|
253
|
+
}
|
|
235
254
|
}
|
|
236
255
|
|
|
237
256
|
logRequest(url , options , response , start ) {
|
|
@@ -376,7 +395,11 @@ class IssueReporter {
|
|
|
376
395
|
},
|
|
377
396
|
// $FlowFixMe
|
|
378
397
|
body,
|
|
379
|
-
}).catch(() => {
|
|
398
|
+
}).catch((e ) => {
|
|
399
|
+
// $FlowFixMe
|
|
400
|
+
e.skipSendToRemote = true;
|
|
401
|
+
this.log('error', this._makeCategory('grafana'), 'Sending log to grafana, error', e);
|
|
402
|
+
|
|
380
403
|
setTimeout(() => {
|
|
381
404
|
if (isArray) {
|
|
382
405
|
payload = payload.map(message => {
|
|
@@ -388,7 +411,7 @@ class IssueReporter {
|
|
|
388
411
|
payload._retry = retry + 1;
|
|
389
412
|
}
|
|
390
413
|
|
|
391
|
-
this._sendDebugToGrafana(
|
|
414
|
+
this._sendDebugToGrafana(payload, retry + 1);
|
|
392
415
|
}, 5000 + retry * 1000);
|
|
393
416
|
});
|
|
394
417
|
}
|
|
@@ -2591,7 +2614,8 @@ class ExternalApp {
|
|
|
2591
2614
|
|
|
2592
2615
|
|
|
2593
2616
|
|
|
2594
|
-
|
|
2617
|
+
|
|
2618
|
+
|
|
2595
2619
|
|
|
2596
2620
|
|
|
2597
2621
|
class Meeting {
|
|
@@ -2603,6 +2627,7 @@ class Meeting {
|
|
|
2603
2627
|
|
|
2604
2628
|
|
|
2605
2629
|
|
|
2630
|
+
|
|
2606
2631
|
|
|
2607
2632
|
|
|
2608
2633
|
static parse(plain ) {
|
|
@@ -2614,14 +2639,28 @@ class Meeting {
|
|
|
2614
2639
|
port: plain.port,
|
|
2615
2640
|
uuid: plain.uuid,
|
|
2616
2641
|
number: plain.number,
|
|
2642
|
+
persistent: plain.persistent,
|
|
2617
2643
|
});
|
|
2618
2644
|
}
|
|
2619
2645
|
|
|
2646
|
+
static parseMany(items ) {
|
|
2647
|
+
return items.map(plain => Meeting.parse(plain));
|
|
2648
|
+
}
|
|
2649
|
+
|
|
2620
2650
|
static newFrom(meeting ) {
|
|
2621
2651
|
return newFrom(meeting, Meeting);
|
|
2622
2652
|
}
|
|
2623
2653
|
|
|
2624
|
-
constructor({
|
|
2654
|
+
constructor({
|
|
2655
|
+
uuid,
|
|
2656
|
+
name,
|
|
2657
|
+
guestSipAuthorization,
|
|
2658
|
+
ownerUuids,
|
|
2659
|
+
port,
|
|
2660
|
+
uri,
|
|
2661
|
+
number,
|
|
2662
|
+
persistent,
|
|
2663
|
+
} = {}) {
|
|
2625
2664
|
this.guestSipAuthorization = guestSipAuthorization;
|
|
2626
2665
|
this.uri = uri;
|
|
2627
2666
|
this.name = name;
|
|
@@ -2629,6 +2668,7 @@ class Meeting {
|
|
|
2629
2668
|
this.port = port;
|
|
2630
2669
|
this.uuid = uuid;
|
|
2631
2670
|
this.number = number;
|
|
2671
|
+
this.persistent = persistent;
|
|
2632
2672
|
|
|
2633
2673
|
// Useful to compare instead of instanceof with minified code
|
|
2634
2674
|
this.type = 'Meeting';
|
|
@@ -2706,8 +2746,11 @@ var confdMethods = (client , baseUrl ) => ({
|
|
|
2706
2746
|
}
|
|
2707
2747
|
},
|
|
2708
2748
|
|
|
2709
|
-
|
|
2710
|
-
client.
|
|
2749
|
+
getMyMeetings: () =>
|
|
2750
|
+
client.get(`${baseUrl}/users/me/meetings`).then(response => Meeting.parseMany(response.items)),
|
|
2751
|
+
|
|
2752
|
+
createMyMeeting: (name , persistent ) =>
|
|
2753
|
+
client.post(`${baseUrl}/users/me/meetings`, { name, persistent }).then(Meeting.parse),
|
|
2711
2754
|
|
|
2712
2755
|
deleteMyMeeting: (meetingUuid ) =>
|
|
2713
2756
|
client.delete(`${baseUrl}/users/me/meetings/${meetingUuid}`, null),
|
|
@@ -2809,7 +2852,7 @@ class ChatMessage {
|
|
|
2809
2852
|
static parse(plain ) {
|
|
2810
2853
|
return new ChatMessage({
|
|
2811
2854
|
uuid: plain.uuid,
|
|
2812
|
-
date: moment__default[
|
|
2855
|
+
date: moment__default['default'](plain.created_at).toDate(),
|
|
2813
2856
|
content: plain.content,
|
|
2814
2857
|
alias: plain.alias,
|
|
2815
2858
|
userUuid: plain.user_uuid,
|
|
@@ -2901,7 +2944,7 @@ class Voicemail {
|
|
|
2901
2944
|
static parse(plain ) {
|
|
2902
2945
|
return new Voicemail({
|
|
2903
2946
|
id: plain.id,
|
|
2904
|
-
date: moment__default[
|
|
2947
|
+
date: moment__default['default'](plain.timestamp * 1000).toDate(),
|
|
2905
2948
|
duration: plain.duration * 1000,
|
|
2906
2949
|
caller: {
|
|
2907
2950
|
name: plain.caller_id_name,
|
|
@@ -3038,7 +3081,7 @@ class Call {
|
|
|
3038
3081
|
onHold: plain.on_hold,
|
|
3039
3082
|
status: plain.status,
|
|
3040
3083
|
lineId: plain.line_id,
|
|
3041
|
-
startingTime: moment__default[
|
|
3084
|
+
startingTime: moment__default['default'](plain.creation_time).toDate(),
|
|
3042
3085
|
talkingToIds: Object.keys(plain.talking_to || {}),
|
|
3043
3086
|
recording: plain.record_state === RECORD_STATE_ACTIVE,
|
|
3044
3087
|
});
|
|
@@ -3192,7 +3235,7 @@ class Recording {
|
|
|
3192
3235
|
|
|
3193
3236
|
|
|
3194
3237
|
|
|
3195
|
-
static parseMany(recordings
|
|
3238
|
+
static parseMany(recordings = []) {
|
|
3196
3239
|
return recordings.map(item => Recording.parse(item));
|
|
3197
3240
|
}
|
|
3198
3241
|
|
|
@@ -3200,8 +3243,8 @@ class Recording {
|
|
|
3200
3243
|
return new Recording({
|
|
3201
3244
|
deleted: plain.deleted,
|
|
3202
3245
|
fileName: plain.filename,
|
|
3203
|
-
end: plain.end_time ? moment__default[
|
|
3204
|
-
start: moment__default[
|
|
3246
|
+
end: plain.end_time ? moment__default['default'](plain.end_time).toDate() : null,
|
|
3247
|
+
start: moment__default['default'](plain.start_time).toDate(),
|
|
3205
3248
|
uuid: plain.uuid,
|
|
3206
3249
|
});
|
|
3207
3250
|
}
|
|
@@ -3299,7 +3342,7 @@ class CallLog {
|
|
|
3299
3342
|
|
|
3300
3343
|
static parse(plain ) {
|
|
3301
3344
|
return new CallLog({
|
|
3302
|
-
answer: plain.answer ? moment__default[
|
|
3345
|
+
answer: plain.answer ? moment__default['default'](plain.answer).toDate() : null,
|
|
3303
3346
|
answered: plain.answered,
|
|
3304
3347
|
callDirection: plain.call_direction,
|
|
3305
3348
|
destination: {
|
|
@@ -3316,9 +3359,9 @@ class CallLog {
|
|
|
3316
3359
|
},
|
|
3317
3360
|
id: plain.id,
|
|
3318
3361
|
duration: (plain.duration || 0) * 1000, // duration is in seconds
|
|
3319
|
-
start: moment__default[
|
|
3320
|
-
end: plain.end ? moment__default[
|
|
3321
|
-
recordings: Recording.parseMany(plain.recordings),
|
|
3362
|
+
start: moment__default['default'](plain.start).toDate(),
|
|
3363
|
+
end: plain.end ? moment__default['default'](plain.end).toDate() : null,
|
|
3364
|
+
recordings: Recording.parseMany(plain.recordings || []),
|
|
3322
3365
|
});
|
|
3323
3366
|
}
|
|
3324
3367
|
|
|
@@ -421,6 +421,7 @@ class IssueReporter {
|
|
|
421
421
|
|
|
422
422
|
|
|
423
423
|
|
|
424
|
+
|
|
424
425
|
|
|
425
426
|
constructor() {
|
|
426
427
|
addLevelsTo(this);
|
|
@@ -432,12 +433,17 @@ class IssueReporter {
|
|
|
432
433
|
this.bufferTimeout = null;
|
|
433
434
|
this._boundProcessBuffer = this._processBuffer.bind(this);
|
|
434
435
|
this._boundParseLoggerBody = this._parseLoggerBody.bind(this);
|
|
436
|
+
this._callback = null;
|
|
435
437
|
}
|
|
436
438
|
|
|
437
439
|
init() {
|
|
438
440
|
this._catchConsole();
|
|
439
441
|
}
|
|
440
442
|
|
|
443
|
+
setCallback(cb ) {
|
|
444
|
+
this._callback = cb;
|
|
445
|
+
}
|
|
446
|
+
|
|
441
447
|
configureRemoteClient(configuration = { tag: 'wazo-sdk', host: null, port: null, level: null, extra: {} }) {
|
|
442
448
|
this.remoteClientConfiguration = configuration;
|
|
443
449
|
}
|
|
@@ -473,6 +479,7 @@ class IssueReporter {
|
|
|
473
479
|
|
|
474
480
|
// Handle category label
|
|
475
481
|
let category = null;
|
|
482
|
+
let skipSendToRemote = false;
|
|
476
483
|
let extra = {};
|
|
477
484
|
if (args[0].indexOf(CATEGORY_PREFIX) === 0) {
|
|
478
485
|
category = args[0].split('=')[1];
|
|
@@ -488,6 +495,7 @@ class IssueReporter {
|
|
|
488
495
|
errorMessage: lastArg.message,
|
|
489
496
|
errorStack: lastArg.stack,
|
|
490
497
|
errorType: lastArg.constructor.name,
|
|
498
|
+
skipSendToRemote: lastArg.skipSendToRemote,
|
|
491
499
|
};
|
|
492
500
|
} else {
|
|
493
501
|
extra = lastArg;
|
|
@@ -496,7 +504,12 @@ class IssueReporter {
|
|
|
496
504
|
args.splice(1, 1);
|
|
497
505
|
}
|
|
498
506
|
|
|
499
|
-
|
|
507
|
+
if (extra.skipSendToRemote) {
|
|
508
|
+
skipSendToRemote = true;
|
|
509
|
+
delete extra.skipSendToRemote;
|
|
510
|
+
}
|
|
511
|
+
|
|
512
|
+
const date = moment__default['default']().format('YYYY-MM-DD HH:mm:ss.SSS');
|
|
500
513
|
const message = args.join(', ');
|
|
501
514
|
let consoleMessage = message;
|
|
502
515
|
|
|
@@ -516,7 +529,13 @@ class IssueReporter {
|
|
|
516
529
|
const oldMethod = this.oldConsoleMethods[consoleLevel] || this.oldConsoleMethods.log;
|
|
517
530
|
oldMethod.apply(oldMethod, [date, consoleMessage]);
|
|
518
531
|
|
|
519
|
-
this.
|
|
532
|
+
if (this._callback) {
|
|
533
|
+
this._callback(level, consoleMessage);
|
|
534
|
+
}
|
|
535
|
+
|
|
536
|
+
if (!skipSendToRemote) {
|
|
537
|
+
this._sendToRemoteLogger(level, { date, message, category, ...extra });
|
|
538
|
+
}
|
|
520
539
|
}
|
|
521
540
|
|
|
522
541
|
logRequest(url , options , response , start ) {
|
|
@@ -661,7 +680,11 @@ class IssueReporter {
|
|
|
661
680
|
},
|
|
662
681
|
// $FlowFixMe
|
|
663
682
|
body,
|
|
664
|
-
}).catch(() => {
|
|
683
|
+
}).catch((e ) => {
|
|
684
|
+
// $FlowFixMe
|
|
685
|
+
e.skipSendToRemote = true;
|
|
686
|
+
this.log('error', this._makeCategory('grafana'), 'Sending log to grafana, error', e);
|
|
687
|
+
|
|
665
688
|
setTimeout(() => {
|
|
666
689
|
if (isArray) {
|
|
667
690
|
payload = payload.map(message => {
|
|
@@ -673,7 +696,7 @@ class IssueReporter {
|
|
|
673
696
|
payload._retry = retry + 1;
|
|
674
697
|
}
|
|
675
698
|
|
|
676
|
-
this._sendDebugToGrafana(
|
|
699
|
+
this._sendDebugToGrafana(payload, retry + 1);
|
|
677
700
|
}, 5000 + retry * 1000);
|
|
678
701
|
});
|
|
679
702
|
}
|
|
@@ -701,7 +724,7 @@ const parseCandidate = (candidate ) => {
|
|
|
701
724
|
if (!candidate) {
|
|
702
725
|
return null;
|
|
703
726
|
}
|
|
704
|
-
const result = sdpParser__default[
|
|
727
|
+
const result = sdpParser__default['default'].parse(candidate.indexOf('a=') === 0 ? candidate : `a=${candidate}`);
|
|
705
728
|
|
|
706
729
|
return result.candidates ? result.candidates[0] : null;
|
|
707
730
|
};
|
|
@@ -715,7 +738,7 @@ const areCandidateValid = (candidates ) =>
|
|
|
715
738
|
.length > 0;
|
|
716
739
|
|
|
717
740
|
const getVideoDirection = (sdp ) => {
|
|
718
|
-
const parsedSdp = sdpParser__default[
|
|
741
|
+
const parsedSdp = sdpParser__default['default'].parse(sdp);
|
|
719
742
|
const videoMedia = parsedSdp.media.find(media => media.type === 'video');
|
|
720
743
|
if (!videoMedia) {
|
|
721
744
|
return null;
|
|
@@ -729,14 +752,14 @@ const hasAnActiveVideo = (sdp ) => {
|
|
|
729
752
|
return false;
|
|
730
753
|
}
|
|
731
754
|
|
|
732
|
-
const parsedSdp = sdpParser__default[
|
|
755
|
+
const parsedSdp = sdpParser__default['default'].parse(sdp);
|
|
733
756
|
|
|
734
757
|
return !!parsedSdp.media.find(media =>
|
|
735
758
|
media.type === 'video' && media.port > 10 && (!media.direction || media.direction !== 'inactive'));
|
|
736
759
|
};
|
|
737
760
|
|
|
738
761
|
const fixSdp = (sdp , candidates , forcePort = true) => {
|
|
739
|
-
const parsedSdp = sdpParser__default[
|
|
762
|
+
const parsedSdp = sdpParser__default['default'].parse(sdp);
|
|
740
763
|
const mainCandidate = getSrflxOrRelay(candidates)[0];
|
|
741
764
|
const ip = mainCandidate ? mainCandidate.ip : null;
|
|
742
765
|
|
|
@@ -754,7 +777,7 @@ const fixSdp = (sdp , candidates , forcePort = true)
|
|
|
754
777
|
};
|
|
755
778
|
});
|
|
756
779
|
|
|
757
|
-
let fixed = sdpParser__default[
|
|
780
|
+
let fixed = sdpParser__default['default'].write(parsedSdp);
|
|
758
781
|
|
|
759
782
|
if (ip) {
|
|
760
783
|
fixed = fixed.replace(/IN IP4 0.0.0.0/g, `IN IP4 ${ip}`);
|
|
@@ -800,7 +823,7 @@ class WazoSessionDescriptionHandler extends sessionDescriptionHandler.SessionDes
|
|
|
800
823
|
) {
|
|
801
824
|
super(logger, mediaStreamFactory, sessionDescriptionHandlerConfiguration);
|
|
802
825
|
|
|
803
|
-
this.eventEmitter = new EventEmitter__default[
|
|
826
|
+
this.eventEmitter = new EventEmitter__default['default']();
|
|
804
827
|
this.isWeb = isWeb;
|
|
805
828
|
this.session = session;
|
|
806
829
|
}
|
|
@@ -1239,7 +1262,7 @@ class Emitter {
|
|
|
1239
1262
|
|
|
1240
1263
|
|
|
1241
1264
|
constructor() {
|
|
1242
|
-
this.eventEmitter = new EventEmitter__default[
|
|
1265
|
+
this.eventEmitter = new EventEmitter__default['default']();
|
|
1243
1266
|
}
|
|
1244
1267
|
|
|
1245
1268
|
on(event , callback ) {
|
|
@@ -3175,7 +3198,8 @@ class ExternalApp {
|
|
|
3175
3198
|
|
|
3176
3199
|
|
|
3177
3200
|
|
|
3178
|
-
|
|
3201
|
+
|
|
3202
|
+
|
|
3179
3203
|
|
|
3180
3204
|
|
|
3181
3205
|
class Meeting {
|
|
@@ -3187,6 +3211,7 @@ class Meeting {
|
|
|
3187
3211
|
|
|
3188
3212
|
|
|
3189
3213
|
|
|
3214
|
+
|
|
3190
3215
|
|
|
3191
3216
|
|
|
3192
3217
|
static parse(plain ) {
|
|
@@ -3198,14 +3223,28 @@ class Meeting {
|
|
|
3198
3223
|
port: plain.port,
|
|
3199
3224
|
uuid: plain.uuid,
|
|
3200
3225
|
number: plain.number,
|
|
3226
|
+
persistent: plain.persistent,
|
|
3201
3227
|
});
|
|
3202
3228
|
}
|
|
3203
3229
|
|
|
3230
|
+
static parseMany(items ) {
|
|
3231
|
+
return items.map(plain => Meeting.parse(plain));
|
|
3232
|
+
}
|
|
3233
|
+
|
|
3204
3234
|
static newFrom(meeting ) {
|
|
3205
3235
|
return newFrom(meeting, Meeting);
|
|
3206
3236
|
}
|
|
3207
3237
|
|
|
3208
|
-
constructor({
|
|
3238
|
+
constructor({
|
|
3239
|
+
uuid,
|
|
3240
|
+
name,
|
|
3241
|
+
guestSipAuthorization,
|
|
3242
|
+
ownerUuids,
|
|
3243
|
+
port,
|
|
3244
|
+
uri,
|
|
3245
|
+
number,
|
|
3246
|
+
persistent,
|
|
3247
|
+
} = {}) {
|
|
3209
3248
|
this.guestSipAuthorization = guestSipAuthorization;
|
|
3210
3249
|
this.uri = uri;
|
|
3211
3250
|
this.name = name;
|
|
@@ -3213,6 +3252,7 @@ class Meeting {
|
|
|
3213
3252
|
this.port = port;
|
|
3214
3253
|
this.uuid = uuid;
|
|
3215
3254
|
this.number = number;
|
|
3255
|
+
this.persistent = persistent;
|
|
3216
3256
|
|
|
3217
3257
|
// Useful to compare instead of instanceof with minified code
|
|
3218
3258
|
this.type = 'Meeting';
|
|
@@ -3290,8 +3330,11 @@ var confdMethods = (client , baseUrl ) => ({
|
|
|
3290
3330
|
}
|
|
3291
3331
|
},
|
|
3292
3332
|
|
|
3293
|
-
|
|
3294
|
-
client.
|
|
3333
|
+
getMyMeetings: () =>
|
|
3334
|
+
client.get(`${baseUrl}/users/me/meetings`).then(response => Meeting.parseMany(response.items)),
|
|
3335
|
+
|
|
3336
|
+
createMyMeeting: (name , persistent ) =>
|
|
3337
|
+
client.post(`${baseUrl}/users/me/meetings`, { name, persistent }).then(Meeting.parse),
|
|
3295
3338
|
|
|
3296
3339
|
deleteMyMeeting: (meetingUuid ) =>
|
|
3297
3340
|
client.delete(`${baseUrl}/users/me/meetings/${meetingUuid}`, null),
|
|
@@ -3393,7 +3436,7 @@ class ChatMessage {
|
|
|
3393
3436
|
static parse(plain ) {
|
|
3394
3437
|
return new ChatMessage({
|
|
3395
3438
|
uuid: plain.uuid,
|
|
3396
|
-
date: moment__default[
|
|
3439
|
+
date: moment__default['default'](plain.created_at).toDate(),
|
|
3397
3440
|
content: plain.content,
|
|
3398
3441
|
alias: plain.alias,
|
|
3399
3442
|
userUuid: plain.user_uuid,
|
|
@@ -3485,7 +3528,7 @@ class Voicemail {
|
|
|
3485
3528
|
static parse(plain ) {
|
|
3486
3529
|
return new Voicemail({
|
|
3487
3530
|
id: plain.id,
|
|
3488
|
-
date: moment__default[
|
|
3531
|
+
date: moment__default['default'](plain.timestamp * 1000).toDate(),
|
|
3489
3532
|
duration: plain.duration * 1000,
|
|
3490
3533
|
caller: {
|
|
3491
3534
|
name: plain.caller_id_name,
|
|
@@ -3622,7 +3665,7 @@ class Call {
|
|
|
3622
3665
|
onHold: plain.on_hold,
|
|
3623
3666
|
status: plain.status,
|
|
3624
3667
|
lineId: plain.line_id,
|
|
3625
|
-
startingTime: moment__default[
|
|
3668
|
+
startingTime: moment__default['default'](plain.creation_time).toDate(),
|
|
3626
3669
|
talkingToIds: Object.keys(plain.talking_to || {}),
|
|
3627
3670
|
recording: plain.record_state === RECORD_STATE_ACTIVE,
|
|
3628
3671
|
});
|
|
@@ -3776,7 +3819,7 @@ class Recording {
|
|
|
3776
3819
|
|
|
3777
3820
|
|
|
3778
3821
|
|
|
3779
|
-
static parseMany(recordings
|
|
3822
|
+
static parseMany(recordings = []) {
|
|
3780
3823
|
return recordings.map(item => Recording.parse(item));
|
|
3781
3824
|
}
|
|
3782
3825
|
|
|
@@ -3784,8 +3827,8 @@ class Recording {
|
|
|
3784
3827
|
return new Recording({
|
|
3785
3828
|
deleted: plain.deleted,
|
|
3786
3829
|
fileName: plain.filename,
|
|
3787
|
-
end: plain.end_time ? moment__default[
|
|
3788
|
-
start: moment__default[
|
|
3830
|
+
end: plain.end_time ? moment__default['default'](plain.end_time).toDate() : null,
|
|
3831
|
+
start: moment__default['default'](plain.start_time).toDate(),
|
|
3789
3832
|
uuid: plain.uuid,
|
|
3790
3833
|
});
|
|
3791
3834
|
}
|
|
@@ -3883,7 +3926,7 @@ class CallLog {
|
|
|
3883
3926
|
|
|
3884
3927
|
static parse(plain ) {
|
|
3885
3928
|
return new CallLog({
|
|
3886
|
-
answer: plain.answer ? moment__default[
|
|
3929
|
+
answer: plain.answer ? moment__default['default'](plain.answer).toDate() : null,
|
|
3887
3930
|
answered: plain.answered,
|
|
3888
3931
|
callDirection: plain.call_direction,
|
|
3889
3932
|
destination: {
|
|
@@ -3900,9 +3943,9 @@ class CallLog {
|
|
|
3900
3943
|
},
|
|
3901
3944
|
id: plain.id,
|
|
3902
3945
|
duration: (plain.duration || 0) * 1000, // duration is in seconds
|
|
3903
|
-
start: moment__default[
|
|
3904
|
-
end: plain.end ? moment__default[
|
|
3905
|
-
recordings: Recording.parseMany(plain.recordings),
|
|
3946
|
+
start: moment__default['default'](plain.start).toDate(),
|
|
3947
|
+
end: plain.end ? moment__default['default'](plain.end).toDate() : null,
|
|
3948
|
+
recordings: Recording.parseMany(plain.recordings || []),
|
|
3906
3949
|
});
|
|
3907
3950
|
}
|
|
3908
3951
|
|
|
@@ -5703,7 +5746,9 @@ class WebRTCClient extends Emitter {
|
|
|
5703
5746
|
const inviteOptions = {
|
|
5704
5747
|
requestDelegate: {
|
|
5705
5748
|
onAccept: (response ) => {
|
|
5706
|
-
session.sessionDescriptionHandler.peerConnection
|
|
5749
|
+
if (session.sessionDescriptionHandler.peerConnection) {
|
|
5750
|
+
session.sessionDescriptionHandler.peerConnection.sfu = conference;
|
|
5751
|
+
}
|
|
5707
5752
|
this._onAccepted(session, response.session, true);
|
|
5708
5753
|
},
|
|
5709
5754
|
onReject: (response ) => {
|
|
@@ -6039,7 +6084,7 @@ class WebRTCClient extends Emitter {
|
|
|
6039
6084
|
// We search for the last transceiver without `video-` in the mid (video- means remote transceiver)
|
|
6040
6085
|
const transceivers = pc.getTransceivers();
|
|
6041
6086
|
const transceiverIdx = lastIndexOf(transceivers, transceiver =>
|
|
6042
|
-
transceiver.sender.track === null && transceiver.mid.indexOf('video') === -1);
|
|
6087
|
+
transceiver.sender.track === null && transceiver.mid && transceiver.mid.indexOf('video') === -1);
|
|
6043
6088
|
|
|
6044
6089
|
videoSender = transceiverIdx !== -1 ? transceivers[transceiverIdx].sender : null;
|
|
6045
6090
|
} else {
|
|
@@ -6575,6 +6620,16 @@ class WebRTCClient extends Emitter {
|
|
|
6575
6620
|
return this.hasRemoteVideo(sessionId) ? this.getRemoteStream(sessionId) : null;
|
|
6576
6621
|
}
|
|
6577
6622
|
|
|
6623
|
+
// Useful in a react-native environment when remoteMediaStream is not updated
|
|
6624
|
+
getRemoteVideoStreamFromPc(sessionId ) {
|
|
6625
|
+
const pc = this.getPeerConnection(sessionId);
|
|
6626
|
+
if (!pc) {
|
|
6627
|
+
return null;
|
|
6628
|
+
}
|
|
6629
|
+
|
|
6630
|
+
return pc.getRemoteStreams().find(stream => !!stream.getVideoTracks().length);
|
|
6631
|
+
}
|
|
6632
|
+
|
|
6578
6633
|
hasVideo(sessionId ) {
|
|
6579
6634
|
return this.hasLocalVideo(sessionId) || this.hasRemoteVideo(sessionId);
|
|
6580
6635
|
}
|
|
@@ -7085,6 +7140,7 @@ class WebRTCClient extends Emitter {
|
|
|
7085
7140
|
session.sessionDescriptionHandler.remoteMediaStream.onaddtrack = onTrack;
|
|
7086
7141
|
|
|
7087
7142
|
pc.oniceconnectionstatechange = () => {
|
|
7143
|
+
logger.info('on ice connection state changed', { state: pc.iceConnectionState });
|
|
7088
7144
|
if (pc.iceConnectionState === 'disconnected') {
|
|
7089
7145
|
this.eventEmitter.emit(ON_DISCONNECTED);
|
|
7090
7146
|
}
|
|
@@ -7244,7 +7300,7 @@ class WebRTCClient extends Emitter {
|
|
|
7244
7300
|
}
|
|
7245
7301
|
const sessionId = this.getSipSessionId(session);
|
|
7246
7302
|
|
|
7247
|
-
getStats__default[
|
|
7303
|
+
getStats__default['default'](pc, (result ) => {
|
|
7248
7304
|
const { results, internal, nomore, ...stats } = result;
|
|
7249
7305
|
this.statsIntervals[sessionId] = nomore;
|
|
7250
7306
|
|
|
@@ -7353,18 +7409,22 @@ class WebRTCClient extends Emitter {
|
|
|
7353
7409
|
});
|
|
7354
7410
|
|
|
7355
7411
|
networkStats.packetsLost = packetsLost;
|
|
7356
|
-
networkStats.
|
|
7412
|
+
networkStats.totalAudioBytesSent = audioBytesSent;
|
|
7413
|
+
networkStats.audioBytesSent = audioBytesSent - lastAudioSent;
|
|
7414
|
+
networkStats.totalAudioBytesReceived = audioBytesReceived - lastAudioReceived;
|
|
7357
7415
|
networkStats.audioBytesReceived = audioBytesReceived;
|
|
7358
|
-
networkStats.
|
|
7359
|
-
networkStats.
|
|
7416
|
+
networkStats.totalVideoBytesSent = videoBytesSent;
|
|
7417
|
+
networkStats.videoBytesSent = videoBytesSent - lastVideoSent;
|
|
7418
|
+
networkStats.totalVideoBytesReceived = videoBytesReceived;
|
|
7419
|
+
networkStats.videoBytesReceived = videoBytesReceived - lastVideoReceived;
|
|
7420
|
+
networkStats.totalTransportSent = transportSent - lastTransportSent;
|
|
7360
7421
|
networkStats.transportSent = transportSent;
|
|
7361
|
-
networkStats.
|
|
7362
|
-
|
|
7363
|
-
const bandwidth = (networkStats.audioBytesSent - lastAudioSent) + (networkStats.videoBytesSent - lastVideoSent)
|
|
7364
|
-
+ (networkStats.audioBytesReceived - lastAudioReceived) + (networkStats.videoBytesReceived - lastVideoReceived)
|
|
7365
|
-
+ (networkStats.transportReceived - lastTransportReceived) + (networkStats.transportSent - lastTransportSent);
|
|
7422
|
+
networkStats.totalTransportReceived = transportReceived;
|
|
7423
|
+
networkStats.transportReceived = transportReceived - lastTransportReceived;
|
|
7366
7424
|
|
|
7367
|
-
networkStats.bandwidth =
|
|
7425
|
+
networkStats.bandwidth = networkStats.audioBytesSent + networkStats.audioBytesReceived
|
|
7426
|
+
+ networkStats.videoBytesSent + networkStats.videoBytesReceived + networkStats.transportReceived
|
|
7427
|
+
+ networkStats.transportSent;
|
|
7368
7428
|
|
|
7369
7429
|
this.eventEmitter.emit(ON_NETWORK_STATS, session, networkStats, this.sessionNetworkStats[sessionId]);
|
|
7370
7430
|
this.sessionNetworkStats[sessionId].push(networkStats);
|
package/lib/api/agentd.js
CHANGED
|
@@ -132,6 +132,7 @@ class IssueReporter {
|
|
|
132
132
|
|
|
133
133
|
|
|
134
134
|
|
|
135
|
+
|
|
135
136
|
|
|
136
137
|
constructor() {
|
|
137
138
|
addLevelsTo(this);
|
|
@@ -143,12 +144,17 @@ class IssueReporter {
|
|
|
143
144
|
this.bufferTimeout = null;
|
|
144
145
|
this._boundProcessBuffer = this._processBuffer.bind(this);
|
|
145
146
|
this._boundParseLoggerBody = this._parseLoggerBody.bind(this);
|
|
147
|
+
this._callback = null;
|
|
146
148
|
}
|
|
147
149
|
|
|
148
150
|
init() {
|
|
149
151
|
this._catchConsole();
|
|
150
152
|
}
|
|
151
153
|
|
|
154
|
+
setCallback(cb ) {
|
|
155
|
+
this._callback = cb;
|
|
156
|
+
}
|
|
157
|
+
|
|
152
158
|
configureRemoteClient(configuration = { tag: 'wazo-sdk', host: null, port: null, level: null, extra: {} }) {
|
|
153
159
|
this.remoteClientConfiguration = configuration;
|
|
154
160
|
}
|
|
@@ -184,6 +190,7 @@ class IssueReporter {
|
|
|
184
190
|
|
|
185
191
|
// Handle category label
|
|
186
192
|
let category = null;
|
|
193
|
+
let skipSendToRemote = false;
|
|
187
194
|
let extra = {};
|
|
188
195
|
if (args[0].indexOf(CATEGORY_PREFIX) === 0) {
|
|
189
196
|
category = args[0].split('=')[1];
|
|
@@ -199,6 +206,7 @@ class IssueReporter {
|
|
|
199
206
|
errorMessage: lastArg.message,
|
|
200
207
|
errorStack: lastArg.stack,
|
|
201
208
|
errorType: lastArg.constructor.name,
|
|
209
|
+
skipSendToRemote: lastArg.skipSendToRemote,
|
|
202
210
|
};
|
|
203
211
|
} else {
|
|
204
212
|
extra = lastArg;
|
|
@@ -207,7 +215,12 @@ class IssueReporter {
|
|
|
207
215
|
args.splice(1, 1);
|
|
208
216
|
}
|
|
209
217
|
|
|
210
|
-
|
|
218
|
+
if (extra.skipSendToRemote) {
|
|
219
|
+
skipSendToRemote = true;
|
|
220
|
+
delete extra.skipSendToRemote;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
const date = moment__default['default']().format('YYYY-MM-DD HH:mm:ss.SSS');
|
|
211
224
|
const message = args.join(', ');
|
|
212
225
|
let consoleMessage = message;
|
|
213
226
|
|
|
@@ -227,7 +240,13 @@ class IssueReporter {
|
|
|
227
240
|
const oldMethod = this.oldConsoleMethods[consoleLevel] || this.oldConsoleMethods.log;
|
|
228
241
|
oldMethod.apply(oldMethod, [date, consoleMessage]);
|
|
229
242
|
|
|
230
|
-
this.
|
|
243
|
+
if (this._callback) {
|
|
244
|
+
this._callback(level, consoleMessage);
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
if (!skipSendToRemote) {
|
|
248
|
+
this._sendToRemoteLogger(level, { date, message, category, ...extra });
|
|
249
|
+
}
|
|
231
250
|
}
|
|
232
251
|
|
|
233
252
|
logRequest(url , options , response , start ) {
|
|
@@ -372,7 +391,11 @@ class IssueReporter {
|
|
|
372
391
|
},
|
|
373
392
|
// $FlowFixMe
|
|
374
393
|
body,
|
|
375
|
-
}).catch(() => {
|
|
394
|
+
}).catch((e ) => {
|
|
395
|
+
// $FlowFixMe
|
|
396
|
+
e.skipSendToRemote = true;
|
|
397
|
+
this.log('error', this._makeCategory('grafana'), 'Sending log to grafana, error', e);
|
|
398
|
+
|
|
376
399
|
setTimeout(() => {
|
|
377
400
|
if (isArray) {
|
|
378
401
|
payload = payload.map(message => {
|
|
@@ -384,7 +407,7 @@ class IssueReporter {
|
|
|
384
407
|
payload._retry = retry + 1;
|
|
385
408
|
}
|
|
386
409
|
|
|
387
|
-
this._sendDebugToGrafana(
|
|
410
|
+
this._sendDebugToGrafana(payload, retry + 1);
|
|
388
411
|
}, 5000 + retry * 1000);
|
|
389
412
|
});
|
|
390
413
|
}
|