@webex/plugin-meetings 3.0.0-beta.1 → 3.0.0-beta.10

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 (274) hide show
  1. package/dist/common/browser-detection.js.map +1 -1
  2. package/dist/common/collection.js.map +1 -1
  3. package/dist/common/config.js.map +1 -1
  4. package/dist/common/errors/captcha-error.js +7 -0
  5. package/dist/common/errors/captcha-error.js.map +1 -1
  6. package/dist/common/errors/intent-to-join.js +8 -0
  7. package/dist/common/errors/intent-to-join.js.map +1 -1
  8. package/dist/common/errors/join-meeting.js +8 -0
  9. package/dist/common/errors/join-meeting.js.map +1 -1
  10. package/dist/common/errors/media.js +7 -0
  11. package/dist/common/errors/media.js.map +1 -1
  12. package/dist/common/errors/parameter.js.map +1 -1
  13. package/dist/common/errors/password-error.js +7 -0
  14. package/dist/common/errors/password-error.js.map +1 -1
  15. package/dist/common/errors/permission.js +7 -0
  16. package/dist/common/errors/permission.js.map +1 -1
  17. package/dist/common/errors/reconnection-in-progress.js.map +1 -1
  18. package/dist/common/errors/reconnection.js +7 -0
  19. package/dist/common/errors/reconnection.js.map +1 -1
  20. package/dist/common/errors/stats.js +7 -0
  21. package/dist/common/errors/stats.js.map +1 -1
  22. package/dist/common/errors/webex-errors.js +5 -29
  23. package/dist/common/errors/webex-errors.js.map +1 -1
  24. package/dist/common/errors/webex-meetings-error.js +5 -2
  25. package/dist/common/errors/webex-meetings-error.js.map +1 -1
  26. package/dist/common/events/events-scope.js.map +1 -1
  27. package/dist/common/events/events.js.map +1 -1
  28. package/dist/common/events/trigger-proxy.js.map +1 -1
  29. package/dist/common/events/util.js.map +1 -1
  30. package/dist/common/logs/logger-config.js.map +1 -1
  31. package/dist/common/logs/logger-proxy.js.map +1 -1
  32. package/dist/common/logs/request.js +3 -0
  33. package/dist/common/logs/request.js.map +1 -1
  34. package/dist/common/queue.js.map +1 -1
  35. package/dist/config.js +1 -0
  36. package/dist/config.js.map +1 -1
  37. package/dist/constants.js +15 -74
  38. package/dist/constants.js.map +1 -1
  39. package/dist/locus-info/controlsUtils.js.map +1 -1
  40. package/dist/locus-info/embeddedAppsUtils.js.map +1 -1
  41. package/dist/locus-info/fullState.js.map +1 -1
  42. package/dist/locus-info/hostUtils.js.map +1 -1
  43. package/dist/locus-info/index.js +43 -5
  44. package/dist/locus-info/index.js.map +1 -1
  45. package/dist/locus-info/infoUtils.js +4 -0
  46. package/dist/locus-info/infoUtils.js.map +1 -1
  47. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  48. package/dist/locus-info/parser.js +12 -3
  49. package/dist/locus-info/parser.js.map +1 -1
  50. package/dist/locus-info/selfUtils.js.map +1 -1
  51. package/dist/media/index.js +71 -210
  52. package/dist/media/index.js.map +1 -1
  53. package/dist/media/internal-media-core-wrapper.js +22 -0
  54. package/dist/media/internal-media-core-wrapper.js.map +1 -0
  55. package/dist/media/properties.js +32 -25
  56. package/dist/media/properties.js.map +1 -1
  57. package/dist/media/util.js +0 -27
  58. package/dist/media/util.js.map +1 -1
  59. package/dist/mediaQualityMetrics/config.js.map +1 -1
  60. package/dist/meeting/effectsState.js +8 -1
  61. package/dist/meeting/effectsState.js.map +1 -1
  62. package/dist/meeting/index.js +1116 -613
  63. package/dist/meeting/index.js.map +1 -1
  64. package/dist/meeting/muteState.js +6 -0
  65. package/dist/meeting/muteState.js.map +1 -1
  66. package/dist/meeting/request.js +55 -24
  67. package/dist/meeting/request.js.map +1 -1
  68. package/dist/meeting/state.js.map +1 -1
  69. package/dist/meeting/util.js +5 -44
  70. package/dist/meeting/util.js.map +1 -1
  71. package/dist/meeting-info/collection.js +4 -1
  72. package/dist/meeting-info/collection.js.map +1 -1
  73. package/dist/meeting-info/index.js +5 -0
  74. package/dist/meeting-info/index.js.map +1 -1
  75. package/dist/meeting-info/meeting-info-v2.js +14 -2
  76. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  77. package/dist/meeting-info/request.js +3 -0
  78. package/dist/meeting-info/request.js.map +1 -1
  79. package/dist/meeting-info/util.js.map +1 -1
  80. package/dist/meeting-info/utilv2.js.map +1 -1
  81. package/dist/meetings/collection.js +4 -1
  82. package/dist/meetings/collection.js.map +1 -1
  83. package/dist/meetings/index.js +136 -25
  84. package/dist/meetings/index.js.map +1 -1
  85. package/dist/meetings/request.js +4 -0
  86. package/dist/meetings/request.js.map +1 -1
  87. package/dist/meetings/util.js +24 -1
  88. package/dist/meetings/util.js.map +1 -1
  89. package/dist/member/index.js +30 -7
  90. package/dist/member/index.js.map +1 -1
  91. package/dist/member/util.js +2 -1
  92. package/dist/member/util.js.map +1 -1
  93. package/dist/members/collection.js +1 -0
  94. package/dist/members/collection.js.map +1 -1
  95. package/dist/members/index.js +82 -1
  96. package/dist/members/index.js.map +1 -1
  97. package/dist/members/request.js +19 -9
  98. package/dist/members/request.js.map +1 -1
  99. package/dist/members/util.js.map +1 -1
  100. package/dist/metrics/config.js.map +1 -1
  101. package/dist/metrics/constants.js.map +1 -1
  102. package/dist/metrics/index.js +8 -0
  103. package/dist/metrics/index.js.map +1 -1
  104. package/dist/multistream/mediaRequestManager.js +133 -0
  105. package/dist/multistream/mediaRequestManager.js.map +1 -0
  106. package/dist/multistream/multistreamMedia.js +116 -0
  107. package/dist/multistream/multistreamMedia.js.map +1 -0
  108. package/dist/multistream/receiveSlot.js +209 -0
  109. package/dist/multistream/receiveSlot.js.map +1 -0
  110. package/dist/multistream/receiveSlotManager.js +195 -0
  111. package/dist/multistream/receiveSlotManager.js.map +1 -0
  112. package/dist/multistream/remoteMedia.js +289 -0
  113. package/dist/multistream/remoteMedia.js.map +1 -0
  114. package/dist/multistream/remoteMediaGroup.js +243 -0
  115. package/dist/multistream/remoteMediaGroup.js.map +1 -0
  116. package/dist/multistream/remoteMediaManager.js +1113 -0
  117. package/dist/multistream/remoteMediaManager.js.map +1 -0
  118. package/dist/networkQualityMonitor/index.js +10 -2
  119. package/dist/networkQualityMonitor/index.js.map +1 -1
  120. package/dist/personal-meeting-room/index.js +11 -0
  121. package/dist/personal-meeting-room/index.js.map +1 -1
  122. package/dist/personal-meeting-room/request.js +2 -1
  123. package/dist/personal-meeting-room/request.js.map +1 -1
  124. package/dist/personal-meeting-room/util.js.map +1 -1
  125. package/dist/reachability/index.js +17 -7
  126. package/dist/reachability/index.js.map +1 -1
  127. package/dist/reachability/request.js +1 -0
  128. package/dist/reachability/request.js.map +1 -1
  129. package/dist/reconnection-manager/index.js +130 -132
  130. package/dist/reconnection-manager/index.js.map +1 -1
  131. package/dist/roap/index.js +58 -231
  132. package/dist/roap/index.js.map +1 -1
  133. package/dist/roap/request.js +7 -116
  134. package/dist/roap/request.js.map +1 -1
  135. package/dist/roap/turnDiscovery.js +20 -6
  136. package/dist/roap/turnDiscovery.js.map +1 -1
  137. package/dist/statsAnalyzer/global.js +2 -0
  138. package/dist/statsAnalyzer/global.js.map +1 -1
  139. package/dist/statsAnalyzer/index.js +58 -37
  140. package/dist/statsAnalyzer/index.js.map +1 -1
  141. package/dist/statsAnalyzer/mqaUtil.js +9 -3
  142. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  143. package/dist/transcription/index.js +10 -3
  144. package/dist/transcription/index.js.map +1 -1
  145. package/package.json +21 -20
  146. package/src/common/{browser-detection.js → browser-detection.ts} +1 -1
  147. package/src/common/collection.ts +6 -6
  148. package/src/common/{config.js → config.ts} +1 -1
  149. package/src/common/errors/{captcha-error.js → captcha-error.ts} +5 -1
  150. package/src/common/errors/{intent-to-join.js → intent-to-join.ts} +6 -1
  151. package/src/common/errors/{join-meeting.js → join-meeting.ts} +6 -1
  152. package/src/common/errors/{media.js → media.ts} +5 -1
  153. package/src/common/errors/parameter.ts +3 -2
  154. package/src/common/errors/{password-error.js → password-error.ts} +5 -1
  155. package/src/common/errors/{permission.js → permission.ts} +5 -1
  156. package/src/common/errors/{reconnection-in-progress.js → reconnection-in-progress.ts} +0 -0
  157. package/src/common/errors/{reconnection.js → reconnection.ts} +5 -1
  158. package/src/common/errors/{stats.js → stats.ts} +5 -1
  159. package/src/common/errors/{webex-errors.js → webex-errors.ts} +1 -20
  160. package/src/common/errors/{webex-meetings-error.js → webex-meetings-error.ts} +3 -1
  161. package/src/common/events/{events-scope.js → events-scope.ts} +1 -1
  162. package/src/common/events/{events.js → events.ts} +0 -0
  163. package/src/common/events/{trigger-proxy.js → trigger-proxy.ts} +1 -2
  164. package/src/common/events/{util.js → util.ts} +1 -1
  165. package/src/common/logs/{logger-config.js → logger-config.ts} +1 -2
  166. package/src/common/logs/{logger-proxy.js → logger-proxy.ts} +1 -1
  167. package/src/common/logs/{request.js → request.ts} +12 -2
  168. package/src/common/queue.ts +1 -2
  169. package/src/{config.js → config.ts} +2 -0
  170. package/src/constants.ts +139 -179
  171. package/src/locus-info/{controlsUtils.js → controlsUtils.ts} +4 -4
  172. package/src/locus-info/{embeddedAppsUtils.js → embeddedAppsUtils.ts} +5 -6
  173. package/src/locus-info/{fullState.js → fullState.ts} +1 -1
  174. package/src/locus-info/{hostUtils.js → hostUtils.ts} +5 -5
  175. package/src/locus-info/{index.js → index.ts} +67 -32
  176. package/src/locus-info/{infoUtils.js → infoUtils.ts} +7 -4
  177. package/src/locus-info/{mediaSharesUtils.js → mediaSharesUtils.ts} +13 -13
  178. package/src/locus-info/{parser.js → parser.ts} +22 -12
  179. package/src/locus-info/{selfUtils.js → selfUtils.ts} +17 -19
  180. package/src/media/{index.js → index.ts} +130 -205
  181. package/src/media/internal-media-core-wrapper.ts +9 -0
  182. package/src/media/{properties.js → properties.ts} +35 -29
  183. package/src/media/util.ts +16 -0
  184. package/src/mediaQualityMetrics/{config.js → config.ts} +1 -1
  185. package/src/meeting/{effectsState.js → effectsState.ts} +12 -6
  186. package/src/meeting/{index.js → index.ts} +961 -474
  187. package/src/meeting/{muteState.js → muteState.ts} +16 -11
  188. package/src/meeting/{request.js → request.ts} +125 -36
  189. package/src/meeting/{state.js → state.ts} +6 -6
  190. package/src/meeting/{util.js → util.ts} +9 -51
  191. package/src/meeting-info/{collection.js → collection.ts} +4 -1
  192. package/src/meeting-info/{index.js → index.ts} +10 -6
  193. package/src/meeting-info/{meeting-info-v2.js → meeting-info-v2.ts} +28 -10
  194. package/src/meeting-info/{request.js → request.ts} +6 -2
  195. package/src/meeting-info/{util.js → util.ts} +6 -5
  196. package/src/meeting-info/{utilv2.js → utilv2.ts} +8 -7
  197. package/src/meetings/{collection.js → collection.ts} +5 -2
  198. package/src/meetings/{index.js → index.ts} +118 -22
  199. package/src/meetings/{request.js → request.ts} +6 -1
  200. package/src/meetings/{util.js → util.ts} +28 -5
  201. package/src/member/{index.js → index.ts} +46 -15
  202. package/src/member/{util.js → util.ts} +17 -16
  203. package/src/members/{collection.js → collection.ts} +2 -1
  204. package/src/members/{index.js → index.ts} +94 -26
  205. package/src/members/{request.js → request.ts} +16 -5
  206. package/src/members/{util.js → util.ts} +7 -7
  207. package/src/metrics/{config.js → config.ts} +0 -2
  208. package/src/metrics/{constants.js → constants.ts} +0 -0
  209. package/src/metrics/{index.js → index.ts} +27 -8
  210. package/src/multistream/mediaRequestManager.ts +166 -0
  211. package/src/multistream/multistreamMedia.ts +92 -0
  212. package/src/multistream/receiveSlot.ts +141 -0
  213. package/src/multistream/receiveSlotManager.ts +142 -0
  214. package/src/multistream/remoteMedia.ts +228 -0
  215. package/src/multistream/remoteMediaGroup.ts +224 -0
  216. package/src/multistream/remoteMediaManager.ts +911 -0
  217. package/src/networkQualityMonitor/{index.js → index.ts} +18 -3
  218. package/src/personal-meeting-room/{index.js → index.ts} +17 -4
  219. package/src/personal-meeting-room/{request.js → request.ts} +3 -1
  220. package/src/personal-meeting-room/{util.js → util.ts} +1 -1
  221. package/src/reachability/{index.js → index.ts} +28 -17
  222. package/src/reachability/request.ts +4 -2
  223. package/src/reconnection-manager/{index.js → index.ts} +81 -65
  224. package/src/roap/index.ts +229 -0
  225. package/src/roap/{request.js → request.ts} +15 -74
  226. package/src/roap/turnDiscovery.ts +26 -11
  227. package/src/statsAnalyzer/{global.js → global.ts} +2 -0
  228. package/src/statsAnalyzer/{index.js → index.ts} +66 -61
  229. package/src/statsAnalyzer/{mqaUtil.js → mqaUtil.ts} +6 -1
  230. package/src/transcription/{index.js → index.ts} +16 -11
  231. package/test/integration/spec/journey.js +1 -1
  232. package/test/integration/spec/space-meeting.js +1 -2
  233. package/test/unit/spec/locus-info/infoUtils.js +17 -1
  234. package/test/unit/spec/media/index.ts +207 -0
  235. package/test/unit/spec/media/properties.ts +73 -82
  236. package/test/unit/spec/meeting/effectsState.js +1 -3
  237. package/test/unit/spec/meeting/index.js +585 -245
  238. package/test/unit/spec/meeting/muteState.js +7 -0
  239. package/test/unit/spec/meeting/utils.js +63 -2
  240. package/test/unit/spec/meetings/index.js +0 -4
  241. package/test/unit/spec/members/index.js +164 -2
  242. package/test/unit/spec/multistream/mediaRequestManager.ts +515 -0
  243. package/test/unit/spec/multistream/receiveSlot.ts +104 -0
  244. package/test/unit/spec/multistream/receiveSlotManager.ts +173 -0
  245. package/test/unit/spec/multistream/remoteMedia.ts +225 -0
  246. package/test/unit/spec/multistream/remoteMediaGroup.ts +396 -0
  247. package/test/unit/spec/multistream/remoteMediaManager.ts +1309 -0
  248. package/test/unit/spec/reconnection-manager/index.js +68 -2
  249. package/test/unit/spec/roap/index.ts +63 -35
  250. package/test/unit/spec/stats-analyzer/index.js +19 -22
  251. package/dist/peer-connection-manager/index.js +0 -794
  252. package/dist/peer-connection-manager/index.js.map +0 -1
  253. package/dist/peer-connection-manager/util.js +0 -124
  254. package/dist/peer-connection-manager/util.js.map +0 -1
  255. package/dist/roap/collection.js +0 -73
  256. package/dist/roap/collection.js.map +0 -1
  257. package/dist/roap/handler.js +0 -337
  258. package/dist/roap/handler.js.map +0 -1
  259. package/dist/roap/state.js +0 -164
  260. package/dist/roap/state.js.map +0 -1
  261. package/dist/roap/util.js +0 -102
  262. package/dist/roap/util.js.map +0 -1
  263. package/src/media/util.js +0 -38
  264. package/src/peer-connection-manager/index.js +0 -723
  265. package/src/peer-connection-manager/util.ts +0 -117
  266. package/src/roap/collection.js +0 -63
  267. package/src/roap/handler.js +0 -252
  268. package/src/roap/index.js +0 -380
  269. package/src/roap/state.js +0 -149
  270. package/src/roap/util.js +0 -93
  271. package/test/unit/spec/peerconnection-manager/index.js +0 -188
  272. package/test/unit/spec/peerconnection-manager/utils.js +0 -48
  273. package/test/unit/spec/peerconnection-manager/utils.test-fixtures.ts +0 -389
  274. package/test/unit/spec/roap/util.js +0 -30
