@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
@@ -31,7 +31,7 @@ class Recording {
31
31
 
32
32
 
33
33
 
34
- static parseMany(recordings ) {
34
+ static parseMany(recordings = []) {
35
35
  return recordings.map(item => Recording.parse(item));
36
36
  }
37
37
 
@@ -39,8 +39,8 @@ class Recording {
39
39
  return new Recording({
40
40
  deleted: plain.deleted,
41
41
  fileName: plain.filename,
42
- end: plain.end_time ? moment__default["default"](plain.end_time).toDate() : null,
43
- start: moment__default["default"](plain.start_time).toDate(),
42
+ end: plain.end_time ? moment__default['default'](plain.end_time).toDate() : null,
43
+ start: moment__default['default'](plain.start_time).toDate(),
44
44
  uuid: plain.uuid,
45
45
  });
46
46
  }
@@ -66,7 +66,7 @@ class Voicemail {
66
66
  static parse(plain ) {
67
67
  return new Voicemail({
68
68
  id: plain.id,
69
- date: moment__default["default"](plain.timestamp * 1000).toDate(),
69
+ date: moment__default['default'](plain.timestamp * 1000).toDate(),
70
70
  duration: plain.duration * 1000,
71
71
  caller: {
72
72
  name: plain.caller_id_name,
@@ -94,7 +94,7 @@ class Call {
94
94
  onHold: plain.on_hold,
95
95
  status: plain.status,
96
96
  lineId: plain.line_id,
97
- startingTime: moment__default["default"](plain.creation_time).toDate(),
97
+ startingTime: moment__default['default'](plain.creation_time).toDate(),
98
98
  talkingToIds: Object.keys(plain.talking_to || {}),
99
99
  recording: plain.record_state === RECORD_STATE_ACTIVE,
100
100
  });
@@ -59,7 +59,7 @@ class Recording {
59
59
 
60
60
 
61
61
 
62
- static parseMany(recordings ) {
62
+ static parseMany(recordings = []) {
63
63
  return recordings.map(item => Recording.parse(item));
64
64
  }
65
65
 
@@ -67,8 +67,8 @@ class Recording {
67
67
  return new Recording({
68
68
  deleted: plain.deleted,
69
69
  fileName: plain.filename,
70
- end: plain.end_time ? moment__default["default"](plain.end_time).toDate() : null,
71
- start: moment__default["default"](plain.start_time).toDate(),
70
+ end: plain.end_time ? moment__default['default'](plain.end_time).toDate() : null,
71
+ start: moment__default['default'](plain.start_time).toDate(),
72
72
  uuid: plain.uuid,
73
73
  });
74
74
  }
@@ -166,7 +166,7 @@ class CallLog {
166
166
 
167
167
  static parse(plain ) {
168
168
  return new CallLog({
169
- answer: plain.answer ? moment__default["default"](plain.answer).toDate() : null,
169
+ answer: plain.answer ? moment__default['default'](plain.answer).toDate() : null,
170
170
  answered: plain.answered,
171
171
  callDirection: plain.call_direction,
172
172
  destination: {
@@ -183,9 +183,9 @@ class CallLog {
183
183
  },
184
184
  id: plain.id,
185
185
  duration: (plain.duration || 0) * 1000, // duration is in seconds
186
- start: moment__default["default"](plain.start).toDate(),
187
- end: plain.end ? moment__default["default"](plain.end).toDate() : null,
188
- recordings: Recording.parseMany(plain.recordings),
186
+ start: moment__default['default'](plain.start).toDate(),
187
+ end: plain.end ? moment__default['default'](plain.end).toDate() : null,
188
+ recordings: Recording.parseMany(plain.recordings || []),
189
189
  });
190
190
  }
191
191
 
@@ -317,7 +317,7 @@ describe('CallLog domain', () => {
317
317
  filtered: 6,
318
318
  items: [
319
319
  {
320
- answer: moment__default["default"]('2017-08-07T13:51:18.892002+00:00').toDate(),
320
+ answer: moment__default['default']('2017-08-07T13:51:18.892002+00:00').toDate(),
321
321
  answered: true,
322
322
  call_direction: 'outbound',
323
323
  source_extension: '8020',
@@ -348,7 +348,7 @@ describe('CallLog domain', () => {
348
348
 
349
349
  expect(logs).toEqual([
350
350
  new CallLog({
351
- answer: moment__default["default"]('2017-08-07T13:51:18.892002+00:00').toDate(),
351
+ answer: moment__default['default']('2017-08-07T13:51:18.892002+00:00').toDate(),
352
352
  answered: true,
353
353
  callDirection: 'outbound',
354
354
  destination: {
@@ -361,14 +361,14 @@ describe('CallLog domain', () => {
361
361
  },
362
362
  id: 215,
363
363
  duration: 4000,
364
- start: moment__default["default"]('2017-08-06T13:50:55.819057+00:00').toDate(),
365
- end: moment__default["default"]('2017-08-08T13:51:23.822529+00:00').toDate(),
364
+ start: moment__default['default']('2017-08-06T13:50:55.819057+00:00').toDate(),
365
+ end: moment__default['default']('2017-08-08T13:51:23.822529+00:00').toDate(),
366
366
  recordings: [
367
367
  new Recording({
368
368
  deleted: false,
369
- end: moment__default["default"]('2021-08-11T13:22:50.519733+00:00').toDate(),
369
+ end: moment__default['default']('2021-08-11T13:22:50.519733+00:00').toDate(),
370
370
  fileName: '2021-08-11T13_22_45UTC-61886-xxxx-5c72-4072-8503-e3ad9a41c0a0.wav',
371
- start: moment__default["default"]('2021-08-11T13:22:45.161954+00:00').toDate(),
371
+ start: moment__default['default']('2021-08-11T13:22:45.161954+00:00').toDate(),
372
372
  uuid: '0394ad6f-5c72-4072-8503-e3ad9a41c0a0',
373
373
  }),
374
374
  ],
@@ -66,7 +66,7 @@ class Voicemail {
66
66
  static parse(plain ) {
67
67
  return new Voicemail({
68
68
  id: plain.id,
69
- date: moment__default["default"](plain.timestamp * 1000).toDate(),
69
+ date: moment__default['default'](plain.timestamp * 1000).toDate(),
70
70
  duration: plain.duration * 1000,
71
71
  caller: {
72
72
  name: plain.caller_id_name,
package/lib/index.js CHANGED
@@ -161,6 +161,7 @@ class IssueReporter {
161
161
 
162
162
 
163
163
 
164
+
164
165
 
165
166
  constructor() {
166
167
  addLevelsTo(this);
@@ -172,12 +173,17 @@ class IssueReporter {
172
173
  this.bufferTimeout = null;
173
174
  this._boundProcessBuffer = this._processBuffer.bind(this);
174
175
  this._boundParseLoggerBody = this._parseLoggerBody.bind(this);
176
+ this._callback = null;
175
177
  }
176
178
 
177
179
  init() {
178
180
  this._catchConsole();
179
181
  }
180
182
 
183
+ setCallback(cb ) {
184
+ this._callback = cb;
185
+ }
186
+
181
187
  configureRemoteClient(configuration = { tag: 'wazo-sdk', host: null, port: null, level: null, extra: {} }) {
182
188
  this.remoteClientConfiguration = configuration;
183
189
  }
@@ -213,6 +219,7 @@ class IssueReporter {
213
219
 
214
220
  // Handle category label
215
221
  let category = null;
222
+ let skipSendToRemote = false;
216
223
  let extra = {};
217
224
  if (args[0].indexOf(CATEGORY_PREFIX) === 0) {
218
225
  category = args[0].split('=')[1];
@@ -228,6 +235,7 @@ class IssueReporter {
228
235
  errorMessage: lastArg.message,
229
236
  errorStack: lastArg.stack,
230
237
  errorType: lastArg.constructor.name,
238
+ skipSendToRemote: lastArg.skipSendToRemote,
231
239
  };
232
240
  } else {
233
241
  extra = lastArg;
@@ -236,7 +244,12 @@ class IssueReporter {
236
244
  args.splice(1, 1);
237
245
  }
238
246
 
239
- const date = moment__default["default"]().format('YYYY-MM-DD HH:mm:ss.SSS');
247
+ if (extra.skipSendToRemote) {
248
+ skipSendToRemote = true;
249
+ delete extra.skipSendToRemote;
250
+ }
251
+
252
+ const date = moment__default['default']().format('YYYY-MM-DD HH:mm:ss.SSS');
240
253
  const message = args.join(', ');
241
254
  let consoleMessage = message;
242
255
 
@@ -256,7 +269,13 @@ class IssueReporter {
256
269
  const oldMethod = this.oldConsoleMethods[consoleLevel] || this.oldConsoleMethods.log;
257
270
  oldMethod.apply(oldMethod, [date, consoleMessage]);
258
271
 
259
- this._sendToRemoteLogger(level, { date, message, category, ...extra });
272
+ if (this._callback) {
273
+ this._callback(level, consoleMessage);
274
+ }
275
+
276
+ if (!skipSendToRemote) {
277
+ this._sendToRemoteLogger(level, { date, message, category, ...extra });
278
+ }
260
279
  }
261
280
 
262
281
  logRequest(url , options , response , start ) {
@@ -401,7 +420,11 @@ class IssueReporter {
401
420
  },
402
421
  // $FlowFixMe
403
422
  body,
404
- }).catch(() => {
423
+ }).catch((e ) => {
424
+ // $FlowFixMe
425
+ e.skipSendToRemote = true;
426
+ this.log('error', this._makeCategory('grafana'), 'Sending log to grafana, error', e);
427
+
405
428
  setTimeout(() => {
406
429
  if (isArray) {
407
430
  payload = payload.map(message => {
@@ -413,7 +436,7 @@ class IssueReporter {
413
436
  payload._retry = retry + 1;
414
437
  }
415
438
 
416
- this._sendDebugToGrafana(body, retry + 1);
439
+ this._sendDebugToGrafana(payload, retry + 1);
417
440
  }, 5000 + retry * 1000);
418
441
  });
419
442
  }
@@ -2616,7 +2639,8 @@ class ExternalApp {
2616
2639
 
2617
2640
 
2618
2641
 
2619
-
2642
+
2643
+
2620
2644
 
2621
2645
 
2622
2646
  class Meeting {
@@ -2628,6 +2652,7 @@ class Meeting {
2628
2652
 
2629
2653
 
2630
2654
 
2655
+
2631
2656
 
2632
2657
 
2633
2658
  static parse(plain ) {
@@ -2639,14 +2664,28 @@ class Meeting {
2639
2664
  port: plain.port,
2640
2665
  uuid: plain.uuid,
2641
2666
  number: plain.number,
2667
+ persistent: plain.persistent,
2642
2668
  });
2643
2669
  }
2644
2670
 
2671
+ static parseMany(items ) {
2672
+ return items.map(plain => Meeting.parse(plain));
2673
+ }
2674
+
2645
2675
  static newFrom(meeting ) {
2646
2676
  return newFrom(meeting, Meeting);
2647
2677
  }
2648
2678
 
2649
- constructor({ uuid, name, guestSipAuthorization, ownerUuids, port, uri, number } = {}) {
2679
+ constructor({
2680
+ uuid,
2681
+ name,
2682
+ guestSipAuthorization,
2683
+ ownerUuids,
2684
+ port,
2685
+ uri,
2686
+ number,
2687
+ persistent,
2688
+ } = {}) {
2650
2689
  this.guestSipAuthorization = guestSipAuthorization;
2651
2690
  this.uri = uri;
2652
2691
  this.name = name;
@@ -2654,6 +2693,7 @@ class Meeting {
2654
2693
  this.port = port;
2655
2694
  this.uuid = uuid;
2656
2695
  this.number = number;
2696
+ this.persistent = persistent;
2657
2697
 
2658
2698
  // Useful to compare instead of instanceof with minified code
2659
2699
  this.type = 'Meeting';
@@ -2731,8 +2771,11 @@ var confdMethods = (client , baseUrl ) => ({
2731
2771
  }
2732
2772
  },
2733
2773
 
2734
- createMyMeeting: (name ) =>
2735
- client.post(`${baseUrl}/users/me/meetings`, { name }).then(Meeting.parse),
2774
+ getMyMeetings: () =>
2775
+ client.get(`${baseUrl}/users/me/meetings`).then(response => Meeting.parseMany(response.items)),
2776
+
2777
+ createMyMeeting: (name , persistent ) =>
2778
+ client.post(`${baseUrl}/users/me/meetings`, { name, persistent }).then(Meeting.parse),
2736
2779
 
2737
2780
  deleteMyMeeting: (meetingUuid ) =>
2738
2781
  client.delete(`${baseUrl}/users/me/meetings/${meetingUuid}`, null),
@@ -2834,7 +2877,7 @@ class ChatMessage {
2834
2877
  static parse(plain ) {
2835
2878
  return new ChatMessage({
2836
2879
  uuid: plain.uuid,
2837
- date: moment__default["default"](plain.created_at).toDate(),
2880
+ date: moment__default['default'](plain.created_at).toDate(),
2838
2881
  content: plain.content,
2839
2882
  alias: plain.alias,
2840
2883
  userUuid: plain.user_uuid,
@@ -2926,7 +2969,7 @@ class Voicemail {
2926
2969
  static parse(plain ) {
2927
2970
  return new Voicemail({
2928
2971
  id: plain.id,
2929
- date: moment__default["default"](plain.timestamp * 1000).toDate(),
2972
+ date: moment__default['default'](plain.timestamp * 1000).toDate(),
2930
2973
  duration: plain.duration * 1000,
2931
2974
  caller: {
2932
2975
  name: plain.caller_id_name,
@@ -3063,7 +3106,7 @@ class Call {
3063
3106
  onHold: plain.on_hold,
3064
3107
  status: plain.status,
3065
3108
  lineId: plain.line_id,
3066
- startingTime: moment__default["default"](plain.creation_time).toDate(),
3109
+ startingTime: moment__default['default'](plain.creation_time).toDate(),
3067
3110
  talkingToIds: Object.keys(plain.talking_to || {}),
3068
3111
  recording: plain.record_state === RECORD_STATE_ACTIVE,
3069
3112
  });
@@ -3543,7 +3586,7 @@ class Emitter {
3543
3586
 
3544
3587
 
3545
3588
  constructor() {
3546
- this.eventEmitter = new EventEmitter__default["default"]();
3589
+ this.eventEmitter = new EventEmitter__default['default']();
3547
3590
  }
3548
3591
 
3549
3592
  on(event , callback ) {
@@ -3588,7 +3631,7 @@ class Recording {
3588
3631
 
3589
3632
 
3590
3633
 
3591
- static parseMany(recordings ) {
3634
+ static parseMany(recordings = []) {
3592
3635
  return recordings.map(item => Recording.parse(item));
3593
3636
  }
3594
3637
 
@@ -3596,8 +3639,8 @@ class Recording {
3596
3639
  return new Recording({
3597
3640
  deleted: plain.deleted,
3598
3641
  fileName: plain.filename,
3599
- end: plain.end_time ? moment__default["default"](plain.end_time).toDate() : null,
3600
- start: moment__default["default"](plain.start_time).toDate(),
3642
+ end: plain.end_time ? moment__default['default'](plain.end_time).toDate() : null,
3643
+ start: moment__default['default'](plain.start_time).toDate(),
3601
3644
  uuid: plain.uuid,
3602
3645
  });
3603
3646
  }
@@ -3695,7 +3738,7 @@ class CallLog {
3695
3738
 
3696
3739
  static parse(plain ) {
3697
3740
  return new CallLog({
3698
- answer: plain.answer ? moment__default["default"](plain.answer).toDate() : null,
3741
+ answer: plain.answer ? moment__default['default'](plain.answer).toDate() : null,
3699
3742
  answered: plain.answered,
3700
3743
  callDirection: plain.call_direction,
3701
3744
  destination: {
@@ -3712,9 +3755,9 @@ class CallLog {
3712
3755
  },
3713
3756
  id: plain.id,
3714
3757
  duration: (plain.duration || 0) * 1000, // duration is in seconds
3715
- start: moment__default["default"](plain.start).toDate(),
3716
- end: plain.end ? moment__default["default"](plain.end).toDate() : null,
3717
- recordings: Recording.parseMany(plain.recordings),
3758
+ start: moment__default['default'](plain.start).toDate(),
3759
+ end: plain.end ? moment__default['default'](plain.end).toDate() : null,
3760
+ recordings: Recording.parseMany(plain.recordings || []),
3718
3761
  });
3719
3762
  }
3720
3763
 
@@ -5449,7 +5492,7 @@ const parseCandidate$1 = (candidate ) => {
5449
5492
  if (!candidate) {
5450
5493
  return null;
5451
5494
  }
5452
- const result = sdpParser__default["default"].parse(candidate.indexOf('a=') === 0 ? candidate : `a=${candidate}`);
5495
+ const result = sdpParser__default['default'].parse(candidate.indexOf('a=') === 0 ? candidate : `a=${candidate}`);
5453
5496
 
5454
5497
  return result.candidates ? result.candidates[0] : null;
5455
5498
  };
@@ -5463,7 +5506,7 @@ const areCandidateValid = (candidates ) =>
5463
5506
  .length > 0;
5464
5507
 
5465
5508
  const getVideoDirection = (sdp ) => {
5466
- const parsedSdp = sdpParser__default["default"].parse(sdp);
5509
+ const parsedSdp = sdpParser__default['default'].parse(sdp);
5467
5510
  const videoMedia = parsedSdp.media.find(media => media.type === 'video');
5468
5511
  if (!videoMedia) {
5469
5512
  return null;
@@ -5477,14 +5520,14 @@ const hasAnActiveVideo = (sdp ) => {
5477
5520
  return false;
5478
5521
  }
5479
5522
 
5480
- const parsedSdp = sdpParser__default["default"].parse(sdp);
5523
+ const parsedSdp = sdpParser__default['default'].parse(sdp);
5481
5524
 
5482
5525
  return !!parsedSdp.media.find(media =>
5483
5526
  media.type === 'video' && media.port > 10 && (!media.direction || media.direction !== 'inactive'));
5484
5527
  };
5485
5528
 
5486
5529
  const fixSdp = (sdp , candidates , forcePort = true) => {
5487
- const parsedSdp = sdpParser__default["default"].parse(sdp);
5530
+ const parsedSdp = sdpParser__default['default'].parse(sdp);
5488
5531
  const mainCandidate = getSrflxOrRelay(candidates)[0];
5489
5532
  const ip = mainCandidate ? mainCandidate.ip : null;
5490
5533
 
@@ -5502,7 +5545,7 @@ const fixSdp = (sdp , candidates , forcePort = true)
5502
5545
  };
5503
5546
  });
5504
5547
 
5505
- let fixed = sdpParser__default["default"].write(parsedSdp);
5548
+ let fixed = sdpParser__default['default'].write(parsedSdp);
5506
5549
 
5507
5550
  if (ip) {
5508
5551
  fixed = fixed.replace(/IN IP4 0.0.0.0/g, `IN IP4 ${ip}`);
@@ -5548,7 +5591,7 @@ class WazoSessionDescriptionHandler extends sessionDescriptionHandler.SessionDes
5548
5591
  ) {
5549
5592
  super(logger, mediaStreamFactory, sessionDescriptionHandlerConfiguration);
5550
5593
 
5551
- this.eventEmitter = new EventEmitter__default["default"]();
5594
+ this.eventEmitter = new EventEmitter__default['default']();
5552
5595
  this.isWeb = isWeb;
5553
5596
  this.session = session;
5554
5597
  }
@@ -6529,7 +6572,9 @@ class WebRTCClient extends Emitter {
6529
6572
  const inviteOptions = {
6530
6573
  requestDelegate: {
6531
6574
  onAccept: (response ) => {
6532
- session.sessionDescriptionHandler.peerConnection.sfu = conference;
6575
+ if (session.sessionDescriptionHandler.peerConnection) {
6576
+ session.sessionDescriptionHandler.peerConnection.sfu = conference;
6577
+ }
6533
6578
  this._onAccepted(session, response.session, true);
6534
6579
  },
6535
6580
  onReject: (response ) => {
@@ -6865,7 +6910,7 @@ class WebRTCClient extends Emitter {
6865
6910
  // We search for the last transceiver without `video-` in the mid (video- means remote transceiver)
6866
6911
  const transceivers = pc.getTransceivers();
6867
6912
  const transceiverIdx = lastIndexOf(transceivers, transceiver =>
6868
- transceiver.sender.track === null && transceiver.mid.indexOf('video') === -1);
6913
+ transceiver.sender.track === null && transceiver.mid && transceiver.mid.indexOf('video') === -1);
6869
6914
 
6870
6915
  videoSender = transceiverIdx !== -1 ? transceivers[transceiverIdx].sender : null;
6871
6916
  } else {
@@ -7401,6 +7446,16 @@ class WebRTCClient extends Emitter {
7401
7446
  return this.hasRemoteVideo(sessionId) ? this.getRemoteStream(sessionId) : null;
7402
7447
  }
7403
7448
 
7449
+ // Useful in a react-native environment when remoteMediaStream is not updated
7450
+ getRemoteVideoStreamFromPc(sessionId ) {
7451
+ const pc = this.getPeerConnection(sessionId);
7452
+ if (!pc) {
7453
+ return null;
7454
+ }
7455
+
7456
+ return pc.getRemoteStreams().find(stream => !!stream.getVideoTracks().length);
7457
+ }
7458
+
7404
7459
  hasVideo(sessionId ) {
7405
7460
  return this.hasLocalVideo(sessionId) || this.hasRemoteVideo(sessionId);
7406
7461
  }
@@ -7911,6 +7966,7 @@ class WebRTCClient extends Emitter {
7911
7966
  session.sessionDescriptionHandler.remoteMediaStream.onaddtrack = onTrack;
7912
7967
 
7913
7968
  pc.oniceconnectionstatechange = () => {
7969
+ logger$9.info('on ice connection state changed', { state: pc.iceConnectionState });
7914
7970
  if (pc.iceConnectionState === 'disconnected') {
7915
7971
  this.eventEmitter.emit(ON_DISCONNECTED$1);
7916
7972
  }
@@ -8070,7 +8126,7 @@ class WebRTCClient extends Emitter {
8070
8126
  }
8071
8127
  const sessionId = this.getSipSessionId(session);
8072
8128
 
8073
- getStats__default["default"](pc, (result ) => {
8129
+ getStats__default['default'](pc, (result ) => {
8074
8130
  const { results, internal, nomore, ...stats } = result;
8075
8131
  this.statsIntervals[sessionId] = nomore;
8076
8132
 
@@ -8179,18 +8235,22 @@ class WebRTCClient extends Emitter {
8179
8235
  });
8180
8236
 
8181
8237
  networkStats.packetsLost = packetsLost;
8182
- networkStats.audioBytesSent = audioBytesSent;
8238
+ networkStats.totalAudioBytesSent = audioBytesSent;
8239
+ networkStats.audioBytesSent = audioBytesSent - lastAudioSent;
8240
+ networkStats.totalAudioBytesReceived = audioBytesReceived - lastAudioReceived;
8183
8241
  networkStats.audioBytesReceived = audioBytesReceived;
8184
- networkStats.videoBytesSent = videoBytesSent;
8185
- networkStats.videoBytesReceived = videoBytesReceived;
8242
+ networkStats.totalVideoBytesSent = videoBytesSent;
8243
+ networkStats.videoBytesSent = videoBytesSent - lastVideoSent;
8244
+ networkStats.totalVideoBytesReceived = videoBytesReceived;
8245
+ networkStats.videoBytesReceived = videoBytesReceived - lastVideoReceived;
8246
+ networkStats.totalTransportSent = transportSent - lastTransportSent;
8186
8247
  networkStats.transportSent = transportSent;
8187
- networkStats.transportReceived = transportReceived;
8188
-
8189
- const bandwidth = (networkStats.audioBytesSent - lastAudioSent) + (networkStats.videoBytesSent - lastVideoSent)
8190
- + (networkStats.audioBytesReceived - lastAudioReceived) + (networkStats.videoBytesReceived - lastVideoReceived)
8191
- + (networkStats.transportReceived - lastTransportReceived) + (networkStats.transportSent - lastTransportSent);
8248
+ networkStats.totalTransportReceived = transportReceived;
8249
+ networkStats.transportReceived = transportReceived - lastTransportReceived;
8192
8250
 
8193
- networkStats.bandwidth = bandwidth;
8251
+ networkStats.bandwidth = networkStats.audioBytesSent + networkStats.audioBytesReceived
8252
+ + networkStats.videoBytesSent + networkStats.videoBytesReceived + networkStats.transportReceived
8253
+ + networkStats.transportSent;
8194
8254
 
8195
8255
  this.eventEmitter.emit(ON_NETWORK_STATS$1, session, networkStats, this.sessionNetworkStats[sessionId]);
8196
8256
  this.sessionNetworkStats[sessionId].push(networkStats);
@@ -8286,6 +8346,7 @@ const AGENT_PAUSED = 'agent_paused';
8286
8346
  const AGENT_UNPAUSED = 'agent_unpaused';
8287
8347
  const CONFERENCE_ADHOC_PARTICIPANT_LEFT = 'conference_adhoc_participant_left';
8288
8348
  const CONFERENCE_ADHOC_DELETED = 'conference_adhoc_deleted';
8349
+ const MEETING_USER_PROGRESS = 'meeting_user_progress';
8289
8350
 
8290
8351
  const BLACKLIST_EVENTS = [
8291
8352
  CHAT_MESSAGE_SENT,
@@ -8345,7 +8406,7 @@ class WebSocketClient extends Emitter {
8345
8406
 
8346
8407
  connect() {
8347
8408
  logger$8.info('connect method started', { host: this.host, token: this.token });
8348
- this.socket = new ReconnectingWebSocket__default["default"](this._getUrl.bind(this), [], this.options);
8409
+ this.socket = new ReconnectingWebSocket__default['default'](this._getUrl.bind(this), [], this.options);
8349
8410
  if (this.options.binaryType) {
8350
8411
  this.socket.binaryType = this.options.binaryType;
8351
8412
  }
@@ -8636,6 +8697,7 @@ WebSocketClient.eventLists = [
8636
8697
  AGENT_UNPAUSED,
8637
8698
  CONFERENCE_ADHOC_PARTICIPANT_LEFT,
8638
8699
  CONFERENCE_ADHOC_DELETED,
8700
+ MEETING_USER_PROGRESS,
8639
8701
  ];
8640
8702
 
8641
8703
  var WebSocketClient$1 = /*#__PURE__*/Object.freeze({
@@ -8706,6 +8768,7 @@ var WebSocketClient$1 = /*#__PURE__*/Object.freeze({
8706
8768
  AGENT_UNPAUSED: AGENT_UNPAUSED,
8707
8769
  CONFERENCE_ADHOC_PARTICIPANT_LEFT: CONFERENCE_ADHOC_PARTICIPANT_LEFT,
8708
8770
  CONFERENCE_ADHOC_DELETED: CONFERENCE_ADHOC_DELETED,
8771
+ MEETING_USER_PROGRESS: MEETING_USER_PROGRESS,
8709
8772
  HEARTBEAT_ENGINE_VERSION: HEARTBEAT_ENGINE_VERSION,
8710
8773
  'default': WebSocketClient
8711
8774
  });
@@ -9462,7 +9525,10 @@ class WebRTCPhone extends Emitter {
9462
9525
 
9463
9526
  onCancel(message);
9464
9527
  const elsewhere = message.data.indexOf('cause=26') !== -1 && message.data.indexOf('completed elsewhere') !== -1;
9465
- this.eventEmitter.emit(ON_CALL_CANCELED, this._createCallSession(sipSession), elsewhere);
9528
+ const callSession = this._createCallSession(sipSession);
9529
+ delete this.callSessions[callSession.getId()];
9530
+
9531
+ this.eventEmitter.emit(ON_CALL_CANCELED, callSession, elsewhere);
9466
9532
  };
9467
9533
  } else if (sipSession instanceof invitation.Invitation) {
9468
9534
  console.warn('sipSession._onCancel not found, please update the wazo SDK accordingly');
@@ -9491,9 +9557,11 @@ class WebRTCPhone extends Emitter {
9491
9557
  case sessionState.SessionState.Terminated: {
9492
9558
  logger$7.info('WebRTC phone - call terminated', { sipId: sipSession.id });
9493
9559
 
9560
+ // Should be called before `_onCallTerminated` or the callCount will not decrement...
9561
+ const callSession = this._createCallSession(sipSession);
9494
9562
  const wasCurrentSession = this._onCallTerminated(sipSession);
9495
9563
 
9496
- return this.eventEmitter.emit(ON_CALL_ENDED, this._createCallSession(sipSession), wasCurrentSession);
9564
+ return this.eventEmitter.emit(ON_CALL_ENDED, callSession, wasCurrentSession);
9497
9565
  }
9498
9566
  }
9499
9567
  });
@@ -10441,6 +10509,10 @@ class WebRTCPhone extends Emitter {
10441
10509
  return callSession ? this.client.getRemoteVideoStream(callSession.sipCallId) : null;
10442
10510
  }
10443
10511
 
10512
+ getRemoteVideoStreamFromPc(callSession ) {
10513
+ return callSession ? this.client.getRemoteVideoStreamFromPc(callSession.sipCallId) : null;
10514
+ }
10515
+
10444
10516
  hasRemoteVideo(callSession ) {
10445
10517
  return callSession ? this.client.hasRemoteVideo(callSession.sipCallId) : false;
10446
10518
  }
@@ -11317,8 +11389,8 @@ class Checker {
11317
11389
 
11318
11390
  //
11319
11391
 
11320
- const PhoneNumberUtil = LibPhoneNumber__default["default"].PhoneNumberUtil.getInstance();
11321
- const { PhoneNumberFormat, AsYouTypeFormatter } = LibPhoneNumber__default["default"];
11392
+ const PhoneNumberUtil = LibPhoneNumber__default['default'].PhoneNumberUtil.getInstance();
11393
+ const { PhoneNumberFormat, AsYouTypeFormatter } = LibPhoneNumber__default['default'];
11322
11394
 
11323
11395
  // eslint-disable-next-line
11324
11396
  const EXTRA_CHAR_REGEXP = /[^+*\d]/g;
@@ -12159,6 +12231,11 @@ class Phone extends Emitter {
12159
12231
  return this.getRemoteVideoStream(callSession);
12160
12232
  }
12161
12233
 
12234
+ // Useful in a react-native environment when remoteMediaStream is not updated
12235
+ getRemoteVideoStreamFromPc(callSession ) {
12236
+ return this.phone ? this.phone.getRemoteVideoStreamFromPc(callSession) : false;
12237
+ }
12238
+
12162
12239
  hasVideo(callSession ) {
12163
12240
  return this.phone ? this.phone.hasVideo(callSession) : false;
12164
12241
  }
@@ -13118,7 +13195,7 @@ class Room extends Emitter {
13118
13195
  }
13119
13196
 
13120
13197
  _mapMsid(rawSdp ) {
13121
- const sdp = sdpParser__default["default"].parse(rawSdp);
13198
+ const sdp = sdpParser__default['default'].parse(rawSdp);
13122
13199
  const labelMsidArray = sdp.media.filter(media => !!media.label).map(({ label, msid }) => ({
13123
13200
  label: String(label),
13124
13201
  streamId: msid.split(' ')[0],