@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
|
@@ -1644,6 +1644,7 @@ class IssueReporter {
|
|
|
1644
1644
|
|
|
1645
1645
|
|
|
1646
1646
|
|
|
1647
|
+
|
|
1647
1648
|
|
|
1648
1649
|
constructor() {
|
|
1649
1650
|
addLevelsTo(this);
|
|
@@ -1655,12 +1656,17 @@ class IssueReporter {
|
|
|
1655
1656
|
this.bufferTimeout = null;
|
|
1656
1657
|
this._boundProcessBuffer = this._processBuffer.bind(this);
|
|
1657
1658
|
this._boundParseLoggerBody = this._parseLoggerBody.bind(this);
|
|
1659
|
+
this._callback = null;
|
|
1658
1660
|
}
|
|
1659
1661
|
|
|
1660
1662
|
init() {
|
|
1661
1663
|
this._catchConsole();
|
|
1662
1664
|
}
|
|
1663
1665
|
|
|
1666
|
+
setCallback(cb ) {
|
|
1667
|
+
this._callback = cb;
|
|
1668
|
+
}
|
|
1669
|
+
|
|
1664
1670
|
configureRemoteClient(configuration = { tag: 'wazo-sdk', host: null, port: null, level: null, extra: {} }) {
|
|
1665
1671
|
this.remoteClientConfiguration = configuration;
|
|
1666
1672
|
}
|
|
@@ -1696,6 +1702,7 @@ class IssueReporter {
|
|
|
1696
1702
|
|
|
1697
1703
|
// Handle category label
|
|
1698
1704
|
let category = null;
|
|
1705
|
+
let skipSendToRemote = false;
|
|
1699
1706
|
let extra = {};
|
|
1700
1707
|
if (args[0].indexOf(CATEGORY_PREFIX) === 0) {
|
|
1701
1708
|
category = args[0].split('=')[1];
|
|
@@ -1711,6 +1718,7 @@ class IssueReporter {
|
|
|
1711
1718
|
errorMessage: lastArg.message,
|
|
1712
1719
|
errorStack: lastArg.stack,
|
|
1713
1720
|
errorType: lastArg.constructor.name,
|
|
1721
|
+
skipSendToRemote: lastArg.skipSendToRemote,
|
|
1714
1722
|
};
|
|
1715
1723
|
} else {
|
|
1716
1724
|
extra = lastArg;
|
|
@@ -1719,7 +1727,12 @@ class IssueReporter {
|
|
|
1719
1727
|
args.splice(1, 1);
|
|
1720
1728
|
}
|
|
1721
1729
|
|
|
1722
|
-
|
|
1730
|
+
if (extra.skipSendToRemote) {
|
|
1731
|
+
skipSendToRemote = true;
|
|
1732
|
+
delete extra.skipSendToRemote;
|
|
1733
|
+
}
|
|
1734
|
+
|
|
1735
|
+
const date = moment__default['default']().format('YYYY-MM-DD HH:mm:ss.SSS');
|
|
1723
1736
|
const message = args.join(', ');
|
|
1724
1737
|
let consoleMessage = message;
|
|
1725
1738
|
|
|
@@ -1739,7 +1752,13 @@ class IssueReporter {
|
|
|
1739
1752
|
const oldMethod = this.oldConsoleMethods[consoleLevel] || this.oldConsoleMethods.log;
|
|
1740
1753
|
oldMethod.apply(oldMethod, [date, consoleMessage]);
|
|
1741
1754
|
|
|
1742
|
-
this.
|
|
1755
|
+
if (this._callback) {
|
|
1756
|
+
this._callback(level, consoleMessage);
|
|
1757
|
+
}
|
|
1758
|
+
|
|
1759
|
+
if (!skipSendToRemote) {
|
|
1760
|
+
this._sendToRemoteLogger(level, { date, message, category, ...extra });
|
|
1761
|
+
}
|
|
1743
1762
|
}
|
|
1744
1763
|
|
|
1745
1764
|
logRequest(url , options , response , start ) {
|
|
@@ -1884,7 +1903,11 @@ class IssueReporter {
|
|
|
1884
1903
|
},
|
|
1885
1904
|
// $FlowFixMe
|
|
1886
1905
|
body,
|
|
1887
|
-
}).catch(() => {
|
|
1906
|
+
}).catch((e ) => {
|
|
1907
|
+
// $FlowFixMe
|
|
1908
|
+
e.skipSendToRemote = true;
|
|
1909
|
+
this.log('error', this._makeCategory('grafana'), 'Sending log to grafana, error', e);
|
|
1910
|
+
|
|
1888
1911
|
setTimeout(() => {
|
|
1889
1912
|
if (isArray) {
|
|
1890
1913
|
payload = payload.map(message => {
|
|
@@ -1896,7 +1919,7 @@ class IssueReporter {
|
|
|
1896
1919
|
payload._retry = retry + 1;
|
|
1897
1920
|
}
|
|
1898
1921
|
|
|
1899
|
-
this._sendDebugToGrafana(
|
|
1922
|
+
this._sendDebugToGrafana(payload, retry + 1);
|
|
1900
1923
|
}, 5000 + retry * 1000);
|
|
1901
1924
|
});
|
|
1902
1925
|
}
|
|
@@ -2614,7 +2637,8 @@ class ExternalApp {
|
|
|
2614
2637
|
|
|
2615
2638
|
|
|
2616
2639
|
|
|
2617
|
-
|
|
2640
|
+
|
|
2641
|
+
|
|
2618
2642
|
|
|
2619
2643
|
|
|
2620
2644
|
class Meeting {
|
|
@@ -2626,6 +2650,7 @@ class Meeting {
|
|
|
2626
2650
|
|
|
2627
2651
|
|
|
2628
2652
|
|
|
2653
|
+
|
|
2629
2654
|
|
|
2630
2655
|
|
|
2631
2656
|
static parse(plain ) {
|
|
@@ -2637,14 +2662,28 @@ class Meeting {
|
|
|
2637
2662
|
port: plain.port,
|
|
2638
2663
|
uuid: plain.uuid,
|
|
2639
2664
|
number: plain.number,
|
|
2665
|
+
persistent: plain.persistent,
|
|
2640
2666
|
});
|
|
2641
2667
|
}
|
|
2642
2668
|
|
|
2669
|
+
static parseMany(items ) {
|
|
2670
|
+
return items.map(plain => Meeting.parse(plain));
|
|
2671
|
+
}
|
|
2672
|
+
|
|
2643
2673
|
static newFrom(meeting ) {
|
|
2644
2674
|
return newFrom(meeting, Meeting);
|
|
2645
2675
|
}
|
|
2646
2676
|
|
|
2647
|
-
constructor({
|
|
2677
|
+
constructor({
|
|
2678
|
+
uuid,
|
|
2679
|
+
name,
|
|
2680
|
+
guestSipAuthorization,
|
|
2681
|
+
ownerUuids,
|
|
2682
|
+
port,
|
|
2683
|
+
uri,
|
|
2684
|
+
number,
|
|
2685
|
+
persistent,
|
|
2686
|
+
} = {}) {
|
|
2648
2687
|
this.guestSipAuthorization = guestSipAuthorization;
|
|
2649
2688
|
this.uri = uri;
|
|
2650
2689
|
this.name = name;
|
|
@@ -2652,6 +2691,7 @@ class Meeting {
|
|
|
2652
2691
|
this.port = port;
|
|
2653
2692
|
this.uuid = uuid;
|
|
2654
2693
|
this.number = number;
|
|
2694
|
+
this.persistent = persistent;
|
|
2655
2695
|
|
|
2656
2696
|
// Useful to compare instead of instanceof with minified code
|
|
2657
2697
|
this.type = 'Meeting';
|
|
@@ -2729,8 +2769,11 @@ var confdMethods = (client , baseUrl ) => ({
|
|
|
2729
2769
|
}
|
|
2730
2770
|
},
|
|
2731
2771
|
|
|
2732
|
-
|
|
2733
|
-
client.
|
|
2772
|
+
getMyMeetings: () =>
|
|
2773
|
+
client.get(`${baseUrl}/users/me/meetings`).then(response => Meeting.parseMany(response.items)),
|
|
2774
|
+
|
|
2775
|
+
createMyMeeting: (name , persistent ) =>
|
|
2776
|
+
client.post(`${baseUrl}/users/me/meetings`, { name, persistent }).then(Meeting.parse),
|
|
2734
2777
|
|
|
2735
2778
|
deleteMyMeeting: (meetingUuid ) =>
|
|
2736
2779
|
client.delete(`${baseUrl}/users/me/meetings/${meetingUuid}`, null),
|
|
@@ -2832,7 +2875,7 @@ class ChatMessage {
|
|
|
2832
2875
|
static parse(plain ) {
|
|
2833
2876
|
return new ChatMessage({
|
|
2834
2877
|
uuid: plain.uuid,
|
|
2835
|
-
date: moment__default[
|
|
2878
|
+
date: moment__default['default'](plain.created_at).toDate(),
|
|
2836
2879
|
content: plain.content,
|
|
2837
2880
|
alias: plain.alias,
|
|
2838
2881
|
userUuid: plain.user_uuid,
|
|
@@ -2924,7 +2967,7 @@ class Voicemail {
|
|
|
2924
2967
|
static parse(plain ) {
|
|
2925
2968
|
return new Voicemail({
|
|
2926
2969
|
id: plain.id,
|
|
2927
|
-
date: moment__default[
|
|
2970
|
+
date: moment__default['default'](plain.timestamp * 1000).toDate(),
|
|
2928
2971
|
duration: plain.duration * 1000,
|
|
2929
2972
|
caller: {
|
|
2930
2973
|
name: plain.caller_id_name,
|
|
@@ -3061,7 +3104,7 @@ class Call {
|
|
|
3061
3104
|
onHold: plain.on_hold,
|
|
3062
3105
|
status: plain.status,
|
|
3063
3106
|
lineId: plain.line_id,
|
|
3064
|
-
startingTime: moment__default[
|
|
3107
|
+
startingTime: moment__default['default'](plain.creation_time).toDate(),
|
|
3065
3108
|
talkingToIds: Object.keys(plain.talking_to || {}),
|
|
3066
3109
|
recording: plain.record_state === RECORD_STATE_ACTIVE,
|
|
3067
3110
|
});
|
|
@@ -3541,7 +3584,7 @@ class Emitter {
|
|
|
3541
3584
|
|
|
3542
3585
|
|
|
3543
3586
|
constructor() {
|
|
3544
|
-
this.eventEmitter = new EventEmitter__default[
|
|
3587
|
+
this.eventEmitter = new EventEmitter__default['default']();
|
|
3545
3588
|
}
|
|
3546
3589
|
|
|
3547
3590
|
on(event , callback ) {
|
|
@@ -3586,7 +3629,7 @@ class Recording {
|
|
|
3586
3629
|
|
|
3587
3630
|
|
|
3588
3631
|
|
|
3589
|
-
static parseMany(recordings
|
|
3632
|
+
static parseMany(recordings = []) {
|
|
3590
3633
|
return recordings.map(item => Recording.parse(item));
|
|
3591
3634
|
}
|
|
3592
3635
|
|
|
@@ -3594,8 +3637,8 @@ class Recording {
|
|
|
3594
3637
|
return new Recording({
|
|
3595
3638
|
deleted: plain.deleted,
|
|
3596
3639
|
fileName: plain.filename,
|
|
3597
|
-
end: plain.end_time ? moment__default[
|
|
3598
|
-
start: moment__default[
|
|
3640
|
+
end: plain.end_time ? moment__default['default'](plain.end_time).toDate() : null,
|
|
3641
|
+
start: moment__default['default'](plain.start_time).toDate(),
|
|
3599
3642
|
uuid: plain.uuid,
|
|
3600
3643
|
});
|
|
3601
3644
|
}
|
|
@@ -3693,7 +3736,7 @@ class CallLog {
|
|
|
3693
3736
|
|
|
3694
3737
|
static parse(plain ) {
|
|
3695
3738
|
return new CallLog({
|
|
3696
|
-
answer: plain.answer ? moment__default[
|
|
3739
|
+
answer: plain.answer ? moment__default['default'](plain.answer).toDate() : null,
|
|
3697
3740
|
answered: plain.answered,
|
|
3698
3741
|
callDirection: plain.call_direction,
|
|
3699
3742
|
destination: {
|
|
@@ -3710,9 +3753,9 @@ class CallLog {
|
|
|
3710
3753
|
},
|
|
3711
3754
|
id: plain.id,
|
|
3712
3755
|
duration: (plain.duration || 0) * 1000, // duration is in seconds
|
|
3713
|
-
start: moment__default[
|
|
3714
|
-
end: plain.end ? moment__default[
|
|
3715
|
-
recordings: Recording.parseMany(plain.recordings),
|
|
3756
|
+
start: moment__default['default'](plain.start).toDate(),
|
|
3757
|
+
end: plain.end ? moment__default['default'](plain.end).toDate() : null,
|
|
3758
|
+
recordings: Recording.parseMany(plain.recordings || []),
|
|
3716
3759
|
});
|
|
3717
3760
|
}
|
|
3718
3761
|
|
|
@@ -5622,7 +5665,7 @@ const parseCandidate$1 = (candidate ) => {
|
|
|
5622
5665
|
if (!candidate) {
|
|
5623
5666
|
return null;
|
|
5624
5667
|
}
|
|
5625
|
-
const result = sdpParser__default[
|
|
5668
|
+
const result = sdpParser__default['default'].parse(candidate.indexOf('a=') === 0 ? candidate : `a=${candidate}`);
|
|
5626
5669
|
|
|
5627
5670
|
return result.candidates ? result.candidates[0] : null;
|
|
5628
5671
|
};
|
|
@@ -5636,7 +5679,7 @@ const areCandidateValid = (candidates ) =>
|
|
|
5636
5679
|
.length > 0;
|
|
5637
5680
|
|
|
5638
5681
|
const getVideoDirection = (sdp ) => {
|
|
5639
|
-
const parsedSdp = sdpParser__default[
|
|
5682
|
+
const parsedSdp = sdpParser__default['default'].parse(sdp);
|
|
5640
5683
|
const videoMedia = parsedSdp.media.find(media => media.type === 'video');
|
|
5641
5684
|
if (!videoMedia) {
|
|
5642
5685
|
return null;
|
|
@@ -5650,14 +5693,14 @@ const hasAnActiveVideo = (sdp ) => {
|
|
|
5650
5693
|
return false;
|
|
5651
5694
|
}
|
|
5652
5695
|
|
|
5653
|
-
const parsedSdp = sdpParser__default[
|
|
5696
|
+
const parsedSdp = sdpParser__default['default'].parse(sdp);
|
|
5654
5697
|
|
|
5655
5698
|
return !!parsedSdp.media.find(media =>
|
|
5656
5699
|
media.type === 'video' && media.port > 10 && (!media.direction || media.direction !== 'inactive'));
|
|
5657
5700
|
};
|
|
5658
5701
|
|
|
5659
5702
|
const fixSdp = (sdp , candidates , forcePort = true) => {
|
|
5660
|
-
const parsedSdp = sdpParser__default[
|
|
5703
|
+
const parsedSdp = sdpParser__default['default'].parse(sdp);
|
|
5661
5704
|
const mainCandidate = getSrflxOrRelay(candidates)[0];
|
|
5662
5705
|
const ip = mainCandidate ? mainCandidate.ip : null;
|
|
5663
5706
|
|
|
@@ -5675,7 +5718,7 @@ const fixSdp = (sdp , candidates , forcePort = true)
|
|
|
5675
5718
|
};
|
|
5676
5719
|
});
|
|
5677
5720
|
|
|
5678
|
-
let fixed = sdpParser__default[
|
|
5721
|
+
let fixed = sdpParser__default['default'].write(parsedSdp);
|
|
5679
5722
|
|
|
5680
5723
|
if (ip) {
|
|
5681
5724
|
fixed = fixed.replace(/IN IP4 0.0.0.0/g, `IN IP4 ${ip}`);
|
|
@@ -5721,7 +5764,7 @@ class WazoSessionDescriptionHandler extends sessionDescriptionHandler.SessionDes
|
|
|
5721
5764
|
) {
|
|
5722
5765
|
super(logger, mediaStreamFactory, sessionDescriptionHandlerConfiguration);
|
|
5723
5766
|
|
|
5724
|
-
this.eventEmitter = new EventEmitter__default[
|
|
5767
|
+
this.eventEmitter = new EventEmitter__default['default']();
|
|
5725
5768
|
this.isWeb = isWeb;
|
|
5726
5769
|
this.session = session;
|
|
5727
5770
|
}
|
|
@@ -6702,7 +6745,9 @@ class WebRTCClient extends Emitter {
|
|
|
6702
6745
|
const inviteOptions = {
|
|
6703
6746
|
requestDelegate: {
|
|
6704
6747
|
onAccept: (response ) => {
|
|
6705
|
-
session.sessionDescriptionHandler.peerConnection
|
|
6748
|
+
if (session.sessionDescriptionHandler.peerConnection) {
|
|
6749
|
+
session.sessionDescriptionHandler.peerConnection.sfu = conference;
|
|
6750
|
+
}
|
|
6706
6751
|
this._onAccepted(session, response.session, true);
|
|
6707
6752
|
},
|
|
6708
6753
|
onReject: (response ) => {
|
|
@@ -7038,7 +7083,7 @@ class WebRTCClient extends Emitter {
|
|
|
7038
7083
|
// We search for the last transceiver without `video-` in the mid (video- means remote transceiver)
|
|
7039
7084
|
const transceivers = pc.getTransceivers();
|
|
7040
7085
|
const transceiverIdx = lastIndexOf(transceivers, transceiver =>
|
|
7041
|
-
transceiver.sender.track === null && transceiver.mid.indexOf('video') === -1);
|
|
7086
|
+
transceiver.sender.track === null && transceiver.mid && transceiver.mid.indexOf('video') === -1);
|
|
7042
7087
|
|
|
7043
7088
|
videoSender = transceiverIdx !== -1 ? transceivers[transceiverIdx].sender : null;
|
|
7044
7089
|
} else {
|
|
@@ -7574,6 +7619,16 @@ class WebRTCClient extends Emitter {
|
|
|
7574
7619
|
return this.hasRemoteVideo(sessionId) ? this.getRemoteStream(sessionId) : null;
|
|
7575
7620
|
}
|
|
7576
7621
|
|
|
7622
|
+
// Useful in a react-native environment when remoteMediaStream is not updated
|
|
7623
|
+
getRemoteVideoStreamFromPc(sessionId ) {
|
|
7624
|
+
const pc = this.getPeerConnection(sessionId);
|
|
7625
|
+
if (!pc) {
|
|
7626
|
+
return null;
|
|
7627
|
+
}
|
|
7628
|
+
|
|
7629
|
+
return pc.getRemoteStreams().find(stream => !!stream.getVideoTracks().length);
|
|
7630
|
+
}
|
|
7631
|
+
|
|
7577
7632
|
hasVideo(sessionId ) {
|
|
7578
7633
|
return this.hasLocalVideo(sessionId) || this.hasRemoteVideo(sessionId);
|
|
7579
7634
|
}
|
|
@@ -8084,6 +8139,7 @@ class WebRTCClient extends Emitter {
|
|
|
8084
8139
|
session.sessionDescriptionHandler.remoteMediaStream.onaddtrack = onTrack;
|
|
8085
8140
|
|
|
8086
8141
|
pc.oniceconnectionstatechange = () => {
|
|
8142
|
+
logger$9.info('on ice connection state changed', { state: pc.iceConnectionState });
|
|
8087
8143
|
if (pc.iceConnectionState === 'disconnected') {
|
|
8088
8144
|
this.eventEmitter.emit(ON_DISCONNECTED$1);
|
|
8089
8145
|
}
|
|
@@ -8243,7 +8299,7 @@ class WebRTCClient extends Emitter {
|
|
|
8243
8299
|
}
|
|
8244
8300
|
const sessionId = this.getSipSessionId(session);
|
|
8245
8301
|
|
|
8246
|
-
getStats__default[
|
|
8302
|
+
getStats__default['default'](pc, (result ) => {
|
|
8247
8303
|
const { results, internal, nomore, ...stats } = result;
|
|
8248
8304
|
this.statsIntervals[sessionId] = nomore;
|
|
8249
8305
|
|
|
@@ -8352,18 +8408,22 @@ class WebRTCClient extends Emitter {
|
|
|
8352
8408
|
});
|
|
8353
8409
|
|
|
8354
8410
|
networkStats.packetsLost = packetsLost;
|
|
8355
|
-
networkStats.
|
|
8411
|
+
networkStats.totalAudioBytesSent = audioBytesSent;
|
|
8412
|
+
networkStats.audioBytesSent = audioBytesSent - lastAudioSent;
|
|
8413
|
+
networkStats.totalAudioBytesReceived = audioBytesReceived - lastAudioReceived;
|
|
8356
8414
|
networkStats.audioBytesReceived = audioBytesReceived;
|
|
8357
|
-
networkStats.
|
|
8358
|
-
networkStats.
|
|
8415
|
+
networkStats.totalVideoBytesSent = videoBytesSent;
|
|
8416
|
+
networkStats.videoBytesSent = videoBytesSent - lastVideoSent;
|
|
8417
|
+
networkStats.totalVideoBytesReceived = videoBytesReceived;
|
|
8418
|
+
networkStats.videoBytesReceived = videoBytesReceived - lastVideoReceived;
|
|
8419
|
+
networkStats.totalTransportSent = transportSent - lastTransportSent;
|
|
8359
8420
|
networkStats.transportSent = transportSent;
|
|
8360
|
-
networkStats.
|
|
8361
|
-
|
|
8362
|
-
const bandwidth = (networkStats.audioBytesSent - lastAudioSent) + (networkStats.videoBytesSent - lastVideoSent)
|
|
8363
|
-
+ (networkStats.audioBytesReceived - lastAudioReceived) + (networkStats.videoBytesReceived - lastVideoReceived)
|
|
8364
|
-
+ (networkStats.transportReceived - lastTransportReceived) + (networkStats.transportSent - lastTransportSent);
|
|
8421
|
+
networkStats.totalTransportReceived = transportReceived;
|
|
8422
|
+
networkStats.transportReceived = transportReceived - lastTransportReceived;
|
|
8365
8423
|
|
|
8366
|
-
networkStats.bandwidth =
|
|
8424
|
+
networkStats.bandwidth = networkStats.audioBytesSent + networkStats.audioBytesReceived
|
|
8425
|
+
+ networkStats.videoBytesSent + networkStats.videoBytesReceived + networkStats.transportReceived
|
|
8426
|
+
+ networkStats.transportSent;
|
|
8367
8427
|
|
|
8368
8428
|
this.eventEmitter.emit(ON_NETWORK_STATS$1, session, networkStats, this.sessionNetworkStats[sessionId]);
|
|
8369
8429
|
this.sessionNetworkStats[sessionId].push(networkStats);
|
|
@@ -8745,7 +8805,10 @@ class WebRTCPhone extends Emitter {
|
|
|
8745
8805
|
|
|
8746
8806
|
onCancel(message);
|
|
8747
8807
|
const elsewhere = message.data.indexOf('cause=26') !== -1 && message.data.indexOf('completed elsewhere') !== -1;
|
|
8748
|
-
|
|
8808
|
+
const callSession = this._createCallSession(sipSession);
|
|
8809
|
+
delete this.callSessions[callSession.getId()];
|
|
8810
|
+
|
|
8811
|
+
this.eventEmitter.emit(ON_CALL_CANCELED, callSession, elsewhere);
|
|
8749
8812
|
};
|
|
8750
8813
|
} else if (sipSession instanceof invitation.Invitation) {
|
|
8751
8814
|
console.warn('sipSession._onCancel not found, please update the wazo SDK accordingly');
|
|
@@ -8774,9 +8837,11 @@ class WebRTCPhone extends Emitter {
|
|
|
8774
8837
|
case sessionState.SessionState.Terminated: {
|
|
8775
8838
|
logger$8.info('WebRTC phone - call terminated', { sipId: sipSession.id });
|
|
8776
8839
|
|
|
8840
|
+
// Should be called before `_onCallTerminated` or the callCount will not decrement...
|
|
8841
|
+
const callSession = this._createCallSession(sipSession);
|
|
8777
8842
|
const wasCurrentSession = this._onCallTerminated(sipSession);
|
|
8778
8843
|
|
|
8779
|
-
return this.eventEmitter.emit(ON_CALL_ENDED,
|
|
8844
|
+
return this.eventEmitter.emit(ON_CALL_ENDED, callSession, wasCurrentSession);
|
|
8780
8845
|
}
|
|
8781
8846
|
}
|
|
8782
8847
|
});
|
|
@@ -9724,6 +9789,10 @@ class WebRTCPhone extends Emitter {
|
|
|
9724
9789
|
return callSession ? this.client.getRemoteVideoStream(callSession.sipCallId) : null;
|
|
9725
9790
|
}
|
|
9726
9791
|
|
|
9792
|
+
getRemoteVideoStreamFromPc(callSession ) {
|
|
9793
|
+
return callSession ? this.client.getRemoteVideoStreamFromPc(callSession.sipCallId) : null;
|
|
9794
|
+
}
|
|
9795
|
+
|
|
9727
9796
|
hasRemoteVideo(callSession ) {
|
|
9728
9797
|
return callSession ? this.client.hasRemoteVideo(callSession.sipCallId) : false;
|
|
9729
9798
|
}
|
|
@@ -10407,6 +10476,11 @@ class Phone extends Emitter {
|
|
|
10407
10476
|
return this.getRemoteVideoStream(callSession);
|
|
10408
10477
|
}
|
|
10409
10478
|
|
|
10479
|
+
// Useful in a react-native environment when remoteMediaStream is not updated
|
|
10480
|
+
getRemoteVideoStreamFromPc(callSession ) {
|
|
10481
|
+
return this.phone ? this.phone.getRemoteVideoStreamFromPc(callSession) : false;
|
|
10482
|
+
}
|
|
10483
|
+
|
|
10410
10484
|
hasVideo(callSession ) {
|
|
10411
10485
|
return this.phone ? this.phone.hasVideo(callSession) : false;
|
|
10412
10486
|
}
|
|
@@ -10566,6 +10640,7 @@ const AGENT_PAUSED = 'agent_paused';
|
|
|
10566
10640
|
const AGENT_UNPAUSED = 'agent_unpaused';
|
|
10567
10641
|
const CONFERENCE_ADHOC_PARTICIPANT_LEFT = 'conference_adhoc_participant_left';
|
|
10568
10642
|
const CONFERENCE_ADHOC_DELETED = 'conference_adhoc_deleted';
|
|
10643
|
+
const MEETING_USER_PROGRESS = 'meeting_user_progress';
|
|
10569
10644
|
|
|
10570
10645
|
const BLACKLIST_EVENTS = [
|
|
10571
10646
|
CHAT_MESSAGE_SENT,
|
|
@@ -10625,7 +10700,7 @@ class WebSocketClient extends Emitter {
|
|
|
10625
10700
|
|
|
10626
10701
|
connect() {
|
|
10627
10702
|
logger$6.info('connect method started', { host: this.host, token: this.token });
|
|
10628
|
-
this.socket = new ReconnectingWebSocket__default[
|
|
10703
|
+
this.socket = new ReconnectingWebSocket__default['default'](this._getUrl.bind(this), [], this.options);
|
|
10629
10704
|
if (this.options.binaryType) {
|
|
10630
10705
|
this.socket.binaryType = this.options.binaryType;
|
|
10631
10706
|
}
|
|
@@ -10916,6 +10991,7 @@ WebSocketClient.eventLists = [
|
|
|
10916
10991
|
AGENT_UNPAUSED,
|
|
10917
10992
|
CONFERENCE_ADHOC_PARTICIPANT_LEFT,
|
|
10918
10993
|
CONFERENCE_ADHOC_DELETED,
|
|
10994
|
+
MEETING_USER_PROGRESS,
|
|
10919
10995
|
];
|
|
10920
10996
|
|
|
10921
10997
|
var WebSocketClient$1 = /*#__PURE__*/Object.freeze({
|
|
@@ -10986,6 +11062,7 @@ var WebSocketClient$1 = /*#__PURE__*/Object.freeze({
|
|
|
10986
11062
|
AGENT_UNPAUSED: AGENT_UNPAUSED,
|
|
10987
11063
|
CONFERENCE_ADHOC_PARTICIPANT_LEFT: CONFERENCE_ADHOC_PARTICIPANT_LEFT,
|
|
10988
11064
|
CONFERENCE_ADHOC_DELETED: CONFERENCE_ADHOC_DELETED,
|
|
11065
|
+
MEETING_USER_PROGRESS: MEETING_USER_PROGRESS,
|
|
10989
11066
|
HEARTBEAT_ENGINE_VERSION: HEARTBEAT_ENGINE_VERSION,
|
|
10990
11067
|
'default': WebSocketClient
|
|
10991
11068
|
});
|
|
@@ -11878,7 +11955,7 @@ class Room$1 extends Emitter {
|
|
|
11878
11955
|
}
|
|
11879
11956
|
|
|
11880
11957
|
_mapMsid(rawSdp ) {
|
|
11881
|
-
const sdp = sdpParser__default[
|
|
11958
|
+
const sdp = sdpParser__default['default'].parse(rawSdp);
|
|
11882
11959
|
const labelMsidArray = sdp.media.filter(media => !!media.label).map(({ label, msid }) => ({
|
|
11883
11960
|
label: String(label),
|
|
11884
11961
|
streamId: msid.split(' ')[0],
|
package/lib/simple/Directory.js
CHANGED
|
@@ -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
|
|