@wazo/sdk 0.37.26 → 0.37.30
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 +98 -59
- package/dist/wazo-sdk.js +3 -3
- package/esm/__tests__/api-client.test.js +1 -1
- package/esm/__tests__/web-rtc-client.test.js +18 -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 +1 -1
- package/esm/api/webhookd.js +1 -1
- package/esm/api-client.js +1 -1
- package/esm/checker/Checker.js +18 -5
- package/esm/checker/checks/aor.js +1 -1
- package/esm/checker/checks/api.js +1 -1
- package/esm/checker/checks/index.js +18 -5
- package/esm/checker/checks/wazo-websocket.js +1 -1
- package/esm/checker/checks/webrtc-transport.js +18 -5
- package/esm/checker/checks/webrtc.js +18 -5
- package/esm/domain/AdHocAPIConference.js +1 -1
- package/esm/domain/CallSession.js +29 -2
- package/esm/domain/Features.js +1 -1
- package/esm/domain/Phone/CTIPhone.js +30 -3
- 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__/IndirectTransfer.test.js +29 -2
- package/esm/domain/__tests__/Room.test.js +29 -2
- package/esm/index.js +83 -10
- package/esm/lib/WazoSessionDescriptionHandler.js +9 -4
- package/esm/service/CallApi.js +1 -1
- package/esm/service/IssueReporter.js +1 -1
- package/esm/service/__tests__/IssueReporter.test.js +1 -1
- package/esm/service/getApiClient.js +1 -1
- package/esm/simple/Auth.js +82 -10
- package/esm/simple/Configuration.js +82 -10
- package/esm/simple/Directory.js +1 -1
- package/esm/simple/Phone.js +82 -10
- package/esm/simple/Websocket.js +1 -1
- package/esm/simple/index.js +82 -10
- package/esm/simple/room/LocalParticipant.js +82 -10
- package/esm/simple/room/Participant.js +82 -10
- package/esm/simple/room/RemoteParticipant.js +82 -10
- package/esm/simple/room/Room.js +82 -10
- package/esm/simple/room/SipRoom.js +82 -10
- package/esm/simple/room/Stream.js +82 -10
- package/esm/simple/room/__tests__/RemoteParticipant.test.js +82 -10
- package/esm/simple/utils.js +82 -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 +18 -5
- package/esm/websocket-client.js +1 -1
- package/lib/__tests__/api-client.test.js +1 -1
- package/lib/__tests__/web-rtc-client.test.js +18 -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 +1 -1
- package/lib/api/webhookd.js +1 -1
- package/lib/api-client.js +1 -1
- package/lib/checker/Checker.js +18 -5
- package/lib/checker/checks/aor.js +1 -1
- package/lib/checker/checks/api.js +1 -1
- package/lib/checker/checks/index.js +18 -5
- package/lib/checker/checks/wazo-websocket.js +1 -1
- package/lib/checker/checks/webrtc-transport.js +18 -5
- package/lib/checker/checks/webrtc.js +18 -5
- package/lib/domain/AdHocAPIConference.js +1 -1
- package/lib/domain/CallSession.js +29 -2
- package/lib/domain/Features.js +1 -1
- package/lib/domain/Phone/CTIPhone.js +30 -3
- 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__/IndirectTransfer.test.js +29 -2
- package/lib/domain/__tests__/Room.test.js +29 -2
- package/lib/index.js +83 -10
- package/lib/lib/WazoSessionDescriptionHandler.js +9 -4
- package/lib/service/CallApi.js +1 -1
- package/lib/service/IssueReporter.js +1 -1
- package/lib/service/__tests__/IssueReporter.test.js +1 -1
- package/lib/service/getApiClient.js +1 -1
- package/lib/simple/Auth.js +82 -10
- package/lib/simple/Configuration.js +82 -10
- package/lib/simple/Directory.js +1 -1
- package/lib/simple/Phone.js +82 -10
- package/lib/simple/Websocket.js +1 -1
- package/lib/simple/index.js +82 -10
- package/lib/simple/room/LocalParticipant.js +82 -10
- package/lib/simple/room/Participant.js +82 -10
- package/lib/simple/room/RemoteParticipant.js +82 -10
- package/lib/simple/room/Room.js +82 -10
- package/lib/simple/room/SipRoom.js +82 -10
- package/lib/simple/room/Stream.js +82 -10
- package/lib/simple/room/__tests__/RemoteParticipant.test.js +82 -10
- package/lib/simple/utils.js +82 -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 +18 -5
- package/lib/websocket-client.js +1 -1
- package/package.json +1 -1
- package/src/domain/CallSession.js +32 -4
- 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
- package/src/web-rtc-client.js +9 -1
package/esm/simple/Phone.js
CHANGED
|
@@ -248,13 +248,16 @@ var updateFrom = (instance , from ) => {
|
|
|
248
248
|
|
|
249
249
|
|
|
250
250
|
|
|
251
|
+
|
|
251
252
|
|
|
252
253
|
|
|
253
254
|
|
|
254
255
|
|
|
255
256
|
|
|
257
|
+
|
|
256
258
|
|
|
257
259
|
|
|
260
|
+
|
|
258
261
|
|
|
259
262
|
|
|
260
263
|
|
|
@@ -271,6 +274,7 @@ var updateFrom = (instance , from ) => {
|
|
|
271
274
|
|
|
272
275
|
|
|
273
276
|
|
|
277
|
+
|
|
274
278
|
|
|
275
279
|
|
|
276
280
|
class CallSession {
|
|
@@ -290,10 +294,14 @@ class CallSession {
|
|
|
290
294
|
|
|
291
295
|
|
|
292
296
|
|
|
293
|
-
|
|
297
|
+
|
|
298
|
+
|
|
299
|
+
// = creationTime
|
|
294
300
|
|
|
295
301
|
|
|
296
302
|
|
|
303
|
+
|
|
304
|
+
|
|
297
305
|
|
|
298
306
|
|
|
299
307
|
|
|
@@ -329,6 +337,8 @@ class CallSession {
|
|
|
329
337
|
|
|
330
338
|
|
|
331
339
|
|
|
340
|
+
|
|
341
|
+
|
|
332
342
|
|
|
333
343
|
constructor({
|
|
334
344
|
answered,
|
|
@@ -342,6 +352,8 @@ class CallSession {
|
|
|
342
352
|
paused,
|
|
343
353
|
ringing,
|
|
344
354
|
startTime,
|
|
355
|
+
creationTime,
|
|
356
|
+
endTime,
|
|
345
357
|
cameraEnabled,
|
|
346
358
|
dialedExtension,
|
|
347
359
|
sipCallId,
|
|
@@ -354,12 +366,16 @@ class CallSession {
|
|
|
354
366
|
recording,
|
|
355
367
|
recordingPaused,
|
|
356
368
|
videoRemotelyDowngraded,
|
|
369
|
+
sipSession,
|
|
370
|
+
answerTime,
|
|
357
371
|
} ) {
|
|
358
372
|
this.callId = callId;
|
|
359
373
|
this.sipCallId = sipCallId;
|
|
360
374
|
this.displayName = displayName;
|
|
361
375
|
this.number = number;
|
|
376
|
+
this.creationTime = creationTime;
|
|
362
377
|
this.startTime = startTime;
|
|
378
|
+
this.endTime = endTime;
|
|
363
379
|
this.isCaller = isCaller;
|
|
364
380
|
this.answered = answered;
|
|
365
381
|
this.answeredBySystem = answeredBySystem;
|
|
@@ -378,6 +394,8 @@ class CallSession {
|
|
|
378
394
|
this.recording = recording || false;
|
|
379
395
|
this.recordingPaused = recordingPaused || false;
|
|
380
396
|
this.videoRemotelyDowngraded = videoRemotelyDowngraded;
|
|
397
|
+
this.sipSession = sipSession;
|
|
398
|
+
this.answerTime = answerTime || this.answerTime;
|
|
381
399
|
|
|
382
400
|
// Useful to compare instead of instanceof with minified code
|
|
383
401
|
this.type = 'CallSession';
|
|
@@ -408,7 +426,7 @@ class CallSession {
|
|
|
408
426
|
}
|
|
409
427
|
|
|
410
428
|
answer() {
|
|
411
|
-
this.
|
|
429
|
+
this.answerTime = new Date();
|
|
412
430
|
}
|
|
413
431
|
|
|
414
432
|
systemAnswer() {
|
|
@@ -564,6 +582,15 @@ class CallSession {
|
|
|
564
582
|
return newFrom(callSession, CallSession);
|
|
565
583
|
}
|
|
566
584
|
|
|
585
|
+
// Retro-compatibility: `answered` was a boolean before. We can reproduce the behaviour with a getter/setter
|
|
586
|
+
set answered(value ) {
|
|
587
|
+
this.answerTime = value ? new Date() : null;
|
|
588
|
+
}
|
|
589
|
+
|
|
590
|
+
get answered() {
|
|
591
|
+
return !!this.answerTime;
|
|
592
|
+
}
|
|
593
|
+
|
|
567
594
|
static parseCall(call ) {
|
|
568
595
|
return new CallSession({
|
|
569
596
|
callId: call.id,
|
|
@@ -1028,7 +1055,7 @@ const logger$c = IssueReporter$1 ? IssueReporter$1.loggerFor('api') : console;
|
|
|
1028
1055
|
|
|
1029
1056
|
// Use a function here to be able to mock it in tests
|
|
1030
1057
|
const realFetch = () => {
|
|
1031
|
-
if (typeof document !== 'undefined') {
|
|
1058
|
+
if (typeof document !== 'undefined' && window.fetch) {
|
|
1032
1059
|
// Browser
|
|
1033
1060
|
return window.fetch;
|
|
1034
1061
|
}
|
|
@@ -5798,11 +5825,16 @@ class WazoSessionDescriptionHandler extends SessionDescriptionHandler {
|
|
|
5798
5825
|
|
|
5799
5826
|
// $FlowFixMe
|
|
5800
5827
|
setRemoteSessionDescription(sessionDescription ) {
|
|
5801
|
-
|
|
5828
|
+
try {
|
|
5829
|
+
const result = super.setRemoteSessionDescription(sessionDescription);
|
|
5802
5830
|
|
|
5803
|
-
|
|
5831
|
+
this.eventEmitter.emit('setDescription', sessionDescription);
|
|
5804
5832
|
|
|
5805
|
-
|
|
5833
|
+
return result;
|
|
5834
|
+
} catch (error) {
|
|
5835
|
+
this.logger.error('SessionDescriptionHandler.setRemoteSessionDescription error', error);
|
|
5836
|
+
throw error;
|
|
5837
|
+
}
|
|
5806
5838
|
}
|
|
5807
5839
|
|
|
5808
5840
|
// Overridden to avoid to fix ice-candidates missing in the SDP in react-native and chrome canary.
|
|
@@ -6341,6 +6373,7 @@ const MAX_REGISTER_TRIES = 10;
|
|
|
6341
6373
|
|
|
6342
6374
|
|
|
6343
6375
|
|
|
6376
|
+
|
|
6344
6377
|
|
|
6345
6378
|
|
|
6346
6379
|
|
|
@@ -7957,6 +7990,13 @@ class WebRTCClient extends Emitter {
|
|
|
7957
7990
|
}
|
|
7958
7991
|
|
|
7959
7992
|
_createWebRTCConfiguration(configOverrides = {}) {
|
|
7993
|
+
let { host } = this.config;
|
|
7994
|
+
let port = this.config.port || 443;
|
|
7995
|
+
|
|
7996
|
+
if (this.config.websocketSip) {
|
|
7997
|
+
[host, port = 443] = this.config.websocketSip.split(':');
|
|
7998
|
+
}
|
|
7999
|
+
|
|
7960
8000
|
const config = {
|
|
7961
8001
|
authorizationUsername: this.config.authorizationUser,
|
|
7962
8002
|
authorizationPassword: this.config.password,
|
|
@@ -7992,7 +8032,7 @@ class WebRTCClient extends Emitter {
|
|
|
7992
8032
|
},
|
|
7993
8033
|
transportOptions: {
|
|
7994
8034
|
traceSip: configOverrides.traceSip || false,
|
|
7995
|
-
wsServers: `wss://${
|
|
8035
|
+
wsServers: `wss://${host}:${port}/api/asterisk/ws`,
|
|
7996
8036
|
},
|
|
7997
8037
|
sessionDescriptionHandlerFactoryOptions: {
|
|
7998
8038
|
modifiers: [replaceLocalIpModifier],
|
|
@@ -8454,6 +8494,7 @@ const ON_CAMERA_DISABLED = 'onCameraDisabled';
|
|
|
8454
8494
|
const ON_CAMERA_RESUMED = 'onCameraResumed';
|
|
8455
8495
|
const ON_CALL_CANCELED = 'onCallCanceled';
|
|
8456
8496
|
const ON_CALL_FAILED = 'onCallFailed';
|
|
8497
|
+
const ON_CALL_REJECTED = 'onCallRejected';
|
|
8457
8498
|
const ON_CALL_ENDED = 'onCallEnded';
|
|
8458
8499
|
const ON_CALL_ENDING = 'onCallEnding';
|
|
8459
8500
|
const ON_MESSAGE = 'onMessage';
|
|
@@ -8498,6 +8539,7 @@ const events = [
|
|
|
8498
8539
|
ON_CAMERA_DISABLED,
|
|
8499
8540
|
ON_CALL_FAILED,
|
|
8500
8541
|
ON_CALL_ENDED,
|
|
8542
|
+
ON_CALL_REJECTED,
|
|
8501
8543
|
ON_MESSAGE,
|
|
8502
8544
|
ON_REINVITE,
|
|
8503
8545
|
ON_TRACK,
|
|
@@ -8854,6 +8896,7 @@ class WebRTCPhone extends Emitter {
|
|
|
8854
8896
|
|
|
8855
8897
|
// Should be called before `_onCallTerminated` or the callCount will not decrement...
|
|
8856
8898
|
const callSession = this._createCallSession(sipSession);
|
|
8899
|
+
callSession.endTime = new Date();
|
|
8857
8900
|
const wasCurrentSession = this._onCallTerminated(sipSession);
|
|
8858
8901
|
|
|
8859
8902
|
return this.eventEmitter.emit(ON_CALL_ENDED, callSession, wasCurrentSession);
|
|
@@ -9049,6 +9092,7 @@ class WebRTCPhone extends Emitter {
|
|
|
9049
9092
|
this.removeIncomingSessions(sipSessionId);
|
|
9050
9093
|
}
|
|
9051
9094
|
|
|
9095
|
+
callSession.answerTime = new Date();
|
|
9052
9096
|
this.eventEmitter.emit(ON_CALL_ACCEPTED, callSession, cameraEnabled);
|
|
9053
9097
|
|
|
9054
9098
|
return callSession;
|
|
@@ -9106,6 +9150,7 @@ class WebRTCPhone extends Emitter {
|
|
|
9106
9150
|
_onCallTerminated(sipSession ) {
|
|
9107
9151
|
logger$8.info('WebRTC phone - on call terminated', { sipId: sipSession.id });
|
|
9108
9152
|
|
|
9153
|
+
const sipSessionId = this.getSipSessionId(sipSession);
|
|
9109
9154
|
const callSession = this._createCallSession(sipSession);
|
|
9110
9155
|
const isCurrentSession = this.isCurrentCallSipSession(callSession);
|
|
9111
9156
|
const isCurrentIncomingCall = callSession.is(this.getIncomingCallSession());
|
|
@@ -9123,7 +9168,6 @@ class WebRTCPhone extends Emitter {
|
|
|
9123
9168
|
}, 5);
|
|
9124
9169
|
}
|
|
9125
9170
|
|
|
9126
|
-
const sipSessionId = this.getSipSessionId(sipSession);
|
|
9127
9171
|
if (sipSessionId) {
|
|
9128
9172
|
this.removeIncomingSessions(sipSessionId);
|
|
9129
9173
|
}
|
|
@@ -9264,6 +9308,7 @@ class WebRTCPhone extends Emitter {
|
|
|
9264
9308
|
}
|
|
9265
9309
|
|
|
9266
9310
|
this.shouldSendReinvite = false;
|
|
9311
|
+
callSession.answerTime = new Date();
|
|
9267
9312
|
this.acceptedSessions[callSession.getId()] = true;
|
|
9268
9313
|
|
|
9269
9314
|
this.eventEmitter.emit(ON_CALL_ANSWERED, callSession);
|
|
@@ -9573,6 +9618,7 @@ class WebRTCPhone extends Emitter {
|
|
|
9573
9618
|
return Promise.resolve(null);
|
|
9574
9619
|
}
|
|
9575
9620
|
const callSession = this._createOutgoingCallSession(sipSession, cameraEnabled || false);
|
|
9621
|
+
callSession.creationTime = new Date();
|
|
9576
9622
|
|
|
9577
9623
|
this.eventEmitter.emit(ON_PLAY_PROGRESS_SOUND, this.audioOutputDeviceId, this.audioOutputVolume);
|
|
9578
9624
|
|
|
@@ -9768,8 +9814,12 @@ class WebRTCPhone extends Emitter {
|
|
|
9768
9814
|
}
|
|
9769
9815
|
|
|
9770
9816
|
const sessionId = this.incomingSessions[0];
|
|
9817
|
+
const sipSession = this.client.getSipSession(sessionId);
|
|
9818
|
+
if (!sipSession) {
|
|
9819
|
+
return null;
|
|
9820
|
+
}
|
|
9771
9821
|
|
|
9772
|
-
return this._createCallSession(
|
|
9822
|
+
return this._createCallSession(sipSession);
|
|
9773
9823
|
}
|
|
9774
9824
|
|
|
9775
9825
|
sendMessage(sipSession = null, body , contentType = 'text/plain') {
|
|
@@ -9847,6 +9897,7 @@ class WebRTCPhone extends Emitter {
|
|
|
9847
9897
|
callSession);
|
|
9848
9898
|
}
|
|
9849
9899
|
|
|
9900
|
+
callSession.creationTime = new Date();
|
|
9850
9901
|
this.eventEmitter.emit(ON_CALL_INCOMING, callSession, wantsToDoVideo);
|
|
9851
9902
|
});
|
|
9852
9903
|
|
|
@@ -9886,6 +9937,13 @@ class WebRTCPhone extends Emitter {
|
|
|
9886
9937
|
this.eventEmitter.emit(ON_CALL_ERROR, e);
|
|
9887
9938
|
});
|
|
9888
9939
|
|
|
9940
|
+
this.client.on(this.client.REJECTED, session => {
|
|
9941
|
+
logger$8.info('WebRTC call rejected', session.id);
|
|
9942
|
+
const callSession = this._createCallSession(session);
|
|
9943
|
+
callSession.endTime = new Date();
|
|
9944
|
+
this.eventEmitter.emit(ON_CALL_REJECTED, callSession);
|
|
9945
|
+
});
|
|
9946
|
+
|
|
9889
9947
|
this.client.on(this.client.UNREGISTERED, () => {
|
|
9890
9948
|
logger$8.info('WebRTC unregistered');
|
|
9891
9949
|
this.eventEmitter.emit(ON_UNREGISTERED);
|
|
@@ -10098,6 +10156,7 @@ class WebRTCPhone extends Emitter {
|
|
|
10098
10156
|
const number = identity ? identity.uri._normal.user : null;
|
|
10099
10157
|
const { state } = sipSession || {};
|
|
10100
10158
|
const sessionId = this.getSipSessionId(sipSession);
|
|
10159
|
+
fromSession = fromSession || this.callSessions[sessionId];
|
|
10101
10160
|
|
|
10102
10161
|
const callSession = new CallSession({
|
|
10103
10162
|
callId: fromSession && fromSession.callId,
|
|
@@ -10105,6 +10164,8 @@ class WebRTCPhone extends Emitter {
|
|
|
10105
10164
|
sipStatus: state,
|
|
10106
10165
|
displayName: identity ? identity.displayName || number : number,
|
|
10107
10166
|
startTime: fromSession ? fromSession.startTime : new Date(),
|
|
10167
|
+
creationTime: fromSession ? fromSession.creationTime : null,
|
|
10168
|
+
endTime: fromSession ? fromSession.endTime : null,
|
|
10108
10169
|
answered: state === SessionState.Established,
|
|
10109
10170
|
paused: this.client.isCallHeld(sipSession),
|
|
10110
10171
|
isCaller: 'incoming' in extra ? !extra.incoming : false,
|
|
@@ -10115,6 +10176,7 @@ class WebRTCPhone extends Emitter {
|
|
|
10115
10176
|
videoMuted: fromSession ? fromSession.isVideoMuted() : false,
|
|
10116
10177
|
recording: fromSession ? fromSession.isRecording() : false,
|
|
10117
10178
|
recordingPaused: false, // @TODO
|
|
10179
|
+
sipSession,
|
|
10118
10180
|
...extra,
|
|
10119
10181
|
});
|
|
10120
10182
|
|
|
@@ -10143,6 +10205,7 @@ var PHONE_EVENTS = /*#__PURE__*/Object.freeze({
|
|
|
10143
10205
|
ON_CAMERA_RESUMED: ON_CAMERA_RESUMED,
|
|
10144
10206
|
ON_CALL_CANCELED: ON_CALL_CANCELED,
|
|
10145
10207
|
ON_CALL_FAILED: ON_CALL_FAILED,
|
|
10208
|
+
ON_CALL_REJECTED: ON_CALL_REJECTED,
|
|
10146
10209
|
ON_CALL_ENDED: ON_CALL_ENDED,
|
|
10147
10210
|
ON_CALL_ENDING: ON_CALL_ENDING,
|
|
10148
10211
|
ON_MESSAGE: ON_MESSAGE,
|
|
@@ -12422,6 +12485,14 @@ const createLocalVideoStream = async (options ) => createLocalStream('vid
|
|
|
12422
12485
|
|
|
12423
12486
|
const createLocalAudioStream = async (options ) => createLocalStream('audio', options);
|
|
12424
12487
|
|
|
12488
|
+
/* */
|
|
12489
|
+
class SFUNotAvailableError extends Error {
|
|
12490
|
+
constructor(message = 'Sorry your user is not configured to support video conference') {
|
|
12491
|
+
super(message);
|
|
12492
|
+
this.name = 'SFUNotAvailableError';
|
|
12493
|
+
}
|
|
12494
|
+
}
|
|
12495
|
+
|
|
12425
12496
|
//
|
|
12426
12497
|
|
|
12427
12498
|
|
|
@@ -13323,6 +13394,7 @@ const Wazo = {
|
|
|
13323
13394
|
InvalidSubscription,
|
|
13324
13395
|
InvalidAuthorization,
|
|
13325
13396
|
CanceledCallError,
|
|
13397
|
+
SFUNotAvailableError,
|
|
13326
13398
|
};
|
|
13327
13399
|
|
|
13328
13400
|
if (window) {
|
|
@@ -13716,7 +13788,7 @@ class Phone extends Emitter {
|
|
|
13716
13788
|
|
|
13717
13789
|
checkSfu() {
|
|
13718
13790
|
if (!this.hasSfu()) {
|
|
13719
|
-
throw new
|
|
13791
|
+
throw new SFUNotAvailableError();
|
|
13720
13792
|
}
|
|
13721
13793
|
}
|
|
13722
13794
|
|
package/esm/simple/Websocket.js
CHANGED
|
@@ -39,7 +39,7 @@ IssueReporter$1 ? IssueReporter$1.loggerFor('api') : console;
|
|
|
39
39
|
|
|
40
40
|
// Use a function here to be able to mock it in tests
|
|
41
41
|
const realFetch = () => {
|
|
42
|
-
if (typeof document !== 'undefined') {
|
|
42
|
+
if (typeof document !== 'undefined' && window.fetch) {
|
|
43
43
|
// Browser
|
|
44
44
|
return window.fetch;
|
|
45
45
|
}
|
package/esm/simple/index.js
CHANGED
|
@@ -1951,7 +1951,7 @@ const logger$c = IssueReporter$1 ? IssueReporter$1.loggerFor('api') : console;
|
|
|
1951
1951
|
|
|
1952
1952
|
// Use a function here to be able to mock it in tests
|
|
1953
1953
|
const realFetch = () => {
|
|
1954
|
-
if (typeof document !== 'undefined') {
|
|
1954
|
+
if (typeof document !== 'undefined' && window.fetch) {
|
|
1955
1955
|
// Browser
|
|
1956
1956
|
return window.fetch;
|
|
1957
1957
|
}
|
|
@@ -3248,13 +3248,16 @@ var updateFrom = (instance , from ) => {
|
|
|
3248
3248
|
|
|
3249
3249
|
|
|
3250
3250
|
|
|
3251
|
+
|
|
3251
3252
|
|
|
3252
3253
|
|
|
3253
3254
|
|
|
3254
3255
|
|
|
3255
3256
|
|
|
3257
|
+
|
|
3256
3258
|
|
|
3257
3259
|
|
|
3260
|
+
|
|
3258
3261
|
|
|
3259
3262
|
|
|
3260
3263
|
|
|
@@ -3271,6 +3274,7 @@ var updateFrom = (instance , from ) => {
|
|
|
3271
3274
|
|
|
3272
3275
|
|
|
3273
3276
|
|
|
3277
|
+
|
|
3274
3278
|
|
|
3275
3279
|
|
|
3276
3280
|
class CallSession {
|
|
@@ -3290,10 +3294,14 @@ class CallSession {
|
|
|
3290
3294
|
|
|
3291
3295
|
|
|
3292
3296
|
|
|
3293
|
-
|
|
3297
|
+
|
|
3298
|
+
|
|
3299
|
+
// = creationTime
|
|
3294
3300
|
|
|
3295
3301
|
|
|
3296
3302
|
|
|
3303
|
+
|
|
3304
|
+
|
|
3297
3305
|
|
|
3298
3306
|
|
|
3299
3307
|
|
|
@@ -3329,6 +3337,8 @@ class CallSession {
|
|
|
3329
3337
|
|
|
3330
3338
|
|
|
3331
3339
|
|
|
3340
|
+
|
|
3341
|
+
|
|
3332
3342
|
|
|
3333
3343
|
constructor({
|
|
3334
3344
|
answered,
|
|
@@ -3342,6 +3352,8 @@ class CallSession {
|
|
|
3342
3352
|
paused,
|
|
3343
3353
|
ringing,
|
|
3344
3354
|
startTime,
|
|
3355
|
+
creationTime,
|
|
3356
|
+
endTime,
|
|
3345
3357
|
cameraEnabled,
|
|
3346
3358
|
dialedExtension,
|
|
3347
3359
|
sipCallId,
|
|
@@ -3354,12 +3366,16 @@ class CallSession {
|
|
|
3354
3366
|
recording,
|
|
3355
3367
|
recordingPaused,
|
|
3356
3368
|
videoRemotelyDowngraded,
|
|
3369
|
+
sipSession,
|
|
3370
|
+
answerTime,
|
|
3357
3371
|
} ) {
|
|
3358
3372
|
this.callId = callId;
|
|
3359
3373
|
this.sipCallId = sipCallId;
|
|
3360
3374
|
this.displayName = displayName;
|
|
3361
3375
|
this.number = number;
|
|
3376
|
+
this.creationTime = creationTime;
|
|
3362
3377
|
this.startTime = startTime;
|
|
3378
|
+
this.endTime = endTime;
|
|
3363
3379
|
this.isCaller = isCaller;
|
|
3364
3380
|
this.answered = answered;
|
|
3365
3381
|
this.answeredBySystem = answeredBySystem;
|
|
@@ -3378,6 +3394,8 @@ class CallSession {
|
|
|
3378
3394
|
this.recording = recording || false;
|
|
3379
3395
|
this.recordingPaused = recordingPaused || false;
|
|
3380
3396
|
this.videoRemotelyDowngraded = videoRemotelyDowngraded;
|
|
3397
|
+
this.sipSession = sipSession;
|
|
3398
|
+
this.answerTime = answerTime || this.answerTime;
|
|
3381
3399
|
|
|
3382
3400
|
// Useful to compare instead of instanceof with minified code
|
|
3383
3401
|
this.type = 'CallSession';
|
|
@@ -3408,7 +3426,7 @@ class CallSession {
|
|
|
3408
3426
|
}
|
|
3409
3427
|
|
|
3410
3428
|
answer() {
|
|
3411
|
-
this.
|
|
3429
|
+
this.answerTime = new Date();
|
|
3412
3430
|
}
|
|
3413
3431
|
|
|
3414
3432
|
systemAnswer() {
|
|
@@ -3564,6 +3582,15 @@ class CallSession {
|
|
|
3564
3582
|
return newFrom(callSession, CallSession);
|
|
3565
3583
|
}
|
|
3566
3584
|
|
|
3585
|
+
// Retro-compatibility: `answered` was a boolean before. We can reproduce the behaviour with a getter/setter
|
|
3586
|
+
set answered(value ) {
|
|
3587
|
+
this.answerTime = value ? new Date() : null;
|
|
3588
|
+
}
|
|
3589
|
+
|
|
3590
|
+
get answered() {
|
|
3591
|
+
return !!this.answerTime;
|
|
3592
|
+
}
|
|
3593
|
+
|
|
3567
3594
|
static parseCall(call ) {
|
|
3568
3595
|
return new CallSession({
|
|
3569
3596
|
callId: call.id,
|
|
@@ -6062,11 +6089,16 @@ class WazoSessionDescriptionHandler extends SessionDescriptionHandler {
|
|
|
6062
6089
|
|
|
6063
6090
|
// $FlowFixMe
|
|
6064
6091
|
setRemoteSessionDescription(sessionDescription ) {
|
|
6065
|
-
|
|
6092
|
+
try {
|
|
6093
|
+
const result = super.setRemoteSessionDescription(sessionDescription);
|
|
6066
6094
|
|
|
6067
|
-
|
|
6095
|
+
this.eventEmitter.emit('setDescription', sessionDescription);
|
|
6068
6096
|
|
|
6069
|
-
|
|
6097
|
+
return result;
|
|
6098
|
+
} catch (error) {
|
|
6099
|
+
this.logger.error('SessionDescriptionHandler.setRemoteSessionDescription error', error);
|
|
6100
|
+
throw error;
|
|
6101
|
+
}
|
|
6070
6102
|
}
|
|
6071
6103
|
|
|
6072
6104
|
// Overridden to avoid to fix ice-candidates missing in the SDP in react-native and chrome canary.
|
|
@@ -6605,6 +6637,7 @@ const MAX_REGISTER_TRIES = 10;
|
|
|
6605
6637
|
|
|
6606
6638
|
|
|
6607
6639
|
|
|
6640
|
+
|
|
6608
6641
|
|
|
6609
6642
|
|
|
6610
6643
|
|
|
@@ -8221,6 +8254,13 @@ class WebRTCClient extends Emitter {
|
|
|
8221
8254
|
}
|
|
8222
8255
|
|
|
8223
8256
|
_createWebRTCConfiguration(configOverrides = {}) {
|
|
8257
|
+
let { host } = this.config;
|
|
8258
|
+
let port = this.config.port || 443;
|
|
8259
|
+
|
|
8260
|
+
if (this.config.websocketSip) {
|
|
8261
|
+
[host, port = 443] = this.config.websocketSip.split(':');
|
|
8262
|
+
}
|
|
8263
|
+
|
|
8224
8264
|
const config = {
|
|
8225
8265
|
authorizationUsername: this.config.authorizationUser,
|
|
8226
8266
|
authorizationPassword: this.config.password,
|
|
@@ -8256,7 +8296,7 @@ class WebRTCClient extends Emitter {
|
|
|
8256
8296
|
},
|
|
8257
8297
|
transportOptions: {
|
|
8258
8298
|
traceSip: configOverrides.traceSip || false,
|
|
8259
|
-
wsServers: `wss://${
|
|
8299
|
+
wsServers: `wss://${host}:${port}/api/asterisk/ws`,
|
|
8260
8300
|
},
|
|
8261
8301
|
sessionDescriptionHandlerFactoryOptions: {
|
|
8262
8302
|
modifiers: [replaceLocalIpModifier],
|
|
@@ -8718,6 +8758,7 @@ const ON_CAMERA_DISABLED = 'onCameraDisabled';
|
|
|
8718
8758
|
const ON_CAMERA_RESUMED = 'onCameraResumed';
|
|
8719
8759
|
const ON_CALL_CANCELED = 'onCallCanceled';
|
|
8720
8760
|
const ON_CALL_FAILED = 'onCallFailed';
|
|
8761
|
+
const ON_CALL_REJECTED = 'onCallRejected';
|
|
8721
8762
|
const ON_CALL_ENDED = 'onCallEnded';
|
|
8722
8763
|
const ON_CALL_ENDING = 'onCallEnding';
|
|
8723
8764
|
const ON_MESSAGE = 'onMessage';
|
|
@@ -8762,6 +8803,7 @@ const events = [
|
|
|
8762
8803
|
ON_CAMERA_DISABLED,
|
|
8763
8804
|
ON_CALL_FAILED,
|
|
8764
8805
|
ON_CALL_ENDED,
|
|
8806
|
+
ON_CALL_REJECTED,
|
|
8765
8807
|
ON_MESSAGE,
|
|
8766
8808
|
ON_REINVITE,
|
|
8767
8809
|
ON_TRACK,
|
|
@@ -9118,6 +9160,7 @@ class WebRTCPhone extends Emitter {
|
|
|
9118
9160
|
|
|
9119
9161
|
// Should be called before `_onCallTerminated` or the callCount will not decrement...
|
|
9120
9162
|
const callSession = this._createCallSession(sipSession);
|
|
9163
|
+
callSession.endTime = new Date();
|
|
9121
9164
|
const wasCurrentSession = this._onCallTerminated(sipSession);
|
|
9122
9165
|
|
|
9123
9166
|
return this.eventEmitter.emit(ON_CALL_ENDED, callSession, wasCurrentSession);
|
|
@@ -9313,6 +9356,7 @@ class WebRTCPhone extends Emitter {
|
|
|
9313
9356
|
this.removeIncomingSessions(sipSessionId);
|
|
9314
9357
|
}
|
|
9315
9358
|
|
|
9359
|
+
callSession.answerTime = new Date();
|
|
9316
9360
|
this.eventEmitter.emit(ON_CALL_ACCEPTED, callSession, cameraEnabled);
|
|
9317
9361
|
|
|
9318
9362
|
return callSession;
|
|
@@ -9370,6 +9414,7 @@ class WebRTCPhone extends Emitter {
|
|
|
9370
9414
|
_onCallTerminated(sipSession ) {
|
|
9371
9415
|
logger$7.info('WebRTC phone - on call terminated', { sipId: sipSession.id });
|
|
9372
9416
|
|
|
9417
|
+
const sipSessionId = this.getSipSessionId(sipSession);
|
|
9373
9418
|
const callSession = this._createCallSession(sipSession);
|
|
9374
9419
|
const isCurrentSession = this.isCurrentCallSipSession(callSession);
|
|
9375
9420
|
const isCurrentIncomingCall = callSession.is(this.getIncomingCallSession());
|
|
@@ -9387,7 +9432,6 @@ class WebRTCPhone extends Emitter {
|
|
|
9387
9432
|
}, 5);
|
|
9388
9433
|
}
|
|
9389
9434
|
|
|
9390
|
-
const sipSessionId = this.getSipSessionId(sipSession);
|
|
9391
9435
|
if (sipSessionId) {
|
|
9392
9436
|
this.removeIncomingSessions(sipSessionId);
|
|
9393
9437
|
}
|
|
@@ -9528,6 +9572,7 @@ class WebRTCPhone extends Emitter {
|
|
|
9528
9572
|
}
|
|
9529
9573
|
|
|
9530
9574
|
this.shouldSendReinvite = false;
|
|
9575
|
+
callSession.answerTime = new Date();
|
|
9531
9576
|
this.acceptedSessions[callSession.getId()] = true;
|
|
9532
9577
|
|
|
9533
9578
|
this.eventEmitter.emit(ON_CALL_ANSWERED, callSession);
|
|
@@ -9837,6 +9882,7 @@ class WebRTCPhone extends Emitter {
|
|
|
9837
9882
|
return Promise.resolve(null);
|
|
9838
9883
|
}
|
|
9839
9884
|
const callSession = this._createOutgoingCallSession(sipSession, cameraEnabled || false);
|
|
9885
|
+
callSession.creationTime = new Date();
|
|
9840
9886
|
|
|
9841
9887
|
this.eventEmitter.emit(ON_PLAY_PROGRESS_SOUND, this.audioOutputDeviceId, this.audioOutputVolume);
|
|
9842
9888
|
|
|
@@ -10032,8 +10078,12 @@ class WebRTCPhone extends Emitter {
|
|
|
10032
10078
|
}
|
|
10033
10079
|
|
|
10034
10080
|
const sessionId = this.incomingSessions[0];
|
|
10081
|
+
const sipSession = this.client.getSipSession(sessionId);
|
|
10082
|
+
if (!sipSession) {
|
|
10083
|
+
return null;
|
|
10084
|
+
}
|
|
10035
10085
|
|
|
10036
|
-
return this._createCallSession(
|
|
10086
|
+
return this._createCallSession(sipSession);
|
|
10037
10087
|
}
|
|
10038
10088
|
|
|
10039
10089
|
sendMessage(sipSession = null, body , contentType = 'text/plain') {
|
|
@@ -10111,6 +10161,7 @@ class WebRTCPhone extends Emitter {
|
|
|
10111
10161
|
callSession);
|
|
10112
10162
|
}
|
|
10113
10163
|
|
|
10164
|
+
callSession.creationTime = new Date();
|
|
10114
10165
|
this.eventEmitter.emit(ON_CALL_INCOMING, callSession, wantsToDoVideo);
|
|
10115
10166
|
});
|
|
10116
10167
|
|
|
@@ -10150,6 +10201,13 @@ class WebRTCPhone extends Emitter {
|
|
|
10150
10201
|
this.eventEmitter.emit(ON_CALL_ERROR, e);
|
|
10151
10202
|
});
|
|
10152
10203
|
|
|
10204
|
+
this.client.on(this.client.REJECTED, session => {
|
|
10205
|
+
logger$7.info('WebRTC call rejected', session.id);
|
|
10206
|
+
const callSession = this._createCallSession(session);
|
|
10207
|
+
callSession.endTime = new Date();
|
|
10208
|
+
this.eventEmitter.emit(ON_CALL_REJECTED, callSession);
|
|
10209
|
+
});
|
|
10210
|
+
|
|
10153
10211
|
this.client.on(this.client.UNREGISTERED, () => {
|
|
10154
10212
|
logger$7.info('WebRTC unregistered');
|
|
10155
10213
|
this.eventEmitter.emit(ON_UNREGISTERED);
|
|
@@ -10362,6 +10420,7 @@ class WebRTCPhone extends Emitter {
|
|
|
10362
10420
|
const number = identity ? identity.uri._normal.user : null;
|
|
10363
10421
|
const { state } = sipSession || {};
|
|
10364
10422
|
const sessionId = this.getSipSessionId(sipSession);
|
|
10423
|
+
fromSession = fromSession || this.callSessions[sessionId];
|
|
10365
10424
|
|
|
10366
10425
|
const callSession = new CallSession({
|
|
10367
10426
|
callId: fromSession && fromSession.callId,
|
|
@@ -10369,6 +10428,8 @@ class WebRTCPhone extends Emitter {
|
|
|
10369
10428
|
sipStatus: state,
|
|
10370
10429
|
displayName: identity ? identity.displayName || number : number,
|
|
10371
10430
|
startTime: fromSession ? fromSession.startTime : new Date(),
|
|
10431
|
+
creationTime: fromSession ? fromSession.creationTime : null,
|
|
10432
|
+
endTime: fromSession ? fromSession.endTime : null,
|
|
10372
10433
|
answered: state === SessionState.Established,
|
|
10373
10434
|
paused: this.client.isCallHeld(sipSession),
|
|
10374
10435
|
isCaller: 'incoming' in extra ? !extra.incoming : false,
|
|
@@ -10379,6 +10440,7 @@ class WebRTCPhone extends Emitter {
|
|
|
10379
10440
|
videoMuted: fromSession ? fromSession.isVideoMuted() : false,
|
|
10380
10441
|
recording: fromSession ? fromSession.isRecording() : false,
|
|
10381
10442
|
recordingPaused: false, // @TODO
|
|
10443
|
+
sipSession,
|
|
10382
10444
|
...extra,
|
|
10383
10445
|
});
|
|
10384
10446
|
|
|
@@ -10407,6 +10469,7 @@ var PHONE_EVENTS = /*#__PURE__*/Object.freeze({
|
|
|
10407
10469
|
ON_CAMERA_RESUMED: ON_CAMERA_RESUMED,
|
|
10408
10470
|
ON_CALL_CANCELED: ON_CALL_CANCELED,
|
|
10409
10471
|
ON_CALL_FAILED: ON_CALL_FAILED,
|
|
10472
|
+
ON_CALL_REJECTED: ON_CALL_REJECTED,
|
|
10410
10473
|
ON_CALL_ENDED: ON_CALL_ENDED,
|
|
10411
10474
|
ON_CALL_ENDING: ON_CALL_ENDING,
|
|
10412
10475
|
ON_MESSAGE: ON_MESSAGE,
|
|
@@ -10436,6 +10499,14 @@ var PHONE_EVENTS = /*#__PURE__*/Object.freeze({
|
|
|
10436
10499
|
'default': WebRTCPhone
|
|
10437
10500
|
});
|
|
10438
10501
|
|
|
10502
|
+
/* */
|
|
10503
|
+
class SFUNotAvailableError extends Error {
|
|
10504
|
+
constructor(message = 'Sorry your user is not configured to support video conference') {
|
|
10505
|
+
super(message);
|
|
10506
|
+
this.name = 'SFUNotAvailableError';
|
|
10507
|
+
}
|
|
10508
|
+
}
|
|
10509
|
+
|
|
10439
10510
|
//
|
|
10440
10511
|
|
|
10441
10512
|
const logger$6 = IssueReporter$1.loggerFor('simple-phone');
|
|
@@ -10820,7 +10891,7 @@ class Phone extends Emitter {
|
|
|
10820
10891
|
|
|
10821
10892
|
checkSfu() {
|
|
10822
10893
|
if (!this.hasSfu()) {
|
|
10823
|
-
throw new
|
|
10894
|
+
throw new SFUNotAvailableError();
|
|
10824
10895
|
}
|
|
10825
10896
|
}
|
|
10826
10897
|
|
|
@@ -13733,6 +13804,7 @@ const Wazo = {
|
|
|
13733
13804
|
InvalidSubscription,
|
|
13734
13805
|
InvalidAuthorization,
|
|
13735
13806
|
CanceledCallError,
|
|
13807
|
+
SFUNotAvailableError,
|
|
13736
13808
|
};
|
|
13737
13809
|
|
|
13738
13810
|
if (window) {
|