@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.
Files changed (163) hide show
  1. package/dist/wazo-sdk.js +13 -5
  2. package/esm/__tests__/api-client.test.js +52 -9
  3. package/esm/__tests__/web-rtc-client.test.js +80 -20
  4. package/esm/api/agentd.js +27 -4
  5. package/esm/api/amid.js +27 -4
  6. package/esm/api/application.js +27 -4
  7. package/esm/api/auth.js +29 -5
  8. package/esm/api/call-logd.js +29 -6
  9. package/esm/api/calld.js +27 -4
  10. package/esm/api/chatd.js +27 -4
  11. package/esm/api/confd.js +51 -8
  12. package/esm/api/ctid-ng.js +27 -4
  13. package/esm/api/dird.js +27 -4
  14. package/esm/api/webhookd.js +27 -4
  15. package/esm/api-client.js +54 -11
  16. package/esm/checker/Checker.js +83 -21
  17. package/esm/checker/checks/aor.js +54 -11
  18. package/esm/checker/checks/api.js +54 -11
  19. package/esm/checker/checks/ice-ipv4.js +1 -1
  20. package/esm/checker/checks/index.js +84 -22
  21. package/esm/checker/checks/symmetric-nat.js +1 -1
  22. package/esm/checker/checks/wazo-websocket.js +29 -4
  23. package/esm/checker/checks/webrtc-transport.js +82 -22
  24. package/esm/checker/checks/webrtc.js +82 -22
  25. package/esm/domain/AdHocAPIConference.js +54 -11
  26. package/esm/domain/Agent.js +1 -1
  27. package/esm/domain/BadResponse.js +1 -1
  28. package/esm/domain/Call.js +1 -1
  29. package/esm/domain/CallLog.js +3 -3
  30. package/esm/domain/CallSession.js +1 -1
  31. package/esm/domain/ChatMessage.js +1 -1
  32. package/esm/domain/ChatRoom.js +1 -1
  33. package/esm/domain/Contact.js +2 -1
  34. package/esm/domain/Country.js +1 -1
  35. package/esm/domain/Device/DebugDevice.js +1 -1
  36. package/esm/domain/ExternalApp.js +1 -1
  37. package/esm/domain/Features.js +54 -10
  38. package/esm/domain/ForwardOption.js +2 -1
  39. package/esm/domain/IndirectTransfer.js +1 -1
  40. package/esm/domain/Line.js +1 -1
  41. package/esm/domain/Meeting.js +20 -3
  42. package/esm/domain/NotificationOptions.js +1 -1
  43. package/esm/domain/Phone/CTIPhone.js +55 -11
  44. package/esm/domain/Phone/WebRTCPhone.js +39 -6
  45. package/esm/domain/Profile.js +2 -1
  46. package/esm/domain/Recording.js +2 -2
  47. package/esm/domain/Relocation.js +1 -1
  48. package/esm/domain/Room.js +1 -1
  49. package/esm/domain/ServerError.js +1 -1
  50. package/esm/domain/Session.js +2 -2
  51. package/esm/domain/SipLine.js +1 -1
  52. package/esm/domain/Subscription.js +1 -1
  53. package/esm/domain/SwitchboardCall.js +1 -1
  54. package/esm/domain/Voicemail.js +1 -1
  55. package/esm/domain/__tests__/CallLog.test.js +2 -2
  56. package/esm/index.js +101 -24
  57. package/esm/lib/WazoSessionDescriptionHandler.js +28 -4
  58. package/esm/service/CallApi.js +54 -11
  59. package/esm/service/IssueReporter.js +27 -4
  60. package/esm/service/__tests__/IssueReporter.test.js +26 -3
  61. package/esm/service/getApiClient.js +55 -11
  62. package/esm/simple/Auth.js +101 -23
  63. package/esm/simple/Configuration.js +100 -23
  64. package/esm/simple/Directory.js +53 -10
  65. package/esm/simple/Phone.js +100 -23
  66. package/esm/simple/Websocket.js +30 -4
  67. package/esm/simple/index.js +100 -23
  68. package/esm/simple/room/LocalParticipant.js +113 -40
  69. package/esm/simple/room/Participant.js +112 -37
  70. package/esm/simple/room/RemoteParticipant.js +114 -41
  71. package/esm/simple/room/Room.js +113 -37
  72. package/esm/simple/room/SipRoom.js +101 -26
  73. package/esm/simple/room/Stream.js +101 -26
  74. package/esm/simple/room/__tests__/RemoteParticipant.test.js +99 -22
  75. package/esm/simple/utils.js +99 -22
  76. package/esm/utils/Emitter.js +1 -1
  77. package/esm/utils/Heartbeat.js +1 -1
  78. package/esm/utils/__tests__/api-requester.test.js +26 -3
  79. package/esm/utils/api-requester.js +28 -4
  80. package/esm/utils/compare-version.js +1 -1
  81. package/esm/utils/isMobile.js +1 -1
  82. package/esm/utils/new-from.js +1 -1
  83. package/esm/utils/once.js +1 -1
  84. package/esm/utils/update-from.js +1 -1
  85. package/esm/web-rtc-client.js +83 -22
  86. package/esm/websocket-client.js +30 -4
  87. package/lib/__tests__/api-client.test.js +61 -18
  88. package/lib/__tests__/web-rtc-client.test.js +97 -37
  89. package/lib/api/agentd.js +27 -4
  90. package/lib/api/amid.js +27 -4
  91. package/lib/api/application.js +27 -4
  92. package/lib/api/auth.js +28 -5
  93. package/lib/api/call-logd.js +34 -11
  94. package/lib/api/calld.js +30 -7
  95. package/lib/api/chatd.js +28 -5
  96. package/lib/api/confd.js +51 -8
  97. package/lib/api/ctid-ng.js +30 -7
  98. package/lib/api/dird.js +27 -4
  99. package/lib/api/webhookd.js +27 -4
  100. package/lib/api-client.js +61 -18
  101. package/lib/checker/Checker.js +100 -38
  102. package/lib/checker/checks/aor.js +61 -18
  103. package/lib/checker/checks/api.js +61 -18
  104. package/lib/checker/checks/index.js +100 -38
  105. package/lib/checker/checks/wazo-websocket.js +31 -6
  106. package/lib/checker/checks/webrtc-transport.js +97 -37
  107. package/lib/checker/checks/webrtc.js +97 -37
  108. package/lib/domain/AdHocAPIConference.js +61 -18
  109. package/lib/domain/Call.js +1 -1
  110. package/lib/domain/CallLog.js +7 -7
  111. package/lib/domain/ChatMessage.js +1 -1
  112. package/lib/domain/Contact.js +1 -1
  113. package/lib/domain/Features.js +62 -19
  114. package/lib/domain/ForwardOption.js +1 -1
  115. package/lib/domain/Meeting.js +19 -2
  116. package/lib/domain/Phone/CTIPhone.js +63 -20
  117. package/lib/domain/Phone/WebRTCPhone.js +40 -8
  118. package/lib/domain/Profile.js +1 -1
  119. package/lib/domain/Recording.js +3 -3
  120. package/lib/domain/Voicemail.js +1 -1
  121. package/lib/domain/__tests__/Call.test.js +1 -1
  122. package/lib/domain/__tests__/CallLog.test.js +13 -13
  123. package/lib/domain/__tests__/Voicemail.test.js +1 -1
  124. package/lib/index.js +120 -43
  125. package/lib/lib/WazoSessionDescriptionHandler.js +32 -9
  126. package/lib/service/CallApi.js +61 -18
  127. package/lib/service/IssueReporter.js +27 -4
  128. package/lib/service/__tests__/IssueReporter.test.js +27 -4
  129. package/lib/service/getApiClient.js +62 -19
  130. package/lib/simple/Auth.js +119 -42
  131. package/lib/simple/Configuration.js +118 -41
  132. package/lib/simple/Directory.js +61 -18
  133. package/lib/simple/Phone.js +118 -41
  134. package/lib/simple/Websocket.js +32 -6
  135. package/lib/simple/index.js +118 -41
  136. package/lib/simple/room/LocalParticipant.js +132 -59
  137. package/lib/simple/room/Participant.js +130 -55
  138. package/lib/simple/room/RemoteParticipant.js +133 -60
  139. package/lib/simple/room/Room.js +131 -56
  140. package/lib/simple/room/SipRoom.js +120 -45
  141. package/lib/simple/room/Stream.js +120 -45
  142. package/lib/simple/room/__tests__/RemoteParticipant.test.js +118 -41
  143. package/lib/simple/utils.js +118 -41
  144. package/lib/utils/Emitter.js +1 -1
  145. package/lib/utils/PhoneNumberUtil.js +2 -2
  146. package/lib/utils/__tests__/PhoneNumberUtil.test.js +2 -2
  147. package/lib/utils/__tests__/api-requester.test.js +27 -4
  148. package/lib/utils/__tests__/sdp.test.js +12 -12
  149. package/lib/utils/api-requester.js +28 -5
  150. package/lib/utils/sdp.js +10 -10
  151. package/lib/web-rtc-client.js +98 -38
  152. package/lib/websocket-client.js +33 -7
  153. package/package.json +2 -2
  154. package/src/api/confd.js +5 -2
  155. package/src/domain/CallLog.js +1 -1
  156. package/src/domain/Meeting.js +19 -2
  157. package/src/domain/Phone/WebRTCPhone.js +11 -2
  158. package/src/domain/Recording.js +1 -1
  159. package/src/service/IssueReporter.js +26 -3
  160. package/src/simple/Phone.js +5 -0
  161. package/src/types/WebSocketMessage.js +5 -1
  162. package/src/web-rtc-client.js +28 -11
  163. 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
