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