@wazo/sdk 0.38.4 → 0.38.7

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 (99) hide show
  1. package/README.md +4 -4
  2. package/dist/wazo-sdk.js +2 -2
  3. package/esm/__tests__/api-client.test.js +6 -0
  4. package/esm/__tests__/web-rtc-client.test.js +88 -3
  5. package/esm/api/calld.js +6 -0
  6. package/esm/api/ctid-ng.js +6 -0
  7. package/esm/api-client.js +6 -0
  8. package/esm/checker/Checker.js +38 -3
  9. package/esm/checker/checks/aor.js +6 -0
  10. package/esm/checker/checks/api.js +6 -0
  11. package/esm/checker/checks/index.js +38 -3
  12. package/esm/checker/checks/webrtc-transport.js +38 -3
  13. package/esm/checker/checks/webrtc.js +38 -3
  14. package/esm/domain/AdHocAPIConference.js +6 -0
  15. package/esm/domain/Call.js +6 -0
  16. package/esm/domain/CallSession.js +1 -1
  17. package/esm/domain/Features.js +6 -0
  18. package/esm/domain/Phone/CTIPhone.js +7 -1
  19. package/esm/domain/Phone/WebRTCPhone.js +3 -3
  20. package/esm/domain/__tests__/Call.test.js +6 -0
  21. package/esm/domain/__tests__/CallSession.test.js +1 -1
  22. package/esm/domain/__tests__/IndirectTransfer.test.js +1 -1
  23. package/esm/domain/__tests__/Line.test.js +5 -5
  24. package/esm/domain/__tests__/Room.test.js +1 -1
  25. package/esm/index.js +42 -8
  26. package/esm/lib/WazoSessionDescriptionHandler.js +30 -1
  27. package/esm/service/CallApi.js +6 -0
  28. package/esm/service/getApiClient.js +6 -0
  29. package/esm/simple/Auth.js +42 -8
  30. package/esm/simple/Configuration.js +42 -8
  31. package/esm/simple/Directory.js +6 -0
  32. package/esm/simple/Phone.js +42 -8
  33. package/esm/simple/Softphone.js +1 -2
  34. package/esm/simple/index.js +42 -8
  35. package/esm/simple/room/LocalParticipant.js +42 -8
  36. package/esm/simple/room/Participant.js +42 -8
  37. package/esm/simple/room/RemoteParticipant.js +42 -8
  38. package/esm/simple/room/Room.js +42 -8
  39. package/esm/simple/room/SipRoom.js +42 -8
  40. package/esm/simple/room/Stream.js +42 -8
  41. package/esm/simple/room/__tests__/RemoteParticipant.test.js +42 -8
  42. package/esm/simple/utils.js +42 -8
  43. package/esm/utils/__tests__/sdp.test.js +50 -0
  44. package/esm/utils/sdp.js +19 -1
  45. package/esm/web-rtc-client.js +38 -3
  46. package/lib/__tests__/api-client.test.js +6 -0
  47. package/lib/__tests__/web-rtc-client.test.js +88 -3
  48. package/lib/api/calld.js +6 -0
  49. package/lib/api/ctid-ng.js +6 -0
  50. package/lib/api-client.js +6 -0
  51. package/lib/checker/Checker.js +38 -3
  52. package/lib/checker/checks/aor.js +6 -0
  53. package/lib/checker/checks/api.js +6 -0
  54. package/lib/checker/checks/index.js +38 -3
  55. package/lib/checker/checks/webrtc-transport.js +38 -3
  56. package/lib/checker/checks/webrtc.js +38 -3
  57. package/lib/domain/AdHocAPIConference.js +6 -0
  58. package/lib/domain/Call.js +6 -0
  59. package/lib/domain/CallSession.js +1 -1
  60. package/lib/domain/Features.js +6 -0
  61. package/lib/domain/Phone/CTIPhone.js +7 -1
  62. package/lib/domain/Phone/WebRTCPhone.js +3 -3
  63. package/lib/domain/__tests__/Call.test.js +6 -0
  64. package/lib/domain/__tests__/CallSession.test.js +1 -1
  65. package/lib/domain/__tests__/IndirectTransfer.test.js +1 -1
  66. package/lib/domain/__tests__/Line.test.js +5 -5
  67. package/lib/domain/__tests__/Room.test.js +1 -1
  68. package/lib/index.js +42 -8
  69. package/lib/lib/WazoSessionDescriptionHandler.js +30 -1
  70. package/lib/service/CallApi.js +6 -0
  71. package/lib/service/getApiClient.js +6 -0
  72. package/lib/simple/Auth.js +42 -8
  73. package/lib/simple/Configuration.js +42 -8
  74. package/lib/simple/Directory.js +6 -0
  75. package/lib/simple/Phone.js +42 -8
  76. package/lib/simple/Softphone.js +1 -2
  77. package/lib/simple/index.js +42 -8
  78. package/lib/simple/room/LocalParticipant.js +42 -8
  79. package/lib/simple/room/Participant.js +42 -8
  80. package/lib/simple/room/RemoteParticipant.js +42 -8
  81. package/lib/simple/room/Room.js +42 -8
  82. package/lib/simple/room/SipRoom.js +42 -8
  83. package/lib/simple/room/Stream.js +42 -8
  84. package/lib/simple/room/__tests__/RemoteParticipant.test.js +42 -8
  85. package/lib/simple/utils.js +42 -8
  86. package/lib/utils/__tests__/sdp.test.js +50 -0
  87. package/lib/utils/sdp.js +19 -0
  88. package/lib/web-rtc-client.js +38 -3
  89. package/package.json +1 -1
  90. package/src/__tests__/web-rtc-client.test.js +50 -0
  91. package/src/domain/Call.js +6 -0
  92. package/src/domain/CallSession.js +1 -1
  93. package/src/domain/Phone/WebRTCPhone.js +2 -2
  94. package/src/domain/__tests__/Line.test.js +5 -5
  95. package/src/lib/WazoSessionDescriptionHandler.js +13 -2
  96. package/src/simple/Softphone.js +1 -2
  97. package/src/utils/__tests__/sdp.test.js +33 -1
  98. package/src/utils/sdp.js +18 -0
  99. package/src/web-rtc-client.js +2 -2
