@webex/plugin-meetings 3.1.0 → 3.2.0

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 (205) hide show
  1. package/dist/breakouts/breakout.js +1 -1
  2. package/dist/breakouts/index.js +1 -1
  3. package/dist/common/errors/reconnection-not-started.js +46 -0
  4. package/dist/common/errors/reconnection-not-started.js.map +1 -0
  5. package/dist/constants.js +16 -5
  6. package/dist/constants.js.map +1 -1
  7. package/dist/index.js +80 -0
  8. package/dist/index.js.map +1 -1
  9. package/dist/interpretation/index.js +1 -1
  10. package/dist/interpretation/siLanguage.js +1 -1
  11. package/dist/locus-info/controlsUtils.js +7 -1
  12. package/dist/locus-info/controlsUtils.js.map +1 -1
  13. package/dist/locus-info/index.js +10 -0
  14. package/dist/locus-info/index.js.map +1 -1
  15. package/dist/media/properties.js +102 -57
  16. package/dist/media/properties.js.map +1 -1
  17. package/dist/mediaQualityMetrics/config.js +10 -10
  18. package/dist/mediaQualityMetrics/config.js.map +1 -1
  19. package/dist/meeting/in-meeting-actions.js +6 -0
  20. package/dist/meeting/in-meeting-actions.js.map +1 -1
  21. package/dist/meeting/index.js +564 -475
  22. package/dist/meeting/index.js.map +1 -1
  23. package/dist/meeting/locusMediaRequest.js +27 -0
  24. package/dist/meeting/locusMediaRequest.js.map +1 -1
  25. package/dist/meeting/util.js +9 -16
  26. package/dist/meeting/util.js.map +1 -1
  27. package/dist/meeting/voicea-meeting.js +37 -49
  28. package/dist/meeting/voicea-meeting.js.map +1 -1
  29. package/dist/meeting-info/util.js +304 -267
  30. package/dist/meeting-info/util.js.map +1 -1
  31. package/dist/meeting-info/utilv2.js +334 -298
  32. package/dist/meeting-info/utilv2.js.map +1 -1
  33. package/dist/meetings/index.js +12 -28
  34. package/dist/meetings/index.js.map +1 -1
  35. package/dist/reachability/index.js +88 -9
  36. package/dist/reachability/index.js.map +1 -1
  37. package/dist/reconnection-manager/index.js +138 -109
  38. package/dist/reconnection-manager/index.js.map +1 -1
  39. package/dist/roap/request.js +3 -27
  40. package/dist/roap/request.js.map +1 -1
  41. package/dist/statsAnalyzer/index.js +8 -2
  42. package/dist/statsAnalyzer/index.js.map +1 -1
  43. package/dist/statsAnalyzer/mqaUtil.js +17 -0
  44. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  45. package/dist/types/annotation/annotation.types.d.ts +42 -0
  46. package/dist/types/annotation/constants.d.ts +31 -0
  47. package/dist/types/annotation/index.d.ts +117 -0
  48. package/dist/types/breakouts/breakout.d.ts +8 -0
  49. package/dist/types/breakouts/collection.d.ts +5 -0
  50. package/dist/types/breakouts/edit-lock-error.d.ts +15 -0
  51. package/dist/types/breakouts/events.d.ts +8 -0
  52. package/dist/types/breakouts/index.d.ts +5 -0
  53. package/dist/types/breakouts/request.d.ts +22 -0
  54. package/dist/types/breakouts/utils.d.ts +15 -0
  55. package/dist/types/common/browser-detection.d.ts +9 -0
  56. package/dist/types/common/collection.d.ts +48 -0
  57. package/dist/types/common/config.d.ts +2 -0
  58. package/dist/types/common/errors/captcha-error.d.ts +15 -0
  59. package/dist/types/common/errors/intent-to-join.d.ts +16 -0
  60. package/dist/types/common/errors/join-meeting.d.ts +17 -0
  61. package/dist/types/common/errors/media.d.ts +15 -0
  62. package/dist/types/common/errors/no-meeting-info.d.ts +14 -0
  63. package/dist/types/common/errors/parameter.d.ts +15 -0
  64. package/dist/types/common/errors/password-error.d.ts +15 -0
  65. package/dist/types/common/errors/permission.d.ts +14 -0
  66. package/dist/types/common/errors/reclaim-host-role-errors.d.ts +60 -0
  67. package/dist/types/common/errors/reconnection-not-started.d.ts +13 -0
  68. package/dist/types/common/errors/reconnection.d.ts +15 -0
  69. package/dist/types/common/errors/stats.d.ts +15 -0
  70. package/dist/types/common/errors/webex-errors.d.ts +93 -0
  71. package/dist/types/common/errors/webex-meetings-error.d.ts +20 -0
  72. package/dist/types/common/events/events-scope.d.ts +17 -0
  73. package/dist/types/common/events/events.d.ts +12 -0
  74. package/dist/types/common/events/trigger-proxy.d.ts +2 -0
  75. package/dist/types/common/events/util.d.ts +2 -0
  76. package/dist/types/common/logs/logger-config.d.ts +2 -0
  77. package/dist/types/common/logs/logger-proxy.d.ts +2 -0
  78. package/dist/types/common/logs/request.d.ts +36 -0
  79. package/dist/types/common/queue.d.ts +34 -0
  80. package/dist/types/config.d.ts +73 -0
  81. package/dist/types/constants.d.ts +1098 -0
  82. package/dist/types/controls-options-manager/constants.d.ts +4 -0
  83. package/dist/types/controls-options-manager/enums.d.ts +15 -0
  84. package/dist/types/controls-options-manager/index.d.ts +136 -0
  85. package/dist/types/controls-options-manager/types.d.ts +43 -0
  86. package/dist/types/controls-options-manager/util.d.ts +1 -0
  87. package/dist/types/index.d.ts +19 -0
  88. package/dist/types/interceptors/index.d.ts +2 -0
  89. package/dist/types/interceptors/locusRetry.d.ts +27 -0
  90. package/dist/types/interpretation/collection.d.ts +5 -0
  91. package/dist/types/interpretation/index.d.ts +5 -0
  92. package/dist/types/interpretation/siLanguage.d.ts +5 -0
  93. package/dist/types/locus-info/controlsUtils.d.ts +2 -0
  94. package/dist/types/locus-info/embeddedAppsUtils.d.ts +2 -0
  95. package/dist/types/locus-info/fullState.d.ts +2 -0
  96. package/dist/types/locus-info/hostUtils.d.ts +2 -0
  97. package/dist/types/locus-info/index.d.ts +322 -0
  98. package/dist/types/locus-info/infoUtils.d.ts +2 -0
  99. package/dist/types/locus-info/mediaSharesUtils.d.ts +2 -0
  100. package/dist/types/locus-info/parser.d.ts +272 -0
  101. package/dist/types/locus-info/selfUtils.d.ts +2 -0
  102. package/dist/types/media/MediaConnectionAwaiter.d.ts +61 -0
  103. package/dist/types/media/index.d.ts +34 -0
  104. package/dist/types/media/properties.d.ts +117 -0
  105. package/dist/types/media/util.d.ts +2 -0
  106. package/dist/types/mediaQualityMetrics/config.d.ts +247 -0
  107. package/dist/types/meeting/in-meeting-actions.d.ts +173 -0
  108. package/dist/types/meeting/index.d.ts +1832 -0
  109. package/dist/types/meeting/locusMediaRequest.d.ts +75 -0
  110. package/dist/types/meeting/muteState.d.ts +178 -0
  111. package/dist/types/meeting/request.d.ts +295 -0
  112. package/dist/types/meeting/request.type.d.ts +11 -0
  113. package/dist/types/meeting/state.d.ts +9 -0
  114. package/dist/types/meeting/util.d.ts +122 -0
  115. package/dist/types/meeting/voicea-meeting.d.ts +17 -0
  116. package/dist/types/meeting-info/collection.d.ts +20 -0
  117. package/dist/types/meeting-info/index.d.ts +69 -0
  118. package/dist/types/meeting-info/meeting-info-v2.d.ts +123 -0
  119. package/dist/types/meeting-info/request.d.ts +22 -0
  120. package/dist/types/meeting-info/util.d.ts +49 -0
  121. package/dist/types/meeting-info/utilv2.d.ts +65 -0
  122. package/dist/types/meetings/collection.d.ts +40 -0
  123. package/dist/types/meetings/index.d.ts +383 -0
  124. package/dist/types/meetings/meetings.types.d.ts +4 -0
  125. package/dist/types/meetings/request.d.ts +27 -0
  126. package/dist/types/meetings/util.d.ts +18 -0
  127. package/dist/types/member/index.d.ts +160 -0
  128. package/dist/types/member/types.d.ts +32 -0
  129. package/dist/types/member/util.d.ts +2 -0
  130. package/dist/types/members/collection.d.ts +29 -0
  131. package/dist/types/members/index.d.ts +353 -0
  132. package/dist/types/members/request.d.ts +114 -0
  133. package/dist/types/members/types.d.ts +25 -0
  134. package/dist/types/members/util.d.ts +215 -0
  135. package/dist/types/metrics/constants.d.ts +70 -0
  136. package/dist/types/metrics/index.d.ts +45 -0
  137. package/dist/types/multistream/mediaRequestManager.d.ts +119 -0
  138. package/dist/types/multistream/receiveSlot.d.ts +68 -0
  139. package/dist/types/multistream/receiveSlotManager.d.ts +56 -0
  140. package/dist/types/multistream/remoteMedia.d.ts +72 -0
  141. package/dist/types/multistream/remoteMediaGroup.d.ts +49 -0
  142. package/dist/types/multistream/remoteMediaManager.d.ts +300 -0
  143. package/dist/types/multistream/sendSlotManager.d.ts +69 -0
  144. package/dist/types/networkQualityMonitor/index.d.ts +70 -0
  145. package/dist/types/personal-meeting-room/index.d.ts +47 -0
  146. package/dist/types/personal-meeting-room/request.d.ts +14 -0
  147. package/dist/types/personal-meeting-room/util.d.ts +2 -0
  148. package/dist/types/reachability/clusterReachability.d.ts +110 -0
  149. package/dist/types/reachability/index.d.ts +120 -0
  150. package/dist/types/reachability/request.d.ts +39 -0
  151. package/dist/types/reachability/util.d.ts +15 -0
  152. package/dist/types/reactions/constants.d.ts +3 -0
  153. package/dist/types/reactions/reactions.d.ts +4 -0
  154. package/dist/types/reactions/reactions.type.d.ts +52 -0
  155. package/dist/types/reconnection-manager/index.d.ts +126 -0
  156. package/dist/types/recording-controller/enums.d.ts +7 -0
  157. package/dist/types/recording-controller/index.d.ts +207 -0
  158. package/dist/types/recording-controller/util.d.ts +14 -0
  159. package/dist/types/roap/index.d.ts +86 -0
  160. package/dist/types/roap/request.d.ts +39 -0
  161. package/dist/types/roap/turnDiscovery.d.ts +155 -0
  162. package/dist/types/rtcMetrics/constants.d.ts +4 -0
  163. package/dist/types/rtcMetrics/index.d.ts +61 -0
  164. package/dist/types/statsAnalyzer/global.d.ts +36 -0
  165. package/dist/types/statsAnalyzer/index.d.ts +217 -0
  166. package/dist/types/statsAnalyzer/mqaUtil.d.ts +48 -0
  167. package/dist/types/transcription/index.d.ts +64 -0
  168. package/dist/types/webinar/collection.d.ts +16 -0
  169. package/dist/types/webinar/index.d.ts +5 -0
  170. package/dist/webinar/index.js +1 -1
  171. package/package.json +22 -22
  172. package/src/common/errors/reconnection-not-started.ts +25 -0
  173. package/src/constants.ts +14 -5
  174. package/src/index.ts +30 -0
  175. package/src/locus-info/controlsUtils.ts +11 -0
  176. package/src/locus-info/index.ts +16 -0
  177. package/src/media/properties.ts +67 -15
  178. package/src/mediaQualityMetrics/config.ts +13 -7
  179. package/src/meeting/in-meeting-actions.ts +12 -0
  180. package/src/meeting/index.ts +144 -107
  181. package/src/meeting/locusMediaRequest.ts +31 -0
  182. package/src/meeting/util.ts +9 -16
  183. package/src/meeting/voicea-meeting.ts +44 -46
  184. package/src/meeting-info/util.ts +241 -233
  185. package/src/meeting-info/utilv2.ts +250 -244
  186. package/src/meetings/index.ts +15 -27
  187. package/src/reachability/index.ts +60 -0
  188. package/src/reconnection-manager/index.ts +128 -105
  189. package/src/roap/request.ts +1 -24
  190. package/src/statsAnalyzer/index.ts +10 -3
  191. package/src/statsAnalyzer/mqaUtil.ts +23 -0
  192. package/test/unit/spec/locus-info/controlsUtils.js +20 -0
  193. package/test/unit/spec/locus-info/index.js +21 -0
  194. package/test/unit/spec/media/properties.ts +145 -140
  195. package/test/unit/spec/meeting/in-meeting-actions.ts +6 -0
  196. package/test/unit/spec/meeting/index.js +271 -105
  197. package/test/unit/spec/meeting/locusMediaRequest.ts +49 -0
  198. package/test/unit/spec/meeting/utils.js +3 -10
  199. package/test/unit/spec/meeting/voicea-meeting.ts +5 -14
  200. package/test/unit/spec/meetings/index.js +59 -17
  201. package/test/unit/spec/reachability/index.ts +266 -0
  202. package/test/unit/spec/reconnection-manager/index.js +127 -39
  203. package/test/unit/spec/roap/request.ts +0 -37
  204. package/test/unit/spec/stats-analyzer/index.js +100 -8
  205. package/src/common/errors/reconnection-in-progress.ts +0 -8
