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

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 (281) 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 +1146 -602
  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 +83 -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/reactions/reactions.js +111 -0
  130. package/dist/reactions/reactions.js.map +1 -0
  131. package/dist/reactions/reactions.type.js +40 -0
  132. package/dist/reactions/reactions.type.js.map +1 -0
  133. package/dist/reconnection-manager/index.js +130 -132
  134. package/dist/reconnection-manager/index.js.map +1 -1
  135. package/dist/roap/index.js +58 -231
  136. package/dist/roap/index.js.map +1 -1
  137. package/dist/roap/request.js +7 -116
  138. package/dist/roap/request.js.map +1 -1
  139. package/dist/roap/turnDiscovery.js +20 -6
  140. package/dist/roap/turnDiscovery.js.map +1 -1
  141. package/dist/statsAnalyzer/global.js +2 -0
  142. package/dist/statsAnalyzer/global.js.map +1 -1
  143. package/dist/statsAnalyzer/index.js +58 -37
  144. package/dist/statsAnalyzer/index.js.map +1 -1
  145. package/dist/statsAnalyzer/mqaUtil.js +9 -3
  146. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  147. package/dist/transcription/index.js +10 -3
  148. package/dist/transcription/index.js.map +1 -1
  149. package/package.json +21 -20
  150. package/src/common/{browser-detection.js → browser-detection.ts} +1 -1
  151. package/src/common/collection.ts +6 -6
  152. package/src/common/{config.js → config.ts} +1 -1
  153. package/src/common/errors/{captcha-error.js → captcha-error.ts} +5 -1
  154. package/src/common/errors/{intent-to-join.js → intent-to-join.ts} +6 -1
  155. package/src/common/errors/{join-meeting.js → join-meeting.ts} +6 -1
  156. package/src/common/errors/{media.js → media.ts} +5 -1
  157. package/src/common/errors/parameter.ts +3 -2
  158. package/src/common/errors/{password-error.js → password-error.ts} +5 -1
  159. package/src/common/errors/{permission.js → permission.ts} +5 -1
  160. package/src/common/errors/{reconnection-in-progress.js → reconnection-in-progress.ts} +0 -0
  161. package/src/common/errors/{reconnection.js → reconnection.ts} +5 -1
  162. package/src/common/errors/{stats.js → stats.ts} +5 -1
  163. package/src/common/errors/{webex-errors.js → webex-errors.ts} +1 -20
  164. package/src/common/errors/{webex-meetings-error.js → webex-meetings-error.ts} +3 -1
  165. package/src/common/events/{events-scope.js → events-scope.ts} +1 -1
  166. package/src/common/events/{events.js → events.ts} +0 -0
  167. package/src/common/events/{trigger-proxy.js → trigger-proxy.ts} +1 -2
  168. package/src/common/events/{util.js → util.ts} +1 -1
  169. package/src/common/logs/{logger-config.js → logger-config.ts} +1 -2
  170. package/src/common/logs/{logger-proxy.js → logger-proxy.ts} +1 -1
  171. package/src/common/logs/{request.js → request.ts} +12 -2
  172. package/src/common/queue.ts +1 -2
  173. package/src/{config.js → config.ts} +2 -0
  174. package/src/constants.ts +139 -179
  175. package/src/locus-info/{controlsUtils.js → controlsUtils.ts} +4 -4
  176. package/src/locus-info/{embeddedAppsUtils.js → embeddedAppsUtils.ts} +5 -6
  177. package/src/locus-info/{fullState.js → fullState.ts} +1 -1
  178. package/src/locus-info/{hostUtils.js → hostUtils.ts} +5 -5
  179. package/src/locus-info/{index.js → index.ts} +67 -32
  180. package/src/locus-info/{infoUtils.js → infoUtils.ts} +7 -4
  181. package/src/locus-info/{mediaSharesUtils.js → mediaSharesUtils.ts} +13 -13
  182. package/src/locus-info/{parser.js → parser.ts} +22 -12
  183. package/src/locus-info/{selfUtils.js → selfUtils.ts} +17 -19
  184. package/src/media/{index.js → index.ts} +130 -205
  185. package/src/media/internal-media-core-wrapper.ts +9 -0
  186. package/src/media/{properties.js → properties.ts} +35 -29
  187. package/src/media/util.ts +16 -0
  188. package/src/mediaQualityMetrics/{config.js → config.ts} +1 -1
  189. package/src/meeting/{effectsState.js → effectsState.ts} +12 -6
  190. package/src/meeting/{index.js → index.ts} +993 -474
  191. package/src/meeting/{muteState.js → muteState.ts} +16 -11
  192. package/src/meeting/{request.js → request.ts} +148 -36
  193. package/src/meeting/{state.js → state.ts} +6 -6
  194. package/src/meeting/{util.js → util.ts} +9 -51
  195. package/src/meeting-info/{collection.js → collection.ts} +4 -1
  196. package/src/meeting-info/{index.js → index.ts} +10 -6
  197. package/src/meeting-info/{meeting-info-v2.js → meeting-info-v2.ts} +28 -10
  198. package/src/meeting-info/{request.js → request.ts} +6 -2
  199. package/src/meeting-info/{util.js → util.ts} +6 -5
  200. package/src/meeting-info/{utilv2.js → utilv2.ts} +8 -7
  201. package/src/meetings/{collection.js → collection.ts} +5 -2
  202. package/src/meetings/{index.js → index.ts} +118 -22
  203. package/src/meetings/{request.js → request.ts} +6 -1
  204. package/src/meetings/{util.js → util.ts} +28 -5
  205. package/src/member/{index.js → index.ts} +46 -15
  206. package/src/member/{util.js → util.ts} +17 -16
  207. package/src/members/{collection.js → collection.ts} +2 -1
  208. package/src/members/{index.js → index.ts} +94 -26
  209. package/src/members/{request.js → request.ts} +16 -5
  210. package/src/members/{util.js → util.ts} +7 -7
  211. package/src/metrics/{config.js → config.ts} +0 -2
  212. package/src/metrics/{constants.js → constants.ts} +0 -0
  213. package/src/metrics/{index.js → index.ts} +27 -8
  214. package/src/multistream/mediaRequestManager.ts +166 -0
  215. package/src/multistream/multistreamMedia.ts +92 -0
  216. package/src/multistream/receiveSlot.ts +141 -0
  217. package/src/multistream/receiveSlotManager.ts +142 -0
  218. package/src/multistream/remoteMedia.ts +228 -0
  219. package/src/multistream/remoteMediaGroup.ts +224 -0
  220. package/src/multistream/remoteMediaManager.ts +911 -0
  221. package/src/networkQualityMonitor/{index.js → index.ts} +18 -3
  222. package/src/personal-meeting-room/{index.js → index.ts} +17 -4
  223. package/src/personal-meeting-room/{request.js → request.ts} +3 -1
  224. package/src/personal-meeting-room/{util.js → util.ts} +1 -1
  225. package/src/reachability/{index.js → index.ts} +28 -17
  226. package/src/reachability/request.ts +4 -2
  227. package/src/reactions/reactions.ts +104 -0
  228. package/src/reactions/reactions.type.ts +36 -0
  229. package/src/reconnection-manager/{index.js → index.ts} +81 -65
  230. package/src/roap/index.ts +229 -0
  231. package/src/roap/{request.js → request.ts} +15 -74
  232. package/src/roap/turnDiscovery.ts +26 -11
  233. package/src/statsAnalyzer/{global.js → global.ts} +2 -0
  234. package/src/statsAnalyzer/{index.js → index.ts} +66 -61
  235. package/src/statsAnalyzer/{mqaUtil.js → mqaUtil.ts} +6 -1
  236. package/src/transcription/{index.js → index.ts} +16 -11
  237. package/test/integration/spec/journey.js +1 -1
  238. package/test/integration/spec/space-meeting.js +1 -2
  239. package/test/unit/spec/locus-info/infoUtils.js +17 -1
  240. package/test/unit/spec/media/index.ts +207 -0
  241. package/test/unit/spec/media/properties.ts +73 -82
  242. package/test/unit/spec/meeting/effectsState.js +1 -3
  243. package/test/unit/spec/meeting/index.js +672 -245
  244. package/test/unit/spec/meeting/muteState.js +7 -0
  245. package/test/unit/spec/meeting/request.js +25 -1
  246. package/test/unit/spec/meeting/utils.js +63 -2
  247. package/test/unit/spec/meetings/index.js +0 -4
  248. package/test/unit/spec/members/index.js +164 -2
  249. package/test/unit/spec/multistream/mediaRequestManager.ts +515 -0
  250. package/test/unit/spec/multistream/receiveSlot.ts +104 -0
  251. package/test/unit/spec/multistream/receiveSlotManager.ts +173 -0
  252. package/test/unit/spec/multistream/remoteMedia.ts +225 -0
  253. package/test/unit/spec/multistream/remoteMediaGroup.ts +396 -0
  254. package/test/unit/spec/multistream/remoteMediaManager.ts +1309 -0
  255. package/test/unit/spec/reconnection-manager/index.js +68 -2
  256. package/test/unit/spec/roap/index.ts +63 -35
  257. package/test/unit/spec/stats-analyzer/index.js +19 -22
  258. package/dist/peer-connection-manager/index.js +0 -794
  259. package/dist/peer-connection-manager/index.js.map +0 -1
  260. package/dist/peer-connection-manager/util.js +0 -124
  261. package/dist/peer-connection-manager/util.js.map +0 -1
  262. package/dist/roap/collection.js +0 -73
  263. package/dist/roap/collection.js.map +0 -1
  264. package/dist/roap/handler.js +0 -337
  265. package/dist/roap/handler.js.map +0 -1
  266. package/dist/roap/state.js +0 -164
  267. package/dist/roap/state.js.map +0 -1
  268. package/dist/roap/util.js +0 -102
  269. package/dist/roap/util.js.map +0 -1
  270. package/src/media/util.js +0 -38
  271. package/src/peer-connection-manager/index.js +0 -723
  272. package/src/peer-connection-manager/util.ts +0 -117
  273. package/src/roap/collection.js +0 -63
  274. package/src/roap/handler.js +0 -252
  275. package/src/roap/index.js +0 -380
  276. package/src/roap/state.js +0 -149
  277. package/src/roap/util.js +0 -93
  278. package/test/unit/spec/peerconnection-manager/index.js +0 -188
  279. package/test/unit/spec/peerconnection-manager/utils.js +0 -48
  280. package/test/unit/spec/peerconnection-manager/utils.test-fixtures.ts +0 -389
  281. package/test/unit/spec/roap/util.js +0 -30
