@webex/plugin-meetings 3.0.0-beta.72 → 3.0.0-beta.73

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 (43) hide show
  1. package/dist/breakouts/breakout.js +1 -1
  2. package/dist/breakouts/index.js +1 -1
  3. package/dist/constants.js +6 -2
  4. package/dist/constants.js.map +1 -1
  5. package/dist/meeting/in-meeting-actions.js +5 -1
  6. package/dist/meeting/in-meeting-actions.js.map +1 -1
  7. package/dist/meeting/index.js +3 -1
  8. package/dist/meeting/index.js.map +1 -1
  9. package/dist/meeting/util.js +6 -0
  10. package/dist/meeting/util.js.map +1 -1
  11. package/dist/members/index.js +23 -0
  12. package/dist/members/index.js.map +1 -1
  13. package/dist/members/request.js +19 -0
  14. package/dist/members/request.js.map +1 -1
  15. package/dist/members/util.js +33 -0
  16. package/dist/members/util.js.map +1 -1
  17. package/dist/multistream/mediaRequestManager.js +12 -1
  18. package/dist/multistream/mediaRequestManager.js.map +1 -1
  19. package/dist/reconnection-manager/index.js +2 -4
  20. package/dist/reconnection-manager/index.js.map +1 -1
  21. package/dist/types/constants.d.ts +3 -0
  22. package/dist/types/meeting/in-meeting-actions.d.ts +4 -0
  23. package/dist/types/members/index.d.ts +10 -0
  24. package/dist/types/members/request.d.ts +11 -0
  25. package/dist/types/multistream/mediaRequestManager.d.ts +6 -0
  26. package/package.json +18 -18
  27. package/src/constants.ts +3 -0
  28. package/src/meeting/in-meeting-actions.ts +8 -0
  29. package/src/meeting/index.ts +4 -0
  30. package/src/meeting/util.ts +5 -0
  31. package/src/members/index.ts +35 -0
  32. package/src/members/request.ts +20 -0
  33. package/src/members/util.ts +38 -0
  34. package/src/multistream/mediaRequestManager.ts +10 -1
  35. package/src/reconnection-manager/index.ts +6 -3
  36. package/test/unit/spec/meeting/in-meeting-actions.ts +6 -2
  37. package/test/unit/spec/meeting/index.js +11 -2
  38. package/test/unit/spec/meeting/utils.js +41 -9
  39. package/test/unit/spec/members/index.js +123 -15
  40. package/test/unit/spec/members/request.js +27 -1
  41. package/test/unit/spec/members/utils.js +54 -10
  42. package/test/unit/spec/multistream/mediaRequestManager.ts +36 -11
  43. package/test/unit/spec/reconnection-manager/index.js +8 -4
@@ -178,6 +178,22 @@ MembersUtil.generateLowerAllHandsMemberOptions = function (requestingParticipant
178
178
  locusUrl: locusUrl
179
179
  };
180
180
  };
