@wazo/sdk 0.37.24 → 0.37.25
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/wazo-sdk.js +6 -6
- package/esm/__tests__/api-client.test.js +12 -12
- package/esm/__tests__/web-rtc-client.test.js +120 -103
- package/esm/api/amid.js +1 -1
- package/esm/api/call-logd.js +2 -2
- package/esm/api/ctid-ng.js +3 -3
- package/esm/api/dird.js +1 -1
- package/esm/api/webhookd.js +1 -1
- package/esm/api-client.js +12 -12
- package/esm/checker/Checker.js +145 -128
- package/esm/checker/checks/aor.js +12 -12
- package/esm/checker/checks/api.js +12 -12
- package/esm/checker/checks/index.js +135 -118
- package/esm/checker/checks/wazo-websocket.js +15 -15
- package/esm/checker/checks/webrtc-transport.js +120 -103
- package/esm/checker/checks/webrtc.js +120 -103
- package/esm/domain/AdHocAPIConference.js +12 -12
- package/esm/domain/CallLog.js +1 -1
- package/esm/domain/Contact.js +1 -1
- package/esm/domain/Features.js +12 -12
- package/esm/domain/Phone/CTIPhone.js +26 -26
- package/esm/domain/Phone/WebRTCPhone.js +87 -86
- package/esm/domain/__tests__/CallLog.test.js +1 -1
- package/esm/domain/__tests__/Contact.test.js +1 -1
- package/esm/index.js +356 -338
- package/esm/lib/WazoSessionDescriptionHandler.js +1 -1
- package/esm/service/CallApi.js +12 -12
- package/esm/service/IssueReporter.js +1 -1
- package/esm/service/__tests__/IssueReporter.test.js +1 -1
- package/esm/service/getApiClient.js +12 -12
- package/esm/simple/Auth.js +346 -328
- package/esm/simple/Configuration.js +346 -328
- package/esm/simple/Directory.js +12 -12
- package/esm/simple/Phone.js +346 -328
- package/esm/simple/Websocket.js +17 -17
- package/esm/simple/index.js +350 -332
- package/esm/simple/room/LocalParticipant.js +350 -332
- package/esm/simple/room/Participant.js +350 -332
- package/esm/simple/room/RemoteParticipant.js +350 -332
- package/esm/simple/room/Room.js +351 -333
- package/esm/simple/room/SipRoom.js +350 -332
- package/esm/simple/room/Stream.js +350 -332
- package/esm/simple/room/__tests__/RemoteParticipant.test.js +350 -332
- package/esm/simple/utils.js +350 -332
- package/esm/web-rtc-client.js +120 -103
- package/esm/websocket-client.js +15 -15
- package/lib/__tests__/api-client.test.js +12 -12
- package/lib/__tests__/web-rtc-client.test.js +120 -103
- package/lib/api/amid.js +1 -1
- package/lib/api/call-logd.js +2 -2
- package/lib/api/ctid-ng.js +3 -3
- package/lib/api/dird.js +1 -1
- package/lib/api/webhookd.js +1 -1
- package/lib/api-client.js +12 -12
- package/lib/checker/Checker.js +145 -128
- package/lib/checker/checks/aor.js +12 -12
- package/lib/checker/checks/api.js +12 -12
- package/lib/checker/checks/index.js +135 -118
- package/lib/checker/checks/wazo-websocket.js +15 -15
- package/lib/checker/checks/webrtc-transport.js +120 -103
- package/lib/checker/checks/webrtc.js +120 -103
- package/lib/domain/AdHocAPIConference.js +12 -12
- package/lib/domain/CallLog.js +1 -1
- package/lib/domain/Contact.js +1 -1
- package/lib/domain/Features.js +12 -12
- package/lib/domain/Phone/CTIPhone.js +26 -26
- package/lib/domain/Phone/WebRTCPhone.js +87 -86
- package/lib/domain/__tests__/CallLog.test.js +1 -1
- package/lib/domain/__tests__/Contact.test.js +1 -1
- package/lib/index.js +356 -338
- package/lib/lib/WazoSessionDescriptionHandler.js +1 -1
- package/lib/service/CallApi.js +12 -12
- package/lib/service/IssueReporter.js +1 -1
- package/lib/service/__tests__/IssueReporter.test.js +1 -1
- package/lib/service/getApiClient.js +12 -12
- package/lib/simple/Auth.js +346 -328
- package/lib/simple/Configuration.js +346 -328
- package/lib/simple/Directory.js +12 -12
- package/lib/simple/Phone.js +346 -328
- package/lib/simple/Websocket.js +17 -17
- package/lib/simple/index.js +350 -332
- package/lib/simple/room/LocalParticipant.js +350 -332
- package/lib/simple/room/Participant.js +350 -332
- package/lib/simple/room/RemoteParticipant.js +350 -332
- package/lib/simple/room/Room.js +351 -333
- package/lib/simple/room/SipRoom.js +350 -332
- package/lib/simple/room/Stream.js +350 -332
- package/lib/simple/room/__tests__/RemoteParticipant.test.js +350 -332
- package/lib/simple/utils.js +350 -332
- package/lib/web-rtc-client.js +120 -103
- package/lib/websocket-client.js +15 -15
- package/package.json +1 -1
- package/src/domain/Phone/WebRTCPhone.js +3 -2
- package/src/web-rtc-client.js +27 -10
package/esm/web-rtc-client.js
CHANGED
|
@@ -100,7 +100,7 @@ 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 = () => {
|
|
@@ -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();
|
|
@@ -4138,7 +4138,7 @@ const TRANSFER_FLOW_BLIND = 'blind';
|
|
|
4138
4138
|
|
|
4139
4139
|
// const MINIMUM_WAZO_ENGINE_VERSION_FOR_CTI_HOLD = '20.11';
|
|
4140
4140
|
|
|
4141
|
-
|
|
4141
|
+
IssueReporter$1 ? IssueReporter$1.loggerFor('cti-phone') : console;
|
|
4142
4142
|
|
|
4143
4143
|
/* */
|
|
4144
4144
|
|
|
@@ -5057,7 +5057,7 @@ const AGENTD_VERSION = '1.0';
|
|
|
5057
5057
|
const WEBHOOKD_VERSION = '1.0';
|
|
5058
5058
|
const AMID_VERSION = '1.0';
|
|
5059
5059
|
|
|
5060
|
-
const logger$
|
|
5060
|
+
const logger$1 = IssueReporter$1 ? IssueReporter$1.loggerFor('api') : console;
|
|
5061
5061
|
|
|
5062
5062
|
class ApiClient {
|
|
5063
5063
|
|
|
@@ -5109,12 +5109,12 @@ class ApiClient {
|
|
|
5109
5109
|
}
|
|
5110
5110
|
|
|
5111
5111
|
async forceRefreshToken() {
|
|
5112
|
-
logger$
|
|
5112
|
+
logger$1.info('forcing refresh token, calling callback');
|
|
5113
5113
|
return this.refreshTokenCallback();
|
|
5114
5114
|
}
|
|
5115
5115
|
|
|
5116
5116
|
async refreshTokenCallback() {
|
|
5117
|
-
logger$
|
|
5117
|
+
logger$1.info('refresh token callback called', {
|
|
5118
5118
|
refreshToken: this.refreshToken,
|
|
5119
5119
|
refreshBackend: this.refreshBackend,
|
|
5120
5120
|
refreshExpiration: this.refreshExpiration,
|
|
@@ -5132,7 +5132,7 @@ class ApiClient {
|
|
|
5132
5132
|
this.isMobile,
|
|
5133
5133
|
);
|
|
5134
5134
|
|
|
5135
|
-
logger$
|
|
5135
|
+
logger$1.info('token refreshed', { token: session.token });
|
|
5136
5136
|
|
|
5137
5137
|
if (this.onRefreshToken) {
|
|
5138
5138
|
this.onRefreshToken(session.token, session);
|
|
@@ -5305,7 +5305,7 @@ const DEFAULT_ICE_TIMEOUT = 3000;
|
|
|
5305
5305
|
const SEND_STATS_DELAY = 5000;
|
|
5306
5306
|
|
|
5307
5307
|
const states = ['STATUS_NULL', 'STATUS_NEW', 'STATUS_CONNECTING', 'STATUS_CONNECTED', 'STATUS_COMPLETED'];
|
|
5308
|
-
const logger
|
|
5308
|
+
const logger = IssueReporter$1 ? IssueReporter$1.loggerFor('webrtc-client') : console;
|
|
5309
5309
|
const statsLogger = IssueReporter$1 ? IssueReporter$1.loggerFor('webrtc-stats') : console;
|
|
5310
5310
|
|
|
5311
5311
|
// events
|
|
@@ -5484,13 +5484,13 @@ class WebRTCClient extends Emitter {
|
|
|
5484
5484
|
|
|
5485
5485
|
createUserAgent(configOverrides ) {
|
|
5486
5486
|
const webRTCConfiguration = this._createWebRTCConfiguration(configOverrides);
|
|
5487
|
-
logger
|
|
5487
|
+
logger.info('sdk webrtc, creating UA', { webRTCConfiguration });
|
|
5488
5488
|
|
|
5489
5489
|
webRTCConfiguration.delegate = {
|
|
5490
5490
|
onConnect: this.onConnect.bind(this),
|
|
5491
5491
|
onDisconnect: this.onDisconnect.bind(this),
|
|
5492
5492
|
onInvite: (invitation ) => {
|
|
5493
|
-
logger
|
|
5493
|
+
logger.info('sdk webrtc on invite', {
|
|
5494
5494
|
method: 'delegate.onInvite',
|
|
5495
5495
|
id: invitation.id,
|
|
5496
5496
|
remoteURI: invitation.remoteURI,
|
|
@@ -5533,7 +5533,7 @@ class WebRTCClient extends Emitter {
|
|
|
5533
5533
|
}
|
|
5534
5534
|
|
|
5535
5535
|
onConnect() {
|
|
5536
|
-
logger
|
|
5536
|
+
logger.info('sdk webrtc connected', { method: 'delegate.onConnect' });
|
|
5537
5537
|
this.eventEmitter.emit(CONNECTED);
|
|
5538
5538
|
if (!this.isRegistered() && this.registerer && this.registerer.waiting) {
|
|
5539
5539
|
this.registerer.waitingToggle(false);
|
|
@@ -5542,7 +5542,7 @@ class WebRTCClient extends Emitter {
|
|
|
5542
5542
|
}
|
|
5543
5543
|
|
|
5544
5544
|
async onDisconnect(error ) {
|
|
5545
|
-
logger
|
|
5545
|
+
logger.info('sdk webrtc disconnected', { method: 'delegate.onConnect', error });
|
|
5546
5546
|
this.connectionPromise = null;
|
|
5547
5547
|
// The UA will attempt to reconnect automatically when an error occurred
|
|
5548
5548
|
this.eventEmitter.emit(DISCONNECTED, error);
|
|
@@ -5567,37 +5567,37 @@ class WebRTCClient extends Emitter {
|
|
|
5567
5567
|
};
|
|
5568
5568
|
|
|
5569
5569
|
if (this.skipRegister) {
|
|
5570
|
-
logger
|
|
5570
|
+
logger.info('sdk webrtc skip register...', logInfo);
|
|
5571
5571
|
return Promise.resolve();
|
|
5572
5572
|
}
|
|
5573
5573
|
|
|
5574
|
-
logger
|
|
5574
|
+
logger.info('sdk webrtc registering...', logInfo);
|
|
5575
5575
|
|
|
5576
5576
|
if (!this.userAgent) {
|
|
5577
|
-
logger
|
|
5577
|
+
logger.info('sdk webrtc recreating User Agent');
|
|
5578
5578
|
this.userAgent = this.createUserAgent(this.uaConfigOverrides);
|
|
5579
5579
|
}
|
|
5580
5580
|
if (!this.userAgent || this.isRegistered()) {
|
|
5581
|
-
logger
|
|
5581
|
+
logger.info('sdk webrtc registering aborted, already registered or no UA can be created');
|
|
5582
5582
|
return Promise.resolve();
|
|
5583
5583
|
}
|
|
5584
5584
|
|
|
5585
5585
|
if (this.connectionPromise || (this.registerer && this.registerer.waiting)) {
|
|
5586
|
-
logger
|
|
5586
|
+
logger.info('sdk webrtc registering aborted due to a registration in progress.');
|
|
5587
5587
|
return Promise.resolve();
|
|
5588
5588
|
}
|
|
5589
5589
|
|
|
5590
5590
|
const registerOptions = this._isWeb() ? {} : { extraContactHeaderParams: ['mobility=mobile'] };
|
|
5591
5591
|
|
|
5592
5592
|
const onRegisterFailed = () => {
|
|
5593
|
-
logger
|
|
5593
|
+
logger.info('sdk webrtc registering failed', { tries, registerer: !!this.registerer });
|
|
5594
5594
|
this.connectionPromise = null;
|
|
5595
5595
|
if (this.registerer && this.registerer.waiting) {
|
|
5596
5596
|
this.registerer.waitingToggle(false);
|
|
5597
5597
|
}
|
|
5598
5598
|
|
|
5599
5599
|
if (tries <= MAX_REGISTER_TRIES) {
|
|
5600
|
-
logger
|
|
5600
|
+
logger.info('sdk webrtc registering, retrying...', { tries });
|
|
5601
5601
|
setTimeout(() => this.register(tries + 1), 300);
|
|
5602
5602
|
}
|
|
5603
5603
|
};
|
|
@@ -5606,18 +5606,18 @@ class WebRTCClient extends Emitter {
|
|
|
5606
5606
|
// Avoid race condition with the close method called just before register and setting userAgent to null
|
|
5607
5607
|
// during the resolution of the primise.
|
|
5608
5608
|
if (!this.userAgent) {
|
|
5609
|
-
logger
|
|
5609
|
+
logger.info('sdk webrtc recreating User Agent after connection');
|
|
5610
5610
|
this.userAgent = this.createUserAgent(this.uaConfigOverrides);
|
|
5611
5611
|
}
|
|
5612
5612
|
|
|
5613
|
-
logger
|
|
5613
|
+
logger.info('sdk webrtc registering, transport connected', { registerOptions, ua: !!this.userAgent });
|
|
5614
5614
|
this.registerer = new Registerer(this.userAgent, registerOptions);
|
|
5615
5615
|
this.connectionPromise = null;
|
|
5616
5616
|
this._monkeyPatchRegisterer(this.registerer);
|
|
5617
5617
|
|
|
5618
5618
|
// Bind registerer events
|
|
5619
5619
|
this.registerer.stateChange.addListener(newState => {
|
|
5620
|
-
logger
|
|
5620
|
+
logger.info('sdk webrtc registering, state changed', { newState });
|
|
5621
5621
|
|
|
5622
5622
|
if (newState === RegistererState.Registered && this.registerer
|
|
5623
5623
|
&& this.registerer.state === RegistererState.Registered) {
|
|
@@ -5630,7 +5630,7 @@ class WebRTCClient extends Emitter {
|
|
|
5630
5630
|
const options = {
|
|
5631
5631
|
requestDelegate: {
|
|
5632
5632
|
onReject: response => {
|
|
5633
|
-
logger
|
|
5633
|
+
logger.error('sdk webrtc registering, rejected', { response });
|
|
5634
5634
|
|
|
5635
5635
|
onRegisterFailed();
|
|
5636
5636
|
},
|
|
@@ -5638,13 +5638,13 @@ class WebRTCClient extends Emitter {
|
|
|
5638
5638
|
};
|
|
5639
5639
|
|
|
5640
5640
|
return this.registerer.register(options).catch((e) => {
|
|
5641
|
-
logger
|
|
5641
|
+
logger.error('sdk webrtc registering, error', e);
|
|
5642
5642
|
|
|
5643
5643
|
this.eventEmitter.emit(REGISTRATION_FAILED);
|
|
5644
5644
|
return e;
|
|
5645
5645
|
});
|
|
5646
5646
|
}).catch(error => {
|
|
5647
|
-
logger
|
|
5647
|
+
logger.error('sdk webrtc registering, transport error', error);
|
|
5648
5648
|
onRegisterFailed();
|
|
5649
5649
|
});
|
|
5650
5650
|
}
|
|
@@ -5673,21 +5673,21 @@ class WebRTCClient extends Emitter {
|
|
|
5673
5673
|
}
|
|
5674
5674
|
|
|
5675
5675
|
unregister() {
|
|
5676
|
-
logger
|
|
5676
|
+
logger.info('sdk webrtc unregistering..', { userAgent: !!this.userAgent, registerer: !!this.registerer });
|
|
5677
5677
|
if (!this.registerer) {
|
|
5678
5678
|
return Promise.resolve();
|
|
5679
5679
|
}
|
|
5680
5680
|
|
|
5681
5681
|
try {
|
|
5682
5682
|
return this.registerer.unregister().then(() => {
|
|
5683
|
-
logger
|
|
5683
|
+
logger.info('sdk webrtc unregistered');
|
|
5684
5684
|
this._cleanupRegister();
|
|
5685
5685
|
}).catch(e => {
|
|
5686
|
-
logger
|
|
5686
|
+
logger.error('sdk webrtc unregistering, promise error', e);
|
|
5687
5687
|
this._cleanupRegister();
|
|
5688
5688
|
});
|
|
5689
5689
|
} catch (e) {
|
|
5690
|
-
logger
|
|
5690
|
+
logger.error('sdk webrtc unregistering, error', e);
|
|
5691
5691
|
// Avoid issue with `undefined is not an object (evaluating 'new.target.prototype')` when triggering a new
|
|
5692
5692
|
// error when the registerer is in a bad state
|
|
5693
5693
|
this._cleanupRegister();
|
|
@@ -5695,7 +5695,7 @@ class WebRTCClient extends Emitter {
|
|
|
5695
5695
|
}
|
|
5696
5696
|
|
|
5697
5697
|
stop() {
|
|
5698
|
-
logger
|
|
5698
|
+
logger.info('sdk webrtc stop', { userAgent: !!this.userAgent });
|
|
5699
5699
|
if (!this.userAgent) {
|
|
5700
5700
|
return Promise.resolve();
|
|
5701
5701
|
}
|
|
@@ -5703,12 +5703,12 @@ class WebRTCClient extends Emitter {
|
|
|
5703
5703
|
return this.userAgent.stop().then(() => {
|
|
5704
5704
|
return this._cleanupRegister();
|
|
5705
5705
|
}).catch(e => {
|
|
5706
|
-
logger
|
|
5706
|
+
logger.warn('sdk webrtc stop, error', { message: e.message, stack: e.stack });
|
|
5707
5707
|
});
|
|
5708
5708
|
}
|
|
5709
5709
|
|
|
5710
5710
|
call(number , enableVideo , audioOnly = false, conference = false) {
|
|
5711
|
-
logger
|
|
5711
|
+
logger.info('sdk webrtc creating call', { number, enableVideo, audioOnly, conference });
|
|
5712
5712
|
const inviterOptions = {
|
|
5713
5713
|
sessionDescriptionHandlerOptionsReInvite: {
|
|
5714
5714
|
conference,
|
|
@@ -5739,7 +5739,7 @@ class WebRTCClient extends Emitter {
|
|
|
5739
5739
|
this._onAccepted(session, response.session, true);
|
|
5740
5740
|
},
|
|
5741
5741
|
onReject: (response ) => {
|
|
5742
|
-
logger
|
|
5742
|
+
logger.info('on call rejected', { id: session.id, fromTag: session.fromTag });
|
|
5743
5743
|
this._stopSendingStats(session);
|
|
5744
5744
|
this.stopNetworkMonitoring(session);
|
|
5745
5745
|
|
|
@@ -5762,11 +5762,11 @@ class WebRTCClient extends Emitter {
|
|
|
5762
5762
|
}
|
|
5763
5763
|
|
|
5764
5764
|
answer(session , enableVideo ) {
|
|
5765
|
-
logger
|
|
5765
|
+
logger.info('sdk webrtc answer call', { id: session.id, enableVideo });
|
|
5766
5766
|
|
|
5767
5767
|
if (!session || !session.accept) {
|
|
5768
5768
|
const error = 'No session to answer, or not an invitation';
|
|
5769
|
-
logger
|
|
5769
|
+
logger.warn(error);
|
|
5770
5770
|
return Promise.reject(new Error(error));
|
|
5771
5771
|
}
|
|
5772
5772
|
const options = {
|
|
@@ -5776,15 +5776,15 @@ class WebRTCClient extends Emitter {
|
|
|
5776
5776
|
return session.accept(options).then(() => {
|
|
5777
5777
|
if (session.isCanceled) {
|
|
5778
5778
|
const message = 'accepted a canceled session (or was canceled during the accept phase).';
|
|
5779
|
-
logger
|
|
5779
|
+
logger.error(message, { id: session.id });
|
|
5780
5780
|
this.onCallEnded(session);
|
|
5781
5781
|
|
|
5782
5782
|
throw new CanceledCallError(message);
|
|
5783
5783
|
}
|
|
5784
|
-
logger
|
|
5784
|
+
logger.info('sdk webrtc answer, accepted.');
|
|
5785
5785
|
this._onAccepted(session);
|
|
5786
5786
|
}).catch(e => {
|
|
5787
|
-
logger
|
|
5787
|
+
logger.error(`answer call error for ${session ? session.id : 'n/a'}`, e);
|
|
5788
5788
|
|
|
5789
5789
|
throw e;
|
|
5790
5790
|
});
|
|
@@ -5792,7 +5792,7 @@ class WebRTCClient extends Emitter {
|
|
|
5792
5792
|
|
|
5793
5793
|
hangup(session ) {
|
|
5794
5794
|
const { state, id } = session;
|
|
5795
|
-
logger
|
|
5795
|
+
logger.info('sdk webrtc hangup call', { id, state });
|
|
5796
5796
|
|
|
5797
5797
|
try {
|
|
5798
5798
|
this._stopSendingStats(session);
|
|
@@ -5821,7 +5821,7 @@ class WebRTCClient extends Emitter {
|
|
|
5821
5821
|
|
|
5822
5822
|
return bye();
|
|
5823
5823
|
} catch (error) {
|
|
5824
|
-
logger
|
|
5824
|
+
logger.warn('sdk webrtc hangup, error', error);
|
|
5825
5825
|
}
|
|
5826
5826
|
|
|
5827
5827
|
return null;
|
|
@@ -5839,7 +5839,7 @@ class WebRTCClient extends Emitter {
|
|
|
5839
5839
|
// Fetch and emit an event at `interval` with session network stats
|
|
5840
5840
|
startNetworkMonitoring(session , interval = 1000) {
|
|
5841
5841
|
const sessionId = this.getSipSessionId(session);
|
|
5842
|
-
logger
|
|
5842
|
+
logger.info('starting network inspection', { id: sessionId });
|
|
5843
5843
|
|
|
5844
5844
|
this.sessionNetworkStats[sessionId] = [];
|
|
5845
5845
|
|
|
@@ -5849,7 +5849,7 @@ class WebRTCClient extends Emitter {
|
|
|
5849
5849
|
stopNetworkMonitoring(session ) {
|
|
5850
5850
|
const sessionId = this.getSipSessionId(session);
|
|
5851
5851
|
const exists = sessionId in this.networkMonitoringInterval;
|
|
5852
|
-
logger
|
|
5852
|
+
logger.info('stopping network inspection', { id: sessionId, exists });
|
|
5853
5853
|
|
|
5854
5854
|
if (exists) {
|
|
5855
5855
|
clearInterval(this.networkMonitoringInterval[sessionId]);
|
|
@@ -5859,17 +5859,17 @@ class WebRTCClient extends Emitter {
|
|
|
5859
5859
|
}
|
|
5860
5860
|
|
|
5861
5861
|
reject(session ) {
|
|
5862
|
-
logger
|
|
5862
|
+
logger.info('sdk webrtc reject call', { id: session.id });
|
|
5863
5863
|
|
|
5864
5864
|
try {
|
|
5865
5865
|
return session.reject ? session.reject() : session.cancel();
|
|
5866
5866
|
} catch (e) {
|
|
5867
|
-
logger
|
|
5867
|
+
logger.warn('Error when rejecting call', e.message, e.stack);
|
|
5868
5868
|
}
|
|
5869
5869
|
}
|
|
5870
5870
|
|
|
5871
5871
|
async close() {
|
|
5872
|
-
logger
|
|
5872
|
+
logger.info('sdk webrtc closing client', { userAgent: !!this.userAgent });
|
|
5873
5873
|
this._cleanupMedia();
|
|
5874
5874
|
this.connectionPromise = null;
|
|
5875
5875
|
|
|
@@ -5900,7 +5900,7 @@ class WebRTCClient extends Emitter {
|
|
|
5900
5900
|
// eg: "INVITE not rejectable in state Completed"
|
|
5901
5901
|
}
|
|
5902
5902
|
this.userAgent = null;
|
|
5903
|
-
logger
|
|
5903
|
+
logger.info('sdk webrtc client closed');
|
|
5904
5904
|
}
|
|
5905
5905
|
|
|
5906
5906
|
getNumber(session ) {
|
|
@@ -5913,13 +5913,13 @@ class WebRTCClient extends Emitter {
|
|
|
5913
5913
|
}
|
|
5914
5914
|
|
|
5915
5915
|
mute(session ) {
|
|
5916
|
-
logger
|
|
5916
|
+
logger.info('sdk webrtc mute', { id: session.id });
|
|
5917
5917
|
|
|
5918
5918
|
this._toggleAudio(session, true);
|
|
5919
5919
|
}
|
|
5920
5920
|
|
|
5921
5921
|
unmute(session ) {
|
|
5922
|
-
logger
|
|
5922
|
+
logger.info('sdk webrtc unmute', { id: session.id });
|
|
5923
5923
|
|
|
5924
5924
|
this._toggleAudio(session, false);
|
|
5925
5925
|
}
|
|
@@ -5959,13 +5959,13 @@ class WebRTCClient extends Emitter {
|
|
|
5959
5959
|
}
|
|
5960
5960
|
|
|
5961
5961
|
toggleCameraOn(session ) {
|
|
5962
|
-
logger
|
|
5962
|
+
logger.info('sdk webrtc toggle camera on', { id: session.id });
|
|
5963
5963
|
|
|
5964
5964
|
this._toggleVideo(session, false);
|
|
5965
5965
|
}
|
|
5966
5966
|
|
|
5967
5967
|
toggleCameraOff(session ) {
|
|
5968
|
-
logger
|
|
5968
|
+
logger.info('sdk webrtc toggle camera off', { id: session.id });
|
|
5969
5969
|
|
|
5970
5970
|
this._toggleVideo(session, true);
|
|
5971
5971
|
}
|
|
@@ -5974,7 +5974,7 @@ class WebRTCClient extends Emitter {
|
|
|
5974
5974
|
const sessionId = this.getSipSessionId(session);
|
|
5975
5975
|
const hasVideo = hadVideo || this.hasLocalVideo(sessionId);
|
|
5976
5976
|
|
|
5977
|
-
logger
|
|
5977
|
+
logger.info('sdk webrtc hold', {
|
|
5978
5978
|
sessionId,
|
|
5979
5979
|
keys: Object.keys(this.heldSessions),
|
|
5980
5980
|
pendingReinvite: !!session.pendingReinvite,
|
|
@@ -6023,7 +6023,7 @@ class WebRTCClient extends Emitter {
|
|
|
6023
6023
|
const sessionId = this.getSipSessionId(session);
|
|
6024
6024
|
const hasVideo = sessionId in this.heldSessions && this.heldSessions[sessionId].hasVideo;
|
|
6025
6025
|
|
|
6026
|
-
logger
|
|
6026
|
+
logger.info('sdk webrtc unhold', {
|
|
6027
6027
|
sessionId,
|
|
6028
6028
|
keys: Object.keys(this.heldSessions),
|
|
6029
6029
|
pendingReinvite: !!session.pendingReinvite,
|
|
@@ -6171,7 +6171,7 @@ class WebRTCClient extends Emitter {
|
|
|
6171
6171
|
if (!session.sessionDescriptionHandler) {
|
|
6172
6172
|
return;
|
|
6173
6173
|
}
|
|
6174
|
-
logger
|
|
6174
|
+
logger.info('Sending DTMF', {
|
|
6175
6175
|
id: this.getSipSessionId(session),
|
|
6176
6176
|
tone,
|
|
6177
6177
|
});
|
|
@@ -6187,7 +6187,7 @@ class WebRTCClient extends Emitter {
|
|
|
6187
6187
|
transfer(session , target ) {
|
|
6188
6188
|
this.hold(session);
|
|
6189
6189
|
|
|
6190
|
-
logger
|
|
6190
|
+
logger.info('Transfering a session', {
|
|
6191
6191
|
id: this.getSipSessionId(session),
|
|
6192
6192
|
target,
|
|
6193
6193
|
});
|
|
@@ -6209,17 +6209,17 @@ class WebRTCClient extends Emitter {
|
|
|
6209
6209
|
atxfer(session ) {
|
|
6210
6210
|
this.hold(session);
|
|
6211
6211
|
|
|
6212
|
-
logger
|
|
6212
|
+
logger.info('webrtc transfer started', { id: this.getSipSessionId(session) });
|
|
6213
6213
|
|
|
6214
6214
|
const result = {
|
|
6215
6215
|
newSession: null,
|
|
6216
6216
|
init: async (target ) => {
|
|
6217
|
-
logger
|
|
6217
|
+
logger.info('webrtc transfer initialized', { id: this.getSipSessionId(session), target });
|
|
6218
6218
|
|
|
6219
6219
|
result.newSession = await this.call(target);
|
|
6220
6220
|
},
|
|
6221
6221
|
complete: () => {
|
|
6222
|
-
logger
|
|
6222
|
+
logger.info('webrtc transfer completed', {
|
|
6223
6223
|
id: this.getSipSessionId(session),
|
|
6224
6224
|
referId: this.getSipSessionId(result.newSession),
|
|
6225
6225
|
});
|
|
@@ -6240,7 +6240,7 @@ class WebRTCClient extends Emitter {
|
|
|
6240
6240
|
return;
|
|
6241
6241
|
}
|
|
6242
6242
|
|
|
6243
|
-
logger
|
|
6243
|
+
logger.info('send WebRTC message', { sipId: sipSession.id, contentType });
|
|
6244
6244
|
|
|
6245
6245
|
try {
|
|
6246
6246
|
sipSession.message({
|
|
@@ -6282,7 +6282,7 @@ class WebRTCClient extends Emitter {
|
|
|
6282
6282
|
}
|
|
6283
6283
|
|
|
6284
6284
|
changeAudioOutputVolume(volume ) {
|
|
6285
|
-
logger
|
|
6285
|
+
logger.info('Changing audio output volume', { volume });
|
|
6286
6286
|
|
|
6287
6287
|
Object.values(this.audioElements).forEach(audioElement => {
|
|
6288
6288
|
if (audioElement instanceof HTMLAudioElement) {
|
|
@@ -6294,7 +6294,7 @@ class WebRTCClient extends Emitter {
|
|
|
6294
6294
|
}
|
|
6295
6295
|
|
|
6296
6296
|
changeAudioOutputDevice(id ) {
|
|
6297
|
-
logger
|
|
6297
|
+
logger.info('Changing audio output device', { id });
|
|
6298
6298
|
|
|
6299
6299
|
Object.values(this.audioElements).forEach(audioElement => {
|
|
6300
6300
|
// `setSinkId` method is not included in any flow type definitions for HTMLAudioElements but is a valid method
|
|
@@ -6311,7 +6311,7 @@ class WebRTCClient extends Emitter {
|
|
|
6311
6311
|
|
|
6312
6312
|
changeAudioInputDevice(id , session ) {
|
|
6313
6313
|
const currentId = this.getAudioDeviceId();
|
|
6314
|
-
logger
|
|
6314
|
+
logger.info('setting audio input device', { id, currentId, session: !!session });
|
|
6315
6315
|
|
|
6316
6316
|
if (id === currentId) {
|
|
6317
6317
|
return null;
|
|
@@ -6357,7 +6357,7 @@ class WebRTCClient extends Emitter {
|
|
|
6357
6357
|
|
|
6358
6358
|
setVideoInputDevice(id ) {
|
|
6359
6359
|
const currentId = this.getVideoDeviceId();
|
|
6360
|
-
logger
|
|
6360
|
+
logger.info('setting video input device', { id, currentId });
|
|
6361
6361
|
|
|
6362
6362
|
if (id === currentId) {
|
|
6363
6363
|
return null;
|
|
@@ -6382,7 +6382,7 @@ class WebRTCClient extends Emitter {
|
|
|
6382
6382
|
const sessionId = this.getSipSessionId(session);
|
|
6383
6383
|
const localStream = this.getLocalStream(sessionId);
|
|
6384
6384
|
|
|
6385
|
-
logger
|
|
6385
|
+
logger.info('changing video input device', { id, sessionId });
|
|
6386
6386
|
|
|
6387
6387
|
// Release old video stream
|
|
6388
6388
|
if (localStream) {
|
|
@@ -6450,7 +6450,7 @@ class WebRTCClient extends Emitter {
|
|
|
6450
6450
|
const shouldDoScreenSharing = newConstraints && newConstraints.screen;
|
|
6451
6451
|
const desktop = newConstraints && newConstraints.desktop;
|
|
6452
6452
|
|
|
6453
|
-
logger
|
|
6453
|
+
logger.info('Sending reinvite', {
|
|
6454
6454
|
id: this.getSipSessionId(sipSession),
|
|
6455
6455
|
newConstraints,
|
|
6456
6456
|
conference,
|
|
@@ -6488,7 +6488,7 @@ class WebRTCClient extends Emitter {
|
|
|
6488
6488
|
sipSession.incomingInviteRequest.message.body = response.message.body;
|
|
6489
6489
|
}
|
|
6490
6490
|
|
|
6491
|
-
logger
|
|
6491
|
+
logger.info('on re-INVITE accepted', {
|
|
6492
6492
|
id: this.getSipSessionId(sipSession),
|
|
6493
6493
|
wasMuted,
|
|
6494
6494
|
shouldDoScreenSharing,
|
|
@@ -6663,7 +6663,7 @@ class WebRTCClient extends Emitter {
|
|
|
6663
6663
|
}
|
|
6664
6664
|
|
|
6665
6665
|
startHeartbeat() {
|
|
6666
|
-
logger
|
|
6666
|
+
logger.info('sdk webrtc start heartbeat', { userAgent: !!this.userAgent });
|
|
6667
6667
|
if (!this.userAgent) {
|
|
6668
6668
|
this.heartbeat.stop();
|
|
6669
6669
|
return;
|
|
@@ -6676,7 +6676,7 @@ class WebRTCClient extends Emitter {
|
|
|
6676
6676
|
}
|
|
6677
6677
|
|
|
6678
6678
|
stopHeartbeat() {
|
|
6679
|
-
logger
|
|
6679
|
+
logger.info('sdk webrtc stop heartbeat');
|
|
6680
6680
|
this.heartbeat.stop();
|
|
6681
6681
|
}
|
|
6682
6682
|
|
|
@@ -6697,7 +6697,7 @@ class WebRTCClient extends Emitter {
|
|
|
6697
6697
|
}
|
|
6698
6698
|
|
|
6699
6699
|
attemptReconnection() {
|
|
6700
|
-
logger
|
|
6700
|
+
logger.info('attempt reconnection', { userAgent: !!this.userAgent });
|
|
6701
6701
|
if (!this.userAgent) {
|
|
6702
6702
|
return;
|
|
6703
6703
|
}
|
|
@@ -6722,7 +6722,7 @@ class WebRTCClient extends Emitter {
|
|
|
6722
6722
|
return;
|
|
6723
6723
|
}
|
|
6724
6724
|
|
|
6725
|
-
logger
|
|
6725
|
+
logger.info('setting local media stream', {
|
|
6726
6726
|
sipSessionId,
|
|
6727
6727
|
tracks: newStream ? newStream.getTracks() : null,
|
|
6728
6728
|
});
|
|
@@ -6739,7 +6739,7 @@ class WebRTCClient extends Emitter {
|
|
|
6739
6739
|
|
|
6740
6740
|
const oldStream = this.getLocalStream(sipSessionId);
|
|
6741
6741
|
|
|
6742
|
-
logger
|
|
6742
|
+
logger.info('updating local stream', {
|
|
6743
6743
|
sipSessionId,
|
|
6744
6744
|
oldStream: !!oldStream,
|
|
6745
6745
|
tracks: newStream.getTracks(),
|
|
@@ -6759,7 +6759,7 @@ class WebRTCClient extends Emitter {
|
|
|
6759
6759
|
const remoteStream = this.getRemoteStream(sessionId);
|
|
6760
6760
|
const pc = this.getPeerConnection(sessionId);
|
|
6761
6761
|
|
|
6762
|
-
logger
|
|
6762
|
+
logger.info('Updating remote stream', {
|
|
6763
6763
|
sessionId,
|
|
6764
6764
|
tracks: remoteStream ? remoteStream.getTracks() : null,
|
|
6765
6765
|
receiverTracks: pc && pc.getReceivers ? pc.getReceivers().map(receiver => receiver.track) : null,
|
|
@@ -6784,14 +6784,16 @@ class WebRTCClient extends Emitter {
|
|
|
6784
6784
|
const screenSharing = constraints && 'screen' in constraints ? constraints.screen : false;
|
|
6785
6785
|
const isDesktop = constraints && 'desktop' in constraints ? constraints.desktop : false;
|
|
6786
6786
|
const withAudio = constraints && 'audio' in constraints ? constraints.audio : true;
|
|
6787
|
+
const mandatoryVideo = constraints && typeof constraints.video === 'object' ? constraints.video.mandatory : {};
|
|
6787
6788
|
|
|
6788
|
-
logger
|
|
6789
|
+
logger.info('Retrieving media a configuration', { enableVideo, screenSharing, isDesktop, withAudio, constraints });
|
|
6789
6790
|
|
|
6790
6791
|
return {
|
|
6791
6792
|
constraints: {
|
|
6792
6793
|
// Exact constraint are not supported with `getDisplayMedia` and we must have a video=false in desktop screenshare
|
|
6793
6794
|
audio: screenSharing ? !isDesktop : (withAudio ? this._getAudioConstraints() : false),
|
|
6794
|
-
video: screenSharing ? (isDesktop
|
|
6795
|
+
video: screenSharing ? (isDesktop
|
|
6796
|
+
? ({ mandatory: { chromeMediaSource: 'desktop', ...(mandatoryVideo || {}) } }) : { cursor: 'always' })
|
|
6795
6797
|
: this._getVideoConstraints(enableVideo),
|
|
6796
6798
|
screen: screenSharing,
|
|
6797
6799
|
desktop: isDesktop,
|
|
@@ -6834,7 +6836,7 @@ class WebRTCClient extends Emitter {
|
|
|
6834
6836
|
}
|
|
6835
6837
|
|
|
6836
6838
|
_onTransportError() {
|
|
6837
|
-
logger
|
|
6839
|
+
logger.error('on transport error');
|
|
6838
6840
|
this.eventEmitter.emit(TRANSPORT_ERROR);
|
|
6839
6841
|
this.attemptReconnection();
|
|
6840
6842
|
}
|
|
@@ -6843,7 +6845,7 @@ class WebRTCClient extends Emitter {
|
|
|
6843
6845
|
const body = message && typeof message === 'object' ? message.data : message;
|
|
6844
6846
|
if (body && body.indexOf('200 OK') !== -1) {
|
|
6845
6847
|
if (this.hasHeartbeat()) {
|
|
6846
|
-
logger
|
|
6848
|
+
logger.info('on heartbeat received from Asterisk', { hasHeartbeat: this.hasHeartbeat() });
|
|
6847
6849
|
|
|
6848
6850
|
this.heartbeat.onHeartbeat();
|
|
6849
6851
|
if (this.heartbeatCb) {
|
|
@@ -6854,7 +6856,7 @@ class WebRTCClient extends Emitter {
|
|
|
6854
6856
|
}
|
|
6855
6857
|
|
|
6856
6858
|
async _onHeartbeatTimeout() {
|
|
6857
|
-
logger
|
|
6859
|
+
logger.info('sdk webrtc heartbeat timed out', { userAgent: !!this.userAgent, cb: !!this.heartbeatTimeoutCb });
|
|
6858
6860
|
|
|
6859
6861
|
if (this.heartbeatTimeoutCb) {
|
|
6860
6862
|
this.heartbeatTimeoutCb();
|
|
@@ -6866,7 +6868,7 @@ class WebRTCClient extends Emitter {
|
|
|
6866
6868
|
try {
|
|
6867
6869
|
await this.userAgent.transport.disconnect();
|
|
6868
6870
|
} catch (e) {
|
|
6869
|
-
logger
|
|
6871
|
+
logger.error('Transport disconnection after heartbeat timeout, error', e);
|
|
6870
6872
|
}
|
|
6871
6873
|
}
|
|
6872
6874
|
|
|
@@ -6899,31 +6901,31 @@ class WebRTCClient extends Emitter {
|
|
|
6899
6901
|
}
|
|
6900
6902
|
|
|
6901
6903
|
_connectIfNeeded() {
|
|
6902
|
-
logger
|
|
6904
|
+
logger.info('connect if needed, checking', { connected: this.isConnected() });
|
|
6903
6905
|
if (!this.userAgent) {
|
|
6904
|
-
logger
|
|
6906
|
+
logger.info('need to recreate User Agent');
|
|
6905
6907
|
this.userAgent = this.createUserAgent(this.uaConfigOverrides);
|
|
6906
6908
|
}
|
|
6907
6909
|
|
|
6908
6910
|
if (this.isConnected()) {
|
|
6909
|
-
logger
|
|
6911
|
+
logger.info('webrtc sdk, already connected');
|
|
6910
6912
|
return Promise.resolve();
|
|
6911
6913
|
}
|
|
6912
6914
|
|
|
6913
6915
|
if (this.isConnecting()) {
|
|
6914
|
-
logger
|
|
6916
|
+
logger.info('webrtc sdk, already connecting...');
|
|
6915
6917
|
|
|
6916
6918
|
this.connectionPromise = this.userAgent.transport.connectPromise;
|
|
6917
6919
|
return this.connectionPromise;
|
|
6918
6920
|
}
|
|
6919
6921
|
|
|
6920
6922
|
if (this.connectionPromise) {
|
|
6921
|
-
logger
|
|
6923
|
+
logger.info('webrtc sdk, connection promise connecting...');
|
|
6922
6924
|
// $FlowFixMe
|
|
6923
6925
|
return this.connectionPromise;
|
|
6924
6926
|
}
|
|
6925
6927
|
|
|
6926
|
-
logger
|
|
6928
|
+
logger.info('WebRTC UA needs to connect');
|
|
6927
6929
|
|
|
6928
6930
|
// Force UA to reconnect
|
|
6929
6931
|
if (this.userAgent && this.userAgent.state !== UserAgentState.Stopped) {
|
|
@@ -7048,7 +7050,7 @@ class WebRTCClient extends Emitter {
|
|
|
7048
7050
|
|
|
7049
7051
|
sdh.peerConnectionDelegate = {
|
|
7050
7052
|
onicecandidateerror: (error ) => {
|
|
7051
|
-
logger
|
|
7053
|
+
logger.error('on icecandidate error', {
|
|
7052
7054
|
address: error.address,
|
|
7053
7055
|
port: error.port,
|
|
7054
7056
|
errorCode: error.errorCode,
|
|
@@ -7077,7 +7079,7 @@ class WebRTCClient extends Emitter {
|
|
|
7077
7079
|
updatedNumber = session.assertedIdentity.uri.normal.user;
|
|
7078
7080
|
updatedCalleeName = session.assertedIdentity.displayName || updatedNumber;
|
|
7079
7081
|
}
|
|
7080
|
-
logger
|
|
7082
|
+
logger.info('re-invite received', { updatedCalleeName, updatedNumber, hadRemoteVideo });
|
|
7081
7083
|
|
|
7082
7084
|
// Useful to know if it's a video upgrade or an unhold from a remote peer with a video stream
|
|
7083
7085
|
|
|
@@ -7098,7 +7100,7 @@ class WebRTCClient extends Emitter {
|
|
|
7098
7100
|
}
|
|
7099
7101
|
|
|
7100
7102
|
_onAccepted(session , sessionDialog , withEvent = true) {
|
|
7101
|
-
logger
|
|
7103
|
+
logger.info('on call accepted', { id: session.id, remoteTag: session.remoteTag });
|
|
7102
7104
|
|
|
7103
7105
|
this.storeSipSession(session);
|
|
7104
7106
|
|
|
@@ -7110,7 +7112,7 @@ class WebRTCClient extends Emitter {
|
|
|
7110
7112
|
const onTrack = (event ) => {
|
|
7111
7113
|
const isAudioOnly = this._isAudioOnly(session);
|
|
7112
7114
|
const { kind, label, readyState, id, muted } = event.track;
|
|
7113
|
-
logger
|
|
7115
|
+
logger.info('on track event', { isAudioOnly, kind, label, readyState, id, muted });
|
|
7114
7116
|
|
|
7115
7117
|
// Stop video track in audio only mode
|
|
7116
7118
|
if (isAudioOnly && kind === 'video') {
|
|
@@ -7126,12 +7128,14 @@ class WebRTCClient extends Emitter {
|
|
|
7126
7128
|
|
|
7127
7129
|
session.sessionDescriptionHandler.remoteMediaStream.onaddtrack = onTrack;
|
|
7128
7130
|
|
|
7129
|
-
|
|
7130
|
-
|
|
7131
|
-
|
|
7132
|
-
|
|
7133
|
-
|
|
7134
|
-
|
|
7131
|
+
if (pc) {
|
|
7132
|
+
pc.oniceconnectionstatechange = () => {
|
|
7133
|
+
logger.info('on ice connection state changed', { state: pc.iceConnectionState });
|
|
7134
|
+
if (pc.iceConnectionState === 'disconnected') {
|
|
7135
|
+
this.eventEmitter.emit(ON_DISCONNECTED);
|
|
7136
|
+
}
|
|
7137
|
+
};
|
|
7138
|
+
}
|
|
7135
7139
|
|
|
7136
7140
|
if (withEvent) {
|
|
7137
7141
|
this.eventEmitter.emit(ACCEPTED, session, sessionDialog);
|
|
@@ -7300,10 +7304,10 @@ class WebRTCClient extends Emitter {
|
|
|
7300
7304
|
|
|
7301
7305
|
_stopSendingStats(session ) {
|
|
7302
7306
|
const sessionId = this.getSipSessionId(session);
|
|
7303
|
-
logger
|
|
7307
|
+
logger.trace('Check for stopping stats', { sessionId, ids: Object.keys(this.statsIntervals) });
|
|
7304
7308
|
|
|
7305
7309
|
if (sessionId in this.statsIntervals) {
|
|
7306
|
-
logger
|
|
7310
|
+
logger.trace('Stop sending stats for call', { sessionId });
|
|
7307
7311
|
this.statsIntervals[sessionId]();
|
|
7308
7312
|
delete this.statsIntervals[sessionId];
|
|
7309
7313
|
}
|
|
@@ -7319,7 +7323,7 @@ class WebRTCClient extends Emitter {
|
|
|
7319
7323
|
try {
|
|
7320
7324
|
await this.userAgent.transport.disconnect();
|
|
7321
7325
|
} catch (e) {
|
|
7322
|
-
logger
|
|
7326
|
+
logger.error('WebRTC transport disconnect, error', e);
|
|
7323
7327
|
}
|
|
7324
7328
|
}
|
|
7325
7329
|
}
|
|
@@ -7341,13 +7345,17 @@ class WebRTCClient extends Emitter {
|
|
|
7341
7345
|
const nbStats = this.sessionNetworkStats[sessionId].length;
|
|
7342
7346
|
const lastNetworkStats = this.sessionNetworkStats[sessionId][nbStats - 1];
|
|
7343
7347
|
const lastAudioSent = lastNetworkStats ? lastNetworkStats.audioBytesSent : 0;
|
|
7348
|
+
const lastAudioContentSent = lastNetworkStats ? lastNetworkStats.audioContentSent : 0;
|
|
7344
7349
|
const lastVideoSent = lastNetworkStats ? lastNetworkStats.videoBytesSent : 0;
|
|
7345
7350
|
const lastAudioReceived = lastNetworkStats ? lastNetworkStats.audioBytesReceived : 0;
|
|
7351
|
+
const lastAudioContentReceived = lastNetworkStats ? lastNetworkStats.audioContentReceived : 0;
|
|
7346
7352
|
const lastVideoReceived = lastNetworkStats ? lastNetworkStats.videoBytesReceived : 0;
|
|
7347
7353
|
const lastTransportSent = lastNetworkStats ? lastNetworkStats.transportSent : 0;
|
|
7348
7354
|
const lastTransportReceived = lastNetworkStats ? lastNetworkStats.transportReceived : 0;
|
|
7349
|
-
let audioBytesSent = 0;
|
|
7350
|
-
let audioBytesReceived = 0;
|
|
7355
|
+
let audioBytesSent = 0; // content + header
|
|
7356
|
+
let audioBytesReceived = 0; // content + header
|
|
7357
|
+
let audioContentSent = 0; // useful to detect blank call
|
|
7358
|
+
let audioContentReceived = 0;
|
|
7351
7359
|
let videoBytesSent = 0;
|
|
7352
7360
|
let videoBytesReceived = 0;
|
|
7353
7361
|
let transportSent = 0;
|
|
@@ -7357,6 +7365,7 @@ class WebRTCClient extends Emitter {
|
|
|
7357
7365
|
stats.forEach(report => {
|
|
7358
7366
|
if (report.type === 'outbound-rtp' && report.kind === 'audio') {
|
|
7359
7367
|
audioBytesSent += Number(report.bytesSent) + Number(report.headerBytesSent);
|
|
7368
|
+
audioContentSent += Number(report.bytesSent);
|
|
7360
7369
|
}
|
|
7361
7370
|
if (report.type === 'remote-outbound-rtp' && report.kind === 'audio') {
|
|
7362
7371
|
audioBytesSent += Number(report.bytesSent);
|
|
@@ -7368,6 +7377,7 @@ class WebRTCClient extends Emitter {
|
|
|
7368
7377
|
packetsLost += Number(report.packetsLost);
|
|
7369
7378
|
networkStats.packetsReceived = Number(report.packetsReceived);
|
|
7370
7379
|
audioBytesReceived += Number(report.bytesReceived) + Number(report.headerBytesReceived);
|
|
7380
|
+
audioContentReceived += Number(report.bytesReceived);
|
|
7371
7381
|
}
|
|
7372
7382
|
if (report.type === 'inbound-rtp' && report.kind === 'video') {
|
|
7373
7383
|
videoBytesReceived += Number(report.bytesReceived) + Number(report.headerBytesReceived);
|
|
@@ -7396,10 +7406,17 @@ class WebRTCClient extends Emitter {
|
|
|
7396
7406
|
});
|
|
7397
7407
|
|
|
7398
7408
|
networkStats.packetsLost = packetsLost;
|
|
7409
|
+
|
|
7399
7410
|
networkStats.totalAudioBytesSent = audioBytesSent;
|
|
7400
7411
|
networkStats.audioBytesSent = audioBytesSent - lastAudioSent;
|
|
7401
7412
|
networkStats.totalAudioBytesReceived = audioBytesReceived - lastAudioReceived;
|
|
7402
7413
|
networkStats.audioBytesReceived = audioBytesReceived;
|
|
7414
|
+
|
|
7415
|
+
networkStats.totalAudioContentSent = audioContentSent;
|
|
7416
|
+
networkStats.audioContentSent = audioContentSent - lastAudioContentSent;
|
|
7417
|
+
networkStats.totalAudioBytesReceived = audioContentReceived - lastAudioContentReceived;
|
|
7418
|
+
networkStats.audioContentReceived = audioContentReceived;
|
|
7419
|
+
|
|
7403
7420
|
networkStats.totalVideoBytesSent = videoBytesSent;
|
|
7404
7421
|
networkStats.videoBytesSent = videoBytesSent - lastVideoSent;
|
|
7405
7422
|
networkStats.totalVideoBytesReceived = videoBytesReceived;
|