@wazo/sdk 0.37.24 → 0.37.25
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/dist/wazo-sdk.js +6 -6
- package/esm/__tests__/api-client.test.js +12 -12
- package/esm/__tests__/web-rtc-client.test.js +120 -103
- package/esm/api/amid.js +1 -1
- package/esm/api/call-logd.js +2 -2
- package/esm/api/ctid-ng.js +3 -3
- package/esm/api/dird.js +1 -1
- package/esm/api/webhookd.js +1 -1
- package/esm/api-client.js +12 -12
- package/esm/checker/Checker.js +145 -128
- package/esm/checker/checks/aor.js +12 -12
- package/esm/checker/checks/api.js +12 -12
- package/esm/checker/checks/index.js +135 -118
- package/esm/checker/checks/wazo-websocket.js +15 -15
- package/esm/checker/checks/webrtc-transport.js +120 -103
- package/esm/checker/checks/webrtc.js +120 -103
- package/esm/domain/AdHocAPIConference.js +12 -12
- package/esm/domain/CallLog.js +1 -1
- package/esm/domain/Contact.js +1 -1
- package/esm/domain/Features.js +12 -12
- package/esm/domain/Phone/CTIPhone.js +26 -26
- package/esm/domain/Phone/WebRTCPhone.js +87 -86
- package/esm/domain/__tests__/CallLog.test.js +1 -1
- package/esm/domain/__tests__/Contact.test.js +1 -1
- package/esm/index.js +356 -338
- package/esm/lib/WazoSessionDescriptionHandler.js +1 -1
- package/esm/service/CallApi.js +12 -12
- package/esm/service/IssueReporter.js +1 -1
- package/esm/service/__tests__/IssueReporter.test.js +1 -1
- package/esm/service/getApiClient.js +12 -12
- package/esm/simple/Auth.js +346 -328
- package/esm/simple/Configuration.js +346 -328
- package/esm/simple/Directory.js +12 -12
- package/esm/simple/Phone.js +346 -328
- package/esm/simple/Websocket.js +17 -17
- package/esm/simple/index.js +350 -332
- package/esm/simple/room/LocalParticipant.js +350 -332
- package/esm/simple/room/Participant.js +350 -332
- package/esm/simple/room/RemoteParticipant.js +350 -332
- package/esm/simple/room/Room.js +351 -333
- package/esm/simple/room/SipRoom.js +350 -332
- package/esm/simple/room/Stream.js +350 -332
- package/esm/simple/room/__tests__/RemoteParticipant.test.js +350 -332
- package/esm/simple/utils.js +350 -332
- package/esm/web-rtc-client.js +120 -103
- package/esm/websocket-client.js +15 -15
- package/lib/__tests__/api-client.test.js +12 -12
- package/lib/__tests__/web-rtc-client.test.js +120 -103
- package/lib/api/amid.js +1 -1
- package/lib/api/call-logd.js +2 -2
- package/lib/api/ctid-ng.js +3 -3
- package/lib/api/dird.js +1 -1
- package/lib/api/webhookd.js +1 -1
- package/lib/api-client.js +12 -12
- package/lib/checker/Checker.js +145 -128
- package/lib/checker/checks/aor.js +12 -12
- package/lib/checker/checks/api.js +12 -12
- package/lib/checker/checks/index.js +135 -118
- package/lib/checker/checks/wazo-websocket.js +15 -15
- package/lib/checker/checks/webrtc-transport.js +120 -103
- package/lib/checker/checks/webrtc.js +120 -103
- package/lib/domain/AdHocAPIConference.js +12 -12
- package/lib/domain/CallLog.js +1 -1
- package/lib/domain/Contact.js +1 -1
- package/lib/domain/Features.js +12 -12
- package/lib/domain/Phone/CTIPhone.js +26 -26
- package/lib/domain/Phone/WebRTCPhone.js +87 -86
- package/lib/domain/__tests__/CallLog.test.js +1 -1
- package/lib/domain/__tests__/Contact.test.js +1 -1
- package/lib/index.js +356 -338
- package/lib/lib/WazoSessionDescriptionHandler.js +1 -1
- package/lib/service/CallApi.js +12 -12
- package/lib/service/IssueReporter.js +1 -1
- package/lib/service/__tests__/IssueReporter.test.js +1 -1
- package/lib/service/getApiClient.js +12 -12
- package/lib/simple/Auth.js +346 -328
- package/lib/simple/Configuration.js +346 -328
- package/lib/simple/Directory.js +12 -12
- package/lib/simple/Phone.js +346 -328
- package/lib/simple/Websocket.js +17 -17
- package/lib/simple/index.js +350 -332
- package/lib/simple/room/LocalParticipant.js +350 -332
- package/lib/simple/room/Participant.js +350 -332
- package/lib/simple/room/RemoteParticipant.js +350 -332
- package/lib/simple/room/Room.js +351 -333
- package/lib/simple/room/SipRoom.js +350 -332
- package/lib/simple/room/Stream.js +350 -332
- package/lib/simple/room/__tests__/RemoteParticipant.test.js +350 -332
- package/lib/simple/utils.js +350 -332
- package/lib/web-rtc-client.js +120 -103
- package/lib/websocket-client.js +15 -15
- package/package.json +1 -1
- package/src/domain/Phone/WebRTCPhone.js +3 -2
- package/src/web-rtc-client.js +27 -10
|
@@ -458,7 +458,7 @@ var IssueReporter$1 = new IssueReporter();
|
|
|
458
458
|
|
|
459
459
|
const methods = ['head', 'get', 'post', 'put', 'delete'];
|
|
460
460
|
|
|
461
|
-
const logger = IssueReporter$1 ? IssueReporter$1.loggerFor('api') : console;
|
|
461
|
+
const logger$3 = IssueReporter$1 ? IssueReporter$1.loggerFor('api') : console;
|
|
462
462
|
|
|
463
463
|
// Use a function here to be able to mock it in tests
|
|
464
464
|
const realFetch = () => {
|
|
@@ -597,7 +597,7 @@ class ApiRequester {
|
|
|
597
597
|
};
|
|
598
598
|
|
|
599
599
|
if (this.refreshTokenPromise) {
|
|
600
|
-
logger.info('A token is already refreshing, waiting ...', { url });
|
|
600
|
+
logger$3.info('A token is already refreshing, waiting ...', { url });
|
|
601
601
|
await this.refreshTokenPromise;
|
|
602
602
|
}
|
|
603
603
|
|
|
@@ -617,7 +617,7 @@ class ApiRequester {
|
|
|
617
617
|
return promise.then(async (err ) => {
|
|
618
618
|
// Check if the token is still valid
|
|
619
619
|
if (firstCall && this._checkTokenExpired(response, err)) {
|
|
620
|
-
logger.warn('token expired', { error: err.reason });
|
|
620
|
+
logger$3.warn('token expired', { error: err.reason });
|
|
621
621
|
// Replay the call after refreshing the token
|
|
622
622
|
return this._replayWithNewToken(err, path, method, body, headers, parse);
|
|
623
623
|
}
|
|
@@ -627,7 +627,7 @@ class ApiRequester {
|
|
|
627
627
|
: exceptionClass.fromResponse(err, response.status);
|
|
628
628
|
|
|
629
629
|
if (this.shouldLogErrors) {
|
|
630
|
-
logger.error('API error', error);
|
|
630
|
+
logger$3.error('API error', error);
|
|
631
631
|
}
|
|
632
632
|
|
|
633
633
|
throw error;
|
|
@@ -637,7 +637,7 @@ class ApiRequester {
|
|
|
637
637
|
return newParse(response, isJson);
|
|
638
638
|
}).catch(error => {
|
|
639
639
|
if (this.shouldLogErrors) {
|
|
640
|
-
logger.error('Fetch failed', { url, options, message: error.message, stack: error.stack });
|
|
640
|
+
logger$3.error('Fetch failed', { url, options, message: error.message, stack: error.stack });
|
|
641
641
|
}
|
|
642
642
|
|
|
643
643
|
throw error;
|
|
@@ -665,13 +665,13 @@ class ApiRequester {
|
|
|
665
665
|
) {
|
|
666
666
|
const isTokenNotFound = this._isTokenNotFound(err);
|
|
667
667
|
let newPath = path;
|
|
668
|
-
logger.info('refreshing token', { inProgress: !!this.refreshTokenPromise });
|
|
668
|
+
logger$3.info('refreshing token', { inProgress: !!this.refreshTokenPromise });
|
|
669
669
|
|
|
670
670
|
this.refreshTokenPromise = this.refreshTokenPromise || this.refreshTokenCallback();
|
|
671
671
|
|
|
672
672
|
return this.refreshTokenPromise.then(() => {
|
|
673
673
|
this.refreshTokenPromise = null;
|
|
674
|
-
logger.info('token refreshed', { isTokenNotFound });
|
|
674
|
+
logger$3.info('token refreshed', { isTokenNotFound });
|
|
675
675
|
if (isTokenNotFound) {
|
|
676
676
|
const pathParts = path.split('/');
|
|
677
677
|
pathParts.pop();
|
|
@@ -3639,7 +3639,7 @@ const TRANSFER_FLOW_BLIND = 'blind';
|
|
|
3639
3639
|
|
|
3640
3640
|
// const MINIMUM_WAZO_ENGINE_VERSION_FOR_CTI_HOLD = '20.11';
|
|
3641
3641
|
|
|
3642
|
-
|
|
3642
|
+
IssueReporter$1 ? IssueReporter$1.loggerFor('cti-phone') : console;
|
|
3643
3643
|
|
|
3644
3644
|
/* */
|
|
3645
3645
|
|
|
@@ -4983,7 +4983,7 @@ const BLACKLIST_EVENTS = [
|
|
|
4983
4983
|
];
|
|
4984
4984
|
|
|
4985
4985
|
const HEARTBEAT_ENGINE_VERSION = '20.09';
|
|
4986
|
-
const logger$
|
|
4986
|
+
const logger$1 = IssueReporter$1.loggerFor('wazo-ws');
|
|
4987
4987
|
const messageLogger = IssueReporter$1.loggerFor('wazo-ws-message');
|
|
4988
4988
|
|
|
4989
4989
|
class WebSocketClient extends Emitter {
|
|
@@ -5032,19 +5032,19 @@ class WebSocketClient extends Emitter {
|
|
|
5032
5032
|
}
|
|
5033
5033
|
|
|
5034
5034
|
connect() {
|
|
5035
|
-
logger$
|
|
5035
|
+
logger$1.info('connect method started', { host: this.host, token: this.token });
|
|
5036
5036
|
this.socket = new ReconnectingWebSocket(this._getUrl.bind(this), [], this.options);
|
|
5037
5037
|
if (this.options.binaryType) {
|
|
5038
5038
|
this.socket.binaryType = this.options.binaryType;
|
|
5039
5039
|
}
|
|
5040
5040
|
|
|
5041
5041
|
this.socket.onopen = () => {
|
|
5042
|
-
logger$
|
|
5042
|
+
logger$1.info('on Wazo WS open', { method: 'connect', host: this.host });
|
|
5043
5043
|
this.eventEmitter.emit(SOCKET_EVENTS.ON_OPEN);
|
|
5044
5044
|
};
|
|
5045
5045
|
|
|
5046
5046
|
this.socket.onerror = event => {
|
|
5047
|
-
logger$
|
|
5047
|
+
logger$1.error('on Wazo WS error', event.target);
|
|
5048
5048
|
this.eventEmitter.emit(SOCKET_EVENTS.ON_ERROR, event);
|
|
5049
5049
|
};
|
|
5050
5050
|
|
|
@@ -5074,7 +5074,7 @@ class WebSocketClient extends Emitter {
|
|
|
5074
5074
|
|
|
5075
5075
|
this.socket.onclose = event => {
|
|
5076
5076
|
// Can't be converted to JSON (circular structure)
|
|
5077
|
-
logger$
|
|
5077
|
+
logger$1.info('on Wazo WS close', {
|
|
5078
5078
|
reason: event.reason,
|
|
5079
5079
|
code: event.code,
|
|
5080
5080
|
readyState: event.target.readyState,
|
|
@@ -5092,12 +5092,12 @@ class WebSocketClient extends Emitter {
|
|
|
5092
5092
|
};
|
|
5093
5093
|
|
|
5094
5094
|
this.socket.onerror = event => {
|
|
5095
|
-
logger$
|
|
5095
|
+
logger$1.info('Wazo WS error', { message: event.message, code: event.code, readyState: event.target.readyState });
|
|
5096
5096
|
};
|
|
5097
5097
|
}
|
|
5098
5098
|
|
|
5099
5099
|
close(force = false) {
|
|
5100
|
-
logger$
|
|
5100
|
+
logger$1.info('Wazo WS close', { socket: !!this.socket, host: this.host, token: this.token });
|
|
5101
5101
|
|
|
5102
5102
|
if (!this.socket) {
|
|
5103
5103
|
return;
|
|
@@ -5115,7 +5115,7 @@ class WebSocketClient extends Emitter {
|
|
|
5115
5115
|
|
|
5116
5116
|
updateToken(token ) {
|
|
5117
5117
|
this.token = token;
|
|
5118
|
-
logger$
|
|
5118
|
+
logger$1.info('Wazo WS updating token', { url: this._getUrl(), token, socket: !!this.socket });
|
|
5119
5119
|
|
|
5120
5120
|
if (this.socket) {
|
|
5121
5121
|
// If still connected, send the token to the WS
|
|
@@ -5133,7 +5133,7 @@ class WebSocketClient extends Emitter {
|
|
|
5133
5133
|
}
|
|
5134
5134
|
|
|
5135
5135
|
startHeartbeat() {
|
|
5136
|
-
logger$
|
|
5136
|
+
logger$1.info('Wazo WS start heartbeat', { host: this.host, token: this.token });
|
|
5137
5137
|
|
|
5138
5138
|
if (!this.socket) {
|
|
5139
5139
|
this.heartbeat.stop();
|
|
@@ -5147,7 +5147,7 @@ class WebSocketClient extends Emitter {
|
|
|
5147
5147
|
}
|
|
5148
5148
|
|
|
5149
5149
|
stopHeartbeat() {
|
|
5150
|
-
logger$
|
|
5150
|
+
logger$1.info('Wazo WS stop heartbeat', { host: this.host, token: this.token });
|
|
5151
5151
|
|
|
5152
5152
|
this.heartbeat.stop();
|
|
5153
5153
|
}
|
|
@@ -5177,7 +5177,7 @@ class WebSocketClient extends Emitter {
|
|
|
5177
5177
|
}
|
|
5178
5178
|
|
|
5179
5179
|
reconnect(reason ) {
|
|
5180
|
-
logger$
|
|
5180
|
+
logger$1.info('Wazo WS reconnect', { reason, socket: !!this.socket, host: this.host, token: this.token });
|
|
5181
5181
|
if (!this.socket) {
|
|
5182
5182
|
return;
|
|
5183
5183
|
}
|
|
@@ -5233,7 +5233,7 @@ class WebSocketClient extends Emitter {
|
|
|
5233
5233
|
this.close();
|
|
5234
5234
|
}
|
|
5235
5235
|
const url = `wss://${this.host || ''}/api/websocketd/?token=${this.token || ''}&version=${this.version}`;
|
|
5236
|
-
logger$
|
|
5236
|
+
logger$1.log('Wazo WS url computed to reconnect', { url });
|
|
5237
5237
|
|
|
5238
5238
|
return url;
|
|
5239
5239
|
}
|
|
@@ -5241,12 +5241,12 @@ class WebSocketClient extends Emitter {
|
|
|
5241
5241
|
_onHeartbeat(message ) {
|
|
5242
5242
|
if (message.payload === 'pong') {
|
|
5243
5243
|
this.heartbeat.onHeartbeat();
|
|
5244
|
-
logger$
|
|
5244
|
+
logger$1.log('on heartbeat received from Wazo WS');
|
|
5245
5245
|
}
|
|
5246
5246
|
}
|
|
5247
5247
|
|
|
5248
5248
|
async _onHeartbeatTimeout() {
|
|
5249
|
-
logger$
|
|
5249
|
+
logger$1.log('heartbeat timed out', { host: this.host, token: this.token });
|
|
5250
5250
|
|
|
5251
5251
|
this.close();
|
|
5252
5252
|
this.eventEmitter.emit(SOCKET_EVENTS.ON_CLOSE, new Error('Websocket ping failure.'));
|
|
@@ -5367,7 +5367,7 @@ var wazoWebsocket = {
|
|
|
5367
5367
|
|
|
5368
5368
|
/* */
|
|
5369
5369
|
|
|
5370
|
-
const parseCandidate = (candidate ) => {
|
|
5370
|
+
const parseCandidate$1 = (candidate ) => {
|
|
5371
5371
|
if (!candidate) {
|
|
5372
5372
|
return null;
|
|
5373
5373
|
}
|
|
@@ -5521,7 +5521,7 @@ class WazoSessionDescriptionHandler extends SessionDescriptionHandler {
|
|
|
5521
5521
|
this.peerConnectionDelegate.onicecandidate = event => {
|
|
5522
5522
|
wazoLogger.trace('onicecandidate', event.candidate ? event.candidate.candidate : { done: true });
|
|
5523
5523
|
if (event.candidate) {
|
|
5524
|
-
this.gatheredCandidates.push(parseCandidate(event.candidate.candidate));
|
|
5524
|
+
this.gatheredCandidates.push(parseCandidate$1(event.candidate.candidate));
|
|
5525
5525
|
}
|
|
5526
5526
|
};
|
|
5527
5527
|
|
|
@@ -5890,7 +5890,7 @@ const DEFAULT_ICE_TIMEOUT = 3000;
|
|
|
5890
5890
|
const SEND_STATS_DELAY = 5000;
|
|
5891
5891
|
|
|
5892
5892
|
const states = ['STATUS_NULL', 'STATUS_NEW', 'STATUS_CONNECTING', 'STATUS_CONNECTED', 'STATUS_COMPLETED'];
|
|
5893
|
-
const logger
|
|
5893
|
+
const logger = IssueReporter$1 ? IssueReporter$1.loggerFor('webrtc-client') : console;
|
|
5894
5894
|
const statsLogger = IssueReporter$1 ? IssueReporter$1.loggerFor('webrtc-stats') : console;
|
|
5895
5895
|
|
|
5896
5896
|
// events
|
|
@@ -6066,13 +6066,13 @@ class WebRTCClient extends Emitter {
|
|
|
6066
6066
|
|
|
6067
6067
|
createUserAgent(configOverrides ) {
|
|
6068
6068
|
const webRTCConfiguration = this._createWebRTCConfiguration(configOverrides);
|
|
6069
|
-
logger
|
|
6069
|
+
logger.info('sdk webrtc, creating UA', { webRTCConfiguration });
|
|
6070
6070
|
|
|
6071
6071
|
webRTCConfiguration.delegate = {
|
|
6072
6072
|
onConnect: this.onConnect.bind(this),
|
|
6073
6073
|
onDisconnect: this.onDisconnect.bind(this),
|
|
6074
6074
|
onInvite: (invitation ) => {
|
|
6075
|
-
logger
|
|
6075
|
+
logger.info('sdk webrtc on invite', {
|
|
6076
6076
|
method: 'delegate.onInvite',
|
|
6077
6077
|
id: invitation.id,
|
|
6078
6078
|
remoteURI: invitation.remoteURI,
|
|
@@ -6115,7 +6115,7 @@ class WebRTCClient extends Emitter {
|
|
|
6115
6115
|
}
|
|
6116
6116
|
|
|
6117
6117
|
onConnect() {
|
|
6118
|
-
logger
|
|
6118
|
+
logger.info('sdk webrtc connected', { method: 'delegate.onConnect' });
|
|
6119
6119
|
this.eventEmitter.emit(CONNECTED);
|
|
6120
6120
|
if (!this.isRegistered() && this.registerer && this.registerer.waiting) {
|
|
6121
6121
|
this.registerer.waitingToggle(false);
|
|
@@ -6124,7 +6124,7 @@ class WebRTCClient extends Emitter {
|
|
|
6124
6124
|
}
|
|
6125
6125
|
|
|
6126
6126
|
async onDisconnect(error ) {
|
|
6127
|
-
logger
|
|
6127
|
+
logger.info('sdk webrtc disconnected', { method: 'delegate.onConnect', error });
|
|
6128
6128
|
this.connectionPromise = null;
|
|
6129
6129
|
// The UA will attempt to reconnect automatically when an error occurred
|
|
6130
6130
|
this.eventEmitter.emit(DISCONNECTED, error);
|
|
@@ -6149,37 +6149,37 @@ class WebRTCClient extends Emitter {
|
|
|
6149
6149
|
};
|
|
6150
6150
|
|
|
6151
6151
|
if (this.skipRegister) {
|
|
6152
|
-
logger
|
|
6152
|
+
logger.info('sdk webrtc skip register...', logInfo);
|
|
6153
6153
|
return Promise.resolve();
|
|
6154
6154
|
}
|
|
6155
6155
|
|
|
6156
|
-
logger
|
|
6156
|
+
logger.info('sdk webrtc registering...', logInfo);
|
|
6157
6157
|
|
|
6158
6158
|
if (!this.userAgent) {
|
|
6159
|
-
logger
|
|
6159
|
+
logger.info('sdk webrtc recreating User Agent');
|
|
6160
6160
|
this.userAgent = this.createUserAgent(this.uaConfigOverrides);
|
|
6161
6161
|
}
|
|
6162
6162
|
if (!this.userAgent || this.isRegistered()) {
|
|
6163
|
-
logger
|
|
6163
|
+
logger.info('sdk webrtc registering aborted, already registered or no UA can be created');
|
|
6164
6164
|
return Promise.resolve();
|
|
6165
6165
|
}
|
|
6166
6166
|
|
|
6167
6167
|
if (this.connectionPromise || (this.registerer && this.registerer.waiting)) {
|
|
6168
|
-
logger
|
|
6168
|
+
logger.info('sdk webrtc registering aborted due to a registration in progress.');
|
|
6169
6169
|
return Promise.resolve();
|
|
6170
6170
|
}
|
|
6171
6171
|
|
|
6172
6172
|
const registerOptions = this._isWeb() ? {} : { extraContactHeaderParams: ['mobility=mobile'] };
|
|
6173
6173
|
|
|
6174
6174
|
const onRegisterFailed = () => {
|
|
6175
|
-
logger
|
|
6175
|
+
logger.info('sdk webrtc registering failed', { tries, registerer: !!this.registerer });
|
|
6176
6176
|
this.connectionPromise = null;
|
|
6177
6177
|
if (this.registerer && this.registerer.waiting) {
|
|
6178
6178
|
this.registerer.waitingToggle(false);
|
|
6179
6179
|
}
|
|
6180
6180
|
|
|
6181
6181
|
if (tries <= MAX_REGISTER_TRIES) {
|
|
6182
|
-
logger
|
|
6182
|
+
logger.info('sdk webrtc registering, retrying...', { tries });
|
|
6183
6183
|
setTimeout(() => this.register(tries + 1), 300);
|
|
6184
6184
|
}
|
|
6185
6185
|
};
|
|
@@ -6188,18 +6188,18 @@ class WebRTCClient extends Emitter {
|
|
|
6188
6188
|
// Avoid race condition with the close method called just before register and setting userAgent to null
|
|
6189
6189
|
// during the resolution of the primise.
|
|
6190
6190
|
if (!this.userAgent) {
|
|
6191
|
-
logger
|
|
6191
|
+
logger.info('sdk webrtc recreating User Agent after connection');
|
|
6192
6192
|
this.userAgent = this.createUserAgent(this.uaConfigOverrides);
|
|
6193
6193
|
}
|
|
6194
6194
|
|
|
6195
|
-
logger
|
|
6195
|
+
logger.info('sdk webrtc registering, transport connected', { registerOptions, ua: !!this.userAgent });
|
|
6196
6196
|
this.registerer = new Registerer(this.userAgent, registerOptions);
|
|
6197
6197
|
this.connectionPromise = null;
|
|
6198
6198
|
this._monkeyPatchRegisterer(this.registerer);
|
|
6199
6199
|
|
|
6200
6200
|
// Bind registerer events
|
|
6201
6201
|
this.registerer.stateChange.addListener(newState => {
|
|
6202
|
-
logger
|
|
6202
|
+
logger.info('sdk webrtc registering, state changed', { newState });
|
|
6203
6203
|
|
|
6204
6204
|
if (newState === RegistererState.Registered && this.registerer
|
|
6205
6205
|
&& this.registerer.state === RegistererState.Registered) {
|
|
@@ -6212,7 +6212,7 @@ class WebRTCClient extends Emitter {
|
|
|
6212
6212
|
const options = {
|
|
6213
6213
|
requestDelegate: {
|
|
6214
6214
|
onReject: response => {
|
|
6215
|
-
logger
|
|
6215
|
+
logger.error('sdk webrtc registering, rejected', { response });
|
|
6216
6216
|
|
|
6217
6217
|
onRegisterFailed();
|
|
6218
6218
|
},
|
|
@@ -6220,13 +6220,13 @@ class WebRTCClient extends Emitter {
|
|
|
6220
6220
|
};
|
|
6221
6221
|
|
|
6222
6222
|
return this.registerer.register(options).catch((e) => {
|
|
6223
|
-
logger
|
|
6223
|
+
logger.error('sdk webrtc registering, error', e);
|
|
6224
6224
|
|
|
6225
6225
|
this.eventEmitter.emit(REGISTRATION_FAILED);
|
|
6226
6226
|
return e;
|
|
6227
6227
|
});
|
|
6228
6228
|
}).catch(error => {
|
|
6229
|
-
logger
|
|
6229
|
+
logger.error('sdk webrtc registering, transport error', error);
|
|
6230
6230
|
onRegisterFailed();
|
|
6231
6231
|
});
|
|
6232
6232
|
}
|
|
@@ -6255,21 +6255,21 @@ class WebRTCClient extends Emitter {
|
|
|
6255
6255
|
}
|
|
6256
6256
|
|
|
6257
6257
|
unregister() {
|
|
6258
|
-
logger
|
|
6258
|
+
logger.info('sdk webrtc unregistering..', { userAgent: !!this.userAgent, registerer: !!this.registerer });
|
|
6259
6259
|
if (!this.registerer) {
|
|
6260
6260
|
return Promise.resolve();
|
|
6261
6261
|
}
|
|
6262
6262
|
|
|
6263
6263
|
try {
|
|
6264
6264
|
return this.registerer.unregister().then(() => {
|
|
6265
|
-
logger
|
|
6265
|
+
logger.info('sdk webrtc unregistered');
|
|
6266
6266
|
this._cleanupRegister();
|
|
6267
6267
|
}).catch(e => {
|
|
6268
|
-
logger
|
|
6268
|
+
logger.error('sdk webrtc unregistering, promise error', e);
|
|
6269
6269
|
this._cleanupRegister();
|
|
6270
6270
|
});
|
|
6271
6271
|
} catch (e) {
|
|
6272
|
-
logger
|
|
6272
|
+
logger.error('sdk webrtc unregistering, error', e);
|
|
6273
6273
|
// Avoid issue with `undefined is not an object (evaluating 'new.target.prototype')` when triggering a new
|
|
6274
6274
|
// error when the registerer is in a bad state
|
|
6275
6275
|
this._cleanupRegister();
|
|
@@ -6277,7 +6277,7 @@ class WebRTCClient extends Emitter {
|
|
|
6277
6277
|
}
|
|
6278
6278
|
|
|
6279
6279
|
stop() {
|
|
6280
|
-
logger
|
|
6280
|
+
logger.info('sdk webrtc stop', { userAgent: !!this.userAgent });
|
|
6281
6281
|
if (!this.userAgent) {
|
|
6282
6282
|
return Promise.resolve();
|
|
6283
6283
|
}
|
|
@@ -6285,12 +6285,12 @@ class WebRTCClient extends Emitter {
|
|
|
6285
6285
|
return this.userAgent.stop().then(() => {
|
|
6286
6286
|
return this._cleanupRegister();
|
|
6287
6287
|
}).catch(e => {
|
|
6288
|
-
logger
|
|
6288
|
+
logger.warn('sdk webrtc stop, error', { message: e.message, stack: e.stack });
|
|
6289
6289
|
});
|
|
6290
6290
|
}
|
|
6291
6291
|
|
|
6292
6292
|
call(number , enableVideo , audioOnly = false, conference = false) {
|
|
6293
|
-
logger
|
|
6293
|
+
logger.info('sdk webrtc creating call', { number, enableVideo, audioOnly, conference });
|
|
6294
6294
|
const inviterOptions = {
|
|
6295
6295
|
sessionDescriptionHandlerOptionsReInvite: {
|
|
6296
6296
|
conference,
|
|
@@ -6321,7 +6321,7 @@ class WebRTCClient extends Emitter {
|
|
|
6321
6321
|
this._onAccepted(session, response.session, true);
|
|
6322
6322
|
},
|
|
6323
6323
|
onReject: (response ) => {
|
|
6324
|
-
logger
|
|
6324
|
+
logger.info('on call rejected', { id: session.id, fromTag: session.fromTag });
|
|
6325
6325
|
this._stopSendingStats(session);
|
|
6326
6326
|
this.stopNetworkMonitoring(session);
|
|
6327
6327
|
|
|
@@ -6344,11 +6344,11 @@ class WebRTCClient extends Emitter {
|
|
|
6344
6344
|
}
|
|
6345
6345
|
|
|
6346
6346
|
answer(session , enableVideo ) {
|
|
6347
|
-
logger
|
|
6347
|
+
logger.info('sdk webrtc answer call', { id: session.id, enableVideo });
|
|
6348
6348
|
|
|
6349
6349
|
if (!session || !session.accept) {
|
|
6350
6350
|
const error = 'No session to answer, or not an invitation';
|
|
6351
|
-
logger
|
|
6351
|
+
logger.warn(error);
|
|
6352
6352
|
return Promise.reject(new Error(error));
|
|
6353
6353
|
}
|
|
6354
6354
|
const options = {
|
|
@@ -6358,15 +6358,15 @@ class WebRTCClient extends Emitter {
|
|
|
6358
6358
|
return session.accept(options).then(() => {
|
|
6359
6359
|
if (session.isCanceled) {
|
|
6360
6360
|
const message = 'accepted a canceled session (or was canceled during the accept phase).';
|
|
6361
|
-
logger
|
|
6361
|
+
logger.error(message, { id: session.id });
|
|
6362
6362
|
this.onCallEnded(session);
|
|
6363
6363
|
|
|
6364
6364
|
throw new CanceledCallError(message);
|
|
6365
6365
|
}
|
|
6366
|
-
logger
|
|
6366
|
+
logger.info('sdk webrtc answer, accepted.');
|
|
6367
6367
|
this._onAccepted(session);
|
|
6368
6368
|
}).catch(e => {
|
|
6369
|
-
logger
|
|
6369
|
+
logger.error(`answer call error for ${session ? session.id : 'n/a'}`, e);
|
|
6370
6370
|
|
|
6371
6371
|
throw e;
|
|
6372
6372
|
});
|
|
@@ -6374,7 +6374,7 @@ class WebRTCClient extends Emitter {
|
|
|
6374
6374
|
|
|
6375
6375
|
hangup(session ) {
|
|
6376
6376
|
const { state, id } = session;
|
|
6377
|
-
logger
|
|
6377
|
+
logger.info('sdk webrtc hangup call', { id, state });
|
|
6378
6378
|
|
|
6379
6379
|
try {
|
|
6380
6380
|
this._stopSendingStats(session);
|
|
@@ -6403,7 +6403,7 @@ class WebRTCClient extends Emitter {
|
|
|
6403
6403
|
|
|
6404
6404
|
return bye();
|
|
6405
6405
|
} catch (error) {
|
|
6406
|
-
logger
|
|
6406
|
+
logger.warn('sdk webrtc hangup, error', error);
|
|
6407
6407
|
}
|
|
6408
6408
|
|
|
6409
6409
|
return null;
|
|
@@ -6421,7 +6421,7 @@ class WebRTCClient extends Emitter {
|
|
|
6421
6421
|
// Fetch and emit an event at `interval` with session network stats
|
|
6422
6422
|
startNetworkMonitoring(session , interval = 1000) {
|
|
6423
6423
|
const sessionId = this.getSipSessionId(session);
|
|
6424
|
-
logger
|
|
6424
|
+
logger.info('starting network inspection', { id: sessionId });
|
|
6425
6425
|
|
|
6426
6426
|
this.sessionNetworkStats[sessionId] = [];
|
|
6427
6427
|
|
|
@@ -6431,7 +6431,7 @@ class WebRTCClient extends Emitter {
|
|
|
6431
6431
|
stopNetworkMonitoring(session ) {
|
|
6432
6432
|
const sessionId = this.getSipSessionId(session);
|
|
6433
6433
|
const exists = sessionId in this.networkMonitoringInterval;
|
|
6434
|
-
logger
|
|
6434
|
+
logger.info('stopping network inspection', { id: sessionId, exists });
|
|
6435
6435
|
|
|
6436
6436
|
if (exists) {
|
|
6437
6437
|
clearInterval(this.networkMonitoringInterval[sessionId]);
|
|
@@ -6441,17 +6441,17 @@ class WebRTCClient extends Emitter {
|
|
|
6441
6441
|
}
|
|
6442
6442
|
|
|
6443
6443
|
reject(session ) {
|
|
6444
|
-
logger
|
|
6444
|
+
logger.info('sdk webrtc reject call', { id: session.id });
|
|
6445
6445
|
|
|
6446
6446
|
try {
|
|
6447
6447
|
return session.reject ? session.reject() : session.cancel();
|
|
6448
6448
|
} catch (e) {
|
|
6449
|
-
logger
|
|
6449
|
+
logger.warn('Error when rejecting call', e.message, e.stack);
|
|
6450
6450
|
}
|
|
6451
6451
|
}
|
|
6452
6452
|
|
|
6453
6453
|
async close() {
|
|
6454
|
-
logger
|
|
6454
|
+
logger.info('sdk webrtc closing client', { userAgent: !!this.userAgent });
|
|
6455
6455
|
this._cleanupMedia();
|
|
6456
6456
|
this.connectionPromise = null;
|
|
6457
6457
|
|
|
@@ -6482,7 +6482,7 @@ class WebRTCClient extends Emitter {
|
|
|
6482
6482
|
// eg: "INVITE not rejectable in state Completed"
|
|
6483
6483
|
}
|
|
6484
6484
|
this.userAgent = null;
|
|
6485
|
-
logger
|
|
6485
|
+
logger.info('sdk webrtc client closed');
|
|
6486
6486
|
}
|
|
6487
6487
|
|
|
6488
6488
|
getNumber(session ) {
|
|
@@ -6495,13 +6495,13 @@ class WebRTCClient extends Emitter {
|
|
|
6495
6495
|
}
|
|
6496
6496
|
|
|
6497
6497
|
mute(session ) {
|
|
6498
|
-
logger
|
|
6498
|
+
logger.info('sdk webrtc mute', { id: session.id });
|
|
6499
6499
|
|
|
6500
6500
|
this._toggleAudio(session, true);
|
|
6501
6501
|
}
|
|
6502
6502
|
|
|
6503
6503
|
unmute(session ) {
|
|
6504
|
-
logger
|
|
6504
|
+
logger.info('sdk webrtc unmute', { id: session.id });
|
|
6505
6505
|
|
|
6506
6506
|
this._toggleAudio(session, false);
|
|
6507
6507
|
}
|
|
@@ -6541,13 +6541,13 @@ class WebRTCClient extends Emitter {
|
|
|
6541
6541
|
}
|
|
6542
6542
|
|
|
6543
6543
|
toggleCameraOn(session ) {
|
|
6544
|
-
logger
|
|
6544
|
+
logger.info('sdk webrtc toggle camera on', { id: session.id });
|
|
6545
6545
|
|
|
6546
6546
|
this._toggleVideo(session, false);
|
|
6547
6547
|
}
|
|
6548
6548
|
|
|
6549
6549
|
toggleCameraOff(session ) {
|
|
6550
|
-
logger
|
|
6550
|
+
logger.info('sdk webrtc toggle camera off', { id: session.id });
|
|
6551
6551
|
|
|
6552
6552
|
this._toggleVideo(session, true);
|
|
6553
6553
|
}
|
|
@@ -6556,7 +6556,7 @@ class WebRTCClient extends Emitter {
|
|
|
6556
6556
|
const sessionId = this.getSipSessionId(session);
|
|
6557
6557
|
const hasVideo = hadVideo || this.hasLocalVideo(sessionId);
|
|
6558
6558
|
|
|
6559
|
-
logger
|
|
6559
|
+
logger.info('sdk webrtc hold', {
|
|
6560
6560
|
sessionId,
|
|
6561
6561
|
keys: Object.keys(this.heldSessions),
|
|
6562
6562
|
pendingReinvite: !!session.pendingReinvite,
|
|
@@ -6605,7 +6605,7 @@ class WebRTCClient extends Emitter {
|
|
|
6605
6605
|
const sessionId = this.getSipSessionId(session);
|
|
6606
6606
|
const hasVideo = sessionId in this.heldSessions && this.heldSessions[sessionId].hasVideo;
|
|
6607
6607
|
|
|
6608
|
-
logger
|
|
6608
|
+
logger.info('sdk webrtc unhold', {
|
|
6609
6609
|
sessionId,
|
|
6610
6610
|
keys: Object.keys(this.heldSessions),
|
|
6611
6611
|
pendingReinvite: !!session.pendingReinvite,
|
|
@@ -6753,7 +6753,7 @@ class WebRTCClient extends Emitter {
|
|
|
6753
6753
|
if (!session.sessionDescriptionHandler) {
|
|
6754
6754
|
return;
|
|
6755
6755
|
}
|
|
6756
|
-
logger
|
|
6756
|
+
logger.info('Sending DTMF', {
|
|
6757
6757
|
id: this.getSipSessionId(session),
|
|
6758
6758
|
tone,
|
|
6759
6759
|
});
|
|
@@ -6769,7 +6769,7 @@ class WebRTCClient extends Emitter {
|
|
|
6769
6769
|
transfer(session , target ) {
|
|
6770
6770
|
this.hold(session);
|
|
6771
6771
|
|
|
6772
|
-
logger
|
|
6772
|
+
logger.info('Transfering a session', {
|
|
6773
6773
|
id: this.getSipSessionId(session),
|
|
6774
6774
|
target,
|
|
6775
6775
|
});
|
|
@@ -6791,17 +6791,17 @@ class WebRTCClient extends Emitter {
|
|
|
6791
6791
|
atxfer(session ) {
|
|
6792
6792
|
this.hold(session);
|
|
6793
6793
|
|
|
6794
|
-
logger
|
|
6794
|
+
logger.info('webrtc transfer started', { id: this.getSipSessionId(session) });
|
|
6795
6795
|
|
|
6796
6796
|
const result = {
|
|
6797
6797
|
newSession: null,
|
|
6798
6798
|
init: async (target ) => {
|
|
6799
|
-
logger
|
|
6799
|
+
logger.info('webrtc transfer initialized', { id: this.getSipSessionId(session), target });
|
|
6800
6800
|
|
|
6801
6801
|
result.newSession = await this.call(target);
|
|
6802
6802
|
},
|
|
6803
6803
|
complete: () => {
|
|
6804
|
-
logger
|
|
6804
|
+
logger.info('webrtc transfer completed', {
|
|
6805
6805
|
id: this.getSipSessionId(session),
|
|
6806
6806
|
referId: this.getSipSessionId(result.newSession),
|
|
6807
6807
|
});
|
|
@@ -6822,7 +6822,7 @@ class WebRTCClient extends Emitter {
|
|
|
6822
6822
|
return;
|
|
6823
6823
|
}
|
|
6824
6824
|
|
|
6825
|
-
logger
|
|
6825
|
+
logger.info('send WebRTC message', { sipId: sipSession.id, contentType });
|
|
6826
6826
|
|
|
6827
6827
|
try {
|
|
6828
6828
|
sipSession.message({
|
|
@@ -6864,7 +6864,7 @@ class WebRTCClient extends Emitter {
|
|
|
6864
6864
|
}
|
|
6865
6865
|
|
|
6866
6866
|
changeAudioOutputVolume(volume ) {
|
|
6867
|
-
logger
|
|
6867
|
+
logger.info('Changing audio output volume', { volume });
|
|
6868
6868
|
|
|
6869
6869
|
Object.values(this.audioElements).forEach(audioElement => {
|
|
6870
6870
|
if (audioElement instanceof HTMLAudioElement) {
|
|
@@ -6876,7 +6876,7 @@ class WebRTCClient extends Emitter {
|
|
|
6876
6876
|
}
|
|
6877
6877
|
|
|
6878
6878
|
changeAudioOutputDevice(id ) {
|
|
6879
|
-
logger
|
|
6879
|
+
logger.info('Changing audio output device', { id });
|
|
6880
6880
|
|
|
6881
6881
|
Object.values(this.audioElements).forEach(audioElement => {
|
|
6882
6882
|
// `setSinkId` method is not included in any flow type definitions for HTMLAudioElements but is a valid method
|
|
@@ -6893,7 +6893,7 @@ class WebRTCClient extends Emitter {
|
|
|
6893
6893
|
|
|
6894
6894
|
changeAudioInputDevice(id , session ) {
|
|
6895
6895
|
const currentId = this.getAudioDeviceId();
|
|
6896
|
-
logger
|
|
6896
|
+
logger.info('setting audio input device', { id, currentId, session: !!session });
|
|
6897
6897
|
|
|
6898
6898
|
if (id === currentId) {
|
|
6899
6899
|
return null;
|
|
@@ -6939,7 +6939,7 @@ class WebRTCClient extends Emitter {
|
|
|
6939
6939
|
|
|
6940
6940
|
setVideoInputDevice(id ) {
|
|
6941
6941
|
const currentId = this.getVideoDeviceId();
|
|
6942
|
-
logger
|
|
6942
|
+
logger.info('setting video input device', { id, currentId });
|
|
6943
6943
|
|
|
6944
6944
|
if (id === currentId) {
|
|
6945
6945
|
return null;
|
|
@@ -6964,7 +6964,7 @@ class WebRTCClient extends Emitter {
|
|
|
6964
6964
|
const sessionId = this.getSipSessionId(session);
|
|
6965
6965
|
const localStream = this.getLocalStream(sessionId);
|
|
6966
6966
|
|
|
6967
|
-
logger
|
|
6967
|
+
logger.info('changing video input device', { id, sessionId });
|
|
6968
6968
|
|
|
6969
6969
|
// Release old video stream
|
|
6970
6970
|
if (localStream) {
|
|
@@ -7032,7 +7032,7 @@ class WebRTCClient extends Emitter {
|
|
|
7032
7032
|
const shouldDoScreenSharing = newConstraints && newConstraints.screen;
|
|
7033
7033
|
const desktop = newConstraints && newConstraints.desktop;
|
|
7034
7034
|
|
|
7035
|
-
logger
|
|
7035
|
+
logger.info('Sending reinvite', {
|
|
7036
7036
|
id: this.getSipSessionId(sipSession),
|
|
7037
7037
|
newConstraints,
|
|
7038
7038
|
conference,
|
|
@@ -7070,7 +7070,7 @@ class WebRTCClient extends Emitter {
|
|
|
7070
7070
|
sipSession.incomingInviteRequest.message.body = response.message.body;
|
|
7071
7071
|
}
|
|
7072
7072
|
|
|
7073
|
-
logger
|
|
7073
|
+
logger.info('on re-INVITE accepted', {
|
|
7074
7074
|
id: this.getSipSessionId(sipSession),
|
|
7075
7075
|
wasMuted,
|
|
7076
7076
|
shouldDoScreenSharing,
|
|
@@ -7245,7 +7245,7 @@ class WebRTCClient extends Emitter {
|
|
|
7245
7245
|
}
|
|
7246
7246
|
|
|
7247
7247
|
startHeartbeat() {
|
|
7248
|
-
logger
|
|
7248
|
+
logger.info('sdk webrtc start heartbeat', { userAgent: !!this.userAgent });
|
|
7249
7249
|
if (!this.userAgent) {
|
|
7250
7250
|
this.heartbeat.stop();
|
|
7251
7251
|
return;
|
|
@@ -7258,7 +7258,7 @@ class WebRTCClient extends Emitter {
|
|
|
7258
7258
|
}
|
|
7259
7259
|
|
|
7260
7260
|
stopHeartbeat() {
|
|
7261
|
-
logger
|
|
7261
|
+
logger.info('sdk webrtc stop heartbeat');
|
|
7262
7262
|
this.heartbeat.stop();
|
|
7263
7263
|
}
|
|
7264
7264
|
|
|
@@ -7279,7 +7279,7 @@ class WebRTCClient extends Emitter {
|
|
|
7279
7279
|
}
|
|
7280
7280
|
|
|
7281
7281
|
attemptReconnection() {
|
|
7282
|
-
logger
|
|
7282
|
+
logger.info('attempt reconnection', { userAgent: !!this.userAgent });
|
|
7283
7283
|
if (!this.userAgent) {
|
|
7284
7284
|
return;
|
|
7285
7285
|
}
|
|
@@ -7304,7 +7304,7 @@ class WebRTCClient extends Emitter {
|
|
|
7304
7304
|
return;
|
|
7305
7305
|
}
|
|
7306
7306
|
|
|
7307
|
-
logger
|
|
7307
|
+
logger.info('setting local media stream', {
|
|
7308
7308
|
sipSessionId,
|
|
7309
7309
|
tracks: newStream ? newStream.getTracks() : null,
|
|
7310
7310
|
});
|
|
@@ -7321,7 +7321,7 @@ class WebRTCClient extends Emitter {
|
|
|
7321
7321
|
|
|
7322
7322
|
const oldStream = this.getLocalStream(sipSessionId);
|
|
7323
7323
|
|
|
7324
|
-
logger
|
|
7324
|
+
logger.info('updating local stream', {
|
|
7325
7325
|
sipSessionId,
|
|
7326
7326
|
oldStream: !!oldStream,
|
|
7327
7327
|
tracks: newStream.getTracks(),
|
|
@@ -7341,7 +7341,7 @@ class WebRTCClient extends Emitter {
|
|
|
7341
7341
|
const remoteStream = this.getRemoteStream(sessionId);
|
|
7342
7342
|
const pc = this.getPeerConnection(sessionId);
|
|
7343
7343
|
|
|
7344
|
-
logger
|
|
7344
|
+
logger.info('Updating remote stream', {
|
|
7345
7345
|
sessionId,
|
|
7346
7346
|
tracks: remoteStream ? remoteStream.getTracks() : null,
|
|
7347
7347
|
receiverTracks: pc && pc.getReceivers ? pc.getReceivers().map(receiver => receiver.track) : null,
|
|
@@ -7366,14 +7366,16 @@ class WebRTCClient extends Emitter {
|
|
|
7366
7366
|
const screenSharing = constraints && 'screen' in constraints ? constraints.screen : false;
|
|
7367
7367
|
const isDesktop = constraints && 'desktop' in constraints ? constraints.desktop : false;
|
|
7368
7368
|
const withAudio = constraints && 'audio' in constraints ? constraints.audio : true;
|
|
7369
|
+
const mandatoryVideo = constraints && typeof constraints.video === 'object' ? constraints.video.mandatory : {};
|
|
7369
7370
|
|
|
7370
|
-
logger
|
|
7371
|
+
logger.info('Retrieving media a configuration', { enableVideo, screenSharing, isDesktop, withAudio, constraints });
|
|
7371
7372
|
|
|
7372
7373
|
return {
|
|
7373
7374
|
constraints: {
|
|
7374
7375
|
// Exact constraint are not supported with `getDisplayMedia` and we must have a video=false in desktop screenshare
|
|
7375
7376
|
audio: screenSharing ? !isDesktop : (withAudio ? this._getAudioConstraints() : false),
|
|
7376
|
-
video: screenSharing ? (isDesktop
|
|
7377
|
+
video: screenSharing ? (isDesktop
|
|
7378
|
+
? ({ mandatory: { chromeMediaSource: 'desktop', ...(mandatoryVideo || {}) } }) : { cursor: 'always' })
|
|
7377
7379
|
: this._getVideoConstraints(enableVideo),
|
|
7378
7380
|
screen: screenSharing,
|
|
7379
7381
|
desktop: isDesktop,
|
|
@@ -7416,7 +7418,7 @@ class WebRTCClient extends Emitter {
|
|
|
7416
7418
|
}
|
|
7417
7419
|
|
|
7418
7420
|
_onTransportError() {
|
|
7419
|
-
logger
|
|
7421
|
+
logger.error('on transport error');
|
|
7420
7422
|
this.eventEmitter.emit(TRANSPORT_ERROR);
|
|
7421
7423
|
this.attemptReconnection();
|
|
7422
7424
|
}
|
|
@@ -7425,7 +7427,7 @@ class WebRTCClient extends Emitter {
|
|
|
7425
7427
|
const body = message && typeof message === 'object' ? message.data : message;
|
|
7426
7428
|
if (body && body.indexOf('200 OK') !== -1) {
|
|
7427
7429
|
if (this.hasHeartbeat()) {
|
|
7428
|
-
logger
|
|
7430
|
+
logger.info('on heartbeat received from Asterisk', { hasHeartbeat: this.hasHeartbeat() });
|
|
7429
7431
|
|
|
7430
7432
|
this.heartbeat.onHeartbeat();
|
|
7431
7433
|
if (this.heartbeatCb) {
|
|
@@ -7436,7 +7438,7 @@ class WebRTCClient extends Emitter {
|
|
|
7436
7438
|
}
|
|
7437
7439
|
|
|
7438
7440
|
async _onHeartbeatTimeout() {
|
|
7439
|
-
logger
|
|
7441
|
+
logger.info('sdk webrtc heartbeat timed out', { userAgent: !!this.userAgent, cb: !!this.heartbeatTimeoutCb });
|
|
7440
7442
|
|
|
7441
7443
|
if (this.heartbeatTimeoutCb) {
|
|
7442
7444
|
this.heartbeatTimeoutCb();
|
|
@@ -7448,7 +7450,7 @@ class WebRTCClient extends Emitter {
|
|
|
7448
7450
|
try {
|
|
7449
7451
|
await this.userAgent.transport.disconnect();
|
|
7450
7452
|
} catch (e) {
|
|
7451
|
-
logger
|
|
7453
|
+
logger.error('Transport disconnection after heartbeat timeout, error', e);
|
|
7452
7454
|
}
|
|
7453
7455
|
}
|
|
7454
7456
|
|
|
@@ -7481,31 +7483,31 @@ class WebRTCClient extends Emitter {
|
|
|
7481
7483
|
}
|
|
7482
7484
|
|
|
7483
7485
|
_connectIfNeeded() {
|
|
7484
|
-
logger
|
|
7486
|
+
logger.info('connect if needed, checking', { connected: this.isConnected() });
|
|
7485
7487
|
if (!this.userAgent) {
|
|
7486
|
-
logger
|
|
7488
|
+
logger.info('need to recreate User Agent');
|
|
7487
7489
|
this.userAgent = this.createUserAgent(this.uaConfigOverrides);
|
|
7488
7490
|
}
|
|
7489
7491
|
|
|
7490
7492
|
if (this.isConnected()) {
|
|
7491
|
-
logger
|
|
7493
|
+
logger.info('webrtc sdk, already connected');
|
|
7492
7494
|
return Promise.resolve();
|
|
7493
7495
|
}
|
|
7494
7496
|
|
|
7495
7497
|
if (this.isConnecting()) {
|
|
7496
|
-
logger
|
|
7498
|
+
logger.info('webrtc sdk, already connecting...');
|
|
7497
7499
|
|
|
7498
7500
|
this.connectionPromise = this.userAgent.transport.connectPromise;
|
|
7499
7501
|
return this.connectionPromise;
|
|
7500
7502
|
}
|
|
7501
7503
|
|
|
7502
7504
|
if (this.connectionPromise) {
|
|
7503
|
-
logger
|
|
7505
|
+
logger.info('webrtc sdk, connection promise connecting...');
|
|
7504
7506
|
// $FlowFixMe
|
|
7505
7507
|
return this.connectionPromise;
|
|
7506
7508
|
}
|
|
7507
7509
|
|
|
7508
|
-
logger
|
|
7510
|
+
logger.info('WebRTC UA needs to connect');
|
|
7509
7511
|
|
|
7510
7512
|
// Force UA to reconnect
|
|
7511
7513
|
if (this.userAgent && this.userAgent.state !== UserAgentState.Stopped) {
|
|
@@ -7630,7 +7632,7 @@ class WebRTCClient extends Emitter {
|
|
|
7630
7632
|
|
|
7631
7633
|
sdh.peerConnectionDelegate = {
|
|
7632
7634
|
onicecandidateerror: (error ) => {
|
|
7633
|
-
logger
|
|
7635
|
+
logger.error('on icecandidate error', {
|
|
7634
7636
|
address: error.address,
|
|
7635
7637
|
port: error.port,
|
|
7636
7638
|
errorCode: error.errorCode,
|
|
@@ -7659,7 +7661,7 @@ class WebRTCClient extends Emitter {
|
|
|
7659
7661
|
updatedNumber = session.assertedIdentity.uri.normal.user;
|
|
7660
7662
|
updatedCalleeName = session.assertedIdentity.displayName || updatedNumber;
|
|
7661
7663
|
}
|
|
7662
|
-
logger
|
|
7664
|
+
logger.info('re-invite received', { updatedCalleeName, updatedNumber, hadRemoteVideo });
|
|
7663
7665
|
|
|
7664
7666
|
// Useful to know if it's a video upgrade or an unhold from a remote peer with a video stream
|
|
7665
7667
|
|
|
@@ -7680,7 +7682,7 @@ class WebRTCClient extends Emitter {
|
|
|
7680
7682
|
}
|
|
7681
7683
|
|
|
7682
7684
|
_onAccepted(session , sessionDialog , withEvent = true) {
|
|
7683
|
-
logger
|
|
7685
|
+
logger.info('on call accepted', { id: session.id, remoteTag: session.remoteTag });
|
|
7684
7686
|
|
|
7685
7687
|
this.storeSipSession(session);
|
|
7686
7688
|
|
|
@@ -7692,7 +7694,7 @@ class WebRTCClient extends Emitter {
|
|
|
7692
7694
|
const onTrack = (event ) => {
|
|
7693
7695
|
const isAudioOnly = this._isAudioOnly(session);
|
|
7694
7696
|
const { kind, label, readyState, id, muted } = event.track;
|
|
7695
|
-
logger
|
|
7697
|
+
logger.info('on track event', { isAudioOnly, kind, label, readyState, id, muted });
|
|
7696
7698
|
|
|
7697
7699
|
// Stop video track in audio only mode
|
|
7698
7700
|
if (isAudioOnly && kind === 'video') {
|
|
@@ -7708,12 +7710,14 @@ class WebRTCClient extends Emitter {
|
|
|
7708
7710
|
|
|
7709
7711
|
session.sessionDescriptionHandler.remoteMediaStream.onaddtrack = onTrack;
|
|
7710
7712
|
|
|
7711
|
-
|
|
7712
|
-
|
|
7713
|
-
|
|
7714
|
-
|
|
7715
|
-
|
|
7716
|
-
|
|
7713
|
+
if (pc) {
|
|
7714
|
+
pc.oniceconnectionstatechange = () => {
|
|
7715
|
+
logger.info('on ice connection state changed', { state: pc.iceConnectionState });
|
|
7716
|
+
if (pc.iceConnectionState === 'disconnected') {
|
|
7717
|
+
this.eventEmitter.emit(ON_DISCONNECTED);
|
|
7718
|
+
}
|
|
7719
|
+
};
|
|
7720
|
+
}
|
|
7717
7721
|
|
|
7718
7722
|
if (withEvent) {
|
|
7719
7723
|
this.eventEmitter.emit(ACCEPTED, session, sessionDialog);
|
|
@@ -7882,10 +7886,10 @@ class WebRTCClient extends Emitter {
|
|
|
7882
7886
|
|
|
7883
7887
|
_stopSendingStats(session ) {
|
|
7884
7888
|
const sessionId = this.getSipSessionId(session);
|
|
7885
|
-
logger
|
|
7889
|
+
logger.trace('Check for stopping stats', { sessionId, ids: Object.keys(this.statsIntervals) });
|
|
7886
7890
|
|
|
7887
7891
|
if (sessionId in this.statsIntervals) {
|
|
7888
|
-
logger
|
|
7892
|
+
logger.trace('Stop sending stats for call', { sessionId });
|
|
7889
7893
|
this.statsIntervals[sessionId]();
|
|
7890
7894
|
delete this.statsIntervals[sessionId];
|
|
7891
7895
|
}
|
|
@@ -7901,7 +7905,7 @@ class WebRTCClient extends Emitter {
|
|
|
7901
7905
|
try {
|
|
7902
7906
|
await this.userAgent.transport.disconnect();
|
|
7903
7907
|
} catch (e) {
|
|
7904
|
-
logger
|
|
7908
|
+
logger.error('WebRTC transport disconnect, error', e);
|
|
7905
7909
|
}
|
|
7906
7910
|
}
|
|
7907
7911
|
}
|
|
@@ -7923,13 +7927,17 @@ class WebRTCClient extends Emitter {
|
|
|
7923
7927
|
const nbStats = this.sessionNetworkStats[sessionId].length;
|
|
7924
7928
|
const lastNetworkStats = this.sessionNetworkStats[sessionId][nbStats - 1];
|
|
7925
7929
|
const lastAudioSent = lastNetworkStats ? lastNetworkStats.audioBytesSent : 0;
|
|
7930
|
+
const lastAudioContentSent = lastNetworkStats ? lastNetworkStats.audioContentSent : 0;
|
|
7926
7931
|
const lastVideoSent = lastNetworkStats ? lastNetworkStats.videoBytesSent : 0;
|
|
7927
7932
|
const lastAudioReceived = lastNetworkStats ? lastNetworkStats.audioBytesReceived : 0;
|
|
7933
|
+
const lastAudioContentReceived = lastNetworkStats ? lastNetworkStats.audioContentReceived : 0;
|
|
7928
7934
|
const lastVideoReceived = lastNetworkStats ? lastNetworkStats.videoBytesReceived : 0;
|
|
7929
7935
|
const lastTransportSent = lastNetworkStats ? lastNetworkStats.transportSent : 0;
|
|
7930
7936
|
const lastTransportReceived = lastNetworkStats ? lastNetworkStats.transportReceived : 0;
|
|
7931
|
-
let audioBytesSent = 0;
|
|
7932
|
-
let audioBytesReceived = 0;
|
|
7937
|
+
let audioBytesSent = 0; // content + header
|
|
7938
|
+
let audioBytesReceived = 0; // content + header
|
|
7939
|
+
let audioContentSent = 0; // useful to detect blank call
|
|
7940
|
+
let audioContentReceived = 0;
|
|
7933
7941
|
let videoBytesSent = 0;
|
|
7934
7942
|
let videoBytesReceived = 0;
|
|
7935
7943
|
let transportSent = 0;
|
|
@@ -7939,6 +7947,7 @@ class WebRTCClient extends Emitter {
|
|
|
7939
7947
|
stats.forEach(report => {
|
|
7940
7948
|
if (report.type === 'outbound-rtp' && report.kind === 'audio') {
|
|
7941
7949
|
audioBytesSent += Number(report.bytesSent) + Number(report.headerBytesSent);
|
|
7950
|
+
audioContentSent += Number(report.bytesSent);
|
|
7942
7951
|
}
|
|
7943
7952
|
if (report.type === 'remote-outbound-rtp' && report.kind === 'audio') {
|
|
7944
7953
|
audioBytesSent += Number(report.bytesSent);
|
|
@@ -7950,6 +7959,7 @@ class WebRTCClient extends Emitter {
|
|
|
7950
7959
|
packetsLost += Number(report.packetsLost);
|
|
7951
7960
|
networkStats.packetsReceived = Number(report.packetsReceived);
|
|
7952
7961
|
audioBytesReceived += Number(report.bytesReceived) + Number(report.headerBytesReceived);
|
|
7962
|
+
audioContentReceived += Number(report.bytesReceived);
|
|
7953
7963
|
}
|
|
7954
7964
|
if (report.type === 'inbound-rtp' && report.kind === 'video') {
|
|
7955
7965
|
videoBytesReceived += Number(report.bytesReceived) + Number(report.headerBytesReceived);
|
|
@@ -7978,10 +7988,17 @@ class WebRTCClient extends Emitter {
|
|
|
7978
7988
|
});
|
|
7979
7989
|
|
|
7980
7990
|
networkStats.packetsLost = packetsLost;
|
|
7991
|
+
|
|
7981
7992
|
networkStats.totalAudioBytesSent = audioBytesSent;
|
|
7982
7993
|
networkStats.audioBytesSent = audioBytesSent - lastAudioSent;
|
|
7983
7994
|
networkStats.totalAudioBytesReceived = audioBytesReceived - lastAudioReceived;
|
|
7984
7995
|
networkStats.audioBytesReceived = audioBytesReceived;
|
|
7996
|
+
|
|
7997
|
+
networkStats.totalAudioContentSent = audioContentSent;
|
|
7998
|
+
networkStats.audioContentSent = audioContentSent - lastAudioContentSent;
|
|
7999
|
+
networkStats.totalAudioBytesReceived = audioContentReceived - lastAudioContentReceived;
|
|
8000
|
+
networkStats.audioContentReceived = audioContentReceived;
|
|
8001
|
+
|
|
7985
8002
|
networkStats.totalVideoBytesSent = videoBytesSent;
|
|
7986
8003
|
networkStats.videoBytesSent = videoBytesSent - lastVideoSent;
|
|
7987
8004
|
networkStats.totalVideoBytesReceived = videoBytesReceived;
|
|
@@ -8084,7 +8101,7 @@ var webrtc = {
|
|
|
8084
8101
|
}),
|
|
8085
8102
|
};
|
|
8086
8103
|
|
|
8087
|
-
const parseCandidate
|
|
8104
|
+
const parseCandidate = line => {
|
|
8088
8105
|
let parts;
|
|
8089
8106
|
// Parse both variants.
|
|
8090
8107
|
if (line.indexOf('a=candidate:') === 0) {
|
|
@@ -8175,7 +8192,7 @@ var SymmetricNat = {
|
|
|
8175
8192
|
}
|
|
8176
8193
|
|
|
8177
8194
|
if (e.candidate && e.candidate.candidate.indexOf('srflx') !== -1) {
|
|
8178
|
-
const cand = parseCandidate
|
|
8195
|
+
const cand = parseCandidate(e.candidate.candidate);
|
|
8179
8196
|
if (!candidates[cand.relatedPort]) candidates[cand.relatedPort] = [];
|
|
8180
8197
|
candidates[cand.relatedPort].push(cand.port);
|
|
8181
8198
|
} else if (!e.candidate) {
|
|
@@ -8243,7 +8260,7 @@ var iceIpv4 = {
|
|
|
8243
8260
|
const rawCandidate = e.candidate.candidate;
|
|
8244
8261
|
if (rawCandidate.indexOf('srflx') !== -1 || rawCandidate.indexOf('relay') !== -1) {
|
|
8245
8262
|
hasSrflxOrRelay = true;
|
|
8246
|
-
const candidate = parseCandidate
|
|
8263
|
+
const candidate = parseCandidate(e.candidate.candidate);
|
|
8247
8264
|
ips.push(candidate.ip);
|
|
8248
8265
|
}
|
|
8249
8266
|
} else if (!e.candidate) {
|