@wazo/sdk 0.37.20 → 0.37.21

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 (110) hide show
  1. package/dist/wazo-sdk.js +5 -5
  2. package/esm/__tests__/api-client.test.js +44 -5
  3. package/esm/__tests__/web-rtc-client.test.js +70 -15
  4. package/esm/api/agentd.js +25 -2
  5. package/esm/api/amid.js +25 -2
  6. package/esm/api/application.js +25 -2
  7. package/esm/api/auth.js +25 -2
  8. package/esm/api/call-logd.js +25 -2
  9. package/esm/api/calld.js +25 -2
  10. package/esm/api/chatd.js +25 -2
  11. package/esm/api/confd.js +44 -5
  12. package/esm/api/ctid-ng.js +25 -2
  13. package/esm/api/dird.js +25 -2
  14. package/esm/api/webhookd.js +25 -2
  15. package/esm/api-client.js +44 -5
  16. package/esm/checker/Checker.js +72 -15
  17. package/esm/checker/checks/aor.js +44 -5
  18. package/esm/checker/checks/api.js +44 -5
  19. package/esm/checker/checks/index.js +72 -15
  20. package/esm/checker/checks/wazo-websocket.js +27 -2
  21. package/esm/checker/checks/webrtc-transport.js +70 -15
  22. package/esm/checker/checks/webrtc.js +70 -15
  23. package/esm/domain/AdHocAPIConference.js +44 -5
  24. package/esm/domain/Features.js +44 -5
  25. package/esm/domain/Meeting.js +14 -1
  26. package/esm/domain/Phone/CTIPhone.js +44 -5
  27. package/esm/domain/Phone/WebRTCPhone.js +32 -3
  28. package/esm/index.js +85 -16
  29. package/esm/lib/WazoSessionDescriptionHandler.js +25 -2
  30. package/esm/service/CallApi.js +44 -5
  31. package/esm/service/IssueReporter.js +25 -2
  32. package/esm/service/__tests__/IssueReporter.test.js +25 -2
  33. package/esm/service/getApiClient.js +44 -5
  34. package/esm/simple/Auth.js +85 -16
  35. package/esm/simple/Configuration.js +85 -16
  36. package/esm/simple/Directory.js +44 -5
  37. package/esm/simple/Phone.js +85 -16
  38. package/esm/simple/Websocket.js +28 -2
  39. package/esm/simple/index.js +85 -16
  40. package/esm/simple/room/LocalParticipant.js +85 -16
  41. package/esm/simple/room/Participant.js +85 -16
  42. package/esm/simple/room/RemoteParticipant.js +85 -16
  43. package/esm/simple/room/Room.js +85 -16
  44. package/esm/simple/room/SipRoom.js +85 -16
  45. package/esm/simple/room/Stream.js +85 -16
  46. package/esm/simple/room/__tests__/RemoteParticipant.test.js +85 -16
  47. package/esm/simple/utils.js +85 -16
  48. package/esm/utils/__tests__/api-requester.test.js +25 -2
  49. package/esm/utils/api-requester.js +25 -2
  50. package/esm/web-rtc-client.js +70 -15
  51. package/esm/websocket-client.js +28 -3
  52. package/lib/__tests__/api-client.test.js +44 -5
  53. package/lib/__tests__/web-rtc-client.test.js +70 -15
  54. package/lib/api/agentd.js +25 -2
  55. package/lib/api/amid.js +25 -2
  56. package/lib/api/application.js +25 -2
  57. package/lib/api/auth.js +25 -2
  58. package/lib/api/call-logd.js +25 -2
  59. package/lib/api/calld.js +25 -2
  60. package/lib/api/chatd.js +25 -2
  61. package/lib/api/confd.js +44 -5
  62. package/lib/api/ctid-ng.js +25 -2
  63. package/lib/api/dird.js +25 -2
  64. package/lib/api/webhookd.js +25 -2
  65. package/lib/api-client.js +44 -5
  66. package/lib/checker/Checker.js +72 -15
  67. package/lib/checker/checks/aor.js +44 -5
  68. package/lib/checker/checks/api.js +44 -5
  69. package/lib/checker/checks/index.js +72 -15
  70. package/lib/checker/checks/wazo-websocket.js +27 -2
  71. package/lib/checker/checks/webrtc-transport.js +70 -15
  72. package/lib/checker/checks/webrtc.js +70 -15
  73. package/lib/domain/AdHocAPIConference.js +44 -5
  74. package/lib/domain/Features.js +44 -5
  75. package/lib/domain/Meeting.js +14 -1
  76. package/lib/domain/Phone/CTIPhone.js +44 -5
  77. package/lib/domain/Phone/WebRTCPhone.js +32 -3
  78. package/lib/index.js +85 -16
  79. package/lib/lib/WazoSessionDescriptionHandler.js +25 -2
  80. package/lib/service/CallApi.js +44 -5
  81. package/lib/service/IssueReporter.js +25 -2
  82. package/lib/service/__tests__/IssueReporter.test.js +25 -2
  83. package/lib/service/getApiClient.js +44 -5
  84. package/lib/simple/Auth.js +85 -16
  85. package/lib/simple/Configuration.js +85 -16
  86. package/lib/simple/Directory.js +44 -5
  87. package/lib/simple/Phone.js +85 -16
  88. package/lib/simple/Websocket.js +28 -2
  89. package/lib/simple/index.js +85 -16
  90. package/lib/simple/room/LocalParticipant.js +85 -16
  91. package/lib/simple/room/Participant.js +85 -16
  92. package/lib/simple/room/RemoteParticipant.js +85 -16
  93. package/lib/simple/room/Room.js +85 -16
  94. package/lib/simple/room/SipRoom.js +85 -16
  95. package/lib/simple/room/Stream.js +85 -16
  96. package/lib/simple/room/__tests__/RemoteParticipant.test.js +85 -16
  97. package/lib/simple/utils.js +85 -16
  98. package/lib/utils/__tests__/api-requester.test.js +25 -2
  99. package/lib/utils/api-requester.js +25 -2
  100. package/lib/web-rtc-client.js +70 -15
  101. package/lib/websocket-client.js +28 -2
  102. package/package.json +1 -1
  103. package/src/api/confd.js +5 -2
  104. package/src/domain/Meeting.js +14 -1
  105. package/src/domain/Phone/WebRTCPhone.js +7 -1
  106. package/src/service/IssueReporter.js +25 -2
  107. package/src/simple/Phone.js +5 -0
  108. package/src/types/WebSocketMessage.js +5 -1
  109. package/src/web-rtc-client.js +26 -10
  110. package/src/websocket-client.js +2 -0