- const date = moment__default["default"]().format('YYYY-MM-DD HH:mm:ss.SSS');
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._sendToRemoteLogger(level, { date, message, category, ...extra });
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(body, retry + 1);
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["default"] = ApiRequester;
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["default"].parse(rawSdp);
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["default"].parse(candidate.indexOf('a=') === 0 ? candidate : `a=${candidate}`);
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["default"].parse(sdp);
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["default"].write(parsedSdp);
57
+ return sdpParser__default['default'].write(parsedSdp);
58
58
  };
59
59
 
60
60
  const toggleVideoDirection = (sdp , direction ) => {
61
- const parsedSdp = sdpParser__default["default"].parse(sdp);
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["default"].write(parsedSdp);
67
+ return sdpParser__default['default'].write(parsedSdp);
68
68
  };
69
69
 
70
70
  const getVideoDirection = (sdp ) => {
71
- const parsedSdp = sdpParser__default["default"].parse(sdp);
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["default"].parse(sdp);
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["default"].parse(sdp);
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["default"].write(parsedSdp);
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}`);
@@ -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
- const date = moment__default["default"]().format('YYYY-MM-DD HH:mm:ss.SSS');
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._sendToRemoteLogger(level, { date, message, category, ...extra });
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(body, retry + 1);
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["default"].parse(candidate.indexOf('a=') === 0 ? candidate : `a=${candidate}`);
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["default"].parse(sdp);
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["default"].parse(sdp);
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["default"].parse(sdp);
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["default"].write(parsedSdp);
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["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["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({ uuid, name, guestSipAuthorization, ownerUuids, port, uri, number } = {}) {
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
- createMyMeeting: (name ) =>
3296
- client.post(`${baseUrl}/users/me/meetings`, { name }).then(Meeting.parse),
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["default"](plain.created_at).toDate(),
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["default"](plain.timestamp * 1000).toDate(),
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["default"](plain.creation_time).toDate(),
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["default"](plain.end_time).toDate() : null,
3790
- start: moment__default["default"](plain.start_time).toDate(),
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["default"](plain.answer).toDate() : null,
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["default"](plain.start).toDate(),
3906
- end: plain.end ? moment__default["default"](plain.end).toDate() : null,
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.sfu = conference;
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["default"](pc, (result ) => {
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.audioBytesSent = audioBytesSent;
7417
+ networkStats.totalAudioBytesSent = audioBytesSent;
7418
+ networkStats.audioBytesSent = audioBytesSent - lastAudioSent;
7419
+ networkStats.totalAudioBytesReceived = audioBytesReceived - lastAudioReceived;
7362
7420
  networkStats.audioBytesReceived = audioBytesReceived;
7363
- networkStats.videoBytesSent = videoBytesSent;
7364
- networkStats.videoBytesReceived = videoBytesReceived;
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.transportReceived = transportReceived;
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 = 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["default"] = WebRTCClient;
7441
+ exports.default = WebRTCClient;
7382
7442
  exports.events = events;
7383
7443
  exports.replaceLocalIpModifier = replaceLocalIpModifier;
7384
7444
  exports.transportEvents = transportEvents;
@@ -19,7 +19,7 @@ class Emitter {
19
19
 
20
20
 
21
21
  constructor() {
22
- this.eventEmitter = new EventEmitter__default["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
- const date = moment__default["default"]().format('YYYY-MM-DD HH:mm:ss.SSS');
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._sendToRemoteLogger(level, { date, message, category, ...extra });
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(body, retry + 1);
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["default"](this._getUrl.bind(this), [], this.options);
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["default"] = WebSocketClient;
1036
+ exports.default = WebSocketClient;