@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/lib/web-rtc-client.js
CHANGED
|
@@ -111,7 +111,7 @@ const isMobile = () => typeof navigator !== 'undefined' && navigator.product ===
|
|
|
111
111
|
|
|
112
112
|
const methods = ['head', 'get', 'post', 'put', 'delete'];
|
|
113
113
|
|
|
114
|
-
const logger = IssueReporter$1 ? IssueReporter$1.loggerFor('api') : console;
|
|
114
|
+
const logger$2 = IssueReporter$1 ? IssueReporter$1.loggerFor('api') : console;
|
|
115
115
|
|
|
116
116
|
// Use a function here to be able to mock it in tests
|
|
117
117
|
const realFetch = () => {
|
|
@@ -250,7 +250,7 @@ class ApiRequester {
|
|
|
250
250
|
};
|
|
251
251
|
|
|
252
252
|
if (this.refreshTokenPromise) {
|
|
253
|
-
logger.info('A token is already refreshing, waiting ...', { url });
|
|
253
|
+
logger$2.info('A token is already refreshing, waiting ...', { url });
|
|
254
254
|
await this.refreshTokenPromise;
|
|
255
255
|
}
|
|
256
256
|
|
|
@@ -270,7 +270,7 @@ class ApiRequester {
|
|
|
270
270
|
return promise.then(async (err ) => {
|
|
271
271
|
// Check if the token is still valid
|
|
272
272
|
if (firstCall && this._checkTokenExpired(response, err)) {
|
|
273
|
-
logger.warn('token expired', { error: err.reason });
|
|
273
|
+
logger$2.warn('token expired', { error: err.reason });
|
|
274
274
|
// Replay the call after refreshing the token
|
|
275
275
|
return this._replayWithNewToken(err, path, method, body, headers, parse);
|
|
276
276
|
}
|
|
@@ -280,7 +280,7 @@ class ApiRequester {
|
|
|
280
280
|
: exceptionClass.fromResponse(err, response.status);
|
|
281
281
|
|
|
282
282
|
if (this.shouldLogErrors) {
|
|
283
|
-
logger.error('API error', error);
|
|
283
|
+
logger$2.error('API error', error);
|
|
284
284
|
}
|
|
285
285
|
|
|
286
286
|
throw error;
|
|
@@ -290,7 +290,7 @@ class ApiRequester {
|
|
|
290
290
|
return newParse(response, isJson);
|
|
291
291
|
}).catch(error => {
|
|
292
292
|
if (this.shouldLogErrors) {
|
|
293
|
-
logger.error('Fetch failed', { url, options, message: error.message, stack: error.stack });
|
|
293
|
+
logger$2.error('Fetch failed', { url, options, message: error.message, stack: error.stack });
|
|
294
294
|
}
|
|
295
295
|
|
|
296
296
|
throw error;
|
|
@@ -318,13 +318,13 @@ class ApiRequester {
|
|
|
318
318
|
) {
|
|
319
319
|
const isTokenNotFound = this._isTokenNotFound(err);
|
|
320
320
|
let newPath = path;
|
|
321
|
-
logger.info('refreshing token', { inProgress: !!this.refreshTokenPromise });
|
|
321
|
+
logger$2.info('refreshing token', { inProgress: !!this.refreshTokenPromise });
|
|
322
322
|
|
|
323
323
|
this.refreshTokenPromise = this.refreshTokenPromise || this.refreshTokenCallback();
|
|
324
324
|
|
|
325
325
|
return this.refreshTokenPromise.then(() => {
|
|
326
326
|
this.refreshTokenPromise = null;
|
|
327
|
-
logger.info('token refreshed', { isTokenNotFound });
|
|
327
|
+
logger$2.info('token refreshed', { isTokenNotFound });
|
|
328
328
|
if (isTokenNotFound) {
|
|
329
329
|
const pathParts = path.split('/');
|
|
330
330
|
pathParts.pop();
|
|
@@ -4149,7 +4149,7 @@ const TRANSFER_FLOW_BLIND = 'blind';
|
|
|
4149
4149
|
|
|
4150
4150
|
// const MINIMUM_WAZO_ENGINE_VERSION_FOR_CTI_HOLD = '20.11';
|
|
4151
4151
|
|
|
4152
|
-
|
|
4152
|
+
IssueReporter$1 ? IssueReporter$1.loggerFor('cti-phone') : console;
|
|
4153
4153
|
|
|
4154
4154
|
/* */
|
|
4155
4155
|
|
|
@@ -5068,7 +5068,7 @@ const AGENTD_VERSION = '1.0';
|
|
|
5068
5068
|
const WEBHOOKD_VERSION = '1.0';
|
|
5069
5069
|
const AMID_VERSION = '1.0';
|
|
5070
5070
|
|
|
5071
|
-
const logger$
|
|
5071
|
+
const logger$1 = IssueReporter$1 ? IssueReporter$1.loggerFor('api') : console;
|
|
5072
5072
|
|
|
5073
5073
|
class ApiClient {
|
|
5074
5074
|
|
|
@@ -5120,12 +5120,12 @@ class ApiClient {
|
|
|
5120
5120
|
}
|
|
5121
5121
|
|
|
5122
5122
|
async forceRefreshToken() {
|
|
5123
|
-
logger$
|
|
5123
|
+
logger$1.info('forcing refresh token, calling callback');
|
|
5124
5124
|
return this.refreshTokenCallback();
|
|
5125
5125
|
}
|
|
5126
5126
|
|
|
5127
5127
|
async refreshTokenCallback() {
|
|
5128
|
-
logger$
|
|
5128
|
+
logger$1.info('refresh token callback called', {
|
|
5129
5129
|
refreshToken: this.refreshToken,
|
|
5130
5130
|
refreshBackend: this.refreshBackend,
|
|
5131
5131
|
refreshExpiration: this.refreshExpiration,
|
|
@@ -5143,7 +5143,7 @@ class ApiClient {
|
|
|
5143
5143
|
this.isMobile,
|
|
5144
5144
|
);
|
|
5145
5145
|
|
|
5146
|
-
logger$
|
|
5146
|
+
logger$1.info('token refreshed', { token: session.token });
|
|
5147
5147
|
|
|
5148
5148
|
if (this.onRefreshToken) {
|
|
5149
5149
|
this.onRefreshToken(session.token, session);
|
|
@@ -5316,7 +5316,7 @@ const DEFAULT_ICE_TIMEOUT = 3000;
|
|
|
5316
5316
|
const SEND_STATS_DELAY = 5000;
|
|
5317
5317
|
|
|
5318
5318
|
const states = ['STATUS_NULL', 'STATUS_NEW', 'STATUS_CONNECTING', 'STATUS_CONNECTED', 'STATUS_COMPLETED'];
|
|
5319
|
-
const logger
|
|
5319
|
+
const logger = IssueReporter$1 ? IssueReporter$1.loggerFor('webrtc-client') : console;
|
|
5320
5320
|
const statsLogger = IssueReporter$1 ? IssueReporter$1.loggerFor('webrtc-stats') : console;
|
|
5321
5321
|
|
|
5322
5322
|
// events
|
|
@@ -5495,13 +5495,13 @@ class WebRTCClient extends Emitter {
|
|
|
5495
5495
|
|
|
5496
5496
|
createUserAgent(configOverrides ) {
|
|
5497
5497
|
const webRTCConfiguration = this._createWebRTCConfiguration(configOverrides);
|
|
5498
|
-
logger
|
|
5498
|
+
logger.info('sdk webrtc, creating UA', { webRTCConfiguration });
|
|
5499
5499
|
|
|
5500
5500
|
webRTCConfiguration.delegate = {
|
|
5501
5501
|
onConnect: this.onConnect.bind(this),
|
|
5502
5502
|
onDisconnect: this.onDisconnect.bind(this),
|
|
5503
5503
|
onInvite: (invitation ) => {
|
|
5504
|
-
logger
|
|
5504
|
+
logger.info('sdk webrtc on invite', {
|
|
5505
5505
|
method: 'delegate.onInvite',
|
|
5506
5506
|
id: invitation.id,
|
|
5507
5507
|
remoteURI: invitation.remoteURI,
|
|
@@ -5544,7 +5544,7 @@ class WebRTCClient extends Emitter {
|
|
|
5544
5544
|
}
|
|
5545
5545
|
|
|
5546
5546
|
onConnect() {
|
|
5547
|
-
logger
|
|
5547
|
+
logger.info('sdk webrtc connected', { method: 'delegate.onConnect' });
|
|
5548
5548
|
this.eventEmitter.emit(CONNECTED);
|
|
5549
5549
|
if (!this.isRegistered() && this.registerer && this.registerer.waiting) {
|
|
5550
5550
|
this.registerer.waitingToggle(false);
|
|
@@ -5553,7 +5553,7 @@ class WebRTCClient extends Emitter {
|
|
|
5553
5553
|
}
|
|
5554
5554
|
|
|
5555
5555
|
async onDisconnect(error ) {
|
|
5556
|
-
logger
|
|
5556
|
+
logger.info('sdk webrtc disconnected', { method: 'delegate.onConnect', error });
|
|
5557
5557
|
this.connectionPromise = null;
|
|
5558
5558
|
// The UA will attempt to reconnect automatically when an error occurred
|
|
5559
5559
|
this.eventEmitter.emit(DISCONNECTED, error);
|
|
@@ -5578,37 +5578,37 @@ class WebRTCClient extends Emitter {
|
|
|
5578
5578
|
};
|
|
5579
5579
|
|
|
5580
5580
|
if (this.skipRegister) {
|
|
5581
|
-
logger
|
|
5581
|
+
logger.info('sdk webrtc skip register...', logInfo);
|
|
5582
5582
|
return Promise.resolve();
|
|
5583
5583
|
}
|
|
5584
5584
|
|
|
5585
|
-
logger
|
|
5585
|
+
logger.info('sdk webrtc registering...', logInfo);
|
|
5586
5586
|
|
|
5587
5587
|
if (!this.userAgent) {
|
|
5588
|
-
logger
|
|
5588
|
+
logger.info('sdk webrtc recreating User Agent');
|
|
5589
5589
|
this.userAgent = this.createUserAgent(this.uaConfigOverrides);
|
|
5590
5590
|
}
|
|
5591
5591
|
if (!this.userAgent || this.isRegistered()) {
|
|
5592
|
-
logger
|
|
5592
|
+
logger.info('sdk webrtc registering aborted, already registered or no UA can be created');
|
|
5593
5593
|
return Promise.resolve();
|
|
5594
5594
|
}
|
|
5595
5595
|
|
|
5596
5596
|
if (this.connectionPromise || (this.registerer && this.registerer.waiting)) {
|
|
5597
|
-
logger
|
|
5597
|
+
logger.info('sdk webrtc registering aborted due to a registration in progress.');
|
|
5598
5598
|
return Promise.resolve();
|
|
5599
5599
|
}
|
|
5600
5600
|
|
|
5601
5601
|
const registerOptions = this._isWeb() ? {} : { extraContactHeaderParams: ['mobility=mobile'] };
|
|
5602
5602
|
|
|
5603
5603
|
const onRegisterFailed = () => {
|
|
5604
|
-
logger
|
|
5604
|
+
logger.info('sdk webrtc registering failed', { tries, registerer: !!this.registerer });
|
|
5605
5605
|
this.connectionPromise = null;
|
|
5606
5606
|
if (this.registerer && this.registerer.waiting) {
|
|
5607
5607
|
this.registerer.waitingToggle(false);
|
|
5608
5608
|
}
|
|
5609
5609
|
|
|
5610
5610
|
if (tries <= MAX_REGISTER_TRIES) {
|
|
5611
|
-
logger
|
|
5611
|
+
logger.info('sdk webrtc registering, retrying...', { tries });
|
|
5612
5612
|
setTimeout(() => this.register(tries + 1), 300);
|
|
5613
5613
|
}
|
|
5614
5614
|
};
|
|
@@ -5617,18 +5617,18 @@ class WebRTCClient extends Emitter {
|
|
|
5617
5617
|
// Avoid race condition with the close method called just before register and setting userAgent to null
|
|
5618
5618
|
// during the resolution of the primise.
|
|
5619
5619
|
if (!this.userAgent) {
|
|
5620
|
-
logger
|
|
5620
|
+
logger.info('sdk webrtc recreating User Agent after connection');
|
|
5621
5621
|
this.userAgent = this.createUserAgent(this.uaConfigOverrides);
|
|
5622
5622
|
}
|
|
5623
5623
|
|
|
5624
|
-
logger
|
|
5624
|
+
logger.info('sdk webrtc registering, transport connected', { registerOptions, ua: !!this.userAgent });
|
|
5625
5625
|
this.registerer = new registerer.Registerer(this.userAgent, registerOptions);
|
|
5626
5626
|
this.connectionPromise = null;
|
|
5627
5627
|
this._monkeyPatchRegisterer(this.registerer);
|
|
5628
5628
|
|
|
5629
5629
|
// Bind registerer events
|
|
5630
5630
|
this.registerer.stateChange.addListener(newState => {
|
|
5631
|
-
logger
|
|
5631
|
+
logger.info('sdk webrtc registering, state changed', { newState });
|
|
5632
5632
|
|
|
5633
5633
|
if (newState === registererState.RegistererState.Registered && this.registerer
|
|
5634
5634
|
&& this.registerer.state === registererState.RegistererState.Registered) {
|
|
@@ -5641,7 +5641,7 @@ class WebRTCClient extends Emitter {
|
|
|
5641
5641
|
const options = {
|
|
5642
5642
|
requestDelegate: {
|
|
5643
5643
|
onReject: response => {
|
|
5644
|
-
logger
|
|
5644
|
+
logger.error('sdk webrtc registering, rejected', { response });
|
|
5645
5645
|
|
|
5646
5646
|
onRegisterFailed();
|
|
5647
5647
|
},
|
|
@@ -5649,13 +5649,13 @@ class WebRTCClient extends Emitter {
|
|
|
5649
5649
|
};
|
|
5650
5650
|
|
|
5651
5651
|
return this.registerer.register(options).catch((e) => {
|
|
5652
|
-
logger
|
|
5652
|
+
logger.error('sdk webrtc registering, error', e);
|
|
5653
5653
|
|
|
5654
5654
|
this.eventEmitter.emit(REGISTRATION_FAILED);
|
|
5655
5655
|
return e;
|
|
5656
5656
|
});
|
|
5657
5657
|
}).catch(error => {
|
|
5658
|
-
logger
|
|
5658
|
+
logger.error('sdk webrtc registering, transport error', error);
|
|
5659
5659
|
onRegisterFailed();
|
|
5660
5660
|
});
|
|
5661
5661
|
}
|
|
@@ -5684,21 +5684,21 @@ class WebRTCClient extends Emitter {
|
|
|
5684
5684
|
}
|
|
5685
5685
|
|
|
5686
5686
|
unregister() {
|
|
5687
|
-
logger
|
|
5687
|
+
logger.info('sdk webrtc unregistering..', { userAgent: !!this.userAgent, registerer: !!this.registerer });
|
|
5688
5688
|
if (!this.registerer) {
|
|
5689
5689
|
return Promise.resolve();
|
|
5690
5690
|
}
|
|
5691
5691
|
|
|
5692
5692
|
try {
|
|
5693
5693
|
return this.registerer.unregister().then(() => {
|
|
5694
|
-
logger
|
|
5694
|
+
logger.info('sdk webrtc unregistered');
|
|
5695
5695
|
this._cleanupRegister();
|
|
5696
5696
|
}).catch(e => {
|
|
5697
|
-
logger
|
|
5697
|
+
logger.error('sdk webrtc unregistering, promise error', e);
|
|
5698
5698
|
this._cleanupRegister();
|
|
5699
5699
|
});
|
|
5700
5700
|
} catch (e) {
|
|
5701
|
-
logger
|
|
5701
|
+
logger.error('sdk webrtc unregistering, error', e);
|
|
5702
5702
|
// Avoid issue with `undefined is not an object (evaluating 'new.target.prototype')` when triggering a new
|
|
5703
5703
|
// error when the registerer is in a bad state
|
|
5704
5704
|
this._cleanupRegister();
|
|
@@ -5706,7 +5706,7 @@ class WebRTCClient extends Emitter {
|
|
|
5706
5706
|
}
|
|
5707
5707
|
|
|
5708
5708
|
stop() {
|
|
5709
|
-
logger
|
|
5709
|
+
logger.info('sdk webrtc stop', { userAgent: !!this.userAgent });
|
|
5710
5710
|
if (!this.userAgent) {
|
|
5711
5711
|
return Promise.resolve();
|
|
5712
5712
|
}
|
|
@@ -5714,12 +5714,12 @@ class WebRTCClient extends Emitter {
|
|
|
5714
5714
|
return this.userAgent.stop().then(() => {
|
|
5715
5715
|
return this._cleanupRegister();
|
|
5716
5716
|
}).catch(e => {
|
|
5717
|
-
logger
|
|
5717
|
+
logger.warn('sdk webrtc stop, error', { message: e.message, stack: e.stack });
|
|
5718
5718
|
});
|
|
5719
5719
|
}
|
|
5720
5720
|
|
|
5721
5721
|
call(number , enableVideo , audioOnly = false, conference = false) {
|
|
5722
|
-
logger
|
|
5722
|
+
logger.info('sdk webrtc creating call', { number, enableVideo, audioOnly, conference });
|
|
5723
5723
|
const inviterOptions = {
|
|
5724
5724
|
sessionDescriptionHandlerOptionsReInvite: {
|
|
5725
5725
|
conference,
|
|
@@ -5750,7 +5750,7 @@ class WebRTCClient extends Emitter {
|
|
|
5750
5750
|
this._onAccepted(session, response.session, true);
|
|
5751
5751
|
},
|
|
5752
5752
|
onReject: (response ) => {
|
|
5753
|
-
logger
|
|
5753
|
+
logger.info('on call rejected', { id: session.id, fromTag: session.fromTag });
|
|
5754
5754
|
this._stopSendingStats(session);
|
|
5755
5755
|
this.stopNetworkMonitoring(session);
|
|
5756
5756
|
|
|
@@ -5773,11 +5773,11 @@ class WebRTCClient extends Emitter {
|
|
|
5773
5773
|
}
|
|
5774
5774
|
|
|
5775
5775
|
answer(session , enableVideo ) {
|
|
5776
|
-
logger
|
|
5776
|
+
logger.info('sdk webrtc answer call', { id: session.id, enableVideo });
|
|
5777
5777
|
|
|
5778
5778
|
if (!session || !session.accept) {
|
|
5779
5779
|
const error = 'No session to answer, or not an invitation';
|
|
5780
|
-
logger
|
|
5780
|
+
logger.warn(error);
|
|
5781
5781
|
return Promise.reject(new Error(error));
|
|
5782
5782
|
}
|
|
5783
5783
|
const options = {
|
|
@@ -5787,15 +5787,15 @@ class WebRTCClient extends Emitter {
|
|
|
5787
5787
|
return session.accept(options).then(() => {
|
|
5788
5788
|
if (session.isCanceled) {
|
|
5789
5789
|
const message = 'accepted a canceled session (or was canceled during the accept phase).';
|
|
5790
|
-
logger
|
|
5790
|
+
logger.error(message, { id: session.id });
|
|
5791
5791
|
this.onCallEnded(session);
|
|
5792
5792
|
|
|
5793
5793
|
throw new CanceledCallError(message);
|
|
5794
5794
|
}
|
|
5795
|
-
logger
|
|
5795
|
+
logger.info('sdk webrtc answer, accepted.');
|
|
5796
5796
|
this._onAccepted(session);
|
|
5797
5797
|
}).catch(e => {
|
|
5798
|
-
logger
|
|
5798
|
+
logger.error(`answer call error for ${session ? session.id : 'n/a'}`, e);
|
|
5799
5799
|
|
|
5800
5800
|
throw e;
|
|
5801
5801
|
});
|
|
@@ -5803,7 +5803,7 @@ class WebRTCClient extends Emitter {
|
|
|
5803
5803
|
|
|
5804
5804
|
hangup(session ) {
|
|
5805
5805
|
const { state, id } = session;
|
|
5806
|
-
logger
|
|
5806
|
+
logger.info('sdk webrtc hangup call', { id, state });
|
|
5807
5807
|
|
|
5808
5808
|
try {
|
|
5809
5809
|
this._stopSendingStats(session);
|
|
@@ -5832,7 +5832,7 @@ class WebRTCClient extends Emitter {
|
|
|
5832
5832
|
|
|
5833
5833
|
return bye();
|
|
5834
5834
|
} catch (error) {
|
|
5835
|
-
logger
|
|
5835
|
+
logger.warn('sdk webrtc hangup, error', error);
|
|
5836
5836
|
}
|
|
5837
5837
|
|
|
5838
5838
|
return null;
|
|
@@ -5850,7 +5850,7 @@ class WebRTCClient extends Emitter {
|
|
|
5850
5850
|
// Fetch and emit an event at `interval` with session network stats
|
|
5851
5851
|
startNetworkMonitoring(session , interval = 1000) {
|
|
5852
5852
|
const sessionId = this.getSipSessionId(session);
|
|
5853
|
-
logger
|
|
5853
|
+
logger.info('starting network inspection', { id: sessionId });
|
|
5854
5854
|
|
|
5855
5855
|
this.sessionNetworkStats[sessionId] = [];
|
|
5856
5856
|
|
|
@@ -5860,7 +5860,7 @@ class WebRTCClient extends Emitter {
|
|
|
5860
5860
|
stopNetworkMonitoring(session ) {
|
|
5861
5861
|
const sessionId = this.getSipSessionId(session);
|
|
5862
5862
|
const exists = sessionId in this.networkMonitoringInterval;
|
|
5863
|
-
logger
|
|
5863
|
+
logger.info('stopping network inspection', { id: sessionId, exists });
|
|
5864
5864
|
|
|
5865
5865
|
if (exists) {
|
|
5866
5866
|
clearInterval(this.networkMonitoringInterval[sessionId]);
|
|
@@ -5870,17 +5870,17 @@ class WebRTCClient extends Emitter {
|
|
|
5870
5870
|
}
|
|
5871
5871
|
|
|
5872
5872
|
reject(session ) {
|
|
5873
|
-
logger
|
|
5873
|
+
logger.info('sdk webrtc reject call', { id: session.id });
|
|
5874
5874
|
|
|
5875
5875
|
try {
|
|
5876
5876
|
return session.reject ? session.reject() : session.cancel();
|
|
5877
5877
|
} catch (e) {
|
|
5878
|
-
logger
|
|
5878
|
+
logger.warn('Error when rejecting call', e.message, e.stack);
|
|
5879
5879
|
}
|
|
5880
5880
|
}
|
|
5881
5881
|
|
|
5882
5882
|
async close() {
|
|
5883
|
-
logger
|
|
5883
|
+
logger.info('sdk webrtc closing client', { userAgent: !!this.userAgent });
|
|
5884
5884
|
this._cleanupMedia();
|
|
5885
5885
|
this.connectionPromise = null;
|
|
5886
5886
|
|
|
@@ -5911,7 +5911,7 @@ class WebRTCClient extends Emitter {
|
|
|
5911
5911
|
// eg: "INVITE not rejectable in state Completed"
|
|
5912
5912
|
}
|
|
5913
5913
|
this.userAgent = null;
|
|
5914
|
-
logger
|
|
5914
|
+
logger.info('sdk webrtc client closed');
|
|
5915
5915
|
}
|
|
5916
5916
|
|
|
5917
5917
|
getNumber(session ) {
|
|
@@ -5924,13 +5924,13 @@ class WebRTCClient extends Emitter {
|
|
|
5924
5924
|
}
|
|
5925
5925
|
|
|
5926
5926
|
mute(session ) {
|
|
5927
|
-
logger
|
|
5927
|
+
logger.info('sdk webrtc mute', { id: session.id });
|
|
5928
5928
|
|
|
5929
5929
|
this._toggleAudio(session, true);
|
|
5930
5930
|
}
|
|
5931
5931
|
|
|
5932
5932
|
unmute(session ) {
|
|
5933
|
-
logger
|
|
5933
|
+
logger.info('sdk webrtc unmute', { id: session.id });
|
|
5934
5934
|
|
|
5935
5935
|
this._toggleAudio(session, false);
|
|
5936
5936
|
}
|
|
@@ -5970,13 +5970,13 @@ class WebRTCClient extends Emitter {
|
|
|
5970
5970
|
}
|
|
5971
5971
|
|
|
5972
5972
|
toggleCameraOn(session ) {
|
|
5973
|
-
logger
|
|
5973
|
+
logger.info('sdk webrtc toggle camera on', { id: session.id });
|
|
5974
5974
|
|
|
5975
5975
|
this._toggleVideo(session, false);
|
|
5976
5976
|
}
|
|
5977
5977
|
|
|
5978
5978
|
toggleCameraOff(session ) {
|
|
5979
|
-
logger
|
|
5979
|
+
logger.info('sdk webrtc toggle camera off', { id: session.id });
|
|
5980
5980
|
|
|
5981
5981
|
this._toggleVideo(session, true);
|
|
5982
5982
|
}
|
|
@@ -5985,7 +5985,7 @@ class WebRTCClient extends Emitter {
|
|
|
5985
5985
|
const sessionId = this.getSipSessionId(session);
|
|
5986
5986
|
const hasVideo = hadVideo || this.hasLocalVideo(sessionId);
|
|
5987
5987
|
|
|
5988
|
-
logger
|
|
5988
|
+
logger.info('sdk webrtc hold', {
|
|
5989
5989
|
sessionId,
|
|
5990
5990
|
keys: Object.keys(this.heldSessions),
|
|
5991
5991
|
pendingReinvite: !!session.pendingReinvite,
|
|
@@ -6034,7 +6034,7 @@ class WebRTCClient extends Emitter {
|
|
|
6034
6034
|
const sessionId = this.getSipSessionId(session);
|
|
6035
6035
|
const hasVideo = sessionId in this.heldSessions && this.heldSessions[sessionId].hasVideo;
|
|
6036
6036
|
|
|
6037
|
-
logger
|
|
6037
|
+
logger.info('sdk webrtc unhold', {
|
|
6038
6038
|
sessionId,
|
|
6039
6039
|
keys: Object.keys(this.heldSessions),
|
|
6040
6040
|
pendingReinvite: !!session.pendingReinvite,
|
|
@@ -6182,7 +6182,7 @@ class WebRTCClient extends Emitter {
|
|
|
6182
6182
|
if (!session.sessionDescriptionHandler) {
|
|
6183
6183
|
return;
|
|
6184
6184
|
}
|
|
6185
|
-
logger
|
|
6185
|
+
logger.info('Sending DTMF', {
|
|
6186
6186
|
id: this.getSipSessionId(session),
|
|
6187
6187
|
tone,
|
|
6188
6188
|
});
|
|
@@ -6198,7 +6198,7 @@ class WebRTCClient extends Emitter {
|
|
|
6198
6198
|
transfer(session , target ) {
|
|
6199
6199
|
this.hold(session);
|
|
6200
6200
|
|
|
6201
|
-
logger
|
|
6201
|
+
logger.info('Transfering a session', {
|
|
6202
6202
|
id: this.getSipSessionId(session),
|
|
6203
6203
|
target,
|
|
6204
6204
|
});
|
|
@@ -6220,17 +6220,17 @@ class WebRTCClient extends Emitter {
|
|
|
6220
6220
|
atxfer(session ) {
|
|
6221
6221
|
this.hold(session);
|
|
6222
6222
|
|
|
6223
|
-
logger
|
|
6223
|
+
logger.info('webrtc transfer started', { id: this.getSipSessionId(session) });
|
|
6224
6224
|
|
|
6225
6225
|
const result = {
|
|
6226
6226
|
newSession: null,
|
|
6227
6227
|
init: async (target ) => {
|
|
6228
|
-
logger
|
|
6228
|
+
logger.info('webrtc transfer initialized', { id: this.getSipSessionId(session), target });
|
|
6229
6229
|
|
|
6230
6230
|
result.newSession = await this.call(target);
|
|
6231
6231
|
},
|
|
6232
6232
|
complete: () => {
|
|
6233
|
-
logger
|
|
6233
|
+
logger.info('webrtc transfer completed', {
|
|
6234
6234
|
id: this.getSipSessionId(session),
|
|
6235
6235
|
referId: this.getSipSessionId(result.newSession),
|
|
6236
6236
|
});
|
|
@@ -6251,7 +6251,7 @@ class WebRTCClient extends Emitter {
|
|
|
6251
6251
|
return;
|
|
6252
6252
|
}
|
|
6253
6253
|
|
|
6254
|
-
logger
|
|
6254
|
+
logger.info('send WebRTC message', { sipId: sipSession.id, contentType });
|
|
6255
6255
|
|
|
6256
6256
|
try {
|
|
6257
6257
|
sipSession.message({
|
|
@@ -6293,7 +6293,7 @@ class WebRTCClient extends Emitter {
|
|
|
6293
6293
|
}
|
|
6294
6294
|
|
|
6295
6295
|
changeAudioOutputVolume(volume ) {
|
|
6296
|
-
logger
|
|
6296
|
+
logger.info('Changing audio output volume', { volume });
|
|
6297
6297
|
|
|
6298
6298
|
Object.values(this.audioElements).forEach(audioElement => {
|
|
6299
6299
|
if (audioElement instanceof HTMLAudioElement) {
|
|
@@ -6305,7 +6305,7 @@ class WebRTCClient extends Emitter {
|
|
|
6305
6305
|
}
|
|
6306
6306
|
|
|
6307
6307
|
changeAudioOutputDevice(id ) {
|
|
6308
|
-
logger
|
|
6308
|
+
logger.info('Changing audio output device', { id });
|
|
6309
6309
|
|
|
6310
6310
|
Object.values(this.audioElements).forEach(audioElement => {
|
|
6311
6311
|
// `setSinkId` method is not included in any flow type definitions for HTMLAudioElements but is a valid method
|
|
@@ -6322,7 +6322,7 @@ class WebRTCClient extends Emitter {
|
|
|
6322
6322
|
|
|
6323
6323
|
changeAudioInputDevice(id , session ) {
|
|
6324
6324
|
const currentId = this.getAudioDeviceId();
|
|
6325
|
-
logger
|
|
6325
|
+
logger.info('setting audio input device', { id, currentId, session: !!session });
|
|
6326
6326
|
|
|
6327
6327
|
if (id === currentId) {
|
|
6328
6328
|
return null;
|
|
@@ -6368,7 +6368,7 @@ class WebRTCClient extends Emitter {
|
|
|
6368
6368
|
|
|
6369
6369
|
setVideoInputDevice(id ) {
|
|
6370
6370
|
const currentId = this.getVideoDeviceId();
|
|
6371
|
-
logger
|
|
6371
|
+
logger.info('setting video input device', { id, currentId });
|
|
6372
6372
|
|
|
6373
6373
|
if (id === currentId) {
|
|
6374
6374
|
return null;
|
|
@@ -6393,7 +6393,7 @@ class WebRTCClient extends Emitter {
|
|
|
6393
6393
|
const sessionId = this.getSipSessionId(session);
|
|
6394
6394
|
const localStream = this.getLocalStream(sessionId);
|
|
6395
6395
|
|
|
6396
|
-
logger
|
|
6396
|
+
logger.info('changing video input device', { id, sessionId });
|
|
6397
6397
|
|
|
6398
6398
|
// Release old video stream
|
|
6399
6399
|
if (localStream) {
|
|
@@ -6461,7 +6461,7 @@ class WebRTCClient extends Emitter {
|
|
|
6461
6461
|
const shouldDoScreenSharing = newConstraints && newConstraints.screen;
|
|
6462
6462
|
const desktop = newConstraints && newConstraints.desktop;
|
|
6463
6463
|
|
|
6464
|
-
logger
|
|
6464
|
+
logger.info('Sending reinvite', {
|
|
6465
6465
|
id: this.getSipSessionId(sipSession),
|
|
6466
6466
|
newConstraints,
|
|
6467
6467
|
conference,
|
|
@@ -6499,7 +6499,7 @@ class WebRTCClient extends Emitter {
|
|
|
6499
6499
|
sipSession.incomingInviteRequest.message.body = response.message.body;
|
|
6500
6500
|
}
|
|
6501
6501
|
|
|
6502
|
-
logger
|
|
6502
|
+
logger.info('on re-INVITE accepted', {
|
|
6503
6503
|
id: this.getSipSessionId(sipSession),
|
|
6504
6504
|
wasMuted,
|
|
6505
6505
|
shouldDoScreenSharing,
|
|
@@ -6674,7 +6674,7 @@ class WebRTCClient extends Emitter {
|
|
|
6674
6674
|
}
|
|
6675
6675
|
|
|
6676
6676
|
startHeartbeat() {
|
|
6677
|
-
logger
|
|
6677
|
+
logger.info('sdk webrtc start heartbeat', { userAgent: !!this.userAgent });
|
|
6678
6678
|
if (!this.userAgent) {
|
|
6679
6679
|
this.heartbeat.stop();
|
|
6680
6680
|
return;
|
|
@@ -6687,7 +6687,7 @@ class WebRTCClient extends Emitter {
|
|
|
6687
6687
|
}
|
|
6688
6688
|
|
|
6689
6689
|
stopHeartbeat() {
|
|
6690
|
-
logger
|
|
6690
|
+
logger.info('sdk webrtc stop heartbeat');
|
|
6691
6691
|
this.heartbeat.stop();
|
|
6692
6692
|
}
|
|
6693
6693
|
|
|
@@ -6708,7 +6708,7 @@ class WebRTCClient extends Emitter {
|
|
|
6708
6708
|
}
|
|
6709
6709
|
|
|
6710
6710
|
attemptReconnection() {
|
|
6711
|
-
logger
|
|
6711
|
+
logger.info('attempt reconnection', { userAgent: !!this.userAgent });
|
|
6712
6712
|
if (!this.userAgent) {
|
|
6713
6713
|
return;
|
|
6714
6714
|
}
|
|
@@ -6733,7 +6733,7 @@ class WebRTCClient extends Emitter {
|
|
|
6733
6733
|
return;
|
|
6734
6734
|
}
|
|
6735
6735
|
|
|
6736
|
-
logger
|
|
6736
|
+
logger.info('setting local media stream', {
|
|
6737
6737
|
sipSessionId,
|
|
6738
6738
|
tracks: newStream ? newStream.getTracks() : null,
|
|
6739
6739
|
});
|
|
@@ -6750,7 +6750,7 @@ class WebRTCClient extends Emitter {
|
|
|
6750
6750
|
|
|
6751
6751
|
const oldStream = this.getLocalStream(sipSessionId);
|
|
6752
6752
|
|
|
6753
|
-
logger
|
|
6753
|
+
logger.info('updating local stream', {
|
|
6754
6754
|
sipSessionId,
|
|
6755
6755
|
oldStream: !!oldStream,
|
|
6756
6756
|
tracks: newStream.getTracks(),
|
|
@@ -6770,7 +6770,7 @@ class WebRTCClient extends Emitter {
|
|
|
6770
6770
|
const remoteStream = this.getRemoteStream(sessionId);
|
|
6771
6771
|
const pc = this.getPeerConnection(sessionId);
|
|
6772
6772
|
|
|
6773
|
-
logger
|
|
6773
|
+
logger.info('Updating remote stream', {
|
|
6774
6774
|
sessionId,
|
|
6775
6775
|
tracks: remoteStream ? remoteStream.getTracks() : null,
|
|
6776
6776
|
receiverTracks: pc && pc.getReceivers ? pc.getReceivers().map(receiver => receiver.track) : null,
|
|
@@ -6795,14 +6795,16 @@ class WebRTCClient extends Emitter {
|
|
|
6795
6795
|
const screenSharing = constraints && 'screen' in constraints ? constraints.screen : false;
|
|
6796
6796
|
const isDesktop = constraints && 'desktop' in constraints ? constraints.desktop : false;
|
|
6797
6797
|
const withAudio = constraints && 'audio' in constraints ? constraints.audio : true;
|
|
6798
|
+
const mandatoryVideo = constraints && typeof constraints.video === 'object' ? constraints.video.mandatory : {};
|
|
6798
6799
|
|
|
6799
|
-
logger
|
|
6800
|
+
logger.info('Retrieving media a configuration', { enableVideo, screenSharing, isDesktop, withAudio, constraints });
|
|
6800
6801
|
|
|
6801
6802
|
return {
|
|
6802
6803
|
constraints: {
|
|
6803
6804
|
// Exact constraint are not supported with `getDisplayMedia` and we must have a video=false in desktop screenshare
|
|
6804
6805
|
audio: screenSharing ? !isDesktop : (withAudio ? this._getAudioConstraints() : false),
|
|
6805
|
-
video: screenSharing ? (isDesktop
|
|
6806
|
+
video: screenSharing ? (isDesktop
|
|
6807
|
+
? ({ mandatory: { chromeMediaSource: 'desktop', ...(mandatoryVideo || {}) } }) : { cursor: 'always' })
|
|
6806
6808
|
: this._getVideoConstraints(enableVideo),
|
|
6807
6809
|
screen: screenSharing,
|
|
6808
6810
|
desktop: isDesktop,
|
|
@@ -6845,7 +6847,7 @@ class WebRTCClient extends Emitter {
|
|
|
6845
6847
|
}
|
|
6846
6848
|
|
|
6847
6849
|
_onTransportError() {
|
|
6848
|
-
logger
|
|
6850
|
+
logger.error('on transport error');
|
|
6849
6851
|
this.eventEmitter.emit(TRANSPORT_ERROR);
|
|
6850
6852
|
this.attemptReconnection();
|
|
6851
6853
|
}
|
|
@@ -6854,7 +6856,7 @@ class WebRTCClient extends Emitter {
|
|
|
6854
6856
|
const body = message && typeof message === 'object' ? message.data : message;
|
|
6855
6857
|
if (body && body.indexOf('200 OK') !== -1) {
|
|
6856
6858
|
if (this.hasHeartbeat()) {
|
|
6857
|
-
logger
|
|
6859
|
+
logger.info('on heartbeat received from Asterisk', { hasHeartbeat: this.hasHeartbeat() });
|
|
6858
6860
|
|
|
6859
6861
|
this.heartbeat.onHeartbeat();
|
|
6860
6862
|
if (this.heartbeatCb) {
|
|
@@ -6865,7 +6867,7 @@ class WebRTCClient extends Emitter {
|
|
|
6865
6867
|
}
|
|
6866
6868
|
|
|
6867
6869
|
async _onHeartbeatTimeout() {
|
|
6868
|
-
logger
|
|
6870
|
+
logger.info('sdk webrtc heartbeat timed out', { userAgent: !!this.userAgent, cb: !!this.heartbeatTimeoutCb });
|
|
6869
6871
|
|
|
6870
6872
|
if (this.heartbeatTimeoutCb) {
|
|
6871
6873
|
this.heartbeatTimeoutCb();
|
|
@@ -6877,7 +6879,7 @@ class WebRTCClient extends Emitter {
|
|
|
6877
6879
|
try {
|
|
6878
6880
|
await this.userAgent.transport.disconnect();
|
|
6879
6881
|
} catch (e) {
|
|
6880
|
-
logger
|
|
6882
|
+
logger.error('Transport disconnection after heartbeat timeout, error', e);
|
|
6881
6883
|
}
|
|
6882
6884
|
}
|
|
6883
6885
|
|
|
@@ -6910,31 +6912,31 @@ class WebRTCClient extends Emitter {
|
|
|
6910
6912
|
}
|
|
6911
6913
|
|
|
6912
6914
|
_connectIfNeeded() {
|
|
6913
|
-
logger
|
|
6915
|
+
logger.info('connect if needed, checking', { connected: this.isConnected() });
|
|
6914
6916
|
if (!this.userAgent) {
|
|
6915
|
-
logger
|
|
6917
|
+
logger.info('need to recreate User Agent');
|
|
6916
6918
|
this.userAgent = this.createUserAgent(this.uaConfigOverrides);
|
|
6917
6919
|
}
|
|
6918
6920
|
|
|
6919
6921
|
if (this.isConnected()) {
|
|
6920
|
-
logger
|
|
6922
|
+
logger.info('webrtc sdk, already connected');
|
|
6921
6923
|
return Promise.resolve();
|
|
6922
6924
|
}
|
|
6923
6925
|
|
|
6924
6926
|
if (this.isConnecting()) {
|
|
6925
|
-
logger
|
|
6927
|
+
logger.info('webrtc sdk, already connecting...');
|
|
6926
6928
|
|
|
6927
6929
|
this.connectionPromise = this.userAgent.transport.connectPromise;
|
|
6928
6930
|
return this.connectionPromise;
|
|
6929
6931
|
}
|
|
6930
6932
|
|
|
6931
6933
|
if (this.connectionPromise) {
|
|
6932
|
-
logger
|
|
6934
|
+
logger.info('webrtc sdk, connection promise connecting...');
|
|
6933
6935
|
// $FlowFixMe
|
|
6934
6936
|
return this.connectionPromise;
|
|
6935
6937
|
}
|
|
6936
6938
|
|
|
6937
|
-
logger
|
|
6939
|
+
logger.info('WebRTC UA needs to connect');
|
|
6938
6940
|
|
|
6939
6941
|
// Force UA to reconnect
|
|
6940
6942
|
if (this.userAgent && this.userAgent.state !== userAgentState.UserAgentState.Stopped) {
|
|
@@ -7059,7 +7061,7 @@ class WebRTCClient extends Emitter {
|
|
|
7059
7061
|
|
|
7060
7062
|
sdh.peerConnectionDelegate = {
|
|
7061
7063
|
onicecandidateerror: (error ) => {
|
|
7062
|
-
logger
|
|
7064
|
+
logger.error('on icecandidate error', {
|
|
7063
7065
|
address: error.address,
|
|
7064
7066
|
port: error.port,
|
|
7065
7067
|
errorCode: error.errorCode,
|
|
@@ -7088,7 +7090,7 @@ class WebRTCClient extends Emitter {
|
|
|
7088
7090
|
updatedNumber = session.assertedIdentity.uri.normal.user;
|
|
7089
7091
|
updatedCalleeName = session.assertedIdentity.displayName || updatedNumber;
|
|
7090
7092
|
}
|
|
7091
|
-
logger
|
|
7093
|
+
logger.info('re-invite received', { updatedCalleeName, updatedNumber, hadRemoteVideo });
|
|
7092
7094
|
|
|
7093
7095
|
// Useful to know if it's a video upgrade or an unhold from a remote peer with a video stream
|
|
7094
7096
|
|
|
@@ -7109,7 +7111,7 @@ class WebRTCClient extends Emitter {
|
|
|
7109
7111
|
}
|
|
7110
7112
|
|
|
7111
7113
|
_onAccepted(session , sessionDialog , withEvent = true) {
|
|
7112
|
-
logger
|
|
7114
|
+
logger.info('on call accepted', { id: session.id, remoteTag: session.remoteTag });
|
|
7113
7115
|
|
|
7114
7116
|
this.storeSipSession(session);
|
|
7115
7117
|
|
|
@@ -7121,7 +7123,7 @@ class WebRTCClient extends Emitter {
|
|
|
7121
7123
|
const onTrack = (event ) => {
|
|
7122
7124
|
const isAudioOnly = this._isAudioOnly(session);
|
|
7123
7125
|
const { kind, label, readyState, id, muted } = event.track;
|
|
7124
|
-
logger
|
|
7126
|
+
logger.info('on track event', { isAudioOnly, kind, label, readyState, id, muted });
|
|
7125
7127
|
|
|
7126
7128
|
// Stop video track in audio only mode
|
|
7127
7129
|
if (isAudioOnly && kind === 'video') {
|
|
@@ -7137,12 +7139,14 @@ class WebRTCClient extends Emitter {
|
|
|
7137
7139
|
|
|
7138
7140
|
session.sessionDescriptionHandler.remoteMediaStream.onaddtrack = onTrack;
|
|
7139
7141
|
|
|
7140
|
-
|
|
7141
|
-
|
|
7142
|
-
|
|
7143
|
-
|
|
7144
|
-
|
|
7145
|
-
|
|
7142
|
+
if (pc) {
|
|
7143
|
+
pc.oniceconnectionstatechange = () => {
|
|
7144
|
+
logger.info('on ice connection state changed', { state: pc.iceConnectionState });
|
|
7145
|
+
if (pc.iceConnectionState === 'disconnected') {
|
|
7146
|
+
this.eventEmitter.emit(ON_DISCONNECTED);
|
|
7147
|
+
}
|
|
7148
|
+
};
|
|
7149
|
+
}
|
|
7146
7150
|
|
|
7147
7151
|
if (withEvent) {
|
|
7148
7152
|
this.eventEmitter.emit(ACCEPTED, session, sessionDialog);
|
|
@@ -7311,10 +7315,10 @@ class WebRTCClient extends Emitter {
|
|
|
7311
7315
|
|
|
7312
7316
|
_stopSendingStats(session ) {
|
|
7313
7317
|
const sessionId = this.getSipSessionId(session);
|
|
7314
|
-
logger
|
|
7318
|
+
logger.trace('Check for stopping stats', { sessionId, ids: Object.keys(this.statsIntervals) });
|
|
7315
7319
|
|
|
7316
7320
|
if (sessionId in this.statsIntervals) {
|
|
7317
|
-
logger
|
|
7321
|
+
logger.trace('Stop sending stats for call', { sessionId });
|
|
7318
7322
|
this.statsIntervals[sessionId]();
|
|
7319
7323
|
delete this.statsIntervals[sessionId];
|
|
7320
7324
|
}
|
|
@@ -7330,7 +7334,7 @@ class WebRTCClient extends Emitter {
|
|
|
7330
7334
|
try {
|
|
7331
7335
|
await this.userAgent.transport.disconnect();
|
|
7332
7336
|
} catch (e) {
|
|
7333
|
-
logger
|
|
7337
|
+
logger.error('WebRTC transport disconnect, error', e);
|
|
7334
7338
|
}
|
|
7335
7339
|
}
|
|
7336
7340
|
}
|
|
@@ -7352,13 +7356,17 @@ class WebRTCClient extends Emitter {
|
|
|
7352
7356
|
const nbStats = this.sessionNetworkStats[sessionId].length;
|
|
7353
7357
|
const lastNetworkStats = this.sessionNetworkStats[sessionId][nbStats - 1];
|
|
7354
7358
|
const lastAudioSent = lastNetworkStats ? lastNetworkStats.audioBytesSent : 0;
|
|
7359
|
+
const lastAudioContentSent = lastNetworkStats ? lastNetworkStats.audioContentSent : 0;
|
|
7355
7360
|
const lastVideoSent = lastNetworkStats ? lastNetworkStats.videoBytesSent : 0;
|
|
7356
7361
|
const lastAudioReceived = lastNetworkStats ? lastNetworkStats.audioBytesReceived : 0;
|
|
7362
|
+
const lastAudioContentReceived = lastNetworkStats ? lastNetworkStats.audioContentReceived : 0;
|
|
7357
7363
|
const lastVideoReceived = lastNetworkStats ? lastNetworkStats.videoBytesReceived : 0;
|
|
7358
7364
|
const lastTransportSent = lastNetworkStats ? lastNetworkStats.transportSent : 0;
|
|
7359
7365
|
const lastTransportReceived = lastNetworkStats ? lastNetworkStats.transportReceived : 0;
|
|
7360
|
-
let audioBytesSent = 0;
|
|
7361
|
-
let audioBytesReceived = 0;
|
|
7366
|
+
let audioBytesSent = 0; // content + header
|
|
7367
|
+
let audioBytesReceived = 0; // content + header
|
|
7368
|
+
let audioContentSent = 0; // useful to detect blank call
|
|
7369
|
+
let audioContentReceived = 0;
|
|
7362
7370
|
let videoBytesSent = 0;
|
|
7363
7371
|
let videoBytesReceived = 0;
|
|
7364
7372
|
let transportSent = 0;
|
|
@@ -7368,6 +7376,7 @@ class WebRTCClient extends Emitter {
|
|
|
7368
7376
|
stats.forEach(report => {
|
|
7369
7377
|
if (report.type === 'outbound-rtp' && report.kind === 'audio') {
|
|
7370
7378
|
audioBytesSent += Number(report.bytesSent) + Number(report.headerBytesSent);
|
|
7379
|
+
audioContentSent += Number(report.bytesSent);
|
|
7371
7380
|
}
|
|
7372
7381
|
if (report.type === 'remote-outbound-rtp' && report.kind === 'audio') {
|
|
7373
7382
|
audioBytesSent += Number(report.bytesSent);
|
|
@@ -7379,6 +7388,7 @@ class WebRTCClient extends Emitter {
|
|
|
7379
7388
|
packetsLost += Number(report.packetsLost);
|
|
7380
7389
|
networkStats.packetsReceived = Number(report.packetsReceived);
|
|
7381
7390
|
audioBytesReceived += Number(report.bytesReceived) + Number(report.headerBytesReceived);
|
|
7391
|
+
audioContentReceived += Number(report.bytesReceived);
|
|
7382
7392
|
}
|
|
7383
7393
|
if (report.type === 'inbound-rtp' && report.kind === 'video') {
|
|
7384
7394
|
videoBytesReceived += Number(report.bytesReceived) + Number(report.headerBytesReceived);
|
|
@@ -7407,10 +7417,17 @@ class WebRTCClient extends Emitter {
|
|
|
7407
7417
|
});
|
|
7408
7418
|
|
|
7409
7419
|
networkStats.packetsLost = packetsLost;
|
|
7420
|
+
|
|
7410
7421
|
networkStats.totalAudioBytesSent = audioBytesSent;
|
|
7411
7422
|
networkStats.audioBytesSent = audioBytesSent - lastAudioSent;
|
|
7412
7423
|
networkStats.totalAudioBytesReceived = audioBytesReceived - lastAudioReceived;
|
|
7413
7424
|
networkStats.audioBytesReceived = audioBytesReceived;
|
|
7425
|
+
|
|
7426
|
+
networkStats.totalAudioContentSent = audioContentSent;
|
|
7427
|
+
networkStats.audioContentSent = audioContentSent - lastAudioContentSent;
|
|
7428
|
+
networkStats.totalAudioBytesReceived = audioContentReceived - lastAudioContentReceived;
|
|
7429
|
+
networkStats.audioContentReceived = audioContentReceived;
|
|
7430
|
+
|
|
7414
7431
|
networkStats.totalVideoBytesSent = videoBytesSent;
|
|
7415
7432
|
networkStats.videoBytesSent = videoBytesSent - lastVideoSent;
|
|
7416
7433
|
networkStats.totalVideoBytesReceived = videoBytesReceived;
|