@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
|
@@ -100,11 +100,11 @@ const isMobile = () => typeof navigator !== 'undefined' && navigator.product ===
|
|
|
100
100
|
|
|
101
101
|
const methods = ['head', 'get', 'post', 'put', 'delete'];
|
|
102
102
|
|
|
103
|
-
const logger = IssueReporter$1 ? IssueReporter$1.loggerFor('api') : console;
|
|
103
|
+
const logger$2 = IssueReporter$1 ? IssueReporter$1.loggerFor('api') : console;
|
|
104
104
|
|
|
105
105
|
// Use a function here to be able to mock it in tests
|
|
106
106
|
const realFetch = () => {
|
|
107
|
-
if (typeof document !== 'undefined') {
|
|
107
|
+
if (typeof document !== 'undefined' && window.fetch) {
|
|
108
108
|
// Browser
|
|
109
109
|
return window.fetch;
|
|
110
110
|
}
|
|
@@ -239,7 +239,7 @@ class ApiRequester {
|
|
|
239
239
|
};
|
|
240
240
|
|
|
241
241
|
if (this.refreshTokenPromise) {
|
|
242
|
-
logger.info('A token is already refreshing, waiting ...', { url });
|
|
242
|
+
logger$2.info('A token is already refreshing, waiting ...', { url });
|
|
243
243
|
await this.refreshTokenPromise;
|
|
244
244
|
}
|
|
245
245
|
|
|
@@ -259,7 +259,7 @@ class ApiRequester {
|
|
|
259
259
|
return promise.then(async (err ) => {
|
|
260
260
|
// Check if the token is still valid
|
|
261
261
|
if (firstCall && this._checkTokenExpired(response, err)) {
|
|
262
|
-
logger.warn('token expired', { error: err.reason });
|
|
262
|
+
logger$2.warn('token expired', { error: err.reason });
|
|
263
263
|
// Replay the call after refreshing the token
|
|
264
264
|
return this._replayWithNewToken(err, path, method, body, headers, parse);
|
|
265
265
|
}
|
|
@@ -269,7 +269,7 @@ class ApiRequester {
|
|
|
269
269
|
: exceptionClass.fromResponse(err, response.status);
|
|
270
270
|
|
|
271
271
|
if (this.shouldLogErrors) {
|
|
272
|
-
logger.error('API error', error);
|
|
272
|
+
logger$2.error('API error', error);
|
|
273
273
|
}
|
|
274
274
|
|
|
275
275
|
throw error;
|
|
@@ -279,7 +279,7 @@ class ApiRequester {
|
|
|
279
279
|
return newParse(response, isJson);
|
|
280
280
|
}).catch(error => {
|
|
281
281
|
if (this.shouldLogErrors) {
|
|
282
|
-
logger.error('Fetch failed', { url, options, message: error.message, stack: error.stack });
|
|
282
|
+
logger$2.error('Fetch failed', { url, options, message: error.message, stack: error.stack });
|
|
283
283
|
}
|
|
284
284
|
|
|
285
285
|
throw error;
|
|
@@ -307,13 +307,13 @@ class ApiRequester {
|
|
|
307
307
|
) {
|
|
308
308
|
const isTokenNotFound = this._isTokenNotFound(err);
|
|
309
309
|
let newPath = path;
|
|
310
|
-
logger.info('refreshing token', { inProgress: !!this.refreshTokenPromise });
|
|
310
|
+
logger$2.info('refreshing token', { inProgress: !!this.refreshTokenPromise });
|
|
311
311
|
|
|
312
312
|
this.refreshTokenPromise = this.refreshTokenPromise || this.refreshTokenCallback();
|
|
313
313
|
|
|
314
314
|
return this.refreshTokenPromise.then(() => {
|
|
315
315
|
this.refreshTokenPromise = null;
|
|
316
|
-
logger.info('token refreshed', { isTokenNotFound });
|
|
316
|
+
logger$2.info('token refreshed', { isTokenNotFound });
|
|
317
317
|
if (isTokenNotFound) {
|
|
318
318
|
const pathParts = path.split('/');
|
|
319
319
|
pathParts.pop();
|
|
@@ -823,11 +823,16 @@ class WazoSessionDescriptionHandler extends SessionDescriptionHandler {
|
|
|
823
823
|
|
|
824
824
|
// $FlowFixMe
|
|
825
825
|
setRemoteSessionDescription(sessionDescription ) {
|
|
826
|
-
|
|
826
|
+
try {
|
|
827
|
+
const result = super.setRemoteSessionDescription(sessionDescription);
|
|
827
828
|
|
|
828
|
-
|
|
829
|
+
this.eventEmitter.emit('setDescription', sessionDescription);
|
|
829
830
|
|
|
830
|
-
|
|
831
|
+
return result;
|
|
832
|
+
} catch (error) {
|
|
833
|
+
this.logger.error('SessionDescriptionHandler.setRemoteSessionDescription error', error);
|
|
834
|
+
throw error;
|
|
835
|
+
}
|
|
831
836
|
}
|
|
832
837
|
|
|
833
838
|
// Overridden to avoid to fix ice-candidates missing in the SDP in react-native and chrome canary.
|
|
@@ -2447,7 +2452,7 @@ class Contact {
|
|
|
2447
2452
|
this[key] = old[key] || this[key];
|
|
2448
2453
|
});
|
|
2449
2454
|
|
|
2450
|
-
if (old.lineState
|
|
2455
|
+
if (old.lineState) {
|
|
2451
2456
|
this.lineState = old.lineState;
|
|
2452
2457
|
}
|
|
2453
2458
|
|
|
@@ -4138,7 +4143,7 @@ const TRANSFER_FLOW_BLIND = 'blind';
|
|
|
4138
4143
|
|
|
4139
4144
|
// const MINIMUM_WAZO_ENGINE_VERSION_FOR_CTI_HOLD = '20.11';
|
|
4140
4145
|
|
|
4141
|
-
|
|
4146
|
+
IssueReporter$1 ? IssueReporter$1.loggerFor('cti-phone') : console;
|
|
4142
4147
|
|
|
4143
4148
|
/* */
|
|
4144
4149
|
|
|
@@ -5057,7 +5062,7 @@ const AGENTD_VERSION = '1.0';
|
|
|
5057
5062
|
const WEBHOOKD_VERSION = '1.0';
|
|
5058
5063
|
const AMID_VERSION = '1.0';
|
|
5059
5064
|
|
|
5060
|
-
const logger$
|
|
5065
|
+
const logger$1 = IssueReporter$1 ? IssueReporter$1.loggerFor('api') : console;
|
|
5061
5066
|
|
|
5062
5067
|
class ApiClient {
|
|
5063
5068
|
|
|
@@ -5109,12 +5114,12 @@ class ApiClient {
|
|
|
5109
5114
|
}
|
|
5110
5115
|
|
|
5111
5116
|
async forceRefreshToken() {
|
|
5112
|
-
logger$
|
|
5117
|
+
logger$1.info('forcing refresh token, calling callback');
|
|
5113
5118
|
return this.refreshTokenCallback();
|
|
5114
5119
|
}
|
|
5115
5120
|
|
|
5116
5121
|
async refreshTokenCallback() {
|
|
5117
|
-
logger$
|
|
5122
|
+
logger$1.info('refresh token callback called', {
|
|
5118
5123
|
refreshToken: this.refreshToken,
|
|
5119
5124
|
refreshBackend: this.refreshBackend,
|
|
5120
5125
|
refreshExpiration: this.refreshExpiration,
|
|
@@ -5132,7 +5137,7 @@ class ApiClient {
|
|
|
5132
5137
|
this.isMobile,
|
|
5133
5138
|
);
|
|
5134
5139
|
|
|
5135
|
-
logger$
|
|
5140
|
+
logger$1.info('token refreshed', { token: session.token });
|
|
5136
5141
|
|
|
5137
5142
|
if (this.onRefreshToken) {
|
|
5138
5143
|
this.onRefreshToken(session.token, session);
|
|
@@ -5305,7 +5310,7 @@ const DEFAULT_ICE_TIMEOUT = 3000;
|
|
|
5305
5310
|
const SEND_STATS_DELAY = 5000;
|
|
5306
5311
|
|
|
5307
5312
|
const states = ['STATUS_NULL', 'STATUS_NEW', 'STATUS_CONNECTING', 'STATUS_CONNECTED', 'STATUS_COMPLETED'];
|
|
5308
|
-
const logger
|
|
5313
|
+
const logger = IssueReporter$1 ? IssueReporter$1.loggerFor('webrtc-client') : console;
|
|
5309
5314
|
const statsLogger = IssueReporter$1 ? IssueReporter$1.loggerFor('webrtc-stats') : console;
|
|
5310
5315
|
|
|
5311
5316
|
// events
|
|
@@ -5481,13 +5486,13 @@ class WebRTCClient extends Emitter {
|
|
|
5481
5486
|
|
|
5482
5487
|
createUserAgent(configOverrides ) {
|
|
5483
5488
|
const webRTCConfiguration = this._createWebRTCConfiguration(configOverrides);
|
|
5484
|
-
logger
|
|
5489
|
+
logger.info('sdk webrtc, creating UA', { webRTCConfiguration });
|
|
5485
5490
|
|
|
5486
5491
|
webRTCConfiguration.delegate = {
|
|
5487
5492
|
onConnect: this.onConnect.bind(this),
|
|
5488
5493
|
onDisconnect: this.onDisconnect.bind(this),
|
|
5489
5494
|
onInvite: (invitation ) => {
|
|
5490
|
-
logger
|
|
5495
|
+
logger.info('sdk webrtc on invite', {
|
|
5491
5496
|
method: 'delegate.onInvite',
|
|
5492
5497
|
id: invitation.id,
|
|
5493
5498
|
remoteURI: invitation.remoteURI,
|
|
@@ -5530,7 +5535,7 @@ class WebRTCClient extends Emitter {
|
|
|
5530
5535
|
}
|
|
5531
5536
|
|
|
5532
5537
|
onConnect() {
|
|
5533
|
-
logger
|
|
5538
|
+
logger.info('sdk webrtc connected', { method: 'delegate.onConnect' });
|
|
5534
5539
|
this.eventEmitter.emit(CONNECTED);
|
|
5535
5540
|
if (!this.isRegistered() && this.registerer && this.registerer.waiting) {
|
|
5536
5541
|
this.registerer.waitingToggle(false);
|
|
@@ -5539,7 +5544,7 @@ class WebRTCClient extends Emitter {
|
|
|
5539
5544
|
}
|
|
5540
5545
|
|
|
5541
5546
|
async onDisconnect(error ) {
|
|
5542
|
-
logger
|
|
5547
|
+
logger.info('sdk webrtc disconnected', { method: 'delegate.onConnect', error });
|
|
5543
5548
|
this.connectionPromise = null;
|
|
5544
5549
|
// The UA will attempt to reconnect automatically when an error occurred
|
|
5545
5550
|
this.eventEmitter.emit(DISCONNECTED, error);
|
|
@@ -5564,37 +5569,37 @@ class WebRTCClient extends Emitter {
|
|
|
5564
5569
|
};
|
|
5565
5570
|
|
|
5566
5571
|
if (this.skipRegister) {
|
|
5567
|
-
logger
|
|
5572
|
+
logger.info('sdk webrtc skip register...', logInfo);
|
|
5568
5573
|
return Promise.resolve();
|
|
5569
5574
|
}
|
|
5570
5575
|
|
|
5571
|
-
logger
|
|
5576
|
+
logger.info('sdk webrtc registering...', logInfo);
|
|
5572
5577
|
|
|
5573
5578
|
if (!this.userAgent) {
|
|
5574
|
-
logger
|
|
5579
|
+
logger.info('sdk webrtc recreating User Agent');
|
|
5575
5580
|
this.userAgent = this.createUserAgent(this.uaConfigOverrides);
|
|
5576
5581
|
}
|
|
5577
5582
|
if (!this.userAgent || this.isRegistered()) {
|
|
5578
|
-
logger
|
|
5583
|
+
logger.info('sdk webrtc registering aborted, already registered or no UA can be created');
|
|
5579
5584
|
return Promise.resolve();
|
|
5580
5585
|
}
|
|
5581
5586
|
|
|
5582
5587
|
if (this.connectionPromise || (this.registerer && this.registerer.waiting)) {
|
|
5583
|
-
logger
|
|
5588
|
+
logger.info('sdk webrtc registering aborted due to a registration in progress.');
|
|
5584
5589
|
return Promise.resolve();
|
|
5585
5590
|
}
|
|
5586
5591
|
|
|
5587
5592
|
const registerOptions = this._isWeb() ? {} : { extraContactHeaderParams: ['mobility=mobile'] };
|
|
5588
5593
|
|
|
5589
5594
|
const onRegisterFailed = () => {
|
|
5590
|
-
logger
|
|
5595
|
+
logger.info('sdk webrtc registering failed', { tries, registerer: !!this.registerer });
|
|
5591
5596
|
this.connectionPromise = null;
|
|
5592
5597
|
if (this.registerer && this.registerer.waiting) {
|
|
5593
5598
|
this.registerer.waitingToggle(false);
|
|
5594
5599
|
}
|
|
5595
5600
|
|
|
5596
5601
|
if (tries <= MAX_REGISTER_TRIES) {
|
|
5597
|
-
logger
|
|
5602
|
+
logger.info('sdk webrtc registering, retrying...', { tries });
|
|
5598
5603
|
setTimeout(() => this.register(tries + 1), 300);
|
|
5599
5604
|
}
|
|
5600
5605
|
};
|
|
@@ -5603,18 +5608,18 @@ class WebRTCClient extends Emitter {
|
|
|
5603
5608
|
// Avoid race condition with the close method called just before register and setting userAgent to null
|
|
5604
5609
|
// during the resolution of the primise.
|
|
5605
5610
|
if (!this.userAgent) {
|
|
5606
|
-
logger
|
|
5611
|
+
logger.info('sdk webrtc recreating User Agent after connection');
|
|
5607
5612
|
this.userAgent = this.createUserAgent(this.uaConfigOverrides);
|
|
5608
5613
|
}
|
|
5609
5614
|
|
|
5610
|
-
logger
|
|
5615
|
+
logger.info('sdk webrtc registering, transport connected', { registerOptions, ua: !!this.userAgent });
|
|
5611
5616
|
this.registerer = new Registerer(this.userAgent, registerOptions);
|
|
5612
5617
|
this.connectionPromise = null;
|
|
5613
5618
|
this._monkeyPatchRegisterer(this.registerer);
|
|
5614
5619
|
|
|
5615
5620
|
// Bind registerer events
|
|
5616
5621
|
this.registerer.stateChange.addListener(newState => {
|
|
5617
|
-
logger
|
|
5622
|
+
logger.info('sdk webrtc registering, state changed', { newState });
|
|
5618
5623
|
|
|
5619
5624
|
if (newState === RegistererState.Registered && this.registerer
|
|
5620
5625
|
&& this.registerer.state === RegistererState.Registered) {
|
|
@@ -5627,7 +5632,7 @@ class WebRTCClient extends Emitter {
|
|
|
5627
5632
|
const options = {
|
|
5628
5633
|
requestDelegate: {
|
|
5629
5634
|
onReject: response => {
|
|
5630
|
-
logger
|
|
5635
|
+
logger.error('sdk webrtc registering, rejected', { response });
|
|
5631
5636
|
|
|
5632
5637
|
onRegisterFailed();
|
|
5633
5638
|
},
|
|
@@ -5635,13 +5640,13 @@ class WebRTCClient extends Emitter {
|
|
|
5635
5640
|
};
|
|
5636
5641
|
|
|
5637
5642
|
return this.registerer.register(options).catch((e) => {
|
|
5638
|
-
logger
|
|
5643
|
+
logger.error('sdk webrtc registering, error', e);
|
|
5639
5644
|
|
|
5640
5645
|
this.eventEmitter.emit(REGISTRATION_FAILED);
|
|
5641
5646
|
return e;
|
|
5642
5647
|
});
|
|
5643
5648
|
}).catch(error => {
|
|
5644
|
-
logger
|
|
5649
|
+
logger.error('sdk webrtc registering, transport error', error);
|
|
5645
5650
|
onRegisterFailed();
|
|
5646
5651
|
});
|
|
5647
5652
|
}
|
|
@@ -5670,21 +5675,21 @@ class WebRTCClient extends Emitter {
|
|
|
5670
5675
|
}
|
|
5671
5676
|
|
|
5672
5677
|
unregister() {
|
|
5673
|
-
logger
|
|
5678
|
+
logger.info('sdk webrtc unregistering..', { userAgent: !!this.userAgent, registerer: !!this.registerer });
|
|
5674
5679
|
if (!this.registerer) {
|
|
5675
5680
|
return Promise.resolve();
|
|
5676
5681
|
}
|
|
5677
5682
|
|
|
5678
5683
|
try {
|
|
5679
5684
|
return this.registerer.unregister().then(() => {
|
|
5680
|
-
logger
|
|
5685
|
+
logger.info('sdk webrtc unregistered');
|
|
5681
5686
|
this._cleanupRegister();
|
|
5682
5687
|
}).catch(e => {
|
|
5683
|
-
logger
|
|
5688
|
+
logger.error('sdk webrtc unregistering, promise error', e);
|
|
5684
5689
|
this._cleanupRegister();
|
|
5685
5690
|
});
|
|
5686
5691
|
} catch (e) {
|
|
5687
|
-
logger
|
|
5692
|
+
logger.error('sdk webrtc unregistering, error', e);
|
|
5688
5693
|
// Avoid issue with `undefined is not an object (evaluating 'new.target.prototype')` when triggering a new
|
|
5689
5694
|
// error when the registerer is in a bad state
|
|
5690
5695
|
this._cleanupRegister();
|
|
@@ -5692,7 +5697,7 @@ class WebRTCClient extends Emitter {
|
|
|
5692
5697
|
}
|
|
5693
5698
|
|
|
5694
5699
|
stop() {
|
|
5695
|
-
logger
|
|
5700
|
+
logger.info('sdk webrtc stop', { userAgent: !!this.userAgent });
|
|
5696
5701
|
if (!this.userAgent) {
|
|
5697
5702
|
return Promise.resolve();
|
|
5698
5703
|
}
|
|
@@ -5700,12 +5705,12 @@ class WebRTCClient extends Emitter {
|
|
|
5700
5705
|
return this.userAgent.stop().then(() => {
|
|
5701
5706
|
return this._cleanupRegister();
|
|
5702
5707
|
}).catch(e => {
|
|
5703
|
-
logger
|
|
5708
|
+
logger.warn('sdk webrtc stop, error', { message: e.message, stack: e.stack });
|
|
5704
5709
|
});
|
|
5705
5710
|
}
|
|
5706
5711
|
|
|
5707
5712
|
call(number , enableVideo , audioOnly = false, conference = false) {
|
|
5708
|
-
logger
|
|
5713
|
+
logger.info('sdk webrtc creating call', { number, enableVideo, audioOnly, conference });
|
|
5709
5714
|
const inviterOptions = {
|
|
5710
5715
|
sessionDescriptionHandlerOptionsReInvite: {
|
|
5711
5716
|
conference,
|
|
@@ -5736,7 +5741,7 @@ class WebRTCClient extends Emitter {
|
|
|
5736
5741
|
this._onAccepted(session, response.session, true);
|
|
5737
5742
|
},
|
|
5738
5743
|
onReject: (response ) => {
|
|
5739
|
-
logger
|
|
5744
|
+
logger.info('on call rejected', { id: session.id, fromTag: session.fromTag });
|
|
5740
5745
|
this._stopSendingStats(session);
|
|
5741
5746
|
this.stopNetworkMonitoring(session);
|
|
5742
5747
|
|
|
@@ -5759,11 +5764,11 @@ class WebRTCClient extends Emitter {
|
|
|
5759
5764
|
}
|
|
5760
5765
|
|
|
5761
5766
|
answer(session , enableVideo ) {
|
|
5762
|
-
logger
|
|
5767
|
+
logger.info('sdk webrtc answer call', { id: session.id, enableVideo });
|
|
5763
5768
|
|
|
5764
5769
|
if (!session || !session.accept) {
|
|
5765
5770
|
const error = 'No session to answer, or not an invitation';
|
|
5766
|
-
logger
|
|
5771
|
+
logger.warn(error);
|
|
5767
5772
|
return Promise.reject(new Error(error));
|
|
5768
5773
|
}
|
|
5769
5774
|
const options = {
|
|
@@ -5773,15 +5778,15 @@ class WebRTCClient extends Emitter {
|
|
|
5773
5778
|
return session.accept(options).then(() => {
|
|
5774
5779
|
if (session.isCanceled) {
|
|
5775
5780
|
const message = 'accepted a canceled session (or was canceled during the accept phase).';
|
|
5776
|
-
logger
|
|
5781
|
+
logger.error(message, { id: session.id });
|
|
5777
5782
|
this.onCallEnded(session);
|
|
5778
5783
|
|
|
5779
5784
|
throw new CanceledCallError(message);
|
|
5780
5785
|
}
|
|
5781
|
-
logger
|
|
5786
|
+
logger.info('sdk webrtc answer, accepted.');
|
|
5782
5787
|
this._onAccepted(session);
|
|
5783
5788
|
}).catch(e => {
|
|
5784
|
-
logger
|
|
5789
|
+
logger.error(`answer call error for ${session ? session.id : 'n/a'}`, e);
|
|
5785
5790
|
|
|
5786
5791
|
throw e;
|
|
5787
5792
|
});
|
|
@@ -5789,7 +5794,7 @@ class WebRTCClient extends Emitter {
|
|
|
5789
5794
|
|
|
5790
5795
|
hangup(session ) {
|
|
5791
5796
|
const { state, id } = session;
|
|
5792
|
-
logger
|
|
5797
|
+
logger.info('sdk webrtc hangup call', { id, state });
|
|
5793
5798
|
|
|
5794
5799
|
try {
|
|
5795
5800
|
this._stopSendingStats(session);
|
|
@@ -5818,7 +5823,7 @@ class WebRTCClient extends Emitter {
|
|
|
5818
5823
|
|
|
5819
5824
|
return bye();
|
|
5820
5825
|
} catch (error) {
|
|
5821
|
-
logger
|
|
5826
|
+
logger.warn('sdk webrtc hangup, error', error);
|
|
5822
5827
|
}
|
|
5823
5828
|
|
|
5824
5829
|
return null;
|
|
@@ -5836,7 +5841,7 @@ class WebRTCClient extends Emitter {
|
|
|
5836
5841
|
// Fetch and emit an event at `interval` with session network stats
|
|
5837
5842
|
startNetworkMonitoring(session , interval = 1000) {
|
|
5838
5843
|
const sessionId = this.getSipSessionId(session);
|
|
5839
|
-
logger
|
|
5844
|
+
logger.info('starting network inspection', { id: sessionId });
|
|
5840
5845
|
|
|
5841
5846
|
this.sessionNetworkStats[sessionId] = [];
|
|
5842
5847
|
|
|
@@ -5846,7 +5851,7 @@ class WebRTCClient extends Emitter {
|
|
|
5846
5851
|
stopNetworkMonitoring(session ) {
|
|
5847
5852
|
const sessionId = this.getSipSessionId(session);
|
|
5848
5853
|
const exists = sessionId in this.networkMonitoringInterval;
|
|
5849
|
-
logger
|
|
5854
|
+
logger.info('stopping network inspection', { id: sessionId, exists });
|
|
5850
5855
|
|
|
5851
5856
|
if (exists) {
|
|
5852
5857
|
clearInterval(this.networkMonitoringInterval[sessionId]);
|
|
@@ -5856,17 +5861,17 @@ class WebRTCClient extends Emitter {
|
|
|
5856
5861
|
}
|
|
5857
5862
|
|
|
5858
5863
|
reject(session ) {
|
|
5859
|
-
logger
|
|
5864
|
+
logger.info('sdk webrtc reject call', { id: session.id });
|
|
5860
5865
|
|
|
5861
5866
|
try {
|
|
5862
5867
|
return session.reject ? session.reject() : session.cancel();
|
|
5863
5868
|
} catch (e) {
|
|
5864
|
-
logger
|
|
5869
|
+
logger.warn('Error when rejecting call', e.message, e.stack);
|
|
5865
5870
|
}
|
|
5866
5871
|
}
|
|
5867
5872
|
|
|
5868
5873
|
async close() {
|
|
5869
|
-
logger
|
|
5874
|
+
logger.info('sdk webrtc closing client', { userAgent: !!this.userAgent });
|
|
5870
5875
|
this._cleanupMedia();
|
|
5871
5876
|
this.connectionPromise = null;
|
|
5872
5877
|
|
|
@@ -5897,7 +5902,7 @@ class WebRTCClient extends Emitter {
|
|
|
5897
5902
|
// eg: "INVITE not rejectable in state Completed"
|
|
5898
5903
|
}
|
|
5899
5904
|
this.userAgent = null;
|
|
5900
|
-
logger
|
|
5905
|
+
logger.info('sdk webrtc client closed');
|
|
5901
5906
|
}
|
|
5902
5907
|
|
|
5903
5908
|
getNumber(session ) {
|
|
@@ -5910,13 +5915,13 @@ class WebRTCClient extends Emitter {
|
|
|
5910
5915
|
}
|
|
5911
5916
|
|
|
5912
5917
|
mute(session ) {
|
|
5913
|
-
logger
|
|
5918
|
+
logger.info('sdk webrtc mute', { id: session.id });
|
|
5914
5919
|
|
|
5915
5920
|
this._toggleAudio(session, true);
|
|
5916
5921
|
}
|
|
5917
5922
|
|
|
5918
5923
|
unmute(session ) {
|
|
5919
|
-
logger
|
|
5924
|
+
logger.info('sdk webrtc unmute', { id: session.id });
|
|
5920
5925
|
|
|
5921
5926
|
this._toggleAudio(session, false);
|
|
5922
5927
|
}
|
|
@@ -5956,13 +5961,13 @@ class WebRTCClient extends Emitter {
|
|
|
5956
5961
|
}
|
|
5957
5962
|
|
|
5958
5963
|
toggleCameraOn(session ) {
|
|
5959
|
-
logger
|
|
5964
|
+
logger.info('sdk webrtc toggle camera on', { id: session.id });
|
|
5960
5965
|
|
|
5961
5966
|
this._toggleVideo(session, false);
|
|
5962
5967
|
}
|
|
5963
5968
|
|
|
5964
5969
|
toggleCameraOff(session ) {
|
|
5965
|
-
logger
|
|
5970
|
+
logger.info('sdk webrtc toggle camera off', { id: session.id });
|
|
5966
5971
|
|
|
5967
5972
|
this._toggleVideo(session, true);
|
|
5968
5973
|
}
|
|
@@ -5971,7 +5976,7 @@ class WebRTCClient extends Emitter {
|
|
|
5971
5976
|
const sessionId = this.getSipSessionId(session);
|
|
5972
5977
|
const hasVideo = hadVideo || this.hasLocalVideo(sessionId);
|
|
5973
5978
|
|
|
5974
|
-
logger
|
|
5979
|
+
logger.info('sdk webrtc hold', {
|
|
5975
5980
|
sessionId,
|
|
5976
5981
|
keys: Object.keys(this.heldSessions),
|
|
5977
5982
|
pendingReinvite: !!session.pendingReinvite,
|
|
@@ -6020,7 +6025,7 @@ class WebRTCClient extends Emitter {
|
|
|
6020
6025
|
const sessionId = this.getSipSessionId(session);
|
|
6021
6026
|
const hasVideo = sessionId in this.heldSessions && this.heldSessions[sessionId].hasVideo;
|
|
6022
6027
|
|
|
6023
|
-
logger
|
|
6028
|
+
logger.info('sdk webrtc unhold', {
|
|
6024
6029
|
sessionId,
|
|
6025
6030
|
keys: Object.keys(this.heldSessions),
|
|
6026
6031
|
pendingReinvite: !!session.pendingReinvite,
|
|
@@ -6168,7 +6173,7 @@ class WebRTCClient extends Emitter {
|
|
|
6168
6173
|
if (!session.sessionDescriptionHandler) {
|
|
6169
6174
|
return;
|
|
6170
6175
|
}
|
|
6171
|
-
logger
|
|
6176
|
+
logger.info('Sending DTMF', {
|
|
6172
6177
|
id: this.getSipSessionId(session),
|
|
6173
6178
|
tone,
|
|
6174
6179
|
});
|
|
@@ -6184,7 +6189,7 @@ class WebRTCClient extends Emitter {
|
|
|
6184
6189
|
transfer(session , target ) {
|
|
6185
6190
|
this.hold(session);
|
|
6186
6191
|
|
|
6187
|
-
logger
|
|
6192
|
+
logger.info('Transfering a session', {
|
|
6188
6193
|
id: this.getSipSessionId(session),
|
|
6189
6194
|
target,
|
|
6190
6195
|
});
|
|
@@ -6206,17 +6211,17 @@ class WebRTCClient extends Emitter {
|
|
|
6206
6211
|
atxfer(session ) {
|
|
6207
6212
|
this.hold(session);
|
|
6208
6213
|
|
|
6209
|
-
logger
|
|
6214
|
+
logger.info('webrtc transfer started', { id: this.getSipSessionId(session) });
|
|
6210
6215
|
|
|
6211
6216
|
const result = {
|
|
6212
6217
|
newSession: null,
|
|
6213
6218
|
init: async (target ) => {
|
|
6214
|
-
logger
|
|
6219
|
+
logger.info('webrtc transfer initialized', { id: this.getSipSessionId(session), target });
|
|
6215
6220
|
|
|
6216
6221
|
result.newSession = await this.call(target);
|
|
6217
6222
|
},
|
|
6218
6223
|
complete: () => {
|
|
6219
|
-
logger
|
|
6224
|
+
logger.info('webrtc transfer completed', {
|
|
6220
6225
|
id: this.getSipSessionId(session),
|
|
6221
6226
|
referId: this.getSipSessionId(result.newSession),
|
|
6222
6227
|
});
|
|
@@ -6237,7 +6242,7 @@ class WebRTCClient extends Emitter {
|
|
|
6237
6242
|
return;
|
|
6238
6243
|
}
|
|
6239
6244
|
|
|
6240
|
-
logger
|
|
6245
|
+
logger.info('send WebRTC message', { sipId: sipSession.id, contentType });
|
|
6241
6246
|
|
|
6242
6247
|
try {
|
|
6243
6248
|
sipSession.message({
|
|
@@ -6279,7 +6284,7 @@ class WebRTCClient extends Emitter {
|
|
|
6279
6284
|
}
|
|
6280
6285
|
|
|
6281
6286
|
changeAudioOutputVolume(volume ) {
|
|
6282
|
-
logger
|
|
6287
|
+
logger.info('Changing audio output volume', { volume });
|
|
6283
6288
|
|
|
6284
6289
|
Object.values(this.audioElements).forEach(audioElement => {
|
|
6285
6290
|
if (audioElement instanceof HTMLAudioElement) {
|
|
@@ -6291,7 +6296,7 @@ class WebRTCClient extends Emitter {
|
|
|
6291
6296
|
}
|
|
6292
6297
|
|
|
6293
6298
|
changeAudioOutputDevice(id ) {
|
|
6294
|
-
logger
|
|
6299
|
+
logger.info('Changing audio output device', { id });
|
|
6295
6300
|
|
|
6296
6301
|
Object.values(this.audioElements).forEach(audioElement => {
|
|
6297
6302
|
// `setSinkId` method is not included in any flow type definitions for HTMLAudioElements but is a valid method
|
|
@@ -6308,7 +6313,7 @@ class WebRTCClient extends Emitter {
|
|
|
6308
6313
|
|
|
6309
6314
|
changeAudioInputDevice(id , session ) {
|
|
6310
6315
|
const currentId = this.getAudioDeviceId();
|
|
6311
|
-
logger
|
|
6316
|
+
logger.info('setting audio input device', { id, currentId, session: !!session });
|
|
6312
6317
|
|
|
6313
6318
|
if (id === currentId) {
|
|
6314
6319
|
return null;
|
|
@@ -6354,7 +6359,7 @@ class WebRTCClient extends Emitter {
|
|
|
6354
6359
|
|
|
6355
6360
|
setVideoInputDevice(id ) {
|
|
6356
6361
|
const currentId = this.getVideoDeviceId();
|
|
6357
|
-
logger
|
|
6362
|
+
logger.info('setting video input device', { id, currentId });
|
|
6358
6363
|
|
|
6359
6364
|
if (id === currentId) {
|
|
6360
6365
|
return null;
|
|
@@ -6379,7 +6384,7 @@ class WebRTCClient extends Emitter {
|
|
|
6379
6384
|
const sessionId = this.getSipSessionId(session);
|
|
6380
6385
|
const localStream = this.getLocalStream(sessionId);
|
|
6381
6386
|
|
|
6382
|
-
logger
|
|
6387
|
+
logger.info('changing video input device', { id, sessionId });
|
|
6383
6388
|
|
|
6384
6389
|
// Release old video stream
|
|
6385
6390
|
if (localStream) {
|
|
@@ -6447,7 +6452,7 @@ class WebRTCClient extends Emitter {
|
|
|
6447
6452
|
const shouldDoScreenSharing = newConstraints && newConstraints.screen;
|
|
6448
6453
|
const desktop = newConstraints && newConstraints.desktop;
|
|
6449
6454
|
|
|
6450
|
-
logger
|
|
6455
|
+
logger.info('Sending reinvite', {
|
|
6451
6456
|
id: this.getSipSessionId(sipSession),
|
|
6452
6457
|
newConstraints,
|
|
6453
6458
|
conference,
|
|
@@ -6485,7 +6490,7 @@ class WebRTCClient extends Emitter {
|
|
|
6485
6490
|
sipSession.incomingInviteRequest.message.body = response.message.body;
|
|
6486
6491
|
}
|
|
6487
6492
|
|
|
6488
|
-
logger
|
|
6493
|
+
logger.info('on re-INVITE accepted', {
|
|
6489
6494
|
id: this.getSipSessionId(sipSession),
|
|
6490
6495
|
wasMuted,
|
|
6491
6496
|
shouldDoScreenSharing,
|
|
@@ -6660,7 +6665,7 @@ class WebRTCClient extends Emitter {
|
|
|
6660
6665
|
}
|
|
6661
6666
|
|
|
6662
6667
|
startHeartbeat() {
|
|
6663
|
-
logger
|
|
6668
|
+
logger.info('sdk webrtc start heartbeat', { userAgent: !!this.userAgent });
|
|
6664
6669
|
if (!this.userAgent) {
|
|
6665
6670
|
this.heartbeat.stop();
|
|
6666
6671
|
return;
|
|
@@ -6673,7 +6678,7 @@ class WebRTCClient extends Emitter {
|
|
|
6673
6678
|
}
|
|
6674
6679
|
|
|
6675
6680
|
stopHeartbeat() {
|
|
6676
|
-
logger
|
|
6681
|
+
logger.info('sdk webrtc stop heartbeat');
|
|
6677
6682
|
this.heartbeat.stop();
|
|
6678
6683
|
}
|
|
6679
6684
|
|
|
@@ -6694,7 +6699,7 @@ class WebRTCClient extends Emitter {
|
|
|
6694
6699
|
}
|
|
6695
6700
|
|
|
6696
6701
|
attemptReconnection() {
|
|
6697
|
-
logger
|
|
6702
|
+
logger.info('attempt reconnection', { userAgent: !!this.userAgent });
|
|
6698
6703
|
if (!this.userAgent) {
|
|
6699
6704
|
return;
|
|
6700
6705
|
}
|
|
@@ -6719,7 +6724,7 @@ class WebRTCClient extends Emitter {
|
|
|
6719
6724
|
return;
|
|
6720
6725
|
}
|
|
6721
6726
|
|
|
6722
|
-
logger
|
|
6727
|
+
logger.info('setting local media stream', {
|
|
6723
6728
|
sipSessionId,
|
|
6724
6729
|
tracks: newStream ? newStream.getTracks() : null,
|
|
6725
6730
|
});
|
|
@@ -6736,7 +6741,7 @@ class WebRTCClient extends Emitter {
|
|
|
6736
6741
|
|
|
6737
6742
|
const oldStream = this.getLocalStream(sipSessionId);
|
|
6738
6743
|
|
|
6739
|
-
logger
|
|
6744
|
+
logger.info('updating local stream', {
|
|
6740
6745
|
sipSessionId,
|
|
6741
6746
|
oldStream: !!oldStream,
|
|
6742
6747
|
tracks: newStream.getTracks(),
|
|
@@ -6756,7 +6761,7 @@ class WebRTCClient extends Emitter {
|
|
|
6756
6761
|
const remoteStream = this.getRemoteStream(sessionId);
|
|
6757
6762
|
const pc = this.getPeerConnection(sessionId);
|
|
6758
6763
|
|
|
6759
|
-
logger
|
|
6764
|
+
logger.info('Updating remote stream', {
|
|
6760
6765
|
sessionId,
|
|
6761
6766
|
tracks: remoteStream ? remoteStream.getTracks() : null,
|
|
6762
6767
|
receiverTracks: pc && pc.getReceivers ? pc.getReceivers().map(receiver => receiver.track) : null,
|
|
@@ -6781,14 +6786,16 @@ class WebRTCClient extends Emitter {
|
|
|
6781
6786
|
const screenSharing = constraints && 'screen' in constraints ? constraints.screen : false;
|
|
6782
6787
|
const isDesktop = constraints && 'desktop' in constraints ? constraints.desktop : false;
|
|
6783
6788
|
const withAudio = constraints && 'audio' in constraints ? constraints.audio : true;
|
|
6789
|
+
const mandatoryVideo = constraints && typeof constraints.video === 'object' ? constraints.video.mandatory : {};
|
|
6784
6790
|
|
|
6785
|
-
logger
|
|
6791
|
+
logger.info('Retrieving media a configuration', { enableVideo, screenSharing, isDesktop, withAudio, constraints });
|
|
6786
6792
|
|
|
6787
6793
|
return {
|
|
6788
6794
|
constraints: {
|
|
6789
6795
|
// Exact constraint are not supported with `getDisplayMedia` and we must have a video=false in desktop screenshare
|
|
6790
6796
|
audio: screenSharing ? !isDesktop : (withAudio ? this._getAudioConstraints() : false),
|
|
6791
|
-
video: screenSharing ? (isDesktop
|
|
6797
|
+
video: screenSharing ? (isDesktop
|
|
6798
|
+
? ({ mandatory: { chromeMediaSource: 'desktop', ...(mandatoryVideo || {}) } }) : { cursor: 'always' })
|
|
6792
6799
|
: this._getVideoConstraints(enableVideo),
|
|
6793
6800
|
screen: screenSharing,
|
|
6794
6801
|
desktop: isDesktop,
|
|
@@ -6831,7 +6838,7 @@ class WebRTCClient extends Emitter {
|
|
|
6831
6838
|
}
|
|
6832
6839
|
|
|
6833
6840
|
_onTransportError() {
|
|
6834
|
-
logger
|
|
6841
|
+
logger.error('on transport error');
|
|
6835
6842
|
this.eventEmitter.emit(TRANSPORT_ERROR);
|
|
6836
6843
|
this.attemptReconnection();
|
|
6837
6844
|
}
|
|
@@ -6840,7 +6847,7 @@ class WebRTCClient extends Emitter {
|
|
|
6840
6847
|
const body = message && typeof message === 'object' ? message.data : message;
|
|
6841
6848
|
if (body && body.indexOf('200 OK') !== -1) {
|
|
6842
6849
|
if (this.hasHeartbeat()) {
|
|
6843
|
-
logger
|
|
6850
|
+
logger.info('on heartbeat received from Asterisk', { hasHeartbeat: this.hasHeartbeat() });
|
|
6844
6851
|
|
|
6845
6852
|
this.heartbeat.onHeartbeat();
|
|
6846
6853
|
if (this.heartbeatCb) {
|
|
@@ -6851,7 +6858,7 @@ class WebRTCClient extends Emitter {
|
|
|
6851
6858
|
}
|
|
6852
6859
|
|
|
6853
6860
|
async _onHeartbeatTimeout() {
|
|
6854
|
-
logger
|
|
6861
|
+
logger.info('sdk webrtc heartbeat timed out', { userAgent: !!this.userAgent, cb: !!this.heartbeatTimeoutCb });
|
|
6855
6862
|
|
|
6856
6863
|
if (this.heartbeatTimeoutCb) {
|
|
6857
6864
|
this.heartbeatTimeoutCb();
|
|
@@ -6863,7 +6870,7 @@ class WebRTCClient extends Emitter {
|
|
|
6863
6870
|
try {
|
|
6864
6871
|
await this.userAgent.transport.disconnect();
|
|
6865
6872
|
} catch (e) {
|
|
6866
|
-
logger
|
|
6873
|
+
logger.error('Transport disconnection after heartbeat timeout, error', e);
|
|
6867
6874
|
}
|
|
6868
6875
|
}
|
|
6869
6876
|
|
|
@@ -6896,31 +6903,31 @@ class WebRTCClient extends Emitter {
|
|
|
6896
6903
|
}
|
|
6897
6904
|
|
|
6898
6905
|
_connectIfNeeded() {
|
|
6899
|
-
logger
|
|
6906
|
+
logger.info('connect if needed, checking', { connected: this.isConnected() });
|
|
6900
6907
|
if (!this.userAgent) {
|
|
6901
|
-
logger
|
|
6908
|
+
logger.info('need to recreate User Agent');
|
|
6902
6909
|
this.userAgent = this.createUserAgent(this.uaConfigOverrides);
|
|
6903
6910
|
}
|
|
6904
6911
|
|
|
6905
6912
|
if (this.isConnected()) {
|
|
6906
|
-
logger
|
|
6913
|
+
logger.info('webrtc sdk, already connected');
|
|
6907
6914
|
return Promise.resolve();
|
|
6908
6915
|
}
|
|
6909
6916
|
|
|
6910
6917
|
if (this.isConnecting()) {
|
|
6911
|
-
logger
|
|
6918
|
+
logger.info('webrtc sdk, already connecting...');
|
|
6912
6919
|
|
|
6913
6920
|
this.connectionPromise = this.userAgent.transport.connectPromise;
|
|
6914
6921
|
return this.connectionPromise;
|
|
6915
6922
|
}
|
|
6916
6923
|
|
|
6917
6924
|
if (this.connectionPromise) {
|
|
6918
|
-
logger
|
|
6925
|
+
logger.info('webrtc sdk, connection promise connecting...');
|
|
6919
6926
|
// $FlowFixMe
|
|
6920
6927
|
return this.connectionPromise;
|
|
6921
6928
|
}
|
|
6922
6929
|
|
|
6923
|
-
logger
|
|
6930
|
+
logger.info('WebRTC UA needs to connect');
|
|
6924
6931
|
|
|
6925
6932
|
// Force UA to reconnect
|
|
6926
6933
|
if (this.userAgent && this.userAgent.state !== UserAgentState.Stopped) {
|
|
@@ -7045,7 +7052,7 @@ class WebRTCClient extends Emitter {
|
|
|
7045
7052
|
|
|
7046
7053
|
sdh.peerConnectionDelegate = {
|
|
7047
7054
|
onicecandidateerror: (error ) => {
|
|
7048
|
-
logger
|
|
7055
|
+
logger.error('on icecandidate error', {
|
|
7049
7056
|
address: error.address,
|
|
7050
7057
|
port: error.port,
|
|
7051
7058
|
errorCode: error.errorCode,
|
|
@@ -7074,7 +7081,7 @@ class WebRTCClient extends Emitter {
|
|
|
7074
7081
|
updatedNumber = session.assertedIdentity.uri.normal.user;
|
|
7075
7082
|
updatedCalleeName = session.assertedIdentity.displayName || updatedNumber;
|
|
7076
7083
|
}
|
|
7077
|
-
logger
|
|
7084
|
+
logger.info('re-invite received', { updatedCalleeName, updatedNumber, hadRemoteVideo });
|
|
7078
7085
|
|
|
7079
7086
|
// Useful to know if it's a video upgrade or an unhold from a remote peer with a video stream
|
|
7080
7087
|
|
|
@@ -7095,7 +7102,7 @@ class WebRTCClient extends Emitter {
|
|
|
7095
7102
|
}
|
|
7096
7103
|
|
|
7097
7104
|
_onAccepted(session , sessionDialog , withEvent = true) {
|
|
7098
|
-
logger
|
|
7105
|
+
logger.info('on call accepted', { id: session.id, remoteTag: session.remoteTag });
|
|
7099
7106
|
|
|
7100
7107
|
this.storeSipSession(session);
|
|
7101
7108
|
|
|
@@ -7107,7 +7114,7 @@ class WebRTCClient extends Emitter {
|
|
|
7107
7114
|
const onTrack = (event ) => {
|
|
7108
7115
|
const isAudioOnly = this._isAudioOnly(session);
|
|
7109
7116
|
const { kind, label, readyState, id, muted } = event.track;
|
|
7110
|
-
logger
|
|
7117
|
+
logger.info('on track event', { isAudioOnly, kind, label, readyState, id, muted });
|
|
7111
7118
|
|
|
7112
7119
|
// Stop video track in audio only mode
|
|
7113
7120
|
if (isAudioOnly && kind === 'video') {
|
|
@@ -7123,12 +7130,14 @@ class WebRTCClient extends Emitter {
|
|
|
7123
7130
|
|
|
7124
7131
|
session.sessionDescriptionHandler.remoteMediaStream.onaddtrack = onTrack;
|
|
7125
7132
|
|
|
7126
|
-
|
|
7127
|
-
|
|
7128
|
-
|
|
7129
|
-
|
|
7130
|
-
|
|
7131
|
-
|
|
7133
|
+
if (pc) {
|
|
7134
|
+
pc.oniceconnectionstatechange = () => {
|
|
7135
|
+
logger.info('on ice connection state changed', { state: pc.iceConnectionState });
|
|
7136
|
+
if (pc.iceConnectionState === 'disconnected') {
|
|
7137
|
+
this.eventEmitter.emit(ON_DISCONNECTED);
|
|
7138
|
+
}
|
|
7139
|
+
};
|
|
7140
|
+
}
|
|
7132
7141
|
|
|
7133
7142
|
if (withEvent) {
|
|
7134
7143
|
this.eventEmitter.emit(ACCEPTED, session, sessionDialog);
|
|
@@ -7297,10 +7306,10 @@ class WebRTCClient extends Emitter {
|
|
|
7297
7306
|
|
|
7298
7307
|
_stopSendingStats(session ) {
|
|
7299
7308
|
const sessionId = this.getSipSessionId(session);
|
|
7300
|
-
logger
|
|
7309
|
+
logger.trace('Check for stopping stats', { sessionId, ids: Object.keys(this.statsIntervals) });
|
|
7301
7310
|
|
|
7302
7311
|
if (sessionId in this.statsIntervals) {
|
|
7303
|
-
logger
|
|
7312
|
+
logger.trace('Stop sending stats for call', { sessionId });
|
|
7304
7313
|
this.statsIntervals[sessionId]();
|
|
7305
7314
|
delete this.statsIntervals[sessionId];
|
|
7306
7315
|
}
|
|
@@ -7316,7 +7325,7 @@ class WebRTCClient extends Emitter {
|
|
|
7316
7325
|
try {
|
|
7317
7326
|
await this.userAgent.transport.disconnect();
|
|
7318
7327
|
} catch (e) {
|
|
7319
|
-
logger
|
|
7328
|
+
logger.error('WebRTC transport disconnect, error', e);
|
|
7320
7329
|
}
|
|
7321
7330
|
}
|
|
7322
7331
|
}
|
|
@@ -7338,13 +7347,17 @@ class WebRTCClient extends Emitter {
|
|
|
7338
7347
|
const nbStats = this.sessionNetworkStats[sessionId].length;
|
|
7339
7348
|
const lastNetworkStats = this.sessionNetworkStats[sessionId][nbStats - 1];
|
|
7340
7349
|
const lastAudioSent = lastNetworkStats ? lastNetworkStats.audioBytesSent : 0;
|
|
7350
|
+
const lastAudioContentSent = lastNetworkStats ? lastNetworkStats.audioContentSent : 0;
|
|
7341
7351
|
const lastVideoSent = lastNetworkStats ? lastNetworkStats.videoBytesSent : 0;
|
|
7342
7352
|
const lastAudioReceived = lastNetworkStats ? lastNetworkStats.audioBytesReceived : 0;
|
|
7353
|
+
const lastAudioContentReceived = lastNetworkStats ? lastNetworkStats.audioContentReceived : 0;
|
|
7343
7354
|
const lastVideoReceived = lastNetworkStats ? lastNetworkStats.videoBytesReceived : 0;
|
|
7344
7355
|
const lastTransportSent = lastNetworkStats ? lastNetworkStats.transportSent : 0;
|
|
7345
7356
|
const lastTransportReceived = lastNetworkStats ? lastNetworkStats.transportReceived : 0;
|
|
7346
|
-
let audioBytesSent = 0;
|
|
7347
|
-
let audioBytesReceived = 0;
|
|
7357
|
+
let audioBytesSent = 0; // content + header
|
|
7358
|
+
let audioBytesReceived = 0; // content + header
|
|
7359
|
+
let audioContentSent = 0; // useful to detect blank call
|
|
7360
|
+
let audioContentReceived = 0;
|
|
7348
7361
|
let videoBytesSent = 0;
|
|
7349
7362
|
let videoBytesReceived = 0;
|
|
7350
7363
|
let transportSent = 0;
|
|
@@ -7354,6 +7367,7 @@ class WebRTCClient extends Emitter {
|
|
|
7354
7367
|
stats.forEach(report => {
|
|
7355
7368
|
if (report.type === 'outbound-rtp' && report.kind === 'audio') {
|
|
7356
7369
|
audioBytesSent += Number(report.bytesSent) + Number(report.headerBytesSent);
|
|
7370
|
+
audioContentSent += Number(report.bytesSent);
|
|
7357
7371
|
}
|
|
7358
7372
|
if (report.type === 'remote-outbound-rtp' && report.kind === 'audio') {
|
|
7359
7373
|
audioBytesSent += Number(report.bytesSent);
|
|
@@ -7365,6 +7379,7 @@ class WebRTCClient extends Emitter {
|
|
|
7365
7379
|
packetsLost += Number(report.packetsLost);
|
|
7366
7380
|
networkStats.packetsReceived = Number(report.packetsReceived);
|
|
7367
7381
|
audioBytesReceived += Number(report.bytesReceived) + Number(report.headerBytesReceived);
|
|
7382
|
+
audioContentReceived += Number(report.bytesReceived);
|
|
7368
7383
|
}
|
|
7369
7384
|
if (report.type === 'inbound-rtp' && report.kind === 'video') {
|
|
7370
7385
|
videoBytesReceived += Number(report.bytesReceived) + Number(report.headerBytesReceived);
|
|
@@ -7393,10 +7408,17 @@ class WebRTCClient extends Emitter {
|
|
|
7393
7408
|
});
|
|
7394
7409
|
|
|
7395
7410
|
networkStats.packetsLost = packetsLost;
|
|
7411
|
+
|
|
7396
7412
|
networkStats.totalAudioBytesSent = audioBytesSent;
|
|
7397
7413
|
networkStats.audioBytesSent = audioBytesSent - lastAudioSent;
|
|
7398
7414
|
networkStats.totalAudioBytesReceived = audioBytesReceived - lastAudioReceived;
|
|
7399
7415
|
networkStats.audioBytesReceived = audioBytesReceived;
|
|
7416
|
+
|
|
7417
|
+
networkStats.totalAudioContentSent = audioContentSent;
|
|
7418
|
+
networkStats.audioContentSent = audioContentSent - lastAudioContentSent;
|
|
7419
|
+
networkStats.totalAudioBytesReceived = audioContentReceived - lastAudioContentReceived;
|
|
7420
|
+
networkStats.audioContentReceived = audioContentReceived;
|
|
7421
|
+
|
|
7400
7422
|
networkStats.totalVideoBytesSent = videoBytesSent;
|
|
7401
7423
|
networkStats.videoBytesSent = videoBytesSent - lastVideoSent;
|
|
7402
7424
|
networkStats.totalVideoBytesReceived = videoBytesReceived;
|