@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
|
@@ -17,7 +17,7 @@ class Emitter {
|
|
|
17
17
|
|
|
18
18
|
|
|
19
19
|
constructor() {
|
|
20
|
-
this.eventEmitter = new EventEmitter__default[
|
|
20
|
+
this.eventEmitter = new EventEmitter__default['default']();
|
|
21
21
|
}
|
|
22
22
|
|
|
23
23
|
on(event , callback ) {
|
|
@@ -129,6 +129,7 @@ class IssueReporter {
|
|
|
129
129
|
|
|
130
130
|
|
|
131
131
|
|
|
132
|
+
|
|
132
133
|
|
|
133
134
|
constructor() {
|
|
134
135
|
addLevelsTo(this);
|
|
@@ -140,12 +141,17 @@ class IssueReporter {
|
|
|
140
141
|
this.bufferTimeout = null;
|
|
141
142
|
this._boundProcessBuffer = this._processBuffer.bind(this);
|
|
142
143
|
this._boundParseLoggerBody = this._parseLoggerBody.bind(this);
|
|
144
|
+
this._callback = null;
|
|
143
145
|
}
|
|
144
146
|
|
|
145
147
|
init() {
|
|
146
148
|
this._catchConsole();
|
|
147
149
|
}
|
|
148
150
|
|
|
151
|
+
setCallback(cb ) {
|
|
152
|
+
this._callback = cb;
|
|
153
|
+
}
|
|
154
|
+
|
|
149
155
|
configureRemoteClient(configuration = { tag: 'wazo-sdk', host: null, port: null, level: null, extra: {} }) {
|
|
150
156
|
this.remoteClientConfiguration = configuration;
|
|
151
157
|
}
|
|
@@ -181,6 +187,7 @@ class IssueReporter {
|
|
|
181
187
|
|
|
182
188
|
// Handle category label
|
|
183
189
|
let category = null;
|
|
190
|
+
let skipSendToRemote = false;
|
|
184
191
|
let extra = {};
|
|
185
192
|
if (args[0].indexOf(CATEGORY_PREFIX) === 0) {
|
|
186
193
|
category = args[0].split('=')[1];
|
|
@@ -196,6 +203,7 @@ class IssueReporter {
|
|
|
196
203
|
errorMessage: lastArg.message,
|
|
197
204
|
errorStack: lastArg.stack,
|
|
198
205
|
errorType: lastArg.constructor.name,
|
|
206
|
+
skipSendToRemote: lastArg.skipSendToRemote,
|
|
199
207
|
};
|
|
200
208
|
} else {
|
|
201
209
|
extra = lastArg;
|
|
@@ -204,7 +212,12 @@ class IssueReporter {
|
|
|
204
212
|
args.splice(1, 1);
|
|
205
213
|
}
|
|
206
214
|
|
|
207
|
-
|
|
215
|
+
if (extra.skipSendToRemote) {
|
|
216
|
+
skipSendToRemote = true;
|
|
217
|
+
delete extra.skipSendToRemote;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
const date = moment__default['default']().format('YYYY-MM-DD HH:mm:ss.SSS');
|
|
208
221
|
const message = args.join(', ');
|
|
209
222
|
let consoleMessage = message;
|
|
210
223
|
|
|
@@ -224,7 +237,13 @@ class IssueReporter {
|
|
|
224
237
|
const oldMethod = this.oldConsoleMethods[consoleLevel] || this.oldConsoleMethods.log;
|
|
225
238
|
oldMethod.apply(oldMethod, [date, consoleMessage]);
|
|
226
239
|
|
|
227
|
-
this.
|
|
240
|
+
if (this._callback) {
|
|
241
|
+
this._callback(level, consoleMessage);
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
if (!skipSendToRemote) {
|
|
245
|
+
this._sendToRemoteLogger(level, { date, message, category, ...extra });
|
|
246
|
+
}
|
|
228
247
|
}
|
|
229
248
|
|
|
230
249
|
logRequest(url , options , response , start ) {
|
|
@@ -369,7 +388,11 @@ class IssueReporter {
|
|
|
369
388
|
},
|
|
370
389
|
// $FlowFixMe
|
|
371
390
|
body,
|
|
372
|
-
}).catch(() => {
|
|
391
|
+
}).catch((e ) => {
|
|
392
|
+
// $FlowFixMe
|
|
393
|
+
e.skipSendToRemote = true;
|
|
394
|
+
this.log('error', this._makeCategory('grafana'), 'Sending log to grafana, error', e);
|
|
395
|
+
|
|
373
396
|
setTimeout(() => {
|
|
374
397
|
if (isArray) {
|
|
375
398
|
payload = payload.map(message => {
|
|
@@ -381,7 +404,7 @@ class IssueReporter {
|
|
|
381
404
|
payload._retry = retry + 1;
|
|
382
405
|
}
|
|
383
406
|
|
|
384
|
-
this._sendDebugToGrafana(
|
|
407
|
+
this._sendDebugToGrafana(payload, retry + 1);
|
|
385
408
|
}, 5000 + retry * 1000);
|
|
386
409
|
});
|
|
387
410
|
}
|
|
@@ -586,6 +609,7 @@ const AGENT_PAUSED = 'agent_paused';
|
|
|
586
609
|
const AGENT_UNPAUSED = 'agent_unpaused';
|
|
587
610
|
const CONFERENCE_ADHOC_PARTICIPANT_LEFT = 'conference_adhoc_participant_left';
|
|
588
611
|
const CONFERENCE_ADHOC_DELETED = 'conference_adhoc_deleted';
|
|
612
|
+
const MEETING_USER_PROGRESS = 'meeting_user_progress';
|
|
589
613
|
|
|
590
614
|
const BLACKLIST_EVENTS = [
|
|
591
615
|
CHAT_MESSAGE_SENT,
|
|
@@ -645,7 +669,7 @@ class WebSocketClient extends Emitter {
|
|
|
645
669
|
|
|
646
670
|
connect() {
|
|
647
671
|
logger.info('connect method started', { host: this.host, token: this.token });
|
|
648
|
-
this.socket = new ReconnectingWebSocket__default[
|
|
672
|
+
this.socket = new ReconnectingWebSocket__default['default'](this._getUrl.bind(this), [], this.options);
|
|
649
673
|
if (this.options.binaryType) {
|
|
650
674
|
this.socket.binaryType = this.options.binaryType;
|
|
651
675
|
}
|
|
@@ -936,6 +960,7 @@ WebSocketClient.eventLists = [
|
|
|
936
960
|
AGENT_UNPAUSED,
|
|
937
961
|
CONFERENCE_ADHOC_PARTICIPANT_LEFT,
|
|
938
962
|
CONFERENCE_ADHOC_DELETED,
|
|
963
|
+
MEETING_USER_PROGRESS,
|
|
939
964
|
];
|
|
940
965
|
|
|
941
966
|
var wazoWebsocket = {
|
|
@@ -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);
|