@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
|
@@ -473,7 +473,7 @@ const logger$c = IssueReporter$1 ? IssueReporter$1.loggerFor('api') : console;
|
|
|
473
473
|
|
|
474
474
|
// Use a function here to be able to mock it in tests
|
|
475
475
|
const realFetch = () => {
|
|
476
|
-
if (typeof document !== 'undefined') {
|
|
476
|
+
if (typeof document !== 'undefined' && window.fetch) {
|
|
477
477
|
// Browser
|
|
478
478
|
return window.fetch;
|
|
479
479
|
}
|
|
@@ -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,
|
|
@@ -6072,11 +6099,16 @@ class WazoSessionDescriptionHandler extends sessionDescriptionHandler.SessionDes
|
|
|
6072
6099
|
|
|
6073
6100
|
// $FlowFixMe
|
|
6074
6101
|
setRemoteSessionDescription(sessionDescription ) {
|
|
6075
|
-
|
|
6102
|
+
try {
|
|
6103
|
+
const result = super.setRemoteSessionDescription(sessionDescription);
|
|
6076
6104
|
|
|
6077
|
-
|
|
6105
|
+
this.eventEmitter.emit('setDescription', sessionDescription);
|
|
6078
6106
|
|
|
6079
|
-
|
|
6107
|
+
return result;
|
|
6108
|
+
} catch (error) {
|
|
6109
|
+
this.logger.error('SessionDescriptionHandler.setRemoteSessionDescription error', error);
|
|
6110
|
+
throw error;
|
|
6111
|
+
}
|
|
6080
6112
|
}
|
|
6081
6113
|
|
|
6082
6114
|
// Overridden to avoid to fix ice-candidates missing in the SDP in react-native and chrome canary.
|
|
@@ -6615,6 +6647,7 @@ const MAX_REGISTER_TRIES = 10;
|
|
|
6615
6647
|
|
|
6616
6648
|
|
|
6617
6649
|
|
|
6650
|
+
|
|
6618
6651
|
|
|
6619
6652
|
|
|
6620
6653
|
|
|
@@ -8231,6 +8264,13 @@ class WebRTCClient extends Emitter {
|
|
|
8231
8264
|
}
|
|
8232
8265
|
|
|
8233
8266
|
_createWebRTCConfiguration(configOverrides = {}) {
|
|
8267
|
+
let { host } = this.config;
|
|
8268
|
+
let port = this.config.port || 443;
|
|
8269
|
+
|
|
8270
|
+
if (this.config.websocketSip) {
|
|
8271
|
+
[host, port = 443] = this.config.websocketSip.split(':');
|
|
8272
|
+
}
|
|
8273
|
+
|
|
8234
8274
|
const config = {
|
|
8235
8275
|
authorizationUsername: this.config.authorizationUser,
|
|
8236
8276
|
authorizationPassword: this.config.password,
|
|
@@ -8266,7 +8306,7 @@ class WebRTCClient extends Emitter {
|
|
|
8266
8306
|
},
|
|
8267
8307
|
transportOptions: {
|
|
8268
8308
|
traceSip: configOverrides.traceSip || false,
|
|
8269
|
-
wsServers: `wss://${
|
|
8309
|
+
wsServers: `wss://${host}:${port}/api/asterisk/ws`,
|
|
8270
8310
|
},
|
|
8271
8311
|
sessionDescriptionHandlerFactoryOptions: {
|
|
8272
8312
|
modifiers: [replaceLocalIpModifier],
|
|
@@ -8728,6 +8768,7 @@ const ON_CAMERA_DISABLED = 'onCameraDisabled';
|
|
|
8728
8768
|
const ON_CAMERA_RESUMED = 'onCameraResumed';
|
|
8729
8769
|
const ON_CALL_CANCELED = 'onCallCanceled';
|
|
8730
8770
|
const ON_CALL_FAILED = 'onCallFailed';
|
|
8771
|
+
const ON_CALL_REJECTED = 'onCallRejected';
|
|
8731
8772
|
const ON_CALL_ENDED = 'onCallEnded';
|
|
8732
8773
|
const ON_CALL_ENDING = 'onCallEnding';
|
|
8733
8774
|
const ON_MESSAGE = 'onMessage';
|
|
@@ -8772,6 +8813,7 @@ const events = [
|
|
|
8772
8813
|
ON_CAMERA_DISABLED,
|
|
8773
8814
|
ON_CALL_FAILED,
|
|
8774
8815
|
ON_CALL_ENDED,
|
|
8816
|
+
ON_CALL_REJECTED,
|
|
8775
8817
|
ON_MESSAGE,
|
|
8776
8818
|
ON_REINVITE,
|
|
8777
8819
|
ON_TRACK,
|
|
@@ -9128,6 +9170,7 @@ class WebRTCPhone extends Emitter {
|
|
|
9128
9170
|
|
|
9129
9171
|
// Should be called before `_onCallTerminated` or the callCount will not decrement...
|
|
9130
9172
|
const callSession = this._createCallSession(sipSession);
|
|
9173
|
+
callSession.endTime = new Date();
|
|
9131
9174
|
const wasCurrentSession = this._onCallTerminated(sipSession);
|
|
9132
9175
|
|
|
9133
9176
|
return this.eventEmitter.emit(ON_CALL_ENDED, callSession, wasCurrentSession);
|
|
@@ -9323,6 +9366,7 @@ class WebRTCPhone extends Emitter {
|
|
|
9323
9366
|
this.removeIncomingSessions(sipSessionId);
|
|
9324
9367
|
}
|
|
9325
9368
|
|
|
9369
|
+
callSession.answerTime = new Date();
|
|
9326
9370
|
this.eventEmitter.emit(ON_CALL_ACCEPTED, callSession, cameraEnabled);
|
|
9327
9371
|
|
|
9328
9372
|
return callSession;
|
|
@@ -9380,6 +9424,7 @@ class WebRTCPhone extends Emitter {
|
|
|
9380
9424
|
_onCallTerminated(sipSession ) {
|
|
9381
9425
|
logger$7.info('WebRTC phone - on call terminated', { sipId: sipSession.id });
|
|
9382
9426
|
|
|
9427
|
+
const sipSessionId = this.getSipSessionId(sipSession);
|
|
9383
9428
|
const callSession = this._createCallSession(sipSession);
|
|
9384
9429
|
const isCurrentSession = this.isCurrentCallSipSession(callSession);
|
|
9385
9430
|
const isCurrentIncomingCall = callSession.is(this.getIncomingCallSession());
|
|
@@ -9397,7 +9442,6 @@ class WebRTCPhone extends Emitter {
|
|
|
9397
9442
|
}, 5);
|
|
9398
9443
|
}
|
|
9399
9444
|
|
|
9400
|
-
const sipSessionId = this.getSipSessionId(sipSession);
|
|
9401
9445
|
if (sipSessionId) {
|
|
9402
9446
|
this.removeIncomingSessions(sipSessionId);
|
|
9403
9447
|
}
|
|
@@ -9538,6 +9582,7 @@ class WebRTCPhone extends Emitter {
|
|
|
9538
9582
|
}
|
|
9539
9583
|
|
|
9540
9584
|
this.shouldSendReinvite = false;
|
|
9585
|
+
callSession.answerTime = new Date();
|
|
9541
9586
|
this.acceptedSessions[callSession.getId()] = true;
|
|
9542
9587
|
|
|
9543
9588
|
this.eventEmitter.emit(ON_CALL_ANSWERED, callSession);
|
|
@@ -9847,6 +9892,7 @@ class WebRTCPhone extends Emitter {
|
|
|
9847
9892
|
return Promise.resolve(null);
|
|
9848
9893
|
}
|
|
9849
9894
|
const callSession = this._createOutgoingCallSession(sipSession, cameraEnabled || false);
|
|
9895
|
+
callSession.creationTime = new Date();
|
|
9850
9896
|
|
|
9851
9897
|
this.eventEmitter.emit(ON_PLAY_PROGRESS_SOUND, this.audioOutputDeviceId, this.audioOutputVolume);
|
|
9852
9898
|
|
|
@@ -10042,8 +10088,12 @@ class WebRTCPhone extends Emitter {
|
|
|
10042
10088
|
}
|
|
10043
10089
|
|
|
10044
10090
|
const sessionId = this.incomingSessions[0];
|
|
10091
|
+
const sipSession = this.client.getSipSession(sessionId);
|
|
10092
|
+
if (!sipSession) {
|
|
10093
|
+
return null;
|
|
10094
|
+
}
|
|
10045
10095
|
|
|
10046
|
-
return this._createCallSession(
|
|
10096
|
+
return this._createCallSession(sipSession);
|
|
10047
10097
|
}
|
|
10048
10098
|
|
|
10049
10099
|
sendMessage(sipSession = null, body , contentType = 'text/plain') {
|
|
@@ -10121,6 +10171,7 @@ class WebRTCPhone extends Emitter {
|
|
|
10121
10171
|
callSession);
|
|
10122
10172
|
}
|
|
10123
10173
|
|
|
10174
|
+
callSession.creationTime = new Date();
|
|
10124
10175
|
this.eventEmitter.emit(ON_CALL_INCOMING, callSession, wantsToDoVideo);
|
|
10125
10176
|
});
|
|
10126
10177
|
|
|
@@ -10160,6 +10211,13 @@ class WebRTCPhone extends Emitter {
|
|
|
10160
10211
|
this.eventEmitter.emit(ON_CALL_ERROR, e);
|
|
10161
10212
|
});
|
|
10162
10213
|
|
|
10214
|
+
this.client.on(this.client.REJECTED, session => {
|
|
10215
|
+
logger$7.info('WebRTC call rejected', session.id);
|
|
10216
|
+
const callSession = this._createCallSession(session);
|
|
10217
|
+
callSession.endTime = new Date();
|
|
10218
|
+
this.eventEmitter.emit(ON_CALL_REJECTED, callSession);
|
|
10219
|
+
});
|
|
10220
|
+
|
|
10163
10221
|
this.client.on(this.client.UNREGISTERED, () => {
|
|
10164
10222
|
logger$7.info('WebRTC unregistered');
|
|
10165
10223
|
this.eventEmitter.emit(ON_UNREGISTERED);
|
|
@@ -10372,6 +10430,7 @@ class WebRTCPhone extends Emitter {
|
|
|
10372
10430
|
const number = identity ? identity.uri._normal.user : null;
|
|
10373
10431
|
const { state } = sipSession || {};
|
|
10374
10432
|
const sessionId = this.getSipSessionId(sipSession);
|
|
10433
|
+
fromSession = fromSession || this.callSessions[sessionId];
|
|
10375
10434
|
|
|
10376
10435
|
const callSession = new CallSession({
|
|
10377
10436
|
callId: fromSession && fromSession.callId,
|
|
@@ -10379,6 +10438,8 @@ class WebRTCPhone extends Emitter {
|
|
|
10379
10438
|
sipStatus: state,
|
|
10380
10439
|
displayName: identity ? identity.displayName || number : number,
|
|
10381
10440
|
startTime: fromSession ? fromSession.startTime : new Date(),
|
|
10441
|
+
creationTime: fromSession ? fromSession.creationTime : null,
|
|
10442
|
+
endTime: fromSession ? fromSession.endTime : null,
|
|
10382
10443
|
answered: state === sessionState.SessionState.Established,
|
|
10383
10444
|
paused: this.client.isCallHeld(sipSession),
|
|
10384
10445
|
isCaller: 'incoming' in extra ? !extra.incoming : false,
|
|
@@ -10389,6 +10450,7 @@ class WebRTCPhone extends Emitter {
|
|
|
10389
10450
|
videoMuted: fromSession ? fromSession.isVideoMuted() : false,
|
|
10390
10451
|
recording: fromSession ? fromSession.isRecording() : false,
|
|
10391
10452
|
recordingPaused: false, // @TODO
|
|
10453
|
+
sipSession,
|
|
10392
10454
|
...extra,
|
|
10393
10455
|
});
|
|
10394
10456
|
|
|
@@ -10417,6 +10479,7 @@ var PHONE_EVENTS = /*#__PURE__*/Object.freeze({
|
|
|
10417
10479
|
ON_CAMERA_RESUMED: ON_CAMERA_RESUMED,
|
|
10418
10480
|
ON_CALL_CANCELED: ON_CALL_CANCELED,
|
|
10419
10481
|
ON_CALL_FAILED: ON_CALL_FAILED,
|
|
10482
|
+
ON_CALL_REJECTED: ON_CALL_REJECTED,
|
|
10420
10483
|
ON_CALL_ENDED: ON_CALL_ENDED,
|
|
10421
10484
|
ON_CALL_ENDING: ON_CALL_ENDING,
|
|
10422
10485
|
ON_MESSAGE: ON_MESSAGE,
|
|
@@ -10446,6 +10509,14 @@ var PHONE_EVENTS = /*#__PURE__*/Object.freeze({
|
|
|
10446
10509
|
'default': WebRTCPhone
|
|
10447
10510
|
});
|
|
10448
10511
|
|
|
10512
|
+
/* */
|
|
10513
|
+
class SFUNotAvailableError extends Error {
|
|
10514
|
+
constructor(message = 'Sorry your user is not configured to support video conference') {
|
|
10515
|
+
super(message);
|
|
10516
|
+
this.name = 'SFUNotAvailableError';
|
|
10517
|
+
}
|
|
10518
|
+
}
|
|
10519
|
+
|
|
10449
10520
|
//
|
|
10450
10521
|
|
|
10451
10522
|
const logger$6 = IssueReporter$1.loggerFor('simple-phone');
|
|
@@ -10830,7 +10901,7 @@ class Phone extends Emitter {
|
|
|
10830
10901
|
|
|
10831
10902
|
checkSfu() {
|
|
10832
10903
|
if (!this.hasSfu()) {
|
|
10833
|
-
throw new
|
|
10904
|
+
throw new SFUNotAvailableError();
|
|
10834
10905
|
}
|
|
10835
10906
|
}
|
|
10836
10907
|
|
|
@@ -12896,6 +12967,7 @@ const Wazo = {
|
|
|
12896
12967
|
InvalidSubscription,
|
|
12897
12968
|
InvalidAuthorization,
|
|
12898
12969
|
CanceledCallError,
|
|
12970
|
+
SFUNotAvailableError,
|
|
12899
12971
|
};
|
|
12900
12972
|
|
|
12901
12973
|
if (window) {
|
package/lib/simple/room/Room.js
CHANGED
|
@@ -475,7 +475,7 @@ const logger$c = IssueReporter$1 ? IssueReporter$1.loggerFor('api') : console;
|
|
|
475
475
|
|
|
476
476
|
// Use a function here to be able to mock it in tests
|
|
477
477
|
const realFetch = () => {
|
|
478
|
-
if (typeof document !== 'undefined') {
|
|
478
|
+
if (typeof document !== 'undefined' && window.fetch) {
|
|
479
479
|
// Browser
|
|
480
480
|
return window.fetch;
|
|
481
481
|
}
|
|
@@ -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,
|
|
@@ -6074,11 +6101,16 @@ class WazoSessionDescriptionHandler extends sessionDescriptionHandler.SessionDes
|
|
|
6074
6101
|
|
|
6075
6102
|
// $FlowFixMe
|
|
6076
6103
|
setRemoteSessionDescription(sessionDescription ) {
|
|
6077
|
-
|
|
6104
|
+
try {
|
|
6105
|
+
const result = super.setRemoteSessionDescription(sessionDescription);
|
|
6078
6106
|
|
|
6079
|
-
|
|
6107
|
+
this.eventEmitter.emit('setDescription', sessionDescription);
|
|
6080
6108
|
|
|
6081
|
-
|
|
6109
|
+
return result;
|
|
6110
|
+
} catch (error) {
|
|
6111
|
+
this.logger.error('SessionDescriptionHandler.setRemoteSessionDescription error', error);
|
|
6112
|
+
throw error;
|
|
6113
|
+
}
|
|
6082
6114
|
}
|
|
6083
6115
|
|
|
6084
6116
|
// Overridden to avoid to fix ice-candidates missing in the SDP in react-native and chrome canary.
|
|
@@ -6617,6 +6649,7 @@ const MAX_REGISTER_TRIES = 10;
|
|
|
6617
6649
|
|
|
6618
6650
|
|
|
6619
6651
|
|
|
6652
|
+
|
|
6620
6653
|
|
|
6621
6654
|
|
|
6622
6655
|
|
|
@@ -8233,6 +8266,13 @@ class WebRTCClient extends Emitter {
|
|
|
8233
8266
|
}
|
|
8234
8267
|
|
|
8235
8268
|
_createWebRTCConfiguration(configOverrides = {}) {
|
|
8269
|
+
let { host } = this.config;
|
|
8270
|
+
let port = this.config.port || 443;
|
|
8271
|
+
|
|
8272
|
+
if (this.config.websocketSip) {
|
|
8273
|
+
[host, port = 443] = this.config.websocketSip.split(':');
|
|
8274
|
+
}
|
|
8275
|
+
|
|
8236
8276
|
const config = {
|
|
8237
8277
|
authorizationUsername: this.config.authorizationUser,
|
|
8238
8278
|
authorizationPassword: this.config.password,
|
|
@@ -8268,7 +8308,7 @@ class WebRTCClient extends Emitter {
|
|
|
8268
8308
|
},
|
|
8269
8309
|
transportOptions: {
|
|
8270
8310
|
traceSip: configOverrides.traceSip || false,
|
|
8271
|
-
wsServers: `wss://${
|
|
8311
|
+
wsServers: `wss://${host}:${port}/api/asterisk/ws`,
|
|
8272
8312
|
},
|
|
8273
8313
|
sessionDescriptionHandlerFactoryOptions: {
|
|
8274
8314
|
modifiers: [replaceLocalIpModifier],
|
|
@@ -8730,6 +8770,7 @@ const ON_CAMERA_DISABLED = 'onCameraDisabled';
|
|
|
8730
8770
|
const ON_CAMERA_RESUMED = 'onCameraResumed';
|
|
8731
8771
|
const ON_CALL_CANCELED = 'onCallCanceled';
|
|
8732
8772
|
const ON_CALL_FAILED = 'onCallFailed';
|
|
8773
|
+
const ON_CALL_REJECTED = 'onCallRejected';
|
|
8733
8774
|
const ON_CALL_ENDED = 'onCallEnded';
|
|
8734
8775
|
const ON_CALL_ENDING = 'onCallEnding';
|
|
8735
8776
|
const ON_MESSAGE = 'onMessage';
|
|
@@ -8774,6 +8815,7 @@ const events = [
|
|
|
8774
8815
|
ON_CAMERA_DISABLED,
|
|
8775
8816
|
ON_CALL_FAILED,
|
|
8776
8817
|
ON_CALL_ENDED,
|
|
8818
|
+
ON_CALL_REJECTED,
|
|
8777
8819
|
ON_MESSAGE,
|
|
8778
8820
|
ON_REINVITE,
|
|
8779
8821
|
ON_TRACK,
|
|
@@ -9130,6 +9172,7 @@ class WebRTCPhone extends Emitter {
|
|
|
9130
9172
|
|
|
9131
9173
|
// Should be called before `_onCallTerminated` or the callCount will not decrement...
|
|
9132
9174
|
const callSession = this._createCallSession(sipSession);
|
|
9175
|
+
callSession.endTime = new Date();
|
|
9133
9176
|
const wasCurrentSession = this._onCallTerminated(sipSession);
|
|
9134
9177
|
|
|
9135
9178
|
return this.eventEmitter.emit(ON_CALL_ENDED, callSession, wasCurrentSession);
|
|
@@ -9325,6 +9368,7 @@ class WebRTCPhone extends Emitter {
|
|
|
9325
9368
|
this.removeIncomingSessions(sipSessionId);
|
|
9326
9369
|
}
|
|
9327
9370
|
|
|
9371
|
+
callSession.answerTime = new Date();
|
|
9328
9372
|
this.eventEmitter.emit(ON_CALL_ACCEPTED, callSession, cameraEnabled);
|
|
9329
9373
|
|
|
9330
9374
|
return callSession;
|
|
@@ -9382,6 +9426,7 @@ class WebRTCPhone extends Emitter {
|
|
|
9382
9426
|
_onCallTerminated(sipSession ) {
|
|
9383
9427
|
logger$7.info('WebRTC phone - on call terminated', { sipId: sipSession.id });
|
|
9384
9428
|
|
|
9429
|
+
const sipSessionId = this.getSipSessionId(sipSession);
|
|
9385
9430
|
const callSession = this._createCallSession(sipSession);
|
|
9386
9431
|
const isCurrentSession = this.isCurrentCallSipSession(callSession);
|
|
9387
9432
|
const isCurrentIncomingCall = callSession.is(this.getIncomingCallSession());
|
|
@@ -9399,7 +9444,6 @@ class WebRTCPhone extends Emitter {
|
|
|
9399
9444
|
}, 5);
|
|
9400
9445
|
}
|
|
9401
9446
|
|
|
9402
|
-
const sipSessionId = this.getSipSessionId(sipSession);
|
|
9403
9447
|
if (sipSessionId) {
|
|
9404
9448
|
this.removeIncomingSessions(sipSessionId);
|
|
9405
9449
|
}
|
|
@@ -9540,6 +9584,7 @@ class WebRTCPhone extends Emitter {
|
|
|
9540
9584
|
}
|
|
9541
9585
|
|
|
9542
9586
|
this.shouldSendReinvite = false;
|
|
9587
|
+
callSession.answerTime = new Date();
|
|
9543
9588
|
this.acceptedSessions[callSession.getId()] = true;
|
|
9544
9589
|
|
|
9545
9590
|
this.eventEmitter.emit(ON_CALL_ANSWERED, callSession);
|
|
@@ -9849,6 +9894,7 @@ class WebRTCPhone extends Emitter {
|
|
|
9849
9894
|
return Promise.resolve(null);
|
|
9850
9895
|
}
|
|
9851
9896
|
const callSession = this._createOutgoingCallSession(sipSession, cameraEnabled || false);
|
|
9897
|
+
callSession.creationTime = new Date();
|
|
9852
9898
|
|
|
9853
9899
|
this.eventEmitter.emit(ON_PLAY_PROGRESS_SOUND, this.audioOutputDeviceId, this.audioOutputVolume);
|
|
9854
9900
|
|
|
@@ -10044,8 +10090,12 @@ class WebRTCPhone extends Emitter {
|
|
|
10044
10090
|
}
|
|
10045
10091
|
|
|
10046
10092
|
const sessionId = this.incomingSessions[0];
|
|
10093
|
+
const sipSession = this.client.getSipSession(sessionId);
|
|
10094
|
+
if (!sipSession) {
|
|
10095
|
+
return null;
|
|
10096
|
+
}
|
|
10047
10097
|
|
|
10048
|
-
return this._createCallSession(
|
|
10098
|
+
return this._createCallSession(sipSession);
|
|
10049
10099
|
}
|
|
10050
10100
|
|
|
10051
10101
|
sendMessage(sipSession = null, body , contentType = 'text/plain') {
|
|
@@ -10123,6 +10173,7 @@ class WebRTCPhone extends Emitter {
|
|
|
10123
10173
|
callSession);
|
|
10124
10174
|
}
|
|
10125
10175
|
|
|
10176
|
+
callSession.creationTime = new Date();
|
|
10126
10177
|
this.eventEmitter.emit(ON_CALL_INCOMING, callSession, wantsToDoVideo);
|
|
10127
10178
|
});
|
|
10128
10179
|
|
|
@@ -10162,6 +10213,13 @@ class WebRTCPhone extends Emitter {
|
|
|
10162
10213
|
this.eventEmitter.emit(ON_CALL_ERROR, e);
|
|
10163
10214
|
});
|
|
10164
10215
|
|
|
10216
|
+
this.client.on(this.client.REJECTED, session => {
|
|
10217
|
+
logger$7.info('WebRTC call rejected', session.id);
|
|
10218
|
+
const callSession = this._createCallSession(session);
|
|
10219
|
+
callSession.endTime = new Date();
|
|
10220
|
+
this.eventEmitter.emit(ON_CALL_REJECTED, callSession);
|
|
10221
|
+
});
|
|
10222
|
+
|
|
10165
10223
|
this.client.on(this.client.UNREGISTERED, () => {
|
|
10166
10224
|
logger$7.info('WebRTC unregistered');
|
|
10167
10225
|
this.eventEmitter.emit(ON_UNREGISTERED);
|
|
@@ -10374,6 +10432,7 @@ class WebRTCPhone extends Emitter {
|
|
|
10374
10432
|
const number = identity ? identity.uri._normal.user : null;
|
|
10375
10433
|
const { state } = sipSession || {};
|
|
10376
10434
|
const sessionId = this.getSipSessionId(sipSession);
|
|
10435
|
+
fromSession = fromSession || this.callSessions[sessionId];
|
|
10377
10436
|
|
|
10378
10437
|
const callSession = new CallSession({
|
|
10379
10438
|
callId: fromSession && fromSession.callId,
|
|
@@ -10381,6 +10440,8 @@ class WebRTCPhone extends Emitter {
|
|
|
10381
10440
|
sipStatus: state,
|
|
10382
10441
|
displayName: identity ? identity.displayName || number : number,
|
|
10383
10442
|
startTime: fromSession ? fromSession.startTime : new Date(),
|
|
10443
|
+
creationTime: fromSession ? fromSession.creationTime : null,
|
|
10444
|
+
endTime: fromSession ? fromSession.endTime : null,
|
|
10384
10445
|
answered: state === sessionState.SessionState.Established,
|
|
10385
10446
|
paused: this.client.isCallHeld(sipSession),
|
|
10386
10447
|
isCaller: 'incoming' in extra ? !extra.incoming : false,
|
|
@@ -10391,6 +10452,7 @@ class WebRTCPhone extends Emitter {
|
|
|
10391
10452
|
videoMuted: fromSession ? fromSession.isVideoMuted() : false,
|
|
10392
10453
|
recording: fromSession ? fromSession.isRecording() : false,
|
|
10393
10454
|
recordingPaused: false, // @TODO
|
|
10455
|
+
sipSession,
|
|
10394
10456
|
...extra,
|
|
10395
10457
|
});
|
|
10396
10458
|
|
|
@@ -10419,6 +10481,7 @@ var PHONE_EVENTS = /*#__PURE__*/Object.freeze({
|
|
|
10419
10481
|
ON_CAMERA_RESUMED: ON_CAMERA_RESUMED,
|
|
10420
10482
|
ON_CALL_CANCELED: ON_CALL_CANCELED,
|
|
10421
10483
|
ON_CALL_FAILED: ON_CALL_FAILED,
|
|
10484
|
+
ON_CALL_REJECTED: ON_CALL_REJECTED,
|
|
10422
10485
|
ON_CALL_ENDED: ON_CALL_ENDED,
|
|
10423
10486
|
ON_CALL_ENDING: ON_CALL_ENDING,
|
|
10424
10487
|
ON_MESSAGE: ON_MESSAGE,
|
|
@@ -10448,6 +10511,14 @@ var PHONE_EVENTS = /*#__PURE__*/Object.freeze({
|
|
|
10448
10511
|
'default': WebRTCPhone
|
|
10449
10512
|
});
|
|
10450
10513
|
|
|
10514
|
+
/* */
|
|
10515
|
+
class SFUNotAvailableError extends Error {
|
|
10516
|
+
constructor(message = 'Sorry your user is not configured to support video conference') {
|
|
10517
|
+
super(message);
|
|
10518
|
+
this.name = 'SFUNotAvailableError';
|
|
10519
|
+
}
|
|
10520
|
+
}
|
|
10521
|
+
|
|
10451
10522
|
//
|
|
10452
10523
|
|
|
10453
10524
|
const logger$6 = IssueReporter$1.loggerFor('simple-phone');
|
|
@@ -10832,7 +10903,7 @@ class Phone extends Emitter {
|
|
|
10832
10903
|
|
|
10833
10904
|
checkSfu() {
|
|
10834
10905
|
if (!this.hasSfu()) {
|
|
10835
|
-
throw new
|
|
10906
|
+
throw new SFUNotAvailableError();
|
|
10836
10907
|
}
|
|
10837
10908
|
}
|
|
10838
10909
|
|
|
@@ -12909,6 +12980,7 @@ const Wazo = {
|
|
|
12909
12980
|
InvalidSubscription,
|
|
12910
12981
|
InvalidAuthorization,
|
|
12911
12982
|
CanceledCallError,
|
|
12983
|
+
SFUNotAvailableError,
|
|
12912
12984
|
};
|
|
12913
12985
|
|
|
12914
12986
|
if (window) {
|