@@ -18,6 +18,13 @@ import {EVENT_TRIGGERS, STATS} from '../constants';
18
18
  * @extends {EventsScope}
19
19
  */
20
20
  export default class NetworkQualityMonitor extends EventsScope {
21
+ config: any;
22
+ frequencyTypes: any;
23
+ indicatorTypes: any;
24
+ mediaType: any;
25
+ networkQualityScore: any;
26
+ networkQualityStatus: any;
27
+
21
28
  /**
22
29
  * Creates a new instance of NetworkQualityMonitor
23
30
  * @constructor
@@ -29,7 +36,7 @@ export default class NetworkQualityMonitor extends EventsScope {
29
36
  * @property {Object} networkQualityStatus - hash object based on indicatorTypes and frequencyTypes
30
37
  * @property {string} mediaType - audio|video
31
38
  */
32
- constructor(config) {
39
+ constructor(config: any) {
33
40
  super();
34
41
  this.config = config;
35
42
  this.indicatorTypes = Object.freeze({
@@ -96,7 +103,15 @@ export default class NetworkQualityMonitor extends EventsScope {
96
103
  * @public
97
104
  * @memberof NetworkQualityMonitor
98
105
  */
99
- determineUplinkNetworkQuality({mediaType, remoteRtpResults, statsAnalyzerCurrentStats}) {
106
+ public determineUplinkNetworkQuality({
107
+ mediaType,
108
+ remoteRtpResults,
109
+ statsAnalyzerCurrentStats,
110
+ }: {
111
+ mediaType: string;
112
+ remoteRtpResults: any;
113
+ statsAnalyzerCurrentStats: object;
114
+ }) {
100
115
  const roundTripTimeInMilliseconds = remoteRtpResults.roundTripTime * 1000;
101
116
  const jitterInMilliseconds = remoteRtpResults.jitter * 1000;
102
117
  const {currentPacketLossRatio} = statsAnalyzerCurrentStats[mediaType].send;
@@ -157,7 +172,7 @@ export default class NetworkQualityMonitor extends EventsScope {
157
172
  * @param {(number|undefined)} value
158
173
  * @returns {(number|null)}
159
174
  */
160
- const determineIfUndefined = (value) => (typeof value === 'undefined' ? null : value);
175
+ const determineIfUndefined = (value: number | undefined) => (typeof value === 'undefined' ? null : value);
161
176
 
162
177
  /**
163
178
  * Values for some browsers specifically Safari will be undefined we explicitly set to null
@@ -1,3 +1,4 @@
1
+ // @ts-ignore
1
2
  import {StatelessWebexPlugin} from '@webex/webex-core';
2
3
 
3
4
  import {MEETINGS, _PERSONAL_ROOM_} from '../constants';
@@ -10,6 +11,16 @@ import PersonalMeetingRoomRequest from './request';
10
11
  * @class PersonalMeetingRoom
11
12
  */
12
13
  export default class PersonalMeetingRoom extends StatelessWebexPlugin {
14
+ link: any;
15
+ meetingInfo: any;
16
+ name: any;
17
+ personalMeetingRoomRequest: any;
18
+ pmr: any;
19
+ sipUri: any;
20
+ userId: any;
21
+ meetingLink: any;
22
+ number: any;
23
+
13
24
  namespace = MEETINGS;
14
25
 
15
26
  /**
@@ -17,7 +28,7 @@ export default class PersonalMeetingRoom extends StatelessWebexPlugin {
17
28
  * @param {Object} attrs
18
29
  * @param {Object} options
19
30
  */
20
- constructor(attrs, options) {
31
+ constructor(attrs: any, options: any) {
21
32
  super({}, options);
22
33
  /**
23
34
  * The pmr server object
@@ -74,6 +85,7 @@ export default class PersonalMeetingRoom extends StatelessWebexPlugin {
74
85
  * @private
75
86
  * @memberof PersonalMeetingRoom
76
87
  */
88
+ // @ts-ignore
77
89
  this.personalMeetingRoomRequest = new PersonalMeetingRoomRequest({}, options);
78
90
  }
79
91
 
@@ -86,8 +98,9 @@ export default class PersonalMeetingRoom extends StatelessWebexPlugin {
86
98
  * @public
87
99
  * @memberof PersonalMeetingRoom
88
100
  */
89
- claim(link, pin, preferred = true) {
101
+ public claim(link: string, pin: string, preferred: boolean = true) {
90
102
  const options = {
103
+ // @ts-ignore
91
104
  userId: this.webex.internal.device.userId,
92
105
  passcode: pin,
93
106
  meetingAddress: link,
@@ -112,7 +125,7 @@ export default class PersonalMeetingRoom extends StatelessWebexPlugin {
112
125
  * @private
113
126
  * @memberof PersonalMeetingRoom
114
127
  */
115
- set(body) {
128
+ private set(body: any) {
116
129
  this.pmr = body;
117
130
  this.sipUri = body.sipMeetingUri;
118
131
  this.meetingLink = body.webExMeetingLink || body.meetingLink;
@@ -128,7 +141,7 @@ export default class PersonalMeetingRoom extends StatelessWebexPlugin {
128
141
  * @public
129
142
  * @memberof PersonalMeetingRoom
130
143
  */
131
- get() {
144
+ public get() {
132
145
  const options = {
133
146
  type: _PERSONAL_ROOM_
134
147
 
@@ -1,3 +1,4 @@
1
+ // @ts-ignore
1
2
  import {StatelessWebexPlugin} from '@webex/webex-core';
2
3
 
3
4
  import {MEETINGS} from '../constants';
@@ -18,7 +19,7 @@ export default class PersonalMeetingRoomRequest extends StatelessWebexPlugin {
18
19
  * @returns {Promise} returns a promise that resolves/rejects the result of the request
19
20
  * @memberof PersonalMeetingRoomRequest
20
21
  */
21
- claimPmr(options) {
22
+ claimPmr(options: any) {
22
23
  if (!options || !options.userId || !options.passcode || !options.meetingAddress || !options.preferred) {
23
24
  throw new ParameterError('Claiming a PMR should be done with userId, passcode, preferred, and meetingAddress in options.');
24
25
  }
@@ -34,6 +35,7 @@ export default class PersonalMeetingRoomRequest extends StatelessWebexPlugin {
34
35
  }
35
36
  const request = PersonalMeetingRoomUtil.getClaimedRequestParams(validLink, validPin, options);
36
37
 
38
+ // @ts-ignore
37
39
  return this.request(request);
38
40
  }
39
41
  }
@@ -9,7 +9,7 @@ import {
9
9
  WEBEX_DOT_COM
10
10
  } from '../constants';
11
11
 
12
- const PersonalMeetingRoomUtil = {};
12
+ const PersonalMeetingRoomUtil: any = {};
13
13
 
14
14
  PersonalMeetingRoomUtil.getClaimPmrLink = (pmrLink) => {
15
15
  let validator = VALID_PMR_ADDRESS.test(pmrLink);
@@ -23,12 +23,16 @@ const VIDEO_MESH_TIMEOUT = 1000;
23
23
  * @export
24
24
  */
25
25
  export default class Reachability {
26
+ webex: object;
27
+ reachabilityRequest: any;
28
+ clusterLatencyResults: any;
29
+
26
30
  /**
27
31
  * Creates an instance of Reachability.
28
32
  * @param {object} webex
29
33
  * @memberof Reachability
30
34
  */
31
- constructor(webex) {
35
+ constructor(webex: object) {
32
36
  this.webex = webex;
33
37
 
34
38
  /**
@@ -58,7 +62,7 @@ export default class Reachability {
58
62
  * @async
59
63
  * @memberof Reachability
60
64
  */
61
- async gatherReachability() {
65
+ public async gatherReachability() {
62
66
  this.setup();
63
67
 
64
68
  // Remove stored reachability results to ensure no stale data
@@ -105,7 +109,7 @@ export default class Reachability {
105
109
  try {
106
110
  const reachabilityResults = JSON.parse(reachabilityData);
107
111
 
108
- reachable = Object.values(reachabilityResults).some((result) => result.udp?.reachable === 'true' || result.tcp?.reachable === 'true');
112
+ reachable = Object.values(reachabilityResults).some((result: any) => result.udp?.reachable === 'true' || result.tcp?.reachable === 'true');
109
113
  }
110
114
  catch (e) {
111
115
  LoggerProxy.logger.error(`Roap:request#attachReachabilityData --> Error in parsing reachability data: ${e}`);
@@ -123,7 +127,7 @@ export default class Reachability {
123
127
  * @private
124
128
  * @memberof Reachability
125
129
  */
126
- buildPeerConnectionConfig(cluster) {
130
+ private buildPeerConnectionConfig(cluster: any) {
127
131
  const iceServers = _.uniq([
128
132
  ...cluster.udp,
129
133
  ...cluster.tcp
@@ -150,12 +154,13 @@ export default class Reachability {
150
154
  * @private
151
155
  * @memberof Reachability
152
156
  */
153
- createPeerConnection(cluster) {
157
+ private createPeerConnection(cluster: any) {
154
158
  const {key, config} = cluster;
155
159
 
156
160
  try {
157
161
  const peerConnection = new window.RTCPeerConnection(config);
158
162
 
163
+ // @ts-ignore
159
164
  peerConnection.key = key;
160
165
 
161
166
  return peerConnection;
@@ -175,7 +180,7 @@ export default class Reachability {
175
180
  * @private
176
181
  * @memberof Reachability
177
182
  */
178
- getElapsedTime(peerConnection) {
183
+ private getElapsedTime(peerConnection: any) {
179
184
  const startTime = peerConnection.begin;
180
185
 
181
186
  delete peerConnection.begin;
@@ -191,8 +196,8 @@ export default class Reachability {
191
196
  * @private
192
197
  * @memberof Reachability
193
198
  */
194
- getLocalSDPForClusters(clusterList) {
195
- let clusters = [...Object.keys(clusterList)];
199
+ private getLocalSDPForClusters(clusterList: object) {
200
+ let clusters: any[] = [...Object.keys(clusterList)];
196
201
 
197
202
  clusters = clusters.map(async (key) => {
198
203
  const cluster = clusterList[key];
@@ -200,6 +205,7 @@ export default class Reachability {
200
205
  const peerConnection = this.createPeerConnection({key, config});
201
206
  const description = await peerConnection.createOffer({offerToReceiveAudio: true});
202
207
 
208
+ // @ts-ignore
203
209
  peerConnection.begin = Date.now();
204
210
  peerConnection.setLocalDescription(description);
205
211
 
@@ -226,7 +232,7 @@ export default class Reachability {
226
232
  * @private
227
233
  * @memberof Reachability
228
234
  */
229
- getUnreachablClusters() {
235
+ private getUnreachablClusters() {
230
236
  const unreachableList = [];
231
237
  const clusters = this.clusterLatencyResults;
232
238
 
@@ -250,13 +256,14 @@ export default class Reachability {
250
256
  * @private
251
257
  * @memberof Reachability
252
258
  */
253
- handleIceGatheringStateChange(peerConnection) {
259
+ private handleIceGatheringStateChange(peerConnection: RTCPeerConnection) {
254
260
  peerConnection.onicegatheringstatechange = () => {
255
261
  const {COMPLETE} = ICE_GATHERING_STATE;
256
262
 
257
263
  if (peerConnection.iceConnectionState === COMPLETE) {
258
264
  const elapsed = this.getElapsedTime(peerConnection);
259
265
 
266
+ // @ts-ignore
260
267
  LoggerProxy.logger.log(`Reachability:index#onIceGatheringStateChange --> Successfully pinged ${peerConnection.key}:`, elapsed);
261
268
  this.setLatencyAndClose(peerConnection, elapsed);
262
269
  }
@@ -272,13 +279,14 @@ export default class Reachability {
272
279
  * @private
273
280
  * @memberof Reachability
274
281
  */
275
- handleOnIceCandidate(peerConnection) {
282
+ private handleOnIceCandidate(peerConnection: RTCPeerConnection) {
276
283
  peerConnection.onicecandidate = (e) => {
277
284
  const SERVER_REFLEXIVE = 'srflx';
278
285
 
279
286
  if (e.candidate && String(e.candidate.type).toLowerCase() === SERVER_REFLEXIVE) {
280
287
  const elapsed = this.getElapsedTime(peerConnection);
281
288
 
289
+ // @ts-ignore
282
290
  LoggerProxy.logger.log(`Reachability:index#onIceCandidate --> Successfully pinged ${peerConnection.key}:`, elapsed);
283
291
  this.setLatencyAndClose(peerConnection, elapsed);
284
292
  }
@@ -294,7 +302,7 @@ export default class Reachability {
294
302
  * @param {number} timeout
295
303
  * @returns {Promise}
296
304
  */
297
- iceGatheringState(peerConnection, timeout) {
305
+ private iceGatheringState(peerConnection: RTCPeerConnection, timeout: number) {
298
306
  const ELAPSED = 'elapsed';
299
307
 
300
308
  return new Promise((resolve) => {
@@ -311,6 +319,7 @@ export default class Reachability {
311
319
  set: (target, property, value) => {
312
320
  // only intercept elapsed property
313
321
  if (property === ELAPSED) {
322
+ // @ts-ignore
314
323
  resolve({clusterId: peerConnection.key, elapsed: value});
315
324
 
316
325
  return true;
@@ -345,7 +354,7 @@ export default class Reachability {
345
354
  * @private
346
355
  * @memberof Reachability
347
356
  */
348
- logUnreachableClusters() {
357
+ private logUnreachableClusters() {
349
358
  const list = this.getUnreachablClusters();
350
359
 
351
360
  list.forEach((cluster) => {
@@ -361,7 +370,7 @@ export default class Reachability {
361
370
  * @private
362
371
  * @memberof Reachability
363
372
  */
364
- parseIceResultsToReachabilityResults(iceResults) {
373
+ private parseIceResultsToReachabilityResults(iceResults: Array<any>) {
365
374
  const reachabilityMap = {};
366
375
 
367
376
  iceResults.forEach(({clusterId, elapsed}) => {
@@ -394,7 +403,7 @@ export default class Reachability {
394
403
  * @private
395
404
  * @memberof Reachability
396
405
  */
397
- performReachabilityCheck(clusterList) {
406
+ private performReachabilityCheck(clusterList: object) {
398
407
  if (!clusterList || !Object.keys(clusterList).length) {
399
408
  return Promise.resolve({});
400
409
  }
@@ -427,10 +436,11 @@ export default class Reachability {
427
436
  * @private
428
437
  * @memberof Reachability
429
438
  */
430
- setLatencyAndClose(peerConnection, elapsed) {
439
+ private setLatencyAndClose(peerConnection: RTCPeerConnection, elapsed: number) {
431
440
  const REACHABLE = 'reachable';
432
441
  const UNREACHABLE = 'unreachable';
433
442
  const {CLOSED} = CONNECTION_STATE;
443
+ // @ts-ignore
434
444
  const {key} = peerConnection;
435
445
  const resultKey = elapsed === null ? UNREACHABLE : REACHABLE;
436
446
  const intialState = {[REACHABLE]: 0, [UNREACHABLE]: 0};
@@ -448,6 +458,7 @@ export default class Reachability {
448
458
  // an event other than onIceCandidate
449
459
  peerConnection.onicecandidate = null;
450
460
  peerConnection.close();
461
+ // @ts-ignore
451
462
  peerConnection.elapsed = elapsed;
452
463
  }
453
464
 
@@ -458,7 +469,7 @@ export default class Reachability {
458
469
  * @private
459
470
  * @memberof Reachability
460
471
  */
461
- setup() {
472
+ private setup() {
462
473
  this.clusterLatencyResults = {};
463
474
  }
464
475
  }
@@ -20,12 +20,14 @@ export type ClusterList = {
20
20
  * @class ReachabilityRequest
21
21
  */
22
22
  class ReachabilityRequest {
23
+ webex: any;
24
+
23
25
  /**
24
26
  * Creates an instance of ReachabilityRequest.
25
27
  * @param {object} webex
26
28
  * @memberof ReachabilityRequest
27
29
  */
28
- constructor(webex) {
30
+ constructor(webex: object) {
29
31
  this.webex = webex;
30
32
  }
31
33
 
@@ -58,7 +60,7 @@ class ReachabilityRequest {
58
60
  * @param {Object} localSDPList localSDPs for the cluster
59
61
  * @returns {Object}
60
62
  */
61
- remoteSDPForClusters = (localSDPList) => this.webex.request({
63
+ remoteSDPForClusters = (localSDPList: object) => this.webex.request({
62
64
  method: HTTP_VERBS.POST,
63
65
  shouldRefreshAccessToken: false,
64
66
  api: API.CALLIOPEDISCOVERY,
@@ -18,11 +18,10 @@ import {
18
18
  import BEHAVIORAL_METRICS from '../metrics/constants';
19
19
  import ReconnectionError from '../common/errors/reconnection';
20
20
  import ReconnectInProgress from '../common/errors/reconnection-in-progress';
21
- import PeerConnectionManager from '../peer-connection-manager';
22
21
  import {eventType, reconnection, errorObjects} from '../metrics/config';
23
22
  import Media from '../media';
24
23
  import Metrics from '../metrics';
25
- import RoapCollection from '../roap/collection';
24
+ import Meeting from '../meeting';
26
25
 
27
26
  /**
28
27
  * Used to indicate that the reconnect logic needs to be retried.
@@ -39,6 +38,8 @@ class NeedsRetryError extends Error {}
39
38
  * @extends {Error}
40
39
  */
41
40
  class NeedsRejoinError extends Error {
41
+ wasSharing: any;
42
+
42
43
  /**
43
44
  * Creates an instance of NeedsRejoinError.
44
45
  * @param {Object} params
@@ -46,7 +47,14 @@ class NeedsRejoinError extends Error {
46
47
  * @param {Error} params.error
47
48
  * @memberof NeedsRejoinError
48
49
  */
49
- constructor({wasSharing, error = new Error('Meeting needs to be rejoined')}) {
50
+ constructor({
51
+ wasSharing,
52
+ error = new Error('Meeting needs to be rejoined'),
53
+ }: {
54
+ wasSharing?: boolean;
55
+ error?: Error;
56
+ }) {
57
+ // @ts-ignore
50
58
  super(error);
51
59
 
52
60
  this.wasSharing = wasSharing;
@@ -58,10 +66,19 @@ class NeedsRejoinError extends Error {
58
66
  * @class ReconnectionManager
59
67
  */
60
68
  export default class ReconnectionManager {
69
+ autoRejoinEnabled: any;
70
+ iceState: any;
71
+ maxRejoinAttempts: any;
72
+ meeting: any;
73
+ rejoinAttempts: any;
74
+ shareStatus: any;
75
+ status: any;
76
+ tryCount: any;
77
+ webex: any;
61
78
  /**
62
79
  * @param {Meeting} meeting
63
80
  */
64
- constructor(meeting) {
81
+ constructor(meeting: Meeting) {
65
82
  /**
66
83
  * Stores ICE reconnection state data.
67
84
  *
@@ -74,6 +91,7 @@ export default class ReconnectionManager {
74
91
  disconnected: false,
75
92
  resolve: () => {},
76
93
  timer: undefined,
94
+ // @ts-ignore
77
95
  timeoutDuration: meeting.config.reconnection.iceReconnectionTimeout
78
96
  };
79
97
 
@@ -99,6 +117,7 @@ export default class ReconnectionManager {
99
117
  */
100
118
  // TODO : change this logic to not save the meeting instance
101
119
  // It gets complicated when meeting ends on remote side , We have a old meeting instance which is not up to date
120
+ // @ts-ignore
102
121
  this.webex = meeting.webex;
103
122
  /**
104
123
  * @instance
@@ -110,8 +129,10 @@ export default class ReconnectionManager {
110
129
  // try moving this to meetings collection
111
130
  this.meeting = meeting;
112
131
 
132
+ // @ts-ignore
113
133
  this.maxRejoinAttempts = meeting.config.reconnection.maxRejoinAttempts;
114
134
  this.rejoinAttempts = RECONNECTION.STATE.DEFAULT_TRY_COUNT;
135
+ // @ts-ignore
115
136
  this.autoRejoinEnabled = meeting.config.reconnection.autoRejoin;
116
137
 
117
138
 
@@ -119,6 +140,21 @@ export default class ReconnectionManager {
119
140
  this.reset();
120
141
  }
121
142
 
143
+ /**
144
+ * @public
145
+ * @memberof ReconnectionManager
146
+ * @returns {void}
147
+ */
148
+ resetReconnectionTimer() {
149
+ this.iceState.resolve();
150
+ this.iceState.resolve = () => {};
151
+
152
+ if (this.iceState.timer) {
153
+ clearTimeout(this.iceState.timer);
154
+ delete this.iceState.timer;
155
+ }
156
+ }
157
+
122
158
  /**
123
159
  * Sets the iceState to connected and clears any disconnect timeouts and
124
160
  * related timeout data within the iceState.
@@ -127,17 +163,11 @@ export default class ReconnectionManager {
127
163
  * @public
128
164
  * @memberof ReconnectionManager
129
165
  */
130
- iceReconnected() {
166
+ public iceReconnected() {
131
167
  if (this.iceState.disconnected) {
132
168
  LoggerProxy.logger.log('ReconnectionManager:index#iceReconnected --> ice has reconnected');
133
169
 
134
- this.iceState.resolve();
135
- this.iceState.resolve = () => {};
136
-
137
- if (this.iceState.timer) {
138
- clearTimeout(this.iceState.timer);
139
- delete this.iceState.timer;
140
- }
170
+ this.resetReconnectionTimer();
141
171
 
142
172
  this.iceState.disconnected = false;
143
173
  }
@@ -153,13 +183,13 @@ export default class ReconnectionManager {
153
183
  * @public
154
184
  * @memberof ReconnectionManager
155
185
  */
156
- waitForIceReconnect() {
186
+ public waitForIceReconnect() {
157
187
  if (!this.iceState.disconnected) {
158
188
  LoggerProxy.logger.log('ReconnectionManager:index#waitForIceReconnect --> waiting for ice reconnect');
159
189
 
160
190
  this.iceState.disconnected = true;
161
191
 
162
- return new Promise((resolve, reject) => {
192
+ return new Promise<void>((resolve, reject) => {
163
193
  this.iceState.timer = setTimeout(() => {
164
194
  if (this.iceState.disconnected === false) {
165
195
  resolve();
@@ -183,7 +213,7 @@ export default class ReconnectionManager {
183
213
  * @public
184
214
  * @memberof ReconnectionManager
185
215
  */
186
- reset() {
216
+ public reset() {
187
217
  this.status = RECONNECTION.STATE.DEFAULT_STATUS;
188
218
  this.tryCount = RECONNECTION.STATE.DEFAULT_TRY_COUNT;
189
219
  this.rejoinAttempts = RECONNECTION.STATE.DEFAULT_TRY_COUNT;
@@ -194,18 +224,28 @@ export default class ReconnectionManager {
194
224
  * @public
195
225
  * @memberof ReconnectionManager
196
226
  */
197
- cleanUp() {
227
+ public cleanUp() {
198
228
  this.reset();
199
229
  this.meeting = null;
200
230
  }
201
231
 
232
+
233
+ /**
234
+ * @public
235
+ * @memberof ReconnectionManager
236
+ * @returns {Boolean} true if reconnection operation is in progress
237
+ */
238
+ isReconnectInProgress() {
239
+ return (this.status === RECONNECTION.STATE.IN_PROGRESS);
240
+ }
241
+
202
242
  /**
203
243
  * @returns {Boolean}
204
244
  * @throws {ReconnectionError}
205
245
  * @private
206
246
  * @memberof ReconnectionManager
207
247
  */
208
- validate() {
248
+ private validate() {
209
249
  if (this.meeting.config.reconnection.enabled) {
210
250
  if (
211
251
  this.status === RECONNECTION.STATE.DEFAULT_STATUS ||
@@ -233,7 +273,13 @@ export default class ReconnectionManager {
233
273
  * @public
234
274
  * @memberof ReconnectionManager
235
275
  */
236
- async reconnect({networkDisconnect = false, networkRetry = false} = {}) {
276
+ public async reconnect({
277
+ networkDisconnect = false,
278
+ networkRetry = false,
279
+ }: {
280
+ networkDisconnect?: boolean;
281
+ networkRetry?: boolean;
282
+ } = {}) {
237
283
  LoggerProxy.logger.info(`ReconnectionManager:index#reconnect --> Reconnection start for meeting ${this.meeting.id}.`);
238
284
  // First, validate that we can reconnect, if not, it will throw an error
239
285
  try {
@@ -315,7 +361,7 @@ export default class ReconnectionManager {
315
361
  * @private
316
362
  * @memberof ReconnectionManager
317
363
  */
318
- async executeReconnection({networkDisconnect = false}) {
364
+ private async executeReconnection({ networkDisconnect = false }: { networkDisconnect?: boolean }) {
319
365
  this.status = RECONNECTION.STATE.IN_PROGRESS;
320
366
 
321
367
  LoggerProxy.logger.info('ReconnectionManager:index#executeReconnection --> Attempting to reconnect to meeting.');
@@ -385,16 +431,13 @@ export default class ReconnectionManager {
385
431
  * @param {boolean} wasSharing
386
432
  * @returns {Promise}
387
433
  */
388
- async rejoinMeeting(wasSharing = false) {
434
+ async rejoinMeeting(wasSharing: boolean = false) {
389
435
  try {
390
436
  LoggerProxy.logger.info('ReconnectionManager:index#rejoinMeeting --> attemping meeting rejoin');
391
- const previousCorrelationId = this.meeting.correlationId;
392
437
 
393
438
  await this.meeting.join({rejoin: true});
394
439
  LoggerProxy.logger.info('ReconnectionManager:index#rejoinMeeting --> meeting rejoined');
395
440
 
396
- RoapCollection.deleteSession(previousCorrelationId);
397
-
398
441
  if (wasSharing) {
399
442
  // Stop the share streams if user tried to rejoin
400
443
  Media.stopTracks(this.meeting.mediaProperties.shareTrack);
@@ -451,28 +494,22 @@ export default class ReconnectionManager {
451
494
  * @private
452
495
  * @memberof ReconnectionManager
453
496
  */
454
- reconnectMedia() {
497
+ async reconnectMedia() {
455
498
  LoggerProxy.logger.log('ReconnectionManager:index#reconnectMedia --> Begin reestablishment of media');
456
499
 
457
- return ReconnectionManager.setupPeerConnection(this.meeting)
458
- .then(() => Media.attachMedia(this.meeting.mediaProperties, {
459
- meetingId: this.meeting.id,
460
- remoteQualityLevel: this.meeting.mediaProperties.remoteQualityLevel,
461
- enableRtx: this.meeting.config.enableRtx,
462
- enableExtmap: this.meeting.config.enableExtmap
463
- }))
464
- .then((peerConnection) => this.meeting.setRemoteStream(peerConnection))
465
- .then(() => {
466
- LoggerProxy.logger.log('ReconnectionManager:index#reconnectMedia --> Sending ROAP media request');
467
-
468
- return this.meeting.roap
469
- .sendRoapMediaRequest({
470
- sdp: this.meeting.mediaProperties.peerConnection.sdp,
471
- roapSeq: this.meeting.roapSeq,
472
- meeting: this.meeting,
473
- reconnect: true
474
- });
475
- });
500
+ // we are not simply calling this.meeting.mediaProperties.webrtcMediaConnection.reconnect(),
501
+ // but instead manually closing and creating new media connection, because we need to do the TURN discovery again
502
+
503
+ await this.meeting.closePeerConnections();
504
+ this.meeting.mediaProperties.unsetPeerConnection();
505
+
506
+ const turnServerResult = await this.meeting.roap.doTurnDiscovery(this.meeting, true);
507
+
508
+ const mc = this.meeting.createMediaConnection(turnServerResult.turnServerInfo);
509
+
510
+ this.meeting.statsAnalyzer.updateMediaConnection(mc);
511
+
512
+ return mc.initiateOffer();
476
513
  }
477
514
 
478
515
  /**
@@ -481,7 +518,7 @@ export default class ReconnectionManager {
481
518
  * @private
482
519
  * @memberof ReconnectionManager
483
520
  */
484
- async reconnectMercuryWebSocket() {
521
+ private async reconnectMercuryWebSocket() {
485
522
  LoggerProxy.logger.info('ReconnectionManager:index#reconnectMercuryWebSocket --> Reconnecting websocket.');
486
523
  // First, attempt to disconnect if we think we are already connected.
487
524
  if (this.webex.internal.mercury.connected) {
@@ -508,25 +545,4 @@ export default class ReconnectionManager {
508
545
  throw (connectError);
509
546
  }
510
547
  }
511
-
512
- /**
513
- * @param {Meeting} meeting
514
- * @returns {undefined}
515
- * @private
516
- * @memberof ReconnectionManager
517
- */
518
- static async setupPeerConnection(meeting) {
519
- LoggerProxy.logger.log('ReconnectionManager:index#setupPeerConnection --> Begin resetting peer connection');
520
- // close pcs, unset to null and create a new one with out closing any streams
521
- PeerConnectionManager.close(meeting.mediaProperties.peerConnection);
522
- meeting.mediaProperties.unsetPeerConnection();
523
-
524
- const turnInfo = await meeting.roap.doTurnDiscovery(meeting, true);
525
-
526
- meeting.mediaProperties.reInitiatePeerconnection(turnInfo);
527
- PeerConnectionManager.setPeerConnectionEvents(meeting);
528
-
529
- // update the peerconnection in the stats manager when ever we reconnect
530
- meeting.statsAnalyzer.updatePeerconnection(meeting.mediaProperties.peerConnection);
531
- }
532
548
  }