@@ -17,13 +17,13 @@ import {
17
17
  } from '../constants';
18
18
  import ParameterError from '../common/errors/parameter';
19
19
 
20
- const MemberUtil = {};
20
+ const MemberUtil: any = {};
21
21
 
22
22
  /**
23
23
  * @param {Object} participant the locus participant
24
24
  * @returns {Boolean}
25
25
  */
26
- MemberUtil.isUser = (participant) => participant && participant.type === _USER_;
26
+ MemberUtil.isUser = (participant: any) => participant && participant.type === _USER_;
27
27
 
28
28
  MemberUtil.isModerator = (participant) => participant && participant.moderator;
29
29
 
@@ -31,13 +31,13 @@ MemberUtil.isModerator = (participant) => participant && participant.moderator;
31
31
  * @param {Object} participant the locus participant
32
32
  * @returns {Boolean}
33
33
  */
34
- MemberUtil.isGuest = (participant) => participant && participant.guest;
34
+ MemberUtil.isGuest = (participant: any) => participant && participant.guest;
35
35
 
36
36
  /**
37
37
  * @param {Object} participant the locus participant
38
38
  * @returns {Boolean}
39
39
  */
40
- MemberUtil.isDevice = (participant) => participant && participant.type === _RESOURCE_ROOM_;
40
+ MemberUtil.isDevice = (participant: any) => participant && participant.type === _RESOURCE_ROOM_;
41
41
 
