@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
@@ -158,6 +158,7 @@ class IssueReporter {
158
158
 
159
159
 
160
160
 
161
+
161
162
 
162
163
  constructor() {
163
164
  addLevelsTo(this);
@@ -169,12 +170,17 @@ class IssueReporter {
169
170
  this.bufferTimeout = null;
170
171
  this._boundProcessBuffer = this._processBuffer.bind(this);
171
172
  this._boundParseLoggerBody = this._parseLoggerBody.bind(this);
173
+ this._callback = null;
172
174
  }
173
175
 
174
176
  init() {
175
177
  this._catchConsole();
176
178
  }
177
179
 
180
+ setCallback(cb ) {
181
+ this._callback = cb;
182
+ }
183
+
178
184
  configureRemoteClient(configuration = { tag: 'wazo-sdk', host: null, port: null, level: null, extra: {} }) {
179
185
  this.remoteClientConfiguration = configuration;
180
186
  }
@@ -210,6 +216,7 @@ class IssueReporter {
210
216
 
211
217
  // Handle category label
212
218
  let category = null;
219
+ let skipSendToRemote = false;
213
220
  let extra = {};
214
221
  if (args[0].indexOf(CATEGORY_PREFIX) === 0) {
215
222
  category = args[0].split('=')[1];
@@ -225,6 +232,7 @@ class IssueReporter {
225
232
  errorMessage: lastArg.message,
226
233
  errorStack: lastArg.stack,
227
234
  errorType: lastArg.constructor.name,
235
+ skipSendToRemote: lastArg.skipSendToRemote,
228
236
  };
229
237
  } else {
230
238
  extra = lastArg;
@@ -233,7 +241,12 @@ class IssueReporter {
233
241
  args.splice(1, 1);
234
242
  }
235
243
 
236
- const date = moment__default["default"]().format('YYYY-MM-DD HH:mm:ss.SSS');
244
+ if (extra.skipSendToRemote) {
245
+ skipSendToRemote = true;
246
+ delete extra.skipSendToRemote;
247
+ }
248
+
249
+ const date = moment__default['default']().format('YYYY-MM-DD HH:mm:ss.SSS');
237
250
  const message = args.join(', ');
238
251
  let consoleMessage = message;
239
252
 
@@ -253,7 +266,13 @@ class IssueReporter {
253
266
  const oldMethod = this.oldConsoleMethods[consoleLevel] || this.oldConsoleMethods.log;
254
267
  oldMethod.apply(oldMethod, [date, consoleMessage]);
255
268
 
256
- this._sendToRemoteLogger(level, { date, message, category, ...extra });
269
+ if (this._callback) {
270
+ this._callback(level, consoleMessage);
271
+ }
272
+
273
+ if (!skipSendToRemote) {
274
+ this._sendToRemoteLogger(level, { date, message, category, ...extra });
275
+ }
257
276
  }
258
277
 
259
278
  logRequest(url , options , response , start ) {
@@ -398,7 +417,11 @@ class IssueReporter {
398
417
  },
399
418
  // $FlowFixMe
400
419
  body,
401
- }).catch(() => {
420
+ }).catch((e ) => {
421
+ // $FlowFixMe
422
+ e.skipSendToRemote = true;
423
+ this.log('error', this._makeCategory('grafana'), 'Sending log to grafana, error', e);
424
+
402
425
  setTimeout(() => {
403
426
  if (isArray) {
404
427
  payload = payload.map(message => {
@@ -410,7 +433,7 @@ class IssueReporter {
410
433
  payload._retry = retry + 1;
411
434
  }
412
435
 
413
- this._sendDebugToGrafana(body, retry + 1);
436
+ this._sendDebugToGrafana(payload, retry + 1);
414
437
  }, 5000 + retry * 1000);
415
438
  });
416
439
  }
@@ -2613,7 +2636,8 @@ class ExternalApp {
2613
2636
 
2614
2637
 
2615
2638
 
2616
-
2639
+
2640
+
2617
2641
 
2618
2642
 
2619
2643
  class Meeting {
@@ -2625,6 +2649,7 @@ class Meeting {
2625
2649
 
2626
2650
 
2627
2651
 
2652
+
2628
2653
 
2629
2654
 
2630
2655
  static parse(plain ) {
@@ -2636,14 +2661,28 @@ class Meeting {
2636
2661
  port: plain.port,
2637
2662
  uuid: plain.uuid,
2638
2663
  number: plain.number,
2664
+ persistent: plain.persistent,
2639
2665
  });
2640
2666
  }
2641
2667
 
2668
+ static parseMany(items ) {
2669
+ return items.map(plain => Meeting.parse(plain));
2670
+ }
2671
+
2642
2672
  static newFrom(meeting ) {
2643
2673
  return newFrom(meeting, Meeting);
2644
2674
  }
2645
2675
 
2646
- constructor({ uuid, name, guestSipAuthorization, ownerUuids, port, uri, number } = {}) {
2676
+ constructor({
2677
+ uuid,
2678
+ name,
2679
+ guestSipAuthorization,
2680
+ ownerUuids,
2681
+ port,
2682
+ uri,
2683
+ number,
2684
+ persistent,
2685
+ } = {}) {
2647
2686
  this.guestSipAuthorization = guestSipAuthorization;
2648
2687
  this.uri = uri;
2649
2688
  this.name = name;
@@ -2651,6 +2690,7 @@ class Meeting {
2651
2690
  this.port = port;
2652
2691
  this.uuid = uuid;
2653
2692
  this.number = number;
2693
+ this.persistent = persistent;
2654
2694
 
2655
2695
  // Useful to compare instead of instanceof with minified code
2656
2696
  this.type = 'Meeting';
@@ -2728,8 +2768,11 @@ var confdMethods = (client , baseUrl ) => ({
2728
2768
  }
2729
2769
  },
2730
2770
 
2731
- createMyMeeting: (name ) =>
2732
- client.post(`${baseUrl}/users/me/meetings`, { name }).then(Meeting.parse),
2771
+ getMyMeetings: () =>
2772
+ client.get(`${baseUrl}/users/me/meetings`).then(response => Meeting.parseMany(response.items)),
2773
+
2774
+ createMyMeeting: (name , persistent ) =>
2775
+ client.post(`${baseUrl}/users/me/meetings`, { name, persistent }).then(Meeting.parse),
2733
2776
 
2734
2777
  deleteMyMeeting: (meetingUuid ) =>
2735
2778
  client.delete(`${baseUrl}/users/me/meetings/${meetingUuid}`, null),
@@ -2831,7 +2874,7 @@ class ChatMessage {
2831
2874
  static parse(plain ) {
2832
2875
  return new ChatMessage({
2833
2876
  uuid: plain.uuid,
2834
- date: moment__default["default"](plain.created_at).toDate(),
2877
+ date: moment__default['default'](plain.created_at).toDate(),
2835
2878
  content: plain.content,
2836
2879
  alias: plain.alias,
2837
2880
  userUuid: plain.user_uuid,
@@ -2923,7 +2966,7 @@ class Voicemail {
2923
2966
  static parse(plain ) {
2924
2967
  return new Voicemail({
2925
2968
  id: plain.id,
2926
- date: moment__default["default"](plain.timestamp * 1000).toDate(),
2969
+ date: moment__default['default'](plain.timestamp * 1000).toDate(),
2927
2970
  duration: plain.duration * 1000,
2928
2971
  caller: {
2929
2972
  name: plain.caller_id_name,
@@ -3060,7 +3103,7 @@ class Call {
3060
3103
  onHold: plain.on_hold,
3061
3104
  status: plain.status,
3062
3105
  lineId: plain.line_id,
3063
- startingTime: moment__default["default"](plain.creation_time).toDate(),
3106
+ startingTime: moment__default['default'](plain.creation_time).toDate(),
3064
3107
  talkingToIds: Object.keys(plain.talking_to || {}),
3065
3108
  recording: plain.record_state === RECORD_STATE_ACTIVE,
3066
3109
  });
@@ -3195,7 +3238,7 @@ class Emitter {
3195
3238
 
3196
3239
 
3197
3240
  constructor() {
3198
- this.eventEmitter = new EventEmitter__default["default"]();
3241
+ this.eventEmitter = new EventEmitter__default['default']();
3199
3242
  }
3200
3243
 
3201
3244
  on(event , callback ) {
@@ -3240,7 +3283,7 @@ class Recording {
3240
3283
 
3241
3284
 
3242
3285
 
3243
- static parseMany(recordings ) {
3286
+ static parseMany(recordings = []) {
3244
3287
  return recordings.map(item => Recording.parse(item));
3245
3288
  }
3246
3289
 
@@ -3248,8 +3291,8 @@ class Recording {
3248
3291
  return new Recording({
3249
3292
  deleted: plain.deleted,
3250
3293
  fileName: plain.filename,
3251
- end: plain.end_time ? moment__default["default"](plain.end_time).toDate() : null,
3252
- start: moment__default["default"](plain.start_time).toDate(),
3294
+ end: plain.end_time ? moment__default['default'](plain.end_time).toDate() : null,
3295
+ start: moment__default['default'](plain.start_time).toDate(),
3253
3296
  uuid: plain.uuid,
3254
3297
  });
3255
3298
  }
@@ -3347,7 +3390,7 @@ class CallLog {
3347
3390
 
3348
3391
  static parse(plain ) {
3349
3392
  return new CallLog({
3350
- answer: plain.answer ? moment__default["default"](plain.answer).toDate() : null,
3393
+ answer: plain.answer ? moment__default['default'](plain.answer).toDate() : null,
3351
3394
  answered: plain.answered,
3352
3395
  callDirection: plain.call_direction,
3353
3396
  destination: {
@@ -3364,9 +3407,9 @@ class CallLog {
3364
3407
  },
3365
3408
  id: plain.id,
3366
3409
  duration: (plain.duration || 0) * 1000, // duration is in seconds
3367
- start: moment__default["default"](plain.start).toDate(),
3368
- end: plain.end ? moment__default["default"](plain.end).toDate() : null,
3369
- recordings: Recording.parseMany(plain.recordings),
3410
+ start: moment__default['default'](plain.start).toDate(),
3411
+ end: plain.end ? moment__default['default'](plain.end).toDate() : null,
3412
+ recordings: Recording.parseMany(plain.recordings || []),
3370
3413
  });
3371
3414
  }
3372
3415
 
@@ -4909,6 +4952,7 @@ const AGENT_PAUSED = 'agent_paused';
4909
4952
  const AGENT_UNPAUSED = 'agent_unpaused';
4910
4953
  const CONFERENCE_ADHOC_PARTICIPANT_LEFT = 'conference_adhoc_participant_left';
4911
4954
  const CONFERENCE_ADHOC_DELETED = 'conference_adhoc_deleted';
4955
+ const MEETING_USER_PROGRESS = 'meeting_user_progress';
4912
4956
 
4913
4957
  const BLACKLIST_EVENTS = [
4914
4958
  CHAT_MESSAGE_SENT,
@@ -4968,7 +5012,7 @@ class WebSocketClient extends Emitter {
4968
5012
 
4969
5013
  connect() {
4970
5014
  logger$2.info('connect method started', { host: this.host, token: this.token });
4971
- this.socket = new ReconnectingWebSocket__default["default"](this._getUrl.bind(this), [], this.options);
5015
+ this.socket = new ReconnectingWebSocket__default['default'](this._getUrl.bind(this), [], this.options);
4972
5016
  if (this.options.binaryType) {
4973
5017
  this.socket.binaryType = this.options.binaryType;
4974
5018
  }
@@ -5259,6 +5303,7 @@ WebSocketClient.eventLists = [
5259
5303
  AGENT_UNPAUSED,
5260
5304
  CONFERENCE_ADHOC_PARTICIPANT_LEFT,
5261
5305
  CONFERENCE_ADHOC_DELETED,
5306
+ MEETING_USER_PROGRESS,
5262
5307
  ];
5263
5308
 
5264
5309
  var wazoWebsocket = {
@@ -5305,7 +5350,7 @@ const parseCandidate$1 = (candidate ) => {
5305
5350
  if (!candidate) {
5306
5351
  return null;
5307
5352
  }
5308
- const result = sdpParser__default["default"].parse(candidate.indexOf('a=') === 0 ? candidate : `a=${candidate}`);
5353
+ const result = sdpParser__default['default'].parse(candidate.indexOf('a=') === 0 ? candidate : `a=${candidate}`);
5309
5354
 
5310
5355
  return result.candidates ? result.candidates[0] : null;
5311
5356
  };
@@ -5319,7 +5364,7 @@ const areCandidateValid = (candidates ) =>
5319
5364
  .length > 0;
5320
5365
 
5321
5366
  const getVideoDirection = (sdp ) => {
5322
- const parsedSdp = sdpParser__default["default"].parse(sdp);
5367
+ const parsedSdp = sdpParser__default['default'].parse(sdp);
5323
5368
  const videoMedia = parsedSdp.media.find(media => media.type === 'video');
5324
5369
  if (!videoMedia) {
5325
5370
  return null;
@@ -5333,14 +5378,14 @@ const hasAnActiveVideo = (sdp ) => {
5333
5378
  return false;
5334
5379
  }
5335
5380
 
5336
- const parsedSdp = sdpParser__default["default"].parse(sdp);
5381
+ const parsedSdp = sdpParser__default['default'].parse(sdp);
5337
5382
 
5338
5383
  return !!parsedSdp.media.find(media =>
5339
5384
  media.type === 'video' && media.port > 10 && (!media.direction || media.direction !== 'inactive'));
5340
5385
  };
5341
5386
 
5342
5387
  const fixSdp = (sdp , candidates , forcePort = true) => {
5343
- const parsedSdp = sdpParser__default["default"].parse(sdp);
5388
+ const parsedSdp = sdpParser__default['default'].parse(sdp);
5344
5389
  const mainCandidate = getSrflxOrRelay(candidates)[0];
5345
5390
  const ip = mainCandidate ? mainCandidate.ip : null;
5346
5391
 
@@ -5358,7 +5403,7 @@ const fixSdp = (sdp , candidates , forcePort = true)
5358
5403
  };
5359
5404
  });
5360
5405
 
5361
- let fixed = sdpParser__default["default"].write(parsedSdp);
5406
+ let fixed = sdpParser__default['default'].write(parsedSdp);
5362
5407
 
5363
5408
  if (ip) {
5364
5409
  fixed = fixed.replace(/IN IP4 0.0.0.0/g, `IN IP4 ${ip}`);
@@ -5404,7 +5449,7 @@ class WazoSessionDescriptionHandler extends sessionDescriptionHandler.SessionDes
5404
5449
  ) {
5405
5450
  super(logger, mediaStreamFactory, sessionDescriptionHandlerConfiguration);
5406
5451
 
5407
- this.eventEmitter = new EventEmitter__default["default"]();
5452
+ this.eventEmitter = new EventEmitter__default['default']();
5408
5453
  this.isWeb = isWeb;
5409
5454
  this.session = session;
5410
5455
  }
@@ -6287,7 +6332,9 @@ class WebRTCClient extends Emitter {
6287
6332
  const inviteOptions = {
6288
6333
  requestDelegate: {
6289
6334
  onAccept: (response ) => {
6290
- session.sessionDescriptionHandler.peerConnection.sfu = conference;
6335
+ if (session.sessionDescriptionHandler.peerConnection) {
6336
+ session.sessionDescriptionHandler.peerConnection.sfu = conference;
6337
+ }
6291
6338
  this._onAccepted(session, response.session, true);
6292
6339
  },
6293
6340
  onReject: (response ) => {
@@ -6623,7 +6670,7 @@ class WebRTCClient extends Emitter {
6623
6670
  // We search for the last transceiver without `video-` in the mid (video- means remote transceiver)
6624
6671
  const transceivers = pc.getTransceivers();
6625
6672
  const transceiverIdx = lastIndexOf(transceivers, transceiver =>
6626
- transceiver.sender.track === null && transceiver.mid.indexOf('video') === -1);
6673
+ transceiver.sender.track === null && transceiver.mid && transceiver.mid.indexOf('video') === -1);
6627
6674
 
6628
6675
  videoSender = transceiverIdx !== -1 ? transceivers[transceiverIdx].sender : null;
6629
6676
  } else {
@@ -7159,6 +7206,16 @@ class WebRTCClient extends Emitter {
7159
7206
  return this.hasRemoteVideo(sessionId) ? this.getRemoteStream(sessionId) : null;
7160
7207
  }
7161
7208
 
7209
+ // Useful in a react-native environment when remoteMediaStream is not updated
7210
+ getRemoteVideoStreamFromPc(sessionId ) {
7211
+ const pc = this.getPeerConnection(sessionId);
7212
+ if (!pc) {
7213
+ return null;
7214
+ }
7215
+
7216
+ return pc.getRemoteStreams().find(stream => !!stream.getVideoTracks().length);
7217
+ }
7218
+
7162
7219
  hasVideo(sessionId ) {
7163
7220
  return this.hasLocalVideo(sessionId) || this.hasRemoteVideo(sessionId);
7164
7221
  }
@@ -7669,6 +7726,7 @@ class WebRTCClient extends Emitter {
7669
7726
  session.sessionDescriptionHandler.remoteMediaStream.onaddtrack = onTrack;
7670
7727
 
7671
7728
  pc.oniceconnectionstatechange = () => {
7729
+ logger$1.info('on ice connection state changed', { state: pc.iceConnectionState });
7672
7730
  if (pc.iceConnectionState === 'disconnected') {
7673
7731
  this.eventEmitter.emit(ON_DISCONNECTED);
7674
7732
  }
@@ -7828,7 +7886,7 @@ class WebRTCClient extends Emitter {
7828
7886
  }
7829
7887
  const sessionId = this.getSipSessionId(session);
7830
7888
 
7831
- getStats__default["default"](pc, (result ) => {
7889
+ getStats__default['default'](pc, (result ) => {
7832
7890
  const { results, internal, nomore, ...stats } = result;
7833
7891
  this.statsIntervals[sessionId] = nomore;
7834
7892
 
@@ -7937,18 +7995,22 @@ class WebRTCClient extends Emitter {
7937
7995
  });
7938
7996
 
7939
7997
  networkStats.packetsLost = packetsLost;
7940
- networkStats.audioBytesSent = audioBytesSent;
7998
+ networkStats.totalAudioBytesSent = audioBytesSent;
7999
+ networkStats.audioBytesSent = audioBytesSent - lastAudioSent;
8000
+ networkStats.totalAudioBytesReceived = audioBytesReceived - lastAudioReceived;
7941
8001
  networkStats.audioBytesReceived = audioBytesReceived;
7942
- networkStats.videoBytesSent = videoBytesSent;
7943
- networkStats.videoBytesReceived = videoBytesReceived;
8002
+ networkStats.totalVideoBytesSent = videoBytesSent;
8003
+ networkStats.videoBytesSent = videoBytesSent - lastVideoSent;
8004
+ networkStats.totalVideoBytesReceived = videoBytesReceived;
8005
+ networkStats.videoBytesReceived = videoBytesReceived - lastVideoReceived;
8006
+ networkStats.totalTransportSent = transportSent - lastTransportSent;
7944
8007
  networkStats.transportSent = transportSent;
7945
- networkStats.transportReceived = transportReceived;
7946
-
7947
- const bandwidth = (networkStats.audioBytesSent - lastAudioSent) + (networkStats.videoBytesSent - lastVideoSent)
7948
- + (networkStats.audioBytesReceived - lastAudioReceived) + (networkStats.videoBytesReceived - lastVideoReceived)
7949
- + (networkStats.transportReceived - lastTransportReceived) + (networkStats.transportSent - lastTransportSent);
8008
+ networkStats.totalTransportReceived = transportReceived;
8009
+ networkStats.transportReceived = transportReceived - lastTransportReceived;
7950
8010
 
7951
- networkStats.bandwidth = bandwidth;
8011
+ networkStats.bandwidth = networkStats.audioBytesSent + networkStats.audioBytesReceived
8012
+ + networkStats.videoBytesSent + networkStats.videoBytesReceived + networkStats.transportReceived
8013
+ + networkStats.transportSent;
7952
8014
 
7953
8015
  this.eventEmitter.emit(ON_NETWORK_STATS, session, networkStats, this.sessionNetworkStats[sessionId]);
7954
8016
  this.sessionNetworkStats[sessionId].push(networkStats);
@@ -136,6 +136,7 @@ class IssueReporter {
136
136
 
137
137
 
138
138
 
139
+
139
140
 
140
141
  constructor() {
141
142
  addLevelsTo(this);
@@ -147,12 +148,17 @@ class IssueReporter {
147
148
  this.bufferTimeout = null;
148
149
  this._boundProcessBuffer = this._processBuffer.bind(this);
149
150
  this._boundParseLoggerBody = this._parseLoggerBody.bind(this);
151
+ this._callback = null;
150
152
  }
151
153
 
152
154
  init() {
153
155
  this._catchConsole();
154
156
  }
155
157
 
158
+ setCallback(cb ) {
159
+ this._callback = cb;
160
+ }
161
+
156
162
  configureRemoteClient(configuration = { tag: 'wazo-sdk', host: null, port: null, level: null, extra: {} }) {
157
163
  this.remoteClientConfiguration = configuration;
158
164
  }
@@ -188,6 +194,7 @@ class IssueReporter {
188
194
 
189
195
  // Handle category label
190
196
  let category = null;
197
+ let skipSendToRemote = false;
191
198
  let extra = {};
192
199
  if (args[0].indexOf(CATEGORY_PREFIX) === 0) {
193
200
  category = args[0].split('=')[1];
@@ -203,6 +210,7 @@ class IssueReporter {
203
210
  errorMessage: lastArg.message,
204
211
  errorStack: lastArg.stack,
205
212
  errorType: lastArg.constructor.name,
213
+ skipSendToRemote: lastArg.skipSendToRemote,
206
214
  };
207
215
  } else {
208
216
  extra = lastArg;
@@ -211,7 +219,12 @@ class IssueReporter {
211
219
  args.splice(1, 1);
212
220
  }
213
221
 
214
- const date = moment__default["default"]().format('YYYY-MM-DD HH:mm:ss.SSS');
222
+ if (extra.skipSendToRemote) {
223
+ skipSendToRemote = true;
224
+ delete extra.skipSendToRemote;
225
+ }
226
+
227
+ const date = moment__default['default']().format('YYYY-MM-DD HH:mm:ss.SSS');
215
228
  const message = args.join(', ');
216
229
  let consoleMessage = message;
217
230
 
@@ -231,7 +244,13 @@ class IssueReporter {
231
244
  const oldMethod = this.oldConsoleMethods[consoleLevel] || this.oldConsoleMethods.log;
232
245
  oldMethod.apply(oldMethod, [date, consoleMessage]);
233
246
 
234
- this._sendToRemoteLogger(level, { date, message, category, ...extra });
247
+ if (this._callback) {
248
+ this._callback(level, consoleMessage);
249
+ }
250
+
251
+ if (!skipSendToRemote) {
252
+ this._sendToRemoteLogger(level, { date, message, category, ...extra });
253
+ }
235
254
  }
236
255
 
237
256
  logRequest(url , options , response , start ) {
@@ -376,7 +395,11 @@ class IssueReporter {
376
395
  },
377
396
  // $FlowFixMe
378
397
  body,
379
- }).catch(() => {
398
+ }).catch((e ) => {
399
+ // $FlowFixMe
400
+ e.skipSendToRemote = true;
401
+ this.log('error', this._makeCategory('grafana'), 'Sending log to grafana, error', e);
402
+
380
403
  setTimeout(() => {
381
404
  if (isArray) {
382
405
  payload = payload.map(message => {
@@ -388,7 +411,7 @@ class IssueReporter {
388
411
  payload._retry = retry + 1;
389
412
  }
390
413
 
391
- this._sendDebugToGrafana(body, retry + 1);
414
+ this._sendDebugToGrafana(payload, retry + 1);
392
415
  }, 5000 + retry * 1000);
393
416
  });
394
417
  }
@@ -2591,7 +2614,8 @@ class ExternalApp {
2591
2614
 
2592
2615
 
2593
2616
 
2594
-
2617
+
2618
+
2595
2619
 
2596
2620
 
2597
2621
  class Meeting {
@@ -2603,6 +2627,7 @@ class Meeting {
2603
2627
 
2604
2628
 
2605
2629
 
2630
+
2606
2631
 
2607
2632
 
2608
2633
  static parse(plain ) {
@@ -2614,14 +2639,28 @@ class Meeting {
2614
2639
  port: plain.port,
2615
2640
  uuid: plain.uuid,
2616
2641
  number: plain.number,
2642
+ persistent: plain.persistent,
2617
2643
  });
2618
2644
  }
2619
2645
 
2646
+ static parseMany(items ) {
2647
+ return items.map(plain => Meeting.parse(plain));
2648
+ }
2649
+
2620
2650
  static newFrom(meeting ) {
2621
2651
  return newFrom(meeting, Meeting);
2622
2652
  }
2623
2653
 
2624
- constructor({ uuid, name, guestSipAuthorization, ownerUuids, port, uri, number } = {}) {
2654
+ constructor({
2655
+ uuid,
2656
+ name,
2657
+ guestSipAuthorization,
2658
+ ownerUuids,
2659
+ port,
2660
+ uri,
2661
+ number,
2662
+ persistent,
2663
+ } = {}) {
2625
2664
  this.guestSipAuthorization = guestSipAuthorization;
2626
2665
  this.uri = uri;
2627
2666
  this.name = name;
@@ -2629,6 +2668,7 @@ class Meeting {
2629
2668
  this.port = port;
2630
2669
  this.uuid = uuid;
2631
2670
  this.number = number;
2671
+ this.persistent = persistent;
2632
2672
 
2633
2673
  // Useful to compare instead of instanceof with minified code
2634
2674
  this.type = 'Meeting';
@@ -2706,8 +2746,11 @@ var confdMethods = (client , baseUrl ) => ({
2706
2746
  }
2707
2747
  },
2708
2748
 
2709
- createMyMeeting: (name ) =>
2710
- client.post(`${baseUrl}/users/me/meetings`, { name }).then(Meeting.parse),
2749
+ getMyMeetings: () =>
2750
+ client.get(`${baseUrl}/users/me/meetings`).then(response => Meeting.parseMany(response.items)),
2751
+
2752
+ createMyMeeting: (name , persistent ) =>
2753
+ client.post(`${baseUrl}/users/me/meetings`, { name, persistent }).then(Meeting.parse),
2711
2754
 
2712
2755
  deleteMyMeeting: (meetingUuid ) =>
2713
2756
  client.delete(`${baseUrl}/users/me/meetings/${meetingUuid}`, null),
@@ -2809,7 +2852,7 @@ class ChatMessage {
2809
2852
  static parse(plain ) {
2810
2853
  return new ChatMessage({
2811
2854
  uuid: plain.uuid,
2812
- date: moment__default["default"](plain.created_at).toDate(),
2855
+ date: moment__default['default'](plain.created_at).toDate(),
2813
2856
  content: plain.content,
2814
2857
  alias: plain.alias,
2815
2858
  userUuid: plain.user_uuid,
@@ -2901,7 +2944,7 @@ class Voicemail {
2901
2944
  static parse(plain ) {
2902
2945
  return new Voicemail({
2903
2946
  id: plain.id,
2904
- date: moment__default["default"](plain.timestamp * 1000).toDate(),
2947
+ date: moment__default['default'](plain.timestamp * 1000).toDate(),
2905
2948
  duration: plain.duration * 1000,
2906
2949
  caller: {
2907
2950
  name: plain.caller_id_name,
@@ -3038,7 +3081,7 @@ class Call {
3038
3081
  onHold: plain.on_hold,
3039
3082
  status: plain.status,
3040
3083
  lineId: plain.line_id,
3041
- startingTime: moment__default["default"](plain.creation_time).toDate(),
3084
+ startingTime: moment__default['default'](plain.creation_time).toDate(),
3042
3085
  talkingToIds: Object.keys(plain.talking_to || {}),
3043
3086
  recording: plain.record_state === RECORD_STATE_ACTIVE,
3044
3087
  });
@@ -3192,7 +3235,7 @@ class Recording {
3192
3235
 
3193
3236
 
3194
3237
 
3195
- static parseMany(recordings ) {
3238
+ static parseMany(recordings = []) {
3196
3239
  return recordings.map(item => Recording.parse(item));
3197
3240
  }
3198
3241
 
@@ -3200,8 +3243,8 @@ class Recording {
3200
3243
  return new Recording({
3201
3244
  deleted: plain.deleted,
3202
3245
  fileName: plain.filename,
3203
- end: plain.end_time ? moment__default["default"](plain.end_time).toDate() : null,
3204
- start: moment__default["default"](plain.start_time).toDate(),
3246
+ end: plain.end_time ? moment__default['default'](plain.end_time).toDate() : null,
3247
+ start: moment__default['default'](plain.start_time).toDate(),
3205
3248
  uuid: plain.uuid,
3206
3249
  });
3207
3250
  }
@@ -3299,7 +3342,7 @@ class CallLog {
3299
3342
 
3300
3343
  static parse(plain ) {
3301
3344
  return new CallLog({
3302
- answer: plain.answer ? moment__default["default"](plain.answer).toDate() : null,
3345
+ answer: plain.answer ? moment__default['default'](plain.answer).toDate() : null,
3303
3346
  answered: plain.answered,
3304
3347
  callDirection: plain.call_direction,
3305
3348
  destination: {
@@ -3316,9 +3359,9 @@ class CallLog {
3316
3359
  },
3317
3360
  id: plain.id,
3318
3361
  duration: (plain.duration || 0) * 1000, // duration is in seconds
3319
- start: moment__default["default"](plain.start).toDate(),
3320
- end: plain.end ? moment__default["default"](plain.end).toDate() : null,
3321
- recordings: Recording.parseMany(plain.recordings),
3362
+ start: moment__default['default'](plain.start).toDate(),
3363
+ end: plain.end ? moment__default['default'](plain.end).toDate() : null,
3364
+ recordings: Recording.parseMany(plain.recordings || []),
3322
3365
  });
3323
3366
  }
3324
3367