@webex/plugin-meetings 3.0.0-beta.34 → 3.0.0-beta.36

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 (71) hide show
  1. package/dist/breakouts/breakout.js +1 -1
  2. package/dist/breakouts/edit-lock-error.js +52 -0
  3. package/dist/breakouts/edit-lock-error.js.map +1 -0
  4. package/dist/breakouts/index.js +86 -2
  5. package/dist/breakouts/index.js.map +1 -1
  6. package/dist/constants.js +14 -2
  7. package/dist/constants.js.map +1 -1
  8. package/dist/media/index.js +4 -18
  9. package/dist/media/index.js.map +1 -1
  10. package/dist/media/properties.js +3 -3
  11. package/dist/media/properties.js.map +1 -1
  12. package/dist/meeting/index.js +194 -306
  13. package/dist/meeting/index.js.map +1 -1
  14. package/dist/meeting/muteState.js +7 -2
  15. package/dist/meeting/muteState.js.map +1 -1
  16. package/dist/meeting/request.js +135 -85
  17. package/dist/meeting/request.js.map +1 -1
  18. package/dist/meeting/util.js +2 -2
  19. package/dist/meeting/util.js.map +1 -1
  20. package/dist/metrics/constants.js +0 -4
  21. package/dist/metrics/constants.js.map +1 -1
  22. package/dist/reachability/index.js +25 -17
  23. package/dist/reachability/index.js.map +1 -1
  24. package/dist/reachability/request.js +12 -5
  25. package/dist/reachability/request.js.map +1 -1
  26. package/dist/reconnection-manager/index.js +1 -2
  27. package/dist/reconnection-manager/index.js.map +1 -1
  28. package/dist/roap/request.js +114 -83
  29. package/dist/roap/request.js.map +1 -1
  30. package/dist/types/breakouts/edit-lock-error.d.ts +15 -0
  31. package/dist/types/constants.d.ts +13 -1
  32. package/dist/types/media/properties.d.ts +7 -6
  33. package/dist/types/meeting/index.d.ts +11 -36
  34. package/dist/types/meeting/request.d.ts +10 -0
  35. package/dist/types/metrics/constants.d.ts +0 -4
  36. package/dist/types/reachability/request.d.ts +5 -3
  37. package/dist/types/roap/request.d.ts +6 -3
  38. package/package.json +19 -19
  39. package/src/breakouts/README.md +8 -2
  40. package/src/breakouts/edit-lock-error.ts +25 -0
  41. package/src/breakouts/index.ts +73 -0
  42. package/src/constants.ts +13 -1
  43. package/src/media/index.ts +14 -24
  44. package/src/media/properties.ts +16 -10
  45. package/src/meeting/index.ts +122 -204
  46. package/src/meeting/muteState.ts +5 -5
  47. package/src/meeting/request.ts +35 -1
  48. package/src/meeting/util.ts +5 -4
  49. package/src/metrics/constants.ts +0 -4
  50. package/src/reachability/index.ts +12 -4
  51. package/src/reachability/request.ts +10 -5
  52. package/src/reconnection-manager/index.ts +1 -1
  53. package/src/roap/request.ts +93 -78
  54. package/test/integration/spec/converged-space-meetings.js +3 -3
  55. package/test/integration/spec/journey.js +3 -3
  56. package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
  57. package/test/unit/spec/breakouts/index.ts +92 -1
  58. package/test/unit/spec/media/index.ts +8 -6
  59. package/test/unit/spec/meeting/index.js +87 -114
  60. package/test/unit/spec/meeting/muteState.js +21 -22
  61. package/test/unit/spec/meeting/request.js +27 -0
  62. package/test/unit/spec/meeting/utils.js +3 -1
  63. package/test/unit/spec/reachability/index.ts +18 -7
  64. package/test/unit/spec/reachability/request.js +66 -0
  65. package/test/unit/spec/roap/request.ts +187 -84
  66. package/test/utils/testUtils.js +30 -25
  67. package/dist/meeting/effectsState.js +0 -262
  68. package/dist/meeting/effectsState.js.map +0 -1
  69. package/dist/types/meeting/effectsState.d.ts +0 -42
  70. package/src/meeting/effectsState.ts +0 -211
  71. package/test/unit/spec/meeting/effectsState.js +0 -285