@@ -36,6 +36,7 @@ const RECORD_STATE_ACTIVE = 'active';
36
36
 
37
37
 
38
38
 
39
+
39
40
 
40
41
 
41
42
 
@@ -46,6 +47,7 @@ const RECORD_STATE_ACTIVE = 'active';
46
47
 
47
48
 
48
49
 
50
+
49
51
 
50
52
 
51
53
 
@@ -74,6 +76,7 @@ class Call {
74
76
 
75
77
 
76
78
 
79
+
77
80
 
78
81
 
79
82
 
@@ -98,6 +101,7 @@ class Call {
98
101
  calleeNumber: plain.peer_caller_id_number,
99
102
  dialedExtension: plain.dialed_extension,
100
103
  isCaller: plain.is_caller,
104
+ isVideo: plain.is_video,
101
105
  muted: plain.muted,
102
106
  onHold: plain.on_hold,
103
107
  status: plain.status,
@@ -121,6 +125,7 @@ class Call {
121
125
  calleeNumber,
122
126
  dialedExtension,
123
127
  isCaller,
128
+ isVideo,
124
129
  lineId,
125
130
  muted,
126
131
  onHold,
@@ -144,6 +149,7 @@ class Call {
144
149
  this.startingTime = startingTime;
145
150
  this.talkingToIds = talkingToIds || [];
146
151
  this.recording = recording;
152
+ this.isVideo = !!isVideo;
147
153
 
148
154
  // Useful to compare instead of instanceof with minified code
149
155
  this.type = 'Call';
@@ -31,6 +31,7 @@ const RECORD_STATE_ACTIVE = 'active';
31
31
 
32
32
 
33
33
 
34
+
34
35
 
35
36
 
36
37
 
@@ -41,6 +42,7 @@ const RECORD_STATE_ACTIVE = 'active';
41
42
 
42
43
 
43
44
 
45
+
44
46
 
45
47
 
46
48
 
@@ -69,6 +71,7 @@ class Call {
69
71
 
70
72
 
71
73
 
74
+
72
75
 
73
76
 
74
77
 
@@ -93,6 +96,7 @@ class Call {
93
96
  calleeNumber: plain.peer_caller_id_number,
94
97
  dialedExtension: plain.dialed_extension,
95
98
  isCaller: plain.is_caller,
99
+ isVideo: plain.is_video,
96
100
  muted: plain.muted,
97
101
  onHold: plain.on_hold,
98
102
  status: plain.status,
@@ -116,6 +120,7 @@ class Call {
116
120
  calleeNumber,
117
121
  dialedExtension,
118
122
  isCaller,
123
+ isVideo,
119
124
  lineId,
120
125
  muted,
121
126
  onHold,
@@ -139,6 +144,7 @@ class Call {
139
144
  this.startingTime = startingTime;
140
145
  this.talkingToIds = talkingToIds || [];
141
146
  this.recording = recording;
147
+ this.isVideo = !!isVideo;
142
148
 
143
149
  // Useful to compare instead of instanceof with minified code
144
150
  this.type = 'Call';
@@ -416,7 +416,7 @@ class CallSession {
416
416
  ringing: call.isRinging(),
417
417
  answered: call.isUp(),
418
418
  answeredBySystem: call.isUp() && call.talkingToIds.length === 0,
419
- cameraEnabled: false,
419
+ cameraEnabled: call.isVideo,
420
420
  dialedExtension: call.dialedExtension,
421
421
  call,
422
422
  conference: false, // @FIXME?
@@ -3059,6 +3059,7 @@ const RECORD_STATE_ACTIVE = 'active';
3059
3059
 
3060
3060
 
3061
3061
 
3062
+
3062
3063
 
3063
3064
 
3064
3065
 
@@ -3069,6 +3070,7 @@ const RECORD_STATE_ACTIVE = 'active';
3069
3070
 
3070
3071
 
3071
3072
 
3073
+
3072
3074
 
3073
3075
 
3074
3076
 
@@ -3097,6 +3099,7 @@ class Call {
3097
3099
 
3098
3100
 
3099
3101
 
3102
+
3100
3103
 
3101
3104
 
3102
3105
 
@@ -3121,6 +3124,7 @@ class Call {
3121
3124
  calleeNumber: plain.peer_caller_id_number,
3122
3125
  dialedExtension: plain.dialed_extension,
3123
3126
  isCaller: plain.is_caller,
3127
+ isVideo: plain.is_video,
3124
3128
  muted: plain.muted,
3125
3129
  onHold: plain.on_hold,
3126
3130
  status: plain.status,
@@ -3144,6 +3148,7 @@ class Call {
3144
3148
  calleeNumber,
3145
3149
  dialedExtension,
3146
3150
  isCaller,
3151
+ isVideo,
3147
3152
  lineId,
3148
3153
  muted,
3149
3154
  onHold,
@@ -3167,6 +3172,7 @@ class Call {
3167
3172
  this.startingTime = startingTime;
3168
3173
  this.talkingToIds = talkingToIds || [];
3169
3174
  this.recording = recording;
3175
+ this.isVideo = !!isVideo;
3170
3176
 
3171
3177
  // Useful to compare instead of instanceof with minified code
3172
3178
  this.type = 'Call';
@@ -1522,6 +1522,7 @@ const RECORD_STATE_ACTIVE = 'active';
1522
1522
 
1523
1523
 
1524
1524
 
1525
+
1525
1526
 
1526
1527
 
1527
1528
 
@@ -1532,6 +1533,7 @@ const RECORD_STATE_ACTIVE = 'active';
1532
1533
 
1533
1534
 
1534
1535
 
1536
+
1535
1537
 
1536
1538
 
1537
1539
 
@@ -1560,6 +1562,7 @@ class Call {
1560
1562
 
1561
1563
 
1562
1564
 
1565
+
1563
1566
 
1564
1567
 
1565
1568
 
@@ -1584,6 +1587,7 @@ class Call {
1584
1587
  calleeNumber: plain.peer_caller_id_number,
1585
1588
  dialedExtension: plain.dialed_extension,
1586
1589
  isCaller: plain.is_caller,
1590
+ isVideo: plain.is_video,
1587
1591
  muted: plain.muted,
1588
1592
  onHold: plain.on_hold,
1589
1593
  status: plain.status,
@@ -1607,6 +1611,7 @@ class Call {
1607
1611
  calleeNumber,
1608
1612
  dialedExtension,
1609
1613
  isCaller,
1614
+ isVideo,
1610
1615
  lineId,
1611
1616
  muted,
1612
1617
  onHold,
@@ -1630,6 +1635,7 @@ class Call {
1630
1635
  this.startingTime = startingTime;
1631
1636
  this.talkingToIds = talkingToIds || [];
1632
1637
  this.recording = recording;
1638
+ this.isVideo = !!isVideo;
1633
1639
 
1634
1640
  // Useful to compare instead of instanceof with minified code
1635
1641
  this.type = 'Call';
@@ -2103,7 +2109,7 @@ class CallSession {
2103
2109
  ringing: call.isRinging(),
2104
2110
  answered: call.isUp(),
2105
2111
  answeredBySystem: call.isUp() && call.talkingToIds.length === 0,
2106
- cameraEnabled: false,
2112
+ cameraEnabled: call.isVideo,
2107
2113
  dialedExtension: call.dialedExtension,
2108
2114
  call,
2109
2115
  conference: false, // @FIXME?
@@ -445,7 +445,7 @@ class CallSession {
445
445
  ringing: call.isRinging(),
446
446
  answered: call.isUp(),
447
447
  answeredBySystem: call.isUp() && call.talkingToIds.length === 0,
448
- cameraEnabled: false,
448
+ cameraEnabled: call.isVideo,
449
449
  dialedExtension: call.dialedExtension,
450
450
  call,
451
451
  conference: false, // @FIXME?
@@ -1579,10 +1579,10 @@ class WebRTCPhone extends Emitter {
1579
1579
  this.audioRingVolume = volume;
1580
1580
  }
1581
1581
 
1582
- changeAudioInputDevice(id ) {
1582
+ changeAudioInputDevice(id , force ) {
1583
1583
  logger.info('WebRTC phone - changeAudio input device', { deviceId: id });
1584
1584
 
1585
- return this.client.changeAudioInputDevice(id, this.currentSipSession);
1585
+ return this.client.changeAudioInputDevice(id, this.currentSipSession, force);
1586
1586
  }
1587
1587
 
1588
1588
  changeVideoInputDevice(id ) {
@@ -31,6 +31,7 @@ const RECORD_STATE_ACTIVE = 'active';
31
31
 
32
32
 
33
33
 
34
+
34
35
 
35
36
 
36
37
 
@@ -41,6 +42,7 @@ const RECORD_STATE_ACTIVE = 'active';
41
42
 
42
43
 
43
44
 
45
+
44
46
 
45
47
 
46
48
 
@@ -69,6 +71,7 @@ class Call {
69
71
 
70
72
 
71
73
 
74
+
72
75
 
73
76
 
74
77
 
@@ -93,6 +96,7 @@ class Call {
93
96
  calleeNumber: plain.peer_caller_id_number,
94
97
  dialedExtension: plain.dialed_extension,
95
98
  isCaller: plain.is_caller,
99
+ isVideo: plain.is_video,
96
100
  muted: plain.muted,
97
101
  onHold: plain.on_hold,
98
102
  status: plain.status,
@@ -116,6 +120,7 @@ class Call {
116
120
  calleeNumber,
117
121
  dialedExtension,
118
122
  isCaller,
123
+ isVideo,
119
124
  lineId,
120
125
  muted,
121
126
  onHold,
@@ -139,6 +144,7 @@ class Call {
139
144
  this.startingTime = startingTime;
140
145
  this.talkingToIds = talkingToIds || [];
141
146
  this.recording = recording;
147
+ this.isVideo = !!isVideo;
142
148
 
143
149
  // Useful to compare instead of instanceof with minified code
144
150
  this.type = 'Call';
@@ -416,7 +416,7 @@ class CallSession {
416
416
  ringing: call.isRinging(),
417
417
  answered: call.isUp(),
418
418
  answeredBySystem: call.isUp() && call.talkingToIds.length === 0,
419
- cameraEnabled: false,
419
+ cameraEnabled: call.isVideo,
420
420
  dialedExtension: call.dialedExtension,
421
421
  call,
422
422
  conference: false, // @FIXME?
@@ -416,7 +416,7 @@ class CallSession {
416
416
  ringing: call.isRinging(),
417
417
  answered: call.isUp(),
418
418
  answeredBySystem: call.isUp() && call.talkingToIds.length === 0,
419
- cameraEnabled: false,
419
+ cameraEnabled: call.isVideo,
420
420
  dialedExtension: call.dialedExtension,
421
421
  call,
422
422
  conference: false, // @FIXME?
@@ -100,7 +100,7 @@ describe('Line domain', () => {
100
100
  username: 'ipcor1pj',
101
101
  links: [
102
102
  {
103
- href: 'https://stack.dev.wazo.io/api/confd/1.1/endpoints/sip/19',
103
+ href: 'https://stack.example.com/api/confd/1.1/endpoints/sip/19',
104
104
  rel: 'endpoint_sip',
105
105
  },
106
106
  ],
@@ -114,7 +114,7 @@ describe('Line domain', () => {
114
114
  context: 'default',
115
115
  links: [
116
116
  {
117
- href: 'https://stack.dev.wazo.io/api/confd/1.1/extensions/59',
117
+ href: 'https://stack.example.com/api/confd/1.1/extensions/59',
118
118
  rel: 'extensions',
119
119
  },
120
120
  ],
@@ -122,7 +122,7 @@ describe('Line domain', () => {
122
122
  ],
123
123
  links: [
124
124
  {
125
- href: 'https://stack.dev.wazo.io/api/confd/1.1/lines/8',
125
+ href: 'https://stack.example.com/api/confd/1.1/lines/8',
126
126
  rel: 'lines',
127
127
  },
128
128
  ],
@@ -140,7 +140,7 @@ describe('Line domain', () => {
140
140
  context: 'default',
141
141
  links: [
142
142
  {
143
- href: 'https://stack.dev.wazo.io/api/confd/1.1/extensions/59',
143
+ href: 'https://stack.example.com/api/confd/1.1/extensions/59',
144
144
  rel: 'extensions',
145
145
  },
146
146
  ],
@@ -150,7 +150,7 @@ describe('Line domain', () => {
150
150
  id: 19,
151
151
  links: [
152
152
  {
153
- href: 'https://stack.dev.wazo.io/api/confd/1.1/endpoints/sip/19',
153
+ href: 'https://stack.example.com/api/confd/1.1/endpoints/sip/19',
154
154
  rel: 'endpoint_sip',
155
155
  },
156
156
  ],
@@ -416,7 +416,7 @@ class CallSession {
416
416
  ringing: call.isRinging(),
417
417
  answered: call.isUp(),
418
418
  answeredBySystem: call.isUp() && call.talkingToIds.length === 0,
419
- cameraEnabled: false,
419
+ cameraEnabled: call.isVideo,
420
420
  dialedExtension: call.dialedExtension,
421
421
  call,
422
422
  conference: false, // @FIXME?
package/lib/index.js CHANGED
@@ -3083,6 +3083,7 @@ const RECORD_STATE_ACTIVE = 'active';
3083
3083
 
3084
3084
 
3085
3085
 
3086
+
3086
3087
 
3087
3088
 
3088
3089
 
@@ -3093,6 +3094,7 @@ const RECORD_STATE_ACTIVE = 'active';
3093
3094
 
3094
3095
 
3095
3096
 
3097
+
3096
3098
 
3097
3099
 
3098
3100
 
@@ -3121,6 +3123,7 @@ class Call {
3121
3123
 
3122
3124
 
3123
3125
 
3126
+
3124
3127
 
3125
3128
 
3126
3129
 
@@ -3145,6 +3148,7 @@ class Call {
3145
3148
  calleeNumber: plain.peer_caller_id_number,
3146
3149
  dialedExtension: plain.dialed_extension,
3147
3150
  isCaller: plain.is_caller,
3151
+ isVideo: plain.is_video,
3148
3152
  muted: plain.muted,
3149
3153
  onHold: plain.on_hold,
3150
3154
  status: plain.status,
@@ -3168,6 +3172,7 @@ class Call {
3168
3172
  calleeNumber,
3169
3173
  dialedExtension,
3170
3174
  isCaller,
3175
+ isVideo,
3171
3176
  lineId,
3172
3177
  muted,
3173
3178
  onHold,
@@ -3191,6 +3196,7 @@ class Call {
3191
3196
  this.startingTime = startingTime;
3192
3197
  this.talkingToIds = talkingToIds || [];
3193
3198
  this.recording = recording;
3199
+ this.isVideo = !!isVideo;
3194
3200
 
3195
3201
  // Useful to compare instead of instanceof with minified code
3196
3202
  this.type = 'Call';
@@ -3664,7 +3670,7 @@ class CallSession {
3664
3670
  ringing: call.isRinging(),
3665
3671
  answered: call.isUp(),
3666
3672
  answeredBySystem: call.isUp() && call.talkingToIds.length === 0,
3667
- cameraEnabled: false,
3673
+ cameraEnabled: call.isVideo,
3668
3674
  dialedExtension: call.dialedExtension,
3669
3675
  call,
3670
3676
  conference: false, // @FIXME?
@@ -5730,6 +5736,24 @@ const fixSdp = (sdp , candidates , forcePort = true)
5730
5736
  return fixed;
5731
5737
  };
5732
5738
 
5739
+ const addIcesInAllBundles = (sdp ) => {
5740
+ const parsedSdp = sdpParser__default['default'].parse(sdp);
5741
+
5742
+ const mediaWithCandidate = parsedSdp.media.find(media => !!media.candidates);
5743
+ if (!mediaWithCandidate) {
5744
+ return sdp;
5745
+ }
5746
+
5747
+ const { candidates } = mediaWithCandidate;
5748
+
5749
+ parsedSdp.media = parsedSdp.media.map(media => ({
5750
+ ...media,
5751
+ candidates: media.candidates || candidates,
5752
+ }));
5753
+
5754
+ return sdpParser__default['default'].write(parsedSdp);
5755
+ };
5756
+
5733
5757
  /* global RTCSessionDescriptionInit, navigator */
5734
5758
 
5735
5759
  const wazoLogger = IssueReporter$1 ? IssueReporter$1.loggerFor('webrtc-sdh') : console;
@@ -5828,6 +5852,14 @@ class WazoSessionDescriptionHandler extends sessionDescriptionHandler.SessionDes
5828
5852
  wazoLogger.trace('onicecandidate', event.candidate ? event.candidate.candidate : { done: true });
5829
5853
  if (event.candidate) {
5830
5854
  this.gatheredCandidates.push(parseCandidate$1(event.candidate.candidate));
5855
+
5856
+ // When receiving a `srflx` or a `relay` candidate, consider the negotiation done.
5857
+ if (event.candidate.candidate.indexOf('srflx') !== -1 || event.candidate.candidate.indexOf('relay') !== -1) {
5858
+ wazoLogger.info('A valid ice was found, triggering ice gathering complete callback.', {
5859
+ ice: event.candidate.candidate,
5860
+ });
5861
+ this.iceGatheringComplete();
5862
+ }
5831
5863
  }
5832
5864
  };
5833
5865
 
@@ -5851,7 +5883,10 @@ class WazoSessionDescriptionHandler extends sessionDescriptionHandler.SessionDes
5851
5883
 
5852
5884
  // Check if we got ICEs
5853
5885
  if (sdp.indexOf('a=candidate') !== -1) {
5854
- return description;
5886
+ return {
5887
+ type: description.type,
5888
+ sdp: addIcesInAllBundles(sdp),
5889
+ };
5855
5890
  }
5856
5891
 
5857
5892
  wazoLogger.info('No ICE candidates found in SDP, fixing it with gathered ices', this.gatheredCandidates);
@@ -7311,11 +7346,11 @@ class WebRTCClient extends Emitter {
7311
7346
  });
7312
7347
  }
7313
7348
 
7314
- changeAudioInputDevice(id , session ) {
7349
+ changeAudioInputDevice(id , session , force ) {
7315
7350
  const currentId = this.getAudioDeviceId();
7316
7351
  logger$9.info('setting audio input device', { id, currentId, session: !!session });
7317
7352
 
7318
- if (id === currentId) {
7353
+ if (!force && id === currentId) {
7319
7354
  return null;
7320
7355
  }
7321
7356
 
@@ -10012,10 +10047,10 @@ class WebRTCPhone extends Emitter {
10012
10047
  this.audioRingVolume = volume;
10013
10048
  }
10014
10049
 
10015
- changeAudioInputDevice(id ) {
10050
+ changeAudioInputDevice(id , force ) {
10016
10051
  logger$7.info('WebRTC phone - changeAudio input device', { deviceId: id });
10017
10052
 
10018
- return this.client.changeAudioInputDevice(id, this.currentSipSession);
10053
+ return this.client.changeAudioInputDevice(id, this.currentSipSession, force);
10019
10054
  }
10020
10055
 
10021
10056
  changeVideoInputDevice(id ) {
@@ -14240,8 +14275,7 @@ class Softphone {
14240
14275
  window.addEventListener('message', this._onMessage.bind(this), false);
14241
14276
 
14242
14277
  if (!server) {
14243
- // eslint-disable-next-line no-param-reassign
14244
- server = 'stack.dev.wazo.io';
14278
+ throw new Error('`server` is not set');
14245
14279
  }
14246
14280
 
14247
14281
  const config = { server };
@@ -452,6 +452,24 @@ const fixSdp = (sdp , candidates , forcePort = true)
452
452
  return fixed;
453
453
  };
454
454
 
455
+ const addIcesInAllBundles = (sdp ) => {
456
+ const parsedSdp = sdpParser__default['default'].parse(sdp);
457
+
458
+ const mediaWithCandidate = parsedSdp.media.find(media => !!media.candidates);
459
+ if (!mediaWithCandidate) {
460
+ return sdp;
461
+ }
462
+
463
+ const { candidates } = mediaWithCandidate;
464
+
465
+ parsedSdp.media = parsedSdp.media.map(media => ({
466
+ ...media,
467
+ candidates: media.candidates || candidates,
468
+ }));
469
+
470
+ return sdpParser__default['default'].write(parsedSdp);
471
+ };
472
+
455
473
  /* global RTCSessionDescriptionInit, navigator */
456
474
 
457
475
  const wazoLogger = IssueReporter$1 ? IssueReporter$1.loggerFor('webrtc-sdh') : console;
@@ -550,6 +568,14 @@ class WazoSessionDescriptionHandler extends sessionDescriptionHandler.SessionDes
550
568
  wazoLogger.trace('onicecandidate', event.candidate ? event.candidate.candidate : { done: true });
551
569
  if (event.candidate) {
552
570
  this.gatheredCandidates.push(parseCandidate(event.candidate.candidate));
571
+
572
+ // When receiving a `srflx` or a `relay` candidate, consider the negotiation done.
573
+ if (event.candidate.candidate.indexOf('srflx') !== -1 || event.candidate.candidate.indexOf('relay') !== -1) {
574
+ wazoLogger.info('A valid ice was found, triggering ice gathering complete callback.', {
575
+ ice: event.candidate.candidate,
576
+ });
577
+ this.iceGatheringComplete();
578
+ }
553
579
  }
554
580
  };
555
581
 
@@ -573,7 +599,10 @@ class WazoSessionDescriptionHandler extends sessionDescriptionHandler.SessionDes
573
599
 
574
600
  // Check if we got ICEs
575
601
  if (sdp.indexOf('a=candidate') !== -1) {
576
- return description;
602
+ return {
603
+ type: description.type,
604
+ sdp: addIcesInAllBundles(sdp),
605
+ };
577
606
  }
578
607
 
579
608
  wazoLogger.info('No ICE candidates found in SDP, fixing it with gathered ices', this.gatheredCandidates);
@@ -36,6 +36,7 @@ const RECORD_STATE_ACTIVE = 'active';
36
36
 
37
37
 
38
38
 
39
+
39
40
 
40
41
 
41
42
 
@@ -46,6 +47,7 @@ const RECORD_STATE_ACTIVE = 'active';
46
47
 
47
48
 
48
49
 
50
+
49
51
 
50
52
 
51
53
 
@@ -74,6 +76,7 @@ class Call {
74
76
 
75
77
 
76
78
 
79
+
77
80
 
78
81
 
79
82
 
@@ -98,6 +101,7 @@ class Call {
98
101
  calleeNumber: plain.peer_caller_id_number,
99
102
  dialedExtension: plain.dialed_extension,
100
103
  isCaller: plain.is_caller,
104
+ isVideo: plain.is_video,
101
105
  muted: plain.muted,
102
106
  onHold: plain.on_hold,
103
107
  status: plain.status,
@@ -121,6 +125,7 @@ class Call {
121
125
  calleeNumber,
122
126
  dialedExtension,
123
127
  isCaller,
128
+ isVideo,
124
129
  lineId,
125
130
  muted,
126
131
  onHold,
@@ -144,6 +149,7 @@ class Call {
144
149
  this.startingTime = startingTime;
145
150
  this.talkingToIds = talkingToIds || [];
146
151
  this.recording = recording;
152
+ this.isVideo = !!isVideo;
147
153
 
148
154
  // Useful to compare instead of instanceof with minified code
149
155
  this.type = 'Call';
@@ -3059,6 +3059,7 @@ const RECORD_STATE_ACTIVE = 'active';
3059
3059
 
3060
3060
 
3061
3061
 
3062
+
3062
3063
 
3063
3064
 
3064
3065
 
@@ -3069,6 +3070,7 @@ const RECORD_STATE_ACTIVE = 'active';
3069
3070
 
3070
3071
 
3071
3072
 
3073
+
3072
3074
 
3073
3075
 
3074
3076
 
@@ -3097,6 +3099,7 @@ class Call {
3097
3099
 
3098
3100
 
3099
3101
 
3102
+
3100
3103
 
3101
3104
 
3102
3105
 
@@ -3121,6 +3124,7 @@ class Call {
3121
3124
  calleeNumber: plain.peer_caller_id_number,
3122
3125
  dialedExtension: plain.dialed_extension,
3123
3126
  isCaller: plain.is_caller,
3127
+ isVideo: plain.is_video,
3124
3128
  muted: plain.muted,
3125
3129
  onHold: plain.on_hold,
3126
3130
  status: plain.status,
@@ -3144,6 +3148,7 @@ class Call {
3144
3148
  calleeNumber,
3145
3149
  dialedExtension,
3146
3150
  isCaller,
3151
+ isVideo,
3147
3152
  lineId,
3148
3153
  muted,
3149
3154
  onHold,
@@ -3167,6 +3172,7 @@ class Call {
3167
3172
  this.startingTime = startingTime;
3168
3173
  this.talkingToIds = talkingToIds || [];
3169
3174
  this.recording = recording;
3175
+ this.isVideo = !!isVideo;
3170
3176
 
3171
3177
  // Useful to compare instead of instanceof with minified code
3172
3178
  this.type = 'Call';