package/package.json CHANGED
@@ -28,7 +28,7 @@
28
28
  ]
29
29
  },
30
30
  "scripts": {
31
- "build": "yarn run -T tsc --declaration true --declarationDir ./dist",
31
+ "build": "yarn run -T tsc --declaration true --declarationDir ./dist/types",
32
32
  "build:src": "webex-legacy-tools build -dest \"./dist\" -src \"./src\" -js -ts -maps && yarn build",
33
33
  "deploy:npm": "yarn npm publish",
34
34
  "test:broken": "yarn test:style && yarn test:unit && yarn test:integration && yarn test:browser",
@@ -43,13 +43,13 @@
43
43
  "@webex/eslint-config-legacy": "0.0.0",
44
44
  "@webex/jest-config-legacy": "0.0.0",
45
45
  "@webex/legacy-tools": "0.0.0",
46
- "@webex/plugin-meetings": "3.1.0",
47
- "@webex/plugin-rooms": "3.1.0",
48
- "@webex/test-helper-chai": "3.1.0",
49
- "@webex/test-helper-mocha": "3.1.0",
50
- "@webex/test-helper-mock-webex": "3.1.0",
51
- "@webex/test-helper-retry": "3.1.0",
52
- "@webex/test-helper-test-users": "3.1.0",
46
+ "@webex/plugin-meetings": "3.2.0",
47
+ "@webex/plugin-rooms": "3.2.0",
48
+ "@webex/test-helper-chai": "3.2.0",
49
+ "@webex/test-helper-mocha": "3.2.0",
50
+ "@webex/test-helper-mock-webex": "3.2.0",
51
+ "@webex/test-helper-retry": "3.2.0",
52
+ "@webex/test-helper-test-users": "3.2.0",
53
53
  "chai": "^4.3.4",
54
54
  "chai-as-promised": "^7.1.1",
55
55
  "eslint": "^8.24.0",
@@ -61,20 +61,20 @@
61
61
  "typescript": "^4.7.4"
62
62
  },
