@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
package/src/api/confd.js CHANGED
@@ -69,8 +69,11 @@ export default (client: ApiRequester, baseUrl: string) => ({
69
69
  }
70
70
  },
71
71
 
72
- createMyMeeting: (name: string): Promise<Meeting> =>
73
- client.post(`${baseUrl}/users/me/meetings`, { name }).then(Meeting.parse),
72
+ getMyMeetings: (): Promise<Meeting> =>
73
+ client.get(`${baseUrl}/users/me/meetings`).then(response => Meeting.parseMany(response.items)),
74
+
75
+ createMyMeeting: (name: string, persistent: boolean): Promise<Meeting> =>
76
+ client.post(`${baseUrl}/users/me/meetings`, { name, persistent }).then(Meeting.parse),
74
77
 
75
78
  deleteMyMeeting: (meetingUuid: string): Promise<Meeting> =>
76
79
  client.delete(`${baseUrl}/users/me/meetings/${meetingUuid}`, null),
@@ -37,11 +37,24 @@ export default class Meeting {
37
37
  });
38
38
  }
39
39
 
40
+ static parseMany(items: MeetingCreationResponse[]): Array<Meeting> {
41
+ return items.map(plain => Meeting.parse(plain));
42
+ }
43
+
40
44
  static newFrom(meeting: Meeting) {
41
45
  return newFrom(meeting, Meeting);
42
46
  }
43
47
 