@@ -1 +1 @@
1
- {"version":3,"names":["RoapRequest","localSdp","webex","boundedStorage","get","REACHABILITY","namespace","localStorage","catch","reachabilityData","reachabilityResult","JSON","parse","length","reachability","e","LoggerProxy","logger","error","options","roapMessage","locusSelfUrl","mediaId","correlationId","meetingId","info","mediaUrl","MEDIA","deviceUrl","internal","device","url","messageType","seq","Metrics","postEvent","event","eventType","MEDIA_REQUEST","attachRechabilityData","audioMuted","videoMuted","then","sdpWithReachability","request","uri","method","HTTP_VERBS","PUT","body","deviceType","config","meetings","localMedias","clientMediaPreferences","preferTranscoding","res","MEDIA_RESPONSE","mediaConnections","debug","statusCode","locus","roapSeq","err","data","parseLocusError","StatelessWebexPlugin"],"sources":["request.ts"],"sourcesContent":["/* global window */\n// @ts-ignore\nimport {StatelessWebexPlugin} from '@webex/webex-core';\n\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport {MEDIA, HTTP_VERBS, REACHABILITY} from '../constants';\nimport Metrics from '../metrics';\nimport {eventType} from '../metrics/config';\n\n/**\n * @class RoapRequest\n */\nexport default class RoapRequest extends StatelessWebexPlugin {\n /**\n * Joins a meeting via ROAP\n * @param {Object} localSdp\n * @returns {Promise} returns a promise that resolves/rejects whatever the request does\n */\n async attachRechabilityData(localSdp) {\n // @ts-ignore\n const reachabilityData = await this.webex.boundedStorage\n .get(REACHABILITY.namespace, REACHABILITY.localStorage)\n .catch(() => {});\n\n if (reachabilityData) {\n try {\n const reachabilityResult = JSON.parse(reachabilityData);\n\n /* istanbul ignore else */\n if (reachabilityResult && Object.keys(reachabilityResult).length) {\n localSdp.reachability = reachabilityResult;\n }\n } catch (e) {\n LoggerProxy.logger.error(\n `Roap:request#attachReachabilityData --> Error in parsing reachability data: ${e}`\n );\n }\n }\n\n return localSdp;\n }\n\n /**\n * Sends a ROAP message\n * @param {Object} options\n * @param {Object} options.roapMessage\n * @param {String} options.locusSelfUrl\n * @param {String} options.mediaId\n * @param {String} options.correlationId\n * @param {Boolean} options.audioMuted\n * @param {Boolean} options.videoMuted\n * @param {String} options.meetingId\n * @param {Boolean} options.preferTranscoding\n * @returns {Promise} returns the response/failure of the request\n */\n sendRoap(options: {\n roapMessage: any;\n locusSelfUrl: string;\n mediaId: string;\n correlationId: string;\n audioMuted: boolean;\n videoMuted: boolean;\n meetingId: string;\n preferTranscoding?: boolean;\n }) {\n const {roapMessage, locusSelfUrl, mediaId, correlationId, meetingId} = options;\n\n if (!mediaId) {\n LoggerProxy.logger.info('Roap:request#sendRoap --> Race Condition /call mediaID not present');\n }\n\n const mediaUrl = `${locusSelfUrl}/${MEDIA}`;\n // @ts-ignore\n const deviceUrl = this.webex.internal.device.url;\n\n LoggerProxy.logger.info(\n `Roap:request#sendRoap --> ${mediaUrl} \\n ${roapMessage.messageType} \\n seq:${roapMessage.seq}`\n );\n\n Metrics.postEvent({event: eventType.MEDIA_REQUEST, meetingId});\n\n return this.attachRechabilityData({\n roapMessage,\n // eslint-disable-next-line no-warning-comments\n // TODO: check whats the need for video and audiomute\n audioMuted: !!options.audioMuted,\n videoMuted: !!options.videoMuted,\n }).then((sdpWithReachability) => {\n // @ts-ignore\n return this.webex\n .request({\n uri: mediaUrl,\n method: HTTP_VERBS.PUT,\n body: {\n device: {\n url: deviceUrl,\n // @ts-ignore\n deviceType: this.config.meetings.deviceType,\n },\n correlationId,\n localMedias: [\n {\n localSdp: JSON.stringify(sdpWithReachability),\n mediaId: options.mediaId,\n },\n ],\n clientMediaPreferences: {\n preferTranscoding: options.preferTranscoding ?? true,\n },\n },\n })\n .then((res) => {\n Metrics.postEvent({event: eventType.MEDIA_RESPONSE, meetingId});\n\n // always it will be the first mediaConnection Object\n const mediaConnections =\n res.body.mediaConnections &&\n res.body.mediaConnections.length > 0 &&\n res.body.mediaConnections[0];\n\n LoggerProxy.logger.debug(\n `Roap:request#sendRoap --> response:${JSON.stringify(\n mediaConnections,\n null,\n 2\n )}'\\n StatusCode:'${res.statusCode}`\n );\n const {locus} = res.body;\n\n locus.roapSeq = options.roapMessage.seq;\n\n return {\n locus,\n ...(mediaConnections && {mediaConnections: res.body.mediaConnections}),\n };\n })\n .catch((err) => {\n Metrics.postEvent({\n event: eventType.MEDIA_RESPONSE,\n meetingId,\n data: {error: Metrics.parseLocusError(err, true)},\n });\n LoggerProxy.logger.error(\n `Roap:request#sendRoap --> Error:${JSON.stringify(err, null, 2)}`\n );\n LoggerProxy.logger.error(\n `Roap:request#sendRoapRequest --> errorBody:${JSON.stringify(\n roapMessage,\n null,\n 2\n )} + '\\\\n mediaId:'${options.mediaId}`\n );\n throw err;\n });\n });\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"names":["RoapRequest","localSdp","webex","boundedStorage","get","REACHABILITY","namespace","localStorageResult","catch","reachabilityData","reachabilityResult","JSON","parse","length","reachability","e","LoggerProxy","logger","error","localStorageJoinCookie","joinCookieRaw","joinCookie","options","roapMessage","locusSelfUrl","mediaId","correlationId","meetingId","info","attachReachabilityData","audioMuted","videoMuted","localSdpWithReachabilityData","mediaUrl","MEDIA","deviceUrl","internal","device","url","messageType","seq","Metrics","postEvent","event","eventType","MEDIA_REQUEST","request","uri","method","HTTP_VERBS","PUT","body","deviceType","config","meetings","localMedias","clientMediaPreferences","preferTranscoding","then","res","MEDIA_RESPONSE","mediaConnections","debug","statusCode","locus","roapSeq","err","data","parseLocusError","StatelessWebexPlugin"],"sources":["request.ts"],"sourcesContent":["/* global window */\n// @ts-ignore\nimport {StatelessWebexPlugin} from '@webex/webex-core';\n\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport {MEDIA, HTTP_VERBS, REACHABILITY} from '../constants';\nimport Metrics from '../metrics';\nimport {eventType} from '../metrics/config';\n\n/**\n * @class RoapRequest\n */\nexport default class RoapRequest extends StatelessWebexPlugin {\n /**\n * Returns reachability data.\n * @param {Object} localSdp\n * @returns {Object}\n */\n async attachReachabilityData(localSdp) {\n let joinCookie;\n\n // @ts-ignore\n const reachabilityData = await this.webex.boundedStorage\n .get(REACHABILITY.namespace, REACHABILITY.localStorageResult)\n .catch(() => {});\n\n if (reachabilityData) {\n try {\n const reachabilityResult = JSON.parse(reachabilityData);\n\n /* istanbul ignore else */\n if (reachabilityResult && Object.keys(reachabilityResult).length) {\n localSdp.reachability = reachabilityResult;\n }\n } catch (e) {\n LoggerProxy.logger.error(\n `Roap:request#attachReachabilityData --> Error in parsing reachability data: ${e}`\n );\n }\n }\n\n // @ts-ignore\n const joinCookieRaw = await this.webex.boundedStorage\n .get(REACHABILITY.namespace, REACHABILITY.localStorageJoinCookie)\n .catch(() => {});\n\n if (joinCookieRaw) {\n try {\n joinCookie = JSON.parse(joinCookieRaw);\n } catch (e) {\n LoggerProxy.logger.error(\n `MeetingRequest#constructor --> Error in parsing join cookie data: ${e}`\n );\n }\n }\n\n return {localSdp, joinCookie};\n }\n\n /**\n * Sends a ROAP message\n * @param {Object} options\n * @param {Object} options.roapMessage\n * @param {String} options.locusSelfUrl\n * @param {String} options.mediaId\n * @param {String} options.correlationId\n * @param {Boolean} options.audioMuted\n * @param {Boolean} options.videoMuted\n * @param {String} options.meetingId\n * @param {Boolean} options.preferTranscoding\n * @returns {Promise} returns the response/failure of the request\n */\n async sendRoap(options: {\n roapMessage: any;\n locusSelfUrl: string;\n mediaId: string;\n correlationId: string;\n audioMuted: boolean;\n videoMuted: boolean;\n meetingId: string;\n preferTranscoding?: boolean;\n }) {\n const {roapMessage, locusSelfUrl, mediaId, correlationId, meetingId} = options;\n\n if (!mediaId) {\n LoggerProxy.logger.info('Roap:request#sendRoap --> Race Condition /call mediaID not present');\n }\n\n const {localSdp: localSdpWithReachabilityData, joinCookie} = await this.attachReachabilityData({\n roapMessage,\n // eslint-disable-next-line no-warning-comments\n // TODO: check whats the need for video and audiomute\n audioMuted: !!options.audioMuted,\n videoMuted: !!options.videoMuted,\n });\n\n const mediaUrl = `${locusSelfUrl}/${MEDIA}`;\n // @ts-ignore\n const deviceUrl = this.webex.internal.device.url;\n\n LoggerProxy.logger.info(\n `Roap:request#sendRoap --> ${mediaUrl} \\n ${roapMessage.messageType} \\n seq:${roapMessage.seq}`\n );\n\n Metrics.postEvent({event: eventType.MEDIA_REQUEST, meetingId});\n\n // @ts-ignore\n return this.request({\n uri: mediaUrl,\n method: HTTP_VERBS.PUT,\n body: {\n device: {\n url: deviceUrl,\n // @ts-ignore\n deviceType: this.config.meetings.deviceType,\n },\n correlationId,\n localMedias: [\n {\n localSdp: JSON.stringify(localSdpWithReachabilityData),\n mediaId: options.mediaId,\n },\n ],\n clientMediaPreferences: {\n preferTranscoding: options.preferTranscoding ?? true,\n joinCookie,\n },\n },\n })\n .then((res) => {\n Metrics.postEvent({event: eventType.MEDIA_RESPONSE, meetingId});\n\n // always it will be the first mediaConnection Object\n const mediaConnections =\n res.body.mediaConnections &&\n res.body.mediaConnections.length > 0 &&\n res.body.mediaConnections[0];\n\n LoggerProxy.logger.debug(\n `Roap:request#sendRoap --> response:${JSON.stringify(\n mediaConnections,\n null,\n 2\n )}'\\n StatusCode:'${res.statusCode}`\n );\n const {locus} = res.body;\n\n locus.roapSeq = options.roapMessage.seq;\n\n return {\n locus,\n ...(mediaConnections && {mediaConnections: res.body.mediaConnections}),\n };\n })\n .catch((err) => {\n Metrics.postEvent({\n event: eventType.MEDIA_RESPONSE,\n meetingId,\n data: {error: Metrics.parseLocusError(err, true)},\n });\n LoggerProxy.logger.error(`Roap:request#sendRoap --> Error:${JSON.stringify(err, null, 2)}`);\n LoggerProxy.logger.error(\n `Roap:request#sendRoapRequest --> errorBody:${JSON.stringify(\n roapMessage,\n null,\n 2\n )} + '\\\\n mediaId:'${options.mediaId}`\n );\n throw err;\n });\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Extended Error object to signify breakout related errors
3
+ */
4
+ export default class BreakoutEditLockedError extends Error {
5
+ code: any;
6
+ error: any;
7
+ sdkMessage: any;
8
+ /**
9
+ *
10
+ * @constructor
11
+ * @param {String} [message]
12
+ * @param {Object} [error]
13
+ */
14
+ constructor(message?: string, error?: any);
15
+ }
@@ -331,6 +331,11 @@ export declare const ERROR_DICTIONARY: {
331
331
  MESSAGE: string;
332
332
  CODE: number;
333
333
  };
334
+ BREAKOUT_EDIT: {
335
+ NAME: string;
336
+ MESSAGE: string;
337
+ CODE: number;
338
+ };
334
339
  };
335
340
  export declare const FLOOR_ACTION: {
336
341
  GRANTED: string;
@@ -407,6 +412,12 @@ export declare const BREAKOUTS: {
407
412
  REQUESTED: string;
408
413
  };
409
414
  BREAKOUTS_SUPPORTED: string;
415
+ ACTION_TYPES: {
416
+ DELETE: string;
417
+ };
418
+ ERROR_CODE: {
419
+ EDIT_LOCK_TOKEN_MISMATCH: number;
420
+ };
410
421
  };
411
422
  export declare const LOCUSINFO: {
412
423
  EVENTS: {
@@ -679,7 +690,8 @@ export declare const RESOURCE: {
679
690
  LOCI: string;
680
691
  };
681
692
  export declare const REACHABILITY: {
682
- localStorage: string;
693
+ localStorageResult: string;
694
+ localStorageJoinCookie: string;
683
695
  namespace: string;
684
696
  };
685
697
  export declare const ROAP: {
@@ -1,8 +1,9 @@
1
+ import { LocalCameraTrack, LocalMicrophoneTrack, LocalDisplayTrack } from '@webex/internal-media-core';
1
2
  /**
2
3
  * @class MediaProperties
3
4
  */
4
5
  export default class MediaProperties {
5
- audioTrack: any;
6
+ audioTrack: LocalMicrophoneTrack | null;
6
7
  localQualityLevel: any;
7
8
  mediaDirection: any;
8
9
  mediaSettings: any;
@@ -11,9 +12,9 @@ export default class MediaProperties {
11
12
  remoteQualityLevel: any;
12
13
  remoteShare: any;
13
14
  remoteVideoTrack: any;
14
- shareTrack: any;
15
+ shareTrack: LocalDisplayTrack | null;
15
16
  videoDeviceId: any;
16
- videoTrack: any;
17
+ videoTrack: LocalCameraTrack | null;
17
18
  namespace: string;
18
19
  /**
19
20
  * @param {Object} [options] -- to auto construct
@@ -28,10 +29,10 @@ export default class MediaProperties {
28
29
  setMediaDirection(mediaDirection: any): void;
29
30
  setMediaSettings(type: any, values: any): void;
30
31
  setMediaPeerConnection(mediaPeerConnection: any): void;
31
- setLocalVideoTrack(videoTrack: any): void;
32
- setLocalAudioTrack(audioTrack: any): void;
32
+ setLocalVideoTrack(videoTrack: LocalCameraTrack | null): void;
33
+ setLocalAudioTrack(audioTrack: LocalMicrophoneTrack | null): void;
33
34
  setLocalQualityLevel(localQualityLevel: any): void;
34
- setLocalShareTrack(shareTrack: any): void;
35
+ setLocalShareTrack(shareTrack: LocalDisplayTrack | null): void;
35
36
  setRemoteQualityLevel(remoteQualityLevel: any): void;
36
37
  setRemoteShare(remoteShare: any): void;
37
38
  /**
@@ -290,7 +290,6 @@ export default class Meeting extends StatelessWebexPlugin {
290
290
  destination: string;
291
291
  destinationType: string;
292
292
  deviceUrl: string;
293
- effects: any;
294
293
  hostId: string;
295
294
  id: string;
296
295
  isMultistream: boolean;
@@ -838,7 +837,7 @@ export default class Meeting extends StatelessWebexPlugin {
838
837
  private sendLocalMediaReadyEvent;
839
838
  /**
840
839
  * Sets the local audio track on the class and emits an event to the developer
841
- * @param {MediaStreamTrack} audioTrack
840
+ * @param {MediaStreamTrack} rawAudioTrack
842
841
  * @param {Boolean} emitEvent if true, a media ready event is emitted to the developer
843
842
  * @returns {undefined}
844
843
  * @private
@@ -847,7 +846,7 @@ export default class Meeting extends StatelessWebexPlugin {
847
846
  private setLocalAudioTrack;
848
847
  /**
849
848
  * Sets the local video track on the class and emits an event to the developer
850
- * @param {MediaStreamTrack} videoTrack
849
+ * @param {MediaStreamTrack} rawVideoTrack
851
850
  * @param {Boolean} emitEvent if true, a media ready event is emitted to the developer
852
851
  * @returns {undefined}
853
852
  * @private
@@ -864,12 +863,12 @@ export default class Meeting extends StatelessWebexPlugin {
864
863
  setLocalTracks(localStream: any): void;
865
864
  /**
866
865
  * Sets the local media stream on the class and emits an event to the developer
867
- * @param {MediaStreamTrack} localShareTrack the local media stream
866
+ * @param {MediaStreamTrack} rawLocalShareTrack the local share media track
868
867
  * @returns {undefined}
869
868
  * @public
870
869
  * @memberof Meeting
871
870
  */
872
- setLocalShareTrack(localShareTrack: MediaStreamTrack): void;
871
+ setLocalShareTrack(rawLocalShareTrack: MediaStreamTrack | null): void;
873
872
  /**
874
873
  * Closes the local stream from the class and emits an event to the developer
875
874
  * @returns {undefined}
@@ -1165,6 +1164,12 @@ export default class Meeting extends StatelessWebexPlugin {
1165
1164
  */
1166
1165
  setupStatsAnalyzerEventHandlers: () => void;
1167
1166
  getMediaConnectionDebugId(): string;
1167
+ /**
1168
+ * Creates a webrtc media connection
1169
+ *
1170
+ * @param {Object} turnServerInfo TURN server information
1171
+ * @returns {RoapMediaConnection | MultistreamRoapMediaConnection}
1172
+ */
1168
1173
  createMediaConnection(turnServerInfo: any): any;
1169
1174
  /**
1170
1175
  * Listens for an event emitted by eventEmitter and emits it from the meeting object
@@ -1532,8 +1537,7 @@ export default class Meeting extends StatelessWebexPlugin {
1532
1537
  private sendNetworkQualityEvent;
1533
1538
  /**
1534
1539
  * Handle logging the media
1535
- * @param {Object} audioTrack The audio track
1536
- * @param {Object} videoTrack The video track
1540
+ * @param {Object} mediaProperties
1537
1541
  * @private
1538
1542
  * @returns {undefined}
1539
1543
  */
@@ -1632,35 +1636,6 @@ export default class Meeting extends StatelessWebexPlugin {
1632
1636
  * @memberof Meeting
1633
1637
  */
1634
1638
  clearMeetingData: () => void;
1635
- /**
1636
- * Internal API to return status of BNR
1637
- * @returns {Boolean}
1638
- * @public
1639
- * @memberof Meeting
1640
- */
1641
- isBnrEnabled(): any;
1642
- /**
1643
- * Internal API to obtain BNR enabled MediaStream
1644
- * @returns {Promise<MediaStreamTrack>}
1645
- * @private
1646
- * @param {MedaiStreamTrack} audioTrack from updateAudio
1647
- * @memberof Meeting
1648
- */
1649
- private internal_enableBNR;
1650
- /**
1651
- * Enable the audio track with BNR for a meeting
1652
- * @returns {Promise} resolves the data from enable bnr or rejects if there is no audio or audio is muted
1653
- * @public
1654
- * @memberof Meeting
1655
- */
1656
- enableBNR(): any;
1657
- /**
1658
- * Disable the BNR for an audio track
1659
- * @returns {Promise} resolves the data from disable bnr or rejects if there is no audio set
1660
- * @public
1661
- * @memberof Meeting
1662
- */
1663
- disableBNR(): any;
1664
1639
  /**
1665
1640
  * starts keepAlives being sent
1666
1641
  * @returns {void}
@@ -5,7 +5,17 @@ import { SendReactionOptions, ToggleReactionsOptions } from './request.type';
5
5
  */
6
6
  export default class MeetingRequest extends StatelessWebexPlugin {
7
7
  changeVideoLayoutDebounced: any;
8
+ /**
9
+ * Constructor
10
+ * @param {Object} attrs
11
+ * @param {Object} options
12
+ */
8
13
  constructor(attrs: any, options: any);
14
+ /**
15
+ * Returns joinCookie from boundedStorage if present.
16
+ * @returns {Object} joinCookie
17
+ */
18
+ private getJoinCookie;
9
19
  /**
10
20
  * Make a network request to join a meeting
11
21
  * @param {Object} options
@@ -37,10 +37,6 @@ declare const BEHAVIORAL_METRICS: {
37
37
  INVALID_ICE_CANDIDATE: string;
38
38
  UPLOAD_LOGS_FAILURE: string;
39
39
  RECEIVE_TRANSCRIPTION_FAILURE: string;
40
- ENABLE_BNR_SUCCESS: string;
41
- ENABLE_BNR_FAILURE: string;
42
- DISABLE_BNR_SUCCESS: string;
43
- DISABLE_BNR_FAILURE: string;
44
40
  FETCH_MEETING_INFO_V1_SUCCESS: string;
45
41
  FETCH_MEETING_INFO_V1_FAILURE: string;
46
42
  ADHOC_MEETING_SUCCESS: string;
@@ -19,12 +19,14 @@ declare class ReachabilityRequest {
19
19
  */
20
20
  constructor(webex: object);
21
21
  /**
22
- * gets the cluster information
22
+ * Gets the cluster information
23
23
  *
24
- * @param {boolean} includeVideoMesh whether to include the video mesh clusters in the result or not
25
24
  * @returns {Promise}
26
25
  */
27
- getClusters: () => Promise<ClusterList>;
26
+ getClusters: () => Promise<{
27
+ clusters: ClusterList;
28
+ joinCookie: any;
29
+ }>;
28
30
  /**
29
31
  * gets remote SDP For Clusters
30
32
  * @param {Object} localSDPList localSDPs for the cluster
@@ -4,11 +4,14 @@ import { StatelessWebexPlugin } from '@webex/webex-core';
4
4
  */
5
5
  export default class RoapRequest extends StatelessWebexPlugin {
6
6
  /**
7
- * Joins a meeting via ROAP
7
+ * Returns reachability data.
8
8
  * @param {Object} localSdp
9
- * @returns {Promise} returns a promise that resolves/rejects whatever the request does
9
+ * @returns {Object}
10
10
  */
11
- attachRechabilityData(localSdp: any): Promise<any>;
11
+ attachReachabilityData(localSdp: any): Promise<{
12
+ localSdp: any;
13
+ joinCookie: any;
14
+ }>;
12
15
  /**
13
16
  * Sends a ROAP message
14
17
  * @param {Object} options
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@webex/plugin-meetings",
3
- "version": "3.0.0-beta.34",
3
+ "version": "3.0.0-beta.36",
4
4
  "description": "",
5
5
  "license": "Cisco EULA (https://www.cisco.com/c/en/us/products/end-user-license-agreement.html)",
6
6
  "contributors": [
@@ -32,12 +32,12 @@
32
32
  "build": "yarn run -T tsc --declaration true --declarationDir ./dist/types"
33
33
  },
34
34
  "devDependencies": {
35
- "@webex/plugin-meetings": "3.0.0-beta.34",
36
- "@webex/test-helper-chai": "3.0.0-beta.34",
37
- "@webex/test-helper-mocha": "3.0.0-beta.34",
38
- "@webex/test-helper-mock-webex": "3.0.0-beta.34",
39
- "@webex/test-helper-retry": "3.0.0-beta.34",
40
- "@webex/test-helper-test-users": "3.0.0-beta.34",
35
+ "@webex/plugin-meetings": "3.0.0-beta.36",
36
+ "@webex/test-helper-chai": "3.0.0-beta.36",
37
+ "@webex/test-helper-mocha": "3.0.0-beta.36",
38
+ "@webex/test-helper-mock-webex": "3.0.0-beta.36",
39
+ "@webex/test-helper-retry": "3.0.0-beta.36",
40
+ "@webex/test-helper-test-users": "3.0.0-beta.36",
41
41
  "chai": "^4.3.4",
42
42
  "chai-as-promised": "^7.1.1",
43
43
  "jsdom-global": "3.0.2",
@@ -46,18 +46,18 @@
46
46
  "typescript": "^4.7.4"
47
47
  },
48
48
  "dependencies": {
49
- "@webex/common": "3.0.0-beta.34",
50
- "@webex/internal-media-core": "1.35.0",
51
- "@webex/internal-plugin-conversation": "3.0.0-beta.34",
52
- "@webex/internal-plugin-device": "3.0.0-beta.34",
53
- "@webex/internal-plugin-llm": "3.0.0-beta.34",
54
- "@webex/internal-plugin-mercury": "3.0.0-beta.34",
55
- "@webex/internal-plugin-metrics": "3.0.0-beta.34",
56
- "@webex/internal-plugin-support": "3.0.0-beta.34",
57
- "@webex/internal-plugin-user": "3.0.0-beta.34",
58
- "@webex/plugin-people": "3.0.0-beta.34",
59
- "@webex/plugin-rooms": "3.0.0-beta.34",
60
- "@webex/webex-core": "3.0.0-beta.34",
49
+ "@webex/common": "3.0.0-beta.36",
50
+ "@webex/internal-media-core": "1.35.1",
51
+ "@webex/internal-plugin-conversation": "3.0.0-beta.36",
52
+ "@webex/internal-plugin-device": "3.0.0-beta.36",
53
+ "@webex/internal-plugin-llm": "3.0.0-beta.36",
54
+ "@webex/internal-plugin-mercury": "3.0.0-beta.36",
55
+ "@webex/internal-plugin-metrics": "3.0.0-beta.36",
56
+ "@webex/internal-plugin-support": "3.0.0-beta.36",
57
+ "@webex/internal-plugin-user": "3.0.0-beta.36",
58
+ "@webex/plugin-people": "3.0.0-beta.36",
59
+ "@webex/plugin-rooms": "3.0.0-beta.36",
60
+ "@webex/webex-core": "3.0.0-beta.36",
61
61
  "ampersand-collection": "^2.0.2",
62
62
  "bowser": "^2.11.0",
63
63
  "btoa": "^1.2.1",
@@ -119,8 +119,14 @@ breakout.remove(participant)
119
119
  // This can only be done when breakouts are inactive
120
120
  breakout.delete()
121
121
 
122
- // Create a breakout session
123
- breakouts.create(sessionName)
122
+ /*
123
+ Create breakout sessions, Type is array
124
+ Format: [{'name':'session1', "anyoneCanJoin" : true}]
125
+ */
126
+ breakouts.create(sessions)
127
+
128
+ // Delete all breakout sessions
129
+ breakouts.clearSessions()
124
130
 
125
131
  // Rename an existing breakout session
126
132
  breakout.rename(newSessionName)
@@ -0,0 +1,25 @@
1
+ import {ERROR_DICTIONARY} from '../constants';
2
+
3
+ /**
4
+ * Extended Error object to signify breakout related errors
5
+ */
6
+ export default class BreakoutEditLockedError extends Error {
7
+ code: any;
8
+ error: any;
9
+ sdkMessage: any;
10
+
11
+ /**
12
+ *
13
+ * @constructor
14
+ * @param {String} [message]
15
+ * @param {Object} [error]
16
+ */
17
+ constructor(message: string = ERROR_DICTIONARY.BREAKOUT_EDIT.MESSAGE, error: any = null) {
18
+ super(message);
19
+ this.name = ERROR_DICTIONARY.BREAKOUT_EDIT.NAME;
20
+ this.sdkMessage = ERROR_DICTIONARY.BREAKOUT_EDIT.MESSAGE;
21
+ this.error = error;
22
+ this.stack = error ? error.stack : new Error().stack;
23
+ this.code = ERROR_DICTIONARY.BREAKOUT_EDIT.CODE;
24
+ }
25
+ }
@@ -10,6 +10,7 @@ import {BREAKOUTS, HTTP_VERBS, MEETINGS} from '../constants';
10
10
  import Breakout from './breakout';
11
11
  import BreakoutCollection from './collection';
12
12
  import BreakoutRequest from './request';
13
+ import BreakoutEditLockedError from './edit-lock-error';
13
14
 
14
15
  /**
15
16
  * @class Breakouts
@@ -34,6 +35,7 @@ const Breakouts = WebexPlugin.extend({
34
35
  url: 'string', // appears from the moment you enable breakouts
35
36
  locusUrl: 'string', // the current locus url
36
37
  breakoutServiceUrl: 'string', // the current breakout resouce url
38
+ groups: 'array', // appears when create breakouts
37
39
  },
38
40
 
39
41
  children: {
@@ -348,6 +350,77 @@ const Breakouts = WebexPlugin.extend({
348
350
  },
349
351
  });
350
352
  },
353
+
354
+ /**
355
+ * Create new breakout sessions
356
+ * @param {object} sessions -- breakout session group
357
+ * @returns {Promise}
358
+ */
359
+ async create(sessions) {
360
+ // @ts-ignore
361
+ const breakInfo = await this.webex
362
+ .request({
363
+ method: HTTP_VERBS.PUT,
364
+ uri: this.url,
365
+ body: {
366
+ groups: [
367
+ {
368
+ sessions,
369
+ },
370
+ ],
371
+ },
372
+ })
373
+ .catch((error) => {
374
+ if (error.body && error.body.errorCode === BREAKOUTS.ERROR_CODE.EDIT_LOCK_TOKEN_MISMATCH) {
375
+ LoggerProxy.logger.info(`Breakouts#create --> Edit lock token mismatch`);
376
+
377
+ return Promise.reject(new BreakoutEditLockedError('Edit lock token mismatch', error));
378
+ }
379
+
380
+ return Promise.reject(error);
381
+ });
382
+
383
+ if (breakInfo.body && breakInfo.body.groups && breakInfo.body.groups) {
384
+ this.set('groups', breakInfo.body.groups);
385
+ }
386
+
387
+ return Promise.resolve(breakInfo);
388
+ },
389
+
390
+ /**
391
+ * Delete all breakout sessions
392
+ * @returns {Promise}
393
+ */
394
+ async clearSessions() {
395
+ // @ts-ignore
396
+ const breakInfo = await this.webex
397
+ .request({
398
+ method: HTTP_VERBS.PUT,
399
+ uri: this.url,
400
+ body: {
401
+ groups: [
402
+ {
403
+ action: BREAKOUTS.ACTION_TYPES.DELETE,
404
+ },
405
+ ],
406
+ },
407
+ })
408
+ .catch((error) => {
409
+ if (error.body && error.body.errorCode === BREAKOUTS.ERROR_CODE.EDIT_LOCK_TOKEN_MISMATCH) {
410
+ LoggerProxy.logger.info(`Breakouts#clearSessions --> Edit lock token mismatch`);
411
+
412
+ return Promise.reject(new BreakoutEditLockedError('Edit lock token mismatch', error));
413
+ }
414
+
415
+ return Promise.reject(error);
416
+ });
417
+
418
+ if (breakInfo.body && breakInfo.body.groups && breakInfo.body.groups) {
419
+ this.set('groups', breakInfo.body.groups);
420
+ }
421
+
422
+ return Promise.resolve(breakInfo);
423
+ },
351
424
  });
352
425
 
353
426
  export default Breakouts;
package/src/constants.ts CHANGED
@@ -452,6 +452,11 @@ export const ERROR_DICTIONARY = {
452
452
  MESSAGE: 'Captcha is required.',
453
453
  CODE: 8,
454
454
  },
455
+ BREAKOUT_EDIT: {
456
+ NAME: 'BreakoutEditLockedError',
457
+ MESSAGE: 'Edit lock token mismatch',
458
+ CODE: 9,
459
+ },
455
460
  };
456
461
 
457
462
  export const FLOOR_ACTION = {
@@ -538,6 +543,12 @@ export const BREAKOUTS = {
538
543
  REQUESTED: 'requested',
539
544
  },
540
545
  BREAKOUTS_SUPPORTED: 'BREAKOUTS_SUPPORTED',
546
+ ACTION_TYPES: {
547
+ DELETE: 'DELETE',
548
+ },
549
+ ERROR_CODE: {
550
+ EDIT_LOCK_TOKEN_MISMATCH: 201409024,
551
+ },
541
552
  };
542
553
 
543
554
  export const LOCUSINFO = {
@@ -854,7 +865,8 @@ export const RESOURCE = {
854
865
  };
855
866
 
856
867
  export const REACHABILITY = {
857
- localStorage: 'reachability.result',
868
+ localStorageResult: 'reachability.result',
869
+ localStorageJoinCookie: 'reachability.joinCookie',
858
870
  namespace: 'Reachability',
859
871
  };
860
872
 
@@ -3,7 +3,13 @@
3
3
  */
4
4
  /* globals navigator */
5
5
 
6
- import {RoapMediaConnection, MultistreamRoapMediaConnection} from '@webex/internal-media-core';
6
+ import {
7
+ LocalCameraTrack,
8
+ LocalDisplayTrack,
9
+ LocalMicrophoneTrack,
10
+ RoapMediaConnection,
11
+ MultistreamRoapMediaConnection,
12
+ } from '@webex/internal-media-core';
7
13
  import LoggerProxy from '../common/logs/logger-proxy';
8
14
  import {AUDIO_INPUT, VIDEO_INPUT, MEDIA_TRACK_CONSTRAINT} from '../constants';
9
15
  import Config from '../config';
@@ -43,22 +49,6 @@ const {isBrowser} = BrowserDetection();
43
49
  */
44
50
  const Media: any = {};
45
51
 
46
- /**
47
- * @param {boolean} enabled
48
- * @param {MediaStreamTrack} track
49
- * @returns {Boolean}
50
- * @public
51
- */
52
- Media.setLocalTrack = (enabled: boolean, track: MediaStreamTrack) => {
53
- if (track) {
54
- track.enabled = enabled;
55
-
56
- return true;
57
- }
58
-
59
- return false;
60
- };
61
-
62
52
  /**
63
53
  * format the media array for send
64
54
  * @param {String} mediaId
@@ -121,7 +111,7 @@ Media.getLocalMedia = (options: any, config: object) => {
121
111
  * @param {boolean} [options.enableRtx] applicable only to non-multistream connections
122
112
  * @param {boolean} [options.enableExtmap] applicable only to non-multistream connections
123
113
  * @param {Object} [options.turnServerInfo]
124
- * @returns {RoapMediaConnection}
114
+ * @returns {RoapMediaConnection | MultistreamRoapMediaConnection}
125
115
  */
126
116
  Media.createMediaConnection = (
127
117
  isMultistream: boolean,
@@ -133,9 +123,9 @@ Media.createMediaConnection = (
133
123
  receiveVideo: boolean;
134
124
  receiveShare: boolean;
135
125
  };
136
- audioTrack?: MediaStreamTrack;
137
- videoTrack?: MediaStreamTrack;
138
- shareTrack?: MediaStreamTrack;
126
+ audioTrack?: LocalMicrophoneTrack;
127
+ videoTrack?: LocalCameraTrack;
128
+ shareTrack?: LocalDisplayTrack;
139
129
  };
140
130
  remoteQualityLevel?: 'LOW' | 'MEDIUM' | 'HIGH';
141
131
  enableRtx?: boolean;
@@ -194,9 +184,9 @@ Media.createMediaConnection = (
194
184
  },
195
185
  {
196
186
  send: {
197
- audio: audioTrack,
198
- video: videoTrack,
199
- screenShareVideo: shareTrack,
187
+ audio: audioTrack?.underlyingTrack,
188
+ video: videoTrack?.underlyingTrack,
189
+ screenShareVideo: shareTrack?.underlyingTrack,
200
190
  },
201
191
  receive: {
202
192
  audio: mediaDirection.receiveAudio,