@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
|
@@ -109,11 +109,11 @@ 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 = () => {
|
|
116
|
-
if (typeof document !== 'undefined') {
|
|
116
|
+
if (typeof document !== 'undefined' && window.fetch) {
|
|
117
117
|
// Browser
|
|
118
118
|
return window.fetch;
|
|
119
119
|
}
|
|
@@ -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();
|
|
@@ -832,11 +832,16 @@ class WazoSessionDescriptionHandler extends sessionDescriptionHandler.SessionDes
|
|
|
832
832
|
|
|
833
833
|
// $FlowFixMe
|
|
834
834
|
setRemoteSessionDescription(sessionDescription ) {
|
|
835
|
-
|
|
835
|
+
try {
|
|
836
|
+
const result = super.setRemoteSessionDescription(sessionDescription);
|
|
836
837
|
|
|
837
|
-
|
|
838
|
+
this.eventEmitter.emit('setDescription', sessionDescription);
|
|
838
839
|
|
|
839
|
-
|
|
840
|
+
return result;
|
|
841
|
+
} catch (error) {
|
|
842
|
+
this.logger.error('SessionDescriptionHandler.setRemoteSessionDescription error', error);
|
|
843
|
+
throw error;
|
|
844
|
+
}
|
|
840
845
|
}
|
|
841
846
|
|
|
842
847
|
// Overridden to avoid to fix ice-candidates missing in the SDP in react-native and chrome canary.
|
|
@@ -2456,7 +2461,7 @@ class Contact {
|
|
|
2456
2461
|
this[key] = old[key] || this[key];
|
|
2457
2462
|
});
|
|
2458
2463
|
|
|
2459
|
-
if (old.lineState
|
|
2464
|
+
if (old.lineState) {
|
|
2460
2465
|
this.lineState = old.lineState;
|
|
2461
2466
|
}
|
|
2462
2467
|
|
|
@@ -4147,7 +4152,7 @@ const TRANSFER_FLOW_BLIND = 'blind';
|
|
|
4147
4152
|
|
|
4148
4153
|
// const MINIMUM_WAZO_ENGINE_VERSION_FOR_CTI_HOLD = '20.11';
|
|
4149
4154
|
|
|
4150
|
-
|
|
4155
|
+
IssueReporter$1 ? IssueReporter$1.loggerFor('cti-phone') : console;
|
|
4151
4156
|
|
|
4152
4157
|
/* */
|
|
4153
4158
|
|
|
@@ -5066,7 +5071,7 @@ const AGENTD_VERSION = '1.0';
|
|
|
5066
5071
|
const WEBHOOKD_VERSION = '1.0';
|
|
5067
5072
|
const AMID_VERSION = '1.0';
|
|
5068
5073
|
|
|
5069
|
-
const logger$
|
|
5074
|
+
const logger$1 = IssueReporter$1 ? IssueReporter$1.loggerFor('api') : console;
|
|
5070
5075
|
|
|
5071
5076
|
class ApiClient {
|
|
5072
5077
|
|
|
@@ -5118,12 +5123,12 @@ class ApiClient {
|
|
|
5118
5123
|
}
|
|
5119
5124
|
|
|
5120
5125
|
async forceRefreshToken() {
|
|
5121
|
-
logger$
|
|
5126
|
+
logger$1.info('forcing refresh token, calling callback');
|
|
5122
5127
|
return this.refreshTokenCallback();
|
|
5123
5128
|
}
|
|
5124
5129
|
|
|
5125
5130
|
async refreshTokenCallback() {
|
|
5126
|
-
logger$
|
|
5131
|
+
logger$1.info('refresh token callback called', {
|
|
5127
5132
|
refreshToken: this.refreshToken,
|
|
5128
5133
|
refreshBackend: this.refreshBackend,
|
|
5129
5134
|
refreshExpiration: this.refreshExpiration,
|
|
@@ -5141,7 +5146,7 @@ class ApiClient {
|
|
|
5141
5146
|
this.isMobile,
|
|
5142
5147
|
);
|
|
5143
5148
|
|
|
5144
|
-
logger$
|
|
5149
|
+
logger$1.info('token refreshed', { token: session.token });
|
|
5145
5150
|
|
|
5146
5151
|
if (this.onRefreshToken) {
|
|
5147
5152
|
this.onRefreshToken(session.token, session);
|
|
@@ -5314,7 +5319,7 @@ const DEFAULT_ICE_TIMEOUT = 3000;
|
|
|
5314
5319
|
const SEND_STATS_DELAY = 5000;
|
|
5315
5320
|
|
|
5316
5321
|
const states = ['STATUS_NULL', 'STATUS_NEW', 'STATUS_CONNECTING', 'STATUS_CONNECTED', 'STATUS_COMPLETED'];
|
|
5317
|
-
const logger
|
|
5322
|
+
const logger = IssueReporter$1 ? IssueReporter$1.loggerFor('webrtc-client') : console;
|
|
5318
5323
|
const statsLogger = IssueReporter$1 ? IssueReporter$1.loggerFor('webrtc-stats') : console;
|
|
5319
5324
|
|
|
5320
5325
|
// events
|
|
@@ -5490,13 +5495,13 @@ class WebRTCClient extends Emitter {
|
|
|
5490
5495
|
|
|
5491
5496
|
createUserAgent(configOverrides ) {
|
|
5492
5497
|
const webRTCConfiguration = this._createWebRTCConfiguration(configOverrides);
|
|
5493
|
-
logger
|
|
5498
|
+
logger.info('sdk webrtc, creating UA', { webRTCConfiguration });
|
|
5494
5499
|
|
|
5495
5500
|
webRTCConfiguration.delegate = {
|
|
5496
5501
|
onConnect: this.onConnect.bind(this),
|
|
5497
5502
|
onDisconnect: this.onDisconnect.bind(this),
|
|
5498
5503
|
onInvite: (invitation ) => {
|
|
5499
|
-
logger
|
|
5504
|
+
logger.info('sdk webrtc on invite', {
|
|
5500
5505
|
method: 'delegate.onInvite',
|
|
5501
5506
|
id: invitation.id,
|
|
5502
5507
|
remoteURI: invitation.remoteURI,
|
|
@@ -5539,7 +5544,7 @@ class WebRTCClient extends Emitter {
|
|
|
5539
5544
|
}
|
|
5540
5545
|
|
|
5541
5546
|
onConnect() {
|
|
5542
|
-
logger
|
|
5547
|
+
logger.info('sdk webrtc connected', { method: 'delegate.onConnect' });
|
|
5543
5548
|
this.eventEmitter.emit(CONNECTED);
|
|
5544
5549
|
if (!this.isRegistered() && this.registerer && this.registerer.waiting) {
|
|
5545
5550
|
this.registerer.waitingToggle(false);
|
|
@@ -5548,7 +5553,7 @@ class WebRTCClient extends Emitter {
|
|
|
5548
5553
|
}
|
|
5549
5554
|
|
|
5550
5555
|
async onDisconnect(error ) {
|
|
5551
|
-
logger
|
|
5556
|
+
logger.info('sdk webrtc disconnected', { method: 'delegate.onConnect', error });
|
|
5552
5557
|
this.connectionPromise = null;
|
|
5553
5558
|
// The UA will attempt to reconnect automatically when an error occurred
|
|
5554
5559
|
this.eventEmitter.emit(DISCONNECTED, error);
|
|
@@ -5573,37 +5578,37 @@ class WebRTCClient extends Emitter {
|
|
|
5573
5578
|
};
|
|
5574
5579
|
|
|
5575
5580
|
if (this.skipRegister) {
|
|
5576
|
-
logger
|
|
5581
|
+
logger.info('sdk webrtc skip register...', logInfo);
|
|
5577
5582
|
return Promise.resolve();
|
|
5578
5583
|
}
|
|
5579
5584
|
|
|
5580
|
-
logger
|
|
5585
|
+
logger.info('sdk webrtc registering...', logInfo);
|
|
5581
5586
|
|
|
5582
5587
|
if (!this.userAgent) {
|
|
5583
|
-
logger
|
|
5588
|
+
logger.info('sdk webrtc recreating User Agent');
|
|
5584
5589
|
this.userAgent = this.createUserAgent(this.uaConfigOverrides);
|
|
5585
5590
|
}
|
|
5586
5591
|
if (!this.userAgent || this.isRegistered()) {
|
|
5587
|
-
logger
|
|
5592
|
+
logger.info('sdk webrtc registering aborted, already registered or no UA can be created');
|
|
5588
5593
|
return Promise.resolve();
|
|
5589
5594
|
}
|
|
5590
5595
|
|
|
5591
5596
|
if (this.connectionPromise || (this.registerer && this.registerer.waiting)) {
|
|
5592
|
-
logger
|
|
5597
|
+
logger.info('sdk webrtc registering aborted due to a registration in progress.');
|
|
5593
5598
|
return Promise.resolve();
|
|
5594
5599
|
}
|
|
5595
5600
|
|
|
5596
5601
|
const registerOptions = this._isWeb() ? {} : { extraContactHeaderParams: ['mobility=mobile'] };
|
|
5597
5602
|
|
|
5598
5603
|
const onRegisterFailed = () => {
|
|
5599
|
-
logger
|
|
5604
|
+
logger.info('sdk webrtc registering failed', { tries, registerer: !!this.registerer });
|
|
5600
5605
|
this.connectionPromise = null;
|
|
5601
5606
|
if (this.registerer && this.registerer.waiting) {
|
|
5602
5607
|
this.registerer.waitingToggle(false);
|
|
5603
5608
|
}
|
|
5604
5609
|
|
|
5605
5610
|
if (tries <= MAX_REGISTER_TRIES) {
|
|
5606
|
-
logger
|
|
5611
|
+
logger.info('sdk webrtc registering, retrying...', { tries });
|
|
5607
5612
|
setTimeout(() => this.register(tries + 1), 300);
|
|
5608
5613
|
}
|
|
5609
5614
|
};
|
|
@@ -5612,18 +5617,18 @@ class WebRTCClient extends Emitter {
|
|
|
5612
5617
|
// Avoid race condition with the close method called just before register and setting userAgent to null
|
|
5613
5618
|
// during the resolution of the primise.
|
|
5614
5619
|
if (!this.userAgent) {
|
|
5615
|
-
logger
|
|
5620
|
+
logger.info('sdk webrtc recreating User Agent after connection');
|
|
5616
5621
|
this.userAgent = this.createUserAgent(this.uaConfigOverrides);
|
|
5617
5622
|
}
|
|
5618
5623
|
|
|
5619
|
-
logger
|
|
5624
|
+
logger.info('sdk webrtc registering, transport connected', { registerOptions, ua: !!this.userAgent });
|
|
5620
5625
|
this.registerer = new registerer.Registerer(this.userAgent, registerOptions);
|
|
5621
5626
|
this.connectionPromise = null;
|
|
5622
5627
|
this._monkeyPatchRegisterer(this.registerer);
|
|
5623
5628
|
|
|
5624
5629
|
// Bind registerer events
|
|
5625
5630
|
this.registerer.stateChange.addListener(newState => {
|
|
5626
|
-
logger
|
|
5631
|
+
logger.info('sdk webrtc registering, state changed', { newState });
|
|
5627
5632
|
|
|
5628
5633
|
if (newState === registererState.RegistererState.Registered && this.registerer
|
|
5629
5634
|
&& this.registerer.state === registererState.RegistererState.Registered) {
|
|
@@ -5636,7 +5641,7 @@ class WebRTCClient extends Emitter {
|
|
|
5636
5641
|
const options = {
|
|
5637
5642
|
requestDelegate: {
|
|
5638
5643
|
onReject: response => {
|
|
5639
|
-
logger
|
|
5644
|
+
logger.error('sdk webrtc registering, rejected', { response });
|
|
5640
5645
|
|
|
5641
5646
|
onRegisterFailed();
|
|
5642
5647
|
},
|
|
@@ -5644,13 +5649,13 @@ class WebRTCClient extends Emitter {
|
|
|
5644
5649
|
};
|
|
5645
5650
|
|
|
5646
5651
|
return this.registerer.register(options).catch((e) => {
|
|
5647
|
-
logger
|
|
5652
|
+
logger.error('sdk webrtc registering, error', e);
|
|
5648
5653
|
|
|
5649
5654
|
this.eventEmitter.emit(REGISTRATION_FAILED);
|
|
5650
5655
|
return e;
|
|
5651
5656
|
});
|
|
5652
5657
|
}).catch(error => {
|
|
5653
|
-
logger
|
|
5658
|
+
logger.error('sdk webrtc registering, transport error', error);
|
|
5654
5659
|
onRegisterFailed();
|
|
5655
5660
|
});
|
|
5656
5661
|
}
|
|
@@ -5679,21 +5684,21 @@ class WebRTCClient extends Emitter {
|
|
|
5679
5684
|
}
|
|
5680
5685
|
|
|
5681
5686
|
unregister() {
|
|
5682
|
-
logger
|
|
5687
|
+
logger.info('sdk webrtc unregistering..', { userAgent: !!this.userAgent, registerer: !!this.registerer });
|
|
5683
5688
|
if (!this.registerer) {
|
|
5684
5689
|
return Promise.resolve();
|
|
5685
5690
|
}
|
|
5686
5691
|
|
|
5687
5692
|
try {
|
|
5688
5693
|
return this.registerer.unregister().then(() => {
|
|
5689
|
-
logger
|
|
5694
|
+
logger.info('sdk webrtc unregistered');
|
|
5690
5695
|
this._cleanupRegister();
|
|
5691
5696
|
}).catch(e => {
|
|
5692
|
-
logger
|
|
5697
|
+
logger.error('sdk webrtc unregistering, promise error', e);
|
|
5693
5698
|
this._cleanupRegister();
|
|
5694
5699
|
});
|
|
5695
5700
|
} catch (e) {
|
|
5696
|
-
logger
|
|
5701
|
+
logger.error('sdk webrtc unregistering, error', e);
|
|
5697
5702
|
// Avoid issue with `undefined is not an object (evaluating 'new.target.prototype')` when triggering a new
|
|
5698
5703
|
// error when the registerer is in a bad state
|
|
5699
5704
|
this._cleanupRegister();
|
|
@@ -5701,7 +5706,7 @@ class WebRTCClient extends Emitter {
|
|
|
5701
5706
|
}
|
|
5702
5707
|
|
|
5703
5708
|
stop() {
|
|
5704
|
-
logger
|
|
5709
|
+
logger.info('sdk webrtc stop', { userAgent: !!this.userAgent });
|
|
5705
5710
|
if (!this.userAgent) {
|
|
5706
5711
|
return Promise.resolve();
|
|
5707
5712
|
}
|
|
@@ -5709,12 +5714,12 @@ class WebRTCClient extends Emitter {
|
|
|
5709
5714
|
return this.userAgent.stop().then(() => {
|
|
5710
5715
|
return this._cleanupRegister();
|
|
5711
5716
|
}).catch(e => {
|
|
5712
|
-
logger
|
|
5717
|
+
logger.warn('sdk webrtc stop, error', { message: e.message, stack: e.stack });
|
|
5713
5718
|
});
|
|
5714
5719
|
}
|
|
5715
5720
|
|
|
5716
5721
|
call(number , enableVideo , audioOnly = false, conference = false) {
|
|
5717
|
-
logger
|
|
5722
|
+
logger.info('sdk webrtc creating call', { number, enableVideo, audioOnly, conference });
|
|
5718
5723
|
const inviterOptions = {
|
|
5719
5724
|
sessionDescriptionHandlerOptionsReInvite: {
|
|
5720
5725
|
conference,
|
|
@@ -5745,7 +5750,7 @@ class WebRTCClient extends Emitter {
|
|
|
5745
5750
|
this._onAccepted(session, response.session, true);
|
|
5746
5751
|
},
|
|
5747
5752
|
onReject: (response ) => {
|
|
5748
|
-
logger
|
|
5753
|
+
logger.info('on call rejected', { id: session.id, fromTag: session.fromTag });
|
|
5749
5754
|
this._stopSendingStats(session);
|
|
5750
5755
|
this.stopNetworkMonitoring(session);
|
|
5751
5756
|
|
|
@@ -5768,11 +5773,11 @@ class WebRTCClient extends Emitter {
|
|
|
5768
5773
|
}
|
|
5769
5774
|
|
|
5770
5775
|
answer(session , enableVideo ) {
|
|
5771
|
-
logger
|
|
5776
|
+
logger.info('sdk webrtc answer call', { id: session.id, enableVideo });
|
|
5772
5777
|
|
|
5773
5778
|
if (!session || !session.accept) {
|
|
5774
5779
|
const error = 'No session to answer, or not an invitation';
|
|
5775
|
-
logger
|
|
5780
|
+
logger.warn(error);
|
|
5776
5781
|
return Promise.reject(new Error(error));
|
|
5777
5782
|
}
|
|
5778
5783
|
const options = {
|
|
@@ -5782,15 +5787,15 @@ class WebRTCClient extends Emitter {
|
|
|
5782
5787
|
return session.accept(options).then(() => {
|
|
5783
5788
|
if (session.isCanceled) {
|
|
5784
5789
|
const message = 'accepted a canceled session (or was canceled during the accept phase).';
|
|
5785
|
-
logger
|
|
5790
|
+
logger.error(message, { id: session.id });
|
|
5786
5791
|
this.onCallEnded(session);
|
|
5787
5792
|
|
|
5788
5793
|
throw new CanceledCallError(message);
|
|
5789
5794
|
}
|
|
5790
|
-
logger
|
|
5795
|
+
logger.info('sdk webrtc answer, accepted.');
|
|
5791
5796
|
this._onAccepted(session);
|
|
5792
5797
|
}).catch(e => {
|
|
5793
|
-
logger
|
|
5798
|
+
logger.error(`answer call error for ${session ? session.id : 'n/a'}`, e);
|
|
5794
5799
|
|
|
5795
5800
|
throw e;
|
|
5796
5801
|
});
|
|
@@ -5798,7 +5803,7 @@ class WebRTCClient extends Emitter {
|
|
|
5798
5803
|
|
|
5799
5804
|
hangup(session ) {
|
|
5800
5805
|
const { state, id } = session;
|
|
5801
|
-
logger
|
|
5806
|
+
logger.info('sdk webrtc hangup call', { id, state });
|
|
5802
5807
|
|
|
5803
5808
|
try {
|
|
5804
5809
|
this._stopSendingStats(session);
|
|
@@ -5827,7 +5832,7 @@ class WebRTCClient extends Emitter {
|
|
|
5827
5832
|
|
|
5828
5833
|
return bye();
|
|
5829
5834
|
} catch (error) {
|
|
5830
|
-
logger
|
|
5835
|
+
logger.warn('sdk webrtc hangup, error', error);
|
|
5831
5836
|
}
|
|
5832
5837
|
|
|
5833
5838
|
return null;
|
|
@@ -5845,7 +5850,7 @@ class WebRTCClient extends Emitter {
|
|
|
5845
5850
|
// Fetch and emit an event at `interval` with session network stats
|
|
5846
5851
|
startNetworkMonitoring(session , interval = 1000) {
|
|
5847
5852
|
const sessionId = this.getSipSessionId(session);
|
|
5848
|
-
logger
|
|
5853
|
+
logger.info('starting network inspection', { id: sessionId });
|
|
5849
5854
|
|
|
5850
5855
|
this.sessionNetworkStats[sessionId] = [];
|
|
5851
5856
|
|
|
@@ -5855,7 +5860,7 @@ class WebRTCClient extends Emitter {
|
|
|
5855
5860
|
stopNetworkMonitoring(session ) {
|
|
5856
5861
|
const sessionId = this.getSipSessionId(session);
|
|
5857
5862
|
const exists = sessionId in this.networkMonitoringInterval;
|
|
5858
|
-
logger
|
|
5863
|
+
logger.info('stopping network inspection', { id: sessionId, exists });
|
|
5859
5864
|
|
|
5860
5865
|
if (exists) {
|
|
5861
5866
|
clearInterval(this.networkMonitoringInterval[sessionId]);
|
|
@@ -5865,17 +5870,17 @@ class WebRTCClient extends Emitter {
|
|
|
5865
5870
|
}
|
|
5866
5871
|
|
|
5867
5872
|
reject(session ) {
|
|
5868
|
-
logger
|
|
5873
|
+
logger.info('sdk webrtc reject call', { id: session.id });
|
|
5869
5874
|
|
|
5870
5875
|
try {
|
|
5871
5876
|
return session.reject ? session.reject() : session.cancel();
|
|
5872
5877
|
} catch (e) {
|
|
5873
|
-
logger
|
|
5878
|
+
logger.warn('Error when rejecting call', e.message, e.stack);
|
|
5874
5879
|
}
|
|
5875
5880
|
}
|
|
5876
5881
|
|
|
5877
5882
|
async close() {
|
|
5878
|
-
logger
|
|
5883
|
+
logger.info('sdk webrtc closing client', { userAgent: !!this.userAgent });
|
|
5879
5884
|
this._cleanupMedia();
|
|
5880
5885
|
this.connectionPromise = null;
|
|
5881
5886
|
|
|
@@ -5906,7 +5911,7 @@ class WebRTCClient extends Emitter {
|
|
|
5906
5911
|
// eg: "INVITE not rejectable in state Completed"
|
|
5907
5912
|
}
|
|
5908
5913
|
this.userAgent = null;
|
|
5909
|
-
logger
|
|
5914
|
+
logger.info('sdk webrtc client closed');
|
|
5910
5915
|
}
|
|
5911
5916
|
|
|
5912
5917
|
getNumber(session ) {
|
|
@@ -5919,13 +5924,13 @@ class WebRTCClient extends Emitter {
|
|
|
5919
5924
|
}
|
|
5920
5925
|
|
|
5921
5926
|
mute(session ) {
|
|
5922
|
-
logger
|
|
5927
|
+
logger.info('sdk webrtc mute', { id: session.id });
|
|
5923
5928
|
|
|
5924
5929
|
this._toggleAudio(session, true);
|
|
5925
5930
|
}
|
|
5926
5931
|
|
|
5927
5932
|
unmute(session ) {
|
|
5928
|
-
logger
|
|
5933
|
+
logger.info('sdk webrtc unmute', { id: session.id });
|
|
5929
5934
|
|
|
5930
5935
|
this._toggleAudio(session, false);
|
|
5931
5936
|
}
|
|
@@ -5965,13 +5970,13 @@ class WebRTCClient extends Emitter {
|
|
|
5965
5970
|
}
|
|
5966
5971
|
|
|
5967
5972
|
toggleCameraOn(session ) {
|
|
5968
|
-
logger
|
|
5973
|
+
logger.info('sdk webrtc toggle camera on', { id: session.id });
|
|
5969
5974
|
|
|
5970
5975
|
this._toggleVideo(session, false);
|
|
5971
5976
|
}
|
|
5972
5977
|
|
|
5973
5978
|
toggleCameraOff(session ) {
|
|
5974
|
-
logger
|
|
5979
|
+
logger.info('sdk webrtc toggle camera off', { id: session.id });
|
|
5975
5980
|
|
|
5976
5981
|
this._toggleVideo(session, true);
|
|
5977
5982
|
}
|
|
@@ -5980,7 +5985,7 @@ class WebRTCClient extends Emitter {
|
|
|
5980
5985
|
const sessionId = this.getSipSessionId(session);
|
|
5981
5986
|
const hasVideo = hadVideo || this.hasLocalVideo(sessionId);
|
|
5982
5987
|
|
|
5983
|
-
logger
|
|
5988
|
+
logger.info('sdk webrtc hold', {
|
|
5984
5989
|
sessionId,
|
|
5985
5990
|
keys: Object.keys(this.heldSessions),
|
|
5986
5991
|
pendingReinvite: !!session.pendingReinvite,
|
|
@@ -6029,7 +6034,7 @@ class WebRTCClient extends Emitter {
|
|
|
6029
6034
|
const sessionId = this.getSipSessionId(session);
|
|
6030
6035
|
const hasVideo = sessionId in this.heldSessions && this.heldSessions[sessionId].hasVideo;
|
|
6031
6036
|
|
|
6032
|
-
logger
|
|
6037
|
+
logger.info('sdk webrtc unhold', {
|
|
6033
6038
|
sessionId,
|
|
6034
6039
|
keys: Object.keys(this.heldSessions),
|
|
6035
6040
|
pendingReinvite: !!session.pendingReinvite,
|
|
@@ -6177,7 +6182,7 @@ class WebRTCClient extends Emitter {
|
|
|
6177
6182
|
if (!session.sessionDescriptionHandler) {
|
|
6178
6183
|
return;
|
|
6179
6184
|
}
|
|
6180
|
-
logger
|
|
6185
|
+
logger.info('Sending DTMF', {
|
|
6181
6186
|
id: this.getSipSessionId(session),
|
|
6182
6187
|
tone,
|
|
6183
6188
|
});
|
|
@@ -6193,7 +6198,7 @@ class WebRTCClient extends Emitter {
|
|
|
6193
6198
|
transfer(session , target ) {
|
|
6194
6199
|
this.hold(session);
|
|
6195
6200
|
|
|
6196
|
-
logger
|
|
6201
|
+
logger.info('Transfering a session', {
|
|
6197
6202
|
id: this.getSipSessionId(session),
|
|
6198
6203
|
target,
|
|
6199
6204
|
});
|
|
@@ -6215,17 +6220,17 @@ class WebRTCClient extends Emitter {
|
|
|
6215
6220
|
atxfer(session ) {
|
|
6216
6221
|
this.hold(session);
|
|
6217
6222
|
|
|
6218
|
-
logger
|
|
6223
|
+
logger.info('webrtc transfer started', { id: this.getSipSessionId(session) });
|
|
6219
6224
|
|
|
6220
6225
|
const result = {
|
|
6221
6226
|
newSession: null,
|
|
6222
6227
|
init: async (target ) => {
|
|
6223
|
-
logger
|
|
6228
|
+
logger.info('webrtc transfer initialized', { id: this.getSipSessionId(session), target });
|
|
6224
6229
|
|
|
6225
6230
|
result.newSession = await this.call(target);
|
|
6226
6231
|
},
|
|
6227
6232
|
complete: () => {
|
|
6228
|
-
logger
|
|
6233
|
+
logger.info('webrtc transfer completed', {
|
|
6229
6234
|
id: this.getSipSessionId(session),
|
|
6230
6235
|
referId: this.getSipSessionId(result.newSession),
|
|
6231
6236
|
});
|
|
@@ -6246,7 +6251,7 @@ class WebRTCClient extends Emitter {
|
|
|
6246
6251
|
return;
|
|
6247
6252
|
}
|
|
6248
6253
|
|
|
6249
|
-
logger
|
|
6254
|
+
logger.info('send WebRTC message', { sipId: sipSession.id, contentType });
|
|
6250
6255
|
|
|
6251
6256
|
try {
|
|
6252
6257
|
sipSession.message({
|
|
@@ -6288,7 +6293,7 @@ class WebRTCClient extends Emitter {
|
|
|
6288
6293
|
}
|
|
6289
6294
|
|
|
6290
6295
|
changeAudioOutputVolume(volume ) {
|
|
6291
|
-
logger
|
|
6296
|
+
logger.info('Changing audio output volume', { volume });
|
|
6292
6297
|
|
|
6293
6298
|
Object.values(this.audioElements).forEach(audioElement => {
|
|
6294
6299
|
if (audioElement instanceof HTMLAudioElement) {
|
|
@@ -6300,7 +6305,7 @@ class WebRTCClient extends Emitter {
|
|
|
6300
6305
|
}
|
|
6301
6306
|
|
|
6302
6307
|
changeAudioOutputDevice(id ) {
|
|
6303
|
-
logger
|
|
6308
|
+
logger.info('Changing audio output device', { id });
|
|
6304
6309
|
|
|
6305
6310
|
Object.values(this.audioElements).forEach(audioElement => {
|
|
6306
6311
|
// `setSinkId` method is not included in any flow type definitions for HTMLAudioElements but is a valid method
|
|
@@ -6317,7 +6322,7 @@ class WebRTCClient extends Emitter {
|
|
|
6317
6322
|
|
|
6318
6323
|
changeAudioInputDevice(id , session ) {
|
|
6319
6324
|
const currentId = this.getAudioDeviceId();
|
|
6320
|
-
logger
|
|
6325
|
+
logger.info('setting audio input device', { id, currentId, session: !!session });
|
|
6321
6326
|
|
|
6322
6327
|
if (id === currentId) {
|
|
6323
6328
|
return null;
|
|
@@ -6363,7 +6368,7 @@ class WebRTCClient extends Emitter {
|
|
|
6363
6368
|
|
|
6364
6369
|
setVideoInputDevice(id ) {
|
|
6365
6370
|
const currentId = this.getVideoDeviceId();
|
|
6366
|
-
logger
|
|
6371
|
+
logger.info('setting video input device', { id, currentId });
|
|
6367
6372
|
|
|
6368
6373
|
if (id === currentId) {
|
|
6369
6374
|
return null;
|
|
@@ -6388,7 +6393,7 @@ class WebRTCClient extends Emitter {
|
|
|
6388
6393
|
const sessionId = this.getSipSessionId(session);
|
|
6389
6394
|
const localStream = this.getLocalStream(sessionId);
|
|
6390
6395
|
|
|
6391
|
-
logger
|
|
6396
|
+
logger.info('changing video input device', { id, sessionId });
|
|
6392
6397
|
|
|
6393
6398
|
// Release old video stream
|
|
6394
6399
|
if (localStream) {
|
|
@@ -6456,7 +6461,7 @@ class WebRTCClient extends Emitter {
|
|
|
6456
6461
|
const shouldDoScreenSharing = newConstraints && newConstraints.screen;
|
|
6457
6462
|
const desktop = newConstraints && newConstraints.desktop;
|
|
6458
6463
|
|
|
6459
|
-
logger
|
|
6464
|
+
logger.info('Sending reinvite', {
|
|
6460
6465
|
id: this.getSipSessionId(sipSession),
|
|
6461
6466
|
newConstraints,
|
|
6462
6467
|
conference,
|
|
@@ -6494,7 +6499,7 @@ class WebRTCClient extends Emitter {
|
|
|
6494
6499
|
sipSession.incomingInviteRequest.message.body = response.message.body;
|
|
6495
6500
|
}
|
|
6496
6501
|
|
|
6497
|
-
logger
|
|
6502
|
+
logger.info('on re-INVITE accepted', {
|
|
6498
6503
|
id: this.getSipSessionId(sipSession),
|
|
6499
6504
|
wasMuted,
|
|
6500
6505
|
shouldDoScreenSharing,
|
|
@@ -6669,7 +6674,7 @@ class WebRTCClient extends Emitter {
|
|
|
6669
6674
|
}
|
|
6670
6675
|
|
|
6671
6676
|
startHeartbeat() {
|
|
6672
|
-
logger
|
|
6677
|
+
logger.info('sdk webrtc start heartbeat', { userAgent: !!this.userAgent });
|
|
6673
6678
|
if (!this.userAgent) {
|
|
6674
6679
|
this.heartbeat.stop();
|
|
6675
6680
|
return;
|
|
@@ -6682,7 +6687,7 @@ class WebRTCClient extends Emitter {
|
|
|
6682
6687
|
}
|
|
6683
6688
|
|
|
6684
6689
|
stopHeartbeat() {
|
|
6685
|
-
logger
|
|
6690
|
+
logger.info('sdk webrtc stop heartbeat');
|
|
6686
6691
|
this.heartbeat.stop();
|
|
6687
6692
|
}
|
|
6688
6693
|
|
|
@@ -6703,7 +6708,7 @@ class WebRTCClient extends Emitter {
|
|
|
6703
6708
|
}
|
|
6704
6709
|
|
|
6705
6710
|
attemptReconnection() {
|
|
6706
|
-
logger
|
|
6711
|
+
logger.info('attempt reconnection', { userAgent: !!this.userAgent });
|
|
6707
6712
|
if (!this.userAgent) {
|
|
6708
6713
|
return;
|
|
6709
6714
|
}
|
|
@@ -6728,7 +6733,7 @@ class WebRTCClient extends Emitter {
|
|
|
6728
6733
|
return;
|
|
6729
6734
|
}
|
|
6730
6735
|
|
|
6731
|
-
logger
|
|
6736
|
+
logger.info('setting local media stream', {
|
|
6732
6737
|
sipSessionId,
|
|
6733
6738
|
tracks: newStream ? newStream.getTracks() : null,
|
|
6734
6739
|
});
|
|
@@ -6745,7 +6750,7 @@ class WebRTCClient extends Emitter {
|
|
|
6745
6750
|
|
|
6746
6751
|
const oldStream = this.getLocalStream(sipSessionId);
|
|
6747
6752
|
|
|
6748
|
-
logger
|
|
6753
|
+
logger.info('updating local stream', {
|
|
6749
6754
|
sipSessionId,
|
|
6750
6755
|
oldStream: !!oldStream,
|
|
6751
6756
|
tracks: newStream.getTracks(),
|
|
@@ -6765,7 +6770,7 @@ class WebRTCClient extends Emitter {
|
|
|
6765
6770
|
const remoteStream = this.getRemoteStream(sessionId);
|
|
6766
6771
|
const pc = this.getPeerConnection(sessionId);
|
|
6767
6772
|
|
|
6768
|
-
logger
|
|
6773
|
+
logger.info('Updating remote stream', {
|
|
6769
6774
|
sessionId,
|
|
6770
6775
|
tracks: remoteStream ? remoteStream.getTracks() : null,
|
|
6771
6776
|
receiverTracks: pc && pc.getReceivers ? pc.getReceivers().map(receiver => receiver.track) : null,
|
|
@@ -6790,14 +6795,16 @@ class WebRTCClient extends Emitter {
|
|
|
6790
6795
|
const screenSharing = constraints && 'screen' in constraints ? constraints.screen : false;
|
|
6791
6796
|
const isDesktop = constraints && 'desktop' in constraints ? constraints.desktop : false;
|
|
6792
6797
|
const withAudio = constraints && 'audio' in constraints ? constraints.audio : true;
|
|
6798
|
+
const mandatoryVideo = constraints && typeof constraints.video === 'object' ? constraints.video.mandatory : {};
|
|
6793
6799
|
|
|
6794
|
-
logger
|
|
6800
|
+
logger.info('Retrieving media a configuration', { enableVideo, screenSharing, isDesktop, withAudio, constraints });
|
|
6795
6801
|
|
|
6796
6802
|
return {
|
|
6797
6803
|
constraints: {
|
|
6798
6804
|
// Exact constraint are not supported with `getDisplayMedia` and we must have a video=false in desktop screenshare
|
|
6799
6805
|
audio: screenSharing ? !isDesktop : (withAudio ? this._getAudioConstraints() : false),
|
|
6800
|
-
video: screenSharing ? (isDesktop
|
|
6806
|
+
video: screenSharing ? (isDesktop
|
|
6807
|
+
? ({ mandatory: { chromeMediaSource: 'desktop', ...(mandatoryVideo || {}) } }) : { cursor: 'always' })
|
|
6801
6808
|
: this._getVideoConstraints(enableVideo),
|
|
6802
6809
|
screen: screenSharing,
|
|
6803
6810
|
desktop: isDesktop,
|
|
@@ -6840,7 +6847,7 @@ class WebRTCClient extends Emitter {
|
|
|
6840
6847
|
}
|
|
6841
6848
|
|
|
6842
6849
|
_onTransportError() {
|
|
6843
|
-
logger
|
|
6850
|
+
logger.error('on transport error');
|
|
6844
6851
|
this.eventEmitter.emit(TRANSPORT_ERROR);
|
|
6845
6852
|
this.attemptReconnection();
|
|
6846
6853
|
}
|
|
@@ -6849,7 +6856,7 @@ class WebRTCClient extends Emitter {
|
|
|
6849
6856
|
const body = message && typeof message === 'object' ? message.data : message;
|
|
6850
6857
|
if (body && body.indexOf('200 OK') !== -1) {
|
|
6851
6858
|
if (this.hasHeartbeat()) {
|
|
6852
|
-
logger
|
|
6859
|
+
logger.info('on heartbeat received from Asterisk', { hasHeartbeat: this.hasHeartbeat() });
|
|
6853
6860
|
|
|
6854
6861
|
this.heartbeat.onHeartbeat();
|
|
6855
6862
|
if (this.heartbeatCb) {
|
|
@@ -6860,7 +6867,7 @@ class WebRTCClient extends Emitter {
|
|
|
6860
6867
|
}
|
|
6861
6868
|
|
|
6862
6869
|
async _onHeartbeatTimeout() {
|
|
6863
|
-
logger
|
|
6870
|
+
logger.info('sdk webrtc heartbeat timed out', { userAgent: !!this.userAgent, cb: !!this.heartbeatTimeoutCb });
|
|
6864
6871
|
|
|
6865
6872
|
if (this.heartbeatTimeoutCb) {
|
|
6866
6873
|
this.heartbeatTimeoutCb();
|
|
@@ -6872,7 +6879,7 @@ class WebRTCClient extends Emitter {
|
|
|
6872
6879
|
try {
|
|
6873
6880
|
await this.userAgent.transport.disconnect();
|
|
6874
6881
|
} catch (e) {
|
|
6875
|
-
logger
|
|
6882
|
+
logger.error('Transport disconnection after heartbeat timeout, error', e);
|
|
6876
6883
|
}
|
|
6877
6884
|
}
|
|
6878
6885
|
|
|
@@ -6905,31 +6912,31 @@ class WebRTCClient extends Emitter {
|
|
|
6905
6912
|
}
|
|
6906
6913
|
|
|
6907
6914
|
_connectIfNeeded() {
|
|
6908
|
-
logger
|
|
6915
|
+
logger.info('connect if needed, checking', { connected: this.isConnected() });
|
|
6909
6916
|
if (!this.userAgent) {
|
|
6910
|
-
logger
|
|
6917
|
+
logger.info('need to recreate User Agent');
|
|
6911
6918
|
this.userAgent = this.createUserAgent(this.uaConfigOverrides);
|
|
6912
6919
|
}
|
|
6913
6920
|
|
|
6914
6921
|
if (this.isConnected()) {
|
|
6915
|
-
logger
|
|
6922
|
+
logger.info('webrtc sdk, already connected');
|
|
6916
6923
|
return Promise.resolve();
|
|
6917
6924
|
}
|
|
6918
6925
|
|
|
6919
6926
|
if (this.isConnecting()) {
|
|
6920
|
-
logger
|
|
6927
|
+
logger.info('webrtc sdk, already connecting...');
|
|
6921
6928
|
|
|
6922
6929
|
this.connectionPromise = this.userAgent.transport.connectPromise;
|
|
6923
6930
|
return this.connectionPromise;
|
|
6924
6931
|
}
|
|
6925
6932
|
|
|
6926
6933
|
if (this.connectionPromise) {
|
|
6927
|
-
logger
|
|
6934
|
+
logger.info('webrtc sdk, connection promise connecting...');
|
|
6928
6935
|
// $FlowFixMe
|
|
6929
6936
|
return this.connectionPromise;
|
|
6930
6937
|
}
|
|
6931
6938
|
|
|
6932
|
-
logger
|
|
6939
|
+
logger.info('WebRTC UA needs to connect');
|
|
6933
6940
|
|
|
6934
6941
|
// Force UA to reconnect
|
|
6935
6942
|
if (this.userAgent && this.userAgent.state !== userAgentState.UserAgentState.Stopped) {
|
|
@@ -7054,7 +7061,7 @@ class WebRTCClient extends Emitter {
|
|
|
7054
7061
|
|
|
7055
7062
|
sdh.peerConnectionDelegate = {
|
|
7056
7063
|
onicecandidateerror: (error ) => {
|
|
7057
|
-
logger
|
|
7064
|
+
logger.error('on icecandidate error', {
|
|
7058
7065
|
address: error.address,
|
|
7059
7066
|
port: error.port,
|
|
7060
7067
|
errorCode: error.errorCode,
|
|
@@ -7083,7 +7090,7 @@ class WebRTCClient extends Emitter {
|
|
|
7083
7090
|
updatedNumber = session.assertedIdentity.uri.normal.user;
|
|
7084
7091
|
updatedCalleeName = session.assertedIdentity.displayName || updatedNumber;
|
|
7085
7092
|
}
|
|
7086
|
-
logger
|
|
7093
|
+
logger.info('re-invite received', { updatedCalleeName, updatedNumber, hadRemoteVideo });
|
|
7087
7094
|
|
|
7088
7095
|
// Useful to know if it's a video upgrade or an unhold from a remote peer with a video stream
|
|
7089
7096
|
|
|
@@ -7104,7 +7111,7 @@ class WebRTCClient extends Emitter {
|
|
|
7104
7111
|
}
|
|
7105
7112
|
|
|
7106
7113
|
_onAccepted(session , sessionDialog , withEvent = true) {
|
|
7107
|
-
logger
|
|
7114
|
+
logger.info('on call accepted', { id: session.id, remoteTag: session.remoteTag });
|
|
7108
7115
|
|
|
7109
7116
|
this.storeSipSession(session);
|
|
7110
7117
|
|
|
@@ -7116,7 +7123,7 @@ class WebRTCClient extends Emitter {
|
|
|
7116
7123
|
const onTrack = (event ) => {
|
|
7117
7124
|
const isAudioOnly = this._isAudioOnly(session);
|
|
7118
7125
|
const { kind, label, readyState, id, muted } = event.track;
|
|
7119
|
-
logger
|
|
7126
|
+
logger.info('on track event', { isAudioOnly, kind, label, readyState, id, muted });
|
|
7120
7127
|
|
|
7121
7128
|
// Stop video track in audio only mode
|
|
7122
7129
|
if (isAudioOnly && kind === 'video') {
|
|
@@ -7132,12 +7139,14 @@ class WebRTCClient extends Emitter {
|
|
|
7132
7139
|
|
|
7133
7140
|
session.sessionDescriptionHandler.remoteMediaStream.onaddtrack = onTrack;
|
|
7134
7141
|
|
|
7135
|
-
|
|
7136
|
-
|
|
7137
|
-
|
|
7138
|
-
|
|
7139
|
-
|
|
7140
|
-
|
|
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
|
+
}
|
|
7141
7150
|
|
|
7142
7151
|
if (withEvent) {
|
|
7143
7152
|
this.eventEmitter.emit(ACCEPTED, session, sessionDialog);
|
|
@@ -7306,10 +7315,10 @@ class WebRTCClient extends Emitter {
|
|
|
7306
7315
|
|
|
7307
7316
|
_stopSendingStats(session ) {
|
|
7308
7317
|
const sessionId = this.getSipSessionId(session);
|
|
7309
|
-
logger
|
|
7318
|
+
logger.trace('Check for stopping stats', { sessionId, ids: Object.keys(this.statsIntervals) });
|
|
7310
7319
|
|
|
7311
7320
|
if (sessionId in this.statsIntervals) {
|
|
7312
|
-
logger
|
|
7321
|
+
logger.trace('Stop sending stats for call', { sessionId });
|
|
7313
7322
|
this.statsIntervals[sessionId]();
|
|
7314
7323
|
delete this.statsIntervals[sessionId];
|
|
7315
7324
|
}
|
|
@@ -7325,7 +7334,7 @@ class WebRTCClient extends Emitter {
|
|
|
7325
7334
|
try {
|
|
7326
7335
|
await this.userAgent.transport.disconnect();
|
|
7327
7336
|
} catch (e) {
|
|
7328
|
-
logger
|
|
7337
|
+
logger.error('WebRTC transport disconnect, error', e);
|
|
7329
7338
|
}
|
|
7330
7339
|
}
|
|
7331
7340
|
}
|
|
@@ -7347,13 +7356,17 @@ class WebRTCClient extends Emitter {
|
|
|
7347
7356
|
const nbStats = this.sessionNetworkStats[sessionId].length;
|
|
7348
7357
|
const lastNetworkStats = this.sessionNetworkStats[sessionId][nbStats - 1];
|
|
7349
7358
|
const lastAudioSent = lastNetworkStats ? lastNetworkStats.audioBytesSent : 0;
|
|
7359
|
+
const lastAudioContentSent = lastNetworkStats ? lastNetworkStats.audioContentSent : 0;
|
|
7350
7360
|
const lastVideoSent = lastNetworkStats ? lastNetworkStats.videoBytesSent : 0;
|
|
7351
7361
|
const lastAudioReceived = lastNetworkStats ? lastNetworkStats.audioBytesReceived : 0;
|
|
7362
|
+
const lastAudioContentReceived = lastNetworkStats ? lastNetworkStats.audioContentReceived : 0;
|
|
7352
7363
|
const lastVideoReceived = lastNetworkStats ? lastNetworkStats.videoBytesReceived : 0;
|
|
7353
7364
|
const lastTransportSent = lastNetworkStats ? lastNetworkStats.transportSent : 0;
|
|
7354
7365
|
const lastTransportReceived = lastNetworkStats ? lastNetworkStats.transportReceived : 0;
|
|
7355
|
-
let audioBytesSent = 0;
|
|
7356
|
-
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;
|
|
7357
7370
|
let videoBytesSent = 0;
|
|
7358
7371
|
let videoBytesReceived = 0;
|
|
7359
7372
|
let transportSent = 0;
|
|
@@ -7363,6 +7376,7 @@ class WebRTCClient extends Emitter {
|
|
|
7363
7376
|
stats.forEach(report => {
|
|
7364
7377
|
if (report.type === 'outbound-rtp' && report.kind === 'audio') {
|
|
7365
7378
|
audioBytesSent += Number(report.bytesSent) + Number(report.headerBytesSent);
|
|
7379
|
+
audioContentSent += Number(report.bytesSent);
|
|
7366
7380
|
}
|
|
7367
7381
|
if (report.type === 'remote-outbound-rtp' && report.kind === 'audio') {
|
|
7368
7382
|
audioBytesSent += Number(report.bytesSent);
|
|
@@ -7374,6 +7388,7 @@ class WebRTCClient extends Emitter {
|
|
|
7374
7388
|
packetsLost += Number(report.packetsLost);
|
|
7375
7389
|
networkStats.packetsReceived = Number(report.packetsReceived);
|
|
7376
7390
|
audioBytesReceived += Number(report.bytesReceived) + Number(report.headerBytesReceived);
|
|
7391
|
+
audioContentReceived += Number(report.bytesReceived);
|
|
7377
7392
|
}
|
|
7378
7393
|
if (report.type === 'inbound-rtp' && report.kind === 'video') {
|
|
7379
7394
|
videoBytesReceived += Number(report.bytesReceived) + Number(report.headerBytesReceived);
|
|
@@ -7402,10 +7417,17 @@ class WebRTCClient extends Emitter {
|
|
|
7402
7417
|
});
|
|
7403
7418
|
|
|
7404
7419
|
networkStats.packetsLost = packetsLost;
|
|
7420
|
+
|
|
7405
7421
|
networkStats.totalAudioBytesSent = audioBytesSent;
|
|
7406
7422
|
networkStats.audioBytesSent = audioBytesSent - lastAudioSent;
|
|
7407
7423
|
networkStats.totalAudioBytesReceived = audioBytesReceived - lastAudioReceived;
|
|
7408
7424
|
networkStats.audioBytesReceived = audioBytesReceived;
|
|
7425
|
+
|
|
7426
|
+
networkStats.totalAudioContentSent = audioContentSent;
|
|
7427
|
+
networkStats.audioContentSent = audioContentSent - lastAudioContentSent;
|
|
7428
|
+
networkStats.totalAudioBytesReceived = audioContentReceived - lastAudioContentReceived;
|
|
7429
|
+
networkStats.audioContentReceived = audioContentReceived;
|
|
7430
|
+
|
|
7409
7431
|
networkStats.totalVideoBytesSent = videoBytesSent;
|
|
7410
7432
|
networkStats.videoBytesSent = videoBytesSent - lastVideoSent;
|
|
7411
7433
|
networkStats.totalVideoBytesReceived = videoBytesReceived;
|