@@ -148,6 +148,7 @@ class IssueReporter {
148
148
 
149
149
 
150
150
 
151
+
151
152
 
152
153
  constructor() {
153
154
  addLevelsTo(this);
@@ -159,12 +160,17 @@ class IssueReporter {
159
160
  this.bufferTimeout = null;
160
161
  this._boundProcessBuffer = this._processBuffer.bind(this);
161
162
  this._boundParseLoggerBody = this._parseLoggerBody.bind(this);
163
+ this._callback = null;
162
164
  }
163
165
 
164
166
  init() {
165
167
  this._catchConsole();
166
168
  }
167
169
 
170
+ setCallback(cb ) {
171
+ this._callback = cb;
172
+ }
173
+
168
174
  configureRemoteClient(configuration = { tag: 'wazo-sdk', host: null, port: null, level: null, extra: {} }) {
169
175
  this.remoteClientConfiguration = configuration;
170
176
  }
@@ -200,6 +206,7 @@ class IssueReporter {
200
206
 
201
207
  // Handle category label
202
208
  let category = null;
209
+ let skipSendToRemote = false;
203
210
  let extra = {};
204
211
  if (args[0].indexOf(CATEGORY_PREFIX) === 0) {
205
212
  category = args[0].split('=')[1];
@@ -215,6 +222,7 @@ class IssueReporter {
215
222
  errorMessage: lastArg.message,
216
223
  errorStack: lastArg.stack,
217
224
  errorType: lastArg.constructor.name,
225
+ skipSendToRemote: lastArg.skipSendToRemote,
218
226
  };
219
227
  } else {
220
228
  extra = lastArg;
@@ -223,6 +231,11 @@ class IssueReporter {
223
231
  args.splice(1, 1);
224
232
  }
225
233
 
234
+ if (extra.skipSendToRemote) {
235
+ skipSendToRemote = true;
236
+ delete extra.skipSendToRemote;
237
+ }
238
+
226
239
  const date = moment().format('YYYY-MM-DD HH:mm:ss.SSS');
227
240
  const message = args.join(', ');
228
241
  let consoleMessage = message;
@@ -243,7 +256,13 @@ class IssueReporter {
243
256
  const oldMethod = this.oldConsoleMethods[consoleLevel] || this.oldConsoleMethods.log;
244
257
  oldMethod.apply(oldMethod, [date, consoleMessage]);
245
258
 
246
- this._sendToRemoteLogger(level, { date, message, category, ...extra });
259
+ if (this._callback) {
260
+ this._callback(level, consoleMessage);
261
+ }
262
+
263
+ if (!skipSendToRemote) {
264
+ this._sendToRemoteLogger(level, { date, message, category, ...extra });
265
+ }
247
266
  }
248
267
 
249
268
  logRequest(url , options , response , start ) {
@@ -388,7 +407,11 @@ class IssueReporter {
388
407
  },
389
408
  // $FlowFixMe
390
409
  body,
391
- }).catch(() => {
410
+ }).catch((e ) => {
411
+ // $FlowFixMe
412
+ e.skipSendToRemote = true;
413
+ this.log('error', this._makeCategory('grafana'), 'Sending log to grafana, error', e);
414
+
392
415
  setTimeout(() => {
393
416
  if (isArray) {
394
417
  payload = payload.map(message => {
@@ -2632,11 +2655,24 @@ class Meeting {
2632
2655
  });
2633
2656
  }
2634
2657
 
2658
+ static parseMany(items ) {
2659
+ return items.map(plain => Meeting.parse(plain));
2660
+ }
2661
+
2635
2662
  static newFrom(meeting ) {
2636
2663
  return newFrom(meeting, Meeting);
2637
2664
  }
2638
2665
 
2639
- constructor({ uuid, name, guestSipAuthorization, ownerUuids, port, uri, number, persistent } = {}) {
2666
+ constructor({
2667
+ uuid,
2668
+ name,
2669
+ guestSipAuthorization,
2670
+ ownerUuids,
2671
+ port,
2672
+ uri,
2673
+ number,
2674
+ persistent,
2675
+ } = {}) {
2640
2676
  this.guestSipAuthorization = guestSipAuthorization;
2641
2677
  this.uri = uri;
2642
2678
  this.name = name;
@@ -2722,8 +2758,11 @@ var confdMethods = (client , baseUrl ) => ({
2722
2758
  }
2723
2759
  },
2724
2760
 
2725
- createMyMeeting: (name ) =>
2726
- client.post(`${baseUrl}/users/me/meetings`, { name }).then(Meeting.parse),
2761
+ getMyMeetings: () =>
2762
+ client.get(`${baseUrl}/users/me/meetings`).then(response => Meeting.parseMany(response.items)),
2763
+
2764
+ createMyMeeting: (name , persistent ) =>
2765
+ client.post(`${baseUrl}/users/me/meetings`, { name, persistent }).then(Meeting.parse),
2727
2766
 
2728
2767
  deleteMyMeeting: (meetingUuid ) =>
2729
2768
  client.delete(`${baseUrl}/users/me/meetings/${meetingUuid}`, null),
@@ -4903,6 +4942,7 @@ const AGENT_PAUSED = 'agent_paused';
4903
4942
  const AGENT_UNPAUSED = 'agent_unpaused';
4904
4943
  const CONFERENCE_ADHOC_PARTICIPANT_LEFT = 'conference_adhoc_participant_left';
4905
4944
  const CONFERENCE_ADHOC_DELETED = 'conference_adhoc_deleted';
4945
+ const MEETING_USER_PROGRESS = 'meeting_user_progress';
4906
4946
 
4907
4947
  const BLACKLIST_EVENTS = [
4908
4948
  CHAT_MESSAGE_SENT,
@@ -5253,6 +5293,7 @@ WebSocketClient.eventLists = [
5253
5293
  AGENT_UNPAUSED,
5254
5294
  CONFERENCE_ADHOC_PARTICIPANT_LEFT,
5255
5295
  CONFERENCE_ADHOC_DELETED,
5296
+ MEETING_USER_PROGRESS,
5256
5297
  ];
5257
5298
 
5258
5299
  var wazoWebsocket = {
@@ -6281,7 +6322,9 @@ class WebRTCClient extends Emitter {
6281
6322
  const inviteOptions = {
6282
6323
  requestDelegate: {
6283
6324
  onAccept: (response ) => {
6284
- session.sessionDescriptionHandler.peerConnection.sfu = conference;
6325
+ if (session.sessionDescriptionHandler.peerConnection) {
6326
+ session.sessionDescriptionHandler.peerConnection.sfu = conference;
6327
+ }
6285
6328
  this._onAccepted(session, response.session, true);
6286
6329
  },
6287
6330
  onReject: (response ) => {
@@ -7153,6 +7196,16 @@ class WebRTCClient extends Emitter {
7153
7196
  return this.hasRemoteVideo(sessionId) ? this.getRemoteStream(sessionId) : null;
7154
7197
  }
7155
7198
 
7199
+ // Useful in a react-native environment when remoteMediaStream is not updated
7200
+ getRemoteVideoStreamFromPc(sessionId ) {
7201
+ const pc = this.getPeerConnection(sessionId);
7202
+ if (!pc) {
7203
+ return null;
7204
+ }
7205
+
7206
+ return pc.getRemoteStreams().find(stream => !!stream.getVideoTracks().length);
7207
+ }
7208
+
7156
7209
  hasVideo(sessionId ) {
7157
7210
  return this.hasLocalVideo(sessionId) || this.hasRemoteVideo(sessionId);
7158
7211
  }
@@ -7931,18 +7984,22 @@ class WebRTCClient extends Emitter {
7931
7984
  });
7932
7985
 
7933
7986
  networkStats.packetsLost = packetsLost;
7934
- networkStats.audioBytesSent = audioBytesSent;
7987
+ networkStats.totalAudioBytesSent = audioBytesSent;
7988
+ networkStats.audioBytesSent = audioBytesSent - lastAudioSent;
7989
+ networkStats.totalAudioBytesReceived = audioBytesReceived - lastAudioReceived;
7935
7990
  networkStats.audioBytesReceived = audioBytesReceived;
7936
- networkStats.videoBytesSent = videoBytesSent;
7937
- networkStats.videoBytesReceived = videoBytesReceived;
7991
+ networkStats.totalVideoBytesSent = videoBytesSent;
7992
+ networkStats.videoBytesSent = videoBytesSent - lastVideoSent;
7993
+ networkStats.totalVideoBytesReceived = videoBytesReceived;
7994
+ networkStats.videoBytesReceived = videoBytesReceived - lastVideoReceived;
7995
+ networkStats.totalTransportSent = transportSent - lastTransportSent;
7938
7996
  networkStats.transportSent = transportSent;
7939
- networkStats.transportReceived = transportReceived;
7940
-
7941
- const bandwidth = (networkStats.audioBytesSent - lastAudioSent) + (networkStats.videoBytesSent - lastVideoSent)
7942
- + (networkStats.audioBytesReceived - lastAudioReceived) + (networkStats.videoBytesReceived - lastVideoReceived)
7943
- + (networkStats.transportReceived - lastTransportReceived) + (networkStats.transportSent - lastTransportSent);
7997
+ networkStats.totalTransportReceived = transportReceived;
7998
+ networkStats.transportReceived = transportReceived - lastTransportReceived;
7944
7999
 
7945
- networkStats.bandwidth = bandwidth;
8000
+ networkStats.bandwidth = networkStats.audioBytesSent + networkStats.audioBytesReceived
8001
+ + networkStats.videoBytesSent + networkStats.videoBytesReceived + networkStats.transportReceived
8002
+ + networkStats.transportSent;
7946
8003
 
7947
8004
  this.eventEmitter.emit(ON_NETWORK_STATS, session, networkStats, this.sessionNetworkStats[sessionId]);
7948
8005
  this.sessionNetworkStats[sessionId].push(networkStats);
@@ -130,6 +130,7 @@ class IssueReporter {
130
130
 
131
131
 
132
132
 
133
+
133
134
 
134
135
  constructor() {
135
136
  addLevelsTo(this);
@@ -141,12 +142,17 @@ class IssueReporter {
141
142
  this.bufferTimeout = null;
142
143
  this._boundProcessBuffer = this._processBuffer.bind(this);
143
144
  this._boundParseLoggerBody = this._parseLoggerBody.bind(this);
145
+ this._callback = null;
144
146
  }
145
147
 
146
148
  init() {
147
149
  this._catchConsole();
148
150
  }
149
151
 
152
+ setCallback(cb ) {
153
+ this._callback = cb;
154
+ }
155
+
150
156
  configureRemoteClient(configuration = { tag: 'wazo-sdk', host: null, port: null, level: null, extra: {} }) {
151
157
  this.remoteClientConfiguration = configuration;
152
158
  }
@@ -182,6 +188,7 @@ class IssueReporter {
182
188
 
183
189
  // Handle category label
184
190
  let category = null;
191
+ let skipSendToRemote = false;
185
192
  let extra = {};
186
193
  if (args[0].indexOf(CATEGORY_PREFIX) === 0) {
187
194
  category = args[0].split('=')[1];
@@ -197,6 +204,7 @@ class IssueReporter {
197
204
  errorMessage: lastArg.message,
198
205
  errorStack: lastArg.stack,
199
206
  errorType: lastArg.constructor.name,
207
+ skipSendToRemote: lastArg.skipSendToRemote,
200
208
  };
201
209
  } else {
202
210
  extra = lastArg;
@@ -205,6 +213,11 @@ class IssueReporter {
205
213
  args.splice(1, 1);
206
214
  }
207
215
 
216
+ if (extra.skipSendToRemote) {
217
+ skipSendToRemote = true;
218
+ delete extra.skipSendToRemote;
219
+ }
220
+
208
221
  const date = moment().format('YYYY-MM-DD HH:mm:ss.SSS');
209
222
  const message = args.join(', ');
210
223
  let consoleMessage = message;
@@ -225,7 +238,13 @@ class IssueReporter {
225
238
  const oldMethod = this.oldConsoleMethods[consoleLevel] || this.oldConsoleMethods.log;
226
239
  oldMethod.apply(oldMethod, [date, consoleMessage]);
227
240
 
228
- this._sendToRemoteLogger(level, { date, message, category, ...extra });
241
+ if (this._callback) {
242
+ this._callback(level, consoleMessage);
243
+ }
244
+
245
+ if (!skipSendToRemote) {
246
+ this._sendToRemoteLogger(level, { date, message, category, ...extra });
247
+ }
229
248
  }
230
249
 
231
250
  logRequest(url , options , response , start ) {
@@ -370,7 +389,11 @@ class IssueReporter {
370
389
  },
371
390
  // $FlowFixMe
372
391
  body,
373
- }).catch(() => {
392
+ }).catch((e ) => {
393
+ // $FlowFixMe
394
+ e.skipSendToRemote = true;
395
+ this.log('error', this._makeCategory('grafana'), 'Sending log to grafana, error', e);
396
+
374
397
  setTimeout(() => {
375
398
  if (isArray) {
376
399
  payload = payload.map(message => {
@@ -2614,11 +2637,24 @@ class Meeting {
2614
2637
  });
2615
2638
  }
2616
2639
 
2640
+ static parseMany(items ) {
2641
+ return items.map(plain => Meeting.parse(plain));
2642
+ }
2643
+
2617
2644
  static newFrom(meeting ) {
2618
2645
  return newFrom(meeting, Meeting);
2619
2646
  }
2620
2647
 
2621
- constructor({ uuid, name, guestSipAuthorization, ownerUuids, port, uri, number, persistent } = {}) {
2648
+ constructor({
2649
+ uuid,
2650
+ name,
2651
+ guestSipAuthorization,
2652
+ ownerUuids,
2653
+ port,
2654
+ uri,
2655
+ number,
2656
+ persistent,
2657
+ } = {}) {
2622
2658
  this.guestSipAuthorization = guestSipAuthorization;
2623
2659
  this.uri = uri;
2624
2660
  this.name = name;
@@ -2704,8 +2740,11 @@ var confdMethods = (client , baseUrl ) => ({
2704
2740
  }
2705
2741
  },
2706
2742
 
2707
- createMyMeeting: (name ) =>
2708
- client.post(`${baseUrl}/users/me/meetings`, { name }).then(Meeting.parse),
2743
+ getMyMeetings: () =>
2744
+ client.get(`${baseUrl}/users/me/meetings`).then(response => Meeting.parseMany(response.items)),
2745
+
2746
+ createMyMeeting: (name , persistent ) =>
2747
+ client.post(`${baseUrl}/users/me/meetings`, { name, persistent }).then(Meeting.parse),
2709
2748
 
2710
2749
  deleteMyMeeting: (meetingUuid ) =>
2711
2750
  client.delete(`${baseUrl}/users/me/meetings/${meetingUuid}`, null),
@@ -130,6 +130,7 @@ class IssueReporter {
130
130
 
131
131
 
132
132
 
133
+
133
134
 
134
135
  constructor() {
135
136
  addLevelsTo(this);
@@ -141,12 +142,17 @@ class IssueReporter {
141
142
  this.bufferTimeout = null;
142
143
  this._boundProcessBuffer = this._processBuffer.bind(this);
143
144
  this._boundParseLoggerBody = this._parseLoggerBody.bind(this);
145
+ this._callback = null;
144
146
  }
145
147
 
146
148
  init() {
147
149
  this._catchConsole();
148
150
  }
149
151
 
152
+ setCallback(cb ) {
153
+ this._callback = cb;
154
+ }
155
+
150
156
  configureRemoteClient(configuration = { tag: 'wazo-sdk', host: null, port: null, level: null, extra: {} }) {
151
157
  this.remoteClientConfiguration = configuration;
152
158
  }
@@ -182,6 +188,7 @@ class IssueReporter {
182
188
 
183
189
  // Handle category label
184
190
  let category = null;
191
+ let skipSendToRemote = false;
185
192
  let extra = {};
186
193
  if (args[0].indexOf(CATEGORY_PREFIX) === 0) {
187
194
  category = args[0].split('=')[1];
@@ -197,6 +204,7 @@ class IssueReporter {
197
204
  errorMessage: lastArg.message,
198
205
  errorStack: lastArg.stack,
199
206
  errorType: lastArg.constructor.name,
207
+ skipSendToRemote: lastArg.skipSendToRemote,
200
208
  };
201
209
  } else {
202
210
  extra = lastArg;
@@ -205,6 +213,11 @@ class IssueReporter {
205
213
  args.splice(1, 1);
206
214
  }
207
215
 
216
+ if (extra.skipSendToRemote) {
217
+ skipSendToRemote = true;
218
+ delete extra.skipSendToRemote;
219
+ }
220
+
208
221
  const date = moment().format('YYYY-MM-DD HH:mm:ss.SSS');
209
222
  const message = args.join(', ');
210
223
  let consoleMessage = message;
@@ -225,7 +238,13 @@ class IssueReporter {
225
238
  const oldMethod = this.oldConsoleMethods[consoleLevel] || this.oldConsoleMethods.log;
226
239
  oldMethod.apply(oldMethod, [date, consoleMessage]);
227
240
 
228
- this._sendToRemoteLogger(level, { date, message, category, ...extra });
241
+ if (this._callback) {
242
+ this._callback(level, consoleMessage);
243
+ }
244
+
245
+ if (!skipSendToRemote) {
246
+ this._sendToRemoteLogger(level, { date, message, category, ...extra });
247
+ }
229
248
  }
230
249
 
231
250
  logRequest(url , options , response , start ) {
@@ -370,7 +389,11 @@ class IssueReporter {
370
389
  },
371
390
  // $FlowFixMe
372
391
  body,
373
- }).catch(() => {
392
+ }).catch((e ) => {
393
+ // $FlowFixMe
394
+ e.skipSendToRemote = true;
395
+ this.log('error', this._makeCategory('grafana'), 'Sending log to grafana, error', e);
396
+
374
397
  setTimeout(() => {
375
398
  if (isArray) {
376
399
  payload = payload.map(message => {
@@ -2614,11 +2637,24 @@ class Meeting {
2614
2637
  });
2615
2638
  }
2616
2639
 
2640
+ static parseMany(items ) {
2641
+ return items.map(plain => Meeting.parse(plain));
2642
+ }
2643
+
2617
2644
  static newFrom(meeting ) {
2618
2645
  return newFrom(meeting, Meeting);
2619
2646
  }
2620
2647
 
2621
- constructor({ uuid, name, guestSipAuthorization, ownerUuids, port, uri, number, persistent } = {}) {
2648
+ constructor({
2649
+ uuid,
2650
+ name,
2651
+ guestSipAuthorization,
2652
+ ownerUuids,
2653
+ port,
2654
+ uri,
2655
+ number,
2656
+ persistent,
2657
+ } = {}) {
2622
2658
  this.guestSipAuthorization = guestSipAuthorization;
2623
2659
  this.uri = uri;
2624
2660
  this.name = name;
@@ -2704,8 +2740,11 @@ var confdMethods = (client , baseUrl ) => ({
2704
2740
  }
2705
2741
  },
2706
2742
 
2707
- createMyMeeting: (name ) =>
2708
- client.post(`${baseUrl}/users/me/meetings`, { name }).then(Meeting.parse),
2743
+ getMyMeetings: () =>
2744
+ client.get(`${baseUrl}/users/me/meetings`).then(response => Meeting.parseMany(response.items)),
2745
+
2746
+ createMyMeeting: (name , persistent ) =>
2747
+ client.post(`${baseUrl}/users/me/meetings`, { name, persistent }).then(Meeting.parse),
2709
2748
 
2710
2749
  deleteMyMeeting: (meetingUuid ) =>
2711
2750
  client.delete(`${baseUrl}/users/me/meetings/${meetingUuid}`, null),
@@ -148,6 +148,7 @@ class IssueReporter {
148
148
 
149
149
 
150
150
 
151
+
151
152
 
152
153
  constructor() {
153
154
  addLevelsTo(this);
@@ -159,12 +160,17 @@ class IssueReporter {
159
160
  this.bufferTimeout = null;
160
161
  this._boundProcessBuffer = this._processBuffer.bind(this);
161
162
  this._boundParseLoggerBody = this._parseLoggerBody.bind(this);
163
+ this._callback = null;
162
164
  }
163
165
 
164
166
  init() {
165
167
  this._catchConsole();
166
168
  }
167
169
 
170
+ setCallback(cb ) {
171
+ this._callback = cb;
172
+ }
173
+
168
174
  configureRemoteClient(configuration = { tag: 'wazo-sdk', host: null, port: null, level: null, extra: {} }) {
169
175
  this.remoteClientConfiguration = configuration;
170
176
  }
@@ -200,6 +206,7 @@ class IssueReporter {
200
206
 
201
207
  // Handle category label
202
208
  let category = null;
209
+ let skipSendToRemote = false;
203
210
  let extra = {};
204
211
  if (args[0].indexOf(CATEGORY_PREFIX) === 0) {
205
212
  category = args[0].split('=')[1];
@@ -215,6 +222,7 @@ class IssueReporter {
215
222
  errorMessage: lastArg.message,
216
223
  errorStack: lastArg.stack,
217
224
  errorType: lastArg.constructor.name,
225
+ skipSendToRemote: lastArg.skipSendToRemote,
218
226
  };
219
227
  } else {
220
228
  extra = lastArg;
@@ -223,6 +231,11 @@ class IssueReporter {
223
231
  args.splice(1, 1);
224
232
  }
225
233
 
234
+ if (extra.skipSendToRemote) {
235
+ skipSendToRemote = true;
236
+ delete extra.skipSendToRemote;
237
+ }
238
+
226
239
  const date = moment().format('YYYY-MM-DD HH:mm:ss.SSS');
227
240
  const message = args.join(', ');
228
241
  let consoleMessage = message;
@@ -243,7 +256,13 @@ class IssueReporter {
243
256
  const oldMethod = this.oldConsoleMethods[consoleLevel] || this.oldConsoleMethods.log;
244
257
  oldMethod.apply(oldMethod, [date, consoleMessage]);
245
258
 
246
- this._sendToRemoteLogger(level, { date, message, category, ...extra });
259
+ if (this._callback) {
260
+ this._callback(level, consoleMessage);
261
+ }
262
+
263
+ if (!skipSendToRemote) {
264
+ this._sendToRemoteLogger(level, { date, message, category, ...extra });
265
+ }
247
266
  }
248
267
 
249
268
  logRequest(url , options , response , start ) {
@@ -388,7 +407,11 @@ class IssueReporter {
388
407
  },
389
408
  // $FlowFixMe
390
409
  body,
391
- }).catch(() => {
410
+ }).catch((e ) => {
411
+ // $FlowFixMe
412
+ e.skipSendToRemote = true;
413
+ this.log('error', this._makeCategory('grafana'), 'Sending log to grafana, error', e);
414
+
392
415
  setTimeout(() => {
393
416
  if (isArray) {
394
417
  payload = payload.map(message => {
@@ -2632,11 +2655,24 @@ class Meeting {
2632
2655
  });
2633
2656
  }
2634
2657
 
2658
+ static parseMany(items ) {
2659
+ return items.map(plain => Meeting.parse(plain));
2660
+ }
2661
+
2635
2662
  static newFrom(meeting ) {
2636
2663
  return newFrom(meeting, Meeting);
2637
2664
  }
2638
2665
 
2639
- constructor({ uuid, name, guestSipAuthorization, ownerUuids, port, uri, number, persistent } = {}) {
2666
+ constructor({
2667
+ uuid,
2668
+ name,
2669
+ guestSipAuthorization,
2670
+ ownerUuids,
2671
+ port,
2672
+ uri,
2673
+ number,
2674
+ persistent,
2675
+ } = {}) {
2640
2676
  this.guestSipAuthorization = guestSipAuthorization;
2641
2677
  this.uri = uri;
2642
2678
  this.name = name;
@@ -2722,8 +2758,11 @@ var confdMethods = (client , baseUrl ) => ({
2722
2758
  }
2723
2759
  },
2724
2760
 
2725
- createMyMeeting: (name ) =>
2726
- client.post(`${baseUrl}/users/me/meetings`, { name }).then(Meeting.parse),
2761
+ getMyMeetings: () =>
2762
+ client.get(`${baseUrl}/users/me/meetings`).then(response => Meeting.parseMany(response.items)),
2763
+
2764
+ createMyMeeting: (name , persistent ) =>
2765
+ client.post(`${baseUrl}/users/me/meetings`, { name, persistent }).then(Meeting.parse),
2727
2766
 
2728
2767
  deleteMyMeeting: (meetingUuid ) =>
2729
2768
  client.delete(`${baseUrl}/users/me/meetings/${meetingUuid}`, null),
@@ -4903,6 +4942,7 @@ const AGENT_PAUSED = 'agent_paused';
4903
4942
  const AGENT_UNPAUSED = 'agent_unpaused';
4904
4943
  const CONFERENCE_ADHOC_PARTICIPANT_LEFT = 'conference_adhoc_participant_left';
4905
4944
  const CONFERENCE_ADHOC_DELETED = 'conference_adhoc_deleted';
4945
+ const MEETING_USER_PROGRESS = 'meeting_user_progress';
4906
4946
 
4907
4947
  const BLACKLIST_EVENTS = [
4908
4948
  CHAT_MESSAGE_SENT,
@@ -5253,6 +5293,7 @@ WebSocketClient.eventLists = [
5253
5293
  AGENT_UNPAUSED,
5254
5294
  CONFERENCE_ADHOC_PARTICIPANT_LEFT,
5255
5295
  CONFERENCE_ADHOC_DELETED,
5296
+ MEETING_USER_PROGRESS,
5256
5297
  ];
5257
5298
 
5258
5299
  var wazoWebsocket = {
@@ -6281,7 +6322,9 @@ class WebRTCClient extends Emitter {
6281
6322
  const inviteOptions = {
6282
6323
  requestDelegate: {
6283
6324
  onAccept: (response ) => {
6284
- session.sessionDescriptionHandler.peerConnection.sfu = conference;
6325
+ if (session.sessionDescriptionHandler.peerConnection) {
6326
+ session.sessionDescriptionHandler.peerConnection.sfu = conference;
6327
+ }
6285
6328
  this._onAccepted(session, response.session, true);
6286
6329
  },
6287
6330
  onReject: (response ) => {
@@ -7153,6 +7196,16 @@ class WebRTCClient extends Emitter {
7153
7196
  return this.hasRemoteVideo(sessionId) ? this.getRemoteStream(sessionId) : null;
7154
7197
  }
7155
7198
 
7199
+ // Useful in a react-native environment when remoteMediaStream is not updated
7200
+ getRemoteVideoStreamFromPc(sessionId ) {
7201
+ const pc = this.getPeerConnection(sessionId);
7202
+ if (!pc) {
7203
+ return null;
7204
+ }
7205
+
7206
+ return pc.getRemoteStreams().find(stream => !!stream.getVideoTracks().length);
7207
+ }
7208
+
7156
7209
  hasVideo(sessionId ) {
7157
7210
  return this.hasLocalVideo(sessionId) || this.hasRemoteVideo(sessionId);
7158
7211
  }
@@ -7931,18 +7984,22 @@ class WebRTCClient extends Emitter {
7931
7984
  });
7932
7985
 
7933
7986
  networkStats.packetsLost = packetsLost;
7934
- networkStats.audioBytesSent = audioBytesSent;
7987
+ networkStats.totalAudioBytesSent = audioBytesSent;
7988
+ networkStats.audioBytesSent = audioBytesSent - lastAudioSent;
7989
+ networkStats.totalAudioBytesReceived = audioBytesReceived - lastAudioReceived;
7935
7990
  networkStats.audioBytesReceived = audioBytesReceived;
7936
- networkStats.videoBytesSent = videoBytesSent;
7937
- networkStats.videoBytesReceived = videoBytesReceived;
7991
+ networkStats.totalVideoBytesSent = videoBytesSent;
7992
+ networkStats.videoBytesSent = videoBytesSent - lastVideoSent;
7993
+ networkStats.totalVideoBytesReceived = videoBytesReceived;
7994
+ networkStats.videoBytesReceived = videoBytesReceived - lastVideoReceived;
7995
+ networkStats.totalTransportSent = transportSent - lastTransportSent;
7938
7996
  networkStats.transportSent = transportSent;
7939
- networkStats.transportReceived = transportReceived;
7940
-
7941
- const bandwidth = (networkStats.audioBytesSent - lastAudioSent) + (networkStats.videoBytesSent - lastVideoSent)
7942
- + (networkStats.audioBytesReceived - lastAudioReceived) + (networkStats.videoBytesReceived - lastVideoReceived)
7943
- + (networkStats.transportReceived - lastTransportReceived) + (networkStats.transportSent - lastTransportSent);
7997
+ networkStats.totalTransportReceived = transportReceived;
7998
+ networkStats.transportReceived = transportReceived - lastTransportReceived;
7944
7999
 
7945
- networkStats.bandwidth = bandwidth;
8000
+ networkStats.bandwidth = networkStats.audioBytesSent + networkStats.audioBytesReceived
8001
+ + networkStats.videoBytesSent + networkStats.videoBytesReceived + networkStats.transportReceived
8002
+ + networkStats.transportSent;
7946
8003
 
7947
8004
  this.eventEmitter.emit(ON_NETWORK_STATS, session, networkStats, this.sessionNetworkStats[sessionId]);
7948
8005
  this.sessionNetworkStats[sessionId].push(networkStats);