@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
|
@@ -109,7 +109,7 @@ const isMobile = () => typeof navigator !== 'undefined' && navigator.product ===
|
|
|
109
109
|
|
|
110
110
|
const methods = ['head', 'get', 'post', 'put', 'delete'];
|
|
111
111
|
|
|
112
|
-
const logger = IssueReporter$1 ? IssueReporter$1.loggerFor('api') : console;
|
|
112
|
+
const logger$2 = IssueReporter$1 ? IssueReporter$1.loggerFor('api') : console;
|
|
113
113
|
|
|
114
114
|
// Use a function here to be able to mock it in tests
|
|
115
115
|
const realFetch = () => {
|
|
@@ -248,7 +248,7 @@ class ApiRequester {
|
|
|
248
248
|
};
|
|
249
249
|
|
|
250
250
|
if (this.refreshTokenPromise) {
|
|
251
|
-
logger.info('A token is already refreshing, waiting ...', { url });
|
|
251
|
+
logger$2.info('A token is already refreshing, waiting ...', { url });
|
|
252
252
|
await this.refreshTokenPromise;
|
|
253
253
|
}
|
|
254
254
|
|
|
@@ -268,7 +268,7 @@ class ApiRequester {
|
|
|
268
268
|
return promise.then(async (err ) => {
|
|
269
269
|
// Check if the token is still valid
|
|
270
270
|
if (firstCall && this._checkTokenExpired(response, err)) {
|
|
271
|
-
logger.warn('token expired', { error: err.reason });
|
|
271
|
+
logger$2.warn('token expired', { error: err.reason });
|
|
272
272
|
// Replay the call after refreshing the token
|
|
273
273
|
return this._replayWithNewToken(err, path, method, body, headers, parse);
|
|
274
274
|
}
|
|
@@ -278,7 +278,7 @@ class ApiRequester {
|
|
|
278
278
|
: exceptionClass.fromResponse(err, response.status);
|
|
279
279
|
|
|
280
280
|
if (this.shouldLogErrors) {
|
|
281
|
-
logger.error('API error', error);
|
|
281
|
+
logger$2.error('API error', error);
|
|
282
282
|
}
|
|
283
283
|
|
|
284
284
|
throw error;
|
|
@@ -288,7 +288,7 @@ class ApiRequester {
|
|
|
288
288
|
return newParse(response, isJson);
|
|
289
289
|
}).catch(error => {
|
|
290
290
|
if (this.shouldLogErrors) {
|
|
291
|
-
logger.error('Fetch failed', { url, options, message: error.message, stack: error.stack });
|
|
291
|
+
logger$2.error('Fetch failed', { url, options, message: error.message, stack: error.stack });
|
|
292
292
|
}
|
|
293
293
|
|
|
294
294
|
throw error;
|
|
@@ -316,13 +316,13 @@ class ApiRequester {
|
|
|
316
316
|
) {
|
|
317
317
|
const isTokenNotFound = this._isTokenNotFound(err);
|
|
318
318
|
let newPath = path;
|
|
319
|
-
logger.info('refreshing token', { inProgress: !!this.refreshTokenPromise });
|
|
319
|
+
logger$2.info('refreshing token', { inProgress: !!this.refreshTokenPromise });
|
|
320
320
|
|
|
321
321
|
this.refreshTokenPromise = this.refreshTokenPromise || this.refreshTokenCallback();
|
|
322
322
|
|
|
323
323
|
return this.refreshTokenPromise.then(() => {
|
|
324
324
|
this.refreshTokenPromise = null;
|
|
325
|
-
logger.info('token refreshed', { isTokenNotFound });
|
|
325
|
+
logger$2.info('token refreshed', { isTokenNotFound });
|
|
326
326
|
if (isTokenNotFound) {
|
|
327
327
|
const pathParts = path.split('/');
|
|
328
328
|
pathParts.pop();
|
|
@@ -4147,7 +4147,7 @@ const TRANSFER_FLOW_BLIND = 'blind';
|
|
|
4147
4147
|
|
|
4148
4148
|
// const MINIMUM_WAZO_ENGINE_VERSION_FOR_CTI_HOLD = '20.11';
|
|
4149
4149
|
|
|
4150
|
-
|
|
4150
|
+
IssueReporter$1 ? IssueReporter$1.loggerFor('cti-phone') : console;
|
|
4151
4151
|
|
|
4152
4152
|
/* */
|
|
4153
4153
|
|
|
@@ -5066,7 +5066,7 @@ const AGENTD_VERSION = '1.0';
|
|
|
5066
5066
|
const WEBHOOKD_VERSION = '1.0';
|
|
5067
5067
|
const AMID_VERSION = '1.0';
|
|
5068
5068
|
|
|
5069
|
-
const logger$
|
|
5069
|
+
const logger$1 = IssueReporter$1 ? IssueReporter$1.loggerFor('api') : console;
|
|
5070
5070
|
|
|
5071
5071
|
class ApiClient {
|
|
5072
5072
|
|
|
@@ -5118,12 +5118,12 @@ class ApiClient {
|
|
|
5118
5118
|
}
|
|
5119
5119
|
|
|
5120
5120
|
async forceRefreshToken() {
|
|
5121
|
-
logger$
|
|
5121
|
+
logger$1.info('forcing refresh token, calling callback');
|
|
5122
5122
|
return this.refreshTokenCallback();
|
|
5123
5123
|
}
|
|
5124
5124
|
|
|
5125
5125
|
async refreshTokenCallback() {
|
|
5126
|
-
logger$
|
|
5126
|
+
logger$1.info('refresh token callback called', {
|
|
5127
5127
|
refreshToken: this.refreshToken,
|
|
5128
5128
|
refreshBackend: this.refreshBackend,
|
|
5129
5129
|
refreshExpiration: this.refreshExpiration,
|
|
@@ -5141,7 +5141,7 @@ class ApiClient {
|
|
|
5141
5141
|
this.isMobile,
|
|
5142
5142
|
);
|
|
5143
5143
|
|
|
5144
|
-
logger$
|
|
5144
|
+
logger$1.info('token refreshed', { token: session.token });
|
|
5145
5145
|
|
|
5146
5146
|
if (this.onRefreshToken) {
|
|
5147
5147
|
this.onRefreshToken(session.token, session);
|
|
@@ -5314,7 +5314,7 @@ const DEFAULT_ICE_TIMEOUT = 3000;
|
|
|
5314
5314
|
const SEND_STATS_DELAY = 5000;
|
|
5315
5315
|
|
|
5316
5316
|
const states = ['STATUS_NULL', 'STATUS_NEW', 'STATUS_CONNECTING', 'STATUS_CONNECTED', 'STATUS_COMPLETED'];
|
|
5317
|
-
const logger
|
|
5317
|
+
const logger = IssueReporter$1 ? IssueReporter$1.loggerFor('webrtc-client') : console;
|
|
5318
5318
|
const statsLogger = IssueReporter$1 ? IssueReporter$1.loggerFor('webrtc-stats') : console;
|
|
5319
5319
|
|
|
5320
5320
|
// events
|
|
@@ -5490,13 +5490,13 @@ class WebRTCClient extends Emitter {
|
|
|
5490
5490
|
|
|
5491
5491
|
createUserAgent(configOverrides ) {
|
|
5492
5492
|
const webRTCConfiguration = this._createWebRTCConfiguration(configOverrides);
|
|
5493
|
-
logger
|
|
5493
|
+
logger.info('sdk webrtc, creating UA', { webRTCConfiguration });
|
|
5494
5494
|
|
|
5495
5495
|
webRTCConfiguration.delegate = {
|
|
5496
5496
|
onConnect: this.onConnect.bind(this),
|
|
5497
5497
|
onDisconnect: this.onDisconnect.bind(this),
|
|
5498
5498
|
onInvite: (invitation ) => {
|
|
5499
|
-
logger
|
|
5499
|
+
logger.info('sdk webrtc on invite', {
|
|
5500
5500
|
method: 'delegate.onInvite',
|
|
5501
5501
|
id: invitation.id,
|
|
5502
5502
|
remoteURI: invitation.remoteURI,
|
|
@@ -5539,7 +5539,7 @@ class WebRTCClient extends Emitter {
|
|
|
5539
5539
|
}
|
|
5540
5540
|
|
|
5541
5541
|
onConnect() {
|
|
5542
|
-
logger
|
|
5542
|
+
logger.info('sdk webrtc connected', { method: 'delegate.onConnect' });
|
|
5543
5543
|
this.eventEmitter.emit(CONNECTED);
|
|
5544
5544
|
if (!this.isRegistered() && this.registerer && this.registerer.waiting) {
|
|
5545
5545
|
this.registerer.waitingToggle(false);
|
|
@@ -5548,7 +5548,7 @@ class WebRTCClient extends Emitter {
|
|
|
5548
5548
|
}
|
|
5549
5549
|
|
|
5550
5550
|
async onDisconnect(error ) {
|
|
5551
|
-
logger
|
|
5551
|
+
logger.info('sdk webrtc disconnected', { method: 'delegate.onConnect', error });
|
|
5552
5552
|
this.connectionPromise = null;
|
|
5553
5553
|
// The UA will attempt to reconnect automatically when an error occurred
|
|
5554
5554
|
this.eventEmitter.emit(DISCONNECTED, error);
|
|
@@ -5573,37 +5573,37 @@ class WebRTCClient extends Emitter {
|
|
|
5573
5573
|
};
|
|
5574
5574
|
|
|
5575
5575
|
if (this.skipRegister) {
|
|
5576
|
-
logger
|
|
5576
|
+
logger.info('sdk webrtc skip register...', logInfo);
|
|
5577
5577
|
return Promise.resolve();
|
|
5578
5578
|
}
|
|
5579
5579
|
|
|
5580
|
-
logger
|
|
5580
|
+
logger.info('sdk webrtc registering...', logInfo);
|
|
5581
5581
|
|
|
5582
5582
|
if (!this.userAgent) {
|
|
5583
|
-
logger
|
|
5583
|
+
logger.info('sdk webrtc recreating User Agent');
|
|
5584
5584
|
this.userAgent = this.createUserAgent(this.uaConfigOverrides);
|
|
5585
5585
|
}
|
|
5586
5586
|
if (!this.userAgent || this.isRegistered()) {
|
|
5587
|
-
logger
|
|
5587
|
+
logger.info('sdk webrtc registering aborted, already registered or no UA can be created');
|
|
5588
5588
|
return Promise.resolve();
|
|
5589
5589
|
}
|
|
5590
5590
|
|
|
5591
5591
|
if (this.connectionPromise || (this.registerer && this.registerer.waiting)) {
|
|
5592
|
-
logger
|
|
5592
|
+
logger.info('sdk webrtc registering aborted due to a registration in progress.');
|
|
5593
5593
|
return Promise.resolve();
|
|
5594
5594
|
}
|
|
5595
5595
|
|
|
5596
5596
|
const registerOptions = this._isWeb() ? {} : { extraContactHeaderParams: ['mobility=mobile'] };
|
|
5597
5597
|
|
|
5598
5598
|
const onRegisterFailed = () => {
|
|
5599
|
-
logger
|
|
5599
|
+
logger.info('sdk webrtc registering failed', { tries, registerer: !!this.registerer });
|
|
5600
5600
|
this.connectionPromise = null;
|
|
5601
5601
|
if (this.registerer && this.registerer.waiting) {
|
|
5602
5602
|
this.registerer.waitingToggle(false);
|
|
5603
5603
|
}
|
|
5604
5604
|
|
|
5605
5605
|
if (tries <= MAX_REGISTER_TRIES) {
|
|
5606
|
-
logger
|
|
5606
|
+
logger.info('sdk webrtc registering, retrying...', { tries });
|
|
5607
5607
|
setTimeout(() => this.register(tries + 1), 300);
|
|
5608
5608
|
}
|
|
5609
5609
|
};
|
|
@@ -5612,18 +5612,18 @@ class WebRTCClient extends Emitter {
|
|
|
5612
5612
|
// Avoid race condition with the close method called just before register and setting userAgent to null
|
|
5613
5613
|
// during the resolution of the primise.
|
|
5614
5614
|
if (!this.userAgent) {
|
|
5615
|
-
logger
|
|
5615
|
+
logger.info('sdk webrtc recreating User Agent after connection');
|
|
5616
5616
|
this.userAgent = this.createUserAgent(this.uaConfigOverrides);
|
|
5617
5617
|
}
|
|
5618
5618
|
|
|
5619
|
-
logger
|
|
5619
|
+
logger.info('sdk webrtc registering, transport connected', { registerOptions, ua: !!this.userAgent });
|
|
5620
5620
|
this.registerer = new registerer.Registerer(this.userAgent, registerOptions);
|
|
5621
5621
|
this.connectionPromise = null;
|
|
5622
5622
|
this._monkeyPatchRegisterer(this.registerer);
|
|
5623
5623
|
|
|
5624
5624
|
// Bind registerer events
|
|
5625
5625
|
this.registerer.stateChange.addListener(newState => {
|
|
5626
|
-
logger
|
|
5626
|
+
logger.info('sdk webrtc registering, state changed', { newState });
|
|
5627
5627
|
|
|
5628
5628
|
if (newState === registererState.RegistererState.Registered && this.registerer
|
|
5629
5629
|
&& this.registerer.state === registererState.RegistererState.Registered) {
|
|
@@ -5636,7 +5636,7 @@ class WebRTCClient extends Emitter {
|
|
|
5636
5636
|
const options = {
|
|
5637
5637
|
requestDelegate: {
|
|
5638
5638
|
onReject: response => {
|
|
5639
|
-
logger
|
|
5639
|
+
logger.error('sdk webrtc registering, rejected', { response });
|
|
5640
5640
|
|
|
5641
5641
|
onRegisterFailed();
|
|
5642
5642
|
},
|
|
@@ -5644,13 +5644,13 @@ class WebRTCClient extends Emitter {
|
|
|
5644
5644
|
};
|
|
5645
5645
|
|
|
5646
5646
|
return this.registerer.register(options).catch((e) => {
|
|
5647
|
-
logger
|
|
5647
|
+
logger.error('sdk webrtc registering, error', e);
|
|
5648
5648
|
|
|
5649
5649
|
this.eventEmitter.emit(REGISTRATION_FAILED);
|
|
5650
5650
|
return e;
|
|
5651
5651
|
});
|
|
5652
5652
|
}).catch(error => {
|
|
5653
|
-
logger
|
|
5653
|
+
logger.error('sdk webrtc registering, transport error', error);
|
|
5654
5654
|
onRegisterFailed();
|
|
5655
5655
|
});
|
|
5656
5656
|
}
|
|
@@ -5679,21 +5679,21 @@ class WebRTCClient extends Emitter {
|
|
|
5679
5679
|
}
|
|
5680
5680
|
|
|
5681
5681
|
unregister() {
|
|
5682
|
-
logger
|
|
5682
|
+
logger.info('sdk webrtc unregistering..', { userAgent: !!this.userAgent, registerer: !!this.registerer });
|
|
5683
5683
|
if (!this.registerer) {
|
|
5684
5684
|
return Promise.resolve();
|
|
5685
5685
|
}
|
|
5686
5686
|
|
|
5687
5687
|
try {
|
|
5688
5688
|
return this.registerer.unregister().then(() => {
|
|
5689
|
-
logger
|
|
5689
|
+
logger.info('sdk webrtc unregistered');
|
|
5690
5690
|
this._cleanupRegister();
|
|
5691
5691
|
}).catch(e => {
|
|
5692
|
-
logger
|
|
5692
|
+
logger.error('sdk webrtc unregistering, promise error', e);
|
|
5693
5693
|
this._cleanupRegister();
|
|
5694
5694
|
});
|
|
5695
5695
|
} catch (e) {
|
|
5696
|
-
logger
|
|
5696
|
+
logger.error('sdk webrtc unregistering, error', e);
|
|
5697
5697
|
// Avoid issue with `undefined is not an object (evaluating 'new.target.prototype')` when triggering a new
|
|
5698
5698
|
// error when the registerer is in a bad state
|
|
5699
5699
|
this._cleanupRegister();
|
|
@@ -5701,7 +5701,7 @@ class WebRTCClient extends Emitter {
|
|
|
5701
5701
|
}
|
|
5702
5702
|
|
|
5703
5703
|
stop() {
|
|
5704
|
-
logger
|
|
5704
|
+
logger.info('sdk webrtc stop', { userAgent: !!this.userAgent });
|
|
5705
5705
|
if (!this.userAgent) {
|
|
5706
5706
|
return Promise.resolve();
|
|
5707
5707
|
}
|
|
@@ -5709,12 +5709,12 @@ class WebRTCClient extends Emitter {
|
|
|
5709
5709
|
return this.userAgent.stop().then(() => {
|
|
5710
5710
|
return this._cleanupRegister();
|
|
5711
5711
|
}).catch(e => {
|
|
5712
|
-
logger
|
|
5712
|
+
logger.warn('sdk webrtc stop, error', { message: e.message, stack: e.stack });
|
|
5713
5713
|
});
|
|
5714
5714
|
}
|
|
5715
5715
|
|
|
5716
5716
|
call(number , enableVideo , audioOnly = false, conference = false) {
|
|
5717
|
-
logger
|
|
5717
|
+
logger.info('sdk webrtc creating call', { number, enableVideo, audioOnly, conference });
|
|
5718
5718
|
const inviterOptions = {
|
|
5719
5719
|
sessionDescriptionHandlerOptionsReInvite: {
|
|
5720
5720
|
conference,
|
|
@@ -5745,7 +5745,7 @@ class WebRTCClient extends Emitter {
|
|
|
5745
5745
|
this._onAccepted(session, response.session, true);
|
|
5746
5746
|
},
|
|
5747
5747
|
onReject: (response ) => {
|
|
5748
|
-
logger
|
|
5748
|
+
logger.info('on call rejected', { id: session.id, fromTag: session.fromTag });
|
|
5749
5749
|
this._stopSendingStats(session);
|
|
5750
5750
|
this.stopNetworkMonitoring(session);
|
|
5751
5751
|
|
|
@@ -5768,11 +5768,11 @@ class WebRTCClient extends Emitter {
|
|
|
5768
5768
|
}
|
|
5769
5769
|
|
|
5770
5770
|
answer(session , enableVideo ) {
|
|
5771
|
-
logger
|
|
5771
|
+
logger.info('sdk webrtc answer call', { id: session.id, enableVideo });
|
|
5772
5772
|
|
|
5773
5773
|
if (!session || !session.accept) {
|
|
5774
5774
|
const error = 'No session to answer, or not an invitation';
|
|
5775
|
-
logger
|
|
5775
|
+
logger.warn(error);
|
|
5776
5776
|
return Promise.reject(new Error(error));
|
|
5777
5777
|
}
|
|
5778
5778
|
const options = {
|
|
@@ -5782,15 +5782,15 @@ class WebRTCClient extends Emitter {
|
|
|
5782
5782
|
return session.accept(options).then(() => {
|
|
5783
5783
|
if (session.isCanceled) {
|
|
5784
5784
|
const message = 'accepted a canceled session (or was canceled during the accept phase).';
|
|
5785
|
-
logger
|
|
5785
|
+
logger.error(message, { id: session.id });
|
|
5786
5786
|
this.onCallEnded(session);
|
|
5787
5787
|
|
|
5788
5788
|
throw new CanceledCallError(message);
|
|
5789
5789
|
}
|
|
5790
|
-
logger
|
|
5790
|
+
logger.info('sdk webrtc answer, accepted.');
|
|
5791
5791
|
this._onAccepted(session);
|
|
5792
5792
|
}).catch(e => {
|
|
5793
|
-
logger
|
|
5793
|
+
logger.error(`answer call error for ${session ? session.id : 'n/a'}`, e);
|
|
5794
5794
|
|
|
5795
5795
|
throw e;
|
|
5796
5796
|
});
|
|
@@ -5798,7 +5798,7 @@ class WebRTCClient extends Emitter {
|
|
|
5798
5798
|
|
|
5799
5799
|
hangup(session ) {
|
|
5800
5800
|
const { state, id } = session;
|
|
5801
|
-
logger
|
|
5801
|
+
logger.info('sdk webrtc hangup call', { id, state });
|
|
5802
5802
|
|
|
5803
5803
|
try {
|
|
5804
5804
|
this._stopSendingStats(session);
|
|
@@ -5827,7 +5827,7 @@ class WebRTCClient extends Emitter {
|
|
|
5827
5827
|
|
|
5828
5828
|
return bye();
|
|
5829
5829
|
} catch (error) {
|
|
5830
|
-
logger
|
|
5830
|
+
logger.warn('sdk webrtc hangup, error', error);
|
|
5831
5831
|
}
|
|
5832
5832
|
|
|
5833
5833
|
return null;
|
|
@@ -5845,7 +5845,7 @@ class WebRTCClient extends Emitter {
|
|
|
5845
5845
|
// Fetch and emit an event at `interval` with session network stats
|
|
5846
5846
|
startNetworkMonitoring(session , interval = 1000) {
|
|
5847
5847
|
const sessionId = this.getSipSessionId(session);
|
|
5848
|
-
logger
|
|
5848
|
+
logger.info('starting network inspection', { id: sessionId });
|
|
5849
5849
|
|
|
5850
5850
|
this.sessionNetworkStats[sessionId] = [];
|
|
5851
5851
|
|
|
@@ -5855,7 +5855,7 @@ class WebRTCClient extends Emitter {
|
|
|
5855
5855
|
stopNetworkMonitoring(session ) {
|
|
5856
5856
|
const sessionId = this.getSipSessionId(session);
|
|
5857
5857
|
const exists = sessionId in this.networkMonitoringInterval;
|
|
5858
|
-
logger
|
|
5858
|
+
logger.info('stopping network inspection', { id: sessionId, exists });
|
|
5859
5859
|
|
|
5860
5860
|
if (exists) {
|
|
5861
5861
|
clearInterval(this.networkMonitoringInterval[sessionId]);
|
|
@@ -5865,17 +5865,17 @@ class WebRTCClient extends Emitter {
|
|
|
5865
5865
|
}
|
|
5866
5866
|
|
|
5867
5867
|
reject(session ) {
|
|
5868
|
-
logger
|
|
5868
|
+
logger.info('sdk webrtc reject call', { id: session.id });
|
|
5869
5869
|
|
|
5870
5870
|
try {
|
|
5871
5871
|
return session.reject ? session.reject() : session.cancel();
|
|
5872
5872
|
} catch (e) {
|
|
5873
|
-
logger
|
|
5873
|
+
logger.warn('Error when rejecting call', e.message, e.stack);
|
|
5874
5874
|
}
|
|
5875
5875
|
}
|
|
5876
5876
|
|
|
5877
5877
|
async close() {
|
|
5878
|
-
logger
|
|
5878
|
+
logger.info('sdk webrtc closing client', { userAgent: !!this.userAgent });
|
|
5879
5879
|
this._cleanupMedia();
|
|
5880
5880
|
this.connectionPromise = null;
|
|
5881
5881
|
|
|
@@ -5906,7 +5906,7 @@ class WebRTCClient extends Emitter {
|
|
|
5906
5906
|
// eg: "INVITE not rejectable in state Completed"
|
|
5907
5907
|
}
|
|
5908
5908
|
this.userAgent = null;
|
|
5909
|
-
logger
|
|
5909
|
+
logger.info('sdk webrtc client closed');
|
|
5910
5910
|
}
|
|
5911
5911
|
|
|
5912
5912
|
getNumber(session ) {
|
|
@@ -5919,13 +5919,13 @@ class WebRTCClient extends Emitter {
|
|
|
5919
5919
|
}
|
|
5920
5920
|
|
|
5921
5921
|
mute(session ) {
|
|
5922
|
-
logger
|
|
5922
|
+
logger.info('sdk webrtc mute', { id: session.id });
|
|
5923
5923
|
|
|
5924
5924
|
this._toggleAudio(session, true);
|
|
5925
5925
|
}
|
|
5926
5926
|
|
|
5927
5927
|
unmute(session ) {
|
|
5928
|
-
logger
|
|
5928
|
+
logger.info('sdk webrtc unmute', { id: session.id });
|
|
5929
5929
|
|
|
5930
5930
|
this._toggleAudio(session, false);
|
|
5931
5931
|
}
|
|
@@ -5965,13 +5965,13 @@ class WebRTCClient extends Emitter {
|
|
|
5965
5965
|
}
|
|
5966
5966
|
|
|
5967
5967
|
toggleCameraOn(session ) {
|
|
5968
|
-
logger
|
|
5968
|
+
logger.info('sdk webrtc toggle camera on', { id: session.id });
|
|
5969
5969
|
|
|
5970
5970
|
this._toggleVideo(session, false);
|
|
5971
5971
|
}
|
|
5972
5972
|
|
|
5973
5973
|
toggleCameraOff(session ) {
|
|
5974
|
-
logger
|
|
5974
|
+
logger.info('sdk webrtc toggle camera off', { id: session.id });
|
|
5975
5975
|
|
|
5976
5976
|
this._toggleVideo(session, true);
|
|
5977
5977
|
}
|
|
@@ -5980,7 +5980,7 @@ class WebRTCClient extends Emitter {
|
|
|
5980
5980
|
const sessionId = this.getSipSessionId(session);
|
|
5981
5981
|
const hasVideo = hadVideo || this.hasLocalVideo(sessionId);
|
|
5982
5982
|
|
|
5983
|
-
logger
|
|
5983
|
+
logger.info('sdk webrtc hold', {
|
|
5984
5984
|
sessionId,
|
|
5985
5985
|
keys: Object.keys(this.heldSessions),
|
|
5986
5986
|
pendingReinvite: !!session.pendingReinvite,
|
|
@@ -6029,7 +6029,7 @@ class WebRTCClient extends Emitter {
|
|
|
6029
6029
|
const sessionId = this.getSipSessionId(session);
|
|
6030
6030
|
const hasVideo = sessionId in this.heldSessions && this.heldSessions[sessionId].hasVideo;
|
|
6031
6031
|
|
|
6032
|
-
logger
|
|
6032
|
+
logger.info('sdk webrtc unhold', {
|
|
6033
6033
|
sessionId,
|
|
6034
6034
|
keys: Object.keys(this.heldSessions),
|
|
6035
6035
|
pendingReinvite: !!session.pendingReinvite,
|
|
@@ -6177,7 +6177,7 @@ class WebRTCClient extends Emitter {
|
|
|
6177
6177
|
if (!session.sessionDescriptionHandler) {
|
|
6178
6178
|
return;
|
|
6179
6179
|
}
|
|
6180
|
-
logger
|
|
6180
|
+
logger.info('Sending DTMF', {
|
|
6181
6181
|
id: this.getSipSessionId(session),
|
|
6182
6182
|
tone,
|
|
6183
6183
|
});
|
|
@@ -6193,7 +6193,7 @@ class WebRTCClient extends Emitter {
|
|
|
6193
6193
|
transfer(session , target ) {
|
|
6194
6194
|
this.hold(session);
|
|
6195
6195
|
|
|
6196
|
-
logger
|
|
6196
|
+
logger.info('Transfering a session', {
|
|
6197
6197
|
id: this.getSipSessionId(session),
|
|
6198
6198
|
target,
|
|
6199
6199
|
});
|
|
@@ -6215,17 +6215,17 @@ class WebRTCClient extends Emitter {
|
|
|
6215
6215
|
atxfer(session ) {
|
|
6216
6216
|
this.hold(session);
|
|
6217
6217
|
|
|
6218
|
-
logger
|
|
6218
|
+
logger.info('webrtc transfer started', { id: this.getSipSessionId(session) });
|
|
6219
6219
|
|
|
6220
6220
|
const result = {
|
|
6221
6221
|
newSession: null,
|
|
6222
6222
|
init: async (target ) => {
|
|
6223
|
-
logger
|
|
6223
|
+
logger.info('webrtc transfer initialized', { id: this.getSipSessionId(session), target });
|
|
6224
6224
|
|
|
6225
6225
|
result.newSession = await this.call(target);
|
|
6226
6226
|
},
|
|
6227
6227
|
complete: () => {
|
|
6228
|
-
logger
|
|
6228
|
+
logger.info('webrtc transfer completed', {
|
|
6229
6229
|
id: this.getSipSessionId(session),
|
|
6230
6230
|
referId: this.getSipSessionId(result.newSession),
|
|
6231
6231
|
});
|
|
@@ -6246,7 +6246,7 @@ class WebRTCClient extends Emitter {
|
|
|
6246
6246
|
return;
|
|
6247
6247
|
}
|
|
6248
6248
|
|
|
6249
|
-
logger
|
|
6249
|
+
logger.info('send WebRTC message', { sipId: sipSession.id, contentType });
|
|
6250
6250
|
|
|
6251
6251
|
try {
|
|
6252
6252
|
sipSession.message({
|
|
@@ -6288,7 +6288,7 @@ class WebRTCClient extends Emitter {
|
|
|
6288
6288
|
}
|
|
6289
6289
|
|
|
6290
6290
|
changeAudioOutputVolume(volume ) {
|
|
6291
|
-
logger
|
|
6291
|
+
logger.info('Changing audio output volume', { volume });
|
|
6292
6292
|
|
|
6293
6293
|
Object.values(this.audioElements).forEach(audioElement => {
|
|
6294
6294
|
if (audioElement instanceof HTMLAudioElement) {
|
|
@@ -6300,7 +6300,7 @@ class WebRTCClient extends Emitter {
|
|
|
6300
6300
|
}
|
|
6301
6301
|
|
|
6302
6302
|
changeAudioOutputDevice(id ) {
|
|
6303
|
-
logger
|
|
6303
|
+
logger.info('Changing audio output device', { id });
|
|
6304
6304
|
|
|
6305
6305
|
Object.values(this.audioElements).forEach(audioElement => {
|
|
6306
6306
|
// `setSinkId` method is not included in any flow type definitions for HTMLAudioElements but is a valid method
|
|
@@ -6317,7 +6317,7 @@ class WebRTCClient extends Emitter {
|
|
|
6317
6317
|
|
|
6318
6318
|
changeAudioInputDevice(id , session ) {
|
|
6319
6319
|
const currentId = this.getAudioDeviceId();
|
|
6320
|
-
logger
|
|
6320
|
+
logger.info('setting audio input device', { id, currentId, session: !!session });
|
|
6321
6321
|
|
|
6322
6322
|
if (id === currentId) {
|
|
6323
6323
|
return null;
|
|
@@ -6363,7 +6363,7 @@ class WebRTCClient extends Emitter {
|
|
|
6363
6363
|
|
|
6364
6364
|
setVideoInputDevice(id ) {
|
|
6365
6365
|
const currentId = this.getVideoDeviceId();
|
|
6366
|
-
logger
|
|
6366
|
+
logger.info('setting video input device', { id, currentId });
|
|
6367
6367
|
|
|
6368
6368
|
if (id === currentId) {
|
|
6369
6369
|
return null;
|
|
@@ -6388,7 +6388,7 @@ class WebRTCClient extends Emitter {
|
|
|
6388
6388
|
const sessionId = this.getSipSessionId(session);
|
|
6389
6389
|
const localStream = this.getLocalStream(sessionId);
|
|
6390
6390
|
|
|
6391
|
-
logger
|
|
6391
|
+
logger.info('changing video input device', { id, sessionId });
|
|
6392
6392
|
|
|
6393
6393
|
// Release old video stream
|
|
6394
6394
|
if (localStream) {
|
|
@@ -6456,7 +6456,7 @@ class WebRTCClient extends Emitter {
|
|
|
6456
6456
|
const shouldDoScreenSharing = newConstraints && newConstraints.screen;
|
|
6457
6457
|
const desktop = newConstraints && newConstraints.desktop;
|
|
6458
6458
|
|
|
6459
|
-
logger
|
|
6459
|
+
logger.info('Sending reinvite', {
|
|
6460
6460
|
id: this.getSipSessionId(sipSession),
|
|
6461
6461
|
newConstraints,
|
|
6462
6462
|
conference,
|
|
@@ -6494,7 +6494,7 @@ class WebRTCClient extends Emitter {
|
|
|
6494
6494
|
sipSession.incomingInviteRequest.message.body = response.message.body;
|
|
6495
6495
|
}
|
|
6496
6496
|
|
|
6497
|
-
logger
|
|
6497
|
+
logger.info('on re-INVITE accepted', {
|
|
6498
6498
|
id: this.getSipSessionId(sipSession),
|
|
6499
6499
|
wasMuted,
|
|
6500
6500
|
shouldDoScreenSharing,
|
|
@@ -6669,7 +6669,7 @@ class WebRTCClient extends Emitter {
|
|
|
6669
6669
|
}
|
|
6670
6670
|
|
|
6671
6671
|
startHeartbeat() {
|
|
6672
|
-
logger
|
|
6672
|
+
logger.info('sdk webrtc start heartbeat', { userAgent: !!this.userAgent });
|
|
6673
6673
|
if (!this.userAgent) {
|
|
6674
6674
|
this.heartbeat.stop();
|
|
6675
6675
|
return;
|
|
@@ -6682,7 +6682,7 @@ class WebRTCClient extends Emitter {
|
|
|
6682
6682
|
}
|
|
6683
6683
|
|
|
6684
6684
|
stopHeartbeat() {
|
|
6685
|
-
logger
|
|
6685
|
+
logger.info('sdk webrtc stop heartbeat');
|
|
6686
6686
|
this.heartbeat.stop();
|
|
6687
6687
|
}
|
|
6688
6688
|
|
|
@@ -6703,7 +6703,7 @@ class WebRTCClient extends Emitter {
|
|
|
6703
6703
|
}
|
|
6704
6704
|
|
|
6705
6705
|
attemptReconnection() {
|
|
6706
|
-
logger
|
|
6706
|
+
logger.info('attempt reconnection', { userAgent: !!this.userAgent });
|
|
6707
6707
|
if (!this.userAgent) {
|
|
6708
6708
|
return;
|
|
6709
6709
|
}
|
|
@@ -6728,7 +6728,7 @@ class WebRTCClient extends Emitter {
|
|
|
6728
6728
|
return;
|
|
6729
6729
|
}
|
|
6730
6730
|
|
|
6731
|
-
logger
|
|
6731
|
+
logger.info('setting local media stream', {
|
|
6732
6732
|
sipSessionId,
|
|
6733
6733
|
tracks: newStream ? newStream.getTracks() : null,
|
|
6734
6734
|
});
|
|
@@ -6745,7 +6745,7 @@ class WebRTCClient extends Emitter {
|
|
|
6745
6745
|
|
|
6746
6746
|
const oldStream = this.getLocalStream(sipSessionId);
|
|
6747
6747
|
|
|
6748
|
-
logger
|
|
6748
|
+
logger.info('updating local stream', {
|
|
6749
6749
|
sipSessionId,
|
|
6750
6750
|
oldStream: !!oldStream,
|
|
6751
6751
|
tracks: newStream.getTracks(),
|
|
@@ -6765,7 +6765,7 @@ class WebRTCClient extends Emitter {
|
|
|
6765
6765
|
const remoteStream = this.getRemoteStream(sessionId);
|
|
6766
6766
|
const pc = this.getPeerConnection(sessionId);
|
|
6767
6767
|
|
|
6768
|
-
logger
|
|
6768
|
+
logger.info('Updating remote stream', {
|
|
6769
6769
|
sessionId,
|
|
6770
6770
|
tracks: remoteStream ? remoteStream.getTracks() : null,
|
|
6771
6771
|
receiverTracks: pc && pc.getReceivers ? pc.getReceivers().map(receiver => receiver.track) : null,
|
|
@@ -6790,14 +6790,16 @@ class WebRTCClient extends Emitter {
|
|
|
6790
6790
|
const screenSharing = constraints && 'screen' in constraints ? constraints.screen : false;
|
|
6791
6791
|
const isDesktop = constraints && 'desktop' in constraints ? constraints.desktop : false;
|
|
6792
6792
|
const withAudio = constraints && 'audio' in constraints ? constraints.audio : true;
|
|
6793
|
+
const mandatoryVideo = constraints && typeof constraints.video === 'object' ? constraints.video.mandatory : {};
|
|
6793
6794
|
|
|
6794
|
-
logger
|
|
6795
|
+
logger.info('Retrieving media a configuration', { enableVideo, screenSharing, isDesktop, withAudio, constraints });
|
|
6795
6796
|
|
|
6796
6797
|
return {
|
|
6797
6798
|
constraints: {
|
|
6798
6799
|
// Exact constraint are not supported with `getDisplayMedia` and we must have a video=false in desktop screenshare
|
|
6799
6800
|
audio: screenSharing ? !isDesktop : (withAudio ? this._getAudioConstraints() : false),
|
|
6800
|
-
video: screenSharing ? (isDesktop
|
|
6801
|
+
video: screenSharing ? (isDesktop
|
|
6802
|
+
? ({ mandatory: { chromeMediaSource: 'desktop', ...(mandatoryVideo || {}) } }) : { cursor: 'always' })
|
|
6801
6803
|
: this._getVideoConstraints(enableVideo),
|
|
6802
6804
|
screen: screenSharing,
|
|
6803
6805
|
desktop: isDesktop,
|
|
@@ -6840,7 +6842,7 @@ class WebRTCClient extends Emitter {
|
|
|
6840
6842
|
}
|
|
6841
6843
|
|
|
6842
6844
|
_onTransportError() {
|
|
6843
|
-
logger
|
|
6845
|
+
logger.error('on transport error');
|
|
6844
6846
|
this.eventEmitter.emit(TRANSPORT_ERROR);
|
|
6845
6847
|
this.attemptReconnection();
|
|
6846
6848
|
}
|
|
@@ -6849,7 +6851,7 @@ class WebRTCClient extends Emitter {
|
|
|
6849
6851
|
const body = message && typeof message === 'object' ? message.data : message;
|
|
6850
6852
|
if (body && body.indexOf('200 OK') !== -1) {
|
|
6851
6853
|
if (this.hasHeartbeat()) {
|
|
6852
|
-
logger
|
|
6854
|
+
logger.info('on heartbeat received from Asterisk', { hasHeartbeat: this.hasHeartbeat() });
|
|
6853
6855
|
|
|
6854
6856
|
this.heartbeat.onHeartbeat();
|
|
6855
6857
|
if (this.heartbeatCb) {
|
|
@@ -6860,7 +6862,7 @@ class WebRTCClient extends Emitter {
|
|
|
6860
6862
|
}
|
|
6861
6863
|
|
|
6862
6864
|
async _onHeartbeatTimeout() {
|
|
6863
|
-
logger
|
|
6865
|
+
logger.info('sdk webrtc heartbeat timed out', { userAgent: !!this.userAgent, cb: !!this.heartbeatTimeoutCb });
|
|
6864
6866
|
|
|
6865
6867
|
if (this.heartbeatTimeoutCb) {
|
|
6866
6868
|
this.heartbeatTimeoutCb();
|
|
@@ -6872,7 +6874,7 @@ class WebRTCClient extends Emitter {
|
|
|
6872
6874
|
try {
|
|
6873
6875
|
await this.userAgent.transport.disconnect();
|
|
6874
6876
|
} catch (e) {
|
|
6875
|
-
logger
|
|
6877
|
+
logger.error('Transport disconnection after heartbeat timeout, error', e);
|
|
6876
6878
|
}
|
|
6877
6879
|
}
|
|
6878
6880
|
|
|
@@ -6905,31 +6907,31 @@ class WebRTCClient extends Emitter {
|
|
|
6905
6907
|
}
|
|
6906
6908
|
|
|
6907
6909
|
_connectIfNeeded() {
|
|
6908
|
-
logger
|
|
6910
|
+
logger.info('connect if needed, checking', { connected: this.isConnected() });
|
|
6909
6911
|
if (!this.userAgent) {
|
|
6910
|
-
logger
|
|
6912
|
+
logger.info('need to recreate User Agent');
|
|
6911
6913
|
this.userAgent = this.createUserAgent(this.uaConfigOverrides);
|
|
6912
6914
|
}
|
|
6913
6915
|
|
|
6914
6916
|
if (this.isConnected()) {
|
|
6915
|
-
logger
|
|
6917
|
+
logger.info('webrtc sdk, already connected');
|
|
6916
6918
|
return Promise.resolve();
|
|
6917
6919
|
}
|
|
6918
6920
|
|
|
6919
6921
|
if (this.isConnecting()) {
|
|
6920
|
-
logger
|
|
6922
|
+
logger.info('webrtc sdk, already connecting...');
|
|
6921
6923
|
|
|
6922
6924
|
this.connectionPromise = this.userAgent.transport.connectPromise;
|
|
6923
6925
|
return this.connectionPromise;
|
|
6924
6926
|
}
|
|
6925
6927
|
|
|
6926
6928
|
if (this.connectionPromise) {
|
|
6927
|
-
logger
|
|
6929
|
+
logger.info('webrtc sdk, connection promise connecting...');
|
|
6928
6930
|
// $FlowFixMe
|
|
6929
6931
|
return this.connectionPromise;
|
|
6930
6932
|
}
|
|
6931
6933
|
|
|
6932
|
-
logger
|
|
6934
|
+
logger.info('WebRTC UA needs to connect');
|
|
6933
6935
|
|
|
6934
6936
|
// Force UA to reconnect
|
|
6935
6937
|
if (this.userAgent && this.userAgent.state !== userAgentState.UserAgentState.Stopped) {
|
|
@@ -7054,7 +7056,7 @@ class WebRTCClient extends Emitter {
|
|
|
7054
7056
|
|
|
7055
7057
|
sdh.peerConnectionDelegate = {
|
|
7056
7058
|
onicecandidateerror: (error ) => {
|
|
7057
|
-
logger
|
|
7059
|
+
logger.error('on icecandidate error', {
|
|
7058
7060
|
address: error.address,
|
|
7059
7061
|
port: error.port,
|
|
7060
7062
|
errorCode: error.errorCode,
|
|
@@ -7083,7 +7085,7 @@ class WebRTCClient extends Emitter {
|
|
|
7083
7085
|
updatedNumber = session.assertedIdentity.uri.normal.user;
|
|
7084
7086
|
updatedCalleeName = session.assertedIdentity.displayName || updatedNumber;
|
|
7085
7087
|
}
|
|
7086
|
-
logger
|
|
7088
|
+
logger.info('re-invite received', { updatedCalleeName, updatedNumber, hadRemoteVideo });
|
|
7087
7089
|
|
|
7088
7090
|
// Useful to know if it's a video upgrade or an unhold from a remote peer with a video stream
|
|
7089
7091
|
|
|
@@ -7104,7 +7106,7 @@ class WebRTCClient extends Emitter {
|
|
|
7104
7106
|
}
|
|
7105
7107
|
|
|
7106
7108
|
_onAccepted(session , sessionDialog , withEvent = true) {
|
|
7107
|
-
logger
|
|
7109
|
+
logger.info('on call accepted', { id: session.id, remoteTag: session.remoteTag });
|
|
7108
7110
|
|
|
7109
7111
|
this.storeSipSession(session);
|
|
7110
7112
|
|
|
@@ -7116,7 +7118,7 @@ class WebRTCClient extends Emitter {
|
|
|
7116
7118
|
const onTrack = (event ) => {
|
|
7117
7119
|
const isAudioOnly = this._isAudioOnly(session);
|
|
7118
7120
|
const { kind, label, readyState, id, muted } = event.track;
|
|
7119
|
-
logger
|
|
7121
|
+
logger.info('on track event', { isAudioOnly, kind, label, readyState, id, muted });
|
|
7120
7122
|
|
|
7121
7123
|
// Stop video track in audio only mode
|
|
7122
7124
|
if (isAudioOnly && kind === 'video') {
|
|
@@ -7132,12 +7134,14 @@ class WebRTCClient extends Emitter {
|
|
|
7132
7134
|
|
|
7133
7135
|
session.sessionDescriptionHandler.remoteMediaStream.onaddtrack = onTrack;
|
|
7134
7136
|
|
|
7135
|
-
|
|
7136
|
-
|
|
7137
|
-
|
|
7138
|
-
|
|
7139
|
-
|
|
7140
|
-
|
|
7137
|
+
if (pc) {
|
|
7138
|
+
pc.oniceconnectionstatechange = () => {
|
|
7139
|
+
logger.info('on ice connection state changed', { state: pc.iceConnectionState });
|
|
7140
|
+
if (pc.iceConnectionState === 'disconnected') {
|
|
7141
|
+
this.eventEmitter.emit(ON_DISCONNECTED);
|
|
7142
|
+
}
|
|
7143
|
+
};
|
|
7144
|
+
}
|
|
7141
7145
|
|
|
7142
7146
|
if (withEvent) {
|
|
7143
7147
|
this.eventEmitter.emit(ACCEPTED, session, sessionDialog);
|
|
@@ -7306,10 +7310,10 @@ class WebRTCClient extends Emitter {
|
|
|
7306
7310
|
|
|
7307
7311
|
_stopSendingStats(session ) {
|
|
7308
7312
|
const sessionId = this.getSipSessionId(session);
|
|
7309
|
-
logger
|
|
7313
|
+
logger.trace('Check for stopping stats', { sessionId, ids: Object.keys(this.statsIntervals) });
|
|
7310
7314
|
|
|
7311
7315
|
if (sessionId in this.statsIntervals) {
|
|
7312
|
-
logger
|
|
7316
|
+
logger.trace('Stop sending stats for call', { sessionId });
|
|
7313
7317
|
this.statsIntervals[sessionId]();
|
|
7314
7318
|
delete this.statsIntervals[sessionId];
|
|
7315
7319
|
}
|
|
@@ -7325,7 +7329,7 @@ class WebRTCClient extends Emitter {
|
|
|
7325
7329
|
try {
|
|
7326
7330
|
await this.userAgent.transport.disconnect();
|
|
7327
7331
|
} catch (e) {
|
|
7328
|
-
logger
|
|
7332
|
+
logger.error('WebRTC transport disconnect, error', e);
|
|
7329
7333
|
}
|
|
7330
7334
|
}
|
|
7331
7335
|
}
|
|
@@ -7347,13 +7351,17 @@ class WebRTCClient extends Emitter {
|
|
|
7347
7351
|
const nbStats = this.sessionNetworkStats[sessionId].length;
|
|
7348
7352
|
const lastNetworkStats = this.sessionNetworkStats[sessionId][nbStats - 1];
|
|
7349
7353
|
const lastAudioSent = lastNetworkStats ? lastNetworkStats.audioBytesSent : 0;
|
|
7354
|
+
const lastAudioContentSent = lastNetworkStats ? lastNetworkStats.audioContentSent : 0;
|
|
7350
7355
|
const lastVideoSent = lastNetworkStats ? lastNetworkStats.videoBytesSent : 0;
|
|
7351
7356
|
const lastAudioReceived = lastNetworkStats ? lastNetworkStats.audioBytesReceived : 0;
|
|
7357
|
+
const lastAudioContentReceived = lastNetworkStats ? lastNetworkStats.audioContentReceived : 0;
|
|
7352
7358
|
const lastVideoReceived = lastNetworkStats ? lastNetworkStats.videoBytesReceived : 0;
|
|
7353
7359
|
const lastTransportSent = lastNetworkStats ? lastNetworkStats.transportSent : 0;
|
|
7354
7360
|
const lastTransportReceived = lastNetworkStats ? lastNetworkStats.transportReceived : 0;
|
|
7355
|
-
let audioBytesSent = 0;
|
|
7356
|
-
let audioBytesReceived = 0;
|
|
7361
|
+
let audioBytesSent = 0; // content + header
|
|
7362
|
+
let audioBytesReceived = 0; // content + header
|
|
7363
|
+
let audioContentSent = 0; // useful to detect blank call
|
|
7364
|
+
let audioContentReceived = 0;
|
|
7357
7365
|
let videoBytesSent = 0;
|
|
7358
7366
|
let videoBytesReceived = 0;
|
|
7359
7367
|
let transportSent = 0;
|
|
@@ -7363,6 +7371,7 @@ class WebRTCClient extends Emitter {
|
|
|
7363
7371
|
stats.forEach(report => {
|
|
7364
7372
|
if (report.type === 'outbound-rtp' && report.kind === 'audio') {
|
|
7365
7373
|
audioBytesSent += Number(report.bytesSent) + Number(report.headerBytesSent);
|
|
7374
|
+
audioContentSent += Number(report.bytesSent);
|
|
7366
7375
|
}
|
|
7367
7376
|
if (report.type === 'remote-outbound-rtp' && report.kind === 'audio') {
|
|
7368
7377
|
audioBytesSent += Number(report.bytesSent);
|
|
@@ -7374,6 +7383,7 @@ class WebRTCClient extends Emitter {
|
|
|
7374
7383
|
packetsLost += Number(report.packetsLost);
|
|
7375
7384
|
networkStats.packetsReceived = Number(report.packetsReceived);
|
|
7376
7385
|
audioBytesReceived += Number(report.bytesReceived) + Number(report.headerBytesReceived);
|
|
7386
|
+
audioContentReceived += Number(report.bytesReceived);
|
|
7377
7387
|
}
|
|
7378
7388
|
if (report.type === 'inbound-rtp' && report.kind === 'video') {
|
|
7379
7389
|
videoBytesReceived += Number(report.bytesReceived) + Number(report.headerBytesReceived);
|
|
@@ -7402,10 +7412,17 @@ class WebRTCClient extends Emitter {
|
|
|
7402
7412
|
});
|
|
7403
7413
|
|
|
7404
7414
|
networkStats.packetsLost = packetsLost;
|
|
7415
|
+
|
|
7405
7416
|
networkStats.totalAudioBytesSent = audioBytesSent;
|
|
7406
7417
|
networkStats.audioBytesSent = audioBytesSent - lastAudioSent;
|
|
7407
7418
|
networkStats.totalAudioBytesReceived = audioBytesReceived - lastAudioReceived;
|
|
7408
7419
|
networkStats.audioBytesReceived = audioBytesReceived;
|
|
7420
|
+
|
|
7421
|
+
networkStats.totalAudioContentSent = audioContentSent;
|
|
7422
|
+
networkStats.audioContentSent = audioContentSent - lastAudioContentSent;
|
|
7423
|
+
networkStats.totalAudioBytesReceived = audioContentReceived - lastAudioContentReceived;
|
|
7424
|
+
networkStats.audioContentReceived = audioContentReceived;
|
|
7425
|
+
|
|
7409
7426
|
networkStats.totalVideoBytesSent = videoBytesSent;
|
|
7410
7427
|
networkStats.videoBytesSent = videoBytesSent - lastVideoSent;
|
|
7411
7428
|
networkStats.totalVideoBytesReceived = videoBytesReceived;
|