44
- constructor({ uuid, name, guestSipAuthorization, ownerUuids, port, uri, number, persistent }: Object = {}) {
48
+ constructor({
49
+ uuid,
50
+ name,
51
+ guestSipAuthorization,
52
+ ownerUuids,
53
+ port,
54
+ uri,
55
+ number,
56
+ persistent,
57
+ }: Object = {}) {
45
58
  this.guestSipAuthorization = guestSipAuthorization;
46
59
  this.uri = uri;
47
60
  this.name = name;
@@ -414,9 +414,11 @@ export default class WebRTCPhone extends Emitter implements Phone {
414
414
  case SessionState.Terminated: {
415
415
  logger.info('WebRTC phone - call terminated', { sipId: sipSession.id });
416
416
 
417
+ // Should be called before `_onCallTerminated` or the callCount will not decrement...
418
+ const callSession = this._createCallSession(sipSession);
417
419
  const wasCurrentSession = this._onCallTerminated(sipSession);
418
420
 
419
- return this.eventEmitter.emit(ON_CALL_ENDED, this._createCallSession(sipSession), wasCurrentSession);
421
+ return this.eventEmitter.emit(ON_CALL_ENDED, callSession, wasCurrentSession);
420
422
  }
421
423
  default:
422
424
  break;
@@ -1366,6 +1368,10 @@ export default class WebRTCPhone extends Emitter implements Phone {
1366
1368
  return callSession ? this.client.getRemoteVideoStream(callSession.sipCallId) : null;
1367
1369
  }
1368
1370
 
1371
+ getRemoteVideoStreamFromPc(callSession: CallSession): ?MediaStream {
1372
+ return callSession ? this.client.getRemoteVideoStreamFromPc(callSession.sipCallId) : null;
1373
+ }
1374
+
1369
1375
  hasRemoteVideo(callSession: CallSession): boolean {
1370
1376
  return callSession ? this.client.hasRemoteVideo(callSession.sipCallId) : false;
1371
1377
  }
@@ -64,6 +64,7 @@ class IssueReporter {
64
64
  bufferTimeout: ?TimeoutID;
65
65
  _boundProcessBuffer: Function;
66
66
  _boundParseLoggerBody: Function;
67
+ _callback: ?Function;
67
68
 
68
69
  constructor() {
69
70
  addLevelsTo(this);
@@ -75,12 +76,17 @@ class IssueReporter {
75
76
  this.bufferTimeout = null;
76
77
  this._boundProcessBuffer = this._processBuffer.bind(this);
77
78
  this._boundParseLoggerBody = this._parseLoggerBody.bind(this);
79
+ this._callback = null;
78
80
  }
79
81
 
80
82
  init() {
81
83
  this._catchConsole();
82
84
  }
83
85
 
86
+ setCallback(cb: Function) {
87
+ this._callback = cb;
88
+ }
89
+
84
90
  configureRemoteClient(configuration: Object = { tag: 'wazo-sdk', host: null, port: null, level: null, extra: {} }) {
85
91
  this.remoteClientConfiguration = configuration;
86
92
  }
@@ -116,6 +122,7 @@ class IssueReporter {
116
122
 
117
123
  // Handle category label
118
124
  let category = null;
125
+ let skipSendToRemote = false;
119
126
  let extra = {};
120
127
  if (args[0].indexOf(CATEGORY_PREFIX) === 0) {
121
128
  category = args[0].split('=')[1];
@@ -131,6 +138,7 @@ class IssueReporter {
131
138
  errorMessage: lastArg.message,
132
139
  errorStack: lastArg.stack,
133
140
  errorType: lastArg.constructor.name,
141
+ skipSendToRemote: lastArg.skipSendToRemote,
134
142
  };
135
143
  } else {
136
144
  extra = lastArg;
@@ -139,6 +147,11 @@ class IssueReporter {
139
147
  args.splice(1, 1);
140
148
  }
141
149
 
150
+ if (extra.skipSendToRemote) {
151
+ skipSendToRemote = true;
152
+ delete extra.skipSendToRemote;
153
+ }
154
+
142
155
  const date = moment().format('YYYY-MM-DD HH:mm:ss.SSS');
143
156
  const message = args.join(', ');
144
157
  let consoleMessage = message;
@@ -159,7 +172,13 @@ class IssueReporter {
159
172
  const oldMethod = this.oldConsoleMethods[consoleLevel] || this.oldConsoleMethods.log;
160
173
  oldMethod.apply(oldMethod, [date, consoleMessage]);
161
174
 
162
- this._sendToRemoteLogger(level, { date, message, category, ...extra });
175
+ if (this._callback) {
176
+ this._callback(level, consoleMessage);
177
+ }
178
+
179
+ if (!skipSendToRemote) {
180
+ this._sendToRemoteLogger(level, { date, message, category, ...extra });
181
+ }
163
182
  }
164
183
 
165
184
  logRequest(url: string, options: Object, response: Object, start: Date) {
@@ -304,7 +323,11 @@ class IssueReporter {
304
323
  },
305
324
  // $FlowFixMe
306
325
  body,
307
- }).catch(() => {
326
+ }).catch((e: Error) => {
327
+ // $FlowFixMe
328
+ e.skipSendToRemote = true;
329
+ this.log('error', this._makeCategory('grafana'), 'Sending log to grafana, error', e);
330
+
308
331
  setTimeout(() => {
309
332
  if (isArray) {
310
333
  payload = payload.map(message => {
@@ -347,6 +347,11 @@ class Phone extends Emitter {
347
347
  return this.getRemoteVideoStream(callSession);
348
348
  }
349
349
 
350
+ // Useful in a react-native environment when remoteMediaStream is not updated
351
+ getRemoteVideoStreamFromPc(callSession: CallSession) {
352
+ return this.phone ? this.phone.getRemoteVideoStreamFromPc(callSession) : false;
353
+ }
354
+
350
355
  hasVideo(callSession: CallSession): boolean {
351
356
  return this.phone ? this.phone.hasVideo(callSession) : false;
352
357
  }
@@ -7,6 +7,7 @@ import type {
7
7
  } from '../domain/SwitchboardCall';
8
8
  import type { ChatMessageResponse } from '../domain/ChatMessage';
9
9
  import ChatRoom from '../domain/ChatRoom';
10
+ import Meeting from '../domain/Meeting';
10
11
 
11
12
  type WebSocketBaseMessage = {
12
13
  op: string,
@@ -187,6 +188,8 @@ type AgentStatusUpdate = WebSocketBaseMessage & { data: AgentStatusUpdateEvent,
187
188
  type AgentPaused = WebSocketBaseMessage & { data: any, name: 'agent_paused' };
188
189
  type AgentUnpaused = WebSocketBaseMessage & { data: any, name: 'agent_unpaused' };
189
190
 
191
+ type MeetingUserProgress = WebSocketBaseMessage & { data: Meeting, name: 'meeting_user_progress' };
192
+
190
193
  export type WebSocketMessage =
191
194
  | CallCreated
192
195
  | CallUpdated
@@ -219,4 +222,5 @@ export type WebSocketMessage =
219
222
  | FaxOutboundSucceeded
220
223
  | AgentStatusUpdate
221
224
  | AgentPaused
222
- | AgentUnpaused;
225
+ | AgentUnpaused
226
+ | MeetingUserProgress;
@@ -478,7 +478,9 @@ export default class WebRTCClient extends Emitter {
478
478
  const inviteOptions: InviterInviteOptions = {
479
479
  requestDelegate: {
480
480
  onAccept: (response: IncomingResponse) => {
481
- session.sessionDescriptionHandler.peerConnection.sfu = conference;
481
+ if (session.sessionDescriptionHandler.peerConnection) {
482
+ session.sessionDescriptionHandler.peerConnection.sfu = conference;
483
+ }
482
484
  this._onAccepted(session, response.session, true);
483
485
  },
484
486
  onReject: (response: IncomingResponse) => {
@@ -1350,6 +1352,16 @@ export default class WebRTCClient extends Emitter {
1350
1352
  return this.hasRemoteVideo(sessionId) ? this.getRemoteStream(sessionId) : null;
1351
1353
  }
1352
1354
 
1355
+ // Useful in a react-native environment when remoteMediaStream is not updated
1356
+ getRemoteVideoStreamFromPc(sessionId: string): ?MediaStream {
1357
+ const pc = this.getPeerConnection(sessionId);
1358
+ if (!pc) {
1359
+ return null;
1360
+ }
1361
+
1362
+ return pc.getRemoteStreams().find(stream => !!stream.getVideoTracks().length);
1363
+ }
1364
+
1353
1365
  hasVideo(sessionId: string): boolean {
1354
1366
  return this.hasLocalVideo(sessionId) || this.hasRemoteVideo(sessionId);
1355
1367
  }
@@ -2128,18 +2140,22 @@ export default class WebRTCClient extends Emitter {
2128
2140
  });
2129
2141
 
2130
2142
  networkStats.packetsLost = packetsLost;
2131
- networkStats.audioBytesSent = audioBytesSent;
2143
+ networkStats.totalAudioBytesSent = audioBytesSent;
2144
+ networkStats.audioBytesSent = audioBytesSent - lastAudioSent;
2145
+ networkStats.totalAudioBytesReceived = audioBytesReceived - lastAudioReceived;
2132
2146
  networkStats.audioBytesReceived = audioBytesReceived;
2133
- networkStats.videoBytesSent = videoBytesSent;
2134
- networkStats.videoBytesReceived = videoBytesReceived;
2147
+ networkStats.totalVideoBytesSent = videoBytesSent;
2148
+ networkStats.videoBytesSent = videoBytesSent - lastVideoSent;
2149
+ networkStats.totalVideoBytesReceived = videoBytesReceived;
2150
+ networkStats.videoBytesReceived = videoBytesReceived - lastVideoReceived;
2151
+ networkStats.totalTransportSent = transportSent - lastTransportSent;
2135
2152
  networkStats.transportSent = transportSent;
2136
- networkStats.transportReceived = transportReceived;
2137
-
2138
- const bandwidth = (networkStats.audioBytesSent - lastAudioSent) + (networkStats.videoBytesSent - lastVideoSent)
2139
- + (networkStats.audioBytesReceived - lastAudioReceived) + (networkStats.videoBytesReceived - lastVideoReceived)
2140
- + (networkStats.transportReceived - lastTransportReceived) + (networkStats.transportSent - lastTransportSent);
2153
+ networkStats.totalTransportReceived = transportReceived;
2154
+ networkStats.transportReceived = transportReceived - lastTransportReceived;
2141
2155
 
2142
- networkStats.bandwidth = bandwidth;
2156
+ networkStats.bandwidth = networkStats.audioBytesSent + networkStats.audioBytesReceived
2157
+ + networkStats.videoBytesSent + networkStats.videoBytesReceived + networkStats.transportReceived
2158
+ + networkStats.transportSent;
2143
2159
 
2144
2160
  this.eventEmitter.emit(ON_NETWORK_STATS, session, networkStats, this.sessionNetworkStats[sessionId]);
2145
2161
  this.sessionNetworkStats[sessionId].push(networkStats);
@@ -93,6 +93,7 @@ export const AGENT_PAUSED = 'agent_paused';
93
93
  export const AGENT_UNPAUSED = 'agent_unpaused';
94
94
  export const CONFERENCE_ADHOC_PARTICIPANT_LEFT = 'conference_adhoc_participant_left';
95
95
  export const CONFERENCE_ADHOC_DELETED = 'conference_adhoc_deleted';
96
+ export const MEETING_USER_PROGRESS = 'meeting_user_progress';
96
97
 
97
98
  const BLACKLIST_EVENTS = [
98
99
  CHAT_MESSAGE_SENT,
@@ -446,6 +447,7 @@ WebSocketClient.eventLists = [
446
447
  AGENT_UNPAUSED,
447
448
  CONFERENCE_ADHOC_PARTICIPANT_LEFT,
448
449
  CONFERENCE_ADHOC_DELETED,
450
+ MEETING_USER_PROGRESS,
449
451
  ];
450
452
 
451
453
  export default WebSocketClient;