@wazo/sdk 0.37.25 → 0.37.29
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/README.md +96 -58
- package/dist/wazo-sdk.js +3 -3
- package/esm/__tests__/api-client.test.js +2 -2
- package/esm/__tests__/web-rtc-client.test.js +10 -5
- package/esm/api/agentd.js +1 -1
- package/esm/api/amid.js +1 -1
- package/esm/api/application.js +1 -1
- package/esm/api/auth.js +1 -1
- package/esm/api/call-logd.js +1 -1
- package/esm/api/calld.js +1 -1
- package/esm/api/chatd.js +1 -1
- package/esm/api/confd.js +1 -1
- package/esm/api/ctid-ng.js +1 -1
- package/esm/api/dird.js +2 -2
- package/esm/api/webhookd.js +1 -1
- package/esm/api-client.js +2 -2
- package/esm/checker/Checker.js +10 -5
- package/esm/checker/checks/aor.js +2 -2
- package/esm/checker/checks/api.js +2 -2
- package/esm/checker/checks/index.js +10 -5
- package/esm/checker/checks/wazo-websocket.js +1 -1
- package/esm/checker/checks/webrtc-transport.js +10 -5
- package/esm/checker/checks/webrtc.js +10 -5
- package/esm/domain/AdHocAPIConference.js +2 -2
- package/esm/domain/CallSession.js +29 -2
- package/esm/domain/Contact.js +1 -1
- package/esm/domain/Features.js +2 -2
- package/esm/domain/Phone/CTIPhone.js +31 -4
- package/esm/domain/Phone/WebRTCPhone.js +55 -6
- package/esm/domain/SFUNotAvailableError.js +9 -0
- package/esm/domain/__tests__/CallSession.test.js +46 -2
- package/esm/domain/__tests__/Contact.test.js +1 -1
- package/esm/domain/__tests__/IndirectTransfer.test.js +29 -2
- package/esm/domain/__tests__/Room.test.js +29 -2
- package/esm/index.js +75 -10
- package/esm/lib/WazoSessionDescriptionHandler.js +9 -4
- package/esm/service/CallApi.js +2 -2
- package/esm/service/IssueReporter.js +1 -1
- package/esm/service/__tests__/IssueReporter.test.js +1 -1
- package/esm/service/getApiClient.js +2 -2
- package/esm/simple/Auth.js +74 -10
- package/esm/simple/Configuration.js +74 -10
- package/esm/simple/Directory.js +2 -2
- package/esm/simple/Phone.js +74 -10
- package/esm/simple/Websocket.js +1 -1
- package/esm/simple/index.js +74 -10
- package/esm/simple/room/LocalParticipant.js +74 -10
- package/esm/simple/room/Participant.js +74 -10
- package/esm/simple/room/RemoteParticipant.js +74 -10
- package/esm/simple/room/Room.js +74 -10
- package/esm/simple/room/SipRoom.js +74 -10
- package/esm/simple/room/Stream.js +74 -10
- package/esm/simple/room/__tests__/RemoteParticipant.test.js +74 -10
- package/esm/simple/utils.js +74 -10
- package/esm/utils/__tests__/api-requester.test.js +1 -1
- package/esm/utils/api-requester.js +1 -1
- package/esm/web-rtc-client.js +10 -5
- package/esm/websocket-client.js +1 -1
- package/lib/__tests__/api-client.test.js +2 -2
- package/lib/__tests__/web-rtc-client.test.js +10 -5
- package/lib/api/agentd.js +1 -1
- package/lib/api/amid.js +1 -1
- package/lib/api/application.js +1 -1
- package/lib/api/auth.js +1 -1
- package/lib/api/call-logd.js +1 -1
- package/lib/api/calld.js +1 -1
- package/lib/api/chatd.js +1 -1
- package/lib/api/confd.js +1 -1
- package/lib/api/ctid-ng.js +1 -1
- package/lib/api/dird.js +2 -2
- package/lib/api/webhookd.js +1 -1
- package/lib/api-client.js +2 -2
- package/lib/checker/Checker.js +10 -5
- package/lib/checker/checks/aor.js +2 -2
- package/lib/checker/checks/api.js +2 -2
- package/lib/checker/checks/index.js +10 -5
- package/lib/checker/checks/wazo-websocket.js +1 -1
- package/lib/checker/checks/webrtc-transport.js +10 -5
- package/lib/checker/checks/webrtc.js +10 -5
- package/lib/domain/AdHocAPIConference.js +2 -2
- package/lib/domain/CallSession.js +29 -2
- package/lib/domain/Contact.js +1 -1
- package/lib/domain/Features.js +2 -2
- package/lib/domain/Phone/CTIPhone.js +31 -4
- package/lib/domain/Phone/WebRTCPhone.js +55 -5
- package/lib/domain/SFUNotAvailableError.js +11 -0
- package/lib/domain/__tests__/CallSession.test.js +46 -2
- package/lib/domain/__tests__/Contact.test.js +1 -1
- package/lib/domain/__tests__/IndirectTransfer.test.js +29 -2
- package/lib/domain/__tests__/Room.test.js +29 -2
- package/lib/index.js +75 -10
- package/lib/lib/WazoSessionDescriptionHandler.js +9 -4
- package/lib/service/CallApi.js +2 -2
- package/lib/service/IssueReporter.js +1 -1
- package/lib/service/__tests__/IssueReporter.test.js +1 -1
- package/lib/service/getApiClient.js +2 -2
- package/lib/simple/Auth.js +74 -10
- package/lib/simple/Configuration.js +74 -10
- package/lib/simple/Directory.js +2 -2
- package/lib/simple/Phone.js +74 -10
- package/lib/simple/Websocket.js +1 -1
- package/lib/simple/index.js +74 -10
- package/lib/simple/room/LocalParticipant.js +74 -10
- package/lib/simple/room/Participant.js +74 -10
- package/lib/simple/room/RemoteParticipant.js +74 -10
- package/lib/simple/room/Room.js +74 -10
- package/lib/simple/room/SipRoom.js +74 -10
- package/lib/simple/room/Stream.js +74 -10
- package/lib/simple/room/__tests__/RemoteParticipant.test.js +74 -10
- package/lib/simple/utils.js +74 -10
- package/lib/utils/__tests__/api-requester.test.js +1 -1
- package/lib/utils/api-requester.js +1 -1
- package/lib/web-rtc-client.js +10 -5
- package/lib/websocket-client.js +1 -1
- package/package.json +1 -1
- package/src/domain/CallSession.js +32 -4
- package/src/domain/Contact.js +1 -1
- package/src/domain/Phone/WebRTCPhone.js +24 -2
- package/src/domain/SFUNotAvailableError.js +7 -0
- package/src/domain/__tests__/CallSession.test.js +17 -0
- package/src/index.js +2 -0
- package/src/lib/WazoSessionDescriptionHandler.js +8 -3
- package/src/simple/Phone.js +2 -1
- package/src/simple/index.js +2 -0
- package/src/utils/api-requester.js +1 -1
|
@@ -472,7 +472,7 @@ const logger$3 = IssueReporter$1 ? IssueReporter$1.loggerFor('api') : console;
|
|
|
472
472
|
|
|
473
473
|
// Use a function here to be able to mock it in tests
|
|
474
474
|
const realFetch = () => {
|
|
475
|
-
if (typeof document !== 'undefined') {
|
|
475
|
+
if (typeof document !== 'undefined' && window.fetch) {
|
|
476
476
|
// Browser
|
|
477
477
|
return window.fetch;
|
|
478
478
|
}
|
|
@@ -1932,7 +1932,7 @@ class Contact {
|
|
|
1932
1932
|
this[key] = old[key] || this[key];
|
|
1933
1933
|
});
|
|
1934
1934
|
|
|
1935
|
-
if (old.lineState
|
|
1935
|
+
if (old.lineState) {
|
|
1936
1936
|
this.lineState = old.lineState;
|
|
1937
1937
|
}
|
|
1938
1938
|
|
|
@@ -5489,11 +5489,16 @@ class WazoSessionDescriptionHandler extends sessionDescriptionHandler.SessionDes
|
|
|
5489
5489
|
|
|
5490
5490
|
// $FlowFixMe
|
|
5491
5491
|
setRemoteSessionDescription(sessionDescription ) {
|
|
5492
|
-
|
|
5492
|
+
try {
|
|
5493
|
+
const result = super.setRemoteSessionDescription(sessionDescription);
|
|
5493
5494
|
|
|
5494
|
-
|
|
5495
|
+
this.eventEmitter.emit('setDescription', sessionDescription);
|
|
5495
5496
|
|
|
5496
|
-
|
|
5497
|
+
return result;
|
|
5498
|
+
} catch (error) {
|
|
5499
|
+
this.logger.error('SessionDescriptionHandler.setRemoteSessionDescription error', error);
|
|
5500
|
+
throw error;
|
|
5501
|
+
}
|
|
5497
5502
|
}
|
|
5498
5503
|
|
|
5499
5504
|
// Overridden to avoid to fix ice-candidates missing in the SDP in react-native and chrome canary.
|
|
@@ -47,7 +47,7 @@ IssueReporter$1 ? IssueReporter$1.loggerFor('api') : console;
|
|
|
47
47
|
|
|
48
48
|
// Use a function here to be able to mock it in tests
|
|
49
49
|
const realFetch = () => {
|
|
50
|
-
if (typeof document !== 'undefined') {
|
|
50
|
+
if (typeof document !== 'undefined' && window.fetch) {
|
|
51
51
|
// Browser
|
|
52
52
|
return window.fetch;
|
|
53
53
|
}
|
|
@@ -113,7 +113,7 @@ const logger$2 = IssueReporter$1 ? IssueReporter$1.loggerFor('api') : console;
|
|
|
113
113
|
|
|
114
114
|
// Use a function here to be able to mock it in tests
|
|
115
115
|
const realFetch = () => {
|
|
116
|
-
if (typeof document !== 'undefined') {
|
|
116
|
+
if (typeof document !== 'undefined' && window.fetch) {
|
|
117
117
|
// Browser
|
|
118
118
|
return window.fetch;
|
|
119
119
|
}
|
|
@@ -832,11 +832,16 @@ class WazoSessionDescriptionHandler extends sessionDescriptionHandler.SessionDes
|
|
|
832
832
|
|
|
833
833
|
// $FlowFixMe
|
|
834
834
|
setRemoteSessionDescription(sessionDescription ) {
|
|
835
|
-
|
|
835
|
+
try {
|
|
836
|
+
const result = super.setRemoteSessionDescription(sessionDescription);
|
|
836
837
|
|
|
837
|
-
|
|
838
|
+
this.eventEmitter.emit('setDescription', sessionDescription);
|
|
838
839
|
|
|
839
|
-
|
|
840
|
+
return result;
|
|
841
|
+
} catch (error) {
|
|
842
|
+
this.logger.error('SessionDescriptionHandler.setRemoteSessionDescription error', error);
|
|
843
|
+
throw error;
|
|
844
|
+
}
|
|
840
845
|
}
|
|
841
846
|
|
|
842
847
|
// Overridden to avoid to fix ice-candidates missing in the SDP in react-native and chrome canary.
|
|
@@ -2456,7 +2461,7 @@ class Contact {
|
|
|
2456
2461
|
this[key] = old[key] || this[key];
|
|
2457
2462
|
});
|
|
2458
2463
|
|
|
2459
|
-
if (old.lineState
|
|
2464
|
+
if (old.lineState) {
|
|
2460
2465
|
this.lineState = old.lineState;
|
|
2461
2466
|
}
|
|
2462
2467
|
|
|
@@ -113,7 +113,7 @@ const logger$2 = IssueReporter$1 ? IssueReporter$1.loggerFor('api') : console;
|
|
|
113
113
|
|
|
114
114
|
// Use a function here to be able to mock it in tests
|
|
115
115
|
const realFetch = () => {
|
|
116
|
-
if (typeof document !== 'undefined') {
|
|
116
|
+
if (typeof document !== 'undefined' && window.fetch) {
|
|
117
117
|
// Browser
|
|
118
118
|
return window.fetch;
|
|
119
119
|
}
|
|
@@ -832,11 +832,16 @@ class WazoSessionDescriptionHandler extends sessionDescriptionHandler.SessionDes
|
|
|
832
832
|
|
|
833
833
|
// $FlowFixMe
|
|
834
834
|
setRemoteSessionDescription(sessionDescription ) {
|
|
835
|
-
|
|
835
|
+
try {
|
|
836
|
+
const result = super.setRemoteSessionDescription(sessionDescription);
|
|
836
837
|
|
|
837
|
-
|
|
838
|
+
this.eventEmitter.emit('setDescription', sessionDescription);
|
|
838
839
|
|
|
839
|
-
|
|
840
|
+
return result;
|
|
841
|
+
} catch (error) {
|
|
842
|
+
this.logger.error('SessionDescriptionHandler.setRemoteSessionDescription error', error);
|
|
843
|
+
throw error;
|
|
844
|
+
}
|
|
840
845
|
}
|
|
841
846
|
|
|
842
847
|
// Overridden to avoid to fix ice-candidates missing in the SDP in react-native and chrome canary.
|
|
@@ -2456,7 +2461,7 @@ class Contact {
|
|
|
2456
2461
|
this[key] = old[key] || this[key];
|
|
2457
2462
|
});
|
|
2458
2463
|
|
|
2459
|
-
if (old.lineState
|
|
2464
|
+
if (old.lineState) {
|
|
2460
2465
|
this.lineState = old.lineState;
|
|
2461
2466
|
}
|
|
2462
2467
|
|
|
@@ -670,7 +670,7 @@ const logger$1 = IssueReporter$1 ? IssueReporter$1.loggerFor('api') : console;
|
|
|
670
670
|
|
|
671
671
|
// Use a function here to be able to mock it in tests
|
|
672
672
|
const realFetch = () => {
|
|
673
|
-
if (typeof document !== 'undefined') {
|
|
673
|
+
if (typeof document !== 'undefined' && window.fetch) {
|
|
674
674
|
// Browser
|
|
675
675
|
return window.fetch;
|
|
676
676
|
}
|
|
@@ -2119,7 +2119,7 @@ class Contact {
|
|
|
2119
2119
|
this[key] = old[key] || this[key];
|
|
2120
2120
|
});
|
|
2121
2121
|
|
|
2122
|
-
if (old.lineState
|
|
2122
|
+
if (old.lineState) {
|
|
2123
2123
|
this.lineState = old.lineState;
|
|
2124
2124
|
}
|
|
2125
2125
|
|
|
@@ -34,13 +34,16 @@ var updateFrom = (instance , from ) => {
|
|
|
34
34
|
|
|
35
35
|
|
|
36
36
|
|
|
37
|
+
|
|
37
38
|
|
|
38
39
|
|
|
39
40
|
|
|
40
41
|
|
|
41
42
|
|
|
43
|
+
|
|
42
44
|
|
|
43
45
|
|
|
46
|
+
|
|
44
47
|
|
|
45
48
|
|
|
46
49
|
|
|
@@ -57,6 +60,7 @@ var updateFrom = (instance , from ) => {
|
|
|
57
60
|
|
|
58
61
|
|
|
59
62
|
|
|
63
|
+
|
|
60
64
|
|
|
61
65
|
|
|
62
66
|
class CallSession {
|
|
@@ -76,10 +80,14 @@ class CallSession {
|
|
|
76
80
|
|
|
77
81
|
|
|
78
82
|
|
|
79
|
-
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
// = creationTime
|
|
80
86
|
|
|
81
87
|
|
|
82
88
|
|
|
89
|
+
|
|
90
|
+
|
|
83
91
|
|
|
84
92
|
|
|
85
93
|
|
|
@@ -115,6 +123,8 @@ class CallSession {
|
|
|
115
123
|
|
|
116
124
|
|
|
117
125
|
|
|
126
|
+
|
|
127
|
+
|
|
118
128
|
|
|
119
129
|
constructor({
|
|
120
130
|
answered,
|
|
@@ -128,6 +138,8 @@ class CallSession {
|
|
|
128
138
|
paused,
|
|
129
139
|
ringing,
|
|
130
140
|
startTime,
|
|
141
|
+
creationTime,
|
|
142
|
+
endTime,
|
|
131
143
|
cameraEnabled,
|
|
132
144
|
dialedExtension,
|
|
133
145
|
sipCallId,
|
|
@@ -140,12 +152,16 @@ class CallSession {
|
|
|
140
152
|
recording,
|
|
141
153
|
recordingPaused,
|
|
142
154
|
videoRemotelyDowngraded,
|
|
155
|
+
sipSession,
|
|
156
|
+
answerTime,
|
|
143
157
|
} ) {
|
|
144
158
|
this.callId = callId;
|
|
145
159
|
this.sipCallId = sipCallId;
|
|
146
160
|
this.displayName = displayName;
|
|
147
161
|
this.number = number;
|
|
162
|
+
this.creationTime = creationTime;
|
|
148
163
|
this.startTime = startTime;
|
|
164
|
+
this.endTime = endTime;
|
|
149
165
|
this.isCaller = isCaller;
|
|
150
166
|
this.answered = answered;
|
|
151
167
|
this.answeredBySystem = answeredBySystem;
|
|
@@ -164,6 +180,8 @@ class CallSession {
|
|
|
164
180
|
this.recording = recording || false;
|
|
165
181
|
this.recordingPaused = recordingPaused || false;
|
|
166
182
|
this.videoRemotelyDowngraded = videoRemotelyDowngraded;
|
|
183
|
+
this.sipSession = sipSession;
|
|
184
|
+
this.answerTime = answerTime || this.answerTime;
|
|
167
185
|
|
|
168
186
|
// Useful to compare instead of instanceof with minified code
|
|
169
187
|
this.type = 'CallSession';
|
|
@@ -194,7 +212,7 @@ class CallSession {
|
|
|
194
212
|
}
|
|
195
213
|
|
|
196
214
|
answer() {
|
|
197
|
-
this.
|
|
215
|
+
this.answerTime = new Date();
|
|
198
216
|
}
|
|
199
217
|
|
|
200
218
|
systemAnswer() {
|
|
@@ -350,6 +368,15 @@ class CallSession {
|
|
|
350
368
|
return newFrom(callSession, CallSession);
|
|
351
369
|
}
|
|
352
370
|
|
|
371
|
+
// Retro-compatibility: `answered` was a boolean before. We can reproduce the behaviour with a getter/setter
|
|
372
|
+
set answered(value ) {
|
|
373
|
+
this.answerTime = value ? new Date() : null;
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
get answered() {
|
|
377
|
+
return !!this.answerTime;
|
|
378
|
+
}
|
|
379
|
+
|
|
353
380
|
static parseCall(call ) {
|
|
354
381
|
return new CallSession({
|
|
355
382
|
callId: call.id,
|
package/lib/domain/Contact.js
CHANGED
package/lib/domain/Features.js
CHANGED
|
@@ -452,7 +452,7 @@ const logger$1 = IssueReporter$1 ? IssueReporter$1.loggerFor('api') : console;
|
|
|
452
452
|
|
|
453
453
|
// Use a function here to be able to mock it in tests
|
|
454
454
|
const realFetch = () => {
|
|
455
|
-
if (typeof document !== 'undefined') {
|
|
455
|
+
if (typeof document !== 'undefined' && window.fetch) {
|
|
456
456
|
// Browser
|
|
457
457
|
return window.fetch;
|
|
458
458
|
}
|
|
@@ -1912,7 +1912,7 @@ class Contact {
|
|
|
1912
1912
|
this[key] = old[key] || this[key];
|
|
1913
1913
|
});
|
|
1914
1914
|
|
|
1915
|
-
if (old.lineState
|
|
1915
|
+
if (old.lineState) {
|
|
1916
1916
|
this.lineState = old.lineState;
|
|
1917
1917
|
}
|
|
1918
1918
|
|
|
@@ -1226,7 +1226,7 @@ class Contact {
|
|
|
1226
1226
|
this[key] = old[key] || this[key];
|
|
1227
1227
|
});
|
|
1228
1228
|
|
|
1229
|
-
if (old.lineState
|
|
1229
|
+
if (old.lineState) {
|
|
1230
1230
|
this.lineState = old.lineState;
|
|
1231
1231
|
}
|
|
1232
1232
|
|
|
@@ -1715,13 +1715,16 @@ var updateFrom = (instance , from ) => {
|
|
|
1715
1715
|
|
|
1716
1716
|
|
|
1717
1717
|
|
|
1718
|
+
|
|
1718
1719
|
|
|
1719
1720
|
|
|
1720
1721
|
|
|
1721
1722
|
|
|
1722
1723
|
|
|
1724
|
+
|
|
1723
1725
|
|
|
1724
1726
|
|
|
1727
|
+
|
|
1725
1728
|
|
|
1726
1729
|
|
|
1727
1730
|
|
|
@@ -1738,6 +1741,7 @@ var updateFrom = (instance , from ) => {
|
|
|
1738
1741
|
|
|
1739
1742
|
|
|
1740
1743
|
|
|
1744
|
+
|
|
1741
1745
|
|
|
1742
1746
|
|
|
1743
1747
|
class CallSession {
|
|
@@ -1757,10 +1761,14 @@ class CallSession {
|
|
|
1757
1761
|
|
|
1758
1762
|
|
|
1759
1763
|
|
|
1760
|
-
|
|
1764
|
+
|
|
1765
|
+
|
|
1766
|
+
// = creationTime
|
|
1761
1767
|
|
|
1762
1768
|
|
|
1763
1769
|
|
|
1770
|
+
|
|
1771
|
+
|
|
1764
1772
|
|
|
1765
1773
|
|
|
1766
1774
|
|
|
@@ -1796,6 +1804,8 @@ class CallSession {
|
|
|
1796
1804
|
|
|
1797
1805
|
|
|
1798
1806
|
|
|
1807
|
+
|
|
1808
|
+
|
|
1799
1809
|
|
|
1800
1810
|
constructor({
|
|
1801
1811
|
answered,
|
|
@@ -1809,6 +1819,8 @@ class CallSession {
|
|
|
1809
1819
|
paused,
|
|
1810
1820
|
ringing,
|
|
1811
1821
|
startTime,
|
|
1822
|
+
creationTime,
|
|
1823
|
+
endTime,
|
|
1812
1824
|
cameraEnabled,
|
|
1813
1825
|
dialedExtension,
|
|
1814
1826
|
sipCallId,
|
|
@@ -1821,12 +1833,16 @@ class CallSession {
|
|
|
1821
1833
|
recording,
|
|
1822
1834
|
recordingPaused,
|
|
1823
1835
|
videoRemotelyDowngraded,
|
|
1836
|
+
sipSession,
|
|
1837
|
+
answerTime,
|
|
1824
1838
|
} ) {
|
|
1825
1839
|
this.callId = callId;
|
|
1826
1840
|
this.sipCallId = sipCallId;
|
|
1827
1841
|
this.displayName = displayName;
|
|
1828
1842
|
this.number = number;
|
|
1843
|
+
this.creationTime = creationTime;
|
|
1829
1844
|
this.startTime = startTime;
|
|
1845
|
+
this.endTime = endTime;
|
|
1830
1846
|
this.isCaller = isCaller;
|
|
1831
1847
|
this.answered = answered;
|
|
1832
1848
|
this.answeredBySystem = answeredBySystem;
|
|
@@ -1845,6 +1861,8 @@ class CallSession {
|
|
|
1845
1861
|
this.recording = recording || false;
|
|
1846
1862
|
this.recordingPaused = recordingPaused || false;
|
|
1847
1863
|
this.videoRemotelyDowngraded = videoRemotelyDowngraded;
|
|
1864
|
+
this.sipSession = sipSession;
|
|
1865
|
+
this.answerTime = answerTime || this.answerTime;
|
|
1848
1866
|
|
|
1849
1867
|
// Useful to compare instead of instanceof with minified code
|
|
1850
1868
|
this.type = 'CallSession';
|
|
@@ -1875,7 +1893,7 @@ class CallSession {
|
|
|
1875
1893
|
}
|
|
1876
1894
|
|
|
1877
1895
|
answer() {
|
|
1878
|
-
this.
|
|
1896
|
+
this.answerTime = new Date();
|
|
1879
1897
|
}
|
|
1880
1898
|
|
|
1881
1899
|
systemAnswer() {
|
|
@@ -2031,6 +2049,15 @@ class CallSession {
|
|
|
2031
2049
|
return newFrom(callSession, CallSession);
|
|
2032
2050
|
}
|
|
2033
2051
|
|
|
2052
|
+
// Retro-compatibility: `answered` was a boolean before. We can reproduce the behaviour with a getter/setter
|
|
2053
|
+
set answered(value ) {
|
|
2054
|
+
this.answerTime = value ? new Date() : null;
|
|
2055
|
+
}
|
|
2056
|
+
|
|
2057
|
+
get answered() {
|
|
2058
|
+
return !!this.answerTime;
|
|
2059
|
+
}
|
|
2060
|
+
|
|
2034
2061
|
static parseCall(call ) {
|
|
2035
2062
|
return new CallSession({
|
|
2036
2063
|
callId: call.id,
|
|
@@ -2846,7 +2873,7 @@ const logger$2 = IssueReporter$1 ? IssueReporter$1.loggerFor('api') : console;
|
|
|
2846
2873
|
|
|
2847
2874
|
// Use a function here to be able to mock it in tests
|
|
2848
2875
|
const realFetch = () => {
|
|
2849
|
-
if (typeof document !== 'undefined') {
|
|
2876
|
+
if (typeof document !== 'undefined' && window.fetch) {
|
|
2850
2877
|
// Browser
|
|
2851
2878
|
return window.fetch;
|
|
2852
2879
|
}
|
|
@@ -63,13 +63,16 @@ var updateFrom = (instance , from ) => {
|
|
|
63
63
|
|
|
64
64
|
|
|
65
65
|
|
|
66
|
+
|
|
66
67
|
|
|
67
68
|
|
|
68
69
|
|
|
69
70
|
|
|
70
71
|
|
|
72
|
+
|
|
71
73
|
|
|
72
74
|
|
|
75
|
+
|
|
73
76
|
|
|
74
77
|
|
|
75
78
|
|
|
@@ -86,6 +89,7 @@ var updateFrom = (instance , from ) => {
|
|
|
86
89
|
|
|
87
90
|
|
|
88
91
|
|
|
92
|
+
|
|
89
93
|
|
|
90
94
|
|
|
91
95
|
class CallSession {
|
|
@@ -105,10 +109,14 @@ class CallSession {
|
|
|
105
109
|
|
|
106
110
|
|
|
107
111
|
|
|
108
|
-
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
// = creationTime
|
|
109
115
|
|
|
110
116
|
|
|
111
117
|
|
|
118
|
+
|
|
119
|
+
|
|
112
120
|
|
|
113
121
|
|
|
114
122
|
|
|
@@ -144,6 +152,8 @@ class CallSession {
|
|
|
144
152
|
|
|
145
153
|
|
|
146
154
|
|
|
155
|
+
|
|
156
|
+
|
|
147
157
|
|
|
148
158
|
constructor({
|
|
149
159
|
answered,
|
|
@@ -157,6 +167,8 @@ class CallSession {
|
|
|
157
167
|
paused,
|
|
158
168
|
ringing,
|
|
159
169
|
startTime,
|
|
170
|
+
creationTime,
|
|
171
|
+
endTime,
|
|
160
172
|
cameraEnabled,
|
|
161
173
|
dialedExtension,
|
|
162
174
|
sipCallId,
|
|
@@ -169,12 +181,16 @@ class CallSession {
|
|
|
169
181
|
recording,
|
|
170
182
|
recordingPaused,
|
|
171
183
|
videoRemotelyDowngraded,
|
|
184
|
+
sipSession,
|
|
185
|
+
answerTime,
|
|
172
186
|
} ) {
|
|
173
187
|
this.callId = callId;
|
|
174
188
|
this.sipCallId = sipCallId;
|
|
175
189
|
this.displayName = displayName;
|
|
176
190
|
this.number = number;
|
|
191
|
+
this.creationTime = creationTime;
|
|
177
192
|
this.startTime = startTime;
|
|
193
|
+
this.endTime = endTime;
|
|
178
194
|
this.isCaller = isCaller;
|
|
179
195
|
this.answered = answered;
|
|
180
196
|
this.answeredBySystem = answeredBySystem;
|
|
@@ -193,6 +209,8 @@ class CallSession {
|
|
|
193
209
|
this.recording = recording || false;
|
|
194
210
|
this.recordingPaused = recordingPaused || false;
|
|
195
211
|
this.videoRemotelyDowngraded = videoRemotelyDowngraded;
|
|
212
|
+
this.sipSession = sipSession;
|
|
213
|
+
this.answerTime = answerTime || this.answerTime;
|
|
196
214
|
|
|
197
215
|
// Useful to compare instead of instanceof with minified code
|
|
198
216
|
this.type = 'CallSession';
|
|
@@ -223,7 +241,7 @@ class CallSession {
|
|
|
223
241
|
}
|
|
224
242
|
|
|
225
243
|
answer() {
|
|
226
|
-
this.
|
|
244
|
+
this.answerTime = new Date();
|
|
227
245
|
}
|
|
228
246
|
|
|
229
247
|
systemAnswer() {
|
|
@@ -379,6 +397,15 @@ class CallSession {
|
|
|
379
397
|
return newFrom(callSession, CallSession);
|
|
380
398
|
}
|
|
381
399
|
|
|
400
|
+
// Retro-compatibility: `answered` was a boolean before. We can reproduce the behaviour with a getter/setter
|
|
401
|
+
set answered(value ) {
|
|
402
|
+
this.answerTime = value ? new Date() : null;
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
get answered() {
|
|
406
|
+
return !!this.answerTime;
|
|
407
|
+
}
|
|
408
|
+
|
|
382
409
|
static parseCall(call ) {
|
|
383
410
|
return new CallSession({
|
|
384
411
|
callId: call.id,
|
|
@@ -414,7 +441,7 @@ IssueReporter$1 ? IssueReporter$1.loggerFor('api') : console;
|
|
|
414
441
|
|
|
415
442
|
// Use a function here to be able to mock it in tests
|
|
416
443
|
const realFetch = () => {
|
|
417
|
-
if (typeof document !== 'undefined') {
|
|
444
|
+
if (typeof document !== 'undefined' && window.fetch) {
|
|
418
445
|
// Browser
|
|
419
446
|
return window.fetch;
|
|
420
447
|
}
|
|
@@ -887,6 +914,7 @@ const ON_CAMERA_DISABLED = 'onCameraDisabled';
|
|
|
887
914
|
const ON_CAMERA_RESUMED = 'onCameraResumed';
|
|
888
915
|
const ON_CALL_CANCELED = 'onCallCanceled';
|
|
889
916
|
const ON_CALL_FAILED = 'onCallFailed';
|
|
917
|
+
const ON_CALL_REJECTED = 'onCallRejected';
|
|
890
918
|
const ON_CALL_ENDED = 'onCallEnded';
|
|
891
919
|
const ON_CALL_ENDING = 'onCallEnding';
|
|
892
920
|
const ON_MESSAGE = 'onMessage';
|
|
@@ -931,6 +959,7 @@ const events = [
|
|
|
931
959
|
ON_CAMERA_DISABLED,
|
|
932
960
|
ON_CALL_FAILED,
|
|
933
961
|
ON_CALL_ENDED,
|
|
962
|
+
ON_CALL_REJECTED,
|
|
934
963
|
ON_MESSAGE,
|
|
935
964
|
ON_REINVITE,
|
|
936
965
|
ON_TRACK,
|
|
@@ -1287,6 +1316,7 @@ class WebRTCPhone extends Emitter {
|
|
|
1287
1316
|
|
|
1288
1317
|
// Should be called before `_onCallTerminated` or the callCount will not decrement...
|
|
1289
1318
|
const callSession = this._createCallSession(sipSession);
|
|
1319
|
+
callSession.endTime = new Date();
|
|
1290
1320
|
const wasCurrentSession = this._onCallTerminated(sipSession);
|
|
1291
1321
|
|
|
1292
1322
|
return this.eventEmitter.emit(ON_CALL_ENDED, callSession, wasCurrentSession);
|
|
@@ -1482,6 +1512,7 @@ class WebRTCPhone extends Emitter {
|
|
|
1482
1512
|
this.removeIncomingSessions(sipSessionId);
|
|
1483
1513
|
}
|
|
1484
1514
|
|
|
1515
|
+
callSession.answerTime = new Date();
|
|
1485
1516
|
this.eventEmitter.emit(ON_CALL_ACCEPTED, callSession, cameraEnabled);
|
|
1486
1517
|
|
|
1487
1518
|
return callSession;
|
|
@@ -1539,6 +1570,7 @@ class WebRTCPhone extends Emitter {
|
|
|
1539
1570
|
_onCallTerminated(sipSession ) {
|
|
1540
1571
|
logger.info('WebRTC phone - on call terminated', { sipId: sipSession.id });
|
|
1541
1572
|
|
|
1573
|
+
const sipSessionId = this.getSipSessionId(sipSession);
|
|
1542
1574
|
const callSession = this._createCallSession(sipSession);
|
|
1543
1575
|
const isCurrentSession = this.isCurrentCallSipSession(callSession);
|
|
1544
1576
|
const isCurrentIncomingCall = callSession.is(this.getIncomingCallSession());
|
|
@@ -1556,7 +1588,6 @@ class WebRTCPhone extends Emitter {
|
|
|
1556
1588
|
}, 5);
|
|
1557
1589
|
}
|
|
1558
1590
|
|
|
1559
|
-
const sipSessionId = this.getSipSessionId(sipSession);
|
|
1560
1591
|
if (sipSessionId) {
|
|
1561
1592
|
this.removeIncomingSessions(sipSessionId);
|
|
1562
1593
|
}
|
|
@@ -1697,6 +1728,7 @@ class WebRTCPhone extends Emitter {
|
|
|
1697
1728
|
}
|
|
1698
1729
|
|
|
1699
1730
|
this.shouldSendReinvite = false;
|
|
1731
|
+
callSession.answerTime = new Date();
|
|
1700
1732
|
this.acceptedSessions[callSession.getId()] = true;
|
|
1701
1733
|
|
|
1702
1734
|
this.eventEmitter.emit(ON_CALL_ANSWERED, callSession);
|
|
@@ -2006,6 +2038,7 @@ class WebRTCPhone extends Emitter {
|
|
|
2006
2038
|
return Promise.resolve(null);
|
|
2007
2039
|
}
|
|
2008
2040
|
const callSession = this._createOutgoingCallSession(sipSession, cameraEnabled || false);
|
|
2041
|
+
callSession.creationTime = new Date();
|
|
2009
2042
|
|
|
2010
2043
|
this.eventEmitter.emit(ON_PLAY_PROGRESS_SOUND, this.audioOutputDeviceId, this.audioOutputVolume);
|
|
2011
2044
|
|
|
@@ -2201,8 +2234,12 @@ class WebRTCPhone extends Emitter {
|
|
|
2201
2234
|
}
|
|
2202
2235
|
|
|
2203
2236
|
const sessionId = this.incomingSessions[0];
|
|
2237
|
+
const sipSession = this.client.getSipSession(sessionId);
|
|
2238
|
+
if (!sipSession) {
|
|
2239
|
+
return null;
|
|
2240
|
+
}
|
|
2204
2241
|
|
|
2205
|
-
return this._createCallSession(
|
|
2242
|
+
return this._createCallSession(sipSession);
|
|
2206
2243
|
}
|
|
2207
2244
|
|
|
2208
2245
|
sendMessage(sipSession = null, body , contentType = 'text/plain') {
|
|
@@ -2280,6 +2317,7 @@ class WebRTCPhone extends Emitter {
|
|
|
2280
2317
|
callSession);
|
|
2281
2318
|
}
|
|
2282
2319
|
|
|
2320
|
+
callSession.creationTime = new Date();
|
|
2283
2321
|
this.eventEmitter.emit(ON_CALL_INCOMING, callSession, wantsToDoVideo);
|
|
2284
2322
|
});
|
|
2285
2323
|
|
|
@@ -2319,6 +2357,13 @@ class WebRTCPhone extends Emitter {
|
|
|
2319
2357
|
this.eventEmitter.emit(ON_CALL_ERROR, e);
|
|
2320
2358
|
});
|
|
2321
2359
|
|
|
2360
|
+
this.client.on(this.client.REJECTED, session => {
|
|
2361
|
+
logger.info('WebRTC call rejected', session.id);
|
|
2362
|
+
const callSession = this._createCallSession(session);
|
|
2363
|
+
callSession.endTime = new Date();
|
|
2364
|
+
this.eventEmitter.emit(ON_CALL_REJECTED, callSession);
|
|
2365
|
+
});
|
|
2366
|
+
|
|
2322
2367
|
this.client.on(this.client.UNREGISTERED, () => {
|
|
2323
2368
|
logger.info('WebRTC unregistered');
|
|
2324
2369
|
this.eventEmitter.emit(ON_UNREGISTERED);
|
|
@@ -2531,6 +2576,7 @@ class WebRTCPhone extends Emitter {
|
|
|
2531
2576
|
const number = identity ? identity.uri._normal.user : null;
|
|
2532
2577
|
const { state } = sipSession || {};
|
|
2533
2578
|
const sessionId = this.getSipSessionId(sipSession);
|
|
2579
|
+
fromSession = fromSession || this.callSessions[sessionId];
|
|
2534
2580
|
|
|
2535
2581
|
const callSession = new CallSession({
|
|
2536
2582
|
callId: fromSession && fromSession.callId,
|
|
@@ -2538,6 +2584,8 @@ class WebRTCPhone extends Emitter {
|
|
|
2538
2584
|
sipStatus: state,
|
|
2539
2585
|
displayName: identity ? identity.displayName || number : number,
|
|
2540
2586
|
startTime: fromSession ? fromSession.startTime : new Date(),
|
|
2587
|
+
creationTime: fromSession ? fromSession.creationTime : null,
|
|
2588
|
+
endTime: fromSession ? fromSession.endTime : null,
|
|
2541
2589
|
answered: state === sessionState.SessionState.Established,
|
|
2542
2590
|
paused: this.client.isCallHeld(sipSession),
|
|
2543
2591
|
isCaller: 'incoming' in extra ? !extra.incoming : false,
|
|
@@ -2548,6 +2596,7 @@ class WebRTCPhone extends Emitter {
|
|
|
2548
2596
|
videoMuted: fromSession ? fromSession.isVideoMuted() : false,
|
|
2549
2597
|
recording: fromSession ? fromSession.isRecording() : false,
|
|
2550
2598
|
recordingPaused: false, // @TODO
|
|
2599
|
+
sipSession,
|
|
2551
2600
|
...extra,
|
|
2552
2601
|
});
|
|
2553
2602
|
|
|
@@ -2571,6 +2620,7 @@ exports.ON_CALL_HELD = ON_CALL_HELD;
|
|
|
2571
2620
|
exports.ON_CALL_INCOMING = ON_CALL_INCOMING;
|
|
2572
2621
|
exports.ON_CALL_MUTED = ON_CALL_MUTED;
|
|
2573
2622
|
exports.ON_CALL_OUTGOING = ON_CALL_OUTGOING;
|
|
2623
|
+
exports.ON_CALL_REJECTED = ON_CALL_REJECTED;
|
|
2574
2624
|
exports.ON_CALL_RESUMED = ON_CALL_RESUMED;
|
|
2575
2625
|
exports.ON_CALL_UNHELD = ON_CALL_UNHELD;
|
|
2576
2626
|
exports.ON_CALL_UNMUTED = ON_CALL_UNMUTED;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/* */
|
|
4
|
+
class SFUNotAvailableError extends Error {
|
|
5
|
+
constructor(message = 'Sorry your user is not configured to support video conference') {
|
|
6
|
+
super(message);
|
|
7
|
+
this.name = 'SFUNotAvailableError';
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
module.exports = SFUNotAvailableError;
|