@wazo/sdk 0.37.0 → 0.37.4

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 (144) hide show
  1. package/dist/wazo-sdk.js +5 -5
  2. package/esm/__tests__/api-client.test.js +91 -23
  3. package/esm/__tests__/web-rtc-client.test.js +165 -56
  4. package/esm/api/agentd.js +7 -1
  5. package/esm/api/amid.js +7 -1
  6. package/esm/api/application.js +7 -1
  7. package/esm/api/auth.js +7 -1
  8. package/esm/api/call-logd.js +17 -23
  9. package/esm/api/calld.js +10 -18
  10. package/esm/api/chatd.js +7 -1
  11. package/esm/api/confd.js +78 -1
  12. package/esm/api/ctid-ng.js +7 -1
  13. package/esm/api/dird.js +7 -1
  14. package/esm/api/webhookd.js +7 -1
  15. package/esm/api-client.js +91 -23
  16. package/esm/checker/Checker.js +169 -56
  17. package/esm/checker/checks/aor.js +91 -23
  18. package/esm/checker/checks/api.js +91 -23
  19. package/esm/checker/checks/index.js +169 -56
  20. package/esm/checker/checks/wazo-websocket.js +11 -1
  21. package/esm/checker/checks/webrtc-transport.js +165 -56
  22. package/esm/checker/checks/webrtc.js +165 -56
  23. package/esm/domain/AdHocAPIConference.js +1722 -1654
  24. package/esm/domain/CallLog.js +10 -22
  25. package/esm/domain/CallSession.js +1 -18
  26. package/esm/domain/Features.js +91 -23
  27. package/esm/domain/IndirectTransfer.js +0 -17
  28. package/esm/domain/Meeting.js +71 -0
  29. package/esm/domain/Phone/CTIPhone.js +98 -26
  30. package/esm/domain/Phone/Phone.js +0 -17
  31. package/esm/domain/Phone/WebRTCPhone.js +47 -27
  32. package/esm/domain/Room.js +0 -17
  33. package/esm/domain/SwitchboardCall.js +0 -17
  34. package/esm/domain/__tests__/CallLog.test.js +10 -22
  35. package/esm/domain/__tests__/CallSession.test.js +1 -18
  36. package/esm/domain/__tests__/IndirectTransfer.test.js +1 -18
  37. package/esm/domain/__tests__/Room.test.js +1 -18
  38. package/esm/index.js +3880 -3111
  39. package/esm/lib/WazoSessionDescriptionHandler.js +24 -10
  40. package/esm/service/CallApi.js +91 -23
  41. package/esm/service/IssueReporter.js +7 -1
  42. package/esm/service/__tests__/IssueReporter.test.js +9 -1
  43. package/esm/service/getApiClient.js +91 -23
  44. package/esm/simple/Auth.js +1126 -360
  45. package/esm/simple/Configuration.js +1126 -360
  46. package/esm/simple/Directory.js +91 -23
  47. package/esm/simple/Phone.js +3724 -2958
  48. package/esm/simple/Websocket.js +13 -1
  49. package/esm/simple/index.js +1128 -362
  50. package/esm/simple/room/LocalParticipant.js +1097 -331
  51. package/esm/simple/room/Participant.js +1097 -331
  52. package/esm/simple/room/RemoteParticipant.js +1097 -331
  53. package/esm/simple/room/Room.js +1097 -331
  54. package/esm/simple/room/SipRoom.js +12996 -0
  55. package/esm/simple/room/Stream.js +1128 -362
  56. package/esm/simple/room/__tests__/RemoteParticipant.test.js +5157 -4389
  57. package/esm/simple/utils.js +1128 -362
  58. package/esm/utils/__tests__/api-requester.test.js +7 -1
  59. package/esm/utils/api-requester.js +7 -1
  60. package/esm/web-rtc-client.js +165 -56
  61. package/esm/websocket-client.js +12 -2
  62. package/lib/__tests__/api-client.test.js +91 -23
  63. package/lib/__tests__/web-rtc-client.test.js +165 -56
  64. package/lib/api/agentd.js +7 -1
  65. package/lib/api/amid.js +7 -1
  66. package/lib/api/application.js +7 -1
  67. package/lib/api/auth.js +7 -1
  68. package/lib/api/call-logd.js +17 -23
  69. package/lib/api/calld.js +10 -18
  70. package/lib/api/chatd.js +7 -1
  71. package/lib/api/confd.js +78 -1
  72. package/lib/api/ctid-ng.js +7 -1
  73. package/lib/api/dird.js +7 -1
  74. package/lib/api/webhookd.js +7 -1
  75. package/lib/api-client.js +91 -23
  76. package/lib/checker/Checker.js +169 -56
  77. package/lib/checker/checks/aor.js +91 -23
  78. package/lib/checker/checks/api.js +91 -23
  79. package/lib/checker/checks/index.js +169 -56
  80. package/lib/checker/checks/wazo-websocket.js +11 -1
  81. package/lib/checker/checks/webrtc-transport.js +165 -56
  82. package/lib/checker/checks/webrtc.js +165 -56
  83. package/lib/domain/AdHocAPIConference.js +1722 -1654
  84. package/lib/domain/CallLog.js +10 -22
  85. package/lib/domain/CallSession.js +1 -18
  86. package/lib/domain/Features.js +91 -23
  87. package/lib/domain/IndirectTransfer.js +0 -17
  88. package/lib/domain/Meeting.js +73 -0
  89. package/lib/domain/Phone/CTIPhone.js +98 -26
  90. package/lib/domain/Phone/Phone.js +0 -16
  91. package/lib/domain/Phone/WebRTCPhone.js +47 -27
  92. package/lib/domain/Room.js +0 -17
  93. package/lib/domain/SwitchboardCall.js +0 -17
  94. package/lib/domain/__tests__/CallLog.test.js +10 -22
  95. package/lib/domain/__tests__/CallSession.test.js +1 -18
  96. package/lib/domain/__tests__/IndirectTransfer.test.js +1 -18
  97. package/lib/domain/__tests__/Room.test.js +1 -18
  98. package/lib/index.js +3880 -3111
  99. package/lib/lib/WazoSessionDescriptionHandler.js +24 -10
  100. package/lib/service/CallApi.js +91 -23
  101. package/lib/service/IssueReporter.js +7 -1
  102. package/lib/service/__tests__/IssueReporter.test.js +9 -1
  103. package/lib/service/getApiClient.js +91 -23
  104. package/lib/simple/Auth.js +1126 -360
  105. package/lib/simple/Configuration.js +1126 -360
  106. package/lib/simple/Directory.js +91 -23
  107. package/lib/simple/Phone.js +3724 -2958
  108. package/lib/simple/Websocket.js +13 -1
  109. package/lib/simple/index.js +1128 -362
  110. package/lib/simple/room/LocalParticipant.js +1097 -331
  111. package/lib/simple/room/Participant.js +1097 -331
  112. package/lib/simple/room/RemoteParticipant.js +1097 -331
  113. package/lib/simple/room/Room.js +1097 -331
  114. package/lib/simple/room/SipRoom.js +13006 -0
  115. package/lib/simple/room/Stream.js +1128 -362
  116. package/lib/simple/room/__tests__/RemoteParticipant.test.js +5157 -4389
  117. package/lib/simple/utils.js +1128 -362
  118. package/lib/utils/__tests__/api-requester.test.js +7 -1
  119. package/lib/utils/api-requester.js +7 -1
  120. package/lib/web-rtc-client.js +165 -56
  121. package/lib/websocket-client.js +13 -1
  122. package/package.json +1 -1
  123. package/src/api/calld.js +3 -0
  124. package/src/api/confd.js +13 -0
  125. package/src/domain/CallLog.js +10 -22
  126. package/src/domain/CallSession.js +1 -2
  127. package/src/domain/Meeting.js +59 -0
  128. package/src/domain/Phone/CTIPhone.js +6 -2
  129. package/src/domain/Phone/Phone.js +2 -0
  130. package/src/domain/Phone/WebRTCPhone.js +22 -8
  131. package/src/index.js +6 -0
  132. package/src/lib/WazoSessionDescriptionHandler.js +17 -9
  133. package/src/service/IssueReporter.js +7 -1
  134. package/src/service/__tests__/IssueReporter.test.js +2 -0
  135. package/src/simple/Phone.js +13 -4
  136. package/src/simple/index.js +8 -0
  137. package/src/simple/room/Participant.js +7 -0
  138. package/src/simple/room/Room.js +157 -79
  139. package/src/simple/room/SipRoom.js +147 -0
  140. package/src/simple/room/Stream.js +1 -3
  141. package/src/simple/room/__tests__/RemoteParticipant.test.js +3 -2
  142. package/src/types/WebSocketMessage.js +21 -0
  143. package/src/web-rtc-client.js +57 -24
  144. package/src/websocket-client.js +4 -0
