@webex/plugin-meetings 3.0.0-beta.207 → 3.0.0-beta.209

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.
@@ -1 +1 @@
1
- {"version":3,"names":["InternalRequestInfo","request","pendingPromise","sendRequestFn","pendingPromises","push","then","result","forEach","d","resolve","catch","e","reject","isRequestAffectingConfluenceState","type","roapMessage","messageType","ROAP","ROAP_TYPES","OFFER","LocusMediaRequest","config","options","isRequestInProgress","queuedRequests","confluenceState","info","length","addPendingPromises","getPendingPromises","filter","r","nextRequest","shift","execute","executeNextQueuedRequest","audioMuted","latestAudioMuted","undefined","videoMuted","latestVideoMuted","uri","selfUrl","MEDIA","getLatestMuteState","body","device","correlationId","clientMediaPreferences","preferTranscoding","localMedias","respOnlySdp","usingResource","reachability","joinCookie","sequence","localSdp","mediaId","LoggerProxy","logger","method","HTTP_VERBS","PUT","muteOptions","Defer","newRequest","sendHttpRequest","bind","addToQueue","promise","WebexPlugin"],"sources":["locusMediaRequest.ts"],"sourcesContent":["/* eslint-disable valid-jsdoc */\nimport {defer} from 'lodash';\nimport {Defer} from '@webex/common';\nimport {WebexPlugin} from '@webex/webex-core';\nimport {MEDIA, HTTP_VERBS, ROAP} from '../constants';\nimport LoggerProxy from '../common/logs/logger-proxy';\n\nexport type MediaRequestType = 'RoapMessage' | 'LocalMute';\nexport type RequestResult = any;\n\nexport type RoapRequest = {\n type: 'RoapMessage';\n selfUrl: string;\n mediaId: string;\n roapMessage: any;\n reachability: any;\n sequence?: any;\n joinCookie: any; // any, because this is opaque to the client, we pass whatever object we got from one backend component (Orpheus) to the other (Locus)\n};\n\nexport type LocalMuteRequest = {\n type: 'LocalMute';\n selfUrl: string;\n mediaId: string;\n sequence?: any;\n muteOptions: {\n audioMuted?: boolean;\n videoMuted?: boolean;\n };\n};\n\nexport type Request = RoapRequest | LocalMuteRequest;\n\n/** Class representing a single /media request being sent to Locus */\nclass InternalRequestInfo {\n public readonly request: Request;\n private pendingPromises: Defer[];\n private sendRequestFn: (request: Request) => Promise<RequestResult>;\n\n /** Constructor */\n constructor(\n request: Request,\n pendingPromise: Defer,\n sendRequestFn: (request: Request) => Promise<RequestResult>\n ) {\n this.request = request;\n this.pendingPromises = [pendingPromise];\n this.sendRequestFn = sendRequestFn;\n }\n\n /**\n * Returns the list of pending promises associated with this request\n */\n public getPendingPromises() {\n return this.pendingPromises;\n }\n\n /**\n * Adds promises to the list of pending promises associated with this request\n */\n public addPendingPromises(pendingPromises: Defer[]) {\n this.pendingPromises.push(...pendingPromises);\n }\n\n /**\n * Executes the request. Returned promise is resolved once the request\n * is completed (no matter if it succeeded or failed).\n */\n public execute(): Promise<void> {\n return this.sendRequestFn(this.request)\n .then((result) => {\n // resolve all the pending promises associated with this request\n this.pendingPromises.forEach((d) => d.resolve(result));\n })\n .catch((e) => {\n // reject all the pending promises associated with this request\n this.pendingPromises.forEach((d) => d.reject(e));\n });\n }\n}\n\nexport type Config = {\n device: {\n url: string;\n deviceType: string;\n };\n correlationId: string;\n preferTranscoding: boolean;\n};\n\n/**\n * Returns true if the request is triggering confluence creation in the server\n */\nfunction isRequestAffectingConfluenceState(request: Request): boolean {\n return (\n request.type === 'RoapMessage' && request.roapMessage.messageType === ROAP.ROAP_TYPES.OFFER\n );\n}\n\n/**\n * This class manages all /media API requests to Locus. Every call to that\n * Locus API has to go through this class.\n */\nexport class LocusMediaRequest extends WebexPlugin {\n private config: Config;\n private latestAudioMuted?: boolean;\n private latestVideoMuted?: boolean;\n private isRequestInProgress: boolean;\n private queuedRequests: InternalRequestInfo[];\n private confluenceState: 'not created' | 'creation in progress' | 'created';\n /**\n * Constructor\n */\n constructor(config: Config, options: any) {\n super({}, options);\n this.isRequestInProgress = false;\n this.queuedRequests = [];\n this.config = config;\n this.confluenceState = 'not created';\n }\n\n /**\n * Add a request to the internal queue.\n */\n private addToQueue(info: InternalRequestInfo) {\n if (info.request.type === 'LocalMute' && this.queuedRequests.length > 0) {\n // We don't need additional local mute requests in the queue.\n // We only need at most 1 local mute or 1 roap request, because\n // roap requests also include mute state, so whatever request\n // is sent out, it will send the latest local mute state.\n // We only need to store the pendingPromises so that they get resolved\n // when the roap request is sent out.\n this.queuedRequests[0].addPendingPromises(info.getPendingPromises());\n\n return;\n }\n\n if (info.request.type === 'RoapMessage' && this.queuedRequests.length > 0) {\n // remove any LocalMute requests from the queue, because this Roap message\n // will also update the mute status in Locus, so they are redundant\n this.queuedRequests = this.queuedRequests.filter((r) => {\n if (r.request.type === 'LocalMute') {\n // we need to keep the pending promises from the local mute request\n // that we're removing from the queue\n info.addPendingPromises(r.getPendingPromises());\n\n return false;\n }\n\n return true;\n });\n }\n\n this.queuedRequests.push(info);\n }\n\n /**\n * Takes the next request from the queue and executes it. Once that\n * request is completed, the next one will be taken from the queue\n * and executed and this is repeated until the queue is empty.\n */\n private executeNextQueuedRequest(): void {\n if (this.isRequestInProgress) {\n return;\n }\n\n const nextRequest = this.queuedRequests.shift();\n\n if (nextRequest) {\n this.isRequestInProgress = true;\n nextRequest.execute().then(() => {\n this.isRequestInProgress = false;\n this.executeNextQueuedRequest();\n });\n }\n }\n\n /**\n * Returns latest requested audio and video mute values. If they have never been\n * requested, we assume audio/video to be muted.\n */\n private getLatestMuteState() {\n const audioMuted = this.latestAudioMuted !== undefined ? this.latestAudioMuted : true;\n const videoMuted = this.latestVideoMuted !== undefined ? this.latestVideoMuted : true;\n\n return {audioMuted, videoMuted};\n }\n\n /**\n * Prepares the uri and body for the media request to be sent to Locus\n */\n private sendHttpRequest(request: Request) {\n const uri = `${request.selfUrl}/${MEDIA}`;\n\n const {audioMuted, videoMuted} = this.getLatestMuteState();\n\n // first setup things common to all requests\n const body: any = {\n device: this.config.device,\n correlationId: this.config.correlationId,\n clientMediaPreferences: {\n preferTranscoding: this.config.preferTranscoding,\n },\n };\n\n const localMedias: any = {\n audioMuted,\n videoMuted,\n };\n\n // now add things specific to request type\n switch (request.type) {\n case 'LocalMute':\n body.respOnlySdp = true;\n body.usingResource = null;\n break;\n\n case 'RoapMessage':\n localMedias.roapMessage = request.roapMessage;\n localMedias.reachability = request.reachability;\n body.clientMediaPreferences.joinCookie = request.joinCookie;\n break;\n }\n\n if (request.sequence) {\n body.sequence = request.sequence;\n }\n\n body.localMedias = [\n {\n localSdp: JSON.stringify(localMedias), // this part must be JSON stringified, Locus requires this\n mediaId: request.mediaId,\n },\n ];\n\n LoggerProxy.logger.info(\n `Meeting:LocusMediaRequest#sendHttpRequest --> ${request.type} audioMuted=${audioMuted} videoMuted=${videoMuted}`\n );\n\n if (isRequestAffectingConfluenceState(request) && this.confluenceState === 'not created') {\n this.confluenceState = 'creation in progress';\n }\n\n // @ts-ignore\n return this.request({\n method: HTTP_VERBS.PUT,\n uri,\n body,\n })\n .then((result) => {\n if (isRequestAffectingConfluenceState(request)) {\n this.confluenceState = 'created';\n }\n\n return result;\n })\n .catch((e) => {\n if (\n isRequestAffectingConfluenceState(request) &&\n this.confluenceState === 'creation in progress'\n ) {\n this.confluenceState = 'not created';\n }\n throw e;\n });\n }\n\n /**\n * Sends a media request to Locus\n */\n public send(request: Request): Promise<RequestResult> {\n if (request.type === 'LocalMute') {\n const {audioMuted, videoMuted} = request.muteOptions;\n\n if (audioMuted !== undefined) {\n this.latestAudioMuted = audioMuted;\n }\n if (videoMuted !== undefined) {\n this.latestVideoMuted = videoMuted;\n }\n\n if (this.confluenceState === 'not created') {\n // if there is no confluence, there is no point sending out local mute request\n // as it will fail so we just store the latest audio/video muted values\n // and resolve immediately, so that higher layer (MuteState class) doesn't get blocked\n // and can call us again if user mutes/unmutes again before confluence is created\n LoggerProxy.logger.info(\n 'Meeting:LocusMediaRequest#send --> called with LocalMute request before confluence creation'\n );\n\n return Promise.resolve({});\n }\n }\n\n const pendingPromise = new Defer();\n\n const newRequest = new InternalRequestInfo(\n request,\n pendingPromise,\n this.sendHttpRequest.bind(this)\n );\n\n this.addToQueue(newRequest);\n\n defer(() => this.executeNextQueuedRequest());\n\n return pendingPromise.promise;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"names":["InternalRequestInfo","request","pendingPromise","sendRequestFn","pendingPromises","push","then","result","forEach","d","resolve","catch","e","reject","isRequestAffectingConfluenceState","type","roapMessage","messageType","ROAP","ROAP_TYPES","OFFER","LocusMediaRequest","config","options","isRequestInProgress","queuedRequests","confluenceState","info","length","addPendingPromises","getPendingPromises","filter","r","nextRequest","shift","execute","executeNextQueuedRequest","audioMuted","latestAudioMuted","undefined","videoMuted","latestVideoMuted","uri","selfUrl","MEDIA","getLatestMuteState","body","device","correlationId","clientMediaPreferences","preferTranscoding","localMedias","respOnlySdp","usingResource","reachability","joinCookie","sequence","localSdp","mediaId","LoggerProxy","logger","method","HTTP_VERBS","PUT","muteOptions","Defer","newRequest","sendHttpRequest","bind","addToQueue","promise","WebexPlugin"],"sources":["locusMediaRequest.ts"],"sourcesContent":["/* eslint-disable valid-jsdoc */\nimport {defer} from 'lodash';\nimport {Defer} from '@webex/common';\nimport {WebexPlugin} from '@webex/webex-core';\nimport {MEDIA, HTTP_VERBS, ROAP} from '../constants';\nimport LoggerProxy from '../common/logs/logger-proxy';\n\nexport type MediaRequestType = 'RoapMessage' | 'LocalMute';\nexport type RequestResult = any;\n\nexport type RoapRequest = {\n type: 'RoapMessage';\n selfUrl: string;\n mediaId: string;\n roapMessage: any;\n reachability: any;\n sequence?: any;\n joinCookie: any; // any, because this is opaque to the client, we pass whatever object we got from one backend component (Orpheus) to the other (Locus)\n};\n\nexport type LocalMuteRequest = {\n type: 'LocalMute';\n selfUrl: string;\n mediaId: string;\n sequence?: any;\n muteOptions: {\n audioMuted?: boolean;\n videoMuted?: boolean;\n };\n};\n\nexport type Request = RoapRequest | LocalMuteRequest;\n\n/** Class representing a single /media request being sent to Locus */\nclass InternalRequestInfo {\n public readonly request: Request;\n private pendingPromises: Defer[];\n private sendRequestFn: (request: Request) => Promise<RequestResult>;\n\n /** Constructor */\n constructor(\n request: Request,\n pendingPromise: Defer,\n sendRequestFn: (request: Request) => Promise<RequestResult>\n ) {\n this.request = request;\n this.pendingPromises = [pendingPromise];\n this.sendRequestFn = sendRequestFn;\n }\n\n /**\n * Returns the list of pending promises associated with this request\n */\n public getPendingPromises() {\n return this.pendingPromises;\n }\n\n /**\n * Adds promises to the list of pending promises associated with this request\n */\n public addPendingPromises(pendingPromises: Defer[]) {\n this.pendingPromises.push(...pendingPromises);\n }\n\n /**\n * Executes the request. Returned promise is resolved once the request\n * is completed (no matter if it succeeded or failed).\n */\n public execute(): Promise<void> {\n return this.sendRequestFn(this.request)\n .then((result) => {\n // resolve all the pending promises associated with this request\n this.pendingPromises.forEach((d) => d.resolve(result));\n })\n .catch((e) => {\n // reject all the pending promises associated with this request\n this.pendingPromises.forEach((d) => d.reject(e));\n });\n }\n}\n\nexport type Config = {\n device: {\n url: string;\n deviceType: string;\n countryCode?: string;\n regionCode?: string;\n };\n correlationId: string;\n preferTranscoding: boolean;\n};\n\n/**\n * Returns true if the request is triggering confluence creation in the server\n */\nfunction isRequestAffectingConfluenceState(request: Request): boolean {\n return (\n request.type === 'RoapMessage' && request.roapMessage.messageType === ROAP.ROAP_TYPES.OFFER\n );\n}\n\n/**\n * This class manages all /media API requests to Locus. Every call to that\n * Locus API has to go through this class.\n */\nexport class LocusMediaRequest extends WebexPlugin {\n private config: Config;\n private latestAudioMuted?: boolean;\n private latestVideoMuted?: boolean;\n private isRequestInProgress: boolean;\n private queuedRequests: InternalRequestInfo[];\n private confluenceState: 'not created' | 'creation in progress' | 'created';\n /**\n * Constructor\n */\n constructor(config: Config, options: any) {\n super({}, options);\n this.isRequestInProgress = false;\n this.queuedRequests = [];\n this.config = config;\n this.confluenceState = 'not created';\n }\n\n /**\n * Add a request to the internal queue.\n */\n private addToQueue(info: InternalRequestInfo) {\n if (info.request.type === 'LocalMute' && this.queuedRequests.length > 0) {\n // We don't need additional local mute requests in the queue.\n // We only need at most 1 local mute or 1 roap request, because\n // roap requests also include mute state, so whatever request\n // is sent out, it will send the latest local mute state.\n // We only need to store the pendingPromises so that they get resolved\n // when the roap request is sent out.\n this.queuedRequests[0].addPendingPromises(info.getPendingPromises());\n\n return;\n }\n\n if (info.request.type === 'RoapMessage' && this.queuedRequests.length > 0) {\n // remove any LocalMute requests from the queue, because this Roap message\n // will also update the mute status in Locus, so they are redundant\n this.queuedRequests = this.queuedRequests.filter((r) => {\n if (r.request.type === 'LocalMute') {\n // we need to keep the pending promises from the local mute request\n // that we're removing from the queue\n info.addPendingPromises(r.getPendingPromises());\n\n return false;\n }\n\n return true;\n });\n }\n\n this.queuedRequests.push(info);\n }\n\n /**\n * Takes the next request from the queue and executes it. Once that\n * request is completed, the next one will be taken from the queue\n * and executed and this is repeated until the queue is empty.\n */\n private executeNextQueuedRequest(): void {\n if (this.isRequestInProgress) {\n return;\n }\n\n const nextRequest = this.queuedRequests.shift();\n\n if (nextRequest) {\n this.isRequestInProgress = true;\n nextRequest.execute().then(() => {\n this.isRequestInProgress = false;\n this.executeNextQueuedRequest();\n });\n }\n }\n\n /**\n * Returns latest requested audio and video mute values. If they have never been\n * requested, we assume audio/video to be muted.\n */\n private getLatestMuteState() {\n const audioMuted = this.latestAudioMuted !== undefined ? this.latestAudioMuted : true;\n const videoMuted = this.latestVideoMuted !== undefined ? this.latestVideoMuted : true;\n\n return {audioMuted, videoMuted};\n }\n\n /**\n * Prepares the uri and body for the media request to be sent to Locus\n */\n private sendHttpRequest(request: Request) {\n const uri = `${request.selfUrl}/${MEDIA}`;\n\n const {audioMuted, videoMuted} = this.getLatestMuteState();\n\n // first setup things common to all requests\n const body: any = {\n device: this.config.device,\n correlationId: this.config.correlationId,\n clientMediaPreferences: {\n preferTranscoding: this.config.preferTranscoding,\n },\n };\n\n const localMedias: any = {\n audioMuted,\n videoMuted,\n };\n\n // now add things specific to request type\n switch (request.type) {\n case 'LocalMute':\n body.respOnlySdp = true;\n body.usingResource = null;\n break;\n\n case 'RoapMessage':\n localMedias.roapMessage = request.roapMessage;\n localMedias.reachability = request.reachability;\n body.clientMediaPreferences.joinCookie = request.joinCookie;\n break;\n }\n\n if (request.sequence) {\n body.sequence = request.sequence;\n }\n\n body.localMedias = [\n {\n localSdp: JSON.stringify(localMedias), // this part must be JSON stringified, Locus requires this\n mediaId: request.mediaId,\n },\n ];\n\n LoggerProxy.logger.info(\n `Meeting:LocusMediaRequest#sendHttpRequest --> ${request.type} audioMuted=${audioMuted} videoMuted=${videoMuted}`\n );\n\n if (isRequestAffectingConfluenceState(request) && this.confluenceState === 'not created') {\n this.confluenceState = 'creation in progress';\n }\n\n // @ts-ignore\n return this.request({\n method: HTTP_VERBS.PUT,\n uri,\n body,\n })\n .then((result) => {\n if (isRequestAffectingConfluenceState(request)) {\n this.confluenceState = 'created';\n }\n\n return result;\n })\n .catch((e) => {\n if (\n isRequestAffectingConfluenceState(request) &&\n this.confluenceState === 'creation in progress'\n ) {\n this.confluenceState = 'not created';\n }\n throw e;\n });\n }\n\n /**\n * Sends a media request to Locus\n */\n public send(request: Request): Promise<RequestResult> {\n if (request.type === 'LocalMute') {\n const {audioMuted, videoMuted} = request.muteOptions;\n\n if (audioMuted !== undefined) {\n this.latestAudioMuted = audioMuted;\n }\n if (videoMuted !== undefined) {\n this.latestVideoMuted = videoMuted;\n }\n\n if (this.confluenceState === 'not created') {\n // if there is no confluence, there is no point sending out local mute request\n // as it will fail so we just store the latest audio/video muted values\n // and resolve immediately, so that higher layer (MuteState class) doesn't get blocked\n // and can call us again if user mutes/unmutes again before confluence is created\n LoggerProxy.logger.info(\n 'Meeting:LocusMediaRequest#send --> called with LocalMute request before confluence creation'\n );\n\n return Promise.resolve({});\n }\n }\n\n const pendingPromise = new Defer();\n\n const newRequest = new InternalRequestInfo(\n request,\n pendingPromise,\n this.sendHttpRequest.bind(this)\n );\n\n this.addToQueue(newRequest);\n\n defer(() => this.executeNextQueuedRequest());\n\n return pendingPromise.promise;\n }\n}\n"],"mappings":"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"}
@@ -172,11 +172,11 @@ var MeetingRequest = /*#__PURE__*/function (_StatelessWebexPlugin) {
172
172
  body.deviceCapabilities = deviceCapabilities;
173
173
  }
174
174
  // @ts-ignore
175
- if (this.webex.meetings.clientRegion) {
175
+ if (this.webex.meetings.geoHintInfo) {
176
176
  // @ts-ignore
177
- body.device.countryCode = this.webex.meetings.clientRegion.countryCode;
177
+ body.device.countryCode = this.webex.meetings.geoHintInfo.countryCode;
178
178
  // @ts-ignore
179
- body.device.regionCode = this.webex.meetings.clientRegion.regionCode;
179
+ body.device.regionCode = this.webex.meetings.geoHintInfo.regionCode;
180
180
  }
181
181
  if (moderator !== undefined) {
182
182
  body.moderator = moderator;
@@ -1 +1 @@
1
- {"version":3,"names":["MeetingRequest","attrs","options","meeting","otherAttrs","webex","boundedStorage","get","REACHABILITY","namespace","localStorageJoinCookie","catch","joinCookieRaw","joinCookie","JSON","parse","LoggerProxy","logger","error","locusDeltaRequest","MeetingUtil","generateLocusDeltaRequest","changeVideoLayoutDebounced","changeVideoLayout","leading","trailing","asResourceOccupant","inviteeAddress","meetingNumber","permissionToken","deviceUrl","locusUrl","resourceId","correlationId","ensureConversation","moderator","pin","moveToResource","roapMessage","preferTranscoding","breakoutsSupported","locale","deviceCapabilities","liveAnnotationSupported","info","url","getJoinCookie","body","device","deviceType","config","meetings","usingResource","moveMediaToResource","respOnlySdp","allowMultiDevice","supportsNativeLobby","clientMediaPreferences","push","BREAKOUTS","BREAKOUTS_SUPPORTED","ANNOTATION","ANNOTATION_ON_SHARE_SUPPORTED","length","clientRegion","countryCode","regionCode","undefined","PARTICIPANT","internal","services","waitForCatalog","LOCI","CALL","invitee","address","concat","ALTERNATE_REDIRECT_TRUE","callPreferences","requestedMedia","_SLIDES_","localMedias","request","method","HTTP_VERBS","POST","uri","captchaRefreshUrl","captchaId","err","dialInUrl","clientUrl","PROVISIONAL","provisionalType","PROVISIONAL_TYPE_DIAL_IN","dialOutUrl","phoneNumber","PROVISIONAL_TYPE_DIAL_OUT","dialoutAddress","GET","reject","phoneUrl","selfId","LEAVE","PUT","ALERT","CONTROLS","lock","locked","PATCH","DECLINE","reason","floorReq","disposition","FLOOR_ACTION","GRANTED","beneficiary","personUrl","devices","requester","floor","resourceUrl","resourceToken","annotationInfo","annotation","tones","SEND_DTMF_ENDPOINT","dtmf","uuid","v4","layoutType","main","content","width","height","Error","renderInfoMain","renderInfoContent","layoutParams","renderInfo","layout","type","END","keepAliveUrl","reactionChannelUrl","reaction","participantId","sender","enable","requestingParticipantId","reactions","enabled","StatelessWebexPlugin"],"sources":["request.ts"],"sourcesContent":["import uuid from 'uuid';\nimport {debounce} from 'lodash';\n// @ts-ignore\nimport {StatelessWebexPlugin} from '@webex/webex-core';\n// @ts-ignore\nimport {deviceType} from '@webex/common';\n\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport {\n ALERT,\n ALTERNATE_REDIRECT_TRUE,\n BREAKOUTS,\n CALL,\n CONTROLS,\n DECLINE,\n END,\n FLOOR_ACTION,\n HTTP_VERBS,\n LEAVE,\n LOCI,\n PARTICIPANT,\n PROVISIONAL_TYPE_DIAL_IN,\n PROVISIONAL_TYPE_DIAL_OUT,\n REACHABILITY,\n SEND_DTMF_ENDPOINT,\n _SLIDES_,\n ANNOTATION,\n} from '../constants';\nimport {SendReactionOptions, ToggleReactionsOptions} from './request.type';\nimport MeetingUtil from './util';\nimport {AnnotationInfo} from '../annotation/annotation.types';\n\n/**\n * @class MeetingRequest\n */\nexport default class MeetingRequest extends StatelessWebexPlugin {\n changeVideoLayoutDebounced: any;\n meetingRef: WeakRef<any>;\n locusDeltaRequest: (options: object) => Promise<any>;\n\n /**\n * Constructor\n * @param {Object} attrs\n * @param {Object} options\n */\n constructor(attrs: any, options: any) {\n const {meeting, ...otherAttrs} = attrs;\n\n super(otherAttrs, options);\n\n this.locusDeltaRequest = MeetingUtil.generateLocusDeltaRequest(meeting);\n\n this.changeVideoLayoutDebounced = debounce(this.changeVideoLayout, 2000, {\n leading: true,\n trailing: true,\n });\n }\n\n /**\n * Returns joinCookie from boundedStorage if present.\n * @returns {Object} joinCookie\n */\n private getJoinCookie = async () => {\n // @ts-ignore\n const joinCookieRaw = await this.webex.boundedStorage\n .get(REACHABILITY.namespace, REACHABILITY.localStorageJoinCookie)\n .catch(() => {});\n\n if (joinCookieRaw) {\n try {\n const joinCookie = JSON.parse(joinCookieRaw);\n if (joinCookie) {\n return joinCookie;\n }\n } catch (e) {\n LoggerProxy.logger.error(\n `MeetingRequest#constructor --> Error in parsing join cookie data: ${e}`\n );\n }\n }\n\n return null;\n };\n\n /**\n * Make a network request to join a meeting\n * @param {Object} options\n * @param {String} options.sipUri\n * @param {String} options.deviceUrl\n * @param {String} options.locusUrl\n * @param {String} options.resourceId,\n * @param {String} options.correlationId\n * @param {boolean} options.ensureConversation\n * @param {boolean} options.moderator\n * @param {boolean} options.pin\n * @param {boolean} options.moveToResource\n * @param {Object} options.roapMessage\n * @param {boolean} options.breakoutsSupported\n * @param {String} options.locale,\n * @param {Array} options.deviceCapabilities\n * @param {boolean} options.liveAnnotationSupported\n * @returns {Promise}\n */\n async joinMeeting(options: {\n sipUri: string;\n deviceUrl: string;\n locusUrl: string;\n resourceId: string;\n correlationId: string;\n ensureConversation: boolean;\n moderator: boolean;\n pin: boolean;\n moveToResource: boolean;\n roapMessage: any;\n asResourceOccupant: any;\n inviteeAddress: any;\n meetingNumber: any;\n permissionToken: any;\n preferTranscoding: any;\n breakoutsSupported: boolean;\n locale?: string;\n deviceCapabilities?: Array<string>;\n liveAnnotationSupported: boolean;\n }) {\n const {\n asResourceOccupant,\n inviteeAddress,\n meetingNumber,\n permissionToken,\n deviceUrl,\n locusUrl,\n resourceId,\n correlationId,\n ensureConversation,\n moderator,\n pin,\n moveToResource,\n roapMessage,\n preferTranscoding,\n breakoutsSupported,\n locale,\n deviceCapabilities = [],\n liveAnnotationSupported,\n } = options;\n\n LoggerProxy.logger.info('Meeting:request#joinMeeting --> Joining a meeting', correlationId);\n\n let url = '';\n\n const joinCookie = await this.getJoinCookie();\n\n const body: any = {\n asResourceOccupant,\n device: {\n url: deviceUrl,\n // @ts-ignore - config comes from registerPlugin\n deviceType: this.config.meetings.deviceType,\n },\n usingResource: resourceId || null,\n moveMediaToResource: (resourceId && moveToResource) || false,\n correlationId,\n respOnlySdp: true,\n allowMultiDevice: true,\n ensureConversation: ensureConversation || false,\n supportsNativeLobby: 1,\n clientMediaPreferences: {\n preferTranscoding: preferTranscoding ?? true,\n joinCookie,\n },\n };\n\n if (breakoutsSupported) {\n deviceCapabilities.push(BREAKOUTS.BREAKOUTS_SUPPORTED);\n }\n if (liveAnnotationSupported) {\n deviceCapabilities.push(ANNOTATION.ANNOTATION_ON_SHARE_SUPPORTED);\n }\n\n if (locale) {\n body.locale = locale;\n }\n\n // add deviceCapabilities prop\n if (deviceCapabilities.length) {\n body.deviceCapabilities = deviceCapabilities;\n }\n // @ts-ignore\n if (this.webex.meetings.clientRegion) {\n // @ts-ignore\n body.device.countryCode = this.webex.meetings.clientRegion.countryCode;\n // @ts-ignore\n body.device.regionCode = this.webex.meetings.clientRegion.regionCode;\n }\n\n if (moderator !== undefined) {\n body.moderator = moderator;\n }\n\n if (permissionToken) {\n body.permissionToken = permissionToken;\n }\n\n if (pin !== undefined) {\n body.pin = pin;\n }\n\n if (locusUrl) {\n url = `${locusUrl}/${PARTICIPANT}`;\n } else if (inviteeAddress || meetingNumber) {\n try {\n // @ts-ignore\n await this.webex.internal.services.waitForCatalog('postauth');\n // @ts-ignore\n url = `${this.webex.internal.services.get('locus')}/${LOCI}/${CALL}`;\n body.invitee = {\n address: inviteeAddress || `wbxmn:${meetingNumber}`,\n };\n } catch (e) {\n LoggerProxy.logger.error(\n `Meeting:request#joinMeeting Error Joining ${inviteeAddress || meetingNumber} --> ${e}`\n );\n throw e;\n }\n }\n\n // TODO: -- this will be resolved in SDK request\n url = url.concat(`?${ALTERNATE_REDIRECT_TRUE}`);\n\n if (resourceId === inviteeAddress) {\n body.callPreferences = {\n requestedMedia: [_SLIDES_],\n };\n }\n\n if (roapMessage) {\n body.localMedias = roapMessage.localMedias;\n }\n\n /// @ts-ignore\n return this.request({\n method: HTTP_VERBS.POST,\n uri: url,\n body,\n });\n }\n\n /**\n * Send a request to refresh the captcha\n * @param {Object} options\n * @param {String} options.captchaRefreshUrl\n * @param {String} options.captchaId\n * @returns {Promise}\n * @private\n */\n private refreshCaptcha({\n captchaRefreshUrl,\n captchaId,\n }: {\n captchaRefreshUrl: string;\n captchaId: string;\n }) {\n const body = {\n captchaId,\n };\n\n // @ts-ignore\n return this.request({\n method: HTTP_VERBS.POST,\n uri: captchaRefreshUrl,\n body,\n }).catch((err) => {\n LoggerProxy.logger.error(`Meeting:request#refreshCaptcha --> Error: ${err}`);\n\n throw err;\n });\n }\n\n /**\n * Make a network request to add a dial in device\n * @param {Object} options\n * @param {String} options.correlationId\n * @param {String} options.locusUrl url for the meeting\n * @param {String} options.dialInUrl identifier for the to-be provisioned device\n * @param {String} options.clientUrl identifier for the web device\n * @returns {Promise}\n * @private\n */\n private dialIn({\n locusUrl,\n dialInUrl,\n clientUrl,\n correlationId,\n }: {\n correlationId: string;\n locusUrl: string;\n dialInUrl: string;\n clientUrl: string;\n }) {\n LoggerProxy.logger.info(\n 'Meeting:request#dialIn --> Provisioning a dial in device',\n correlationId\n );\n const uri = `${locusUrl}/${PARTICIPANT}`;\n\n const body = {\n device: {\n deviceType: deviceType.PROVISIONAL,\n provisionalType: PROVISIONAL_TYPE_DIAL_IN,\n url: dialInUrl,\n clientUrl,\n },\n correlationId,\n };\n\n // @ts-ignore\n return this.locusDeltaRequest({\n method: HTTP_VERBS.POST,\n uri,\n body,\n }).catch((err) => {\n LoggerProxy.logger.error(\n `Meeting:request#dialIn --> Error provisioning a dial in device, error ${err}`\n );\n\n throw err;\n });\n }\n\n /**\n * Make a network request to add a dial out device\n * @param {Object} options\n * @param {String} options.correlationId\n * @param {String} options.locusUrl url for the meeting\n * @param {String} options.dialOutUrl identifier for the to-be provisioned device\n * @param {String} options.phoneNumber phone number to dial out to\n * @param {String} options.clientUrl identifier for the web device\n * @returns {Promise}\n * @private\n */\n private dialOut({\n locusUrl,\n dialOutUrl,\n phoneNumber,\n clientUrl,\n correlationId,\n }: {\n correlationId: string;\n locusUrl: string;\n dialOutUrl: string;\n phoneNumber: string;\n clientUrl: string;\n }) {\n LoggerProxy.logger.info(\n 'Meeting:request#dialOut --> Provisioning a dial out device',\n correlationId\n );\n const uri = `${locusUrl}/${PARTICIPANT}`;\n\n const body = {\n device: {\n deviceType: deviceType.PROVISIONAL,\n provisionalType: PROVISIONAL_TYPE_DIAL_OUT,\n url: dialOutUrl,\n dialoutAddress: phoneNumber,\n clientUrl,\n },\n correlationId,\n };\n\n // @ts-ignore\n return this.locusDeltaRequest({\n method: HTTP_VERBS.POST,\n uri,\n body,\n }).catch((err) => {\n LoggerProxy.logger.error(\n `Meeting:request#dialOut --> Error provisioning a dial out device, error ${err}`\n );\n\n throw err;\n });\n }\n\n /**\n * Sends a requests to get the latest locus DTO, it might be a full Locus or a delta, depending on the url provided\n * @param {Object} options\n * @param {String} options.locusUrl sync url to get ht elatest locus delta\n * @returns {Promise}\n */\n getLocusDTO(options: {url: string}) {\n const {url} = options;\n\n if (url) {\n // @ts-ignore\n return this.request({\n method: HTTP_VERBS.GET,\n uri: url,\n }).catch((err) => {\n LoggerProxy.logger.error(\n `Meeting:request#getLocusDTO --> Error getting latest locus, error ${err}`\n );\n\n return err;\n });\n }\n\n return Promise.reject();\n }\n\n /**\n * Make a network request to make a provisioned phone leave the meeting\n * @param {Object} options\n * @param {String} options.locusUrl\n * @param {String} options.phoneUrl\n * @param {String} options.correlationId\n * @param {String} options.selfId\n * @returns {Promise}\n * @private\n */\n private disconnectPhoneAudio({\n locusUrl,\n phoneUrl,\n correlationId,\n selfId,\n }: {\n locusUrl: string;\n phoneUrl: string;\n correlationId: string;\n selfId: string;\n }) {\n LoggerProxy.logger.info(\n `Meeting:request#disconnectPhoneAudio --> request phone ${phoneUrl} to leave`,\n correlationId\n );\n const uri = `${locusUrl}/${PARTICIPANT}/${selfId}/${LEAVE}`;\n\n const body = {\n device: {\n deviceType: deviceType.PROVISIONAL,\n url: phoneUrl,\n },\n correlationId,\n };\n\n // @ts-ignore\n return this.locusDeltaRequest({\n method: HTTP_VERBS.PUT,\n uri,\n body,\n }).catch((err) => {\n LoggerProxy.logger.error(\n `Meeting:request#disconnectPhoneAudio --> Error when requesting phone ${phoneUrl} to leave, error ${err}`\n );\n\n throw err;\n });\n }\n\n /**\n * Make a network request to leave a meeting\n * @param {Object} options\n * @param {Url} options.locusUrl\n * @param {String} options.selfId\n * @param {Url} options.deviceUrl\n * @param {String} options.resourceId,\n * @param {String} options.correlationId\n * @returns {Promise}\n */\n leaveMeeting({\n locusUrl,\n selfId,\n deviceUrl: url,\n resourceId,\n correlationId,\n }: {\n locusUrl: string;\n selfId: string;\n deviceUrl: string;\n resourceId: string;\n correlationId: string;\n }) {\n LoggerProxy.logger.info('Meeting:request#leaveMeeting --> Leaving a meeting', correlationId);\n\n const uri = `${locusUrl}/${PARTICIPANT}/${selfId}/${LEAVE}`;\n const body = {\n device: {\n // @ts-ignore\n deviceType: this.config.meetings.deviceType,\n url,\n },\n usingResource: resourceId || null,\n correlationId,\n };\n\n return this.locusDeltaRequest({\n method: HTTP_VERBS.PUT,\n uri,\n body,\n });\n }\n\n /**\n * Make a network request to acknowledge a meeting\n * @param {Object} options\n * @param {String} options.locusUrl\n * @param {String} options.deviceUrl\n * @param {String} options.correlationId\n * @returns {Promise}\n */\n acknowledgeMeeting(options: {locusUrl: string; deviceUrl: string; correlationId: string}) {\n const uri = `${options.locusUrl}/${PARTICIPANT}/${ALERT}`;\n const body = {\n device: {\n // @ts-ignore\n deviceType: this.config.meetings.deviceType,\n url: options.deviceUrl,\n },\n correlationId: options.correlationId,\n };\n\n return this.locusDeltaRequest({\n method: HTTP_VERBS.PUT,\n uri,\n body,\n });\n }\n\n /**\n * Makes a network request to lock the meeting\n * @param {Object} options\n * @param {Boolean} options.lock Whether it is locked or not\n * @returns {Promise}\n */\n lockMeeting(options) {\n const uri = `${options.locusUrl}/${CONTROLS}`;\n const body = {\n lock: {\n locked: options.lock,\n },\n };\n\n return this.locusDeltaRequest({\n method: HTTP_VERBS.PATCH,\n uri,\n body,\n });\n }\n\n /**\n * Make a network request to decline a meeting\n * @param {Object} options\n * @param {String} options.locusUrl\n * @param {String} options.deviceUrl\n * @param {String} options.reason\n * @returns {Promise}\n */\n declineMeeting(options: {locusUrl: string; deviceUrl: string; reason: string}) {\n const uri = `${options.locusUrl}/${PARTICIPANT}/${DECLINE}`;\n const body = {\n device: {\n // @ts-ignore\n deviceType: this.config.meetings.deviceType,\n url: options.deviceUrl,\n },\n ...(options.reason && {reason: options.reason}),\n };\n\n return this.locusDeltaRequest({\n method: HTTP_VERBS.PUT,\n uri,\n body,\n });\n }\n\n /**\n * change the content floor grant\n * @param {Object} options options for floor grant\n * @param {String} options.disposition floor action (granted/released)\n * @param {String} options.personUrl personUrl who is requesting floor\n * @param {String} options.deviceUrl Url of a device\n * @param {String} options.resourceId Populated if you are paired to a device\n * @param {String} options.uri floor grant uri\n * @returns {Promise}\n */\n changeMeetingFloor(\n options:\n | {\n disposition: string;\n personUrl: string;\n deviceUrl: string;\n resourceId: string;\n uri: string;\n annotationInfo: AnnotationInfo;\n }\n | any\n ) {\n let floorReq: any = {disposition: options.disposition};\n\n /* istanbul ignore else */\n if (options.disposition === FLOOR_ACTION.GRANTED) {\n floorReq = {\n beneficiary: {\n url: options.personUrl,\n devices: [\n {\n // @ts-ignore\n deviceType: this.config.meetings.deviceType,\n url: options.deviceUrl,\n },\n ],\n },\n disposition: options.disposition,\n requester: {\n url: options.personUrl,\n },\n };\n }\n\n const body: any = {\n floor: floorReq,\n resourceUrl: options.resourceUrl,\n };\n\n if (options?.resourceToken) {\n body.resourceToken = options?.resourceToken;\n }\n if (options?.annotationInfo) {\n body.annotation = options?.annotationInfo;\n }\n\n // @ts-ignore\n return this.request({\n uri: options.uri,\n method: HTTP_VERBS.PUT,\n body,\n });\n }\n\n /**\n * Sends a request to the DTMF endpoint to send tones\n * @param {Object} options\n * @param {String} options.locusUrl\n * @param {String} options.deviceUrl\n * @param {String} options.tones a string of one or more DTMF tones to send\n * @returns {Promise}\n */\n sendDTMF({locusUrl, deviceUrl, tones}: {locusUrl: string; deviceUrl: string; tones: string}) {\n // @ts-ignore\n return this.locusDeltaRequest({\n method: HTTP_VERBS.POST,\n uri: `${locusUrl}/${SEND_DTMF_ENDPOINT}`,\n body: {\n deviceUrl,\n dtmf: {\n correlationId: uuid.v4(),\n tones,\n },\n },\n });\n }\n\n /**\n * Sends a request to the controls endpoint to set the video layout\n * @param {Object} options\n * @param {String} options.locusUrl\n * @param {String} options.deviceUrl\n * @param {String} options.layoutType a layout type that should be available in meeting constants {@link #layout_types}\n * @param {Object} options.main preferred dimensions for the remote main video stream\n * @param {Number} options.main.width preferred width of main video stream\n * @param {Number} options.main.height preferred height of main video stream\n * @param {Object} options.content preferred dimensions for the remote content share stream\n * @param {Number} options.content.width preferred width of content share stream\n * @param {Number} options.content.height preferred height of content share stream\n * @returns {Promise}\n */\n changeVideoLayout({\n locusUrl,\n deviceUrl,\n layoutType,\n main,\n content,\n }: {\n locusUrl: string;\n deviceUrl: string;\n layoutType: string;\n main: {\n width: number;\n height: number;\n };\n content: {\n width: number;\n height: number;\n };\n }) {\n // send main/content renderInfo only if both width and height are specified\n if (main && (!main.width || !main.height)) {\n return Promise.reject(\n new Error(\n `Both width and height must be specified. One of them is missing for main: ${JSON.stringify(\n main\n )}`\n )\n );\n }\n\n if (content && (!content.width || !content.height)) {\n return Promise.reject(\n new Error(\n `Both width and height must be specified. One of them is missing for content: ${JSON.stringify(\n content\n )}`\n )\n );\n }\n\n const renderInfoMain = main ? {width: main.width, height: main.height} : undefined;\n const renderInfoContent = content ? {width: content.width, height: content.height} : undefined;\n\n const layoutParams =\n renderInfoMain || renderInfoContent\n ? {\n renderInfo: {\n main: renderInfoMain,\n content: renderInfoContent,\n },\n }\n : undefined;\n\n // @ts-ignore\n return this.locusDeltaRequest({\n method: HTTP_VERBS.PUT,\n uri: `${locusUrl}/${CONTROLS}`,\n body: {\n layout: {\n deviceUrl,\n type: layoutType,\n layoutParams,\n },\n },\n });\n }\n\n /**\n * Make a network request to end meeting for all\n * @param {Object} options\n * @param {Url} options.locusUrl\n * @returns {Promise}\n */\n endMeetingForAll({locusUrl}: {locusUrl: string}) {\n const uri = `${locusUrl}/${END}`;\n\n // @ts-ignore\n return this.locusDeltaRequest({\n method: HTTP_VERBS.POST,\n uri,\n });\n }\n\n /**\n * Send a locus keepAlive (used in lobby)\n * @param {Object} options\n * @param {Url} options.keepAliveUrl\n * @returns {Promise}\n */\n keepAlive({keepAliveUrl}: {keepAliveUrl: string}) {\n // @ts-ignore\n return this.request({\n method: HTTP_VERBS.GET,\n uri: keepAliveUrl,\n });\n }\n\n /**\n * Make a network request to send a reaction.\n * @param {Object} options\n * @param {Url} options.reactionChannelUrl\n * @param {Reaction} options.reaction\n * @param {string} options.senderID\n * @returns {Promise}\n */\n sendReaction({reactionChannelUrl, reaction, participantId}: SendReactionOptions) {\n const uri = reactionChannelUrl;\n\n // @ts-ignore\n return this.request({\n method: HTTP_VERBS.POST,\n uri,\n body: {\n sender: {participantId},\n reaction,\n },\n });\n }\n\n /**\n * Make a network request to enable or disable reactions.\n * @param {boolean} options.enable - determines if we need to enable or disable.\n * @param {locusUrl} options.locusUrl\n * @returns {Promise}\n */\n toggleReactions({enable, locusUrl, requestingParticipantId}: ToggleReactionsOptions) {\n const uri = `${locusUrl}/${CONTROLS}`;\n\n // @ts-ignore\n return this.locusDeltaRequest({\n method: HTTP_VERBS.PUT,\n uri,\n body: {\n reactions: {\n enabled: enable,\n },\n requestingParticipantId,\n },\n });\n }\n\n getLocusStatusByUrl(locusUrl: string) {\n // @ts-ignore\n return this.request({\n method: HTTP_VERBS.GET,\n uri: locusUrl,\n });\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"names":["MeetingRequest","attrs","options","meeting","otherAttrs","webex","boundedStorage","get","REACHABILITY","namespace","localStorageJoinCookie","catch","joinCookieRaw","joinCookie","JSON","parse","LoggerProxy","logger","error","locusDeltaRequest","MeetingUtil","generateLocusDeltaRequest","changeVideoLayoutDebounced","changeVideoLayout","leading","trailing","asResourceOccupant","inviteeAddress","meetingNumber","permissionToken","deviceUrl","locusUrl","resourceId","correlationId","ensureConversation","moderator","pin","moveToResource","roapMessage","preferTranscoding","breakoutsSupported","locale","deviceCapabilities","liveAnnotationSupported","info","url","getJoinCookie","body","device","deviceType","config","meetings","usingResource","moveMediaToResource","respOnlySdp","allowMultiDevice","supportsNativeLobby","clientMediaPreferences","push","BREAKOUTS","BREAKOUTS_SUPPORTED","ANNOTATION","ANNOTATION_ON_SHARE_SUPPORTED","length","geoHintInfo","countryCode","regionCode","undefined","PARTICIPANT","internal","services","waitForCatalog","LOCI","CALL","invitee","address","concat","ALTERNATE_REDIRECT_TRUE","callPreferences","requestedMedia","_SLIDES_","localMedias","request","method","HTTP_VERBS","POST","uri","captchaRefreshUrl","captchaId","err","dialInUrl","clientUrl","PROVISIONAL","provisionalType","PROVISIONAL_TYPE_DIAL_IN","dialOutUrl","phoneNumber","PROVISIONAL_TYPE_DIAL_OUT","dialoutAddress","GET","reject","phoneUrl","selfId","LEAVE","PUT","ALERT","CONTROLS","lock","locked","PATCH","DECLINE","reason","floorReq","disposition","FLOOR_ACTION","GRANTED","beneficiary","personUrl","devices","requester","floor","resourceUrl","resourceToken","annotationInfo","annotation","tones","SEND_DTMF_ENDPOINT","dtmf","uuid","v4","layoutType","main","content","width","height","Error","renderInfoMain","renderInfoContent","layoutParams","renderInfo","layout","type","END","keepAliveUrl","reactionChannelUrl","reaction","participantId","sender","enable","requestingParticipantId","reactions","enabled","StatelessWebexPlugin"],"sources":["request.ts"],"sourcesContent":["import uuid from 'uuid';\nimport {debounce} from 'lodash';\n// @ts-ignore\nimport {StatelessWebexPlugin} from '@webex/webex-core';\n// @ts-ignore\nimport {deviceType} from '@webex/common';\n\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport {\n ALERT,\n ALTERNATE_REDIRECT_TRUE,\n BREAKOUTS,\n CALL,\n CONTROLS,\n DECLINE,\n END,\n FLOOR_ACTION,\n HTTP_VERBS,\n LEAVE,\n LOCI,\n PARTICIPANT,\n PROVISIONAL_TYPE_DIAL_IN,\n PROVISIONAL_TYPE_DIAL_OUT,\n REACHABILITY,\n SEND_DTMF_ENDPOINT,\n _SLIDES_,\n ANNOTATION,\n} from '../constants';\nimport {SendReactionOptions, ToggleReactionsOptions} from './request.type';\nimport MeetingUtil from './util';\nimport {AnnotationInfo} from '../annotation/annotation.types';\n\n/**\n * @class MeetingRequest\n */\nexport default class MeetingRequest extends StatelessWebexPlugin {\n changeVideoLayoutDebounced: any;\n meetingRef: WeakRef<any>;\n locusDeltaRequest: (options: object) => Promise<any>;\n\n /**\n * Constructor\n * @param {Object} attrs\n * @param {Object} options\n */\n constructor(attrs: any, options: any) {\n const {meeting, ...otherAttrs} = attrs;\n\n super(otherAttrs, options);\n\n this.locusDeltaRequest = MeetingUtil.generateLocusDeltaRequest(meeting);\n\n this.changeVideoLayoutDebounced = debounce(this.changeVideoLayout, 2000, {\n leading: true,\n trailing: true,\n });\n }\n\n /**\n * Returns joinCookie from boundedStorage if present.\n * @returns {Object} joinCookie\n */\n private getJoinCookie = async () => {\n // @ts-ignore\n const joinCookieRaw = await this.webex.boundedStorage\n .get(REACHABILITY.namespace, REACHABILITY.localStorageJoinCookie)\n .catch(() => {});\n\n if (joinCookieRaw) {\n try {\n const joinCookie = JSON.parse(joinCookieRaw);\n if (joinCookie) {\n return joinCookie;\n }\n } catch (e) {\n LoggerProxy.logger.error(\n `MeetingRequest#constructor --> Error in parsing join cookie data: ${e}`\n );\n }\n }\n\n return null;\n };\n\n /**\n * Make a network request to join a meeting\n * @param {Object} options\n * @param {String} options.sipUri\n * @param {String} options.deviceUrl\n * @param {String} options.locusUrl\n * @param {String} options.resourceId,\n * @param {String} options.correlationId\n * @param {boolean} options.ensureConversation\n * @param {boolean} options.moderator\n * @param {boolean} options.pin\n * @param {boolean} options.moveToResource\n * @param {Object} options.roapMessage\n * @param {boolean} options.breakoutsSupported\n * @param {String} options.locale,\n * @param {Array} options.deviceCapabilities\n * @param {boolean} options.liveAnnotationSupported\n * @returns {Promise}\n */\n async joinMeeting(options: {\n sipUri: string;\n deviceUrl: string;\n locusUrl: string;\n resourceId: string;\n correlationId: string;\n ensureConversation: boolean;\n moderator: boolean;\n pin: boolean;\n moveToResource: boolean;\n roapMessage: any;\n asResourceOccupant: any;\n inviteeAddress: any;\n meetingNumber: any;\n permissionToken: any;\n preferTranscoding: any;\n breakoutsSupported: boolean;\n locale?: string;\n deviceCapabilities?: Array<string>;\n liveAnnotationSupported: boolean;\n }) {\n const {\n asResourceOccupant,\n inviteeAddress,\n meetingNumber,\n permissionToken,\n deviceUrl,\n locusUrl,\n resourceId,\n correlationId,\n ensureConversation,\n moderator,\n pin,\n moveToResource,\n roapMessage,\n preferTranscoding,\n breakoutsSupported,\n locale,\n deviceCapabilities = [],\n liveAnnotationSupported,\n } = options;\n\n LoggerProxy.logger.info('Meeting:request#joinMeeting --> Joining a meeting', correlationId);\n\n let url = '';\n\n const joinCookie = await this.getJoinCookie();\n\n const body: any = {\n asResourceOccupant,\n device: {\n url: deviceUrl,\n // @ts-ignore - config comes from registerPlugin\n deviceType: this.config.meetings.deviceType,\n },\n usingResource: resourceId || null,\n moveMediaToResource: (resourceId && moveToResource) || false,\n correlationId,\n respOnlySdp: true,\n allowMultiDevice: true,\n ensureConversation: ensureConversation || false,\n supportsNativeLobby: 1,\n clientMediaPreferences: {\n preferTranscoding: preferTranscoding ?? true,\n joinCookie,\n },\n };\n\n if (breakoutsSupported) {\n deviceCapabilities.push(BREAKOUTS.BREAKOUTS_SUPPORTED);\n }\n if (liveAnnotationSupported) {\n deviceCapabilities.push(ANNOTATION.ANNOTATION_ON_SHARE_SUPPORTED);\n }\n\n if (locale) {\n body.locale = locale;\n }\n\n // add deviceCapabilities prop\n if (deviceCapabilities.length) {\n body.deviceCapabilities = deviceCapabilities;\n }\n // @ts-ignore\n if (this.webex.meetings.geoHintInfo) {\n // @ts-ignore\n body.device.countryCode = this.webex.meetings.geoHintInfo.countryCode;\n // @ts-ignore\n body.device.regionCode = this.webex.meetings.geoHintInfo.regionCode;\n }\n\n if (moderator !== undefined) {\n body.moderator = moderator;\n }\n\n if (permissionToken) {\n body.permissionToken = permissionToken;\n }\n\n if (pin !== undefined) {\n body.pin = pin;\n }\n\n if (locusUrl) {\n url = `${locusUrl}/${PARTICIPANT}`;\n } else if (inviteeAddress || meetingNumber) {\n try {\n // @ts-ignore\n await this.webex.internal.services.waitForCatalog('postauth');\n // @ts-ignore\n url = `${this.webex.internal.services.get('locus')}/${LOCI}/${CALL}`;\n body.invitee = {\n address: inviteeAddress || `wbxmn:${meetingNumber}`,\n };\n } catch (e) {\n LoggerProxy.logger.error(\n `Meeting:request#joinMeeting Error Joining ${inviteeAddress || meetingNumber} --> ${e}`\n );\n throw e;\n }\n }\n\n // TODO: -- this will be resolved in SDK request\n url = url.concat(`?${ALTERNATE_REDIRECT_TRUE}`);\n\n if (resourceId === inviteeAddress) {\n body.callPreferences = {\n requestedMedia: [_SLIDES_],\n };\n }\n\n if (roapMessage) {\n body.localMedias = roapMessage.localMedias;\n }\n\n /// @ts-ignore\n return this.request({\n method: HTTP_VERBS.POST,\n uri: url,\n body,\n });\n }\n\n /**\n * Send a request to refresh the captcha\n * @param {Object} options\n * @param {String} options.captchaRefreshUrl\n * @param {String} options.captchaId\n * @returns {Promise}\n * @private\n */\n private refreshCaptcha({\n captchaRefreshUrl,\n captchaId,\n }: {\n captchaRefreshUrl: string;\n captchaId: string;\n }) {\n const body = {\n captchaId,\n };\n\n // @ts-ignore\n return this.request({\n method: HTTP_VERBS.POST,\n uri: captchaRefreshUrl,\n body,\n }).catch((err) => {\n LoggerProxy.logger.error(`Meeting:request#refreshCaptcha --> Error: ${err}`);\n\n throw err;\n });\n }\n\n /**\n * Make a network request to add a dial in device\n * @param {Object} options\n * @param {String} options.correlationId\n * @param {String} options.locusUrl url for the meeting\n * @param {String} options.dialInUrl identifier for the to-be provisioned device\n * @param {String} options.clientUrl identifier for the web device\n * @returns {Promise}\n * @private\n */\n private dialIn({\n locusUrl,\n dialInUrl,\n clientUrl,\n correlationId,\n }: {\n correlationId: string;\n locusUrl: string;\n dialInUrl: string;\n clientUrl: string;\n }) {\n LoggerProxy.logger.info(\n 'Meeting:request#dialIn --> Provisioning a dial in device',\n correlationId\n );\n const uri = `${locusUrl}/${PARTICIPANT}`;\n\n const body = {\n device: {\n deviceType: deviceType.PROVISIONAL,\n provisionalType: PROVISIONAL_TYPE_DIAL_IN,\n url: dialInUrl,\n clientUrl,\n },\n correlationId,\n };\n\n // @ts-ignore\n return this.locusDeltaRequest({\n method: HTTP_VERBS.POST,\n uri,\n body,\n }).catch((err) => {\n LoggerProxy.logger.error(\n `Meeting:request#dialIn --> Error provisioning a dial in device, error ${err}`\n );\n\n throw err;\n });\n }\n\n /**\n * Make a network request to add a dial out device\n * @param {Object} options\n * @param {String} options.correlationId\n * @param {String} options.locusUrl url for the meeting\n * @param {String} options.dialOutUrl identifier for the to-be provisioned device\n * @param {String} options.phoneNumber phone number to dial out to\n * @param {String} options.clientUrl identifier for the web device\n * @returns {Promise}\n * @private\n */\n private dialOut({\n locusUrl,\n dialOutUrl,\n phoneNumber,\n clientUrl,\n correlationId,\n }: {\n correlationId: string;\n locusUrl: string;\n dialOutUrl: string;\n phoneNumber: string;\n clientUrl: string;\n }) {\n LoggerProxy.logger.info(\n 'Meeting:request#dialOut --> Provisioning a dial out device',\n correlationId\n );\n const uri = `${locusUrl}/${PARTICIPANT}`;\n\n const body = {\n device: {\n deviceType: deviceType.PROVISIONAL,\n provisionalType: PROVISIONAL_TYPE_DIAL_OUT,\n url: dialOutUrl,\n dialoutAddress: phoneNumber,\n clientUrl,\n },\n correlationId,\n };\n\n // @ts-ignore\n return this.locusDeltaRequest({\n method: HTTP_VERBS.POST,\n uri,\n body,\n }).catch((err) => {\n LoggerProxy.logger.error(\n `Meeting:request#dialOut --> Error provisioning a dial out device, error ${err}`\n );\n\n throw err;\n });\n }\n\n /**\n * Sends a requests to get the latest locus DTO, it might be a full Locus or a delta, depending on the url provided\n * @param {Object} options\n * @param {String} options.locusUrl sync url to get ht elatest locus delta\n * @returns {Promise}\n */\n getLocusDTO(options: {url: string}) {\n const {url} = options;\n\n if (url) {\n // @ts-ignore\n return this.request({\n method: HTTP_VERBS.GET,\n uri: url,\n }).catch((err) => {\n LoggerProxy.logger.error(\n `Meeting:request#getLocusDTO --> Error getting latest locus, error ${err}`\n );\n\n return err;\n });\n }\n\n return Promise.reject();\n }\n\n /**\n * Make a network request to make a provisioned phone leave the meeting\n * @param {Object} options\n * @param {String} options.locusUrl\n * @param {String} options.phoneUrl\n * @param {String} options.correlationId\n * @param {String} options.selfId\n * @returns {Promise}\n * @private\n */\n private disconnectPhoneAudio({\n locusUrl,\n phoneUrl,\n correlationId,\n selfId,\n }: {\n locusUrl: string;\n phoneUrl: string;\n correlationId: string;\n selfId: string;\n }) {\n LoggerProxy.logger.info(\n `Meeting:request#disconnectPhoneAudio --> request phone ${phoneUrl} to leave`,\n correlationId\n );\n const uri = `${locusUrl}/${PARTICIPANT}/${selfId}/${LEAVE}`;\n\n const body = {\n device: {\n deviceType: deviceType.PROVISIONAL,\n url: phoneUrl,\n },\n correlationId,\n };\n\n // @ts-ignore\n return this.locusDeltaRequest({\n method: HTTP_VERBS.PUT,\n uri,\n body,\n }).catch((err) => {\n LoggerProxy.logger.error(\n `Meeting:request#disconnectPhoneAudio --> Error when requesting phone ${phoneUrl} to leave, error ${err}`\n );\n\n throw err;\n });\n }\n\n /**\n * Make a network request to leave a meeting\n * @param {Object} options\n * @param {Url} options.locusUrl\n * @param {String} options.selfId\n * @param {Url} options.deviceUrl\n * @param {String} options.resourceId,\n * @param {String} options.correlationId\n * @returns {Promise}\n */\n leaveMeeting({\n locusUrl,\n selfId,\n deviceUrl: url,\n resourceId,\n correlationId,\n }: {\n locusUrl: string;\n selfId: string;\n deviceUrl: string;\n resourceId: string;\n correlationId: string;\n }) {\n LoggerProxy.logger.info('Meeting:request#leaveMeeting --> Leaving a meeting', correlationId);\n\n const uri = `${locusUrl}/${PARTICIPANT}/${selfId}/${LEAVE}`;\n const body = {\n device: {\n // @ts-ignore\n deviceType: this.config.meetings.deviceType,\n url,\n },\n usingResource: resourceId || null,\n correlationId,\n };\n\n return this.locusDeltaRequest({\n method: HTTP_VERBS.PUT,\n uri,\n body,\n });\n }\n\n /**\n * Make a network request to acknowledge a meeting\n * @param {Object} options\n * @param {String} options.locusUrl\n * @param {String} options.deviceUrl\n * @param {String} options.correlationId\n * @returns {Promise}\n */\n acknowledgeMeeting(options: {locusUrl: string; deviceUrl: string; correlationId: string}) {\n const uri = `${options.locusUrl}/${PARTICIPANT}/${ALERT}`;\n const body = {\n device: {\n // @ts-ignore\n deviceType: this.config.meetings.deviceType,\n url: options.deviceUrl,\n },\n correlationId: options.correlationId,\n };\n\n return this.locusDeltaRequest({\n method: HTTP_VERBS.PUT,\n uri,\n body,\n });\n }\n\n /**\n * Makes a network request to lock the meeting\n * @param {Object} options\n * @param {Boolean} options.lock Whether it is locked or not\n * @returns {Promise}\n */\n lockMeeting(options) {\n const uri = `${options.locusUrl}/${CONTROLS}`;\n const body = {\n lock: {\n locked: options.lock,\n },\n };\n\n return this.locusDeltaRequest({\n method: HTTP_VERBS.PATCH,\n uri,\n body,\n });\n }\n\n /**\n * Make a network request to decline a meeting\n * @param {Object} options\n * @param {String} options.locusUrl\n * @param {String} options.deviceUrl\n * @param {String} options.reason\n * @returns {Promise}\n */\n declineMeeting(options: {locusUrl: string; deviceUrl: string; reason: string}) {\n const uri = `${options.locusUrl}/${PARTICIPANT}/${DECLINE}`;\n const body = {\n device: {\n // @ts-ignore\n deviceType: this.config.meetings.deviceType,\n url: options.deviceUrl,\n },\n ...(options.reason && {reason: options.reason}),\n };\n\n return this.locusDeltaRequest({\n method: HTTP_VERBS.PUT,\n uri,\n body,\n });\n }\n\n /**\n * change the content floor grant\n * @param {Object} options options for floor grant\n * @param {String} options.disposition floor action (granted/released)\n * @param {String} options.personUrl personUrl who is requesting floor\n * @param {String} options.deviceUrl Url of a device\n * @param {String} options.resourceId Populated if you are paired to a device\n * @param {String} options.uri floor grant uri\n * @returns {Promise}\n */\n changeMeetingFloor(\n options:\n | {\n disposition: string;\n personUrl: string;\n deviceUrl: string;\n resourceId: string;\n uri: string;\n annotationInfo: AnnotationInfo;\n }\n | any\n ) {\n let floorReq: any = {disposition: options.disposition};\n\n /* istanbul ignore else */\n if (options.disposition === FLOOR_ACTION.GRANTED) {\n floorReq = {\n beneficiary: {\n url: options.personUrl,\n devices: [\n {\n // @ts-ignore\n deviceType: this.config.meetings.deviceType,\n url: options.deviceUrl,\n },\n ],\n },\n disposition: options.disposition,\n requester: {\n url: options.personUrl,\n },\n };\n }\n\n const body: any = {\n floor: floorReq,\n resourceUrl: options.resourceUrl,\n };\n\n if (options?.resourceToken) {\n body.resourceToken = options?.resourceToken;\n }\n if (options?.annotationInfo) {\n body.annotation = options?.annotationInfo;\n }\n\n // @ts-ignore\n return this.request({\n uri: options.uri,\n method: HTTP_VERBS.PUT,\n body,\n });\n }\n\n /**\n * Sends a request to the DTMF endpoint to send tones\n * @param {Object} options\n * @param {String} options.locusUrl\n * @param {String} options.deviceUrl\n * @param {String} options.tones a string of one or more DTMF tones to send\n * @returns {Promise}\n */\n sendDTMF({locusUrl, deviceUrl, tones}: {locusUrl: string; deviceUrl: string; tones: string}) {\n // @ts-ignore\n return this.locusDeltaRequest({\n method: HTTP_VERBS.POST,\n uri: `${locusUrl}/${SEND_DTMF_ENDPOINT}`,\n body: {\n deviceUrl,\n dtmf: {\n correlationId: uuid.v4(),\n tones,\n },\n },\n });\n }\n\n /**\n * Sends a request to the controls endpoint to set the video layout\n * @param {Object} options\n * @param {String} options.locusUrl\n * @param {String} options.deviceUrl\n * @param {String} options.layoutType a layout type that should be available in meeting constants {@link #layout_types}\n * @param {Object} options.main preferred dimensions for the remote main video stream\n * @param {Number} options.main.width preferred width of main video stream\n * @param {Number} options.main.height preferred height of main video stream\n * @param {Object} options.content preferred dimensions for the remote content share stream\n * @param {Number} options.content.width preferred width of content share stream\n * @param {Number} options.content.height preferred height of content share stream\n * @returns {Promise}\n */\n changeVideoLayout({\n locusUrl,\n deviceUrl,\n layoutType,\n main,\n content,\n }: {\n locusUrl: string;\n deviceUrl: string;\n layoutType: string;\n main: {\n width: number;\n height: number;\n };\n content: {\n width: number;\n height: number;\n };\n }) {\n // send main/content renderInfo only if both width and height are specified\n if (main && (!main.width || !main.height)) {\n return Promise.reject(\n new Error(\n `Both width and height must be specified. One of them is missing for main: ${JSON.stringify(\n main\n )}`\n )\n );\n }\n\n if (content && (!content.width || !content.height)) {\n return Promise.reject(\n new Error(\n `Both width and height must be specified. One of them is missing for content: ${JSON.stringify(\n content\n )}`\n )\n );\n }\n\n const renderInfoMain = main ? {width: main.width, height: main.height} : undefined;\n const renderInfoContent = content ? {width: content.width, height: content.height} : undefined;\n\n const layoutParams =\n renderInfoMain || renderInfoContent\n ? {\n renderInfo: {\n main: renderInfoMain,\n content: renderInfoContent,\n },\n }\n : undefined;\n\n // @ts-ignore\n return this.locusDeltaRequest({\n method: HTTP_VERBS.PUT,\n uri: `${locusUrl}/${CONTROLS}`,\n body: {\n layout: {\n deviceUrl,\n type: layoutType,\n layoutParams,\n },\n },\n });\n }\n\n /**\n * Make a network request to end meeting for all\n * @param {Object} options\n * @param {Url} options.locusUrl\n * @returns {Promise}\n */\n endMeetingForAll({locusUrl}: {locusUrl: string}) {\n const uri = `${locusUrl}/${END}`;\n\n // @ts-ignore\n return this.locusDeltaRequest({\n method: HTTP_VERBS.POST,\n uri,\n });\n }\n\n /**\n * Send a locus keepAlive (used in lobby)\n * @param {Object} options\n * @param {Url} options.keepAliveUrl\n * @returns {Promise}\n */\n keepAlive({keepAliveUrl}: {keepAliveUrl: string}) {\n // @ts-ignore\n return this.request({\n method: HTTP_VERBS.GET,\n uri: keepAliveUrl,\n });\n }\n\n /**\n * Make a network request to send a reaction.\n * @param {Object} options\n * @param {Url} options.reactionChannelUrl\n * @param {Reaction} options.reaction\n * @param {string} options.senderID\n * @returns {Promise}\n */\n sendReaction({reactionChannelUrl, reaction, participantId}: SendReactionOptions) {\n const uri = reactionChannelUrl;\n\n // @ts-ignore\n return this.request({\n method: HTTP_VERBS.POST,\n uri,\n body: {\n sender: {participantId},\n reaction,\n },\n });\n }\n\n /**\n * Make a network request to enable or disable reactions.\n * @param {boolean} options.enable - determines if we need to enable or disable.\n * @param {locusUrl} options.locusUrl\n * @returns {Promise}\n */\n toggleReactions({enable, locusUrl, requestingParticipantId}: ToggleReactionsOptions) {\n const uri = `${locusUrl}/${CONTROLS}`;\n\n // @ts-ignore\n return this.locusDeltaRequest({\n method: HTTP_VERBS.PUT,\n uri,\n body: {\n reactions: {\n enabled: enable,\n },\n requestingParticipantId,\n },\n });\n }\n\n getLocusStatusByUrl(locusUrl: string) {\n // @ts-ignore\n return this.request({\n method: HTTP_VERBS.GET,\n uri: locusUrl,\n });\n }\n}\n"],"mappings":"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"}
@@ -19,7 +19,6 @@ import InMeetingActions from './in-meeting-actions';
19
19
  import RecordingController from '../recording-controller';
20
20
  import ControlsOptionsManager from '../controls-options-manager';
21
21
  import { LocusMediaRequest } from './locusMediaRequest';
22
- import { AnnotationInfo } from '../annotation/annotation.types';
23
22
  export type LocalTracks = {
24
23
  microphone?: LocalMicrophoneTrack;
25
24
  camera?: LocalCameraTrack;
@@ -27,7 +26,6 @@ export type LocalTracks = {
27
26
  audio?: LocalSystemAudioTrack;
28
27
  video?: LocalDisplayTrack;
29
28
  };
30
- annotationInfo?: AnnotationInfo;
31
29
  };
32
30
  export type AddMediaOptions = {
33
31
  localTracks?: LocalTracks;
@@ -397,7 +395,6 @@ export default class Meeting extends StatelessWebexPlugin {
397
395
  roles: any[];
398
396
  environment: string;
399
397
  namespace: string;
400
- annotationInfo: AnnotationInfo;
401
398
  allowMediaInLobby: boolean;
402
399
  /**
403
400
  * @param {Object} attrs
@@ -25,6 +25,8 @@ export type Config = {
25
25
  device: {
26
26
  url: string;
27
27
  deviceType: string;
28
+ countryCode?: string;
29
+ regionCode?: string;
28
30
  };
29
31
  correlationId: string;
30
32
  preferTranscoding: boolean;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@webex/plugin-meetings",
3
- "version": "3.0.0-beta.207",
3
+ "version": "3.0.0-beta.209",
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.207",
36
- "@webex/test-helper-chai": "3.0.0-beta.207",
37
- "@webex/test-helper-mocha": "3.0.0-beta.207",
38
- "@webex/test-helper-mock-webex": "3.0.0-beta.207",
39
- "@webex/test-helper-retry": "3.0.0-beta.207",
40
- "@webex/test-helper-test-users": "3.0.0-beta.207",
35
+ "@webex/plugin-meetings": "3.0.0-beta.209",
36
+ "@webex/test-helper-chai": "3.0.0-beta.209",
37
+ "@webex/test-helper-mocha": "3.0.0-beta.209",
38
+ "@webex/test-helper-mock-webex": "3.0.0-beta.209",
39
+ "@webex/test-helper-retry": "3.0.0-beta.209",
40
+ "@webex/test-helper-test-users": "3.0.0-beta.209",
41
41
  "chai": "^4.3.4",
42
42
  "chai-as-promised": "^7.1.1",
43
43
  "jsdom-global": "3.0.2",
@@ -46,19 +46,19 @@
46
46
  "typescript": "^4.7.4"
47
47
  },
48
48
  "dependencies": {
49
- "@webex/common": "3.0.0-beta.207",
49
+ "@webex/common": "3.0.0-beta.209",
50
50
  "@webex/internal-media-core": "1.39.1",
51
- "@webex/internal-plugin-conversation": "3.0.0-beta.207",
52
- "@webex/internal-plugin-device": "3.0.0-beta.207",
53
- "@webex/internal-plugin-llm": "3.0.0-beta.207",
54
- "@webex/internal-plugin-mercury": "3.0.0-beta.207",
55
- "@webex/internal-plugin-metrics": "3.0.0-beta.207",
56
- "@webex/internal-plugin-support": "3.0.0-beta.207",
57
- "@webex/internal-plugin-user": "3.0.0-beta.207",
58
- "@webex/media-helpers": "3.0.0-beta.207",
59
- "@webex/plugin-people": "3.0.0-beta.207",
60
- "@webex/plugin-rooms": "3.0.0-beta.207",
61
- "@webex/webex-core": "3.0.0-beta.207",
51
+ "@webex/internal-plugin-conversation": "3.0.0-beta.209",
52
+ "@webex/internal-plugin-device": "3.0.0-beta.209",
53
+ "@webex/internal-plugin-llm": "3.0.0-beta.209",
54
+ "@webex/internal-plugin-mercury": "3.0.0-beta.209",
55
+ "@webex/internal-plugin-metrics": "3.0.0-beta.209",
56
+ "@webex/internal-plugin-support": "3.0.0-beta.209",
57
+ "@webex/internal-plugin-user": "3.0.0-beta.209",
58
+ "@webex/media-helpers": "3.0.0-beta.209",
59
+ "@webex/plugin-people": "3.0.0-beta.209",
60
+ "@webex/plugin-rooms": "3.0.0-beta.209",
61
+ "@webex/webex-core": "3.0.0-beta.209",
62
62
  "ampersand-collection": "^2.0.2",
63
63
  "bowser": "^2.11.0",
64
64
  "btoa": "^1.2.1",
@@ -124,7 +124,6 @@ import RecordingController from '../recording-controller';
124
124
  import ControlsOptionsManager from '../controls-options-manager';
125
125
  import PermissionError from '../common/errors/permission';
126
126
  import {LocusMediaRequest} from './locusMediaRequest';
127
- import {AnnotationInfo} from '../annotation/annotation.types';
128
127
 
129
128
  const {isBrowser} = BrowserDetection();
130
129
 
@@ -150,7 +149,6 @@ export type LocalTracks = {
150
149
  audio?: LocalSystemAudioTrack;
151
150
  video?: LocalDisplayTrack;
152
151
  };
153
- annotationInfo?: AnnotationInfo;
154
152
  };
155
153
 
156
154
  export type AddMediaOptions = {
@@ -551,7 +549,6 @@ export default class Meeting extends StatelessWebexPlugin {
551
549
  roles: any[];
552
550
  environment: string;
553
551
  namespace = MEETINGS;
554
- annotationInfo: AnnotationInfo;
555
552
  allowMediaInLobby: boolean;
556
553
 
557
554
  /**
@@ -5430,6 +5427,10 @@ export default class Meeting extends StatelessWebexPlugin {
5430
5427
  url: this.deviceUrl,
5431
5428
  // @ts-ignore
5432
5429
  deviceType: this.config.deviceType,
5430
+ // @ts-ignore
5431
+ countryCode: this.webex.meetings.geoHintInfo?.countryCode,
5432
+ // @ts-ignore
5433
+ regionCode: this.webex.meetings.geoHintInfo?.regionCode,
5433
5434
  },
5434
5435
  preferTranscoding: !this.isMultistream,
5435
5436
  },
@@ -5441,9 +5442,6 @@ export default class Meeting extends StatelessWebexPlugin {
5441
5442
 
5442
5443
  this.audio = createMuteState(AUDIO, this, audioEnabled);
5443
5444
  this.video = createMuteState(VIDEO, this, videoEnabled);
5444
-
5445
- this.annotationInfo = localTracks?.annotationInfo;
5446
-
5447
5445
  const promises = [];
5448
5446
 
5449
5447
  // setup all the references to local tracks in this.mediaProperties before creating media connection
@@ -6155,7 +6153,6 @@ export default class Meeting extends StatelessWebexPlugin {
6155
6153
  deviceUrl: this.deviceUrl,
6156
6154
  uri: content.url,
6157
6155
  resourceUrl: this.resourceUrl,
6158
- annotationInfo: this.annotationInfo,
6159
6156
  })
6160
6157
  .then(() => {
6161
6158
  this.screenShareFloorState = ScreenShareFloorStatus.GRANTED;
@@ -7033,9 +7030,6 @@ export default class Meeting extends StatelessWebexPlugin {
7033
7030
  */
7034
7031
  async publishTracks(tracks: LocalTracks): Promise<void> {
7035
7032
  this.checkMediaConnection();
7036
-
7037
- this.annotationInfo = tracks.annotationInfo;
7038
-
7039
7033
  if (
7040
7034
  !tracks.microphone &&
7041
7035
  !tracks.camera &&
@@ -83,6 +83,8 @@ export type Config = {
83
83
  device: {
84
84
  url: string;
85
85
  deviceType: string;
86
+ countryCode?: string;
87
+ regionCode?: string;
86
88
  };
87
89
  correlationId: string;
88
90
  preferTranscoding: boolean;
@@ -185,11 +185,11 @@ export default class MeetingRequest extends StatelessWebexPlugin {
185
185
  body.deviceCapabilities = deviceCapabilities;
186
186
  }
187
187
  // @ts-ignore
188
- if (this.webex.meetings.clientRegion) {
188
+ if (this.webex.meetings.geoHintInfo) {
189
189
  // @ts-ignore
190
- body.device.countryCode = this.webex.meetings.clientRegion.countryCode;
190
+ body.device.countryCode = this.webex.meetings.geoHintInfo.countryCode;
191
191
  // @ts-ignore
192
- body.device.regionCode = this.webex.meetings.clientRegion.regionCode;
192
+ body.device.regionCode = this.webex.meetings.geoHintInfo.regionCode;
193
193
  }
194
194
 
195
195
  if (moderator !== undefined) {
@@ -1653,6 +1653,7 @@ describe('plugin-meetings', () => {
1653
1653
  meeting.mediaProperties.getCurrentConnectionType = sinon.stub().resolves('udp');
1654
1654
  meeting.setMercuryListener = sinon.stub();
1655
1655
  meeting.locusInfo.onFullLocus = sinon.stub();
1656
+ meeting.webex.meetings.geoHintInfo = {regionCode: 'EU', countryCode: 'UK'};
1656
1657
  meeting.webex.meetings.reachability = {
1657
1658
  isAnyClusterReachable: sinon.stub().resolves(true),
1658
1659
  };
@@ -1778,7 +1779,7 @@ describe('plugin-meetings', () => {
1778
1779
  method: 'PUT',
1779
1780
  uri: `${meeting.selfUrl}/media`,
1780
1781
  body: {
1781
- device: {url: meeting.deviceUrl, deviceType: meeting.config.deviceType},
1782
+ device: {url: meeting.deviceUrl, deviceType: meeting.config.deviceType, regionCode: 'EU', countryCode: 'UK'},
1782
1783
  correlationId: meeting.correlationId,
1783
1784
  localMedias: [
1784
1785
  {
@@ -1799,7 +1800,7 @@ describe('plugin-meetings', () => {
1799
1800
  method: 'PUT',
1800
1801
  uri: `${meeting.selfUrl}/media`,
1801
1802
  body: {
1802
- device: {url: meeting.deviceUrl, deviceType: meeting.config.deviceType},
1803
+ device: {url: meeting.deviceUrl, deviceType: meeting.config.deviceType, regionCode: 'EU', countryCode: 'UK'},
1803
1804
  correlationId: meeting.correlationId,
1804
1805
  localMedias: [
1805
1806
  {
@@ -4041,14 +4042,6 @@ describe('plugin-meetings', () => {
4041
4042
  checkScreenShareAudioPublished(audioShareTrack);
4042
4043
  });
4043
4044
  });
4044
- it('creates instance and publishes with annotation info', async () => {
4045
- const annotationInfo = {
4046
- version: '1',
4047
- policy: ANNOTATION_POLICY.APPROVAL,
4048
- };
4049
- await meeting.publishTracks({annotationInfo});
4050
- assert.equal(meeting.annotationInfo, annotationInfo);
4051
- });
4052
4045
 
4053
4046
  describe('unpublishTracks', () => {
4054
4047
  beforeEach(async () => {
@@ -41,7 +41,7 @@ describe('LocusMediaRequest.send()', () => {
41
41
 
42
42
  const createExpectedRoapBody = (expectedMessageType, expectedMute:{audioMuted: boolean, videoMuted: boolean}) => {
43
43
  return {
44
- device: { url: 'deviceUrl', deviceType: 'deviceType' },
44
+ device: { url: 'deviceUrl', deviceType: 'deviceType', regionCode: 'regionCode' },
45
45
  correlationId: 'correlationId',
46
46
  localMedias: [
47
47
  {
@@ -72,6 +72,7 @@ describe('LocusMediaRequest.send()', () => {
72
72
  device: {
73
73
  url: 'deviceUrl',
74
74
  deviceType: 'deviceType',
75
+ regionCode: 'regionCode',
75
76
  },
76
77
  correlationId: 'correlationId',
77
78
  usingResource: null,
@@ -105,6 +106,7 @@ describe('LocusMediaRequest.send()', () => {
105
106
  device: {
106
107
  url: 'deviceUrl',
107
108
  deviceType: 'deviceType',
109
+ regionCode: 'regionCode',
108
110
  },
109
111
  correlationId: 'correlationId',
110
112
  preferTranscoding: true,
@@ -18,7 +18,7 @@ describe('plugin-meetings', () => {
18
18
  },
19
19
  });
20
20
 
21
- webex.meetings.clientRegion = {
21
+ webex.meetings.geoHintInfo = {
22
22
  countryCode: 'US',
23
23
  regionCode: 'WEST-COAST',
24
24
  };