@wazo/sdk 0.37.18 → 0.37.22
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 +13 -5
- package/esm/__tests__/api-client.test.js +52 -9
- package/esm/__tests__/web-rtc-client.test.js +80 -20
- package/esm/api/agentd.js +27 -4
- package/esm/api/amid.js +27 -4
- package/esm/api/application.js +27 -4
- package/esm/api/auth.js +29 -5
- package/esm/api/call-logd.js +29 -6
- package/esm/api/calld.js +27 -4
- package/esm/api/chatd.js +27 -4
- package/esm/api/confd.js +51 -8
- package/esm/api/ctid-ng.js +27 -4
- package/esm/api/dird.js +27 -4
- package/esm/api/webhookd.js +27 -4
- package/esm/api-client.js +54 -11
- package/esm/checker/Checker.js +83 -21
- package/esm/checker/checks/aor.js +54 -11
- package/esm/checker/checks/api.js +54 -11
- package/esm/checker/checks/ice-ipv4.js +1 -1
- package/esm/checker/checks/index.js +84 -22
- package/esm/checker/checks/symmetric-nat.js +1 -1
- package/esm/checker/checks/wazo-websocket.js +29 -4
- package/esm/checker/checks/webrtc-transport.js +82 -22
- package/esm/checker/checks/webrtc.js +82 -22
- package/esm/domain/AdHocAPIConference.js +54 -11
- package/esm/domain/Agent.js +1 -1
- package/esm/domain/BadResponse.js +1 -1
- package/esm/domain/Call.js +1 -1
- package/esm/domain/CallLog.js +3 -3
- package/esm/domain/CallSession.js +1 -1
- package/esm/domain/ChatMessage.js +1 -1
- package/esm/domain/ChatRoom.js +1 -1
- package/esm/domain/Contact.js +2 -1
- package/esm/domain/Country.js +1 -1
- package/esm/domain/Device/DebugDevice.js +1 -1
- package/esm/domain/ExternalApp.js +1 -1
- package/esm/domain/Features.js +54 -10
- package/esm/domain/ForwardOption.js +2 -1
- package/esm/domain/IndirectTransfer.js +1 -1
- package/esm/domain/Line.js +1 -1
- package/esm/domain/Meeting.js +20 -3
- package/esm/domain/NotificationOptions.js +1 -1
- package/esm/domain/Phone/CTIPhone.js +55 -11
- package/esm/domain/Phone/WebRTCPhone.js +39 -6
- package/esm/domain/Profile.js +2 -1
- package/esm/domain/Recording.js +2 -2
- package/esm/domain/Relocation.js +1 -1
- package/esm/domain/Room.js +1 -1
- package/esm/domain/ServerError.js +1 -1
- package/esm/domain/Session.js +2 -2
- package/esm/domain/SipLine.js +1 -1
- package/esm/domain/Subscription.js +1 -1
- package/esm/domain/SwitchboardCall.js +1 -1
- package/esm/domain/Voicemail.js +1 -1
- package/esm/domain/__tests__/CallLog.test.js +2 -2
- package/esm/index.js +101 -24
- package/esm/lib/WazoSessionDescriptionHandler.js +28 -4
- package/esm/service/CallApi.js +54 -11
- package/esm/service/IssueReporter.js +27 -4
- package/esm/service/__tests__/IssueReporter.test.js +26 -3
- package/esm/service/getApiClient.js +55 -11
- package/esm/simple/Auth.js +101 -23
- package/esm/simple/Configuration.js +100 -23
- package/esm/simple/Directory.js +53 -10
- package/esm/simple/Phone.js +100 -23
- package/esm/simple/Websocket.js +30 -4
- package/esm/simple/index.js +100 -23
- package/esm/simple/room/LocalParticipant.js +113 -40
- package/esm/simple/room/Participant.js +112 -37
- package/esm/simple/room/RemoteParticipant.js +114 -41
- package/esm/simple/room/Room.js +113 -37
- package/esm/simple/room/SipRoom.js +101 -26
- package/esm/simple/room/Stream.js +101 -26
- package/esm/simple/room/__tests__/RemoteParticipant.test.js +99 -22
- package/esm/simple/utils.js +99 -22
- package/esm/utils/Emitter.js +1 -1
- package/esm/utils/Heartbeat.js +1 -1
- package/esm/utils/__tests__/api-requester.test.js +26 -3
- package/esm/utils/api-requester.js +28 -4
- package/esm/utils/compare-version.js +1 -1
- package/esm/utils/isMobile.js +1 -1
- package/esm/utils/new-from.js +1 -1
- package/esm/utils/once.js +1 -1
- package/esm/utils/update-from.js +1 -1
- package/esm/web-rtc-client.js +83 -22
- package/esm/websocket-client.js +30 -4
- package/lib/__tests__/api-client.test.js +61 -18
- package/lib/__tests__/web-rtc-client.test.js +97 -37
- package/lib/api/agentd.js +27 -4
- package/lib/api/amid.js +27 -4
- package/lib/api/application.js +27 -4
- package/lib/api/auth.js +28 -5
- package/lib/api/call-logd.js +34 -11
- package/lib/api/calld.js +30 -7
- package/lib/api/chatd.js +28 -5
- package/lib/api/confd.js +51 -8
- package/lib/api/ctid-ng.js +30 -7
- package/lib/api/dird.js +27 -4
- package/lib/api/webhookd.js +27 -4
- package/lib/api-client.js +61 -18
- package/lib/checker/Checker.js +100 -38
- package/lib/checker/checks/aor.js +61 -18
- package/lib/checker/checks/api.js +61 -18
- package/lib/checker/checks/index.js +100 -38
- package/lib/checker/checks/wazo-websocket.js +31 -6
- package/lib/checker/checks/webrtc-transport.js +97 -37
- package/lib/checker/checks/webrtc.js +97 -37
- package/lib/domain/AdHocAPIConference.js +61 -18
- package/lib/domain/Call.js +1 -1
- package/lib/domain/CallLog.js +7 -7
- package/lib/domain/ChatMessage.js +1 -1
- package/lib/domain/Contact.js +1 -1
- package/lib/domain/Features.js +62 -19
- package/lib/domain/ForwardOption.js +1 -1
- package/lib/domain/Meeting.js +19 -2
- package/lib/domain/Phone/CTIPhone.js +63 -20
- package/lib/domain/Phone/WebRTCPhone.js +40 -8
- package/lib/domain/Profile.js +1 -1
- package/lib/domain/Recording.js +3 -3
- package/lib/domain/Voicemail.js +1 -1
- package/lib/domain/__tests__/Call.test.js +1 -1
- package/lib/domain/__tests__/CallLog.test.js +13 -13
- package/lib/domain/__tests__/Voicemail.test.js +1 -1
- package/lib/index.js +120 -43
- package/lib/lib/WazoSessionDescriptionHandler.js +32 -9
- package/lib/service/CallApi.js +61 -18
- package/lib/service/IssueReporter.js +27 -4
- package/lib/service/__tests__/IssueReporter.test.js +27 -4
- package/lib/service/getApiClient.js +62 -19
- package/lib/simple/Auth.js +119 -42
- package/lib/simple/Configuration.js +118 -41
- package/lib/simple/Directory.js +61 -18
- package/lib/simple/Phone.js +118 -41
- package/lib/simple/Websocket.js +32 -6
- package/lib/simple/index.js +118 -41
- package/lib/simple/room/LocalParticipant.js +132 -59
- package/lib/simple/room/Participant.js +130 -55
- package/lib/simple/room/RemoteParticipant.js +133 -60
- package/lib/simple/room/Room.js +131 -56
- package/lib/simple/room/SipRoom.js +120 -45
- package/lib/simple/room/Stream.js +120 -45
- package/lib/simple/room/__tests__/RemoteParticipant.test.js +118 -41
- package/lib/simple/utils.js +118 -41
- package/lib/utils/Emitter.js +1 -1
- package/lib/utils/PhoneNumberUtil.js +2 -2
- package/lib/utils/__tests__/PhoneNumberUtil.test.js +2 -2
- package/lib/utils/__tests__/api-requester.test.js +27 -4
- package/lib/utils/__tests__/sdp.test.js +12 -12
- package/lib/utils/api-requester.js +28 -5
- package/lib/utils/sdp.js +10 -10
- package/lib/web-rtc-client.js +98 -38
- package/lib/websocket-client.js +33 -7
- package/package.json +2 -2
- package/src/api/confd.js +5 -2
- package/src/domain/CallLog.js +1 -1
- package/src/domain/Meeting.js +19 -2
- package/src/domain/Phone/WebRTCPhone.js +11 -2
- package/src/domain/Recording.js +1 -1
- package/src/service/IssueReporter.js +26 -3
- package/src/simple/Phone.js +5 -0
- package/src/types/WebSocketMessage.js +5 -1
- package/src/web-rtc-client.js +28 -11
- package/src/websocket-client.js +2 -0
|
@@ -134,6 +134,7 @@ class IssueReporter {
|
|
|
134
134
|
|
|
135
135
|
|
|
136
136
|
|
|
137
|
+
|
|
137
138
|
|
|
138
139
|
constructor() {
|
|
139
140
|
addLevelsTo(this);
|
|
@@ -145,12 +146,17 @@ class IssueReporter {
|
|
|
145
146
|
this.bufferTimeout = null;
|
|
146
147
|
this._boundProcessBuffer = this._processBuffer.bind(this);
|
|
147
148
|
this._boundParseLoggerBody = this._parseLoggerBody.bind(this);
|
|
149
|
+
this._callback = null;
|
|
148
150
|
}
|
|
149
151
|
|
|
150
152
|
init() {
|
|
151
153
|
this._catchConsole();
|
|
152
154
|
}
|
|
153
155
|
|
|
156
|
+
setCallback(cb ) {
|
|
157
|
+
this._callback = cb;
|
|
158
|
+
}
|
|
159
|
+
|
|
154
160
|
configureRemoteClient(configuration = { tag: 'wazo-sdk', host: null, port: null, level: null, extra: {} }) {
|
|
155
161
|
this.remoteClientConfiguration = configuration;
|
|
156
162
|
}
|
|
@@ -186,6 +192,7 @@ class IssueReporter {
|
|
|
186
192
|
|
|
187
193
|
// Handle category label
|
|
188
194
|
let category = null;
|
|
195
|
+
let skipSendToRemote = false;
|
|
189
196
|
let extra = {};
|
|
190
197
|
if (args[0].indexOf(CATEGORY_PREFIX) === 0) {
|
|
191
198
|
category = args[0].split('=')[1];
|
|
@@ -201,6 +208,7 @@ class IssueReporter {
|
|
|
201
208
|
errorMessage: lastArg.message,
|
|
202
209
|
errorStack: lastArg.stack,
|
|
203
210
|
errorType: lastArg.constructor.name,
|
|
211
|
+
skipSendToRemote: lastArg.skipSendToRemote,
|
|
204
212
|
};
|
|
205
213
|
} else {
|
|
206
214
|
extra = lastArg;
|
|
@@ -209,7 +217,12 @@ class IssueReporter {
|
|
|
209
217
|
args.splice(1, 1);
|
|
210
218
|
}
|
|
211
219
|
|
|
212
|
-
|
|
220
|
+
if (extra.skipSendToRemote) {
|
|
221
|
+
skipSendToRemote = true;
|
|
222
|
+
delete extra.skipSendToRemote;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
const date = moment__default['default']().format('YYYY-MM-DD HH:mm:ss.SSS');
|
|
213
226
|
const message = args.join(', ');
|
|
214
227
|
let consoleMessage = message;
|
|
215
228
|
|
|
@@ -229,7 +242,13 @@ class IssueReporter {
|
|
|
229
242
|
const oldMethod = this.oldConsoleMethods[consoleLevel] || this.oldConsoleMethods.log;
|
|
230
243
|
oldMethod.apply(oldMethod, [date, consoleMessage]);
|
|
231
244
|
|
|
232
|
-
this.
|
|
245
|
+
if (this._callback) {
|
|
246
|
+
this._callback(level, consoleMessage);
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
if (!skipSendToRemote) {
|
|
250
|
+
this._sendToRemoteLogger(level, { date, message, category, ...extra });
|
|
251
|
+
}
|
|
233
252
|
}
|
|
234
253
|
|
|
235
254
|
logRequest(url , options , response , start ) {
|
|
@@ -374,7 +393,11 @@ class IssueReporter {
|
|
|
374
393
|
},
|
|
375
394
|
// $FlowFixMe
|
|
376
395
|
body,
|
|
377
|
-
}).catch(() => {
|
|
396
|
+
}).catch((e ) => {
|
|
397
|
+
// $FlowFixMe
|
|
398
|
+
e.skipSendToRemote = true;
|
|
399
|
+
this.log('error', this._makeCategory('grafana'), 'Sending log to grafana, error', e);
|
|
400
|
+
|
|
378
401
|
setTimeout(() => {
|
|
379
402
|
if (isArray) {
|
|
380
403
|
payload = payload.map(message => {
|
|
@@ -386,7 +409,7 @@ class IssueReporter {
|
|
|
386
409
|
payload._retry = retry + 1;
|
|
387
410
|
}
|
|
388
411
|
|
|
389
|
-
this._sendDebugToGrafana(
|
|
412
|
+
this._sendDebugToGrafana(payload, retry + 1);
|
|
390
413
|
}, 5000 + retry * 1000);
|
|
391
414
|
});
|
|
392
415
|
}
|
|
@@ -673,5 +696,5 @@ class ApiRequester {
|
|
|
673
696
|
}
|
|
674
697
|
}
|
|
675
698
|
|
|
676
|
-
exports
|
|
699
|
+
exports.default = ApiRequester;
|
|
677
700
|
exports.realFetch = realFetch;
|
package/lib/utils/sdp.js
CHANGED
|
@@ -15,7 +15,7 @@ const getCandidates = (rawSdp ) => {
|
|
|
15
15
|
return [];
|
|
16
16
|
}
|
|
17
17
|
|
|
18
|
-
const sdp = sdpParser__default[
|
|
18
|
+
const sdp = sdpParser__default['default'].parse(rawSdp);
|
|
19
19
|
if (!sdp || !sdp.media) {
|
|
20
20
|
return [];
|
|
21
21
|
}
|
|
@@ -27,7 +27,7 @@ const parseCandidate = (candidate ) => {
|
|
|
27
27
|
if (!candidate) {
|
|
28
28
|
return null;
|
|
29
29
|
}
|
|
30
|
-
const result = sdpParser__default[
|
|
30
|
+
const result = sdpParser__default['default'].parse(candidate.indexOf('a=') === 0 ? candidate : `a=${candidate}`);
|
|
31
31
|
|
|
32
32
|
return result.candidates ? result.candidates[0] : null;
|
|
33
33
|
};
|
|
@@ -47,28 +47,28 @@ const isSdpValid = (sdp ) => {
|
|
|
47
47
|
};
|
|
48
48
|
|
|
49
49
|
const fixBundle = (sdp ) => {
|
|
50
|
-
const parsedSdp = sdpParser__default[
|
|
50
|
+
const parsedSdp = sdpParser__default['default'].parse(sdp);
|
|
51
51
|
const bundleIndex = parsedSdp.groups.findIndex(group => group.type === 'BUNDLE');
|
|
52
52
|
if (bundleIndex !== -1) {
|
|
53
53
|
parsedSdp.groups[bundleIndex].mids = parsedSdp.media
|
|
54
54
|
.map((media, index) => ('mid' in media ? media.mid : index)).join(' ');
|
|
55
55
|
}
|
|
56
56
|
|
|
57
|
-
return sdpParser__default[
|
|
57
|
+
return sdpParser__default['default'].write(parsedSdp);
|
|
58
58
|
};
|
|
59
59
|
|
|
60
60
|
const toggleVideoDirection = (sdp , direction ) => {
|
|
61
|
-
const parsedSdp = sdpParser__default[
|
|
61
|
+
const parsedSdp = sdpParser__default['default'].parse(sdp);
|
|
62
62
|
parsedSdp.media = parsedSdp.media.map(media => ({
|
|
63
63
|
...media,
|
|
64
64
|
...(media.type === 'video' ? { direction } : {}),
|
|
65
65
|
}));
|
|
66
66
|
|
|
67
|
-
return sdpParser__default[
|
|
67
|
+
return sdpParser__default['default'].write(parsedSdp);
|
|
68
68
|
};
|
|
69
69
|
|
|
70
70
|
const getVideoDirection = (sdp ) => {
|
|
71
|
-
const parsedSdp = sdpParser__default[
|
|
71
|
+
const parsedSdp = sdpParser__default['default'].parse(sdp);
|
|
72
72
|
const videoMedia = parsedSdp.media.find(media => media.type === 'video');
|
|
73
73
|
if (!videoMedia) {
|
|
74
74
|
return null;
|
|
@@ -96,14 +96,14 @@ const hasAnActiveVideo = (sdp ) => {
|
|
|
96
96
|
return false;
|
|
97
97
|
}
|
|
98
98
|
|
|
99
|
-
const parsedSdp = sdpParser__default[
|
|
99
|
+
const parsedSdp = sdpParser__default['default'].parse(sdp);
|
|
100
100
|
|
|
101
101
|
return !!parsedSdp.media.find(media =>
|
|
102
102
|
media.type === 'video' && media.port > 10 && (!media.direction || media.direction !== 'inactive'));
|
|
103
103
|
};
|
|
104
104
|
|
|
105
105
|
const fixSdp = (sdp , candidates , forcePort = true) => {
|
|
106
|
-
const parsedSdp = sdpParser__default[
|
|
106
|
+
const parsedSdp = sdpParser__default['default'].parse(sdp);
|
|
107
107
|
const mainCandidate = getSrflxOrRelay(candidates)[0];
|
|
108
108
|
const ip = mainCandidate ? mainCandidate.ip : null;
|
|
109
109
|
|
|
@@ -121,7 +121,7 @@ const fixSdp = (sdp , candidates , forcePort = true)
|
|
|
121
121
|
};
|
|
122
122
|
});
|
|
123
123
|
|
|
124
|
-
let fixed = sdpParser__default[
|
|
124
|
+
let fixed = sdpParser__default['default'].write(parsedSdp);
|
|
125
125
|
|
|
126
126
|
if (ip) {
|
|
127
127
|
fixed = fixed.replace(/IN IP4 0.0.0.0/g, `IN IP4 ${ip}`);
|
package/lib/web-rtc-client.js
CHANGED
|
@@ -423,6 +423,7 @@ class IssueReporter {
|
|
|
423
423
|
|
|
424
424
|
|
|
425
425
|
|
|
426
|
+
|
|
426
427
|
|
|
427
428
|
constructor() {
|
|
428
429
|
addLevelsTo(this);
|
|
@@ -434,12 +435,17 @@ class IssueReporter {
|
|
|
434
435
|
this.bufferTimeout = null;
|
|
435
436
|
this._boundProcessBuffer = this._processBuffer.bind(this);
|
|
436
437
|
this._boundParseLoggerBody = this._parseLoggerBody.bind(this);
|
|
438
|
+
this._callback = null;
|
|
437
439
|
}
|
|
438
440
|
|
|
439
441
|
init() {
|
|
440
442
|
this._catchConsole();
|
|
441
443
|
}
|
|
442
444
|
|
|
445
|
+
setCallback(cb ) {
|
|
446
|
+
this._callback = cb;
|
|
447
|
+
}
|
|
448
|
+
|
|
443
449
|
configureRemoteClient(configuration = { tag: 'wazo-sdk', host: null, port: null, level: null, extra: {} }) {
|
|
444
450
|
this.remoteClientConfiguration = configuration;
|
|
445
451
|
}
|
|
@@ -475,6 +481,7 @@ class IssueReporter {
|
|
|
475
481
|
|
|
476
482
|
// Handle category label
|
|
477
483
|
let category = null;
|
|
484
|
+
let skipSendToRemote = false;
|
|
478
485
|
let extra = {};
|
|
479
486
|
if (args[0].indexOf(CATEGORY_PREFIX) === 0) {
|
|
480
487
|
category = args[0].split('=')[1];
|
|
@@ -490,6 +497,7 @@ class IssueReporter {
|
|
|
490
497
|
errorMessage: lastArg.message,
|
|
491
498
|
errorStack: lastArg.stack,
|
|
492
499
|
errorType: lastArg.constructor.name,
|
|
500
|
+
skipSendToRemote: lastArg.skipSendToRemote,
|
|
493
501
|
};
|
|
494
502
|
} else {
|
|
495
503
|
extra = lastArg;
|
|
@@ -498,7 +506,12 @@ class IssueReporter {
|
|
|
498
506
|
args.splice(1, 1);
|
|
499
507
|
}
|
|
500
508
|
|
|
501
|
-
|
|
509
|
+
if (extra.skipSendToRemote) {
|
|
510
|
+
skipSendToRemote = true;
|
|
511
|
+
delete extra.skipSendToRemote;
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
const date = moment__default['default']().format('YYYY-MM-DD HH:mm:ss.SSS');
|
|
502
515
|
const message = args.join(', ');
|
|
503
516
|
let consoleMessage = message;
|
|
504
517
|
|
|
@@ -518,7 +531,13 @@ class IssueReporter {
|
|
|
518
531
|
const oldMethod = this.oldConsoleMethods[consoleLevel] || this.oldConsoleMethods.log;
|
|
519
532
|
oldMethod.apply(oldMethod, [date, consoleMessage]);
|
|
520
533
|
|
|
521
|
-
this.
|
|
534
|
+
if (this._callback) {
|
|
535
|
+
this._callback(level, consoleMessage);
|
|
536
|
+
}
|
|
537
|
+
|
|
538
|
+
if (!skipSendToRemote) {
|
|
539
|
+
this._sendToRemoteLogger(level, { date, message, category, ...extra });
|
|
540
|
+
}
|
|
522
541
|
}
|
|
523
542
|
|
|
524
543
|
logRequest(url , options , response , start ) {
|
|
@@ -663,7 +682,11 @@ class IssueReporter {
|
|
|
663
682
|
},
|
|
664
683
|
// $FlowFixMe
|
|
665
684
|
body,
|
|
666
|
-
}).catch(() => {
|
|
685
|
+
}).catch((e ) => {
|
|
686
|
+
// $FlowFixMe
|
|
687
|
+
e.skipSendToRemote = true;
|
|
688
|
+
this.log('error', this._makeCategory('grafana'), 'Sending log to grafana, error', e);
|
|
689
|
+
|
|
667
690
|
setTimeout(() => {
|
|
668
691
|
if (isArray) {
|
|
669
692
|
payload = payload.map(message => {
|
|
@@ -675,7 +698,7 @@ class IssueReporter {
|
|
|
675
698
|
payload._retry = retry + 1;
|
|
676
699
|
}
|
|
677
700
|
|
|
678
|
-
this._sendDebugToGrafana(
|
|
701
|
+
this._sendDebugToGrafana(payload, retry + 1);
|
|
679
702
|
}, 5000 + retry * 1000);
|
|
680
703
|
});
|
|
681
704
|
}
|
|
@@ -703,7 +726,7 @@ const parseCandidate = (candidate ) => {
|
|
|
703
726
|
if (!candidate) {
|
|
704
727
|
return null;
|
|
705
728
|
}
|
|
706
|
-
const result = sdpParser__default[
|
|
729
|
+
const result = sdpParser__default['default'].parse(candidate.indexOf('a=') === 0 ? candidate : `a=${candidate}`);
|
|
707
730
|
|
|
708
731
|
return result.candidates ? result.candidates[0] : null;
|
|
709
732
|
};
|
|
@@ -717,7 +740,7 @@ const areCandidateValid = (candidates ) =>
|
|
|
717
740
|
.length > 0;
|
|
718
741
|
|
|
719
742
|
const getVideoDirection = (sdp ) => {
|
|
720
|
-
const parsedSdp = sdpParser__default[
|
|
743
|
+
const parsedSdp = sdpParser__default['default'].parse(sdp);
|
|
721
744
|
const videoMedia = parsedSdp.media.find(media => media.type === 'video');
|
|
722
745
|
if (!videoMedia) {
|
|
723
746
|
return null;
|
|
@@ -731,14 +754,14 @@ const hasAnActiveVideo = (sdp ) => {
|
|
|
731
754
|
return false;
|
|
732
755
|
}
|
|
733
756
|
|
|
734
|
-
const parsedSdp = sdpParser__default[
|
|
757
|
+
const parsedSdp = sdpParser__default['default'].parse(sdp);
|
|
735
758
|
|
|
736
759
|
return !!parsedSdp.media.find(media =>
|
|
737
760
|
media.type === 'video' && media.port > 10 && (!media.direction || media.direction !== 'inactive'));
|
|
738
761
|
};
|
|
739
762
|
|
|
740
763
|
const fixSdp = (sdp , candidates , forcePort = true) => {
|
|
741
|
-
const parsedSdp = sdpParser__default[
|
|
764
|
+
const parsedSdp = sdpParser__default['default'].parse(sdp);
|
|
742
765
|
const mainCandidate = getSrflxOrRelay(candidates)[0];
|
|
743
766
|
const ip = mainCandidate ? mainCandidate.ip : null;
|
|
744
767
|
|
|
@@ -756,7 +779,7 @@ const fixSdp = (sdp , candidates , forcePort = true)
|
|
|
756
779
|
};
|
|
757
780
|
});
|
|
758
781
|
|
|
759
|
-
let fixed = sdpParser__default[
|
|
782
|
+
let fixed = sdpParser__default['default'].write(parsedSdp);
|
|
760
783
|
|
|
761
784
|
if (ip) {
|
|
762
785
|
fixed = fixed.replace(/IN IP4 0.0.0.0/g, `IN IP4 ${ip}`);
|
|
@@ -802,7 +825,7 @@ class WazoSessionDescriptionHandler extends sessionDescriptionHandler.SessionDes
|
|
|
802
825
|
) {
|
|
803
826
|
super(logger, mediaStreamFactory, sessionDescriptionHandlerConfiguration);
|
|
804
827
|
|
|
805
|
-
this.eventEmitter = new EventEmitter__default[
|
|
828
|
+
this.eventEmitter = new EventEmitter__default['default']();
|
|
806
829
|
this.isWeb = isWeb;
|
|
807
830
|
this.session = session;
|
|
808
831
|
}
|
|
@@ -1241,7 +1264,7 @@ class Emitter {
|
|
|
1241
1264
|
|
|
1242
1265
|
|
|
1243
1266
|
constructor() {
|
|
1244
|
-
this.eventEmitter = new EventEmitter__default[
|
|
1267
|
+
this.eventEmitter = new EventEmitter__default['default']();
|
|
1245
1268
|
}
|
|
1246
1269
|
|
|
1247
1270
|
on(event , callback ) {
|
|
@@ -3177,7 +3200,8 @@ class ExternalApp {
|
|
|
3177
3200
|
|
|
3178
3201
|
|
|
3179
3202
|
|
|
3180
|
-
|
|
3203
|
+
|
|
3204
|
+
|
|
3181
3205
|
|
|
3182
3206
|
|
|
3183
3207
|
class Meeting {
|
|
@@ -3189,6 +3213,7 @@ class Meeting {
|
|
|
3189
3213
|
|
|
3190
3214
|
|
|
3191
3215
|
|
|
3216
|
+
|
|
3192
3217
|
|
|
3193
3218
|
|
|
3194
3219
|
static parse(plain ) {
|
|
@@ -3200,14 +3225,28 @@ class Meeting {
|
|
|
3200
3225
|
port: plain.port,
|
|
3201
3226
|
uuid: plain.uuid,
|
|
3202
3227
|
number: plain.number,
|
|
3228
|
+
persistent: plain.persistent,
|
|
3203
3229
|
});
|
|
3204
3230
|
}
|
|
3205
3231
|
|
|
3232
|
+
static parseMany(items ) {
|
|
3233
|
+
return items.map(plain => Meeting.parse(plain));
|
|
3234
|
+
}
|
|
3235
|
+
|
|
3206
3236
|
static newFrom(meeting ) {
|
|
3207
3237
|
return newFrom(meeting, Meeting);
|
|
3208
3238
|
}
|
|
3209
3239
|
|
|
3210
|
-
constructor({
|
|
3240
|
+
constructor({
|
|
3241
|
+
uuid,
|
|
3242
|
+
name,
|
|
3243
|
+
guestSipAuthorization,
|
|
3244
|
+
ownerUuids,
|
|
3245
|
+
port,
|
|
3246
|
+
uri,
|
|
3247
|
+
number,
|
|
3248
|
+
persistent,
|
|
3249
|
+
} = {}) {
|
|
3211
3250
|
this.guestSipAuthorization = guestSipAuthorization;
|
|
3212
3251
|
this.uri = uri;
|
|
3213
3252
|
this.name = name;
|
|
@@ -3215,6 +3254,7 @@ class Meeting {
|
|
|
3215
3254
|
this.port = port;
|
|
3216
3255
|
this.uuid = uuid;
|
|
3217
3256
|
this.number = number;
|
|
3257
|
+
this.persistent = persistent;
|
|
3218
3258
|
|
|
3219
3259
|
// Useful to compare instead of instanceof with minified code
|
|
3220
3260
|
this.type = 'Meeting';
|
|
@@ -3292,8 +3332,11 @@ var confdMethods = (client , baseUrl ) => ({
|
|
|
3292
3332
|
}
|
|
3293
3333
|
},
|
|
3294
3334
|
|
|
3295
|
-
|
|
3296
|
-
client.
|
|
3335
|
+
getMyMeetings: () =>
|
|
3336
|
+
client.get(`${baseUrl}/users/me/meetings`).then(response => Meeting.parseMany(response.items)),
|
|
3337
|
+
|
|
3338
|
+
createMyMeeting: (name , persistent ) =>
|
|
3339
|
+
client.post(`${baseUrl}/users/me/meetings`, { name, persistent }).then(Meeting.parse),
|
|
3297
3340
|
|
|
3298
3341
|
deleteMyMeeting: (meetingUuid ) =>
|
|
3299
3342
|
client.delete(`${baseUrl}/users/me/meetings/${meetingUuid}`, null),
|
|
@@ -3395,7 +3438,7 @@ class ChatMessage {
|
|
|
3395
3438
|
static parse(plain ) {
|
|
3396
3439
|
return new ChatMessage({
|
|
3397
3440
|
uuid: plain.uuid,
|
|
3398
|
-
date: moment__default[
|
|
3441
|
+
date: moment__default['default'](plain.created_at).toDate(),
|
|
3399
3442
|
content: plain.content,
|
|
3400
3443
|
alias: plain.alias,
|
|
3401
3444
|
userUuid: plain.user_uuid,
|
|
@@ -3487,7 +3530,7 @@ class Voicemail {
|
|
|
3487
3530
|
static parse(plain ) {
|
|
3488
3531
|
return new Voicemail({
|
|
3489
3532
|
id: plain.id,
|
|
3490
|
-
date: moment__default[
|
|
3533
|
+
date: moment__default['default'](plain.timestamp * 1000).toDate(),
|
|
3491
3534
|
duration: plain.duration * 1000,
|
|
3492
3535
|
caller: {
|
|
3493
3536
|
name: plain.caller_id_name,
|
|
@@ -3624,7 +3667,7 @@ class Call {
|
|
|
3624
3667
|
onHold: plain.on_hold,
|
|
3625
3668
|
status: plain.status,
|
|
3626
3669
|
lineId: plain.line_id,
|
|
3627
|
-
startingTime: moment__default[
|
|
3670
|
+
startingTime: moment__default['default'](plain.creation_time).toDate(),
|
|
3628
3671
|
talkingToIds: Object.keys(plain.talking_to || {}),
|
|
3629
3672
|
recording: plain.record_state === RECORD_STATE_ACTIVE,
|
|
3630
3673
|
});
|
|
@@ -3778,7 +3821,7 @@ class Recording {
|
|
|
3778
3821
|
|
|
3779
3822
|
|
|
3780
3823
|
|
|
3781
|
-
static parseMany(recordings
|
|
3824
|
+
static parseMany(recordings = []) {
|
|
3782
3825
|
return recordings.map(item => Recording.parse(item));
|
|
3783
3826
|
}
|
|
3784
3827
|
|
|
@@ -3786,8 +3829,8 @@ class Recording {
|
|
|
3786
3829
|
return new Recording({
|
|
3787
3830
|
deleted: plain.deleted,
|
|
3788
3831
|
fileName: plain.filename,
|
|
3789
|
-
end: plain.end_time ? moment__default[
|
|
3790
|
-
start: moment__default[
|
|
3832
|
+
end: plain.end_time ? moment__default['default'](plain.end_time).toDate() : null,
|
|
3833
|
+
start: moment__default['default'](plain.start_time).toDate(),
|
|
3791
3834
|
uuid: plain.uuid,
|
|
3792
3835
|
});
|
|
3793
3836
|
}
|
|
@@ -3885,7 +3928,7 @@ class CallLog {
|
|
|
3885
3928
|
|
|
3886
3929
|
static parse(plain ) {
|
|
3887
3930
|
return new CallLog({
|
|
3888
|
-
answer: plain.answer ? moment__default[
|
|
3931
|
+
answer: plain.answer ? moment__default['default'](plain.answer).toDate() : null,
|
|
3889
3932
|
answered: plain.answered,
|
|
3890
3933
|
callDirection: plain.call_direction,
|
|
3891
3934
|
destination: {
|
|
@@ -3902,9 +3945,9 @@ class CallLog {
|
|
|
3902
3945
|
},
|
|
3903
3946
|
id: plain.id,
|
|
3904
3947
|
duration: (plain.duration || 0) * 1000, // duration is in seconds
|
|
3905
|
-
start: moment__default[
|
|
3906
|
-
end: plain.end ? moment__default[
|
|
3907
|
-
recordings: Recording.parseMany(plain.recordings),
|
|
3948
|
+
start: moment__default['default'](plain.start).toDate(),
|
|
3949
|
+
end: plain.end ? moment__default['default'](plain.end).toDate() : null,
|
|
3950
|
+
recordings: Recording.parseMany(plain.recordings || []),
|
|
3908
3951
|
});
|
|
3909
3952
|
}
|
|
3910
3953
|
|
|
@@ -5708,7 +5751,9 @@ class WebRTCClient extends Emitter {
|
|
|
5708
5751
|
const inviteOptions = {
|
|
5709
5752
|
requestDelegate: {
|
|
5710
5753
|
onAccept: (response ) => {
|
|
5711
|
-
session.sessionDescriptionHandler.peerConnection
|
|
5754
|
+
if (session.sessionDescriptionHandler.peerConnection) {
|
|
5755
|
+
session.sessionDescriptionHandler.peerConnection.sfu = conference;
|
|
5756
|
+
}
|
|
5712
5757
|
this._onAccepted(session, response.session, true);
|
|
5713
5758
|
},
|
|
5714
5759
|
onReject: (response ) => {
|
|
@@ -6044,7 +6089,7 @@ class WebRTCClient extends Emitter {
|
|
|
6044
6089
|
// We search for the last transceiver without `video-` in the mid (video- means remote transceiver)
|
|
6045
6090
|
const transceivers = pc.getTransceivers();
|
|
6046
6091
|
const transceiverIdx = lastIndexOf(transceivers, transceiver =>
|
|
6047
|
-
transceiver.sender.track === null && transceiver.mid.indexOf('video') === -1);
|
|
6092
|
+
transceiver.sender.track === null && transceiver.mid && transceiver.mid.indexOf('video') === -1);
|
|
6048
6093
|
|
|
6049
6094
|
videoSender = transceiverIdx !== -1 ? transceivers[transceiverIdx].sender : null;
|
|
6050
6095
|
} else {
|
|
@@ -6580,6 +6625,16 @@ class WebRTCClient extends Emitter {
|
|
|
6580
6625
|
return this.hasRemoteVideo(sessionId) ? this.getRemoteStream(sessionId) : null;
|
|
6581
6626
|
}
|
|
6582
6627
|
|
|
6628
|
+
// Useful in a react-native environment when remoteMediaStream is not updated
|
|
6629
|
+
getRemoteVideoStreamFromPc(sessionId ) {
|
|
6630
|
+
const pc = this.getPeerConnection(sessionId);
|
|
6631
|
+
if (!pc) {
|
|
6632
|
+
return null;
|
|
6633
|
+
}
|
|
6634
|
+
|
|
6635
|
+
return pc.getRemoteStreams().find(stream => !!stream.getVideoTracks().length);
|
|
6636
|
+
}
|
|
6637
|
+
|
|
6583
6638
|
hasVideo(sessionId ) {
|
|
6584
6639
|
return this.hasLocalVideo(sessionId) || this.hasRemoteVideo(sessionId);
|
|
6585
6640
|
}
|
|
@@ -7090,6 +7145,7 @@ class WebRTCClient extends Emitter {
|
|
|
7090
7145
|
session.sessionDescriptionHandler.remoteMediaStream.onaddtrack = onTrack;
|
|
7091
7146
|
|
|
7092
7147
|
pc.oniceconnectionstatechange = () => {
|
|
7148
|
+
logger.info('on ice connection state changed', { state: pc.iceConnectionState });
|
|
7093
7149
|
if (pc.iceConnectionState === 'disconnected') {
|
|
7094
7150
|
this.eventEmitter.emit(ON_DISCONNECTED);
|
|
7095
7151
|
}
|
|
@@ -7249,7 +7305,7 @@ class WebRTCClient extends Emitter {
|
|
|
7249
7305
|
}
|
|
7250
7306
|
const sessionId = this.getSipSessionId(session);
|
|
7251
7307
|
|
|
7252
|
-
getStats__default[
|
|
7308
|
+
getStats__default['default'](pc, (result ) => {
|
|
7253
7309
|
const { results, internal, nomore, ...stats } = result;
|
|
7254
7310
|
this.statsIntervals[sessionId] = nomore;
|
|
7255
7311
|
|
|
@@ -7358,18 +7414,22 @@ class WebRTCClient extends Emitter {
|
|
|
7358
7414
|
});
|
|
7359
7415
|
|
|
7360
7416
|
networkStats.packetsLost = packetsLost;
|
|
7361
|
-
networkStats.
|
|
7417
|
+
networkStats.totalAudioBytesSent = audioBytesSent;
|
|
7418
|
+
networkStats.audioBytesSent = audioBytesSent - lastAudioSent;
|
|
7419
|
+
networkStats.totalAudioBytesReceived = audioBytesReceived - lastAudioReceived;
|
|
7362
7420
|
networkStats.audioBytesReceived = audioBytesReceived;
|
|
7363
|
-
networkStats.
|
|
7364
|
-
networkStats.
|
|
7421
|
+
networkStats.totalVideoBytesSent = videoBytesSent;
|
|
7422
|
+
networkStats.videoBytesSent = videoBytesSent - lastVideoSent;
|
|
7423
|
+
networkStats.totalVideoBytesReceived = videoBytesReceived;
|
|
7424
|
+
networkStats.videoBytesReceived = videoBytesReceived - lastVideoReceived;
|
|
7425
|
+
networkStats.totalTransportSent = transportSent - lastTransportSent;
|
|
7365
7426
|
networkStats.transportSent = transportSent;
|
|
7366
|
-
networkStats.
|
|
7367
|
-
|
|
7368
|
-
const bandwidth = (networkStats.audioBytesSent - lastAudioSent) + (networkStats.videoBytesSent - lastVideoSent)
|
|
7369
|
-
+ (networkStats.audioBytesReceived - lastAudioReceived) + (networkStats.videoBytesReceived - lastVideoReceived)
|
|
7370
|
-
+ (networkStats.transportReceived - lastTransportReceived) + (networkStats.transportSent - lastTransportSent);
|
|
7427
|
+
networkStats.totalTransportReceived = transportReceived;
|
|
7428
|
+
networkStats.transportReceived = transportReceived - lastTransportReceived;
|
|
7371
7429
|
|
|
7372
|
-
networkStats.bandwidth =
|
|
7430
|
+
networkStats.bandwidth = networkStats.audioBytesSent + networkStats.audioBytesReceived
|
|
7431
|
+
+ networkStats.videoBytesSent + networkStats.videoBytesReceived + networkStats.transportReceived
|
|
7432
|
+
+ networkStats.transportSent;
|
|
7373
7433
|
|
|
7374
7434
|
this.eventEmitter.emit(ON_NETWORK_STATS, session, networkStats, this.sessionNetworkStats[sessionId]);
|
|
7375
7435
|
this.sessionNetworkStats[sessionId].push(networkStats);
|
|
@@ -7378,7 +7438,7 @@ class WebRTCClient extends Emitter {
|
|
|
7378
7438
|
}
|
|
7379
7439
|
|
|
7380
7440
|
exports.CanceledCallError = CanceledCallError;
|
|
7381
|
-
exports
|
|
7441
|
+
exports.default = WebRTCClient;
|
|
7382
7442
|
exports.events = events;
|
|
7383
7443
|
exports.replaceLocalIpModifier = replaceLocalIpModifier;
|
|
7384
7444
|
exports.transportEvents = transportEvents;
|
package/lib/websocket-client.js
CHANGED
|
@@ -19,7 +19,7 @@ class Emitter {
|
|
|
19
19
|
|
|
20
20
|
|
|
21
21
|
constructor() {
|
|
22
|
-
this.eventEmitter = new EventEmitter__default[
|
|
22
|
+
this.eventEmitter = new EventEmitter__default['default']();
|
|
23
23
|
}
|
|
24
24
|
|
|
25
25
|
on(event , callback ) {
|
|
@@ -131,6 +131,7 @@ class IssueReporter {
|
|
|
131
131
|
|
|
132
132
|
|
|
133
133
|
|
|
134
|
+
|
|
134
135
|
|
|
135
136
|
constructor() {
|
|
136
137
|
addLevelsTo(this);
|
|
@@ -142,12 +143,17 @@ class IssueReporter {
|
|
|
142
143
|
this.bufferTimeout = null;
|
|
143
144
|
this._boundProcessBuffer = this._processBuffer.bind(this);
|
|
144
145
|
this._boundParseLoggerBody = this._parseLoggerBody.bind(this);
|
|
146
|
+
this._callback = null;
|
|
145
147
|
}
|
|
146
148
|
|
|
147
149
|
init() {
|
|
148
150
|
this._catchConsole();
|
|
149
151
|
}
|
|
150
152
|
|
|
153
|
+
setCallback(cb ) {
|
|
154
|
+
this._callback = cb;
|
|
155
|
+
}
|
|
156
|
+
|
|
151
157
|
configureRemoteClient(configuration = { tag: 'wazo-sdk', host: null, port: null, level: null, extra: {} }) {
|
|
152
158
|
this.remoteClientConfiguration = configuration;
|
|
153
159
|
}
|
|
@@ -183,6 +189,7 @@ class IssueReporter {
|
|
|
183
189
|
|
|
184
190
|
// Handle category label
|
|
185
191
|
let category = null;
|
|
192
|
+
let skipSendToRemote = false;
|
|
186
193
|
let extra = {};
|
|
187
194
|
if (args[0].indexOf(CATEGORY_PREFIX) === 0) {
|
|
188
195
|
category = args[0].split('=')[1];
|
|
@@ -198,6 +205,7 @@ class IssueReporter {
|
|
|
198
205
|
errorMessage: lastArg.message,
|
|
199
206
|
errorStack: lastArg.stack,
|
|
200
207
|
errorType: lastArg.constructor.name,
|
|
208
|
+
skipSendToRemote: lastArg.skipSendToRemote,
|
|
201
209
|
};
|
|
202
210
|
} else {
|
|
203
211
|
extra = lastArg;
|
|
@@ -206,7 +214,12 @@ class IssueReporter {
|
|
|
206
214
|
args.splice(1, 1);
|
|
207
215
|
}
|
|
208
216
|
|
|
209
|
-
|
|
217
|
+
if (extra.skipSendToRemote) {
|
|
218
|
+
skipSendToRemote = true;
|
|
219
|
+
delete extra.skipSendToRemote;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
const date = moment__default['default']().format('YYYY-MM-DD HH:mm:ss.SSS');
|
|
210
223
|
const message = args.join(', ');
|
|
211
224
|
let consoleMessage = message;
|
|
212
225
|
|
|
@@ -226,7 +239,13 @@ class IssueReporter {
|
|
|
226
239
|
const oldMethod = this.oldConsoleMethods[consoleLevel] || this.oldConsoleMethods.log;
|
|
227
240
|
oldMethod.apply(oldMethod, [date, consoleMessage]);
|
|
228
241
|
|
|
229
|
-
this.
|
|
242
|
+
if (this._callback) {
|
|
243
|
+
this._callback(level, consoleMessage);
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
if (!skipSendToRemote) {
|
|
247
|
+
this._sendToRemoteLogger(level, { date, message, category, ...extra });
|
|
248
|
+
}
|
|
230
249
|
}
|
|
231
250
|
|
|
232
251
|
logRequest(url , options , response , start ) {
|
|
@@ -371,7 +390,11 @@ class IssueReporter {
|
|
|
371
390
|
},
|
|
372
391
|
// $FlowFixMe
|
|
373
392
|
body,
|
|
374
|
-
}).catch(() => {
|
|
393
|
+
}).catch((e ) => {
|
|
394
|
+
// $FlowFixMe
|
|
395
|
+
e.skipSendToRemote = true;
|
|
396
|
+
this.log('error', this._makeCategory('grafana'), 'Sending log to grafana, error', e);
|
|
397
|
+
|
|
375
398
|
setTimeout(() => {
|
|
376
399
|
if (isArray) {
|
|
377
400
|
payload = payload.map(message => {
|
|
@@ -383,7 +406,7 @@ class IssueReporter {
|
|
|
383
406
|
payload._retry = retry + 1;
|
|
384
407
|
}
|
|
385
408
|
|
|
386
|
-
this._sendDebugToGrafana(
|
|
409
|
+
this._sendDebugToGrafana(payload, retry + 1);
|
|
387
410
|
}, 5000 + retry * 1000);
|
|
388
411
|
});
|
|
389
412
|
}
|
|
@@ -588,6 +611,7 @@ const AGENT_PAUSED = 'agent_paused';
|
|
|
588
611
|
const AGENT_UNPAUSED = 'agent_unpaused';
|
|
589
612
|
const CONFERENCE_ADHOC_PARTICIPANT_LEFT = 'conference_adhoc_participant_left';
|
|
590
613
|
const CONFERENCE_ADHOC_DELETED = 'conference_adhoc_deleted';
|
|
614
|
+
const MEETING_USER_PROGRESS = 'meeting_user_progress';
|
|
591
615
|
|
|
592
616
|
const BLACKLIST_EVENTS = [
|
|
593
617
|
CHAT_MESSAGE_SENT,
|
|
@@ -647,7 +671,7 @@ class WebSocketClient extends Emitter {
|
|
|
647
671
|
|
|
648
672
|
connect() {
|
|
649
673
|
logger.info('connect method started', { host: this.host, token: this.token });
|
|
650
|
-
this.socket = new ReconnectingWebSocket__default[
|
|
674
|
+
this.socket = new ReconnectingWebSocket__default['default'](this._getUrl.bind(this), [], this.options);
|
|
651
675
|
if (this.options.binaryType) {
|
|
652
676
|
this.socket.binaryType = this.options.binaryType;
|
|
653
677
|
}
|
|
@@ -938,6 +962,7 @@ WebSocketClient.eventLists = [
|
|
|
938
962
|
AGENT_UNPAUSED,
|
|
939
963
|
CONFERENCE_ADHOC_PARTICIPANT_LEFT,
|
|
940
964
|
CONFERENCE_ADHOC_DELETED,
|
|
965
|
+
MEETING_USER_PROGRESS,
|
|
941
966
|
];
|
|
942
967
|
|
|
943
968
|
exports.AGENT_PAUSED = AGENT_PAUSED;
|
|
@@ -993,6 +1018,7 @@ exports.HEARTBEAT_ENGINE_VERSION = HEARTBEAT_ENGINE_VERSION;
|
|
|
993
1018
|
exports.LINE_STATUS_UPDATED = LINE_STATUS_UPDATED;
|
|
994
1019
|
exports.MEETING_USER_PARTICIPANT_JOINED = MEETING_USER_PARTICIPANT_JOINED;
|
|
995
1020
|
exports.MEETING_USER_PARTICIPANT_LEFT = MEETING_USER_PARTICIPANT_LEFT;
|
|
1021
|
+
exports.MEETING_USER_PROGRESS = MEETING_USER_PROGRESS;
|
|
996
1022
|
exports.SOCKET_EVENTS = SOCKET_EVENTS;
|
|
997
1023
|
exports.SWITCHBOARD_HELD_CALLS_UPDATED = SWITCHBOARD_HELD_CALLS_UPDATED;
|
|
998
1024
|
exports.SWITCHBOARD_HELD_CALL_ANSWERED = SWITCHBOARD_HELD_CALL_ANSWERED;
|
|
@@ -1007,4 +1033,4 @@ exports.USER_STATUS_UPDATE = USER_STATUS_UPDATE;
|
|
|
1007
1033
|
exports.USER_VOICEMAIL_MESSAGE_CREATED = USER_VOICEMAIL_MESSAGE_CREATED;
|
|
1008
1034
|
exports.USER_VOICEMAIL_MESSAGE_DELETED = USER_VOICEMAIL_MESSAGE_DELETED;
|
|
1009
1035
|
exports.USER_VOICEMAIL_MESSAGE_UPDATED = USER_VOICEMAIL_MESSAGE_UPDATED;
|
|
1010
|
-
exports
|
|
1036
|
+
exports.default = WebSocketClient;
|