@@ -309,7 +309,13 @@ class IssueReporter {
309
309
  }
310
310
 
311
311
  _isLevelAbove(level1 , level2 ) {
312
- return LOG_LEVELS.indexOf(level1) > LOG_LEVELS.indexOf(level2);
312
+ const index1 = LOG_LEVELS.indexOf(level1);
313
+ const index2 = LOG_LEVELS.indexOf(level2);
314
+ if (index1 === -1 || index2 === -1) {
315
+ return false;
316
+ }
317
+
318
+ return index1 > index2;
313
319
  }
314
320
 
315
321
  _makeCategory(category ) {
@@ -2487,6 +2493,65 @@ class ExternalApp {
2487
2493
  }
2488
2494
  }
2489
2495
 
2496
+ //
2497
+
2498
+
2499
+
2500
+
2501
+
2502
+
2503
+
2504
+
2505
+
2506
+
2507
+
2508
+ class Meeting {
2509
+
2510
+
2511
+
2512
+
2513
+
2514
+
2515
+
2516
+
2517
+
2518
+
2519
+ static parse(plain ) {
2520
+ return new Meeting({
2521
+ guestSipAuthorization: plain.guest_sip_authorization,
2522
+ hostname: plain.hostname,
2523
+ name: plain.name,
2524
+ ownerUuids: plain.owner_uuids,
2525
+ port: plain.port,
2526
+ uuid: plain.uuid,
2527
+ number: plain.number,
2528
+ });
2529
+ }
2530
+
2531
+ static newFrom(meeting ) {
2532
+ return newFrom(meeting, Meeting);
2533
+ }
2534
+
2535
+ constructor({ uuid, name, guestSipAuthorization, ownerUuids, port, hostname, number } = {}) {
2536
+ this.guestSipAuthorization = guestSipAuthorization;
2537
+ this.hostname = hostname;
2538
+ this.name = name;
2539
+ this.ownerUuids = ownerUuids;
2540
+ this.port = port;
2541
+ this.uuid = uuid;
2542
+ this.number = number;
2543
+
2544
+ // Useful to compare instead of instanceof with minified code
2545
+ this.type = 'Meeting';
2546
+ }
2547
+
2548
+ getGuestSipCredentials() {
2549
+ // eslint-disable-next-line no-undef
2550
+ const [username, secret] = atob(this.guestSipAuthorization).split(':');
2551
+ return { username, secret };
2552
+ }
2553
+ }
2554
+
2490
2555
  /* */