63
63
  "dependencies": {
64
- "@webex/common": "3.1.0",
64
+ "@webex/common": "3.2.0",
65
65
  "@webex/internal-media-core": "2.5.0",
66
- "@webex/internal-plugin-conversation": "3.1.0",
67
- "@webex/internal-plugin-device": "3.1.0",
68
- "@webex/internal-plugin-llm": "3.1.0",
69
- "@webex/internal-plugin-mercury": "3.1.0",
70
- "@webex/internal-plugin-metrics": "3.1.0",
71
- "@webex/internal-plugin-support": "3.1.0",
72
- "@webex/internal-plugin-user": "3.1.0",
73
- "@webex/internal-plugin-voicea": "3.1.0",
74
- "@webex/media-helpers": "3.1.0",
75
- "@webex/plugin-people": "3.1.0",
76
- "@webex/plugin-rooms": "3.1.0",
77
- "@webex/webex-core": "3.1.0",
66
+ "@webex/internal-plugin-conversation": "3.2.0",
67
+ "@webex/internal-plugin-device": "3.2.0",
68
+ "@webex/internal-plugin-llm": "3.2.0",
69
+ "@webex/internal-plugin-mercury": "3.2.0",
70
+ "@webex/internal-plugin-metrics": "3.2.0",
71
+ "@webex/internal-plugin-support": "3.2.0",
72
+ "@webex/internal-plugin-user": "3.2.0",
73
+ "@webex/internal-plugin-voicea": "3.2.0",
74
+ "@webex/media-helpers": "3.2.0",
75
+ "@webex/plugin-people": "3.2.0",
76
+ "@webex/plugin-rooms": "3.2.0",
77
+ "@webex/webex-core": "3.2.0",
78
78
  "ampersand-collection": "^2.0.2",
79
79
  "bowser": "^2.11.0",
80
80
  "btoa": "^1.2.1",
@@ -91,5 +91,5 @@
91
91
  "//": [
92
92
  "TODO: upgrade jwt-decode when moving to node 18"
93
93
  ],
94
- "version": "3.1.0"
94
+ "version": "3.2.0"
95
95
  }
