@wazo/sdk 0.37.24 → 0.37.25
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/wazo-sdk.js +6 -6
- package/esm/__tests__/api-client.test.js +12 -12
- package/esm/__tests__/web-rtc-client.test.js +120 -103
- package/esm/api/amid.js +1 -1
- package/esm/api/call-logd.js +2 -2
- package/esm/api/ctid-ng.js +3 -3
- package/esm/api/dird.js +1 -1
- package/esm/api/webhookd.js +1 -1
- package/esm/api-client.js +12 -12
- package/esm/checker/Checker.js +145 -128
- package/esm/checker/checks/aor.js +12 -12
- package/esm/checker/checks/api.js +12 -12
- package/esm/checker/checks/index.js +135 -118
- package/esm/checker/checks/wazo-websocket.js +15 -15
- package/esm/checker/checks/webrtc-transport.js +120 -103
- package/esm/checker/checks/webrtc.js +120 -103
- package/esm/domain/AdHocAPIConference.js +12 -12
- package/esm/domain/CallLog.js +1 -1
- package/esm/domain/Contact.js +1 -1
- package/esm/domain/Features.js +12 -12
- package/esm/domain/Phone/CTIPhone.js +26 -26
- package/esm/domain/Phone/WebRTCPhone.js +87 -86
- package/esm/domain/__tests__/CallLog.test.js +1 -1
- package/esm/domain/__tests__/Contact.test.js +1 -1
- package/esm/index.js +356 -338
- package/esm/lib/WazoSessionDescriptionHandler.js +1 -1
- package/esm/service/CallApi.js +12 -12
- package/esm/service/IssueReporter.js +1 -1
- package/esm/service/__tests__/IssueReporter.test.js +1 -1
- package/esm/service/getApiClient.js +12 -12
- package/esm/simple/Auth.js +346 -328
- package/esm/simple/Configuration.js +346 -328
- package/esm/simple/Directory.js +12 -12
- package/esm/simple/Phone.js +346 -328
- package/esm/simple/Websocket.js +17 -17
- package/esm/simple/index.js +350 -332
- package/esm/simple/room/LocalParticipant.js +350 -332
- package/esm/simple/room/Participant.js +350 -332
- package/esm/simple/room/RemoteParticipant.js +350 -332
- package/esm/simple/room/Room.js +351 -333
- package/esm/simple/room/SipRoom.js +350 -332
- package/esm/simple/room/Stream.js +350 -332
- package/esm/simple/room/__tests__/RemoteParticipant.test.js +350 -332
- package/esm/simple/utils.js +350 -332
- package/esm/web-rtc-client.js +120 -103
- package/esm/websocket-client.js +15 -15
- package/lib/__tests__/api-client.test.js +12 -12
- package/lib/__tests__/web-rtc-client.test.js +120 -103
- package/lib/api/amid.js +1 -1
- package/lib/api/call-logd.js +2 -2
- package/lib/api/ctid-ng.js +3 -3
- package/lib/api/dird.js +1 -1
- package/lib/api/webhookd.js +1 -1
- package/lib/api-client.js +12 -12
- package/lib/checker/Checker.js +145 -128
- package/lib/checker/checks/aor.js +12 -12
- package/lib/checker/checks/api.js +12 -12
- package/lib/checker/checks/index.js +135 -118
- package/lib/checker/checks/wazo-websocket.js +15 -15
- package/lib/checker/checks/webrtc-transport.js +120 -103
- package/lib/checker/checks/webrtc.js +120 -103
- package/lib/domain/AdHocAPIConference.js +12 -12
- package/lib/domain/CallLog.js +1 -1
- package/lib/domain/Contact.js +1 -1
- package/lib/domain/Features.js +12 -12
- package/lib/domain/Phone/CTIPhone.js +26 -26
- package/lib/domain/Phone/WebRTCPhone.js +87 -86
- package/lib/domain/__tests__/CallLog.test.js +1 -1
- package/lib/domain/__tests__/Contact.test.js +1 -1
- package/lib/index.js +356 -338
- package/lib/lib/WazoSessionDescriptionHandler.js +1 -1
- package/lib/service/CallApi.js +12 -12
- package/lib/service/IssueReporter.js +1 -1
- package/lib/service/__tests__/IssueReporter.test.js +1 -1
- package/lib/service/getApiClient.js +12 -12
- package/lib/simple/Auth.js +346 -328
- package/lib/simple/Configuration.js +346 -328
- package/lib/simple/Directory.js +12 -12
- package/lib/simple/Phone.js +346 -328
- package/lib/simple/Websocket.js +17 -17
- package/lib/simple/index.js +350 -332
- package/lib/simple/room/LocalParticipant.js +350 -332
- package/lib/simple/room/Participant.js +350 -332
- package/lib/simple/room/RemoteParticipant.js +350 -332
- package/lib/simple/room/Room.js +351 -333
- package/lib/simple/room/SipRoom.js +350 -332
- package/lib/simple/room/Stream.js +350 -332
- package/lib/simple/room/__tests__/RemoteParticipant.test.js +350 -332
- package/lib/simple/utils.js +350 -332
- package/lib/web-rtc-client.js +120 -103
- package/lib/websocket-client.js +15 -15
- package/package.json +1 -1
- package/src/domain/Phone/WebRTCPhone.js +3 -2
- package/src/web-rtc-client.js +27 -10
package/lib/websocket-client.js
CHANGED
|
@@ -45,7 +45,7 @@ const isMobile = () => typeof navigator !== 'undefined' && navigator.product ===
|
|
|
45
45
|
|
|
46
46
|
/* */
|
|
47
47
|
|
|
48
|
-
|
|
48
|
+
IssueReporter$1 ? IssueReporter$1.loggerFor('api') : console;
|
|
49
49
|
|
|
50
50
|
// Use a function here to be able to mock it in tests
|
|
51
51
|
const realFetch = () => {
|
|
@@ -621,7 +621,7 @@ const BLACKLIST_EVENTS = [
|
|
|
621
621
|
];
|
|
622
622
|
|
|
623
623
|
const HEARTBEAT_ENGINE_VERSION = '20.09';
|
|
624
|
-
const logger
|
|
624
|
+
const logger = IssueReporter$1.loggerFor('wazo-ws');
|
|
625
625
|
const messageLogger = IssueReporter$1.loggerFor('wazo-ws-message');
|
|
626
626
|
|
|
627
627
|
class WebSocketClient extends Emitter {
|
|
@@ -670,19 +670,19 @@ class WebSocketClient extends Emitter {
|
|
|
670
670
|
}
|
|
671
671
|
|
|
672
672
|
connect() {
|
|
673
|
-
logger
|
|
673
|
+
logger.info('connect method started', { host: this.host, token: this.token });
|
|
674
674
|
this.socket = new ReconnectingWebSocket__default['default'](this._getUrl.bind(this), [], this.options);
|
|
675
675
|
if (this.options.binaryType) {
|
|
676
676
|
this.socket.binaryType = this.options.binaryType;
|
|
677
677
|
}
|
|
678
678
|
|
|
679
679
|
this.socket.onopen = () => {
|
|
680
|
-
logger
|
|
680
|
+
logger.info('on Wazo WS open', { method: 'connect', host: this.host });
|
|
681
681
|
this.eventEmitter.emit(SOCKET_EVENTS.ON_OPEN);
|
|
682
682
|
};
|
|
683
683
|
|
|
684
684
|
this.socket.onerror = event => {
|
|
685
|
-
logger
|
|
685
|
+
logger.error('on Wazo WS error', event.target);
|
|
686
686
|
this.eventEmitter.emit(SOCKET_EVENTS.ON_ERROR, event);
|
|
687
687
|
};
|
|
688
688
|
|
|
@@ -712,7 +712,7 @@ class WebSocketClient extends Emitter {
|
|
|
712
712
|
|
|
713
713
|
this.socket.onclose = event => {
|
|
714
714
|
// Can't be converted to JSON (circular structure)
|
|
715
|
-
logger
|
|
715
|
+
logger.info('on Wazo WS close', {
|
|
716
716
|
reason: event.reason,
|
|
717
717
|
code: event.code,
|
|
718
718
|
readyState: event.target.readyState,
|
|
@@ -730,12 +730,12 @@ class WebSocketClient extends Emitter {
|
|
|
730
730
|
};
|
|
731
731
|
|
|
732
732
|
this.socket.onerror = event => {
|
|
733
|
-
logger
|
|
733
|
+
logger.info('Wazo WS error', { message: event.message, code: event.code, readyState: event.target.readyState });
|
|
734
734
|
};
|
|
735
735
|
}
|
|
736
736
|
|
|
737
737
|
close(force = false) {
|
|
738
|
-
logger
|
|
738
|
+
logger.info('Wazo WS close', { socket: !!this.socket, host: this.host, token: this.token });
|
|
739
739
|
|
|
740
740
|
if (!this.socket) {
|
|
741
741
|
return;
|
|
@@ -753,7 +753,7 @@ class WebSocketClient extends Emitter {
|
|
|
753
753
|
|
|
754
754
|
updateToken(token ) {
|
|
755
755
|
this.token = token;
|
|
756
|
-
logger
|
|
756
|
+
logger.info('Wazo WS updating token', { url: this._getUrl(), token, socket: !!this.socket });
|
|
757
757
|
|
|
758
758
|
if (this.socket) {
|
|
759
759
|
// If still connected, send the token to the WS
|
|
@@ -771,7 +771,7 @@ class WebSocketClient extends Emitter {
|
|
|
771
771
|
}
|
|
772
772
|
|
|
773
773
|
startHeartbeat() {
|
|
774
|
-
logger
|
|
774
|
+
logger.info('Wazo WS start heartbeat', { host: this.host, token: this.token });
|
|
775
775
|
|
|
776
776
|
if (!this.socket) {
|
|
777
777
|
this.heartbeat.stop();
|
|
@@ -785,7 +785,7 @@ class WebSocketClient extends Emitter {
|
|
|
785
785
|
}
|
|
786
786
|
|
|
787
787
|
stopHeartbeat() {
|
|
788
|
-
logger
|
|
788
|
+
logger.info('Wazo WS stop heartbeat', { host: this.host, token: this.token });
|
|
789
789
|
|
|
790
790
|
this.heartbeat.stop();
|
|
791
791
|
}
|
|
@@ -815,7 +815,7 @@ class WebSocketClient extends Emitter {
|
|
|
815
815
|
}
|
|
816
816
|
|
|
817
817
|
reconnect(reason ) {
|
|
818
|
-
logger
|
|
818
|
+
logger.info('Wazo WS reconnect', { reason, socket: !!this.socket, host: this.host, token: this.token });
|
|
819
819
|
if (!this.socket) {
|
|
820
820
|
return;
|
|
821
821
|
}
|
|
@@ -871,7 +871,7 @@ class WebSocketClient extends Emitter {
|
|
|
871
871
|
this.close();
|
|
872
872
|
}
|
|
873
873
|
const url = `wss://${this.host || ''}/api/websocketd/?token=${this.token || ''}&version=${this.version}`;
|
|
874
|
-
logger
|
|
874
|
+
logger.log('Wazo WS url computed to reconnect', { url });
|
|
875
875
|
|
|
876
876
|
return url;
|
|
877
877
|
}
|
|
@@ -879,12 +879,12 @@ class WebSocketClient extends Emitter {
|
|
|
879
879
|
_onHeartbeat(message ) {
|
|
880
880
|
if (message.payload === 'pong') {
|
|
881
881
|
this.heartbeat.onHeartbeat();
|
|
882
|
-
logger
|
|
882
|
+
logger.log('on heartbeat received from Wazo WS');
|
|
883
883
|
}
|
|
884
884
|
}
|
|
885
885
|
|
|
886
886
|
async _onHeartbeatTimeout() {
|
|
887
|
-
logger
|
|
887
|
+
logger.log('heartbeat timed out', { host: this.host, token: this.token });
|
|
888
888
|
|
|
889
889
|
this.close();
|
|
890
890
|
this.eventEmitter.emit(SOCKET_EVENTS.ON_CLOSE, new Error('Websocket ping failure.'));
|
package/package.json
CHANGED
|
@@ -203,6 +203,7 @@ export default class WebRTCPhone extends Emitter implements Phone {
|
|
|
203
203
|
constraints,
|
|
204
204
|
audioOnly,
|
|
205
205
|
conference,
|
|
206
|
+
iceRestart,
|
|
206
207
|
});
|
|
207
208
|
|
|
208
209
|
if (!sipSession) {
|
|
@@ -614,7 +615,7 @@ export default class WebRTCPhone extends Emitter implements Phone {
|
|
|
614
615
|
}
|
|
615
616
|
|
|
616
617
|
_onCallAccepted(sipSession: Session, cameraEnabled: boolean): CallSession {
|
|
617
|
-
logger.info('WebRTC phone -
|
|
618
|
+
logger.info('WebRTC phone - on call accepted', { sipId: sipSession.id, cameraEnabled });
|
|
618
619
|
|
|
619
620
|
const callSession = this._createAcceptedCallSession(sipSession, cameraEnabled);
|
|
620
621
|
this.currentSipSession = sipSession;
|
|
@@ -1126,7 +1127,7 @@ export default class WebRTCPhone extends Emitter implements Phone {
|
|
|
1126
1127
|
// @TODO: line is not used here
|
|
1127
1128
|
async makeCall(number: string, line: any, cameraEnabled?: boolean,
|
|
1128
1129
|
audioOnly: boolean = false, conference: boolean = false): Promise<?CallSession> {
|
|
1129
|
-
logger.info('make WebRTC call', { number, lineId: line ? line.id : null, cameraEnabled });
|
|
1130
|
+
logger.info('make WebRTC call', { number, lineId: line ? line.id : null, cameraEnabled, audioOnly, conference });
|
|
1130
1131
|
if (!number) {
|
|
1131
1132
|
return Promise.resolve(null);
|
|
1132
1133
|
}
|
package/src/web-rtc-client.js
CHANGED
|
@@ -453,7 +453,7 @@ export default class WebRTCClient extends Emitter {
|
|
|
453
453
|
}
|
|
454
454
|
|
|
455
455
|
call(number: string, enableVideo?: boolean, audioOnly: boolean = false, conference: boolean = false): Session {
|
|
456
|
-
logger.info('sdk webrtc creating call', { number, enableVideo, audioOnly });
|
|
456
|
+
logger.info('sdk webrtc creating call', { number, enableVideo, audioOnly, conference });
|
|
457
457
|
const inviterOptions: Object = {
|
|
458
458
|
sessionDescriptionHandlerOptionsReInvite: {
|
|
459
459
|
conference,
|
|
@@ -1529,6 +1529,7 @@ export default class WebRTCClient extends Emitter {
|
|
|
1529
1529
|
const screenSharing = constraints && 'screen' in constraints ? constraints.screen : false;
|
|
1530
1530
|
const isDesktop = constraints && 'desktop' in constraints ? constraints.desktop : false;
|
|
1531
1531
|
const withAudio = constraints && 'audio' in constraints ? constraints.audio : true;
|
|
1532
|
+
const mandatoryVideo = constraints && typeof constraints.video === 'object' ? constraints.video.mandatory : {};
|
|
1532
1533
|
|
|
1533
1534
|
logger.info('Retrieving media a configuration', { enableVideo, screenSharing, isDesktop, withAudio, constraints });
|
|
1534
1535
|
|
|
@@ -1536,7 +1537,8 @@ export default class WebRTCClient extends Emitter {
|
|
|
1536
1537
|
constraints: {
|
|
1537
1538
|
// Exact constraint are not supported with `getDisplayMedia` and we must have a video=false in desktop screenshare
|
|
1538
1539
|
audio: screenSharing ? !isDesktop : (withAudio ? this._getAudioConstraints() : false),
|
|
1539
|
-
video: screenSharing ? (isDesktop
|
|
1540
|
+
video: screenSharing ? (isDesktop
|
|
1541
|
+
? ({ mandatory: { chromeMediaSource: 'desktop', ...(mandatoryVideo || {}) } }) : { cursor: 'always' })
|
|
1540
1542
|
: this._getVideoConstraints(enableVideo),
|
|
1541
1543
|
screen: screenSharing,
|
|
1542
1544
|
desktop: isDesktop,
|
|
@@ -1871,12 +1873,14 @@ export default class WebRTCClient extends Emitter {
|
|
|
1871
1873
|
|
|
1872
1874
|
session.sessionDescriptionHandler.remoteMediaStream.onaddtrack = onTrack;
|
|
1873
1875
|
|
|
1874
|
-
|
|
1875
|
-
|
|
1876
|
-
|
|
1877
|
-
|
|
1878
|
-
|
|
1879
|
-
|
|
1876
|
+
if (pc) {
|
|
1877
|
+
pc.oniceconnectionstatechange = () => {
|
|
1878
|
+
logger.info('on ice connection state changed', { state: pc.iceConnectionState });
|
|
1879
|
+
if (pc.iceConnectionState === 'disconnected') {
|
|
1880
|
+
this.eventEmitter.emit(ON_DISCONNECTED);
|
|
1881
|
+
}
|
|
1882
|
+
};
|
|
1883
|
+
}
|
|
1880
1884
|
|
|
1881
1885
|
if (withEvent) {
|
|
1882
1886
|
this.eventEmitter.emit(ACCEPTED, session, sessionDialog);
|
|
@@ -2086,13 +2090,17 @@ export default class WebRTCClient extends Emitter {
|
|
|
2086
2090
|
const nbStats = this.sessionNetworkStats[sessionId].length;
|
|
2087
2091
|
const lastNetworkStats = this.sessionNetworkStats[sessionId][nbStats - 1];
|
|
2088
2092
|
const lastAudioSent = lastNetworkStats ? lastNetworkStats.audioBytesSent : 0;
|
|
2093
|
+
const lastAudioContentSent = lastNetworkStats ? lastNetworkStats.audioContentSent : 0;
|
|
2089
2094
|
const lastVideoSent = lastNetworkStats ? lastNetworkStats.videoBytesSent : 0;
|
|
2090
2095
|
const lastAudioReceived = lastNetworkStats ? lastNetworkStats.audioBytesReceived : 0;
|
|
2096
|
+
const lastAudioContentReceived = lastNetworkStats ? lastNetworkStats.audioContentReceived : 0;
|
|
2091
2097
|
const lastVideoReceived = lastNetworkStats ? lastNetworkStats.videoBytesReceived : 0;
|
|
2092
2098
|
const lastTransportSent = lastNetworkStats ? lastNetworkStats.transportSent : 0;
|
|
2093
2099
|
const lastTransportReceived = lastNetworkStats ? lastNetworkStats.transportReceived : 0;
|
|
2094
|
-
let audioBytesSent = 0;
|
|
2095
|
-
let audioBytesReceived = 0;
|
|
2100
|
+
let audioBytesSent = 0; // content + header
|
|
2101
|
+
let audioBytesReceived = 0; // content + header
|
|
2102
|
+
let audioContentSent = 0; // useful to detect blank call
|
|
2103
|
+
let audioContentReceived = 0;
|
|
2096
2104
|
let videoBytesSent = 0;
|
|
2097
2105
|
let videoBytesReceived = 0;
|
|
2098
2106
|
let transportSent = 0;
|
|
@@ -2102,6 +2110,7 @@ export default class WebRTCClient extends Emitter {
|
|
|
2102
2110
|
stats.forEach(report => {
|
|
2103
2111
|
if (report.type === 'outbound-rtp' && report.kind === 'audio') {
|
|
2104
2112
|
audioBytesSent += Number(report.bytesSent) + Number(report.headerBytesSent);
|
|
2113
|
+
audioContentSent += Number(report.bytesSent);
|
|
2105
2114
|
}
|
|
2106
2115
|
if (report.type === 'remote-outbound-rtp' && report.kind === 'audio') {
|
|
2107
2116
|
audioBytesSent += Number(report.bytesSent);
|
|
@@ -2113,6 +2122,7 @@ export default class WebRTCClient extends Emitter {
|
|
|
2113
2122
|
packetsLost += Number(report.packetsLost);
|
|
2114
2123
|
networkStats.packetsReceived = Number(report.packetsReceived);
|
|
2115
2124
|
audioBytesReceived += Number(report.bytesReceived) + Number(report.headerBytesReceived);
|
|
2125
|
+
audioContentReceived += Number(report.bytesReceived);
|
|
2116
2126
|
}
|
|
2117
2127
|
if (report.type === 'inbound-rtp' && report.kind === 'video') {
|
|
2118
2128
|
videoBytesReceived += Number(report.bytesReceived) + Number(report.headerBytesReceived);
|
|
@@ -2141,10 +2151,17 @@ export default class WebRTCClient extends Emitter {
|
|
|
2141
2151
|
});
|
|
2142
2152
|
|
|
2143
2153
|
networkStats.packetsLost = packetsLost;
|
|
2154
|
+
|
|
2144
2155
|
networkStats.totalAudioBytesSent = audioBytesSent;
|
|
2145
2156
|
networkStats.audioBytesSent = audioBytesSent - lastAudioSent;
|
|
2146
2157
|
networkStats.totalAudioBytesReceived = audioBytesReceived - lastAudioReceived;
|
|
2147
2158
|
networkStats.audioBytesReceived = audioBytesReceived;
|
|
2159
|
+
|
|
2160
|
+
networkStats.totalAudioContentSent = audioContentSent;
|
|
2161
|
+
networkStats.audioContentSent = audioContentSent - lastAudioContentSent;
|
|
2162
|
+
networkStats.totalAudioBytesReceived = audioContentReceived - lastAudioContentReceived;
|
|
2163
|
+
networkStats.audioContentReceived = audioContentReceived;
|
|
2164
|
+
|
|
2148
2165
|
networkStats.totalVideoBytesSent = videoBytesSent;
|
|
2149
2166
|
networkStats.videoBytesSent = videoBytesSent - lastVideoSent;
|
|
2150
2167
|
networkStats.totalVideoBytesReceived = videoBytesReceived;
|