@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
package/esm/checker/Checker.js
CHANGED
|
@@ -458,11 +458,11 @@ 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$4 = 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 = () => {
|
|
465
|
-
if (typeof document !== 'undefined') {
|
|
465
|
+
if (typeof document !== 'undefined' && window.fetch) {
|
|
466
466
|
// Browser
|
|
467
467
|
return window.fetch;
|
|
468
468
|
}
|
|
@@ -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$4.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$4.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$4.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$4.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$4.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$4.info('token refreshed', { isTokenNotFound });
|
|
675
675
|
if (isTokenNotFound) {
|
|
676
676
|
const pathParts = path.split('/');
|
|
677
677
|
pathParts.pop();
|
|
@@ -1922,7 +1922,7 @@ class Contact {
|
|
|
1922
1922
|
this[key] = old[key] || this[key];
|
|
1923
1923
|
});
|
|
1924
1924
|
|
|
1925
|
-
if (old.lineState
|
|
1925
|
+
if (old.lineState) {
|
|
1926
1926
|
this.lineState = old.lineState;
|
|
1927
1927
|
}
|
|
1928
1928
|
|
|
@@ -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
|
|
|
@@ -4558,7 +4558,7 @@ const AGENTD_VERSION = '1.0';
|
|
|
4558
4558
|
const WEBHOOKD_VERSION = '1.0';
|
|
4559
4559
|
const AMID_VERSION = '1.0';
|
|
4560
4560
|
|
|
4561
|
-
const logger$
|
|
4561
|
+
const logger$3 = IssueReporter$1 ? IssueReporter$1.loggerFor('api') : console;
|
|
4562
4562
|
|
|
4563
4563
|
class ApiClient {
|
|
4564
4564
|
|
|
@@ -4610,12 +4610,12 @@ class ApiClient {
|
|
|
4610
4610
|
}
|
|
4611
4611
|
|
|
4612
4612
|
async forceRefreshToken() {
|
|
4613
|
-
logger$
|
|
4613
|
+
logger$3.info('forcing refresh token, calling callback');
|
|
4614
4614
|
return this.refreshTokenCallback();
|
|
4615
4615
|
}
|
|
4616
4616
|
|
|
4617
4617
|
async refreshTokenCallback() {
|
|
4618
|
-
logger$
|
|
4618
|
+
logger$3.info('refresh token callback called', {
|
|
4619
4619
|
refreshToken: this.refreshToken,
|
|
4620
4620
|
refreshBackend: this.refreshBackend,
|
|
4621
4621
|
refreshExpiration: this.refreshExpiration,
|
|
@@ -4633,7 +4633,7 @@ class ApiClient {
|
|
|
4633
4633
|
this.isMobile,
|
|
4634
4634
|
);
|
|
4635
4635
|
|
|
4636
|
-
logger$
|
|
4636
|
+
logger$3.info('token refreshed', { token: session.token });
|
|
4637
4637
|
|
|
4638
4638
|
if (this.onRefreshToken) {
|
|
4639
4639
|
this.onRefreshToken(session.token, session);
|
|
@@ -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$2 = 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$2.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$2.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$2.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$2.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$2.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$2.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$2.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$2.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$2.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$2.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$2.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$2.log('on heartbeat received from Wazo WS');
|
|
5245
5245
|
}
|
|
5246
5246
|
}
|
|
5247
5247
|
|
|
5248
5248
|
async _onHeartbeatTimeout() {
|
|
5249
|
-
logger$
|
|
5249
|
+
logger$2.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
|
}
|
|
@@ -5479,11 +5479,16 @@ class WazoSessionDescriptionHandler extends SessionDescriptionHandler {
|
|
|
5479
5479
|
|
|
5480
5480
|
// $FlowFixMe
|
|
5481
5481
|
setRemoteSessionDescription(sessionDescription ) {
|
|
5482
|
-
|
|
5482
|
+
try {
|
|
5483
|
+
const result = super.setRemoteSessionDescription(sessionDescription);
|
|
5483
5484
|
|
|
5484
|
-
|
|
5485
|
+
this.eventEmitter.emit('setDescription', sessionDescription);
|
|
5485
5486
|
|
|
5486
|
-
|
|
5487
|
+
return result;
|
|
5488
|
+
} catch (error) {
|
|
5489
|
+
this.logger.error('SessionDescriptionHandler.setRemoteSessionDescription error', error);
|
|
5490
|
+
throw error;
|
|
5491
|
+
}
|
|
5487
5492
|
}
|
|
5488
5493
|
|
|
5489
5494
|
// Overridden to avoid to fix ice-candidates missing in the SDP in react-native and chrome canary.
|
|
@@ -5521,7 +5526,7 @@ class WazoSessionDescriptionHandler extends SessionDescriptionHandler {
|
|
|
5521
5526
|
this.peerConnectionDelegate.onicecandidate = event => {
|
|
5522
5527
|
wazoLogger.trace('onicecandidate', event.candidate ? event.candidate.candidate : { done: true });
|
|
5523
5528
|
if (event.candidate) {
|
|
5524
|
-
this.gatheredCandidates.push(parseCandidate(event.candidate.candidate));
|
|
5529
|
+
this.gatheredCandidates.push(parseCandidate$1(event.candidate.candidate));
|
|
5525
5530
|
}
|
|
5526
5531
|
};
|
|
5527
5532
|
|
|
@@ -5890,7 +5895,7 @@ const DEFAULT_ICE_TIMEOUT = 3000;
|
|
|
5890
5895
|
const SEND_STATS_DELAY = 5000;
|
|
5891
5896
|
|
|
5892
5897
|
const states = ['STATUS_NULL', 'STATUS_NEW', 'STATUS_CONNECTING', 'STATUS_CONNECTED', 'STATUS_COMPLETED'];
|
|
5893
|
-
const logger$
|
|
5898
|
+
const logger$1 = IssueReporter$1 ? IssueReporter$1.loggerFor('webrtc-client') : console;
|
|
5894
5899
|
const statsLogger = IssueReporter$1 ? IssueReporter$1.loggerFor('webrtc-stats') : console;
|
|
5895
5900
|
|
|
5896
5901
|
// events
|
|
@@ -6066,13 +6071,13 @@ class WebRTCClient extends Emitter {
|
|
|
6066
6071
|
|
|
6067
6072
|
createUserAgent(configOverrides ) {
|
|
6068
6073
|
const webRTCConfiguration = this._createWebRTCConfiguration(configOverrides);
|
|
6069
|
-
logger$
|
|
6074
|
+
logger$1.info('sdk webrtc, creating UA', { webRTCConfiguration });
|
|
6070
6075
|
|
|
6071
6076
|
webRTCConfiguration.delegate = {
|
|
6072
6077
|
onConnect: this.onConnect.bind(this),
|
|
6073
6078
|
onDisconnect: this.onDisconnect.bind(this),
|
|
6074
6079
|
onInvite: (invitation ) => {
|
|
6075
|
-
logger$
|
|
6080
|
+
logger$1.info('sdk webrtc on invite', {
|
|
6076
6081
|
method: 'delegate.onInvite',
|
|
6077
6082
|
id: invitation.id,
|
|
6078
6083
|
remoteURI: invitation.remoteURI,
|
|
@@ -6115,7 +6120,7 @@ class WebRTCClient extends Emitter {
|
|
|
6115
6120
|
}
|
|
6116
6121
|
|
|
6117
6122
|
onConnect() {
|
|
6118
|
-
logger$
|
|
6123
|
+
logger$1.info('sdk webrtc connected', { method: 'delegate.onConnect' });
|
|
6119
6124
|
this.eventEmitter.emit(CONNECTED);
|
|
6120
6125
|
if (!this.isRegistered() && this.registerer && this.registerer.waiting) {
|
|
6121
6126
|
this.registerer.waitingToggle(false);
|
|
@@ -6124,7 +6129,7 @@ class WebRTCClient extends Emitter {
|
|
|
6124
6129
|
}
|
|
6125
6130
|
|
|
6126
6131
|
async onDisconnect(error ) {
|
|
6127
|
-
logger$
|
|
6132
|
+
logger$1.info('sdk webrtc disconnected', { method: 'delegate.onConnect', error });
|
|
6128
6133
|
this.connectionPromise = null;
|
|
6129
6134
|
// The UA will attempt to reconnect automatically when an error occurred
|
|
6130
6135
|
this.eventEmitter.emit(DISCONNECTED, error);
|
|
@@ -6149,37 +6154,37 @@ class WebRTCClient extends Emitter {
|
|
|
6149
6154
|
};
|
|
6150
6155
|
|
|
6151
6156
|
if (this.skipRegister) {
|
|
6152
|
-
logger$
|
|
6157
|
+
logger$1.info('sdk webrtc skip register...', logInfo);
|
|
6153
6158
|
return Promise.resolve();
|
|
6154
6159
|
}
|
|
6155
6160
|
|
|
6156
|
-
logger$
|
|
6161
|
+
logger$1.info('sdk webrtc registering...', logInfo);
|
|
6157
6162
|
|
|
6158
6163
|
if (!this.userAgent) {
|
|
6159
|
-
logger$
|
|
6164
|
+
logger$1.info('sdk webrtc recreating User Agent');
|
|
6160
6165
|
this.userAgent = this.createUserAgent(this.uaConfigOverrides);
|
|
6161
6166
|
}
|
|
6162
6167
|
if (!this.userAgent || this.isRegistered()) {
|
|
6163
|
-
logger$
|
|
6168
|
+
logger$1.info('sdk webrtc registering aborted, already registered or no UA can be created');
|
|
6164
6169
|
return Promise.resolve();
|
|
6165
6170
|
}
|
|
6166
6171
|
|
|
6167
6172
|
if (this.connectionPromise || (this.registerer && this.registerer.waiting)) {
|
|
6168
|
-
logger$
|
|
6173
|
+
logger$1.info('sdk webrtc registering aborted due to a registration in progress.');
|
|
6169
6174
|
return Promise.resolve();
|
|
6170
6175
|
}
|
|
6171
6176
|
|
|
6172
6177
|
const registerOptions = this._isWeb() ? {} : { extraContactHeaderParams: ['mobility=mobile'] };
|
|
6173
6178
|
|
|
6174
6179
|
const onRegisterFailed = () => {
|
|
6175
|
-
logger$
|
|
6180
|
+
logger$1.info('sdk webrtc registering failed', { tries, registerer: !!this.registerer });
|
|
6176
6181
|
this.connectionPromise = null;
|
|
6177
6182
|
if (this.registerer && this.registerer.waiting) {
|
|
6178
6183
|
this.registerer.waitingToggle(false);
|
|
6179
6184
|
}
|
|
6180
6185
|
|
|
6181
6186
|
if (tries <= MAX_REGISTER_TRIES) {
|
|
6182
|
-
logger$
|
|
6187
|
+
logger$1.info('sdk webrtc registering, retrying...', { tries });
|
|
6183
6188
|
setTimeout(() => this.register(tries + 1), 300);
|
|
6184
6189
|
}
|
|
6185
6190
|
};
|
|
@@ -6188,18 +6193,18 @@ class WebRTCClient extends Emitter {
|
|
|
6188
6193
|
// Avoid race condition with the close method called just before register and setting userAgent to null
|
|
6189
6194
|
// during the resolution of the primise.
|
|
6190
6195
|
if (!this.userAgent) {
|
|
6191
|
-
logger$
|
|
6196
|
+
logger$1.info('sdk webrtc recreating User Agent after connection');
|
|
6192
6197
|
this.userAgent = this.createUserAgent(this.uaConfigOverrides);
|
|
6193
6198
|
}
|
|
6194
6199
|
|
|
6195
|
-
logger$
|
|
6200
|
+
logger$1.info('sdk webrtc registering, transport connected', { registerOptions, ua: !!this.userAgent });
|
|
6196
6201
|
this.registerer = new Registerer(this.userAgent, registerOptions);
|
|
6197
6202
|
this.connectionPromise = null;
|
|
6198
6203
|
this._monkeyPatchRegisterer(this.registerer);
|
|
6199
6204
|
|
|
6200
6205
|
// Bind registerer events
|
|
6201
6206
|
this.registerer.stateChange.addListener(newState => {
|
|
6202
|
-
logger$
|
|
6207
|
+
logger$1.info('sdk webrtc registering, state changed', { newState });
|
|
6203
6208
|
|
|
6204
6209
|
if (newState === RegistererState.Registered && this.registerer
|
|
6205
6210
|
&& this.registerer.state === RegistererState.Registered) {
|
|
@@ -6212,7 +6217,7 @@ class WebRTCClient extends Emitter {
|
|
|
6212
6217
|
const options = {
|
|
6213
6218
|
requestDelegate: {
|
|
6214
6219
|
onReject: response => {
|
|
6215
|
-
logger$
|
|
6220
|
+
logger$1.error('sdk webrtc registering, rejected', { response });
|
|
6216
6221
|
|
|
6217
6222
|
onRegisterFailed();
|
|
6218
6223
|
},
|
|
@@ -6220,13 +6225,13 @@ class WebRTCClient extends Emitter {
|
|
|
6220
6225
|
};
|
|
6221
6226
|
|
|
6222
6227
|
return this.registerer.register(options).catch((e) => {
|
|
6223
|
-
logger$
|
|
6228
|
+
logger$1.error('sdk webrtc registering, error', e);
|
|
6224
6229
|
|
|
6225
6230
|
this.eventEmitter.emit(REGISTRATION_FAILED);
|
|
6226
6231
|
return e;
|
|
6227
6232
|
});
|
|
6228
6233
|
}).catch(error => {
|
|
6229
|
-
logger$
|
|
6234
|
+
logger$1.error('sdk webrtc registering, transport error', error);
|
|
6230
6235
|
onRegisterFailed();
|
|
6231
6236
|
});
|
|
6232
6237
|
}
|
|
@@ -6255,21 +6260,21 @@ class WebRTCClient extends Emitter {
|
|
|
6255
6260
|
}
|
|
6256
6261
|
|
|
6257
6262
|
unregister() {
|
|
6258
|
-
logger$
|
|
6263
|
+
logger$1.info('sdk webrtc unregistering..', { userAgent: !!this.userAgent, registerer: !!this.registerer });
|
|
6259
6264
|
if (!this.registerer) {
|
|
6260
6265
|
return Promise.resolve();
|
|
6261
6266
|
}
|
|
6262
6267
|
|
|
6263
6268
|
try {
|
|
6264
6269
|
return this.registerer.unregister().then(() => {
|
|
6265
|
-
logger$
|
|
6270
|
+
logger$1.info('sdk webrtc unregistered');
|
|
6266
6271
|
this._cleanupRegister();
|
|
6267
6272
|
}).catch(e => {
|
|
6268
|
-
logger$
|
|
6273
|
+
logger$1.error('sdk webrtc unregistering, promise error', e);
|
|
6269
6274
|
this._cleanupRegister();
|
|
6270
6275
|
});
|
|
6271
6276
|
} catch (e) {
|
|
6272
|
-
logger$
|
|
6277
|
+
logger$1.error('sdk webrtc unregistering, error', e);
|
|
6273
6278
|
// Avoid issue with `undefined is not an object (evaluating 'new.target.prototype')` when triggering a new
|
|
6274
6279
|
// error when the registerer is in a bad state
|
|
6275
6280
|
this._cleanupRegister();
|
|
@@ -6277,7 +6282,7 @@ class WebRTCClient extends Emitter {
|
|
|
6277
6282
|
}
|
|
6278
6283
|
|
|
6279
6284
|
stop() {
|
|
6280
|
-
logger$
|
|
6285
|
+
logger$1.info('sdk webrtc stop', { userAgent: !!this.userAgent });
|
|
6281
6286
|
if (!this.userAgent) {
|
|
6282
6287
|
return Promise.resolve();
|
|
6283
6288
|
}
|
|
@@ -6285,12 +6290,12 @@ class WebRTCClient extends Emitter {
|
|
|
6285
6290
|
return this.userAgent.stop().then(() => {
|
|
6286
6291
|
return this._cleanupRegister();
|
|
6287
6292
|
}).catch(e => {
|
|
6288
|
-
logger$
|
|
6293
|
+
logger$1.warn('sdk webrtc stop, error', { message: e.message, stack: e.stack });
|
|
6289
6294
|
});
|
|
6290
6295
|
}
|
|
6291
6296
|
|
|
6292
6297
|
call(number , enableVideo , audioOnly = false, conference = false) {
|
|
6293
|
-
logger$
|
|
6298
|
+
logger$1.info('sdk webrtc creating call', { number, enableVideo, audioOnly, conference });
|
|
6294
6299
|
const inviterOptions = {
|
|
6295
6300
|
sessionDescriptionHandlerOptionsReInvite: {
|
|
6296
6301
|
conference,
|
|
@@ -6321,7 +6326,7 @@ class WebRTCClient extends Emitter {
|
|
|
6321
6326
|
this._onAccepted(session, response.session, true);
|
|
6322
6327
|
},
|
|
6323
6328
|
onReject: (response ) => {
|
|
6324
|
-
logger$
|
|
6329
|
+
logger$1.info('on call rejected', { id: session.id, fromTag: session.fromTag });
|
|
6325
6330
|
this._stopSendingStats(session);
|
|
6326
6331
|
this.stopNetworkMonitoring(session);
|
|
6327
6332
|
|
|
@@ -6344,11 +6349,11 @@ class WebRTCClient extends Emitter {
|
|
|
6344
6349
|
}
|
|
6345
6350
|
|
|
6346
6351
|
answer(session , enableVideo ) {
|
|
6347
|
-
logger$
|
|
6352
|
+
logger$1.info('sdk webrtc answer call', { id: session.id, enableVideo });
|
|
6348
6353
|
|
|
6349
6354
|
if (!session || !session.accept) {
|
|
6350
6355
|
const error = 'No session to answer, or not an invitation';
|
|
6351
|
-
logger$
|
|
6356
|
+
logger$1.warn(error);
|
|
6352
6357
|
return Promise.reject(new Error(error));
|
|
6353
6358
|
}
|
|
6354
6359
|
const options = {
|
|
@@ -6358,15 +6363,15 @@ class WebRTCClient extends Emitter {
|
|
|
6358
6363
|
return session.accept(options).then(() => {
|
|
6359
6364
|
if (session.isCanceled) {
|
|
6360
6365
|
const message = 'accepted a canceled session (or was canceled during the accept phase).';
|
|
6361
|
-
logger$
|
|
6366
|
+
logger$1.error(message, { id: session.id });
|
|
6362
6367
|
this.onCallEnded(session);
|
|
6363
6368
|
|
|
6364
6369
|
throw new CanceledCallError(message);
|
|
6365
6370
|
}
|
|
6366
|
-
logger$
|
|
6371
|
+
logger$1.info('sdk webrtc answer, accepted.');
|
|
6367
6372
|
this._onAccepted(session);
|
|
6368
6373
|
}).catch(e => {
|
|
6369
|
-
logger$
|
|
6374
|
+
logger$1.error(`answer call error for ${session ? session.id : 'n/a'}`, e);
|
|
6370
6375
|
|
|
6371
6376
|
throw e;
|
|
6372
6377
|
});
|
|
@@ -6374,7 +6379,7 @@ class WebRTCClient extends Emitter {
|
|
|
6374
6379
|
|
|
6375
6380
|
hangup(session ) {
|
|
6376
6381
|
const { state, id } = session;
|
|
6377
|
-
logger$
|
|
6382
|
+
logger$1.info('sdk webrtc hangup call', { id, state });
|
|
6378
6383
|
|
|
6379
6384
|
try {
|
|
6380
6385
|
this._stopSendingStats(session);
|
|
@@ -6403,7 +6408,7 @@ class WebRTCClient extends Emitter {
|
|
|
6403
6408
|
|
|
6404
6409
|
return bye();
|
|
6405
6410
|
} catch (error) {
|
|
6406
|
-
logger$
|
|
6411
|
+
logger$1.warn('sdk webrtc hangup, error', error);
|
|
6407
6412
|
}
|
|
6408
6413
|
|
|
6409
6414
|
return null;
|
|
@@ -6421,7 +6426,7 @@ class WebRTCClient extends Emitter {
|
|
|
6421
6426
|
// Fetch and emit an event at `interval` with session network stats
|
|
6422
6427
|
startNetworkMonitoring(session , interval = 1000) {
|
|
6423
6428
|
const sessionId = this.getSipSessionId(session);
|
|
6424
|
-
logger$
|
|
6429
|
+
logger$1.info('starting network inspection', { id: sessionId });
|
|
6425
6430
|
|
|
6426
6431
|
this.sessionNetworkStats[sessionId] = [];
|
|
6427
6432
|
|
|
@@ -6431,7 +6436,7 @@ class WebRTCClient extends Emitter {
|
|
|
6431
6436
|
stopNetworkMonitoring(session ) {
|
|
6432
6437
|
const sessionId = this.getSipSessionId(session);
|
|
6433
6438
|
const exists = sessionId in this.networkMonitoringInterval;
|
|
6434
|
-
logger$
|
|
6439
|
+
logger$1.info('stopping network inspection', { id: sessionId, exists });
|
|
6435
6440
|
|
|
6436
6441
|
if (exists) {
|
|
6437
6442
|
clearInterval(this.networkMonitoringInterval[sessionId]);
|
|
@@ -6441,17 +6446,17 @@ class WebRTCClient extends Emitter {
|
|
|
6441
6446
|
}
|
|
6442
6447
|
|
|
6443
6448
|
reject(session ) {
|
|
6444
|
-
logger$
|
|
6449
|
+
logger$1.info('sdk webrtc reject call', { id: session.id });
|
|
6445
6450
|
|
|
6446
6451
|
try {
|
|
6447
6452
|
return session.reject ? session.reject() : session.cancel();
|
|
6448
6453
|
} catch (e) {
|
|
6449
|
-
logger$
|
|
6454
|
+
logger$1.warn('Error when rejecting call', e.message, e.stack);
|
|
6450
6455
|
}
|
|
6451
6456
|
}
|
|
6452
6457
|
|
|
6453
6458
|
async close() {
|
|
6454
|
-
logger$
|
|
6459
|
+
logger$1.info('sdk webrtc closing client', { userAgent: !!this.userAgent });
|
|
6455
6460
|
this._cleanupMedia();
|
|
6456
6461
|
this.connectionPromise = null;
|
|
6457
6462
|
|
|
@@ -6482,7 +6487,7 @@ class WebRTCClient extends Emitter {
|
|
|
6482
6487
|
// eg: "INVITE not rejectable in state Completed"
|
|
6483
6488
|
}
|
|
6484
6489
|
this.userAgent = null;
|
|
6485
|
-
logger$
|
|
6490
|
+
logger$1.info('sdk webrtc client closed');
|
|
6486
6491
|
}
|
|
6487
6492
|
|
|
6488
6493
|
getNumber(session ) {
|
|
@@ -6495,13 +6500,13 @@ class WebRTCClient extends Emitter {
|
|
|
6495
6500
|
}
|
|
6496
6501
|
|
|
6497
6502
|
mute(session ) {
|
|
6498
|
-
logger$
|
|
6503
|
+
logger$1.info('sdk webrtc mute', { id: session.id });
|
|
6499
6504
|
|
|
6500
6505
|
this._toggleAudio(session, true);
|
|
6501
6506
|
}
|
|
6502
6507
|
|
|
6503
6508
|
unmute(session ) {
|
|
6504
|
-
logger$
|
|
6509
|
+
logger$1.info('sdk webrtc unmute', { id: session.id });
|
|
6505
6510
|
|
|
6506
6511
|
this._toggleAudio(session, false);
|
|
6507
6512
|
}
|
|
@@ -6541,13 +6546,13 @@ class WebRTCClient extends Emitter {
|
|
|
6541
6546
|
}
|
|
6542
6547
|
|
|
6543
6548
|
toggleCameraOn(session ) {
|
|
6544
|
-
logger$
|
|
6549
|
+
logger$1.info('sdk webrtc toggle camera on', { id: session.id });
|
|
6545
6550
|
|
|
6546
6551
|
this._toggleVideo(session, false);
|
|
6547
6552
|
}
|
|
6548
6553
|
|
|
6549
6554
|
toggleCameraOff(session ) {
|
|
6550
|
-
logger$
|
|
6555
|
+
logger$1.info('sdk webrtc toggle camera off', { id: session.id });
|
|
6551
6556
|
|
|
6552
6557
|
this._toggleVideo(session, true);
|
|
6553
6558
|
}
|
|
@@ -6556,7 +6561,7 @@ class WebRTCClient extends Emitter {
|
|
|
6556
6561
|
const sessionId = this.getSipSessionId(session);
|
|
6557
6562
|
const hasVideo = hadVideo || this.hasLocalVideo(sessionId);
|
|
6558
6563
|
|
|
6559
|
-
logger$
|
|
6564
|
+
logger$1.info('sdk webrtc hold', {
|
|
6560
6565
|
sessionId,
|
|
6561
6566
|
keys: Object.keys(this.heldSessions),
|
|
6562
6567
|
pendingReinvite: !!session.pendingReinvite,
|
|
@@ -6605,7 +6610,7 @@ class WebRTCClient extends Emitter {
|
|
|
6605
6610
|
const sessionId = this.getSipSessionId(session);
|
|
6606
6611
|
const hasVideo = sessionId in this.heldSessions && this.heldSessions[sessionId].hasVideo;
|
|
6607
6612
|
|
|
6608
|
-
logger$
|
|
6613
|
+
logger$1.info('sdk webrtc unhold', {
|
|
6609
6614
|
sessionId,
|
|
6610
6615
|
keys: Object.keys(this.heldSessions),
|
|
6611
6616
|
pendingReinvite: !!session.pendingReinvite,
|
|
@@ -6753,7 +6758,7 @@ class WebRTCClient extends Emitter {
|
|
|
6753
6758
|
if (!session.sessionDescriptionHandler) {
|
|
6754
6759
|
return;
|
|
6755
6760
|
}
|
|
6756
|
-
logger$
|
|
6761
|
+
logger$1.info('Sending DTMF', {
|
|
6757
6762
|
id: this.getSipSessionId(session),
|
|
6758
6763
|
tone,
|
|
6759
6764
|
});
|
|
@@ -6769,7 +6774,7 @@ class WebRTCClient extends Emitter {
|
|
|
6769
6774
|
transfer(session , target ) {
|
|
6770
6775
|
this.hold(session);
|
|
6771
6776
|
|
|
6772
|
-
logger$
|
|
6777
|
+
logger$1.info('Transfering a session', {
|
|
6773
6778
|
id: this.getSipSessionId(session),
|
|
6774
6779
|
target,
|
|
6775
6780
|
});
|
|
@@ -6791,17 +6796,17 @@ class WebRTCClient extends Emitter {
|
|
|
6791
6796
|
atxfer(session ) {
|
|
6792
6797
|
this.hold(session);
|
|
6793
6798
|
|
|
6794
|
-
logger$
|
|
6799
|
+
logger$1.info('webrtc transfer started', { id: this.getSipSessionId(session) });
|
|
6795
6800
|
|
|
6796
6801
|
const result = {
|
|
6797
6802
|
newSession: null,
|
|
6798
6803
|
init: async (target ) => {
|
|
6799
|
-
logger$
|
|
6804
|
+
logger$1.info('webrtc transfer initialized', { id: this.getSipSessionId(session), target });
|
|
6800
6805
|
|
|
6801
6806
|
result.newSession = await this.call(target);
|
|
6802
6807
|
},
|
|
6803
6808
|
complete: () => {
|
|
6804
|
-
logger$
|
|
6809
|
+
logger$1.info('webrtc transfer completed', {
|
|
6805
6810
|
id: this.getSipSessionId(session),
|
|
6806
6811
|
referId: this.getSipSessionId(result.newSession),
|
|
6807
6812
|
});
|
|
@@ -6822,7 +6827,7 @@ class WebRTCClient extends Emitter {
|
|
|
6822
6827
|
return;
|
|
6823
6828
|
}
|
|
6824
6829
|
|
|
6825
|
-
logger$
|
|
6830
|
+
logger$1.info('send WebRTC message', { sipId: sipSession.id, contentType });
|
|
6826
6831
|
|
|
6827
6832
|
try {
|
|
6828
6833
|
sipSession.message({
|
|
@@ -6864,7 +6869,7 @@ class WebRTCClient extends Emitter {
|
|
|
6864
6869
|
}
|
|
6865
6870
|
|
|
6866
6871
|
changeAudioOutputVolume(volume ) {
|
|
6867
|
-
logger$
|
|
6872
|
+
logger$1.info('Changing audio output volume', { volume });
|
|
6868
6873
|
|
|
6869
6874
|
Object.values(this.audioElements).forEach(audioElement => {
|
|
6870
6875
|
if (audioElement instanceof HTMLAudioElement) {
|
|
@@ -6876,7 +6881,7 @@ class WebRTCClient extends Emitter {
|
|
|
6876
6881
|
}
|
|
6877
6882
|
|
|
6878
6883
|
changeAudioOutputDevice(id ) {
|
|
6879
|
-
logger$
|
|
6884
|
+
logger$1.info('Changing audio output device', { id });
|
|
6880
6885
|
|
|
6881
6886
|
Object.values(this.audioElements).forEach(audioElement => {
|
|
6882
6887
|
// `setSinkId` method is not included in any flow type definitions for HTMLAudioElements but is a valid method
|
|
@@ -6893,7 +6898,7 @@ class WebRTCClient extends Emitter {
|
|
|
6893
6898
|
|
|
6894
6899
|
changeAudioInputDevice(id , session ) {
|
|
6895
6900
|
const currentId = this.getAudioDeviceId();
|
|
6896
|
-
logger$
|
|
6901
|
+
logger$1.info('setting audio input device', { id, currentId, session: !!session });
|
|
6897
6902
|
|
|
6898
6903
|
if (id === currentId) {
|
|
6899
6904
|
return null;
|
|
@@ -6939,7 +6944,7 @@ class WebRTCClient extends Emitter {
|
|
|
6939
6944
|
|
|
6940
6945
|
setVideoInputDevice(id ) {
|
|
6941
6946
|
const currentId = this.getVideoDeviceId();
|
|
6942
|
-
logger$
|
|
6947
|
+
logger$1.info('setting video input device', { id, currentId });
|
|
6943
6948
|
|
|
6944
6949
|
if (id === currentId) {
|
|
6945
6950
|
return null;
|
|
@@ -6964,7 +6969,7 @@ class WebRTCClient extends Emitter {
|
|
|
6964
6969
|
const sessionId = this.getSipSessionId(session);
|
|
6965
6970
|
const localStream = this.getLocalStream(sessionId);
|
|
6966
6971
|
|
|
6967
|
-
logger$
|
|
6972
|
+
logger$1.info('changing video input device', { id, sessionId });
|
|
6968
6973
|
|
|
6969
6974
|
// Release old video stream
|
|
6970
6975
|
if (localStream) {
|
|
@@ -7032,7 +7037,7 @@ class WebRTCClient extends Emitter {
|
|
|
7032
7037
|
const shouldDoScreenSharing = newConstraints && newConstraints.screen;
|
|
7033
7038
|
const desktop = newConstraints && newConstraints.desktop;
|
|
7034
7039
|
|
|
7035
|
-
logger$
|
|
7040
|
+
logger$1.info('Sending reinvite', {
|
|
7036
7041
|
id: this.getSipSessionId(sipSession),
|
|
7037
7042
|
newConstraints,
|
|
7038
7043
|
conference,
|
|
@@ -7070,7 +7075,7 @@ class WebRTCClient extends Emitter {
|
|
|
7070
7075
|
sipSession.incomingInviteRequest.message.body = response.message.body;
|
|
7071
7076
|
}
|
|
7072
7077
|
|
|
7073
|
-
logger$
|
|
7078
|
+
logger$1.info('on re-INVITE accepted', {
|
|
7074
7079
|
id: this.getSipSessionId(sipSession),
|
|
7075
7080
|
wasMuted,
|
|
7076
7081
|
shouldDoScreenSharing,
|
|
@@ -7245,7 +7250,7 @@ class WebRTCClient extends Emitter {
|
|
|
7245
7250
|
}
|
|
7246
7251
|
|
|
7247
7252
|
startHeartbeat() {
|
|
7248
|
-
logger$
|
|
7253
|
+
logger$1.info('sdk webrtc start heartbeat', { userAgent: !!this.userAgent });
|
|
7249
7254
|
if (!this.userAgent) {
|
|
7250
7255
|
this.heartbeat.stop();
|
|
7251
7256
|
return;
|
|
@@ -7258,7 +7263,7 @@ class WebRTCClient extends Emitter {
|
|
|
7258
7263
|
}
|
|
7259
7264
|
|
|
7260
7265
|
stopHeartbeat() {
|
|
7261
|
-
logger$
|
|
7266
|
+
logger$1.info('sdk webrtc stop heartbeat');
|
|
7262
7267
|
this.heartbeat.stop();
|
|
7263
7268
|
}
|
|
7264
7269
|
|
|
@@ -7279,7 +7284,7 @@ class WebRTCClient extends Emitter {
|
|
|
7279
7284
|
}
|
|
7280
7285
|
|
|
7281
7286
|
attemptReconnection() {
|
|
7282
|
-
logger$
|
|
7287
|
+
logger$1.info('attempt reconnection', { userAgent: !!this.userAgent });
|
|
7283
7288
|
if (!this.userAgent) {
|
|
7284
7289
|
return;
|
|
7285
7290
|
}
|
|
@@ -7304,7 +7309,7 @@ class WebRTCClient extends Emitter {
|
|
|
7304
7309
|
return;
|
|
7305
7310
|
}
|
|
7306
7311
|
|
|
7307
|
-
logger$
|
|
7312
|
+
logger$1.info('setting local media stream', {
|
|
7308
7313
|
sipSessionId,
|
|
7309
7314
|
tracks: newStream ? newStream.getTracks() : null,
|
|
7310
7315
|
});
|
|
@@ -7321,7 +7326,7 @@ class WebRTCClient extends Emitter {
|
|
|
7321
7326
|
|
|
7322
7327
|
const oldStream = this.getLocalStream(sipSessionId);
|
|
7323
7328
|
|
|
7324
|
-
logger$
|
|
7329
|
+
logger$1.info('updating local stream', {
|
|
7325
7330
|
sipSessionId,
|
|
7326
7331
|
oldStream: !!oldStream,
|
|
7327
7332
|
tracks: newStream.getTracks(),
|
|
@@ -7341,7 +7346,7 @@ class WebRTCClient extends Emitter {
|
|
|
7341
7346
|
const remoteStream = this.getRemoteStream(sessionId);
|
|
7342
7347
|
const pc = this.getPeerConnection(sessionId);
|
|
7343
7348
|
|
|
7344
|
-
logger$
|
|
7349
|
+
logger$1.info('Updating remote stream', {
|
|
7345
7350
|
sessionId,
|
|
7346
7351
|
tracks: remoteStream ? remoteStream.getTracks() : null,
|
|
7347
7352
|
receiverTracks: pc && pc.getReceivers ? pc.getReceivers().map(receiver => receiver.track) : null,
|
|
@@ -7366,14 +7371,16 @@ class WebRTCClient extends Emitter {
|
|
|
7366
7371
|
const screenSharing = constraints && 'screen' in constraints ? constraints.screen : false;
|
|
7367
7372
|
const isDesktop = constraints && 'desktop' in constraints ? constraints.desktop : false;
|
|
7368
7373
|
const withAudio = constraints && 'audio' in constraints ? constraints.audio : true;
|
|
7374
|
+
const mandatoryVideo = constraints && typeof constraints.video === 'object' ? constraints.video.mandatory : {};
|
|
7369
7375
|
|
|
7370
|
-
logger$
|
|
7376
|
+
logger$1.info('Retrieving media a configuration', { enableVideo, screenSharing, isDesktop, withAudio, constraints });
|
|
7371
7377
|
|
|
7372
7378
|
return {
|
|
7373
7379
|
constraints: {
|
|
7374
7380
|
// Exact constraint are not supported with `getDisplayMedia` and we must have a video=false in desktop screenshare
|
|
7375
7381
|
audio: screenSharing ? !isDesktop : (withAudio ? this._getAudioConstraints() : false),
|
|
7376
|
-
video: screenSharing ? (isDesktop
|
|
7382
|
+
video: screenSharing ? (isDesktop
|
|
7383
|
+
? ({ mandatory: { chromeMediaSource: 'desktop', ...(mandatoryVideo || {}) } }) : { cursor: 'always' })
|
|
7377
7384
|
: this._getVideoConstraints(enableVideo),
|
|
7378
7385
|
screen: screenSharing,
|
|
7379
7386
|
desktop: isDesktop,
|
|
@@ -7416,7 +7423,7 @@ class WebRTCClient extends Emitter {
|
|
|
7416
7423
|
}
|
|
7417
7424
|
|
|
7418
7425
|
_onTransportError() {
|
|
7419
|
-
logger$
|
|
7426
|
+
logger$1.error('on transport error');
|
|
7420
7427
|
this.eventEmitter.emit(TRANSPORT_ERROR);
|
|
7421
7428
|
this.attemptReconnection();
|
|
7422
7429
|
}
|
|
@@ -7425,7 +7432,7 @@ class WebRTCClient extends Emitter {
|
|
|
7425
7432
|
const body = message && typeof message === 'object' ? message.data : message;
|
|
7426
7433
|
if (body && body.indexOf('200 OK') !== -1) {
|
|
7427
7434
|
if (this.hasHeartbeat()) {
|
|
7428
|
-
logger$
|
|
7435
|
+
logger$1.info('on heartbeat received from Asterisk', { hasHeartbeat: this.hasHeartbeat() });
|
|
7429
7436
|
|
|
7430
7437
|
this.heartbeat.onHeartbeat();
|
|
7431
7438
|
if (this.heartbeatCb) {
|
|
@@ -7436,7 +7443,7 @@ class WebRTCClient extends Emitter {
|
|
|
7436
7443
|
}
|
|
7437
7444
|
|
|
7438
7445
|
async _onHeartbeatTimeout() {
|
|
7439
|
-
logger$
|
|
7446
|
+
logger$1.info('sdk webrtc heartbeat timed out', { userAgent: !!this.userAgent, cb: !!this.heartbeatTimeoutCb });
|
|
7440
7447
|
|
|
7441
7448
|
if (this.heartbeatTimeoutCb) {
|
|
7442
7449
|
this.heartbeatTimeoutCb();
|
|
@@ -7448,7 +7455,7 @@ class WebRTCClient extends Emitter {
|
|
|
7448
7455
|
try {
|
|
7449
7456
|
await this.userAgent.transport.disconnect();
|
|
7450
7457
|
} catch (e) {
|
|
7451
|
-
logger$
|
|
7458
|
+
logger$1.error('Transport disconnection after heartbeat timeout, error', e);
|
|
7452
7459
|
}
|
|
7453
7460
|
}
|
|
7454
7461
|
|
|
@@ -7481,31 +7488,31 @@ class WebRTCClient extends Emitter {
|
|
|
7481
7488
|
}
|
|
7482
7489
|
|
|
7483
7490
|
_connectIfNeeded() {
|
|
7484
|
-
logger$
|
|
7491
|
+
logger$1.info('connect if needed, checking', { connected: this.isConnected() });
|
|
7485
7492
|
if (!this.userAgent) {
|
|
7486
|
-
logger$
|
|
7493
|
+
logger$1.info('need to recreate User Agent');
|
|
7487
7494
|
this.userAgent = this.createUserAgent(this.uaConfigOverrides);
|
|
7488
7495
|
}
|
|
7489
7496
|
|
|
7490
7497
|
if (this.isConnected()) {
|
|
7491
|
-
logger$
|
|
7498
|
+
logger$1.info('webrtc sdk, already connected');
|
|
7492
7499
|
return Promise.resolve();
|
|
7493
7500
|
}
|
|
7494
7501
|
|
|
7495
7502
|
if (this.isConnecting()) {
|
|
7496
|
-
logger$
|
|
7503
|
+
logger$1.info('webrtc sdk, already connecting...');
|
|
7497
7504
|
|
|
7498
7505
|
this.connectionPromise = this.userAgent.transport.connectPromise;
|
|
7499
7506
|
return this.connectionPromise;
|
|
7500
7507
|
}
|
|
7501
7508
|
|
|
7502
7509
|
if (this.connectionPromise) {
|
|
7503
|
-
logger$
|
|
7510
|
+
logger$1.info('webrtc sdk, connection promise connecting...');
|
|
7504
7511
|
// $FlowFixMe
|
|
7505
7512
|
return this.connectionPromise;
|
|
7506
7513
|
}
|
|
7507
7514
|
|
|
7508
|
-
logger$
|
|
7515
|
+
logger$1.info('WebRTC UA needs to connect');
|
|
7509
7516
|
|
|
7510
7517
|
// Force UA to reconnect
|
|
7511
7518
|
if (this.userAgent && this.userAgent.state !== UserAgentState.Stopped) {
|
|
@@ -7630,7 +7637,7 @@ class WebRTCClient extends Emitter {
|
|
|
7630
7637
|
|
|
7631
7638
|
sdh.peerConnectionDelegate = {
|
|
7632
7639
|
onicecandidateerror: (error ) => {
|
|
7633
|
-
logger$
|
|
7640
|
+
logger$1.error('on icecandidate error', {
|
|
7634
7641
|
address: error.address,
|
|
7635
7642
|
port: error.port,
|
|
7636
7643
|
errorCode: error.errorCode,
|
|
@@ -7659,7 +7666,7 @@ class WebRTCClient extends Emitter {
|
|
|
7659
7666
|
updatedNumber = session.assertedIdentity.uri.normal.user;
|
|
7660
7667
|
updatedCalleeName = session.assertedIdentity.displayName || updatedNumber;
|
|
7661
7668
|
}
|
|
7662
|
-
logger$
|
|
7669
|
+
logger$1.info('re-invite received', { updatedCalleeName, updatedNumber, hadRemoteVideo });
|
|
7663
7670
|
|
|
7664
7671
|
// Useful to know if it's a video upgrade or an unhold from a remote peer with a video stream
|
|
7665
7672
|
|
|
@@ -7680,7 +7687,7 @@ class WebRTCClient extends Emitter {
|
|
|
7680
7687
|
}
|
|
7681
7688
|
|
|
7682
7689
|
_onAccepted(session , sessionDialog , withEvent = true) {
|
|
7683
|
-
logger$
|
|
7690
|
+
logger$1.info('on call accepted', { id: session.id, remoteTag: session.remoteTag });
|
|
7684
7691
|
|
|
7685
7692
|
this.storeSipSession(session);
|
|
7686
7693
|
|
|
@@ -7692,7 +7699,7 @@ class WebRTCClient extends Emitter {
|
|
|
7692
7699
|
const onTrack = (event ) => {
|
|
7693
7700
|
const isAudioOnly = this._isAudioOnly(session);
|
|
7694
7701
|
const { kind, label, readyState, id, muted } = event.track;
|
|
7695
|
-
logger$
|
|
7702
|
+
logger$1.info('on track event', { isAudioOnly, kind, label, readyState, id, muted });
|
|
7696
7703
|
|
|
7697
7704
|
// Stop video track in audio only mode
|
|
7698
7705
|
if (isAudioOnly && kind === 'video') {
|
|
@@ -7708,12 +7715,14 @@ class WebRTCClient extends Emitter {
|
|
|
7708
7715
|
|
|
7709
7716
|
session.sessionDescriptionHandler.remoteMediaStream.onaddtrack = onTrack;
|
|
7710
7717
|
|
|
7711
|
-
|
|
7712
|
-
|
|
7713
|
-
|
|
7714
|
-
|
|
7715
|
-
|
|
7716
|
-
|
|
7718
|
+
if (pc) {
|
|
7719
|
+
pc.oniceconnectionstatechange = () => {
|
|
7720
|
+
logger$1.info('on ice connection state changed', { state: pc.iceConnectionState });
|
|
7721
|
+
if (pc.iceConnectionState === 'disconnected') {
|
|
7722
|
+
this.eventEmitter.emit(ON_DISCONNECTED);
|
|
7723
|
+
}
|
|
7724
|
+
};
|
|
7725
|
+
}
|
|
7717
7726
|
|
|
7718
7727
|
if (withEvent) {
|
|
7719
7728
|
this.eventEmitter.emit(ACCEPTED, session, sessionDialog);
|
|
@@ -7882,10 +7891,10 @@ class WebRTCClient extends Emitter {
|
|
|
7882
7891
|
|
|
7883
7892
|
_stopSendingStats(session ) {
|
|
7884
7893
|
const sessionId = this.getSipSessionId(session);
|
|
7885
|
-
logger$
|
|
7894
|
+
logger$1.trace('Check for stopping stats', { sessionId, ids: Object.keys(this.statsIntervals) });
|
|
7886
7895
|
|
|
7887
7896
|
if (sessionId in this.statsIntervals) {
|
|
7888
|
-
logger$
|
|
7897
|
+
logger$1.trace('Stop sending stats for call', { sessionId });
|
|
7889
7898
|
this.statsIntervals[sessionId]();
|
|
7890
7899
|
delete this.statsIntervals[sessionId];
|
|
7891
7900
|
}
|
|
@@ -7901,7 +7910,7 @@ class WebRTCClient extends Emitter {
|
|
|
7901
7910
|
try {
|
|
7902
7911
|
await this.userAgent.transport.disconnect();
|
|
7903
7912
|
} catch (e) {
|
|
7904
|
-
logger$
|
|
7913
|
+
logger$1.error('WebRTC transport disconnect, error', e);
|
|
7905
7914
|
}
|
|
7906
7915
|
}
|
|
7907
7916
|
}
|
|
@@ -7923,13 +7932,17 @@ class WebRTCClient extends Emitter {
|
|
|
7923
7932
|
const nbStats = this.sessionNetworkStats[sessionId].length;
|
|
7924
7933
|
const lastNetworkStats = this.sessionNetworkStats[sessionId][nbStats - 1];
|
|
7925
7934
|
const lastAudioSent = lastNetworkStats ? lastNetworkStats.audioBytesSent : 0;
|
|
7935
|
+
const lastAudioContentSent = lastNetworkStats ? lastNetworkStats.audioContentSent : 0;
|
|
7926
7936
|
const lastVideoSent = lastNetworkStats ? lastNetworkStats.videoBytesSent : 0;
|
|
7927
7937
|
const lastAudioReceived = lastNetworkStats ? lastNetworkStats.audioBytesReceived : 0;
|
|
7938
|
+
const lastAudioContentReceived = lastNetworkStats ? lastNetworkStats.audioContentReceived : 0;
|
|
7928
7939
|
const lastVideoReceived = lastNetworkStats ? lastNetworkStats.videoBytesReceived : 0;
|
|
7929
7940
|
const lastTransportSent = lastNetworkStats ? lastNetworkStats.transportSent : 0;
|
|
7930
7941
|
const lastTransportReceived = lastNetworkStats ? lastNetworkStats.transportReceived : 0;
|
|
7931
|
-
let audioBytesSent = 0;
|
|
7932
|
-
let audioBytesReceived = 0;
|
|
7942
|
+
let audioBytesSent = 0; // content + header
|
|
7943
|
+
let audioBytesReceived = 0; // content + header
|
|
7944
|
+
let audioContentSent = 0; // useful to detect blank call
|
|
7945
|
+
let audioContentReceived = 0;
|
|
7933
7946
|
let videoBytesSent = 0;
|
|
7934
7947
|
let videoBytesReceived = 0;
|
|
7935
7948
|
let transportSent = 0;
|
|
@@ -7939,6 +7952,7 @@ class WebRTCClient extends Emitter {
|
|
|
7939
7952
|
stats.forEach(report => {
|
|
7940
7953
|
if (report.type === 'outbound-rtp' && report.kind === 'audio') {
|
|
7941
7954
|
audioBytesSent += Number(report.bytesSent) + Number(report.headerBytesSent);
|
|
7955
|
+
audioContentSent += Number(report.bytesSent);
|
|
7942
7956
|
}
|
|
7943
7957
|
if (report.type === 'remote-outbound-rtp' && report.kind === 'audio') {
|
|
7944
7958
|
audioBytesSent += Number(report.bytesSent);
|
|
@@ -7950,6 +7964,7 @@ class WebRTCClient extends Emitter {
|
|
|
7950
7964
|
packetsLost += Number(report.packetsLost);
|
|
7951
7965
|
networkStats.packetsReceived = Number(report.packetsReceived);
|
|
7952
7966
|
audioBytesReceived += Number(report.bytesReceived) + Number(report.headerBytesReceived);
|
|
7967
|
+
audioContentReceived += Number(report.bytesReceived);
|
|
7953
7968
|
}
|
|
7954
7969
|
if (report.type === 'inbound-rtp' && report.kind === 'video') {
|
|
7955
7970
|
videoBytesReceived += Number(report.bytesReceived) + Number(report.headerBytesReceived);
|
|
@@ -7978,10 +7993,17 @@ class WebRTCClient extends Emitter {
|
|
|
7978
7993
|
});
|
|
7979
7994
|
|
|
7980
7995
|
networkStats.packetsLost = packetsLost;
|
|
7996
|
+
|
|
7981
7997
|
networkStats.totalAudioBytesSent = audioBytesSent;
|
|
7982
7998
|
networkStats.audioBytesSent = audioBytesSent - lastAudioSent;
|
|
7983
7999
|
networkStats.totalAudioBytesReceived = audioBytesReceived - lastAudioReceived;
|
|
7984
8000
|
networkStats.audioBytesReceived = audioBytesReceived;
|
|
8001
|
+
|
|
8002
|
+
networkStats.totalAudioContentSent = audioContentSent;
|
|
8003
|
+
networkStats.audioContentSent = audioContentSent - lastAudioContentSent;
|
|
8004
|
+
networkStats.totalAudioBytesReceived = audioContentReceived - lastAudioContentReceived;
|
|
8005
|
+
networkStats.audioContentReceived = audioContentReceived;
|
|
8006
|
+
|
|
7985
8007
|
networkStats.totalVideoBytesSent = videoBytesSent;
|
|
7986
8008
|
networkStats.videoBytesSent = videoBytesSent - lastVideoSent;
|
|
7987
8009
|
networkStats.totalVideoBytesReceived = videoBytesReceived;
|
|
@@ -8084,7 +8106,7 @@ var webrtc = {
|
|
|
8084
8106
|
}),
|
|
8085
8107
|
};
|
|
8086
8108
|
|
|
8087
|
-
const parseCandidate
|
|
8109
|
+
const parseCandidate = line => {
|
|
8088
8110
|
let parts;
|
|
8089
8111
|
// Parse both variants.
|
|
8090
8112
|
if (line.indexOf('a=candidate:') === 0) {
|
|
@@ -8175,7 +8197,7 @@ var SymmetricNat = {
|
|
|
8175
8197
|
}
|
|
8176
8198
|
|
|
8177
8199
|
if (e.candidate && e.candidate.candidate.indexOf('srflx') !== -1) {
|
|
8178
|
-
const cand = parseCandidate
|
|
8200
|
+
const cand = parseCandidate(e.candidate.candidate);
|
|
8179
8201
|
if (!candidates[cand.relatedPort]) candidates[cand.relatedPort] = [];
|
|
8180
8202
|
candidates[cand.relatedPort].push(cand.port);
|
|
8181
8203
|
} else if (!e.candidate) {
|
|
@@ -8243,7 +8265,7 @@ var iceIpv4 = {
|
|
|
8243
8265
|
const rawCandidate = e.candidate.candidate;
|
|
8244
8266
|
if (rawCandidate.indexOf('srflx') !== -1 || rawCandidate.indexOf('relay') !== -1) {
|
|
8245
8267
|
hasSrflxOrRelay = true;
|
|
8246
|
-
const candidate = parseCandidate
|
|
8268
|
+
const candidate = parseCandidate(e.candidate.candidate);
|
|
8247
8269
|
ips.push(candidate.ip);
|
|
8248
8270
|
}
|
|
8249
8271
|
} else if (!e.candidate) {
|
|
@@ -8280,7 +8302,7 @@ var checks = [
|
|
|
8280
8302
|
|
|
8281
8303
|
//
|
|
8282
8304
|
|
|
8283
|
-
const logger
|
|
8305
|
+
const logger = IssueReporter$1.loggerFor('engine-check');
|
|
8284
8306
|
|
|
8285
8307
|
class Checker {
|
|
8286
8308
|
|
|
@@ -8298,28 +8320,28 @@ class Checker {
|
|
|
8298
8320
|
async check(onCheckBegin = () => {}, onCheckResult = () => {}) {
|
|
8299
8321
|
await this._addEngineVersion();
|
|
8300
8322
|
|
|
8301
|
-
logger
|
|
8323
|
+
logger.info('Engine check starting');
|
|
8302
8324
|
|
|
8303
8325
|
for (let i = 0; i < this.checks.length; i++) {
|
|
8304
8326
|
const { name, check } = this.checks[i];
|
|
8305
8327
|
|
|
8306
|
-
logger
|
|
8328
|
+
logger.info(`Checking ${name} ...`);
|
|
8307
8329
|
|
|
8308
8330
|
onCheckBegin(name);
|
|
8309
8331
|
try {
|
|
8310
8332
|
// eslint-disable-next-line no-await-in-loop
|
|
8311
8333
|
const result = await check(this.server, this.session, this.externalAppConfig);
|
|
8312
|
-
logger
|
|
8334
|
+
logger.info(`Checking ${name} success.`, { result });
|
|
8313
8335
|
|
|
8314
8336
|
onCheckResult(name, result);
|
|
8315
8337
|
} catch (e) {
|
|
8316
|
-
logger
|
|
8338
|
+
logger.info(`Checking ${name} failure`, { message: e.message });
|
|
8317
8339
|
|
|
8318
8340
|
onCheckResult(name, e);
|
|
8319
8341
|
}
|
|
8320
8342
|
}
|
|
8321
8343
|
|
|
8322
|
-
logger
|
|
8344
|
+
logger.info('Engine check done.');
|
|
8323
8345
|
}
|
|
8324
8346
|
|
|
8325
8347
|
addCheck(check ) {
|