@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/lib/web-rtc-client.js
CHANGED
|
@@ -111,11 +111,11 @@ const isMobile = () => typeof navigator !== 'undefined' && navigator.product ===
|
|
|
111
111
|
|
|
112
112
|
const methods = ['head', 'get', 'post', 'put', 'delete'];
|
|
113
113
|
|
|
114
|
-
const logger = IssueReporter$1 ? IssueReporter$1.loggerFor('api') : console;
|
|
114
|
+
const logger$2 = IssueReporter$1 ? IssueReporter$1.loggerFor('api') : console;
|
|
115
115
|
|
|
116
116
|
// Use a function here to be able to mock it in tests
|
|
117
117
|
const realFetch = () => {
|
|
118
|
-
if (typeof document !== 'undefined') {
|
|
118
|
+
if (typeof document !== 'undefined' && window.fetch) {
|
|
119
119
|
// Browser
|
|
120
120
|
return window.fetch;
|
|
121
121
|
}
|
|
@@ -250,7 +250,7 @@ class ApiRequester {
|
|
|
250
250
|
};
|
|
251
251
|
|
|
252
252
|
if (this.refreshTokenPromise) {
|
|
253
|
-
logger.info('A token is already refreshing, waiting ...', { url });
|
|
253
|
+
logger$2.info('A token is already refreshing, waiting ...', { url });
|
|
254
254
|
await this.refreshTokenPromise;
|
|
255
255
|
}
|
|
256
256
|
|
|
@@ -270,7 +270,7 @@ class ApiRequester {
|
|
|
270
270
|
return promise.then(async (err ) => {
|
|
271
271
|
// Check if the token is still valid
|
|
272
272
|
if (firstCall && this._checkTokenExpired(response, err)) {
|
|
273
|
-
logger.warn('token expired', { error: err.reason });
|
|
273
|
+
logger$2.warn('token expired', { error: err.reason });
|
|
274
274
|
// Replay the call after refreshing the token
|
|
275
275
|
return this._replayWithNewToken(err, path, method, body, headers, parse);
|
|
276
276
|
}
|
|
@@ -280,7 +280,7 @@ class ApiRequester {
|
|
|
280
280
|
: exceptionClass.fromResponse(err, response.status);
|
|
281
281
|
|
|
282
282
|
if (this.shouldLogErrors) {
|
|
283
|
-
logger.error('API error', error);
|
|
283
|
+
logger$2.error('API error', error);
|
|
284
284
|
}
|
|
285
285
|
|
|
286
286
|
throw error;
|
|
@@ -290,7 +290,7 @@ class ApiRequester {
|
|
|
290
290
|
return newParse(response, isJson);
|
|
291
291
|
}).catch(error => {
|
|
292
292
|
if (this.shouldLogErrors) {
|
|
293
|
-
logger.error('Fetch failed', { url, options, message: error.message, stack: error.stack });
|
|
293
|
+
logger$2.error('Fetch failed', { url, options, message: error.message, stack: error.stack });
|
|
294
294
|
}
|
|
295
295
|
|
|
296
296
|
throw error;
|
|
@@ -318,13 +318,13 @@ class ApiRequester {
|
|
|
318
318
|
) {
|
|
319
319
|
const isTokenNotFound = this._isTokenNotFound(err);
|
|
320
320
|
let newPath = path;
|
|
321
|
-
logger.info('refreshing token', { inProgress: !!this.refreshTokenPromise });
|
|
321
|
+
logger$2.info('refreshing token', { inProgress: !!this.refreshTokenPromise });
|
|
322
322
|
|
|
323
323
|
this.refreshTokenPromise = this.refreshTokenPromise || this.refreshTokenCallback();
|
|
324
324
|
|
|
325
325
|
return this.refreshTokenPromise.then(() => {
|
|
326
326
|
this.refreshTokenPromise = null;
|
|
327
|
-
logger.info('token refreshed', { isTokenNotFound });
|
|
327
|
+
logger$2.info('token refreshed', { isTokenNotFound });
|
|
328
328
|
if (isTokenNotFound) {
|
|
329
329
|
const pathParts = path.split('/');
|
|
330
330
|
pathParts.pop();
|
|
@@ -834,11 +834,16 @@ class WazoSessionDescriptionHandler extends sessionDescriptionHandler.SessionDes
|
|
|
834
834
|
|
|
835
835
|
// $FlowFixMe
|
|
836
836
|
setRemoteSessionDescription(sessionDescription ) {
|
|
837
|
-
|
|
837
|
+
try {
|
|
838
|
+
const result = super.setRemoteSessionDescription(sessionDescription);
|
|
838
839
|
|
|
839
|
-
|
|
840
|
+
this.eventEmitter.emit('setDescription', sessionDescription);
|
|
840
841
|
|
|
841
|
-
|
|
842
|
+
return result;
|
|
843
|
+
} catch (error) {
|
|
844
|
+
this.logger.error('SessionDescriptionHandler.setRemoteSessionDescription error', error);
|
|
845
|
+
throw error;
|
|
846
|
+
}
|
|
842
847
|
}
|
|
843
848
|
|
|
844
849
|
// Overridden to avoid to fix ice-candidates missing in the SDP in react-native and chrome canary.
|
|
@@ -2458,7 +2463,7 @@ class Contact {
|
|
|
2458
2463
|
this[key] = old[key] || this[key];
|
|
2459
2464
|
});
|
|
2460
2465
|
|
|
2461
|
-
if (old.lineState
|
|
2466
|
+
if (old.lineState) {
|
|
2462
2467
|
this.lineState = old.lineState;
|
|
2463
2468
|
}
|
|
2464
2469
|
|
|
@@ -4149,7 +4154,7 @@ const TRANSFER_FLOW_BLIND = 'blind';
|
|
|
4149
4154
|
|
|
4150
4155
|
// const MINIMUM_WAZO_ENGINE_VERSION_FOR_CTI_HOLD = '20.11';
|
|
4151
4156
|
|
|
4152
|
-
|
|
4157
|
+
IssueReporter$1 ? IssueReporter$1.loggerFor('cti-phone') : console;
|
|
4153
4158
|
|
|
4154
4159
|
/* */
|
|
4155
4160
|
|
|
@@ -5068,7 +5073,7 @@ const AGENTD_VERSION = '1.0';
|
|
|
5068
5073
|
const WEBHOOKD_VERSION = '1.0';
|
|
5069
5074
|
const AMID_VERSION = '1.0';
|
|
5070
5075
|
|
|
5071
|
-
const logger$
|
|
5076
|
+
const logger$1 = IssueReporter$1 ? IssueReporter$1.loggerFor('api') : console;
|
|
5072
5077
|
|
|
5073
5078
|
class ApiClient {
|
|
5074
5079
|
|
|
@@ -5120,12 +5125,12 @@ class ApiClient {
|
|
|
5120
5125
|
}
|
|
5121
5126
|
|
|
5122
5127
|
async forceRefreshToken() {
|
|
5123
|
-
logger$
|
|
5128
|
+
logger$1.info('forcing refresh token, calling callback');
|
|
5124
5129
|
return this.refreshTokenCallback();
|
|
5125
5130
|
}
|
|
5126
5131
|
|
|
5127
5132
|
async refreshTokenCallback() {
|
|
5128
|
-
logger$
|
|
5133
|
+
logger$1.info('refresh token callback called', {
|
|
5129
5134
|
refreshToken: this.refreshToken,
|
|
5130
5135
|
refreshBackend: this.refreshBackend,
|
|
5131
5136
|
refreshExpiration: this.refreshExpiration,
|
|
@@ -5143,7 +5148,7 @@ class ApiClient {
|
|
|
5143
5148
|
this.isMobile,
|
|
5144
5149
|
);
|
|
5145
5150
|
|
|
5146
|
-
logger$
|
|
5151
|
+
logger$1.info('token refreshed', { token: session.token });
|
|
5147
5152
|
|
|
5148
5153
|
if (this.onRefreshToken) {
|
|
5149
5154
|
this.onRefreshToken(session.token, session);
|
|
@@ -5316,7 +5321,7 @@ const DEFAULT_ICE_TIMEOUT = 3000;
|
|
|
5316
5321
|
const SEND_STATS_DELAY = 5000;
|
|
5317
5322
|
|
|
5318
5323
|
const states = ['STATUS_NULL', 'STATUS_NEW', 'STATUS_CONNECTING', 'STATUS_CONNECTED', 'STATUS_COMPLETED'];
|
|
5319
|
-
const logger
|
|
5324
|
+
const logger = IssueReporter$1 ? IssueReporter$1.loggerFor('webrtc-client') : console;
|
|
5320
5325
|
const statsLogger = IssueReporter$1 ? IssueReporter$1.loggerFor('webrtc-stats') : console;
|
|
5321
5326
|
|
|
5322
5327
|
// events
|
|
@@ -5495,13 +5500,13 @@ class WebRTCClient extends Emitter {
|
|
|
5495
5500
|
|
|
5496
5501
|
createUserAgent(configOverrides ) {
|
|
5497
5502
|
const webRTCConfiguration = this._createWebRTCConfiguration(configOverrides);
|
|
5498
|
-
logger
|
|
5503
|
+
logger.info('sdk webrtc, creating UA', { webRTCConfiguration });
|
|
5499
5504
|
|
|
5500
5505
|
webRTCConfiguration.delegate = {
|
|
5501
5506
|
onConnect: this.onConnect.bind(this),
|
|
5502
5507
|
onDisconnect: this.onDisconnect.bind(this),
|
|
5503
5508
|
onInvite: (invitation ) => {
|
|
5504
|
-
logger
|
|
5509
|
+
logger.info('sdk webrtc on invite', {
|
|
5505
5510
|
method: 'delegate.onInvite',
|
|
5506
5511
|
id: invitation.id,
|
|
5507
5512
|
remoteURI: invitation.remoteURI,
|
|
@@ -5544,7 +5549,7 @@ class WebRTCClient extends Emitter {
|
|
|
5544
5549
|
}
|
|
5545
5550
|
|
|
5546
5551
|
onConnect() {
|
|
5547
|
-
logger
|
|
5552
|
+
logger.info('sdk webrtc connected', { method: 'delegate.onConnect' });
|
|
5548
5553
|
this.eventEmitter.emit(CONNECTED);
|
|
5549
5554
|
if (!this.isRegistered() && this.registerer && this.registerer.waiting) {
|
|
5550
5555
|
this.registerer.waitingToggle(false);
|
|
@@ -5553,7 +5558,7 @@ class WebRTCClient extends Emitter {
|
|
|
5553
5558
|
}
|
|
5554
5559
|
|
|
5555
5560
|
async onDisconnect(error ) {
|
|
5556
|
-
logger
|
|
5561
|
+
logger.info('sdk webrtc disconnected', { method: 'delegate.onConnect', error });
|
|
5557
5562
|
this.connectionPromise = null;
|
|
5558
5563
|
// The UA will attempt to reconnect automatically when an error occurred
|
|
5559
5564
|
this.eventEmitter.emit(DISCONNECTED, error);
|
|
@@ -5578,37 +5583,37 @@ class WebRTCClient extends Emitter {
|
|
|
5578
5583
|
};
|
|
5579
5584
|
|
|
5580
5585
|
if (this.skipRegister) {
|
|
5581
|
-
logger
|
|
5586
|
+
logger.info('sdk webrtc skip register...', logInfo);
|
|
5582
5587
|
return Promise.resolve();
|
|
5583
5588
|
}
|
|
5584
5589
|
|
|
5585
|
-
logger
|
|
5590
|
+
logger.info('sdk webrtc registering...', logInfo);
|
|
5586
5591
|
|
|
5587
5592
|
if (!this.userAgent) {
|
|
5588
|
-
logger
|
|
5593
|
+
logger.info('sdk webrtc recreating User Agent');
|
|
5589
5594
|
this.userAgent = this.createUserAgent(this.uaConfigOverrides);
|
|
5590
5595
|
}
|
|
5591
5596
|
if (!this.userAgent || this.isRegistered()) {
|
|
5592
|
-
logger
|
|
5597
|
+
logger.info('sdk webrtc registering aborted, already registered or no UA can be created');
|
|
5593
5598
|
return Promise.resolve();
|
|
5594
5599
|
}
|
|
5595
5600
|
|
|
5596
5601
|
if (this.connectionPromise || (this.registerer && this.registerer.waiting)) {
|
|
5597
|
-
logger
|
|
5602
|
+
logger.info('sdk webrtc registering aborted due to a registration in progress.');
|
|
5598
5603
|
return Promise.resolve();
|
|
5599
5604
|
}
|
|
5600
5605
|
|
|
5601
5606
|
const registerOptions = this._isWeb() ? {} : { extraContactHeaderParams: ['mobility=mobile'] };
|
|
5602
5607
|
|
|
5603
5608
|
const onRegisterFailed = () => {
|
|
5604
|
-
logger
|
|
5609
|
+
logger.info('sdk webrtc registering failed', { tries, registerer: !!this.registerer });
|
|
5605
5610
|
this.connectionPromise = null;
|
|
5606
5611
|
if (this.registerer && this.registerer.waiting) {
|
|
5607
5612
|
this.registerer.waitingToggle(false);
|
|
5608
5613
|
}
|
|
5609
5614
|
|
|
5610
5615
|
if (tries <= MAX_REGISTER_TRIES) {
|
|
5611
|
-
logger
|
|
5616
|
+
logger.info('sdk webrtc registering, retrying...', { tries });
|
|
5612
5617
|
setTimeout(() => this.register(tries + 1), 300);
|
|
5613
5618
|
}
|
|
5614
5619
|
};
|
|
@@ -5617,18 +5622,18 @@ class WebRTCClient extends Emitter {
|
|
|
5617
5622
|
// Avoid race condition with the close method called just before register and setting userAgent to null
|
|
5618
5623
|
// during the resolution of the primise.
|
|
5619
5624
|
if (!this.userAgent) {
|
|
5620
|
-
logger
|
|
5625
|
+
logger.info('sdk webrtc recreating User Agent after connection');
|
|
5621
5626
|
this.userAgent = this.createUserAgent(this.uaConfigOverrides);
|
|
5622
5627
|
}
|
|
5623
5628
|
|
|
5624
|
-
logger
|
|
5629
|
+
logger.info('sdk webrtc registering, transport connected', { registerOptions, ua: !!this.userAgent });
|
|
5625
5630
|
this.registerer = new registerer.Registerer(this.userAgent, registerOptions);
|
|
5626
5631
|
this.connectionPromise = null;
|
|
5627
5632
|
this._monkeyPatchRegisterer(this.registerer);
|
|
5628
5633
|
|
|
5629
5634
|
// Bind registerer events
|
|
5630
5635
|
this.registerer.stateChange.addListener(newState => {
|
|
5631
|
-
logger
|
|
5636
|
+
logger.info('sdk webrtc registering, state changed', { newState });
|
|
5632
5637
|
|
|
5633
5638
|
if (newState === registererState.RegistererState.Registered && this.registerer
|
|
5634
5639
|
&& this.registerer.state === registererState.RegistererState.Registered) {
|
|
@@ -5641,7 +5646,7 @@ class WebRTCClient extends Emitter {
|
|
|
5641
5646
|
const options = {
|
|
5642
5647
|
requestDelegate: {
|
|
5643
5648
|
onReject: response => {
|
|
5644
|
-
logger
|
|
5649
|
+
logger.error('sdk webrtc registering, rejected', { response });
|
|
5645
5650
|
|
|
5646
5651
|
onRegisterFailed();
|
|
5647
5652
|
},
|
|
@@ -5649,13 +5654,13 @@ class WebRTCClient extends Emitter {
|
|
|
5649
5654
|
};
|
|
5650
5655
|
|
|
5651
5656
|
return this.registerer.register(options).catch((e) => {
|
|
5652
|
-
logger
|
|
5657
|
+
logger.error('sdk webrtc registering, error', e);
|
|
5653
5658
|
|
|
5654
5659
|
this.eventEmitter.emit(REGISTRATION_FAILED);
|
|
5655
5660
|
return e;
|
|
5656
5661
|
});
|
|
5657
5662
|
}).catch(error => {
|
|
5658
|
-
logger
|
|
5663
|
+
logger.error('sdk webrtc registering, transport error', error);
|
|
5659
5664
|
onRegisterFailed();
|
|
5660
5665
|
});
|
|
5661
5666
|
}
|
|
@@ -5684,21 +5689,21 @@ class WebRTCClient extends Emitter {
|
|
|
5684
5689
|
}
|
|
5685
5690
|
|
|
5686
5691
|
unregister() {
|
|
5687
|
-
logger
|
|
5692
|
+
logger.info('sdk webrtc unregistering..', { userAgent: !!this.userAgent, registerer: !!this.registerer });
|
|
5688
5693
|
if (!this.registerer) {
|
|
5689
5694
|
return Promise.resolve();
|
|
5690
5695
|
}
|
|
5691
5696
|
|
|
5692
5697
|
try {
|
|
5693
5698
|
return this.registerer.unregister().then(() => {
|
|
5694
|
-
logger
|
|
5699
|
+
logger.info('sdk webrtc unregistered');
|
|
5695
5700
|
this._cleanupRegister();
|
|
5696
5701
|
}).catch(e => {
|
|
5697
|
-
logger
|
|
5702
|
+
logger.error('sdk webrtc unregistering, promise error', e);
|
|
5698
5703
|
this._cleanupRegister();
|
|
5699
5704
|
});
|
|
5700
5705
|
} catch (e) {
|
|
5701
|
-
logger
|
|
5706
|
+
logger.error('sdk webrtc unregistering, error', e);
|
|
5702
5707
|
// Avoid issue with `undefined is not an object (evaluating 'new.target.prototype')` when triggering a new
|
|
5703
5708
|
// error when the registerer is in a bad state
|
|
5704
5709
|
this._cleanupRegister();
|
|
@@ -5706,7 +5711,7 @@ class WebRTCClient extends Emitter {
|
|
|
5706
5711
|
}
|
|
5707
5712
|
|
|
5708
5713
|
stop() {
|
|
5709
|
-
logger
|
|
5714
|
+
logger.info('sdk webrtc stop', { userAgent: !!this.userAgent });
|
|
5710
5715
|
if (!this.userAgent) {
|
|
5711
5716
|
return Promise.resolve();
|
|
5712
5717
|
}
|
|
@@ -5714,12 +5719,12 @@ class WebRTCClient extends Emitter {
|
|
|
5714
5719
|
return this.userAgent.stop().then(() => {
|
|
5715
5720
|
return this._cleanupRegister();
|
|
5716
5721
|
}).catch(e => {
|
|
5717
|
-
logger
|
|
5722
|
+
logger.warn('sdk webrtc stop, error', { message: e.message, stack: e.stack });
|
|
5718
5723
|
});
|
|
5719
5724
|
}
|
|
5720
5725
|
|
|
5721
5726
|
call(number , enableVideo , audioOnly = false, conference = false) {
|
|
5722
|
-
logger
|
|
5727
|
+
logger.info('sdk webrtc creating call', { number, enableVideo, audioOnly, conference });
|
|
5723
5728
|
const inviterOptions = {
|
|
5724
5729
|
sessionDescriptionHandlerOptionsReInvite: {
|
|
5725
5730
|
conference,
|
|
@@ -5750,7 +5755,7 @@ class WebRTCClient extends Emitter {
|
|
|
5750
5755
|
this._onAccepted(session, response.session, true);
|
|
5751
5756
|
},
|
|
5752
5757
|
onReject: (response ) => {
|
|
5753
|
-
logger
|
|
5758
|
+
logger.info('on call rejected', { id: session.id, fromTag: session.fromTag });
|
|
5754
5759
|
this._stopSendingStats(session);
|
|
5755
5760
|
this.stopNetworkMonitoring(session);
|
|
5756
5761
|
|
|
@@ -5773,11 +5778,11 @@ class WebRTCClient extends Emitter {
|
|
|
5773
5778
|
}
|
|
5774
5779
|
|
|
5775
5780
|
answer(session , enableVideo ) {
|
|
5776
|
-
logger
|
|
5781
|
+
logger.info('sdk webrtc answer call', { id: session.id, enableVideo });
|
|
5777
5782
|
|
|
5778
5783
|
if (!session || !session.accept) {
|
|
5779
5784
|
const error = 'No session to answer, or not an invitation';
|
|
5780
|
-
logger
|
|
5785
|
+
logger.warn(error);
|
|
5781
5786
|
return Promise.reject(new Error(error));
|
|
5782
5787
|
}
|
|
5783
5788
|
const options = {
|
|
@@ -5787,15 +5792,15 @@ class WebRTCClient extends Emitter {
|
|
|
5787
5792
|
return session.accept(options).then(() => {
|
|
5788
5793
|
if (session.isCanceled) {
|
|
5789
5794
|
const message = 'accepted a canceled session (or was canceled during the accept phase).';
|
|
5790
|
-
logger
|
|
5795
|
+
logger.error(message, { id: session.id });
|
|
5791
5796
|
this.onCallEnded(session);
|
|
5792
5797
|
|
|
5793
5798
|
throw new CanceledCallError(message);
|
|
5794
5799
|
}
|
|
5795
|
-
logger
|
|
5800
|
+
logger.info('sdk webrtc answer, accepted.');
|
|
5796
5801
|
this._onAccepted(session);
|
|
5797
5802
|
}).catch(e => {
|
|
5798
|
-
logger
|
|
5803
|
+
logger.error(`answer call error for ${session ? session.id : 'n/a'}`, e);
|
|
5799
5804
|
|
|
5800
5805
|
throw e;
|
|
5801
5806
|
});
|
|
@@ -5803,7 +5808,7 @@ class WebRTCClient extends Emitter {
|
|
|
5803
5808
|
|
|
5804
5809
|
hangup(session ) {
|
|
5805
5810
|
const { state, id } = session;
|
|
5806
|
-
logger
|
|
5811
|
+
logger.info('sdk webrtc hangup call', { id, state });
|
|
5807
5812
|
|
|
5808
5813
|
try {
|
|
5809
5814
|
this._stopSendingStats(session);
|
|
@@ -5832,7 +5837,7 @@ class WebRTCClient extends Emitter {
|
|
|
5832
5837
|
|
|
5833
5838
|
return bye();
|
|
5834
5839
|
} catch (error) {
|
|
5835
|
-
logger
|
|
5840
|
+
logger.warn('sdk webrtc hangup, error', error);
|
|
5836
5841
|
}
|
|
5837
5842
|
|
|
5838
5843
|
return null;
|
|
@@ -5850,7 +5855,7 @@ class WebRTCClient extends Emitter {
|
|
|
5850
5855
|
// Fetch and emit an event at `interval` with session network stats
|
|
5851
5856
|
startNetworkMonitoring(session , interval = 1000) {
|
|
5852
5857
|
const sessionId = this.getSipSessionId(session);
|
|
5853
|
-
logger
|
|
5858
|
+
logger.info('starting network inspection', { id: sessionId });
|
|
5854
5859
|
|
|
5855
5860
|
this.sessionNetworkStats[sessionId] = [];
|
|
5856
5861
|
|
|
@@ -5860,7 +5865,7 @@ class WebRTCClient extends Emitter {
|
|
|
5860
5865
|
stopNetworkMonitoring(session ) {
|
|
5861
5866
|
const sessionId = this.getSipSessionId(session);
|
|
5862
5867
|
const exists = sessionId in this.networkMonitoringInterval;
|
|
5863
|
-
logger
|
|
5868
|
+
logger.info('stopping network inspection', { id: sessionId, exists });
|
|
5864
5869
|
|
|
5865
5870
|
if (exists) {
|
|
5866
5871
|
clearInterval(this.networkMonitoringInterval[sessionId]);
|
|
@@ -5870,17 +5875,17 @@ class WebRTCClient extends Emitter {
|
|
|
5870
5875
|
}
|
|
5871
5876
|
|
|
5872
5877
|
reject(session ) {
|
|
5873
|
-
logger
|
|
5878
|
+
logger.info('sdk webrtc reject call', { id: session.id });
|
|
5874
5879
|
|
|
5875
5880
|
try {
|
|
5876
5881
|
return session.reject ? session.reject() : session.cancel();
|
|
5877
5882
|
} catch (e) {
|
|
5878
|
-
logger
|
|
5883
|
+
logger.warn('Error when rejecting call', e.message, e.stack);
|
|
5879
5884
|
}
|
|
5880
5885
|
}
|
|
5881
5886
|
|
|
5882
5887
|
async close() {
|
|
5883
|
-
logger
|
|
5888
|
+
logger.info('sdk webrtc closing client', { userAgent: !!this.userAgent });
|
|
5884
5889
|
this._cleanupMedia();
|
|
5885
5890
|
this.connectionPromise = null;
|
|
5886
5891
|
|
|
@@ -5911,7 +5916,7 @@ class WebRTCClient extends Emitter {
|
|
|
5911
5916
|
// eg: "INVITE not rejectable in state Completed"
|
|
5912
5917
|
}
|
|
5913
5918
|
this.userAgent = null;
|
|
5914
|
-
logger
|
|
5919
|
+
logger.info('sdk webrtc client closed');
|
|
5915
5920
|
}
|
|
5916
5921
|
|
|
5917
5922
|
getNumber(session ) {
|
|
@@ -5924,13 +5929,13 @@ class WebRTCClient extends Emitter {
|
|
|
5924
5929
|
}
|
|
5925
5930
|
|
|
5926
5931
|
mute(session ) {
|
|
5927
|
-
logger
|
|
5932
|
+
logger.info('sdk webrtc mute', { id: session.id });
|
|
5928
5933
|
|
|
5929
5934
|
this._toggleAudio(session, true);
|
|
5930
5935
|
}
|
|
5931
5936
|
|
|
5932
5937
|
unmute(session ) {
|
|
5933
|
-
logger
|
|
5938
|
+
logger.info('sdk webrtc unmute', { id: session.id });
|
|
5934
5939
|
|
|
5935
5940
|
this._toggleAudio(session, false);
|
|
5936
5941
|
}
|
|
@@ -5970,13 +5975,13 @@ class WebRTCClient extends Emitter {
|
|
|
5970
5975
|
}
|
|
5971
5976
|
|
|
5972
5977
|
toggleCameraOn(session ) {
|
|
5973
|
-
logger
|
|
5978
|
+
logger.info('sdk webrtc toggle camera on', { id: session.id });
|
|
5974
5979
|
|
|
5975
5980
|
this._toggleVideo(session, false);
|
|
5976
5981
|
}
|
|
5977
5982
|
|
|
5978
5983
|
toggleCameraOff(session ) {
|
|
5979
|
-
logger
|
|
5984
|
+
logger.info('sdk webrtc toggle camera off', { id: session.id });
|
|
5980
5985
|
|
|
5981
5986
|
this._toggleVideo(session, true);
|
|
5982
5987
|
}
|
|
@@ -5985,7 +5990,7 @@ class WebRTCClient extends Emitter {
|
|
|
5985
5990
|
const sessionId = this.getSipSessionId(session);
|
|
5986
5991
|
const hasVideo = hadVideo || this.hasLocalVideo(sessionId);
|
|
5987
5992
|
|
|
5988
|
-
logger
|
|
5993
|
+
logger.info('sdk webrtc hold', {
|
|
5989
5994
|
sessionId,
|
|
5990
5995
|
keys: Object.keys(this.heldSessions),
|
|
5991
5996
|
pendingReinvite: !!session.pendingReinvite,
|
|
@@ -6034,7 +6039,7 @@ class WebRTCClient extends Emitter {
|
|
|
6034
6039
|
const sessionId = this.getSipSessionId(session);
|
|
6035
6040
|
const hasVideo = sessionId in this.heldSessions && this.heldSessions[sessionId].hasVideo;
|
|
6036
6041
|
|
|
6037
|
-
logger
|
|
6042
|
+
logger.info('sdk webrtc unhold', {
|
|
6038
6043
|
sessionId,
|
|
6039
6044
|
keys: Object.keys(this.heldSessions),
|
|
6040
6045
|
pendingReinvite: !!session.pendingReinvite,
|
|
@@ -6182,7 +6187,7 @@ class WebRTCClient extends Emitter {
|
|
|
6182
6187
|
if (!session.sessionDescriptionHandler) {
|
|
6183
6188
|
return;
|
|
6184
6189
|
}
|
|
6185
|
-
logger
|
|
6190
|
+
logger.info('Sending DTMF', {
|
|
6186
6191
|
id: this.getSipSessionId(session),
|
|
6187
6192
|
tone,
|
|
6188
6193
|
});
|
|
@@ -6198,7 +6203,7 @@ class WebRTCClient extends Emitter {
|
|
|
6198
6203
|
transfer(session , target ) {
|
|
6199
6204
|
this.hold(session);
|
|
6200
6205
|
|
|
6201
|
-
logger
|
|
6206
|
+
logger.info('Transfering a session', {
|
|
6202
6207
|
id: this.getSipSessionId(session),
|
|
6203
6208
|
target,
|
|
6204
6209
|
});
|
|
@@ -6220,17 +6225,17 @@ class WebRTCClient extends Emitter {
|
|
|
6220
6225
|
atxfer(session ) {
|
|
6221
6226
|
this.hold(session);
|
|
6222
6227
|
|
|
6223
|
-
logger
|
|
6228
|
+
logger.info('webrtc transfer started', { id: this.getSipSessionId(session) });
|
|
6224
6229
|
|
|
6225
6230
|
const result = {
|
|
6226
6231
|
newSession: null,
|
|
6227
6232
|
init: async (target ) => {
|
|
6228
|
-
logger
|
|
6233
|
+
logger.info('webrtc transfer initialized', { id: this.getSipSessionId(session), target });
|
|
6229
6234
|
|
|
6230
6235
|
result.newSession = await this.call(target);
|
|
6231
6236
|
},
|
|
6232
6237
|
complete: () => {
|
|
6233
|
-
logger
|
|
6238
|
+
logger.info('webrtc transfer completed', {
|
|
6234
6239
|
id: this.getSipSessionId(session),
|
|
6235
6240
|
referId: this.getSipSessionId(result.newSession),
|
|
6236
6241
|
});
|
|
@@ -6251,7 +6256,7 @@ class WebRTCClient extends Emitter {
|
|
|
6251
6256
|
return;
|
|
6252
6257
|
}
|
|
6253
6258
|
|
|
6254
|
-
logger
|
|
6259
|
+
logger.info('send WebRTC message', { sipId: sipSession.id, contentType });
|
|
6255
6260
|
|
|
6256
6261
|
try {
|
|
6257
6262
|
sipSession.message({
|
|
@@ -6293,7 +6298,7 @@ class WebRTCClient extends Emitter {
|
|
|
6293
6298
|
}
|
|
6294
6299
|
|
|
6295
6300
|
changeAudioOutputVolume(volume ) {
|
|
6296
|
-
logger
|
|
6301
|
+
logger.info('Changing audio output volume', { volume });
|
|
6297
6302
|
|
|
6298
6303
|
Object.values(this.audioElements).forEach(audioElement => {
|
|
6299
6304
|
if (audioElement instanceof HTMLAudioElement) {
|
|
@@ -6305,7 +6310,7 @@ class WebRTCClient extends Emitter {
|
|
|
6305
6310
|
}
|
|
6306
6311
|
|
|
6307
6312
|
changeAudioOutputDevice(id ) {
|
|
6308
|
-
logger
|
|
6313
|
+
logger.info('Changing audio output device', { id });
|
|
6309
6314
|
|
|
6310
6315
|
Object.values(this.audioElements).forEach(audioElement => {
|
|
6311
6316
|
// `setSinkId` method is not included in any flow type definitions for HTMLAudioElements but is a valid method
|
|
@@ -6322,7 +6327,7 @@ class WebRTCClient extends Emitter {
|
|
|
6322
6327
|
|
|
6323
6328
|
changeAudioInputDevice(id , session ) {
|
|
6324
6329
|
const currentId = this.getAudioDeviceId();
|
|
6325
|
-
logger
|
|
6330
|
+
logger.info('setting audio input device', { id, currentId, session: !!session });
|
|
6326
6331
|
|
|
6327
6332
|
if (id === currentId) {
|
|
6328
6333
|
return null;
|
|
@@ -6368,7 +6373,7 @@ class WebRTCClient extends Emitter {
|
|
|
6368
6373
|
|
|
6369
6374
|
setVideoInputDevice(id ) {
|
|
6370
6375
|
const currentId = this.getVideoDeviceId();
|
|
6371
|
-
logger
|
|
6376
|
+
logger.info('setting video input device', { id, currentId });
|
|
6372
6377
|
|
|
6373
6378
|
if (id === currentId) {
|
|
6374
6379
|
return null;
|
|
@@ -6393,7 +6398,7 @@ class WebRTCClient extends Emitter {
|
|
|
6393
6398
|
const sessionId = this.getSipSessionId(session);
|
|
6394
6399
|
const localStream = this.getLocalStream(sessionId);
|
|
6395
6400
|
|
|
6396
|
-
logger
|
|
6401
|
+
logger.info('changing video input device', { id, sessionId });
|
|
6397
6402
|
|
|
6398
6403
|
// Release old video stream
|
|
6399
6404
|
if (localStream) {
|
|
@@ -6461,7 +6466,7 @@ class WebRTCClient extends Emitter {
|
|
|
6461
6466
|
const shouldDoScreenSharing = newConstraints && newConstraints.screen;
|
|
6462
6467
|
const desktop = newConstraints && newConstraints.desktop;
|
|
6463
6468
|
|
|
6464
|
-
logger
|
|
6469
|
+
logger.info('Sending reinvite', {
|
|
6465
6470
|
id: this.getSipSessionId(sipSession),
|
|
6466
6471
|
newConstraints,
|
|
6467
6472
|
conference,
|
|
@@ -6499,7 +6504,7 @@ class WebRTCClient extends Emitter {
|
|
|
6499
6504
|
sipSession.incomingInviteRequest.message.body = response.message.body;
|
|
6500
6505
|
}
|
|
6501
6506
|
|
|
6502
|
-
logger
|
|
6507
|
+
logger.info('on re-INVITE accepted', {
|
|
6503
6508
|
id: this.getSipSessionId(sipSession),
|
|
6504
6509
|
wasMuted,
|
|
6505
6510
|
shouldDoScreenSharing,
|
|
@@ -6674,7 +6679,7 @@ class WebRTCClient extends Emitter {
|
|
|
6674
6679
|
}
|
|
6675
6680
|
|
|
6676
6681
|
startHeartbeat() {
|
|
6677
|
-
logger
|
|
6682
|
+
logger.info('sdk webrtc start heartbeat', { userAgent: !!this.userAgent });
|
|
6678
6683
|
if (!this.userAgent) {
|
|
6679
6684
|
this.heartbeat.stop();
|
|
6680
6685
|
return;
|
|
@@ -6687,7 +6692,7 @@ class WebRTCClient extends Emitter {
|
|
|
6687
6692
|
}
|
|
6688
6693
|
|
|
6689
6694
|
stopHeartbeat() {
|
|
6690
|
-
logger
|
|
6695
|
+
logger.info('sdk webrtc stop heartbeat');
|
|
6691
6696
|
this.heartbeat.stop();
|
|
6692
6697
|
}
|
|
6693
6698
|
|
|
@@ -6708,7 +6713,7 @@ class WebRTCClient extends Emitter {
|
|
|
6708
6713
|
}
|
|
6709
6714
|
|
|
6710
6715
|
attemptReconnection() {
|
|
6711
|
-
logger
|
|
6716
|
+
logger.info('attempt reconnection', { userAgent: !!this.userAgent });
|
|
6712
6717
|
if (!this.userAgent) {
|
|
6713
6718
|
return;
|
|
6714
6719
|
}
|
|
@@ -6733,7 +6738,7 @@ class WebRTCClient extends Emitter {
|
|
|
6733
6738
|
return;
|
|
6734
6739
|
}
|
|
6735
6740
|
|
|
6736
|
-
logger
|
|
6741
|
+
logger.info('setting local media stream', {
|
|
6737
6742
|
sipSessionId,
|
|
6738
6743
|
tracks: newStream ? newStream.getTracks() : null,
|
|
6739
6744
|
});
|
|
@@ -6750,7 +6755,7 @@ class WebRTCClient extends Emitter {
|
|
|
6750
6755
|
|
|
6751
6756
|
const oldStream = this.getLocalStream(sipSessionId);
|
|
6752
6757
|
|
|
6753
|
-
logger
|
|
6758
|
+
logger.info('updating local stream', {
|
|
6754
6759
|
sipSessionId,
|
|
6755
6760
|
oldStream: !!oldStream,
|
|
6756
6761
|
tracks: newStream.getTracks(),
|
|
@@ -6770,7 +6775,7 @@ class WebRTCClient extends Emitter {
|
|
|
6770
6775
|
const remoteStream = this.getRemoteStream(sessionId);
|
|
6771
6776
|
const pc = this.getPeerConnection(sessionId);
|
|
6772
6777
|
|
|
6773
|
-
logger
|
|
6778
|
+
logger.info('Updating remote stream', {
|
|
6774
6779
|
sessionId,
|
|
6775
6780
|
tracks: remoteStream ? remoteStream.getTracks() : null,
|
|
6776
6781
|
receiverTracks: pc && pc.getReceivers ? pc.getReceivers().map(receiver => receiver.track) : null,
|
|
@@ -6795,14 +6800,16 @@ class WebRTCClient extends Emitter {
|
|
|
6795
6800
|
const screenSharing = constraints && 'screen' in constraints ? constraints.screen : false;
|
|
6796
6801
|
const isDesktop = constraints && 'desktop' in constraints ? constraints.desktop : false;
|
|
6797
6802
|
const withAudio = constraints && 'audio' in constraints ? constraints.audio : true;
|
|
6803
|
+
const mandatoryVideo = constraints && typeof constraints.video === 'object' ? constraints.video.mandatory : {};
|
|
6798
6804
|
|
|
6799
|
-
logger
|
|
6805
|
+
logger.info('Retrieving media a configuration', { enableVideo, screenSharing, isDesktop, withAudio, constraints });
|
|
6800
6806
|
|
|
6801
6807
|
return {
|
|
6802
6808
|
constraints: {
|
|
6803
6809
|
// Exact constraint are not supported with `getDisplayMedia` and we must have a video=false in desktop screenshare
|
|
6804
6810
|
audio: screenSharing ? !isDesktop : (withAudio ? this._getAudioConstraints() : false),
|
|
6805
|
-
video: screenSharing ? (isDesktop
|
|
6811
|
+
video: screenSharing ? (isDesktop
|
|
6812
|
+
? ({ mandatory: { chromeMediaSource: 'desktop', ...(mandatoryVideo || {}) } }) : { cursor: 'always' })
|
|
6806
6813
|
: this._getVideoConstraints(enableVideo),
|
|
6807
6814
|
screen: screenSharing,
|
|
6808
6815
|
desktop: isDesktop,
|
|
@@ -6845,7 +6852,7 @@ class WebRTCClient extends Emitter {
|
|
|
6845
6852
|
}
|
|
6846
6853
|
|
|
6847
6854
|
_onTransportError() {
|
|
6848
|
-
logger
|
|
6855
|
+
logger.error('on transport error');
|
|
6849
6856
|
this.eventEmitter.emit(TRANSPORT_ERROR);
|
|
6850
6857
|
this.attemptReconnection();
|
|
6851
6858
|
}
|
|
@@ -6854,7 +6861,7 @@ class WebRTCClient extends Emitter {
|
|
|
6854
6861
|
const body = message && typeof message === 'object' ? message.data : message;
|
|
6855
6862
|
if (body && body.indexOf('200 OK') !== -1) {
|
|
6856
6863
|
if (this.hasHeartbeat()) {
|
|
6857
|
-
logger
|
|
6864
|
+
logger.info('on heartbeat received from Asterisk', { hasHeartbeat: this.hasHeartbeat() });
|
|
6858
6865
|
|
|
6859
6866
|
this.heartbeat.onHeartbeat();
|
|
6860
6867
|
if (this.heartbeatCb) {
|
|
@@ -6865,7 +6872,7 @@ class WebRTCClient extends Emitter {
|
|
|
6865
6872
|
}
|
|
6866
6873
|
|
|
6867
6874
|
async _onHeartbeatTimeout() {
|
|
6868
|
-
logger
|
|
6875
|
+
logger.info('sdk webrtc heartbeat timed out', { userAgent: !!this.userAgent, cb: !!this.heartbeatTimeoutCb });
|
|
6869
6876
|
|
|
6870
6877
|
if (this.heartbeatTimeoutCb) {
|
|
6871
6878
|
this.heartbeatTimeoutCb();
|
|
@@ -6877,7 +6884,7 @@ class WebRTCClient extends Emitter {
|
|
|
6877
6884
|
try {
|
|
6878
6885
|
await this.userAgent.transport.disconnect();
|
|
6879
6886
|
} catch (e) {
|
|
6880
|
-
logger
|
|
6887
|
+
logger.error('Transport disconnection after heartbeat timeout, error', e);
|
|
6881
6888
|
}
|
|
6882
6889
|
}
|
|
6883
6890
|
|
|
@@ -6910,31 +6917,31 @@ class WebRTCClient extends Emitter {
|
|
|
6910
6917
|
}
|
|
6911
6918
|
|
|
6912
6919
|
_connectIfNeeded() {
|
|
6913
|
-
logger
|
|
6920
|
+
logger.info('connect if needed, checking', { connected: this.isConnected() });
|
|
6914
6921
|
if (!this.userAgent) {
|
|
6915
|
-
logger
|
|
6922
|
+
logger.info('need to recreate User Agent');
|
|
6916
6923
|
this.userAgent = this.createUserAgent(this.uaConfigOverrides);
|
|
6917
6924
|
}
|
|
6918
6925
|
|
|
6919
6926
|
if (this.isConnected()) {
|
|
6920
|
-
logger
|
|
6927
|
+
logger.info('webrtc sdk, already connected');
|
|
6921
6928
|
return Promise.resolve();
|
|
6922
6929
|
}
|
|
6923
6930
|
|
|
6924
6931
|
if (this.isConnecting()) {
|
|
6925
|
-
logger
|
|
6932
|
+
logger.info('webrtc sdk, already connecting...');
|
|
6926
6933
|
|
|
6927
6934
|
this.connectionPromise = this.userAgent.transport.connectPromise;
|
|
6928
6935
|
return this.connectionPromise;
|
|
6929
6936
|
}
|
|
6930
6937
|
|
|
6931
6938
|
if (this.connectionPromise) {
|
|
6932
|
-
logger
|
|
6939
|
+
logger.info('webrtc sdk, connection promise connecting...');
|
|
6933
6940
|
// $FlowFixMe
|
|
6934
6941
|
return this.connectionPromise;
|
|
6935
6942
|
}
|
|
6936
6943
|
|
|
6937
|
-
logger
|
|
6944
|
+
logger.info('WebRTC UA needs to connect');
|
|
6938
6945
|
|
|
6939
6946
|
// Force UA to reconnect
|
|
6940
6947
|
if (this.userAgent && this.userAgent.state !== userAgentState.UserAgentState.Stopped) {
|
|
@@ -7059,7 +7066,7 @@ class WebRTCClient extends Emitter {
|
|
|
7059
7066
|
|
|
7060
7067
|
sdh.peerConnectionDelegate = {
|
|
7061
7068
|
onicecandidateerror: (error ) => {
|
|
7062
|
-
logger
|
|
7069
|
+
logger.error('on icecandidate error', {
|
|
7063
7070
|
address: error.address,
|
|
7064
7071
|
port: error.port,
|
|
7065
7072
|
errorCode: error.errorCode,
|
|
@@ -7088,7 +7095,7 @@ class WebRTCClient extends Emitter {
|
|
|
7088
7095
|
updatedNumber = session.assertedIdentity.uri.normal.user;
|
|
7089
7096
|
updatedCalleeName = session.assertedIdentity.displayName || updatedNumber;
|
|
7090
7097
|
}
|
|
7091
|
-
logger
|
|
7098
|
+
logger.info('re-invite received', { updatedCalleeName, updatedNumber, hadRemoteVideo });
|
|
7092
7099
|
|
|
7093
7100
|
// Useful to know if it's a video upgrade or an unhold from a remote peer with a video stream
|
|
7094
7101
|
|
|
@@ -7109,7 +7116,7 @@ class WebRTCClient extends Emitter {
|
|
|
7109
7116
|
}
|
|
7110
7117
|
|
|
7111
7118
|
_onAccepted(session , sessionDialog , withEvent = true) {
|
|
7112
|
-
logger
|
|
7119
|
+
logger.info('on call accepted', { id: session.id, remoteTag: session.remoteTag });
|
|
7113
7120
|
|
|
7114
7121
|
this.storeSipSession(session);
|
|
7115
7122
|
|
|
@@ -7121,7 +7128,7 @@ class WebRTCClient extends Emitter {
|
|
|
7121
7128
|
const onTrack = (event ) => {
|
|
7122
7129
|
const isAudioOnly = this._isAudioOnly(session);
|
|
7123
7130
|
const { kind, label, readyState, id, muted } = event.track;
|
|
7124
|
-
logger
|
|
7131
|
+
logger.info('on track event', { isAudioOnly, kind, label, readyState, id, muted });
|
|
7125
7132
|
|
|
7126
7133
|
// Stop video track in audio only mode
|
|
7127
7134
|
if (isAudioOnly && kind === 'video') {
|
|
@@ -7137,12 +7144,14 @@ class WebRTCClient extends Emitter {
|
|
|
7137
7144
|
|
|
7138
7145
|
session.sessionDescriptionHandler.remoteMediaStream.onaddtrack = onTrack;
|
|
7139
7146
|
|
|
7140
|
-
|
|
7141
|
-
|
|
7142
|
-
|
|
7143
|
-
|
|
7144
|
-
|
|
7145
|
-
|
|
7147
|
+
if (pc) {
|
|
7148
|
+
pc.oniceconnectionstatechange = () => {
|
|
7149
|
+
logger.info('on ice connection state changed', { state: pc.iceConnectionState });
|
|
7150
|
+
if (pc.iceConnectionState === 'disconnected') {
|
|
7151
|
+
this.eventEmitter.emit(ON_DISCONNECTED);
|
|
7152
|
+
}
|
|
7153
|
+
};
|
|
7154
|
+
}
|
|
7146
7155
|
|
|
7147
7156
|
if (withEvent) {
|
|
7148
7157
|
this.eventEmitter.emit(ACCEPTED, session, sessionDialog);
|
|
@@ -7311,10 +7320,10 @@ class WebRTCClient extends Emitter {
|
|
|
7311
7320
|
|
|
7312
7321
|
_stopSendingStats(session ) {
|
|
7313
7322
|
const sessionId = this.getSipSessionId(session);
|
|
7314
|
-
logger
|
|
7323
|
+
logger.trace('Check for stopping stats', { sessionId, ids: Object.keys(this.statsIntervals) });
|
|
7315
7324
|
|
|
7316
7325
|
if (sessionId in this.statsIntervals) {
|
|
7317
|
-
logger
|
|
7326
|
+
logger.trace('Stop sending stats for call', { sessionId });
|
|
7318
7327
|
this.statsIntervals[sessionId]();
|
|
7319
7328
|
delete this.statsIntervals[sessionId];
|
|
7320
7329
|
}
|
|
@@ -7330,7 +7339,7 @@ class WebRTCClient extends Emitter {
|
|
|
7330
7339
|
try {
|
|
7331
7340
|
await this.userAgent.transport.disconnect();
|
|
7332
7341
|
} catch (e) {
|
|
7333
|
-
logger
|
|
7342
|
+
logger.error('WebRTC transport disconnect, error', e);
|
|
7334
7343
|
}
|
|
7335
7344
|
}
|
|
7336
7345
|
}
|
|
@@ -7352,13 +7361,17 @@ class WebRTCClient extends Emitter {
|
|
|
7352
7361
|
const nbStats = this.sessionNetworkStats[sessionId].length;
|
|
7353
7362
|
const lastNetworkStats = this.sessionNetworkStats[sessionId][nbStats - 1];
|
|
7354
7363
|
const lastAudioSent = lastNetworkStats ? lastNetworkStats.audioBytesSent : 0;
|
|
7364
|
+
const lastAudioContentSent = lastNetworkStats ? lastNetworkStats.audioContentSent : 0;
|
|
7355
7365
|
const lastVideoSent = lastNetworkStats ? lastNetworkStats.videoBytesSent : 0;
|
|
7356
7366
|
const lastAudioReceived = lastNetworkStats ? lastNetworkStats.audioBytesReceived : 0;
|
|
7367
|
+
const lastAudioContentReceived = lastNetworkStats ? lastNetworkStats.audioContentReceived : 0;
|
|
7357
7368
|
const lastVideoReceived = lastNetworkStats ? lastNetworkStats.videoBytesReceived : 0;
|
|
7358
7369
|
const lastTransportSent = lastNetworkStats ? lastNetworkStats.transportSent : 0;
|
|
7359
7370
|
const lastTransportReceived = lastNetworkStats ? lastNetworkStats.transportReceived : 0;
|
|
7360
|
-
let audioBytesSent = 0;
|
|
7361
|
-
let audioBytesReceived = 0;
|
|
7371
|
+
let audioBytesSent = 0; // content + header
|
|
7372
|
+
let audioBytesReceived = 0; // content + header
|
|
7373
|
+
let audioContentSent = 0; // useful to detect blank call
|
|
7374
|
+
let audioContentReceived = 0;
|
|
7362
7375
|
let videoBytesSent = 0;
|
|
7363
7376
|
let videoBytesReceived = 0;
|
|
7364
7377
|
let transportSent = 0;
|
|
@@ -7368,6 +7381,7 @@ class WebRTCClient extends Emitter {
|
|
|
7368
7381
|
stats.forEach(report => {
|
|
7369
7382
|
if (report.type === 'outbound-rtp' && report.kind === 'audio') {
|
|
7370
7383
|
audioBytesSent += Number(report.bytesSent) + Number(report.headerBytesSent);
|
|
7384
|
+
audioContentSent += Number(report.bytesSent);
|
|
7371
7385
|
}
|
|
7372
7386
|
if (report.type === 'remote-outbound-rtp' && report.kind === 'audio') {
|
|
7373
7387
|
audioBytesSent += Number(report.bytesSent);
|
|
@@ -7379,6 +7393,7 @@ class WebRTCClient extends Emitter {
|
|
|
7379
7393
|
packetsLost += Number(report.packetsLost);
|
|
7380
7394
|
networkStats.packetsReceived = Number(report.packetsReceived);
|
|
7381
7395
|
audioBytesReceived += Number(report.bytesReceived) + Number(report.headerBytesReceived);
|
|
7396
|
+
audioContentReceived += Number(report.bytesReceived);
|
|
7382
7397
|
}
|
|
7383
7398
|
if (report.type === 'inbound-rtp' && report.kind === 'video') {
|
|
7384
7399
|
videoBytesReceived += Number(report.bytesReceived) + Number(report.headerBytesReceived);
|
|
@@ -7407,10 +7422,17 @@ class WebRTCClient extends Emitter {
|
|
|
7407
7422
|
});
|
|
7408
7423
|
|
|
7409
7424
|
networkStats.packetsLost = packetsLost;
|
|
7425
|
+
|
|
7410
7426
|
networkStats.totalAudioBytesSent = audioBytesSent;
|
|
7411
7427
|
networkStats.audioBytesSent = audioBytesSent - lastAudioSent;
|
|
7412
7428
|
networkStats.totalAudioBytesReceived = audioBytesReceived - lastAudioReceived;
|
|
7413
7429
|
networkStats.audioBytesReceived = audioBytesReceived;
|
|
7430
|
+
|
|
7431
|
+
networkStats.totalAudioContentSent = audioContentSent;
|
|
7432
|
+
networkStats.audioContentSent = audioContentSent - lastAudioContentSent;
|
|
7433
|
+
networkStats.totalAudioBytesReceived = audioContentReceived - lastAudioContentReceived;
|
|
7434
|
+
networkStats.audioContentReceived = audioContentReceived;
|
|
7435
|
+
|
|
7414
7436
|
networkStats.totalVideoBytesSent = videoBytesSent;
|
|
7415
7437
|
networkStats.videoBytesSent = videoBytesSent - lastVideoSent;
|
|
7416
7438
|
networkStats.totalVideoBytesReceived = videoBytesReceived;
|