@@ -0,0 +1,25 @@
1
+ import {ERROR_DICTIONARY} from '../../constants';
2
+ import ReconnectionError from './reconnection';
3
+
4
+ /**
5
+ * Error object for cases when new reconnection cannot be started
6
+ */
7
+ export default class ReconnectionNotStartedError extends ReconnectionError {
8
+ /**
9
+ *
10
+ * @constructor
11
+ * @param {String} [message]
12
+ * @param {Object} [error]
13
+ */
14
+ constructor(
15
+ message: string = ERROR_DICTIONARY.RECONNECTION_NOT_STARTED.MESSAGE,
16
+ error: any = null
17
+ ) {
18
+ super(message, error);
19
+ this.name = ERROR_DICTIONARY.RECONNECTION_NOT_STARTED.NAME;
20
+ this.sdkMessage = ERROR_DICTIONARY.RECONNECTION_NOT_STARTED.MESSAGE;
21
+ this.error = error;
22
+ this.stack = error ? error.stack : new Error().stack;
23
+ this.code = ERROR_DICTIONARY.RECONNECTION_NOT_STARTED.CODE;
24
+ }
25
+ }
package/src/constants.ts CHANGED
@@ -100,7 +100,7 @@ export const _JOINED_ = 'JOINED';
100
100
  export const _LOCUS_ID_ = 'LOCUS_ID';
101
101
  export const _LEFT_ = 'LEFT';
102
102
  export const _MOVED_ = 'MOVED';
103
-
103
+ export const _ON_HOLD_LOBBY_ = 'ON_HOLD_LOBBY';
104
104
  export const _MEETING_LINK_ = 'MEETING_LINK';
105
105
  export const _MEETING_UUID_ = 'MEETING_UUID';
106
106
  export const _MEETING_ = 'MEETING';
