@wazo/sdk 0.37.24 → 0.37.28
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 +6 -6
- package/esm/__tests__/api-client.test.js +14 -14
- package/esm/__tests__/web-rtc-client.test.js +130 -108
- package/esm/api/agentd.js +1 -1
- package/esm/api/amid.js +2 -2
- package/esm/api/application.js +1 -1
- package/esm/api/auth.js +1 -1
- package/esm/api/call-logd.js +3 -3
- 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 +4 -4
- package/esm/api/dird.js +3 -3
- package/esm/api/webhookd.js +2 -2
- package/esm/api-client.js +14 -14
- package/esm/checker/Checker.js +155 -133
- package/esm/checker/checks/aor.js +14 -14
- package/esm/checker/checks/api.js +14 -14
- package/esm/checker/checks/index.js +145 -123
- package/esm/checker/checks/wazo-websocket.js +16 -16
- package/esm/checker/checks/webrtc-transport.js +130 -108
- package/esm/checker/checks/webrtc.js +130 -108
- package/esm/domain/AdHocAPIConference.js +14 -14
- package/esm/domain/CallLog.js +1 -1
- package/esm/domain/CallSession.js +15 -0
- package/esm/domain/Contact.js +2 -2
- package/esm/domain/Features.js +14 -14
- package/esm/domain/Phone/CTIPhone.js +43 -28
- package/esm/domain/Phone/WebRTCPhone.js +126 -90
- package/esm/domain/SFUNotAvailableError.js +9 -0
- package/esm/domain/__tests__/CallLog.test.js +1 -1
- package/esm/domain/__tests__/CallSession.test.js +15 -0
- package/esm/domain/__tests__/Contact.test.js +2 -2
- package/esm/domain/__tests__/IndirectTransfer.test.js +15 -0
- package/esm/domain/__tests__/Room.test.js +15 -0
- package/esm/index.js +415 -346
- package/esm/lib/WazoSessionDescriptionHandler.js +10 -5
- package/esm/service/CallApi.js +14 -14
- package/esm/service/IssueReporter.js +2 -2
- package/esm/service/__tests__/IssueReporter.test.js +2 -2
- package/esm/service/getApiClient.js +14 -14
- package/esm/simple/Auth.js +404 -336
- package/esm/simple/Configuration.js +404 -336
- package/esm/simple/Directory.js +14 -14
- package/esm/simple/Phone.js +404 -336
- package/esm/simple/Websocket.js +18 -18
- package/esm/simple/index.js +408 -340
- package/esm/simple/room/LocalParticipant.js +408 -340
- package/esm/simple/room/Participant.js +408 -340
- package/esm/simple/room/RemoteParticipant.js +408 -340
- package/esm/simple/room/Room.js +409 -341
- package/esm/simple/room/SipRoom.js +408 -340
- package/esm/simple/room/Stream.js +408 -340
- package/esm/simple/room/__tests__/RemoteParticipant.test.js +408 -340
- package/esm/simple/utils.js +408 -340
- package/esm/utils/__tests__/api-requester.test.js +1 -1
- package/esm/utils/api-requester.js +1 -1
- package/esm/web-rtc-client.js +130 -108
- package/esm/websocket-client.js +16 -16
- package/lib/__tests__/api-client.test.js +14 -14
- package/lib/__tests__/web-rtc-client.test.js +130 -108
- package/lib/api/agentd.js +1 -1
- package/lib/api/amid.js +2 -2
- package/lib/api/application.js +1 -1
- package/lib/api/auth.js +1 -1
- package/lib/api/call-logd.js +3 -3
- 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 +4 -4
- package/lib/api/dird.js +3 -3
- package/lib/api/webhookd.js +2 -2
- package/lib/api-client.js +14 -14
- package/lib/checker/Checker.js +155 -133
- package/lib/checker/checks/aor.js +14 -14
- package/lib/checker/checks/api.js +14 -14
- package/lib/checker/checks/index.js +145 -123
- package/lib/checker/checks/wazo-websocket.js +16 -16
- package/lib/checker/checks/webrtc-transport.js +130 -108
- package/lib/checker/checks/webrtc.js +130 -108
- package/lib/domain/AdHocAPIConference.js +14 -14
- package/lib/domain/CallLog.js +1 -1
- package/lib/domain/CallSession.js +15 -0
- package/lib/domain/Contact.js +2 -2
- package/lib/domain/Features.js +14 -14
- package/lib/domain/Phone/CTIPhone.js +43 -28
- package/lib/domain/Phone/WebRTCPhone.js +126 -89
- package/lib/domain/SFUNotAvailableError.js +11 -0
- package/lib/domain/__tests__/CallLog.test.js +1 -1
- package/lib/domain/__tests__/CallSession.test.js +15 -0
- package/lib/domain/__tests__/Contact.test.js +2 -2
- package/lib/domain/__tests__/IndirectTransfer.test.js +15 -0
- package/lib/domain/__tests__/Room.test.js +15 -0
- package/lib/index.js +415 -346
- package/lib/lib/WazoSessionDescriptionHandler.js +10 -5
- package/lib/service/CallApi.js +14 -14
- package/lib/service/IssueReporter.js +2 -2
- package/lib/service/__tests__/IssueReporter.test.js +2 -2
- package/lib/service/getApiClient.js +14 -14
- package/lib/simple/Auth.js +404 -336
- package/lib/simple/Configuration.js +404 -336
- package/lib/simple/Directory.js +14 -14
- package/lib/simple/Phone.js +404 -336
- package/lib/simple/Websocket.js +18 -18
- package/lib/simple/index.js +408 -340
- package/lib/simple/room/LocalParticipant.js +408 -340
- package/lib/simple/room/Participant.js +408 -340
- package/lib/simple/room/RemoteParticipant.js +408 -340
- package/lib/simple/room/Room.js +409 -341
- package/lib/simple/room/SipRoom.js +408 -340
- package/lib/simple/room/Stream.js +408 -340
- package/lib/simple/room/__tests__/RemoteParticipant.test.js +408 -340
- package/lib/simple/utils.js +408 -340
- package/lib/utils/__tests__/api-requester.test.js +1 -1
- package/lib/utils/api-requester.js +1 -1
- package/lib/web-rtc-client.js +130 -108
- package/lib/websocket-client.js +16 -16
- package/package.json +1 -1
- package/src/domain/CallSession.js +16 -0
- package/src/domain/Contact.js +1 -1
- package/src/domain/Phone/WebRTCPhone.js +25 -4
- package/src/domain/SFUNotAvailableError.js +7 -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 +27 -10
|
@@ -468,11 +468,11 @@ var IssueReporter$1 = new IssueReporter();
|
|
|
468
468
|
|
|
469
469
|
const methods = ['head', 'get', 'post', 'put', 'delete'];
|
|
470
470
|
|
|
471
|
-
const logger = IssueReporter$1 ? IssueReporter$1.loggerFor('api') : console;
|
|
471
|
+
const logger$3 = IssueReporter$1 ? IssueReporter$1.loggerFor('api') : console;
|
|
472
472
|
|
|
473
473
|
// Use a function here to be able to mock it in tests
|
|
474
474
|
const realFetch = () => {
|
|
475
|
-
if (typeof document !== 'undefined') {
|
|
475
|
+
if (typeof document !== 'undefined' && window.fetch) {
|
|
476
476
|
// Browser
|
|
477
477
|
return window.fetch;
|
|
478
478
|
}
|
|
@@ -607,7 +607,7 @@ class ApiRequester {
|
|
|
607
607
|
};
|
|
608
608
|
|
|
609
609
|
if (this.refreshTokenPromise) {
|
|
610
|
-
logger.info('A token is already refreshing, waiting ...', { url });
|
|
610
|
+
logger$3.info('A token is already refreshing, waiting ...', { url });
|
|
611
611
|
await this.refreshTokenPromise;
|
|
612
612
|
}
|
|
613
613
|
|
|
@@ -627,7 +627,7 @@ class ApiRequester {
|
|
|
627
627
|
return promise.then(async (err ) => {
|
|
628
628
|
// Check if the token is still valid
|
|
629
629
|
if (firstCall && this._checkTokenExpired(response, err)) {
|
|
630
|
-
logger.warn('token expired', { error: err.reason });
|
|
630
|
+
logger$3.warn('token expired', { error: err.reason });
|
|
631
631
|
// Replay the call after refreshing the token
|
|
632
632
|
return this._replayWithNewToken(err, path, method, body, headers, parse);
|
|
633
633
|
}
|
|
@@ -637,7 +637,7 @@ class ApiRequester {
|
|
|
637
637
|
: exceptionClass.fromResponse(err, response.status);
|
|
638
638
|
|
|
639
639
|
if (this.shouldLogErrors) {
|
|
640
|
-
logger.error('API error', error);
|
|
640
|
+
logger$3.error('API error', error);
|
|
641
641
|
}
|
|
642
642
|
|
|
643
643
|
throw error;
|
|
@@ -647,7 +647,7 @@ class ApiRequester {
|
|
|
647
647
|
return newParse(response, isJson);
|
|
648
648
|
}).catch(error => {
|
|
649
649
|
if (this.shouldLogErrors) {
|
|
650
|
-
logger.error('Fetch failed', { url, options, message: error.message, stack: error.stack });
|
|
650
|
+
logger$3.error('Fetch failed', { url, options, message: error.message, stack: error.stack });
|
|
651
651
|
}
|
|
652
652
|
|
|
653
653
|
throw error;
|
|
@@ -675,13 +675,13 @@ class ApiRequester {
|
|
|
675
675
|
) {
|
|
676
676
|
const isTokenNotFound = this._isTokenNotFound(err);
|
|
677
677
|
let newPath = path;
|
|
678
|
-
logger.info('refreshing token', { inProgress: !!this.refreshTokenPromise });
|
|
678
|
+
logger$3.info('refreshing token', { inProgress: !!this.refreshTokenPromise });
|
|
679
679
|
|
|
680
680
|
this.refreshTokenPromise = this.refreshTokenPromise || this.refreshTokenCallback();
|
|
681
681
|
|
|
682
682
|
return this.refreshTokenPromise.then(() => {
|
|
683
683
|
this.refreshTokenPromise = null;
|
|
684
|
-
logger.info('token refreshed', { isTokenNotFound });
|
|
684
|
+
logger$3.info('token refreshed', { isTokenNotFound });
|
|
685
685
|
if (isTokenNotFound) {
|
|
686
686
|
const pathParts = path.split('/');
|
|
687
687
|
pathParts.pop();
|
|
@@ -1932,7 +1932,7 @@ class Contact {
|
|
|
1932
1932
|
this[key] = old[key] || this[key];
|
|
1933
1933
|
});
|
|
1934
1934
|
|
|
1935
|
-
if (old.lineState
|
|
1935
|
+
if (old.lineState) {
|
|
1936
1936
|
this.lineState = old.lineState;
|
|
1937
1937
|
}
|
|
1938
1938
|
|
|
@@ -3649,7 +3649,7 @@ const TRANSFER_FLOW_BLIND = 'blind';
|
|
|
3649
3649
|
|
|
3650
3650
|
// const MINIMUM_WAZO_ENGINE_VERSION_FOR_CTI_HOLD = '20.11';
|
|
3651
3651
|
|
|
3652
|
-
|
|
3652
|
+
IssueReporter$1 ? IssueReporter$1.loggerFor('cti-phone') : console;
|
|
3653
3653
|
|
|
3654
3654
|
/* */
|
|
3655
3655
|
|
|
@@ -4993,7 +4993,7 @@ const BLACKLIST_EVENTS = [
|
|
|
4993
4993
|
];
|
|
4994
4994
|
|
|
4995
4995
|
const HEARTBEAT_ENGINE_VERSION = '20.09';
|
|
4996
|
-
const logger$
|
|
4996
|
+
const logger$1 = IssueReporter$1.loggerFor('wazo-ws');
|
|
4997
4997
|
const messageLogger = IssueReporter$1.loggerFor('wazo-ws-message');
|
|
4998
4998
|
|
|
4999
4999
|
class WebSocketClient extends Emitter {
|
|
@@ -5042,19 +5042,19 @@ class WebSocketClient extends Emitter {
|
|
|
5042
5042
|
}
|
|
5043
5043
|
|
|
5044
5044
|
connect() {
|
|
5045
|
-
logger$
|
|
5045
|
+
logger$1.info('connect method started', { host: this.host, token: this.token });
|
|
5046
5046
|
this.socket = new ReconnectingWebSocket__default['default'](this._getUrl.bind(this), [], this.options);
|
|
5047
5047
|
if (this.options.binaryType) {
|
|
5048
5048
|
this.socket.binaryType = this.options.binaryType;
|
|
5049
5049
|
}
|
|
5050
5050
|
|
|
5051
5051
|
this.socket.onopen = () => {
|
|
5052
|
-
logger$
|
|
5052
|
+
logger$1.info('on Wazo WS open', { method: 'connect', host: this.host });
|
|
5053
5053
|
this.eventEmitter.emit(SOCKET_EVENTS.ON_OPEN);
|
|
5054
5054
|
};
|
|
5055
5055
|
|
|
5056
5056
|
this.socket.onerror = event => {
|
|
5057
|
-
logger$
|
|
5057
|
+
logger$1.error('on Wazo WS error', event.target);
|
|
5058
5058
|
this.eventEmitter.emit(SOCKET_EVENTS.ON_ERROR, event);
|
|
5059
5059
|
};
|
|
5060
5060
|
|
|
@@ -5084,7 +5084,7 @@ class WebSocketClient extends Emitter {
|
|
|
5084
5084
|
|
|
5085
5085
|
this.socket.onclose = event => {
|
|
5086
5086
|
// Can't be converted to JSON (circular structure)
|
|
5087
|
-
logger$
|
|
5087
|
+
logger$1.info('on Wazo WS close', {
|
|
5088
5088
|
reason: event.reason,
|
|
5089
5089
|
code: event.code,
|
|
5090
5090
|
readyState: event.target.readyState,
|
|
@@ -5102,12 +5102,12 @@ class WebSocketClient extends Emitter {
|
|
|
5102
5102
|
};
|
|
5103
5103
|
|
|
5104
5104
|
this.socket.onerror = event => {
|
|
5105
|
-
logger$
|
|
5105
|
+
logger$1.info('Wazo WS error', { message: event.message, code: event.code, readyState: event.target.readyState });
|
|
5106
5106
|
};
|
|
5107
5107
|
}
|
|
5108
5108
|
|
|
5109
5109
|
close(force = false) {
|
|
5110
|
-
logger$
|
|
5110
|
+
logger$1.info('Wazo WS close', { socket: !!this.socket, host: this.host, token: this.token });
|
|
5111
5111
|
|
|
5112
5112
|
if (!this.socket) {
|
|
5113
5113
|
return;
|
|
@@ -5125,7 +5125,7 @@ class WebSocketClient extends Emitter {
|
|
|
5125
5125
|
|
|
5126
5126
|
updateToken(token ) {
|
|
5127
5127
|
this.token = token;
|
|
5128
|
-
logger$
|
|
5128
|
+
logger$1.info('Wazo WS updating token', { url: this._getUrl(), token, socket: !!this.socket });
|
|
5129
5129
|
|
|
5130
5130
|
if (this.socket) {
|
|
5131
5131
|
// If still connected, send the token to the WS
|
|
@@ -5143,7 +5143,7 @@ class WebSocketClient extends Emitter {
|
|
|
5143
5143
|
}
|
|
5144
5144
|
|
|
5145
5145
|
startHeartbeat() {
|
|
5146
|
-
logger$
|
|
5146
|
+
logger$1.info('Wazo WS start heartbeat', { host: this.host, token: this.token });
|
|
5147
5147
|
|
|
5148
5148
|
if (!this.socket) {
|
|
5149
5149
|
this.heartbeat.stop();
|
|
@@ -5157,7 +5157,7 @@ class WebSocketClient extends Emitter {
|
|
|
5157
5157
|
}
|
|
5158
5158
|
|
|
5159
5159
|
stopHeartbeat() {
|
|
5160
|
-
logger$
|
|
5160
|
+
logger$1.info('Wazo WS stop heartbeat', { host: this.host, token: this.token });
|
|
5161
5161
|
|
|
5162
5162
|
this.heartbeat.stop();
|
|
5163
5163
|
}
|
|
@@ -5187,7 +5187,7 @@ class WebSocketClient extends Emitter {
|
|
|
5187
5187
|
}
|
|
5188
5188
|
|
|
5189
5189
|
reconnect(reason ) {
|
|
5190
|
-
logger$
|
|
5190
|
+
logger$1.info('Wazo WS reconnect', { reason, socket: !!this.socket, host: this.host, token: this.token });
|
|
5191
5191
|
if (!this.socket) {
|
|
5192
5192
|
return;
|
|
5193
5193
|
}
|
|
@@ -5243,7 +5243,7 @@ class WebSocketClient extends Emitter {
|
|
|
5243
5243
|
this.close();
|
|
5244
5244
|
}
|
|
5245
5245
|
const url = `wss://${this.host || ''}/api/websocketd/?token=${this.token || ''}&version=${this.version}`;
|
|
5246
|
-
logger$
|
|
5246
|
+
logger$1.log('Wazo WS url computed to reconnect', { url });
|
|
5247
5247
|
|
|
5248
5248
|
return url;
|
|
5249
5249
|
}
|
|
@@ -5251,12 +5251,12 @@ class WebSocketClient extends Emitter {
|
|
|
5251
5251
|
_onHeartbeat(message ) {
|
|
5252
5252
|
if (message.payload === 'pong') {
|
|
5253
5253
|
this.heartbeat.onHeartbeat();
|
|
5254
|
-
logger$
|
|
5254
|
+
logger$1.log('on heartbeat received from Wazo WS');
|
|
5255
5255
|
}
|
|
5256
5256
|
}
|
|
5257
5257
|
|
|
5258
5258
|
async _onHeartbeatTimeout() {
|
|
5259
|
-
logger$
|
|
5259
|
+
logger$1.log('heartbeat timed out', { host: this.host, token: this.token });
|
|
5260
5260
|
|
|
5261
5261
|
this.close();
|
|
5262
5262
|
this.eventEmitter.emit(SOCKET_EVENTS.ON_CLOSE, new Error('Websocket ping failure.'));
|
|
@@ -5377,7 +5377,7 @@ var wazoWebsocket = {
|
|
|
5377
5377
|
|
|
5378
5378
|
/* */
|
|
5379
5379
|
|
|
5380
|
-
const parseCandidate = (candidate ) => {
|
|
5380
|
+
const parseCandidate$1 = (candidate ) => {
|
|
5381
5381
|
if (!candidate) {
|
|
5382
5382
|
return null;
|
|
5383
5383
|
}
|
|
@@ -5489,11 +5489,16 @@ class WazoSessionDescriptionHandler extends sessionDescriptionHandler.SessionDes
|
|
|
5489
5489
|
|
|
5490
5490
|
// $FlowFixMe
|
|
5491
5491
|
setRemoteSessionDescription(sessionDescription ) {
|
|
5492
|
-
|
|
5492
|
+
try {
|
|
5493
|
+
const result = super.setRemoteSessionDescription(sessionDescription);
|
|
5493
5494
|
|
|
5494
|
-
|
|
5495
|
+
this.eventEmitter.emit('setDescription', sessionDescription);
|
|
5495
5496
|
|
|
5496
|
-
|
|
5497
|
+
return result;
|
|
5498
|
+
} catch (error) {
|
|
5499
|
+
this.logger.error('SessionDescriptionHandler.setRemoteSessionDescription error', error);
|
|
5500
|
+
throw error;
|
|
5501
|
+
}
|
|
5497
5502
|
}
|
|
5498
5503
|
|
|
5499
5504
|
// Overridden to avoid to fix ice-candidates missing in the SDP in react-native and chrome canary.
|
|
@@ -5531,7 +5536,7 @@ class WazoSessionDescriptionHandler extends sessionDescriptionHandler.SessionDes
|
|
|
5531
5536
|
this.peerConnectionDelegate.onicecandidate = event => {
|
|
5532
5537
|
wazoLogger.trace('onicecandidate', event.candidate ? event.candidate.candidate : { done: true });
|
|
5533
5538
|
if (event.candidate) {
|
|
5534
|
-
this.gatheredCandidates.push(parseCandidate(event.candidate.candidate));
|
|
5539
|
+
this.gatheredCandidates.push(parseCandidate$1(event.candidate.candidate));
|
|
5535
5540
|
}
|
|
5536
5541
|
};
|
|
5537
5542
|
|
|
@@ -5900,7 +5905,7 @@ const DEFAULT_ICE_TIMEOUT = 3000;
|
|
|
5900
5905
|
const SEND_STATS_DELAY = 5000;
|
|
5901
5906
|
|
|
5902
5907
|
const states = ['STATUS_NULL', 'STATUS_NEW', 'STATUS_CONNECTING', 'STATUS_CONNECTED', 'STATUS_COMPLETED'];
|
|
5903
|
-
const logger
|
|
5908
|
+
const logger = IssueReporter$1 ? IssueReporter$1.loggerFor('webrtc-client') : console;
|
|
5904
5909
|
const statsLogger = IssueReporter$1 ? IssueReporter$1.loggerFor('webrtc-stats') : console;
|
|
5905
5910
|
|
|
5906
5911
|
// events
|
|
@@ -6076,13 +6081,13 @@ class WebRTCClient extends Emitter {
|
|
|
6076
6081
|
|
|
6077
6082
|
createUserAgent(configOverrides ) {
|
|
6078
6083
|
const webRTCConfiguration = this._createWebRTCConfiguration(configOverrides);
|
|
6079
|
-
logger
|
|
6084
|
+
logger.info('sdk webrtc, creating UA', { webRTCConfiguration });
|
|
6080
6085
|
|
|
6081
6086
|
webRTCConfiguration.delegate = {
|
|
6082
6087
|
onConnect: this.onConnect.bind(this),
|
|
6083
6088
|
onDisconnect: this.onDisconnect.bind(this),
|
|
6084
6089
|
onInvite: (invitation ) => {
|
|
6085
|
-
logger
|
|
6090
|
+
logger.info('sdk webrtc on invite', {
|
|
6086
6091
|
method: 'delegate.onInvite',
|
|
6087
6092
|
id: invitation.id,
|
|
6088
6093
|
remoteURI: invitation.remoteURI,
|
|
@@ -6125,7 +6130,7 @@ class WebRTCClient extends Emitter {
|
|
|
6125
6130
|
}
|
|
6126
6131
|
|
|
6127
6132
|
onConnect() {
|
|
6128
|
-
logger
|
|
6133
|
+
logger.info('sdk webrtc connected', { method: 'delegate.onConnect' });
|
|
6129
6134
|
this.eventEmitter.emit(CONNECTED);
|
|
6130
6135
|
if (!this.isRegistered() && this.registerer && this.registerer.waiting) {
|
|
6131
6136
|
this.registerer.waitingToggle(false);
|
|
@@ -6134,7 +6139,7 @@ class WebRTCClient extends Emitter {
|
|
|
6134
6139
|
}
|
|
6135
6140
|
|
|
6136
6141
|
async onDisconnect(error ) {
|
|
6137
|
-
logger
|
|
6142
|
+
logger.info('sdk webrtc disconnected', { method: 'delegate.onConnect', error });
|
|
6138
6143
|
this.connectionPromise = null;
|
|
6139
6144
|
// The UA will attempt to reconnect automatically when an error occurred
|
|
6140
6145
|
this.eventEmitter.emit(DISCONNECTED, error);
|
|
@@ -6159,37 +6164,37 @@ class WebRTCClient extends Emitter {
|
|
|
6159
6164
|
};
|
|
6160
6165
|
|
|
6161
6166
|
if (this.skipRegister) {
|
|
6162
|
-
logger
|
|
6167
|
+
logger.info('sdk webrtc skip register...', logInfo);
|
|
6163
6168
|
return Promise.resolve();
|
|
6164
6169
|
}
|
|
6165
6170
|
|
|
6166
|
-
logger
|
|
6171
|
+
logger.info('sdk webrtc registering...', logInfo);
|
|
6167
6172
|
|
|
6168
6173
|
if (!this.userAgent) {
|
|
6169
|
-
logger
|
|
6174
|
+
logger.info('sdk webrtc recreating User Agent');
|
|
6170
6175
|
this.userAgent = this.createUserAgent(this.uaConfigOverrides);
|
|
6171
6176
|
}
|
|
6172
6177
|
if (!this.userAgent || this.isRegistered()) {
|
|
6173
|
-
logger
|
|
6178
|
+
logger.info('sdk webrtc registering aborted, already registered or no UA can be created');
|
|
6174
6179
|
return Promise.resolve();
|
|
6175
6180
|
}
|
|
6176
6181
|
|
|
6177
6182
|
if (this.connectionPromise || (this.registerer && this.registerer.waiting)) {
|
|
6178
|
-
logger
|
|
6183
|
+
logger.info('sdk webrtc registering aborted due to a registration in progress.');
|
|
6179
6184
|
return Promise.resolve();
|
|
6180
6185
|
}
|
|
6181
6186
|
|
|
6182
6187
|
const registerOptions = this._isWeb() ? {} : { extraContactHeaderParams: ['mobility=mobile'] };
|
|
6183
6188
|
|
|
6184
6189
|
const onRegisterFailed = () => {
|
|
6185
|
-
logger
|
|
6190
|
+
logger.info('sdk webrtc registering failed', { tries, registerer: !!this.registerer });
|
|
6186
6191
|
this.connectionPromise = null;
|
|
6187
6192
|
if (this.registerer && this.registerer.waiting) {
|
|
6188
6193
|
this.registerer.waitingToggle(false);
|
|
6189
6194
|
}
|
|
6190
6195
|
|
|
6191
6196
|
if (tries <= MAX_REGISTER_TRIES) {
|
|
6192
|
-
logger
|
|
6197
|
+
logger.info('sdk webrtc registering, retrying...', { tries });
|
|
6193
6198
|
setTimeout(() => this.register(tries + 1), 300);
|
|
6194
6199
|
}
|
|
6195
6200
|
};
|
|
@@ -6198,18 +6203,18 @@ class WebRTCClient extends Emitter {
|
|
|
6198
6203
|
// Avoid race condition with the close method called just before register and setting userAgent to null
|
|
6199
6204
|
// during the resolution of the primise.
|
|
6200
6205
|
if (!this.userAgent) {
|
|
6201
|
-
logger
|
|
6206
|
+
logger.info('sdk webrtc recreating User Agent after connection');
|
|
6202
6207
|
this.userAgent = this.createUserAgent(this.uaConfigOverrides);
|
|
6203
6208
|
}
|
|
6204
6209
|
|
|
6205
|
-
logger
|
|
6210
|
+
logger.info('sdk webrtc registering, transport connected', { registerOptions, ua: !!this.userAgent });
|
|
6206
6211
|
this.registerer = new registerer.Registerer(this.userAgent, registerOptions);
|
|
6207
6212
|
this.connectionPromise = null;
|
|
6208
6213
|
this._monkeyPatchRegisterer(this.registerer);
|
|
6209
6214
|
|
|
6210
6215
|
// Bind registerer events
|
|
6211
6216
|
this.registerer.stateChange.addListener(newState => {
|
|
6212
|
-
logger
|
|
6217
|
+
logger.info('sdk webrtc registering, state changed', { newState });
|
|
6213
6218
|
|
|
6214
6219
|
if (newState === registererState.RegistererState.Registered && this.registerer
|
|
6215
6220
|
&& this.registerer.state === registererState.RegistererState.Registered) {
|
|
@@ -6222,7 +6227,7 @@ class WebRTCClient extends Emitter {
|
|
|
6222
6227
|
const options = {
|
|
6223
6228
|
requestDelegate: {
|
|
6224
6229
|
onReject: response => {
|
|
6225
|
-
logger
|
|
6230
|
+
logger.error('sdk webrtc registering, rejected', { response });
|
|
6226
6231
|
|
|
6227
6232
|
onRegisterFailed();
|
|
6228
6233
|
},
|
|
@@ -6230,13 +6235,13 @@ class WebRTCClient extends Emitter {
|
|
|
6230
6235
|
};
|
|
6231
6236
|
|
|
6232
6237
|
return this.registerer.register(options).catch((e) => {
|
|
6233
|
-
logger
|
|
6238
|
+
logger.error('sdk webrtc registering, error', e);
|
|
6234
6239
|
|
|
6235
6240
|
this.eventEmitter.emit(REGISTRATION_FAILED);
|
|
6236
6241
|
return e;
|
|
6237
6242
|
});
|
|
6238
6243
|
}).catch(error => {
|
|
6239
|
-
logger
|
|
6244
|
+
logger.error('sdk webrtc registering, transport error', error);
|
|
6240
6245
|
onRegisterFailed();
|
|
6241
6246
|
});
|
|
6242
6247
|
}
|
|
@@ -6265,21 +6270,21 @@ class WebRTCClient extends Emitter {
|
|
|
6265
6270
|
}
|
|
6266
6271
|
|
|
6267
6272
|
unregister() {
|
|
6268
|
-
logger
|
|
6273
|
+
logger.info('sdk webrtc unregistering..', { userAgent: !!this.userAgent, registerer: !!this.registerer });
|
|
6269
6274
|
if (!this.registerer) {
|
|
6270
6275
|
return Promise.resolve();
|
|
6271
6276
|
}
|
|
6272
6277
|
|
|
6273
6278
|
try {
|
|
6274
6279
|
return this.registerer.unregister().then(() => {
|
|
6275
|
-
logger
|
|
6280
|
+
logger.info('sdk webrtc unregistered');
|
|
6276
6281
|
this._cleanupRegister();
|
|
6277
6282
|
}).catch(e => {
|
|
6278
|
-
logger
|
|
6283
|
+
logger.error('sdk webrtc unregistering, promise error', e);
|
|
6279
6284
|
this._cleanupRegister();
|
|
6280
6285
|
});
|
|
6281
6286
|
} catch (e) {
|
|
6282
|
-
logger
|
|
6287
|
+
logger.error('sdk webrtc unregistering, error', e);
|
|
6283
6288
|
// Avoid issue with `undefined is not an object (evaluating 'new.target.prototype')` when triggering a new
|
|
6284
6289
|
// error when the registerer is in a bad state
|
|
6285
6290
|
this._cleanupRegister();
|
|
@@ -6287,7 +6292,7 @@ class WebRTCClient extends Emitter {
|
|
|
6287
6292
|
}
|
|
6288
6293
|
|
|
6289
6294
|
stop() {
|
|
6290
|
-
logger
|
|
6295
|
+
logger.info('sdk webrtc stop', { userAgent: !!this.userAgent });
|
|
6291
6296
|
if (!this.userAgent) {
|
|
6292
6297
|
return Promise.resolve();
|
|
6293
6298
|
}
|
|
@@ -6295,12 +6300,12 @@ class WebRTCClient extends Emitter {
|
|
|
6295
6300
|
return this.userAgent.stop().then(() => {
|
|
6296
6301
|
return this._cleanupRegister();
|
|
6297
6302
|
}).catch(e => {
|
|
6298
|
-
logger
|
|
6303
|
+
logger.warn('sdk webrtc stop, error', { message: e.message, stack: e.stack });
|
|
6299
6304
|
});
|
|
6300
6305
|
}
|
|
6301
6306
|
|
|
6302
6307
|
call(number , enableVideo , audioOnly = false, conference = false) {
|
|
6303
|
-
logger
|
|
6308
|
+
logger.info('sdk webrtc creating call', { number, enableVideo, audioOnly, conference });
|
|
6304
6309
|
const inviterOptions = {
|
|
6305
6310
|
sessionDescriptionHandlerOptionsReInvite: {
|
|
6306
6311
|
conference,
|
|
@@ -6331,7 +6336,7 @@ class WebRTCClient extends Emitter {
|
|
|
6331
6336
|
this._onAccepted(session, response.session, true);
|
|
6332
6337
|
},
|
|
6333
6338
|
onReject: (response ) => {
|
|
6334
|
-
logger
|
|
6339
|
+
logger.info('on call rejected', { id: session.id, fromTag: session.fromTag });
|
|
6335
6340
|
this._stopSendingStats(session);
|
|
6336
6341
|
this.stopNetworkMonitoring(session);
|
|
6337
6342
|
|
|
@@ -6354,11 +6359,11 @@ class WebRTCClient extends Emitter {
|
|
|
6354
6359
|
}
|
|
6355
6360
|
|
|
6356
6361
|
answer(session , enableVideo ) {
|
|
6357
|
-
logger
|
|
6362
|
+
logger.info('sdk webrtc answer call', { id: session.id, enableVideo });
|
|
6358
6363
|
|
|
6359
6364
|
if (!session || !session.accept) {
|
|
6360
6365
|
const error = 'No session to answer, or not an invitation';
|
|
6361
|
-
logger
|
|
6366
|
+
logger.warn(error);
|
|
6362
6367
|
return Promise.reject(new Error(error));
|
|
6363
6368
|
}
|
|
6364
6369
|
const options = {
|
|
@@ -6368,15 +6373,15 @@ class WebRTCClient extends Emitter {
|
|
|
6368
6373
|
return session.accept(options).then(() => {
|
|
6369
6374
|
if (session.isCanceled) {
|
|
6370
6375
|
const message = 'accepted a canceled session (or was canceled during the accept phase).';
|
|
6371
|
-
logger
|
|
6376
|
+
logger.error(message, { id: session.id });
|
|
6372
6377
|
this.onCallEnded(session);
|
|
6373
6378
|
|
|
6374
6379
|
throw new CanceledCallError(message);
|
|
6375
6380
|
}
|
|
6376
|
-
logger
|
|
6381
|
+
logger.info('sdk webrtc answer, accepted.');
|
|
6377
6382
|
this._onAccepted(session);
|
|
6378
6383
|
}).catch(e => {
|
|
6379
|
-
logger
|
|
6384
|
+
logger.error(`answer call error for ${session ? session.id : 'n/a'}`, e);
|
|
6380
6385
|
|
|
6381
6386
|
throw e;
|
|
6382
6387
|
});
|
|
@@ -6384,7 +6389,7 @@ class WebRTCClient extends Emitter {
|
|
|
6384
6389
|
|
|
6385
6390
|
hangup(session ) {
|
|
6386
6391
|
const { state, id } = session;
|
|
6387
|
-
logger
|
|
6392
|
+
logger.info('sdk webrtc hangup call', { id, state });
|
|
6388
6393
|
|
|
6389
6394
|
try {
|
|
6390
6395
|
this._stopSendingStats(session);
|
|
@@ -6413,7 +6418,7 @@ class WebRTCClient extends Emitter {
|
|
|
6413
6418
|
|
|
6414
6419
|
return bye();
|
|
6415
6420
|
} catch (error) {
|
|
6416
|
-
logger
|
|
6421
|
+
logger.warn('sdk webrtc hangup, error', error);
|
|
6417
6422
|
}
|
|
6418
6423
|
|
|
6419
6424
|
return null;
|
|
@@ -6431,7 +6436,7 @@ class WebRTCClient extends Emitter {
|
|
|
6431
6436
|
// Fetch and emit an event at `interval` with session network stats
|
|
6432
6437
|
startNetworkMonitoring(session , interval = 1000) {
|
|
6433
6438
|
const sessionId = this.getSipSessionId(session);
|
|
6434
|
-
logger
|
|
6439
|
+
logger.info('starting network inspection', { id: sessionId });
|
|
6435
6440
|
|
|
6436
6441
|
this.sessionNetworkStats[sessionId] = [];
|
|
6437
6442
|
|
|
@@ -6441,7 +6446,7 @@ class WebRTCClient extends Emitter {
|
|
|
6441
6446
|
stopNetworkMonitoring(session ) {
|
|
6442
6447
|
const sessionId = this.getSipSessionId(session);
|
|
6443
6448
|
const exists = sessionId in this.networkMonitoringInterval;
|
|
6444
|
-
logger
|
|
6449
|
+
logger.info('stopping network inspection', { id: sessionId, exists });
|
|
6445
6450
|
|
|
6446
6451
|
if (exists) {
|
|
6447
6452
|
clearInterval(this.networkMonitoringInterval[sessionId]);
|
|
@@ -6451,17 +6456,17 @@ class WebRTCClient extends Emitter {
|
|
|
6451
6456
|
}
|
|
6452
6457
|
|
|
6453
6458
|
reject(session ) {
|
|
6454
|
-
logger
|
|
6459
|
+
logger.info('sdk webrtc reject call', { id: session.id });
|
|
6455
6460
|
|
|
6456
6461
|
try {
|
|
6457
6462
|
return session.reject ? session.reject() : session.cancel();
|
|
6458
6463
|
} catch (e) {
|
|
6459
|
-
logger
|
|
6464
|
+
logger.warn('Error when rejecting call', e.message, e.stack);
|
|
6460
6465
|
}
|
|
6461
6466
|
}
|
|
6462
6467
|
|
|
6463
6468
|
async close() {
|
|
6464
|
-
logger
|
|
6469
|
+
logger.info('sdk webrtc closing client', { userAgent: !!this.userAgent });
|
|
6465
6470
|
this._cleanupMedia();
|
|
6466
6471
|
this.connectionPromise = null;
|
|
6467
6472
|
|
|
@@ -6492,7 +6497,7 @@ class WebRTCClient extends Emitter {
|
|
|
6492
6497
|
// eg: "INVITE not rejectable in state Completed"
|
|
6493
6498
|
}
|
|
6494
6499
|
this.userAgent = null;
|
|
6495
|
-
logger
|
|
6500
|
+
logger.info('sdk webrtc client closed');
|
|
6496
6501
|
}
|
|
6497
6502
|
|
|
6498
6503
|
getNumber(session ) {
|
|
@@ -6505,13 +6510,13 @@ class WebRTCClient extends Emitter {
|
|
|
6505
6510
|
}
|
|
6506
6511
|
|
|
6507
6512
|
mute(session ) {
|
|
6508
|
-
logger
|
|
6513
|
+
logger.info('sdk webrtc mute', { id: session.id });
|
|
6509
6514
|
|
|
6510
6515
|
this._toggleAudio(session, true);
|
|
6511
6516
|
}
|
|
6512
6517
|
|
|
6513
6518
|
unmute(session ) {
|
|
6514
|
-
logger
|
|
6519
|
+
logger.info('sdk webrtc unmute', { id: session.id });
|
|
6515
6520
|
|
|
6516
6521
|
this._toggleAudio(session, false);
|
|
6517
6522
|
}
|
|
@@ -6551,13 +6556,13 @@ class WebRTCClient extends Emitter {
|
|
|
6551
6556
|
}
|
|
6552
6557
|
|
|
6553
6558
|
toggleCameraOn(session ) {
|
|
6554
|
-
logger
|
|
6559
|
+
logger.info('sdk webrtc toggle camera on', { id: session.id });
|
|
6555
6560
|
|
|
6556
6561
|
this._toggleVideo(session, false);
|
|
6557
6562
|
}
|
|
6558
6563
|
|
|
6559
6564
|
toggleCameraOff(session ) {
|
|
6560
|
-
logger
|
|
6565
|
+
logger.info('sdk webrtc toggle camera off', { id: session.id });
|
|
6561
6566
|
|
|
6562
6567
|
this._toggleVideo(session, true);
|
|
6563
6568
|
}
|
|
@@ -6566,7 +6571,7 @@ class WebRTCClient extends Emitter {
|
|
|
6566
6571
|
const sessionId = this.getSipSessionId(session);
|
|
6567
6572
|
const hasVideo = hadVideo || this.hasLocalVideo(sessionId);
|
|
6568
6573
|
|
|
6569
|
-
logger
|
|
6574
|
+
logger.info('sdk webrtc hold', {
|
|
6570
6575
|
sessionId,
|
|
6571
6576
|
keys: Object.keys(this.heldSessions),
|
|
6572
6577
|
pendingReinvite: !!session.pendingReinvite,
|
|
@@ -6615,7 +6620,7 @@ class WebRTCClient extends Emitter {
|
|
|
6615
6620
|
const sessionId = this.getSipSessionId(session);
|
|
6616
6621
|
const hasVideo = sessionId in this.heldSessions && this.heldSessions[sessionId].hasVideo;
|
|
6617
6622
|
|
|
6618
|
-
logger
|
|
6623
|
+
logger.info('sdk webrtc unhold', {
|
|
6619
6624
|
sessionId,
|
|
6620
6625
|
keys: Object.keys(this.heldSessions),
|
|
6621
6626
|
pendingReinvite: !!session.pendingReinvite,
|
|
@@ -6763,7 +6768,7 @@ class WebRTCClient extends Emitter {
|
|
|
6763
6768
|
if (!session.sessionDescriptionHandler) {
|
|
6764
6769
|
return;
|
|
6765
6770
|
}
|
|
6766
|
-
logger
|
|
6771
|
+
logger.info('Sending DTMF', {
|
|
6767
6772
|
id: this.getSipSessionId(session),
|
|
6768
6773
|
tone,
|
|
6769
6774
|
});
|
|
@@ -6779,7 +6784,7 @@ class WebRTCClient extends Emitter {
|
|
|
6779
6784
|
transfer(session , target ) {
|
|
6780
6785
|
this.hold(session);
|
|
6781
6786
|
|
|
6782
|
-
logger
|
|
6787
|
+
logger.info('Transfering a session', {
|
|
6783
6788
|
id: this.getSipSessionId(session),
|
|
6784
6789
|
target,
|
|
6785
6790
|
});
|
|
@@ -6801,17 +6806,17 @@ class WebRTCClient extends Emitter {
|
|
|
6801
6806
|
atxfer(session ) {
|
|
6802
6807
|
this.hold(session);
|
|
6803
6808
|
|
|
6804
|
-
logger
|
|
6809
|
+
logger.info('webrtc transfer started', { id: this.getSipSessionId(session) });
|
|
6805
6810
|
|
|
6806
6811
|
const result = {
|
|
6807
6812
|
newSession: null,
|
|
6808
6813
|
init: async (target ) => {
|
|
6809
|
-
logger
|
|
6814
|
+
logger.info('webrtc transfer initialized', { id: this.getSipSessionId(session), target });
|
|
6810
6815
|
|
|
6811
6816
|
result.newSession = await this.call(target);
|
|
6812
6817
|
},
|
|
6813
6818
|
complete: () => {
|
|
6814
|
-
logger
|
|
6819
|
+
logger.info('webrtc transfer completed', {
|
|
6815
6820
|
id: this.getSipSessionId(session),
|
|
6816
6821
|
referId: this.getSipSessionId(result.newSession),
|
|
6817
6822
|
});
|
|
@@ -6832,7 +6837,7 @@ class WebRTCClient extends Emitter {
|
|
|
6832
6837
|
return;
|
|
6833
6838
|
}
|
|
6834
6839
|
|
|
6835
|
-
logger
|
|
6840
|
+
logger.info('send WebRTC message', { sipId: sipSession.id, contentType });
|
|
6836
6841
|
|
|
6837
6842
|
try {
|
|
6838
6843
|
sipSession.message({
|
|
@@ -6874,7 +6879,7 @@ class WebRTCClient extends Emitter {
|
|
|
6874
6879
|
}
|
|
6875
6880
|
|
|
6876
6881
|
changeAudioOutputVolume(volume ) {
|
|
6877
|
-
logger
|
|
6882
|
+
logger.info('Changing audio output volume', { volume });
|
|
6878
6883
|
|
|
6879
6884
|
Object.values(this.audioElements).forEach(audioElement => {
|
|
6880
6885
|
if (audioElement instanceof HTMLAudioElement) {
|
|
@@ -6886,7 +6891,7 @@ class WebRTCClient extends Emitter {
|
|
|
6886
6891
|
}
|
|
6887
6892
|
|
|
6888
6893
|
changeAudioOutputDevice(id ) {
|
|
6889
|
-
logger
|
|
6894
|
+
logger.info('Changing audio output device', { id });
|
|
6890
6895
|
|
|
6891
6896
|
Object.values(this.audioElements).forEach(audioElement => {
|
|
6892
6897
|
// `setSinkId` method is not included in any flow type definitions for HTMLAudioElements but is a valid method
|
|
@@ -6903,7 +6908,7 @@ class WebRTCClient extends Emitter {
|
|
|
6903
6908
|
|
|
6904
6909
|
changeAudioInputDevice(id , session ) {
|
|
6905
6910
|
const currentId = this.getAudioDeviceId();
|
|
6906
|
-
logger
|
|
6911
|
+
logger.info('setting audio input device', { id, currentId, session: !!session });
|
|
6907
6912
|
|
|
6908
6913
|
if (id === currentId) {
|
|
6909
6914
|
return null;
|
|
@@ -6949,7 +6954,7 @@ class WebRTCClient extends Emitter {
|
|
|
6949
6954
|
|
|
6950
6955
|
setVideoInputDevice(id ) {
|
|
6951
6956
|
const currentId = this.getVideoDeviceId();
|
|
6952
|
-
logger
|
|
6957
|
+
logger.info('setting video input device', { id, currentId });
|
|
6953
6958
|
|
|
6954
6959
|
if (id === currentId) {
|
|
6955
6960
|
return null;
|
|
@@ -6974,7 +6979,7 @@ class WebRTCClient extends Emitter {
|
|
|
6974
6979
|
const sessionId = this.getSipSessionId(session);
|
|
6975
6980
|
const localStream = this.getLocalStream(sessionId);
|
|
6976
6981
|
|
|
6977
|
-
logger
|
|
6982
|
+
logger.info('changing video input device', { id, sessionId });
|
|
6978
6983
|
|
|
6979
6984
|
// Release old video stream
|
|
6980
6985
|
if (localStream) {
|
|
@@ -7042,7 +7047,7 @@ class WebRTCClient extends Emitter {
|
|
|
7042
7047
|
const shouldDoScreenSharing = newConstraints && newConstraints.screen;
|
|
7043
7048
|
const desktop = newConstraints && newConstraints.desktop;
|
|
7044
7049
|
|
|
7045
|
-
logger
|
|
7050
|
+
logger.info('Sending reinvite', {
|
|
7046
7051
|
id: this.getSipSessionId(sipSession),
|
|
7047
7052
|
newConstraints,
|
|
7048
7053
|
conference,
|
|
@@ -7080,7 +7085,7 @@ class WebRTCClient extends Emitter {
|
|
|
7080
7085
|
sipSession.incomingInviteRequest.message.body = response.message.body;
|
|
7081
7086
|
}
|
|
7082
7087
|
|
|
7083
|
-
logger
|
|
7088
|
+
logger.info('on re-INVITE accepted', {
|
|
7084
7089
|
id: this.getSipSessionId(sipSession),
|
|
7085
7090
|
wasMuted,
|
|
7086
7091
|
shouldDoScreenSharing,
|
|
@@ -7255,7 +7260,7 @@ class WebRTCClient extends Emitter {
|
|
|
7255
7260
|
}
|
|
7256
7261
|
|
|
7257
7262
|
startHeartbeat() {
|
|
7258
|
-
logger
|
|
7263
|
+
logger.info('sdk webrtc start heartbeat', { userAgent: !!this.userAgent });
|
|
7259
7264
|
if (!this.userAgent) {
|
|
7260
7265
|
this.heartbeat.stop();
|
|
7261
7266
|
return;
|
|
@@ -7268,7 +7273,7 @@ class WebRTCClient extends Emitter {
|
|
|
7268
7273
|
}
|
|
7269
7274
|
|
|
7270
7275
|
stopHeartbeat() {
|
|
7271
|
-
logger
|
|
7276
|
+
logger.info('sdk webrtc stop heartbeat');
|
|
7272
7277
|
this.heartbeat.stop();
|
|
7273
7278
|
}
|
|
7274
7279
|
|
|
@@ -7289,7 +7294,7 @@ class WebRTCClient extends Emitter {
|
|
|
7289
7294
|
}
|
|
7290
7295
|
|
|
7291
7296
|
attemptReconnection() {
|
|
7292
|
-
logger
|
|
7297
|
+
logger.info('attempt reconnection', { userAgent: !!this.userAgent });
|
|
7293
7298
|
if (!this.userAgent) {
|
|
7294
7299
|
return;
|
|
7295
7300
|
}
|
|
@@ -7314,7 +7319,7 @@ class WebRTCClient extends Emitter {
|
|
|
7314
7319
|
return;
|
|
7315
7320
|
}
|
|
7316
7321
|
|
|
7317
|
-
logger
|
|
7322
|
+
logger.info('setting local media stream', {
|
|
7318
7323
|
sipSessionId,
|
|
7319
7324
|
tracks: newStream ? newStream.getTracks() : null,
|
|
7320
7325
|
});
|
|
@@ -7331,7 +7336,7 @@ class WebRTCClient extends Emitter {
|
|
|
7331
7336
|
|
|
7332
7337
|
const oldStream = this.getLocalStream(sipSessionId);
|
|
7333
7338
|
|
|
7334
|
-
logger
|
|
7339
|
+
logger.info('updating local stream', {
|
|
7335
7340
|
sipSessionId,
|
|
7336
7341
|
oldStream: !!oldStream,
|
|
7337
7342
|
tracks: newStream.getTracks(),
|
|
@@ -7351,7 +7356,7 @@ class WebRTCClient extends Emitter {
|
|
|
7351
7356
|
const remoteStream = this.getRemoteStream(sessionId);
|
|
7352
7357
|
const pc = this.getPeerConnection(sessionId);
|
|
7353
7358
|
|
|
7354
|
-
logger
|
|
7359
|
+
logger.info('Updating remote stream', {
|
|
7355
7360
|
sessionId,
|
|
7356
7361
|
tracks: remoteStream ? remoteStream.getTracks() : null,
|
|
7357
7362
|
receiverTracks: pc && pc.getReceivers ? pc.getReceivers().map(receiver => receiver.track) : null,
|
|
@@ -7376,14 +7381,16 @@ class WebRTCClient extends Emitter {
|
|
|
7376
7381
|
const screenSharing = constraints && 'screen' in constraints ? constraints.screen : false;
|
|
7377
7382
|
const isDesktop = constraints && 'desktop' in constraints ? constraints.desktop : false;
|
|
7378
7383
|
const withAudio = constraints && 'audio' in constraints ? constraints.audio : true;
|
|
7384
|
+
const mandatoryVideo = constraints && typeof constraints.video === 'object' ? constraints.video.mandatory : {};
|
|
7379
7385
|
|
|
7380
|
-
logger
|
|
7386
|
+
logger.info('Retrieving media a configuration', { enableVideo, screenSharing, isDesktop, withAudio, constraints });
|
|
7381
7387
|
|
|
7382
7388
|
return {
|
|
7383
7389
|
constraints: {
|
|
7384
7390
|
// Exact constraint are not supported with `getDisplayMedia` and we must have a video=false in desktop screenshare
|
|
7385
7391
|
audio: screenSharing ? !isDesktop : (withAudio ? this._getAudioConstraints() : false),
|
|
7386
|
-
video: screenSharing ? (isDesktop
|
|
7392
|
+
video: screenSharing ? (isDesktop
|
|
7393
|
+
? ({ mandatory: { chromeMediaSource: 'desktop', ...(mandatoryVideo || {}) } }) : { cursor: 'always' })
|
|
7387
7394
|
: this._getVideoConstraints(enableVideo),
|
|
7388
7395
|
screen: screenSharing,
|
|
7389
7396
|
desktop: isDesktop,
|
|
@@ -7426,7 +7433,7 @@ class WebRTCClient extends Emitter {
|
|
|
7426
7433
|
}
|
|
7427
7434
|
|
|
7428
7435
|
_onTransportError() {
|
|
7429
|
-
logger
|
|
7436
|
+
logger.error('on transport error');
|
|
7430
7437
|
this.eventEmitter.emit(TRANSPORT_ERROR);
|
|
7431
7438
|
this.attemptReconnection();
|
|
7432
7439
|
}
|
|
@@ -7435,7 +7442,7 @@ class WebRTCClient extends Emitter {
|
|
|
7435
7442
|
const body = message && typeof message === 'object' ? message.data : message;
|
|
7436
7443
|
if (body && body.indexOf('200 OK') !== -1) {
|
|
7437
7444
|
if (this.hasHeartbeat()) {
|
|
7438
|
-
logger
|
|
7445
|
+
logger.info('on heartbeat received from Asterisk', { hasHeartbeat: this.hasHeartbeat() });
|
|
7439
7446
|
|
|
7440
7447
|
this.heartbeat.onHeartbeat();
|
|
7441
7448
|
if (this.heartbeatCb) {
|
|
@@ -7446,7 +7453,7 @@ class WebRTCClient extends Emitter {
|
|
|
7446
7453
|
}
|
|
7447
7454
|
|
|
7448
7455
|
async _onHeartbeatTimeout() {
|
|
7449
|
-
logger
|
|
7456
|
+
logger.info('sdk webrtc heartbeat timed out', { userAgent: !!this.userAgent, cb: !!this.heartbeatTimeoutCb });
|
|
7450
7457
|
|
|
7451
7458
|
if (this.heartbeatTimeoutCb) {
|
|
7452
7459
|
this.heartbeatTimeoutCb();
|
|
@@ -7458,7 +7465,7 @@ class WebRTCClient extends Emitter {
|
|
|
7458
7465
|
try {
|
|
7459
7466
|
await this.userAgent.transport.disconnect();
|
|
7460
7467
|
} catch (e) {
|
|
7461
|
-
logger
|
|
7468
|
+
logger.error('Transport disconnection after heartbeat timeout, error', e);
|
|
7462
7469
|
}
|
|
7463
7470
|
}
|
|
7464
7471
|
|
|
@@ -7491,31 +7498,31 @@ class WebRTCClient extends Emitter {
|
|
|
7491
7498
|
}
|
|
7492
7499
|
|
|
7493
7500
|
_connectIfNeeded() {
|
|
7494
|
-
logger
|
|
7501
|
+
logger.info('connect if needed, checking', { connected: this.isConnected() });
|
|
7495
7502
|
if (!this.userAgent) {
|
|
7496
|
-
logger
|
|
7503
|
+
logger.info('need to recreate User Agent');
|
|
7497
7504
|
this.userAgent = this.createUserAgent(this.uaConfigOverrides);
|
|
7498
7505
|
}
|
|
7499
7506
|
|
|
7500
7507
|
if (this.isConnected()) {
|
|
7501
|
-
logger
|
|
7508
|
+
logger.info('webrtc sdk, already connected');
|
|
7502
7509
|
return Promise.resolve();
|
|
7503
7510
|
}
|
|
7504
7511
|
|
|
7505
7512
|
if (this.isConnecting()) {
|
|
7506
|
-
logger
|
|
7513
|
+
logger.info('webrtc sdk, already connecting...');
|
|
7507
7514
|
|
|
7508
7515
|
this.connectionPromise = this.userAgent.transport.connectPromise;
|
|
7509
7516
|
return this.connectionPromise;
|
|
7510
7517
|
}
|
|
7511
7518
|
|
|
7512
7519
|
if (this.connectionPromise) {
|
|
7513
|
-
logger
|
|
7520
|
+
logger.info('webrtc sdk, connection promise connecting...');
|
|
7514
7521
|
// $FlowFixMe
|
|
7515
7522
|
return this.connectionPromise;
|
|
7516
7523
|
}
|
|
7517
7524
|
|
|
7518
|
-
logger
|
|
7525
|
+
logger.info('WebRTC UA needs to connect');
|
|
7519
7526
|
|
|
7520
7527
|
// Force UA to reconnect
|
|
7521
7528
|
if (this.userAgent && this.userAgent.state !== userAgentState.UserAgentState.Stopped) {
|
|
@@ -7640,7 +7647,7 @@ class WebRTCClient extends Emitter {
|
|
|
7640
7647
|
|
|
7641
7648
|
sdh.peerConnectionDelegate = {
|
|
7642
7649
|
onicecandidateerror: (error ) => {
|
|
7643
|
-
logger
|
|
7650
|
+
logger.error('on icecandidate error', {
|
|
7644
7651
|
address: error.address,
|
|
7645
7652
|
port: error.port,
|
|
7646
7653
|
errorCode: error.errorCode,
|
|
@@ -7669,7 +7676,7 @@ class WebRTCClient extends Emitter {
|
|
|
7669
7676
|
updatedNumber = session.assertedIdentity.uri.normal.user;
|
|
7670
7677
|
updatedCalleeName = session.assertedIdentity.displayName || updatedNumber;
|
|
7671
7678
|
}
|
|
7672
|
-
logger
|
|
7679
|
+
logger.info('re-invite received', { updatedCalleeName, updatedNumber, hadRemoteVideo });
|
|
7673
7680
|
|
|
7674
7681
|
// Useful to know if it's a video upgrade or an unhold from a remote peer with a video stream
|
|
7675
7682
|
|
|
@@ -7690,7 +7697,7 @@ class WebRTCClient extends Emitter {
|
|
|
7690
7697
|
}
|
|
7691
7698
|
|
|
7692
7699
|
_onAccepted(session , sessionDialog , withEvent = true) {
|
|
7693
|
-
logger
|
|
7700
|
+
logger.info('on call accepted', { id: session.id, remoteTag: session.remoteTag });
|
|
7694
7701
|
|
|
7695
7702
|
this.storeSipSession(session);
|
|
7696
7703
|
|
|
@@ -7702,7 +7709,7 @@ class WebRTCClient extends Emitter {
|
|
|
7702
7709
|
const onTrack = (event ) => {
|
|
7703
7710
|
const isAudioOnly = this._isAudioOnly(session);
|
|
7704
7711
|
const { kind, label, readyState, id, muted } = event.track;
|
|
7705
|
-
logger
|
|
7712
|
+
logger.info('on track event', { isAudioOnly, kind, label, readyState, id, muted });
|
|
7706
7713
|
|
|
7707
7714
|
// Stop video track in audio only mode
|
|
7708
7715
|
if (isAudioOnly && kind === 'video') {
|
|
@@ -7718,12 +7725,14 @@ class WebRTCClient extends Emitter {
|
|
|
7718
7725
|
|
|
7719
7726
|
session.sessionDescriptionHandler.remoteMediaStream.onaddtrack = onTrack;
|
|
7720
7727
|
|
|
7721
|
-
|
|
7722
|
-
|
|
7723
|
-
|
|
7724
|
-
|
|
7725
|
-
|
|
7726
|
-
|
|
7728
|
+
if (pc) {
|
|
7729
|
+
pc.oniceconnectionstatechange = () => {
|
|
7730
|
+
logger.info('on ice connection state changed', { state: pc.iceConnectionState });
|
|
7731
|
+
if (pc.iceConnectionState === 'disconnected') {
|
|
7732
|
+
this.eventEmitter.emit(ON_DISCONNECTED);
|
|
7733
|
+
}
|
|
7734
|
+
};
|
|
7735
|
+
}
|
|
7727
7736
|
|
|
7728
7737
|
if (withEvent) {
|
|
7729
7738
|
this.eventEmitter.emit(ACCEPTED, session, sessionDialog);
|
|
@@ -7892,10 +7901,10 @@ class WebRTCClient extends Emitter {
|
|
|
7892
7901
|
|
|
7893
7902
|
_stopSendingStats(session ) {
|
|
7894
7903
|
const sessionId = this.getSipSessionId(session);
|
|
7895
|
-
logger
|
|
7904
|
+
logger.trace('Check for stopping stats', { sessionId, ids: Object.keys(this.statsIntervals) });
|
|
7896
7905
|
|
|
7897
7906
|
if (sessionId in this.statsIntervals) {
|
|
7898
|
-
logger
|
|
7907
|
+
logger.trace('Stop sending stats for call', { sessionId });
|
|
7899
7908
|
this.statsIntervals[sessionId]();
|
|
7900
7909
|
delete this.statsIntervals[sessionId];
|
|
7901
7910
|
}
|
|
@@ -7911,7 +7920,7 @@ class WebRTCClient extends Emitter {
|
|
|
7911
7920
|
try {
|
|
7912
7921
|
await this.userAgent.transport.disconnect();
|
|
7913
7922
|
} catch (e) {
|
|
7914
|
-
logger
|
|
7923
|
+
logger.error('WebRTC transport disconnect, error', e);
|
|
7915
7924
|
}
|
|
7916
7925
|
}
|
|
7917
7926
|
}
|
|
@@ -7933,13 +7942,17 @@ class WebRTCClient extends Emitter {
|
|
|
7933
7942
|
const nbStats = this.sessionNetworkStats[sessionId].length;
|
|
7934
7943
|
const lastNetworkStats = this.sessionNetworkStats[sessionId][nbStats - 1];
|
|
7935
7944
|
const lastAudioSent = lastNetworkStats ? lastNetworkStats.audioBytesSent : 0;
|
|
7945
|
+
const lastAudioContentSent = lastNetworkStats ? lastNetworkStats.audioContentSent : 0;
|
|
7936
7946
|
const lastVideoSent = lastNetworkStats ? lastNetworkStats.videoBytesSent : 0;
|
|
7937
7947
|
const lastAudioReceived = lastNetworkStats ? lastNetworkStats.audioBytesReceived : 0;
|
|
7948
|
+
const lastAudioContentReceived = lastNetworkStats ? lastNetworkStats.audioContentReceived : 0;
|
|
7938
7949
|
const lastVideoReceived = lastNetworkStats ? lastNetworkStats.videoBytesReceived : 0;
|
|
7939
7950
|
const lastTransportSent = lastNetworkStats ? lastNetworkStats.transportSent : 0;
|
|
7940
7951
|
const lastTransportReceived = lastNetworkStats ? lastNetworkStats.transportReceived : 0;
|
|
7941
|
-
let audioBytesSent = 0;
|
|
7942
|
-
let audioBytesReceived = 0;
|
|
7952
|
+
let audioBytesSent = 0; // content + header
|
|
7953
|
+
let audioBytesReceived = 0; // content + header
|
|
7954
|
+
let audioContentSent = 0; // useful to detect blank call
|
|
7955
|
+
let audioContentReceived = 0;
|
|
7943
7956
|
let videoBytesSent = 0;
|
|
7944
7957
|
let videoBytesReceived = 0;
|
|
7945
7958
|
let transportSent = 0;
|
|
@@ -7949,6 +7962,7 @@ class WebRTCClient extends Emitter {
|
|
|
7949
7962
|
stats.forEach(report => {
|
|
7950
7963
|
if (report.type === 'outbound-rtp' && report.kind === 'audio') {
|
|
7951
7964
|
audioBytesSent += Number(report.bytesSent) + Number(report.headerBytesSent);
|
|
7965
|
+
audioContentSent += Number(report.bytesSent);
|
|
7952
7966
|
}
|
|
7953
7967
|
if (report.type === 'remote-outbound-rtp' && report.kind === 'audio') {
|
|
7954
7968
|
audioBytesSent += Number(report.bytesSent);
|
|
@@ -7960,6 +7974,7 @@ class WebRTCClient extends Emitter {
|
|
|
7960
7974
|
packetsLost += Number(report.packetsLost);
|
|
7961
7975
|
networkStats.packetsReceived = Number(report.packetsReceived);
|
|
7962
7976
|
audioBytesReceived += Number(report.bytesReceived) + Number(report.headerBytesReceived);
|
|
7977
|
+
audioContentReceived += Number(report.bytesReceived);
|
|
7963
7978
|
}
|
|
7964
7979
|
if (report.type === 'inbound-rtp' && report.kind === 'video') {
|
|
7965
7980
|
videoBytesReceived += Number(report.bytesReceived) + Number(report.headerBytesReceived);
|
|
@@ -7988,10 +8003,17 @@ class WebRTCClient extends Emitter {
|
|
|
7988
8003
|
});
|
|
7989
8004
|
|
|
7990
8005
|
networkStats.packetsLost = packetsLost;
|
|
8006
|
+
|
|
7991
8007
|
networkStats.totalAudioBytesSent = audioBytesSent;
|
|
7992
8008
|
networkStats.audioBytesSent = audioBytesSent - lastAudioSent;
|
|
7993
8009
|
networkStats.totalAudioBytesReceived = audioBytesReceived - lastAudioReceived;
|
|
7994
8010
|
networkStats.audioBytesReceived = audioBytesReceived;
|
|
8011
|
+
|
|
8012
|
+
networkStats.totalAudioContentSent = audioContentSent;
|
|
8013
|
+
networkStats.audioContentSent = audioContentSent - lastAudioContentSent;
|
|
8014
|
+
networkStats.totalAudioBytesReceived = audioContentReceived - lastAudioContentReceived;
|
|
8015
|
+
networkStats.audioContentReceived = audioContentReceived;
|
|
8016
|
+
|
|
7995
8017
|
networkStats.totalVideoBytesSent = videoBytesSent;
|
|
7996
8018
|
networkStats.videoBytesSent = videoBytesSent - lastVideoSent;
|
|
7997
8019
|
networkStats.totalVideoBytesReceived = videoBytesReceived;
|
|
@@ -8094,7 +8116,7 @@ var webrtc = {
|
|
|
8094
8116
|
}),
|
|
8095
8117
|
};
|
|
8096
8118
|
|
|
8097
|
-
const parseCandidate
|
|
8119
|
+
const parseCandidate = line => {
|
|
8098
8120
|
let parts;
|
|
8099
8121
|
// Parse both variants.
|
|
8100
8122
|
if (line.indexOf('a=candidate:') === 0) {
|
|
@@ -8185,7 +8207,7 @@ var SymmetricNat = {
|
|
|
8185
8207
|
}
|
|
8186
8208
|
|
|
8187
8209
|
if (e.candidate && e.candidate.candidate.indexOf('srflx') !== -1) {
|
|
8188
|
-
const cand = parseCandidate
|
|
8210
|
+
const cand = parseCandidate(e.candidate.candidate);
|
|
8189
8211
|
if (!candidates[cand.relatedPort]) candidates[cand.relatedPort] = [];
|
|
8190
8212
|
candidates[cand.relatedPort].push(cand.port);
|
|
8191
8213
|
} else if (!e.candidate) {
|
|
@@ -8253,7 +8275,7 @@ var iceIpv4 = {
|
|
|
8253
8275
|
const rawCandidate = e.candidate.candidate;
|
|
8254
8276
|
if (rawCandidate.indexOf('srflx') !== -1 || rawCandidate.indexOf('relay') !== -1) {
|
|
8255
8277
|
hasSrflxOrRelay = true;
|
|
8256
|
-
const candidate = parseCandidate
|
|
8278
|
+
const candidate = parseCandidate(e.candidate.candidate);
|
|
8257
8279
|
ips.push(candidate.ip);
|
|
8258
8280
|
}
|
|
8259
8281
|
} else if (!e.candidate) {
|