@webex/plugin-meetings 3.0.0-bnr.5 → 3.0.0-stream-classes.1

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 (303) hide show
  1. package/README.md +46 -8
  2. package/dist/annotation/annotation.types.js +7 -0
  3. package/dist/annotation/annotation.types.js.map +1 -0
  4. package/dist/annotation/constants.js +49 -0
  5. package/dist/annotation/constants.js.map +1 -0
  6. package/dist/annotation/index.js +342 -0
  7. package/dist/annotation/index.js.map +1 -0
  8. package/dist/breakouts/breakout.js +70 -32
  9. package/dist/breakouts/breakout.js.map +1 -1
  10. package/dist/breakouts/events.js +45 -0
  11. package/dist/breakouts/events.js.map +1 -0
  12. package/dist/breakouts/index.js +422 -217
  13. package/dist/breakouts/index.js.map +1 -1
  14. package/dist/breakouts/utils.js +12 -1
  15. package/dist/breakouts/utils.js.map +1 -1
  16. package/dist/common/errors/webex-errors.js +3 -2
  17. package/dist/common/errors/webex-errors.js.map +1 -1
  18. package/dist/common/logs/logger-proxy.js +1 -1
  19. package/dist/common/logs/logger-proxy.js.map +1 -1
  20. package/dist/common/logs/request.d.ts +1 -1
  21. package/dist/common/queue.js +24 -9
  22. package/dist/common/queue.js.map +1 -1
  23. package/dist/config.js +1 -7
  24. package/dist/config.js.map +1 -1
  25. package/dist/constants.js +118 -24
  26. package/dist/constants.js.map +1 -1
  27. package/dist/controls-options-manager/enums.js +2 -0
  28. package/dist/controls-options-manager/enums.js.map +1 -1
  29. package/dist/controls-options-manager/index.js +19 -14
  30. package/dist/controls-options-manager/index.js.map +1 -1
  31. package/dist/controls-options-manager/types.js.map +1 -1
  32. package/dist/controls-options-manager/util.js +80 -11
  33. package/dist/controls-options-manager/util.js.map +1 -1
  34. package/dist/index.js +62 -20
  35. package/dist/index.js.map +1 -1
  36. package/dist/interpretation/collection.js +23 -0
  37. package/dist/interpretation/collection.js.map +1 -0
  38. package/dist/interpretation/index.js +366 -0
  39. package/dist/interpretation/index.js.map +1 -0
  40. package/dist/interpretation/siLanguage.js +25 -0
  41. package/dist/interpretation/siLanguage.js.map +1 -0
  42. package/dist/locus-info/controlsUtils.js +71 -1
  43. package/dist/locus-info/controlsUtils.js.map +1 -1
  44. package/dist/locus-info/index.js +305 -57
  45. package/dist/locus-info/index.js.map +1 -1
  46. package/dist/locus-info/infoUtils.js +7 -1
  47. package/dist/locus-info/infoUtils.js.map +1 -1
  48. package/dist/locus-info/mediaSharesUtils.js +43 -1
  49. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  50. package/dist/locus-info/parser.js +219 -63
  51. package/dist/locus-info/parser.js.map +1 -1
  52. package/dist/locus-info/selfUtils.js +44 -22
  53. package/dist/locus-info/selfUtils.js.map +1 -1
  54. package/dist/media/index.js +57 -104
  55. package/dist/media/index.js.map +1 -1
  56. package/dist/media/properties.js +60 -121
  57. package/dist/media/properties.js.map +1 -1
  58. package/dist/meeting/in-meeting-actions.js +61 -3
  59. package/dist/meeting/in-meeting-actions.js.map +1 -1
  60. package/dist/meeting/index.js +2530 -2534
  61. package/dist/meeting/index.js.map +1 -1
  62. package/dist/meeting/locusMediaRequest.js +292 -0
  63. package/dist/meeting/locusMediaRequest.js.map +1 -0
  64. package/dist/meeting/muteState.js +125 -205
  65. package/dist/meeting/muteState.js.map +1 -1
  66. package/dist/meeting/request.js +150 -150
  67. package/dist/meeting/request.js.map +1 -1
  68. package/dist/meeting/util.js +568 -438
  69. package/dist/meeting/util.js.map +1 -1
  70. package/dist/meeting-info/index.js +48 -7
  71. package/dist/meeting-info/index.js.map +1 -1
  72. package/dist/meeting-info/meeting-info-v2.js +94 -38
  73. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  74. package/dist/meeting-info/utilv2.js +4 -2
  75. package/dist/meeting-info/utilv2.js.map +1 -1
  76. package/dist/meetings/index.d.ts +0 -2
  77. package/dist/meetings/index.js +260 -85
  78. package/dist/meetings/index.js.map +1 -1
  79. package/dist/meetings/meetings.types.js +7 -0
  80. package/dist/meetings/meetings.types.js.map +1 -0
  81. package/dist/meetings/util.js +42 -7
  82. package/dist/meetings/util.js.map +1 -1
  83. package/dist/member/index.d.ts +2 -0
  84. package/dist/member/index.js +26 -0
  85. package/dist/member/index.js.map +1 -1
  86. package/dist/member/member.types.d.ts +11 -0
  87. package/dist/member/member.types.js +18 -0
  88. package/dist/member/member.types.js.map +1 -0
  89. package/dist/member/types.js +11 -1
  90. package/dist/member/types.js.map +1 -1
  91. package/dist/member/util.js +60 -23
  92. package/dist/member/util.js.map +1 -1
  93. package/dist/members/index.js +4 -1
  94. package/dist/members/index.js.map +1 -1
  95. package/dist/members/request.js +75 -45
  96. package/dist/members/request.js.map +1 -1
  97. package/dist/members/util.js +308 -317
  98. package/dist/members/util.js.map +1 -1
  99. package/dist/metrics/config.js +1 -3
  100. package/dist/metrics/config.js.map +1 -1
  101. package/dist/metrics/constants.js +1 -0
  102. package/dist/metrics/constants.js.map +1 -1
  103. package/dist/metrics/index.d.ts +1 -1
  104. package/dist/metrics/index.js +1 -451
  105. package/dist/metrics/index.js.map +1 -1
  106. package/dist/multistream/mediaRequestManager.js +136 -40
  107. package/dist/multistream/mediaRequestManager.js.map +1 -1
  108. package/dist/multistream/receiveSlot.js.map +1 -1
  109. package/dist/multistream/receiveSlotManager.js +4 -4
  110. package/dist/multistream/receiveSlotManager.js.map +1 -1
  111. package/dist/multistream/remoteMedia.js.map +1 -1
  112. package/dist/multistream/remoteMediaGroup.js +60 -3
  113. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  114. package/dist/multistream/remoteMediaManager.js +36 -0
  115. package/dist/multistream/remoteMediaManager.js.map +1 -1
  116. package/dist/multistream/sendSlotManager.js +233 -0
  117. package/dist/multistream/sendSlotManager.js.map +1 -0
  118. package/dist/reachability/index.js +18 -3
  119. package/dist/reachability/index.js.map +1 -1
  120. package/dist/reachability/request.js +5 -3
  121. package/dist/reachability/request.js.map +1 -1
  122. package/dist/reconnection-manager/index.js +181 -153
  123. package/dist/reconnection-manager/index.js.map +1 -1
  124. package/dist/recording-controller/index.js +21 -2
  125. package/dist/recording-controller/index.js.map +1 -1
  126. package/dist/recording-controller/util.js +9 -8
  127. package/dist/recording-controller/util.js.map +1 -1
  128. package/dist/roap/index.js +25 -32
  129. package/dist/roap/index.js.map +1 -1
  130. package/dist/roap/request.js +42 -51
  131. package/dist/roap/request.js.map +1 -1
  132. package/dist/roap/turnDiscovery.js +97 -38
  133. package/dist/roap/turnDiscovery.js.map +1 -1
  134. package/dist/rtcMetrics/constants.js +12 -0
  135. package/dist/rtcMetrics/constants.js.map +1 -0
  136. package/dist/rtcMetrics/index.js +117 -0
  137. package/dist/rtcMetrics/index.js.map +1 -0
  138. package/dist/statsAnalyzer/index.js +0 -1
  139. package/dist/statsAnalyzer/index.js.map +1 -1
  140. package/dist/types/annotation/annotation.types.d.ts +43 -0
  141. package/dist/types/annotation/constants.d.ts +31 -0
  142. package/dist/types/annotation/index.d.ts +124 -0
  143. package/dist/types/breakouts/events.d.ts +2 -0
  144. package/dist/types/breakouts/utils.d.ts +7 -0
  145. package/dist/types/common/errors/webex-errors.d.ts +1 -1
  146. package/dist/types/config.d.ts +0 -6
  147. package/dist/types/constants.d.ts +51 -21
  148. package/dist/types/controls-options-manager/enums.d.ts +2 -0
  149. package/dist/types/controls-options-manager/index.d.ts +1 -1
  150. package/dist/types/controls-options-manager/types.d.ts +7 -1
  151. package/dist/types/index.d.ts +1 -1
  152. package/dist/types/interpretation/collection.d.ts +5 -0
  153. package/dist/types/interpretation/index.d.ts +5 -0
  154. package/dist/types/interpretation/siLanguage.d.ts +5 -0
  155. package/dist/types/locus-info/index.d.ts +39 -1
  156. package/dist/types/media/index.d.ts +2 -0
  157. package/dist/types/media/properties.d.ts +16 -38
  158. package/dist/types/meeting/in-meeting-actions.d.ts +46 -2
  159. package/dist/types/meeting/index.d.ts +179 -379
  160. package/dist/types/meeting/locusMediaRequest.d.ts +70 -0
  161. package/dist/types/meeting/muteState.d.ts +39 -40
  162. package/dist/types/meeting/request.d.ts +25 -26
  163. package/dist/types/meeting/util.d.ts +74 -1
  164. package/dist/types/meeting-info/meeting-info-v2.d.ts +14 -3
  165. package/dist/types/meetings/index.d.ts +49 -1
  166. package/dist/types/meetings/meetings.types.d.ts +4 -0
  167. package/dist/types/member/index.d.ts +2 -0
  168. package/dist/types/members/request.d.ts +56 -11
  169. package/dist/types/members/util.d.ts +209 -1
  170. package/dist/types/metrics/config.d.ts +26 -2
  171. package/dist/types/metrics/constants.d.ts +1 -0
  172. package/dist/types/metrics/index.d.ts +17 -0
  173. package/dist/types/multistream/mediaRequestManager.d.ts +27 -10
  174. package/dist/types/multistream/receiveSlot.d.ts +3 -3
  175. package/dist/types/multistream/remoteMedia.d.ts +2 -2
  176. package/dist/types/multistream/remoteMediaManager.d.ts +14 -0
  177. package/dist/types/roap/request.d.ts +6 -8
  178. package/dist/types/roap/turnDiscovery.d.ts +18 -1
  179. package/package.json +21 -20
  180. package/src/annotation/annotation.types.ts +50 -0
  181. package/src/annotation/constants.ts +36 -0
  182. package/src/annotation/index.ts +328 -0
  183. package/src/breakouts/README.md +3 -2
  184. package/src/breakouts/breakout.ts +62 -27
  185. package/src/breakouts/events.ts +56 -0
  186. package/src/breakouts/index.ts +244 -64
  187. package/src/breakouts/utils.ts +13 -0
  188. package/src/common/errors/webex-errors.ts +6 -2
  189. package/src/common/logs/logger-proxy.ts +1 -1
  190. package/src/common/queue.ts +22 -8
  191. package/src/config.ts +0 -6
  192. package/src/constants.ts +111 -19
  193. package/src/controls-options-manager/enums.ts +2 -0
  194. package/src/controls-options-manager/index.ts +13 -10
  195. package/src/controls-options-manager/types.ts +10 -0
  196. package/src/controls-options-manager/util.ts +82 -11
  197. package/src/index.ts +18 -11
  198. package/src/interpretation/README.md +60 -0
  199. package/src/interpretation/collection.ts +19 -0
  200. package/src/interpretation/index.ts +332 -0
  201. package/src/interpretation/siLanguage.ts +18 -0
  202. package/src/locus-info/controlsUtils.ts +81 -0
  203. package/src/locus-info/index.ts +318 -57
  204. package/src/locus-info/infoUtils.ts +10 -2
  205. package/src/locus-info/mediaSharesUtils.ts +48 -0
  206. package/src/locus-info/parser.ts +224 -39
  207. package/src/locus-info/selfUtils.ts +32 -20
  208. package/src/media/index.ts +94 -108
  209. package/src/media/properties.ts +69 -109
  210. package/src/meeting/in-meeting-actions.ts +120 -4
  211. package/src/meeting/index.ts +1967 -2120
  212. package/src/meeting/locusMediaRequest.ts +314 -0
  213. package/src/meeting/muteState.ts +119 -194
  214. package/src/meeting/request.ts +122 -115
  215. package/src/meeting/util.ts +549 -413
  216. package/src/meeting-info/index.ts +54 -8
  217. package/src/meeting-info/meeting-info-v2.ts +89 -24
  218. package/src/meeting-info/utilv2.ts +6 -2
  219. package/src/meetings/index.ts +247 -87
  220. package/src/meetings/meetings.types.ts +12 -0
  221. package/src/meetings/util.ts +47 -12
  222. package/src/member/index.ts +28 -1
  223. package/src/member/types.ts +14 -0
  224. package/src/member/util.ts +75 -26
  225. package/src/members/index.ts +7 -1
  226. package/src/members/request.ts +61 -21
  227. package/src/members/util.ts +316 -326
  228. package/src/metrics/constants.ts +1 -0
  229. package/src/metrics/index.ts +1 -474
  230. package/src/multistream/mediaRequestManager.ts +183 -67
  231. package/src/multistream/receiveSlot.ts +4 -4
  232. package/src/multistream/receiveSlotManager.ts +4 -4
  233. package/src/multistream/remoteMedia.ts +2 -2
  234. package/src/multistream/remoteMediaGroup.ts +59 -0
  235. package/src/multistream/remoteMediaManager.ts +33 -0
  236. package/src/multistream/sendSlotManager.ts +170 -0
  237. package/src/reachability/index.ts +15 -4
  238. package/src/reachability/request.ts +7 -3
  239. package/src/reconnection-manager/index.ts +36 -29
  240. package/src/recording-controller/index.ts +20 -3
  241. package/src/recording-controller/util.ts +26 -9
  242. package/src/roap/index.ts +25 -30
  243. package/src/roap/request.ts +44 -51
  244. package/src/roap/turnDiscovery.ts +51 -25
  245. package/src/rtcMetrics/constants.ts +3 -0
  246. package/src/rtcMetrics/index.ts +100 -0
  247. package/src/statsAnalyzer/index.ts +0 -1
  248. package/test/integration/spec/converged-space-meetings.js +60 -3
  249. package/test/integration/spec/journey.js +336 -259
  250. package/test/integration/spec/space-meeting.js +76 -3
  251. package/test/unit/spec/annotation/index.ts +418 -0
  252. package/test/unit/spec/breakouts/breakout.ts +85 -26
  253. package/test/unit/spec/breakouts/events.ts +89 -0
  254. package/test/unit/spec/breakouts/index.ts +636 -98
  255. package/test/unit/spec/breakouts/utils.js +19 -1
  256. package/test/unit/spec/common/queue.js +31 -2
  257. package/test/unit/spec/controls-options-manager/index.js +8 -1
  258. package/test/unit/spec/controls-options-manager/util.js +576 -397
  259. package/test/unit/spec/fixture/locus.js +1 -0
  260. package/test/unit/spec/interpretation/collection.ts +15 -0
  261. package/test/unit/spec/interpretation/index.ts +589 -0
  262. package/test/unit/spec/interpretation/siLanguage.ts +28 -0
  263. package/test/unit/spec/locus-info/controlsUtils.js +195 -1
  264. package/test/unit/spec/locus-info/index.js +950 -45
  265. package/test/unit/spec/locus-info/infoUtils.js +37 -15
  266. package/test/unit/spec/locus-info/mediaSharesUtils.ts +22 -0
  267. package/test/unit/spec/locus-info/parser.js +62 -22
  268. package/test/unit/spec/locus-info/selfConstant.js +19 -0
  269. package/test/unit/spec/locus-info/selfUtils.js +131 -26
  270. package/test/unit/spec/media/index.ts +82 -79
  271. package/test/unit/spec/meeting/in-meeting-actions.ts +60 -2
  272. package/test/unit/spec/meeting/index.js +3208 -1734
  273. package/test/unit/spec/meeting/locusMediaRequest.ts +443 -0
  274. package/test/unit/spec/meeting/muteState.js +328 -417
  275. package/test/unit/spec/meeting/request.js +393 -48
  276. package/test/unit/spec/meeting/utils.js +552 -76
  277. package/test/unit/spec/meeting-info/index.js +181 -0
  278. package/test/unit/spec/meeting-info/meetinginfov2.js +258 -20
  279. package/test/unit/spec/meeting-info/utilv2.js +21 -0
  280. package/test/unit/spec/meetings/index.js +631 -145
  281. package/test/unit/spec/meetings/utils.js +164 -9
  282. package/test/unit/spec/member/index.js +44 -14
  283. package/test/unit/spec/member/util.js +296 -155
  284. package/test/unit/spec/members/index.js +23 -3
  285. package/test/unit/spec/members/request.js +167 -35
  286. package/test/unit/spec/metrics/index.js +1 -50
  287. package/test/unit/spec/multistream/mediaRequestManager.ts +366 -8
  288. package/test/unit/spec/multistream/receiveSlot.ts +1 -1
  289. package/test/unit/spec/multistream/remoteMediaGroup.ts +266 -0
  290. package/test/unit/spec/multistream/remoteMediaManager.ts +123 -0
  291. package/test/unit/spec/multistream/sendSlotManager.ts +242 -0
  292. package/test/unit/spec/reachability/index.ts +66 -5
  293. package/test/unit/spec/reachability/request.js +3 -1
  294. package/test/unit/spec/reconnection-manager/index.js +55 -5
  295. package/test/unit/spec/recording-controller/index.js +294 -218
  296. package/test/unit/spec/recording-controller/util.js +223 -96
  297. package/test/unit/spec/roap/index.ts +21 -48
  298. package/test/unit/spec/roap/request.ts +74 -60
  299. package/test/unit/spec/roap/turnDiscovery.ts +30 -6
  300. package/test/unit/spec/rtcMetrics/index.ts +68 -0
  301. package/test/utils/integrationTestUtils.js +46 -0
  302. package/test/utils/testUtils.js +0 -60
  303. package/src/metrics/config.ts +0 -487