42
42
  MemberUtil.isModeratorAssignmentProhibited = (participant) => participant && participant.moderatorAssignmentNotAllowed;
43
43
 
@@ -48,7 +48,7 @@ MemberUtil.isModeratorAssignmentProhibited = (participant) => participant && par
48
48
  * @param {String} id
49
49
  * @returns {Boolean}
50
50
  */
51
- MemberUtil.isSame = (participant, id) => participant &&
51
+ MemberUtil.isSame = (participant: any, id: string) => participant &&
52
52
  (participant.id === id || participant.person && participant.person.id === id);
53
53
 
54
54
  /**
@@ -58,7 +58,7 @@ MemberUtil.isSame = (participant, id) => participant &&
58
58
  * @param {String} id
59
59
  * @returns {Boolean}
60
60
  */
61
- MemberUtil.isAssociatedSame = (participant, id) => participant &&
61
+ MemberUtil.isAssociatedSame = (participant: any, id: string) => participant &&
62
62
  participant.associatedUsers &&
63
63
  participant.associatedUsers.some((user) => (user.id === id || user.person && user.person.id === id));
64
64
 
@@ -68,16 +68,17 @@ participant.associatedUsers.some((user) => (user.id === id || user.person && use
68
68
  * @param {String} status
69
69
  * @returns {Boolean}
70
70
  */
71
- MemberUtil.isNotAdmitted = (participant, isGuest, status) => participant &&
71
+ MemberUtil.isNotAdmitted = (participant: any, isGuest: boolean, status: string) => participant &&
72
72
  participant.guest && ((participant.devices && participant.devices[0] &&
73
73
  participant.devices[0].intent && participant.devices[0].intent.type === _WAIT_ &&
74
+ // @ts-ignore
74
75
  isGuest && status === _IN_LOBBY_) || !status === _IN_MEETING_);
75
76
 
76
77
  /**
77
78
  * @param {Object} participant the locus participant
78
79
  * @returns {Boolean}
79
80
  */
80
- MemberUtil.isAudioMuted = (participant) => {
81
+ MemberUtil.isAudioMuted = (participant: any) => {
81
82
  if (!participant) {
82
83
  throw new ParameterError('Audio could not be processed, participant is undefined.');
83
84
  }
@@ -99,7 +100,7 @@ MemberUtil.isAudioMuted = (participant) => {
99
100
  * @param {Object} participant the locus participant
100
101
  * @returns {Boolean}
101
102
  */
102
- MemberUtil.isVideoMuted = (participant) => {
103
+ MemberUtil.isVideoMuted = (participant: any) => {
103
104
  if (!participant) {
104
105
  throw new ParameterError('Video could not be processed, participant is undefined.');
105
106
  }
@@ -111,7 +112,7 @@ MemberUtil.isVideoMuted = (participant) => {
111
112
  * @param {Object} participant the locus participant
112
113
  * @returns {Boolean}
113
114
  */
114
- MemberUtil.isHandRaised = (participant) => {
115
+ MemberUtil.isHandRaised = (participant: any) => {
115
116
  if (!participant) {
116
117
  throw new ParameterError('Raise hand could not be processed, participant is undefined.');
117
118
  }
@@ -125,7 +126,7 @@ MemberUtil.isHandRaised = (participant) => {
125
126
  * @param {String} accessor
126
127
  * @returns {Boolean}
127
128
  */
128
- MemberUtil.isMuted = (status, accessor) => {
129
+ MemberUtil.isMuted = (status: string, accessor: string) => {
129
130
  if (status) {
130
131
  if (status[accessor] === _RECEIVE_ONLY_) {
131
132
  return true;
@@ -143,7 +144,7 @@ MemberUtil.isMuted = (status, accessor) => {
143
144
  * @param {Object} controls
144
145
  * @returns {String|null}
145
146
  */
146
- MemberUtil.getRecordingMember = (controls) => {
147
+ MemberUtil.getRecordingMember = (controls: any) => {
147
148
  if (!controls) {
148
149
  return null;
149
150
  }
@@ -158,7 +159,7 @@ MemberUtil.getRecordingMember = (controls) => {
158
159
  * @param {Object} participant the locus participant
159
160
  * @returns {Boolean}
160
161
  */
161
- MemberUtil.isRecording = (participant) => {
162
+ MemberUtil.isRecording = (participant: any) => {
162
163
  if (!participant) {
163
164
  throw new ParameterError('Recording could not be processed, participant is undefined.');
164
165
  }
@@ -204,7 +205,7 @@ MemberUtil.isMutable = (isSelf, isDevice, isInMeeting, isMuted, type) => {
204
205
  * @param {Object} participant the locus participant
205
206
  * @returns {String}
206
207
  */
207
- MemberUtil.extractStatus = (participant) => {
208
+ MemberUtil.extractStatus = (participant: any) => {
208
209
  if (!(participant && participant.devices && participant.devices.length)) {
209
210
  return _NOT_IN_MEETING_;
210
211
  }
@@ -231,7 +232,7 @@ MemberUtil.extractStatus = (participant) => {
231
232
  * @param {Object} participant the locus participant
232
233
  * @returns {String}
233
234
  */
234
- MemberUtil.extractId = (participant) => {
235
+ MemberUtil.extractId = (participant: any) => {
235
236
  if (participant) {
236
237
  return participant.id;
237
238
  }
@@ -243,7 +244,7 @@ MemberUtil.extractId = (participant) => {
243
244
  * @param {Object} participant the locus participant
244
245
  * @returns {String}
245
246
  */
246
- MemberUtil.extractName = (participant) => {
247
+ MemberUtil.extractName = (participant: any) => {
247
248
  if (participant && participant.person) {
248
249
  return participant.person.name;
249
250
  }
@@ -4,6 +4,7 @@ import {MEETINGS} from '../constants';
4
4
  * @class MembersCollection
5
5
  */
6
6
  export default class MembersCollection {
7
+ members: any;
7
8
  namespace = MEETINGS;
8
9
 
9
10
  /**
@@ -26,7 +27,7 @@ export default class MembersCollection {
26
27
  * @param {String} id
27
28
  * @returns {Member}
28
29
  */
29
- get(id) {
30
+ get(id: string) {
30
31
  return this.members[id];
31
32
  }
32
33
 
@@ -2,6 +2,7 @@
2
2
  * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.
3
3
  */
4
4
  import {isEmpty} from 'lodash';
5
+ // @ts-ignore
5
6
  import {StatelessWebexPlugin} from '@webex/webex-core';
6
7
 
7
8
  import {MEETINGS, EVENT_TRIGGERS, FLOOR_ACTION, CONTENT, WHITEBOARD} from '../constants';
@@ -13,6 +14,8 @@ import ParameterError from '../common/errors/parameter';
13
14
  import MembersCollection from './collection';
14
15
  import MembersRequest from './request';
15
16
  import MembersUtil from './util';
17
+ import {ReceiveSlotManager} from '../multistream/receiveSlotManager';
18
+ import {MediaRequestManager} from '../multistream/mediaRequestManager';
16
19
 
17
20
  /**
18
21
  * Members Update Event
@@ -60,6 +63,21 @@ import MembersUtil from './util';
60
63
  * @class Members
61
64
  */
62
65
  export default class Members extends StatelessWebexPlugin {
66
+ hostId: any;
67
+ locusUrl: any;
68
+ mediaShareContentId: any;
69
+ mediaShareWhiteboardId: any;
70
+ membersCollection: any;
71
+ membersRequest: any;
72
+ receiveSlotManager: ReceiveSlotManager;
73
+ mediaRequestManagers: {
74
+ audio: MediaRequestManager;
75
+ video: MediaRequestManager;
76
+ };
77
+ recordingId: any;
78
+ selfId: any;
79
+ type: any;
80
+
63
81
  namespace = MEETINGS;
64
82
 
65
83
  /**
@@ -68,7 +86,7 @@ export default class Members extends StatelessWebexPlugin {
68
86
  * @param {Object} options
69
87
  * @memberof Members
70
88
  */
71
- constructor(attrs, options) {
89
+ constructor(attrs: any, options: object) {
72
90
  super({}, options);
73
91
  /**
74
92
  * The Members Request object to interact with server
@@ -77,6 +95,7 @@ export default class Members extends StatelessWebexPlugin {
77
95
  * @private
78
96
  * @memberof Members
79
97
  */
98
+ // @ts-ignore
80
99
  this.membersRequest = new MembersRequest({}, options);
81
100
  /**
82
101
  * The Members Collection cache
@@ -148,6 +167,18 @@ export default class Members extends StatelessWebexPlugin {
148
167
  * @memberof Members
149
168
  */
150
169
  this.recordingId = null;
170
+
171
+ /**
172
+ * reference to a ReceiveSlotManager instance (for multistream)
173
+ * @private
174
+ */
175
+ this.receiveSlotManager = attrs.receiveSlotManager;
176
+
177
+ /**
178
+ * reference to a MediaRequestManager instance that manages main video requests (for multistream)
179
+ * @private
180
+ */
181
+ this.mediaRequestManagers = attrs.mediaRequestManagers;
151
182
  }
152
183
 
153
184
  /**
@@ -159,7 +190,7 @@ export default class Members extends StatelessWebexPlugin {
159
190
  * @private
160
191
  * @memberof Members
161
192
  */
162
- locusSelfUpdate(payload) {
193
+ locusSelfUpdate(payload: { newSelf: any; oldSelf: any }) {
163
194
  let newSelfId = null;
164
195
  let oldSelfId = null;
165
196
 
@@ -209,7 +240,7 @@ export default class Members extends StatelessWebexPlugin {
209
240
  * @private
210
241
  * @memberof Members
211
242
  */
212
- locusHostUpdate(payload) {
243
+ locusHostUpdate(payload: { newHost: any; oldHost: any }) {
213
244
  let newHostId = null;
214
245
  let oldHostId = null;
215
246
 
@@ -259,7 +290,7 @@ export default class Members extends StatelessWebexPlugin {
259
290
  * @private
260
291
  * @memberof Members
261
292
  */
262
- locusParticipantsUpdate(payload) {
293
+ locusParticipantsUpdate(payload: { participants: object }) {
263
294
  if (payload) {
264
295
  const delta = this.handleLocusInfoUpdatedParticipants(payload);
265
296
  const full = this.handleMembersUpdate(delta); // SDK should propagate the full list for both delta and non delta updates
@@ -288,7 +319,7 @@ export default class Members extends StatelessWebexPlugin {
288
319
  * @private
289
320
  * @memberof Members
290
321
  */
291
- locusMediaSharesUpdate(payload) {
322
+ locusMediaSharesUpdate(payload: { current: any; previous: any }) {
292
323
  const currentContent = payload.current?.content;
293
324
  const previousContent = payload.previous?.content;
294
325
  const currentWhiteboard = payload.current?.whiteboard;
@@ -370,7 +401,7 @@ export default class Members extends StatelessWebexPlugin {
370
401
  * @private
371
402
  * @memberof Members
372
403
  */
373
- locusUrlUpdate(payload) {
404
+ locusUrlUpdate(payload: any) {
374
405
  if (payload) {
375
406
  this.setLocusUrl(null, payload);
376
407
  }
@@ -384,7 +415,7 @@ export default class Members extends StatelessWebexPlugin {
384
415
  * @private
385
416
  * @memberof Members
386
417
  */
387
- locusFullStateTypeUpdate(payload) {
418
+ locusFullStateTypeUpdate(payload: { type: string }) {
388
419
  // TODO: at some point there could be a timing issue here, for updating each member
389
420
  // ie., if the type changes AND there is no locus update, then each member will not know the type of call
390
421
  // which means they cannot determine isMutable && isRemovable
@@ -403,7 +434,7 @@ export default class Members extends StatelessWebexPlugin {
403
434
  * @private
404
435
  * @memberof Members
405
436
  */
406
- handleMembersUpdate(membersUpdate) {
437
+ private handleMembersUpdate(membersUpdate: any) {
407
438
  if (membersUpdate) {
408
439
  if (membersUpdate.updated) {
409
440
  this.constructMembers(membersUpdate.updated);
@@ -423,7 +454,7 @@ export default class Members extends StatelessWebexPlugin {
423
454
  * @private
424
455
  * @memberof Members
425
456
  */
426
- constructMembers(list) {
457
+ private constructMembers(list: Array<any>) {
427
458
  list.forEach((member) => {
428
459
  this.membersCollection.set(member.id, member);
429
460
  });
@@ -436,7 +467,7 @@ export default class Members extends StatelessWebexPlugin {
436
467
  * @private
437
468
  * @memberof Members
438
469
  */
439
- handleLocusInfoUpdatedParticipants(payload) {
470
+ private handleLocusInfoUpdatedParticipants(payload: any) {
440
471
  this.hostId = payload.hostId || this.hostId;
441
472
  this.selfId = payload.selfId || this.selfId;
442
473
  this.recordingId = payload.recordingId;
@@ -457,7 +488,7 @@ export default class Members extends StatelessWebexPlugin {
457
488
  * @public
458
489
  * @memberof Members
459
490
  */
460
- setLocusUrl(locus, locusUrl = null) {
491
+ public setLocusUrl(locus: any, locusUrl: string = null) {
461
492
  if (locusUrl) {
462
493
  this.locusUrl = locusUrl;
463
494
  }
@@ -478,7 +509,7 @@ export default class Members extends StatelessWebexPlugin {
478
509
  * @public
479
510
  * @memberof Members
480
511
  */
481
- setHostId(locus, hostId = null) {
512
+ public setHostId(locus: any, hostId: string = null) {
482
513
  if (hostId) {
483
514
  this.hostId = hostId;
484
515
  }
@@ -499,7 +530,7 @@ export default class Members extends StatelessWebexPlugin {
499
530
  * @public
500
531
  * @memberof Members
501
532
  */
502
- setType(fullState, type = null) {
533
+ public setType(fullState: any, type: string = null) {
503
534
  if (type) {
504
535
  this.type = type;
505
536
  }
@@ -519,7 +550,7 @@ export default class Members extends StatelessWebexPlugin {
519
550
  * @returns {undefined}
520
551
  * @memberof Members
521
552
  */
522
- setSelfId(locus, selfId = null) {
553
+ setSelfId(locus: any, selfId: string = null) {
523
554
  if (selfId) {
524
555
  this.selfId = selfId;
525
556
  }
@@ -539,7 +570,7 @@ export default class Members extends StatelessWebexPlugin {
539
570
  * @returns {undefined}
540
571
  * @memberof Members
541
572
  */
542
- setMediaShareContentId(locus, contentId) {
573
+ setMediaShareContentId(locus: any, contentId?: string) {
543
574
  if (contentId) {
544
575
  this.mediaShareContentId = contentId;
545
576
  }
@@ -569,7 +600,7 @@ export default class Members extends StatelessWebexPlugin {
569
600
  * @returns {undefined}
570
601
  * @memberof Members
571
602
  */
572
- setMediaShareWhiteboardId(locus, whiteboardId) {
603
+ setMediaShareWhiteboardId(locus: any, whiteboardId?: string) {
573
604
  if (whiteboardId) {
574
605
  this.mediaShareWhiteboardId = whiteboardId;
575
606
  }
@@ -600,7 +631,7 @@ export default class Members extends StatelessWebexPlugin {
600
631
  * @private
601
632
  * @memberof Members
602
633
  */
603
- update(participants) {
634
+ private update(participants: Array<any>) {
604
635
  const membersUpdate = {added: [], updated: []};
605
636
 
606
637
  if (participants) {
@@ -649,7 +680,7 @@ export default class Members extends StatelessWebexPlugin {
649
680
  * @returns {Promise}
650
681
  * @memberof Members
651
682
  */
652
- addMember(invitee, alertIfActive) {
683
+ addMember(invitee: any, alertIfActive?: boolean) {
653
684
  if (!this.locusUrl) {
654
685
  return Promise.reject(new ParameterError('The associated locus url for this meeting object must be defined.'));
655
686
  }
@@ -669,7 +700,7 @@ export default class Members extends StatelessWebexPlugin {
669
700
  * @returns {Promise}
670
701
  * @memberof Members
671
702
  */
672
- cancelPhoneInvite(invitee) {
703
+ cancelPhoneInvite(invitee: any) {
673
704
  if (!this.locusUrl) {
674
705
  return Promise.reject(new ParameterError('The associated locus url for this meeting object must be defined.'));
675
706
  }
@@ -691,7 +722,7 @@ export default class Members extends StatelessWebexPlugin {
691
722
  * @public
692
723
  * @memberof Members
693
724
  */
694
- admitMembers(memberIds) {
725
+ public admitMembers(memberIds: Array<any>) {
695
726
  if (isEmpty(memberIds)) {
696
727
  return Promise.reject(new ParameterError('No member ids provided to admit.'));
697
728
  }
@@ -707,7 +738,7 @@ export default class Members extends StatelessWebexPlugin {
707
738
  * @public
708
739
  * @memberof Members
709
740
  */
710
- removeMember(memberId) {
741
+ public removeMember(memberId: string) {
711
742
  if (!this.locusUrl) {
712
743
  return Promise.reject(new ParameterError('The associated locus url for this meeting object must be defined.'));
713
744
  }
@@ -727,7 +758,7 @@ export default class Members extends StatelessWebexPlugin {
727
758
  * @public
728
759
  * @memberof Members
729
760
  */
730
- muteMember(memberId, mute = true) {
761
+ public muteMember(memberId: string, mute: boolean = true) {
731
762
  if (!this.locusUrl) {
732
763
  return Promise.reject(new ParameterError('The associated locus url for this meetings members object must be defined.'));
733
764
  }
@@ -747,7 +778,7 @@ export default class Members extends StatelessWebexPlugin {
747
778
  * @public
748
779
  * @memberof Members
749
780
  */
750
- raiseOrLowerHand(memberId, raise = true) {
781
+ public raiseOrLowerHand(memberId: string, raise: boolean = true) {
751
782
  if (!this.locusUrl) {
752
783
  return Promise.reject(new ParameterError('The associated locus url for this meetings members object must be defined.'));
753
784
  }
@@ -766,7 +797,7 @@ export default class Members extends StatelessWebexPlugin {
766
797
  * @public
767
798
  * @memberof Members
768
799
  */
769
- lowerAllHands(requestingMemberId) {
800
+ public lowerAllHands(requestingMemberId: string) {
770
801
  if (!this.locusUrl) {
771
802
  return Promise.reject(new ParameterError('The associated locus url for this meetings members object must be defined.'));
772
803
  }
@@ -787,7 +818,7 @@ export default class Members extends StatelessWebexPlugin {
787
818
  * @public
788
819
  * @memberof Members
789
820
  */
790
- transferHostToMember(memberId, moderator = true) {
821
+ public transferHostToMember(memberId: string, moderator: boolean = true) {
791
822
  if (!this.locusUrl) {
792
823
  return Promise.reject(new ParameterError('The associated locus url for this meetings members object must be defined.'));
793
824
  }
@@ -808,7 +839,8 @@ export default class Members extends StatelessWebexPlugin {
808
839
  * @public
809
840
  * @memberof Members
810
841
  */
811
- sendDialPadKey(tones = '', memberId = '') {
842
+ public sendDialPadKey(tones: string = '', memberId: string = '') {
843
+ // @ts-ignore
812
844
  if (!tones && tones !== 0) {
813
845
  return Promise.reject(new ParameterError('DMTF tones must be passed in'));
814
846
  }
@@ -833,4 +865,40 @@ export default class Members extends StatelessWebexPlugin {
833
865
 
834
866
  return Promise.reject(new Error('Members:index#sendDialPadKey --> cannot send DTMF, meeting does not have a connection to the "locus" call control service.'));
835
867
  }
868
+
869
+ /** Finds a member that has any device with a csi matching provided value
870
+ *
871
+ * @param {number} csi
872
+ * @returns {Member}
873
+ */
874
+ findMemberByCsi(csi) {
875
+ return Object.values(this.membersCollection.getAll())
876
+ .find((member) => (
877
+ member.participant?.devices?.find((device) => (
878
+ device.csis?.find((memberCsi) => memberCsi === csi)))));
879
+ }
880
+
881
+ /**
882
+ * Returns an array of a member's CSIs matching the mediaType and mediaContent
883
+ *
884
+ * @param {string} memberId
885
+ * @param {string} mediaType 'audio' or 'video'
886
+ * @param {string} mediaContent 'main' or 'slides'
887
+ * @returns {Member}
888
+ */
889
+ getCsisForMember(memberId, mediaType = 'video', mediaContent = 'main') {
890
+ const csis = [];
891
+
892
+ this.membersCollection.get(memberId)?.participant?.devices?.forEach((device) => {
893
+ if (device.mediaSessions) {
894
+ const deviceCsis = device.mediaSessions
895
+ ?.filter((mediaSession) => mediaSession.mediaType === mediaType && mediaSession.mediaContent === mediaContent)
896
+ .map((mediaSession) => mediaSession.csi);
897
+
898
+ csis.push(...deviceCsis);
899
+ }
900
+ });
901
+
902
+ return csis;
903
+ }
836
904
  }
@@ -1,3 +1,4 @@
1
+ // @ts-ignore
1
2
  import {StatelessWebexPlugin} from '@webex/webex-core';
2
3
 
3
4
  import {MEETINGS} from '../constants';
@@ -9,7 +10,7 @@ import MembersUtil from './util';
9
10
  /**
10
11
  * @class MembersRequest
11
12
  */
12
- export default class MembersRequest extends StatelessWebexPlugin {
13
+ export default class MembersRequest extends StatelessWebexPlugin {
13
14
  namespace = MEETINGS;
14
15
 
15
16
  /**
@@ -19,12 +20,13 @@ export default class MembersRequest extends StatelessWebexPlugin {
19
20
  * @throws {Error} if the options are not valid and complete, must have invitee with emailAddress OR email AND locusUrl
20
21
  * @memberof MembersRequest
21
22
  */
22
- addMembers(options) {
23
+ addMembers(options: any) {
23
24
  if (!(!options || !options.invitee || (!options.invitee.emailAddress || !options.invitee.email || !options.invitee.phoneNumber) || !options.locusUrl)) {
24
25
  throw new ParameterError('invitee must be passed and the associated locus url for this meeting object must be defined.');
25
26
  }
26
27
  const requestParams = MembersUtil.getAddMemberRequestParams(options);
27
28
 
29
+ // @ts-ignore
28
30
  return this.request(requestParams);
29
31
  }
30
32
 
@@ -35,12 +37,13 @@ export default class MembersRequest extends StatelessWebexPlugin {
35
37
  * @throws {Error} if the options are not valid and complete, must have memberIds AND locusUrl
36
38
  * @memberof MembersRequest
37
39
  */
38
- admitMember(options) {
40
+ admitMember(options: any) {
39
41
  if (!options || !options.locusUrl || !options.memberIds) {
40
42
  throw new ParameterError('memberIds must be an array passed and the associated locus url for this meeting object must be defined.');
41
43
  }
42
44
  const requestParams = MembersUtil.getAdmitMemberRequestParams(options);
43
45
 
46
+ // @ts-ignore
44
47
  return this.request(requestParams);
45
48
  }
46
49
 
@@ -51,6 +54,7 @@ export default class MembersRequest extends StatelessWebexPlugin {
51
54
 
52
55
  const requestParams = MembersUtil.getRemoveMemberRequestParams(options);
53
56
 
57
+ // @ts-ignore
54
58
  return this.request(requestParams);
55
59
  }
56
60
 
@@ -61,6 +65,7 @@ export default class MembersRequest extends StatelessWebexPlugin {
61
65
 
62
66
  const requestParams = MembersUtil.getMuteMemberRequestParams(options);
63
67
 
68
+ // @ts-ignore
64
69
  return this.request(requestParams);
65
70
  }
66
71
 
@@ -71,6 +76,7 @@ export default class MembersRequest extends StatelessWebexPlugin {
71
76
 
72
77
  const requestParams = MembersUtil.getRaiseHandMemberRequestParams(options);
73
78
 
79
+ // @ts-ignore
74
80
  return this.request(requestParams);
75
81
  }
76
82
 
@@ -81,6 +87,7 @@ export default class MembersRequest extends StatelessWebexPlugin {
81
87
 
82
88
  const requestParams = MembersUtil.getLowerAllHandsMemberRequestParams(options);
83
89
 
90
+ // @ts-ignore
84
91
  return this.request(requestParams);
85
92
  }
86
93
 
@@ -91,6 +98,7 @@ export default class MembersRequest extends StatelessWebexPlugin {
91
98
 
92
99
  const requestParams = MembersUtil.getTransferHostToMemberRequestParams(options);
93
100
 
101
+ // @ts-ignore
94
102
  return this.request(requestParams);
95
103
  }
96
104
 
@@ -103,13 +111,15 @@ export default class MembersRequest extends StatelessWebexPlugin {
103
111
  * @param {String} options.memberId ID of PSTN user
104
112
  * @returns {Promise}
105
113
  */
106
- sendDialPadKey(options) {
114
+ sendDialPadKey(options: { locusUrl: string; url: string; tones: string; memberId: string }) {
115
+ // @ts-ignore
107
116
  if (!options || !options.locusUrl || !options.memberId || !options.url || !options.tones && options.tones !== 0) {
108
117
  throw new ParameterError('memberId must be defined, the associated locus url, the device url and DTMF tones for this meeting object must be defined.');
109
118
  }
110
119
 
111
120
  const requestParams = MembersUtil.generateSendDTMFRequestParams(options);
112
121
 
122
+ // @ts-ignore
113
123
  return this.request(requestParams);
114
124
  }
115
125
 
@@ -119,13 +129,14 @@ export default class MembersRequest extends StatelessWebexPlugin {
119
129
  * @throws {Error} if the options are not valid and complete, must have invitee with emailAddress OR email AND locusUrl
120
130
  * @memberof MembersRequest
121
131
  */
122
- cancelPhoneInvite(options) {
132
+ cancelPhoneInvite(options: any) {
123
133
  if (!(options?.invitee?.phoneNumber || options?.locusUrl)) {
124
134
  throw new ParameterError('invitee must be passed and the associated locus url for this meeting object must be defined.');
125
135
  }
126
136
 
127
137
  const requestParams = MembersUtil.generateCancelInviteRequestParams(options);
128
138
 
139
+ // @ts-ignore
129
140
  return this.request(requestParams);
130
141
  }
131
142
  }
@@ -12,7 +12,7 @@ import {
12
12
  _REMOVE_
13
13
  } from '../constants';
14
14
 
15
- const MembersUtil = {};
15
+ const MembersUtil: any = {};
16
16
 
17
17
  /**
18
18
  * @param {Object} invitee with emailAddress, email or phoneNumber
@@ -20,7 +20,7 @@ const MembersUtil = {};
20
20
  * @param {Boolean} alertIfActive
21
21
  * @returns {Object} the format object
22
22
  */
23
- MembersUtil.generateAddMemberOptions = (invitee, locusUrl, alertIfActive) => ({
23
+ MembersUtil.generateAddMemberOptions = (invitee: object, locusUrl: string, alertIfActive: boolean) => ({
24
24
  invitee,
25
25
  locusUrl,
26
26
  alertIfActive
@@ -31,7 +31,7 @@ MembersUtil.generateAddMemberOptions = (invitee, locusUrl, alertIfActive) => ({
31
31
  * @param {String} locusUrl
32
32
  * @returns {Object} the format object
33
33
  */
34
- MembersUtil.generateAdmitMemberOptions = (memberIds, locusUrl) => ({
34
+ MembersUtil.generateAdmitMemberOptions = (memberIds: Array<any>, locusUrl: string) => ({
35
35
  locusUrl,
36
36
  memberIds
37
37
  });
@@ -40,7 +40,7 @@ MembersUtil.generateAdmitMemberOptions = (memberIds, locusUrl) => ({
40
40
  * @param {Object} options with {invitee: {emailAddress, email, phoneNumber}, alertIfActive}
41
41
  * @returns {Object} with {invitees: [{address}], alertIfActive}
42
42
  */
43
- MembersUtil.getAddMemberBody = (options) => ({
43
+ MembersUtil.getAddMemberBody = (options: any) => ({
44
44
  invitees: [
45
45
  {
46
46
  address: options.invitee.emailAddress || options.invitee.email || options.invitee.phoneNumber
@@ -53,7 +53,7 @@ MembersUtil.getAddMemberBody = (options) => ({
53
53
  * @param {Object} options with {memberIds}
54
54
  * @returns {Object} admit with {memberIds}
55
55
  */
56
- MembersUtil.getAdmitMemberRequestBody = (options) => ({
56
+ MembersUtil.getAdmitMemberRequestBody = (options: any) => ({
57
57
  admit: {participantIds: options.memberIds}
58
58
  });
59
59
 
@@ -61,7 +61,7 @@ MembersUtil.getAdmitMemberRequestBody = (options) => ({
61
61
  * @param {Object} format with {memberIds, locusUrl}
62
62
  * @returns {Object} the request parameters (method, uri, body) needed to make a admitMember request
63
63
  */
64
- MembersUtil.getAdmitMemberRequestParams = (format) => {
64
+ MembersUtil.getAdmitMemberRequestParams = (format: any) => {
65
65
  const body = MembersUtil.getAdmitMemberRequestBody(format);
66
66
  const uri = `${format.locusUrl}/${CONTROLS}`;
67
67
 
@@ -76,7 +76,7 @@ MembersUtil.getAdmitMemberRequestParams = (format) => {
76
76
  * @param {Object} format with {invitee {emailAddress, email, phoneNumber}, locusUrl, alertIfActive}
77
77
  * @returns {Object} the request parameters (method, uri, body) needed to make a addMember request
78
78
  */
79
- MembersUtil.getAddMemberRequestParams = (format) => {
79
+ MembersUtil.getAddMemberRequestParams = (format: any) => {
80
80
  const body = MembersUtil.getAddMemberBody(format);
81
81
  const requestParams = {
82
82
  method: HTTP_VERBS.PUT,
@@ -1,5 +1,3 @@
1
-
2
-
3
1
  const errorDescription = {
4
2
  UNKNOWN_CALL_FAILURE: 'UnknownCallFailure',
5
3
  LOCUS_RATE_LIMITED_INCOMING: 'LocusRateLimitedIncoming',
File without changes