@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/lib/simple/Auth.js
CHANGED
|
@@ -1963,7 +1963,7 @@ const logger$c = IssueReporter$1 ? IssueReporter$1.loggerFor('api') : console;
|
|
|
1963
1963
|
|
|
1964
1964
|
// Use a function here to be able to mock it in tests
|
|
1965
1965
|
const realFetch = () => {
|
|
1966
|
-
if (typeof document !== 'undefined') {
|
|
1966
|
+
if (typeof document !== 'undefined' && window.fetch) {
|
|
1967
1967
|
// Browser
|
|
1968
1968
|
return window.fetch;
|
|
1969
1969
|
}
|
|
@@ -3260,13 +3260,16 @@ var updateFrom = (instance , from ) => {
|
|
|
3260
3260
|
|
|
3261
3261
|
|
|
3262
3262
|
|
|
3263
|
+
|
|
3263
3264
|
|
|
3264
3265
|
|
|
3265
3266
|
|
|
3266
3267
|
|
|
3267
3268
|
|
|
3269
|
+
|
|
3268
3270
|
|
|
3269
3271
|
|
|
3272
|
+
|
|
3270
3273
|
|
|
3271
3274
|
|
|
3272
3275
|
|
|
@@ -3283,6 +3286,7 @@ var updateFrom = (instance , from ) => {
|
|
|
3283
3286
|
|
|
3284
3287
|
|
|
3285
3288
|
|
|
3289
|
+
|
|
3286
3290
|
|
|
3287
3291
|
|
|
3288
3292
|
class CallSession {
|
|
@@ -3302,10 +3306,14 @@ class CallSession {
|
|
|
3302
3306
|
|
|
3303
3307
|
|
|
3304
3308
|
|
|
3305
|
-
|
|
3309
|
+
|
|
3310
|
+
|
|
3311
|
+
// = creationTime
|
|
3306
3312
|
|
|
3307
3313
|
|
|
3308
3314
|
|
|
3315
|
+
|
|
3316
|
+
|
|
3309
3317
|
|
|
3310
3318
|
|
|
3311
3319
|
|
|
@@ -3341,6 +3349,8 @@ class CallSession {
|
|
|
3341
3349
|
|
|
3342
3350
|
|
|
3343
3351
|
|
|
3352
|
+
|
|
3353
|
+
|
|
3344
3354
|
|
|
3345
3355
|
constructor({
|
|
3346
3356
|
answered,
|
|
@@ -3354,6 +3364,8 @@ class CallSession {
|
|
|
3354
3364
|
paused,
|
|
3355
3365
|
ringing,
|
|
3356
3366
|
startTime,
|
|
3367
|
+
creationTime,
|
|
3368
|
+
endTime,
|
|
3357
3369
|
cameraEnabled,
|
|
3358
3370
|
dialedExtension,
|
|
3359
3371
|
sipCallId,
|
|
@@ -3366,12 +3378,16 @@ class CallSession {
|
|
|
3366
3378
|
recording,
|
|
3367
3379
|
recordingPaused,
|
|
3368
3380
|
videoRemotelyDowngraded,
|
|
3381
|
+
sipSession,
|
|
3382
|
+
answerTime,
|
|
3369
3383
|
} ) {
|
|
3370
3384
|
this.callId = callId;
|
|
3371
3385
|
this.sipCallId = sipCallId;
|
|
3372
3386
|
this.displayName = displayName;
|
|
3373
3387
|
this.number = number;
|
|
3388
|
+
this.creationTime = creationTime;
|
|
3374
3389
|
this.startTime = startTime;
|
|
3390
|
+
this.endTime = endTime;
|
|
3375
3391
|
this.isCaller = isCaller;
|
|
3376
3392
|
this.answered = answered;
|
|
3377
3393
|
this.answeredBySystem = answeredBySystem;
|
|
@@ -3390,6 +3406,8 @@ class CallSession {
|
|
|
3390
3406
|
this.recording = recording || false;
|
|
3391
3407
|
this.recordingPaused = recordingPaused || false;
|
|
3392
3408
|
this.videoRemotelyDowngraded = videoRemotelyDowngraded;
|
|
3409
|
+
this.sipSession = sipSession;
|
|
3410
|
+
this.answerTime = answerTime || this.answerTime;
|
|
3393
3411
|
|
|
3394
3412
|
// Useful to compare instead of instanceof with minified code
|
|
3395
3413
|
this.type = 'CallSession';
|
|
@@ -3420,7 +3438,7 @@ class CallSession {
|
|
|
3420
3438
|
}
|
|
3421
3439
|
|
|
3422
3440
|
answer() {
|
|
3423
|
-
this.
|
|
3441
|
+
this.answerTime = new Date();
|
|
3424
3442
|
}
|
|
3425
3443
|
|
|
3426
3444
|
systemAnswer() {
|
|
@@ -3576,6 +3594,15 @@ class CallSession {
|
|
|
3576
3594
|
return newFrom(callSession, CallSession);
|
|
3577
3595
|
}
|
|
3578
3596
|
|
|
3597
|
+
// Retro-compatibility: `answered` was a boolean before. We can reproduce the behaviour with a getter/setter
|
|
3598
|
+
set answered(value ) {
|
|
3599
|
+
this.answerTime = value ? new Date() : null;
|
|
3600
|
+
}
|
|
3601
|
+
|
|
3602
|
+
get answered() {
|
|
3603
|
+
return !!this.answerTime;
|
|
3604
|
+
}
|
|
3605
|
+
|
|
3579
3606
|
static parseCall(call ) {
|
|
3580
3607
|
return new CallSession({
|
|
3581
3608
|
callId: call.id,
|
|
@@ -5810,11 +5837,16 @@ class WazoSessionDescriptionHandler extends sessionDescriptionHandler.SessionDes
|
|
|
5810
5837
|
|
|
5811
5838
|
// $FlowFixMe
|
|
5812
5839
|
setRemoteSessionDescription(sessionDescription ) {
|
|
5813
|
-
|
|
5840
|
+
try {
|
|
5841
|
+
const result = super.setRemoteSessionDescription(sessionDescription);
|
|
5814
5842
|
|
|
5815
|
-
|
|
5843
|
+
this.eventEmitter.emit('setDescription', sessionDescription);
|
|
5816
5844
|
|
|
5817
|
-
|
|
5845
|
+
return result;
|
|
5846
|
+
} catch (error) {
|
|
5847
|
+
this.logger.error('SessionDescriptionHandler.setRemoteSessionDescription error', error);
|
|
5848
|
+
throw error;
|
|
5849
|
+
}
|
|
5818
5850
|
}
|
|
5819
5851
|
|
|
5820
5852
|
// Overridden to avoid to fix ice-candidates missing in the SDP in react-native and chrome canary.
|
|
@@ -6353,6 +6385,7 @@ const MAX_REGISTER_TRIES = 10;
|
|
|
6353
6385
|
|
|
6354
6386
|
|
|
6355
6387
|
|
|
6388
|
+
|
|
6356
6389
|
|
|
6357
6390
|
|
|
6358
6391
|
|
|
@@ -7969,6 +8002,13 @@ class WebRTCClient extends Emitter {
|
|
|
7969
8002
|
}
|
|
7970
8003
|
|
|
7971
8004
|
_createWebRTCConfiguration(configOverrides = {}) {
|
|
8005
|
+
let { host } = this.config;
|
|
8006
|
+
let port = this.config.port || 443;
|
|
8007
|
+
|
|
8008
|
+
if (this.config.websocketSip) {
|
|
8009
|
+
[host, port = 443] = this.config.websocketSip.split(':');
|
|
8010
|
+
}
|
|
8011
|
+
|
|
7972
8012
|
const config = {
|
|
7973
8013
|
authorizationUsername: this.config.authorizationUser,
|
|
7974
8014
|
authorizationPassword: this.config.password,
|
|
@@ -8004,7 +8044,7 @@ class WebRTCClient extends Emitter {
|
|
|
8004
8044
|
},
|
|
8005
8045
|
transportOptions: {
|
|
8006
8046
|
traceSip: configOverrides.traceSip || false,
|
|
8007
|
-
wsServers: `wss://${
|
|
8047
|
+
wsServers: `wss://${host}:${port}/api/asterisk/ws`,
|
|
8008
8048
|
},
|
|
8009
8049
|
sessionDescriptionHandlerFactoryOptions: {
|
|
8010
8050
|
modifiers: [replaceLocalIpModifier],
|
|
@@ -8466,6 +8506,7 @@ const ON_CAMERA_DISABLED = 'onCameraDisabled';
|
|
|
8466
8506
|
const ON_CAMERA_RESUMED = 'onCameraResumed';
|
|
8467
8507
|
const ON_CALL_CANCELED = 'onCallCanceled';
|
|
8468
8508
|
const ON_CALL_FAILED = 'onCallFailed';
|
|
8509
|
+
const ON_CALL_REJECTED = 'onCallRejected';
|
|
8469
8510
|
const ON_CALL_ENDED = 'onCallEnded';
|
|
8470
8511
|
const ON_CALL_ENDING = 'onCallEnding';
|
|
8471
8512
|
const ON_MESSAGE = 'onMessage';
|
|
@@ -8510,6 +8551,7 @@ const events = [
|
|
|
8510
8551
|
ON_CAMERA_DISABLED,
|
|
8511
8552
|
ON_CALL_FAILED,
|
|
8512
8553
|
ON_CALL_ENDED,
|
|
8554
|
+
ON_CALL_REJECTED,
|
|
8513
8555
|
ON_MESSAGE,
|
|
8514
8556
|
ON_REINVITE,
|
|
8515
8557
|
ON_TRACK,
|
|
@@ -8866,6 +8908,7 @@ class WebRTCPhone extends Emitter {
|
|
|
8866
8908
|
|
|
8867
8909
|
// Should be called before `_onCallTerminated` or the callCount will not decrement...
|
|
8868
8910
|
const callSession = this._createCallSession(sipSession);
|
|
8911
|
+
callSession.endTime = new Date();
|
|
8869
8912
|
const wasCurrentSession = this._onCallTerminated(sipSession);
|
|
8870
8913
|
|
|
8871
8914
|
return this.eventEmitter.emit(ON_CALL_ENDED, callSession, wasCurrentSession);
|
|
@@ -9061,6 +9104,7 @@ class WebRTCPhone extends Emitter {
|
|
|
9061
9104
|
this.removeIncomingSessions(sipSessionId);
|
|
9062
9105
|
}
|
|
9063
9106
|
|
|
9107
|
+
callSession.answerTime = new Date();
|
|
9064
9108
|
this.eventEmitter.emit(ON_CALL_ACCEPTED, callSession, cameraEnabled);
|
|
9065
9109
|
|
|
9066
9110
|
return callSession;
|
|
@@ -9118,6 +9162,7 @@ class WebRTCPhone extends Emitter {
|
|
|
9118
9162
|
_onCallTerminated(sipSession ) {
|
|
9119
9163
|
logger$8.info('WebRTC phone - on call terminated', { sipId: sipSession.id });
|
|
9120
9164
|
|
|
9165
|
+
const sipSessionId = this.getSipSessionId(sipSession);
|
|
9121
9166
|
const callSession = this._createCallSession(sipSession);
|
|
9122
9167
|
const isCurrentSession = this.isCurrentCallSipSession(callSession);
|
|
9123
9168
|
const isCurrentIncomingCall = callSession.is(this.getIncomingCallSession());
|
|
@@ -9135,7 +9180,6 @@ class WebRTCPhone extends Emitter {
|
|
|
9135
9180
|
}, 5);
|
|
9136
9181
|
}
|
|
9137
9182
|
|
|
9138
|
-
const sipSessionId = this.getSipSessionId(sipSession);
|
|
9139
9183
|
if (sipSessionId) {
|
|
9140
9184
|
this.removeIncomingSessions(sipSessionId);
|
|
9141
9185
|
}
|
|
@@ -9276,6 +9320,7 @@ class WebRTCPhone extends Emitter {
|
|
|
9276
9320
|
}
|
|
9277
9321
|
|
|
9278
9322
|
this.shouldSendReinvite = false;
|
|
9323
|
+
callSession.answerTime = new Date();
|
|
9279
9324
|
this.acceptedSessions[callSession.getId()] = true;
|
|
9280
9325
|
|
|
9281
9326
|
this.eventEmitter.emit(ON_CALL_ANSWERED, callSession);
|
|
@@ -9585,6 +9630,7 @@ class WebRTCPhone extends Emitter {
|
|
|
9585
9630
|
return Promise.resolve(null);
|
|
9586
9631
|
}
|
|
9587
9632
|
const callSession = this._createOutgoingCallSession(sipSession, cameraEnabled || false);
|
|
9633
|
+
callSession.creationTime = new Date();
|
|
9588
9634
|
|
|
9589
9635
|
this.eventEmitter.emit(ON_PLAY_PROGRESS_SOUND, this.audioOutputDeviceId, this.audioOutputVolume);
|
|
9590
9636
|
|
|
@@ -9780,8 +9826,12 @@ class WebRTCPhone extends Emitter {
|
|
|
9780
9826
|
}
|
|
9781
9827
|
|
|
9782
9828
|
const sessionId = this.incomingSessions[0];
|
|
9829
|
+
const sipSession = this.client.getSipSession(sessionId);
|
|
9830
|
+
if (!sipSession) {
|
|
9831
|
+
return null;
|
|
9832
|
+
}
|
|
9783
9833
|
|
|
9784
|
-
return this._createCallSession(
|
|
9834
|
+
return this._createCallSession(sipSession);
|
|
9785
9835
|
}
|
|
9786
9836
|
|
|
9787
9837
|
sendMessage(sipSession = null, body , contentType = 'text/plain') {
|
|
@@ -9859,6 +9909,7 @@ class WebRTCPhone extends Emitter {
|
|
|
9859
9909
|
callSession);
|
|
9860
9910
|
}
|
|
9861
9911
|
|
|
9912
|
+
callSession.creationTime = new Date();
|
|
9862
9913
|
this.eventEmitter.emit(ON_CALL_INCOMING, callSession, wantsToDoVideo);
|
|
9863
9914
|
});
|
|
9864
9915
|
|
|
@@ -9898,6 +9949,13 @@ class WebRTCPhone extends Emitter {
|
|
|
9898
9949
|
this.eventEmitter.emit(ON_CALL_ERROR, e);
|
|
9899
9950
|
});
|
|
9900
9951
|
|
|
9952
|
+
this.client.on(this.client.REJECTED, session => {
|
|
9953
|
+
logger$8.info('WebRTC call rejected', session.id);
|
|
9954
|
+
const callSession = this._createCallSession(session);
|
|
9955
|
+
callSession.endTime = new Date();
|
|
9956
|
+
this.eventEmitter.emit(ON_CALL_REJECTED, callSession);
|
|
9957
|
+
});
|
|
9958
|
+
|
|
9901
9959
|
this.client.on(this.client.UNREGISTERED, () => {
|
|
9902
9960
|
logger$8.info('WebRTC unregistered');
|
|
9903
9961
|
this.eventEmitter.emit(ON_UNREGISTERED);
|
|
@@ -10110,6 +10168,7 @@ class WebRTCPhone extends Emitter {
|
|
|
10110
10168
|
const number = identity ? identity.uri._normal.user : null;
|
|
10111
10169
|
const { state } = sipSession || {};
|
|
10112
10170
|
const sessionId = this.getSipSessionId(sipSession);
|
|
10171
|
+
fromSession = fromSession || this.callSessions[sessionId];
|
|
10113
10172
|
|
|
10114
10173
|
const callSession = new CallSession({
|
|
10115
10174
|
callId: fromSession && fromSession.callId,
|
|
@@ -10117,6 +10176,8 @@ class WebRTCPhone extends Emitter {
|
|
|
10117
10176
|
sipStatus: state,
|
|
10118
10177
|
displayName: identity ? identity.displayName || number : number,
|
|
10119
10178
|
startTime: fromSession ? fromSession.startTime : new Date(),
|
|
10179
|
+
creationTime: fromSession ? fromSession.creationTime : null,
|
|
10180
|
+
endTime: fromSession ? fromSession.endTime : null,
|
|
10120
10181
|
answered: state === sessionState.SessionState.Established,
|
|
10121
10182
|
paused: this.client.isCallHeld(sipSession),
|
|
10122
10183
|
isCaller: 'incoming' in extra ? !extra.incoming : false,
|
|
@@ -10127,6 +10188,7 @@ class WebRTCPhone extends Emitter {
|
|
|
10127
10188
|
videoMuted: fromSession ? fromSession.isVideoMuted() : false,
|
|
10128
10189
|
recording: fromSession ? fromSession.isRecording() : false,
|
|
10129
10190
|
recordingPaused: false, // @TODO
|
|
10191
|
+
sipSession,
|
|
10130
10192
|
...extra,
|
|
10131
10193
|
});
|
|
10132
10194
|
|
|
@@ -10155,6 +10217,7 @@ var PHONE_EVENTS = /*#__PURE__*/Object.freeze({
|
|
|
10155
10217
|
ON_CAMERA_RESUMED: ON_CAMERA_RESUMED,
|
|
10156
10218
|
ON_CALL_CANCELED: ON_CALL_CANCELED,
|
|
10157
10219
|
ON_CALL_FAILED: ON_CALL_FAILED,
|
|
10220
|
+
ON_CALL_REJECTED: ON_CALL_REJECTED,
|
|
10158
10221
|
ON_CALL_ENDED: ON_CALL_ENDED,
|
|
10159
10222
|
ON_CALL_ENDING: ON_CALL_ENDING,
|
|
10160
10223
|
ON_MESSAGE: ON_MESSAGE,
|
|
@@ -10184,6 +10247,14 @@ var PHONE_EVENTS = /*#__PURE__*/Object.freeze({
|
|
|
10184
10247
|
'default': WebRTCPhone
|
|
10185
10248
|
});
|
|
10186
10249
|
|
|
10250
|
+
/* */
|
|
10251
|
+
class SFUNotAvailableError extends Error {
|
|
10252
|
+
constructor(message = 'Sorry your user is not configured to support video conference') {
|
|
10253
|
+
super(message);
|
|
10254
|
+
this.name = 'SFUNotAvailableError';
|
|
10255
|
+
}
|
|
10256
|
+
}
|
|
10257
|
+
|
|
10187
10258
|
//
|
|
10188
10259
|
|
|
10189
10260
|
const logger$7 = IssueReporter$1.loggerFor('simple-phone');
|
|
@@ -10568,7 +10639,7 @@ class Phone extends Emitter {
|
|
|
10568
10639
|
|
|
10569
10640
|
checkSfu() {
|
|
10570
10641
|
if (!this.hasSfu()) {
|
|
10571
|
-
throw new
|
|
10642
|
+
throw new SFUNotAvailableError();
|
|
10572
10643
|
}
|
|
10573
10644
|
}
|
|
10574
10645
|
|
|
@@ -13481,6 +13552,7 @@ const Wazo = {
|
|
|
13481
13552
|
InvalidSubscription,
|
|
13482
13553
|
InvalidAuthorization,
|
|
13483
13554
|
CanceledCallError,
|
|
13555
|
+
SFUNotAvailableError,
|
|
13484
13556
|
};
|
|
13485
13557
|
|
|
13486
13558
|
if (window) {
|
|
@@ -1961,7 +1961,7 @@ const logger$c = IssueReporter$1 ? IssueReporter$1.loggerFor('api') : console;
|
|
|
1961
1961
|
|
|
1962
1962
|
// Use a function here to be able to mock it in tests
|
|
1963
1963
|
const realFetch = () => {
|
|
1964
|
-
if (typeof document !== 'undefined') {
|
|
1964
|
+
if (typeof document !== 'undefined' && window.fetch) {
|
|
1965
1965
|
// Browser
|
|
1966
1966
|
return window.fetch;
|
|
1967
1967
|
}
|
|
@@ -3258,13 +3258,16 @@ var updateFrom = (instance , from ) => {
|
|
|
3258
3258
|
|
|
3259
3259
|
|
|
3260
3260
|
|
|
3261
|
+
|
|
3261
3262
|
|
|
3262
3263
|
|
|
3263
3264
|
|
|
3264
3265
|
|
|
3265
3266
|
|
|
3267
|
+
|
|
3266
3268
|
|
|
3267
3269
|
|
|
3270
|
+
|
|
3268
3271
|
|
|
3269
3272
|
|
|
3270
3273
|
|
|
@@ -3281,6 +3284,7 @@ var updateFrom = (instance , from ) => {
|
|
|
3281
3284
|
|
|
3282
3285
|
|
|
3283
3286
|
|
|
3287
|
+
|
|
3284
3288
|
|
|
3285
3289
|
|
|
3286
3290
|
class CallSession {
|
|
@@ -3300,10 +3304,14 @@ class CallSession {
|
|
|
3300
3304
|
|
|
3301
3305
|
|
|
3302
3306
|
|
|
3303
|
-
|
|
3307
|
+
|
|
3308
|
+
|
|
3309
|
+
// = creationTime
|
|
3304
3310
|
|
|
3305
3311
|
|
|
3306
3312
|
|
|
3313
|
+
|
|
3314
|
+
|
|
3307
3315
|
|
|
3308
3316
|
|
|
3309
3317
|
|
|
@@ -3339,6 +3347,8 @@ class CallSession {
|
|
|
3339
3347
|
|
|
3340
3348
|
|
|
3341
3349
|
|
|
3350
|
+
|
|
3351
|
+
|
|
3342
3352
|
|
|
3343
3353
|
constructor({
|
|
3344
3354
|
answered,
|
|
@@ -3352,6 +3362,8 @@ class CallSession {
|
|
|
3352
3362
|
paused,
|
|
3353
3363
|
ringing,
|
|
3354
3364
|
startTime,
|
|
3365
|
+
creationTime,
|
|
3366
|
+
endTime,
|
|
3355
3367
|
cameraEnabled,
|
|
3356
3368
|
dialedExtension,
|
|
3357
3369
|
sipCallId,
|
|
@@ -3364,12 +3376,16 @@ class CallSession {
|
|
|
3364
3376
|
recording,
|
|
3365
3377
|
recordingPaused,
|
|
3366
3378
|
videoRemotelyDowngraded,
|
|
3379
|
+
sipSession,
|
|
3380
|
+
answerTime,
|
|
3367
3381
|
} ) {
|
|
3368
3382
|
this.callId = callId;
|
|
3369
3383
|
this.sipCallId = sipCallId;
|
|
3370
3384
|
this.displayName = displayName;
|
|
3371
3385
|
this.number = number;
|
|
3386
|
+
this.creationTime = creationTime;
|
|
3372
3387
|
this.startTime = startTime;
|
|
3388
|
+
this.endTime = endTime;
|
|
3373
3389
|
this.isCaller = isCaller;
|
|
3374
3390
|
this.answered = answered;
|
|
3375
3391
|
this.answeredBySystem = answeredBySystem;
|
|
@@ -3388,6 +3404,8 @@ class CallSession {
|
|
|
3388
3404
|
this.recording = recording || false;
|
|
3389
3405
|
this.recordingPaused = recordingPaused || false;
|
|
3390
3406
|
this.videoRemotelyDowngraded = videoRemotelyDowngraded;
|
|
3407
|
+
this.sipSession = sipSession;
|
|
3408
|
+
this.answerTime = answerTime || this.answerTime;
|
|
3391
3409
|
|
|
3392
3410
|
// Useful to compare instead of instanceof with minified code
|
|
3393
3411
|
this.type = 'CallSession';
|
|
@@ -3418,7 +3436,7 @@ class CallSession {
|
|
|
3418
3436
|
}
|
|
3419
3437
|
|
|
3420
3438
|
answer() {
|
|
3421
|
-
this.
|
|
3439
|
+
this.answerTime = new Date();
|
|
3422
3440
|
}
|
|
3423
3441
|
|
|
3424
3442
|
systemAnswer() {
|
|
@@ -3574,6 +3592,15 @@ class CallSession {
|
|
|
3574
3592
|
return newFrom(callSession, CallSession);
|
|
3575
3593
|
}
|
|
3576
3594
|
|
|
3595
|
+
// Retro-compatibility: `answered` was a boolean before. We can reproduce the behaviour with a getter/setter
|
|
3596
|
+
set answered(value ) {
|
|
3597
|
+
this.answerTime = value ? new Date() : null;
|
|
3598
|
+
}
|
|
3599
|
+
|
|
3600
|
+
get answered() {
|
|
3601
|
+
return !!this.answerTime;
|
|
3602
|
+
}
|
|
3603
|
+
|
|
3577
3604
|
static parseCall(call ) {
|
|
3578
3605
|
return new CallSession({
|
|
3579
3606
|
callId: call.id,
|
|
@@ -5808,11 +5835,16 @@ class WazoSessionDescriptionHandler extends sessionDescriptionHandler.SessionDes
|
|
|
5808
5835
|
|
|
5809
5836
|
// $FlowFixMe
|
|
5810
5837
|
setRemoteSessionDescription(sessionDescription ) {
|
|
5811
|
-
|
|
5838
|
+
try {
|
|
5839
|
+
const result = super.setRemoteSessionDescription(sessionDescription);
|
|
5812
5840
|
|
|
5813
|
-
|
|
5841
|
+
this.eventEmitter.emit('setDescription', sessionDescription);
|
|
5814
5842
|
|
|
5815
|
-
|
|
5843
|
+
return result;
|
|
5844
|
+
} catch (error) {
|
|
5845
|
+
this.logger.error('SessionDescriptionHandler.setRemoteSessionDescription error', error);
|
|
5846
|
+
throw error;
|
|
5847
|
+
}
|
|
5816
5848
|
}
|
|
5817
5849
|
|
|
5818
5850
|
// Overridden to avoid to fix ice-candidates missing in the SDP in react-native and chrome canary.
|
|
@@ -6351,6 +6383,7 @@ const MAX_REGISTER_TRIES = 10;
|
|
|
6351
6383
|
|
|
6352
6384
|
|
|
6353
6385
|
|
|
6386
|
+
|
|
6354
6387
|
|
|
6355
6388
|
|
|
6356
6389
|
|
|
@@ -7967,6 +8000,13 @@ class WebRTCClient extends Emitter {
|
|
|
7967
8000
|
}
|
|
7968
8001
|
|
|
7969
8002
|
_createWebRTCConfiguration(configOverrides = {}) {
|
|
8003
|
+
let { host } = this.config;
|
|
8004
|
+
let port = this.config.port || 443;
|
|
8005
|
+
|
|
8006
|
+
if (this.config.websocketSip) {
|
|
8007
|
+
[host, port = 443] = this.config.websocketSip.split(':');
|
|
8008
|
+
}
|
|
8009
|
+
|
|
7970
8010
|
const config = {
|
|
7971
8011
|
authorizationUsername: this.config.authorizationUser,
|
|
7972
8012
|
authorizationPassword: this.config.password,
|
|
@@ -8002,7 +8042,7 @@ class WebRTCClient extends Emitter {
|
|
|
8002
8042
|
},
|
|
8003
8043
|
transportOptions: {
|
|
8004
8044
|
traceSip: configOverrides.traceSip || false,
|
|
8005
|
-
wsServers: `wss://${
|
|
8045
|
+
wsServers: `wss://${host}:${port}/api/asterisk/ws`,
|
|
8006
8046
|
},
|
|
8007
8047
|
sessionDescriptionHandlerFactoryOptions: {
|
|
8008
8048
|
modifiers: [replaceLocalIpModifier],
|
|
@@ -8464,6 +8504,7 @@ const ON_CAMERA_DISABLED = 'onCameraDisabled';
|
|
|
8464
8504
|
const ON_CAMERA_RESUMED = 'onCameraResumed';
|
|
8465
8505
|
const ON_CALL_CANCELED = 'onCallCanceled';
|
|
8466
8506
|
const ON_CALL_FAILED = 'onCallFailed';
|
|
8507
|
+
const ON_CALL_REJECTED = 'onCallRejected';
|
|
8467
8508
|
const ON_CALL_ENDED = 'onCallEnded';
|
|
8468
8509
|
const ON_CALL_ENDING = 'onCallEnding';
|
|
8469
8510
|
const ON_MESSAGE = 'onMessage';
|
|
@@ -8508,6 +8549,7 @@ const events = [
|
|
|
8508
8549
|
ON_CAMERA_DISABLED,
|
|
8509
8550
|
ON_CALL_FAILED,
|
|
8510
8551
|
ON_CALL_ENDED,
|
|
8552
|
+
ON_CALL_REJECTED,
|
|
8511
8553
|
ON_MESSAGE,
|
|
8512
8554
|
ON_REINVITE,
|
|
8513
8555
|
ON_TRACK,
|
|
@@ -8864,6 +8906,7 @@ class WebRTCPhone extends Emitter {
|
|
|
8864
8906
|
|
|
8865
8907
|
// Should be called before `_onCallTerminated` or the callCount will not decrement...
|
|
8866
8908
|
const callSession = this._createCallSession(sipSession);
|
|
8909
|
+
callSession.endTime = new Date();
|
|
8867
8910
|
const wasCurrentSession = this._onCallTerminated(sipSession);
|
|
8868
8911
|
|
|
8869
8912
|
return this.eventEmitter.emit(ON_CALL_ENDED, callSession, wasCurrentSession);
|
|
@@ -9059,6 +9102,7 @@ class WebRTCPhone extends Emitter {
|
|
|
9059
9102
|
this.removeIncomingSessions(sipSessionId);
|
|
9060
9103
|
}
|
|
9061
9104
|
|
|
9105
|
+
callSession.answerTime = new Date();
|
|
9062
9106
|
this.eventEmitter.emit(ON_CALL_ACCEPTED, callSession, cameraEnabled);
|
|
9063
9107
|
|
|
9064
9108
|
return callSession;
|
|
@@ -9116,6 +9160,7 @@ class WebRTCPhone extends Emitter {
|
|
|
9116
9160
|
_onCallTerminated(sipSession ) {
|
|
9117
9161
|
logger$8.info('WebRTC phone - on call terminated', { sipId: sipSession.id });
|
|
9118
9162
|
|
|
9163
|
+
const sipSessionId = this.getSipSessionId(sipSession);
|
|
9119
9164
|
const callSession = this._createCallSession(sipSession);
|
|
9120
9165
|
const isCurrentSession = this.isCurrentCallSipSession(callSession);
|
|
9121
9166
|
const isCurrentIncomingCall = callSession.is(this.getIncomingCallSession());
|
|
@@ -9133,7 +9178,6 @@ class WebRTCPhone extends Emitter {
|
|
|
9133
9178
|
}, 5);
|
|
9134
9179
|
}
|
|
9135
9180
|
|
|
9136
|
-
const sipSessionId = this.getSipSessionId(sipSession);
|
|
9137
9181
|
if (sipSessionId) {
|
|
9138
9182
|
this.removeIncomingSessions(sipSessionId);
|
|
9139
9183
|
}
|
|
@@ -9274,6 +9318,7 @@ class WebRTCPhone extends Emitter {
|
|
|
9274
9318
|
}
|
|
9275
9319
|
|
|
9276
9320
|
this.shouldSendReinvite = false;
|
|
9321
|
+
callSession.answerTime = new Date();
|
|
9277
9322
|
this.acceptedSessions[callSession.getId()] = true;
|
|
9278
9323
|
|
|
9279
9324
|
this.eventEmitter.emit(ON_CALL_ANSWERED, callSession);
|
|
@@ -9583,6 +9628,7 @@ class WebRTCPhone extends Emitter {
|
|
|
9583
9628
|
return Promise.resolve(null);
|
|
9584
9629
|
}
|
|
9585
9630
|
const callSession = this._createOutgoingCallSession(sipSession, cameraEnabled || false);
|
|
9631
|
+
callSession.creationTime = new Date();
|
|
9586
9632
|
|
|
9587
9633
|
this.eventEmitter.emit(ON_PLAY_PROGRESS_SOUND, this.audioOutputDeviceId, this.audioOutputVolume);
|
|
9588
9634
|
|
|
@@ -9778,8 +9824,12 @@ class WebRTCPhone extends Emitter {
|
|
|
9778
9824
|
}
|
|
9779
9825
|
|
|
9780
9826
|
const sessionId = this.incomingSessions[0];
|
|
9827
|
+
const sipSession = this.client.getSipSession(sessionId);
|
|
9828
|
+
if (!sipSession) {
|
|
9829
|
+
return null;
|
|
9830
|
+
}
|
|
9781
9831
|
|
|
9782
|
-
return this._createCallSession(
|
|
9832
|
+
return this._createCallSession(sipSession);
|
|
9783
9833
|
}
|
|
9784
9834
|
|
|
9785
9835
|
sendMessage(sipSession = null, body , contentType = 'text/plain') {
|
|
@@ -9857,6 +9907,7 @@ class WebRTCPhone extends Emitter {
|
|
|
9857
9907
|
callSession);
|
|
9858
9908
|
}
|
|
9859
9909
|
|
|
9910
|
+
callSession.creationTime = new Date();
|
|
9860
9911
|
this.eventEmitter.emit(ON_CALL_INCOMING, callSession, wantsToDoVideo);
|
|
9861
9912
|
});
|
|
9862
9913
|
|
|
@@ -9896,6 +9947,13 @@ class WebRTCPhone extends Emitter {
|
|
|
9896
9947
|
this.eventEmitter.emit(ON_CALL_ERROR, e);
|
|
9897
9948
|
});
|
|
9898
9949
|
|
|
9950
|
+
this.client.on(this.client.REJECTED, session => {
|
|
9951
|
+
logger$8.info('WebRTC call rejected', session.id);
|
|
9952
|
+
const callSession = this._createCallSession(session);
|
|
9953
|
+
callSession.endTime = new Date();
|
|
9954
|
+
this.eventEmitter.emit(ON_CALL_REJECTED, callSession);
|
|
9955
|
+
});
|
|
9956
|
+
|
|
9899
9957
|
this.client.on(this.client.UNREGISTERED, () => {
|
|
9900
9958
|
logger$8.info('WebRTC unregistered');
|
|
9901
9959
|
this.eventEmitter.emit(ON_UNREGISTERED);
|
|
@@ -10108,6 +10166,7 @@ class WebRTCPhone extends Emitter {
|
|
|
10108
10166
|
const number = identity ? identity.uri._normal.user : null;
|
|
10109
10167
|
const { state } = sipSession || {};
|
|
10110
10168
|
const sessionId = this.getSipSessionId(sipSession);
|
|
10169
|
+
fromSession = fromSession || this.callSessions[sessionId];
|
|
10111
10170
|
|
|
10112
10171
|
const callSession = new CallSession({
|
|
10113
10172
|
callId: fromSession && fromSession.callId,
|
|
@@ -10115,6 +10174,8 @@ class WebRTCPhone extends Emitter {
|
|
|
10115
10174
|
sipStatus: state,
|
|
10116
10175
|
displayName: identity ? identity.displayName || number : number,
|
|
10117
10176
|
startTime: fromSession ? fromSession.startTime : new Date(),
|
|
10177
|
+
creationTime: fromSession ? fromSession.creationTime : null,
|
|
10178
|
+
endTime: fromSession ? fromSession.endTime : null,
|
|
10118
10179
|
answered: state === sessionState.SessionState.Established,
|
|
10119
10180
|
paused: this.client.isCallHeld(sipSession),
|
|
10120
10181
|
isCaller: 'incoming' in extra ? !extra.incoming : false,
|
|
@@ -10125,6 +10186,7 @@ class WebRTCPhone extends Emitter {
|
|
|
10125
10186
|
videoMuted: fromSession ? fromSession.isVideoMuted() : false,
|
|
10126
10187
|
recording: fromSession ? fromSession.isRecording() : false,
|
|
10127
10188
|
recordingPaused: false, // @TODO
|
|
10189
|
+
sipSession,
|
|
10128
10190
|
...extra,
|
|
10129
10191
|
});
|
|
10130
10192
|
|
|
@@ -10153,6 +10215,7 @@ var PHONE_EVENTS = /*#__PURE__*/Object.freeze({
|
|
|
10153
10215
|
ON_CAMERA_RESUMED: ON_CAMERA_RESUMED,
|
|
10154
10216
|
ON_CALL_CANCELED: ON_CALL_CANCELED,
|
|
10155
10217
|
ON_CALL_FAILED: ON_CALL_FAILED,
|
|
10218
|
+
ON_CALL_REJECTED: ON_CALL_REJECTED,
|
|
10156
10219
|
ON_CALL_ENDED: ON_CALL_ENDED,
|
|
10157
10220
|
ON_CALL_ENDING: ON_CALL_ENDING,
|
|
10158
10221
|
ON_MESSAGE: ON_MESSAGE,
|
|
@@ -10182,6 +10245,14 @@ var PHONE_EVENTS = /*#__PURE__*/Object.freeze({
|
|
|
10182
10245
|
'default': WebRTCPhone
|
|
10183
10246
|
});
|
|
10184
10247
|
|
|
10248
|
+
/* */
|
|
10249
|
+
class SFUNotAvailableError extends Error {
|
|
10250
|
+
constructor(message = 'Sorry your user is not configured to support video conference') {
|
|
10251
|
+
super(message);
|
|
10252
|
+
this.name = 'SFUNotAvailableError';
|
|
10253
|
+
}
|
|
10254
|
+
}
|
|
10255
|
+
|
|
10185
10256
|
//
|
|
10186
10257
|
|
|
10187
10258
|
const logger$7 = IssueReporter$1.loggerFor('simple-phone');
|
|
@@ -10566,7 +10637,7 @@ class Phone extends Emitter {
|
|
|
10566
10637
|
|
|
10567
10638
|
checkSfu() {
|
|
10568
10639
|
if (!this.hasSfu()) {
|
|
10569
|
-
throw new
|
|
10640
|
+
throw new SFUNotAvailableError();
|
|
10570
10641
|
}
|
|
10571
10642
|
}
|
|
10572
10643
|
|
|
@@ -13462,6 +13533,7 @@ const Wazo = {
|
|
|
13462
13533
|
InvalidSubscription,
|
|
13463
13534
|
InvalidAuthorization,
|
|
13464
13535
|
CanceledCallError,
|
|
13536
|
+
SFUNotAvailableError,
|
|
13465
13537
|
};
|
|
13466
13538
|
|
|
13467
13539
|
if (window) {
|
package/lib/simple/Directory.js
CHANGED
|
@@ -450,7 +450,7 @@ const logger$1 = IssueReporter$1 ? IssueReporter$1.loggerFor('api') : console;
|
|
|
450
450
|
|
|
451
451
|
// Use a function here to be able to mock it in tests
|
|
452
452
|
const realFetch = () => {
|
|
453
|
-
if (typeof document !== 'undefined') {
|
|
453
|
+
if (typeof document !== 'undefined' && window.fetch) {
|
|
454
454
|
// Browser
|
|
455
455
|
return window.fetch;
|
|
456
456
|
}
|