181
+
182
+ /**
183
+ * @param {String} memberId id of the participant who is receiving request
184
+ * @param {String} requestingParticipantId id of the participant who is sending request (optional)
185
+ * @param {String} alias alias name
186
+ * @param {String} locusUrl url
187
+ * @returns {Object} consists of {memberID: string, requestingParticipantId: string, alias: string, locusUrl: string}
188
+ */
189
+ MembersUtil.generateEditDisplayNameMemberOptions = function (memberId, requestingParticipantId, alias, locusUrl) {
190
+ return {
191
+ memberId: memberId,
192
+ requestingParticipantId: requestingParticipantId,
193
+ alias: alias,
194
+ locusUrl: locusUrl
195
+ };
196
+ };
181
197
  MembersUtil.getMuteMemberRequestParams = function (options) {
182
198
  var property = options.isAudio === false ? 'video' : 'audio';
183
199
  var body = (0, _defineProperty2.default)({}, property, {
@@ -241,6 +257,23 @@ MembersUtil.getLowerAllHandsMemberRequestParams = function (options) {
241
257
  body: body
242
258
  };
243
259
  };
260
+
261
+ /**
262
+ * @param {Object} options with format of {locusUrl: string, requestingParticipantId: string}
263
+ * @returns {Object} request parameters (method, uri, body) needed to make a editDisplayName request
264
+ */
265
+ MembersUtil.editDisplayNameMemberRequestParams = function (options) {
266
+ var body = {
267
+ aliasValue: options.alias,
268
+ requestingParticipantId: options.requestingParticipantId
269
+ };
270
+ var uri = "".concat(options.locusUrl, "/").concat(_constants.PARTICIPANT, "/").concat(options.memberId, "/").concat(_constants.ALIAS);
271
+ return {
272
+ method: _constants.HTTP_VERBS.POST,
273
+ uri: uri,
274
+ body: body
275
+ };
276
+ };
244
277
  MembersUtil.getTransferHostToMemberRequestParams = function (options) {
245
278
  var body = {
246
279
  role: {
@@ -1 +1 @@
1
- {"version":3,"names":["MembersUtil","generateAddMemberOptions","invitee","locusUrl","alertIfActive","generateAdmitMemberOptions","memberIds","getAddMemberBody","options","invitees","address","emailAddress","email","phoneNumber","getAdmitMemberRequestBody","sessionLocusUrls","body","admit","participantIds","authorizingLocusUrl","getAdmitMemberRequestParams","format","baseUrl","mainLocusUrl","uri","CONTROLS","method","HTTP_VERBS","PUT","getAddMemberRequestParams","requestParams","isInvalidInvitee","DIALER_REGEX","E164_FORMAT","test","VALID_EMAIL_ADDRESS","getRemoveMemberRequestParams","reason","PARTICIPANT","memberId","LEAVE","generateTransferHostMemberOptions","transfer","moderator","generateRemoveMemberOptions","removal","_FORCED_","generateMuteMemberOptions","status","isAudio","muted","generateRaiseHandMemberOptions","raised","generateRoleAssignmentMemberOptions","roles","generateLowerAllHandsMemberOptions","requestingParticipantId","getMuteMemberRequestParams","property","PATCH","getRoleAssignmentMemberRequestParams","role","forEach","push","type","hasRole","getRaiseHandMemberRequestParams","hand","getLowerAllHandsMemberRequestParams","getTransferHostToMemberRequestParams","genderateSendDTMFOptions","url","tones","generateSendDTMFRequestParams","device","dtmf","correlationId","uuid","v4","direction","SEND_DTMF_ENDPOINT","POST","cancelPhoneInviteOptions","generateCancelInviteRequestParams","actionType","_REMOVE_"],"sources":["util.ts"],"sourcesContent":["import uuid from 'uuid';\nimport {\n HTTP_VERBS,\n CONTROLS,\n _FORCED_,\n LEAVE,\n PARTICIPANT,\n VALID_EMAIL_ADDRESS,\n DIALER_REGEX,\n SEND_DTMF_ENDPOINT,\n _REMOVE_,\n} from '../constants';\n\nimport {RoleAssignmentOptions, RoleAssignmentRequest, ServerRoleShape} from './types';\n\nconst MembersUtil: any = {};\n\n/**\n * @param {Object} invitee with emailAddress, email or phoneNumber\n * @param {String} locusUrl\n * @param {Boolean} alertIfActive\n * @returns {Object} the format object\n */\nMembersUtil.generateAddMemberOptions = (\n invitee: object,\n locusUrl: string,\n alertIfActive: boolean\n) => ({\n invitee,\n locusUrl,\n alertIfActive,\n});\n\n/**\n * @param {Array} memberIds\n * @param {String} locusUrl\n * @returns {Object} the format object\n */\nMembersUtil.generateAdmitMemberOptions = (memberIds: Array<any>, locusUrl: string) => ({\n locusUrl,\n memberIds,\n});\n\n/**\n * @param {Object} options with {invitee: {emailAddress, email, phoneNumber}, alertIfActive}\n * @returns {Object} with {invitees: [{address}], alertIfActive}\n */\nMembersUtil.getAddMemberBody = (options: any) => ({\n invitees: [\n {\n address: options.invitee.emailAddress || options.invitee.email || options.invitee.phoneNumber,\n },\n ],\n alertIfActive: options.alertIfActive,\n});\n\n/**\n * @param {Object} options with {memberIds, authorizingLocusUrl}\n * @returns {Object} admit with {memberIds}\n */\nMembersUtil.getAdmitMemberRequestBody = (options: any) => {\n const {memberIds, sessionLocusUrls} = options;\n const body: any = {admit: {participantIds: memberIds}};\n if (sessionLocusUrls) {\n const {authorizingLocusUrl} = sessionLocusUrls;\n\n return {authorizingLocusUrl, ...body};\n }\n\n return body;\n};\n\n/**\n * @param {Object} format with {memberIds, locusUrl, sessionLocusUrls}\n * @returns {Object} the request parameters (method, uri, body) needed to make a admitMember request\n * if a host/cohost is in a breakout session, the locus url should be the main session locus url\n */\nMembersUtil.getAdmitMemberRequestParams = (format: any) => {\n const body = MembersUtil.getAdmitMemberRequestBody(format);\n const {locusUrl, sessionLocusUrls} = format;\n const baseUrl = sessionLocusUrls?.mainLocusUrl || locusUrl;\n const uri = `${baseUrl}/${CONTROLS}`;\n\n return {\n method: HTTP_VERBS.PUT,\n uri,\n body,\n };\n};\n\n/**\n * @param {Object} format with {invitee {emailAddress, email, phoneNumber}, locusUrl, alertIfActive}\n * @returns {Object} the request parameters (method, uri, body) needed to make a addMember request\n */\nMembersUtil.getAddMemberRequestParams = (format: any) => {\n const body = MembersUtil.getAddMemberBody(format);\n const requestParams = {\n method: HTTP_VERBS.PUT,\n uri: format.locusUrl,\n body,\n };\n\n return requestParams;\n};\n\nMembersUtil.isInvalidInvitee = (invitee) => {\n if (!(invitee && (invitee.email || invitee.emailAddress || invitee.phoneNumber))) {\n return true;\n }\n\n if (invitee.phoneNumber) {\n return !DIALER_REGEX.E164_FORMAT.test(invitee.phoneNumber);\n }\n\n return !VALID_EMAIL_ADDRESS.test(invitee.email || invitee.emailAddress);\n};\n\nMembersUtil.getRemoveMemberRequestParams = (options) => {\n const body = {\n reason: options.reason,\n };\n const uri = `${options.locusUrl}/${PARTICIPANT}/${options.memberId}/${LEAVE}`;\n\n return {\n method: HTTP_VERBS.PUT,\n uri,\n body,\n };\n};\n\nMembersUtil.generateTransferHostMemberOptions = (transfer, moderator, locusUrl) => ({\n moderator,\n locusUrl,\n memberId: transfer,\n});\n\nMembersUtil.generateRemoveMemberOptions = (removal, locusUrl) => ({\n reason: _FORCED_,\n memberId: removal,\n locusUrl,\n});\n\nMembersUtil.generateMuteMemberOptions = (memberId, status, locusUrl, isAudio) => ({\n memberId,\n muted: status,\n locusUrl,\n isAudio,\n});\n\nMembersUtil.generateRaiseHandMemberOptions = (memberId, status, locusUrl) => ({\n memberId,\n raised: status,\n locusUrl,\n});\n\n/**\n * @param {String} memberId\n * @param {[ServerRoleShape]} roles\n * @param {String} locusUrl\n * @returns {RoleAssignmentOptions}\n */\nMembersUtil.generateRoleAssignmentMemberOptions = (\n memberId: string,\n roles: Array<ServerRoleShape>,\n locusUrl: string\n): RoleAssignmentOptions => ({\n memberId,\n roles,\n locusUrl,\n});\n\nMembersUtil.generateLowerAllHandsMemberOptions = (requestingParticipantId, locusUrl) => ({\n requestingParticipantId,\n locusUrl,\n});\n\nMembersUtil.getMuteMemberRequestParams = (options) => {\n const property = options.isAudio === false ? 'video' : 'audio';\n const body = {\n [property]: {\n muted: options.muted,\n },\n };\n const uri = `${options.locusUrl}/${PARTICIPANT}/${options.memberId}/${CONTROLS}`;\n\n return {\n method: HTTP_VERBS.PATCH,\n uri,\n body,\n };\n};\n\n/**\n * @param {RoleAssignmentOptions} options\n * @returns {RoleAssignmentRequest} the request parameters (method, uri, body) needed to make a addMember request\n */\nMembersUtil.getRoleAssignmentMemberRequestParams = (\n options: RoleAssignmentOptions\n): RoleAssignmentRequest => {\n const body = {role: {roles: []}};\n options.roles.forEach((role) => {\n body.role.roles.push({type: role.type, hasRole: role.hasRole});\n });\n\n const uri = `${options.locusUrl}/${PARTICIPANT}/${options.memberId}/${CONTROLS}`;\n\n return {\n method: HTTP_VERBS.PATCH,\n uri,\n body,\n };\n};\n\nMembersUtil.getRaiseHandMemberRequestParams = (options) => {\n const body = {\n hand: {\n raised: options.raised,\n },\n };\n const uri = `${options.locusUrl}/${PARTICIPANT}/${options.memberId}/${CONTROLS}`;\n\n return {\n method: HTTP_VERBS.PATCH,\n uri,\n body,\n };\n};\n\nMembersUtil.getLowerAllHandsMemberRequestParams = (options) => {\n const body = {\n hand: {\n raised: false,\n },\n requestingParticipantId: options.requestingParticipantId,\n };\n const uri = `${options.locusUrl}/${CONTROLS}`;\n\n return {\n method: HTTP_VERBS.PATCH,\n uri,\n body,\n };\n};\n\nMembersUtil.getTransferHostToMemberRequestParams = (options) => {\n const body = {\n role: {\n moderator: options.moderator,\n },\n };\n const uri = `${options.locusUrl}/${PARTICIPANT}/${options.memberId}/${CONTROLS}`;\n\n return {\n method: HTTP_VERBS.PATCH,\n uri,\n body,\n };\n};\n\nMembersUtil.genderateSendDTMFOptions = (url, tones, memberId, locusUrl) => ({\n url,\n tones,\n memberId,\n locusUrl,\n});\n\nMembersUtil.generateSendDTMFRequestParams = ({url, tones, memberId, locusUrl}) => {\n const body = {\n device: {\n url,\n },\n memberId,\n dtmf: {\n correlationId: uuid.v4(),\n tones,\n direction: 'transmit',\n },\n };\n const uri = `${locusUrl}/${PARTICIPANT}/${memberId}/${SEND_DTMF_ENDPOINT}`;\n\n return {\n method: HTTP_VERBS.POST,\n uri,\n body,\n };\n};\n\nMembersUtil.cancelPhoneInviteOptions = (invitee, locusUrl) => ({\n invitee,\n locusUrl,\n});\n\nMembersUtil.generateCancelInviteRequestParams = (options) => {\n const body = {\n actionType: _REMOVE_,\n invitees: [\n {\n address: options.invitee.phoneNumber,\n },\n ],\n };\n const requestParams = {\n method: HTTP_VERBS.PUT,\n uri: options.locusUrl,\n body,\n };\n\n return requestParams;\n};\n\nexport default MembersUtil;\n"],"mappings":";;;;;;;;;;;;;;AAAA;AACA;AAUsB;AAAA;AAItB,IAAMA,WAAgB,GAAG,CAAC,CAAC;;AAE3B;AACA;AACA;AACA;AACA;AACA;AACAA,WAAW,CAACC,wBAAwB,GAAG,UACrCC,OAAe,EACfC,QAAgB,EAChBC,aAAsB;EAAA,OAClB;IACJF,OAAO,EAAPA,OAAO;IACPC,QAAQ,EAARA,QAAQ;IACRC,aAAa,EAAbA;EACF,CAAC;AAAA,CAAC;;AAEF;AACA;AACA;AACA;AACA;AACAJ,WAAW,CAACK,0BAA0B,GAAG,UAACC,SAAqB,EAAEH,QAAgB;EAAA,OAAM;IACrFA,QAAQ,EAARA,QAAQ;IACRG,SAAS,EAATA;EACF,CAAC;AAAA,CAAC;;AAEF;AACA;AACA;AACA;AACAN,WAAW,CAACO,gBAAgB,GAAG,UAACC,OAAY;EAAA,OAAM;IAChDC,QAAQ,EAAE,CACR;MACEC,OAAO,EAAEF,OAAO,CAACN,OAAO,CAACS,YAAY,IAAIH,OAAO,CAACN,OAAO,CAACU,KAAK,IAAIJ,OAAO,CAACN,OAAO,CAACW;IACpF,CAAC,CACF;IACDT,aAAa,EAAEI,OAAO,CAACJ;EACzB,CAAC;AAAA,CAAC;;AAEF;AACA;AACA;AACA;AACAJ,WAAW,CAACc,yBAAyB,GAAG,UAACN,OAAY,EAAK;EACxD,IAAOF,SAAS,GAAsBE,OAAO,CAAtCF,SAAS;IAAES,gBAAgB,GAAIP,OAAO,CAA3BO,gBAAgB;EAClC,IAAMC,IAAS,GAAG;IAACC,KAAK,EAAE;MAACC,cAAc,EAAEZ;IAAS;EAAC,CAAC;EACtD,IAAIS,gBAAgB,EAAE;IACpB,IAAOI,mBAAmB,GAAIJ,gBAAgB,CAAvCI,mBAAmB;IAE1B;MAAQA,mBAAmB,EAAnBA;IAAmB,GAAKH,IAAI;EACtC;EAEA,OAAOA,IAAI;AACb,CAAC;;AAED;AACA;AACA;AACA;AACA;AACAhB,WAAW,CAACoB,2BAA2B,GAAG,UAACC,MAAW,EAAK;EACzD,IAAML,IAAI,GAAGhB,WAAW,CAACc,yBAAyB,CAACO,MAAM,CAAC;EAC1D,IAAOlB,QAAQ,GAAsBkB,MAAM,CAApClB,QAAQ;IAAEY,gBAAgB,GAAIM,MAAM,CAA1BN,gBAAgB;EACjC,IAAMO,OAAO,GAAG,CAAAP,gBAAgB,aAAhBA,gBAAgB,uBAAhBA,gBAAgB,CAAEQ,YAAY,KAAIpB,QAAQ;EAC1D,IAAMqB,GAAG,aAAMF,OAAO,cAAIG,mBAAQ,CAAE;EAEpC,OAAO;IACLC,MAAM,EAAEC,qBAAU,CAACC,GAAG;IACtBJ,GAAG,EAAHA,GAAG;IACHR,IAAI,EAAJA;EACF,CAAC;AACH,CAAC;;AAED;AACA;AACA;AACA;AACAhB,WAAW,CAAC6B,yBAAyB,GAAG,UAACR,MAAW,EAAK;EACvD,IAAML,IAAI,GAAGhB,WAAW,CAACO,gBAAgB,CAACc,MAAM,CAAC;EACjD,IAAMS,aAAa,GAAG;IACpBJ,MAAM,EAAEC,qBAAU,CAACC,GAAG;IACtBJ,GAAG,EAAEH,MAAM,CAAClB,QAAQ;IACpBa,IAAI,EAAJA;EACF,CAAC;EAED,OAAOc,aAAa;AACtB,CAAC;AAED9B,WAAW,CAAC+B,gBAAgB,GAAG,UAAC7B,OAAO,EAAK;EAC1C,IAAI,EAAEA,OAAO,KAAKA,OAAO,CAACU,KAAK,IAAIV,OAAO,CAACS,YAAY,IAAIT,OAAO,CAACW,WAAW,CAAC,CAAC,EAAE;IAChF,OAAO,IAAI;EACb;EAEA,IAAIX,OAAO,CAACW,WAAW,EAAE;IACvB,OAAO,CAACmB,uBAAY,CAACC,WAAW,CAACC,IAAI,CAAChC,OAAO,CAACW,WAAW,CAAC;EAC5D;EAEA,OAAO,CAACsB,8BAAmB,CAACD,IAAI,CAAChC,OAAO,CAACU,KAAK,IAAIV,OAAO,CAACS,YAAY,CAAC;AACzE,CAAC;AAEDX,WAAW,CAACoC,4BAA4B,GAAG,UAAC5B,OAAO,EAAK;EACtD,IAAMQ,IAAI,GAAG;IACXqB,MAAM,EAAE7B,OAAO,CAAC6B;EAClB,CAAC;EACD,IAAMb,GAAG,aAAMhB,OAAO,CAACL,QAAQ,cAAImC,sBAAW,cAAI9B,OAAO,CAAC+B,QAAQ,cAAIC,gBAAK,CAAE;EAE7E,OAAO;IACLd,MAAM,EAAEC,qBAAU,CAACC,GAAG;IACtBJ,GAAG,EAAHA,GAAG;IACHR,IAAI,EAAJA;EACF,CAAC;AACH,CAAC;AAEDhB,WAAW,CAACyC,iCAAiC,GAAG,UAACC,QAAQ,EAAEC,SAAS,EAAExC,QAAQ;EAAA,OAAM;IAClFwC,SAAS,EAATA,SAAS;IACTxC,QAAQ,EAARA,QAAQ;IACRoC,QAAQ,EAAEG;EACZ,CAAC;AAAA,CAAC;AAEF1C,WAAW,CAAC4C,2BAA2B,GAAG,UAACC,OAAO,EAAE1C,QAAQ;EAAA,OAAM;IAChEkC,MAAM,EAAES,mBAAQ;IAChBP,QAAQ,EAAEM,OAAO;IACjB1C,QAAQ,EAARA;EACF,CAAC;AAAA,CAAC;AAEFH,WAAW,CAAC+C,yBAAyB,GAAG,UAACR,QAAQ,EAAES,MAAM,EAAE7C,QAAQ,EAAE8C,OAAO;EAAA,OAAM;IAChFV,QAAQ,EAARA,QAAQ;IACRW,KAAK,EAAEF,MAAM;IACb7C,QAAQ,EAARA,QAAQ;IACR8C,OAAO,EAAPA;EACF,CAAC;AAAA,CAAC;AAEFjD,WAAW,CAACmD,8BAA8B,GAAG,UAACZ,QAAQ,EAAES,MAAM,EAAE7C,QAAQ;EAAA,OAAM;IAC5EoC,QAAQ,EAARA,QAAQ;IACRa,MAAM,EAAEJ,MAAM;IACd7C,QAAQ,EAARA;EACF,CAAC;AAAA,CAAC;;AAEF;AACA;AACA;AACA;AACA;AACA;AACAH,WAAW,CAACqD,mCAAmC,GAAG,UAChDd,QAAgB,EAChBe,KAA6B,EAC7BnD,QAAgB;EAAA,OACW;IAC3BoC,QAAQ,EAARA,QAAQ;IACRe,KAAK,EAALA,KAAK;IACLnD,QAAQ,EAARA;EACF,CAAC;AAAA,CAAC;AAEFH,WAAW,CAACuD,kCAAkC,GAAG,UAACC,uBAAuB,EAAErD,QAAQ;EAAA,OAAM;IACvFqD,uBAAuB,EAAvBA,uBAAuB;IACvBrD,QAAQ,EAARA;EACF,CAAC;AAAA,CAAC;AAEFH,WAAW,CAACyD,0BAA0B,GAAG,UAACjD,OAAO,EAAK;EACpD,IAAMkD,QAAQ,GAAGlD,OAAO,CAACyC,OAAO,KAAK,KAAK,GAAG,OAAO,GAAG,OAAO;EAC9D,IAAMjC,IAAI,qCACP0C,QAAQ,EAAG;IACVR,KAAK,EAAE1C,OAAO,CAAC0C;EACjB,CAAC,CACF;EACD,IAAM1B,GAAG,aAAMhB,OAAO,CAACL,QAAQ,cAAImC,sBAAW,cAAI9B,OAAO,CAAC+B,QAAQ,cAAId,mBAAQ,CAAE;EAEhF,OAAO;IACLC,MAAM,EAAEC,qBAAU,CAACgC,KAAK;IACxBnC,GAAG,EAAHA,GAAG;IACHR,IAAI,EAAJA;EACF,CAAC;AACH,CAAC;;AAED;AACA;AACA;AACA;AACAhB,WAAW,CAAC4D,oCAAoC,GAAG,UACjDpD,OAA8B,EACJ;EAC1B,IAAMQ,IAAI,GAAG;IAAC6C,IAAI,EAAE;MAACP,KAAK,EAAE;IAAE;EAAC,CAAC;EAChC9C,OAAO,CAAC8C,KAAK,CAACQ,OAAO,CAAC,UAACD,IAAI,EAAK;IAC9B7C,IAAI,CAAC6C,IAAI,CAACP,KAAK,CAACS,IAAI,CAAC;MAACC,IAAI,EAAEH,IAAI,CAACG,IAAI;MAAEC,OAAO,EAAEJ,IAAI,CAACI;IAAO,CAAC,CAAC;EAChE,CAAC,CAAC;EAEF,IAAMzC,GAAG,aAAMhB,OAAO,CAACL,QAAQ,cAAImC,sBAAW,cAAI9B,OAAO,CAAC+B,QAAQ,cAAId,mBAAQ,CAAE;EAEhF,OAAO;IACLC,MAAM,EAAEC,qBAAU,CAACgC,KAAK;IACxBnC,GAAG,EAAHA,GAAG;IACHR,IAAI,EAAJA;EACF,CAAC;AACH,CAAC;AAEDhB,WAAW,CAACkE,+BAA+B,GAAG,UAAC1D,OAAO,EAAK;EACzD,IAAMQ,IAAI,GAAG;IACXmD,IAAI,EAAE;MACJf,MAAM,EAAE5C,OAAO,CAAC4C;IAClB;EACF,CAAC;EACD,IAAM5B,GAAG,aAAMhB,OAAO,CAACL,QAAQ,cAAImC,sBAAW,cAAI9B,OAAO,CAAC+B,QAAQ,cAAId,mBAAQ,CAAE;EAEhF,OAAO;IACLC,MAAM,EAAEC,qBAAU,CAACgC,KAAK;IACxBnC,GAAG,EAAHA,GAAG;IACHR,IAAI,EAAJA;EACF,CAAC;AACH,CAAC;AAEDhB,WAAW,CAACoE,mCAAmC,GAAG,UAAC5D,OAAO,EAAK;EAC7D,IAAMQ,IAAI,GAAG;IACXmD,IAAI,EAAE;MACJf,MAAM,EAAE;IACV,CAAC;IACDI,uBAAuB,EAAEhD,OAAO,CAACgD;EACnC,CAAC;EACD,IAAMhC,GAAG,aAAMhB,OAAO,CAACL,QAAQ,cAAIsB,mBAAQ,CAAE;EAE7C,OAAO;IACLC,MAAM,EAAEC,qBAAU,CAACgC,KAAK;IACxBnC,GAAG,EAAHA,GAAG;IACHR,IAAI,EAAJA;EACF,CAAC;AACH,CAAC;AAEDhB,WAAW,CAACqE,oCAAoC,GAAG,UAAC7D,OAAO,EAAK;EAC9D,IAAMQ,IAAI,GAAG;IACX6C,IAAI,EAAE;MACJlB,SAAS,EAAEnC,OAAO,CAACmC;IACrB;EACF,CAAC;EACD,IAAMnB,GAAG,aAAMhB,OAAO,CAACL,QAAQ,cAAImC,sBAAW,cAAI9B,OAAO,CAAC+B,QAAQ,cAAId,mBAAQ,CAAE;EAEhF,OAAO;IACLC,MAAM,EAAEC,qBAAU,CAACgC,KAAK;IACxBnC,GAAG,EAAHA,GAAG;IACHR,IAAI,EAAJA;EACF,CAAC;AACH,CAAC;AAEDhB,WAAW,CAACsE,wBAAwB,GAAG,UAACC,GAAG,EAAEC,KAAK,EAAEjC,QAAQ,EAAEpC,QAAQ;EAAA,OAAM;IAC1EoE,GAAG,EAAHA,GAAG;IACHC,KAAK,EAALA,KAAK;IACLjC,QAAQ,EAARA,QAAQ;IACRpC,QAAQ,EAARA;EACF,CAAC;AAAA,CAAC;AAEFH,WAAW,CAACyE,6BAA6B,GAAG,gBAAsC;EAAA,IAApCF,GAAG,QAAHA,GAAG;IAAEC,KAAK,QAALA,KAAK;IAAEjC,QAAQ,QAARA,QAAQ;IAAEpC,QAAQ,QAARA,QAAQ;EAC1E,IAAMa,IAAI,GAAG;IACX0D,MAAM,EAAE;MACNH,GAAG,EAAHA;IACF,CAAC;IACDhC,QAAQ,EAARA,QAAQ;IACRoC,IAAI,EAAE;MACJC,aAAa,EAAEC,aAAI,CAACC,EAAE,EAAE;MACxBN,KAAK,EAALA,KAAK;MACLO,SAAS,EAAE;IACb;EACF,CAAC;EACD,IAAMvD,GAAG,aAAMrB,QAAQ,cAAImC,sBAAW,cAAIC,QAAQ,cAAIyC,6BAAkB,CAAE;EAE1E,OAAO;IACLtD,MAAM,EAAEC,qBAAU,CAACsD,IAAI;IACvBzD,GAAG,EAAHA,GAAG;IACHR,IAAI,EAAJA;EACF,CAAC;AACH,CAAC;AAEDhB,WAAW,CAACkF,wBAAwB,GAAG,UAAChF,OAAO,EAAEC,QAAQ;EAAA,OAAM;IAC7DD,OAAO,EAAPA,OAAO;IACPC,QAAQ,EAARA;EACF,CAAC;AAAA,CAAC;AAEFH,WAAW,CAACmF,iCAAiC,GAAG,UAAC3E,OAAO,EAAK;EAC3D,IAAMQ,IAAI,GAAG;IACXoE,UAAU,EAAEC,mBAAQ;IACpB5E,QAAQ,EAAE,CACR;MACEC,OAAO,EAAEF,OAAO,CAACN,OAAO,CAACW;IAC3B,CAAC;EAEL,CAAC;EACD,IAAMiB,aAAa,GAAG;IACpBJ,MAAM,EAAEC,qBAAU,CAACC,GAAG;IACtBJ,GAAG,EAAEhB,OAAO,CAACL,QAAQ;IACrBa,IAAI,EAAJA;EACF,CAAC;EAED,OAAOc,aAAa;AACtB,CAAC;AAAC,eAEa9B,WAAW;AAAA"}
1
+ {"version":3,"names":["MembersUtil","generateAddMemberOptions","invitee","locusUrl","alertIfActive","generateAdmitMemberOptions","memberIds","getAddMemberBody","options","invitees","address","emailAddress","email","phoneNumber","getAdmitMemberRequestBody","sessionLocusUrls","body","admit","participantIds","authorizingLocusUrl","getAdmitMemberRequestParams","format","baseUrl","mainLocusUrl","uri","CONTROLS","method","HTTP_VERBS","PUT","getAddMemberRequestParams","requestParams","isInvalidInvitee","DIALER_REGEX","E164_FORMAT","test","VALID_EMAIL_ADDRESS","getRemoveMemberRequestParams","reason","PARTICIPANT","memberId","LEAVE","generateTransferHostMemberOptions","transfer","moderator","generateRemoveMemberOptions","removal","_FORCED_","generateMuteMemberOptions","status","isAudio","muted","generateRaiseHandMemberOptions","raised","generateRoleAssignmentMemberOptions","roles","generateLowerAllHandsMemberOptions","requestingParticipantId","generateEditDisplayNameMemberOptions","alias","getMuteMemberRequestParams","property","PATCH","getRoleAssignmentMemberRequestParams","role","forEach","push","type","hasRole","getRaiseHandMemberRequestParams","hand","getLowerAllHandsMemberRequestParams","editDisplayNameMemberRequestParams","aliasValue","ALIAS","POST","getTransferHostToMemberRequestParams","genderateSendDTMFOptions","url","tones","generateSendDTMFRequestParams","device","dtmf","correlationId","uuid","v4","direction","SEND_DTMF_ENDPOINT","cancelPhoneInviteOptions","generateCancelInviteRequestParams","actionType","_REMOVE_"],"sources":["util.ts"],"sourcesContent":["import uuid from 'uuid';\nimport {\n HTTP_VERBS,\n CONTROLS,\n _FORCED_,\n LEAVE,\n PARTICIPANT,\n VALID_EMAIL_ADDRESS,\n DIALER_REGEX,\n SEND_DTMF_ENDPOINT,\n _REMOVE_,\n ALIAS,\n} from '../constants';\n\nimport {RoleAssignmentOptions, RoleAssignmentRequest, ServerRoleShape} from './types';\n\nconst MembersUtil: any = {};\n\n/**\n * @param {Object} invitee with emailAddress, email or phoneNumber\n * @param {String} locusUrl\n * @param {Boolean} alertIfActive\n * @returns {Object} the format object\n */\nMembersUtil.generateAddMemberOptions = (\n invitee: object,\n locusUrl: string,\n alertIfActive: boolean\n) => ({\n invitee,\n locusUrl,\n alertIfActive,\n});\n\n/**\n * @param {Array} memberIds\n * @param {String} locusUrl\n * @returns {Object} the format object\n */\nMembersUtil.generateAdmitMemberOptions = (memberIds: Array<any>, locusUrl: string) => ({\n locusUrl,\n memberIds,\n});\n\n/**\n * @param {Object} options with {invitee: {emailAddress, email, phoneNumber}, alertIfActive}\n * @returns {Object} with {invitees: [{address}], alertIfActive}\n */\nMembersUtil.getAddMemberBody = (options: any) => ({\n invitees: [\n {\n address: options.invitee.emailAddress || options.invitee.email || options.invitee.phoneNumber,\n },\n ],\n alertIfActive: options.alertIfActive,\n});\n\n/**\n * @param {Object} options with {memberIds, authorizingLocusUrl}\n * @returns {Object} admit with {memberIds}\n */\nMembersUtil.getAdmitMemberRequestBody = (options: any) => {\n const {memberIds, sessionLocusUrls} = options;\n const body: any = {admit: {participantIds: memberIds}};\n if (sessionLocusUrls) {\n const {authorizingLocusUrl} = sessionLocusUrls;\n\n return {authorizingLocusUrl, ...body};\n }\n\n return body;\n};\n\n/**\n * @param {Object} format with {memberIds, locusUrl, sessionLocusUrls}\n * @returns {Object} the request parameters (method, uri, body) needed to make a admitMember request\n * if a host/cohost is in a breakout session, the locus url should be the main session locus url\n */\nMembersUtil.getAdmitMemberRequestParams = (format: any) => {\n const body = MembersUtil.getAdmitMemberRequestBody(format);\n const {locusUrl, sessionLocusUrls} = format;\n const baseUrl = sessionLocusUrls?.mainLocusUrl || locusUrl;\n const uri = `${baseUrl}/${CONTROLS}`;\n\n return {\n method: HTTP_VERBS.PUT,\n uri,\n body,\n };\n};\n\n/**\n * @param {Object} format with {invitee {emailAddress, email, phoneNumber}, locusUrl, alertIfActive}\n * @returns {Object} the request parameters (method, uri, body) needed to make a addMember request\n */\nMembersUtil.getAddMemberRequestParams = (format: any) => {\n const body = MembersUtil.getAddMemberBody(format);\n const requestParams = {\n method: HTTP_VERBS.PUT,\n uri: format.locusUrl,\n body,\n };\n\n return requestParams;\n};\n\nMembersUtil.isInvalidInvitee = (invitee) => {\n if (!(invitee && (invitee.email || invitee.emailAddress || invitee.phoneNumber))) {\n return true;\n }\n\n if (invitee.phoneNumber) {\n return !DIALER_REGEX.E164_FORMAT.test(invitee.phoneNumber);\n }\n\n return !VALID_EMAIL_ADDRESS.test(invitee.email || invitee.emailAddress);\n};\n\nMembersUtil.getRemoveMemberRequestParams = (options) => {\n const body = {\n reason: options.reason,\n };\n const uri = `${options.locusUrl}/${PARTICIPANT}/${options.memberId}/${LEAVE}`;\n\n return {\n method: HTTP_VERBS.PUT,\n uri,\n body,\n };\n};\n\nMembersUtil.generateTransferHostMemberOptions = (transfer, moderator, locusUrl) => ({\n moderator,\n locusUrl,\n memberId: transfer,\n});\n\nMembersUtil.generateRemoveMemberOptions = (removal, locusUrl) => ({\n reason: _FORCED_,\n memberId: removal,\n locusUrl,\n});\n\nMembersUtil.generateMuteMemberOptions = (memberId, status, locusUrl, isAudio) => ({\n memberId,\n muted: status,\n locusUrl,\n isAudio,\n});\n\nMembersUtil.generateRaiseHandMemberOptions = (memberId, status, locusUrl) => ({\n memberId,\n raised: status,\n locusUrl,\n});\n\n/**\n * @param {String} memberId\n * @param {[ServerRoleShape]} roles\n * @param {String} locusUrl\n * @returns {RoleAssignmentOptions}\n */\nMembersUtil.generateRoleAssignmentMemberOptions = (\n memberId: string,\n roles: Array<ServerRoleShape>,\n locusUrl: string\n): RoleAssignmentOptions => ({\n memberId,\n roles,\n locusUrl,\n});\n\nMembersUtil.generateLowerAllHandsMemberOptions = (requestingParticipantId, locusUrl) => ({\n requestingParticipantId,\n locusUrl,\n});\n\n/**\n * @param {String} memberId id of the participant who is receiving request\n * @param {String} requestingParticipantId id of the participant who is sending request (optional)\n * @param {String} alias alias name\n * @param {String} locusUrl url\n * @returns {Object} consists of {memberID: string, requestingParticipantId: string, alias: string, locusUrl: string}\n */\nMembersUtil.generateEditDisplayNameMemberOptions = (\n memberId,\n requestingParticipantId,\n alias,\n locusUrl\n) => ({\n memberId,\n requestingParticipantId,\n alias,\n locusUrl,\n});\n\nMembersUtil.getMuteMemberRequestParams = (options) => {\n const property = options.isAudio === false ? 'video' : 'audio';\n const body = {\n [property]: {\n muted: options.muted,\n },\n };\n const uri = `${options.locusUrl}/${PARTICIPANT}/${options.memberId}/${CONTROLS}`;\n\n return {\n method: HTTP_VERBS.PATCH,\n uri,\n body,\n };\n};\n\n/**\n * @param {RoleAssignmentOptions} options\n * @returns {RoleAssignmentRequest} the request parameters (method, uri, body) needed to make a addMember request\n */\nMembersUtil.getRoleAssignmentMemberRequestParams = (\n options: RoleAssignmentOptions\n): RoleAssignmentRequest => {\n const body = {role: {roles: []}};\n options.roles.forEach((role) => {\n body.role.roles.push({type: role.type, hasRole: role.hasRole});\n });\n\n const uri = `${options.locusUrl}/${PARTICIPANT}/${options.memberId}/${CONTROLS}`;\n\n return {\n method: HTTP_VERBS.PATCH,\n uri,\n body,\n };\n};\n\nMembersUtil.getRaiseHandMemberRequestParams = (options) => {\n const body = {\n hand: {\n raised: options.raised,\n },\n };\n const uri = `${options.locusUrl}/${PARTICIPANT}/${options.memberId}/${CONTROLS}`;\n\n return {\n method: HTTP_VERBS.PATCH,\n uri,\n body,\n };\n};\n\nMembersUtil.getLowerAllHandsMemberRequestParams = (options) => {\n const body = {\n hand: {\n raised: false,\n },\n requestingParticipantId: options.requestingParticipantId,\n };\n const uri = `${options.locusUrl}/${CONTROLS}`;\n\n return {\n method: HTTP_VERBS.PATCH,\n uri,\n body,\n };\n};\n\n/**\n * @param {Object} options with format of {locusUrl: string, requestingParticipantId: string}\n * @returns {Object} request parameters (method, uri, body) needed to make a editDisplayName request\n */\nMembersUtil.editDisplayNameMemberRequestParams = (options) => {\n const body = {\n aliasValue: options.alias,\n requestingParticipantId: options.requestingParticipantId,\n };\n const uri = `${options.locusUrl}/${PARTICIPANT}/${options.memberId}/${ALIAS}`;\n\n return {\n method: HTTP_VERBS.POST,\n uri,\n body,\n };\n};\n\nMembersUtil.getTransferHostToMemberRequestParams = (options) => {\n const body = {\n role: {\n moderator: options.moderator,\n },\n };\n const uri = `${options.locusUrl}/${PARTICIPANT}/${options.memberId}/${CONTROLS}`;\n\n return {\n method: HTTP_VERBS.PATCH,\n uri,\n body,\n };\n};\n\nMembersUtil.genderateSendDTMFOptions = (url, tones, memberId, locusUrl) => ({\n url,\n tones,\n memberId,\n locusUrl,\n});\n\nMembersUtil.generateSendDTMFRequestParams = ({url, tones, memberId, locusUrl}) => {\n const body = {\n device: {\n url,\n },\n memberId,\n dtmf: {\n correlationId: uuid.v4(),\n tones,\n direction: 'transmit',\n },\n };\n const uri = `${locusUrl}/${PARTICIPANT}/${memberId}/${SEND_DTMF_ENDPOINT}`;\n\n return {\n method: HTTP_VERBS.POST,\n uri,\n body,\n };\n};\n\nMembersUtil.cancelPhoneInviteOptions = (invitee, locusUrl) => ({\n invitee,\n locusUrl,\n});\n\nMembersUtil.generateCancelInviteRequestParams = (options) => {\n const body = {\n actionType: _REMOVE_,\n invitees: [\n {\n address: options.invitee.phoneNumber,\n },\n ],\n };\n const requestParams = {\n method: HTTP_VERBS.PUT,\n uri: options.locusUrl,\n body,\n };\n\n return requestParams;\n};\n\nexport default MembersUtil;\n"],"mappings":"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"}
@@ -121,6 +121,17 @@ var MediaRequestManager = /*#__PURE__*/function () {
121
121
  return _this2.isEqual(req, newRequests[idx]);
122
122
  });
123
123
  }
124
+
125
+ /**
126
+ * Clears the previous media requests.
127
+ *
128
+ * @returns {void}
129
+ */
130
+ }, {
131
+ key: "clearPreviousRequests",
132
+ value: function clearPreviousRequests() {
133
+ this.previousWCMEMediaRequests = [];
134
+ }
124
135
  }, {
125
136
  key: "sendRequests",
126
137
  value: function sendRequests() {
@@ -135,7 +146,7 @@ var MediaRequestManager = /*#__PURE__*/function () {
135
146
  }), maxPayloadBitsPerSecond, mr.codecInfo && [new _internalMediaCore.CodecInfo(0x80, new _internalMediaCore.H264Codec(mr.codecInfo.maxFs, mr.codecInfo.maxFps || CODEC_DEFAULTS.h264.maxFps, mr.codecInfo.maxMbps || CODEC_DEFAULTS.h264.maxMbps, mr.codecInfo.maxWidth, mr.codecInfo.maxHeight))]));
136
147
  });
