@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
@@ -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
 
@@ -421,6 +421,7 @@ class IssueReporter {
421
421
 
422
422
 
423
423
 
424
+
424
425
 
425
426
  constructor() {
426
427
  addLevelsTo(this);
@@ -432,12 +433,17 @@ class IssueReporter {
432
433
  this.bufferTimeout = null;
433
434
  this._boundProcessBuffer = this._processBuffer.bind(this);
434
435
  this._boundParseLoggerBody = this._parseLoggerBody.bind(this);
436
+ this._callback = null;
435
437
  }
436
438
 
437
439
  init() {
438
440
  this._catchConsole();
439
441
  }
440
442
 
443
+ setCallback(cb ) {
444
+ this._callback = cb;
445
+ }
446
+
441
447
  configureRemoteClient(configuration = { tag: 'wazo-sdk', host: null, port: null, level: null, extra: {} }) {
442
448
  this.remoteClientConfiguration = configuration;
443
449
  }
@@ -473,6 +479,7 @@ class IssueReporter {
473
479
 
474
480
  // Handle category label
475
481
  let category = null;
482
+ let skipSendToRemote = false;
476
483
  let extra = {};
477
484
  if (args[0].indexOf(CATEGORY_PREFIX) === 0) {
478
485
  category = args[0].split('=')[1];
@@ -488,6 +495,7 @@ class IssueReporter {
488
495
  errorMessage: lastArg.message,
489
496
  errorStack: lastArg.stack,
490
497
  errorType: lastArg.constructor.name,
498
+ skipSendToRemote: lastArg.skipSendToRemote,
491
499
  };
492
500
  } else {
493
501
  extra = lastArg;
@@ -496,7 +504,12 @@ class IssueReporter {
496
504
  args.splice(1, 1);
497
505
  }
498
506
 
499
- const date = moment__default["default"]().format('YYYY-MM-DD HH:mm:ss.SSS');
507
+ if (extra.skipSendToRemote) {
508
+ skipSendToRemote = true;
509
+ delete extra.skipSendToRemote;
510
+ }
511
+
512
+ const date = moment__default['default']().format('YYYY-MM-DD HH:mm:ss.SSS');
500
513
  const message = args.join(', ');
501
514
  let consoleMessage = message;
502
515
 
@@ -516,7 +529,13 @@ class IssueReporter {
516
529
  const oldMethod = this.oldConsoleMethods[consoleLevel] || this.oldConsoleMethods.log;
517
530
  oldMethod.apply(oldMethod, [date, consoleMessage]);
518
531
 
519
- this._sendToRemoteLogger(level, { date, message, category, ...extra });
532
+ if (this._callback) {
533
+ this._callback(level, consoleMessage);
534
+ }
535
+
536
+ if (!skipSendToRemote) {
537
+ this._sendToRemoteLogger(level, { date, message, category, ...extra });
538
+ }
520
539
  }
521
540
 
522
541
  logRequest(url , options , response , start ) {
@@ -661,7 +680,11 @@ class IssueReporter {
661
680
  },
662
681
  // $FlowFixMe
663
682
  body,
664
- }).catch(() => {
683
+ }).catch((e ) => {
684
+ // $FlowFixMe
685
+ e.skipSendToRemote = true;
686
+ this.log('error', this._makeCategory('grafana'), 'Sending log to grafana, error', e);
687
+
665
688
  setTimeout(() => {
666
689
  if (isArray) {
667
690
  payload = payload.map(message => {
@@ -673,7 +696,7 @@ class IssueReporter {
673
696
  payload._retry = retry + 1;
674
697
  }
675
698
 
676
- this._sendDebugToGrafana(body, retry + 1);
699
+ this._sendDebugToGrafana(payload, retry + 1);
677
700
  }, 5000 + retry * 1000);
678
701
  });
679
702
  }
@@ -701,7 +724,7 @@ const parseCandidate = (candidate ) => {
701
724
  if (!candidate) {
702
725
  return null;
703
726
  }
704
- const result = sdpParser__default["default"].parse(candidate.indexOf('a=') === 0 ? candidate : `a=${candidate}`);
727
+ const result = sdpParser__default['default'].parse(candidate.indexOf('a=') === 0 ? candidate : `a=${candidate}`);
705
728
 
706
729
  return result.candidates ? result.candidates[0] : null;
707
730
  };
@@ -715,7 +738,7 @@ const areCandidateValid = (candidates ) =>
715
738
  .length > 0;
716
739
 
717
740
  const getVideoDirection = (sdp ) => {
718
- const parsedSdp = sdpParser__default["default"].parse(sdp);
741
+ const parsedSdp = sdpParser__default['default'].parse(sdp);
719
742
  const videoMedia = parsedSdp.media.find(media => media.type === 'video');
720
743
  if (!videoMedia) {
721
744
  return null;
@@ -729,14 +752,14 @@ const hasAnActiveVideo = (sdp ) => {
729
752
  return false;
730
753
  }
731
754
 
732
- const parsedSdp = sdpParser__default["default"].parse(sdp);
755
+ const parsedSdp = sdpParser__default['default'].parse(sdp);
733
756
 
734
757
  return !!parsedSdp.media.find(media =>
735
758
  media.type === 'video' && media.port > 10 && (!media.direction || media.direction !== 'inactive'));
736
759
  };
737
760
 
738
761
  const fixSdp = (sdp , candidates , forcePort = true) => {
739
- const parsedSdp = sdpParser__default["default"].parse(sdp);
762
+ const parsedSdp = sdpParser__default['default'].parse(sdp);
740
763
  const mainCandidate = getSrflxOrRelay(candidates)[0];
741
764
  const ip = mainCandidate ? mainCandidate.ip : null;
742
765
 
@@ -754,7 +777,7 @@ const fixSdp = (sdp , candidates , forcePort = true)
754
777
  };
755
778
  });
756
779
 
757
- let fixed = sdpParser__default["default"].write(parsedSdp);
780
+ let fixed = sdpParser__default['default'].write(parsedSdp);
758
781
 
759
782
  if (ip) {
760
783
  fixed = fixed.replace(/IN IP4 0.0.0.0/g, `IN IP4 ${ip}`);
@@ -800,7 +823,7 @@ class WazoSessionDescriptionHandler extends sessionDescriptionHandler.SessionDes
800
823
  ) {
801
824
  super(logger, mediaStreamFactory, sessionDescriptionHandlerConfiguration);
802
825
 
803
- this.eventEmitter = new EventEmitter__default["default"]();
826
+ this.eventEmitter = new EventEmitter__default['default']();
804
827
  this.isWeb = isWeb;
805
828
  this.session = session;
806
829
  }
@@ -1239,7 +1262,7 @@ class Emitter {
1239
1262
 
1240
1263
 
1241
1264
  constructor() {
1242
- this.eventEmitter = new EventEmitter__default["default"]();
1265
+ this.eventEmitter = new EventEmitter__default['default']();
1243
1266
  }
1244
1267
 
1245
1268
  on(event , callback ) {
@@ -3175,7 +3198,8 @@ class ExternalApp {
3175
3198
 
3176
3199
 
3177
3200
 
3178
-
3201
+
3202
+
3179
3203
 
3180
3204
 
3181
3205
  class Meeting {
@@ -3187,6 +3211,7 @@ class Meeting {
3187
3211
 
3188
3212
 
3189
3213
 
3214
+
3190
3215
 
3191
3216
 
3192
3217
  static parse(plain ) {
@@ -3198,14 +3223,28 @@ class Meeting {
3198
3223
  port: plain.port,
3199
3224
  uuid: plain.uuid,
3200
3225
  number: plain.number,
3226
+ persistent: plain.persistent,
3201
3227
  });
3202
3228
  }
3203
3229
 
3230
+ static parseMany(items ) {
3231
+ return items.map(plain => Meeting.parse(plain));
3232
+ }
3233
+
3204
3234
  static newFrom(meeting ) {
3205
3235
  return newFrom(meeting, Meeting);
3206
3236
  }
3207
3237
 
3208
- constructor({ uuid, name, guestSipAuthorization, ownerUuids, port, uri, number } = {}) {
3238
+ constructor({
3239
+ uuid,
3240
+ name,
3241
+ guestSipAuthorization,
3242
+ ownerUuids,
3243
+ port,
3244
+ uri,
3245
+ number,
3246
+ persistent,
3247
+ } = {}) {
3209
3248
  this.guestSipAuthorization = guestSipAuthorization;
3210
3249
  this.uri = uri;
3211
3250
  this.name = name;
@@ -3213,6 +3252,7 @@ class Meeting {
3213
3252
  this.port = port;
3214
3253
  this.uuid = uuid;
3215
3254
  this.number = number;
3255
+ this.persistent = persistent;
3216
3256
 
3217
3257
  // Useful to compare instead of instanceof with minified code
3218
3258
  this.type = 'Meeting';
@@ -3290,8 +3330,11 @@ var confdMethods = (client , baseUrl ) => ({
3290
3330
  }
3291
3331
  },
3292
3332
 
3293
- createMyMeeting: (name ) =>
3294
- client.post(`${baseUrl}/users/me/meetings`, { name }).then(Meeting.parse),
3333
+ getMyMeetings: () =>
3334
+ client.get(`${baseUrl}/users/me/meetings`).then(response => Meeting.parseMany(response.items)),
3335
+
3336
+ createMyMeeting: (name , persistent ) =>
3337
+ client.post(`${baseUrl}/users/me/meetings`, { name, persistent }).then(Meeting.parse),
3295
3338
 
3296
3339
  deleteMyMeeting: (meetingUuid ) =>
3297
3340
  client.delete(`${baseUrl}/users/me/meetings/${meetingUuid}`, null),
@@ -3393,7 +3436,7 @@ class ChatMessage {
3393
3436
  static parse(plain ) {
3394
3437
  return new ChatMessage({
3395
3438
  uuid: plain.uuid,
3396
- date: moment__default["default"](plain.created_at).toDate(),
3439
+ date: moment__default['default'](plain.created_at).toDate(),
3397
3440
  content: plain.content,
3398
3441
  alias: plain.alias,
3399
3442
  userUuid: plain.user_uuid,
@@ -3485,7 +3528,7 @@ class Voicemail {
3485
3528
  static parse(plain ) {
3486
3529
  return new Voicemail({
3487
3530
  id: plain.id,
3488
- date: moment__default["default"](plain.timestamp * 1000).toDate(),
3531
+ date: moment__default['default'](plain.timestamp * 1000).toDate(),
3489
3532
  duration: plain.duration * 1000,
3490
3533
  caller: {
3491
3534
  name: plain.caller_id_name,
@@ -3622,7 +3665,7 @@ class Call {
3622
3665
  onHold: plain.on_hold,
3623
3666
  status: plain.status,
3624
3667
  lineId: plain.line_id,
3625
- startingTime: moment__default["default"](plain.creation_time).toDate(),
3668
+ startingTime: moment__default['default'](plain.creation_time).toDate(),
3626
3669
  talkingToIds: Object.keys(plain.talking_to || {}),
3627
3670
  recording: plain.record_state === RECORD_STATE_ACTIVE,
3628
3671
  });
@@ -3776,7 +3819,7 @@ class Recording {
3776
3819
 
3777
3820
 
3778
3821
 
3779
- static parseMany(recordings ) {
3822
+ static parseMany(recordings = []) {
3780
3823
  return recordings.map(item => Recording.parse(item));
3781
3824
  }
3782
3825
 
@@ -3784,8 +3827,8 @@ class Recording {
3784
3827
  return new Recording({
3785
3828
  deleted: plain.deleted,
3786
3829
  fileName: plain.filename,
3787
- end: plain.end_time ? moment__default["default"](plain.end_time).toDate() : null,
3788
- start: moment__default["default"](plain.start_time).toDate(),
3830
+ end: plain.end_time ? moment__default['default'](plain.end_time).toDate() : null,
3831
+ start: moment__default['default'](plain.start_time).toDate(),
3789
3832
  uuid: plain.uuid,
3790
3833
  });
3791
3834
  }
@@ -3883,7 +3926,7 @@ class CallLog {
3883
3926
 
3884
3927
  static parse(plain ) {
3885
3928
  return new CallLog({
3886
- answer: plain.answer ? moment__default["default"](plain.answer).toDate() : null,
3929
+ answer: plain.answer ? moment__default['default'](plain.answer).toDate() : null,
3887
3930
  answered: plain.answered,
3888
3931
  callDirection: plain.call_direction,
3889
3932
  destination: {
@@ -3900,9 +3943,9 @@ class CallLog {
3900
3943
  },
3901
3944
  id: plain.id,
3902
3945
  duration: (plain.duration || 0) * 1000, // duration is in seconds
3903
- start: moment__default["default"](plain.start).toDate(),
3904
- end: plain.end ? moment__default["default"](plain.end).toDate() : null,
3905
- recordings: Recording.parseMany(plain.recordings),
3946
+ start: moment__default['default'](plain.start).toDate(),
3947
+ end: plain.end ? moment__default['default'](plain.end).toDate() : null,
3948
+ recordings: Recording.parseMany(plain.recordings || []),
3906
3949
  });
3907
3950
  }
3908
3951
 
@@ -5703,7 +5746,9 @@ class WebRTCClient extends Emitter {
5703
5746
  const inviteOptions = {
5704
5747
  requestDelegate: {
5705
5748
  onAccept: (response ) => {
5706
- session.sessionDescriptionHandler.peerConnection.sfu = conference;
5749
+ if (session.sessionDescriptionHandler.peerConnection) {
5750
+ session.sessionDescriptionHandler.peerConnection.sfu = conference;
5751
+ }
5707
5752
  this._onAccepted(session, response.session, true);
5708
5753
  },
5709
5754
  onReject: (response ) => {
@@ -6039,7 +6084,7 @@ class WebRTCClient extends Emitter {
6039
6084
  // We search for the last transceiver without `video-` in the mid (video- means remote transceiver)
6040
6085
  const transceivers = pc.getTransceivers();
6041
6086
  const transceiverIdx = lastIndexOf(transceivers, transceiver =>
6042
- transceiver.sender.track === null && transceiver.mid.indexOf('video') === -1);
6087
+ transceiver.sender.track === null && transceiver.mid && transceiver.mid.indexOf('video') === -1);
6043
6088
 
6044
6089
  videoSender = transceiverIdx !== -1 ? transceivers[transceiverIdx].sender : null;
6045
6090
  } else {
@@ -6575,6 +6620,16 @@ class WebRTCClient extends Emitter {
6575
6620
  return this.hasRemoteVideo(sessionId) ? this.getRemoteStream(sessionId) : null;
6576
6621
  }
6577
6622
 
6623
+ // Useful in a react-native environment when remoteMediaStream is not updated
6624
+ getRemoteVideoStreamFromPc(sessionId ) {
6625
+ const pc = this.getPeerConnection(sessionId);
6626
+ if (!pc) {
6627
+ return null;
6628
+ }
6629
+
6630
+ return pc.getRemoteStreams().find(stream => !!stream.getVideoTracks().length);
6631
+ }
6632
+
6578
6633
  hasVideo(sessionId ) {
6579
6634
  return this.hasLocalVideo(sessionId) || this.hasRemoteVideo(sessionId);
6580
6635
  }
@@ -7085,6 +7140,7 @@ class WebRTCClient extends Emitter {
7085
7140
  session.sessionDescriptionHandler.remoteMediaStream.onaddtrack = onTrack;
7086
7141
 
7087
7142
  pc.oniceconnectionstatechange = () => {
7143
+ logger.info('on ice connection state changed', { state: pc.iceConnectionState });
7088
7144
  if (pc.iceConnectionState === 'disconnected') {
7089
7145
  this.eventEmitter.emit(ON_DISCONNECTED);
7090
7146
  }
@@ -7244,7 +7300,7 @@ class WebRTCClient extends Emitter {
7244
7300
  }
7245
7301
  const sessionId = this.getSipSessionId(session);
7246
7302
 
7247
- getStats__default["default"](pc, (result ) => {
7303
+ getStats__default['default'](pc, (result ) => {
7248
7304
  const { results, internal, nomore, ...stats } = result;
7249
7305
  this.statsIntervals[sessionId] = nomore;
7250
7306
 
@@ -7353,18 +7409,22 @@ class WebRTCClient extends Emitter {
7353
7409
  });
7354
7410
 
7355
7411
  networkStats.packetsLost = packetsLost;
7356
- networkStats.audioBytesSent = audioBytesSent;
7412
+ networkStats.totalAudioBytesSent = audioBytesSent;
7413
+ networkStats.audioBytesSent = audioBytesSent - lastAudioSent;
7414
+ networkStats.totalAudioBytesReceived = audioBytesReceived - lastAudioReceived;
7357
7415
  networkStats.audioBytesReceived = audioBytesReceived;
7358
- networkStats.videoBytesSent = videoBytesSent;
7359
- networkStats.videoBytesReceived = videoBytesReceived;
7416
+ networkStats.totalVideoBytesSent = videoBytesSent;
7417
+ networkStats.videoBytesSent = videoBytesSent - lastVideoSent;
7418
+ networkStats.totalVideoBytesReceived = videoBytesReceived;
7419
+ networkStats.videoBytesReceived = videoBytesReceived - lastVideoReceived;
7420
+ networkStats.totalTransportSent = transportSent - lastTransportSent;
7360
7421
  networkStats.transportSent = transportSent;
7361
- networkStats.transportReceived = transportReceived;
7362
-
7363
- const bandwidth = (networkStats.audioBytesSent - lastAudioSent) + (networkStats.videoBytesSent - lastVideoSent)
7364
- + (networkStats.audioBytesReceived - lastAudioReceived) + (networkStats.videoBytesReceived - lastVideoReceived)
7365
- + (networkStats.transportReceived - lastTransportReceived) + (networkStats.transportSent - lastTransportSent);
7422
+ networkStats.totalTransportReceived = transportReceived;
7423
+ networkStats.transportReceived = transportReceived - lastTransportReceived;
7366
7424
 
7367
- networkStats.bandwidth = bandwidth;
7425
+ networkStats.bandwidth = networkStats.audioBytesSent + networkStats.audioBytesReceived
7426
+ + networkStats.videoBytesSent + networkStats.videoBytesReceived + networkStats.transportReceived
7427
+ + networkStats.transportSent;
7368
7428
 
7369
7429
  this.eventEmitter.emit(ON_NETWORK_STATS, session, networkStats, this.sessionNetworkStats[sessionId]);
7370
7430
  this.sessionNetworkStats[sessionId].push(networkStats);
package/lib/api/agentd.js CHANGED
@@ -132,6 +132,7 @@ class IssueReporter {
132
132
 
133
133
 
134
134
 
135
+
135
136
 
136
137
  constructor() {
137
138
  addLevelsTo(this);
@@ -143,12 +144,17 @@ class IssueReporter {
143
144
  this.bufferTimeout = null;
144
145
  this._boundProcessBuffer = this._processBuffer.bind(this);
145
146
  this._boundParseLoggerBody = this._parseLoggerBody.bind(this);
147
+ this._callback = null;
146
148
  }
147
149
 
148
150
  init() {
149
151
  this._catchConsole();
150
152
  }
151
153
 
154
+ setCallback(cb ) {
155
+ this._callback = cb;
156
+ }
157
+
152
158
  configureRemoteClient(configuration = { tag: 'wazo-sdk', host: null, port: null, level: null, extra: {} }) {
153
159
  this.remoteClientConfiguration = configuration;
154
160
  }
@@ -184,6 +190,7 @@ class IssueReporter {
184
190
 
185
191
  // Handle category label
186
192
  let category = null;
193
+ let skipSendToRemote = false;
187
194
  let extra = {};
188
195
  if (args[0].indexOf(CATEGORY_PREFIX) === 0) {
189
196
  category = args[0].split('=')[1];
@@ -199,6 +206,7 @@ class IssueReporter {
199
206
  errorMessage: lastArg.message,
200
207
  errorStack: lastArg.stack,
201
208
  errorType: lastArg.constructor.name,
209
+ skipSendToRemote: lastArg.skipSendToRemote,
202
210
  };
203
211
  } else {
204
212
  extra = lastArg;
@@ -207,7 +215,12 @@ class IssueReporter {
207
215
  args.splice(1, 1);
208
216
  }
209
217
 
210
- const date = moment__default["default"]().format('YYYY-MM-DD HH:mm:ss.SSS');
218
+ if (extra.skipSendToRemote) {
219
+ skipSendToRemote = true;
220
+ delete extra.skipSendToRemote;
221
+ }
222
+
223
+ const date = moment__default['default']().format('YYYY-MM-DD HH:mm:ss.SSS');
211
224
  const message = args.join(', ');
212
225
  let consoleMessage = message;
213
226
 
@@ -227,7 +240,13 @@ class IssueReporter {
227
240
  const oldMethod = this.oldConsoleMethods[consoleLevel] || this.oldConsoleMethods.log;
228
241
  oldMethod.apply(oldMethod, [date, consoleMessage]);
229
242
 
230
- this._sendToRemoteLogger(level, { date, message, category, ...extra });
243
+ if (this._callback) {
244
+ this._callback(level, consoleMessage);
245
+ }
246
+
247
+ if (!skipSendToRemote) {
248
+ this._sendToRemoteLogger(level, { date, message, category, ...extra });
249
+ }
231
250
  }
232
251
 
233
252
  logRequest(url , options , response , start ) {
@@ -372,7 +391,11 @@ class IssueReporter {
372
391
  },
373
392
  // $FlowFixMe
374
393
  body,
375
- }).catch(() => {
394
+ }).catch((e ) => {
395
+ // $FlowFixMe
396
+ e.skipSendToRemote = true;
397
+ this.log('error', this._makeCategory('grafana'), 'Sending log to grafana, error', e);
398
+
376
399
  setTimeout(() => {
377
400
  if (isArray) {
378
401
  payload = payload.map(message => {
@@ -384,7 +407,7 @@ class IssueReporter {
384
407
  payload._retry = retry + 1;
385
408
  }
386
409
 
387
- this._sendDebugToGrafana(body, retry + 1);
410
+ this._sendDebugToGrafana(payload, retry + 1);
388
411
  }, 5000 + retry * 1000);
389
412
  });
390
413
  }