@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
|
@@ -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
|
|
@@ -5481,13 +5481,13 @@ class WebRTCClient extends Emitter {
|
|
|
5481
5481
|
|
|
5482
5482
|
createUserAgent(configOverrides ) {
|
|
5483
5483
|
const webRTCConfiguration = this._createWebRTCConfiguration(configOverrides);
|
|
5484
|
-
logger
|
|
5484
|
+
logger.info('sdk webrtc, creating UA', { webRTCConfiguration });
|
|
5485
5485
|
|
|
5486
5486
|
webRTCConfiguration.delegate = {
|
|
5487
5487
|
onConnect: this.onConnect.bind(this),
|
|
5488
5488
|
onDisconnect: this.onDisconnect.bind(this),
|
|
5489
5489
|
onInvite: (invitation ) => {
|
|
5490
|
-
logger
|
|
5490
|
+
logger.info('sdk webrtc on invite', {
|
|
5491
5491
|
method: 'delegate.onInvite',
|
|
5492
5492
|
id: invitation.id,
|
|
5493
5493
|
remoteURI: invitation.remoteURI,
|
|
@@ -5530,7 +5530,7 @@ class WebRTCClient extends Emitter {
|
|
|
5530
5530
|
}
|
|
5531
5531
|
|
|
5532
5532
|
onConnect() {
|
|
5533
|
-
logger
|
|
5533
|
+
logger.info('sdk webrtc connected', { method: 'delegate.onConnect' });
|
|
5534
5534
|
this.eventEmitter.emit(CONNECTED);
|
|
5535
5535
|
if (!this.isRegistered() && this.registerer && this.registerer.waiting) {
|
|
5536
5536
|
this.registerer.waitingToggle(false);
|
|
@@ -5539,7 +5539,7 @@ class WebRTCClient extends Emitter {
|
|
|
5539
5539
|
}
|
|
5540
5540
|
|
|
5541
5541
|
async onDisconnect(error ) {
|
|
5542
|
-
logger
|
|
5542
|
+
logger.info('sdk webrtc disconnected', { method: 'delegate.onConnect', error });
|
|
5543
5543
|
this.connectionPromise = null;
|
|
5544
5544
|
// The UA will attempt to reconnect automatically when an error occurred
|
|
5545
5545
|
this.eventEmitter.emit(DISCONNECTED, error);
|
|
@@ -5564,37 +5564,37 @@ class WebRTCClient extends Emitter {
|
|
|
5564
5564
|
};
|
|
5565
5565
|
|
|
5566
5566
|
if (this.skipRegister) {
|
|
5567
|
-
logger
|
|
5567
|
+
logger.info('sdk webrtc skip register...', logInfo);
|
|
5568
5568
|
return Promise.resolve();
|
|
5569
5569
|
}
|
|
5570
5570
|
|
|
5571
|
-
logger
|
|
5571
|
+
logger.info('sdk webrtc registering...', logInfo);
|
|
5572
5572
|
|
|
5573
5573
|
if (!this.userAgent) {
|
|
5574
|
-
logger
|
|
5574
|
+
logger.info('sdk webrtc recreating User Agent');
|
|
5575
5575
|
this.userAgent = this.createUserAgent(this.uaConfigOverrides);
|
|
5576
5576
|
}
|
|
5577
5577
|
if (!this.userAgent || this.isRegistered()) {
|
|
5578
|
-
logger
|
|
5578
|
+
logger.info('sdk webrtc registering aborted, already registered or no UA can be created');
|
|
5579
5579
|
return Promise.resolve();
|
|
5580
5580
|
}
|
|
5581
5581
|
|
|
5582
5582
|
if (this.connectionPromise || (this.registerer && this.registerer.waiting)) {
|
|
5583
|
-
logger
|
|
5583
|
+
logger.info('sdk webrtc registering aborted due to a registration in progress.');
|
|
5584
5584
|
return Promise.resolve();
|
|
5585
5585
|
}
|
|
5586
5586
|
|
|
5587
5587
|
const registerOptions = this._isWeb() ? {} : { extraContactHeaderParams: ['mobility=mobile'] };
|
|
5588
5588
|
|
|
5589
5589
|
const onRegisterFailed = () => {
|
|
5590
|
-
logger
|
|
5590
|
+
logger.info('sdk webrtc registering failed', { tries, registerer: !!this.registerer });
|
|
5591
5591
|
this.connectionPromise = null;
|
|
5592
5592
|
if (this.registerer && this.registerer.waiting) {
|
|
5593
5593
|
this.registerer.waitingToggle(false);
|
|
5594
5594
|
}
|
|
5595
5595
|
|
|
5596
5596
|
if (tries <= MAX_REGISTER_TRIES) {
|
|
5597
|
-
logger
|
|
5597
|
+
logger.info('sdk webrtc registering, retrying...', { tries });
|
|
5598
5598
|
setTimeout(() => this.register(tries + 1), 300);
|
|
5599
5599
|
}
|
|
5600
5600
|
};
|
|
@@ -5603,18 +5603,18 @@ class WebRTCClient extends Emitter {
|
|
|
5603
5603
|
// Avoid race condition with the close method called just before register and setting userAgent to null
|
|
5604
5604
|
// during the resolution of the primise.
|
|
5605
5605
|
if (!this.userAgent) {
|
|
5606
|
-
logger
|
|
5606
|
+
logger.info('sdk webrtc recreating User Agent after connection');
|
|
5607
5607
|
this.userAgent = this.createUserAgent(this.uaConfigOverrides);
|
|
5608
5608
|
}
|
|
5609
5609
|
|
|
5610
|
-
logger
|
|
5610
|
+
logger.info('sdk webrtc registering, transport connected', { registerOptions, ua: !!this.userAgent });
|
|
5611
5611
|
this.registerer = new Registerer(this.userAgent, registerOptions);
|
|
5612
5612
|
this.connectionPromise = null;
|
|
5613
5613
|
this._monkeyPatchRegisterer(this.registerer);
|
|
5614
5614
|
|
|
5615
5615
|
// Bind registerer events
|
|
5616
5616
|
this.registerer.stateChange.addListener(newState => {
|
|
5617
|
-
logger
|
|
5617
|
+
logger.info('sdk webrtc registering, state changed', { newState });
|
|
5618
5618
|
|
|
5619
5619
|
if (newState === RegistererState.Registered && this.registerer
|
|
5620
5620
|
&& this.registerer.state === RegistererState.Registered) {
|
|
@@ -5627,7 +5627,7 @@ class WebRTCClient extends Emitter {
|
|
|
5627
5627
|
const options = {
|
|
5628
5628
|
requestDelegate: {
|
|
5629
5629
|
onReject: response => {
|
|
5630
|
-
logger
|
|
5630
|
+
logger.error('sdk webrtc registering, rejected', { response });
|
|
5631
5631
|
|
|
5632
5632
|
onRegisterFailed();
|
|
5633
5633
|
},
|
|
@@ -5635,13 +5635,13 @@ class WebRTCClient extends Emitter {
|
|
|
5635
5635
|
};
|
|
5636
5636
|
|
|
5637
5637
|
return this.registerer.register(options).catch((e) => {
|
|
5638
|
-
logger
|
|
5638
|
+
logger.error('sdk webrtc registering, error', e);
|
|
5639
5639
|
|
|
5640
5640
|
this.eventEmitter.emit(REGISTRATION_FAILED);
|
|
5641
5641
|
return e;
|
|
5642
5642
|
});
|
|
5643
5643
|
}).catch(error => {
|
|
5644
|
-
logger
|
|
5644
|
+
logger.error('sdk webrtc registering, transport error', error);
|
|
5645
5645
|
onRegisterFailed();
|
|
5646
5646
|
});
|
|
5647
5647
|
}
|
|
@@ -5670,21 +5670,21 @@ class WebRTCClient extends Emitter {
|
|
|
5670
5670
|
}
|
|
5671
5671
|
|
|
5672
5672
|
unregister() {
|
|
5673
|
-
logger
|
|
5673
|
+
logger.info('sdk webrtc unregistering..', { userAgent: !!this.userAgent, registerer: !!this.registerer });
|
|
5674
5674
|
if (!this.registerer) {
|
|
5675
5675
|
return Promise.resolve();
|
|
5676
5676
|
}
|
|
5677
5677
|
|
|
5678
5678
|
try {
|
|
5679
5679
|
return this.registerer.unregister().then(() => {
|
|
5680
|
-
logger
|
|
5680
|
+
logger.info('sdk webrtc unregistered');
|
|
5681
5681
|
this._cleanupRegister();
|
|
5682
5682
|
}).catch(e => {
|
|
5683
|
-
logger
|
|
5683
|
+
logger.error('sdk webrtc unregistering, promise error', e);
|
|
5684
5684
|
this._cleanupRegister();
|
|
5685
5685
|
});
|
|
5686
5686
|
} catch (e) {
|
|
5687
|
-
logger
|
|
5687
|
+
logger.error('sdk webrtc unregistering, error', e);
|
|
5688
5688
|
// Avoid issue with `undefined is not an object (evaluating 'new.target.prototype')` when triggering a new
|
|
5689
5689
|
// error when the registerer is in a bad state
|
|
5690
5690
|
this._cleanupRegister();
|
|
@@ -5692,7 +5692,7 @@ class WebRTCClient extends Emitter {
|
|
|
5692
5692
|
}
|
|
5693
5693
|
|
|
5694
5694
|
stop() {
|
|
5695
|
-
logger
|
|
5695
|
+
logger.info('sdk webrtc stop', { userAgent: !!this.userAgent });
|
|
5696
5696
|
if (!this.userAgent) {
|
|
5697
5697
|
return Promise.resolve();
|
|
5698
5698
|
}
|
|
@@ -5700,12 +5700,12 @@ class WebRTCClient extends Emitter {
|
|
|
5700
5700
|
return this.userAgent.stop().then(() => {
|
|
5701
5701
|
return this._cleanupRegister();
|
|
5702
5702
|
}).catch(e => {
|
|
5703
|
-
logger
|
|
5703
|
+
logger.warn('sdk webrtc stop, error', { message: e.message, stack: e.stack });
|
|
5704
5704
|
});
|
|
5705
5705
|
}
|
|
5706
5706
|
|
|
5707
5707
|
call(number , enableVideo , audioOnly = false, conference = false) {
|
|
5708
|
-
logger
|
|
5708
|
+
logger.info('sdk webrtc creating call', { number, enableVideo, audioOnly, conference });
|
|
5709
5709
|
const inviterOptions = {
|
|
5710
5710
|
sessionDescriptionHandlerOptionsReInvite: {
|
|
5711
5711
|
conference,
|
|
@@ -5736,7 +5736,7 @@ class WebRTCClient extends Emitter {
|
|
|
5736
5736
|
this._onAccepted(session, response.session, true);
|
|
5737
5737
|
},
|
|
5738
5738
|
onReject: (response ) => {
|
|
5739
|
-
logger
|
|
5739
|
+
logger.info('on call rejected', { id: session.id, fromTag: session.fromTag });
|
|
5740
5740
|
this._stopSendingStats(session);
|
|
5741
5741
|
this.stopNetworkMonitoring(session);
|
|
5742
5742
|
|
|
@@ -5759,11 +5759,11 @@ class WebRTCClient extends Emitter {
|
|
|
5759
5759
|
}
|
|
5760
5760
|
|
|
5761
5761
|
answer(session , enableVideo ) {
|
|
5762
|
-
logger
|
|
5762
|
+
logger.info('sdk webrtc answer call', { id: session.id, enableVideo });
|
|
5763
5763
|
|
|
5764
5764
|
if (!session || !session.accept) {
|
|
5765
5765
|
const error = 'No session to answer, or not an invitation';
|
|
5766
|
-
logger
|
|
5766
|
+
logger.warn(error);
|
|
5767
5767
|
return Promise.reject(new Error(error));
|
|
5768
5768
|
}
|
|
5769
5769
|
const options = {
|
|
@@ -5773,15 +5773,15 @@ class WebRTCClient extends Emitter {
|
|
|
5773
5773
|
return session.accept(options).then(() => {
|
|
5774
5774
|
if (session.isCanceled) {
|
|
5775
5775
|
const message = 'accepted a canceled session (or was canceled during the accept phase).';
|
|
5776
|
-
logger
|
|
5776
|
+
logger.error(message, { id: session.id });
|
|
5777
5777
|
this.onCallEnded(session);
|
|
5778
5778
|
|
|
5779
5779
|
throw new CanceledCallError(message);
|
|
5780
5780
|
}
|
|
5781
|
-
logger
|
|
5781
|
+
logger.info('sdk webrtc answer, accepted.');
|
|
5782
5782
|
this._onAccepted(session);
|
|
5783
5783
|
}).catch(e => {
|
|
5784
|
-
logger
|
|
5784
|
+
logger.error(`answer call error for ${session ? session.id : 'n/a'}`, e);
|
|
5785
5785
|
|
|
5786
5786
|
throw e;
|
|
5787
5787
|
});
|
|
@@ -5789,7 +5789,7 @@ class WebRTCClient extends Emitter {
|
|
|
5789
5789
|
|
|
5790
5790
|
hangup(session ) {
|
|
5791
5791
|
const { state, id } = session;
|
|
5792
|
-
logger
|
|
5792
|
+
logger.info('sdk webrtc hangup call', { id, state });
|
|
5793
5793
|
|
|
5794
5794
|
try {
|
|
5795
5795
|
this._stopSendingStats(session);
|
|
@@ -5818,7 +5818,7 @@ class WebRTCClient extends Emitter {
|
|
|
5818
5818
|
|
|
5819
5819
|
return bye();
|
|
5820
5820
|
} catch (error) {
|
|
5821
|
-
logger
|
|
5821
|
+
logger.warn('sdk webrtc hangup, error', error);
|
|
5822
5822
|
}
|
|
5823
5823
|
|
|
5824
5824
|
return null;
|
|
@@ -5836,7 +5836,7 @@ class WebRTCClient extends Emitter {
|
|
|
5836
5836
|
// Fetch and emit an event at `interval` with session network stats
|
|
5837
5837
|
startNetworkMonitoring(session , interval = 1000) {
|
|
5838
5838
|
const sessionId = this.getSipSessionId(session);
|
|
5839
|
-
logger
|
|
5839
|
+
logger.info('starting network inspection', { id: sessionId });
|
|
5840
5840
|
|
|
5841
5841
|
this.sessionNetworkStats[sessionId] = [];
|
|
5842
5842
|
|
|
@@ -5846,7 +5846,7 @@ class WebRTCClient extends Emitter {
|
|
|
5846
5846
|
stopNetworkMonitoring(session ) {
|
|
5847
5847
|
const sessionId = this.getSipSessionId(session);
|
|
5848
5848
|
const exists = sessionId in this.networkMonitoringInterval;
|
|
5849
|
-
logger
|
|
5849
|
+
logger.info('stopping network inspection', { id: sessionId, exists });
|
|
5850
5850
|
|
|
5851
5851
|
if (exists) {
|
|
5852
5852
|
clearInterval(this.networkMonitoringInterval[sessionId]);
|
|
@@ -5856,17 +5856,17 @@ class WebRTCClient extends Emitter {
|
|
|
5856
5856
|
}
|
|
5857
5857
|
|
|
5858
5858
|
reject(session ) {
|
|
5859
|
-
logger
|
|
5859
|
+
logger.info('sdk webrtc reject call', { id: session.id });
|
|
5860
5860
|
|
|
5861
5861
|
try {
|
|
5862
5862
|
return session.reject ? session.reject() : session.cancel();
|
|
5863
5863
|
} catch (e) {
|
|
5864
|
-
logger
|
|
5864
|
+
logger.warn('Error when rejecting call', e.message, e.stack);
|
|
5865
5865
|
}
|
|
5866
5866
|
}
|
|
5867
5867
|
|
|
5868
5868
|
async close() {
|
|
5869
|
-
logger
|
|
5869
|
+
logger.info('sdk webrtc closing client', { userAgent: !!this.userAgent });
|
|
5870
5870
|
this._cleanupMedia();
|
|
5871
5871
|
this.connectionPromise = null;
|
|
5872
5872
|
|
|
@@ -5897,7 +5897,7 @@ class WebRTCClient extends Emitter {
|
|
|
5897
5897
|
// eg: "INVITE not rejectable in state Completed"
|
|
5898
5898
|
}
|
|
5899
5899
|
this.userAgent = null;
|
|
5900
|
-
logger
|
|
5900
|
+
logger.info('sdk webrtc client closed');
|
|
5901
5901
|
}
|
|
5902
5902
|
|
|
5903
5903
|
getNumber(session ) {
|
|
@@ -5910,13 +5910,13 @@ class WebRTCClient extends Emitter {
|
|
|
5910
5910
|
}
|
|
5911
5911
|
|
|
5912
5912
|
mute(session ) {
|
|
5913
|
-
logger
|
|
5913
|
+
logger.info('sdk webrtc mute', { id: session.id });
|
|
5914
5914
|
|
|
5915
5915
|
this._toggleAudio(session, true);
|
|
5916
5916
|
}
|
|
5917
5917
|
|
|
5918
5918
|
unmute(session ) {
|
|
5919
|
-
logger
|
|
5919
|
+
logger.info('sdk webrtc unmute', { id: session.id });
|
|
5920
5920
|
|
|
5921
5921
|
this._toggleAudio(session, false);
|
|
5922
5922
|
}
|
|
@@ -5956,13 +5956,13 @@ class WebRTCClient extends Emitter {
|
|
|
5956
5956
|
}
|
|
5957
5957
|
|
|
5958
5958
|
toggleCameraOn(session ) {
|
|
5959
|
-
logger
|
|
5959
|
+
logger.info('sdk webrtc toggle camera on', { id: session.id });
|
|
5960
5960
|
|
|
5961
5961
|
this._toggleVideo(session, false);
|
|
5962
5962
|
}
|
|
5963
5963
|
|
|
5964
5964
|
toggleCameraOff(session ) {
|
|
5965
|
-
logger
|
|
5965
|
+
logger.info('sdk webrtc toggle camera off', { id: session.id });
|
|
5966
5966
|
|
|
5967
5967
|
this._toggleVideo(session, true);
|
|
5968
5968
|
}
|
|
@@ -5971,7 +5971,7 @@ class WebRTCClient extends Emitter {
|
|
|
5971
5971
|
const sessionId = this.getSipSessionId(session);
|
|
5972
5972
|
const hasVideo = hadVideo || this.hasLocalVideo(sessionId);
|
|
5973
5973
|
|
|
5974
|
-
logger
|
|
5974
|
+
logger.info('sdk webrtc hold', {
|
|
5975
5975
|
sessionId,
|
|
5976
5976
|
keys: Object.keys(this.heldSessions),
|
|
5977
5977
|
pendingReinvite: !!session.pendingReinvite,
|
|
@@ -6020,7 +6020,7 @@ class WebRTCClient extends Emitter {
|
|
|
6020
6020
|
const sessionId = this.getSipSessionId(session);
|
|
6021
6021
|
const hasVideo = sessionId in this.heldSessions && this.heldSessions[sessionId].hasVideo;
|
|
6022
6022
|
|
|
6023
|
-
logger
|
|
6023
|
+
logger.info('sdk webrtc unhold', {
|
|
6024
6024
|
sessionId,
|
|
6025
6025
|
keys: Object.keys(this.heldSessions),
|
|
6026
6026
|
pendingReinvite: !!session.pendingReinvite,
|
|
@@ -6168,7 +6168,7 @@ class WebRTCClient extends Emitter {
|
|
|
6168
6168
|
if (!session.sessionDescriptionHandler) {
|
|
6169
6169
|
return;
|
|
6170
6170
|
}
|
|
6171
|
-
logger
|
|
6171
|
+
logger.info('Sending DTMF', {
|
|
6172
6172
|
id: this.getSipSessionId(session),
|
|
6173
6173
|
tone,
|
|
6174
6174
|
});
|
|
@@ -6184,7 +6184,7 @@ class WebRTCClient extends Emitter {
|
|
|
6184
6184
|
transfer(session , target ) {
|
|
6185
6185
|
this.hold(session);
|
|
6186
6186
|
|
|
6187
|
-
logger
|
|
6187
|
+
logger.info('Transfering a session', {
|
|
6188
6188
|
id: this.getSipSessionId(session),
|
|
6189
6189
|
target,
|
|
6190
6190
|
});
|
|
@@ -6206,17 +6206,17 @@ class WebRTCClient extends Emitter {
|
|
|
6206
6206
|
atxfer(session ) {
|
|
6207
6207
|
this.hold(session);
|
|
6208
6208
|
|
|
6209
|
-
logger
|
|
6209
|
+
logger.info('webrtc transfer started', { id: this.getSipSessionId(session) });
|
|
6210
6210
|
|
|
6211
6211
|
const result = {
|
|
6212
6212
|
newSession: null,
|
|
6213
6213
|
init: async (target ) => {
|
|
6214
|
-
logger
|
|
6214
|
+
logger.info('webrtc transfer initialized', { id: this.getSipSessionId(session), target });
|
|
6215
6215
|
|
|
6216
6216
|
result.newSession = await this.call(target);
|
|
6217
6217
|
},
|
|
6218
6218
|
complete: () => {
|
|
6219
|
-
logger
|
|
6219
|
+
logger.info('webrtc transfer completed', {
|
|
6220
6220
|
id: this.getSipSessionId(session),
|
|
6221
6221
|
referId: this.getSipSessionId(result.newSession),
|
|
6222
6222
|
});
|
|
@@ -6237,7 +6237,7 @@ class WebRTCClient extends Emitter {
|
|
|
6237
6237
|
return;
|
|
6238
6238
|
}
|
|
6239
6239
|
|
|
6240
|
-
logger
|
|
6240
|
+
logger.info('send WebRTC message', { sipId: sipSession.id, contentType });
|
|
6241
6241
|
|
|
6242
6242
|
try {
|
|
6243
6243
|
sipSession.message({
|
|
@@ -6279,7 +6279,7 @@ class WebRTCClient extends Emitter {
|
|
|
6279
6279
|
}
|
|
6280
6280
|
|
|
6281
6281
|
changeAudioOutputVolume(volume ) {
|
|
6282
|
-
logger
|
|
6282
|
+
logger.info('Changing audio output volume', { volume });
|
|
6283
6283
|
|
|
6284
6284
|
Object.values(this.audioElements).forEach(audioElement => {
|
|
6285
6285
|
if (audioElement instanceof HTMLAudioElement) {
|
|
@@ -6291,7 +6291,7 @@ class WebRTCClient extends Emitter {
|
|
|
6291
6291
|
}
|
|
6292
6292
|
|
|
6293
6293
|
changeAudioOutputDevice(id ) {
|
|
6294
|
-
logger
|
|
6294
|
+
logger.info('Changing audio output device', { id });
|
|
6295
6295
|
|
|
6296
6296
|
Object.values(this.audioElements).forEach(audioElement => {
|
|
6297
6297
|
// `setSinkId` method is not included in any flow type definitions for HTMLAudioElements but is a valid method
|
|
@@ -6308,7 +6308,7 @@ class WebRTCClient extends Emitter {
|
|
|
6308
6308
|
|
|
6309
6309
|
changeAudioInputDevice(id , session ) {
|
|
6310
6310
|
const currentId = this.getAudioDeviceId();
|
|
6311
|
-
logger
|
|
6311
|
+
logger.info('setting audio input device', { id, currentId, session: !!session });
|
|
6312
6312
|
|
|
6313
6313
|
if (id === currentId) {
|
|
6314
6314
|
return null;
|
|
@@ -6354,7 +6354,7 @@ class WebRTCClient extends Emitter {
|
|
|
6354
6354
|
|
|
6355
6355
|
setVideoInputDevice(id ) {
|
|
6356
6356
|
const currentId = this.getVideoDeviceId();
|
|
6357
|
-
logger
|
|
6357
|
+
logger.info('setting video input device', { id, currentId });
|
|
6358
6358
|
|
|
6359
6359
|
if (id === currentId) {
|
|
6360
6360
|
return null;
|
|
@@ -6379,7 +6379,7 @@ class WebRTCClient extends Emitter {
|
|
|
6379
6379
|
const sessionId = this.getSipSessionId(session);
|
|
6380
6380
|
const localStream = this.getLocalStream(sessionId);
|
|
6381
6381
|
|
|
6382
|
-
logger
|
|
6382
|
+
logger.info('changing video input device', { id, sessionId });
|
|
6383
6383
|
|
|
6384
6384
|
// Release old video stream
|
|
6385
6385
|
if (localStream) {
|
|
@@ -6447,7 +6447,7 @@ class WebRTCClient extends Emitter {
|
|
|
6447
6447
|
const shouldDoScreenSharing = newConstraints && newConstraints.screen;
|
|
6448
6448
|
const desktop = newConstraints && newConstraints.desktop;
|
|
6449
6449
|
|
|
6450
|
-
logger
|
|
6450
|
+
logger.info('Sending reinvite', {
|
|
6451
6451
|
id: this.getSipSessionId(sipSession),
|
|
6452
6452
|
newConstraints,
|
|
6453
6453
|
conference,
|
|
@@ -6485,7 +6485,7 @@ class WebRTCClient extends Emitter {
|
|
|
6485
6485
|
sipSession.incomingInviteRequest.message.body = response.message.body;
|
|
6486
6486
|
}
|
|
6487
6487
|
|
|
6488
|
-
logger
|
|
6488
|
+
logger.info('on re-INVITE accepted', {
|
|
6489
6489
|
id: this.getSipSessionId(sipSession),
|
|
6490
6490
|
wasMuted,
|
|
6491
6491
|
shouldDoScreenSharing,
|
|
@@ -6660,7 +6660,7 @@ class WebRTCClient extends Emitter {
|
|
|
6660
6660
|
}
|
|
6661
6661
|
|
|
6662
6662
|
startHeartbeat() {
|
|
6663
|
-
logger
|
|
6663
|
+
logger.info('sdk webrtc start heartbeat', { userAgent: !!this.userAgent });
|
|
6664
6664
|
if (!this.userAgent) {
|
|
6665
6665
|
this.heartbeat.stop();
|
|
6666
6666
|
return;
|
|
@@ -6673,7 +6673,7 @@ class WebRTCClient extends Emitter {
|
|
|
6673
6673
|
}
|
|
6674
6674
|
|
|
6675
6675
|
stopHeartbeat() {
|
|
6676
|
-
logger
|
|
6676
|
+
logger.info('sdk webrtc stop heartbeat');
|
|
6677
6677
|
this.heartbeat.stop();
|
|
6678
6678
|
}
|
|
6679
6679
|
|
|
@@ -6694,7 +6694,7 @@ class WebRTCClient extends Emitter {
|
|
|
6694
6694
|
}
|
|
6695
6695
|
|
|
6696
6696
|
attemptReconnection() {
|
|
6697
|
-
logger
|
|
6697
|
+
logger.info('attempt reconnection', { userAgent: !!this.userAgent });
|
|
6698
6698
|
if (!this.userAgent) {
|
|
6699
6699
|
return;
|
|
6700
6700
|
}
|
|
@@ -6719,7 +6719,7 @@ class WebRTCClient extends Emitter {
|
|
|
6719
6719
|
return;
|
|
6720
6720
|
}
|
|
6721
6721
|
|
|
6722
|
-
logger
|
|
6722
|
+
logger.info('setting local media stream', {
|
|
6723
6723
|
sipSessionId,
|
|
6724
6724
|
tracks: newStream ? newStream.getTracks() : null,
|
|
6725
6725
|
});
|
|
@@ -6736,7 +6736,7 @@ class WebRTCClient extends Emitter {
|
|
|
6736
6736
|
|
|
6737
6737
|
const oldStream = this.getLocalStream(sipSessionId);
|
|
6738
6738
|
|
|
6739
|
-
logger
|
|
6739
|
+
logger.info('updating local stream', {
|
|
6740
6740
|
sipSessionId,
|
|
6741
6741
|
oldStream: !!oldStream,
|
|
6742
6742
|
tracks: newStream.getTracks(),
|
|
@@ -6756,7 +6756,7 @@ class WebRTCClient extends Emitter {
|
|
|
6756
6756
|
const remoteStream = this.getRemoteStream(sessionId);
|
|
6757
6757
|
const pc = this.getPeerConnection(sessionId);
|
|
6758
6758
|
|
|
6759
|
-
logger
|
|
6759
|
+
logger.info('Updating remote stream', {
|
|
6760
6760
|
sessionId,
|
|
6761
6761
|
tracks: remoteStream ? remoteStream.getTracks() : null,
|
|
6762
6762
|
receiverTracks: pc && pc.getReceivers ? pc.getReceivers().map(receiver => receiver.track) : null,
|
|
@@ -6781,14 +6781,16 @@ class WebRTCClient extends Emitter {
|
|
|
6781
6781
|
const screenSharing = constraints && 'screen' in constraints ? constraints.screen : false;
|
|
6782
6782
|
const isDesktop = constraints && 'desktop' in constraints ? constraints.desktop : false;
|
|
6783
6783
|
const withAudio = constraints && 'audio' in constraints ? constraints.audio : true;
|
|
6784
|
+
const mandatoryVideo = constraints && typeof constraints.video === 'object' ? constraints.video.mandatory : {};
|
|
6784
6785
|
|
|
6785
|
-
logger
|
|
6786
|
+
logger.info('Retrieving media a configuration', { enableVideo, screenSharing, isDesktop, withAudio, constraints });
|
|
6786
6787
|
|
|
6787
6788
|
return {
|
|
6788
6789
|
constraints: {
|
|
6789
6790
|
// Exact constraint are not supported with `getDisplayMedia` and we must have a video=false in desktop screenshare
|
|
6790
6791
|
audio: screenSharing ? !isDesktop : (withAudio ? this._getAudioConstraints() : false),
|
|
6791
|
-
video: screenSharing ? (isDesktop
|
|
6792
|
+
video: screenSharing ? (isDesktop
|
|
6793
|
+
? ({ mandatory: { chromeMediaSource: 'desktop', ...(mandatoryVideo || {}) } }) : { cursor: 'always' })
|
|
6792
6794
|
: this._getVideoConstraints(enableVideo),
|
|
6793
6795
|
screen: screenSharing,
|
|
6794
6796
|
desktop: isDesktop,
|
|
@@ -6831,7 +6833,7 @@ class WebRTCClient extends Emitter {
|
|
|
6831
6833
|
}
|
|
6832
6834
|
|
|
6833
6835
|
_onTransportError() {
|
|
6834
|
-
logger
|
|
6836
|
+
logger.error('on transport error');
|
|
6835
6837
|
this.eventEmitter.emit(TRANSPORT_ERROR);
|
|
6836
6838
|
this.attemptReconnection();
|
|
6837
6839
|
}
|
|
@@ -6840,7 +6842,7 @@ class WebRTCClient extends Emitter {
|
|
|
6840
6842
|
const body = message && typeof message === 'object' ? message.data : message;
|
|
6841
6843
|
if (body && body.indexOf('200 OK') !== -1) {
|
|
6842
6844
|
if (this.hasHeartbeat()) {
|
|
6843
|
-
logger
|
|
6845
|
+
logger.info('on heartbeat received from Asterisk', { hasHeartbeat: this.hasHeartbeat() });
|
|
6844
6846
|
|
|
6845
6847
|
this.heartbeat.onHeartbeat();
|
|
6846
6848
|
if (this.heartbeatCb) {
|
|
@@ -6851,7 +6853,7 @@ class WebRTCClient extends Emitter {
|
|
|
6851
6853
|
}
|
|
6852
6854
|
|
|
6853
6855
|
async _onHeartbeatTimeout() {
|
|
6854
|
-
logger
|
|
6856
|
+
logger.info('sdk webrtc heartbeat timed out', { userAgent: !!this.userAgent, cb: !!this.heartbeatTimeoutCb });
|
|
6855
6857
|
|
|
6856
6858
|
if (this.heartbeatTimeoutCb) {
|
|
6857
6859
|
this.heartbeatTimeoutCb();
|
|
@@ -6863,7 +6865,7 @@ class WebRTCClient extends Emitter {
|
|
|
6863
6865
|
try {
|
|
6864
6866
|
await this.userAgent.transport.disconnect();
|
|
6865
6867
|
} catch (e) {
|
|
6866
|
-
logger
|
|
6868
|
+
logger.error('Transport disconnection after heartbeat timeout, error', e);
|
|
6867
6869
|
}
|
|
6868
6870
|
}
|
|
6869
6871
|
|
|
@@ -6896,31 +6898,31 @@ class WebRTCClient extends Emitter {
|
|
|
6896
6898
|
}
|
|
6897
6899
|
|
|
6898
6900
|
_connectIfNeeded() {
|
|
6899
|
-
logger
|
|
6901
|
+
logger.info('connect if needed, checking', { connected: this.isConnected() });
|
|
6900
6902
|
if (!this.userAgent) {
|
|
6901
|
-
logger
|
|
6903
|
+
logger.info('need to recreate User Agent');
|
|
6902
6904
|
this.userAgent = this.createUserAgent(this.uaConfigOverrides);
|
|
6903
6905
|
}
|
|
6904
6906
|
|
|
6905
6907
|
if (this.isConnected()) {
|
|
6906
|
-
logger
|
|
6908
|
+
logger.info('webrtc sdk, already connected');
|
|
6907
6909
|
return Promise.resolve();
|
|
6908
6910
|
}
|
|
6909
6911
|
|
|
6910
6912
|
if (this.isConnecting()) {
|
|
6911
|
-
logger
|
|
6913
|
+
logger.info('webrtc sdk, already connecting...');
|
|
6912
6914
|
|
|
6913
6915
|
this.connectionPromise = this.userAgent.transport.connectPromise;
|
|
6914
6916
|
return this.connectionPromise;
|
|
6915
6917
|
}
|
|
6916
6918
|
|
|
6917
6919
|
if (this.connectionPromise) {
|
|
6918
|
-
logger
|
|
6920
|
+
logger.info('webrtc sdk, connection promise connecting...');
|
|
6919
6921
|
// $FlowFixMe
|
|
6920
6922
|
return this.connectionPromise;
|
|
6921
6923
|
}
|
|
6922
6924
|
|
|
6923
|
-
logger
|
|
6925
|
+
logger.info('WebRTC UA needs to connect');
|
|
6924
6926
|
|
|
6925
6927
|
// Force UA to reconnect
|
|
6926
6928
|
if (this.userAgent && this.userAgent.state !== UserAgentState.Stopped) {
|
|
@@ -7045,7 +7047,7 @@ class WebRTCClient extends Emitter {
|
|
|
7045
7047
|
|
|
7046
7048
|
sdh.peerConnectionDelegate = {
|
|
7047
7049
|
onicecandidateerror: (error ) => {
|
|
7048
|
-
logger
|
|
7050
|
+
logger.error('on icecandidate error', {
|
|
7049
7051
|
address: error.address,
|
|
7050
7052
|
port: error.port,
|
|
7051
7053
|
errorCode: error.errorCode,
|
|
@@ -7074,7 +7076,7 @@ class WebRTCClient extends Emitter {
|
|
|
7074
7076
|
updatedNumber = session.assertedIdentity.uri.normal.user;
|
|
7075
7077
|
updatedCalleeName = session.assertedIdentity.displayName || updatedNumber;
|
|
7076
7078
|
}
|
|
7077
|
-
logger
|
|
7079
|
+
logger.info('re-invite received', { updatedCalleeName, updatedNumber, hadRemoteVideo });
|
|
7078
7080
|
|
|
7079
7081
|
// Useful to know if it's a video upgrade or an unhold from a remote peer with a video stream
|
|
7080
7082
|
|
|
@@ -7095,7 +7097,7 @@ class WebRTCClient extends Emitter {
|
|
|
7095
7097
|
}
|
|
7096
7098
|
|
|
7097
7099
|
_onAccepted(session , sessionDialog , withEvent = true) {
|
|
7098
|
-
logger
|
|
7100
|
+
logger.info('on call accepted', { id: session.id, remoteTag: session.remoteTag });
|
|
7099
7101
|
|
|
7100
7102
|
this.storeSipSession(session);
|
|
7101
7103
|
|
|
@@ -7107,7 +7109,7 @@ class WebRTCClient extends Emitter {
|
|
|
7107
7109
|
const onTrack = (event ) => {
|
|
7108
7110
|
const isAudioOnly = this._isAudioOnly(session);
|
|
7109
7111
|
const { kind, label, readyState, id, muted } = event.track;
|
|
7110
|
-
logger
|
|
7112
|
+
logger.info('on track event', { isAudioOnly, kind, label, readyState, id, muted });
|
|
7111
7113
|
|
|
7112
7114
|
// Stop video track in audio only mode
|
|
7113
7115
|
if (isAudioOnly && kind === 'video') {
|
|
@@ -7123,12 +7125,14 @@ class WebRTCClient extends Emitter {
|
|
|
7123
7125
|
|
|
7124
7126
|
session.sessionDescriptionHandler.remoteMediaStream.onaddtrack = onTrack;
|
|
7125
7127
|
|
|
7126
|
-
|
|
7127
|
-
|
|
7128
|
-
|
|
7129
|
-
|
|
7130
|
-
|
|
7131
|
-
|
|
7128
|
+
if (pc) {
|
|
7129
|
+
pc.oniceconnectionstatechange = () => {
|
|
7130
|
+
logger.info('on ice connection state changed', { state: pc.iceConnectionState });
|
|
7131
|
+
if (pc.iceConnectionState === 'disconnected') {
|
|
7132
|
+
this.eventEmitter.emit(ON_DISCONNECTED);
|
|
7133
|
+
}
|
|
7134
|
+
};
|
|
7135
|
+
}
|
|
7132
7136
|
|
|
7133
7137
|
if (withEvent) {
|
|
7134
7138
|
this.eventEmitter.emit(ACCEPTED, session, sessionDialog);
|
|
@@ -7297,10 +7301,10 @@ class WebRTCClient extends Emitter {
|
|
|
7297
7301
|
|
|
7298
7302
|
_stopSendingStats(session ) {
|
|
7299
7303
|
const sessionId = this.getSipSessionId(session);
|
|
7300
|
-
logger
|
|
7304
|
+
logger.trace('Check for stopping stats', { sessionId, ids: Object.keys(this.statsIntervals) });
|
|
7301
7305
|
|
|
7302
7306
|
if (sessionId in this.statsIntervals) {
|
|
7303
|
-
logger
|
|
7307
|
+
logger.trace('Stop sending stats for call', { sessionId });
|
|
7304
7308
|
this.statsIntervals[sessionId]();
|
|
7305
7309
|
delete this.statsIntervals[sessionId];
|
|
7306
7310
|
}
|
|
@@ -7316,7 +7320,7 @@ class WebRTCClient extends Emitter {
|
|
|
7316
7320
|
try {
|
|
7317
7321
|
await this.userAgent.transport.disconnect();
|
|
7318
7322
|
} catch (e) {
|
|
7319
|
-
logger
|
|
7323
|
+
logger.error('WebRTC transport disconnect, error', e);
|
|
7320
7324
|
}
|
|
7321
7325
|
}
|
|
7322
7326
|
}
|
|
@@ -7338,13 +7342,17 @@ class WebRTCClient extends Emitter {
|
|
|
7338
7342
|
const nbStats = this.sessionNetworkStats[sessionId].length;
|
|
7339
7343
|
const lastNetworkStats = this.sessionNetworkStats[sessionId][nbStats - 1];
|
|
7340
7344
|
const lastAudioSent = lastNetworkStats ? lastNetworkStats.audioBytesSent : 0;
|
|
7345
|
+
const lastAudioContentSent = lastNetworkStats ? lastNetworkStats.audioContentSent : 0;
|
|
7341
7346
|
const lastVideoSent = lastNetworkStats ? lastNetworkStats.videoBytesSent : 0;
|
|
7342
7347
|
const lastAudioReceived = lastNetworkStats ? lastNetworkStats.audioBytesReceived : 0;
|
|
7348
|
+
const lastAudioContentReceived = lastNetworkStats ? lastNetworkStats.audioContentReceived : 0;
|
|
7343
7349
|
const lastVideoReceived = lastNetworkStats ? lastNetworkStats.videoBytesReceived : 0;
|
|
7344
7350
|
const lastTransportSent = lastNetworkStats ? lastNetworkStats.transportSent : 0;
|
|
7345
7351
|
const lastTransportReceived = lastNetworkStats ? lastNetworkStats.transportReceived : 0;
|
|
7346
|
-
let audioBytesSent = 0;
|
|
7347
|
-
let audioBytesReceived = 0;
|
|
7352
|
+
let audioBytesSent = 0; // content + header
|
|
7353
|
+
let audioBytesReceived = 0; // content + header
|
|
7354
|
+
let audioContentSent = 0; // useful to detect blank call
|
|
7355
|
+
let audioContentReceived = 0;
|
|
7348
7356
|
let videoBytesSent = 0;
|
|
7349
7357
|
let videoBytesReceived = 0;
|
|
7350
7358
|
let transportSent = 0;
|
|
@@ -7354,6 +7362,7 @@ class WebRTCClient extends Emitter {
|
|
|
7354
7362
|
stats.forEach(report => {
|
|
7355
7363
|
if (report.type === 'outbound-rtp' && report.kind === 'audio') {
|
|
7356
7364
|
audioBytesSent += Number(report.bytesSent) + Number(report.headerBytesSent);
|
|
7365
|
+
audioContentSent += Number(report.bytesSent);
|
|
7357
7366
|
}
|
|
7358
7367
|
if (report.type === 'remote-outbound-rtp' && report.kind === 'audio') {
|
|
7359
7368
|
audioBytesSent += Number(report.bytesSent);
|
|
@@ -7365,6 +7374,7 @@ class WebRTCClient extends Emitter {
|
|
|
7365
7374
|
packetsLost += Number(report.packetsLost);
|
|
7366
7375
|
networkStats.packetsReceived = Number(report.packetsReceived);
|
|
7367
7376
|
audioBytesReceived += Number(report.bytesReceived) + Number(report.headerBytesReceived);
|
|
7377
|
+
audioContentReceived += Number(report.bytesReceived);
|
|
7368
7378
|
}
|
|
7369
7379
|
if (report.type === 'inbound-rtp' && report.kind === 'video') {
|
|
7370
7380
|
videoBytesReceived += Number(report.bytesReceived) + Number(report.headerBytesReceived);
|
|
@@ -7393,10 +7403,17 @@ class WebRTCClient extends Emitter {
|
|
|
7393
7403
|
});
|
|
7394
7404
|
|
|
7395
7405
|
networkStats.packetsLost = packetsLost;
|
|
7406
|
+
|
|
7396
7407
|
networkStats.totalAudioBytesSent = audioBytesSent;
|
|
7397
7408
|
networkStats.audioBytesSent = audioBytesSent - lastAudioSent;
|
|
7398
7409
|
networkStats.totalAudioBytesReceived = audioBytesReceived - lastAudioReceived;
|
|
7399
7410
|
networkStats.audioBytesReceived = audioBytesReceived;
|
|
7411
|
+
|
|
7412
|
+
networkStats.totalAudioContentSent = audioContentSent;
|
|
7413
|
+
networkStats.audioContentSent = audioContentSent - lastAudioContentSent;
|
|
7414
|
+
networkStats.totalAudioBytesReceived = audioContentReceived - lastAudioContentReceived;
|
|
7415
|
+
networkStats.audioContentReceived = audioContentReceived;
|
|
7416
|
+
|
|
7400
7417
|
networkStats.totalVideoBytesSent = videoBytesSent;
|
|
7401
7418
|
networkStats.videoBytesSent = videoBytesSent - lastVideoSent;
|
|
7402
7419
|
networkStats.totalVideoBytesReceived = videoBytesReceived;
|