@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
|
@@ -132,7 +132,7 @@ const logger$c = IssueReporter$1 ? IssueReporter$1.loggerFor('api') : console;
|
|
|
132
132
|
|
|
133
133
|
// Use a function here to be able to mock it in tests
|
|
134
134
|
const realFetch = () => {
|
|
135
|
-
if (typeof document !== 'undefined') {
|
|
135
|
+
if (typeof document !== 'undefined' && window.fetch) {
|
|
136
136
|
// Browser
|
|
137
137
|
return window.fetch;
|
|
138
138
|
}
|
|
@@ -1949,7 +1949,7 @@ class Contact {
|
|
|
1949
1949
|
this[key] = old[key] || this[key];
|
|
1950
1950
|
});
|
|
1951
1951
|
|
|
1952
|
-
if (old.lineState
|
|
1952
|
+
if (old.lineState) {
|
|
1953
1953
|
this.lineState = old.lineState;
|
|
1954
1954
|
}
|
|
1955
1955
|
|
|
@@ -3274,13 +3274,16 @@ var updateFrom = (instance , from ) => {
|
|
|
3274
3274
|
|
|
3275
3275
|
|
|
3276
3276
|
|
|
3277
|
+
|
|
3277
3278
|
|
|
3278
3279
|
|
|
3279
3280
|
|
|
3280
3281
|
|
|
3281
3282
|
|
|
3283
|
+
|
|
3282
3284
|
|
|
3283
3285
|
|
|
3286
|
+
|
|
3284
3287
|
|
|
3285
3288
|
|
|
3286
3289
|
|
|
@@ -3297,6 +3300,7 @@ var updateFrom = (instance , from ) => {
|
|
|
3297
3300
|
|
|
3298
3301
|
|
|
3299
3302
|
|
|
3303
|
+
|
|
3300
3304
|
|
|
3301
3305
|
|
|
3302
3306
|
class CallSession {
|
|
@@ -3316,10 +3320,14 @@ class CallSession {
|
|
|
3316
3320
|
|
|
3317
3321
|
|
|
3318
3322
|
|
|
3319
|
-
|
|
3323
|
+
|
|
3324
|
+
|
|
3325
|
+
// = creationTime
|
|
3320
3326
|
|
|
3321
3327
|
|
|
3322
3328
|
|
|
3329
|
+
|
|
3330
|
+
|
|
3323
3331
|
|
|
3324
3332
|
|
|
3325
3333
|
|
|
@@ -3355,6 +3363,8 @@ class CallSession {
|
|
|
3355
3363
|
|
|
3356
3364
|
|
|
3357
3365
|
|
|
3366
|
+
|
|
3367
|
+
|
|
3358
3368
|
|
|
3359
3369
|
constructor({
|
|
3360
3370
|
answered,
|
|
@@ -3368,6 +3378,8 @@ class CallSession {
|
|
|
3368
3378
|
paused,
|
|
3369
3379
|
ringing,
|
|
3370
3380
|
startTime,
|
|
3381
|
+
creationTime,
|
|
3382
|
+
endTime,
|
|
3371
3383
|
cameraEnabled,
|
|
3372
3384
|
dialedExtension,
|
|
3373
3385
|
sipCallId,
|
|
@@ -3380,12 +3392,16 @@ class CallSession {
|
|
|
3380
3392
|
recording,
|
|
3381
3393
|
recordingPaused,
|
|
3382
3394
|
videoRemotelyDowngraded,
|
|
3395
|
+
sipSession,
|
|
3396
|
+
answerTime,
|
|
3383
3397
|
} ) {
|
|
3384
3398
|
this.callId = callId;
|
|
3385
3399
|
this.sipCallId = sipCallId;
|
|
3386
3400
|
this.displayName = displayName;
|
|
3387
3401
|
this.number = number;
|
|
3402
|
+
this.creationTime = creationTime;
|
|
3388
3403
|
this.startTime = startTime;
|
|
3404
|
+
this.endTime = endTime;
|
|
3389
3405
|
this.isCaller = isCaller;
|
|
3390
3406
|
this.answered = answered;
|
|
3391
3407
|
this.answeredBySystem = answeredBySystem;
|
|
@@ -3404,6 +3420,8 @@ class CallSession {
|
|
|
3404
3420
|
this.recording = recording || false;
|
|
3405
3421
|
this.recordingPaused = recordingPaused || false;
|
|
3406
3422
|
this.videoRemotelyDowngraded = videoRemotelyDowngraded;
|
|
3423
|
+
this.sipSession = sipSession;
|
|
3424
|
+
this.answerTime = answerTime || this.answerTime;
|
|
3407
3425
|
|
|
3408
3426
|
// Useful to compare instead of instanceof with minified code
|
|
3409
3427
|
this.type = 'CallSession';
|
|
@@ -3434,7 +3452,7 @@ class CallSession {
|
|
|
3434
3452
|
}
|
|
3435
3453
|
|
|
3436
3454
|
answer() {
|
|
3437
|
-
this.
|
|
3455
|
+
this.answerTime = new Date();
|
|
3438
3456
|
}
|
|
3439
3457
|
|
|
3440
3458
|
systemAnswer() {
|
|
@@ -3590,6 +3608,15 @@ class CallSession {
|
|
|
3590
3608
|
return newFrom(callSession, CallSession);
|
|
3591
3609
|
}
|
|
3592
3610
|
|
|
3611
|
+
// Retro-compatibility: `answered` was a boolean before. We can reproduce the behaviour with a getter/setter
|
|
3612
|
+
set answered(value ) {
|
|
3613
|
+
this.answerTime = value ? new Date() : null;
|
|
3614
|
+
}
|
|
3615
|
+
|
|
3616
|
+
get answered() {
|
|
3617
|
+
return !!this.answerTime;
|
|
3618
|
+
}
|
|
3619
|
+
|
|
3593
3620
|
static parseCall(call ) {
|
|
3594
3621
|
return new CallSession({
|
|
3595
3622
|
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.
|
|
@@ -8718,6 +8750,7 @@ const ON_CAMERA_DISABLED = 'onCameraDisabled';
|
|
|
8718
8750
|
const ON_CAMERA_RESUMED = 'onCameraResumed';
|
|
8719
8751
|
const ON_CALL_CANCELED = 'onCallCanceled';
|
|
8720
8752
|
const ON_CALL_FAILED = 'onCallFailed';
|
|
8753
|
+
const ON_CALL_REJECTED = 'onCallRejected';
|
|
8721
8754
|
const ON_CALL_ENDED = 'onCallEnded';
|
|
8722
8755
|
const ON_CALL_ENDING = 'onCallEnding';
|
|
8723
8756
|
const ON_MESSAGE = 'onMessage';
|
|
@@ -8762,6 +8795,7 @@ const events = [
|
|
|
8762
8795
|
ON_CAMERA_DISABLED,
|
|
8763
8796
|
ON_CALL_FAILED,
|
|
8764
8797
|
ON_CALL_ENDED,
|
|
8798
|
+
ON_CALL_REJECTED,
|
|
8765
8799
|
ON_MESSAGE,
|
|
8766
8800
|
ON_REINVITE,
|
|
8767
8801
|
ON_TRACK,
|
|
@@ -9118,6 +9152,7 @@ class WebRTCPhone extends Emitter {
|
|
|
9118
9152
|
|
|
9119
9153
|
// Should be called before `_onCallTerminated` or the callCount will not decrement...
|
|
9120
9154
|
const callSession = this._createCallSession(sipSession);
|
|
9155
|
+
callSession.endTime = new Date();
|
|
9121
9156
|
const wasCurrentSession = this._onCallTerminated(sipSession);
|
|
9122
9157
|
|
|
9123
9158
|
return this.eventEmitter.emit(ON_CALL_ENDED, callSession, wasCurrentSession);
|
|
@@ -9313,6 +9348,7 @@ class WebRTCPhone extends Emitter {
|
|
|
9313
9348
|
this.removeIncomingSessions(sipSessionId);
|
|
9314
9349
|
}
|
|
9315
9350
|
|
|
9351
|
+
callSession.answerTime = new Date();
|
|
9316
9352
|
this.eventEmitter.emit(ON_CALL_ACCEPTED, callSession, cameraEnabled);
|
|
9317
9353
|
|
|
9318
9354
|
return callSession;
|
|
@@ -9370,6 +9406,7 @@ class WebRTCPhone extends Emitter {
|
|
|
9370
9406
|
_onCallTerminated(sipSession ) {
|
|
9371
9407
|
logger$7.info('WebRTC phone - on call terminated', { sipId: sipSession.id });
|
|
9372
9408
|
|
|
9409
|
+
const sipSessionId = this.getSipSessionId(sipSession);
|
|
9373
9410
|
const callSession = this._createCallSession(sipSession);
|
|
9374
9411
|
const isCurrentSession = this.isCurrentCallSipSession(callSession);
|
|
9375
9412
|
const isCurrentIncomingCall = callSession.is(this.getIncomingCallSession());
|
|
@@ -9387,7 +9424,6 @@ class WebRTCPhone extends Emitter {
|
|
|
9387
9424
|
}, 5);
|
|
9388
9425
|
}
|
|
9389
9426
|
|
|
9390
|
-
const sipSessionId = this.getSipSessionId(sipSession);
|
|
9391
9427
|
if (sipSessionId) {
|
|
9392
9428
|
this.removeIncomingSessions(sipSessionId);
|
|
9393
9429
|
}
|
|
@@ -9528,6 +9564,7 @@ class WebRTCPhone extends Emitter {
|
|
|
9528
9564
|
}
|
|
9529
9565
|
|
|
9530
9566
|
this.shouldSendReinvite = false;
|
|
9567
|
+
callSession.answerTime = new Date();
|
|
9531
9568
|
this.acceptedSessions[callSession.getId()] = true;
|
|
9532
9569
|
|
|
9533
9570
|
this.eventEmitter.emit(ON_CALL_ANSWERED, callSession);
|
|
@@ -9837,6 +9874,7 @@ class WebRTCPhone extends Emitter {
|
|
|
9837
9874
|
return Promise.resolve(null);
|
|
9838
9875
|
}
|
|
9839
9876
|
const callSession = this._createOutgoingCallSession(sipSession, cameraEnabled || false);
|
|
9877
|
+
callSession.creationTime = new Date();
|
|
9840
9878
|
|
|
9841
9879
|
this.eventEmitter.emit(ON_PLAY_PROGRESS_SOUND, this.audioOutputDeviceId, this.audioOutputVolume);
|
|
9842
9880
|
|
|
@@ -10032,8 +10070,12 @@ class WebRTCPhone extends Emitter {
|
|
|
10032
10070
|
}
|
|
10033
10071
|
|
|
10034
10072
|
const sessionId = this.incomingSessions[0];
|
|
10073
|
+
const sipSession = this.client.getSipSession(sessionId);
|
|
10074
|
+
if (!sipSession) {
|
|
10075
|
+
return null;
|
|
10076
|
+
}
|
|
10035
10077
|
|
|
10036
|
-
return this._createCallSession(
|
|
10078
|
+
return this._createCallSession(sipSession);
|
|
10037
10079
|
}
|
|
10038
10080
|
|
|
10039
10081
|
sendMessage(sipSession = null, body , contentType = 'text/plain') {
|
|
@@ -10111,6 +10153,7 @@ class WebRTCPhone extends Emitter {
|
|
|
10111
10153
|
callSession);
|
|
10112
10154
|
}
|
|
10113
10155
|
|
|
10156
|
+
callSession.creationTime = new Date();
|
|
10114
10157
|
this.eventEmitter.emit(ON_CALL_INCOMING, callSession, wantsToDoVideo);
|
|
10115
10158
|
});
|
|
10116
10159
|
|
|
@@ -10150,6 +10193,13 @@ class WebRTCPhone extends Emitter {
|
|
|
10150
10193
|
this.eventEmitter.emit(ON_CALL_ERROR, e);
|
|
10151
10194
|
});
|
|
10152
10195
|
|
|
10196
|
+
this.client.on(this.client.REJECTED, session => {
|
|
10197
|
+
logger$7.info('WebRTC call rejected', session.id);
|
|
10198
|
+
const callSession = this._createCallSession(session);
|
|
10199
|
+
callSession.endTime = new Date();
|
|
10200
|
+
this.eventEmitter.emit(ON_CALL_REJECTED, callSession);
|
|
10201
|
+
});
|
|
10202
|
+
|
|
10153
10203
|
this.client.on(this.client.UNREGISTERED, () => {
|
|
10154
10204
|
logger$7.info('WebRTC unregistered');
|
|
10155
10205
|
this.eventEmitter.emit(ON_UNREGISTERED);
|
|
@@ -10362,6 +10412,7 @@ class WebRTCPhone extends Emitter {
|
|
|
10362
10412
|
const number = identity ? identity.uri._normal.user : null;
|
|
10363
10413
|
const { state } = sipSession || {};
|
|
10364
10414
|
const sessionId = this.getSipSessionId(sipSession);
|
|
10415
|
+
fromSession = fromSession || this.callSessions[sessionId];
|
|
10365
10416
|
|
|
10366
10417
|
const callSession = new CallSession({
|
|
10367
10418
|
callId: fromSession && fromSession.callId,
|
|
@@ -10369,6 +10420,8 @@ class WebRTCPhone extends Emitter {
|
|
|
10369
10420
|
sipStatus: state,
|
|
10370
10421
|
displayName: identity ? identity.displayName || number : number,
|
|
10371
10422
|
startTime: fromSession ? fromSession.startTime : new Date(),
|
|
10423
|
+
creationTime: fromSession ? fromSession.creationTime : null,
|
|
10424
|
+
endTime: fromSession ? fromSession.endTime : null,
|
|
10372
10425
|
answered: state === SessionState.Established,
|
|
10373
10426
|
paused: this.client.isCallHeld(sipSession),
|
|
10374
10427
|
isCaller: 'incoming' in extra ? !extra.incoming : false,
|
|
@@ -10379,6 +10432,7 @@ class WebRTCPhone extends Emitter {
|
|
|
10379
10432
|
videoMuted: fromSession ? fromSession.isVideoMuted() : false,
|
|
10380
10433
|
recording: fromSession ? fromSession.isRecording() : false,
|
|
10381
10434
|
recordingPaused: false, // @TODO
|
|
10435
|
+
sipSession,
|
|
10382
10436
|
...extra,
|
|
10383
10437
|
});
|
|
10384
10438
|
|
|
@@ -10407,6 +10461,7 @@ var PHONE_EVENTS = /*#__PURE__*/Object.freeze({
|
|
|
10407
10461
|
ON_CAMERA_RESUMED: ON_CAMERA_RESUMED,
|
|
10408
10462
|
ON_CALL_CANCELED: ON_CALL_CANCELED,
|
|
10409
10463
|
ON_CALL_FAILED: ON_CALL_FAILED,
|
|
10464
|
+
ON_CALL_REJECTED: ON_CALL_REJECTED,
|
|
10410
10465
|
ON_CALL_ENDED: ON_CALL_ENDED,
|
|
10411
10466
|
ON_CALL_ENDING: ON_CALL_ENDING,
|
|
10412
10467
|
ON_MESSAGE: ON_MESSAGE,
|
|
@@ -10436,6 +10491,14 @@ var PHONE_EVENTS = /*#__PURE__*/Object.freeze({
|
|
|
10436
10491
|
'default': WebRTCPhone
|
|
10437
10492
|
});
|
|
10438
10493
|
|
|
10494
|
+
/* */
|
|
10495
|
+
class SFUNotAvailableError extends Error {
|
|
10496
|
+
constructor(message = 'Sorry your user is not configured to support video conference') {
|
|
10497
|
+
super(message);
|
|
10498
|
+
this.name = 'SFUNotAvailableError';
|
|
10499
|
+
}
|
|
10500
|
+
}
|
|
10501
|
+
|
|
10439
10502
|
//
|
|
10440
10503
|
|
|
10441
10504
|
const logger$6 = IssueReporter$1.loggerFor('simple-phone');
|
|
@@ -10820,7 +10883,7 @@ class Phone extends Emitter {
|
|
|
10820
10883
|
|
|
10821
10884
|
checkSfu() {
|
|
10822
10885
|
if (!this.hasSfu()) {
|
|
10823
|
-
throw new
|
|
10886
|
+
throw new SFUNotAvailableError();
|
|
10824
10887
|
}
|
|
10825
10888
|
}
|
|
10826
10889
|
|
|
@@ -12607,6 +12670,7 @@ const Wazo = {
|
|
|
12607
12670
|
InvalidSubscription,
|
|
12608
12671
|
InvalidAuthorization,
|
|
12609
12672
|
CanceledCallError,
|
|
12673
|
+
SFUNotAvailableError,
|
|
12610
12674
|
};
|
|
12611
12675
|
|
|
12612
12676
|
if (window) {
|
|
@@ -463,7 +463,7 @@ const logger$c = IssueReporter$1 ? IssueReporter$1.loggerFor('api') : console;
|
|
|
463
463
|
|
|
464
464
|
// Use a function here to be able to mock it in tests
|
|
465
465
|
const realFetch = () => {
|
|
466
|
-
if (typeof document !== 'undefined') {
|
|
466
|
+
if (typeof document !== 'undefined' && window.fetch) {
|
|
467
467
|
// Browser
|
|
468
468
|
return window.fetch;
|
|
469
469
|
}
|
|
@@ -1923,7 +1923,7 @@ class Contact {
|
|
|
1923
1923
|
this[key] = old[key] || this[key];
|
|
1924
1924
|
});
|
|
1925
1925
|
|
|
1926
|
-
if (old.lineState
|
|
1926
|
+
if (old.lineState) {
|
|
1927
1927
|
this.lineState = old.lineState;
|
|
1928
1928
|
}
|
|
1929
1929
|
|
|
@@ -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.
|
|
@@ -8718,6 +8750,7 @@ const ON_CAMERA_DISABLED = 'onCameraDisabled';
|
|
|
8718
8750
|
const ON_CAMERA_RESUMED = 'onCameraResumed';
|
|
8719
8751
|
const ON_CALL_CANCELED = 'onCallCanceled';
|
|
8720
8752
|
const ON_CALL_FAILED = 'onCallFailed';
|
|
8753
|
+
const ON_CALL_REJECTED = 'onCallRejected';
|
|
8721
8754
|
const ON_CALL_ENDED = 'onCallEnded';
|
|
8722
8755
|
const ON_CALL_ENDING = 'onCallEnding';
|
|
8723
8756
|
const ON_MESSAGE = 'onMessage';
|
|
@@ -8762,6 +8795,7 @@ const events = [
|
|
|
8762
8795
|
ON_CAMERA_DISABLED,
|
|
8763
8796
|
ON_CALL_FAILED,
|
|
8764
8797
|
ON_CALL_ENDED,
|
|
8798
|
+
ON_CALL_REJECTED,
|
|
8765
8799
|
ON_MESSAGE,
|
|
8766
8800
|
ON_REINVITE,
|
|
8767
8801
|
ON_TRACK,
|
|
@@ -9118,6 +9152,7 @@ class WebRTCPhone extends Emitter {
|
|
|
9118
9152
|
|
|
9119
9153
|
// Should be called before `_onCallTerminated` or the callCount will not decrement...
|
|
9120
9154
|
const callSession = this._createCallSession(sipSession);
|
|
9155
|
+
callSession.endTime = new Date();
|
|
9121
9156
|
const wasCurrentSession = this._onCallTerminated(sipSession);
|
|
9122
9157
|
|
|
9123
9158
|
return this.eventEmitter.emit(ON_CALL_ENDED, callSession, wasCurrentSession);
|
|
@@ -9313,6 +9348,7 @@ class WebRTCPhone extends Emitter {
|
|
|
9313
9348
|
this.removeIncomingSessions(sipSessionId);
|
|
9314
9349
|
}
|
|
9315
9350
|
|
|
9351
|
+
callSession.answerTime = new Date();
|
|
9316
9352
|
this.eventEmitter.emit(ON_CALL_ACCEPTED, callSession, cameraEnabled);
|
|
9317
9353
|
|
|
9318
9354
|
return callSession;
|
|
@@ -9370,6 +9406,7 @@ class WebRTCPhone extends Emitter {
|
|
|
9370
9406
|
_onCallTerminated(sipSession ) {
|
|
9371
9407
|
logger$7.info('WebRTC phone - on call terminated', { sipId: sipSession.id });
|
|
9372
9408
|
|
|
9409
|
+
const sipSessionId = this.getSipSessionId(sipSession);
|
|
9373
9410
|
const callSession = this._createCallSession(sipSession);
|
|
9374
9411
|
const isCurrentSession = this.isCurrentCallSipSession(callSession);
|
|
9375
9412
|
const isCurrentIncomingCall = callSession.is(this.getIncomingCallSession());
|
|
@@ -9387,7 +9424,6 @@ class WebRTCPhone extends Emitter {
|
|
|
9387
9424
|
}, 5);
|
|
9388
9425
|
}
|
|
9389
9426
|
|
|
9390
|
-
const sipSessionId = this.getSipSessionId(sipSession);
|
|
9391
9427
|
if (sipSessionId) {
|
|
9392
9428
|
this.removeIncomingSessions(sipSessionId);
|
|
9393
9429
|
}
|
|
@@ -9528,6 +9564,7 @@ class WebRTCPhone extends Emitter {
|
|
|
9528
9564
|
}
|
|
9529
9565
|
|
|
9530
9566
|
this.shouldSendReinvite = false;
|
|
9567
|
+
callSession.answerTime = new Date();
|
|
9531
9568
|
this.acceptedSessions[callSession.getId()] = true;
|
|
9532
9569
|
|
|
9533
9570
|
this.eventEmitter.emit(ON_CALL_ANSWERED, callSession);
|
|
@@ -9837,6 +9874,7 @@ class WebRTCPhone extends Emitter {
|
|
|
9837
9874
|
return Promise.resolve(null);
|
|
9838
9875
|
}
|
|
9839
9876
|
const callSession = this._createOutgoingCallSession(sipSession, cameraEnabled || false);
|
|
9877
|
+
callSession.creationTime = new Date();
|
|
9840
9878
|
|
|
9841
9879
|
this.eventEmitter.emit(ON_PLAY_PROGRESS_SOUND, this.audioOutputDeviceId, this.audioOutputVolume);
|
|
9842
9880
|
|
|
@@ -10032,8 +10070,12 @@ class WebRTCPhone extends Emitter {
|
|
|
10032
10070
|
}
|
|
10033
10071
|
|
|
10034
10072
|
const sessionId = this.incomingSessions[0];
|
|
10073
|
+
const sipSession = this.client.getSipSession(sessionId);
|
|
10074
|
+
if (!sipSession) {
|
|
10075
|
+
return null;
|
|
10076
|
+
}
|
|
10035
10077
|
|
|
10036
|
-
return this._createCallSession(
|
|
10078
|
+
return this._createCallSession(sipSession);
|
|
10037
10079
|
}
|
|
10038
10080
|
|
|
10039
10081
|
sendMessage(sipSession = null, body , contentType = 'text/plain') {
|
|
@@ -10111,6 +10153,7 @@ class WebRTCPhone extends Emitter {
|
|
|
10111
10153
|
callSession);
|
|
10112
10154
|
}
|
|
10113
10155
|
|
|
10156
|
+
callSession.creationTime = new Date();
|
|
10114
10157
|
this.eventEmitter.emit(ON_CALL_INCOMING, callSession, wantsToDoVideo);
|
|
10115
10158
|
});
|
|
10116
10159
|
|
|
@@ -10150,6 +10193,13 @@ class WebRTCPhone extends Emitter {
|
|
|
10150
10193
|
this.eventEmitter.emit(ON_CALL_ERROR, e);
|
|
10151
10194
|
});
|
|
10152
10195
|
|
|
10196
|
+
this.client.on(this.client.REJECTED, session => {
|
|
10197
|
+
logger$7.info('WebRTC call rejected', session.id);
|
|
10198
|
+
const callSession = this._createCallSession(session);
|
|
10199
|
+
callSession.endTime = new Date();
|
|
10200
|
+
this.eventEmitter.emit(ON_CALL_REJECTED, callSession);
|
|
10201
|
+
});
|
|
10202
|
+
|
|
10153
10203
|
this.client.on(this.client.UNREGISTERED, () => {
|
|
10154
10204
|
logger$7.info('WebRTC unregistered');
|
|
10155
10205
|
this.eventEmitter.emit(ON_UNREGISTERED);
|
|
@@ -10362,6 +10412,7 @@ class WebRTCPhone extends Emitter {
|
|
|
10362
10412
|
const number = identity ? identity.uri._normal.user : null;
|
|
10363
10413
|
const { state } = sipSession || {};
|
|
10364
10414
|
const sessionId = this.getSipSessionId(sipSession);
|
|
10415
|
+
fromSession = fromSession || this.callSessions[sessionId];
|
|
10365
10416
|
|
|
10366
10417
|
const callSession = new CallSession({
|
|
10367
10418
|
callId: fromSession && fromSession.callId,
|
|
@@ -10369,6 +10420,8 @@ class WebRTCPhone extends Emitter {
|
|
|
10369
10420
|
sipStatus: state,
|
|
10370
10421
|
displayName: identity ? identity.displayName || number : number,
|
|
10371
10422
|
startTime: fromSession ? fromSession.startTime : new Date(),
|
|
10423
|
+
creationTime: fromSession ? fromSession.creationTime : null,
|
|
10424
|
+
endTime: fromSession ? fromSession.endTime : null,
|
|
10372
10425
|
answered: state === SessionState.Established,
|
|
10373
10426
|
paused: this.client.isCallHeld(sipSession),
|
|
10374
10427
|
isCaller: 'incoming' in extra ? !extra.incoming : false,
|
|
@@ -10379,6 +10432,7 @@ class WebRTCPhone extends Emitter {
|
|
|
10379
10432
|
videoMuted: fromSession ? fromSession.isVideoMuted() : false,
|
|
10380
10433
|
recording: fromSession ? fromSession.isRecording() : false,
|
|
10381
10434
|
recordingPaused: false, // @TODO
|
|
10435
|
+
sipSession,
|
|
10382
10436
|
...extra,
|
|
10383
10437
|
});
|
|
10384
10438
|
|
|
@@ -10407,6 +10461,7 @@ var PHONE_EVENTS = /*#__PURE__*/Object.freeze({
|
|
|
10407
10461
|
ON_CAMERA_RESUMED: ON_CAMERA_RESUMED,
|
|
10408
10462
|
ON_CALL_CANCELED: ON_CALL_CANCELED,
|
|
10409
10463
|
ON_CALL_FAILED: ON_CALL_FAILED,
|
|
10464
|
+
ON_CALL_REJECTED: ON_CALL_REJECTED,
|
|
10410
10465
|
ON_CALL_ENDED: ON_CALL_ENDED,
|
|
10411
10466
|
ON_CALL_ENDING: ON_CALL_ENDING,
|
|
10412
10467
|
ON_MESSAGE: ON_MESSAGE,
|
|
@@ -10436,6 +10491,14 @@ var PHONE_EVENTS = /*#__PURE__*/Object.freeze({
|
|
|
10436
10491
|
'default': WebRTCPhone
|
|
10437
10492
|
});
|
|
10438
10493
|
|
|
10494
|
+
/* */
|
|
10495
|
+
class SFUNotAvailableError extends Error {
|
|
10496
|
+
constructor(message = 'Sorry your user is not configured to support video conference') {
|
|
10497
|
+
super(message);
|
|
10498
|
+
this.name = 'SFUNotAvailableError';
|
|
10499
|
+
}
|
|
10500
|
+
}
|
|
10501
|
+
|
|
10439
10502
|
//
|
|
10440
10503
|
|
|
10441
10504
|
const logger$6 = IssueReporter$1.loggerFor('simple-phone');
|
|
@@ -10820,7 +10883,7 @@ class Phone extends Emitter {
|
|
|
10820
10883
|
|
|
10821
10884
|
checkSfu() {
|
|
10822
10885
|
if (!this.hasSfu()) {
|
|
10823
|
-
throw new
|
|
10886
|
+
throw new SFUNotAvailableError();
|
|
10824
10887
|
}
|
|
10825
10888
|
}
|
|
10826
10889
|
|
|
@@ -12886,6 +12949,7 @@ const Wazo = {
|
|
|
12886
12949
|
InvalidSubscription,
|
|
12887
12950
|
InvalidAuthorization,
|
|
12888
12951
|
CanceledCallError,
|
|
12952
|
+
SFUNotAvailableError,
|
|
12889
12953
|
};
|
|
12890
12954
|
|
|
12891
12955
|
if (window) {
|