@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
@@ -1,117 +0,0 @@
1
- import { parse } from '@webex/ts-sdp';
2
-
3
- interface IPeerConnectionUtils {
4
- convertCLineToIpv4: (sdp: string) => string;
5
- adjustH264Profile: (sdp: string, maxFsValue: number) => string;
6
- }
7
-
8
- const PeerConnectionUtils = {} as IPeerConnectionUtils;
9
-
10
- // max-fs values for all H264 profile levels
11
- const maxFsForProfileLevel = {
12
- 10: 99,
13
- 11: 396,
14
- 12: 396,
15
- 13: 396,
16
- 20: 396,
17
- 21: 792,
18
- 22: 1620,
19
- 30: 1620,
20
- 31: 3600,
21
- 32: 5120,
22
- 40: 8192,
23
- 41: 8192,
24
- 42: 8704,
25
- 50: 22080,
26
- 51: 36864,
27
- 52: 36864,
28
- 60: 139264,
29
- 61: 139264,
30
- 62: 139264,
31
- };
32
-
33
- const framesPerSecond = 30;
34
-
35
- /**
36
- * Convert C line to IPv4
37
- * @param {string} sdp
38
- * @returns {string}
39
- */
40
- PeerConnectionUtils.convertCLineToIpv4 = (sdp: string) => {
41
- let replaceSdp = sdp;
42
-
43
- // TODO: remove this once linus supports Ipv6 c line.currently linus rejects SDP with c line having ipv6 candidates we are
44
- // mocking ipv6 to ipv4 candidates
45
- // https://jira-eng-gpk2.cisco.com/jira/browse/SPARK-299232
46
- replaceSdp = replaceSdp.replace(/c=IN IP6 .*/gi, 'c=IN IP4 0.0.0.0');
47
-
48
- return replaceSdp;
49
- };
50
-
51
- /**
52
- * estimate profile levels for max-fs & max-mbps values
53
- * @param {string} sdp
54
- * @param {number} maxFsValue
55
- * @returns {string}
56
- */
57
- PeerConnectionUtils.adjustH264Profile = (sdp: string, maxFsValue: number) => {
58
- // converting with ts-sdp parser, no munging
59
- const parsedSdp = parse(sdp);
60
-
61
- parsedSdp.avMedia.forEach((media) => {
62
- if (media.type === 'video') {
63
- media.codecs.forEach((codec) => {
64
- if (codec.name?.toUpperCase() === 'H264') {
65
- // there should really be just 1 fmtp line, but just in case, we process all of them
66
- codec.fmtParams = codec.fmtParams.map((fmtp) => {
67
- const parsedRegex = fmtp.match(/(.*)profile-level-id=(\w{4})(\w{2})(.*)/);
68
-
69
- if (parsedRegex && parsedRegex.length === 5) {
70
- const stuffBeforeProfileLevelId = parsedRegex[1];
71
- const profile = parsedRegex[2].toLowerCase();
72
- const levelId = parseInt(parsedRegex[3], 16);
73
- const stuffAfterProfileLevelId = parsedRegex[4];
74
-
75
- if (!maxFsForProfileLevel[levelId]) {
76
- throw new Error(
77
- `found unsupported h264 profile level id value in the SDP: ${levelId}`
78
- );
79
- }
80
-
81
- if (maxFsForProfileLevel[levelId] === maxFsValue) {
82
- // profile level already matches our desired max-fs value, so we don't need to do anything
83
- return fmtp;
84
- }
85
- if (maxFsForProfileLevel[levelId] < maxFsValue) {
86
- // profile level has too low max-fs, so we need to override it (this is upgrading)
87
- return `${fmtp};max-fs=${maxFsValue};max-mbps=${maxFsValue * framesPerSecond}`;
88
- }
89
-
90
- // profile level has too high max-fs value, so we need to use a lower level
91
-
92
- // find highest level that has the matching maxFs
93
- const newLevelId = Object.keys(maxFsForProfileLevel)
94
- .reverse()
95
- .find((key) => maxFsForProfileLevel[key] === maxFsValue);
96
-
97
- if (newLevelId) {
98
- // Object.keys returns keys as strings, so we need to parse it to an int again and then convert to hex
99
- const newLevelIdHex = parseInt(newLevelId, 10).toString(16);
100
-
101
- return `${stuffBeforeProfileLevelId}profile-level-id=${profile}${newLevelIdHex};max-mbps=${maxFsValue * framesPerSecond}${stuffAfterProfileLevelId}`;
102
- }
103
-
104
- throw new Error(`unsupported maxFsValue: ${maxFsValue}`);
105
- }
106
-
107
- return fmtp;
108
- });
109
- }
110
- });
111
- }
112
- });
113
-
114
- return parsedSdp.toString();
115
- };
116
-
117
- export default PeerConnectionUtils;
@@ -1,63 +0,0 @@
1
- import RoapStateMachine from '../roap/state';
2
-
3
- /* eslint-disable */
4
- const RoapCollection = {
5
- sessions: {},
6
-
7
- getSession(id) {
8
- if (!this.sessions[id]) {
9
- this.sessions[id] = {
10
- activeSequences: 0,
11
- };
12
- }
13
- return this.sessions[id];
14
- },
15
-
16
- deleteSession(id) {
17
- if (this.getSession(id)) {
18
- delete this.sessions[id];
19
- }
20
- },
21
-
22
- getSessionSequence(id, seqId) {
23
- const session = this.getSession(id);
24
- if (!session[seqId]) {
25
- session[seqId] = {
26
- state: RoapStateMachine.createState(),
27
- finished: false,
28
- };
29
- session.activeSequences += 1;
30
-
31
- }
32
- return session[seqId];
33
- },
34
-
35
- deleteSessionSequence(id, seqId) {
36
- const seq = this.getSessionSequence(id, seqId);
37
- if (seq) {
38
- if (!seq.finished) {
39
- session.activeSequences -= 1;
40
- }
41
- delete this.sessions[id][seqId];
42
- }
43
- },
44
-
45
- isBusy(id) {
46
- const session = this.getSession(id);
47
- if (!session) return false;
48
-
49
- return session.activeSequences > 0;
50
- },
51
-
52
- onSessionSequenceFinish(id, seqId) {
53
- const session = this.getSession(id);
54
- const seq = session[seqId];
55
- if (seq && !seq.finished) {
56
- seq.finished = true;
57
- session.activeSequences -= 1;
58
- }
59
- }
60
-
61
- };
62
-
63
- export default RoapCollection;
@@ -1,252 +0,0 @@
1
- /* no-param-reassign */
2
- import {StatelessWebexPlugin} from '@webex/webex-core';
3
-
4
- import LoggerProxy from '../common/logs/logger-proxy';
5
- import {ROAP, _OFFER_} from '../constants';
6
- import Metrics from '../metrics';
7
- import BEHAVIORAL_METRICS from '../metrics/constants';
8
-
9
- import RoapUtil from './util';
10
- import RoapCollection from './collection';
11
-
12
-
13
- const checkForAndHandleErrors = (action, meeting, correlationId) => {
14
- if (action && action.type) {
15
- if (action.msg && action.msg.messageType && action.msg.errorType) {
16
- if (RoapUtil.findError(action.msg.messageType, action.msg.errorType, action.type)) {
17
- RoapUtil.handleError(meeting.mediaProperties.peerConnection)
18
- .then((res) => {
19
- if (res) {
20
- RoapCollection.deleteSessionSequence(correlationId, action.msg.seq);
21
- }
22
- })
23
- .catch((err) => {
24
- LoggerProxy.logger.warn(`Roap:handler#checkForAndHandleErrors --> Cannot reset the peer connection with error: ${err}`);
25
- });
26
-
27
- return true;
28
- }
29
- }
30
- if (!RoapUtil.ensureMeeting(meeting, action.type)) {
31
- return true;
32
- }
33
- }
34
-
35
- return false;
36
- };
37
-
38
- const compareWithLastRoapMessage = (lastRoapMessage, currentRoapMessage) => lastRoapMessage?.msg?.seq === currentRoapMessage.msg.seq && lastRoapMessage?.msg?.messageType === currentRoapMessage.msg.messageType;
39
-
40
- const handleSessionStep = ({
41
- roap, session, locusUrl, correlationId
42
- }) => {
43
- const {seq: sequenceId, messageType} = roap.msg;
44
-
45
- if (session.OFFER && messageType === _OFFER_) {
46
- session.GLARE_OFFER = roap.msg;
47
- session.GLARE_OFFER.remote = !!roap.remote;
48
- const metricName = BEHAVIORAL_METRICS.ROAP_GLARE_CONDITION;
49
- const data = {
50
- correlation_id: correlationId,
51
- locus_id: locusUrl.split('/').pop(),
52
- sequence: sequenceId
53
- };
54
-
55
- Metrics.sendBehavioralMetric(metricName, data);
56
-
57
- LoggerProxy.logger.warn(`Roap:handler#handleSessionStep --> Glare condition occurred with new mercury event, sequenceId: ${sequenceId}`);
58
- }
59
- else {
60
- LoggerProxy.logger.info(`Roap:handler#handleSessionStep --> Save OFFER/ANSWER seq:${sequenceId} new mercury event ${messageType}local state: ${JSON.stringify(session.state.state, null, 2)}`);
61
- session[messageType] = roap.msg;
62
- session[messageType].remote = !!roap.remote;
63
- }
64
- };
65
-
66
- /**
67
- * @class RoapHandler
68
- */
69
- export default class RoapHandler extends StatelessWebexPlugin {
70
- constructor(attrs, options, roapOk, roapAnswer, roapFinished) {
71
- super({}, options);
72
- this.attrs = attrs;
73
- this.options = options;
74
- this.roapOk = roapOk;
75
- this.roapFinished = roapFinished;
76
- this.roapAnswer = roapAnswer;
77
- this.lastRoapMessage = null;
78
- }
79
-
80
- /**
81
- *
82
- * @param {Object} session
83
- * @param {Meeting} meeting
84
- * @param {Object} action
85
- * @returns {null}
86
- */
87
- perform(session, meeting, action) {
88
- switch (session.state.state) {
89
- case ROAP.ROAP_STATE.INIT:
90
- this.roapFinished(meeting.correlationId, action.msg.seq);
91
- break;
92
-
93
- // TODO: (important )handle roap state for sending offers as well
94
- // case ROAP.ROAP_STATE.WAIT_RX_OFFER:
95
- // case ROAP.ROAP_STATE.WAIT_RX_ANSWER:
96
- // case ROAP.ROAP_STATE.WAIT_RX_OK:
97
- case ROAP.ROAP_STATE.WAIT_TX_ANSWER:
98
- // eslint-disable-next-line no-warning-comments
99
- // TODO: sometime the you get an answer while you are creating an offer so SKIP
100
- // Server will send the mercury event comes back
101
- if (RoapUtil.shouldHandleMedia(meeting)) {
102
- RoapUtil.updatePeerConnection(meeting, session)
103
- .then((answerSdps) => {
104
- this.roapAnswer({
105
- mediaId: meeting.mediaId,
106
- sdps: answerSdps,
107
- seq: session.OFFER.seq,
108
- correlationId: meeting.correlationId,
109
- audioMuted: meeting.isAudioMuted(),
110
- videoMuted: meeting.isVideoMuted()
111
- });
112
- })
113
- .catch((error) => {
114
- const metricName = BEHAVIORAL_METRICS.ROAP_ANSWER_FAILURE;
115
- const data = {
116
- correlation_id: meeting.correlationId,
117
- locus_id: meeting.locusUrl.split('/').pop(),
118
- reason: error.message,
119
- stack: error.stack
120
- };
121
- const metadata = {
122
- type: error.name
123
- };
124
-
125
- Metrics.sendBehavioralMetric(metricName, data, metadata);
126
- LoggerProxy.logger.error(`Roap:handler#perform --> Error occured during wait receive answer, continuing, ${error}`);
127
- });
128
- }
129
- break;
130
- case ROAP.ROAP_STATE.WAIT_TX_OK:
131
- if (!RoapUtil.shouldHandleMedia(meeting)) {
132
- RoapUtil.setRemoteDescription(meeting, session).then((res) => {
133
- this.roapOk(res);
134
- });
135
- }
136
- break;
137
- // case ROAP.ROAP_STATE.IDLE_LOCAL_OFFER:
138
- case ROAP.ROAP_STATE.ERROR:
139
- LoggerProxy.logger.error(`Roap:handler#perform --> Roap State ERROR for session: ${session}`);
140
- break;
141
- case ROAP.ROAP_STATE.GLARE:
142
- session.GLARE_OFFER.tieBreaker = session.GLARE_OFFER.tieBreaker || 0;
143
- session.OFFER.tieBreaker = session.OFFER.tieBreaker || 0;
144
- LoggerProxy.logger.warn('Roap:handler#perform --> Roap State resolved the GLARE condition.');
145
- if (session.GLARE_OFFER.tieBreaker < session.OFFER.tieBreaker) {
146
- // 2
147
- LoggerProxy.logger.log('Roap:handler#perform --> Roap State local offer won after GLARE.');
148
- }
149
- else {
150
- LoggerProxy.logger.log('Roap:handler#perform --> Roap State remote offer won after GLARE.');
151
- }
152
- session.state.step(ROAP.ROAP_SIGNAL.GLARE_RESOLVED, meeting, action);
153
- this.perform(session, meeting);
154
- break;
155
- default:
156
- break;
157
- }
158
- }
159
-
160
- /**
161
- *
162
- * @param {String} signal
163
- * @param {Object} session
164
- * @param {Object} action
165
- * @param {Meeting} meeting
166
- * @param {String} prefix
167
- * @returns {null}
168
- */
169
- execute(signal, session, action, meeting, prefix) {
170
- if (session && session.state) {
171
- handleSessionStep({
172
- roap: action,
173
- locusUrl: meeting.locusUrl,
174
- correlationId: meeting.correlationId,
175
- session
176
- });
177
- signal = ROAP.ROAP_SIGNAL[`${prefix}${action.msg.messageType}`];
178
- session.state.step(signal, meeting, action);
179
- this.perform(session, meeting, action);
180
- }
181
- }
182
-
183
- /**
184
- *
185
- * @param {Object} session
186
- * @param {Object} action
187
- * @param {Meeting} meeting
188
- * @param {String} correlationId
189
- * @returns {Boolean}
190
- */
191
- handleAction(session, action, meeting, correlationId) {
192
- let signal;
193
-
194
-
195
- switch (action.type) {
196
- case ROAP.RECEIVE_ROAP_MSG:
197
- LoggerProxy.logger.log(`Roap:handler#handleAction --> RECEIVE_ROAP_MSG event captured, reciving a roap message : ${JSON.stringify(action)}`);
198
- if (compareWithLastRoapMessage(this.lastRoapMessage, action)) {
199
- LoggerProxy.logger.warn(`Roap:handler#handleAction --> duplicate roap offer from server: ${action.msg.seq}`);
200
- }
201
- else {
202
- this.lastRoapMessage = action;
203
- action.remote = true;
204
- this.execute(signal, session, action, meeting, ROAP.RX_);
205
- }
206
- break;
207
- case ROAP.SEND_ROAP_MSG:
208
- LoggerProxy.logger.log(`Roap:handler#handleAction --> SEND_ROAP_MSG event captured, sending roap message ${JSON.stringify(action)}`);
209
-
210
- action.local = true;
211
- this.execute(signal, session, action, meeting, ROAP.TX_);
212
- break;
213
- case ROAP.SEND_ROAP_MSG_SUCCESS:
214
- // NOTE: When server send back an answer via mercury the
215
- // remote SDP is already saved sent and ok message is sent back
216
- // We dont have to indicate the roapHandler about the RX_ANSWER via SEND_ROAP_MSG_SUCCESS
217
- break;
218
- case ROAP.RECEIVE_CALL_LEAVE:
219
- RoapCollection.deleteSession(correlationId);
220
- LoggerProxy.logger.log(`Roap:handler#handleAction --> RECEIVE_CALL_LEAVE event captured, cleaning up the RoapHandler for correlationId: ${correlationId}`); break;
221
- case ROAP.RESET_ROAP_STATE:
222
- RoapCollection.deleteSessionSequence(correlationId, action.msg.seq);
223
- LoggerProxy.logger.log(`Roap:handler#handleAction --> RESET_ROAP_STATE event captured, resetting the RoapHandler state based on sequenceId: ${action.msg.seq}`); break;
224
- default:
225
- return true;
226
- }
227
-
228
- return true;
229
- }
230
-
231
- /**
232
- *
233
- * @param {Object} action
234
- * @returns {Boolean}
235
- */
236
- submit(action) {
237
- const {correlationId} = action;
238
- let {seq} = action;
239
-
240
- if (!seq && action.msg) {
241
- seq = action.msg.seq;
242
- }
243
- const session = RoapCollection.getSessionSequence(correlationId, seq);
244
- const meeting = this.webex.meetings.meetingCollection.getByKey('correlationId', correlationId);
245
-
246
- if (checkForAndHandleErrors(action, meeting, correlationId)) {
247
- return true;
248
- }
249
-
250
- return this.handleAction(session, action, meeting, correlationId);
251
- }
252
- }