137
148
 
138
- //! IMPORTANT: this is only a temporary fix. This will soon be done in the jmp layer (@webex/jmp-multistream)
149
+ //! IMPORTANT: this is only a temporary fix. This will soon be done in the jmp layer (@webex/json-multistream)
139
150
  // https://jira-eng-gpk2.cisco.com/jira/browse/WEBEX-326713
140
151
  if (!this.checkIsNewRequestsEqualToPrev(wcmeMediaRequests)) {
141
152
  this.sendMediaRequestsCallback(wcmeMediaRequests);
@@ -1 +1 @@
1
- {"version":3,"names":["CODEC_DEFAULTS","h264","maxFs","maxFps","maxMbps","DEBOUNCED_SOURCE_UPDATE_TIME","MediaRequestManager","degradationPreferences","sendMediaRequestsCallback","counter","clientRequests","sourceUpdateListener","commit","bind","debouncedSourceUpdateListener","sendRequests","maxFsLimits","getMaxFs","totalMacroblocksRequested","forEach","id","mr","codecInfo","Math","min","preferredMaxFs","i","slotsWithLiveSource","receiveSlots","filter","rs","sourceState","length","maxMacroblocksLimit","LoggerProxy","logger","warn","mediaRequestA","mediaRequestB","_toJmpScrRequest","newRequests","previousWCMEMediaRequests","every","req","idx","isEqual","wcmeMediaRequests","getDegradedClientRequests","maxPayloadBitsPerSecond","push","WcmeMediaRequest","policyInfo","policy","Policy","ActiveSpeaker","ReceiverSelected","ActiveSpeakerInfo","priority","crossPriorityDuplication","crossPolicyDuplication","preferLiveVideo","ReceiverSelectedInfo","csi","map","receiveSlot","wcmeReceiveSlot","WcmeCodecInfo","H264Codec","maxWidth","maxHeight","checkIsNewRequestsEqualToPrev","info","mediaRequest","newId","on","ReceiveSlotEvents","SourceUpdate","MaxFsUpdate","requestId","off"],"sources":["mediaRequestManager.ts"],"sourcesContent":["/* eslint-disable require-jsdoc */\nimport {\n MediaRequest as WcmeMediaRequest,\n Policy,\n ActiveSpeakerInfo,\n ReceiverSelectedInfo,\n CodecInfo as WcmeCodecInfo,\n H264Codec,\n} from '@webex/internal-media-core';\nimport {cloneDeep, debounce, isEmpty} from 'lodash';\n\nimport LoggerProxy from '../common/logs/logger-proxy';\n\nimport {ReceiveSlot, ReceiveSlotEvents} from './receiveSlot';\nimport {getMaxFs} from './remoteMedia';\n\nexport interface ActiveSpeakerPolicyInfo {\n policy: 'active-speaker';\n priority: number;\n crossPriorityDuplication: boolean;\n crossPolicyDuplication: boolean;\n preferLiveVideo: boolean;\n}\n\nexport interface ReceiverSelectedPolicyInfo {\n policy: 'receiver-selected';\n csi: number;\n}\n\nexport type PolicyInfo = ActiveSpeakerPolicyInfo | ReceiverSelectedPolicyInfo;\n\nexport interface H264CodecInfo {\n codec: 'h264';\n maxFs?: number;\n maxFps?: number;\n maxMbps?: number;\n maxWidth?: number;\n maxHeight?: number;\n}\n\nexport type CodecInfo = H264CodecInfo; // we'll add AV1 here in the future when it's available\n\nexport interface MediaRequest {\n policyInfo: PolicyInfo;\n receiveSlots: Array<ReceiveSlot>;\n codecInfo?: CodecInfo;\n preferredMaxFs?: number;\n}\n\nexport type MediaRequestId = string;\n\nconst CODEC_DEFAULTS = {\n h264: {\n maxFs: 8192,\n maxFps: 3000,\n maxMbps: 245760,\n },\n};\n\nconst DEBOUNCED_SOURCE_UPDATE_TIME = 1000;\n\ntype DegradationPreferences = {\n maxMacroblocksLimit: number;\n};\n\ntype SendMediaRequestsCallback = (mediaRequests: WcmeMediaRequest[]) => void;\n\nexport class MediaRequestManager {\n private sendMediaRequestsCallback: SendMediaRequestsCallback;\n\n private counter: number;\n\n private clientRequests: {[key: MediaRequestId]: MediaRequest};\n\n private degradationPreferences: DegradationPreferences;\n\n private sourceUpdateListener: () => void;\n\n private debouncedSourceUpdateListener: () => void;\n\n private previousWCMEMediaRequests: Array<WcmeMediaRequest> = [];\n\n constructor(\n degradationPreferences: DegradationPreferences,\n sendMediaRequestsCallback: SendMediaRequestsCallback\n ) {\n this.sendMediaRequestsCallback = sendMediaRequestsCallback;\n this.counter = 0;\n this.clientRequests = {};\n this.degradationPreferences = degradationPreferences;\n this.sourceUpdateListener = this.commit.bind(this);\n this.debouncedSourceUpdateListener = debounce(\n this.sourceUpdateListener,\n DEBOUNCED_SOURCE_UPDATE_TIME\n );\n }\n\n public setDegradationPreferences(degradationPreferences: DegradationPreferences) {\n this.degradationPreferences = degradationPreferences;\n this.sendRequests(); // re-send requests after preferences are set\n }\n\n private getDegradedClientRequests() {\n const clientRequests = cloneDeep(this.clientRequests);\n const maxFsLimits = [\n getMaxFs('best'),\n getMaxFs('large'),\n getMaxFs('medium'),\n getMaxFs('small'),\n getMaxFs('very small'),\n getMaxFs('thumbnail'),\n ];\n\n // reduce max-fs until total macroblocks is below limit\n for (let i = 0; i < maxFsLimits.length; i += 1) {\n let totalMacroblocksRequested = 0;\n Object.entries(clientRequests).forEach(([id, mr]) => {\n if (mr.codecInfo) {\n mr.codecInfo.maxFs = Math.min(\n mr.preferredMaxFs || CODEC_DEFAULTS.h264.maxFs,\n mr.codecInfo.maxFs || CODEC_DEFAULTS.h264.maxFs,\n maxFsLimits[i]\n );\n // we only consider sources with \"live\" state\n const slotsWithLiveSource = this.clientRequests[id].receiveSlots.filter(\n (rs) => rs.sourceState === 'live'\n );\n totalMacroblocksRequested += mr.codecInfo.maxFs * slotsWithLiveSource.length;\n }\n });\n if (totalMacroblocksRequested <= this.degradationPreferences.maxMacroblocksLimit) {\n if (i !== 0) {\n LoggerProxy.logger.warn(\n `multistream:mediaRequestManager --> too many streams with high max-fs, frame size will be limited to ${maxFsLimits[i]}`\n );\n }\n break;\n } else if (i === maxFsLimits.length - 1) {\n LoggerProxy.logger.warn(\n `multistream:mediaRequestManager --> even with frame size limited to ${maxFsLimits[i]} you are still requesting too many streams, consider reducing the number of requests`\n );\n }\n }\n\n return clientRequests;\n }\n\n /**\n * Returns true if two media requests are the same, false otherwise.\n *\n * @param {WcmeMediaRequest} mediaRequestA - Media request A for comparison.\n * @param {WcmeMediaRequest} mediaRequestB - Media request B for comparison.\n * @returns {boolean} - Whether they are equal.\n */\n // eslint-disable-next-line class-methods-use-this\n public isEqual(mediaRequestA: WcmeMediaRequest, mediaRequestB: WcmeMediaRequest) {\n return (\n JSON.stringify(mediaRequestA._toJmpScrRequest()) ===\n JSON.stringify(mediaRequestB._toJmpScrRequest())\n );\n }\n\n /**\n * Compares new media requests to previous ones and determines\n * if they are the same.\n *\n * @param {WcmeMediaRequest[]} newRequests - Array with new requests.\n * @returns {boolean} - True if they are equal, false otherwise.\n */\n private checkIsNewRequestsEqualToPrev(newRequests: WcmeMediaRequest[]) {\n return (\n !isEmpty(this.previousWCMEMediaRequests) &&\n this.previousWCMEMediaRequests.length === newRequests.length &&\n this.previousWCMEMediaRequests.every((req, idx) => this.isEqual(req, newRequests[idx]))\n );\n }\n\n private sendRequests() {\n const wcmeMediaRequests: WcmeMediaRequest[] = [];\n\n const clientRequests = this.getDegradedClientRequests();\n const maxPayloadBitsPerSecond = 10 * 1000 * 1000;\n\n // map all the client media requests to wcme media requests\n Object.values(clientRequests).forEach((mr) => {\n wcmeMediaRequests.push(\n new WcmeMediaRequest(\n mr.policyInfo.policy === 'active-speaker'\n ? Policy.ActiveSpeaker\n : Policy.ReceiverSelected,\n mr.policyInfo.policy === 'active-speaker'\n ? new ActiveSpeakerInfo(\n mr.policyInfo.priority,\n mr.policyInfo.crossPriorityDuplication,\n mr.policyInfo.crossPolicyDuplication,\n mr.policyInfo.preferLiveVideo\n )\n : new ReceiverSelectedInfo(mr.policyInfo.csi),\n mr.receiveSlots.map((receiveSlot) => receiveSlot.wcmeReceiveSlot),\n maxPayloadBitsPerSecond,\n mr.codecInfo && [\n new WcmeCodecInfo(\n 0x80,\n new H264Codec(\n mr.codecInfo.maxFs,\n mr.codecInfo.maxFps || CODEC_DEFAULTS.h264.maxFps,\n mr.codecInfo.maxMbps || CODEC_DEFAULTS.h264.maxMbps,\n mr.codecInfo.maxWidth,\n mr.codecInfo.maxHeight\n )\n ),\n ]\n )\n );\n });\n\n //! IMPORTANT: this is only a temporary fix. This will soon be done in the jmp layer (@webex/jmp-multistream)\n // https://jira-eng-gpk2.cisco.com/jira/browse/WEBEX-326713\n if (!this.checkIsNewRequestsEqualToPrev(wcmeMediaRequests)) {\n this.sendMediaRequestsCallback(wcmeMediaRequests);\n this.previousWCMEMediaRequests = wcmeMediaRequests;\n LoggerProxy.logger.info(`multistream:sendRequests --> media requests sent. `);\n } else {\n LoggerProxy.logger.info(\n `multistream:sendRequests --> detected duplicate WCME requests, skipping them... `\n );\n }\n }\n\n public addRequest(mediaRequest: MediaRequest, commit = true): MediaRequestId {\n // eslint-disable-next-line no-plusplus\n const newId = `${this.counter++}`;\n\n this.clientRequests[newId] = mediaRequest;\n\n mediaRequest.receiveSlots.forEach((rs) => {\n rs.on(ReceiveSlotEvents.SourceUpdate, this.sourceUpdateListener);\n rs.on(ReceiveSlotEvents.MaxFsUpdate, ({maxFs}) => {\n mediaRequest.preferredMaxFs = maxFs;\n this.debouncedSourceUpdateListener();\n });\n });\n\n if (commit) {\n this.commit();\n }\n\n return newId;\n }\n\n public cancelRequest(requestId: MediaRequestId, commit = true) {\n this.clientRequests[requestId]?.receiveSlots.forEach((rs) => {\n rs.off(ReceiveSlotEvents.SourceUpdate, this.sourceUpdateListener);\n });\n\n delete this.clientRequests[requestId];\n\n if (commit) {\n this.commit();\n }\n }\n\n public commit() {\n return this.sendRequests();\n }\n\n public reset() {\n this.clientRequests = {};\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AACA;AAUA;AAEA;AACA;AAdA;;AAmDA,IAAMA,cAAc,GAAG;EACrBC,IAAI,EAAE;IACJC,KAAK,EAAE,IAAI;IACXC,MAAM,EAAE,IAAI;IACZC,OAAO,EAAE;EACX;AACF,CAAC;AAED,IAAMC,4BAA4B,GAAG,IAAI;AAAC,IAQ7BC,mBAAmB;EAe9B,6BACEC,sBAA8C,EAC9CC,yBAAoD,EACpD;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA,iEAL2D,EAAE;IAM7D,IAAI,CAACA,yBAAyB,GAAGA,yBAAyB;IAC1D,IAAI,CAACC,OAAO,GAAG,CAAC;IAChB,IAAI,CAACC,cAAc,GAAG,CAAC,CAAC;IACxB,IAAI,CAACH,sBAAsB,GAAGA,sBAAsB;IACpD,IAAI,CAACI,oBAAoB,GAAG,IAAI,CAACC,MAAM,CAACC,IAAI,CAAC,IAAI,CAAC;IAClD,IAAI,CAACC,6BAA6B,GAAG,wBACnC,IAAI,CAACH,oBAAoB,EACzBN,4BAA4B,CAC7B;EACH;EAAC;IAAA;IAAA,OAED,mCAAiCE,sBAA8C,EAAE;MAC/E,IAAI,CAACA,sBAAsB,GAAGA,sBAAsB;MACpD,IAAI,CAACQ,YAAY,EAAE,CAAC,CAAC;IACvB;EAAC;IAAA;IAAA,OAED,qCAAoC;MAAA;MAClC,IAAML,cAAc,GAAG,yBAAU,IAAI,CAACA,cAAc,CAAC;MACrD,IAAMM,WAAW,GAAG,CAClB,IAAAC,qBAAQ,EAAC,MAAM,CAAC,EAChB,IAAAA,qBAAQ,EAAC,OAAO,CAAC,EACjB,IAAAA,qBAAQ,EAAC,QAAQ,CAAC,EAClB,IAAAA,qBAAQ,EAAC,OAAO,CAAC,EACjB,IAAAA,qBAAQ,EAAC,YAAY,CAAC,EACtB,IAAAA,qBAAQ,EAAC,WAAW,CAAC,CACtB;;MAED;MAAA,8BACgD;QAC9C,IAAIC,yBAAyB,GAAG,CAAC;QACjC,sBAAeR,cAAc,CAAC,CAACS,OAAO,CAAC,gBAAc;UAAA;YAAZC,EAAE;YAAEC,EAAE;UAC7C,IAAIA,EAAE,CAACC,SAAS,EAAE;YAChBD,EAAE,CAACC,SAAS,CAACpB,KAAK,GAAGqB,IAAI,CAACC,GAAG,CAC3BH,EAAE,CAACI,cAAc,IAAIzB,cAAc,CAACC,IAAI,CAACC,KAAK,EAC9CmB,EAAE,CAACC,SAAS,CAACpB,KAAK,IAAIF,cAAc,CAACC,IAAI,CAACC,KAAK,EAC/Cc,WAAW,CAACU,CAAC,CAAC,CACf;YACD;YACA,IAAMC,mBAAmB,GAAG,KAAI,CAACjB,cAAc,CAACU,EAAE,CAAC,CAACQ,YAAY,CAACC,MAAM,CACrE,UAACC,EAAE;cAAA,OAAKA,EAAE,CAACC,WAAW,KAAK,MAAM;YAAA,EAClC;YACDb,yBAAyB,IAAIG,EAAE,CAACC,SAAS,CAACpB,KAAK,GAAGyB,mBAAmB,CAACK,MAAM;UAC9E;QACF,CAAC,CAAC;QACF,IAAId,yBAAyB,IAAI,KAAI,CAACX,sBAAsB,CAAC0B,mBAAmB,EAAE;UAChF,IAAIP,CAAC,KAAK,CAAC,EAAE;YACXQ,oBAAW,CAACC,MAAM,CAACC,IAAI,gHACmFpB,WAAW,CAACU,CAAC,CAAC,EACvH;UACH;UAAC;QAEH,CAAC,MAAM,IAAIA,CAAC,KAAKV,WAAW,CAACgB,MAAM,GAAG,CAAC,EAAE;UACvCE,oBAAW,CAACC,MAAM,CAACC,IAAI,+EACkDpB,WAAW,CAACU,CAAC,CAAC,0FACtF;QACH;MACF,CAAC;MA5BD,KAAK,IAAIA,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGV,WAAW,CAACgB,MAAM,EAAEN,CAAC,IAAI,CAAC;QAAA;QAAA,sBAsB1C;MAAM;MAQV,OAAOhB,cAAc;IACvB;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;IACE;EAAA;IAAA;IAAA,OACA,iBAAe2B,aAA+B,EAAEC,aAA+B,EAAE;MAC/E,OACE,wBAAeD,aAAa,CAACE,gBAAgB,EAAE,CAAC,KAChD,wBAAeD,aAAa,CAACC,gBAAgB,EAAE,CAAC;IAEpD;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;EANE;IAAA;IAAA,OAOA,uCAAsCC,WAA+B,EAAE;MAAA;MACrE,OACE,CAAC,uBAAQ,IAAI,CAACC,yBAAyB,CAAC,IACxC,IAAI,CAACA,yBAAyB,CAACT,MAAM,KAAKQ,WAAW,CAACR,MAAM,IAC5D,IAAI,CAACS,yBAAyB,CAACC,KAAK,CAAC,UAACC,GAAG,EAAEC,GAAG;QAAA,OAAK,MAAI,CAACC,OAAO,CAACF,GAAG,EAAEH,WAAW,CAACI,GAAG,CAAC,CAAC;MAAA,EAAC;IAE3F;EAAC;IAAA;IAAA,OAED,wBAAuB;MACrB,IAAME,iBAAqC,GAAG,EAAE;MAEhD,IAAMpC,cAAc,GAAG,IAAI,CAACqC,yBAAyB,EAAE;MACvD,IAAMC,uBAAuB,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI;;MAEhD;MACA,qBAActC,cAAc,CAAC,CAACS,OAAO,CAAC,UAACE,EAAE,EAAK;QAC5CyB,iBAAiB,CAACG,IAAI,CACpB,IAAIC,+BAAgB,CAClB7B,EAAE,CAAC8B,UAAU,CAACC,MAAM,KAAK,gBAAgB,GACrCC,yBAAM,CAACC,aAAa,GACpBD,yBAAM,CAACE,gBAAgB,EAC3BlC,EAAE,CAAC8B,UAAU,CAACC,MAAM,KAAK,gBAAgB,GACrC,IAAII,oCAAiB,CACnBnC,EAAE,CAAC8B,UAAU,CAACM,QAAQ,EACtBpC,EAAE,CAAC8B,UAAU,CAACO,wBAAwB,EACtCrC,EAAE,CAAC8B,UAAU,CAACQ,sBAAsB,EACpCtC,EAAE,CAAC8B,UAAU,CAACS,eAAe,CAC9B,GACD,IAAIC,uCAAoB,CAACxC,EAAE,CAAC8B,UAAU,CAACW,GAAG,CAAC,EAC/CzC,EAAE,CAACO,YAAY,CAACmC,GAAG,CAAC,UAACC,WAAW;UAAA,OAAKA,WAAW,CAACC,eAAe;QAAA,EAAC,EACjEjB,uBAAuB,EACvB3B,EAAE,CAACC,SAAS,IAAI,CACd,IAAI4C,4BAAa,CACf,IAAI,EACJ,IAAIC,4BAAS,CACX9C,EAAE,CAACC,SAAS,CAACpB,KAAK,EAClBmB,EAAE,CAACC,SAAS,CAACnB,MAAM,IAAIH,cAAc,CAACC,IAAI,CAACE,MAAM,EACjDkB,EAAE,CAACC,SAAS,CAAClB,OAAO,IAAIJ,cAAc,CAACC,IAAI,CAACG,OAAO,EACnDiB,EAAE,CAACC,SAAS,CAAC8C,QAAQ,EACrB/C,EAAE,CAACC,SAAS,CAAC+C,SAAS,CACvB,CACF,CACF,CACF,CACF;MACH,CAAC,CAAC;;MAEF;MACA;MACA,IAAI,CAAC,IAAI,CAACC,6BAA6B,CAACxB,iBAAiB,CAAC,EAAE;QAC1D,IAAI,CAACtC,yBAAyB,CAACsC,iBAAiB,CAAC;QACjD,IAAI,CAACL,yBAAyB,GAAGK,iBAAiB;QAClDZ,oBAAW,CAACC,MAAM,CAACoC,IAAI,sDAAsD;MAC/E,CAAC,MAAM;QACLrC,oBAAW,CAACC,MAAM,CAACoC,IAAI,oFAEtB;MACH;IACF;EAAC;IAAA;IAAA,OAED,oBAAkBC,YAA0B,EAAiC;MAAA;MAAA,IAA/B5D,MAAM,uEAAG,IAAI;MACzD;MACA,IAAM6D,KAAK,aAAM,IAAI,CAAChE,OAAO,EAAE,CAAE;MAEjC,IAAI,CAACC,cAAc,CAAC+D,KAAK,CAAC,GAAGD,YAAY;MAEzCA,YAAY,CAAC5C,YAAY,CAACT,OAAO,CAAC,UAACW,EAAE,EAAK;QACxCA,EAAE,CAAC4C,EAAE,CAACC,8BAAiB,CAACC,YAAY,EAAE,MAAI,CAACjE,oBAAoB,CAAC;QAChEmB,EAAE,CAAC4C,EAAE,CAACC,8BAAiB,CAACE,WAAW,EAAE,iBAAa;UAAA,IAAX3E,KAAK,SAALA,KAAK;UAC1CsE,YAAY,CAAC/C,cAAc,GAAGvB,KAAK;UACnC,MAAI,CAACY,6BAA6B,EAAE;QACtC,CAAC,CAAC;MACJ,CAAC,CAAC;MAEF,IAAIF,MAAM,EAAE;QACV,IAAI,CAACA,MAAM,EAAE;MACf;MAEA,OAAO6D,KAAK;IACd;EAAC;IAAA;IAAA,OAED,uBAAqBK,SAAyB,EAAiB;MAAA;QAAA;MAAA,IAAflE,MAAM,uEAAG,IAAI;MAC3D,6BAAI,CAACF,cAAc,CAACoE,SAAS,CAAC,0DAA9B,sBAAgClD,YAAY,CAACT,OAAO,CAAC,UAACW,EAAE,EAAK;QAC3DA,EAAE,CAACiD,GAAG,CAACJ,8BAAiB,CAACC,YAAY,EAAE,MAAI,CAACjE,oBAAoB,CAAC;MACnE,CAAC,CAAC;MAEF,OAAO,IAAI,CAACD,cAAc,CAACoE,SAAS,CAAC;MAErC,IAAIlE,MAAM,EAAE;QACV,IAAI,CAACA,MAAM,EAAE;MACf;IACF;EAAC;IAAA;IAAA,OAED,kBAAgB;MACd,OAAO,IAAI,CAACG,YAAY,EAAE;IAC5B;EAAC;IAAA;IAAA,OAED,iBAAe;MACb,IAAI,CAACL,cAAc,GAAG,CAAC,CAAC;IAC1B;EAAC;EAAA;AAAA;AAAA"}
1
+ {"version":3,"names":["CODEC_DEFAULTS","h264","maxFs","maxFps","maxMbps","DEBOUNCED_SOURCE_UPDATE_TIME","MediaRequestManager","degradationPreferences","sendMediaRequestsCallback","counter","clientRequests","sourceUpdateListener","commit","bind","debouncedSourceUpdateListener","sendRequests","maxFsLimits","getMaxFs","totalMacroblocksRequested","forEach","id","mr","codecInfo","Math","min","preferredMaxFs","i","slotsWithLiveSource","receiveSlots","filter","rs","sourceState","length","maxMacroblocksLimit","LoggerProxy","logger","warn","mediaRequestA","mediaRequestB","_toJmpScrRequest","newRequests","previousWCMEMediaRequests","every","req","idx","isEqual","wcmeMediaRequests","getDegradedClientRequests","maxPayloadBitsPerSecond","push","WcmeMediaRequest","policyInfo","policy","Policy","ActiveSpeaker","ReceiverSelected","ActiveSpeakerInfo","priority","crossPriorityDuplication","crossPolicyDuplication","preferLiveVideo","ReceiverSelectedInfo","csi","map","receiveSlot","wcmeReceiveSlot","WcmeCodecInfo","H264Codec","maxWidth","maxHeight","checkIsNewRequestsEqualToPrev","info","mediaRequest","newId","on","ReceiveSlotEvents","SourceUpdate","MaxFsUpdate","requestId","off"],"sources":["mediaRequestManager.ts"],"sourcesContent":["/* eslint-disable require-jsdoc */\nimport {\n MediaRequest as WcmeMediaRequest,\n Policy,\n ActiveSpeakerInfo,\n ReceiverSelectedInfo,\n CodecInfo as WcmeCodecInfo,\n H264Codec,\n} from '@webex/internal-media-core';\nimport {cloneDeep, debounce, isEmpty} from 'lodash';\n\nimport LoggerProxy from '../common/logs/logger-proxy';\n\nimport {ReceiveSlot, ReceiveSlotEvents} from './receiveSlot';\nimport {getMaxFs} from './remoteMedia';\n\nexport interface ActiveSpeakerPolicyInfo {\n policy: 'active-speaker';\n priority: number;\n crossPriorityDuplication: boolean;\n crossPolicyDuplication: boolean;\n preferLiveVideo: boolean;\n}\n\nexport interface ReceiverSelectedPolicyInfo {\n policy: 'receiver-selected';\n csi: number;\n}\n\nexport type PolicyInfo = ActiveSpeakerPolicyInfo | ReceiverSelectedPolicyInfo;\n\nexport interface H264CodecInfo {\n codec: 'h264';\n maxFs?: number;\n maxFps?: number;\n maxMbps?: number;\n maxWidth?: number;\n maxHeight?: number;\n}\n\nexport type CodecInfo = H264CodecInfo; // we'll add AV1 here in the future when it's available\n\nexport interface MediaRequest {\n policyInfo: PolicyInfo;\n receiveSlots: Array<ReceiveSlot>;\n codecInfo?: CodecInfo;\n preferredMaxFs?: number;\n}\n\nexport type MediaRequestId = string;\n\nconst CODEC_DEFAULTS = {\n h264: {\n maxFs: 8192,\n maxFps: 3000,\n maxMbps: 245760,\n },\n};\n\nconst DEBOUNCED_SOURCE_UPDATE_TIME = 1000;\n\ntype DegradationPreferences = {\n maxMacroblocksLimit: number;\n};\n\ntype SendMediaRequestsCallback = (mediaRequests: WcmeMediaRequest[]) => void;\n\nexport class MediaRequestManager {\n private sendMediaRequestsCallback: SendMediaRequestsCallback;\n\n private counter: number;\n\n private clientRequests: {[key: MediaRequestId]: MediaRequest};\n\n private degradationPreferences: DegradationPreferences;\n\n private sourceUpdateListener: () => void;\n\n private debouncedSourceUpdateListener: () => void;\n\n private previousWCMEMediaRequests: Array<WcmeMediaRequest> = [];\n\n constructor(\n degradationPreferences: DegradationPreferences,\n sendMediaRequestsCallback: SendMediaRequestsCallback\n ) {\n this.sendMediaRequestsCallback = sendMediaRequestsCallback;\n this.counter = 0;\n this.clientRequests = {};\n this.degradationPreferences = degradationPreferences;\n this.sourceUpdateListener = this.commit.bind(this);\n this.debouncedSourceUpdateListener = debounce(\n this.sourceUpdateListener,\n DEBOUNCED_SOURCE_UPDATE_TIME\n );\n }\n\n public setDegradationPreferences(degradationPreferences: DegradationPreferences) {\n this.degradationPreferences = degradationPreferences;\n this.sendRequests(); // re-send requests after preferences are set\n }\n\n private getDegradedClientRequests() {\n const clientRequests = cloneDeep(this.clientRequests);\n const maxFsLimits = [\n getMaxFs('best'),\n getMaxFs('large'),\n getMaxFs('medium'),\n getMaxFs('small'),\n getMaxFs('very small'),\n getMaxFs('thumbnail'),\n ];\n\n // reduce max-fs until total macroblocks is below limit\n for (let i = 0; i < maxFsLimits.length; i += 1) {\n let totalMacroblocksRequested = 0;\n Object.entries(clientRequests).forEach(([id, mr]) => {\n if (mr.codecInfo) {\n mr.codecInfo.maxFs = Math.min(\n mr.preferredMaxFs || CODEC_DEFAULTS.h264.maxFs,\n mr.codecInfo.maxFs || CODEC_DEFAULTS.h264.maxFs,\n maxFsLimits[i]\n );\n // we only consider sources with \"live\" state\n const slotsWithLiveSource = this.clientRequests[id].receiveSlots.filter(\n (rs) => rs.sourceState === 'live'\n );\n totalMacroblocksRequested += mr.codecInfo.maxFs * slotsWithLiveSource.length;\n }\n });\n if (totalMacroblocksRequested <= this.degradationPreferences.maxMacroblocksLimit) {\n if (i !== 0) {\n LoggerProxy.logger.warn(\n `multistream:mediaRequestManager --> too many streams with high max-fs, frame size will be limited to ${maxFsLimits[i]}`\n );\n }\n break;\n } else if (i === maxFsLimits.length - 1) {\n LoggerProxy.logger.warn(\n `multistream:mediaRequestManager --> even with frame size limited to ${maxFsLimits[i]} you are still requesting too many streams, consider reducing the number of requests`\n );\n }\n }\n\n return clientRequests;\n }\n\n /**\n * Returns true if two media requests are the same, false otherwise.\n *\n * @param {WcmeMediaRequest} mediaRequestA - Media request A for comparison.\n * @param {WcmeMediaRequest} mediaRequestB - Media request B for comparison.\n * @returns {boolean} - Whether they are equal.\n */\n // eslint-disable-next-line class-methods-use-this\n public isEqual(mediaRequestA: WcmeMediaRequest, mediaRequestB: WcmeMediaRequest) {\n return (\n JSON.stringify(mediaRequestA._toJmpScrRequest()) ===\n JSON.stringify(mediaRequestB._toJmpScrRequest())\n );\n }\n\n /**\n * Compares new media requests to previous ones and determines\n * if they are the same.\n *\n * @param {WcmeMediaRequest[]} newRequests - Array with new requests.\n * @returns {boolean} - True if they are equal, false otherwise.\n */\n private checkIsNewRequestsEqualToPrev(newRequests: WcmeMediaRequest[]) {\n return (\n !isEmpty(this.previousWCMEMediaRequests) &&\n this.previousWCMEMediaRequests.length === newRequests.length &&\n this.previousWCMEMediaRequests.every((req, idx) => this.isEqual(req, newRequests[idx]))\n );\n }\n\n /**\n * Clears the previous media requests.\n *\n * @returns {void}\n */\n public clearPreviousRequests(): void {\n this.previousWCMEMediaRequests = [];\n }\n\n private sendRequests() {\n const wcmeMediaRequests: WcmeMediaRequest[] = [];\n\n const clientRequests = this.getDegradedClientRequests();\n const maxPayloadBitsPerSecond = 10 * 1000 * 1000;\n\n // map all the client media requests to wcme media requests\n Object.values(clientRequests).forEach((mr) => {\n wcmeMediaRequests.push(\n new WcmeMediaRequest(\n mr.policyInfo.policy === 'active-speaker'\n ? Policy.ActiveSpeaker\n : Policy.ReceiverSelected,\n mr.policyInfo.policy === 'active-speaker'\n ? new ActiveSpeakerInfo(\n mr.policyInfo.priority,\n mr.policyInfo.crossPriorityDuplication,\n mr.policyInfo.crossPolicyDuplication,\n mr.policyInfo.preferLiveVideo\n )\n : new ReceiverSelectedInfo(mr.policyInfo.csi),\n mr.receiveSlots.map((receiveSlot) => receiveSlot.wcmeReceiveSlot),\n maxPayloadBitsPerSecond,\n mr.codecInfo && [\n new WcmeCodecInfo(\n 0x80,\n new H264Codec(\n mr.codecInfo.maxFs,\n mr.codecInfo.maxFps || CODEC_DEFAULTS.h264.maxFps,\n mr.codecInfo.maxMbps || CODEC_DEFAULTS.h264.maxMbps,\n mr.codecInfo.maxWidth,\n mr.codecInfo.maxHeight\n )\n ),\n ]\n )\n );\n });\n\n //! IMPORTANT: this is only a temporary fix. This will soon be done in the jmp layer (@webex/json-multistream)\n // https://jira-eng-gpk2.cisco.com/jira/browse/WEBEX-326713\n if (!this.checkIsNewRequestsEqualToPrev(wcmeMediaRequests)) {\n this.sendMediaRequestsCallback(wcmeMediaRequests);\n this.previousWCMEMediaRequests = wcmeMediaRequests;\n LoggerProxy.logger.info(`multistream:sendRequests --> media requests sent. `);\n } else {\n LoggerProxy.logger.info(\n `multistream:sendRequests --> detected duplicate WCME requests, skipping them... `\n );\n }\n }\n\n public addRequest(mediaRequest: MediaRequest, commit = true): MediaRequestId {\n // eslint-disable-next-line no-plusplus\n const newId = `${this.counter++}`;\n\n this.clientRequests[newId] = mediaRequest;\n\n mediaRequest.receiveSlots.forEach((rs) => {\n rs.on(ReceiveSlotEvents.SourceUpdate, this.sourceUpdateListener);\n rs.on(ReceiveSlotEvents.MaxFsUpdate, ({maxFs}) => {\n mediaRequest.preferredMaxFs = maxFs;\n this.debouncedSourceUpdateListener();\n });\n });\n\n if (commit) {\n this.commit();\n }\n\n return newId;\n }\n\n public cancelRequest(requestId: MediaRequestId, commit = true) {\n this.clientRequests[requestId]?.receiveSlots.forEach((rs) => {\n rs.off(ReceiveSlotEvents.SourceUpdate, this.sourceUpdateListener);\n });\n\n delete this.clientRequests[requestId];\n\n if (commit) {\n this.commit();\n }\n }\n\n public commit() {\n return this.sendRequests();\n }\n\n public reset() {\n this.clientRequests = {};\n }\n}\n"],"mappings":"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"}
@@ -619,10 +619,8 @@ var ReconnectionManager = /*#__PURE__*/function () {
619
619
  // resend media requests
620
620
  if (this.meeting.isMultistream) {
621
621
  (0, _values.default)(this.meeting.mediaRequestManagers).forEach(function (mediaRequestManager) {
622
- return (
623
- // @ts-ignore - Fix type
624
- mediaRequestManager.commit()
625
- );
622
+ mediaRequestManager.clearPreviousRequests();
623
+ mediaRequestManager.commit();
626
624
  });
627
625
  }
628
626
  case 9:
@@ -1 +1 @@
1
- {"version":3,"names":["NeedsRetryError","Error","NeedsRejoinError","wasSharing","error","ReconnectionManager","meeting","iceState","disconnected","resolve","timer","undefined","timeoutDuration","config","reconnection","iceReconnectionTimeout","status","RECONNECTION","STATE","DEFAULT_STATUS","tryCount","DEFAULT_TRY_COUNT","webex","maxRejoinAttempts","rejoinAttempts","autoRejoinEnabled","autoRejoin","reset","clearTimeout","LoggerProxy","logger","log","resetReconnectionTimer","reject","setTimeout","reason","setLocalShareTrack","isSharing","shareStatus","SHARE_STATUS","LOCAL_SHARE_ACTIVE","NO_SHARE","mediaProperties","mediaDirection","sendShare","Trigger","trigger","file","function","EVENT_TRIGGERS","MEETING_STOPPED_SHARING_LOCAL","IN_PROGRESS","enabled","COMPLETE","info","ReconnectInProgress","ReconnectionError","networkDisconnect","networkRetry","id","validate","Metrics","postEvent","event","eventType","MEDIA_RECONNECTING","executeReconnection","then","MEDIA_RECOVERED","data","recoveredBy","RECOVERED_BY_NEW","catch","reconnectError","reconnect","message","reconnectMetric","CALL_ABORTED","errors","category","errorObjects","expected","errorCode","fatal","name","mediaEngine","shownToUser","rejoinMeeting","stopLocalShareTrack","SHARE_STOPPED_REASON","MEDIA_RECONNECTION","reconnectMercuryWebSocket","internal","device","url","FAILURE","meetings","syncMeetings","getMeetingByType","_ID_","state","_LEFT_","type","_CALL_","reconnectMedia","media","join","rejoin","MEETING_REJOIN","sendBehavioralMetric","BEHAVIORAL_METRICS","MEETING_MAX_REJOIN_FAILURE","locus_id","locusUrl","split","pop","stack","roap","doTurnDiscovery","turnServerResult","iceServers","turnServerInfo","push","urls","username","credential","password","webrtcMediaConnection","isMultistream","mediaRequestManagers","forEach","mediaRequestManager","commit","mercury","connected","disconnect","connect"],"sources":["index.ts"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\n/* eslint-disable no-warning-comments */\n\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport Trigger from '../common/events/trigger-proxy';\nimport {\n EVENT_TRIGGERS,\n RECONNECTION,\n SHARE_STATUS,\n SHARE_STOPPED_REASON,\n _CALL_,\n _LEFT_,\n _ID_,\n} from '../constants';\nimport BEHAVIORAL_METRICS from '../metrics/constants';\nimport ReconnectionError from '../common/errors/reconnection';\nimport ReconnectInProgress from '../common/errors/reconnection-in-progress';\nimport {eventType, reconnection, errorObjects} from '../metrics/config';\nimport Media from '../media';\nimport Metrics from '../metrics';\nimport Meeting from '../meeting';\n\n/**\n * Used to indicate that the reconnect logic needs to be retried.\n *\n * @class NeedsRetryError\n * @extends {Error}\n */\nclass NeedsRetryError extends Error {}\n\n/**\n * Used to indicate that the meeting needs to be rejoined, not just media reconnected\n *\n * @class NeedsRejoinError\n * @extends {Error}\n */\nclass NeedsRejoinError extends Error {\n wasSharing: any;\n\n /**\n * Creates an instance of NeedsRejoinError.\n * @param {Object} params\n * @param {boolean} params.wasSharing\n * @param {Error} params.error\n * @memberof NeedsRejoinError\n */\n constructor({\n wasSharing,\n error = new Error('Meeting needs to be rejoined'),\n }: {\n wasSharing?: boolean;\n error?: Error;\n }) {\n // @ts-ignore\n super(error);\n\n this.wasSharing = wasSharing;\n }\n}\n\n/**\n * @export\n * @class ReconnectionManager\n */\nexport default class ReconnectionManager {\n autoRejoinEnabled: any;\n iceState: any;\n maxRejoinAttempts: any;\n meeting: any;\n rejoinAttempts: any;\n shareStatus: any;\n status: any;\n tryCount: any;\n webex: any;\n /**\n * @param {Meeting} meeting\n */\n constructor(meeting: Meeting) {\n /**\n * Stores ICE reconnection state data.\n *\n * @instance\n * @type {Object}\n * @private\n * @memberof ReconnectionManager\n */\n this.iceState = {\n disconnected: false,\n resolve: () => {},\n timer: undefined,\n // @ts-ignore\n timeoutDuration: meeting.config.reconnection.iceReconnectionTimeout,\n };\n\n /**\n * @instance\n * @type {String}\n * @private\n * @memberof ReconnectionManager\n */\n this.status = RECONNECTION.STATE.DEFAULT_STATUS;\n /**\n * @instance\n * @type {Number}\n * @private\n * @memberof ReconnectionManager\n */\n this.tryCount = RECONNECTION.STATE.DEFAULT_TRY_COUNT;\n /**\n * @instance\n * @type {Object}\n * @private\n * @memberof ReconnectionManager\n */\n // TODO : change this logic to not save the meeting instance\n // It gets complicated when meeting ends on remote side , We have a old meeting instance which is not up to date\n // @ts-ignore\n this.webex = meeting.webex;\n /**\n * @instance\n * @type {Meeting}\n * @private\n * @memberof ReconnectionManager\n */\n // TODO: try removing the circular dependency for meeting and reconnection manager\n // try moving this to meetings collection\n this.meeting = meeting;\n\n // @ts-ignore\n this.maxRejoinAttempts = meeting.config.reconnection.maxRejoinAttempts;\n this.rejoinAttempts = RECONNECTION.STATE.DEFAULT_TRY_COUNT;\n // @ts-ignore\n this.autoRejoinEnabled = meeting.config.reconnection.autoRejoin;\n\n // Make sure reconnection state is in default\n this.reset();\n }\n\n /**\n * @public\n * @memberof ReconnectionManager\n * @returns {void}\n */\n resetReconnectionTimer() {\n this.iceState.resolve();\n this.iceState.resolve = () => {};\n\n if (this.iceState.timer) {\n clearTimeout(this.iceState.timer);\n delete this.iceState.timer;\n }\n }\n\n /**\n * Sets the iceState to connected and clears any disconnect timeouts and\n * related timeout data within the iceState.\n *\n * @returns {undefined}\n * @public\n * @memberof ReconnectionManager\n */\n public iceReconnected() {\n if (this.iceState.disconnected) {\n LoggerProxy.logger.log('ReconnectionManager:index#iceReconnected --> ice has reconnected');\n\n this.resetReconnectionTimer();\n\n this.iceState.disconnected = false;\n }\n }\n\n /**\n * Set the iceState to disconnected and generates a timeout that waits for the\n * iceState to reconnect and then resolves. If the ice state is already\n * processing a reconnect, it immediately resolves. Rejects if the timeout\n * duration is reached.\n *\n * @returns {Promise<undefined>}\n * @public\n * @memberof ReconnectionManager\n */\n public waitForIceReconnect() {\n if (!this.iceState.disconnected) {\n LoggerProxy.logger.log(\n 'ReconnectionManager:index#waitForIceReconnect --> waiting for ice reconnect'\n );\n\n this.iceState.disconnected = true;\n\n return new Promise<void>((resolve, reject) => {\n this.iceState.timer = setTimeout(() => {\n if (this.iceState.disconnected === false) {\n resolve();\n } else {\n this.iceState.disconnected = false;\n reject(\n new Error(`ice reconnection did not occur in ${this.iceState.timeoutDuration}ms`)\n );\n }\n }, this.iceState.timeoutDuration);\n\n this.iceState.resolve = resolve;\n });\n }\n\n // return a resolved promise to prevent multiple catch executions of reconnect\n return Promise.resolve();\n }\n\n /**\n * @returns {undefined}\n * @public\n * @memberof ReconnectionManager\n */\n public reset() {\n this.status = RECONNECTION.STATE.DEFAULT_STATUS;\n this.tryCount = RECONNECTION.STATE.DEFAULT_TRY_COUNT;\n this.rejoinAttempts = RECONNECTION.STATE.DEFAULT_TRY_COUNT;\n }\n\n /**\n * @returns {undefined}\n * @public\n * @memberof ReconnectionManager\n */\n public cleanUp() {\n this.reset();\n this.meeting = null;\n }\n\n /**\n * Stop the local share track.\n *\n * @param {string} reason a {@link SHARE_STOPPED_REASON}\n * @returns {undefined}\n * @private\n * @memberof ReconnectionManager\n */\n private stopLocalShareTrack(reason: string) {\n this.meeting.setLocalShareTrack(null);\n this.meeting.isSharing = false;\n if (this.shareStatus === SHARE_STATUS.LOCAL_SHARE_ACTIVE) {\n this.meeting.shareStatus = SHARE_STATUS.NO_SHARE;\n }\n this.meeting.mediaProperties.mediaDirection.sendShare = false;\n Trigger.trigger(\n this.meeting,\n {\n file: 'reconnection-manager/index',\n function: 'stopLocalShareTrack',\n },\n EVENT_TRIGGERS.MEETING_STOPPED_SHARING_LOCAL,\n {\n reason,\n }\n );\n }\n\n /**\n * @public\n * @memberof ReconnectionManager\n * @returns {Boolean} true if reconnection operation is in progress\n */\n isReconnectInProgress() {\n return this.status === RECONNECTION.STATE.IN_PROGRESS;\n }\n\n /**\n * @returns {Boolean}\n * @throws {ReconnectionError}\n * @private\n * @memberof ReconnectionManager\n */\n private validate() {\n if (this.meeting.config.reconnection.enabled) {\n if (\n this.status === RECONNECTION.STATE.DEFAULT_STATUS ||\n this.status === RECONNECTION.STATE.COMPLETE\n ) {\n return true;\n }\n\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#validate --> Reconnection already in progress.'\n );\n\n throw new ReconnectInProgress('Reconnection already in progress.');\n }\n\n LoggerProxy.logger.info('ReconnectionManager:index#validate --> Reconnection is not enabled.');\n\n throw new ReconnectionError('Reconnection is not enabled.');\n }\n\n /**\n * Initiates a media reconnect for the active meeting\n * @param {Object} reconnectOptions\n * @param {boolean} [reconnectOptions.networkDisconnect=false] indicates if a network disconnect event happened\n * @param {boolean} [reconnectOptions.networkRetry=false] indicates if we are retrying the reconnect\n * @returns {Promise}\n * @public\n * @memberof ReconnectionManager\n */\n public async reconnect({\n networkDisconnect = false,\n networkRetry = false,\n }: {\n networkDisconnect?: boolean;\n networkRetry?: boolean;\n } = {}) {\n LoggerProxy.logger.info(\n `ReconnectionManager:index#reconnect --> Reconnection start for meeting ${this.meeting.id}.`\n );\n // First, validate that we can reconnect, if not, it will throw an error\n try {\n this.validate();\n } catch (error) {\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#reconnect --> Reconnection unable to begin.',\n error\n );\n throw error;\n }\n\n if (!networkRetry) {\n // Only log START metrics on the initial reconnect\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#reconnect --> Sending reconnect start metric.'\n );\n Metrics.postEvent({\n event: eventType.MEDIA_RECONNECTING,\n meeting: this.meeting,\n });\n }\n\n return this.executeReconnection({networkDisconnect})\n .then(() => {\n LoggerProxy.logger.info('ReconnectionManager:index#reconnect --> Reconnection successful.');\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#reconnect --> Sending reconnect success metric.'\n );\n Metrics.postEvent({\n event: eventType.MEDIA_RECOVERED,\n meeting: this.meeting,\n data: {recoveredBy: reconnection.RECOVERED_BY_NEW},\n });\n })\n .catch((reconnectError) => {\n if (reconnectError instanceof NeedsRetryError) {\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#reconnect --> Reconnection not successful, retrying.'\n );\n // Reset our reconnect status since we are looping back to the beginning\n this.status = RECONNECTION.STATE.DEFAULT_STATUS;\n\n // This is a network retry, so we should not log START metrics again\n return this.reconnect({networkDisconnect: true, networkRetry: true});\n }\n\n // Reconnect has failed\n LoggerProxy.logger.error(\n 'ReconnectionManager:index#reconnect --> Reconnection failed.',\n reconnectError.message\n );\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#reconnect --> Sending reconnect abort metric.'\n );\n\n const reconnectMetric = {\n event: eventType.CALL_ABORTED,\n meeting: this.meeting,\n data: {\n errors: [\n {\n category: errorObjects.category.expected,\n errorCode: 2008,\n fatal: true,\n name: errorObjects.name.mediaEngine,\n shownToUser: false,\n },\n ],\n },\n };\n\n Metrics.postEvent(reconnectMetric);\n if (reconnectError instanceof NeedsRejoinError) {\n // send call aborded event with catogery as expected as we are trying to rejoin\n\n if (this.autoRejoinEnabled) {\n return this.rejoinMeeting(reconnectError.wasSharing);\n }\n }\n\n throw reconnectError;\n });\n }\n\n /**\n * @param {Object} reconnectOptions\n * @param {boolean} [reconnectOptions.networkDisconnect=false] indicates if a network disconnect event happened\n * @returns {Promise}\n * @throws {NeedsRetryError}\n * @private\n * @memberof ReconnectionManager\n */\n private async executeReconnection({networkDisconnect = false}: {networkDisconnect?: boolean}) {\n this.status = RECONNECTION.STATE.IN_PROGRESS;\n\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#executeReconnection --> Attempting to reconnect to meeting.'\n );\n\n const wasSharing = this.meeting.shareStatus === SHARE_STATUS.LOCAL_SHARE_ACTIVE;\n\n if (wasSharing) {\n this.stopLocalShareTrack(SHARE_STOPPED_REASON.MEDIA_RECONNECTION);\n }\n\n if (networkDisconnect) {\n try {\n await this.reconnectMercuryWebSocket();\n LoggerProxy.logger.error(\n 'ReconnectionManager:index#executeReconnection --> Websocket reconnected.',\n this.webex.internal.device.url\n );\n } catch (error) {\n LoggerProxy.logger.error(\n 'ReconnectionManager:index#executeReconnection --> Unable to reconnect to websocket, giving up.'\n );\n this.status = RECONNECTION.STATE.FAILURE;\n throw error;\n }\n }\n\n try {\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#executeReconnection --> Updating meeting data from server.'\n );\n await this.webex.meetings.syncMeetings();\n } catch (syncError) {\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#executeReconnection --> Unable to sync meetings, reconnecting.',\n syncError\n );\n throw new NeedsRetryError(syncError);\n }\n\n // TODO: try to improve this logic as the reconnection manager saves the instance of deleted meeting object\n // So that on rejoin it known what parametrs it was using\n if (!this.meeting || !this.webex.meetings.getMeetingByType(_ID_, this.meeting.id)) {\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#executeReconnection --> Meeting got deleted due to inactivity or ended remotely.'\n );\n\n throw new Error('Unable to rejoin a meeting already ended or inactive.');\n }\n\n LoggerProxy.logger.info(\n `ReconnectionManager:index#executeReconnection --> Current state of meeting is ${this.meeting.state}`\n );\n\n // If the meeting state was left, no longer reconnect media\n if (this.meeting.state === _LEFT_) {\n if (this.meeting.type === _CALL_) {\n throw new Error('Unable to rejoin a call in LEFT state.');\n }\n\n throw new NeedsRejoinError({wasSharing});\n }\n\n try {\n const media = await this.reconnectMedia();\n\n LoggerProxy.logger.log(\n 'ReconnectionManager:index#executeReconnection --> Media reestablished'\n );\n this.status = RECONNECTION.STATE.COMPLETE;\n\n return media;\n } catch (error) {\n LoggerProxy.logger.error(\n 'ReconnectionManager:index#executeReconnection --> Media reestablishment failed'\n );\n this.status = RECONNECTION.STATE.FAILURE;\n\n throw error;\n }\n }\n\n /**\n * Rejoins a meeting after detecting the member was in a LEFT state\n *\n * @async\n * @param {boolean} wasSharing\n * @returns {Promise}\n */\n async rejoinMeeting(wasSharing = false) {\n try {\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#rejoinMeeting --> attemping meeting rejoin'\n );\n\n await this.meeting.join({rejoin: true});\n LoggerProxy.logger.info('ReconnectionManager:index#rejoinMeeting --> meeting rejoined');\n\n if (wasSharing) {\n this.stopLocalShareTrack(SHARE_STOPPED_REASON.MEETING_REJOIN);\n }\n } catch (joinError) {\n this.rejoinAttempts += 1;\n if (this.rejoinAttempts <= this.maxRejoinAttempts) {\n LoggerProxy.logger.info(\n `ReconnectionManager:index#rejoinMeeting --> Unable to rejoin meeting, attempt #${this.rejoinAttempts}, retrying.`,\n joinError\n );\n this.rejoinMeeting();\n } else {\n LoggerProxy.logger.error(\n 'ReconnectionManager:index#rejoinMeeting --> Unable to rejoin meeting after max attempts.',\n joinError\n );\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.MEETING_MAX_REJOIN_FAILURE, {\n locus_id: this.meeting.locusUrl.split('/').pop(),\n reason: joinError.message,\n stack: joinError.stack,\n });\n this.status = RECONNECTION.STATE.FAILURE;\n throw joinError;\n }\n }\n\n try {\n await this.reconnectMedia();\n } catch (mediaError) {\n LoggerProxy.logger.error(\n 'ReconnectionManager:index#rejoinMeeting --> Unable to reestablish media after rejoining.',\n mediaError\n );\n throw mediaError;\n }\n }\n\n /**\n * @returns {Promise}\n * @private\n * @memberof ReconnectionManager\n */\n async reconnectMedia() {\n LoggerProxy.logger.log(\n 'ReconnectionManager:index#reconnectMedia --> Begin reestablishment of media'\n );\n\n // do the TURN server discovery again since the TURN server might change\n const turnServerResult = await this.meeting.roap.doTurnDiscovery(this.meeting, true);\n\n const iceServers = [];\n\n if (turnServerResult.turnServerInfo) {\n iceServers.push({\n urls: turnServerResult.turnServerInfo.url,\n username: turnServerResult.turnServerInfo.username || '',\n credential: turnServerResult.turnServerInfo.password || '',\n });\n }\n\n await this.meeting.mediaProperties.webrtcMediaConnection.reconnect(iceServers);\n\n // resend media requests\n if (this.meeting.isMultistream) {\n Object.values(this.meeting.mediaRequestManagers).forEach((mediaRequestManager) =>\n // @ts-ignore - Fix type\n mediaRequestManager.commit()\n );\n }\n }\n\n /**\n * Attempt to Reconnect Mercury Websocket\n * @returns {Promise}\n * @private\n * @memberof ReconnectionManager\n */\n private async reconnectMercuryWebSocket() {\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#reconnectMercuryWebSocket --> Reconnecting websocket.'\n );\n // First, attempt to disconnect if we think we are already connected.\n if (this.webex.internal.mercury.connected) {\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#reconnectMercuryWebSocket --> Disconnecting existing websocket.'\n );\n try {\n await this.webex.internal.mercury.disconnect();\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#reconnectMercuryWebSocket --> Websocket disconnected successfully.'\n );\n } catch (disconnectError) {\n // If we can't disconnect, the sdk is in such a bad state that reconnecting is not going to happen.\n LoggerProxy.logger.error(\n 'ReconnectionManager:index#reconnectMercuryWebSocket --> Unable to disconnect from websocket, giving up.',\n disconnectError\n );\n throw disconnectError;\n }\n }\n\n try {\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#reconnectMercuryWebSocket --> Connecting websocket.'\n );\n await this.webex.internal.mercury.connect();\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#reconnectMercuryWebSocket --> Websocket connected successfully.'\n );\n } catch (connectError) {\n LoggerProxy.logger.error(\n 'ReconnectionManager:index#reconnectMercuryWebSocket --> Unable to connect to websocket, giving up.',\n connectError\n );\n\n throw connectError;\n }\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"names":["NeedsRetryError","Error","NeedsRejoinError","wasSharing","error","ReconnectionManager","meeting","iceState","disconnected","resolve","timer","undefined","timeoutDuration","config","reconnection","iceReconnectionTimeout","status","RECONNECTION","STATE","DEFAULT_STATUS","tryCount","DEFAULT_TRY_COUNT","webex","maxRejoinAttempts","rejoinAttempts","autoRejoinEnabled","autoRejoin","reset","clearTimeout","LoggerProxy","logger","log","resetReconnectionTimer","reject","setTimeout","reason","setLocalShareTrack","isSharing","shareStatus","SHARE_STATUS","LOCAL_SHARE_ACTIVE","NO_SHARE","mediaProperties","mediaDirection","sendShare","Trigger","trigger","file","function","EVENT_TRIGGERS","MEETING_STOPPED_SHARING_LOCAL","IN_PROGRESS","enabled","COMPLETE","info","ReconnectInProgress","ReconnectionError","networkDisconnect","networkRetry","id","validate","Metrics","postEvent","event","eventType","MEDIA_RECONNECTING","executeReconnection","then","MEDIA_RECOVERED","data","recoveredBy","RECOVERED_BY_NEW","catch","reconnectError","reconnect","message","reconnectMetric","CALL_ABORTED","errors","category","errorObjects","expected","errorCode","fatal","name","mediaEngine","shownToUser","rejoinMeeting","stopLocalShareTrack","SHARE_STOPPED_REASON","MEDIA_RECONNECTION","reconnectMercuryWebSocket","internal","device","url","FAILURE","meetings","syncMeetings","getMeetingByType","_ID_","state","_LEFT_","type","_CALL_","reconnectMedia","media","join","rejoin","MEETING_REJOIN","sendBehavioralMetric","BEHAVIORAL_METRICS","MEETING_MAX_REJOIN_FAILURE","locus_id","locusUrl","split","pop","stack","roap","doTurnDiscovery","turnServerResult","iceServers","turnServerInfo","push","urls","username","credential","password","webrtcMediaConnection","isMultistream","mediaRequestManagers","forEach","mediaRequestManager","clearPreviousRequests","commit","mercury","connected","disconnect","connect"],"sources":["index.ts"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\n/* eslint-disable no-warning-comments */\n\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport Trigger from '../common/events/trigger-proxy';\nimport {\n EVENT_TRIGGERS,\n RECONNECTION,\n SHARE_STATUS,\n SHARE_STOPPED_REASON,\n _CALL_,\n _LEFT_,\n _ID_,\n} from '../constants';\nimport BEHAVIORAL_METRICS from '../metrics/constants';\nimport ReconnectionError from '../common/errors/reconnection';\nimport ReconnectInProgress from '../common/errors/reconnection-in-progress';\nimport {eventType, reconnection, errorObjects} from '../metrics/config';\nimport Media from '../media';\nimport Metrics from '../metrics';\nimport Meeting from '../meeting';\nimport {MediaRequestManager} from '../multistream/mediaRequestManager';\n\n/**\n * Used to indicate that the reconnect logic needs to be retried.\n *\n * @class NeedsRetryError\n * @extends {Error}\n */\nclass NeedsRetryError extends Error {}\n\n/**\n * Used to indicate that the meeting needs to be rejoined, not just media reconnected\n *\n * @class NeedsRejoinError\n * @extends {Error}\n */\nclass NeedsRejoinError extends Error {\n wasSharing: any;\n\n /**\n * Creates an instance of NeedsRejoinError.\n * @param {Object} params\n * @param {boolean} params.wasSharing\n * @param {Error} params.error\n * @memberof NeedsRejoinError\n */\n constructor({\n wasSharing,\n error = new Error('Meeting needs to be rejoined'),\n }: {\n wasSharing?: boolean;\n error?: Error;\n }) {\n // @ts-ignore\n super(error);\n\n this.wasSharing = wasSharing;\n }\n}\n\n/**\n * @export\n * @class ReconnectionManager\n */\nexport default class ReconnectionManager {\n autoRejoinEnabled: any;\n iceState: any;\n maxRejoinAttempts: any;\n meeting: any;\n rejoinAttempts: any;\n shareStatus: any;\n status: any;\n tryCount: any;\n webex: any;\n /**\n * @param {Meeting} meeting\n */\n constructor(meeting: Meeting) {\n /**\n * Stores ICE reconnection state data.\n *\n * @instance\n * @type {Object}\n * @private\n * @memberof ReconnectionManager\n */\n this.iceState = {\n disconnected: false,\n resolve: () => {},\n timer: undefined,\n // @ts-ignore\n timeoutDuration: meeting.config.reconnection.iceReconnectionTimeout,\n };\n\n /**\n * @instance\n * @type {String}\n * @private\n * @memberof ReconnectionManager\n */\n this.status = RECONNECTION.STATE.DEFAULT_STATUS;\n /**\n * @instance\n * @type {Number}\n * @private\n * @memberof ReconnectionManager\n */\n this.tryCount = RECONNECTION.STATE.DEFAULT_TRY_COUNT;\n /**\n * @instance\n * @type {Object}\n * @private\n * @memberof ReconnectionManager\n */\n // TODO : change this logic to not save the meeting instance\n // It gets complicated when meeting ends on remote side , We have a old meeting instance which is not up to date\n // @ts-ignore\n this.webex = meeting.webex;\n /**\n * @instance\n * @type {Meeting}\n * @private\n * @memberof ReconnectionManager\n */\n // TODO: try removing the circular dependency for meeting and reconnection manager\n // try moving this to meetings collection\n this.meeting = meeting;\n\n // @ts-ignore\n this.maxRejoinAttempts = meeting.config.reconnection.maxRejoinAttempts;\n this.rejoinAttempts = RECONNECTION.STATE.DEFAULT_TRY_COUNT;\n // @ts-ignore\n this.autoRejoinEnabled = meeting.config.reconnection.autoRejoin;\n\n // Make sure reconnection state is in default\n this.reset();\n }\n\n /**\n * @public\n * @memberof ReconnectionManager\n * @returns {void}\n */\n resetReconnectionTimer() {\n this.iceState.resolve();\n this.iceState.resolve = () => {};\n\n if (this.iceState.timer) {\n clearTimeout(this.iceState.timer);\n delete this.iceState.timer;\n }\n }\n\n /**\n * Sets the iceState to connected and clears any disconnect timeouts and\n * related timeout data within the iceState.\n *\n * @returns {undefined}\n * @public\n * @memberof ReconnectionManager\n */\n public iceReconnected() {\n if (this.iceState.disconnected) {\n LoggerProxy.logger.log('ReconnectionManager:index#iceReconnected --> ice has reconnected');\n\n this.resetReconnectionTimer();\n\n this.iceState.disconnected = false;\n }\n }\n\n /**\n * Set the iceState to disconnected and generates a timeout that waits for the\n * iceState to reconnect and then resolves. If the ice state is already\n * processing a reconnect, it immediately resolves. Rejects if the timeout\n * duration is reached.\n *\n * @returns {Promise<undefined>}\n * @public\n * @memberof ReconnectionManager\n */\n public waitForIceReconnect() {\n if (!this.iceState.disconnected) {\n LoggerProxy.logger.log(\n 'ReconnectionManager:index#waitForIceReconnect --> waiting for ice reconnect'\n );\n\n this.iceState.disconnected = true;\n\n return new Promise<void>((resolve, reject) => {\n this.iceState.timer = setTimeout(() => {\n if (this.iceState.disconnected === false) {\n resolve();\n } else {\n this.iceState.disconnected = false;\n reject(\n new Error(`ice reconnection did not occur in ${this.iceState.timeoutDuration}ms`)\n );\n }\n }, this.iceState.timeoutDuration);\n\n this.iceState.resolve = resolve;\n });\n }\n\n // return a resolved promise to prevent multiple catch executions of reconnect\n return Promise.resolve();\n }\n\n /**\n * @returns {undefined}\n * @public\n * @memberof ReconnectionManager\n */\n public reset() {\n this.status = RECONNECTION.STATE.DEFAULT_STATUS;\n this.tryCount = RECONNECTION.STATE.DEFAULT_TRY_COUNT;\n this.rejoinAttempts = RECONNECTION.STATE.DEFAULT_TRY_COUNT;\n }\n\n /**\n * @returns {undefined}\n * @public\n * @memberof ReconnectionManager\n */\n public cleanUp() {\n this.reset();\n this.meeting = null;\n }\n\n /**\n * Stop the local share track.\n *\n * @param {string} reason a {@link SHARE_STOPPED_REASON}\n * @returns {undefined}\n * @private\n * @memberof ReconnectionManager\n */\n private stopLocalShareTrack(reason: string) {\n this.meeting.setLocalShareTrack(null);\n this.meeting.isSharing = false;\n if (this.shareStatus === SHARE_STATUS.LOCAL_SHARE_ACTIVE) {\n this.meeting.shareStatus = SHARE_STATUS.NO_SHARE;\n }\n this.meeting.mediaProperties.mediaDirection.sendShare = false;\n Trigger.trigger(\n this.meeting,\n {\n file: 'reconnection-manager/index',\n function: 'stopLocalShareTrack',\n },\n EVENT_TRIGGERS.MEETING_STOPPED_SHARING_LOCAL,\n {\n reason,\n }\n );\n }\n\n /**\n * @public\n * @memberof ReconnectionManager\n * @returns {Boolean} true if reconnection operation is in progress\n */\n isReconnectInProgress() {\n return this.status === RECONNECTION.STATE.IN_PROGRESS;\n }\n\n /**\n * @returns {Boolean}\n * @throws {ReconnectionError}\n * @private\n * @memberof ReconnectionManager\n */\n private validate() {\n if (this.meeting.config.reconnection.enabled) {\n if (\n this.status === RECONNECTION.STATE.DEFAULT_STATUS ||\n this.status === RECONNECTION.STATE.COMPLETE\n ) {\n return true;\n }\n\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#validate --> Reconnection already in progress.'\n );\n\n throw new ReconnectInProgress('Reconnection already in progress.');\n }\n\n LoggerProxy.logger.info('ReconnectionManager:index#validate --> Reconnection is not enabled.');\n\n throw new ReconnectionError('Reconnection is not enabled.');\n }\n\n /**\n * Initiates a media reconnect for the active meeting\n * @param {Object} reconnectOptions\n * @param {boolean} [reconnectOptions.networkDisconnect=false] indicates if a network disconnect event happened\n * @param {boolean} [reconnectOptions.networkRetry=false] indicates if we are retrying the reconnect\n * @returns {Promise}\n * @public\n * @memberof ReconnectionManager\n */\n public async reconnect({\n networkDisconnect = false,\n networkRetry = false,\n }: {\n networkDisconnect?: boolean;\n networkRetry?: boolean;\n } = {}) {\n LoggerProxy.logger.info(\n `ReconnectionManager:index#reconnect --> Reconnection start for meeting ${this.meeting.id}.`\n );\n // First, validate that we can reconnect, if not, it will throw an error\n try {\n this.validate();\n } catch (error) {\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#reconnect --> Reconnection unable to begin.',\n error\n );\n throw error;\n }\n\n if (!networkRetry) {\n // Only log START metrics on the initial reconnect\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#reconnect --> Sending reconnect start metric.'\n );\n Metrics.postEvent({\n event: eventType.MEDIA_RECONNECTING,\n meeting: this.meeting,\n });\n }\n\n return this.executeReconnection({networkDisconnect})\n .then(() => {\n LoggerProxy.logger.info('ReconnectionManager:index#reconnect --> Reconnection successful.');\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#reconnect --> Sending reconnect success metric.'\n );\n Metrics.postEvent({\n event: eventType.MEDIA_RECOVERED,\n meeting: this.meeting,\n data: {recoveredBy: reconnection.RECOVERED_BY_NEW},\n });\n })\n .catch((reconnectError) => {\n if (reconnectError instanceof NeedsRetryError) {\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#reconnect --> Reconnection not successful, retrying.'\n );\n // Reset our reconnect status since we are looping back to the beginning\n this.status = RECONNECTION.STATE.DEFAULT_STATUS;\n\n // This is a network retry, so we should not log START metrics again\n return this.reconnect({networkDisconnect: true, networkRetry: true});\n }\n\n // Reconnect has failed\n LoggerProxy.logger.error(\n 'ReconnectionManager:index#reconnect --> Reconnection failed.',\n reconnectError.message\n );\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#reconnect --> Sending reconnect abort metric.'\n );\n\n const reconnectMetric = {\n event: eventType.CALL_ABORTED,\n meeting: this.meeting,\n data: {\n errors: [\n {\n category: errorObjects.category.expected,\n errorCode: 2008,\n fatal: true,\n name: errorObjects.name.mediaEngine,\n shownToUser: false,\n },\n ],\n },\n };\n\n Metrics.postEvent(reconnectMetric);\n if (reconnectError instanceof NeedsRejoinError) {\n // send call aborded event with catogery as expected as we are trying to rejoin\n\n if (this.autoRejoinEnabled) {\n return this.rejoinMeeting(reconnectError.wasSharing);\n }\n }\n\n throw reconnectError;\n });\n }\n\n /**\n * @param {Object} reconnectOptions\n * @param {boolean} [reconnectOptions.networkDisconnect=false] indicates if a network disconnect event happened\n * @returns {Promise}\n * @throws {NeedsRetryError}\n * @private\n * @memberof ReconnectionManager\n */\n private async executeReconnection({networkDisconnect = false}: {networkDisconnect?: boolean}) {\n this.status = RECONNECTION.STATE.IN_PROGRESS;\n\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#executeReconnection --> Attempting to reconnect to meeting.'\n );\n\n const wasSharing = this.meeting.shareStatus === SHARE_STATUS.LOCAL_SHARE_ACTIVE;\n\n if (wasSharing) {\n this.stopLocalShareTrack(SHARE_STOPPED_REASON.MEDIA_RECONNECTION);\n }\n\n if (networkDisconnect) {\n try {\n await this.reconnectMercuryWebSocket();\n LoggerProxy.logger.error(\n 'ReconnectionManager:index#executeReconnection --> Websocket reconnected.',\n this.webex.internal.device.url\n );\n } catch (error) {\n LoggerProxy.logger.error(\n 'ReconnectionManager:index#executeReconnection --> Unable to reconnect to websocket, giving up.'\n );\n this.status = RECONNECTION.STATE.FAILURE;\n throw error;\n }\n }\n\n try {\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#executeReconnection --> Updating meeting data from server.'\n );\n await this.webex.meetings.syncMeetings();\n } catch (syncError) {\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#executeReconnection --> Unable to sync meetings, reconnecting.',\n syncError\n );\n throw new NeedsRetryError(syncError);\n }\n\n // TODO: try to improve this logic as the reconnection manager saves the instance of deleted meeting object\n // So that on rejoin it known what parametrs it was using\n if (!this.meeting || !this.webex.meetings.getMeetingByType(_ID_, this.meeting.id)) {\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#executeReconnection --> Meeting got deleted due to inactivity or ended remotely.'\n );\n\n throw new Error('Unable to rejoin a meeting already ended or inactive.');\n }\n\n LoggerProxy.logger.info(\n `ReconnectionManager:index#executeReconnection --> Current state of meeting is ${this.meeting.state}`\n );\n\n // If the meeting state was left, no longer reconnect media\n if (this.meeting.state === _LEFT_) {\n if (this.meeting.type === _CALL_) {\n throw new Error('Unable to rejoin a call in LEFT state.');\n }\n\n throw new NeedsRejoinError({wasSharing});\n }\n\n try {\n const media = await this.reconnectMedia();\n\n LoggerProxy.logger.log(\n 'ReconnectionManager:index#executeReconnection --> Media reestablished'\n );\n this.status = RECONNECTION.STATE.COMPLETE;\n\n return media;\n } catch (error) {\n LoggerProxy.logger.error(\n 'ReconnectionManager:index#executeReconnection --> Media reestablishment failed'\n );\n this.status = RECONNECTION.STATE.FAILURE;\n\n throw error;\n }\n }\n\n /**\n * Rejoins a meeting after detecting the member was in a LEFT state\n *\n * @async\n * @param {boolean} wasSharing\n * @returns {Promise}\n */\n async rejoinMeeting(wasSharing = false) {\n try {\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#rejoinMeeting --> attemping meeting rejoin'\n );\n\n await this.meeting.join({rejoin: true});\n LoggerProxy.logger.info('ReconnectionManager:index#rejoinMeeting --> meeting rejoined');\n\n if (wasSharing) {\n this.stopLocalShareTrack(SHARE_STOPPED_REASON.MEETING_REJOIN);\n }\n } catch (joinError) {\n this.rejoinAttempts += 1;\n if (this.rejoinAttempts <= this.maxRejoinAttempts) {\n LoggerProxy.logger.info(\n `ReconnectionManager:index#rejoinMeeting --> Unable to rejoin meeting, attempt #${this.rejoinAttempts}, retrying.`,\n joinError\n );\n this.rejoinMeeting();\n } else {\n LoggerProxy.logger.error(\n 'ReconnectionManager:index#rejoinMeeting --> Unable to rejoin meeting after max attempts.',\n joinError\n );\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.MEETING_MAX_REJOIN_FAILURE, {\n locus_id: this.meeting.locusUrl.split('/').pop(),\n reason: joinError.message,\n stack: joinError.stack,\n });\n this.status = RECONNECTION.STATE.FAILURE;\n throw joinError;\n }\n }\n\n try {\n await this.reconnectMedia();\n } catch (mediaError) {\n LoggerProxy.logger.error(\n 'ReconnectionManager:index#rejoinMeeting --> Unable to reestablish media after rejoining.',\n mediaError\n );\n throw mediaError;\n }\n }\n\n /**\n * @returns {Promise}\n * @private\n * @memberof ReconnectionManager\n */\n async reconnectMedia() {\n LoggerProxy.logger.log(\n 'ReconnectionManager:index#reconnectMedia --> Begin reestablishment of media'\n );\n\n // do the TURN server discovery again since the TURN server might change\n const turnServerResult = await this.meeting.roap.doTurnDiscovery(this.meeting, true);\n\n const iceServers = [];\n\n if (turnServerResult.turnServerInfo) {\n iceServers.push({\n urls: turnServerResult.turnServerInfo.url,\n username: turnServerResult.turnServerInfo.username || '',\n credential: turnServerResult.turnServerInfo.password || '',\n });\n }\n\n await this.meeting.mediaProperties.webrtcMediaConnection.reconnect(iceServers);\n\n // resend media requests\n if (this.meeting.isMultistream) {\n Object.values(this.meeting.mediaRequestManagers).forEach(\n (mediaRequestManager: MediaRequestManager) => {\n mediaRequestManager.clearPreviousRequests();\n mediaRequestManager.commit();\n }\n );\n }\n }\n\n /**\n * Attempt to Reconnect Mercury Websocket\n * @returns {Promise}\n * @private\n * @memberof ReconnectionManager\n */\n private async reconnectMercuryWebSocket() {\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#reconnectMercuryWebSocket --> Reconnecting websocket.'\n );\n // First, attempt to disconnect if we think we are already connected.\n if (this.webex.internal.mercury.connected) {\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#reconnectMercuryWebSocket --> Disconnecting existing websocket.'\n );\n try {\n await this.webex.internal.mercury.disconnect();\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#reconnectMercuryWebSocket --> Websocket disconnected successfully.'\n );\n } catch (disconnectError) {\n // If we can't disconnect, the sdk is in such a bad state that reconnecting is not going to happen.\n LoggerProxy.logger.error(\n 'ReconnectionManager:index#reconnectMercuryWebSocket --> Unable to disconnect from websocket, giving up.',\n disconnectError\n );\n throw disconnectError;\n }\n }\n\n try {\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#reconnectMercuryWebSocket --> Connecting websocket.'\n );\n await this.webex.internal.mercury.connect();\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#reconnectMercuryWebSocket --> Websocket connected successfully.'\n );\n } catch (connectError) {\n LoggerProxy.logger.error(\n 'ReconnectionManager:index#reconnectMercuryWebSocket --> Unable to connect to websocket, giving up.',\n connectError\n );\n\n throw connectError;\n }\n }\n}\n"],"mappings":"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"}
@@ -2,6 +2,7 @@ export declare const AUDIO = "audio";
2
2
  export declare const AUDIO_INPUT = "audioinput";
3
3
  export declare const AUDIO_STATUS = "audioStatus";
4
4
  export declare const ALERT = "alert";
5
+ export declare const ALIAS = "alias";
5
6
  export declare const ANSWER = "answer";
6
7
  export declare const CALL = "call";
7
8
  export declare const CORRELATION_ID = "correlationId";
@@ -637,6 +638,8 @@ export declare const DISPLAY_HINTS: {
637
638
  MUTE_ALL: string;
638
639
  UNMUTE_ALL: string;
639
640
  PRESENTER_CONTROL: string;
641
+ CAN_RENAME_SELF_AND_OBSERVED: string;
642
+ CAN_RENAME_OTHERS: string;
640
643
  BREAKOUT_MANAGEMENT: string;
641
644
  UCF_SUPPRESS_BREAKOUTS_SUPPORT: string;
642
645
  DISABLE_ASK_FOR_HELP: string;
@@ -43,6 +43,8 @@ interface IInMeetingActions {
43
43
  canAdmitLobbyToBreakout?: boolean;
44
44
  isBreakoutPreassignmentsEnabled?: boolean;
45
45
  canUserAskForHelp?: boolean;
46
+ canUserRenameSelfAndObserved?: boolean;
47
+ canUserRenameOthers?: boolean;
46
48
  }
47
49
  /**
48
50
  * @class InMeetingActions
@@ -86,6 +88,8 @@ export default class InMeetingActions implements IInMeetingActions {
86
88
  canAdmitLobbyToBreakout: any;
87
89
  isBreakoutPreassignmentsEnabled: any;
88
90
  canUserAskForHelp: any;
91
+ canUserRenameSelfAndObserved: any;
92
+ canUserRenameOthers: any;
89
93
  /**
90
94
  * Returns all meeting action options
91
95
  * @returns {Object}
@@ -340,4 +340,14 @@ export default class Members extends StatelessWebexPlugin {
340
340
  * @returns {Member}
341
341
  */
342
342
  getCsisForMember(memberId: any, mediaType?: string, mediaContent?: string): any[];
343
+ /**
344
+ * Edit display name of participants in a meeting
345
+ * @param {string} memberId - id of the participant who is receiving request
346
+ * @param {string} requestingParticipantId - id of the participant who is sending request (optional)
347
+ * @param {string} [alias] - alias name
348
+ * @returns {Promise}
349
+ * @public
350
+ * @memberof Members
351
+ */
352
+ editDisplayName(memberId: string, requestingParticipantId: string, alias: string): any;
343
353
  }
@@ -32,6 +32,17 @@ export default class MembersRequest extends StatelessWebexPlugin {
32
32
  assignRolesMember(options: any): any;
33
33
  raiseOrLowerHandMember(options: any): any;
34
34
  lowerAllHandsMember(options: any): any;
35
+ /**
36
+ *
37
+ * @param {Object} options with format of {locusUrl: string, requestingParticipantId: string}
38
+ * @returns {Promise}
39
+ * @throws {Error} if the options are not valid and complete, must have requestingParticipantId AND locusUrl
40
+ * @memberof MembersRequest
41
+ */
42
+ editDisplayNameMember(options: {
43
+ locusUrl: string;
44
+ requestingParticipantId: string;
45
+ }): any;
35
46
  transferHostToMember(options: any): any;
36
47
  /**
37
48
  * Sends a request to the DTMF endpoint to send tones
@@ -59,6 +59,12 @@ export declare class MediaRequestManager {
59
59
  * @returns {boolean} - True if they are equal, false otherwise.
60
60
  */
61
61
  private checkIsNewRequestsEqualToPrev;
62
+ /**
63
+ * Clears the previous media requests.
64
+ *
65
+ * @returns {void}
66
+ */
67
+ clearPreviousRequests(): void;
62
68
  private sendRequests;
63
69
  addRequest(mediaRequest: MediaRequest, commit?: boolean): MediaRequestId;
64
70
  cancelRequest(requestId: MediaRequestId, commit?: boolean): void;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@webex/plugin-meetings",
3
- "version": "3.0.0-beta.72",
3
+ "version": "3.0.0-beta.73",
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.72",
36
- "@webex/test-helper-chai": "3.0.0-beta.72",
37
- "@webex/test-helper-mocha": "3.0.0-beta.72",
38
- "@webex/test-helper-mock-webex": "3.0.0-beta.72",
39
- "@webex/test-helper-retry": "3.0.0-beta.72",
40
- "@webex/test-helper-test-users": "3.0.0-beta.72",
35
+ "@webex/plugin-meetings": "3.0.0-beta.73",
36
+ "@webex/test-helper-chai": "3.0.0-beta.73",
37
+ "@webex/test-helper-mocha": "3.0.0-beta.73",
38
+ "@webex/test-helper-mock-webex": "3.0.0-beta.73",
39
+ "@webex/test-helper-retry": "3.0.0-beta.73",
40
+ "@webex/test-helper-test-users": "3.0.0-beta.73",
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.72",
49
+ "@webex/common": "3.0.0-beta.73",
50
50
  "@webex/internal-media-core": "1.35.7",
51
- "@webex/internal-plugin-conversation": "3.0.0-beta.72",
52
- "@webex/internal-plugin-device": "3.0.0-beta.72",
53
- "@webex/internal-plugin-llm": "3.0.0-beta.72",
54
- "@webex/internal-plugin-mercury": "3.0.0-beta.72",
55
- "@webex/internal-plugin-metrics": "3.0.0-beta.72",
56
- "@webex/internal-plugin-support": "3.0.0-beta.72",
57
- "@webex/internal-plugin-user": "3.0.0-beta.72",
58
- "@webex/plugin-people": "3.0.0-beta.72",
59
- "@webex/plugin-rooms": "3.0.0-beta.72",
60
- "@webex/webex-core": "3.0.0-beta.72",
51
+ "@webex/internal-plugin-conversation": "3.0.0-beta.73",
52
+ "@webex/internal-plugin-device": "3.0.0-beta.73",
53
+ "@webex/internal-plugin-llm": "3.0.0-beta.73",
54
+ "@webex/internal-plugin-mercury": "3.0.0-beta.73",
55
+ "@webex/internal-plugin-metrics": "3.0.0-beta.73",
56
+ "@webex/internal-plugin-support": "3.0.0-beta.73",
57
+ "@webex/internal-plugin-user": "3.0.0-beta.73",
58
+ "@webex/plugin-people": "3.0.0-beta.73",
59
+ "@webex/plugin-rooms": "3.0.0-beta.73",
60
+ "@webex/webex-core": "3.0.0-beta.73",
61
61
  "ampersand-collection": "^2.0.2",
62
62
  "bowser": "^2.11.0",
63
63
  "btoa": "^1.2.1",
package/src/constants.ts CHANGED
@@ -7,6 +7,7 @@ export const AUDIO = 'audio';
7
7
  export const AUDIO_INPUT = 'audioinput';
8
8
  export const AUDIO_STATUS = 'audioStatus';
9
9
  export const ALERT = 'alert';
10
+ export const ALIAS = 'alias';
10
11
  export const ANSWER = 'answer';
11
12
 
12
13
  export const CALL = 'call';
@@ -803,6 +804,8 @@ export const DISPLAY_HINTS = {
803
804
  MUTE_ALL: 'MUTE_ALL',
804
805
  UNMUTE_ALL: 'UNMUTE_ALL',
805
806
  PRESENTER_CONTROL: 'PRESENTER_CONTROL',
807
+ CAN_RENAME_SELF_AND_OBSERVED: 'CAN_RENAME_SELF_AND_OBSERVED',
808
+ CAN_RENAME_OTHERS: 'CAN_RENAME_OTHERS',
806
809
 
807
810
  // breakout session
808
811
  BREAKOUT_MANAGEMENT: 'BREAKOUT_MANAGEMENT',
@@ -46,6 +46,8 @@ interface IInMeetingActions {
46
46
  canAdmitLobbyToBreakout?: boolean;
47
47
  isBreakoutPreassignmentsEnabled?: boolean;
48
48
  canUserAskForHelp?: boolean;
49
+ canUserRenameSelfAndObserved?: boolean;
50
+ canUserRenameOthers?: boolean;
49
51
  }
50
52
 
51
53
  /**
@@ -128,6 +130,10 @@ export default class InMeetingActions implements IInMeetingActions {
128
130
 
129
131
  canUserAskForHelp = null;
130
132
 
133
+ canUserRenameSelfAndObserved = null;
134
+
135
+ canUserRenameOthers = null;
136
+
131
137
  /**
132
138
  * Returns all meeting action options
133
139
  * @returns {Object}
@@ -170,6 +176,8 @@ export default class InMeetingActions implements IInMeetingActions {
170
176
  canAdmitLobbyToBreakout: this.canAdmitLobbyToBreakout,
171
177
  isBreakoutPreassignmentsEnabled: this.isBreakoutPreassignmentsEnabled,
172
178
  canUserAskForHelp: this.canUserAskForHelp,
179
+ canUserRenameSelfAndObserved: this.canUserRenameSelfAndObserved,
180
+ canUserRenameOthers: this.canUserRenameOthers,
173
181
  });
174
182
 
175
183
  /**
@@ -2338,6 +2338,10 @@ export default class Meeting extends StatelessWebexPlugin {
2338
2338
  payload.info.userDisplayHints
2339
2339
  ),
2340
2340
  canUserAskForHelp: MeetingUtil.canUserAskForHelp(payload.info.userDisplayHints),
2341
+ canUserRenameSelfAndObserved: MeetingUtil.canUserRenameSelfAndObserved(
2342
+ payload.info.userDisplayHints
2343
+ ),
2344
+ canUserRenameOthers: MeetingUtil.canUserRenameOthers(payload.info.userDisplayHints),
2341
2345
  });
2342
2346
 
2343
2347
  this.recordingController.setDisplayHints(payload.info.userDisplayHints);