2491
2556
 
2492
2557
  var confdMethods = (client , baseUrl ) => ({
@@ -2551,6 +2616,18 @@ var confdMethods = (client , baseUrl ) => ({
2551
2616
  return null;
2552
2617
  }
2553
2618
  },
2619
+
2620
+ createMyMeeting: (name ) =>
2621
+ client.post(`${baseUrl}/users/me/meetings`, { name }).then(Meeting.parse),
2622
+
2623
+ deleteMyMeeting: (meetingUuid ) =>
2624
+ client.delete(`${baseUrl}/users/me/meetings/${meetingUuid}`, null),
2625
+
2626
+ getMeeting: (meetingUuid ) =>
2627
+ client.get(`${baseUrl}/meetings/${meetingUuid}`, null).then(Meeting.parse),
2628
+
2629
+ guestGetMeeting: (meetingUuid ) =>
2630
+ client.get(`${baseUrl}/guests/me/meetings/${meetingUuid}`, null).then(Meeting.parse),
2554
2631
  });
2555
2632
 
2556
2633
  //
@@ -3135,7 +3212,11 @@ class CallLog {
3135
3212
  answered: plain.answered,
3136
3213
  callDirection: plain.call_direction,
3137
3214
  destination: {
3138
- extension: plain.requested_extension || plain.destination_extension,
3215
+ // @TEMP: Temporarily assuming empty numbers are meetings
3216
+ // which is admittedly a very dangerous assumption. Did i mention it was temporary?
3217
+ extension: plain.requested_extension
3218
+ || plain.destination_extension
3219
+ || `meeting-${plain.requested_name || plain.destination_name || ''}`,
3139
3220
  name: plain.requested_name || plain.destination_name || '',
3140
3221
  },
3141
3222
  source: {
@@ -3151,27 +3232,11 @@ class CallLog {
3151
3232
  }
3152
3233
 
3153
3234
  static parseNew(plain , session ) {
3154
- return new CallLog({
3155
- answer: plain.answer ? moment(plain.answer).toDate() : null,
3156
- answered: plain.answered,
3157
- callDirection: plain.call_direction,
3158
- destination: {
3159
- extension: plain.requested_extension || plain.destination_extension,
3160
- name: plain.requested_name || plain.destination_name || '',
3161
- },
3162
- source: {
3163
- extension: plain.source_extension,
3164
- name: plain.source_name,
3165
- },
3166
- id: plain.id,
3167
- duration: (plain.duration || 0) * 1000, // duration is in seconds
3168
- start: moment(plain.start).toDate(),
3169
- end: plain.end ? moment(plain.end).toDate() : null,
3170
- recordings: Recording.parseMany(plain.recordings),
3171
- // @TODO: FIXME add verification declined vs missed call
3172
- newMissedCall: session
3173
- && session.hasExtension(plain.requested_extension || plain.destination_extension) && !plain.answered,
3174
- });
3235
+ const callLog = CallLog.parse(plain);
3236
+ // @TODO: FIXME add verification declined vs missed call
3237
+ callLog.newMissedCall = session
3238
+ && session.hasExtension(plain.requested_extension || plain.destination_extension) && !plain.answered;
3239
+ return callLog;
3175
3240
  }
3176
3241
 
3177
3242
  static newFrom(profile ) {
@@ -3928,6 +3993,9 @@ var calldMethods = (client , baseUrl ) => ({
3928
3993
  getConferenceParticipantsAsUser: async (conferenceId ) =>
3929
3994
  client.get(`${baseUrl}/users/me/conferences/${conferenceId}/participants`),
3930
3995
 
3996
+ getMeetingParticipantsAsUser: async (meetingUuid ) =>
3997
+ client.get(`${baseUrl}/users/me/meetings/${meetingUuid}/participants`),
3998
+
3931
3999
  listTrunks: () => client.get(`${baseUrl}/trunks`),
3932
4000
 
3933
4001
  mute: (callId ) =>
@@ -591,7 +591,13 @@ class IssueReporter {
591
591
  }
592
592
 
593
593
  _isLevelAbove(level1 , level2 ) {
594
- return LOG_LEVELS.indexOf(level1) > LOG_LEVELS.indexOf(level2);
594
+ const index1 = LOG_LEVELS.indexOf(level1);
595
+ const index2 = LOG_LEVELS.indexOf(level2);
596
+ if (index1 === -1 || index2 === -1) {
597
+ return false;
598
+ }
599
+
600
+ return index1 > index2;
595
601
  }
596
602
 
597
603
  _makeCategory(category ) {
@@ -763,7 +769,9 @@ class WazoSessionDescriptionHandler extends SessionDescriptionHandler {
763
769
  .then(() => {
764
770
  if (isConference && (options.constraints && !options.constraints.video) && !('hold' in options) && !audioOnly) {
765
771
  // Add a video an empty bundle to be able to replaceTrack when joining a conference without video
766
- this.peerConnection.addTransceiver('video', { streams: [this._localMediaStream], direction: 'sendrecv' });
772
+ if (this.peerConnection.addTransceiver) {
773
+ this.peerConnection.addTransceiver('video', { streams: [this._localMediaStream], direction: 'sendrecv' });
774
+ }
767
775
  }
768
776
  })
769
777
  .then(() => this.createLocalOfferOrAnswer(options))
@@ -790,12 +798,6 @@ class WazoSessionDescriptionHandler extends SessionDescriptionHandler {
790
798
  };
791
799
  })
792
800
  .then((sessionDescription) => this.applyModifiers(sessionDescription, modifiers))
793
- .then((sessionDescription) => {
794
- // Set new constraints to avoid the constraints check issue in `sdh.getLocalMediaStream` later.
795
- this.localMediaStreamConstraints = options.constraints;
796
-
797
- return sessionDescription;
798
- })
799
801
  .then((sessionDescription) => ({ body: sessionDescription.sdp, contentType: 'application/sdp' }))
800
802
  .catch((error) => {
801
803
  wazoLogger.error('error when creating media', error);
@@ -990,6 +992,9 @@ class WazoSessionDescriptionHandler extends SessionDescriptionHandler {
990
992
 
991
993
  // set the transceiver direction to the answer direction
992
994
  this._peerConnection.getTransceivers().forEach((transceiver) => {
995
+ if (transceiver.stopped) {
996
+ return;
997
+ }
993
998
  if (transceiver.direction /* guarding, but should always be true */) {
994
999
  const { receiver } = transceiver;
995
1000
  if (isConference && audioOnly && receiver.track && receiver.track.kind === 'video') {
@@ -1034,10 +1039,15 @@ class WazoSessionDescriptionHandler extends SessionDescriptionHandler {
1034
1039
  if (kind !== 'audio' && kind !== 'video') {
1035
1040
  throw new Error(`Unknown new track kind ${kind}.`);
1036
1041
  }
1037
- const sender = pc.getSenders().find((otherSender) => otherSender.track && otherSender.track.kind === kind);
1042
+ const sender = pc.getSenders && pc.getSenders().find((otherSender) =>
1043
+ otherSender.track && otherSender.track.kind === kind);
1038
1044
 
1039
1045
  // Do not reuse sender video tracks in SFU
1040
1046
  if (sender && (!sfu || newTrack.kind === 'audio')) {
1047
+ if (sender.track) {
1048
+ // eslint-disable-next-line no-param-reassign
1049
+ newTrack.enabled = sender.track.enabled;
1050
+ }
1041
1051
  trackUpdates.push(
1042
1052
  new Promise((resolve) => {
1043
1053
  this.logger.debug(`SessionDescriptionHandler.setLocalMediaStream - replacing sender ${kind} track`);
@@ -1071,7 +1081,11 @@ class WazoSessionDescriptionHandler extends SessionDescriptionHandler {
1071
1081
  // Review: could make streamless tracks a configurable option?
1072
1082
  // https://developer.mozilla.org/en-US/docs/Web/API/RTCPeerConnection/addTrack#Usage_notes
1073
1083
  try {
1074
- pc.addTrack(newTrack, localStream);
1084
+ if (pc.addTrack) {
1085
+ pc.addTrack(newTrack, localStream);
1086
+ } else {
1087
+ pc.addStream(localStream);
1088
+ }
1075
1089
  } catch (error) {
1076
1090
  this.logger.error(`SessionDescriptionHandler.setLocalMediaStream - failed to add sender ${kind} track`);
1077
1091
  throw error;
@@ -3028,6 +3042,65 @@ class ExternalApp {
3028
3042
  }
3029
3043
  }
3030
3044
 
3045
+ //
3046
+
3047
+
3048
+
3049
+
3050
+
3051
+
3052
+
3053
+
3054
+
3055
+
3056
+
3057
+ class Meeting {
3058
+
3059
+
3060
+
3061
+
3062
+
3063
+
3064
+
3065
+
3066
+
3067
+
3068
+ static parse(plain ) {
3069
+ return new Meeting({
3070
+ guestSipAuthorization: plain.guest_sip_authorization,
3071
+ hostname: plain.hostname,
3072
+ name: plain.name,
3073
+ ownerUuids: plain.owner_uuids,
3074
+ port: plain.port,
3075
+ uuid: plain.uuid,
3076
+ number: plain.number,
3077
+ });
3078
+ }
3079
+
3080
+ static newFrom(meeting ) {
3081
+ return newFrom(meeting, Meeting);
3082
+ }
3083
+
3084
+ constructor({ uuid, name, guestSipAuthorization, ownerUuids, port, hostname, number } = {}) {
3085
+ this.guestSipAuthorization = guestSipAuthorization;
3086
+ this.hostname = hostname;
3087
+ this.name = name;
3088
+ this.ownerUuids = ownerUuids;
3089
+ this.port = port;
3090
+ this.uuid = uuid;
3091
+ this.number = number;
3092
+
3093
+ // Useful to compare instead of instanceof with minified code
3094
+ this.type = 'Meeting';
3095
+ }
3096
+
3097
+ getGuestSipCredentials() {
3098
+ // eslint-disable-next-line no-undef
3099
+ const [username, secret] = atob(this.guestSipAuthorization).split(':');
3100
+ return { username, secret };
3101
+ }
3102
+ }
3103
+
3031
3104
  /* */
3032
3105
 
3033
3106
  var confdMethods = (client , baseUrl ) => ({
@@ -3092,6 +3165,18 @@ var confdMethods = (client , baseUrl ) => ({
3092
3165
  return null;
3093
3166
  }
3094
3167
  },
3168
+
3169
+ createMyMeeting: (name ) =>
3170
+ client.post(`${baseUrl}/users/me/meetings`, { name }).then(Meeting.parse),
3171
+
3172
+ deleteMyMeeting: (meetingUuid ) =>
3173
+ client.delete(`${baseUrl}/users/me/meetings/${meetingUuid}`, null),
3174
+
3175
+ getMeeting: (meetingUuid ) =>
3176
+ client.get(`${baseUrl}/meetings/${meetingUuid}`, null).then(Meeting.parse),
3177
+
3178
+ guestGetMeeting: (meetingUuid ) =>
3179
+ client.get(`${baseUrl}/guests/me/meetings/${meetingUuid}`, null).then(Meeting.parse),
3095
3180
  });
3096
3181
 
3097
3182
  //
@@ -3676,7 +3761,11 @@ class CallLog {
3676
3761
  answered: plain.answered,
3677
3762
  callDirection: plain.call_direction,
3678
3763
  destination: {
3679
- extension: plain.requested_extension || plain.destination_extension,
3764
+ // @TEMP: Temporarily assuming empty numbers are meetings
3765
+ // which is admittedly a very dangerous assumption. Did i mention it was temporary?
3766
+ extension: plain.requested_extension
3767
+ || plain.destination_extension
3768
+ || `meeting-${plain.requested_name || plain.destination_name || ''}`,
3680
3769
  name: plain.requested_name || plain.destination_name || '',
3681
3770
  },
3682
3771
  source: {
@@ -3692,27 +3781,11 @@ class CallLog {
3692
3781
  }
3693
3782
 
3694
3783
  static parseNew(plain , session ) {
3695
- return new CallLog({
3696
- answer: plain.answer ? moment(plain.answer).toDate() : null,
3697
- answered: plain.answered,
3698
- callDirection: plain.call_direction,
3699
- destination: {
3700
- extension: plain.requested_extension || plain.destination_extension,
3701
- name: plain.requested_name || plain.destination_name || '',
3702
- },
3703
- source: {
3704
- extension: plain.source_extension,
3705
- name: plain.source_name,
3706
- },
3707
- id: plain.id,
3708
- duration: (plain.duration || 0) * 1000, // duration is in seconds
3709
- start: moment(plain.start).toDate(),
3710
- end: plain.end ? moment(plain.end).toDate() : null,
3711
- recordings: Recording.parseMany(plain.recordings),
3712
- // @TODO: FIXME add verification declined vs missed call
3713
- newMissedCall: session
3714
- && session.hasExtension(plain.requested_extension || plain.destination_extension) && !plain.answered,
3715
- });
3784
+ const callLog = CallLog.parse(plain);
3785
+ // @TODO: FIXME add verification declined vs missed call
3786
+ callLog.newMissedCall = session
3787
+ && session.hasExtension(plain.requested_extension || plain.destination_extension) && !plain.answered;
3788
+ return callLog;
3716
3789
  }
3717
3790
 
3718
3791
  static newFrom(profile ) {
@@ -4469,6 +4542,9 @@ var calldMethods = (client , baseUrl ) => ({
4469
4542
  getConferenceParticipantsAsUser: async (conferenceId ) =>
4470
4543
  client.get(`${baseUrl}/users/me/conferences/${conferenceId}/participants`),
4471
4544
 
4545
+ getMeetingParticipantsAsUser: async (meetingUuid ) =>
4546
+ client.get(`${baseUrl}/users/me/meetings/${meetingUuid}/participants`),
4547
+
4472
4548
  listTrunks: () => client.get(`${baseUrl}/trunks`),
4473
4549
 
4474
4550
  mute: (callId ) =>
@@ -5101,6 +5177,7 @@ const MAX_REGISTER_TRIES = 10;
5101
5177
 
5102
5178
 
5103
5179
 
5180
+
5104
5181
 
5105
5182
 
5106
5183
 
@@ -5127,6 +5204,7 @@ class WebRTCClient extends Emitter {
5127
5204
 
5128
5205
 
5129
5206
 
5207
+
5130
5208
 
5131
5209
  // sugar
5132
5210
 
@@ -5165,6 +5243,8 @@ class WebRTCClient extends Emitter {
5165
5243
  super();
5166
5244
  this.uaConfigOverrides = uaConfigOverrides;
5167
5245
  this.config = config;
5246
+ this.skipRegister = config.skipRegister;
5247
+
5168
5248
  this._buildConfig(config, session).then((newConfig ) => {
5169
5249
  this.config = newConfig;
5170
5250
  this.userAgent = this.createUserAgent(uaConfigOverrides);
@@ -5292,14 +5372,22 @@ class WebRTCClient extends Emitter {
5292
5372
  }
5293
5373
 
5294
5374
  register(tries = 0) {
5295
- logger.info('sdk webrtc registering...', {
5375
+ const logInfo = {
5296
5376
  userAgent: !!this.userAgent,
5297
5377
  registered: this.isRegistered(),
5298
5378
  connectionPromise: !!this.connectionPromise,
5299
5379
  registerer: !!this.registerer,
5300
5380
  waiting: this.registerer && this.registerer.waiting,
5301
5381
  tries,
5302
- });
5382
+ skipRegister: this.skipRegister,
5383
+ };
5384
+
5385
+ if (this.skipRegister) {
5386
+ logger.info('sdk webrtc skip register...', logInfo);
5387
+ return Promise.resolve();
5388
+ }
5389
+
5390
+ logger.info('sdk webrtc registering...', logInfo);
5303
5391
 
5304
5392
  if (!this.userAgent) {
5305
5393
  logger.info('sdk webrtc recreating User Agent');
@@ -5630,12 +5718,18 @@ class WebRTCClient extends Emitter {
5630
5718
  }
5631
5719
 
5632
5720
  if (pc.getSenders) {
5721
+ if (!pc.getSenders().length) {
5722
+ return false;
5723
+ }
5633
5724
  pc.getSenders().forEach(sender => {
5634
5725
  if (sender && sender.track && sender.track.kind === 'audio') {
5635
5726
  muted = muted && !sender.track.enabled;
5636
5727
  }
5637
5728
  });
5638
5729
  } else {
5730
+ if (!pc.getLocalStreams().length) {
5731
+ return false;
5732
+ }
5639
5733
  pc.getLocalStreams().forEach(stream => {
5640
5734
  stream.getAudioTracks().forEach(track => {
5641
5735
  muted = muted && !track.enabled;
@@ -5692,6 +5786,9 @@ class WebRTCClient extends Emitter {
5692
5786
  if (!this._isWeb()) {
5693
5787
  options.sessionDescriptionHandlerModifiers = [holdModifier];
5694
5788
  }
5789
+ options.sessionDescriptionHandlerOptions = {
5790
+ constraints: options.constraints,
5791
+ };
5695
5792
 
5696
5793
  // Send re-INVITE
5697
5794
  return session.invite(options);
@@ -5731,6 +5828,9 @@ class WebRTCClient extends Emitter {
5731
5828
  // (eg: holdModifier)
5732
5829
  options.sessionDescriptionHandlerModifiers = [];
5733
5830
  }
5831
+ options.sessionDescriptionHandlerOptions = {
5832
+ constraints: options.constraints,
5833
+ };
5734
5834
 
5735
5835
  // Send re-INVITE
5736
5836
  return session.invite(options);
@@ -5913,7 +6013,8 @@ class WebRTCClient extends Emitter {
5913
6013
  }
5914
6014
  const sdh = session.sessionDescriptionHandler;
5915
6015
  const pc = sdh.peerConnection;
5916
- const localStream = this.getLocalStream(this.getSipSessionId(session));
6016
+ const sessionId = this.getSipSessionId(session);
6017
+ const localStream = this.getLocalStream(sessionId);
5917
6018
 
5918
6019
  // Release old video stream
5919
6020
  if (localStream) {
@@ -5939,11 +6040,8 @@ class WebRTCClient extends Emitter {
5939
6040
 
5940
6041
  // let's update the local stream
5941
6042
  this.eventEmitter.emit('onVideoInputChange', stream);
5942
- try {
5943
- await sdh.setLocalMediaStream(stream);
5944
- } catch (_) {
5945
- // Nothing to do
5946
- }
6043
+ this.setLocalMediaStream(sessionId, stream);
6044
+
5947
6045
  return stream;
5948
6046
  });
5949
6047
  }
@@ -6245,9 +6343,11 @@ class WebRTCClient extends Emitter {
6245
6343
  remoteStream.removeTrack(track);
6246
6344
  });
6247
6345
 
6248
- pc.getReceivers().forEach(receiver => {
6249
- remoteStream.addTrack(receiver.track);
6250
- });
6346
+ if (pc.getReceivers) {
6347
+ pc.getReceivers().forEach(receiver => {
6348
+ remoteStream.addTrack(receiver.track);
6349
+ });
6350
+ }
6251
6351
  }
6252
6352
 
6253
6353
  getMediaConfiguration(enableVideo , conference = false, constraints = null) {
@@ -6282,6 +6382,25 @@ class WebRTCClient extends Emitter {
6282
6382
  return sessionId in this.conferences;
6283
6383
  }
6284
6384
 
6385
+ createAudioElementFor(sessionId ) {
6386
+ const audio = document.createElement('audio');
6387
+ audio.setAttribute('id', `audio-${sessionId}`);
6388
+
6389
+ if (audio.setSinkId && this.audioOutputDeviceId) {
6390
+ audio.setSinkId(this.audioOutputDeviceId);
6391
+ }
6392
+
6393
+ if (document.body) {
6394
+ document.body.appendChild(audio);
6395
+ }
6396
+ this.audioElements[sessionId] = audio;
6397
+
6398
+ audio.volume = this.audioOutputVolume;
6399
+ audio.autoplay = true;
6400
+
6401
+ return audio;
6402
+ }
6403
+
6285
6404
  _onTransportError() {
6286
6405
  this.eventEmitter.emit(TRANSPORT_ERROR);
6287
6406
  this.attemptReconnection();
@@ -6511,7 +6630,7 @@ class WebRTCClient extends Emitter {
6511
6630
  let hadRemoteVideo = false;
6512
6631
 
6513
6632
  // Monkey patch `onInviteRequest` to be able to know if there was a remote video stream before `onInvite` is called
6514
- // Becase when `onInvite` is called we already got the video track
6633
+ // Because when `onInvite` is called we already got the video track
6515
6634
  session.onInviteRequest = (request) => {
6516
6635
  hadRemoteVideo = this.hasARemoteVideoTrack(sipSessionId);
6517
6636
 
@@ -6586,20 +6705,10 @@ class WebRTCClient extends Emitter {
6586
6705
  const isConference = this.isConference(sessionId);
6587
6706
 
6588
6707
  if (this._hasAudio() && this._isWeb() && !(sessionId in this.audioElements)) {
6589
- const audio = document.createElement('audio');
6590
- audio.setAttribute('id', `audio-${sessionId}`);
6591
-
6592
- if (audio.setSinkId && this.audioOutputDeviceId) {
6593
- audio.setSinkId(this.audioOutputDeviceId);
6594
- }
6595
-
6596
- if (document.body) {
6597
- document.body.appendChild(audio);
6598
- }
6599
- this.audioElements[sessionId] = audio;
6708
+ this.createAudioElementFor(sessionId);
6600
6709
  }
6601
6710
 
6602
- const audioElement = this.audioElements[this.getSipSessionId(session)];
6711
+ const audioElement = this.audioElements[sessionId];
6603
6712
  const stream = newStream || this.getRemoteStream(sessionId);
6604
6713
 
6605
6714
  if (!this._isWeb() || !stream) {
package/esm/api/agentd.js CHANGED
@@ -305,7 +305,13 @@ class IssueReporter {
305
305
  }
306
306
 
307
307
  _isLevelAbove(level1 , level2 ) {
308
- return LOG_LEVELS.indexOf(level1) > LOG_LEVELS.indexOf(level2);
308
+ const index1 = LOG_LEVELS.indexOf(level1);
309
+ const index2 = LOG_LEVELS.indexOf(level2);
310
+ if (index1 === -1 || index2 === -1) {
311
+ return false;
312
+ }
313
+
314
+ return index1 > index2;
309
315
  }
310
316
 
311
317
  _makeCategory(category ) {
package/esm/api/amid.js CHANGED
@@ -244,7 +244,13 @@ class IssueReporter {
244
244
  }
245
245
 
246
246
  _isLevelAbove(level1 , level2 ) {
247
- return LOG_LEVELS.indexOf(level1) > LOG_LEVELS.indexOf(level2);
247
+ const index1 = LOG_LEVELS.indexOf(level1);
248
+ const index2 = LOG_LEVELS.indexOf(level2);
249
+ if (index1 === -1 || index2 === -1) {
250
+ return false;
251
+ }
252
+
253
+ return index1 > index2;
248
254
  }
249
255
 
250
256
  _makeCategory(category ) {
@@ -305,7 +305,13 @@ class IssueReporter {
305
305
  }
306
306
 
307
307
  _isLevelAbove(level1 , level2 ) {
308
- return LOG_LEVELS.indexOf(level1) > LOG_LEVELS.indexOf(level2);
308
+ const index1 = LOG_LEVELS.indexOf(level1);
309
+ const index2 = LOG_LEVELS.indexOf(level2);
310
+ if (index1 === -1 || index2 === -1) {
311
+ return false;
312
+ }
313
+
314
+ return index1 > index2;
309
315
  }
310
316
 
311
317
  _makeCategory(category ) {
package/esm/api/auth.js CHANGED
@@ -306,7 +306,13 @@ class IssueReporter {
306
306
  }
307
307
 
308
308
  _isLevelAbove(level1 , level2 ) {
309
- return LOG_LEVELS.indexOf(level1) > LOG_LEVELS.indexOf(level2);
309
+ const index1 = LOG_LEVELS.indexOf(level1);
310
+ const index2 = LOG_LEVELS.indexOf(level2);
311
+ if (index1 === -1 || index2 === -1) {
312
+ return false;
313
+ }
314
+
315
+ return index1 > index2;
310
316
  }
311
317
 
312
318
  _makeCategory(category ) {
@@ -245,7 +245,13 @@ class IssueReporter {
245
245
  }
246
246
 
247
247
  _isLevelAbove(level1 , level2 ) {
248
- return LOG_LEVELS.indexOf(level1) > LOG_LEVELS.indexOf(level2);
248
+ const index1 = LOG_LEVELS.indexOf(level1);
249
+ const index2 = LOG_LEVELS.indexOf(level2);
250
+ if (index1 === -1 || index2 === -1) {
251
+ return false;
252
+ }
253
+
254
+ return index1 > index2;
249
255
  }
250
256
 
251
257
  _makeCategory(category ) {
@@ -444,7 +450,11 @@ class CallLog {
444
450
  answered: plain.answered,
445
451
  callDirection: plain.call_direction,
446
452
  destination: {
447
- extension: plain.requested_extension || plain.destination_extension,
453
+ // @TEMP: Temporarily assuming empty numbers are meetings
454
+ // which is admittedly a very dangerous assumption. Did i mention it was temporary?
455
+ extension: plain.requested_extension
456
+ || plain.destination_extension
457
+ || `meeting-${plain.requested_name || plain.destination_name || ''}`,
448
458
  name: plain.requested_name || plain.destination_name || '',
449
459
  },
450
460
  source: {
@@ -460,27 +470,11 @@ class CallLog {
460
470
  }
461
471
 
462
472
  static parseNew(plain , session ) {
463
- return new CallLog({
464
- answer: plain.answer ? moment(plain.answer).toDate() : null,
465
- answered: plain.answered,
466
- callDirection: plain.call_direction,
467
- destination: {
468
- extension: plain.requested_extension || plain.destination_extension,
469
- name: plain.requested_name || plain.destination_name || '',
470
- },
471
- source: {
472
- extension: plain.source_extension,
473
- name: plain.source_name,
474
- },
475
- id: plain.id,
476
- duration: (plain.duration || 0) * 1000, // duration is in seconds
477
- start: moment(plain.start).toDate(),
478
- end: plain.end ? moment(plain.end).toDate() : null,
479
- recordings: Recording.parseMany(plain.recordings),
480
- // @TODO: FIXME add verification declined vs missed call
481
- newMissedCall: session
482
- && session.hasExtension(plain.requested_extension || plain.destination_extension) && !plain.answered,
483
- });
473
+ const callLog = CallLog.parse(plain);
474
+ // @TODO: FIXME add verification declined vs missed call
475
+ callLog.newMissedCall = session
476
+ && session.hasExtension(plain.requested_extension || plain.destination_extension) && !plain.answered;
477
+ return callLog;
484
478
  }
485
479
 
486
480
  static newFrom(profile ) {