@@ -380,7 +380,7 @@ export const EVENT_TRIGGERS = {
380
380
  MEETING_TRANSCRIPTION_CONNECTED: 'meeting:transcription:connected',
381
381
  MEETING_STARTED_RECEIVING_TRANSCRIPTION: 'meeting:receiveTranscription:started',
382
382
  MEETING_STOPPED_RECEIVING_TRANSCRIPTION: 'meeting:receiveTranscription:stopped',
383
-
383
+ MEETING_MANUAL_CAPTION_UPDATED: 'meeting:manualCaptionControl:updated',
384
384
  MEETING_CAPTION_RECEIVED: 'meeting:caption-received',
385
385
  };
386
386
 
@@ -535,6 +535,12 @@ export const ERROR_DICTIONARY = {
535
535
  'Participant Having Host Role Already. Participant who sends request to reclaim host role has already a host role.',
536
536
  CODE: 14,
537
537
  },
538
+ RECONNECTION_NOT_STARTED: {
539
+ NAME: 'ReconnectionNotStartedError',
540
+ MESSAGE:
541
+ 'Reconnection was not started, because there is one already in progress or reconnections are disabled in config.',
542
+ CODE: 15,
543
+ },
538
544
  };
539
545
 
540
546
  export const FLOOR_ACTION = {
@@ -671,6 +677,7 @@ export const LOCUSINFO = {
671
677
  CONTROLS_MEETING_LAYOUT_UPDATED: 'CONTROLS_MEETING_LAYOUT_UPDATED',
672
678
  CONTROLS_RECORDING_UPDATED: 'CONTROLS_RECORDING_UPDATED',
673
679
  CONTROLS_MEETING_TRANSCRIBE_UPDATED: 'CONTROLS_MEETING_TRANSCRIBE_UPDATED',
680
+ CONTROLS_MEETING_MANUAL_CAPTION_UPDATED: 'CONTROLS_MEETING_MANUAL_CAPTION_UPDATED',
674
681
  CONTROLS_MEETING_BREAKOUT_UPDATED: 'CONTROLS_MEETING_BREAKOUT_UPDATED',
675
682
  CONTROLS_MEETING_CONTAINER_UPDATED: 'CONTROLS_MEETING_CONTAINER_UPDATED',
676
683
  CONTROLS_MEETING_INTERPRETATION_UPDATED: 'CONTROLS_MEETING_INTERPRETATION_UPDATED',
@@ -909,6 +916,9 @@ export const DISPLAY_HINTS = {
909
916
  LEAVE_END_MEETING: 'LEAVE_END_MEETING',
910
917
  CAPTION_START: 'CAPTION_START',
911
918
  CAPTION_STATUS_ACTIVE: 'CAPTION_STATUS_ACTIVE',
919
+ MANUAL_CAPTION_START: 'MANUAL_CAPTION_START',
920
+ MANUAL_CAPTION_STOP: 'MANUAL_CAPTION_STOP',
921
+ MANUAL_CAPTION_STATUS_ACTIVE: 'MANUAL_CAPTION_STATUS_ACTIVE',
912
922
  DISPLAY_REAL_TIME_TRANSLATION: 'DISPLAY_REAL_TIME_TRANSLATION',
913
923
  ENABLE_CAPTION_PANEL: 'ENABLE_CAPTION_PANEL',
914
924
  DISPLAY_NON_ENGLISH_ASR: 'DISPLAY_NON_ENGLISH_ASR',
@@ -1043,9 +1053,7 @@ export const PEER_CONNECTION_STATE = {
1043
1053
  export const RECONNECTION = {
1044
1054
  STATE: {
1045
1055
  IN_PROGRESS: 'IN_PROGRESS',
1046
- COMPLETE: 'COMPLETE',
1047
1056
  FAILURE: 'FAILURE',
1048
- DEFAULT_TRY_COUNT: 0,
1049
1057
  DEFAULT_STATUS: '',
1050
1058
  },
1051
1059
  } as const;
@@ -1114,6 +1122,8 @@ export const MQA_STATS = {
1114
1122
  direction: 'sendrecv', // TODO: parse from SDP and save globally
1115
1123
  isMain: false, // always true for share sender
1116
1124
  mariFecEnabled: false, // unavailable
1125
+ mariRtxEnabled: false, // unavailable
1126
+ mariLiteEnabled: false, // unavailable
1117
1127
  mariQosEnabled: false, // unavailable
1118
1128
  multistreamEnabled: false, // unavailable
1119
1129
  },
@@ -1126,7 +1136,6 @@ export const MQA_STATS = {
1126
1136
  queueDelay: 0, // unavailable
1127
1137
  remoteJitter: 0, // unavailable
1128
1138
  remoteLossRate: 0,
1129
- remoteReceiveRate: 0, // unavailable
1130
1139
  roundTripTime: 0,
1131
1140
  rtcpBitrate: 0, // unavailable
1132
1141
  rtcpPackets: 0, // unavailable
package/src/index.ts CHANGED
@@ -4,6 +4,19 @@ import {registerPlugin} from '@webex/webex-core';
4
4
  import Meetings from './meetings';
5
5
  import config from './config';
6
6
  import {LocusRetryStatusInterceptor} from './interceptors';
7
+ import CaptchaError from './common/errors/captcha-error';
8
+ import IntentToJoinError from './common/errors/intent-to-join';
9
+ import PasswordError from './common/errors/password-error';
10
+ import PermissionError from './common/errors/permission';
11
+ import {
12
+ ReclaimHostEmptyWrongKeyError,
13
+ ReclaimHostIsHostAlreadyError,
14
+ ReclaimHostNotAllowedError,
15
+ ReclaimHostNotSupportedError,
16
+ } from './common/errors/reclaim-host-role-errors';
17
+ import Meeting from './meeting';
18
+ import MeetingInfoUtil from './meeting-info/utilv2';
19
+ import JoinMeetingError from './common/errors/join-meeting';
7
20
 
8
21
  registerPlugin('meetings', Meetings, {
9
22
  config,
@@ -39,6 +52,23 @@ export default Meetings;
39
52
 
40
53
  export * as CONSTANTS from './constants';
41
54
  export * as REACTIONS from './reactions/reactions';
55
+ export * as sdkAnnotationTypes from './annotation/annotation.types';
56
+ export * as MeetingInfoV2 from './meeting-info/meeting-info-v2';
57
+ export {type Reaction} from './reactions/reactions.type';
58
+
59
+ export {
60
+ CaptchaError,
61
+ IntentToJoinError,
62
+ JoinMeetingError,
63
+ PasswordError,
64
+ PermissionError,
65
+ ReclaimHostIsHostAlreadyError,
66
+ ReclaimHostNotAllowedError,
67
+ ReclaimHostNotSupportedError,
68
+ ReclaimHostEmptyWrongKeyError,
69
+ Meeting,
70
+ MeetingInfoUtil,
71
+ };
42
72
 
43
73
  export {RemoteMedia} from './multistream/remoteMedia';
44
74
 
@@ -43,6 +43,12 @@ ControlsUtils.parse = (controls: any) => {
43
43
  };
44
44
  }
45
45
 
46
+ if (controls && controls.manualCaptionControl) {
47
+ parsedControls.manualCaptionControl = {
48
+ enabled: controls.manualCaptionControl.enabled,
49
+ };
50
+ }
51
+
46
52
  if (controls && controls.entryExitTone) {
47
53
  parsedControls.entryExitTone = controls.entryExitTone.enabled
48
54
  ? controls.entryExitTone.mode
@@ -143,6 +149,11 @@ ControlsUtils.getControls = (oldControls: any, newControls: any) => {
143
149
  !isEqual(previous?.transcribe?.transcribing, current?.transcribe?.transcribing) && // upon first join, previous?.record?.recording = undefined; thus, never going to be equal and will always return true
144
150
  (previous?.transcribe?.transcribing || current?.transcribe?.transcribing), // therefore, condition added to prevent false firings of #meeting:recording:stopped upon first joining a meeting
145
151
 
152
+ hasManualCaptionChanged:
153
+ current?.manualCaptionControl &&
154
+ !isEqual(previous?.manualCaptionControl?.enabled, current?.manualCaptionControl?.enabled) &&
155
+ (previous?.manualCaptionControl?.enabled || current?.manualCaptionControl?.enabled),
156
+
146
157
  hasEntryExitToneChanged: !!(
147
158
  newControls.entryExitTone &&
148
159
  !isEqual(previous?.entryExitTone, current?.entryExitTone) &&
@@ -792,6 +792,7 @@ export default class LocusInfo extends EventsScope {
792
792
  hasRecordingPausedChanged,
793
793
  hasMeetingContainerChanged,
794
794
  hasTranscribeChanged,
795
+ hasManualCaptionChanged,
795
796
  hasEntryExitToneChanged,
796
797
  hasBreakoutChanged,
797
798
  hasVideoEnabledChanged,
@@ -923,6 +924,21 @@ export default class LocusInfo extends EventsScope {
923
924
  );
924
925
  }
925
926
 
927
+ if (hasManualCaptionChanged) {
928
+ const {enabled} = current.manualCaptionControl;
929
+
930
+ this.emitScoped(
931
+ {
932
+ file: 'locus-info',
933
+ function: 'updateControls',
934
+ },
935
+ LOCUSINFO.EVENTS.CONTROLS_MEETING_MANUAL_CAPTION_UPDATED,
936
+ {
937
+ enabled,
938
+ }
939
+ );
940
+ }
941
+
926
942
  if (hasBreakoutChanged) {
927
943
  const {breakout} = current;
928
944
  breakout.breakoutMoveId = SelfUtils.getReplacedBreakoutMoveId(
@@ -1,3 +1,4 @@
1
+ /* eslint-disable class-methods-use-this */
1
2
  import {
2
3
  LocalCameraStream,
3
4
  LocalMicrophoneStream,
@@ -182,25 +183,45 @@ export default class MediaProperties {
182
183
  }
183
184
 
184
185
  /**
185
- * Returns the type of a connection that has been established
186
+ * Returns ICE transport information:
187
+ * - selectedCandidatePairChanges - number of times the selected candidate pair was changed, it should be at least 1 for successful connections
188
+ * it will be -1 if browser doesn't supply this information
189
+ * - numTransports - number of transports (should be 1 if we're using bundle)
186
190
  *
187
- * @returns {Promise<'UDP' | 'TCP' | 'TURN-TLS' | 'TURN-TCP' | 'TURN-UDP' | 'unknown'>}
191
+ * @param {Array<any>} allStatsReports array of RTC stats reports
192
+ * @returns {Object}
188
193
  */
189
- async getCurrentConnectionType() {
190
- // we can only get the connection type after ICE connection has been established
191
- await this.waitForMediaConnectionConnected();
192
-
193
- const allStatsReports = [];
194
+ private getTransportInfo(allStatsReports: any[]): {
195
+ selectedCandidatePairChanges: number;
196
+ numTransports: number;
197
+ } {
198
+ const transports = allStatsReports.filter((report) => report.type === 'transport');
194
199
 
195
- try {
196
- const statsResult = await this.webrtcMediaConnection.getStats();
197
- statsResult.forEach((report) => allStatsReports.push(report));
198
- } catch (error) {
200
+ if (transports.length > 1) {
199
201
  LoggerProxy.logger.warn(
200
- `Media:properties#getCurrentConnectionType --> getStats() failed: ${error}`
202
+ `Media:properties#getSelectedCandidatePairChanges --> found more than 1 transport: ${transports.length}`
201
203
  );
202
204
  }
203
205
 
206
+ return {
207
+ selectedCandidatePairChanges:
208
+ transports.length > 0 && transports[0].selectedCandidatePairChanges !== undefined
209
+ ? transports[0].selectedCandidatePairChanges
210
+ : -1,
211
+ numTransports: transports.length,
212
+ };
213
+ }
214
+
215
+ /**
216
+ * Returns the type of a connection that has been established
217
+ * It should be 'UDP' | 'TCP' | 'TURN-TLS' | 'TURN-TCP' | 'TURN-UDP' | 'unknown'
218
+ *
219
+ * If connection was not established, it returns 'unknown'
220
+ *
221
+ * @param {Array<any>} allStatsReports array of RTC stats reports
222
+ * @returns {string}
223
+ */
224
+ private getConnectionType(allStatsReports: any[]) {
204
225
  const successfulCandidatePairs = allStatsReports.filter(
205
226
  (report) => report.type === 'candidate-pair' && report.state?.toLowerCase() === 'succeeded'
206
227
  );
@@ -215,7 +236,7 @@ export default class MediaProperties {
215
236
 
216
237
  if (localCandidate === undefined) {
217
238
  LoggerProxy.logger.warn(
218
- `Media:properties#getCurrentConnectionType --> failed to find local candidate "${pair.localCandidateId}" in getStats() results`
239
+ `Media:properties#getConnectionType --> failed to find local candidate "${pair.localCandidateId}" in getStats() results`
219
240
  );
220
241
 
221
242
  return false;
@@ -235,7 +256,7 @@ export default class MediaProperties {
235
256
  return true;
236
257
  }
237
258
  LoggerProxy.logger.warn(
238
- `Media:properties#getCurrentConnectionType --> missing localCandidate.protocol, candidateType=${localCandidate.candidateType}`
259
+ `Media:properties#getConnectionType --> missing localCandidate.protocol, candidateType=${localCandidate.candidateType}`
239
260
  );
240
261
 
241
262
  return false;
@@ -247,7 +268,7 @@ export default class MediaProperties {
247
268
  .map((report) => report.state);
248
269
 
249
270
  LoggerProxy.logger.warn(
250
- `Media:properties#getCurrentConnectionType --> all candidate pair states: ${JSON.stringify(
271
+ `Media:properties#getConnectionType --> all candidate pair states: ${JSON.stringify(
251
272
  candidatePairStates
252
273
  )}`
253
274
  );
@@ -255,4 +276,35 @@ export default class MediaProperties {
255
276
 
256
277
  return foundConnectionType;
257
278
  }
279
+
280
+ /**
281
+ * Returns information about current webrtc media connection
282
+ *
283
+ * @returns {Promise<Object>}
284
+ */
285
+ async getCurrentConnectionInfo(): Promise<{
286
+ connectionType: string;
287
+ selectedCandidatePairChanges: number;
288
+ numTransports: number;
289
+ }> {
290
+ const allStatsReports = [];
291
+
292
+ try {
293
+ const statsResult = await this.webrtcMediaConnection.getStats();
294
+ statsResult.forEach((report) => allStatsReports.push(report));
295
+ } catch (error) {
296
+ LoggerProxy.logger.warn(
297
+ `Media:properties#getCurrentConnectionInfo --> getStats() failed: ${error}`
298
+ );
299
+ }
300
+
301
+ const connectionType = this.getConnectionType(allStatsReports);
302
+ const {selectedCandidatePairChanges, numTransports} = this.getTransportInfo(allStatsReports);
303
+
304
+ return {
305
+ connectionType,
306
+ selectedCandidatePairChanges,
307
+ numTransports,
308
+ };
309
+ }
258
310
  }
@@ -21,7 +21,9 @@ export const emptyAudioReceive = {
21
21
  direction: 'inactive',
22
22
  isMain: true,
23
23
  mariFecEnabled: false,
24
+ mariRtxEnabled: false,
24
25
  mariQosEnabled: false,
26
+ mariLiteEnabled: false,
25
27
  multistreamEnabled: false,
26
28
  },
27
29
  dtlsBitrate: 0,
@@ -75,7 +77,9 @@ export const emptyAudioTransmit = {
75
77
  direction: 'inactive',
76
78
  isMain: true,
77
79
  mariFecEnabled: false,
80
+ mariRtxEnabled: false,
78
81
  mariQosEnabled: false,
82
+ mariLiteEnabled: false,
79
83
  multistreamEnabled: false,
80
84
  },
81
85
  dtlsBitrate: 0,
@@ -86,7 +90,6 @@ export const emptyAudioTransmit = {
86
90
  queueDelay: 0,
87
91
  remoteJitter: 0,
88
92
  remoteLossRate: 0,
89
- remoteReceiveRate: 0,
90
93
  roundTripTime: 0,
91
94
  rtcpBitrate: 0,
92
95
  rtcpPackets: 0,
@@ -119,8 +122,10 @@ export const emptyVideoReceive = {
119
122
  common: {
120
123
  direction: 'inactive',
121
124
  isMain: true, // Not avaliable
122
- mariFecEnabled: true, // Not avaliable
123
- mariQosEnabled: true, // Not avaliable
125
+ mariFecEnabled: false,
126
+ mariRtxEnabled: false,
127
+ mariQosEnabled: false,
128
+ mariLiteEnabled: false,
124
129
  multistreamEnabled: true, // Not avaliable
125
130
  },
126
131
  dtlsBitrate: 0, // Not avaliable
@@ -184,8 +189,10 @@ export const emptyVideoTransmit = {
184
189
  common: {
185
190
  direction: 'inactive',
186
191
  isMain: true,
187
- mariFecEnabled: false, // Not avaliable
188
- mariQosEnabled: false, // Not avaliable
192
+ mariFecEnabled: false,
193
+ mariRtxEnabled: false,
194
+ mariQosEnabled: false,
195
+ mariLiteEnabled: false,
189
196
  multistreamEnabled: false, // Not avaliable
190
197
  },
191
198
  dtlsBitrate: 0, // Not avaliable
@@ -193,10 +200,9 @@ export const emptyVideoTransmit = {
193
200
  fecBitrate: 0, // Not avaliable
194
201
  fecPackets: 0, // TODO: check inbound-rtp// Not avaliable
195
202
  maxBitrate: 0, // Currently hardcoded
196
- queueDelay: 0, // outboundRtp.totalPacketSentDelay // TODO: check if totalInterFrameDelay/ packetSentDelay/ jitterBufferDalay
203
+ queueDelay: 0,
197
204
  remoteJitter: 0, // remoteInboundRtp.jitter
198
205
  remoteLossRate: 0, // comparedResults.lossRate
199
- remoteReceiveRate: 0, // compareResults.packetsLost
200
206
  roundTripTime: 0, // compareResults.roundTripTime
201
207
  rtcpBitrate: 0, // Dont have access to it
202
208
  rtcpPackets: 0, // Dont have access to rtcp
@@ -34,6 +34,9 @@ interface IInMeetingActions {
34
34
  canStartTranscribing?: boolean;
35
35
  canStopTranscribing?: boolean;
36
36
  isClosedCaptionActive?: boolean;
37
+ canStartManualCaption?: boolean;
38
+ canStopManualCaption?: boolean;
39
+ isManualCaptionActive?: boolean;
37
40
  isSaveTranscriptsEnabled?: boolean;
38
41
  isWebexAssistantActive?: boolean;
39
42
  canViewCaptionPanel?: boolean;
@@ -137,6 +140,12 @@ export default class InMeetingActions implements IInMeetingActions {
137
140
 
138
141
  isClosedCaptionActive = null;
139
142
 
143
+ canStartManualCaption = null;
144
+
145
+ canStopManualCaption = null;
146
+
147
+ isManualCaptionActive = null;
148
+
140
149
  isSaveTranscriptsEnabled = null;
141
150
 
142
151
  isWebexAssistantActive = null;
@@ -257,6 +266,9 @@ export default class InMeetingActions implements IInMeetingActions {
257
266
  canStartTranscribing: this.canStartTranscribing,
258
267
  canStopTranscribing: this.canStopTranscribing,
259
268
  isClosedCaptionActive: this.isClosedCaptionActive,
269
+ canStartManualCaption: this.canStartManualCaption,
270
+ canStopManualCaption: this.canStopManualCaption,
271
+ isManualCaptionActive: this.isManualCaptionActive,
260
272
  isSaveTranscriptsEnabled: this.isSaveTranscriptsEnabled,
261
273
  isWebexAssistantActive: this.isWebexAssistantActive,
262
274
  canViewCaptionPanel: this.canViewCaptionPanel,