@@ -0,0 +1,181 @@
1
+ import {assert} from '@webex/test-helper-chai';
2
+ import sinon from 'sinon';
3
+ import MockWebex from '@webex/test-helper-mock-webex';
4
+ import {_MEETING_ID_} from '@webex/plugin-meetings/src/constants';
5
+
6
+ import MeetingInfo from '@webex/plugin-meetings/src/meeting-info/index';
7
+ import MeetingInfoUtil from '@webex/plugin-meetings/src/meeting-info/util';
8
+ import MeetingInfoRequest from '@webex/plugin-meetings/src/meeting-info/request';
9
+
10
+ const flushPromises = () => new Promise(setImmediate);
11
+
12
+ describe('plugin-meetings', () => {
13
+ let webex;
14
+ let meetingInfo = null;
15
+
16
+ afterEach(() => {
17
+ sinon.restore();
18
+ });
19
+
20
+ describe('Meeting Info V1', () => {
21
+ beforeEach(() => {
22
+ webex = new MockWebex({});
23
+
24
+ meetingInfo = new MeetingInfo(webex);
25
+ });
26
+
27
+ describe('#fetchMeetingInfo', () => {
28
+ it('should send ca events if meetingId present', async () => {
29
+ const body = {meetingKey: '1234323'};
30
+
31
+ sinon
32
+ .stub(MeetingInfoUtil, 'generateOptions')
33
+ .resolves({type: 'MEETING_ID', destination: '123456'});
34
+ sinon.stub(MeetingInfoRequest.prototype, 'fetchMeetingInfo').returns(Promise.resolve(body));
35
+
36
+ await meetingInfo.fetchMeetingInfo('1234323', _MEETING_ID_, null, null, null, null, null, {
37
+ meetingId: 'meetingId',
38
+ });
39
+
40
+ const submitInternalEventCalls = webex.internal.newMetrics.submitInternalEvent.getCalls();
41
+
42
+ assert.deepEqual(submitInternalEventCalls[0].args[0], {
43
+ name: 'internal.client.meetinginfo.request',
44
+ });
45
+ assert.deepEqual(submitInternalEventCalls[1].args[0], {
46
+ name: 'internal.client.meetinginfo.response',
47
+ });
48
+ });
49
+
50
+ it('should not send ca events if meetingId not present', async () => {
51
+ const body = {meetingKey: '1234323'};
52
+
53
+ sinon
54
+ .stub(MeetingInfoUtil, 'generateOptions')
55
+ .resolves({type: 'MEETING_ID', destination: '123456'});
56
+ sinon.stub(MeetingInfoRequest.prototype, 'fetchMeetingInfo').returns(Promise.resolve(body));
57
+
58
+ await meetingInfo.fetchMeetingInfo('1234323', _MEETING_ID_, null, null, null, null, null);
59
+
60
+ assert.notCalled(webex.internal.newMetrics.submitInternalEvent);
61
+ });
62
+
63
+ it('should send ca events when fails and if meetingId present', async () => {
64
+ const reject = {
65
+ statusCode: 403,
66
+ body: {message: 'msg', code: 403102, data: {meetingInfo: {}}},
67
+ url: 'http://api-url.com',
68
+ };
69
+
70
+ sinon
71
+ .stub(MeetingInfoUtil, 'generateOptions')
72
+ .returns(Promise.resolve({type: 'MEETING_ID', destination: '123456'}));
73
+ sinon
74
+ .stub(MeetingInfoRequest.prototype, 'fetchMeetingInfo')
75
+ .returns(Promise.reject(reject));
76
+
77
+ try {
78
+ await meetingInfo.fetchMeetingInfo(
79
+ '1234323',
80
+ _MEETING_ID_,
81
+ null,
82
+ null,
83
+ null,
84
+ null,
85
+ null,
86
+ {
87
+ meetingId: 'meetingId',
88
+ }
89
+ );
90
+ } catch (err) {
91
+ const submitInternalEventCalls = webex.internal.newMetrics.submitInternalEvent.getCalls();
92
+
93
+ assert.deepEqual(submitInternalEventCalls[0].args[0], {
94
+ name: 'internal.client.meetinginfo.request',
95
+ });
96
+
97
+ assert.calledWith(webex.internal.newMetrics.submitClientEvent, {
98
+ name: 'client.meetinginfo.response',
99
+ payload: {
100
+ identifiers: {
101
+ meetingLookupUrl: 'http://api-url.com',
102
+ },
103
+ },
104
+ options: {
105
+ meetingId: 'meetingId',
106
+ rawError: err,
107
+ },
108
+ });
109
+ }
110
+ });
111
+
112
+ it('should send ca events when in the retry as well if meetingId present', async () => {
113
+ const reject = {
114
+ statusCode: 403,
115
+ body: {message: 'msg', code: 403102, data: {meetingInfo: {}}},
116
+ url: 'http://api-url.com',
117
+ };
118
+
119
+ sinon
120
+ .stub(MeetingInfoUtil, 'generateOptions')
121
+ .resolves({type: 'MEETING_LINK', destination: '123456'});
122
+ const requestStub = sinon
123
+ .stub(MeetingInfoRequest.prototype, 'fetchMeetingInfo')
124
+ .rejects(reject);
125
+
126
+ try {
127
+ await meetingInfo.fetchMeetingInfo(
128
+ '1234323',
129
+ _MEETING_ID_,
130
+ null,
131
+ null,
132
+ null,
133
+ null,
134
+ null,
135
+ {
136
+ meetingId: 'meetingId',
137
+ }
138
+ );
139
+ assert.fail('fetchMeetingInfo should have thrown, but has not done that');
140
+ } catch (err) {
141
+ let submitInternalEventCalls = webex.internal.newMetrics.submitInternalEvent.getCalls();
142
+
143
+ assert.deepEqual(submitInternalEventCalls[0].args[0], {
144
+ name: 'internal.client.meetinginfo.request',
145
+ });
146
+
147
+ assert.calledWith(webex.internal.newMetrics.submitClientEvent, {
148
+ name: 'client.meetinginfo.response',
149
+ payload: {
150
+ identifiers: {
151
+ meetingLookupUrl: 'http://api-url.com',
152
+ },
153
+ },
154
+ options: {
155
+ meetingId: 'meetingId',
156
+ rawError: err,
157
+ },
158
+ });
159
+
160
+ assert.deepEqual(submitInternalEventCalls[1].args[0], {
161
+ name: 'internal.client.meetinginfo.response',
162
+ });
163
+
164
+ assert.deepEqual(submitInternalEventCalls[2].args[0], {
165
+ name: 'internal.client.meetinginfo.request',
166
+ });
167
+
168
+ requestStub.resolves({});
169
+
170
+ await flushPromises();
171
+
172
+ submitInternalEventCalls = webex.internal.newMetrics.submitInternalEvent.getCalls();
173
+
174
+ assert.deepEqual(submitInternalEventCalls[3].args[0], {
175
+ name: 'internal.client.meetinginfo.response',
176
+ });
177
+ }
178
+ });
179
+ });
180
+ });
181
+ });
@@ -26,7 +26,7 @@ import MeetingInfo, {
26
26
  import MeetingInfoUtil from '@webex/plugin-meetings/src/meeting-info/utilv2';
27
27
  import Metrics from '@webex/plugin-meetings/src/metrics';
28
28
  import BEHAVIORAL_METRICS from '@webex/plugin-meetings/src/metrics/constants';
29
- import { forEach } from 'lodash';
29
+ import {forEach} from 'lodash';
30
30
 
31
31
  describe('plugin-meetings', () => {
32
32
  const conversation = {
@@ -268,6 +268,33 @@ describe('plugin-meetings', () => {
268
268
  );
269
269
  });
270
270
 
271
+ it('should fetch meeting info with provided extraParams', async () => {
272
+ const requestResponse = {statusCode: 200, body: {meetingKey: '1234323'}};
273
+ const extraParams = {mtid: 'm9fe0afd8c435e892afcce9ea25b97046', joinTXId: 'TSmrX61wNF'}
274
+
275
+ webex.request.resolves(requestResponse);
276
+
277
+ const result = await meetingInfo.fetchMeetingInfo('1234323', _MEETING_ID_, null, null, null, null, extraParams);
278
+
279
+ assert.calledWith(webex.request, {
280
+ method: 'POST',
281
+ service: WBXAPPAPI_SERVICE,
282
+ resource: 'meetingInfo',
283
+ body: {
284
+ supportHostKey: true,
285
+ supportCountryList: true,
286
+ meetingKey: '1234323',
287
+ ...extraParams,
288
+ },
289
+ });
290
+ assert.deepEqual(result, requestResponse);
291
+ assert(Metrics.sendBehavioralMetric.calledOnce);
292
+ assert.calledWith(
293
+ Metrics.sendBehavioralMetric,
294
+ BEHAVIORAL_METRICS.FETCH_MEETING_INFO_V1_SUCCESS
295
+ );
296
+ });
297
+
271
298
  it('create adhoc meeting when conversationUrl passed with enableAdhocMeetings toggle', async () => {
272
299
  sinon.stub(meetingInfo, 'createAdhocSpaceMeeting').returns(Promise.resolve());
273
300
  await meetingInfo.fetchMeetingInfo('conversationUrl', _CONVERSATION_URL_);
@@ -277,6 +304,29 @@ describe('plugin-meetings', () => {
277
304
  meetingInfo.createAdhocSpaceMeeting.restore();
278
305
  });
279
306
 
307
+ it('create adhoc meeting when conversationUrl and installedOrgID passed with enableAdhocMeetings toggle', async () => {
308
+ sinon.stub(meetingInfo, 'createAdhocSpaceMeeting').returns(Promise.resolve());
309
+
310
+ const installedOrgID = '12345'
311
+
312
+ await meetingInfo.fetchMeetingInfo(
313
+ 'conversationUrl',
314
+ _CONVERSATION_URL_,
315
+ null,
316
+ null,
317
+ installedOrgID
318
+ );
319
+
320
+ assert.calledOnceWithExactly(
321
+ meetingInfo.createAdhocSpaceMeeting,
322
+ 'conversationUrl',
323
+ installedOrgID
324
+ );
325
+ assert.notCalled(webex.request);
326
+ meetingInfo.createAdhocSpaceMeeting.restore();
327
+ });
328
+
329
+
280
330
  it('should not call createAdhocSpaceMeeting if enableAdhocMeetings toggle is off', async () => {
281
331
  webex.config.meetings.experimental.enableAdhocMeetings = false;
282
332
  sinon.stub(meetingInfo, 'createAdhocSpaceMeeting').returns(Promise.resolve());
@@ -302,7 +352,7 @@ describe('plugin-meetings', () => {
302
352
  it('should throw an error MeetingInfoV2AdhocMeetingError if not able to start adhoc meeting for a conversation', async () => {
303
353
  webex.config.meetings.experimental.enableAdhocMeetings = true;
304
354
 
305
- webex.request = sinon.stub().rejects({statusCode: 403, body: {code: 400000}});
355
+ webex.request = sinon.stub().rejects({stack: 'a stack', message: 'a message', statusCode: 403, body: {code: 400000}});
306
356
  try {
307
357
  await meetingInfo.createAdhocSpaceMeeting('conversationUrl');
308
358
  } catch (err) {
@@ -312,6 +362,12 @@ describe('plugin-meetings', () => {
312
362
  'Failed starting the adhoc meeting, Please contact support team , code=400000'
313
363
  );
314
364
  assert.equal(err.wbxAppApiCode, 400000);
365
+ assert(Metrics.sendBehavioralMetric.calledOnce);
366
+ assert.calledWith(
367
+ Metrics.sendBehavioralMetric,
368
+ BEHAVIORAL_METRICS.ADHOC_MEETING_FAILURE,
369
+ {reason: 'a message', stack: 'a stack'}
370
+ );
315
371
  }
316
372
  });
317
373
 
@@ -329,24 +385,54 @@ describe('plugin-meetings', () => {
329
385
  const message = 'a message';
330
386
  const meetingInfoData = 'meeting info';
331
387
 
332
- webex.request = sinon
333
- .stub()
334
- .rejects({
335
- statusCode: 403,
336
- body: {message, code: errorCode, data: {meetingInfo: meetingInfoData}},
337
- });
388
+ webex.request = sinon.stub().rejects({
389
+ statusCode: 403,
390
+ body: {message, code: errorCode, data: {meetingInfo: meetingInfoData}},
391
+ url: 'http://api-url.com',
392
+ });
338
393
  try {
339
- await meetingInfo.fetchMeetingInfo('1234323', _MEETING_ID_, 'abc', {
340
- id: '999',
341
- code: 'aabbcc11',
342
- });
394
+ await meetingInfo.fetchMeetingInfo(
395
+ '1234323',
396
+ _MEETING_ID_,
397
+ 'abc',
398
+ {
399
+ id: '999',
400
+ code: 'aabbcc11',
401
+ },
402
+ null,
403
+ null,
404
+ {},
405
+ {meetingId: 'meeting-id'}
406
+ );
343
407
  assert.fail('fetchMeetingInfo should have thrown, but has not done that');
344
408
  } catch (err) {
409
+ assert(webex.internal.newMetrics.submitClientEvent.calledOnce);
410
+ const submitInternalEventCalls = webex.internal.newMetrics.submitInternalEvent.getCalls();
411
+ assert.deepEqual(submitInternalEventCalls[0].args[0], {
412
+ name: 'internal.client.meetinginfo.request',
413
+ });
414
+ assert.deepEqual(submitInternalEventCalls[1].args[0], {
415
+ name: 'internal.client.meetinginfo.response',
416
+ });
417
+ assert.calledWith(webex.internal.newMetrics.submitClientEvent, {
418
+ name: 'client.meetinginfo.response',
419
+ payload: {
420
+ identifiers: {
421
+ meetingLookupUrl: 'http://api-url.com',
422
+ },
423
+ },
424
+ options: {
425
+ meetingId: 'meeting-id',
426
+ rawError: {
427
+ statusCode: 403,
428
+ body: {message, code: errorCode, data: {meetingInfo: meetingInfoData}},
429
+ url: 'http://api-url.com',
430
+ },
431
+ },
432
+ });
433
+
345
434
  assert.instanceOf(err, MeetingInfoV2PolicyError);
346
- assert.deepEqual(
347
- err.message,
348
- `${message}, code=${errorCode}`
349
- );
435
+ assert.deepEqual(err.message, `${message}, code=${errorCode}`);
350
436
  assert.equal(err.wbxAppApiCode, errorCode);
351
437
  assert.deepEqual(err.meetingInfo, meetingInfoData);
352
438
  assert(Metrics.sendBehavioralMetric.calledOnce);
@@ -354,12 +440,85 @@ describe('plugin-meetings', () => {
354
440
  Metrics.sendBehavioralMetric,
355
441
  BEHAVIORAL_METRICS.MEETING_INFO_POLICY_ERROR,
356
442
  {code: errorCode}
357
- );
443
+ );
358
444
  }
359
445
  });
360
446
  }
361
447
  );
362
448
 
449
+ it('should send internal CA metric if meetingId is provided', async () => {
450
+ const requestResponse = {statusCode: 200, body: {meetingKey: '1234323'}};
451
+ const extraParams = {mtid: 'm9fe0afd8c435e892afcce9ea25b97046', joinTXId: 'TSmrX61wNF'}
452
+
453
+ webex.request.resolves(requestResponse);
454
+
455
+ const result = await meetingInfo.fetchMeetingInfo(
456
+ '1234323',
457
+ _MEETING_ID_,
458
+ null,
459
+ null,
460
+ null,
461
+ null,
462
+ extraParams,
463
+ {meetingId: 'meetingId'}
464
+ );
465
+
466
+ assert.calledWith(webex.request, {
467
+ method: 'POST',
468
+ service: WBXAPPAPI_SERVICE,
469
+ resource: 'meetingInfo',
470
+ body: {
471
+ supportHostKey: true,
472
+ supportCountryList: true,
473
+ meetingKey: '1234323',
474
+ ...extraParams,
475
+ },
476
+ });
477
+ assert.deepEqual(result, requestResponse);
478
+ assert(Metrics.sendBehavioralMetric.calledOnce);
479
+ assert.calledWith(
480
+ Metrics.sendBehavioralMetric,
481
+ BEHAVIORAL_METRICS.FETCH_MEETING_INFO_V1_SUCCESS
482
+ );
483
+
484
+ const submitInternalEventCalls = webex.internal.newMetrics.submitInternalEvent.getCalls();
485
+ assert.deepEqual(submitInternalEventCalls[0].args[0], {
486
+ name: 'internal.client.meetinginfo.request',
487
+ });
488
+ assert.deepEqual(submitInternalEventCalls[1].args[0], {
489
+ name: 'internal.client.meetinginfo.response',
490
+ });
491
+ });
492
+
493
+ it('should not send CA metric if meetingId is not provided', async () => {
494
+ const message = 'a message';
495
+ const meetingInfoData = 'meeting info';
496
+
497
+ webex.request = sinon.stub().rejects({
498
+ statusCode: 403,
499
+ body: {message, code: 403102, data: {meetingInfo: meetingInfoData}},
500
+ url: 'http://api-url.com',
501
+ });
502
+ try {
503
+ await meetingInfo.fetchMeetingInfo(
504
+ '1234323',
505
+ _MEETING_ID_,
506
+ 'abc',
507
+ {
508
+ id: '999',
509
+ code: 'aabbcc11',
510
+ },
511
+ null,
512
+ null,
513
+ undefined
514
+ );
515
+ assert.fail('fetchMeetingInfo should have thrown, but has not done that');
516
+ } catch (err) {
517
+ assert.notCalled(webex.internal.newMetrics.submitClientEvent);
518
+ assert.notCalled(webex.internal.newMetrics.submitInternalEvent);
519
+ }
520
+ });
521
+
363
522
  it('should throw MeetingInfoV2PasswordError for 403 response', async () => {
364
523
  const FAKE_MEETING_INFO = {blablabla: 'some_fake_meeting_info'};
365
524
 
@@ -471,8 +630,10 @@ describe('plugin-meetings', () => {
471
630
  });
472
631
 
473
632
  describe('createAdhocSpaceMeeting', () => {
474
- it('Make a request to /instantSpace when conversationUrl', async () => {
475
- const conversationUrl = 'https://conversationUrl/xxx';
633
+ const conversationUrl = 'https://conversationUrl/xxx';
634
+ const installedOrgID = '12345';
635
+
636
+ const setup = () => {
476
637
  const invitee = [];
477
638
 
478
639
  invitee.push({
@@ -485,7 +646,13 @@ describe('plugin-meetings', () => {
485
646
  ciUserUuid: conversation.participants.items[1].entryUUID,
486
647
  });
487
648
 
488
- await meetingInfo.createAdhocSpaceMeeting(conversationUrl);
649
+ return {invitee}
650
+ }
651
+
652
+ it('Make a request to /spaceInstant when conversationUrl', async () => {
653
+ const {invitee} = setup();
654
+
655
+ const result = await meetingInfo.createAdhocSpaceMeeting(conversationUrl);
489
656
 
490
657
  assert.calledWith(
491
658
  webex.internal.conversation.get,
@@ -506,7 +673,78 @@ describe('plugin-meetings', () => {
506
673
  });
507
674
  assert(Metrics.sendBehavioralMetric.calledOnce);
508
675
  assert.calledWith(Metrics.sendBehavioralMetric, BEHAVIORAL_METRICS.ADHOC_MEETING_SUCCESS);
676
+ assert.deepEqual(result, {
677
+ body: {},
678
+ statusCode: 200
679
+ });
509
680
  });
681
+
682
+ it('Make a request to /spaceInstant when conversationUrl with installed org ID', async () => {
683
+ const {invitee} = setup();
684
+
685
+ await meetingInfo.createAdhocSpaceMeeting(conversationUrl, installedOrgID);
686
+
687
+ assert.calledWith(
688
+ webex.internal.conversation.get,
689
+ {url: conversationUrl},
690
+ {includeParticipants: true, disableTransform: true}
691
+ );
692
+
693
+ assert.calledWith(webex.request, {
694
+ method: 'POST',
695
+ uri: 'https://go.webex.com/wbxappapi/v2/meetings/spaceInstant',
696
+ body: {
697
+ title: conversation.displayName,
698
+ spaceUrl: conversation.url,
699
+ keyUrl: conversation.encryptionKeyUrl,
700
+ kroUrl: conversation.kmsResourceObjectUrl,
701
+ invitees: invitee,
702
+ installedOrgID,
703
+ },
704
+ });
705
+ assert(Metrics.sendBehavioralMetric.calledOnce);
706
+ assert.calledWith(Metrics.sendBehavioralMetric, BEHAVIORAL_METRICS.ADHOC_MEETING_SUCCESS);
707
+ });
708
+
709
+
710
+ forEach(
711
+ [
712
+ {errorCode: 403049},
713
+ {errorCode: 403104},
714
+ {errorCode: 403103},
715
+ {errorCode: 403048},
716
+ {errorCode: 403102},
717
+ {errorCode: 403101},
718
+ ],
719
+ ({errorCode}) => {
720
+ it(`should throw a MeetingInfoV2PolicyError for error code ${errorCode}`, async () => {
721
+ const message = 'a message';
722
+ const meetingInfoData = 'meeting info';
723
+
724
+ webex.request = sinon.stub().rejects({
725
+ statusCode: 403,
726
+ body: {message, code: errorCode, data: {meetingInfo: meetingInfoData}},
727
+ });
728
+ try {
729
+ await meetingInfo.createAdhocSpaceMeeting(conversationUrl, installedOrgID);
730
+ assert.fail('createAdhocSpaceMeeting should have thrown, but has not done that');
731
+ } catch (err) {
732
+ assert.instanceOf(err, MeetingInfoV2PolicyError);
733
+ assert.deepEqual(err.message, `${message}, code=${errorCode}`);
734
+ assert.equal(err.wbxAppApiCode, errorCode);
735
+ assert.deepEqual(err.meetingInfo, meetingInfoData);
736
+
737
+ assert(Metrics.sendBehavioralMetric.calledOnce);
738
+ assert.calledWith(
739
+ Metrics.sendBehavioralMetric,
740
+ BEHAVIORAL_METRICS.MEETING_INFO_POLICY_ERROR,
741
+ {code: errorCode}
742
+ );
743
+
744
+ }
745
+ });
746
+ }
747
+ );
510
748
  });
511
749
  });
512
750
  });
@@ -150,6 +150,7 @@ describe('plugin-meetings', () => {
150
150
  });
151
151
 
152
152
  describe('#getRequestBody', () => {
153
+
153
154
  it('for _PERSONAL_ROOM_', () => {
154
155
  const res = MeetingInfoUtil.getRequestBody({
155
156
  type: _PERSONAL_ROOM_,
@@ -219,6 +220,26 @@ describe('plugin-meetings', () => {
219
220
  'https://conv-a.wbx2.com/conversation/api/v1/conversations/bfb49280'
220
221
  );
221
222
  });
223
+
224
+ it('allows for extra params to be provided', () => {
225
+ const extraParams = {mtid: 'm9fe0afd8c435e892afcce9ea25b97046', joinTXId: 'TSmrX61wNF'}
226
+
227
+ const res = MeetingInfoUtil.getRequestBody({
228
+ type: _CONVERSATION_URL_,
229
+ destination: 'https://conv-a.wbx2.com/conversation/api/v1/conversations/bfb49281',
230
+ extraParams,
231
+ });
232
+
233
+ assert.deepEqual(
234
+ res,
235
+ {
236
+ conversationUrl: 'https://conv-a.wbx2.com/conversation/api/v1/conversations/bfb49281',
237
+ supportHostKey: true,
238
+ supportCountryList: true,
239
+ ...extraParams,
240
+ }
241
+ );
242
+ });
222
243
  });
223
244
 
224
245
  describe('#getWebexSite', () => {